5

私は個人的なプロジェクトとして MIPS プロセッサを設計していますが、今では非常に混乱した質問に遭遇しました。MIPSでsigned-extendをいつ使用し、いつzero-extendを使用するかを要約することはできません。

私は多くのリソースを検索しましたが、主に次のように述べています。

1) ADDI、ADDIU は両方とも符号付き拡張を使用します。
2) ANDI、ORI、XORI は両方ともゼロ拡張を使用します。

ただし、これらの 2 つの命令では、混乱し始めています。

SLTIU/SLTI

Imagination の「MIPS Architecture for Programmers Volume II-A: The MIPS instruction set Manual」ページ 368 には、次のように記載されています。 写真1

16ビットの即値は符号付き拡張であると明確に述べられていますが、次のステートメントがわかりません。

[0, 32767] または符号なし範囲の最大 [max_unsigned-32767, max_unsigned] の終わり。

また、次のように、16 ビットの即値はゼロ拡張であると言う人もいます。

http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/pseudojump.html

さて、MIPS における符号付き命令と符号なし命令の正確な違いを説明できる人はいますか?

4

2 に答える 2

4

表示されている 2 つの説明がまったく同じように動作するかどうかはわかりません。それらは異なる実装のようです。

ドキュメントに記載されている Imagination の MIPS の実装は次のとおりです (SystemVerilog 構文では、GPR regsiter が 32 ビットであると仮定します)。

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

これは、33 番目のビットが 0 である 33 ビットの比較であるため、符号なしの比較であることに注意してください。

また、次の点にも注意してください。

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

これは、即値が最初に符号付き数値、つまり 15 ビット値として扱われ、16 番目のビットが符号であることを意味します。したがって:

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

一方、immediate が負の数の場合、次のようになります。

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] のいずれかの符号なし数値との間の符号なし比較を実行できます。

2 番目の実装では、GPR[rs] と [0,65535] の符号なし比較を実行します。

編集:

SLTI と SLTIU では、即値は符号拡張されますが、意図が異なることに注意してください。SLTIU では、比較される 2 つの数値は (33 番目のビットを追加することによって) 強制的に符号なしになります。そのため、immediate の符号拡張により、異なる範囲の比較が可能になりました: 0 から 65535 だけでなく、32767 の最小値と 32767 の最大値の符号なし値。

ただし、SLTI では、immediate の符号拡張は別の目的で行われます。負の値を正の値と比較する (符号付き比較) ためです。

于 2015-03-26T17:44:02.473 に答える