最有效/惯用的方法来测试256位YMM AVX寄存器为零

时间:2014-05-29 16:35:06

标签: assembly 64-bit x86-64 micro-optimization

我有一个x86_64例程,如果成功则最终在YMM寄存器中以零结束,如果YMM寄存器,我想返回非零值。

我有办法通过清除另一个YMM寄存器,VPTEST对我的寄存器进行寄存,然后在没有设置CF的情况下有条件地递增resturn寄存器(在我的情况下为RAX):

"    xor    %%rax,   %%rax              \n" // clear RAX

"    vxorpd %%ymm0,  %%ymm0,    %%ymm0  \n" // clear YMM0
"    vptest %%ymm1,  %%ymm0             \n" // compare YMM1 to zero

"    jc     endcheck                    \n" // branch over if no residue
"    inc    %%rax                       \n" // inc RAX otherwise

"endcheck:                              \n" // result is now in RAX

这似乎是一种略微不透明的方式。是否有更好的方式,或更惯用或可读的方式?

1 个答案:

答案 0 :(得分:2)

结合上面的评论,可以用三行汇编来完成:

"xor         %%rax,      %%rax    \n" // clear RAX
"vptest      %%ymm1,     %%ymm1   \n" // if YMM1 zero, set ZF
"setnz       %%al                 \n" // set byte in RAX if not zero

这看起来更清晰,更像我的想法。

相关问题