Мне нужно рассчитать среднее значение 32 uint8t
значений, хранящихся в одном массиве. По соображениям производительности я хотел изменить код ниже, чтобы использовать команду pavgb
и регистры xmm. Проблема в том, что я не могу скопировать 16 байт сразу с помощью movdqu
, потому что я делаю некоторые вычисления в цикле, чтобы получить значения в среднем. Код ниже представляет собой упрощенную версию фактического кода, который я использую.Заполнение xmm register bytewise
;
; 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] ...« Ваш комментарий неверен. Это затрудняет понимание кода, поскольку он не делает то, что говорит комментарий. –