История изменений
Исправление cudeta, (текущая версия) :
неоптимальности связанные с bit tricks (const load vs self-xor’ing etc).
В случае с imul vs shl ещё можно сказать, что это bit trick.
Но в остальных случаях это просто объективно лучшие способы сделать те вещи, которые он делает. Почему лучшие, я объяснил.
Вот это нельзя списать на «наглядность демонстрации»:
; Compute padding and packet u32 count with division and modulo 4. mov eax, edx ; Put dividend in eax. mov ecx, 4 ; Put divisor in ecx. cdq ; Sign extend. idiv ecx ; Compute eax / ecx, and put the remainder (i.e. modulo) in edx. ; LLVM optimizer magic: `(4-x)%4 == -x & 3`, for some reason. neg edx and edx, 3 mov r9d, edx ; Store padding in r9.
Ну хорошо, допустим, он не понимает, что X % 4 == X & 3. Поэтому считает остаток от деления на 4 с помощью деления (это медленее в 46—161 раз, в зависимости от железа).
Но почему знаковое деление (idiv, а не div) и cdq? В этом нет никакого смысла.
Самое смешное, что после этого он говорит, что «LLVM мне сказал, что (4-x)%4 == -x & 3», и поэтому делает
neg edx
and edx, 3
Исходная версия cudeta, :
неоптимальности связанные с bit tricks (const load vs self-xor’ing etc).
В случае с imul vs shl ещё можно сказать, что это bit trick.
Но в остальных случаях это просто объективно лучшие способы сделать те вещи, которые он делает. Почему лучшие, я объяснил.
Вот это нельзя списать на «наглядность демонстрации»:
; Compute padding and packet u32 count with division and modulo 4. mov eax, edx ; Put dividend in eax. mov ecx, 4 ; Put divisor in ecx. cdq ; Sign extend. idiv ecx ; Compute eax / ecx, and put the remainder (i.e. modulo) in edx. ; LLVM optimizer magic: `(4-x)%4 == -x & 3`, for some reason. neg edx and edx, 3 mov r9d, edx ; Store padding in r9.
Ну хорошо, допустим, он не понимает, что X % 4 == X & 3. Поэтому считает остаток от деления на 4 с помощью деления.
Но почему знаковое деление (idiv, а не div) и cdq? В этом нет никакого смысла.
Самое смешное, что после этого он говорит, что «LLVM мне сказал, что (4-x)%4 == -x & 3», и поэтому делает
neg edx
and edx, 3