2 - 日本アルテラ

Nios エンベデッド・プロセッサ
プログラマ・リファレンス・マニュアル
Version 1.1
2001 年 3 月
Altera Corporation
A-MNL-NIOSPROG-01/JP
Nios Embedded Processor Programmer’s Reference Manual
Altera、ACEX、APEX、APEX 20K、FLEX、FLEX 10KE、MAX+PLUS II、MegaCore、MegaWizard、OpenCore、Quartus、お
よび各製品名は Altera Corporation の米国および該当各国における商標またはサービス・マークです。この資料に記載されてい
る他のブランド名および製品名は、該当各社が保有する商標です。Verilog は Cadence Design Systems, Incorporated の登録商
標です。Java は Sun Microsystems Inc. の商標です。ModelSim は Model Technologies の商標です。MATLAB は MathWorks の
登録商標です。Microsoft は Microsoft Corporation の登録商標、Windows は同社の商標です。Altera products are protected under
numerous U.S. and foreign patents and pending applications, maskwork rights, and copyrights. Altera warrants performance of its
semiconductor products to current specifications in accordance with Altera’s standard warranty, but reserves the right to make
changes to any products and services at any time without notice. Altera assumes no responsibility or liability
arising out of the application or use of any information, product, or service described herein except as expressly
agreed to in writing by Altera Corporation. Altera customers are advised to obtain the latest version of device
specifications before relying on any published information and before placing orders for products or services.
Copyright  2001 Altera Corporation. All rights reserved.
ii
Altera Corporation
このマニュアルについて
®
本書では、NiosTM エンベデッド・プロセッサに関するさまざまな情報を
提供します。
Nios プロセッサまたは Nios エンベデッド・プロセッサという用語は、一
般的または抽象的な文脈でアルテラのソフト・コア・マイクロプロセッ
サを表しています。
Nios CPU という用語は、Nios プロセッサ・アーキテクチャを構成する
特定のロジック・ブロック ( 一部または全体 ) を表しています。
表 1 では、プログラマ・リファレンス・マニュアルの改訂履歴を示します。
表 1. 改訂履歴
改訂
日付
Version 1.1 2001 年 3 月
Altera Corporation
内容
Nios エンベデッド・プロセッサ・プログラマ・
リファレンス・マニュアル - 印刷版
iii
このマニュアルについて
アルテラへの
コンタクト
方法
アルテラ製品の最新情報については、アルテラの Web サイト
http://www.altera.co.jp を参照してください。
表 2. アルテラへのコンタクト方法
資料のご請求
価格・納期等について
情報提供元
連絡先
日本アルテラ株式会社
03-3340-9480
株式会社アルティマ
045-939-6113
06-6307-7670
株式会社 PALTEK
045-477-2009
06-6369-4070
World-Wide web
英 語
http://www.altera.com
日本語
http://www.altera.co.jp
株式会社アルティマ
045-939-6113
06-6307-7670
株式会社 PALTEK
045-477-2009
06-6369-4070
日本アルテラ株式会社
03-3340-9480
株式会社アルティマ
045-939-6113
06-6307-7670
052-202-1024
028-637-4488
045-477-2009
06-6369-4070
技術的なご質問
株式会社 PALTEK
E-mail (日本アルテラ) [email protected]
製品案内
iv
FTP Site (US)
ftp.altera.com
World-Wide web
http://www.altera.co.jp
Altera Corporaion
このマニュアルについて
表記規則
Nios エンベデッド・プロセッサ・プログラマ・リファレンス・マニュアル
では、表 3 の表記規則が適用されています。
表 3. 表記規則
特徴
意味
文頭が大文字の太字
コマンド名、ダイアログ・ボックスのタイトル、チェックボックス・オプション、
およびダイアログ・ボックスのオプションは、文頭を大文字にした太字で表記され
ています。例 : [Save As] ダイアログ・ボックス
太字
外部タイミング・パラメータ、ディレクトリ名、プロジェクト名、ディスク・ドラ
イブ名、ファイル名、ファイル名拡張子、およびソフトウェア・ユーティリティ名
は太字で表記されています。
例 : fMAX、\maxplus2 ディレクトリ、d: ドライブ、chiptrip.gdf ファイル
太字斜体
書籍の題名は文頭を大文字にした太字斜体で表記されています。
例 : 1999 Device Data Book
文頭が大文字の斜体
文書の題名は文頭を大文字にした斜体で表記されています。
例 : AN 75 ( 高速動作ボードの設計 )
斜体
内部タイミング・パラメータと変数は斜体で表記されています。例 : tPIA、n + 1
変数名は角括弧 (< >) で囲み、斜体で表記されています。
例 : < ファイル名 >、< プロジェクト名 >.pof ファイル
文頭大文字
キーボードのキーとメニュー名は文頭を大文字にして表記されています。
例 : Delete キー、[Option] メニュー
「小見出しタイトル」
Courier フォント
文書内のセクション、Quartus II および MAX+PLUS II のヘルプ・トピックは引用符
で囲んでいます。例 : “BitBlasterTM ダウンロード・ケーブルを使用した FLEX 10K
または FLEX 8000 デバイスのコンフィギュレーション”
信号とポート名は小文字の Courier フォントで表記されています。
例 : data1, tdi, input。
アクティブ・ロウ信号は接尾辞 _n で表記されています。例 : reset_n
表示されたとおりに入力するものは Courier フォントで表記されています。
例 : c:\max2work\tutorial\chiptrip.gdf。
また、Report File などの実際のファイルのセクション、ファイルの部分的な参
照 (AHDL キーボード SUBDESIGN など )、およびロジック・ファンクション名 (TRI
など ) は Courier フォントで表記されています。
1、2、3、および a、b、 作業手順にリストされている順番に作業の手順が重要なものについては、ステッ
c、...
プに番号をつけました。
■
項目の順序が重要でないものについては、項目に青い四角をつけてリストしました。
v
チェックマークは、1 ステップしかない手順を表します。
1
r
f
要注意個所に指差しマークを表示しました。
Altera Corporation
Enter キーを押すところにリターン矢印を表示しました。
記載されている項目の詳細情報の参照個所を足跡のマークで表示しました。
v
このマニュアルについて
Notes:
vi
Altera Corporaion
目次
表の一覧................................................................................................................xi
表の一覧
1. 概要 ....................................................................................................................1
はじめに .............................................................................................................................. 1
対象読者 ....................................................................................................................... 1
Nios CPU の概要 ................................................................................................................. 1
命令セット........................................................................................................................... 2
レジスタの概要.................................................................................................................... 2
汎用レジスタ ................................................................................................................ 2
K レジスタ.................................................................................................................... 5
プログラム・カウンタ.................................................................................................. 5
コントロール・レジスタ .............................................................................................. 5
メモリ・アクセスの概要 ..................................................................................................... 8
メモリ ( またはペリフェラル ) からの読み込み.................................................... 9
メモリ ( またはペリフェラル ) への書き込み ..................................................... 10
アドレス処理モード .......................................................................................................... 12
5/16 ビットの即値 ...................................................................................................... 12
全幅のレジスタ -- 間接値 ........................................................................................... 14
部分幅レジスタ -- 間接値 ........................................................................................... 14
全幅レジスタ -- オフセットによる間接値 .................................................................. 15
部分幅レジスタ -- オフセットによる間接値 .............................................................. 15
プログラムフロー・コントロール..................................................................................... 16
相対分岐命令 .............................................................................................................. 16
絶対ジャンプ命令....................................................................................................... 17
トラップ命令 .............................................................................................................. 17
条件命令 ..................................................................................................................... 17
例外.................................................................................................................................... 18
例外処理の概要 .......................................................................................................... 18
例外ベクタ・テーブル................................................................................................ 18
外部ハードウェア・インタラプト・ソース ............................................................... 19
内部例外ソース .......................................................................................................... 19
レジスタ・ウィンドウのアンダフロー ............................................................... 19
レジスタ・ウィンドウのオーバフロー ............................................................... 20
ソフトウェア例外 (TRAP 命令 )................................................................................. 21
例外処理の手順 .......................................................................................................... 21
レジスタ・ウィンドウの使用方法 ...................................................................... 22
ステータスの維持 : ISTATUS レジスタ .............................................................. 23
リターン・アドレス ................................................................................................... 23
簡単な例外ハンドラと複雑な例外ハンドラ ............................................................... 23
簡単な例外ハンドラ ............................................................................................ 23
Altera Corporation
vii
目次
複雑な例外ハンドラ ............................................................................................ 24
パイプラインの実装........................................................................................................... 25
パイプラインの処理 ................................................................................................... 25
分岐遅延スロット ....................................................................................................... 26
CWP 操作の命令 ........................................................................................................ 26
2. 命令セット ..................................................................................................... 35
ABS.................................................................................................................................... 36
ADD ................................................................................................................................... 37
ADDI .................................................................................................................................. 38
AND ................................................................................................................................... 39
ANDN................................................................................................................................. 40
ASR.................................................................................................................................... 41
ASRI................................................................................................................................... 42
BGEN................................................................................................................................. 43
BR ...................................................................................................................................... 44
BSR.................................................................................................................................... 45
CALL .................................................................................................................................. 46
CMP ................................................................................................................................... 47
CMPI .................................................................................................................................. 48
EXT16D ............................................................................................................................. 49
EXT16S.............................................................................................................................. 50
EXT8D ............................................................................................................................... 51
EXT8S................................................................................................................................ 52
FILL16................................................................................................................................ 53
FILL8.................................................................................................................................. 54
JMP.................................................................................................................................... 55
LD ...................................................................................................................................... 56
LDP .................................................................................................................................... 57
LDS .................................................................................................................................... 58
LSL..................................................................................................................................... 59
LSLI.................................................................................................................................... 60
LSR .................................................................................................................................... 61
LSRI ................................................................................................................................... 62
MOV................................................................................................................................... 63
MOVHI ............................................................................................................................... 64
MOVI.................................................................................................................................. 65
MSTEP............................................................................................................................... 66
MULL ................................................................................................................................. 67
NEG ................................................................................................................................... 68
NOT ................................................................................................................................... 69
OR...................................................................................................................................... 70
PFX .................................................................................................................................... 71
RDCTL ............................................................................................................................... 72
RESTORE.......................................................................................................................... 73
RLC.................................................................................................................................... 74
RRC ................................................................................................................................... 75
viii
Altera Corporation
目次
SAVE ................................................................................................................................. 76
SEXT16.............................................................................................................................. 77
SEXT8................................................................................................................................ 78
SKP0.................................................................................................................................. 79
SKP1.................................................................................................................................. 80
SKPRNZ ............................................................................................................................ 81
SKPRZ ............................................................................................................................... 82
SKPS ................................................................................................................................. 83
ST ...................................................................................................................................... 84
ST16D................................................................................................................................ 85
ST16S ................................................................................................................................ 86
ST8D.................................................................................................................................. 87
ST8S .................................................................................................................................. 88
STP .................................................................................................................................... 89
STS .................................................................................................................................... 90
STS16S.............................................................................................................................. 91
STS8S................................................................................................................................ 92
SUB.................................................................................................................................... 93
SUBI................................................................................................................................... 94
SWAP ................................................................................................................................ 95
TRAP ................................................................................................................................. 96
TRET.................................................................................................................................. 97
WRCTL .............................................................................................................................. 98
XOR ................................................................................................................................... 99
3. 索引 ............................................................................................................... 101
Altera Corporation
ix
Notes:
x
Altera Corporation
表のリスト
表 4.
表 5.
表 6.
表 7.
表 8.
表 9.
表 10.
表 11.
表 12.
表 13.
表 14.
表 15.
表 16.
表 17.
表 18.
表 19.
表 20.
表 21.
改訂履歴 ..................................................................................................................................... iii
アルテラへのコンタクト方法..................................................................................................... iv
規約 ............................................................................................................................................. v
Nios CPU アーキテクチャ ..........................................................................................................1
レジスタ・グループ ....................................................................................................................3
プログラマのモデル ....................................................................................................................4
条件コード・フラグ ....................................................................................................................7
一般的な 32 ビット Nios CPU のアドレス 0x0100 におけるプログラムとデータ・メモリ ......8
アドレス 0x0100 における N ビット幅ペリフェラル (32 ビット Nios CPU).............................9
5/16 ビットの即値を使用した命令............................................................................................13
全幅レジスタを使用した命令 -- 間接的なアドレス処理 ........................................................... 14
部分幅レジスタを使用した命令 -- 間接的なアドレス処理........................................................ 14
全幅レジスタを使用した命令 -- オフセット・アドレス処理による間接値 ..............................15
部分幅レジスタを使用した命令 -- オフセット・アドレス処理による間接値........................... 16
BR 分岐遅延スロットの例 ........................................................................................................ 26
表記の詳細 ................................................................................................................................ 27
32 ビットの主要な命令コードの一覧表.................................................................................... 30
GNU コンパイラ / アセンブラ擬似命令 .................................................................................... 33
Altera Corporation
xi
Notes:
xii
Altera Corporation
概要
1
概要
はじめに
NiosTM エンベデッド・プロセッサは、プログラマブル・ロジックと SOPC
(system-on-a-programmable chip) のインテグレーションに最適化された
ソフト・コア CPU です。これはコンフィギュレーションが可能な汎用
RISC プロセッサであり、ユーザ・ロジックと結合してアルテラのプログ
ラマブル・ロジック・デバイス (PLD) にプログラミングすることができ
ます。多様なアプリケーションを対象として、Nios CPU のコンフィギュ
レーションを実行できます。オンチップ ROM エンベデッド・システム・
ブロック (ESB) から小さなプログラムを実行する 16 bit Nios CPU コア
は、効率的なシーケンスやコントローラとして機能し、ハードコードの
ステート・マシンの置き換えに使用することができます。外部 FLASH プ
ログラム・ストレージと大容量外部メイン・メモリを備えた 32 ビット
Nios CPU コアは、強力な 32 ビット・エンベデッド・プロセッサ・シス
テムになります。
対象読者
このリファレンス・マニュアルは、Excalibur 開発キットを使用して Nios
エンベデッド・プロセッサ内蔵のシステム・デザイン・モジュールを開
発するソフトウェアおよびハードウェア・エンジニアを対象としていま
す。またこのマニュアルは、対象読者が電子工学、マイクロプロセッサ、
アセンブラ言語に精通していることを前提としています。Nios CPU で使
用される規約については、27 ページの表 16 を参照してください。
Nios CPU の
概要
Nios CPU は、パイプライン化したシングル・イシューの RISC プロセッ
サであり、ほとんどの命令を単一のクロック・サイクルで実行します。
Nios の命令セットは、コンパイルしたエンベデッド・アプリケーション
を対象にしています。16 ビット版および 32 ビット版の Nios CPU のネ
イティブなワード・サイズは、それぞれ 16 ビットと 32 ビットとなって
います。すなわち 16 ビット Nios CPU のネイティブなワード・サイズは
ハーフ・ワード、32 ビット Nios CPU のサイズは 1 ワードとされていま
す。通常、1 バイトは 8 ビットに換算できますが、Nios の場合、ハーフ・
ワードは 16 ビット、1 ワードは 32 ビットと表現します。Nios ソフト・
コア・プロセッサの製品ファミリは、32 ビットと 16 ビットのアーキテ
クチャで構成されています。
表 4. Nios CPU アーキテクチャ (1 / 2)
Nios CPU の詳細
Altera Corporation
32 ビット Nios
CPU
16 ビット Nios
CPU
データ・バスのサイズ ( ビット )
32
16
ALU 幅 ( ビット )
32
16
内部レジスタ幅 ( ビット )
32
16
1
概要
表 4. Nios CPU アーキテクチャ (2 / 2)
Nios CPU の詳細
アドレス・バスのサイズ
( ビット )
命令サイズ ( ビット )
ロジック・セル
( 一般的なタイプ )
fmax (EP20K200E -1)
32 ビット Nios
CPU
16 ビット Nios
CPU
32
17
16
16
1700
1100
最大 50 MHz
最大 50 MHz
Cygnus 社の GNUPro コンパイラおよびデバッガは、業界標準のオープ
ン・ソース C/C++ コンパイラ・リンカーおよびデバッガ・ツールキット
ですが、この製品は Nios CPU と一緒に提供されています。GNUPro ツー
ルキットは、C/C++ コンパイラ、マクロアセンブラ、リンカー、デバッ
ガ、バイナリ・ユーティリティ、およびライブラリで構成されています。
命令セット
Nios プロセッサの命令セットは、C および C++ からコンパイルしたプロ
グラムをサポートするように制定されています。この命令セットには、算
術計算やロジック処理など、標準的な命令セットの他に、ビット処理、
バイト抽出、データ移動、制御フロー変更などの命令セット、条件設定
が可能な小さな命令セットが含まれています。この小さな命令セットを
使用すると、短い条件分岐を省くことができます。
レジスタの
概要
このセクションでは、Nios CPU 汎用レジスタとコントロール・レジスタ
の構成について説明します。Nios CPU アーキテクチャは、大容量の汎用
レジスタ・ファイル、複数のマシン・コントロール・レジスタ、プログ
ラム・カウンタ、命令のプリフィックスに使用する K レジスタで構成さ
れています。
汎用レジスタ
汎用レジスタは、32 ビット Nios CPU では 32 ビット幅、16 ビット Nios
CPU では 16 ビット幅になっています。レジスタ・ファイルのサイズは
変更できますが、含めるレジスタの数は 128、256、512 のいずれかで
す。ソフトウェアは、32 レジスタを表示するスライディング・ウィンド
ウでレジスタにアクセスしますが、このウィンドウは 16 レジスタごとに
スライディングできます。このスライディング・ウィンドウで、レジス
タ・ファイルの内容をすべて参照できます。このスライディング・ウィ
ンドウから、レジスタ・ファイルのサブセットにアクセスできます。
2
Altera Corporation
概要
表 5. レジスタ・グループ
In レジスタ
%r24-%r31
または
ローカル・レジスタ
%r16-%r23
または
%L0-%L7
Out レジスタ
%r8-%r15
または
%o0-%o7
Global レジスタ
%r0-%r7
または
%g0-%g7
%i0-%i7
上位の 8 レジスタ (%i0-%i7) は、in レジスタと呼ばれ、次の 8 レジスタ
(%L0-%L7) は local レジスタ、残りの 8 レジスタ (%o0-%o7) は out レジ
スタと呼ばれます。レジスタ・ウィンドウを 16 レジスタほど下に移動す
ると (SAVE 命令の場合と同じく )、out レジスタは新しいウィンドウ・ポ
ジションの in レジスタになります。また最後のウィンドウ・ポジション
の local および in レジスタは、アクセスできなくなります。詳細について
は、表 6 を参照してください。
Altera Corporation
3
1
概要
レジスタ・ウィンドウは、表 5 に示すように 4 つの均等なセクションに
分けられます。下位の 8 レジスタ (%r0-%r7) はグローバルなレジスタで
あり、%g0-%g7 とも呼ばれます。これらのグローバル・レジスタは、ウィ
ンドウの移動や配置によって変更されませんが、(%g0-%g7) としてアク
セスすることができます。レジスタ・ファイルにある上位の 24 レジスタ
(%r8-%r31) は、カレント・ウィンドウからアクセスできます。
概要
.
表 6. プログラマのモデル
31
I %i7
N %i6
%i5
%i4
%i3
%i2
%i1
%i0
L %L7
O %L6
C %L5
A %L4
L %L3
%L2
%L1
%L0
16 15
0
SAVE 命令のリターン・アドレス
%fp -- フレーム・ポインタ
%r31
%r30
%r29
%r28
%r27
%r26
%r25
%r24
%r23
%r22
%r21
%r20
%r19
%r18
%r17
%r16
STP/LDP のベース・ポインタ 3 ( または汎用 local)
STP/LDP のベース・ポインタ 2 ( または汎用 local)
STP/LDP のベース・ポインタ 1 ( または汎用 local)
STP/LDP のベース・ポインタ 0 ( または汎用 local)
現在のリターン・アドレス
%sp スタック・ポインタ
O %o7 %r15
U %o6 %r14
T %o5 %r13
%o4 %r12
%o3 %r11
%o2 %r10
%o1 %r9
%o0 %r8
G %g7 %r7
L %g6 %r6
O %g5 %r5
B %g4 %r4
A %g3 %r3
L %g2 %r2
%g1 %r1
%g0 %r0
10 9 8 7 6 5 4 3 2 1 0
K レジスタ
32 31
16 15
10 9 8 7 6 5 4 3 2 1 0
PC
%ctl9 CLR_IE
%ctl8 SET_IE
%ctl7
%ctl6
%ctl5
%ctl4
%ctl3
%ctl2
%ctl1
%ctl0
4
—
—
—
—
—
WVALID
ISTATUS
STATUS
このレジスタへのすべての書き込み (WRCTL) 動作で STATUS[15] (IE)=0 に設定されます。すべての読み
込み動作 (RCTL) の結果は未定義です。
このレジスタへのすべての書き込み (WRCTL) 動作で STATUS[15] (IE)=1 に設定されます。すべての読み
込み動作 (RCTL) の結果は未定義です。
— 予約 —
— 予約 —
— 予約 —
— 予約 —
— 予約 —
HI_LIMIT
LO_LIMIT
保存されたステータス
IE
IPRI
CWP
N V Z C
Altera Corporation
概要
K レジスタ
1
PFX 命令は 1 サイクルの間の割込みを無効にするため、PFX に続く 2 つ
の命令は不可分な CPU 演算になります。また PFX に続く命令のペアは
SKP タイプの条件命令で両方スキップされます。
K レジスタは、ソフトウェアによって直接的にアクセスされることはな
く、間接的に利用されています。例えば、MOVI 命令は K の 11 ビット
すべてを転送先レジスタのビット 15..5 に移動します。この K レジスタ
の読み込み処理は、前の命令が PFX の場合にのみゼロ以外の結果を出し
ます。
プログラム・カウンタ
プログラム・カウンタ (PC) レジスタには、現在実行中の命令のバイト・
アドレスが格納されています。すべての命令はハーフ・ワード・アライ
ンされるため、PC 値の最下位ビットは常に 0 になります。
PC を明示的に設定している場合を除いて、PC は命令のたびに 2 ずつ加
算されていきます (PC ← PC + 2)。BR、BSR、CALL、JMP などの命令
は、PC を直接変更します。PC は、32 ビット Nios CPU では 33 ビット
幅、16 ビット Nios CPU では 17 ビット幅です。
コントロール・レジスタ
定義済みのコントロール・レジスタが 5 つありますが、これらは汎用レ
ジスタとは独立してアドレスが付けられます。これらコントロール・レ
ジスタの、読み込みや書き込みを実行できるのは、RDCTL と WRCTL の
命令だけです (%ctl0 と %g0 は関係がありません )。
STATUS (%ctl0)
15
14
13
IE
Altera Corporation
12
11
IPRI
10
9
8
7
6
CWP
5
4
3
2
1
0
N
V
Z
C
5
概要
K レジスタは 11 ビットのプリフィックスであり、PFX を除くすべての
命令で 0 に設定されます。PFX 命令の場合、IMM11 命令フィールドから
直接 K が設定されます。レジスタ K でゼロ以外の値が格納されるのは、
PFX に続く次の命令の時だけです。
概要
インタラプト・イネーブル (IE)
IE はインタラプト・イネーブル・ビットです。IE=1 の場合、外部インタ
ラプトと内部例外がイネーブル ( 有効 ) になります。IE=0 の場合、外部
インタラプトと例外がディセーブル ( 無効 ) になります。ソフトウェアの
TRAP 命令は、IE=0 の場合でも普通に実行されます。ただし、コント
ロール・レジスタの SET_IE (%ctl9) と CLR_IE (%ctl8) に書き込みを実
行すれば、残りの STATUS レジスタを変えずに、IE を直接的に設定でき
ます。CPU をリセットすると、IE が 0 に設定されます ( インタラプト・
ディセーブル )。
インタラプト・プライオリティ (IPRI)
IPRI には、実行中のインタラプト・プライオリティが格納されています。
例外を処理すると、IPRI 値が例外番号に設定されます。詳細については、
18 ページの「例外」を参照してください。外部ハードウェアのインタラ
プトの場合、IPRI 値は 6 ビット・ハードウェア・インタラプト番号から
直接設定されます。TRAP 命令の場合、IPRI フィールドは 命令の IMM6
フィールドから直接設定されます。内部例外では、IPRI フィールドは事
前に定義した 6 ビット例外番号から設定されます。
内部番号が IPRI より大きいか等しい場合、または IE=0 の場合、そのハー
ドウェア・インタラプトは処理されません。TRAP 命令は無条件に処理
されます。CPU をリセットすると、IPRI は 63 に設定されます ( 最下位
のプライオリティ)。IPRI は特定の番号を超えたインタラプトをディセー
ブルにします。例えば、IPRI が 3 の場合は、インタラプトの 0、1、2 が
処理されますが、その他はすべて ( インタラプト 3 ∼ 63) ディセーブル
になります。
カレント・ウィンドウ・ポインタ (CWP)
汎用レジスタ・ファイルにおいて、CWP はスライディング・レジスタ・
ウィンドウの起点を表します。CWP を増やすと、レジスタ・ウィンドウ
は 16 レジスタ上に移動します。CWP を減らすと、レジスタ・ウィンド
ウ は 16 レジ スタ 下に 移動 しま す。 CWP は、SAVE 命 令で 減り、
RESTORE 命令で増えます。
WRCTL によって CWP に値を直接書き込むのは、レジスタ・ウィンドウ
の管理機能など、特殊なシステム・ソフトウェアに限定すべきです。ソ
フトウェアは、通常 SAVE および RESTORE 命令で CWP を変更してい
ます。CPU をリセットすると、CWP は最大有効値の HI_LIMIT に設定さ
れます。すなわち、レジスタ・ファイルのサイズが 256 の場合、16 のレ
ジスタ・ウィンドウが存在することになります。リセット後、WVALID レ
ジスタ (%ct12) は 0x01C1、すなわち LO_LIMIT = 1 および HI_LIMIT =
14 に設定されます。詳細については、7 ページの「WVALID (%ctl2)」を
参照してください。
6
Altera Corporation
概要
条件コード・フラグ
条件コード・フラグを変更する命令がいくつかあります。これらのフラ
グは、表 7 に示すようにステータス・レジスタにある最下位の 4 ビット
になります。
概要
表 7. 条件コード・フラグ
N
結果の符号、または最上位ビット
V
算術演算のオーバフロー -- 無制限の精度で計算した場合の符
号と、32 ビットの処理結果の 31 ビット目が異なっている場
合、これが設定されます。
Z
処理結果は 0 です。
C
加算時の繰り上げ、減算時の繰り下げ
ISTATUS (%ctl1)
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
ISTATUS は、STATUS レジスタのコピーを保持します。例外を処理する
と、STATUS レジスタの値が ISTATUS レジスタにコピーされます。こ
のコピー値があるため、インタラプトされたプログラムに制御が戻る前
に、STATUS レジスタを例外以前の値に復旧することができます。詳細
については 18 ページの「例外」を参照してください。TRET (return-fromtrap ) 命令は、ISTATUS レジスタを自動的に STATUS レジスタにコピー
します。例外を処理すると、インタラプトがディセーブル (IE=0) になり
ます。例外ハンドラで ISTATUS レジスタの値を保持しないと、インタラ
プトを再びイネーブルにすることができません。CPU をリセットする
と、ISTATUS が 0 に設定されます。
WVALID (%ctl2)
15
14
13
12
11
10
9
8
7
HI_LIMIT
6
5
4
3
2
1
0
LO_LIMIT
WVALID には HI_LIMIT と LOW_LIMIT の 2 つの値が格納されています。
SAVE 命令が CWP を LOW_LIMIT から LOW_LIMIT - 1 に減らすと、レ
ジスタ・ウィンドウ・アンダフロー ( 例外 #1) が生成されます。RESTORE
命令が CWP を HI_LIMIT から HI_LIMIT + 1 に増やすと、レジスタ・ウィ
ンドウ・オーバフロー ( 例外 #2) が生成されます。WVALID は設定が可能
であり、読み込み専用または読み込み / 書き込みに設定できます。CPU
をリセットすると、LO_LIMIT が 1 に設定され、HI_LIMIT が最上位の有
効ウィンドウ・ポインタ ( レジスタ・ファイル・サイズ / 16) - 2) に設定
されます。
Altera Corporation
1
7
概要
CLR_IE(%ctl8)
CLR_IE レジスタに対して WRCTL を実行すると、STATUS レジスタの
IE ビットがクリアされます (IE ← 0)。値は無視されます。CLR_IE で
RDCTL を実行すると、予期せぬ処理結果となります。
SET_IE (%ctl9)
SET_IE レジスタに対して WRCTL を実行すると、STATUS レジスタの
IE ビットがセットされます (IE ← 1)。値は無視されます。SET_IE で
RDCTL を実行すると、予期せぬ処理結果となります。
メモリ・アク
セスの概要
Nios プロセッサはリトル・エンディアン方式です。データ・メモリは連
続したネイティブ・ワードで構成する必要があります。物理メモリ・デ
バイスがネイティブ・ワードのサイズよりも狭い場合、データ・バスは
ダイナミック・バス・サイジングを実行して、Nios CPU の全幅データを
シミュレートします。ペリフェラルはレジスタをネイティブ・ワードの
幅で表しますが、レジスタがネイティブ・ワードよりも狭くなるような
場合は、最上位のビットに 0 を埋め込みます。表 8 と表 9 は、32 ビット
Nios CPU のネイティブ・ワードの幅を示しています。
表 8. 一般的な 32 ビット Nios CPU のアドレス 0x0100 における
プログラムとデータ・メモリ
アドレス
内容
31
24 23
16 15
8 7
0x0100
バイト 3
バイト 2
バイト 1
バイト 0
0x0104
バイト 7
バイト 6
バイト 5
バイト 4
0x0108
バイト 11
バイト 10
バイト 9
バイト 8
0x010c
バイト 15
バイト 14
バイト 13
バイト 12
0
表 9. アドレス 0x0100 における N ビット幅ペリフェラル
(32 ビット Nios CPU)
アドレス
内容
31
0x0100
8
( ゼロの埋め込み )
N N-1
0
レジスタ 0
0x0104
( ゼロの埋め込み )
レジスタ 1
0x0108
( ゼロの埋め込み )
レジスタ 2
0x010c
( ゼロの埋め込み )
レジスタ 3
Altera Corporation
概要
メモリ ( またはペリフェラル ) からの読み込み
1
メモリからデータを読み込む最も簡単な命令は、LD 命令です。この命令
の典型的な例は、LD%g3, [%o4] です。最初のレジスタ・オペランド %g3
は、データがロードされる転送先レジスタです。2 番目のレジスタ・オペ
ランドは、読み込むアドレスを格納したレジスタを指定します。このア
ドレスは、最も近いハーフ・ワード (16 ビット Nios CPU) またはワード
(32 ビット Nios CPU) にアラインされます。すなわち最下位のビット (16
ビット Nios CPU) または 2 ビット (32 ビット Nios CPU) は 0 として処
理されます。
しかし、稀にではありますが、ソフトウェアでネイティブ・データ・サ
イズよりも小さなデータを読み込まなければならないことがあります。
Nios CPU は、ネイティブ・ワードから個々のバイト (16 ビットおよび
32 ビット Nios CPU) やハーフ・ワード (32 ビット Nios CPU) を抽出す
る命令を持っています。EXT8d 命令は 1 バイトの抽出に使用され、
EXT16d 命令は 1 ワードの抽出に使用されます。EXT8d 命令の典型的な
例は、EXT8d %g3,%o4 です。EXT8d 命令は、2 番目のレジスタ・オペ
ランドの最下位ビット (16 ビット Nios CPU) または 2 ビット (32 ビット
Nios CPU) を使用して、最初のレジスタ演算子から 1 バイトを抽出し、
最初のレジスタ・オペランドの内容全体をそのバイトで置き換えます。
Altera Corporation
9
概要
Nios CPU はアラインされたメモリ・アクセスしか実行できません。32
ビットの読み込み処理は、4 の倍数のバイト・アドレスから開始するフ
ル・ワードのみを読み込みます。16 ビット読み込み処理は、2 の倍数の
バイト・アドレスから開始するハーフ・ワードのみを読み込みます。メ
モリから読み込みを行う命令は、常にロー・ビット (16 ビット Nios CPU)
またはアドレスの下位 2 ビット (32 ビット Nios CPU) を 0 として処理し
ます。ワードから特定のバイトやハーフ・ワードを抽出する場合は、命
令で実行することになります。
概要
コード例 1 のアセンブラ言語は、バイトのアドレスがネイティブ・ワー
ド・アラインされていない場合にメモリから 1 バイトを読み込む方法
を示しています。
コード例 1: メモリからの 1 バイトの読み込み
メモリの内容
;
; 0x00001200
0
0x46
1
0x49
2
0x53
3
0x48
;32 ビット Nios CPU で実行される命令
; %o4 にアドレス x00001202 があると仮定します。
LD %g3,[%o4]
EXT8d %g3,%o4
;
;
;
;
%g3
%g3
%g3
%g3
はアドレス 0x1200 の内容を取得するため、
には 0x48534946 が格納されます。
は %g3 のバイト 2 と置換されるため、
には 0x00000053 が格納されます。
メモリ ( またはペリフェラル ) への書き込み
Nios CPU は、バイト、ハーフ・ワード、ワード ( ワードの書き込みが可
能なのは 32 ビット Nios CPU のみ ) の幅でアラインされた、メモリへの
書き込みを実行できます。1 つの命令で、4 の倍数のアドレスに 1 ワード
(32 ビット Nios CPU) を書き込むことが可能です。ハーフ・ワードの場
合は、1 つの命令 (16 ビット Nios CPU) または 2 つの命令 (32 ビット
Nios CPU) で 2 の倍数のアドレスに書き込まれます。バイトは 2 つの命
令で、アドレスに書き込むことができます。
32 ビット Nios CPU では、レジスタの最下位バイトは 4 の倍数のアドレ
スにのみ書き込むことができ、レジスタの上位のバイトは 4 の倍数 + 1
のアドレスにのみ書き込めることになります。上位に行くにつれて、こ
のように加算されていきます。同様に16 ビット Nios CPU では、レジ
スタの下位バイトは偶数アドレスに書き込まれ、レジスタの上位バイト
は奇数アドレスに書き込まれます。
また 32 ビット Nios CPU は、レジスタの下位ハーフ・ワードを 4 の倍数
のアドレスに書き込み、レジスタの上位ハーフ・ワードを 4 の倍数 + 2
のアドレスに書き込みます。
ST 命令は、ネイティブ・ワードにアラインされたメモリ・アドレスに
レジスタのネイティブ・ワードをフルに書き込みます。ST8d または
ST16d (32 ビット Nios CPU 専用 ) 命令は、上記のアライメントを行った
上で、レジスタ %r0 からバイト (ST8d の場合 ) またはハーフ・ワード
(ST16d の場合 ) の書き込みを実行します。
10
Altera Corporation
概要
Altera Corporation
11
1
概要
ソフトウェアでは多くの場合、特定のバイトやハーフ・ワードをメモリ
の任意の場所に書き込む必要があります。ソース・レジスタ内の場所と、
メモリの中で書き込む場所は対応していません。FILL8 と FILL16 (32
ビット Nios CPU のみ ) 命令は、レジスタの最下位バイト (FILL8 の場合 )
とハーフ・ワード (FILL16 の場合 ) を、レジスタ %r0 の各バイト(ハー
フ・ワード)に複製します。
概要
コード例 2 では、バイトのアドレスがネイティブ・ワードでアラインさ
れていない場合にメモリに 1 バイトを書き込む方法を示しています。
コード例 2: メモリへの 1 バイトの書き込み -- アドレスがネイティブ・ワードでアラインされて
いない場合
32 ビット Nios CPU で実行される命令
; %o4 にアドレス 0x00001203 が格納され、
; %g3 に値 0x00000054 が格納されていると仮定します。
FILL8 %r0,%g3 ; ( 最初のオペランドは必ず %r0 になります )
; %r0 で %g3 の下位バイトを複製します。
; したがって、
%r0 には 0x54545454 が格納され、
ST8d [%o4],%r0 ; (2 番目のオペランドは必ず %r0 になります )
; %r0 の 3 番目のバイトがアドレス 0x1203 に格納されます。
実行後のメモリの内容
0x00001200
アドレス処理
モード
0
0x46
1
0x49
2
0x53
3
0x54
このセクションのトピックでは、以下のアドレス処理モードを説明して
います。
■
■
■
■
■
5/16 ビットの即値
全幅のレジスタ -- 間接値
部分幅のレジスタ -- 間接値
全幅のレジスタ -- オフセットによる間接値
部分幅のレジスタ -- オフセットによる間接値
5/16 ビットの即値
多くの算術演算およびロジック処理は、オペランドとして 5 ビットの即
値を使用します。例えば、ADDI 命令では、レジスタと 5 ビットの即値の
2 つのオペランドを使用します。5 ビットの即値は、0 ∼ 31 の定数を表
します。6 ∼ 16 ビットを必要とする定数の値 (32 ∼ 65535 の数値 ) を指
定する場合、PFX 命令を使用して 11 ビット K レジスタを設定すること
ができます。この値は 5 ビットの即値と連結されます。PFX 命令は、変
更対象になる命令の直前で実行する必要があります。
16 ビットの即値の定数を PFX 値と 5 ビットの即値に分解できるように、
アセンブラは演算子の %hi() と %lo() を提供しています。%hi (x) は、定
数 x のビット 5 ∼ 15 から 11 ビットを抽出し、
%lo (x) は定数 x のビッ
ト 0 ∼ 4 から 5 ビットを抽出します。
12
Altera Corporation
概要
以下の例では、PFX を使用した場合、および使用しない場合の ADDI 命
令を示します。
;
;
;
PFX %hi(0x1234)
;
ADDI %g3,%lo(0x1234) ;
;
;
;
;
ADDI %g3,5
概要
コード例 3: PFX がある場合 / ない場合の ADDI 命令
%g3 に値 0x0041 が格納されていると仮定します。
%g3 に 5 を追加します。
これで %g3 には 0x0046 が格納されます。
0x1234 の上位 11 ビットで K を ロードします。
0x1234 の下位 5 ビットを %g3 に追加します。
したがって、
K レジスタには 0x0091 が入り、
ADDI 命令の即値のオペランドには 0x0011 が
入って、これらが連結されて 0x1234 という値
になります。
算術演算やロジック処理以外の命令でも、さまざまな幅で即値の定数を
使用しています。この定数は、K レジスタによって変更されません。命令
実行の詳細については、
「命令セット」の中にある各命令の説明を参照し
てください。表 10 に 5/16 ビットの即値を使用した命令を示します。
表 10. 5/16 ビットの即値を使用した命令
ADDI
AND*
ANDN*
ASRI
CMPI
LSLI
LSRI
MOVI
MOVHI
OR*
SUBI
XOR*
* AND、ANDN、OR、XOR では、PFX の 16 ビットの即値しか使用しま
せん。これらの命令は、PFX 命令が前にない場合は、2 つのレジスタ・オ
ペランドを使用します。
Altera Corporation
1
13
概要
全幅のレジスタ -- 間接値
LD 命令と ST 命令の場合、全幅のネイティブ・ワードのロードと格納を
レジスタ間で実行できますが、このときに別のレジスタを使用してアド
レスを指定します。「メモリ・アクセスの概要」で説明している通り、ま
ずアドレスは、ネイティブ・ワードでアラインされたアドレスに向けて
下方にアラインされます。K レジスタは、アドレス・レジスタのネイティ
ブ・ワード・アラインされた値からの符号付きオフセットとしてネイティ
ブ・ワードで処理されます。
表 11. 全幅レジスタを使用した命令 -- 間接的なアドレス処理
命令
アドレス・レジスタ
データ・レジスタ
LD
任意
任意
ST
任意
任意
部分幅レジスタ -- 間接値
部分幅のワードを読み込む命令はありません。部分的にワードを読み込
むには、全幅レジスタの間接的な読み込み命令と、EXT8d、EXT8s、
EXT16d (32 ビット Nios CPU 専用 ) または EXT16s (32 ビット Nios CPU
専用 ) といった抽出命令を組み合わせる必要があります。
いくつかの命令で、部分的なワードの書き込みを実行できます。これら
の各命令には、静的な命令と動的な 命令があります。ソース・レジスタ
内の位置とメモリのネイティブ・ワード内の位置は、いずれもアドレス
処理レジスタの下位ビットによって決定されます。静的な命令の場合、
ソース・レジスタとメモリのネイティブ・ワード内の位置は、命令に対
する 1 ビットまたは 2 ビットの即値オペランドによって決定されます。
全幅レジスタの間接的なアドレス処理と同様に、K レジスタはアドレス・
レジスタのネイティブ・ワード・アラインされた値からの符号付きのオ
フセットとしてネイティブ・ワードで処理されます。
部分幅レジスタのすべての間接的な命令は、%r0 をデータ・ソースにし
て書き込みを行ないます。これらの命令は、FILL8 または FILL16 (32 ビッ
ト Nios CPU のみ ) 命令と一緒に使うと便利です。
表 12. 部分幅レジスタを使用した命令 -- 間接的なアドレス処理
命令
アドレス・レジスタ
データ・レジスタ
バイト / ハーフ・ワードの選択
ST8s
任意
%r0
即値
ST16s*
任意
%r0
即値
ST8d
任意
%r0
アドレス・レジスタの下位ビット
ST16d*
任意
%r0
アドレス・レジスタの下位ビット
*32 ビット Nios CPU 専用
14
Altera Corporation
概要
全幅レジスタ -- オフセットによる間接値
1
任意のレジスタを使用してメモリ・アドレスを指定できる LD、ST 命令
とは異なり、これらの命令が使えるのは各アドレスの特定レジスタだけ
です。LDP と STP 命令は、アドレス・レジスタにレジスタ %L0、%L1、
%L2、または %L3 のいずれかを使用します。LDS と STS 命令の場合、
アドレス・レジスタとしてスタック・ポインタのレジスタ %sp (%o6 と
同等 ) だけが利用できます。これらの各命令は、アドレス・レジスタで示
されるアラインされたアドレスからのオフセットをネイティブ・ワード
で指定する、符号付きのインデックス値を使用します。
表 13. 全幅レジスタを使用した命令 -- オフセット・アドレス処理による間接値
命令
アドレス・レジスタ
データ・レジスタ
PFX のないオフセット範囲
LDP
LDS
%L0、%L1、%L2、%L3
任意
-16..15 ネイティブ・ワード
%sp
任意
0..255 ネイティブ・ワード
STP
%L0、%L1、%L2、%L3
任意
-16..15 ネイティブ・ワード
STS
%sp
任意
0..255 ネイティブ・ワード
部分幅レジスタ -- オフセットによる間接値
メモリから部分幅のワードを読み込む命令はありません。部分的にワー
ドを読み込むには、インデックスを付けた全幅レジスタの間接的な読み
込み命令と、EXT8d、EXT8s、EXT16d (32 ビット Nios CPU 専用 ) また
は EXT16s (32 ビット Nios CPU 専用 ) といった抽出命令を組み合わせる
必要があります。STS8s と STS16s (Nios 32 専用 ) は、間接的な定数を
使用して、スタック・ポインタからのバイト (STS8s の場合 ) またはハー
フ・ワードのオフセット (STS16s の場合 ) を指定し、ソース・レジスタ
%r0 にあるアラインされた部分幅を書き込みます。
Altera Corporation
15
概要
LDP、LDS、STP、STS 命令は、レジスタ間での全幅ネイティブ・ワー
ドのロードまたは格納を行いますが、この際に別のレジスタを使用して
アドレスを指定し、即値を使用してそのアドレスからのオフセットをネ
イティブ・ワードで指定します。
概要
これらの命令は、アドレス・レジスタとして、スタック・ポインタのレ
ジスタ %sp (%o6 と同等 ) のみを使用し、データ・レジスタとして、レ
ジスタ %r0 (%g0 と同等、ただし、アセンブラの命令では %r0 を使用す
る必要があります ) のみを使用します。これらの命令は、FILL8 または
FILL16 (32 ビット Nios CPU のみ ) 命令と一緒に使うと便利です。
表 14. 部分幅レジスタを使用した命令 -- オフセット・アドレス処理による間接値
命令
アドレス・
レジスタ
データ・
レジスタ
バイト / ハーフ・
ワードの選択
インデックス範囲
STS8s
%sp
%r0
即値
0..1023 バイト
STS16s*
%sp
%r0
即値
0..511 ハーフ・ワード
*32 ビット Nios CPU 専用
プログラムフ
ロー・コント
ロール
このセクションでは、以下の項目を説明しています。
■
■
■
■
2 つの相対分岐命令 (BR と BSR)
2 つの絶対ジャンプ命令 (JMP と CALL)
2 つのトラップ命令 (TRET と TRAP)
5 つの条件命令 (SKP、SKP0、SKP1、SKPRz、および SKPRnz)
相対分岐命令
相対分岐命令には、BR と BSR の 2 つがあります。この分岐ターゲッ
ト・アドレスは、現在のプログラム・カウンタ ( すなわち BR 命令自体
のアドレス ) と IMM11 命令フィールドから計算されます。分岐オフセッ
トの計算の詳細は、BR と BSR 命令のセクションで説明しています。44
ページの「BR」と 45 ページの「BSR」を参照してください。リターン・
アドレスが %o7 に保存される点を除けば、BSR は BR と同じです。リ
ターン・アドレスの計算については、BSR 命令のセクションで説明して
います。BR と BSR はいずれも無条件で使用されます。条件分岐は、
SKP
タイプの命令を、BR または BSR の前に設置することで実装します。
BR と BSR 命令には、分岐遅延スロット処理があります。つまり、BR ま
たは BSR 直後の命令は、BR または BSR の後、分岐ターゲットの命令
の前に実行されます。詳細については、26 ページの「分岐遅延スロット」
を参照してください。BR と BSR 命令の分岐範囲は、BR または BSR 命
令のアドレスから、前方に 2048 バイト、後方に 2046 バイトの範囲とな
ります。
16
Altera Corporation
概要
絶対ジャンプ命令
1
JMP と CALL 命令には、分岐遅延スロット処理があります。JMP または
CALL 直後の命令は、JMP または CALL の後、ジャンプ・ターゲットの
命令の前に実行されます。LRET は JMP %o7 に相当するアセンブラの擬
似命令ですが、通常これはサブルーチンからのリターンに使用されます。
トラップ命令
Nios プロセッサは、ソフトウェアの例外処理に TRAP と TRET の命令を
使用します。この 2 つの命令については、96 ページの「TRAP」と 97
ページの「TRET」を参照してください。JMP や CALL と異なり、TRAP
と TRET は分岐遅延スロットに対応していません。TRAP 直後の命令は、
例外ハンドラのリターンまで実行されません。TRET 直後の命令は、
TRET 処理の一部と見なされて全く実行されません。
条件命令
条件命令には、5 つの 種類 (SKPs、SKP0、SKP1、SKPRz、SKPRnz)
があります。これらの各命令には、相当するアセンブラの擬似命令 (IFs、
IF0、IF1、IFRz、および IFRnz) があります。これらの命令は CPU の内
部状況をテストし、その処理結果に応じて次の命令を実行するかどうか
判断します。それぞれ独自のテストを行いますが、SKP タイプの 5 つの
命令 ( および対応する擬似命令 ) は基本的に同じ処理を実行します。テス
トの結果に関係なく、どの場合でも、それ以降の ( 条件設定された ) 命令
はメモリからフェッチされます。ただし、テストの結果に応じて、以降
の命令の実行またはキャンセルが決定されます。
SKP と IF タイプの条件命令は、主にジャンプ (JMP、CALL) と分岐 (BR、
BSR) 命令の条件設定に使いますが、他の命令でも同じように利用できま
す。条件設定した PFX 命令 (PFX の直前に SKPx または IFx 命令を指定
) は、特別な実行例になります。以降の 2 つの命令は両方がキャンセルさ
れるか、両方が実行されます。つまり、一組の PFX 命令は、不可分の処
理単位として条件設定されます。
Altera Corporation
17
概要
絶対 ( 計算済み ) ジャンプ命令には、JMP と CALL の 2 種類があります。
ジャンプ・ターゲット・アドレスは、汎用レジスタの内容から指定され
ます。レジスタの内容は、左に 1 つだけシフトし、PC 内に転送されま
す。CALL は、リターン・アドレスが %o7 に保存される点を除き JMP と
同じです。リターン・アドレスの計算については、CALL 命令のセクショ
ンで説明しています。JMP と CALL はいずれも無条件で使用されます。
条件ジャンプは、SKP タイプの命令を、JMP または CALL の前に設置す
ることで実装します。
概要
例外
このセクションでは、以下の項目を説明します。
■
■
■
例外ベクタ・テーブル
外部ハードウェア・インタラプト、内部例外、レジスタ・ウィンド
ウ・アンダフロー、レジスタ・ウィンドウ・オーバフロー、および
TRAP 命令の使用方法
ソフトウェア例外 (TRAP) の要求と例外処理の手順
例外処理の概要
Nios プロセッサでは、最大 64 のベクタ付き例外を処理できます。例外は
STATUS レジスタの IE コントロール・ビットでグローバルに設定した
り、STATUS レジスタの IPRI フィールドでプライオリティごとにイネー
ブルにできます。例外は外部ハードウェア・インタラプト、内部例外、明
示的なソフトウェア TRAP 命令の 3 つのソースで生成されます。
Nios 例外処理モデルでは、内部で生成されたすべての例外を正確に処理
できます。すなわち、この例外転送メカニズムの場合、例外処理サブルー
チンに十分な情報を与えて、問題が何もなかったかのように、インタラ
プトが発生したプログラムのステータスを復旧します。SAVE または
RESTORE 命令によってレジスタ・ウィンドウのアンダフローまたは
オーバフローが発生すると、内部例外が生成されます。
例外処理サブルーチンは、常に新しく開かれたレジスタ・ウィンドウで
処理を実行することで、インタラプトのレイテンシーを非常に低くする
ことができます。例外ハンドラは、インタラプトが発生した側のレジス
タ内容を手動で保持する必要はありません。
例外ベクタ・テーブル
例外ベクタ・テーブルは、64 の例外ハンドラ・アドレスから構成されま
す。32 ビット Nios CPU の各エントリは 4 バイト、16 ビット Nios CPU
の各エントリは 2 バイトとなります。例外ベクタ・テーブルのベース・
アドレスは設定できます。Nios CPU が例外番号 n を処理すると、n 番目
のエントリを例外ベクタ・テーブルからフェッチし、フェッチした値を
2 倍してからその結果を PC にロードします。
例外ベクタ・テーブルは、ターゲット・システムのハードウェア・メモ
リ・マップによって、物理的に RAM または ROM に常駐します。ROM
の例外ベクタ・テーブルは、実行時の初期化を必要としません。
18
Altera Corporation
概要
外部ハードウェア・インタラプト・ソース
1
irq_number 入力を生成し、irq 入力ピンをドライブする外部ロジックは、
Nios SOPC ビルダ・ソフトウェアによって自動的に生成され、CPU 外
部のペリフェラル・バス・モジュール PBM に格納されます。インタラプ
ト機能を持つペリフェラルは、PBM 内で組み合わせた 1 つまたは複数の
インタラプト・リクエスト信号を生成するだけで、Nios の irq_number と
irq 入力を生成することができます。
Nios irq 入力はレベル・センスです。irq と irq_number 入力は、各クロッ
クの立ち上がりでサンプリングされます。インタラプトを生成する外部
ソースは、インタラプトがソフトウェアによって認識 ( 例えばインタラ
プトしたペリフェラルのレジスタへの書き込み ) されるまで、irq 出力信
号をアサートしておく必要があります。アサートされたインタラプトが、
Nios CPU コアが例外の処理を開始する前にデアサートされると、このイ
ンタラプトは無視されます。
内部例外ソース
内部例外には、レジスタ・ウィンドウ・オーバフローとレジスタ・ウィ
ンドウ・アンダフローの 2 つのソースがあります。Nios プロセッサの
アーキテクチャでは、内的に生成されたすべての例外を正確に処理でき
ます。どのような状況でも、例外ハンドラで例外条件を修正できるので、
例外の原因となった命令が正常に終了したかのように見えます。
レジスタ・ウィンドウのアンダフロー
有 効な 最下 位の レジ スタ・ウ ィン ドウ を使 用し てい ると き (CWP =
LO_LIMIT) に SAVE 命令を発行すると、必ずレジスタ・ウィンドウ・ア
ンダフローの例外が発生します。SAVE 命令は CWP を LO_LIMIT の下に
移動し、SAVE 実行のたびに %sp が設定されます。レジスタ・ウィンド
ウのアンダフロー例外が発生すると、SAVE の次の命令を実行する前に、
例外処理サブルーチンに制御が移されます。
Altera Corporation
19
概要
外部ソースは、Nios CPU irq_number 入力に 6 ビット・インタラプト番
号をドライブし、同時に Nios CPU irq 入力ピンを真 (1) にアサートする
ことによって、ハードウェア・インタラプトを要求することができます。
Nios CPU は、IE ビットが真 (1) であり、要求されたインタラプト番号が
STATUS レジスタの IPRI フィールド値よりも小さい ( プライオリティが
高い ) 場合、表示された例外を処理します。制御は irq_number 入力で番
号を指定した例外ハンドラに移されます。
概要
SAVE 命令がレジスタ・ウィンドウのアンダフロー例外を発生すると、例
外処理サブルーチンに制御を渡す前に CWP が 1 回だけ減算されます。
アンダフロー例外ハンドラからは、CWP = LO_LIMIT - 1 が見えます。レ
ジスタ・ウィンドウのアンダフロー例外の、例外番号は 1 です。したがっ
て、インタラプトがディセーブル (IE=0) になっている場合、あるいは
IPRI 値が 1 以下になっている場合、CPU はレジスタ・ウィンドウのアン
ダフロー例外を処理しないことになります。
アンダフロー例外ハンドラのサブルーチンが実行する処理は、システム
の要求によって変わります。大量のコードまたは複雑なコードを実行す
るシステムの場合、アンダフロー ( およびオーバフロー ) ハンドラは、仮
想レジスタ・ファイルを生成してレジスタ・ファイルの物理的な限界を
超えることができます。アンダフローが発生すると、アンダフロー・ハ
ンドラはレジスタ・ファイル全体の内容をメモリに保存して、HI_LIMIT
で CWP を再開することができます。こうして、空き容量を作り、コー
ドはレジスタ・ウィンドウを継続的に開くことができます。一方、多く
のエンベデッド・システムでは、スタックの利用やサブルーチン・コー
ルの深さを厳密に制御したいと考えることでしょう。このようなシステ
ムでは、エラー・メッセージを表示し、プログラムを終了するように、
アンダフロー・ハンドラを設定することができます。
レジスタ・ウィンドウ・アンダフロー例外ハンドラの特性と処理は、プ
ログラマが決定します。Nios ソフトウェア開発キット (SDK) には、レジ
スタ・ウィンドウのアンダフロー・ハンドラが含まれており、これはデ
フォルトで自動的にインストールされます。このハンドラは、スタック
を一時的な記憶域にして、レジスタ・ファイルを仮想化することができ
ます。
レジスタ・ウィンドウのアンダフロー例外が発生するのは、SAVE 命令
のときだけです。直接的な書き込み (WRCTL 命令 ) で CWP を LO_LIMIT
未満の値に設定した場合、レジスタ・ウィンドウのアンダフロー例外が
発生しません。既に CWP が LO_LIMIT よりも小さい値になっている場
合、SAVE 命令を実行しても、レジスタ・ウィンドウのアンダフロー例
外は発生しません。
レジスタ・ウィンドウのオーバフロー
有 効な 最上 位の レジ スタ・ウ ィン ドウ を使 用し てい ると き (CWP =
HI_LIMIT) に RESTORE 命令を実行すると、必ずレジスタ・ウィンドウ
のオーバフロー例外が発生します。RESTORE の次の命令を実行する前
に、例外処理サブルーチンに制御が移されます。
レジスタ・ウィンドウのオーバフロー例外が起きると、例外ハンドラは
CWP が HI_LIMIT になったと認識できます。RESTORE 命令で CWP が
大きな値になり、通常の例外処理で値がすぐに小さくなったと理解すれ
ば良いでしょう。レジスタ・ウィンドウのオーバフロー例外の、例外番
号は 2 となっています。
20
Altera Corporation
概要
レジスタ・ウィンドウ・オーバフロー例外ハンドラの特性と処理は、プ
ログラマが決定します。Nios SDK は、レジスタ・ウィンドウのオーバフ
ロー・ハンドラをデフォルトで自動的にインストールします。このハン
ドラは、スタックを使用して、レジスタ・ファイルを仮想化します。
レジスタ・ウィンドウのオーバフロー例外が発生するのは、RESTORE
命令のときだけです。直接的な書き込み (WRCTL 命令 ) で CWP を
HI_LIMIT よりも大きな値にした場合、レジスタ・ウィンドウのオーバフ
ロー例外が発生しません。既に CWP が HI_LIMIT よりも大きい値になっ
ている場合、RESTORE 命令を実行しても、レジスタ・ウィンドウのオー
バフロー例外は発生しません。
ソフトウェア例外 (TRAP 命令 )
ソフトウェアは、TRAP 命令を発行して、例外ハンドラに制御を渡すよ
う直接要求できます。命令の IMM6 フィールドは、例外番号を示します。
IE ビットまたは、IPRI ビットの設定にかかわらず、TRAP 命令は常に処
理されます。TRAP 命令には、遅延スロット処理がありません。指定の例
外ハンドラに制御が移るまで、TRAP 直後の命令は実行されません。
TRAP 後の命令のアドレスが %o7 に保存されるため、例外処理が終了す
ると、TRET 命令は TRAP 後の命令に制御を返します。
例外処理の手順
上記のようなソースで例外が発生すると、以下の手順で処理が開始され
ます。
Altera Corporation
1.
STATUS レジスタの内容が ISTATUS レジスタにコピーされます。
2.
CWP の値が減らされ、例外ハンドラ・ルーチンで使用するために、
新しいウィンドウが開かれます ( レジスタ・ウィンドウのアンダフ
ロー例外の場合は、状況が異なります。この例外では、SAVE 命令
によって既に CWP が減らされています )。
21
1
概要
オーバフロー例外ハンドラのサブルーチンが実行する処理は、システム
の要求によって変わります。 大量のコードまたは複雑なコードを実行す
るシステムの場合、オーバフロー・ハンドラおよびアンダフロー・ハン
ドラは、仮想レジスタ・ファイルを生成してレジスタ・ファイルの物理
的な限界を超えることができます。オーバフローが発生すると、オーバ
フロー・ハンドラは、スタックから物理レジスタ・ファイルの全内容を
再ロードし、LO_LIMIT で CWP を再開することができます。一方、多く
のエンベデッド・システムでは、スタックの利用やサブルーチン・コー
ルの深さを厳密に制御したいと考えることでしょう。このようなシステ
ムでは、エラー・メッセージを表示し、プログラムを終了するように、
オーバフロー・ハンドラを設定することができます。
概要
3.
IE が 0 に設定され、インタラプトがディセーブルになります。
4.
IPRI に 6 ビットの例外番号が設定されます。
5.
プログラムでインタラプトが発生し、未処理になっている次の命令
のアドレスが %o7 に転送されます。
6.
例外ハンドラの開始アドレスが例外ベクタ・テーブルからフェッチ
され、PC に書き込まれます。
7.
例外ハンドラが終了すると、TRET 命令が発行され、制御が元のプ
ログラムに戻されます。
レジスタ・ウィンドウの使用方法
すべての例外は、新しく開いたレジスタ・ウィンドウで処理が開始され
ます。この処理によって、インタラプトが発生したプログラムのレジス
タ内容を維持する必要がなくなるため、例外ハンドラの複雑さや待ち時
間が軽減されます。例外ハンドラは、新しく開かれたウィンドウでレジ
スタ %o0..%L7 を自由に利用できます。エントリによっては、例外ハン
ドラで SAVE 命令を実行しない方がいい場合があります。例外ハンドラ
で SAVE および RESTORE を実行する方法については、これ以降で説明
します。
例外処理に移ると必ず新しいレジスタ・ウィンドウが開かれるため、例
外で使えるレジスタ・ウィンドウが常になければなりません。LO_LIMIT
を 1 に設定すると、例外のために 1 つのウィンドウを常に利用できるよ
うになります (LO_LIMIT のリセット値は 1 です )。プログラムで SAVE
命令を実行し、最後のレジスタ・ウィンドウまで使おうとすると (CWP
= 0)、レジスタ・アンダフローのトラップが発生します。レジスタ・アン
ダフロー・ハンドラ自体は、最後のウィンドウで実行されます (CWP = 0
の状態で )。
ソフトウェアを適切に設計すれば、CWP が 0 の時に例外が発生するよ
うなことはありません。CWP が 0 になるのは、例外が処理されていると
きだけです。インタラプトを再びイネーブルにする前に例外ハンドラ
の処理をきちんと検討しなければなりません。詳細については、23 ペー
ジの「簡単な例外ハンドラと複雑な例外ハンドラ」を参照してください。
22
Altera Corporation
概要
ステータスの維持 : ISTATUS レジスタ
1
例外ハンドラに入ると、インタラプトが自動的にディセーブルになるた
め、その後のインタラプトまたは例外によって ISTATUS が上書きされ
る危険はありません。ネスト化した例外ハンドラ ( 例外を使用する例外
ハンドラ、または再びイネーブルにする例外ハンドラ ) については、こ
れ以降で詳細を説明します。ネスト化した例外ハンドラの場合、以降の
インタラプトをイネーブルにする前後に、ISTATUS レジスタの内容を明
示的に取得、維持、復旧する必要があります。
リターン・アドレス
例外が発生すると、割り込まれたプログラムの実行は一時的に中断され
ます。割り込まれたプログラムにある未処理の命令 ( つまり、予期せず実
行が停止している命令 ) は、例外処理から制御を戻す場所として記録さ
れます。
制御を戻すアドレスは、例外ハンドラに制御を渡す前に %o7 ( 例外ハン
ドラの新しく開いたレジスタ・ウィンドウ ) に保存されます。%o7 に保
存する値は、1 つ右へシフトした次の命令のバイト・アドレスです。この
値は変更なしで直接的に TRET 命令のターゲットとして使用するのに適
しています。例外ハンドラは通常、TRET %o7 命令を実行して、割り込
まれたプログラムに制御を戻します。
簡単な例外ハンドラと複雑な例外ハンドラ
Nios プロセッサ・アーキテクチャでは、効率的で簡単な例外ハンドラを
使用できます。ステータスやレジスタを維持すると言った例外ハンドラ
の負荷は、ほとんどハードウェア自体で処理します。簡単な例外ハンド
ラの場合、実行される自動的な処理を特に意識する必要がありません。複
雑な例外ハンドラ ( 例えば、ネスト化した例外ハンドラ ) の場合は、以下
の点に注意する必要があります。
簡単な例外ハンドラ
以下の基準に合うと、簡単な例外ハンドラと見なされます。
■
Altera Corporation
インタラプトを再びイネーブルにしない。
23
概要
例外が発生すると、インタラプトされたプログラムの STATUS レジスタ
が ISTATUS レジスタにコピーされます。次に STATUS レジスタが変更
されます (IE が 0 に設定され、IPRI が設定されて CWP の値が減ります
)。STATUS レジスタの元の内容が、ISTATUS レジスタで維持されます。
例外処理が元のプログラムに制御を戻すと、TRET 命令が発行され、元
のプログラムの STATUS レジスタの内容が ISTATUS から復旧されま
す。
概要
■
■
■
SAVE または RESTORE を使用しない (SAVE または RESTORE を
直接実行しない。あるいはこれらの命令を使用するサブルーチンを
呼び出さない )。
TRAP 命令を使用しない ( または TRAP 命令を使用するサブルーチ
ンを呼び出さない )。
レジスタ %g0..%g7 または %i0..%i7 の内容を変更しない。
例外ハンドラがこれらの基準に合っている場合、ISTATUS で特に注意す
ることはありません。あるいは %o7 にリターン・アドレスを保存する必
要もありません。簡単な例外ハンドラでは、CWP やレジスタ・ウィンド
ウの管理をする必要はありません。
複雑な例外ハンドラ
上記で説明した簡単な例外ハンドラの基準に合わないと、複雑な例外ハ
ンドラと考えられます。複雑な例外ハンドラでは、ネスト化した例外処
理や複雑なコードの実行が可能です ( 例えば SAVE や RESTORE を実行
するサブルーチン )。複雑な例外ハンドラには、次のような条件が要求さ
れます。
■
■
■
■
■
24
インタラプトを再びイネーブルにする前にISTATUS の内容を保持
する必要があります。例えば、
ISTATUS はスタックに保存されます。
インタラプトを再びイネーブルにする前に CWP をチェックして、
CWP が LO_LIMIT 以上であ ることを 確認す る必要が あります。
CWP が LO_LIMIT を下回る場合、使用可能なレジスタ・ウィンドウ
をさらに開く ( つまり、レジスタ・ファイルの内容を RAM に保存す
る ) か、エラーを送信する必要があります。
SAVE または RESTORE 命令を実行する前、あるいはこれらの命令
を実行するサブルーチンを呼び出す前に上記の 2 つの条件に従っ
てインタラプトを再びイネーブルにする必要があります。
イ ン タ ラ プ ト が 発 生 し た 元 の プ ロ グ ラ ム に 制 御 を 戻 す 前 に、
ISTATUS レジスタの内容を復旧する必要があります。レジスタ・
ウィンドウを故意にシフトした場合は、CWP の調整も行います。
インタラプトが発生した元のプログラムに制御を戻す前にこのプ
ログラムのレジスタ・ウィンドウの内容を復旧する必要があります。
Altera Corporation
概要
パイプライン
の実装
このセクションでは、以下の項目を説明します。
■
■
1
Nios CPU パイプライン
露出したパイプラインの分岐遅延と CWP の直接操作
概要
図 4 Nios CPU ブロック図
パイプラインの処理
Nios CPU は、パイプライン化した RISC アーキテクチャです。分岐遅延
スロットと WRCTL で直接 CWP を変更した場合を除き、パイプライン
の実装はソフトウェアには隠されています。パイプラインには、下記の
ようなステージがあります。
■
■
■
■
Altera Corporation
フェッチ命令 -- Nios CPU がアドレスを送信し、メモリ・サブシス
テムがこのアドレスに保存されていた命令を返してきます。
デコード / オペランド・フェッチ命令 -- フェッチした命令をデコー
ドします。レジスタ・オペランドがあれば、これらがレジスタ・ファ
イルから読み込まれます。専用の分岐ターゲット加算器が、BR およ
び BSR 命令のアドレスを計算します。
実行 -- ALU にオペランドと制御ビットを渡します。次に ALU が計
算して処理結果を出します。
書き戻し -- 転送先レジスタが有効な場合、ALU の処理結果を書き込
みます。
25
概要
分岐遅延スロット
分岐遅延スロットは、BR、BSR、CALL、JMP などの直後の命令として
定義します。分岐遅延スロットは、分岐命令の後、または分岐先の命令
の前に実行されます。表 15 に BR 命令の分岐遅延スロットを示します。
表 15. BR 分岐遅延スロットの例
…
(a)
ADD %g2, %g3
(b)
BR ターゲット
(c)
ADD %g4, %g5
(d)
ADD %g6, %g7
分岐遅延スロット
…
ターゲット :
(e)
ADD %g8, %g9
分岐命令 (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 命令を指定しなければなりません。
26
Altera Corporation
概要
1
表 16. 表記の詳細
表記
意味
∅← e
表記
意味
Y で X を上書き
X >> n
n ビット右へシフトした後の X 値
式 e を評価した後、処理結果を破棄
X << n
n ビット左へシフトした後の X 値
概要
X← Y
RA
32 のレジスタのいずれか。命令ワード
の 5 ビット a フィールドで選択
bn
X
全幅値 X 内の n 番目のバイト (8 ビット・
フィールド )。b0X = X[7..0]、
b1X = X[15..8]、b2X = X[23..16]、
および b3X = X[31..24]
RB
32 のレジスタのいずれか。命令ワード
の 5 ビット b フィールドで選択
hn
X
全幅値 X 内の n 番目のハーフ・ワード
(16 ビット・フィールド )。
h0X = X[15..0]、h1X = X[31..16]
RP
ポインタ・イネーブル (P タイプ ) の
4 レジスタのいずれか。命令ワードの 2
ビット p フィールドで選択
X&Y
IMMn
n ビットの即値。命令ワードに埋め込み
K
0xnn.mm
X:Y
{e1, e2}
K レジスタに保持される 11 ビット値
(K を設定できるのは PFX 命令だけ )
X|Y
X⊕Y
16 進数表記 ( 小数点は不使用。見やすく
するために便宜的に追加 )
~X
ビッドワイズの連結演算子
例 : (0x12 : 0x34) = 0x1234
|X|
条件式。前の命令が PFX の場合、e2。
それ以外の場合は e1。
Mem32[X]
ビットごとの論理演算子 AND
ビットごとの論理演算子 OR
ビットごとの論理演算子の排他的な OR
ビッドごとの論理演算子 NOT
(1 の補数)
X の絶対値
( つまり、-X は 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 までの連続ビット
align32(X)
X & 0xFF.FE.FF.FC、切り捨てで強制的
にフル・ワードにアラインされた整数値
X
X[n..m]
C
CTLk
STATUS レジスタの C (carry) フラグ
K で選択した 2047 の制御レジスタのい
ずれか
Altera Corporation
27
概要
命令のフォーマット (1 / 2)
RR
15
14
13
12
11
10
9
8
op6
Ri5
15
14
13
12
11
10
9
8
op6
Ri4
15
14
13
15
14
12
13
11
15
14
12
10
9
8
11
10
9
8
15
14
12
13
11
10
15
14
7
7
9
8
7
12
11
10
9
8
7
6
15
14
12
11
10
9
8
13
15
14
6
15
14
11
10
9
15
14
12
13
13
2
1
0
5
4
3
2
1
0
6
5
4
3
2
1
0
1
0
1
0
A
6
5
4
3
2
A
6
5
4
3
2
A
7
6
5
4
3
2
1
8
7
6
5
0
0
4
3
2
1
0
11
10
9
8
7
6
5
4
3
2
1
0
4
3
2
1
0
1
0
IMM11
12
11
10
9
8
7
op3u
12
op6
28
3
IMM10
op6
Ri2u
4
A
op5
Ri1u
0
IMM9
12
13
1
A
op6
i11
5
IMM8
13
2
A
op6
i10
3
IMM6
op3
i9
4
B
op5
Ri8
5
IMM4
P
13
7
0
op4
Ri6
6
IMM5
op6
RPi5
7
B
11
10
9
8
op3u
7
6
5
IMM1u
0
6
5
IMM2u
A
4
3
2
A
Altera Corporation
概要
1
命令のフォーマット (2 / 2)
i8v
15
14
13
12
11
10
9
op6
15
14
13
15
14
12
13
15
14
11
10
9
8
op2v
12
13
11
10
9
8
15
14
12
13
Altera Corporation
7
6
0
0
7
6
5
3
11
10
9
11
10
9
2
1
0
4
3
2
1
0
1
0
1
0
IMM8v
5
4
3
8
7
8
7
op5w
2
A
6
5
op5w
12
op6
4
op5w
op6
w
5
IMM8v
op6
i4w
6
op2v
op6
Rw
7
概要
i6v
8
4
3
0
6
5
2
IMM4w
4
3
2
1
0
0
0
0
0
0
29
概要
表 17. 32 ビットの主要な命令コードの一覧表 (1 / 3)
命令コード
30
ニーモニッ フォー
ク
マット
概要
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) の場合、次の命令をスキップ
Altera Corporation
概要
1
表 17. 32 ビットの主要な命令コードの一覧表 (2 / 3)
命令コード
ニーモニッ フォー
ク
マット
LD
RR
概要
010110
概要
RA ← Mem32 [align32( RB + (σ(K) x 4))]
010111
ST
RR
Mem32 [align32( RB + (σ(K) x 4))] ← RA
011000
STS8s
i10
bn
011001
STS16s
i9
011010
EXT16d
RR
RA ← (0x00.00 : hnRA) ここで n = RB[1]
011011
MOVHI
Ri5
h1
011101000
EXT8s
Ri2u
RA ← (0x00.00.00 : bnRA) ここで n = IMM2u
011101001
EXT16s
Rilu
RA ← (0x00.00 : hnRA) ここで n = IMM1u
011101100
ST8s
Ri2u
bn
011101101
ST16s
Rilu
hn
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
Mem32 [align32(%sp + IMM10)] ← bn%r0
ここで n = IMM10[1..0]
hnMem32
[align32( %sp + IMM9 x 2)] ← hn%r0
ここで n = IMM9[0]
RA ← (K : IMM5)、h0RA には影響なし
011100
011101010
011101011
Mem32 [align32(RA + (σ(K) x 4))] ← bn%r0
ここで n = IMM2u
Mem32 [align32(RA + (σ(K) x 4))] ← hn%r0
ここで n = IMM1u
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
SWAP
Rw
RA ← h0RA : h1RA
01111100111
01111101000
01111101001
01111101010
01111101011
01111101100
Altera Corporation
31
概要
表 17. 32 ビットの主要な命令コードの一覧表 (3 / 3)
命令コード
ニーモニッ フォー
ク
マット
概要
CWP ← CWP + 1、(old-CWP == HI_LIMIT) の場合 {TRAP #2}
01111101101
RESTORE
w
01111101110
TRET
Rw
PC ← (RA x 2); STATUS ← ISTATUS
01111110000
ST8d
Rw
bn
01111110001
ST16d
Rw
hn
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)
SKPRz
Rw
(RA ==0) の場合、次の命令をスキップ
01111110111
SKPS
i4w
IMM4w でエンコードした条件が真の場合、次の命令をスキップ
01111111000
WRCTL
Rw
CTLk ← RA
01111111001
RDCTL
Rw
RA ← CTLk
01111111010
SKPRnz
Rw
(RA ! = 0) の場合、次の命令をスキップ
PC ← (RA x 2)
01111101111
Mem32 [align32(RA + (σ(K) x 4))] ← bn%r0
ここで n = RA[1..0]
Mem32 [align32(RA + (σ(K) x 4))] ← hn%r0
ここで n = RA[1]
01111110101
01111110110
01111111011
01111111100
01111111101
01111111110
JMP
Rw
01111111111
CALL
Rw
R15 ← ((PC + 4) >> 1); PC ← (RA x 2)
100000
BR
i11
PC ← PC + ((s(IMM11) + 1) x 2)
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 をゼロに設定 )
Mem32[align32(RP + (σ(K : IMM5) x 4))] ← RA
100001
32
1010
STP
RPi5
1011
LDP
RPi5
110
STS
Ri8
Mem32[align32(%sp + (IMM8 x 4) )] ← RA
111
LDS
Ri8
RA ← Mem32 [align32(%sp + (IMM8 x 4))]
RA ← Mem32 [align32(RP + (σ(K : IMM5) x 4))]
Altera Corporation
概要
以下の擬似命令は、nios-elf-gcc (GNU コンパイラ ) によって生成され、
nios-elf-as (GNU アセンブラ ) によって認識されます。
概要
表 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
以下の演算子は nios-elf-as によって認識されます。これらの演算子は定
数および記号アドレスで利用可能であり、アセンブラまたはリンカーに
よって正しく処理されます。
演算子
処理
%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 のハーフ・ワード・アドレス
x >> 1
x@h
Altera Corporation
内容
1
33
Notes:
34
Altera Corporation
命令セット
このセクションでは、32 ビット Nios CPU 命令の詳細を説明します。説
明は命令のニーモニックで、アルファベット順に記載しています。各命
令のページには、以下の情報があります。
1
Altera Corporation
命令のニーモニックと説明
処理の説明
アセンブラの構文
構文例
処理の説明
プリフィックスの処理
条件コード
命令のフォーマット
命令のフィールド
命令
セット
■
■
■
■
■
■
■
■
■
2
条件コードのフラグ・テーブル内の記号 ∆ は、フラグが命令に
よって変更されていることを示します。
35
命令セット
ABS
絶対値
処理 :
RA ← |RA|
アセンブラの構文 :
ABS %rA
例:
ABS %r6
説明 :
RA の絶対値を計算し、その結果を RA に格納します。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
Rw
命令フィールド :
A = オペランド RA のレジスタ・インデックス
15
14
13
12
11
10
9
8
7
6
5
0
1
1
1
1
1
0
0
0
1
0
36
4
3
2
1
0
A
Altera Corporation
命令セット
ADD
繰り上げなしの加算
処理 :
RA ← RA + RB
アセンブラの構文 :
ADD %rA,%rB
例:
ADD %L3,%g0 ; ADD %g0 to %L3
説明 :
レジスタ A の内容をレジスタ B に加算し、その結果をレジスタ A に格納します。
条件コード :
フラグ :
N
V
Z
C
∆
∆
∆
∆
2
命令
セ ット
N: 結果ビット 31
V: 符号付算術オーバーフロー
Z: 結果がゼロの場合に設定、それ以外の場合はクリア
C: 加算の繰り上げ
命令のフォーマット :
RR
命令フィールド :
A = RA オペランドのレジスタ・インデックス
B = RB オペランドのレジスタ・インデックス
15
14
13
12
11
10
0
0
0
0
0
0
Altera Corporation
9
8
7
B
6
5
4
3
2
1
0
A
37
命令セット
ADDI
即値の加算
処理 :
RA ← RA + (0x00.00 : K : IMM5)
アセンブラの構文 :
ADDI %rA,IMM5
例:
前に PFX がない :
ADDI %L5,6 ; add 6 to %L5
前に PFX がある :
PFX %hi(1000)
ADDI %g3,%lo(1000) ; ADD 1000 to %g3
説明 :
前に PFX がない :
レジスタ A に 5 ビットの即値を加算し、結果をレジスタ A に格納します。IMM5
の範囲は [0..31] です。
前に PFX がある :
K レジスタ (11 ビット ) の内容と IMM5 (5 ビット ) が連結することで、即値の
オ ペ ラ ン ド は 5 ビ ッ ト か ら 16 ビ ッ ト に 拡 張 さ れ ま す。16 ビ ッ ト の 即 値
(K : IMM5) は、32 ビットにゼロ拡張され、レジスタ A に加算されます。
条件コード :
フラグ :
N
V
Z
C
∆
∆
∆
∆
N: 結果ビット 31
V: 符号付算術オーバフロー
Z: 結果がゼロの場合に設定、それ以外の場合はクリア
C: 加算の繰り上げ
命令のフォーマット :
Ri5
命令フィールド :
A = RA オペランドのレジスタ・インデックス
IMM5 = 5 ビットの即値
15
14
13
12
11
10
0
0
0
0
0
1
38
9
8
7
IMM5
6
5
4
3
2
1
0
A
Altera Corporation
命令セット
AND
ビットごとの論理演算子 AND
処理 :
前に PFX がない :
RA ← RA & RB
前に PFX がある :
RA ← RA & (0x00.00 : K : IMM5)
アセンブラの構文 :
前に PFX がない :
AND %rA,%rB
前に PFX がある :
PFX %hi(const)
AND %rA,%lo(const)
例:
前に PFX がない :
AND %g0,%g1 ; %g0 gets %g1 & %g0
前に PFX がある :
PFX %hi(16383)
AND %g0,%lo(16383) ; AND %g0 with 16383
説明 :
前に PFX がない :
RA の個々のビットと RB の対応するビットで論理積を行ない、結果を RA に格
納します。
前に PFX がある :
プリフィックスがあった場合、K レジスタ (11 ビット ) の内容と IMM5 (5 ビッ
ト ) を連結した即値の定数で、RB オペランドが置換されます。この 16 ビット
の値 (32 ビットにゼロ拡張 ) は RA でビットごとに論理積が行なわれ、結果が元
の RA に書き込まれます。
条件コード :
フラグ :
V
Z
C
∆
-
∆
-
命令
セ ット
N
2
N: 結果ビット 31
Z: 結果がゼロの場合に設定、それ以外の場合はクリア
命令のフォーマット :
RR、Ri5
命令フィールド :
A = RA オペランドのレジスタ・インデックス
B = RB オペランドのレジスタ・インデックス
IMM5 = 5 ビットの即値
前に PFX (RR) がない :
15
14
13
12
11
10
0
0
1
1
1
0
9
8
7
6
5
4
3
B
2
1
0
1
0
A
前に PFX (Ri5) がある :
15
14
13
12
11
10
0
0
1
1
1
0
Altera Corporation
9
8
7
IMM5
6
5
4
3
2
A
39
命令セット
ANDN
ビットごとの論理演算子 AND NOT
処理 :
前に PFX がない :
RA ← RA & ~RB
PFX が先行 :
RA ← RA & ~(0x00.00 : K : IMM5)
アセンブラの構文 :
前に PFX がない :
ANDN %rA,%rB
前に PFX がある :
PFX %hi(const)
ANDN %rA,%lo(const)
例:
前に PFX がない :
ANDN %g0,%g1 ; %g0 gets %g0 & ~%g1
前に PFX がある :
PFX %hi(16384)
ANDN %g0,%lo(16384) ; clear bit 14 of %g0
説明 :
前に PFX がない :
RA の個々のビットと RB の補集合にある対応ビットで論理積を行ない、その結
果を RA に格納します。
前に PFX がある :
プリフィックスがあった場合、K レジスタ (11 ビット ) の内容と IMM5 (5 ビッ
ト ) を連結した即値の定数で、RB オペランドが置換されます。この 16 ビット
値は 32 ビットにゼロ拡張されます。そしてビットごとに反転されて、RA でビッ
トごとに論理積が行なわれます。この結果は RA に書き込まれます。
条件コード :
フラグ :
N
V
Z
C
∆
-
∆
-
N: 結果ビット 31
Z: 結果がゼロの場合に設定、それ以外の場合はクリア
命令のフォーマット :
RR、Ri5
命令フィールド :
A = オペランド RA のレジスタ・インデックス
B = オペランド RB のレジスタ・インデックス
IMM5 = 5 ビットの即値
前に PFX (RR) がない :
15
14
13
12
11
10
0
0
1
1
1
1
9
8
7
6
5
4
3
B
2
1
0
1
0
A
前に PFX (Ri5) がある :
15
14
13
12
11
10
0
0
1
1
1
1
40
9
8
7
IMM5
6
5
4
3
2
A
Altera Corporation
命令セット
ASR
右算術シフト
処理 :
RA ← (RA >> RB[4..0]), RA[31] で左から埋め込み
アセンブラの構文 :
ASR %rA,%rB
例:
ASR %L3,%g0 ; %L3 を %g0 ビット右にシフト
説明 :
RA の値を RB の値だけ算術的に右にシフトし、結果を RA に格納します。RB の
ビット 31..5 は無視されます。RB[4..0] の値が 31 の場合、RA は RA の元の符号
に応じてゼロまたは負の数になります。
2
命令
セ ット
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
RR
命令フィールド :
A = RA オペランドのレジスタ・インデックス
B = RB オペランドのレジスタ・インデックス
15
14
13
12
11
10
0
0
1
0
1
0
Altera Corporation
9
8
7
B
6
5
4
3
2
1
0
A
41
命令セット
ASRI
即値を使用した右算術シフト
処理 :
RA ← (RA >> IMM5), RA[31] で左から埋め込み
アセンブラの構文 :
ASRI %rA,IMM5
例:
ASRI %i5,6 ; %i5 を 6 ビット右へシフト
説明 :
RA の内容は IMM5 のビット数だけ算術的に右にシフトされます。IMM5 が 31
の場合、RA は RA の元の符号に応じてゼロまたは負の数になります。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
Ri5
命令フィールド :
A = RA オペランドのレジスタ・インデックス
IMM5 = 5 ビットの即値
15
14
13
12
11
10
0
0
1
0
1
1
42
9
8
7
IMM5
6
5
4
3
2
1
0
A
Altera Corporation
命令セット
BGEN
ビットの生成
処理 :
RA ← 2IMM5
アセンブラの構文 :
BGEN %rA,IMM5
例:
BGEN %g7,6 ; %g7 を 64 に設定
説明 :
IMM5 の指数で RA を 2 の累乗に設定します。これは RA でシングル・ビットを
設定し、残りをクリアするのと同じです。
条件コード :
フラグ : 影響なし
V
Z
C
-
-
-
-
命令のフォーマット :
Ri5
命令フィールド :
A = RA オペランドのレジスタ・インデックス
IMM5 = 5 ビットの即値
15
14
13
12
11
10
0
1
0
0
1
0
Altera Corporation
9
8
7
IMM5
6
5
命令
セ ット
N
2
4
3
2
1
0
A
43
命令セット
BR
分岐
処理 :
PC ← PC + ((σ(IMM11) + 1) << 1)
アセンブラの構文 :
BR addr
例:
BR MainLoop
NOP ; ( 遅延スロット )
説明 :
IMM11 で指定するオフセットは、BR 直後の命令からの相対のハーフ・ワード
( 命令数 ) として解釈されます。プログラムの制御は、このオフセットの命令に
渡されます。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
遅延スロットの処理 :
BR 直後の命令 (BR の遅延 スロット ) は、BR の後、そして目的の命令の前に実
行されます。遅延スロットとして命令を使用する場合、いくつかの制限がありま
す (26 ページの「分岐遅延スロット」を参照 )。
命令のフォーマット :
i11
命令フィールド :
IMM11 = 11 ビットの即値
15
14
13
12
11
1
0
0
0
0
44
10
9
8
7
6
5
4
3
2
1
0
IMM11
Altera Corporation
命令セット
BSR
サブルーチンへの分岐
処理 :
%o7 ← ((PC + 4) >> 1)
PC ← PC + ((σ(IMM11) + 1) << 1)
BSR addr
BSR SendCharacter
NOP ; ( 遅延スロット )
説明 :
IMM11 で指定するオフセットは、BR 直後の命令からの相対のハーフ・ワード
( 命令数 ) として解釈されます。プログラムの制御は、このオフセットの命令に
渡されます。リターン・アドレスは、BSR 命令のアドレス + 4 になり、これは
BSR の 2 番目の命令のアドレスになります。リターン・アドレスは、
右に 1 ビッ
トだけシフトされ、%o7 に格納されます。右にシフトされた %o7 の値は、変更
することなく JMP の転送先として使用できます。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
遅延スロットの処理 :
BSR 直後の命令 (BSR の遅延 スロット ) は、BSR の後、そして目的の命令の前
に実行されます。遅延スロットとして命令を使用する場合、いくつかの制限があ
ります (26 ページの「分岐遅延スロット」を参照 )。
命令のフォーマット :
i11
命令フィールド :
IMM11 = 11 ビットの即値
15
14
13
12
11
1
0
0
0
1
Altera Corporation
10
9
8
7
6
5
4
3
2
1
0
IMM11
45
2
命令
セ ット
アセンブラの構文 :
例:
命令セット
CALL
サブルーチンの呼び出し
処理 :
%o7 ← ((PC + 4) >> 1)
PC ← (RA << 1)
アセンブラの構文 :
CALL %rA
例:
CALL %g0
NOP ; ( 遅延スロット )
説明 :
RA の値は 1 ビット左にシフトされ、PC に転送されます。RA には、呼び出し
たサブルーチンのアドレスが 1 ビット右にシフトされて格納されています。リ
ターン・アドレスは、CALL の 2 番目の命令のアドレスです。リターン・アドレ
スは、右に 1 ビットだけシフトされ、%o7 に格納されます。右にシフトされた
%o7 の値は、変更することなく JMP の転送先として使用できます。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
遅延スロットの処理 :
CALL 直後の命令 (CALL の遅延 スロット ) は、CALL の後、そして目的の命令の
前に実行されます。遅延スロットとして命令を使用する場合、いくつかの制限が
あります (26 ページの「分岐遅延スロット」を参照 )。
命令のフォーマット :
Rw
命令フィールド :
A = オペランド RA のレジスタ・インデックス
15
14
13
12
11
10
9
8
7
6
5
0
1
1
1
1
1
1
1
1
1
1
46
4
3
2
1
0
A
Altera Corporation
命令セット
CMP
比較
処理 :
∅ ← RA – RB
アセンブラの構文 :
CMP %rA,%rB
例:
CMP %g0,%g1 ; フラグを %g0 - %g1 で設定
説明 :
RA から RB を減算し、結果を破棄します。減算に応じて条件コードを設定しま
す。RA も RB も変更はありません。
条件コード :
フラグ :
V
Z
C
∆
∆
∆
∆
命令
セ ット
N
N: 結果ビット 31
V: 符号付算術オーバフロー
Z: 結果がゼロの場合に設定、それ以外の場合はクリア
C: 減算で繰り下げが生じた場合は設定、それ以外の場合はクリア
命令のフォーマット :
RR
命令フィールド :
A = RA オペランドのレジスタ・インデックス
B = RB オペランドのレジスタ・インデックス
15
14
13
12
11
10
0
0
0
1
0
0
Altera Corporation
9
8
7
B
6
5
4
3
2
2
1
0
A
47
命令セット
CMPI
即値の比較
処理 :
∅ ← RA – (0x00.00 : K : IMM5)
アセンブラの構文 :
CMPI & %rA,IMM5
例:
前に PFX がない :
CMPI %i3,24 ; %i3 と 24 を比較
前に PFX がある :
PFX %hi(1000)
CMPI %i4,%lo(1000)
説明 :
前に PFX がない :
RA から IMM5 の 5 ビット即値を減算し、結果を破棄します。減算に応じて条件
コードを設定します。RA は変更されません。
前に PFX がある :
K レジスタ (11 ビット ) の内容と IMM5 (5 ビット ) を連結することで、即値の
オ ペ ラ ン ド は 5 ビ ッ ト か ら 16 ビ ッ ト に 拡 張 さ れ ま す。16 ビ ッ ト の 即 値
(K : IMM5) は、32 ビットにゼロ拡張され、RA から減算されます。条件コードが
設定され、結果が破棄されます。RA は変更されません。
条件コード :
フラグ :
N
V
Z
C
∆
∆
∆
∆
N: 結果ビット 31
V: 符号付算術オーバフロー
Z: 結果がゼロの場合に設定、それ以外の場合はクリア
C: 減算で繰り下げが生じた場合は設定、それ以外の場合はクリア
命令のフォーマット :
Ri5
命令フィールド :
A = RA オペランドのレジスタ・インデックス
IMM5 = 5 ビットの即値
15
14
13
12
11
10
0
0
0
1
0
1
48
9
8
7
IMM5
6
5
4
3
2
1
0
A
Altera Corporation
命令セット
EXT16D
ハーフ・ワードの抽出 ( 動的 )
RA ← (0x00.00 : hnRA) ここで n = RB[1]
処理 :
EXT16d %rA,%rB
LD %i3,[%i4] ; get 32 bits from [%i4 & 0xFF.FF.FF.FC]
EXT16d %i3,%i4 ; %i4 で short int を抽出
説明 :
RA にある 2 つのハーフ・ワードのいずれかを抽出します。抽出すべきハーフ・
ワードは、RB のビット 1 で選択します。選択したハーフ・ワードは RA のビッ
ト 15..0 に書き込まれ、それよりも上位のビット 31..16 がゼロに設定されます。
条件コード :
フラグ : 影響なし
2
命令
セ ット
アセンブラの構文 :
例:
N
V
Z
C
-
-
-
-
命令のフォーマット :
RR
命令フィールド :
A = オペランド RA のレジスタ・インデックス
B = オペランド RB のレジスタ・インデックス
15
14
13
12
11
10
0
1
1
0
1
0
Altera Corporation
9
8
7
B
6
5
4
3
2
1
0
A
49
命令セット
EXT16S
ハーフ・ワードの抽出 ( 静的 )
処理 :
RA ← (0x00.00 : hnRA) ここで n = IMM1
アセンブラの構文 :
EXT16s %rA,IMM1
例:
EXT16s %L3,1 ; %L3 はそれ自体の上位の short int を取得
説明 :
RA にある 2 つのハーフ・ワードのいずれかを抽出します。抽出すべきハーフ・
ワードは、1 ビットの即値 IMM1 で選択します。選択したハーフ・ワードは RA
のビット 15..0 に書き込まれ、それよりも上位のビット 31..16 はゼロに設定さ
れます。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
Rilu
命令フィールド :
A = オペランド RA のレジスタ・インデックス
IMM1 = 1 ビットの即値
15
14
13
12
11
10
9
8
7
6
5
0
1
1
1
0
1
0
0
1
IMM1
0
50
4
3
2
1
0
A
Altera Corporation
命令セット
EXT8D
バイト抽出 ( 動的 )
RA ← (0x00.00.00 : bnRA) ここで n = RB[1..0]
処理 :
EXT8d %rA,%rB
LD %g4,[%i0] ; [%i0 & 0xFF.FF.FF.FC] から 32 ビットを取得
EXT8d %g4,%i0 ; %i0 で特定のバイトを抽出
説明 :
RA の 4 つのバイトのいずれかを抽出します。抽出すべきバイトは、RB のビッ
ト 1..0 で選択します ( バイト 3 は RA の最上位バイト )。選択したバイトは RA
のビット 7..0 に書き込まれ、それよりも上位のビット 31..8 はゼロに設定され
ます。
条件コード :
フラグ : 影響なし
2
命令
セ ット
アセンブラの構文 :
例:
N
V
Z
C
-
-
-
-
命令のフォーマット :
RR
命令フィールド :
A = オペランド RA のレジスタ・インデックス
B = オペランド RB のレジスタ・インデックス
15
14
13
12
11
10
0
1
0
0
1
1
Altera Corporation
9
8
7
B
6
5
4
3
2
1
0
A
51
命令セット
EXT8S
バイト抽出 ( 静的 )
処理 :
RA ← (0x00.00.00 : bnRA) ここで n = IMM2
アセンブラの構文 :
EXT8s %rA,IMM2
例:
EXT8s %g6,3 ; %g6 はそれ自体のバイト 3 を取得
説明 :
RA の 4 つのバイトのいずれかを抽出します。抽出すべきバイトは、即値 IMM2
で選択します ( バイト 3 は RA の最上位バイト )。選択したバイトは RA のビッ
ト 7..0 に書き込まれ、それよりも上位のビット 31..8 はゼロに設定されます。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
Ri2u
命令フィールド :
A = オペランド RA のレジスタ・インデックス
IMM2 = 2 ビットの即値
15
14
13
12
11
10
9
8
7
0
1
1
1
0
1
0
0
0
52
6
5
IMM2
4
3
2
1
0
A
Altera Corporation
命令セット
FILL16
ハーフ • ワードの埋め込み
処理 :
R0 ← (h0RA : h0RA)
FILL16 %r0,%rA
FILL16 %r0,%i3 ; %r0 は %i3[0..15] の 2 つのコピーを取得
; 最初のオペランドは %r0 でなければなりません。
説明 :
RA の最下位ハーフ・ワードが、%r0 の両ハーフ・ワードの位置にコピーされま
す。%r0 は FILL 命令で使用できる唯一の転送先オペランドです。
条件コード :
フラグ : 影響なし
2
命令
セ ット
アセンブラの構文 :
例:
N
V
Z
C
-
-
-
-
命令のフォーマット :
Rw
命令フィールド :
A = オペランド RA のレジスタ・インデックス
15
14
13
12
11
10
9
8
7
6
5
0
1
1
1
1
1
1
0
0
1
1
Altera Corporation
4
3
2
1
0
A
53
命令セット
FILL8
バイトの埋め込み
R0 ← (b0RA : b0RA : b0RA : b0RA)
処理 :
アセンブラの構文 :
FILL8 %r0,%rA
例:
FILL8 %r0,%o3 ; %r0 は %o3[0..7] の 4 つのコピーを取得
; 最初のオペランドは %r0 でなければなりません。
説明 :
RA の最下位バイトが、%r0 にある 4 つのバイトの位置にコピーされます。%r0
は FILL 命令で使用できる唯一の転送先オペランドです。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
Rw
命令フィールド :
A = オペランド RA のレジスタ・インデックス
15
14
13
12
11
10
9
8
7
6
5
0
1
1
1
1
1
1
0
0
1
0
54
4
3
2
1
0
A
Altera Corporation
命令セット
JMP
算術演算後のジャンプ
PC ← (RA << 1)
アセンブラの構文 :
JMP %rA
例:
JMP %o7 ; リターン
NOP ; ( 遅延スロット )
説明 :
(RA << 1) で指定するターゲット・アドレスにジャンプします。ターゲット・ア
ドレスは、常にハーフ・ワードにアラインされた RA の値になります。この点
に注意してください。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
遅延スロットの処理 :
JMP 直後の命令 (JMP の遅延 スロット ) は、JMP の後、そして目的の命令の前
に実行されます。遅延スロットとして命令を使用する場合、いくつかの制限があ
ります。
命令のフォーマット :
Rw
命令フィールド :
A = オペランド RA のレジスタ・インデックス
15
14
13
12
11
10
9
8
7
6
5
0
1
1
1
1
1
1
1
1
1
0
Altera Corporation
2
命令
セ ット
処理 :
4
3
2
1
0
A
55
命令セット
LD
メモリから 32 ビット・データをロード
処理 :
前に PFX がない :
RA ← Mem32[align32(RB)]
前に PFX がある :
RA ← Mem32[align32(RB + σ(K) x 4))]
アセンブラの構文 :
LD %rA,[%rB]
例:
前に PFX がない :
LD %g0,[%i3] ; [%i3] のワードを %g0 にロード
前に PFX がある :
PFX 7
; ワード・オフセット
LD %g0,[%i3] ; [%i3+28] のワードを %g0 にロード
説明 :
前に PFX がない :
メモリから RA に 32 ビットのデータ値をロードします。データは常にRB の
ビット 31..2 で指定するワード・アラインされたアドレスから読み込まれます
(RB の 2 つの LSB は無視されます )。
前に PFX がある :
K の値は符号拡張され、ワード・スケールされた符号付オフセットとして使用
されます。このオフセットは RB のベース・アドレス ( ビット 1..0 は無視 ) に加
算され、最終的にワード・アラインされたアドレスからデータが読み込まれま
す。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
RR
命令フィールド :
A = オペランド RA のレジスタ・インデックス
B = オペランド RB のレジスタ・インデックス
15
14
13
12
11
10
0
1
0
1
1
0
56
9
8
7
B
6
5
4
3
2
1
0
A
Altera Corporation
命令セット
LDP
メモリから 32 ビット・データをロード ( ポインタ・アドレッシング・モード )
処理 :
前に PFX がない :
RA ← Mem32[align32(RP + (IMM5 x 4))]
前に PFX がある :
RA ← Mem32[align32(RP + (σ(K : IMM5) x 4))]
アセンブラの構文 :
LDP [%rP,IMM5],%rA
例:
前に PFX がない :
LDP %o3,[%L2,3] ; [%L2 + 12] から %o3 をロード
; 第 2 のレジスタ・オペランドは %L0、%L1、
;%L2、%L3 のどれかでなければなりません。
前に PFX がある :
PFX %hi(100)
LDP %o3,[%L2,%lo(100)] ; [%L2 + 400] から %o3 をロード
説明 :
前に PFX がない :
メモリから RA に 32 ビットのデータ値をロードします。データを読み込む位置
は、RP のビット 31..2 で指定するワード・アラインされたアドレス (RP の 2 つ
の LSB は無視されます ) にIMM5 で指定する 5 ビットのワード・スケールさ
れた符合なしオフセットを加算した位置になります。
2
命令
セ ット
この命令は LD に似ていますが、補足的な機能として、一命令で 4 つのベース・
ポインタのいずれかに正の 5 ビット・オフセットを適用することができます。
ベース・ポインタは、4 つのレジスタ %L0、%L1、%L2、%L3 のいずれかでな
ければなりません。
前に PFX がある :
16 ビット・オフセットが、11 ビット K レジスタと IMM5 (5 ビット ) を連結し
て作成されます。この 16 ビット・オフセット (K : IMM5) を 32 ビットに符号拡
張し、4 倍し、RP のビット 31..2 に加算して、ワード・アラインされた有効ア
ドレスが生成されます。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
RPi5
命令フィールド :
A = オペランド RA のレジスタ・インデックス
IMM5 = 5 ビットの即値
P = ベース・ポインタ・レジスタのインデックス、16 よりも小さい
15
14
13
12
1
0
1
1
Altera Corporation
11
10
P
9
8
7
IMM5
6
5
4
3
2
1
0
A
57
命令セット
LDS
メモリから 32 ビット・データをロード ( スタック・アドレッシング・モード )
処理 :
RA ← Mem32[align32(%sp + (IMM8 x 4))]
アセンブラの構文 :
LDS %rA,[%sp,IMM8]
例:
LDS %o1,[%sp,3] ; スタック +12 から %o1 をロード
; 第 2 のレジスタは %sp でなければなりません。
説明 :
メモリから RA に 32 ビットのデータ値をロードします。データを読み込む位置
は、%sp のビット 31..2 で指定するワード・アラインされたアドレス (%sp の 2
つの LSB は無視されます ) にIMM8 で指定する 8 ビットのワード・スケール
された符合なしオフセットを加算した位置になります。
通常、ソフトウェアではスタック・ポインタとして、%o6 ( つまり %sp) が使用
されます。LDS の一命令で、%sp 上の 1K バイトの範囲にあるオフセットの分
かっているデータ・ワードにアクセスすることができます。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
Ri8
命令フィールド :
A = オペランド RA のレジスタ・インデックス
IMM8 = 8 ビットの即値
15
14
13
1
1
1
58
12
11
10
9
8
IMM8
7
6
5
4
3
2
1
0
A
Altera Corporation
命令セット
LSL
左論理シフト
処理 :
RA ← (RA << RB[4..0]), 右からゼロで埋め込み
アセンブラの構文 :
LSL %rA,%rB
例:
LSL %L3,%g0 ; %g0 ビットだけ %L3 を左シフト
説明 :
RA の値は RB [4..0] のビット数だけ左にシフトされます (RB のビット 31..5 は
無視されます )。
2
命令
セ ット
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
RR
命令フィールド :
A = RA オペランドのレジスタ・インデックス
B = RB オペランドのレジスタ・インデックス
15
14
13
12
11
10
0
0
0
1
1
0
Altera Corporation
9
8
7
B
6
5
4
3
2
1
0
A
59
命令セット
LSLI
即値を使用した左論理シフト
処理 :
RA ← (RA << IMM5), 右からゼロで埋め込み
アセンブラの構文 :
LSLI %rA,IMM5
例:
LSLI %i1,6 ; 6 ビットだけ %i1 を左シフト
説明 :
RA の値は IMM5 のビット数だけ左にシフトされます。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
Ri5
命令フィールド :
A = RA オペランドのレジスタ・インデックス
IMM5 = 5 ビットの即値
15
14
13
12
11
10
0
0
0
1
1
1
60
9
8
7
IMM5
6
5
4
3
2
1
0
A
Altera Corporation
命令セット
LSR
右論理シフト
処理 :
RA ← (RA >> RB[4..0]), 左からゼロで埋め込み
アセンブラの構文 :
LSR %rA,%rB
例:
LSR %L3,%g0 ; %g0 ビットだけ %L3 を右シフト
説明 :
RA の値は RB [4..0] のビット数だけ右にシフトされます ( ビット RB [31..5] は
無視されます )。この処理を実行すると、左からゼロが埋め込まれます。
2
命令
セ ット
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
RR
命令フィールド :
A = RA オペランドのレジスタ・インデックス
B = RB オペランドのレジスタ・インデックス
15
14
13
12
11
10
0
0
1
0
0
0
Altera Corporation
9
8
7
B
6
5
4
3
2
1
0
A
61
命令セット
LSRI
即値を使用した右論理シフト
処理 :
RA ← (RA >> IMM5), 左からゼロで埋め込み
アセンブラの構文 :
LSRI %rA,IMM5
例:
LSRI %g1,6 ; 6 ビットだけ %g1 を右シフト
説明 :
RA の値は IMM5 のビット数だけ右にシフトされます。この処理を実行すると、
左からゼロが埋め込まれます。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
Ri5
命令フィールド :
A = RA オペランドのレジスタ・インデックス
IMM5 = 5 ビットの即値
15
14
13
12
11
10
0
0
1
0
0
1
62
9
8
7
IMM5
6
5
4
3
2
1
0
A
Altera Corporation
命令セット
MOV
レジスタ間の移動
処理 :
RA ← RB
アセンブラの構文 :
MOV %rA,%rB
例:
MOV %o0,%L3 ; %o0 に %L3 をコピー
説明 :
RB の内容を RA にコピーします。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
2
RR
A = RA オペランドのレジスタ・インデックス
B = RB オペランドのレジスタ・インデックス
15
14
13
12
11
10
0
0
1
1
0
0
Altera Corporation
9
8
7
B
6
5
命令
セ ット
命令のフォーマット :
命令フィールド :
4
3
2
1
0
A
63
命令セット
MOVHI
即値を上位のハーフ・ワードに移動
処理 :
h1
RA ← (K : IMM5), h0RA は影響なし
アセンブラの構文 :
MOVHI %rA,IMM5
例:
前に PFX がない :
MOVHI %g3,23 ; %g3 の上位 16 ビットが 23 を取得
前に PFX がある :
PFX %hi(100)
MOVHI %g3,%lo(100) ; %g3 の上位 16 ビットが 100 を取得
説明 :
前に PFX がない :
RA の最上位ハーフ・ワード ( ビット 31..16) に IMM5 をコピーします。最下位
ハーフ・ワード ( ビット 15..0) は影響を受けません。
前に PFX がある :
K レジスタ (11 ビット ) の内容と IMM5 (5 ビット ) が連結することで、即値の
オ ペ ラ ン ド は 5 ビ ッ ト か ら 16 ビ ッ ト に 拡 張 さ れ ま す。16 ビ ッ ト の 即 値
(K : IMM5) が、RA の最上位ハーフ・ワード ( ビット 31..16) にコピーされます。
最下位ハーフ・ワード ( ビット 15..0) は影響を受けません。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
Ri5
命令フィールド :
A = オペランド RA のレジスタ・インデックス
IMM5 = 5 ビットの即値
15
14
13
12
11
10
0
1
1
0
1
1
64
9
8
7
IMM5
6
5
4
3
2
1
0
A
Altera Corporation
命令セット
MOVI
即値の移動
処理 :
RA ← (0x00.00 : K : IMM5)
アセンブラの構文 :
MOVI %rA,IMM5
例:
前に PFX がない :
MOVI %o3,7 ; 7 で %o3 をロード
前に PFX がある :
PFX %hi(301)
MOVI %o3,%lo(301) ; 301 で %o3 をロード
2
前に PFX がない :
IMM5 で指定したゼロ拡張の 5 ビット即値 ( 範囲 [0..31]) を、
レジスタ RA にロー
ドします。
前に PFX がある :
(K : IMM5) で指定したゼロ拡張の 16 ビット即値 ( 範囲 [0..65535]) を、レジスタ
RA にロードします。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
Ri5
命令フィールド :
A = RA オペランドのレジスタ・インデックス
IMM5 = 5 ビットの即値
15
14
13
12
11
10
0
0
1
1
0
1
Altera Corporation
9
8
7
IMM5
6
5
4
3
2
1
0
A
65
命令
セ ット
説明 :
命令セット
MSTEP
乗算ステップ
If (%r0[31] = = 1)
処理 :
then %r0 ← (%r0 << 1) + RA
else %r0 ← (%r0 << 1)
アセンブラの構文 :
MSTEP %rA
例:
MSTEP %g1 ; 部分積の累積
説明 :
符号のない乗算を 1 ステップで実行します。%r0 が被乗数で RA の乗数です。結
果は %r0 に累積されます。RA は影響を受けません。
以下の部分コードは、16 ビット x 16 ビットを 32 ビットの乗算にします。エン
トリの %r0 と %r1 に、
乗算と被乗算が格納されます。結果は %r0 に残されます。
SWAP %r0 ; 乗数を特定の位置に移動します。
MSTEP %r1
MSTEP %r1
MSTEP %r1
…16 MSTEP の合計 …
MSTEP %r1
;%r0 に格納された 32 ビットの積
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
Rw
命令フィールド :
A = オペランド RA のレジスタ・インデックス
15
14
13
12
11
10
9
8
7
6
5
0
1
1
1
1
1
1
0
1
0
0
66
4
3
2
1
0
A
Altera Corporation
命令セット
MULL
乗算
処理 :
R0 < -- (R0 & 0x0000.ffff) x (RA & 0x0000.ffff)
アセンブラの構文 :
MUL %rA
例:
MUL %i5
説明 :
%r0 と %rA の下位ハーフ・ワードを乗算し、%r0 に 32 ビットの結果を格納し
ます。ここでは、2 つの符号付き 16 ビット数の整数が乗算されて、32 ビット符
号付きの結果になるか、2 つの符号なし 16 ビット数が乗算されて、符号なしの
32 ビットの結果になります。
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令
セ ット
条件コード :
命令のフォーマット :
Rw
命令フィールド :
A = オペランド RA のレジスタ・インデックス
15
14
13
12
11
10
9
8
7
6
5
0
1
1
1
1
1
1
0
1
0
1
Altera Corporation
2
4
3
2
1
0
A
67
命令セット
NEG
算術反転
処理 :
RA ← 0 – RA
アセンブラの構文 :
NEG %rA
例:
NEG %o4
説明 :
RA の値を負にします。RA の 2 つの補足を取ります。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
Rw
命令フィールド :
A = オペランド RA のレジスタ・インデックス
15
14
13
12
11
10
9
8
7
6
5
0
1
1
1
1
1
0
0
0
0
1
68
4
3
2
1
0
A
Altera Corporation
命令セット
NOT
論理反転
処理 :
RA ← ~RA
アセンブラの構文 :
NOT %rA
例:
NOT %o4
説明 :
RA の値をビットごとに反転します。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
2
Rw
A = オペランド RA のレジスタ・インデックス
15
14
13
12
11
10
9
8
7
6
5
0
1
1
1
1
1
0
0
0
0
0
Altera Corporation
命令
セ ット
命令のフォーマット :
命令フィールド :
4
3
2
1
0
A
69
命令セット
OR
ビットごとの論理 OR
処理 :
前に PFX がない :
RA ← RA | RB
前に PFX がある :
RA ← RA | (0x00.00 : K : IMM5)
アセンブラの構文 :
前に PFX がない :
OR %rA,%rB
前に PFX がある :
PFX %hi(const)
OR %ra,%lo(const)
例:
前に PFX がない :
OR %i0,%i1 ; OR %i1 into %i0
前に PFX がある :
PFX %hi(3333)
OR %i0,%lo(3333) ; OR %i0 with 3333
説明 :
前に PFX がない :
RA の個々のビットと RB の対応するビットで論理和を行ない、結果を RA に格
納します。
前に PFX がある :
プリフィックスがあった場合、K レジスタ (11 ビット ) の内容と IMM5 (5 ビッ
ト ) を連結した即値の定数で、RB オペランドが置換されます。この 16 ビット
値は 32 ビットにゼロ拡張され、ビットごとに RA との論理和が行なわれます。
この結果は RA に書き込まれます。
条件コード :
フラグ :
N
V
Z
C
∆
-
∆
-
N: 結果ビット 31
Z: 結果がゼロの場合に設定、それ以外の場合はクリア
命令のフォーマット :
RR、Ri5
命令フィールド :
A = オペランド RA のレジスタ・インデックス
B = オペランド RB のレジスタ・インデックス
IMM5 = 5 ビットの即値
前に PFX (RR) がない :
15
14
13
12
11
10
0
1
0
0
0
0
9
8
7
6
5
4
3
B
2
1
0
A
前に PFX (Ri5) がある :
15
14
13
12
11
10
0
1
0
0
0
0
70
9
8
7
IMM5
6
5
4
3
2
1
0
A
Altera Corporation
命令セット
PFX
プリフィックス
処理 :
K ← IMM11 (K は他のすべての命令でゼロに設定 )
アセンブラの構文 :
PFX IMM11
例:
PFX 3 ; 次の命令に影響します。
説明 :
K レジスタに 11 ビットの定数値 IMM11 をロードします。K レジスタの値は次
の命令に影響する場合があります。PFX は例外ですが、K はすべての命令の後
でゼロに設定されます。2 つの PFX 命令を連続で使用したときの結果は未定義
です。
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令
セ ット
条件コード :
命令のフォーマット :
i11
命令フィールド :
IMM11 = 11 ビットの即値
15
14
13
12
11
1
0
0
1
1
Altera Corporation
10
9
2
8
7
6
5
4
3
2
1
0
IMM11
71
命令セット
RDCTL
制御レジスタの読み込み
処理 :
RA ← CTLk
アセンブラの構文 :
RDCTL %rA
例:
前に PFX がない :
RDCTL %g7 ; STATUS レジスタ (%ctl0) を %g7 にロード
前に PFX がある :
PFX 2
RDCTL %g7 ; WVALID レジスタ (%ctl2) を %g7 にロード
説明 :
前に PFX がない :
STATUS レジスタ (%ctl0) の現在の内容を RA にロードします。
前に PFX がある :
K で選択した制御レジスタの内容を RA にロードします。制御レジスタとその
インデックスについては、5 ページの「コントロール・レジスタ」を参照してく
ださい。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
Rw
命令フィールド :
A = オペランド RA のレジスタ・インデックス
15
14
13
12
11
10
9
8
7
6
5
0
1
1
1
1
1
1
1
0
0
1
72
4
3
2
1
0
A
Altera Corporation
命令セット
RESTORE
呼び出し側のレジスタ・ウィンドウの復旧
CWP ← CWP + 1
処理 :
(old-CWP == HI_LIMIT) の場合
TRAP #2
アセンブラの構文 :
RESTORE
RESTORE ; レジスタ・ウィンドウの復旧
説明 :
レジスタ・ファイルで CWP を 1 つ引き上げます。RESTORE 命令の前に CWP
と HI_LIMIT (WVALID レジスタから ) の値が等しくなると、ウィンドウ・オー
バフロー・トラップ (TRAP #2) が発生します。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
w
命令フィールド :
なし
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
0
1
1
1
1
1
0
1
1
0
1
0
0
0
0
0
Altera Corporation
2
命令
セ ット
例:
73
命令セット
RLC
キャリー付で左ローテーション
C ← RA[31]
処理 :
RA ← (RA << 1) : C
アセンブラの構文 :
RLC %rA
例:
RLC %i4 ; %i4 を左へ 1 ビットだけローテーション
説明 :
キャリー・フラグを通して、RA のビットを 1 つ左にローテーションします。
条件コード :
フラグ :
N
V
Z
C
-
-
-
∆
C: ローテーション前の RA のビット 31
命令のフォーマット :
Rw
命令フィールド :
A = オペランド RA のレジスタ・インデックス
15
14
13
12
11
10
9
8
7
6
5
0
1
1
1
1
1
0
0
1
0
1
74
4
3
2
1
0
A
Altera Corporation
命令セット
RRC
キャリー付で右ローテーション
C ← RA[0]
処理 :
RA ← C : (RA >> 1)
RRC %rA
例:
RRC %i4 ; %i4 を 1 ビットだけ右へローテーション
説明 :
キャリー・フラグを通して、RA のビットを 1 つ右にローテーションします。
前に PFX がある :
影響なし
条件コード :
フラグ :
2
命令
セ ット
アセンブラの構文 :
N
V
Z
C
-
-
-
∆
C: ローテーション前の RA のビット 0
命令のフォーマット :
Rw
命令フィールド :
A = オペランド RA のレジスタ・インデックス
15
14
13
12
11
10
9
8
7
6
5
0
1
1
1
1
1
0
0
1
1
0
Altera Corporation
4
3
2
1
0
A
75
命令セット
SAVE
呼び出し側のレジスタ・ウィンドウの保存
CWP ← CWP – 1
処理 :
%sp ← %fp – (IMM8 x 4)
(old-CWP == LO_LIMIT) の場合
TRAP #1
アセンブラの構文 :
SAVE %sp,-IMM8
例:
SAVE %sp,-23 ; サブルーチンを新しいレジスタで開始
; 最初のオペランドは %sp でなければなりません。
説明 :
レジスタ・ファイルで CWP を 1 つ引き下げます。SAVE 命令の前に CWP と
LO_LIMIT (WVALID レジスタから ) の値が等しくなると、ウィンドウ・アンダ
フロー・トラップ (TRAP #1) が発生します。
( 新しく開いたレジスタ・ウィンドウの ) %sp が、%fp から IMM8 の 4 倍を引い
た値でロードされます。新しいウィンドウの %fp は、古い ( 呼び出し側の ) ウィ
ンドウの %sp と同じです。
SAVE は通常、サブルーチンへのエントリで使用され、サブルーチンのために
新しい一時的なレジスタ・セットを開き、それと同時にスタック・フレームを
開きます。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
i8v
命令フィールド :
IMM8 = 8 ビットの即値
15
14
13
12
11
10
9
8
0
1
1
1
1
0
0
0
76
7
6
5
4
3
2
1
0
IMM8
Altera Corporation
命令セット
SEXT16
16 ビット値の符号拡張
処理 :
RA ← σ(h0RA)
アセンブラの構文 :
SEXT16 %rA
例:
SEXT16 %g3 ; 符号付きの short を符号付きの long に変換
説明 :
RA のビット 16..31 を RA のビット 15 で置換します。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
2
Rw
A = オペランド RA のレジスタ・インデックス
15
14
13
12
11
10
9
8
7
6
5
0
1
1
1
1
1
0
0
1
0
0
Altera Corporation
命令
セ ット
命令のフォーマット :
命令フィールド :
4
3
2
1
0
A
77
命令セット
SEXT8
8 ビット値の符号拡張
処理 :
RA ← σ(b0RA)
アセンブラの構文 :
SEXT8 %rA
例:
SEXT8 %o3 ; 符号付きのバイトを符号付きの long に変換
説明 :
RA のビット 8..31 を RA のビット 7 で置換します。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
Rw
命令フィールド :
A = オペランド RA のレジスタ・インデックス
15
14
13
12
11
10
9
8
7
6
5
0
1
1
1
1
1
0
0
0
1
1
78
4
3
2
1
0
A
Altera Corporation
命令セット
SKP0
レジスタ・ビットが 0 の場合スキップ
処理 :
if (RA[IMM5] == 0)
then begin
if (Mem16[PC + 2] is PFX)
then PC ← PC + 6
else PC ← PC + 4
end
アセンブラの構文 :
SKP0 %rA,IMM5
例:
SKP0 %o3, 7 ; %o3 のビット 7 が 0 のときスキップ
ADDI %g0, 1 ; ビット 7 が 1 のときは加算
説明 :
単一ビット RA[IMM5] が 0 の場合、次の命令をスキップします。次の命令が PFX
の場合、PFX とその次の命令も一緒にスキップします。
条件コード :
フラグ : 影響なし
V
Z
C
-
-
-
-
命令のフォーマット :
Ri5
命令フィールド :
A = オペランド RA のレジスタ・インデックス
IMM5 = 5 ビットの即値
15
14
13
12
11
10
0
1
0
1
0
0
Altera Corporation
9
8
7
IMM5
6
5
4
3
2
1
0
A
79
命令
セ ット
N
2
命令セット
SKP1
レジスタ・ビットが 1 の場合スキップ
処理 :
if (RA[IMM5] == 1)
then begin
if (Mem16[PC + 2] is PFX)
then PC ← PC + 6
else PC ← PC + 4
end
アセンブラの構文 :
SKP1 %rA,IMM5
例:
SKP1 %o3,21 ; %o3 の 21 ビットが 1 のときスキップ
ADDI %g0, 1 ; ビットが 0 の場合は加算
説明 :
単一ビット RA[IMM5] が 1 の場合、次の命令をスキップします。次の命令が PFX
の場合、PFX とその次の命令も一緒にスキップします。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
Ri5
命令フィールド :
A = オペランド RA のレジスタ・インデックス
IMM5 = 5 ビットの即値
15
14
13
12
11
10
0
1
0
1
0
1
80
9
8
7
IMM5
6
5
4
3
2
1
0
A
Altera Corporation
命令セット
SKPRNZ
レジスタが 0 以外の場合スキップ
処理 :
if (RA ! = 0)
then begin
if (Mem16[PC + 2] is PFX)
then PC ← PC + 6
else PC ← PC + 4
end
アセンブラの構文 :
SKPRnz %rA
例:
SKPRnz %g3
BSR SendIt ; %g3 が 0 の場合にのみ呼び出し
NOP ; ( 遅延スロット ) どちらの場合でも実行
説明 :
RA がゼロ以外の場合、次の命令をスキップします。次の命令が PFX の場合、
PFX とその次の命令を一緒にスキップします。
条件コード :
フラグ : 影響なし
V
Z
C
-
-
-
-
命令のフォーマット :
Rw
命令フィールド :
A = オペランド RA のレジスタ・インデックス
15
14
13
12
11
10
9
8
7
6
5
0
1
1
1
1
1
1
1
0
1
0
Altera Corporation
4
3
2
1
0
A
81
命令
セ ット
N
2
命令セット
SKPRZ
レジスタが 0 の場合スキップ
処理 :
if (RA = = 0)
then begin
if (Mem16[PC + 2] is PFX)
then PC ← PC + 6
else PC ← PC + 4
end
アセンブラの構文 :
SKPRz %rA
例:
SKPRz %o3
BSR SendIt ; %o3 が 0 以外の場合にのみ呼び出し
NOP ; ( 遅延スロット ) どちらの場合でも実行
説明 :
RA がゼロの場合、次の命令をスキップします。次の命令が PFX の場合、PFX
とその次の命令を一緒にスキップします。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
Rw
命令フィールド :
A = オペランド RA のレジスタ・インデックス
15
14
13
12
11
10
9
8
7
6
5
0
1
1
1
1
1
1
0
1
1
0
82
4
3
2
1
0
A
Altera Corporation
命令セット
SKPS
条件コードでスキップ
処理 :
if (condition IMM4 is true)
then begin
if (Mem16[PC + 2] is PFX)
then PC ← PC + 6
else PC ← PC + 4
end
アセンブラの構文 :
SKPS cc_IMM4
例:
SKPS cc_ne
BSR SendIt ; Z フラグがクリアの場合にのみ呼び出し
NOP ; ( 遅延スロット ) どちらの場合でも実行
説明 :
指定した条件が真の場合、次の命令をスキップします。次の命令が PFX の場合、
PFX とその次の命令を一緒にスキップします。
条件コード :
設定 :
(C)
cc_nc 0x1
(not C)
cc_z 0x2
(Z)
cc_nz 0x3
(not Z)
cc_mi 0x4
(N)
cc_pl 0x5
(not N)
cc_ge 0x6
(not (N xor V))
cc_lt 0x7
(N xor V)
cc_le 0x8
(Z or (N xor V))
cc_gt 0x9
(Not (Z or (N xorV)))
cc_v 0xa
(V)
cc_nv 0xb
(not V)
cc_la 0xc
(C or Z)
cc_hi 0xd
(not (C or Z))
補足的に利用できるエイリアス・フラグ :
cc_cs = cc_c
cc_eq = cc_z
cc_n = cc_mi
cc_vs = cc_v
cc_cc = cc_nc
cc_ne = cc_nz
cc_vc = cc_nv
cc_p = cc_pl
これらのコードは、if ∼を表します。例えば、skps cc_eq は if equal と同じです。
命令のフォーマット :
i4w
命令フィールド :
IMM4 = 4 ビットの即値
15
14
13
12
11
10
9
8
7
6
5
4
0
1
1
1
1
1
1
0
1
1
1
0
Altera Corporation
3
2
1
0
IMM4
83
命令
セ ット
cc_c 0x0
2
命令セット
ST
32 ビット・データをメモリに格納
処理 :
前に PFX がない :
Mem32[align32(RB)] ← RA
前に PFX がある :
Mem32[align32(RB + (σ(K) x 4))] ← RA
アセンブラの構文 :
ST [%rB],%rA
例:
前に PFX がない :
ST [%g0],%i3 ; %g0 はポインタ、%i3 をストア
前に PFX がある :
PFX 3
; ワード・オフセット
ST [%g0],%i3 ; %g0 + 12 をストア
説明 :
前に PFX がない :
RA の 32 ビット・データ値をメモリに格納します。データは常にRB のビット
31..2 で指定されたワード・アラインされたアドレスに書き込まれます (RB の 2
つの LSB は無視されます )。
前に PFX がある :
K の値は符号拡張され、ワード・スケールされた符号付オフセットとして使用
されます。このオフセットはベース・ポインタ・アドレス RB ( ビット 1..0 は無
視 ) に加算され、最終的にワード・アラインされたアドレスにデータが書き込ま
れます。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
RR
命令フィールド :
A = オペランド RA のレジスタ・インデックス
B = オペランド RB のレジスタ・インデックス
15
14
13
12
11
10
0
1
0
1
1
1
84
9
8
7
B
6
5
4
3
2
1
0
A
Altera Corporation
命令セット
ST16D
16 ビット・データをメモリに格納 ( 算出したハーフ・ワード・ポインタ・アドレス )
処理 :
前に PFX がない :
hn
Mem32[align32(RA)] ← hn%r0、ここで n = RA[1]
前に PFX がある :
hn
Mem32[align32(RA + (σ(K) x 4))] ← hn%r0、ここで n = RA[1]
アセンブラの構文 :
ST16d [%rA],%r0
例:
前に PFX がない :
FILL16 %r0,%g7 ; %r0 で %g7 の short を複製
ST16d [%o3],%r0 ; %r0 の %o3[1] 番目の short int を [%o3] にストア
; 第 2 オペランドは %r0 でなければなりません。
前に PFX がある :
FILL16 %r0,%g3
PFX 5
ST16d [%o3],%r0 ; 上記と同じメモリに 20 バイト・オフセット
説明 :
前に PFX がない :
RA で指定しているハーフ・ワード・アラインされたメモリのアドレスに、%r0
の 2 つのハーフ・ワードのいずれかを格納します。ビット RA[1] は、格納すべ
き %r0 のハーフ・ワードを選択します ( ハーフ・ワード 1 は最上位です )。RA[0]
は無視されます。
2
命令
セ ット
ST16d は FILL16 と組み合わせて、2 つの命令でハーフ・ワードのストアを実行
します。レジスタ %rX のビット 15..0 にハーフ・ワードがある場合、以下のシー
ケンスによって RA で与えられるハーフ・ワード・アラインされたメモリ・ア
ドレスにこのハーフ・ワードが書き込まれます。
FILL16 %r0,%rX
ST16d [%rA],%r0
前に PFX がある :
K の値は符号拡張され、ワード・スケールされた符号付オフセットとして使用
されます。このオフセットは、ベース・アドレス RA に加算され、最終的なバイ
ト・アドレスにデータが書き込まれます。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
Rw
命令フィールド :
A = オペランド RA のレジスタ・インデックス
15
14
13
12
11
10
9
8
7
6
5
0
1
1
1
1
1
1
0
0
0
1
Altera Corporation
4
3
2
1
0
A
85
命令セット
ST16S
16 ビット・データをメモリに格納 ( 静的ハーフ・ワード・オフセット・アドレス )
処理 :
前に PFX がない :
hn
Mem32[align32(RA)] ← hn%r0、ここで n = IMM1
前に PFX がある :
hn
Mem32[align32(RA + (σ(K) x 4))] ← hn%r0、ここで n = IMM1
アセンブラの構文 :
ST16s [%rA],%r0,IMM1
例:
ST16s [%g8],%r0,1
説明 :
前に PFX がない :
%r0 の 2 つのハーフ・ワードのいずれかを、(RA[31..2] + IMM1 x 2) で指定する
ハーフ・ワード・アラインされたメモリ・アドレスに格納します。2 つのビット
RA[1..0] は無視されます。IMM2 は、%r0 の格納すべきハーフ・ワードを選択し
ます ( ハーフ・ワード #1 は最上位です )。
ST16s は FILL16 と組み合わせて、ワード・アラインしたベース・アドレスから
ハーフ・ワード・オフセットした位置に、ハーフ・ワードのストアを実行しま
す。レジスタ %rX のビット 15..0 にハーフ・ワードがある場合、以下のシーケ
ンスによって、(RA + Y x 2) で与えられるハーフ・ワード・アラインされたメモ
リ・アドレスにこのハーフ・ワードが書き込まれます (RA にワード・アライン
されたポインタがあると仮定 )。
FILL16 %r0,%rX
PFX Y >> 2
ST16s [%rA],%r0,(Y >> 1) & 1
前に PFX がある :
K と IMM1 を連結して、12 ビットの符号付きハーフ・ワード・スケールされた
オフセットが作成されます。このオフセット (K : IMM1) は ハーフ・ワード・ス
ケール (2 で乗算 ) され、さらに 32 ビットに符号拡張されて、ST 処理のハー
フ・ワード・オフセットとして使用されます。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
Rilu
命令フィールド :
A = オペランド RA のレジスタ・インデックス
IMM1 = 1 ビットの即値
15
14
13
12
11
10
9
8
7
6
5
0
1
1
1
0
1
1
0
1
IMM1
0
86
4
3
2
1
0
A
Altera Corporation
命令セット
ST8D
8 ビット・データをメモリに格納 ( 算出したバイト・ポインタ・アドレス )
前に PFX がない :
処理 :
bnMem32[align32(RA)]
← bn%r0、ここで n = RA[1..0]
前に PFX がある :
bn
Mem32[align32(RA + σ(K) x 4)]] ← bn%r0、ここで n = RA[1..0]
アセンブラの構文 :
ST8d [%rA],%r0
例:
前に PFX がない :
FILL8 %r0,%g7 ; %r0 で %g7 の下位バイトを倍増
ST8d [%o3],%r0 ; %r0 の %o3[1..0] 番目のバイトを
;[%o3] に格納
; 第 2 オペランドは %r0 でなければなりません。
前に PFX がある :
FILL8 %r0,%g3
PFX 5
ST8d [%o3],%r0 ; 上記と同じメモリに 20 バイト・オフセット
説明 :7
前に PFX がない :
%r0 の 4 つのバイトのいずれかを、RA で指定しているバイト・アドレスでメ
モリに格納します。2 ビット RA[1..0] は、%r0 の格納すべきバイトを選択します
( バイト 3 は最上位です )。
2
命令
セ ット
ST8d は FILL8 と組み合わせて、2 つの命令でバイトのストアを実行します。レ
ジスタ %rX のビット 7..0 にバイトがある場合、以下のシーケンスによって、RA
で与えられるバイト・アドレスのメモリにこのバイトが書き込まれます。
FILL8 %r0,%rX
ST8d [%rA],%r0
前に PFX がある :
K の値は符号拡張され、ワード・スケールされた符号付オフセットとして使用
されます。このオフセットは、ベース・アドレス RA に加算され、最終的なバイ
ト・アドレスにデータが書き込まれます。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
Rw
命令フィールド :
A = オペランド RA のレジスタ・インデックス
15
14
13
12
11
10
9
8
7
6
5
0
1
1
1
1
1
1
0
0
0
0
Altera Corporation
4
3
2
1
0
A
87
命令セット
ST8S
8 ビット・データをメモリに格納 ( 静的バイト・オフセット・アドレス )
処理 :
前に PFX がない :
bn
Mem32[align32(RA)] ← bn%r0、ここで n = IMM2
前に PFX がある :
bnMem32[align32(RA + (σ(K) x 4))] ← bn%r0、ここで n = IMM2
アセンブラの構文 :
ST8s [%rA],%r0,IMM2
例:
前に PFX がない :
MOVI %g4,12
ST8s [%g4],%r0,3 ; %r0 の上位バイトを mem[15] に格納
前に PFX がある :
PFX 9
ST8s [%g4],%r0,2 ; %r0 のバイト 2 を
; mem[%g4 + 36 + 2] に格納
説明 :
前に PFX がない :
%r0 の 4 つのバイトのいずれかを、(RA[31..2] + IMM2) で指定しているメモリ
のバイト・アドレスに格納します。2 つのビット RA[1..0] は無視されます。IMM2
は、%r0 の格納すべきバイトを選択します ( バイト 3 は最上位です )。
ST8s は FILL8 と組み合わせて、ワード・アラインしたベース・ポインタにバイ
ト・オフセットした位置にバイトのストアを実行します。レジスタ %rX のビッ
ト 7..0 にバイトがある場合、以下のシーケンスによって、(RA + Y ) で与えられ
るメモリのバイト・アドレスにこのバイトが書き込まれます (RA にワード・ア
ラインされたポインタがあると仮定 )。
FILL8 %r0,%rX
PFX Y >> 2
ST8s [%rA],%r0,Y & 3
前に PFX がある :
バイト・スケールされた 13 ビットの符号付きオフセットは、K と IMM2 を連結
して作成されます。このオフセット (K : IMM2) は 32 ビットに符号拡張され、
ST
処理のバイト・オフセットとして使用されます。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
Ri2u
命令フィールド :
A = オペランド RA のレジスタ・インデックス
IMM2 = 2 ビットの即値
15
14
13
12
11
10
9
8
7
0
1
1
1
0
1
1
0
0
88
6
5
IMM2
4
3
2
1
0
A
Altera Corporation
命令セット
STP
32 ビット・データをメモリに格納 ( ポインタ・アドレッシング・モード )
処理 :
前に PFX がない :
Mem32[align32(RP + (IMM5 x 4))] ← RA
前に PFX がある :
Mem32[align32(RP + (σ(K : IMM5) x 4))] ← RA
アセンブラの構文 :
STP [%rP,IMM5],%rA
例:
前に PFX がない :
STP [%L2,3],%g3 ; %g3 を [%L2 + 12] に格納
前に PFX がある :
PFX %hi(102)
STP [%L2,%lo(102)],%g3 ; %g3 を
;[%L2 + 408] に格納
説明 :
前に PFX がない :
RA の 32 ビット・データ値をメモリに格納します。データを書き込む位置は、
RP のビット [31..2] で指定するワード・アラインされたアドレス (RP の 2 つの
LSB は無視されます ) にIMM5 で指定する 5 ビットのワード・スケールされ
た符合なしオフセットを加算した位置になります。
2
命令
セ ット
この命令は ST に似ていますが、補足的な機能として、一命令で 4 つのベース・
ポインタのいずれかに正の 5 ビット・オフセットを適用することができます。
ベース・ポインタは、4 つのレジスタ %L0、%L1、%L2、%L3 のいずれかでな
ければなりません。
前に PFX がある :
16 ビット・オフセットが、11 ビット K レジスタと IMM5 (5 ビット ) を連結し
て作成されます。この 16 ビット・オフセット (K : IMM5) を 32 ビットに符号拡
張し、4 倍し、RP のビット 31..2 に加算してワード・アラインされた有効アド
レスが生成されます。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
RPi5
命令フィールド :
A = オペランド RA のレジスタ・インデックス
IMM5 = 5 ビットの即値
P = ベース・ポインタ・レジスタのインデックス、16 よりも小さい
15
14
13
12
1
0
1
0
Altera Corporation
11
10
P
9
8
7
IMM5
6
5
4
3
2
1
0
A
89
命令セット
STS
32 ビット・データをメモリに格納 ( スタック・アドレッシング・モード )
処理 :
Mem32[align32(%sp + (IMM8 x 4))] ← RA
アセンブラの構文 :
STS [%sp,IMM8],%rA
例:
STS [%sp,17],%i5 ; %i5 をスタック + 68 に格納
; 第 1 レジスタは %sp でなければなりません。
説明 :
RA の 32 ビット値をメモリに格納します。データを書き込む位置は、%sp の
ビット 31..2 で指定するワード・アラインされたアドレス (%sp の 2 つの LSB
は無視されます ) にIMM8 で指定する 8 ビットのワード・スケールされた符合
なしオフセットを加算した位置になります。
通常、ソフトウェアではスタック・ポインタとして、%o6 ( つまり %sp) が使用
されます。STS の一命令で %sp 上の 1K バイトの範囲にあるオフセットの分
かっているデータ・ワードにアクセスすることができます。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
Ri8
命令フィールド :
A = オペランド RA のレジスタ・インデックス
IMM8 = 8 ビットの即値
15
14
13
1
1
0
90
12
11
10
9
8
IMM8
7
6
5
4
3
2
1
0
A
Altera Corporation
命令セット
STS16S
16 ビット・データをメモリに格納 ( スタック・アドレッシング・モード )
処理 :
hn
Mem32[align32(%sp + IMM9 x 2)] ← hn%r0、ここで n = IMM9[0]
アセンブラの構文 :
STS16s [%sp,IMM9],%r0
例:
STS16s [%sp,7],%r0 ; %sp と %r0 でなければなりません。
説明 :
%r0 の 2 つのハーフ・ワードのいずれかを、(%sp + IMM9x2) で指定するハー
フ・ワード・アラインされたメモリのアドレスに格納します。IMM9 の最下位
ビットは、%r0 の格納すべきハーフ・ワードを選択します ( ハーフ・ワード 1
は最上位です )。
FILL16 %r0,%rX
STS16s [%sp,Y],%r0
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
i9
命令フィールド :
IMM9 = 9 ビットの即値
15
14
13
12
11
10
0
1
1
0
0
1
Altera Corporation
9
8
7
6
5
IMM9
4
3
2
1
0
0
91
命令
セ ット
STS16s は FILL16 と組み合わせて、スタック・ポインタから 1K バイトの範囲
にあるハーフ・ワード・オフセットに16 ビットのストアを実行します。レジ
スタ %rX のビット 15..0 にハーフ・ワードがある場合、以下のシーケンスによっ
て、%sp からハーフ・ワード・オフセットしたメモリ Y にこのハーフ・ワー
ドが書き込まれます (%sp にワード・アラインされたアドレスがあると仮定 )。
2
命令セット
STS8S
8 ビット・データをメモリに格納 ( スタック・アドレッシング・モード )
bn
処理 :
Mem32[align32(%sp + IMM10)] ← bn%r0、ここで n = IMM10[1..0]
アセンブラの構文 :
STS8s [%sp,IMM10],%r0
例:
STS8s [%sp,13],%r0 ; %sp と %r0 でなければなりません。
説明 :
%r0 にある 4 つのバイトのいずれかを、メモリの (%sp + IMM10) で指定するバ
イト・アドレスに格納します。IMM10 の 2 つの最下位ビットは、%r0 の格納す
べきバイトを選択します ( バイト 3 は最上位です )。
STS8s は FILL8 と組み合わせて、スタック・ポインタから 1K バイトの範囲に
あるバイト・オフセットにバイトのストアを実行します。レジスタ %rX のビッ
ト 7..0 にバイトがある場合、以下のシーケンスによって、%sp からバイト・オ
フセットしたメモリ Y にこのバイトが書き込まれます (%spにワード・アラ
インされたアドレスがあると仮定 )。
FILL8 %r0,%rX
STS8s [%sp,Y],%r0
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
i10
命令フィールド :
IMM10 = 10 ビットの即値
15
14
13
12
11
10
0
1
1
0
0
0
92
9
8
7
6
5
4
3
2
1
0
IMM10
Altera Corporation
命令セット
SUB
減算
処理 :
RA ← RA – RB
アセンブラの構文 :
SUB %rA,%rB
例:
SUB %i3,%g0 ; %i3 から %g0 を減算
説明 :
RB の内容を RA から減算し、結果を RA に格納します。
条件コード :
フラグ :
N
V
Z
C
∆
∆
∆
∆
2
命令
セ ット
N: 結果ビット 31
V: 符号付算術オーバフロー
Z: 結果がゼロの場合に設定、それ以外の場合はクリア
C: 減算で繰り下げが生じた場合は設定、それ以外の場合はクリア
命令のフォーマット :
RR
命令フィールド :
A = RA オペランドのレジスタ・インデックス
B = RB オペランドのレジスタ・インデックス
15
14
13
12
11
10
0
0
0
0
1
0
Altera Corporation
9
8
7
B
6
5
4
3
2
1
0
A
93
命令セット
SUBI
即値の減算
処理 :
RA ← RA – (0x00.00 : K : IMM5)
アセンブラの構文 :
subi %rB,IMM5
例:
前に PFX がない :
SUBI %L5,6 ; %L5 から 6 を減算
前に PFX がある :
PFX %hi(1000)
SUBI %o3,%lo(1000) ; %o3 から 1000 を減算
説明 :
前に PFX がない :
RA の内容から即値を減算します。即値の範囲は [0..31] です。
前に PFX がある :
K レジスタ (11 ビット ) の内容と IMM5 (5 ビット ) を連結することで、即値の
オ ペ ラ ン ド は 5 ビ ッ ト か ら 16 ビ ッ ト に 拡 張 さ れ ま す。16 ビ ッ ト の 即 値
(K : IMM5) は、32 ビットにゼロ拡張され、レジスタ A から減算されます。
条件コード :
フラグ :
N
V
Z
C
∆
∆
∆
∆
N: 結果ビット 31
V: 符号付算術オーバフロー
Z: 結果がゼロの場合に設定、それ以外の場合はクリア
C: 減算で繰り下げが生じた場合は設定、それ以外の場合はクリア
命令のフォーマット :
Ri5
命令フィールド :
A = RA オペランドのレジスタ・インデックス
IMM5 = 5 ビットの即値
15
14
13
12
11
10
0
0
0
0
1
1
94
9
8
7
IMM5
6
5
4
3
2
1
0
A
Altera Corporation
命令セット
SWAP
レジスタ・ハーフ・ワードのスワップ
処理 :
RA ← h0RA : h1RA
アセンブラの構文 :
SWAP %rA
例:
SWAP %g3 ; %g3 にある 2 つのハーフ・ワードをスワップ
説明 :
RA の 2 つの 16 ビット・ハーフ・ワードをスワップ ( 位置を交換 ) します。結
果を RA に書き込みます。
条件コード :
フラグ : 影響なし
V
Z
C
-
-
-
-
命令のフォーマット :
Rw
命令フィールド :
A = オペランド RA のレジスタ・インデックス
15
14
13
12
11
10
9
8
7
6
5
0
1
1
1
1
1
0
1
0
0
0
Altera Corporation
命令
セ ット
N
2
4
3
2
1
0
A
95
命令セット
TRAP
無条件のトラップ
処理 :
ISTATUS ← STATUS
IE ← 0
CWP ← CWP – 1
IPRI ← IMM6
%o7 ← ((PC + 2) >> 1)
PC ← Mem32[VECBASE + (IMM6 x 4)] << 1
アセンブラの構文 :
TRAP IMM6
例:
TRAP 0 ; ボードをリセット
説明 :
CWP は 1 ずつ減算し、トラップ・ハンドラのために新しいレジスタ・ウィンド
ウを開きます。インタラプトはディセーブルになります (IE ← 0)。トラップ前の
STATUS レジスタは、ISTATUS レジスタにコピーされます。
制御をトラップ・ハンドラ番号 IMM6 に渡します。トラップ・ハンドラのアドレ
スは、メモリ・アドレス VECBASE (VECBASE は設定可能 ) で開始するベクタ・
テーブルから読み込まれます。32 ビット値は、ワード・アラインされたアドレ
スからフェッチされます (VECBASE + IMM6 x 4)。フェッチした値は 2 で乗算さ
れて PC に転送されます。TRAP の直後に続く命令のアドレスは、%o7 に格納
されます。%o7 の値は、変更なしで TRET のリターン・アドレスとして使用す
るのに適しています。TRAP のリターン・アドレスの規則は、BSR/CALL とは異
なります。これは TRAP に遅延スロットがないからです。
STATUS レジスタの IE ビットが 0 の場合でも、TRAP 命令は、指定されたト
ラップ・ハンドラに制御を渡します。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
遅延スロットの処理 :
TRAP は遅延スロットを含みません。TRAP 直後の命令は、ターゲット・トラッ
プ・ハンドラ前に実行されません。TRET が使用するリターン・アドレスは、
TRAP 直後の命令を指します。
命令のフォーマット :
i6v
命令フィールド :
IMM6 = 6 ビットの即値
15
14
13
12
11
10
9
8
7
6
0
1
1
1
1
0
0
1
0
0
96
5
4
3
2
1
0
IMM6
Altera Corporation
命令セット
TRET
トラップからのリターン
処理 :
PC ← (RA << 1)
STATUS ← ISTATUS
アセンブラの構文 :
TRET %ra
例:
TRET %o7 ; トラップからリターン
説明 :
制御は (RA << 1) で指定するアドレスに渡されます。TRAP が %o7 に書き込ん
だ値は、変更なしでリターン・アドレスとして使用するのに適しています。
条件コード :
フラグ : 影響なし
N
V
Z
C
-
-
-
-
命令のフォーマット :
Rw
命令フィールド :
A = オペランド RA のレジスタ・インデックス
15
14
13
12
11
10
9
8
7
6
5
0
1
1
1
1
1
0
1
1
1
0
Altera Corporation
4
3
2
1
0
A
97
命令
セ ット
ISTATUS の値は、STATUS レジスタにコピーされます (CWP は STATUS の一
部であるため、
これによってトラップ前のレジスタ・ウィンドウが復旧されます)。
2
命令セット
WRCTL
コントロール・レジスタの書き込み
処理 :
CTLk ← RA
アセンブラの構文 :
WRCTL %rA
例:
前に PFX がない :
WRCTL %g7 ; STATUS レジスタに %g7 を書き込み
NOP ; 必須
前に PFX がある :
PFX 1
WRCTL %g7 ; ISTATUS レジスタに %g7 を書き込み
説明 :
前に PFX がない :
RA の値を STATUS レジスタにロードします。STATUS へ WRCTL を行なった
場合は、次の命令を NOP にする必要があります。
前に PFX がある :
K で指定するマシン・コントロール・レジスタに RA の値を書き込みます。マ
シン・コントロール・レジスタとそのインデックスについては、プログラマの
モデルを参照してください。
条件コード :
WRCTL のターゲットが STATUS レジスタである場合、条件コード・フラグは、
ビット RA [3..0] からの WRCTL 処理によって直接的に設定されます。他の
WRCTL ターゲット・レジスタの場合、条件コードに影響がありません。
命令のフォーマット :
Rw
命令フィールド :
A = オペランド RA のレジスタ・インデックス
15
14
13
12
11
10
9
8
7
6
5
0
1
1
1
1
1
1
1
0
0
0
98
4
3
2
1
0
A
Altera Corporation
命令セット
XOR
ビットごとの排他的論理和
処理 :
前に PFX がない :
RA ← RA ⊕ ΡΒ
前に PFX がある :
RA ← RA ⊕ (0x00.00 : K : IMM5)
アセンブラの構文 :
前に PFX がない :
XOR %rA,%rB
前に PFX がある :
PFX %hi(const)
XOR %rA,%lo(const)
例:
前に PFX がない :
XOR %g0,%g1 ; %g1 と %g0 の XOR
前に PFX がある :
PFX %hi(16383)
XOR %o0,%lo(16383) ; %o0 と 16383 の XOR
説明 :
前に PFX がない :
RA の個々のビットと RB の対応するビットで排他的な論理和を行ない、結果を
RA に格納します。
前に PFX がある :
プリフィックスがあった場合、K レジスタ (11 ビット ) の内容と IMM5 (5 ビッ
ト ) を連結した即値の定数で、RB オペランドが置換されます。この 16 ビット
値は 32 ビットにゼロ拡張され、ビットごとに RA との排他的論理和が行なわれ
ます。この結果は RA に書き込まれます。
条件コード :
フラグ :
V
Z
C
∆
-
∆
-
命令
セ ット
N
2
N: 結果ビット 31
Z: 結果がゼロの場合に設定、それ以外の場合はクリア
命令のフォーマット :
RR、Ri5
命令フィールド :
A = オペランド RA のレジスタ・インデックス
B = オペランド RB のレジスタ・インデックス
IMM5 = 5 ビットの即値
PFX (RR) が前にない場合
15
14
13
12
11
10
0
1
0
0
0
1
9
8
7
6
5
4
3
B
2
1
0
1
0
A
PFX (Ri5) が前にある場合
15
14
13
12
11
10
0
1
0
0
0
1
Altera Corporation
9
8
7
IMM5
6
5
4
3
2
A
99
Notes:
100
Altera Corporation
索引
®
Numerics
A
ABS 命令 36
ADD 命令 37
ADDI 命令 38
AND 命令 39
ANDN 命令 40
ASR 命令 41
ASRI 命令 42
B
BGEN 命令 43
BR 命令 44
BSR 命令 45
C
CALL 命令 46
CLR_IE(%ctl8) 8
CMP 命令 47
Altera Corporation
CMPI 命令 48
CWP 操作の命令 26
E
EXT16D 命令 49
EXT16S 命令 50
EXT8D 命令 51
EXT8S 命令 52
F
FILL16 命令 53
FILL8 命令 54
3
G
GNU コンパイラ / アセンブラ擬似命令 34
I
索引
16 ビット値の符号拡張 77
16 ビット・データをメモリに格納 ( 算出した
ハーフ・ワード・ポインタ・アドレス ) 85
16 ビット・データをメモリに格納 ( スタック・
アドレッシング・モード ) 91
16 ビット・データをメモリに格納 ( 静的ハー
フ・ワード・オフセット・アドレス ) 86
32 ビット・データをメモリに格納 84
32 ビット・データをメモリに格納 ( スタック・
アドレッシング・モード ) 90
32 ビット・データをメモリに格納 ( ポインタ・
アドレッシング・モード ) 89
5/16 ビットの即値 12
8 ビット値の符号拡張 78
8 ビット・データをメモリに格納 ( 算出したバ
イト・ポインタ・アドレス ) 87
8 ビット・データをメモリに格納 ( スタック・
アドレッシング・モード ) 92
8 ビット・データをメモリに格納 ( 静的バイ
ト・オフセット・アドレス ) 88
ISTATUS (%ctl1) 7
J
JMP 命令 55
K
K レジスタ 5
L
LD 命令 56
LDP 命令 57
LDS 命令 58
LSL 命令 59
LSLI 命令 60
LSR 命令 61
LSRI 命令 62
M
MOV 命令 63
MOVHI 命令 64
MOVI 命令 65
MSTEP 命令 66
MULL 命令 67
101
索引
N
X
NEG 命令 68
Nios CPU の概要 1
Nios CPU ブロック図 25
NOT 命令 69
XOR 命令 99
ア
O
アドレス処理モード 12
インタラプト・イネーブル (IE) 6
インタラプト・プライオリティ (IPRI) 6
OR 命令 70
カ
P
外部ハードウェア・インタラプト・ソース 19
カレント・ウィンドウ・ポインタ (CWP) 6
簡単な例外ハンドラ 23
簡単な例外ハンドラと複雑な例外ハンドラ 23
キャリー付で右ローテーション 75
キャリー付で左ローテーション 74
繰り上げなしの加算 37
減算 93
コントロール・レジスタ 5
コントロール・レジスタの書き込み 98
PFX 命令 71
R
RDCTL 命令 72
RESTORE 命令 73
RLC 命令 74
RRC 命令 75
S
SAVE 命令 76
SET_IE (%ctl9) 8
SEXT16 命令 77
SEXT8 命令 78
SKP0 命令 79
SKP1 命令 80
SKPRnz 命令 81
SKPRz 命令 82
SKPS 命令 83
ST 命令 84
ST16d 命令 85
ST16s 命令 86
ST8d 命令 87
ST8s 命令 88
STP 命令 89
STS 命令 90
STS16s 命令 91
STS8s 命令 92
SUB 命令 93
SUBI 命令 94
SWAP 命令 95
T
TRAP 命令 96
TRET 命令 97
W
WRCTL 命令 98
WVALID (%ctl2) 7
102
サ
サブルーチンの呼び出し 46
サブルーチンへの分岐 45
算術演算後のジャンプ 55
算術反転 68
条件コードでスキップ 83
条件コード・フラグ 7
条件命令 17
乗算 67
乗算ステップ 66
ステータスの維持 : ISTATUS レジスタ 23
制御レジスタの読み込み 72
絶対ジャンプ命令 17
全幅レジスタ -- オフセットによる間接値 15
相対分岐命令 16
即値の移動 65
即値の加算 38
即値の減算 94
即値の比較 48
即値を上位のハーフ・ワードに移動 64
即値を使用した左論理シフト 60
即値を使用した右算術シフト 42
即値を使用した右論理シフト 62
ソフトウェア例外 (TRAP 命令 ) 21
タ
トラップからのリターン 97
Altera Corporation
索引
トラップ命令 17
ナ
ンタ・アドレッシング・モード ) 57
メモリ・アクセスの概要 8
内部例外ソース 19
ヤ
ハ
呼び出し側のレジスタ・ウィンドウの復旧 73
呼び出し側のレジスタ・ウィンドウの保存 76
ラ
リターン・アドレス 23
例外 18
例外処理の概要 18
例外処理の手順 21
例外ベクタ・テーブル 18
レジスタが 0 の場合スキップ 82
レジスタが 0 以外の場合スキップ 81
レジスタの概要 2
レジスタ・ウィンドウのアンダフロー 19
レジスタ・ウィンドウのオーバフロー 20
レジスタ・ウィンドウの使用方法 22
レジスタ・グループ 3
レジスタ・ハーフ・ワードのスワップ 95
レジスタ・ビットが 0 の場合スキップ 79
レジスタ・ビットが 1 の場合スキップ 80
レジスタ間の移動 63
論理反転 69
3
索引
ハーフ・ワードの抽出 ( 静的 ) 50
ハーフ・ワードの抽出 ( 動的 ) 49
ハーフ • ワードの埋め込み 53
バイトの埋め込み 54
バイト抽出 ( 静的 ) 52
バイト抽出 ( 動的 ) 51
パイプラインの実装 25
パイプラインの処理 25
汎用レジスタ 2
比較 47
左論理シフト 59
ビットごとの排他的論理和 99
ビットごとの論理 OR 70
ビットごとの論理演算子 AND 39
ビットごとの論理演算子 AND NOT 40
ビットの生成 43
表記の詳細 27
複雑な例外ハンドラ 24
部分幅レジスタ -- オフセットによる間接値 15
部分幅レジスタ -- 間接値 14
プリフィックス 71
プログラマのモデル 4
プログラムフロー・コントロール 16
プログラム・カウンタ 5
分岐 44
分岐遅延スロット 26
マ
右算術シフト 41
右論理シフト 61
無条件のトラップ 96
命令セット 2
命令のフォーマット 28
メモリ ( またはペリフェラル ) からの読み込み
9
メモリ ( またはペリフェラル ) への書き込み
10
メモリから 32 ビット・データをロード 56
メモリから 32 ビット・データをロード ( ス
タック・アドレッシング・モード ) 58
メモリから 32 ビット・データをロード ( ポイ
Altera Corporation
103
Notes:
104
Altera Corporation