我想知道是否可以通過英特爾的SSE內部函數檢查處理器的標誌寄存器嗎?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
指令?
哪個編譯器有哪些選項?這看起來更像是編譯器成功CSEing的一個問題。 ISA手冊列出'_mm_cmpistrz'作爲[PCMPISTRI](http://www.felixcloutier.com/x86/PCMPISTRI.html)和[PCMPISTRM](http://www.felixcloutier.com/x86)的內部函數之一/PCMPISTRM.html),所以根據Intel的說法,編譯器可以發出'_mm_cmpistrz'指令。 –
另外,你可以將它包裝在一個編譯的函數中,以便人們可以將它複製到http://gcc.godbolt.org/上?或者更好的是,你自己鏈接到Godbolt上的source + asm輸出。 –
@Peter Cordes我在啓用了所有優化的情況下使用了MSVC編譯器(/ O2) – Philinator