在ARM 64上使用GCC/Clang编译以下代码:
#include <cstdint>
uint64_t shiftright61(uint64_t lo, uint64_t hi) {
return ((((__uint128_t) hi) << 64) | lo) >> 61;
}
生成高效的实现:
shiftright61(unsigned long, unsigned long):
extr x0, x1, x0, 61
ret
有没有办法让MSVC在ARM 64上生成这个128位移位?在x64上,以下代码可以生成SHRD
128位移位指令,但在ARM 64上,MSVC会抱怨__shiftright128
没有定义:
#include <cstdint>
#include <intrin.h>
uint64_t shiftright61(uint64_t lo, uint64_t hi) {
return __shiftright128(lo, hi, 61);
}
1条答案
按热度按时间ulmd4ohb1#
编译器识别以下内容以生成有效的移位:
在提出这个问题之前,我使用
+
而不是|
来合并低偏移和高偏移,优化器没有识别出这一点。有趣的是,上面的指令在x64上是不,你仍然必须使用
__shiftright128
intrary来让编译器发出SHRD
指令。