我想知道是否可以通过英特尔的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
指令?
_mm_cmpistrz
作为PCMPISTRI和PCMPISTRM的内部函数之一,因此根据英特尔的说法,编译器可以为_mm_cmpistrz
发出任一指令。 - Peter Cordes