データ・
を実行するサブルーチンを呼び出す前に上記の 2 つの条件に従っ てインタラプトを再びイネーブルにする必要があります。
■
イ ン タ ラ プ ト が 発 生 し た 元 の プ ロ グ ラ ム に 制 御 を 戻 す 前 に、
ISTATUS レジスタの内容を復旧する必要があります。レジスタ・
ウィンドウを故意にシフトした場合は、CWP の調整も行います。
■
インタラプトが発生した元のプログラムに制御を戻す前にこのプ
ログラムのレジスタ・ウィンドウの内容を復旧する必要があります。
概概概概要 要要要
パイプライン 1
パイプライン パイプライン パイプライン の実装 の実装 の実装
の実装
このセクションでは、以下の項目を説明します。
■ Nios CPU パイプライン
■
露出したパイプラインの分岐遅延と CWP の直接操作
図図 図 図 4 Nios CPU ブロック図 ブロック図 ブロック図 ブロック図
パイプラインの処理 パイプラインの処理 パイプラインの処理 パイプラインの処理
Nios CPU は、パイプライン化した RISC アーキテクチャです。分岐遅延
スロットと WRCTL で直接 CWP を変更した場合を除き、パイプライン の実装はソフトウェアには隠されています。パイプラインには、下記の ようなステージがあります。
■
フェッチ命令 フェッチ命令 フェッチ命令 フェッチ命令 -- Nios CPU がアドレスを送信し、メモリ・サブシス テムがこのアドレスに保存されていた命令を返してきます。
■
デコード デコード デコード デコード / オペランド・フェッチ命令 オペランド・フェッチ命令 オペランド・フェッチ命令 -- フェッチした命令をデコー オペランド・フェッチ命令 ドします。
レジスタ・オペランドがあれば、これらがレジスタ・ファイルから読み込まれます。
専用の分岐ターゲット加算器が、BR および BSR 命令のアドレスを計算します。
■
実行 実行 実行 実行 -- ALU にオペランドと制御ビットを渡します。
次に ALU が計算して処理結果を出します。
■
書き戻し 書き戻し 書き戻し 書き戻し -- 転送先レジスタが有効な場合、
ALU の処理結果を書き込みます。
分岐遅延スロット 分岐遅延スロット 分岐遅延スロット 分岐遅延スロット
分岐遅延スロットは、BR、BSR、CALL、JMP などの直後の命令として 定義します。
分岐遅延スロットは、分岐命令の後、または分岐先の命令の前に実行されます。表
15に BR 命令の分岐遅延スロットを示します。
分岐命令 (b) を検知すると、分岐先の命令 (e) に制御を移す前に命令 (c) を実行します。
上記のコードの実行順序は、(a)、(b)、(c)、(e)となりま
す。
命令 (c) は命令 (b) の分岐遅延スロットです。 命令 (d) は実行されません。
ほとんどの命令は分岐遅延スロットとして実行できますが、以下の命令は利用できません。
■ BR
■ BSR
■ CALL
■ IF1
■ IFO
■ IFRnz
■ IFRz
■ IFS
■ JMP
■ LRET
■ PFX
■ RET
■ SKP1
■ SKPO
■ SKPRnz
■ SKPRz
■ SKPS
■ TRET
■ TRAP
CWP 操作の命令 操作の命令 操作の命令 操作の命令
STATUS レジスタ (%ctl0) を変更する WRCTL 命令を使用する場合、そ
の後に NOP 命令を指定しなければなりません。
表
表 表 表
15. BR 分岐遅延スロットの例分岐遅延スロットの例 分岐遅延スロットの例 分岐遅延スロットの例
…
(a) ADD %g2, %g3 (b) BR ターゲット (c) ADD %g4, %g5 (d) ADD %g6, %g7
…
ターゲット: (e) ADD %g8, %g9
分岐遅延スロット
概概概概要 要要要
1
表
表 表 表
16. 表記の詳細表記の詳細 表記の詳細 表記の詳細 表記
表記 表記
表記 意味 意味 意味 意味 表記 表記 表記 表記 意味 意味 意味 意味
X← Y Y で X を上書き X >> n n ビット右へシフトした後の X 値
∅← e 式 e を評価した後、処理結果を破棄 X << n n ビット左へシフトした後の X 値
RA 32 のレジスタのいずれか。命令ワード
の 5 ビット a フィールドで選択
bnX 全幅値 X 内の n 番目のバイト (8 ビット・
フィールド)。b0X = X[7..0]、
b1X = X[15..8]、b2X = X[23..16]、
および b3X = X[31..24]
RB 32 のレジスタのいずれか。命令ワード
の 5 ビット b フィールドで選択
hnX 全幅値 X 内の n 番目のハーフ・ワード
(16 ビット・フィールド)。
h0X = X[15..0]、h1X = X[31..16]
RP ポインタ・イネーブル (P タイプ) の 4 レジスタのいずれか。命令ワードの 2 ビット p フィールドで選択
X & Y ビットごとの論理演算子 AND
IMMn n ビットの即値。命令ワードに埋め込み X | Y ビットごとの論理演算子 OR
K K レジスタに保持される 11 ビット値
(K を設定できるのは PFX 命令だけ)
X ⊕ Y ビットごとの論理演算子の排他的な OR
0xnn.mm 16 進数表記 (小数点は不使用。見やすく
するために便宜的に追加)
~X ビッドごとの論理演算子 NOT
(1 の補数)
X : Y ビッドワイズの連結演算子
例: (0x12 : 0x34) = 0x1234
|X| X の絶対値
(つまり、-X は X となります) {e1, e2} 条件式。 前の命令が PFX の場合、e2。
それ以外の場合は e1。
Mem32[X] 外部メモリに格納されたアライン済み
32 ビット・ワード値。バイト・アドレ ス X から開始。
σ(X) 符号付き整数 X をレジスタサイズに符号 拡張した値
Mem16[X] 外部メモリに格納されたアライン済み
16 ビット・ハーフ・ワード値。バイト・
アドレス X から開始。
X[n] X の n 番目のビット (n = 0 は LSB) align16(X) X & 0xFF.FE。切り捨てで強制的にハー フ・ワードにアラインされた整数値 X X[n..m] X の n から m までの連続ビット align32(X) X & 0xFF.FE.FF.FC、切り捨てで強制的
にフル・ワードにアラインされた整数値 X
C STATUS レジスタの C (carry) フラグ
CTLk K で選択した 2047 の制御レジスタのい
ずれか
命令のフォーマット 命令のフォーマット 命令のフォーマット 命令のフォーマット (1 / 2)
RR 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
op6 B A
Ri5 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
op6 IMM5 A
Ri4 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
op6 0 IMM4 A
RPi5 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
op4 P B A
Ri6 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
op5 IMM6 A
Ri8 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
op3 IMM8 A
i9 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
op6 IMM9 0
i10 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
op6 IMM10
i11 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
op5 IMM11
Ri1u 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
op6 op3u IMM1u 0 A
Ri2u 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
op6 op3u IMM2u A
概概概概要 要要要
1
i8v 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
op6 op2v IMM8v
i6v 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
op6 op2v 0 0 IMM8v
Rw 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
op6 op5w A
i4w 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
op6 op5w 0 IMM4w
w 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
op6 op5w 0 0 0 0 0
命令のフォーマット
命令のフォーマット
命令のフォーマット
命令のフォーマット (2 / 2)
表
表 表 表
17. 32 ビットの主要な命令コードの一覧表ビットの主要な命令コードの一覧表 ビットの主要な命令コードの一覧表 ビットの主要な命令コードの一覧表 (1 / 3) 命令コード
命令コード 命令コード
命令コード ニーモニッ ニーモニッ ニーモニッ ニーモニッ ク ク ク ク
フォー フォー フォー フォー マット マット マット マット
概要 概要 概要 概要
000000 ADD RR RA ← RA + RB
影響されるフラグ: N、V、C、Z 000001 ADDI Ri5 RA ← RA + (0x00.00 : K: IMM5)
影響されるフラグ: N、V、C、Z
000010 SUB RR RA ← RA – RB
影響されるフラグ: N、V、C、Z 000011 SUBI Ri5 RA ← RA – (0x00.00 : K: IMM5)
影響されるフラグ: N、V、C、Z
000100 CMP RR ∅ ← RA – RB
影響されるフラグ: N、V、C、Z 000101 CMPI Ri5 ∅ ← RA – (0x00.00 : K: IMM5)
影響されるフラグ: N、V、C、Z 000110 LSL RR RA ← (RA << RB [4..0]),
右からゼロを埋め込み 000111 LSLI Ri5 RA ← (RA << IMM5), 右からゼロを埋め込み 001000 LSR RR RA ← (RA >> RB [4..0]),
左からゼロを埋め込み 001001 LSRI Ri5 RA ← (R >> IMM5),
左からゼロを埋め込み 001010 ASR RR RA ← (RA >> RB [4..0]),
RA[31] で左から埋め込み 001011 ASRI Ri5 RA ← (RA >> IMM5),
RA[31] で左から埋め込み
001100 MOV RR RA ← RB
001101 MOVI Ri5 RA ← (0x00.00 : K: IMM5)
001110 AND RR
Ri5
RA ← RA & {RB, (0x00.00 : K: IMM5)}
影響されるフラグ: N、Z
001111 ANDN RR、
Ri5
RA ← RA & ~({RB, (0x00.00 : K: IMM5)}) 影響されるフラグ: N、Z
010000 OR RR、
Ri5
RA ← RA | {RB, (0x00.00 : K: IMM5)}
影響されるフラグ: N、Z
010001 XOR RR、
Ri5
RA ← RA ⊕ {RB, (0x00.00 : K: IMM5)}
影響されるフラグ: N、Z
010010 BGEN Ri5 RA ← 2IMM5
010011 EXT8d RR RA ← (0x00.00.00 : bnRA) ここでn = RB[1..0]
010100 SKP0 Ri5 (RA [IMM5] == 0) の場合、次の命令をスキップ
010101 SKP1 Ri5 (RA [IMM5] == 1) の場合、次の命令をスキップ
概概概概要 要要要
1
010110 LD RR RA ← Mem32 [align32( RB + (σ(K) x 4))]
010111 ST RR Mem32 [align32( RB + (σ(K) x 4))] ← RA 011000 STS8s i10 bnMem32 [align32(%sp + IMM10)] ← bn%r0
ここで n = IMM10[1..0]
011001 STS16s i9 hnMem32 [align32( %sp + IMM9 x 2)] ← hn%r0 ここで n = IMM9[0]
011010 EXT16d RR RA ← (0x00.00 : hnRA) ここでn = RB[1]
011011 MOVHI Ri5 h1RA ← (K : IMM5)、h0RA には影響なし 011100
011101000 EXT8s Ri2u RA ← (0x00.00.00 : bnRA) ここでn = IMM2u 011101001 EXT16s Rilu RA ← (0x00.00 : hnRA) ここでn = IMM1u 011101010
011101011
011101100 ST8s Ri2u bnMem32 [align32(RA + (σ(K) x 4))] ← bn%r0 ここでn = IMM2u
011101101 ST16s Rilu hnMem32 [align32(RA + (σ(K) x 4))] ← hn%r0 ここでn = IMM1u
01111000 SAVE i8v CWP← CWP – 1; %sp← %fp – (IMM8v x 4) (old-CWP == LO_LIMIT) の場合{TRAP #1}
01111001 TRAP i6v ISTATUS ← STATUS; IE ← 0; CWP ← CWP – 1;
IPRI ← IMM6v; %r15 ← ((PC + 2) >> 1) ; PC ← Mem32 [VECBASE + (IMM6v x 4)] x 2
01111100000 NOT Rw RA ← ~RA
01111100001 NEG Rw RA ← 0 – RA
01111100010 ABS Rw RA ← |RA|
01111100011 SEXT8 Rw RA ← σ(b0RA) 01111100100 SEXT16 Rw RA ← σ(h0RA)
01111100101 RLC Rw C ← msb (RA); RA ← (RA << 1) : C 影響されるフラグ: C
01111100110 RRC Rw C ← RA[0]; RA ← C : (RA >> 1) 影響されるフラグ: C
01111100111
01111101000 SWAP Rw RA ← h0RA : h1RA 01111101001
01111101010 01111101011 01111101100
表
表 表 表
17. 32 ビットの主要な命令コードの一覧表ビットの主要な命令コードの一覧表 ビットの主要な命令コードの一覧表 ビットの主要な命令コードの一覧表 (2 / 3) 命令コード
命令コード 命令コード
命令コード ニーモニッ ニーモニッ ニーモニッ ニーモニッ ク ク ク ク
フォー フォー フォー フォー マット マット マット マット
概要 概要
概要 概要
01111101101 RESTORE w CWP ← CWP + 1、(old-CWP == HI_LIMIT) の場合{TRAP #2}
01111101110 TRET Rw PC ← (RA x 2); STATUS ← ISTATUS 01111101111
01111110000 ST8d Rw bnMem32 [align32(RA + (σ(K) x 4))] ← bn%r0 ここで n = RA[1..0]
01111110001 ST16d Rw hnMem32 [align32(RA + (σ(K) x 4))] ← hn%r0 ここで n = RA[1]
01111110010 FILL8 Rw %r0 ← (b0RA : b0RA : b0RA : b0RA) 01111110011 FILL16 Rw %r0 ← (h0RA : h0RA)
01111110100 MSTEP Rw If (%r0[31] == 1) then %r0 ← (%r0 << 1) + RA else %r0
← (%r0 << 1) 01111110101
01111110110 SKPRz Rw (RA ==0) の場合、次の命令をスキップ
01111110111 SKPS i4w IMM4w でエンコードした条件が真の場合、次の命令をスキップ
01111111000 WRCTL Rw CTLk ← RA
01111111001 RDCTL Rw RA ← CTLk
01111111010 SKPRnz Rw (RA ! = 0) の場合、次の命令をスキップ
01111111011 01111111100 01111111101
01111111110 JMP Rw PC ← (RA x 2)
01111111111 CALL Rw R15 ←((PC + 4) >> 1); PC ← (RA x 2) 100000 BR i11 PC ← PC + ((s(IMM11) + 1) x 2) 100001
100010 BSR i11 PC ← PC + ((s(IMM11) + 1) x 2);
%r15 ← ((PC + 4) >> 1) 100010 BSR i11 PC ← PC + ((s(IMM11) + 1) x 2);
%r15 ← ((PC + 4) >> 1)
10011 PFX i11 K ← IMM11 (次の命令の後に K をゼロに設定)
1010 STP RPi5 Mem32[align32(RP + (σ(K : IMM5) x 4))] ← RA 1011 LDP RPi5 RA ← Mem32 [align32(RP + (σ(K : IMM5) x 4))]
110 STS Ri8 Mem32[align32(%sp + (IMM8 x 4) )] ← RA 111 LDS Ri8 RA ← Mem32 [align32(%sp + (IMM8 x 4))]
表
表 表 表
17. 32 ビットの主要な命令コードの一覧表ビットの主要な命令コードの一覧表 ビットの主要な命令コードの一覧表 ビットの主要な命令コードの一覧表 (3 / 3) 命令コード
命令コード 命令コード
命令コード ニーモニッ ニーモニッ ニーモニッ ニーモニッ ク ク ク ク
フォー フォー フォー フォー マット マット マット マット
概要 概要
概要 概要
概概概概要 要要要 以下の擬似命令は、nios-elf-gcc (GNU コンパイラ
) によって生成され、1
nios-elf-as (GNU アセンブラ) によって認識されます。
以下の演算子は nios-elf-as によって認識されます。
これらの演算子は定数および記号アドレスで利用可能であり、アセンブラまたはリンカーに よって正しく処理されます。
表
表 表 表
18. GNU コンパイラコンパイラ コンパイラ コンパイラ
/アセンブラ擬似命令 アセンブラ擬似命令 アセンブラ擬似命令 アセンブラ擬似命令 擬似命令 擬似命令
擬似命令 擬似命令 相当する命令 相当する命令 相当する命令 相当する命令 注 注 注 注
:LRET JMP %o7 LRET にはオペランドはありません。
RET JMP %i7 RET にはオペランドはありません。
NOP MOV %g0、%g0 NOP にはオペランドはありません。
IF0 %rA、IMM5 SKP1 %rA、IMM5 IF1 %rA、IMM5 SKP0 %rA、IMM5
IFRz %rA SKPRnz %rA
IFRnz %rA SKPRnz %rA IFS cc_c SKPS cc_nc IFS cc_nc SKPS cc_c
IFS cc_z SKPS cc_nz IFS cc_nz SKPS cc_z IFS cc_mi SKPS cc_pl IFS cc_pl SKPS cc_mi IFS cc_ge SKPS cc_lt
IFS cc_lt SKPS cc_ge IFS cc_le SKPS cc_gt IFS cc_gt SKPS cc_le IFS cc_v SKPS cc_nv IFS cc_nv SKPS cc_v
IFS cc_ls SKPS cc_hi IFS cc_hi SKPS cc_ls
演算子 演算子 演算子
演算子 内容 内容 内容 内容 処理 処理 処理 処理
%lo(x) x の下位 5 ビットを抽出 x & 0x0000001f
%hi(x) x の 5..15 ビットを抽出 (x >> 5) & 0x000007ff
%xlo(x) x の 16..20 ビットを抽出 (x >> 1 (x >> 16) & 0x0000001f
%xhi(x) x の 21..31 ビットを抽出 (x >> 21) & 0x000007ff
x@h x のハーフ・ワード・アドレス x >> 1
命令セット 命令セット 命令セット 命令セット
2
命命命命令 令令令 セセセセッ ッッット トトト
このセクションでは、32 ビット Nios CPU 命令の詳細を説明します。
説明は命令のニーモニックで、アルファベット順に記載しています。
各命令のページには、以下の情報があります。
■
命令のニーモニックと説明
■
処理の説明
■
アセンブラの構文
■
構文例
■
処理の説明
■
プリフィックスの処理
■
条件コード
■
命令のフォーマット
■
命令のフィールド
1