如何将数字从XMM寄存器存储到asm循环中的char数组 -

时间:2014-03-28 17:51:08

标签: c++ assembly sse simd

我有一个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
    }

2 个答案:

答案 0 :(得分:0)

使用通用寄存器之一作为索引:

  movdqa [oword ptr numbers + edx], xmm4      //Store xmm4 to numbers array
  add     edx, 16                              //Increment index

答案 1 :(得分:0)

这段代码有很多错误。我不知道你甚至想做什么,但这些都是大问题:

  • 你想在16B寄存器的底部字节中只存储一两个字符?为什么你需要一个载体?
  • pcmpeqb生成0或0xff字节的掩码,并且不为jcc设置标志。 (使用SSE4.1 PTEST)。

  • comiss xmm0, zeros在xmm0的低4字节上进行浮点比较,该字节保存整数数据。 (ss =标量单精度)。我不确定当整数数据恰好是NaN时会发生什么。比较等于零是唯一有希望工作的比较。

  • 您可以使用_mm_set1_epi32(0x66666667)进行广播。

丢弃所有当前代码,然后重新开始使用内在函数。查看https://stackoverflow.com/tags/x86/info

上的部分资源