0
我需要計算存儲在一個數組中的32個值的平均值。出於性能原因,我想更改下面的代碼以使用pavgb
命令和xmm寄存器。問題是我不能一次使用movdqu
複製16字節,因爲我在循環中進行了一些計算以獲得平均值。下面的代碼是我正在使用的實際代碼的簡化版本。按字節填充xmm寄存器
;
; void average(uint8_t *res, uint8_t *input)
; rdi = res | res holds 16 values
; rsi = input | input holds 32 values
;
segment .text
global average
average:
mov rcx, 0
xor rax, rax
xor rbx, rbx
.loop
mov al, [rsi + rcx]
cmp al, 16
jge .endif
add al, 16
.endif
mov bl, [rsi + rcx + 16]
cmp bl, 16
jge .endif2
add bl, 16
.endif2
add ax, bl
shr ax, 1
mov [rdi], al
inc rdi
inc rsi
inc rcx
cmp rcx, 16
jl .loop
因此,要改變代碼與XMM工作寄存器,所以我可以做這樣的事情到底:
pavgb xmm0, xmm1
movdqu [rdi], xmm0
我需要補XMM0與xmm1寄存器按字節。有沒有辦法做到這一點?
您可以使用'PINSRB',可能與'PSLLDQ'結合使用。 – Jester
「res將是輸入值[0]和輸入值[16],輸入值[1]和輸入值[17]的平均值的結果......」您的評論有誤。這使得代碼更難理解,因爲它沒有做出評論所說的話。 –