Собрал с -Os и ручками свел внутренний цикл к виду
.L3:
movl (%esi,%edx,4), %eax
movl %eax, (%ebx,%edx,4)
decl %edx
jne .L3
и
.L3:
movq (%rbx,%rdx,8), %rax
movq %rax, (%rcx,%rdx,8)
decq %rdx
jne .L3
соответственно. Результаты получились ну совсем внезапными:
для x64:
real 1m7.272s
user 1m5.992s
sys 0m1.284s
для x86:
real 1m8.740s
user 1m7.476s
sys 0m1.268s
При всем при этом для x86 начальное значение %edx было 268435456, для x64 %rdx устанавливался в 134217728. Я что-то упустил в этой жизни?