You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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方式的立即数更易被多数架构高效处理,生成的代码更紧凑;SHR方式的大立即数会带来额外指令开销,在RISC架构下劣势明显。

结论

在速度相当的前提下,AND结合CMP的实现更优,它的立即数加载成本更低,生成的代码更紧凑,适配多数RISC架构的指令集限制。

内容的提问来源于stack exchange,提问作者mirabilos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 23:00:01