AND+CMP与SHR+CMP:哪种实现能生成更优代码?
两种
is_foo宏实现的代码生成对比 两种实现方式
AND结合CMP的实现
#define is_foo(someuint) ((someuint & (unsigned int)~0x7FU) == 0x001B0080U)
该逻辑通过掩码~0x7F(即0xFFFFFF80)保留输入值的高25位,再与0x001B0080比较,本质是校验输入值的高25位是否匹配,低7位不影响结果。
SHR结合CMP的实现
#define is_foo(someuint) ((someuint >> 7) == (0x001B0080U >> 7))
该逻辑将输入值右移7位后,与0x001B0080U >> 7(即0x00003601)比较,效果和前一种实现完全等价,同样只校验高25位是否匹配。
代码生成的关键对比点
- 指令延迟:两种实现都是“掩码/移位 → 比较”的两步依赖操作,比较指令必须等待前一步完成,理论延迟无差异。
- 立即数加载成本:
- AND方式的立即数
0xFFFFFF80,若架构支持有符号8位立即数加载,可通过-0x80直接生成,仅需1条加载指令;即使不支持,生成逻辑也更简单,指令长度更紧凑。 - SHR方式的立即数
0x00003601是14位数值,超出多数RISC架构(如ARM、RISC-V)常用的10/12位立即数加载限制,需要多指令拼接生成,会增加指令数量和代码体积。
- AND方式的立即数
- 架构适配性:AND方式的立即数更易被多数架构高效处理,生成的代码更紧凑;SHR方式的大立即数会带来额外指令开销,在RISC架构下劣势明显。
结论
在速度相当的前提下,AND结合CMP的实现更优,它的立即数加载成本更低,生成的代码更紧凑,适配多数RISC架构的指令集限制。
内容的提问来源于stack exchange,提问作者mirabilos
相关产品推荐
相关产品推荐

