LINUX.ORG.RU

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

Исправление 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
И разница между разными местами вставления nop-а вроде бы исчезла или почти исчезла. Видимо то были какие-то другие эффекты.

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
И разница между разными местами вставления nop-а вроде бы исчезла или почти исчезла. Видимо то были какие-то другие эффекты.

Исходная версия 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