我有一个xmm寄存器,里面有四个32位数字。
XMM4 = 00000035000000350000003500000035
我有一个循环,一遍又一遍地计算这些数字,然后我需要以某种方式将它们存储在数组中。如何在循环的每次迭代中使用asm来存储XMM寄存器中的每个单独的数字?
编辑:
我尝试在__asm块之外创建一个char数组,如下所示:char numbers[20];
然后我尝试使用movdqa [numbers], xmm4
将我的注册值移入其中。这适用于循环的第一次迭代,但我不知道如何在连续迭代中增加数组的索引。
Edit2:这是我的代码
__m128i stuff = _mm_setr_epi32 ( 87, 137, 202, 222 );
__m128i zeros = _mm_setr_epi32 ( 0x0, 0x0, 0x0, 0x0 );
__m128i fives = _mm_setr_epi32 ( 0x5, 0x5, 0x5, 0x5 );
__m128i fortyEights = _mm_setr_epi32 ( 0x30, 0x30,0x30, 0x30 );
__m128i magicNumber = _mm_setr_epi32 ( 0x66666667, 0x66666667, 0x66666667, 0x66666667 );
__asm {
movdqa xmm0, stuff //Move data into xmm0
movdqa xmm1, magicNumber //Move magic numbers into xmm1
movdqa xmm2, xmm0 //Copy data into xmm2
vpcmpeqb xmm2, xmm0, xmm2 //Compare data against zeros
je bail //if data is all zeros then bail
nextdigit: pmulhw xmm2, xmm1 //Multiply data in xmm2 by the magic numbers in xmm1
psrad xmm2, 2 //Divide [wip]data by 4
movdqa xmm3, fives //Copy the fives into xmm3
pmullw xmm3, xmm2 //Multiply [wip]data in xmm2 by the fives in xmm3
paddd xmm3, xmm3 //Multiply the [wip]data by 2
movdqa xmm4, xmm0 //Copy the original into xmm4
psubd xmm4, xmm3 //Subtract the [wip]data from the original data
paddd xmm4, fortyEights //Add 48 to the [wip]data in xmm4 in order to get the ascii value
// HERE IS WHERE I WANT TO SAVE THE VALUES TO AN ARRAY
comiss xmm0, zeros
jne nextdigit
bail:
mov eax, 0
}
答案 0 :(得分:0)
使用通用寄存器之一作为索引:
movdqa [oword ptr numbers + edx], xmm4 //Store xmm4 to numbers array
add edx, 16 //Increment index
答案 1 :(得分:0)
这段代码有很多错误。我不知道你甚至想做什么,但这些都是大问题:
pcmpeqb
生成0或0xff字节的掩码,并且不为jcc
设置标志。 (使用SSE4.1 PTEST
)。
comiss xmm0, zeros
在xmm0的低4字节上进行浮点比较,该字节保存整数数据。 (ss
=标量单精度)。我不确定当整数数据恰好是NaN
时会发生什么。比较等于零是唯一有希望工作的比较。
您可以使用_mm_set1_epi32(0x66666667)
进行广播。
丢弃所有当前代码,然后重新开始使用内在函数。查看https://stackoverflow.com/tags/x86/info
上的部分资源