$613566757, %rsi, %rdi shrq $32, %rdi subl %edi, %esi shrl %esi addl %edi, %esi shrl $2, %esi xorl %eax, %esi movl %esi, %edi xorl %ecx, %edi movq %rdi, %rax imulq %rdx, %rax shrq $32, %rax subl %eax, %edi shrl %edi addl %eax, %edi shrl $4, %edi xorl %esi, %edi movl %edi, %eax xorl %ecx, %eax imulq $842937507, %rax, %rsi shrq $32, %rsi subl %esi, %eax shrl %eax addl %esi, %eax shrl $6, %eax xorl %edi, %eax incl %ecx cmpl $1000000000, %ecx jne .lp 改良版 ⇒ .lp: movl %ecx, %edx xorl %eax, %edx mulxq %rsi, %r9, %r9 xorl %eax, %r9d movl %r9d, %edx xorl %ecx, %edx mulxq %rdi, %r10, %r10 xorl %r9d, %r10d movl %r10d, %edx xorl %ecx, %edx mulxq %r8, %rax, %rax xorl %r10d, %eax incl %ecx cmpl $1000000000, %ecx jne .lp 想定通り、定数設定はループ外に出されてループ内で 「乗算x1+シフトx3+減算x1+加算x1」が「乗算x1」になった Apple M4やRISCV64も同じ効果を得られた 7 / 14