我有一个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
这似乎是一种略微不透明的方式。是否有更好的方式,或更惯用或可读的方式?
答案 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
这看起来更清晰,更像我的想法。