riscv - 我不确定 RISC-V 代码的结果是否正确

标签 riscv

我有这个 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

我有两个问题:

  1. 我的做法正确吗?
  2. 如果我不知道 X1,我能从最后一行得到什么?

最佳答案

前五个指令最终设置 x20xffffffff ,因此您可以用单个指令 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 的结果就是 ~x1x1 & ~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/

相关文章:

RISCV RV32IM : MULHSU - which operand is the signed one?

llvm - 如何在 LLVM IR 中使用 RISC-V 向量 (RVV) 指令?

riscv - 尝试了解当存在不同的程序计数器时,跳转指令如何计算地址

riscv - 如何编译 C 代码以获得最小 RISC-V 汇编程序的裸机框架?

debugging - 使用 Buildroot 生成 RISC-V Linux GDB

riscv - 如何在 RISC-V 中生成 hex 文件

assembly - 在没有乘法器的情况下加速以 2^8 为基数的大型模乘法

riscv - 解释 Chisel3 <> vs := ?

assembly - 什么可能导致 RISC-V 上的 SIGILL(非法指令除外)?

fpga - 在 Nexys-A7-100T FPGA 上实现裸机 RISC-V