【问题标题】:In MIPS, when to use a signed-extend, when to use a zero-extend?在 MIPS 中,何时使用有符号扩展,何时使用零扩展?
【发布时间】:2015-03-26 16:55:45
【问题描述】:

我正在设计一个 MIPS 处理器作为我的个人项目,现在我遇到了一个非常困惑的问题。我只是无法总结在 MIPS 中何时使用有符号扩展以及何时使用零扩展。

搜了很多资源,大多是说:

1) ADDI、ADDIU 都使用有符号扩展。
2) ANDI、ORI、XORI 都使用零扩展。

但是,在这两条指令中,我开始感到困惑:

SLTIU/SLTI

在 Imagination 的“MIPS 程序员架构 II-A 卷:MIPS 指令集手册”第 368 页中说:

它明确提到16位立即数是有符号扩展的。但我不明白下面的说法:

[0, 32767] 或最大 [max_unsigned-32767, max_unsigned] 无符号范围的结尾。

还有一些人说 16 位立即数是零扩展,像这样:

那么,有人能解释一下 MIPS 中的有符号指令和无符号指令之间到底有什么区别吗?

【问题讨论】:

  • 希望高手能全面总结一下哪些指令使用有符号扩展,哪些指令使用零扩展。

标签: assembly mips system-verilog immediate-operand zero-extension


【解决方案1】:

我不确定您显示的两个描述的行为是否完全相同。它们似乎是不同的实现。

Imagination 的 MIPS 在其文档中的实现如下(在 SystemVerilog 语法中,假设 GPR 寄存器是 32 位):

if ({1'b0 , GPR[rs]} < {1'b0 , sign_extend(immediate)} 
   GPR[rd] = 32'h00000001;
else
   GPR[rd] = 32'h00000000;

请注意,这是一个 33 位比较,其中第 33 位为 0,因此是无符号比较。

另外,请注意:

sign_extend(immediate) returns: { {16{immediate[15]}}, immediate }

这意味着立即数首先被视为有符号数,即 15 位值,第 16 位是符号。因此:

If immediate >=0, then sign_extend(immediate) is in [0,32767]. 

另一方面,如果立即数是负数,我们将有:

sign_extend(immediate)  = { {16{1'b1}}, 1'b1, immediate[15:0] }, which is in [32'hFFFFFFFF-32767, 32'hFFFFFFFF]

其中 32'hFFFFFFFF 称为 max_unsigned。

基本上,这条指令使您能够在 GPR[rs] 和 [0,32767] 或 [32'hFFFFFFFF-32767, 32'hFFFFFFFF] 中的 unsigned 数字之间执行无符号比较。

第二个实现在 GPR[rs] 和 [0,65535] 之间执行无符号比较。

编辑:

请注意,在 SLTI 和 SLTIU 中,立即数是符号扩展的,但目的不同。在 SLTIU 中,被比较的两个数字被强制取消(通过添加第 33 位)。因此,立即数的符号扩展启用了不同的比较范围:最小的 32767 个和最大的 32767 个无符号值,而不仅仅是 0 到 65535。符号扩展不是为了有符号比较的目的而进行的,因为可能会混淆。

然而,在 SLTI 中,立即数的符号扩展是出于不同的目的:将负值与正值进行比较(有符号比较)。

【讨论】:

  • 其实我更喜欢你的回答,我能再问一个问题吗?在想象的实现中,立即数的有符号范围然后将其视为无符号数与GPS[rs]进行比较的目的是什么?在我看来,如果您对数字进行签名扩展然后将其视为无符号,则原始值将被扭曲。这对我来说没有任何意义:(
  • @ShuaiyuJiang:我已经在cmets回答了。我在上面的答案中添加了 cmets 的摘要。
【解决方案2】:

文档暗示该指令首先对 16 位立即数进行符号扩展,然后执行 32 位无符号比较。在verilog中,这应该相当于:

if (gpr[rs] < { {16{imm[15]}}, imm })
  gpr[rt] = 1;
else
  gpr[rt] = 0;

【讨论】:

  • 感谢您的回答。让我感到困惑的是,当您在两个二进制文件之间进行比较时,无论您对待无符号还是有符号,结果都应该是相同的。例如 4'b1011、4'b1001。当您将无符号视为 11 >> 9 时,当您将有符号视为 -5 >> -7 时,那么有符号扩展立即数有什么意义呢? SLTI 和 SLTIU 都得到相同的结果,即第一个值大于第二个值。
  • @ShuaiyuJiang:第二个实现中立即扩展的符号点是能够比较有符号值(也包括正数与负数的比较)。在 Imagination 的实现中,符号扩展为您提供了不同的范围:32767 最小和 32767 最大无符号值,而不仅仅是 0 到 65535。
  • 在您的示例中,两个项目的大小相同,但此指令将 32 位数量与 16 位数量进行比较。如果您以 8'b00001011 和 4'b1001 为例,那么答案是不同的。 8'h0B > 8'h09,但 8'h0B
  • @Ari,首先,感谢您的回答,让我这样问:手册上说 SLTIU 使用签名扩展,但是 SLTI 也使用签名扩展(这里是复制的 SLTI 描述: 将 GPR rs 和 16 位有符号立即数的内容作为有符号整数进行比较;将比较的布尔结果记录在 GPR rt 中,如果 GPR rs 小于立即数,则结果为 1(真);否则为 0 (错误)。)由于两条指令都使用有符号范围,那么这两条指令有什么区别?希望这是有道理的:(
  • @ShuaiyuJiang:我觉得 SLTIU 的 U 有点混乱。在 SLTI 和 SLTIU 中,立即数都是符号扩展的,但内涵不同。在 SLTIU 中,被比较的两个数字被强制取消(通过添加 33 位 0)。所以立即数的符号扩展只是启用了不同范围的比较(它不是为了有符号比较的目的而完成的,因为可能会让人感到困惑)。然而,在 SLTI 中,立即数的符号扩展是出于不同的目的:将 neg 值与 pos 值进行比较(有符号比较)
猜你喜欢
  • 2016-06-12
  • 2012-11-25
  • 2017-11-24
  • 1970-01-01
  • 2021-03-12
  • 2013-06-26
  • 2013-11-20
  • 1970-01-01
  • 2022-11-29
相关资源
最近更新 更多