为什么将 RISCV 伪指令 LI 编码为四个指令而不是两个?

问题描述 投票:0回答:1

亲爱的RISCV爱好者,

我的问题是关于编码的

li t1, 0xFF00F007

使用时 https://riscvasm.lucasteske.dev/# 上面的代码编码为

   0:   000ff337            lui t1,0xff
   4:   00f3031b            addiw   t1,t1,15
   8:   00c31313            slli    t1,t1,0xc
   c:   00730313            addi    t1,t1,7 # ff007 <_sstack+0xee607>

在我天真的尝试对指令进行编码时,我想出了

[0] lui sp, 0xFF00F         # --pseudo--> I_LI -> FF00F137
[4] addiw t1, sp, 0x7       # --pseudo--> I_LI -> 0071031B

我一定错过了什么。

我的问题是:

1.我自己的尝试正确吗?
2. 如果是正确的,为什么会https://riscvasm.lucasteske.dev/# 输出 4 条指令而不是 2 条?看来 4 条指令的性能不如 2 条。

感谢您的意见。

我在 RISCV 解释器中尝试了自己的代码https://www.cs.cornell.edu/courses/cs3410/2019sp/riscv/interpreter/ 似乎正确的立即数最终出现在寄存器中。

所以我没有看到我做错了什么。

assembly riscv instruction-encoding
1个回答
0
投票

问题是 0xFF00F007 是否应该被视为已签名。

他们的序列将 0x00000000FF00F007 加载到

t1
,而你的序列加载 0xFFFFFFFFFF00F007。

原因是在 64 位机器上,

lui
符号会扩展。

© www.soinside.com 2019 - 2024. All rights reserved.