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
© Copyright 2024 ExpyDoc