История изменений
Исправление firkax, (текущая версия) :
И даже так всё проявляется
/* void work(u64 *a, u64 *b, size_t length, size_t count) */
work:/* args = rdi,rsi,rdx,rcx ; must keep: rbx,rsp,rbp,r12-r15 */
imul rdx,rcx
neg rdx
mov rcx,rdx
.byte 0x66,0x66,0x66,0x90
.byte 0x66,0x66,0x66,0x90
.byte 0x66,0x66,0x66,0x90
.byte 0x66,0x66,0x66,0x90
clc
.bL11:
.byte 0x66,0x66,0x66,0x90
.byte 0x66,0x66,0x66,0x90
inc rcx
jnz .bL11
.byte 0x66,0x66,0x66,0x90
.byte 0x66,0x66,0x66,0x90
.byte 0x66,0x66,0x66,0x90
.byte 0x66,0x66,0x66,0x90
ret
inc rcx можно двигать - вроде не влияет. В целом важны, всё-таки, адрес начала цикла, адрес JNE и ещё какие-то невыясненные обстоятельства, из-за которых тут замедление с 0xB4 а в оригинале начиналось от 0xBA.
Исправление firkax, :
И даже так всё проявляется
/* void work(u64 *a, u64 *b, size_t length, size_t count) */
work:/* args = rdi,rsi,rdx,rcx ; must keep: rbx,rsp,rbp,r12-r15 */
imul rdx,rcx
neg rdx
mov rcx,rdx
.byte 0x66,0x66,0x66,0x90
.byte 0x66,0x66,0x66,0x90
.byte 0x66,0x66,0x66,0x90
.byte 0x66,0x66,0x66,0x90
clc
.bL11:
.byte 0x66,0x66,0x66,0x90
.byte 0x66,0x66,0x66,0x90
inc rcx
jnz .bL11
.byte 0x66,0x66,0x66,0x90
.byte 0x66,0x66,0x66,0x90
.byte 0x66,0x66,0x66,0x90
.byte 0x66,0x66,0x66,0x90
ret
Исходная версия firkax, :
И даже так всё проявляется
/* void work(u64 *a, u64 *b, size_t length, size_t count) */
work:/* args = rdi,rsi,rdx,rcx ; must keep: rbx,rsp,rbp,r12-r15 */
imul rdx,rcx
neg rdx
mov rcx,rdx
.byte 0x66,0x66,0x66,0x90
.byte 0x66,0x66,0x66,0x90
.byte 0x66,0x66,0x66,0x90
.byte 0x66,0x66,0x66,0x90
clc
.bL11:
.byte 0x66,0x66,0x66,0x90
.byte 0x66,0x66,0x66,0x90
inc rcx
jnz .bL11
.byte 0x66,0x66,0x66,0x90
.byte 0x66,0x66,0x66,0x90
.byte 0x66,0x66,0x66,0x90
.byte 0x66,0x66,0x66,0x90
ret