• 検索結果がありません。

つの条件に従っ てインタラプトを再びイネーブルにする必要があります。

データ・

を実行するサブルーチンを呼び出す前に上記の 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. 表記の詳細

表記の詳細 表記の詳細 表記の詳細 表記

表記 表記

表記 意味 意味 意味 意味 表記 表記 表記 表記 意味 意味 意味 意味

XY 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

条件コードのフラグ・テーブル内の記号

∆ は、フラグが命令に

よって変更されていることを示します。