assembly 减少XMM/YMM中的字节并与零比较

e4eetjau  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(108)

我有一堆无符号单字节计数器,我想同时递减它们,如果其中任何一个达到0,设置进位位。如果进位位被设置,我想将达到0的计数器重置回其原始数字。AVX有可能做到这一点吗?
例如

  • xmm3的字节4从200开始,当它到达0时,它被复位回200。
  • xmm3的字节5从150开始,当它到达0时,它被复位回150。

我也愿意将每个字节的数字递增到最大值,然后在达到最大值时将每个字节重置为0。
主要的是保持这些计数器循环,当它们中的任何一个达到极限时,我需要设置一个标志位。

hts6caw3

hts6caw31#

我建议将计数器减1后存储。也就是说,它们从 limit-1 开始,你希望在它们从0翻转到-1时得到通知,而不是从1翻转到0。然后你可以解决这个问题如下:

# ymm0 holds the counters
# ymm1 holds the limits
# ymm2 holds 1 in each byte (or 0xff in each byte and use vpsubb)
# ymm3 holds 0 in each byte
vpcmpeqb  %ymm0, %ymm3, %ymm4    # which of the counters is zero?
vptest    %ymm4, %ymm4           # clear ZF if any counter was zero
vpsubb    %ymm2, %ymm0, %ymm0    # decrement counters
vpminub   %ymm1, %ymm0, %ymm0    # reset rolled-over counters to limits
jnz       .Lrollover             # do something if a counter rolled over

这段代码是为了说明一般的想法。有关如何使其更快的一些提示,请参阅下面的Peter Cordes的精彩评论。

相关问题