Нет эквивалента inc
для xmm regs, и нет формы немедленного операнда paddw
(так что нет никакого эквивалента add eax, 1
).
paddw
(and other element sizes) доступны только с операндами источника xmm/m128. Поэтому, если вы хотите увеличить один элемент вектора, вам нужно загрузить константу из памяти, or generate it on the fly.
например. самый дешевый способ для увеличения всех элементов XMM0 является:
; outside the loop
pcmpeqw xmm1,xmm1 # xmm1 = all-ones = -1
; inside the loop
psubw xmm0, xmm1 ; xmm0 -= -1 (in each element). i.e. xmm0++
Или
paddw xmm0, [ones] ; where ones is a static constant.
Возможно только хорошая идея, чтобы загрузить константу из памяти, если она занимает больше, чем, может быть, две инструкции, чтобы построить константу, или если давление в регистре является проблемой.
Если вы хотите построить постоянное приращение только низкий элемент 32bit, например, вы можете использовать байтовый сдвиг к нулю другие элементы:
; hoisted out of the loop
pcmpeqw xmm1,xmm1 # xmm1 = all-ones = -1
psrldq xmm1, 12 # xmm1 = [ 0 0 0 -1 ]
; in the loop
psubd xmm0, xmm1
Если ваша попытка должен был увеличивать только малый 16-битный элемент в xmm2, тогда да, это была глупая попытка.IDK, что вы делаете, сохраняете в [rbx+8]
, а затем загружаете в xmm1 (обнуление высоких 96 бит).
Ниже приведено описание того, как написать xmm -> gp -> xmm round trip менее тупым способом. (Все еще ужасно по сравнению с paddw
с векторной константой).
# don't push/pop. Instead, pick a register you can clobber without saving/restoring
movd edx, xmm2 # this is the cheapest way to get the low 16. It doesn't matter that we also get the element 1 as garbage in the high half of edx
inc edx # we only care about dx, but this is still the most efficient instruction
pinsrw xmm2, edx, 0 # normally you'd just use movd again, but we actually want to merge with the old contents.
Если вы хотите работать с другими, чем 16bit элементов, вы либо использовать SSE4.1 pinsrb
/d
/q
, или вы хотите использовать movd
и перетасовки.
См Agner Fog's Optimize Assembly руководства для более хороших советов о том, как использовать векторы SSE. Также другие ссылки в теге x86.
Вы хотите увеличить все целочисленные значения в регистре xmm или только один? – galinette
Возможный дубликат [Добавить постоянное значение в регистр xmm в x86] (http://stackoverflow.com/questions/14088228/add-a-constant-value-to-a-xmm-register-in-x86) –
только один – Gecko64