如何使用比较运算符是 riscv(<=, >=)
how to use comparison operators is riscv(<=, >=)
我无法理解如何仅使用 来实现 rs1 >= rs2 和 rs1 <= rs2 slt、slti 和 xori。我知道怎么做 rs1 < rs2 但是我真的找不到不使用 bne 来执行 <= 的方法,有人有想法吗?
您在寻找什么答案?尝试将布尔值放入寄存器,或分支到目标——这些会有不同的答案。
由于限制包括 xori
,我们假设是前者。 xori
指令可用于取反布尔值。如果您不明白如何做到这一点,请查看 NOT on MIPS 或 RISC V,例如
因此,要执行 rs1 <= rs2
,我们会执行 ! (rs2 < rs1)
,这在逻辑上与 rs2 >= rs1
相同,而在逻辑上与 rs1 <= rs2
相同。
不同之处在于 ! (rs2 < rs1)
可以直接实现 MIPS 指令集和您的限制。
如果您希望在 <=
上分支而不是生成布尔值,我们将计算 rs2 < rs1
然后在 false 上分支(使用 beq .. [=19=]
)而不是在 true 上分支使用(bne .. [=20=]
).
所有6个关系操作都可以这样进行。您的工具包中的工具是:交换操作数边、取反布尔值、and/or false 分支与 true 分支。
询问编译器。
unsigned int fun ( unsigned int a, unsigned int b )
{
unsigned int ret;
ret=0;
if(a<b) ret=1;
return(ret);
}
00000000 <fun>:
0: 00b53533 sltu x10,x10,x11
4: 8082 c.jr x1
我无法理解如何仅使用 来实现 rs1 >= rs2 和 rs1 <= rs2 slt、slti 和 xori。我知道怎么做 rs1 < rs2 但是我真的找不到不使用 bne 来执行 <= 的方法,有人有想法吗?
您在寻找什么答案?尝试将布尔值放入寄存器,或分支到目标——这些会有不同的答案。
由于限制包括 xori
,我们假设是前者。 xori
指令可用于取反布尔值。如果您不明白如何做到这一点,请查看 NOT on MIPS 或 RISC V,例如
因此,要执行 rs1 <= rs2
,我们会执行 ! (rs2 < rs1)
,这在逻辑上与 rs2 >= rs1
相同,而在逻辑上与 rs1 <= rs2
相同。
不同之处在于 ! (rs2 < rs1)
可以直接实现 MIPS 指令集和您的限制。
如果您希望在 <=
上分支而不是生成布尔值,我们将计算 rs2 < rs1
然后在 false 上分支(使用 beq .. [=19=]
)而不是在 true 上分支使用(bne .. [=20=]
).
所有6个关系操作都可以这样进行。您的工具包中的工具是:交换操作数边、取反布尔值、and/or false 分支与 true 分支。
询问编译器。
unsigned int fun ( unsigned int a, unsigned int b )
{
unsigned int ret;
ret=0;
if(a<b) ret=1;
return(ret);
}
00000000 <fun>:
0: 00b53533 sltu x10,x10,x11
4: 8082 c.jr x1