LINUX.ORG.RU

История изменений

Исправление 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 
Но весь этот код эквивалентен этим двум операциям.