【发布时间】:2016-11-12 14:01:59
【问题描述】:
我想知道是否可以通过 Intel 的 SSE 内在函数检查处理器的标志寄存器?
例如:
int idx = _mm_cmpistri(mmrange, mmstr, 0x14);
int zero = _mm_cmpistrz(mmrange, mmstr, 0x14);
在此示例中,编译器能够将这两个内在函数优化为一条指令 (pcmpistri) 并通过跳转指令 (jz) 检查标志寄存器。
但是在以下示例中,编译器无法正确优化代码:
__m128i mmmask = _mm_cmpistrm(mmoldchar, mmstr, 0x40);
int zero = _mm_cmpistrz(mmoldchar, mmstr, 0x40);
在这里,编译器生成一个pcmpistrm 和一个pcmpistri 指令。但是,在我看来,第二条指令是多余的,因为pcmpistrm在处理器的标志寄存器中设置标志的方式与pcmistri相同。
那么,回到我的问题,有没有办法直接读取标志寄存器或指示编译器只生成pcmpistrm 指令?
【问题讨论】:
-
另外,你能把它包装在一个可以编译的函数中,这样人们就可以把它复制到gcc.godbolt.org吗?或者更好的是,自己链接到 Godbolt 上的源 + asm 输出。
-
@Peter Cordes 我使用启用了所有优化的 MSVC 编译器 (/O2)
-
看起来只是一个 MSVC 错过优化错误。 gcc6.2 和 icc17 在我编写的测试函数中成功使用了来自一个 PCMPISTRM (godbolt.org/g/4wRR8o) 的两个结果,该函数在
zero结果上出现了分支。 OTOH,clang3.9 失败,使用 PCMPISTRI。
标签: c++ intrinsics