RISCV伪指令LI编码疑问:工具为何生成4条而非2条指令?
关于RISC-V伪指令
li t1, 0xFF00F007的编码疑问解答 1. 你的编码是否正确?
完全正确。0xFF00F007可拆分为高20位0xFF00F和低12位0x007,正好适配RISC-Vlui+addiw的组合逻辑:
lui sp, 0xFF00F # 将0xFF00F左移12位,得到0xFF00F000存入sp addiw t1, sp, 0x7 # 把低12位的7(符号位为0,有符号扩展后不影响高位)加到sp,最终t1=0xFF00F007
这种2指令的实现是li伪指令针对32位立即数的最优编码方式,结果完全符合预期。
2. 为何工具会生成4条性能更差的指令?
这是因为该工具的伪指令展开逻辑不够优化。
工具生成的4条指令是通过分段拼接的方式构造立即数:
lui t1,0xff # t1 = 0xFF << 12 = 0xFF000 addiw t1,t1,15 # t1 = 0xFF000 + 15 = 0xFF00F slli t1,t1,0xc # t1 = 0xFF00F << 12 = 0xFF00F000 addi t1,t1,7 # t1 = 0xFF00F000 +7 = 0xFF00F007
它没有优先利用lui直接加载完整高20位的特性,反而把立即数拆成更小的分段处理,属于冗余的展开方式。这类工具可能是为了兼容更大范围的立即数(比如超过32位的场景),或是没有针对32位立即数做最优展开的逻辑优化,因此生成了性能更差的多指令序列。
内容的提问来源于stack exchange,提问作者CountWobula
相关产品推荐
相关产品推荐

