我有这个 RISC-V 代码,问题是最后 x2 中的值可能是什么(我们不知道 x1 中的值)。
ori X2, X0, 0xFFF
slli X2, X2, 12
ori X2, X2, 0xFFF
slli X2, X2, 8
ori X2, X2, 0xFF
xor X2, X2, X1
addi X2, X2, 1
and X2, X2, X1
我得到的结果是(每一步后x2):
x2= 111 111 111
x2= 111 111 111 000 000 000 000
x2= 111 111 111 000 111 111 111
x2= 100 011 111 111 100 000 000
x2(*)=100 011 111 111 100 111 111
x2(final)= (X2`(*)X1+X2X1`+1)=X2`(*)X1
我有两个问题:
- 我的做法正确吗?
- 如果我不知道 X1,我能从最后一行得到什么?
最佳答案
前五个指令最终设置 x2
至0xffffffff
,因此您可以用单个指令 addi x2, zero, -1
替换它们或者仅仅是伪指令 li x2, -1
.
最后三个指令是:
xor X2, X2, X1
addi X2, X2, 1
and X2, X2, X1
分配给 x2
的值是((x1 ^ x2) + 1) & x1。由于 a ^ b 相当于 ~a & b | a & ~b,则该表达式可以表示为 ((~x1 & x2 | x1 & ~x2) + 1) & x1。
如上所述,x2
此时,0xffffffff
– 全部1s – 因此,~x1 & x2 的结果就是 ~x1 和 x1 & ~x2全部为0。上面的表达式可以进一步简化为 (~x1 + 1) & x1。
综上所述,x2
被分配 x1
之间按位和的结果及其二进制补码。最后三个指令可以替换为:
neg x2, x1
and x2, x2, x1
你可能不知道x1
,但你知道x2
最后保存 (~x1 + 1) & x1 的结果。
关于riscv - 我不确定 RISC-V 代码的结果是否正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59636300/