_mm256_testc_pd、_mm256_testz_pd、_mm256_testnzc_pd 是干啥用的?
Posted
技术标签:
【中文标题】_mm256_testc_pd、_mm256_testz_pd、_mm256_testnzc_pd 是干啥用的?【英文标题】:What are _mm256_testc_pd, _mm256_testz_pd, _mm256_testnzc_pd for?_mm256_testc_pd、_mm256_testz_pd、_mm256_testnzc_pd 是干什么用的? 【发布时间】:2018-11-21 11:04:46 【问题描述】:我正在尝试理解 _mm256_testc_pd
、_mm256_testz_pd
和 _mm256_testnzc_pd
内在函数,但我很难理解它们。
为了分析_mm256_testc_pd
,我确定了以下情况(a
是第一个,b
是第二个__mm256d
参数`):
b
中的所有 压缩双精度均> 0,则ZF=1
、CF=1
除外:
如果每个a
和b
中的一个 包装双相互,那么ZF=0
。
如果每个!a
和b
中的一个 包装双相互,那么CF=0
。
换句话说,ZF=1
的值告诉我,要么 a) b
完全是正数,要么 b) 对于 b
中非正数的双精度数,@987654341 中存在匹配双精度数@ 那是负面的。 CF=1
的值告诉我 c) b
完全是正数,或者 d) 对于 b
中的非正数双精度数,!a
中的匹配双数数是负数。
我是否理解正确?我对此有点困惑。这个检查有什么意义?我会用这些内在函数做什么?
【问题讨论】:
最常见的用例是测试比较操作的结果,其中结果元素要么全为 1,要么全为 0(因此测试符号位就足够了)——这使您能够实现谓词,例如使用testz
内在函数作为“全部相等”或“任何大于”等。 (我从未发现任何其他变体的用途)。
@PaulR:不妨将其移至答案。
@JasonR:是的,你是对的 - 我被最初只是简短的评论所迷惑。 ;-)
通常您使用vptest
或vtestpd
,其中一个操作数是一个常量掩码,而不是两个变量。例如检查任何元素是否为负(设置其符号位)。相关:Can PTEST be used to test if two registers are both zero or some other condition?.
【参考方案1】:
最常见的用例是测试比较操作的结果,其中比较的结果元素要么全为 1,要么全为 0(因此测试符号位就足够了)——这使您能够实现诸如“都等于”或“任何大于”等,使用 _mm*_testz_p*
内在函数。
我从未发现任何其他变体的用途。
【讨论】:
以上是关于_mm256_testc_pd、_mm256_testz_pd、_mm256_testnzc_pd 是干啥用的?的主要内容,如果未能解决你的问题,请参考以下文章
_mm256_movemask_epi8 到 uint64_t
带有 __256i 向量的意外 _mm256_shuffle_epi