x86 - _mm256_testc_pd、_mm256_testz_pd、_mm256_testnzc_pd 有何用途?

标签 x86 sse simd intrinsics avx

我正在尝试理解 _mm256_testc_pd_mm256_testz_pd_mm256_testnzc_pd 内在函数,但我很难理解它们。

为了分析_mm256_testc_pd,我确定了以下情况(a 是第一个,b 是第二个__mm256d > 参数`):

  • 如果 b 中的所有压缩 double 均 > 0,则 ZF=1CF=1、除外:
  • 如果 ab 中的一个 double 压缩互为 < 0,则 ZF =0
  • 如果 !ab 中的一个双倍压缩相互<0,则 CF=0

换句话说,ZF=1 的值告诉我 a) b 完全是正数,或者 b) 对于 b 中的 double 不是正数,a 中有一个匹配的 double ,它是负数。 CF=1 的值告诉我,要么 c) b 完全为正,要么 d) 对于 b 中的那些 double 不是正数,!a 中有一个匹配的 double 为负数。

我的理解正确吗?我对此有点困惑。这个检查有什么意义呢?我将使用这些内在函数做什么?

最佳答案

最常见的用例是测试比较操作的结果,其中比较的结果元素全为 1 或全 0(因此测试符号位就足够了) - 这使您能够实现诸如“使用 _mm*_testz_p* 内在函数“全部相等”或“任何大于”等。

我从未发现任何其他变体的用途。

关于x86 - _mm256_testc_pd、_mm256_testz_pd、_mm256_testnzc_pd 有何用途?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53410744/

相关文章:

delphi - 如何使用扩展数组进行SIMD?

c - SIMD 2D矩阵英特尔指令集

c - 中断处理程序在真实计算机上不起作用

windows - 汇编程序指令如何无法读取它所在的内存

c++ - _mm_moveh_ps 的 AVX 等效项

c - 如何提高以下循环的性能

c++ - 访问冲突 _mm_store_si128 SSE Intrinsics

c++ - AVX2:计算 512 个 float 组的点积

assembly - 为什么 FMA _mm256_fmadd_pd() 内在函数有 3 个 asm 助记符, "vfmadd132pd"、 "231"和 "213"?

x86 - 如何找到英特尔 x86 CPU 上的指令解码到的微操作?