16.02.2013 Aufrufe

24531904_j

24531904_j

24531904_j

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

インテル ® Itanium ® アーキテクチャ・<br />

ソフトウェア・デベロッパーズ・<br />

マニュアル<br />

第 3 巻:命令セット・リファレンス<br />

Revision 2.1<br />

2002 年 10 月<br />

資料番号 : 245319-004J


【輸出規制に関する告知と注意事項】<br />

本資料に掲載されている製品のうち、外国為替および外国為替管理法に定める戦略物資等または役務に該当するものについては、<br />

輸出または再輸出する場合、同法に基づく日本政府の輸出許可が必要です。また、米国産品である当社製品は日本からの輸出また<br />

は再輸出に際し、原則として米国政府の事前許可が必要です。<br />

【資料内容に関する注意事項】<br />

・ 本ドキュメントの内容を予告なしに変更することがあります。<br />

・インテルでは、この資料に掲載された内容について、市販製品に使用した場合の保証あるいは特別な目的に合うことの保証等は、<br />

いかなる場合についてもいたしかねます。また、このドキュメント内の誤りについても責任を負いかねる場合があります。<br />

・インテルでは、インテル製品の内部回路以外の使用は責任を負いません。また、外部回路の特許についても関知いたしません。<br />

・本書の情報はインテル製品を使用できるようにする目的でのみ記載されています。<br />

インテルは、製品について「取引条件」で提示されている場合を除き、インテル製品の販売や使用に関して、いかなる特許または<br />

著作権の侵害をも含み、あらゆる責任を負わないものとします。<br />

・いかなる形および方法によっても、インテルの文書による許可なく、この資料の一部またはすべてを複写することは禁じられて<br />

います。<br />

インテル、Intel ロゴ、Itanium、MMX、Pentium、Intel386、Intel486 は、アメリカ合衆国およびその他の国における Intel<br />

Corporation またはその子会社の商標または登録商標です。<br />

© 2000-2003 Intel Corporation. 無断での引用、転載を禁じます。<br />

* その他の社名、製品名などは、一般に各社の商標または登録商標です。


目次<br />

第 I 部 : インテル ® Itanium ® 命令セットの説明<br />

1 本書について . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:1<br />

1.1 「第 1 巻:アプリケーション・アーキテクチャ」の概要 . . . . . . . . . . . . . . . . . . . . . .3:1<br />

1.1.1 第 1 部:アプリケーション・アーキテクチャ・ガイド . . . . . . . . . . . . . . .3:1<br />

1.1.2 第 2 部:インテル ® Itanium ® アーキテクチャの最適化ガイド . . . . . . . . . .3:2<br />

1.2 「第 2 巻:システム・アーキテクチャ」の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:2<br />

1.2.1 第 1 部:システム・アーキテクチャ・ガイド . . . . . . . . . . . . . . . . . . . . . .3:2<br />

1.2.2 第 2 部:システム・プログラマーズ・ガイド . . . . . . . . . . . . . . . . . . . . . .3:3<br />

1.2.3 付録 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:4<br />

1.3 「第 3 巻:命令セット・リファレンス」の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:4<br />

1.3.1 第 1 部:インテル ® Itanium ® 命令セットの説明 . . . . . . . . . . . . . . . . . . . .3:4<br />

1.3.2 第 2 部:IA-32 命令セットの説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:4<br />

1.4 用語の定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:5<br />

1.5 関連文献 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:5<br />

1.6 改訂履歴 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:6<br />

2 命令リファレンス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:9<br />

2.1 命令リファレンス・ページに関する規則 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:9<br />

2.2 命令の説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:10<br />

3 擬似コード関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:251<br />

4 命令形式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:263<br />

4.1 形式の要約 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:264<br />

4.2 A ユニット命令エンコーディング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:271<br />

4.2.1 整数 ALU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:271<br />

4.2.2 整数比較 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:273<br />

4.2.3 マルチメディア . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:276<br />

4.3 I ユニット命令エンコーディング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:280<br />

4.3.1 マルチメディアおよび変数シフト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:280<br />

4.3.2 整数シフト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:285<br />

4.3.3 ビット・テスト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:287<br />

4.3.4 その他の I ユニット命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:288<br />

4.3.5 GR/BR 移動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:290<br />

4.3.6 GR/ プレディケート /IP 移動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:291<br />

4.3.7 GR/AR 移動 (I ユニット ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:291<br />

4.3.8 符号拡張 / ゼロ拡張 / ゼロ・インデックス計算 . . . . . . . . . . . . . . . . . . . .3:292<br />

4.4 M ユニット命令エンコーディング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:293<br />

4.4.1 ロードとストア . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:293<br />

4.4.2 ライン・プリフェッチ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:308<br />

4.4.3 セマフォ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:309<br />

4.4.4 FR 設定 / 取得 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:310<br />

4.4.5 スペキュレーションおよびアドバンスド・ロード・チェック . . . . . . . .3:311<br />

4.4.6 キャッシュ / 同期 /RSE/ALAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:312<br />

4.4.7 GR/AR 移動 (M ユニット ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:313<br />

4.4.8 GR/CR 移動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:314<br />

4.4.9 その他の M ユニット命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:315<br />

iii


4.4.10 システム / メモリ管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:316<br />

4.4.11 Nop/Hint (M- ユニット ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:321<br />

4.5 B ユニット命令エンコーディング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:321<br />

4.5.1 分岐 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:321<br />

4.5.2 分岐予測と nop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:325<br />

4.5.3 その他の B ユニット命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:327<br />

4.6 F ユニット命令エンコーディング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:328<br />

4.6.1 算術演算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:330<br />

4.6.2 並列浮動小数点 Select . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:331<br />

4.6.3 比較と分類 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:331<br />

4.6.4 近似 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:333<br />

4.6.5 最小値 / 最大値と並列比較 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:334<br />

4.6.6 マージと論理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:335<br />

4.6.7 変換 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:335<br />

4.6.8 ステータス・フィールド操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:336<br />

4.6.9 その他の F ユニット命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:337<br />

4.7 X ユニット命令エンコーディング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:337<br />

4.7.1 その他の X ユニット命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:337<br />

4.7.2<br />

4.7.3<br />

ロング型即値 64 移動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:339<br />

ロング型分岐 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:339<br />

4.7.4 Nop/Hint (X ユニット ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:340<br />

4.8 即値の生成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:341<br />

5 リソースと依存関係のセマンティックス. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:343<br />

5.1 リソースの読み込みおよび書き込み . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:343<br />

5.2 依存関係とシリアル化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:343<br />

5.3 リソースと依存関係の表の形式についての注意事項 . . . . . . . . . . . . . . . . . . . . . . . 3:344<br />

5.3.1 特別なケースの命令規則 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:346<br />

5.3.2 RAW の依存関係表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:346<br />

5.3.3 WAW の依存関係表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:354<br />

5.3.4 WAR の依存関係表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:358<br />

5.3.5 依存関係表で参照される規則のリスト . . . . . . . . . . . . . . . . . . . . . . . . . 3:359<br />

5.4 サポートに関する表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:361<br />

第 II 部 : IA-32 命令セットの説明<br />

1 IA-32 基本命令リファレンス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:371<br />

1.1 追加のインテル ® Itanium ® アーキテクチャ・フォルト . . . . . . . . . . . . . . . . . . . . . 3:371<br />

1.2 IA-32 命令リファレンス・ページの読み方 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:372<br />

1.2.1 IA-32 命令フォーマット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:372<br />

1.2.2 操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:375<br />

1.2.3 影響を受けるフラグ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:378<br />

1.2.4 影響を受ける FPU フラグ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:378<br />

1.2.5 保護モード例外 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:379<br />

1.2.6 実アドレス・モード例外 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:379<br />

1.2.7 仮想 8086 モード例外 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:380<br />

1.2.8 浮動小数点例外 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:380<br />

1.3 IA-32 基本命令リファレンス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:380<br />

2 IA-32 MMX ® テクノロジ命令リファレンス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:781<br />

3 IA-32 ストリーミング SIMD 拡張命令リファレンス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:847<br />

3.1 IA-32 ストリーミング SIMD 拡張命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:847<br />

iv


図<br />

3.2 インテル ® アーキテクチャのストリーミング SIMD 拡張命令について . . . . . . . . .3:847<br />

3.3 SIMD (Single Instruction, Multiple Data) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:848<br />

3.4 新しいデータ・タイプ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:848<br />

3.5 ストリーミング SIMD 拡張命令レジスタ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:849<br />

3.6 拡張された命令セット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:849<br />

3.6.1 命令グループの概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:850<br />

3.7 IEEE 規格への適合性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:857<br />

3.7.1 実数体系 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:858<br />

3.7.2 NaN の操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:862<br />

3.8 データ・フォーマット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:864<br />

3.8.1 メモリのデータ・フォーマット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:864<br />

3.8.2 ストリーミング SIMD 拡張命令レジスタのデータ・フォーマット . . . .3:864<br />

3.9 命令フォーマット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:865<br />

3.10 命令プリフィックス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:866<br />

3.11 予約済みの動作とソフトウェアの互換性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:867<br />

3.12 表記法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:867<br />

3.13 SIMD 整数拡張命令セット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:977<br />

3.14 キャッシュ制御命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:999<br />

第 I 部 : インテル ® Itanium ® 命令セットの説明<br />

2-1 ポインタの加算 .......................................................................................................................3:12<br />

2-2 スタック・フレーム ................................................................................................................3:13<br />

2-3 br.ctop および br.cexit の操作..................................................................................................3:20<br />

2-4 br.wtop および br.wexit の操作................................................................................................3:21<br />

2-5 デポジットの例 .......................................................................................................................3:45<br />

2-6 デポジットの例 (zero_form)....................................................................................................3:45<br />

2-7 抽出の例 ..................................................................................................................................3:48<br />

2-8 浮動小数点マージでの符号否定操作.......................................................................................3:72<br />

2-9 浮動小数点マージでの符号操作 ..............................................................................................3:72<br />

2-10 浮動小数点マージでの符号および指数操作 ............................................................................3:72<br />

2-11 浮動小数点左ミックス ............................................................................................................3:75<br />

2-12 浮動小数点右ミックス ............................................................................................................3:75<br />

2-13 浮動小数点左右ミックス.........................................................................................................3:75<br />

2-14 浮動小数点パック....................................................................................................................3:86<br />

2-15 浮動小数点並列マージでの符号否定操作................................................................................3:99<br />

2-16 浮動小数点並列マージでの符号操作.......................................................................................3:99<br />

2-17 浮動小数点並列マージでの符号および指数操作.....................................................................3:99<br />

2-18 浮動小数点スワップ ..............................................................................................................3:121<br />

2-19 浮動小数点スワップの左否定................................................................................................3:121<br />

2-20 浮動小数点スワップの右否定................................................................................................3:121<br />

2-21 浮動小数点左符号拡張 ..........................................................................................................3:123<br />

2-22 浮動小数点右符号拡張 ..........................................................................................................3:123<br />

2-23 getf.exp の機能......................................................................................................................3:126<br />

2-24 getf.sig の機能 .......................................................................................................................3:126<br />

2-25 ミックスの例.........................................................................................................................3:152<br />

2-26 Mux1 の操作 (8 ビット要素 ).................................................................................................3:170<br />

v


3-3 パックド操作.........................................................................................................................3:850<br />

3-4 スカラ操作 ............................................................................................................................3:850<br />

3-5 パック・データのシャッフル操作 ........................................................................................3:852<br />

3-6 アンパック・ハイ操作 ..........................................................................................................3:852<br />

3-7 アンパック・ロー操作 ..........................................................................................................3:853<br />

3-8 2 進実数体系 .........................................................................................................................3:858<br />

3-9 2 進浮動小数点フォーマット ................................................................................................3:859<br />

3-10 実数と NaNs..........................................................................................................................3:861<br />

3-11 メモリ内の 4 つのパックド浮動小数点データ ( アドレス 1000H) ........................................3:864<br />

表<br />

第 I 部 : インテル ® Itanium ® 命令セットの説明<br />

2-1 命令リファレンス・ページの説明 ............................................................................................3:9<br />

2-2 命令リファレンス・ページの字体に関する規則.......................................................................3:9<br />

2-3 レジスタ・ファイルの表記法..................................................................................................3:10<br />

2-4 C シンタックスの相違点.........................................................................................................3:10<br />

2-5 命令記述コードに含まれていない一般の条件 ........................................................................3:10<br />

2-6 分岐のタイプ...........................................................................................................................3:17<br />

2-7 分岐有無予測ヒント ................................................................................................................3:21<br />

2-8 シーケンシャル・プリフェッチ・ヒント................................................................................3:22<br />

2-9 分岐キャッシュ割り当て解除ヒント.......................................................................................3:22<br />

2-10 ロング型分岐のタイプ ............................................................................................................3:26<br />

2-11 IP 相対分岐有無予測ヒント.....................................................................................................3:28<br />

2-12 間接分岐有無予測ヒント.........................................................................................................3:28<br />

2-13 重要度ヒント...........................................................................................................................3:28<br />

2-14 ALAT クリアのためのコンプリータ........................................................................................3:31<br />

2-15 比較タイプ ..............................................................................................................................3:34<br />

2-16 通常および unc の比較での 64 ビット比較関係......................................................................3:35<br />

2-17 並列比較での 64 ビット比較関係............................................................................................3:35<br />

2-18 32 ビット比較での即値範囲....................................................................................................3:37<br />

2-19 比較交換のメモリ・サイズ .....................................................................................................3:40<br />

2-20 比較交換セマフォのタイプ .....................................................................................................3:40<br />

2-21 czx の結果の範囲.....................................................................................................................3:43<br />

2-22 pc ニーモニックの指定値........................................................................................................3:50<br />

2-23 sf ニーモニックの値................................................................................................................3:50<br />

2-24 浮動小数点クラスの関係.........................................................................................................3:57<br />

2-25 浮動小数点のクラス ................................................................................................................3:57<br />

2-26 浮動小数点の比較タイプ.........................................................................................................3:60<br />

2-27 浮動小数点の比較関係 ............................................................................................................3:60<br />

2-28 フェッチおよび加算セマフォのタイプ ...................................................................................3:67<br />

2-29 浮動小数点並列比較の結果 .....................................................................................................3:91<br />

2-30 浮動小数点並列比較関係.........................................................................................................3:91<br />

2-31 ヒントの即値.........................................................................................................................3:128<br />

2-32 sz コンプリータ ....................................................................................................................3:134<br />

2-33 ロード・タイプ .....................................................................................................................3:134<br />

2-34 ロードのヒント .....................................................................................................................3:136<br />

2-35 fsz コンプリータ ...................................................................................................................3:139<br />

2-36 FP ロードのタイプ................................................................................................................3:139<br />

vii


2-37 lftype のニーモニック値 ........................................................................................................ 3:146<br />

2-38 lfhint のニーモニック値 ......................................................................................................... 3:147<br />

2-39 BR への移動の分岐有無予測ヒント ...................................................................................... 3:156<br />

2-40 間接レジスタ・ファイルのニーモニック ............................................................................. 3:162<br />

2-41 8 ビット要素に対する Mux による置換 ................................................................................ 3:170<br />

2-42 パックでの飽和の上下限値 ................................................................................................... 3:175<br />

2-43 並列加算の飽和コンプリータ ............................................................................................... 3:177<br />

2-44 並列加算における飽和の制限 ............................................................................................... 3:177<br />

2-45 並列の比較関係 ..................................................................................................................... 3:185<br />

2-46 pmpyshr のシフト・オプション............................................................................................ 3:190<br />

2-47 並列減算の飽和コンプリータ ............................................................................................... 3:201<br />

2-48 並列減算での飽和の上下限値 ............................................................................................... 3:201<br />

2-49 ストアのタイプ ..................................................................................................................... 3:225<br />

2-50 ストアのヒント ..................................................................................................................... 3:226<br />

2-51 xsz ニーモニック値............................................................................................................... 3:231<br />

2-52 通常および unc タイプのビット判定での関係...................................................................... 3:234<br />

2-53 並列タイプのビット判定での関係 ........................................................................................ 3:234<br />

2-54 通常および unc タイプの Nat 判定での関係 ......................................................................... 3:237<br />

2-55 並列タイプの NaT 判定での関係 .......................................................................................... 3:237<br />

2-56 メモリ交換のサイズ.............................................................................................................. 3:243<br />

3-1 擬似コード関数 ..................................................................................................................... 3:251<br />

4-1 命令タイプと実行ユニット・タイプの関係..........................................................................3:263<br />

4-2 テンプレート・フィールドのエンコーディングと命令スロットのマッピング.................... 3:264<br />

4-3 メジャー・オペコードの割り当て ........................................................................................ 3:265<br />

4-4 命令形式の要約 ..................................................................................................................... 3:266<br />

4-5 命令フィールドのカラー・キー............................................................................................ 3:268<br />

4-6 命令フィールド名 .................................................................................................................3:268<br />

4-7 特殊な命令表記 ..................................................................................................................... 3:269<br />

4-8 整数 ALU の 2 ビット +1 ビット・オペコード拡張............................................................... 3:271<br />

4-9 整数 ALU の 4 ビット +2 ビット・オペコード拡張............................................................... 3:271<br />

4-10 整数比較オペコード拡張....................................................................................................... 3:273<br />

4-11 整数比較即値オペコード拡張 ............................................................................................... 3:274<br />

4-12 マルチメディア ALU の 2 ビット +1 ビット・オペコード拡張............................................. 3:276<br />

4-13 マルチメディア ALU サイズ 1 の 4 ビット +2 ビット・オペコード拡張 .............................. 3:277<br />

4-14 マルチメディア ALU サイズ 2 の 4 ビット +2 ビット・オペコード拡張 .............................. 3:277<br />

4-15 マルチメディア ALU サイズ 4 の 4 ビット +2 ビット・オペコード拡張 .............................. 3:278<br />

4-16 マルチメディアおよび変数シフトの 1 ビット・オペコード拡張 ......................................... 3:280<br />

4-17 マルチメディア・オペコード 7 のサイズ 1 の 2 ビット・オペコード拡張 .......................... 3:280<br />

4-18 マルチメディア・オペコード 7 のサイズ 2 の 2 ビット・オペコード拡張 .......................... 3:281<br />

4-19 マルチメディア・オペコード 7 のサイズ 4 の 2 ビット・オペコード拡張 .......................... 3:281<br />

4-20 変数シフト・オペコード 7 の 2 ビット・オペコード拡張.................................................... 3:282<br />

4-21 整数シフト / ビット・テスト /NaT テストの 2 ビット・オペコード拡張.............................3:285<br />

4-22 デポジットのオペコード拡張 ............................................................................................... 3:285<br />

4-23 ビット・テストのオペコード拡張 ........................................................................................ 3:287<br />

4-24 その他の I ユニットの 3 ビット・オペコード拡張................................................................ 3:288<br />

4-25 その他の I ユニットの 6 ビット・オペコード拡張................................................................ 3:289<br />

4-26 各種の I ユニット 1 ビット・オペコード拡張....................................................................... 3:289<br />

4-27 BR への移動命令の分岐有無予測ヒント・コンプリータ...................................................... 3:290<br />

4-28 整数ロード / ストア / セマフォ /FR 取得の 1 ビット・オペコード拡張................................ 3:293<br />

4-29 浮動小数点ロード / ストア / ペア・ロード /FR 設定の 1 ビット・オペコード拡張.............. 3:293<br />

4-30 整数ロード / ストアのオペコード拡張.................................................................................. 3:294<br />

viii


4-31 整数ロード +Reg のオペコード拡張 .....................................................................................3:294<br />

4-32 整数ロード / ストア +Imm のオペコード拡張 .......................................................................3:295<br />

4-33 セマフォ /FR 取得のオペコード拡張 ....................................................................................3:296<br />

4-34 浮動小数点ロード / ストア /Lfetch のオペコード拡張...........................................................3:297<br />

4-35 浮動小数点ロード /Lfetch+Reg のオペコード拡張................................................................3:297<br />

4-36 浮動小数点ロード / ストア /Lfetch+Imm のオペコード拡張..................................................3:298<br />

4-37 浮動小数点ペア・ロード /SR 設定のオペコード拡張 ...........................................................3:298<br />

4-38 浮動小数点ペア・ロード +Imm のオペコード拡張 ...............................................................3:299<br />

4-39 ロード・ヒント・コンプリータ ............................................................................................3:299<br />

4-40 ストア・ヒント・コンプリータ ............................................................................................3:299<br />

4-41 ライン・プリフェッチ・ヒント・コンプリータ...................................................................3:308<br />

4-42 オペコード 0 のシステム / メモリ管理の 3 ビット・オペコード拡張...................................3:316<br />

4-43 オペコード 0 のシステム / メモリ管理の 4 ビット +2 ビット・オペコード拡張 ..................3:316<br />

4-44 オペコード 1 のシステム / メモリ管理の 3 ビット・オペコード拡張...................................3:317<br />

4-45 オペコード 1 のシステム / メモリ管理の 6 ビット・オペコード拡張...................................3:317<br />

4-46 各種の M ユニット 1 ビット・オペコード拡張 .....................................................................3:321<br />

4-47 IP 相対分岐タイプ.................................................................................................................3:321<br />

4-48 間接 / その他の分岐のオペコード拡張 ..................................................................................3:322<br />

4-49 間接分岐タイプ .....................................................................................................................3:322<br />

4-50 間接リターン分岐タイプ.......................................................................................................3:323<br />

4-51 シーケンシャル・プリフェッチ・ヒント・コンプリータ ....................................................3:323<br />

4-52 分岐有無ヒント・コンプリータ ............................................................................................3:323<br />

4-53 間接コール有無ヒント・コンプリータ .................................................................................3:324<br />

4-54 分岐キャッシュ割り当て解除ヒント・コンプリータ............................................................3:324<br />

4-55 間接予測 /nop のオペコード拡張 ..........................................................................................3:326<br />

4-56 分岐重要度ヒント・コンプリータ ........................................................................................3:326<br />

4-57 IP 相対分岐有無予測ヒント・コンプリータ .........................................................................3:326<br />

4-58 間接分岐有無予測ヒント・コンプリータ..............................................................................3:327<br />

4-59 その他の浮動小数点の 1 ビット・オペコード拡張 ...............................................................3:328<br />

4-60 オペコード 0 のその他の浮動小数点の 6 ビット・オペコード拡張......................................3:329<br />

4-61 オペコード 1 のその他の浮動小数点の 6 ビット・オペコード拡張......................................3:329<br />

4-62 逆数近似の 1 ビット・オペコード拡張 .................................................................................3:330<br />

4-63 浮動小数点ステータス・フィールド・コンプリータ............................................................3:330<br />

4-64 浮動小数点算術の 1 ビット・オペコード拡張 ......................................................................3:330<br />

4-65 固定小数点の積和および選択のオペコード拡張...................................................................3:330<br />

4-66 浮動小数点比較のオペコード拡張 ........................................................................................3:332<br />

4-67 浮動小数点分類の 1 ビット・オペコード拡張 ......................................................................3:332<br />

4-68 各種の M ユニット 1 ビット・オペコード拡張 .....................................................................3:337<br />

4-69 その他の X ユニットの 3 ビット・オペコード拡張 ..............................................................3:338<br />

4-70 その他の X ユニットの 6 ビット・オペコード拡張 ..............................................................3:338<br />

4-71 ロング型移動の 1 ビット・オペコード拡張..........................................................................3:339<br />

4-72 ロング型分岐タイプ ..............................................................................................................3:339<br />

4-73 各種の M ユニット 1 ビット・オペコード拡張 .....................................................................3:340<br />

4-74 即値の生成 ............................................................................................................................3:341<br />

5-1 依存関係のセマンティックスのコード .................................................................................3:345<br />

5-2 リソース別に編成した RAW の依存関係 ..............................................................................3:347<br />

5-3 リソース別に編成した WAW の依存関係 .............................................................................3:354<br />

5-4 リソース別に編成した WAR の依存関係 ..............................................................................3:358<br />

5-5 命令クラス ............................................................................................................................3:361<br />

ix


第 II 部 : IA-32 命令セットの説明<br />

1-1 +rb、+rw、+rd に対応するレジスタのコード化 ................................................................... 3:373<br />

1-2 例外のニーモニック、名称、およびベクタ番号................................................................... 3:379<br />

1-3 浮動小数点例外のニーモニックおよび名称..........................................................................3:380<br />

1-4 CPUID 命令から返される情報 ..............................................................................................3:440<br />

1-5 EDX レジスタに返される機能フラグ.................................................................................... 3:441<br />

1-6 FPATAN の 0 と NaN ............................................................................................................ 3:514<br />

1-7 FPREM の 0 と NaN.............................................................................................................. 3:516<br />

1-8 FPREM1 の 0 と NaN............................................................................................................ 3:519<br />

1-9 FSUB の 0 と NaN.................................................................................................................3:548<br />

1-10 FSUBR の 0 と NaN .............................................................................................................. 3:551<br />

1-11 FYL2X の 0 と NaN ............................................................................................................... 3:565<br />

1-12 FYL2XP1 の 0 と NaN...........................................................................................................3:567<br />

1-13 IDIV オペランド .................................................................................................................... 3:570<br />

1-14 INT クラス............................................................................................................................. 3:586<br />

1-15 LAR ディスクリプタの有効性............................................................................................... 3:623<br />

1-16 LEA のアドレスとオペランド・サイズ.................................................................................3:628<br />

1-17 リピート条件......................................................................................................................... 3:714<br />

3-1 実数表記法 ............................................................................................................................ 3:859<br />

3-2 非正規化処理......................................................................................................................... 3:861<br />

3-3 NaN オペランドの演算の結果............................................................................................... 3:863<br />

3-4 ストリーミング SIMD 拡張命令データ・タイプの精度と範囲 ............................................. 3:864<br />

3-5 実数と NaN のエンコーディング ......................................................................................... 3:865<br />

3-6 プリフィックスを持つストリーミング SIMD 拡張命令の動作 ............................................. 3:866<br />

3-7 プリフィックスを持つ SIMD 整数命令の動作 ...................................................................... 3:866<br />

3-8 プリフィックスを持つキャッシュ制御命令の動作 ............................................................... 3:867<br />

3-9 ストリーミング SIMD 拡張命令の命名規則..........................................................................3:868<br />

x


第 I 部 : インテル ® Itanium ®<br />

命令セットの説明


本書について 1<br />

インテル ® Itanium ® アー キテ ク チ ャ は、明示的に並列化を記述した命令、プ レ デ ィ ケ ー シ ョ<br />

ン、スペキュレーシ ョ ンをはじめとする多く の斬新な機能を組み合わせたユニークなアー<br />

キテ クチャである。 このアーキテ クチャ は、 種々のサーバやワ ー クステーシ ョ ン市場で増<br />

大しつづけるパフ ォ ーマンス要求に対応でき る よ う に、すぐれたスケー ラ ビ リ テ ィ を備え<br />

ている。 Itanium アーキテクチャは、 EPIC (Explicitly Parallel Instrucution Computing: 明示的<br />

並列命令コ ン ピ ュ ー テ ィ ン グ ) と呼ばれる新しいプロセッサ・アーキテクチャ ・テクノロ<br />

ジを応用した革新的な 64 ビッ ト命令セット ・アーキテクチャ (ISA) を特長と している。<br />

Itanium アーキテクチャの主な特長は、 IA-32 命令セ ッ ト と の互換性である。<br />

本書では、 アプ リ ケ ー シ ョ ン ・ プ ロ グ ラ マ と シ ス テ ム ・ プ ロ グ ラ マが使用で き る プ ロ グ ラ<br />

ミ ン グ環境、 リ ソ ー ス、 命令セ ッ ト について包括的に説明す る。 ま た、 Itanium アーキテ<br />

クチャの機能を利用してコ ー ド を最適化する方法について も説明する。<br />

1.1 「第 1 巻:アプリケーション・アーキテクチャ」の概要<br />

第 1 巻では、 Itanium ベースのアプリケーション ・アーキテクチャについて定義する。 こ<br />

れには、 アプリケーション・レベルのリソース、 プログラミング環境、 IA-32 アプ リ ケー<br />

ション・インタフェースの説明が含まれる。 また、 この巻では、 高性能のソフトウェアの<br />

作成に使用 さ れる最適化手法について も 説明す る。<br />

1.1.1 第 1 部:アプリケーション・アーキテクチャ・ガイド<br />

第 1 章「本書について」。『インテル ® Itanium ® アーキテクチャ ・ ソフ ト ウェア・デベロッ<br />

パーズ ・ マニュアル』 全3 巻の概要を示す。<br />

第 2 章 「インテル ® Itanium ® アー キ テ ク チ ャ の概要」。 アーキテクチャの概要を示す。<br />

第 3 章 「実行環境」。 アプリ ケーシ ョ ンによ って使用される Itanium アーキテクチャ ・ レ<br />

ジスタ ・ セッ ト と、 メモリ構成モデルについて説明する。<br />

第 4 章「アプリケーション・プログラミング・ モデル」。 Itanium ベースのアプリ ケーシ ョ<br />

ン命令の動作の概要を示す。 命令は、 関連する機能ご と に ま と められている。<br />

第 5 章 「浮動小数点プ ロ グ ラ ミ ング ・ モデル」。 Itanium アー キテ ク チ ャ の浮動小数点アー<br />

キテクチャについて説明する ( 整数の乗算を含む )。<br />

第 6 章 「Itanium ® ベースのシステム環境での IA-32 アプ リ ケーシ ョ ン実行モデル」。 アプ<br />

リケーション・プログラマの観点から、 Itanium ベースのシステム環境での IA-32 命令の<br />

動作について説明す る。<br />

第 3 巻 : 本書について 3:1


1.1.2 第 2 部:インテル ® Itanium ® アーキテクチャの最適化ガイド<br />

第 1 章 「最適化ガ イ ド について」。 「最適化ガ イ ド 」 の概要を示す。<br />

第 2 章「インテル ® Itanium ® ア ー キ テ ク チ ャ のプ ロ グ ラ ミ ン グの概要」。 Itanium アーキテ<br />

ク チ ャ のアプ リ ケ ー シ ョ ン ・ プ ロ グ ラ ミ ン グ環境の概要を示す。<br />

第 3 章 「メモリ参照」。 コン ト ロール ・ スペキュ レーシ ョ ン とデータ ・ スペキュ レーシ ョ<br />

ン に関連する機能お よ び最適化について説明す る。<br />

第 4 章 「プレディ ケーショ ン、 コン ト ロール ・ フロー、 命令ス ト リ ーム」。 プレディ ケー<br />

シ ョ ン、 コ ン ト ロ ール ・ フ ロ ー、 分岐ヒ ン ト に関連する最適化機能について説明する。<br />

第 5 章 「ソフ ト ウェアによるパイプライン化と ループのサポー ト」。 ソフ ト ウェアによる<br />

パ イ プ ラ イ ン処理を使 っ てル ー プを最適化する方法について詳し く 説明す る。<br />

第 6 章 「浮動小数点アプ リ ケ ー シ ョ ン」 。 浮動小数点アプ リ ケ ー シ ョ ンの現時点でのパ<br />

フ ォ ー マンス上の制約 と 、 これら の制約に対処する機能について説明する。<br />

1.2 「第 2 巻:システム・アーキテクチャ」の概要<br />

第 2 巻では、 Itanium ベースのシステム ・ アーキテクチャについて定義する。 これには、<br />

システム ・ レベルのリ ソース、 プログラ ミング・ステー ト、 割り込みモデル、 およびプロ<br />

セッサ・ファームウェア・インタフェースの説明が含まれる。 また、 この巻には、 高性能<br />

のシステム ・ ソフ ト ウェアの作成に使用できる便利なシステム・プログラマーズ・ガイ ド<br />

が含まれている。<br />

1.2.1 第 1 部:システム・アーキテクチャ・ガイド<br />

第 1 章「本書について」。『インテル ® Itanium ® アーキテクチャ ・ ソフ ト ウェア・デベロッ<br />

パーズ ・ マニュアル』 全3 巻の概要を示す。<br />

第 2 章「Itanium ® ベースのシステム環境」。 IA-32 または Itanium アーキテクチャのアプリ<br />

ケ ー シ ョ ン を動作 さ せ る Itanium アーキテクチャのオペレーティ ング ・ システムの実行を<br />

サポ ー ト する ために設計 さ れた環境の概要を示す。<br />

第 3 章 「システム状態とプログラ ミ ング ・ モデル」。 オペレーテ ィ ング ・ システムだけが<br />

認識で き る、 Itanium アーキテクチャの状態について説明する。<br />

第 4 章 「アド レス指定と保護」。 仮想ア ド レスか ら物理ア ド レ スへの変換、 仮想別名の定<br />

義、 物理ア ド レ ス指定、 お よ び メ モ リ ・ ア ク セス順序の指定な ど の用途で、 オペレ ー テ ィ<br />

ン グ ・ シ ス テ ムが使用で き る リ ソ ー ス を定義す る。<br />

第 5 章「割り込み」。 Itanium ア ー キテ ク チ ャ に基づ く プ ロ セ ッ サに よ っ て生成 さ れる すべ<br />

ての割 り 込みについて説明す る。<br />

第 6 章 「レジスタ ・ スタ ッ ク ・ エンジン」。 ス タ ッ ク さ れた一部の汎用レ ジ ス タ ・ フ ァ イ<br />

ル (GR32 ~ GR127) のセーブ と リ ス ト アを自動的に行う、 アーキテクチャ上の機構につい<br />

て説明する。<br />

第 7 章「デバッ グ とパフ ォ ーマンス監視」。Itanium アーキテクチャで使用できる、パフォー<br />

マンス監視およびデバッグ用リ ソースの概要を示す。<br />

第 8 章 「割 り 込みベ ク タ の説明」。 すべての割り込みベクタを示す。<br />

3:2 第 3 巻 : 本書について


第 9 章「IA-32 割 り 込みベ ク タ の説明」。Itanium ベースのシステム環境での IA-32 命令セ ッ<br />

ト の実行中に発生す る、 IA-32 の例外、 割 り 込み、 イ ン タ ー セプ ト を示す。<br />

第 10 章「Itanium ® アーキテクチャのオペレーテ ィ ング・システムと IA-32 アプ リ ケーシ ョ<br />

ンの相互作用モデル」。 Itanium ベースのオペレーテ ィ ング ・ システムの観点から、 Itanium<br />

ベースのシステム環境での IA-32 命令の動作を定義する。<br />

第 11 章「プロセッサのアブストラクション・レイヤ」。 プロセ ッサのモデルに依存する機<br />

能を抽象化する フ ァ ー ム ウ ェ ア ・ レ イヤについて説明する。<br />

1.2.2 第 2 部:システム・プログラマーズ・ガイド<br />

第 1 章「システム・プログラマーズ・ガイドについて」。 「システム ・アーキテクチャ ・ ガ<br />

イド」 の第2 部の概要を示す。<br />

第 2 章 「マルチプ ロ セ ッ サの コ ヒ ー レ ン シ と 同期化」。 マルチプロセッシング同期化プリ<br />

ミティブと Itanium アーキテクチャ ・ メモリ ・ アクセス順序モデルについて説明する。<br />

第 3 章 「割り込みとシ リアル化」。 プロセ ッサが割り込みの前後の実行をシ リ アル化する<br />

方法 と 、 割 り 込みが行われる と き、 ど の状態が維持され、 下位のシス テム ・ コ ー ド に対し<br />

て使用可能になるかについて説明する。<br />

第 4 章 「 コ ン テ キス ト 管理」。 オペレーティング・システムがItanium アーキテクチャ ・ レ<br />

ジ ス タ の内容 と 状態を維持す る方法について説明する。 ま た、 こ の章では、 割 り 込み、 シ<br />

ス テ ム ・ コ ー ル、 コ ン テ キス ト ・ ス イ ッ チの発生時にス ピル / フィルしなければならない<br />

レジスタの数を減らすためのシステム ・ アーキテ クチャ上の機構について も説明する。<br />

第 5 章 「メモリ管理」。 各種のメモ リ 管理手法について説明する。<br />

第 6 章 「コン ト ロールおよびデータ ・ スペキュレーシ ョ ンのランタイム ・ サポー ト」。 コ<br />

ン ト ロールおよびデータ・スペキュレーシ ョ ンに必要なオペレーティング・システムのサ ポー トについて説明する。<br />

第 7 章 「命令エ ミ ュ レ ー シ ョ ン と その他の フ ォ ル ト ・ ハン ド ラ」。 Itanium アーキテクチャ<br />

のオペレーテ ィ ング ・ システムがサポー ト する、 各種の命令エミ ュ レーシ ョ ン ・ハン ド ラ<br />

について説明す る。<br />

第 8 章 「浮動小数点シ ス テ ム ・ ソ フ ト ウ ェ ア」。 Itanium アーキテクチャに基づく プロセッ<br />

サが浮動小数点数値例外を処理す る方法 と 、 ソ フ ト ウ ェ ア ・ ス タ ッ ク が IEEE-754 への完<br />

全な適合を可能にする方法について説明する。<br />

第 9 章 「IA-32 アプ リ ケーシ ョ ンのサポー ト 」。 IA-32 アプ リ ケーシ ョ ンが、 Itanium アー<br />

キテクチャのオペレーテ ィ ング ・ システムに対して要求するサポー ト について説明する。<br />

第 10 章 「外部割り込みアーキテクチャ」。 外部割 り 込みアー キ テ ク チ ャ について説明す<br />

る。 特に、 非同期外部割 り 込みの処理を ソ フ ト ウ ェ ア的に制御する方法に焦点を当て る。<br />

第 11 章 「I/O アーキテクチャ」。 I/O アーキテクチャについて説明する。 特に、 プラ ッ ト<br />

フォームの問題と、 既存のIA-32 I/O ポ ー ト 空間のサポ ー ト に焦点を当てる。<br />

第 12 章「パフォーマンス監視のサポート」。 パ フ ォ ー マン ス監視アー キ テ ク チ ャ について<br />

説明す る。 特に、 Itanium アーキテクチャのオペレーテ ィング ・ システムに対してどのよ<br />

う なサポ ー ト が要求 さ れる かに焦点を当て る。<br />

第 13 章 「フ ァ ー ム ウ ェ アの概要」。 フ ァ ームウ ェア ・ モデルの概要を示し、 各種のフ ァ ー<br />

ムウェア ・ レイヤ (PAL、 SAL、 EFI) によって、 プロセッサおよびシステムの初期化とオ<br />

ペレーテ ィ ング ・ システムのブー ト を可能にする方法について説明する。<br />

第 3 巻 : 本書について 3:3


1.2.3 付録<br />

付録 A 「コー ドの例」。 OS ブー ト ・ フローのコー ドの例を示す。<br />

1.3 「第 3 巻:命令セット・リファレンス」の概要<br />

第 3 巻は、Itanium アーキテクチャ命令セッ ト と IA-32 命令セ ッ ト に関する総合的な リ フ ァ<br />

レンスである。 命令のフォーマッ ト とエンコーディングも記載されている。<br />

1.3.1 第 1 部:インテル ® Itanium ® 命令セットの説明<br />

第 1 章「本書について」。『インテル ® Itanium ® アーキテクチャ ・ ソフ ト ウェア・デベロッ<br />

パーズ ・ マニュアル』 全3 巻の概要を示す。<br />

第 2 章 「命令 リ フ ァ レ ン ス」。 すべての Itanium 命令について詳し く 説明す る。 命令はア<br />

センブリ言語ニーモニッ クでアルファベッ ト順に示す。<br />

第 3 章 「擬似 コ ー ド 関数」。 Itanium 命令の動作の定義に使用 さ れる、 疑似 コ ー ド 関数の表<br />

を示す。<br />

第 4 章 「命令形式」。 エン コ ー デ ィ ン グ と 命令フ ォ ー マ ッ ト について説明する。<br />

第 5 章「リソースと依存関係のセマンティックス」。Itanium アーキテクチャに基づく プロ<br />

セ ッ サ向けの コ ー ド を生成す る際に適用される依存関係の規則について ま と めてい る。<br />

1.3.2 第 2 部:IA-32 命令セットの説明<br />

第 1 章 「IA-32 基本命令 リ フ ァ レ ン ス」。 すべての IA-32 基本命令について詳し く 説明す<br />

る。 命令はアセンブリ言語ニーモニッ クでアルファベッ ト順に示す。<br />

第 2 章 「IA-32 インテル ® MMX ® テクノロジ命令リファレンス」。 マルチメディア ・ アプ<br />

リケーションのパフォーマンスの向上を目的とする、すべてのIA-32 インテルMMX テク<br />

ノ ロジ命令について詳し く 説明する。命令はアセンブ リ 言語ニーモニ ッ クでアルフ ァベッ<br />

ト順に示す。<br />

第 3 章 「IA-32 ストリーミング SIMD 拡張命令 リ フ ァ レ ン ス」。 マルチメディア ・ アプリ<br />

ケーシ ョ ンのパフ ォ ーマンスの向上を目的とする、 すべての IA-32 スト リーミングSIMD<br />

拡張命令について詳し く 説明する。命令はアセンブ リ 言語ニー モニ ッ ク でアルフ ァ ベ ッ ト<br />

順に示す。<br />

3:4 第 3 巻 : 本書について


1.4 用語の定義<br />

以下の定義は Itanium アーキテクチャに関連する用語についてであり、 本書ではこの定義<br />

を用いる。<br />

命令セット・アーキテクチャ (ISA) - アプリ ケーシ ョ ン-レベルおよびシステム・ レベル<br />

のリソースを定義する。 これらのリソースには、 命令とレジスタが含まれる。<br />

Itanium アーキテクチャ - 64 ビ ッ ト 命令機能、 新しいパ フ ォ ー マン ス強化機能、 IA-32 命<br />

令セ ッ ト のサポ ー ト を備えた新しい ISA。<br />

IA-32 アーキテクチャ - インテルの32 ビッ トおよび16 ビッ ト ・アーキテクチャ。 『IA-32<br />

インテル ® アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル』 を参照。<br />

Itanium ベースのシステム環境 - IA-32 および Itanium アー キテ ク チ ャ ・ ベー スの両方の<br />

コ ー ド を実行で き る オペレ ー テ ィ ン グ ・ シ ス テ ム環境。<br />

IA-32 システム環境 - 『IA-32 インテル ® アーキテクチャ ・ ソフ ト ウェア ・ デベロッパー ズ・マニュアル』 で定義されているオペレ ー テ ィ ング・システム特権環境およ び リ ソ ー ス。<br />

リソースには、 仮想ページング、 コント ロール・ レジスタ、 デバッグ、 パフォーマンス ・<br />

モニタ、 マシ ン ・ チ ェ ッ ク 、 お よ び一連の特権命令が含 ま れる。<br />

Itanium アーキテクチャ・ベースのファームウェア - PAL (Processor Abstraction Layer) お<br />

よびSAL (System Abstraction Layer)。<br />

PAL (Processor Abstraction Layer) - プロセッサのモデルに依存するプロセッサ機能を抽<br />

象化す る、 フ ァ ー ム ウ ェ ア ・ レ イ ヤ。<br />

SAL (System Abstraction Layer) - プロセ ッサのモデルに依存するシステム機能を抽象化<br />

する、 ファームウェア ・ レイヤ。<br />

1.5 関連文献<br />

以下の資料は、 イ ン テル ・ デベロ ッ パ ・ サ イ ト http://developer.intel.com からダウンロー ド<br />

できる。<br />

•『インテル ® Itanium ® 2 プロセッサ・リファレンス・マニュアル-ソフトウェアの開<br />

発と最適化』 -この資料は、 インテル ® Itanium ® 2 プロセッサ (Itanium アーキテク<br />

チャに基づく第2 世代のプ ロセ ッ サ ) に搭載されているモデル固有のアー キテ ク<br />

チ ャ機能について説明する。 ( 資料番号 251110J)<br />

•『Intel ® Itanium ® Processor Reference Manual for Software Development』 -この資<br />

料は、 インテル Itanium プロセッサ (Itanium アーキテクチャに基づく最初のプロセッ<br />

サ ) に搭載されているモデル固有のアー キテ ク チャ機能について説明する。 ( 資料番<br />

号 245320)<br />

•『IA-32 インテル ® アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル』 -<br />

この資料は、 インテルの32 ビ ッ ト ・ ア ー キテ ク チ ャ の解説書である ( 資料番号 :<br />

245470J、 245471J、 245472J)。<br />

•『インテル ® Itanium ® アーキテクチャ・ソフトウェア規則およびランタイム・アーキ<br />

テクチャ・ガイド』 - この資料は、 Itanium アーキテクチャのオペレーティング ・ シ<br />

ス テ ム上でのプ ロ グ ラ ムの コ ンパ イ ル、 リ ン ク 、 お よ び実行に必要な一般的な情報<br />

を定義している ( 資料番号 : 245358J)。<br />

•『Itanium ® Processor Family System Abstraction Layer Specification』 - この資料は、<br />

Itanium アーキテクチャのシステム向けのプラッ ト フォーム ・ ファ ームウェアを開発<br />

す る ための必要条件を定義す る ( 資料番号 : 245359)。<br />

•『Extensible Firmware Interface Specification』- こ の資料は、 オペレ ー ティ ング・ システ<br />

ムと プラッ ト フォ ーム・ ファ ームウェアの間のインターフェイスの新しいモデルを定義する。<br />

第 3 巻 : 本書について 3:5


1.6 改訂履歴<br />

改訂日付 改訂番号 内容<br />

2002 年 10 月 2.1 新しい fc.i 命令の追加 ( 第 1 巻:第 1 部の 4.4.6.1 項、4.4.6.2 項。第 2 巻:<br />

第 1 部の 4.3.3 項、4.4.1 項、4.4.5 項、4.4.7 項、5.5.2 項、7.1.2 項。第 2 巻:<br />

第 2 部の 2.5 節、2.5.1 項、2.5.2 項、2.5.3 項、4.5.2.1 項。第 3 巻:第 1 部の<br />

2.2 節、第 3 章、4.1 節、4.4.6.5 項、4.4.10.10 項 )<br />

新しいアトミック・オペレーション ld16、st16、cmp8xchg16 の追加 ( 第 1<br />

巻:第 1 部の 3.1.8 項、3.1.8.6 項、4.4.1 項、4.4.2 項、4.4.3 項。第 2 巻:第 1<br />

部の 4.5 節。第 3 巻:第 1 部の 2.2 節、第 3 章、5.3.2 項、5.4 節 )<br />

スペキュレーティブ・ロード時の自発的な NaT 生成の追加 ( 第 1 巻:第 1 部の<br />

3.1.8 項、3.1.8.6 項、4.4.1 項、4.4.2 項、4.4.3 項。第 2 巻:第 1 部の 4.5 節。<br />

第 3 巻:第 1 部の 2.2 節、第 3 章、5.3.2 項、5.4 節 )<br />

新しいヒント命令の追加 ( 第 3 巻:第 1 部の 2.2 節 )<br />

lfetch.fault 命令のフォルト処理セマンティックスの追加 ( 第 3 巻:第 1 部の<br />

2.2 節 )<br />

ファームウェア・インターフェイス・テーブル内で複数の PAL_A_SPEC およ<br />

び PAL_B エントリを使用できるようにする機能の追加 ( 第 2 巻:第 1 部の<br />

11.1.6 項 )<br />

最少状態退避エリアへの BR1 の追加とアライメントの説明 ( 第 2 巻:第 1 部<br />

の 11.3.2.3 項、11.3.3 項 )<br />

新しい PAL プロシージャである PAL_LOGICAL_TO_PHYSICAL と<br />

PAL_CACHE_SHARED_INFO 追加 ( 第 2 巻:第 1 部の 11.9.1 項 )<br />

PAL_MC_ERROR_INFO への Op フィールドの追加 ( 第 2 巻:第 1 部の 11.9<br />

節 )<br />

新しいエラー終了状態の追加 ( 第 2 巻:第 1 部の 11.2.2.2 項 )<br />

パフォーマンス・カウンタの標準化の追加 ( 第 2 巻:第 1 部の 7.2.3 項、11.6<br />

節 )<br />

アトミック・オペレーションと自発的据え置きに関する CPUID[4] の変更 ( 第<br />

1 巻:第 1 部の 3.1.11 項 )<br />

PAL_FREQ_RATIOS の変更 ( 第 2 巻:第 1 部の 11.2.2 項 )<br />

PAL_VERSION の変更 ( 第 2 巻:第 1 部の 11.9 節 )<br />

PAL_CACHE_INFO ストア・ヒントの変更 ( 第 2 巻:第 1 部の 11.9 節 )<br />

PAL_MC_RESUME の変更 ( 第 2 巻:第 1 部の 11.3.3 項、11.4 節 )<br />

IA_32_Exception ( デバッグ ) IIPA の変更の説明 ( 第 2 巻:第 1 部の 9.2 節 )<br />

alloc 命令のプレディケート動作の説明 ( 第 1 巻:第 1 部の 4.1.2 項。第 3 巻:第 1<br />

部の 2.2 節 )<br />

ITC クロックの説明 ( 第 1 巻:第 1 部の 3.1.8.10 項。第 2 巻:第 1 部の 3.3.4.2<br />

項。第 2 巻:第 2 部の 10.5.5 項 )<br />

インターバル・タイム・カウンタ (ITC) フォルトの説明 ( 第 2 巻:第 1 部の<br />

3.3.2 項 )<br />

割り込みコントロール・レジスタの説明 ( 第 2 巻:第 1 部の 3.3.5 項 )<br />

コンテキスト・スイッチおよび割り込み生成時のフリーズ・ビット機能の説明<br />

( 第 2 巻:第 1 部の 7.2.1 項、7.2.2 項、7.2.4.1 項、7.2.4.2 項 )<br />

PAL_BUS_GET/SET_FEATURES の説明 ( 第 2 巻:第 1 部の 11.9.3 項 )<br />

PAL_CACHE_FLUSH の説明 ( 第 2 巻:第 1 部の 11.9 節 )<br />

リカバリ・チェック時のキャッシュ状態の説明 ( 第 2 巻:第 1 部の 11.2 節 )<br />

PALE_INIT 終了状態の説明 ( 第 2 巻:第 1 部の 11.4.2 項 )<br />

プロセッサ状態のパラメータの説明 ( 第 2 巻:第 1 部の 11.4.2.1 項 )<br />

リセット時のファームウェア・アドレス空間の説明 ( 第 2 巻:第 1 部の 11.1 節<br />

)<br />

PAL の PMI、AR.ITC、PMD レジスタの値の説明 ( 第 2 巻:第 1 部の 11.3 節、<br />

11.5.1 項、11.5.2 項 )<br />

PAL に対する無効な引数の説明 ( 第 2 巻:第 1 部の 11.9.2.4 項 )<br />

itr/itc 命令の説明 ( 第 3 巻:第 1 部の 2.2 節 )<br />

3:6 第 3 巻 : 本書について


改訂日付 改訂番号 内容<br />

2001 年 12 月 2.0 第 1 巻 :<br />

ALAT にヒットする ld.c のフォルトの説明 (4.4.5.3.1 項 )<br />

IA-32 に関連する変更 (6.2.5.4 項、6.2.3 項、6.2.4 項、6.2.5.3 項 )<br />

ロード命令の変更 (4.4.1 項 )<br />

第 2 巻 :<br />

クラス pr-writers-int の説明 ( 表 A-5)<br />

PAL_MC_DRAIN の説明 (4.4.6.1 項 )<br />

VHPT ウォークと順方向の進行の変更 (4.1.1.2 項 )<br />

IA-32 の IBR/DBR の一致条件の説明 (7.1.1 項 )<br />

ISR の図の変更 (8-5 ページ、8-26 ページ、8-33 ページ、8-36 ページ )<br />

PAL_CACHE_FLUSH の戻り引数の変更 - 新しいステータス戻り引数の追加<br />

(11.8.3 項 )<br />

PAL セルフ・テスト制御および PAL_A プロシージャの必要条件の変更 - 新し<br />

い引数、図、必要条件の追加 (11.2 節 )<br />

PAL_CACHE_FLUSH の説明 ( 第 11 章 )<br />

非スペキュレーティブな参照の説明 (4.4.6 項 )<br />

RID および推奨ページ・サイズの使用の説明 (4.1 節 )<br />

VHPT 読み出しのアトミック性の説明 (4.1 節 )<br />

IIP および WC フラッシュの説明 (4.4.5 項 )<br />

RSE および PMC の誤植の訂正 (6.4 節 )<br />

DV テーブルの変更 (A.4 節 )<br />

メモリ属性の変更 - 新しい必要条件の追加 (4.4 節 )<br />

WC/UC 別名参照の MCA の変更 (4.4.1 項 )<br />

バス・ロック・デプレケーション - DCR の 'lc' ビットの動作の変更 (3.3.4.1 項、<br />

10.6.8 項、11.8.3 項 )<br />

PAL_PROC_GET/SET_FEATURES の変更 - プロセッサ・モデル固有の機能の<br />

制御を可能にする呼び出しの拡張 (11.8.3 項 )<br />

分割 PAL_A アーキテクチャの変更 (11.1.6 項 )<br />

簡易バリア同期の説明 (13.4.2 項 )<br />

制限付きスペキュレーションの説明 - ハードウェアで生成されたスペキュレー<br />

ティブな参照の追加 (4.4.6 項 )<br />

PAL メモリのアクセスと制限の説明 (11.9 節 )<br />

PAL_MC_ERROR_INFO からの INIT 発生時の PSP の有効性の説明 (11.8.3 項 )<br />

スペキュレーション属性の説明 (4.4.6 項 )<br />

PAL_A FIT エントリ、PAL_VM_TR_READ、PSP、PAL_VERSION の説明<br />

(11.8.3 項、11.3.2.1 項 )<br />

TLB 検索の説明 (4.1 節 )<br />

IA-32 に関連する変更 (10.3 節、10.3.2 項、10.3.2 項、10.3.3.1 項、10.10.1 項 )<br />

IPSR.ri と ISR.ei の変更 ( 表 3-2、3.3.5.1 項、3.3.5.2 項、5.5 節、8.3 節、2.2<br />

節 )<br />

第 3 巻 :<br />

IA-32 CPUID の説明 (5-71 ページ )<br />

extract、deposit、alloc 命令の図の変更 (2.2 節 )<br />

RCPPS、RCPSS、RSQRTPS、RSQRTSS の説明 (7.12 節 )<br />

IA-32 関連の変更 (5.3 節 )<br />

tak、tpa の変更 (2.2 節 )<br />

第 3 巻 : 本書について 3:7


改訂日付 改訂番号 内容<br />

2000 年 7 月 1.1 第 1 巻 :<br />

プロセッサ・シリアル番号機能の削除 ( 第 3 章 )<br />

命令の依存関係に対する例外の説明 (3.4.3 項 )<br />

第 2 巻 :<br />

ITIR 内の「予約フィールド」に関する説明 ( 第 3 章 )<br />

IA-32 命令を実行する場合は、命令およびデータ変換を有効にすることが必要<br />

( 第 3 章、4 章、10 章 )<br />

FCR/FDR マッピング、および RFI の後の PSR.ri 値の説明 ( 第 3 章、4 章 )<br />

データ依存関係の順序付けに関する説明<br />

順不同 IPI 発行の許可 ( 第 4 章、5 章 )<br />

IIM 内の EFLAG フィールドの内容の変更 (9-24 ページ )<br />

PAL_CHECK 呼び出しおよび PAL_INIT 呼び出し - 終了状態の変更 ( 第 11 章 )<br />

PAL_CHECK プロセッサ状態パラメータの変更 ( 第 11 章 )<br />

PAL_BUS_GET/SET_FEATURES 呼び出し -2 つの新規ビットの追加 ( 第 11 章 )<br />

PAL_MC_ERROR_INFO 呼び出し - 呼び出し機能を強化および簡素化して、マ<br />

シン・チェックに関する情報をより多く提供 ( 第 11 章 )<br />

PAL_ENTER_IA_32_Env 呼び出しの変更 - 入力パラメータで入力順序を表現。<br />

この呼び出しを行う前に、SAL は、すべての IA-32 レジスタを正常に初期化す<br />

ることが必要 ( 第 11 章 )<br />

PAL_CACHE_FLUSH- 新規の cache_type 引数の追加 ( 第 11 章 )<br />

PAL_SHUTDOWN-PAL 呼び出しのリストからの削除 ( 第 11 章 )<br />

メモリ順序付けの変更の説明 ( 第 13 章 )<br />

依存関係違反テーブルの説明 ( 付録 A)<br />

第 3 巻 :<br />

fmix 命令を記載したページの図の修正 ( 第 2 章 )<br />

ITIR 内の「予約」フィールドの説明 ( 第 2 章、3 章 )<br />

bundle/ 命令グループ内における alloc/loadrs/flushrs 命令の配置状態の変更 ( 第<br />

2 章、4 章 )<br />

IA-32 JMPE 命令を記載したページの誤植の訂正 (5-238 ページ )<br />

プロセッサ・シリアル番号機能の削除 ( 第 5 章 )<br />

2000 年 1 月 1.0 ドキュメントの最初のリリース<br />

3:8 第 3 巻 : 本書について


命令リファレンス 2<br />

本章では、 Itanium ® 命令の機能を、 アセンブ リ 言語ニー モニ ッ ク のアルフ ァ ベ ッ ト 順に説<br />

明する。<br />

2.1 命令リファレンス・ページに関する規則<br />

命令 リ フ ァ レ ン ス ・ ペー ジ は、 表 2-1 に示すよ う に 6 つの項目に分かれてい る。 最初の 3<br />

つの項目はすべての命令リ フ ァ レンス ・ページにあり、 最後の 1 項目は必要な場合に限ら<br />

れる。表 2-2 に、命令 リ フ ァ レ ン ス・ペー ジ に使用 さ れている印刷字体に関する規則を示す。<br />

表 2-1. 命令リファレンス・ページの説明<br />

項名 内容<br />

書式 アセンブリ言語シンタックス、命令のタイプ、エンコーディング書式<br />

説明 命令の機能説明<br />

操作 C コード表記による命令の機能説明<br />

FP 例外 IEEE 浮動小数点トラップ<br />

割り込み 命令によって発生する割り込みの優先順位付きリスト<br />

シリアル化 シリアル化動作またはシリアル化の要件<br />

表 2-2. 命令リファレンス・ページの字体に関する規則<br />

字体 意味<br />

普通 ( 書式の項 ) アセンブリ言語ニーモニックの必須文字<br />

イタリック ( 書式の項 ) 説明の項に示されている範囲内の有効な値で置き換えるべきアセンブリ言<br />

語フィールド名<br />

code ( 操作の項 ) 命令の動作を表す C コード<br />

code_italic ( 操作の項 ) 書式の項に示されているイタリック表記フィールドに対応するアセンブリ<br />

言語フィールド名<br />

書式の項では、 レ ジ ス タ ・ ア ド レ ス は、 表 2-3 の第 3 欄に示されているアセンブ リ ・ ニー<br />

モニッ ク ・ フ ィ ール ド 名を使用して指定する。 プレデ ィ ケー ト を定義する命令について<br />

は、 説明の項では、 修飾プレデ ィ ケー ト が偽 (FALSE) である と きにアーキテ クチャ上の<br />

状態を変更す る命令以外は、修飾プ レ デ ィ ケ ー ト は真 (TRUE) である ものとみなしている。<br />

該当す る場合、 修飾プ レ デ ィ ケ ー ト の判定は操作の項に記載されてい る。<br />

操作の項では、 reg[addr].field の表記を使用してレ ジ ス タ のア ド レ ス を指定す る。 ア<br />

クセスされるレジスタ ・ ファイルを reg に指定し、 その値は表 2-3 の第 2 欄か ら選択す<br />

る。 addr フィールドには、 アセンブリ言語フィールド名またはレジスタ・ニーモニック<br />

でレジスタ・アド レスを指定する。 レジスタのリネームが行われる汎用レジスタ、 浮動小<br />

数点レ ジ ス タ、 プ レ デ ィ ケ ー ト ・ レ ジ ス タ の各フ ァ イ ルについては、 addr はリネームさ<br />

れる前のレジスタ ・アド レスであり、 リネームは示していない。 field オプシ ョ ンには、<br />

レジスタ内で命名されているビット ・ フィールドを指定する。 field がない場合は、 レ<br />

ジ ス タ のすべての フ ィ ー ル ド がア ク セス さ れる。 唯一の例外は、 GR[addr] 表記が使用 さ<br />

れる場合の、 汎用レジスタのデータ ・ フ ィ ールド (NaT ビッ トを除く 64 ビッ ト ) を参照す<br />

る場合である。 操作の項に示されている コ ー ド と ANSI C と のシ ン タ ッ ク ス上の相違を表<br />

2-4 に示す。<br />

第 3 巻 : 命令リファレンス 3:9


表 2-3. レジスタ・ファイルの表記法<br />

レジスタ・ファイル C 表記<br />

アセンブリ・<br />

ニーモニック<br />

アプリケーション・レジスタ AR ar<br />

分岐レジスタ BR b<br />

コントロール・レジスタ CR cr<br />

操作の項では、 各命令の実行セマン テ ィ ッ ク スのみが指定さ れた コ ー ド を記載してお り 、<br />

命令フ ェ ッ チに関連す る動作 ( フ ェ ッ チ中に発生した割 り 込みや フ ォ ル ト ) は記載してい<br />

ない。 割 り 込みの項では、 命令フ ェ ッ チ ま たは RSE による強制ロードによって発生する<br />

フォルトはリストしていない。特定の一般のフォルトや処理を発生させるコードは、操作<br />

の項の コ ー ド に含まれていない。 これら のフ ォ ル ト や処理は表 2-5 に記載している。 シン<br />

グル・ ステップ ・ ト ラ ップはすべての命令に適用される もので、 割り込みの項では リ ス ト<br />

していない。<br />

2.2 命令の説明<br />

本章の以降では、 Itanium 命令を説明する。<br />

間接<br />

アクセス<br />

CPU 識別レジスタ CPUID cpuid Y<br />

データ・ブレークポイント・レジスタ DBR dbr Y<br />

命令ブレークポイント・レジスタ IBR ibr Y<br />

データ TLB トランスレーション・キャッシュ DTC n/a<br />

データ TLB トランスレーション・レジスタ DTR dtr Y<br />

浮動小数点レジスタ FR f<br />

汎用レジスタ GR r<br />

命令 TLB トランスレーション・キャッシュ ITC n/a<br />

命令 TLB トランスレーション・レジスタ ITR itr Y<br />

保護キー・レジスタ PKR pkr Y<br />

パフォーマンス監視設定レジスタ PMC pmc Y<br />

パフォーマンス・モニタ・データ・レジスタ PMD pmd Y<br />

プレディケート・レジスタ PR p<br />

リージョン・レジスタ RR rr Y<br />

表 2-4. C シンタックスの相違点<br />

シンタックス 機能<br />

{msb:lsb}, {bit} ビット・フィールド指定子。これが変数に付加されると、"msb" で指定される最上位<br />

ビットから "lsb" で指定される最下位ビットまでの、"msb" および "lsb" ビットを含む<br />

ビット・フィールドを表す。"msb" と "lsb" とが等しい場合は、単一ビットがアクセス<br />

される。2 番目の形式は単一ビットを表す。<br />

u>, u>=, u, u>>= 符号なし右シフト。最下位ビット位置からゼロがシフト・インされる。<br />

u+ 符号なし加算。両オペランドは符号なしとして扱われ、ゼロ拡張される。<br />

u* 符号なし乗算。両オペランドは符号なしとして扱われる。<br />

表 2-5. 命令記述コードに含まれていない一般の条件<br />

条件 処理<br />

現在のフレームの外部にあるレジスタの読み取り。 未定義の値が返される ( フォルトではない )<br />

バンクされた汎用レジスタへのアクセス (GR 16 ~<br />

GR 31)。<br />

PSR.bn で指定された GR バンクがアクセスされる。<br />

PSR.ss のセット。 シングル・ステップ・トラップが発生する。<br />

3:10 第 3 巻 : 命令リファレンス


add<br />

add ─ 加算 (Add)<br />

書式 : (qp) addr1 = r2 , r3 register_form A1<br />

(qp) addr1 = r2 , r3 , 1 plus1_form, register_form A1<br />

(qp) addr1 = imm, r3 擬似オペ コ ー ド<br />

(qp) addsr1 = imm14 , r3 imm14_form A4<br />

(qp) addlr1 = imm22 , r3 imm22_form A5<br />

説明 : 2 つのソース ・ オペラン ド ( お よ び任意指定の定数 1) が加算 さ れ、 その結果が GR r1 に<br />

格納 さ れる。 register_form では、 第 1 オペラン ド は GR r2 であり、 imm14_form では、 第<br />

1 オペラ ン ド は符号拡張 さ れた imm14 エンコ ーデ ィ ング ・ フ ィ ール ド で与えられ、<br />

imm22_form では、 第 1 オペラ ン ド は符号拡張 さ れた imm22 エンコ ーディ ング ・ フ ィ ール<br />

ドで与えられる。 imm22_form では、 GR r3 は GR 0、 1、 2、 3 しか指定で き ない。<br />

plus1_form は register_form でのみ使用可能である ( ただし、 即値を調整する こ と に よ り、<br />

即値形式で も 同じ結果が得られる )。<br />

即値形式の擬似オペ コ ー ド では、 即値オペラ ン ド と r3 の値の大き さ に基づいて、<br />

imm14_form または imm22_form を選択する。<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1 );<br />

}<br />

割り込み : 無効操作フ ォ ル ト<br />

if (register_form) // register form<br />

tmp_src = GR[r 2 ];<br />

else if (imm14_form) // 14-bit immediate form<br />

tmp_src = sign_ext(imm 14 , 14);<br />

else // 22-bit immediate form<br />

tmp_src = sign_ext(imm 22, 22);<br />

tmp_nat = (register_form ? GR[r 2 ].nat : 0);<br />

if (plus1_form)<br />

GR[r 1 ] = tmp_src + GR[r 3 ] + 1;<br />

else<br />

GR[r 1 ] = tmp_src + GR[r 3 ];<br />

GR[r 1].nat = tmp_nat || GR[r 3].nat;<br />

第 3 巻 : 命令リファレンス 3:11


addp4 ─ ポインタの加算 (Add Pointer)<br />

addp4<br />

書式 : (qp) addp4 r 1 = r 2 , r 3 register_form A1<br />

(qp) addp4 r 1 = imm 14 , r 3 imm14_form A4<br />

説明 : 2 つのソース ・ オペラン ド が加算され、 その結果の上位 32 ビットがゼロ・ クリアされ、<br />

次に GR r 3 のビッ ト [31:30] が結果のビ ッ ト [62:61] にコピーされる。 この結果は GR r 1<br />

に格納される。 register_form では、 第 1 オペラン ド は GR r 2 であり、 imm14_form では、<br />

第 1 オペラ ン ド は符号拡張 さ れた imm 14 エンコーディ ング ・ フ ィ ール ド で与えられる。<br />

図 2-1. ポインタの加算<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1);<br />

}<br />

GR r 2:<br />

割り込み : 無効操作フ ォ ル ト<br />

32<br />

GR r 1 :<br />

tmp_src = (register_form ? GR[r 2 ] : sign_ext(imm 14 , 14));<br />

tmp_nat = (register_form ? GR[r 2].nat : 0);<br />

tmp_res = tmp_src + GR[r 3 ];<br />

tmp_res = zero_ext(tmp_res{31:0}, 32);<br />

tmp_res{62:61} = GR[r 3 ]{31:30};<br />

GR[r 1 ] = tmp_res;<br />

GR[r 1].nat = tmp_nat || GR[r 3].nat;<br />

0<br />

63 61<br />

3:12 第 3 巻 : 命令リファレンス<br />

0<br />

0<br />

GR r 3 :<br />

32<br />

+<br />

0<br />

32 30<br />

0


alloc<br />

alloc ─ スタック・フレームの割り当て (Allocate Stack Frame)<br />

書式 : (qp)alloc r 1 = ar.pfs, i, l, o, r M34<br />

説明 : 汎用レジスタ ・ スタック上に新しいスタック ・ フレームが割り当てられ、 以前のファン<br />

クションの状態 (PFS) レジスタがGR r1 に コ ピ ー される。 フ レ ー ム ・ サイ ズの変更値は<br />

即値で指定す る。 GR r1 への書き込み と、 同じ命令グループ内の以降の命令では、 新し<br />

い フ レ ー ム を使用す る。<br />

4 つのパラメ ータ i ( 入力サイ ズ )、 l ( ローカル・サイズ )、 o ( 出力サイ ズ )、 r ( ローテー<br />

ト・サイズ) でス タ ッ ク ・ フ レ ー ムの各エリ アのサ イ ズを指定す る。<br />

図 2-2. スタック・フレーム<br />

GR32<br />

sor<br />

ローカル<br />

sol<br />

フレームのサイズ (sof) は i + l + o に よ っ て決定される。 こ の命令は、 現在のレ ジ ス タ ・<br />

スタッ ク ・ フレームのサイズを増減させる場合があるので注意する。 ローカル ・ サイズ<br />

(sol) は i + l に よ っ て与え ら れる。 入力 と ロ ー カ ル と の間に は実際的な相違はない。 こ れ<br />

らは、 ローカル ・ レジスタがどのよ うに使用されるかについてのヒン トをアセンブラに<br />

示すために別々のオペラ ン ド と して指定でき る。<br />

ローテートするレジスタはスタック ・ フレーム内に収まらなければならず、 それらの数<br />

は 8 の倍数でなければな らない。 この命令で CFM.sor のサイズを変更しよ う と したと き<br />

に、 レジスタ ・ リネーム ・ベース ・ レジスタ (CFM.rrb.gr、 CFM.rrb.fr、 CFM.rrb.pr) のす<br />

べてがゼロでなかった場合は、 予約レジスタ / フィールド (Reserved Register/Field) フォル<br />

トが発生する。<br />

アセンブラでは alloc の無効なオペラン ド の組み合わせを許可していないが、 命令に無<br />

効な組み合わせのエン コ ーデ ィ ングを使用するのは可能である。 96 レジスタを超えるス<br />

タッ ク ・ フレームを割り当てよ う としたり、 スタッ ク ・ フレームよ り大きなサイズの<br />

ローテートやスタック ・ フレームより大きなサイズのローカル・エリアを割り当てよう<br />

としたり、 あるいは、 PR0 以外のプ レ デ ィ ケ ー ト 修飾を指定した り す る と 、 無効操作<br />

(Illegal Operation) フォルトが発生する。<br />

こ の命令は、 同一命令グルー プ内の最初の命令でなければな ら ない。 さ ら に、 こ の命令<br />

は、 スロ ッ ト 0 の後にス ト ッ プ情報がある テンプレ ー ト の命令ス ロ ッ ト 0 または命令ス<br />

ロッ ト 1 のいずれかに入 っ ていなければな ら ない。そ う でない場合は、結果は不定にな る。<br />

使用可能なレ ジ ス タ が足 り ないために必要なフ レ ー ムが割 り 当て ら れない場合は、 ダ ー<br />

ティなレジスタが必要なだけバッキング・ストアに書き込まれるまで、alloc はプロセッ<br />

サをス ト ールさせる。 このよ うな RSE に よ る強制的な格納に よ り 、 次に示す よ う なデー<br />

タ関連のフォル ト が発生する と きがある。<br />

第 3 巻 : 命令リファレンス 3:13<br />

出力<br />

sof


操作 : // tmp_sof, tmp_sol, tmp_sor are the fields encoded in the instruction<br />

tmp_sof = i + l + o;<br />

tmp_sol = i + l;<br />

tmp_sor = r u>> 3;<br />

check_target_register_sof(r 1, tmp_sof);<br />

if (tmp_sof u> 96 || r u> tmp_sof || tmp_sol u> tmp_sof || qp != 0)<br />

illegal_operation_fault();<br />

if (tmp_sor != CFM.sor &&<br />

(CFM.rrb.gr != 0 || CFM.rrb.fr != 0 || CFM.rrb.pr != 0))<br />

reserved_register_field_fault();<br />

alat_frame_update(0, tmp_sof - CFM.sof);<br />

rse_new_frame(CFM.sof, tmp_sof);// Make room for new registers; Mandatory<br />

// RSE stores can raise faults listed below.<br />

CFM.sof = tmp_sof;<br />

CFM.sol = tmp_sol;<br />

CFM.sor = tmp_sor;<br />

GR[r 1 ] = AR[PFS];<br />

GR[r 1 ].nat = 0;<br />

割り込み : 無効操作フ ォ ル ト デー タ NaT ページ参照フォル ト<br />

予約レ ジ ス タ / フィールド ・フォルト データ・キー・ ミス・フォルト<br />

実装されていないデータ ・アドレス ・ フォルト データ ・キー許可フォルト<br />

VHPT データ ・ フォル ト データ ・ アクセス権フォル ト<br />

データがネス ト された TLB フォルト データ・ダーティ・ビット ・フォルト<br />

データ TLB フォルト データ・アクセス・ビット ・フォルト<br />

別のデー タ TLB フォルト データ・デバッグ・フォルト<br />

データ ・ ページ不在フォルト<br />

3:14 第 3 巻 : 命令リファレンス<br />

alloc


and<br />

and ─ 論理積 (Logical And)<br />

書式 : (qp) andr 1 = r 2 , r 3 register_form A1<br />

(qp) andr 1 = imm 8 , r 3 imm8_form A3<br />

説明 : 2 つの ソ ー ス ・ オペラ ン ド 間の論理積が取 ら れ、 その結果が GR r 1 に格納される。<br />

register_form では、 第 1 オペラン ド は GR r 2 であり、 imm8_form では、 第 1 オペラン ド<br />

は imm 8 エンコーディ ング ・ フ ィ ール ド で与えられる。<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1);<br />

}<br />

割り込み : 無効操作フ ォ ル ト<br />

tmp_src = (register_form ? GR[r 2 ] : sign_ext(imm 8 , 8));<br />

tmp_nat = (register_form ? GR[r 2].nat : 0);<br />

GR[r 1 ] = tmp_src & GR[r 3 ];<br />

GR[r 1].nat = tmp_nat || GR[r 3].nat;<br />

第 3 巻 : 命令リファレンス 3:15


andcm ─ 補数の論理積 (And Complement)<br />

andcm<br />

書式 : (qp) andcmr 1 = r 2 , r 3 register_form A1<br />

(qp) andcmr 1 = imm 8 , r 3 imm8_form A3<br />

説明 : 第 1 ソース・オペランド と、 第2 ソース ・オペランドの1 の補数 と の間の論理積が取ら<br />

れ、 その結果が GR r 1 に格納される。 register_form では、 第 1 オペラン ド は GR r 2 であ<br />

り、 imm8_form では、 第 1 オペラン ド は imm 8 エンコ ーデ ィ ング ・ フ ィ ール ド で与えら<br />

れる。<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1);<br />

}<br />

割り込み : 無効操作フ ォ ル ト<br />

tmp_src = (register_form ? GR[r 2 ] : sign_ext(imm 8 , 8));<br />

tmp_nat = (register_form ? GR[r 2].nat : 0);<br />

GR[r 1 ] = tmp_src & ~GR[r 3 ];<br />

GR[r 1].nat = tmp_nat || GR[r 3].nat;<br />

3:16 第 3 巻 : 命令リファレンス


br ─ 分岐 (Branch)<br />

書式 : (qp) br.btype.bwh.ph.dh target25 ip_relative_form B1<br />

(qp) br.btype.bwh.ph.dh b1 = target25 call_form, ip_relative_form B3<br />

br.btype.bwh.ph.dh target25 counted_form, ip_relative_form B2<br />

br.ph.dh target25 擬似オペ コ ー ド<br />

(qp) br.btype.bwh.ph.dh b2 indirect_form B4<br />

(qp) br.btype.bwh.ph.dh b1 = b2 call_form, indirect_form B5<br />

br.ph.dh b2 擬似オペ コ ー ド<br />

説明 : 分岐演算が評価 され、 その結果に よ り 、 分岐が発生す る か、 あるいは シ ー ケ ン ス内の次<br />

の命令か ら プ ロ グ ラ ムの実行が継続 さ れる。 分岐の実行は、 論理的に は、 同じ命令グ<br />

ル ー プ内の分岐命令 よ り 前のすべての非分岐命令が実行 さ れた後に行われる。 分岐が発<br />

生する と、 プログラ ムの実行はス ロ ッ ト 0 から開始される。<br />

分岐の タ イ プ と しては IP ( 命令ポ イ ン タ ) 相対分岐 と 間接分岐がある。 IP 相対分岐の場<br />

合は、 アセンブ リ では、 target25 オペラ ン ド に分岐先の ラベルを指定す る。 こ れで、 こ の<br />

命令を含むバン ド ルか ら 分岐先バン ド ル ま での変位が計算 さ れて、 符号付き即値 (imm21 )<br />

と して分岐命令にエン コ ー ド さ れる (imm21 = target25 - IP >> 4)。 間接分岐の場合は、 分岐<br />

先ア ド レスは BR b2 で与え られる。<br />

表 2-6. 分岐のタイプ<br />

btype 機能 分岐条件 分岐先アドレス<br />

cond or none 条件付き分岐 修飾プレディケート IP 相対または間接<br />

call 条件付きプロシージャ・コール 修飾プレディケート IP 相対または間接<br />

ret 条件付きプロシージャ・リターン 修飾プレディケート 間接<br />

ia IA-32 命令セットの呼び出し 無条件 間接<br />

cloop カウント指定ループの分岐 ループ・カウント IP 相対<br />

ctop, cexit モジュロ・スケジュール型のカウン ループ・カウントおよび IP 相対<br />

ト指定ループ<br />

エピローグ・カウント<br />

wtop, wexit モジュロ・スケジュール型の while<br />

ループ<br />

修飾プレディケートおよ<br />

びエピローグ・カウント<br />

IP 相対<br />

無条件分岐には 2 つの擬似オペ コ ー ド があ る。 こ れ ら のオペ コ ー ド は条件付き分岐<br />

(btype = cond) のよ うにエンコー ド され、 qp フィールドにはPR 0 を指定し、 bwh ヒント<br />

には sptk を指定する。<br />

分岐の タ イ プに よ っ て、 分岐条件が ど の よ う に計算 さ れる か、 ま た ( リンク ・レジスタ<br />

への書き込みなどの ) 分岐に よ る他の効果があ る か ど う かが決 ま る。 基本的分岐タ イ プ<br />

の場合は、 分岐条件は単に指定 さ れたプ レ デ ィ ケ ー ト ・ レ ジ ス タ の値だけであ る。 基本<br />

分岐タ イ プを以下に示す。<br />

• cond: 修飾プ レデ ィ ケ ー ト が 1 の場合に分岐が発生する。 1 でない場合は、 発生しな<br />

い。<br />

• call: 修飾プ レ デ ィ ケ ー ト が 1 の場合に分岐が発生し、 さ ら に以下の処置がな さ れる。<br />

• 現在の フ レ ー ム ・ マ ー カ (CFM)、 EC アプ リ ケ ー シ ョ ン ・ レ ジ ス タ、 現在の特権<br />

レベルの現在値が以前の フ ァ ン ク シ ョ ンの状態 (PFS) アプ リ ケーシ ョ ン ・ レジス<br />

タにセーブされる。<br />

• 呼び出し元のスタ ッ ク ・ フ レ ー ムが結果的にセーブ され、 呼び出し元の出力エ リ<br />

アだけが入ったフレームが呼ばれた側に渡される。<br />

第 3 巻 : 命令リファレンス 3:17


• CFM 内のローテーション用のリネーム・ベース・レジスタが0 にリセットされ<br />

る。<br />

• RB b1 にリターン・ リンク値が格納される。<br />

• return: 修飾プ レデ ィ ケ ー ト が 1 の場合に分岐が発生し、 さ ら に以下の処置がなされ<br />

る。<br />

• CFM、 EC、 現在の特権レベルがPFS から復元される。 ( 特権レベルは、 復元し<br />

て特権レベルが大き く な ら ない場合に限 り 復元される。 )<br />

• 呼び出し元のスタ ッ ク ・ フ レ ー ムが復元される。<br />

• リターンによって特権レベルが下がり、 かつPSR.lp が 1 の場合は、<br />

Lower-previlege Transfer ( 下位特権遷移 ) トラップが発生する。<br />

• ia: OS に よ っ てイ ン タ ー セプ ト さ れな く て も 、 無条件に分岐が発生す る。 こ の分岐<br />

によって、 (PSR.is を 1 にセッ ト する こ とによ り ) IA-32 命令セ ッ ト を呼び出して、<br />

BR b2{31:0} 内の仮想 リ ニア分岐先ア ド レ スか ら IA-32 命令の処理を開始す る。 修飾<br />

プレディケー トが PR 0 でない場合は、 無効操作フ ォ ル ト が発生す る。 命令セ ッ ト の<br />

移行がデ ィ スエ ー ブルに さ れてい る場合は (PSR.di が 1)、 命令セ ッ ト 移行無効フ ォ ル<br />

トが発生する。<br />

IA-32 におけ る分岐先の実効ア ド レ ス は、 現在の コ ー ド ・ セグ メ ン ト と 相対的に、 つ<br />

まり、 EIP{31:0}= BR b2 {31:0}- CSD.base として計算される。 PSR.di が 0 の場合は、<br />

任意の特権レ ベルで IA-32 命令セ ッ ト に移行で き る。 PSR.dfh が 1 の場合は、 分岐先<br />

の IA-32 命令で浮動小数点レ ジ ス タ無効フ ォ ル ト が発生す る。 命令セ ッ ト の移行中<br />

には、 レジスタ ・ バンクの切り換えも特権レベルの変更も生じない。<br />

ソ フ ト ウ ェ ア上では、 分岐を発行する前に、 必ず コ ー ド ・ セグ メ ン ト ・ デ ィ ス ク リ<br />

プタ (CSD) およびコード ・セグメント ・セレクタ (CS) がロー ド されるよ うにしなけ<br />

ればならない。 分岐先の EIP 値がコ ー ド ・ セグメン ト 制限を超えた り、 その値に<br />

コード ・セグメント特権違反があった場合は、 分岐先のIA-32 命令で<br />

IA-32_Exception (GPFault) が発生する。 16 ビッ トのIA-32 コードに移行する場合は、<br />

BR b2 が CSD.base の 64K バイ ト 以内でなければ、 分岐先命令で GPFault が発生する。<br />

EFLAG.rf は、 最初の IA-32 命令が正常に終了す る ま では変更 さ れない。 br.ia の実<br />

行が完了してか ら、 最初の IA-32 命令の実行が開始される ま での間に、 PSR.da、<br />

PSR.id、 PSR.dd、 PSR.ed は 0 にク リアされる。 EFLAG.rf は、 分岐先の IA-32 命令が<br />

正常に終了する ま では ク リ ア されない。<br />

IA-32 でのプロセッサによ る整合性のあるメモ リ参照と Itanium アーキテクチャでの<br />

順序付け られていない メ モ リ 参照 と の間で メ モ リ の順序付けが必要な場合は、 ソ フ<br />

トウェアによって分岐の前にmf 命令を発行しなければな ら ない。 プ ロ セ ッ サは、<br />

Itanium 命令セ ッ ト で生じ る命令ス ト リ ー ムへの書き込みが、 後続の IA-32 命令<br />

フェッチから検出できるかどうかは保証していない。 br.ia 命令では、 命令のシ リ<br />

アル化操作は行わない。 プロセッサは、 ( 同一命令グルー プ内で も ) 前に行われた<br />

GR や FR への書き込みが最初の IA-32 命令か ら検出で き る か ど う かは保証していな<br />

い。 br.ia 命令ではすべての AR を暗黙的に読み込む場合があ る ので、 br.ia 命令<br />

と同じ命令グループ内での AR への書き込みは許可されない。 AR への書き込みと<br />

br.ia 命令 と の間に無効な RAW の依存関係が存在する場合は、 最初の IA-32 命令の<br />

フ ェ ッ チ と 実行の段階では、 更新後の AR 値がわかる こ と もわからないこ と もある。<br />

IA-32 命令セ ッ ト を実行す る と 、 ALAT の内容は未定義の ま ま である。 ソ フ ト ウ ェ ア<br />

上では、 命令セッ ト の移行があった場合は、 ALAT の値が保持される も の と みなし<br />

てはならない。 現在のレジスタ ・ スタック ・ フレーム内に残されたすべてのレジス<br />

タ の状態は、 命令セ ッ ト の移行の前後では未定義であ る。 IA-32 コードに移行する<br />

と、 ALAT 内の既存エン ト リ は無視される。 レ ジス タ ・ ス タ ッ ク内にダー テ ィ なレ<br />

ジスタが存在する場合は、 br.ia 命令で無効操作フ ォ ル ト が発生す る。 現在の レ ジ<br />

スタ ・ スタック ・ フレームはゼロ ・ ク リアされる。 ダーティなレジスタのレジスタ ・<br />

3:18 第 3 巻 : 命令リファレンス<br />

br


ファイルをフラッシュするには、 命令グループ内でbr.ia 命令 よ り 前に flushrs<br />

命令を発行しなければな ら ない。 命令セ ッ ト の移行のパ フ ォ ー マン ス を改善す る に<br />

は、 ソ フ ト ウ ェア上では、 1) flushrs 命令を必ず br.ia 命令の前の 1 つだけの命<br />

令グル ー プに入れ、 2) br.ia 命令を必ず最初の B スロッ トに入れて、 IA-32 命令<br />

セ ッ ト を起動す る の と 並行してレ ジ ス タ ・ ス タ ッ ク の フ ラ ッ シ ュ を起動す る と よ い。<br />

br.ia 命令は、 常に、 " 静的に処理す る " ( デフォルト ) のヒントを付けて最初のB ス<br />

ロッ トで実行するようにする。 そうしないと、 プロセッサのパフォーマンスが低下<br />

する。<br />

br.ia によってItanium アーキテクチャ ・ ト ラップ ( 例えば、 シングル・ステップ・ ト<br />

ラ ッ プ、 分岐発生 ト ラ ッ プ、 ま たは実装されていない命令ア ド レ ス ・ ト ラ ッ プ ) が<br />

発生した場合、 IIP には元の 64 ビッ トの分岐先IP が格納される ( この値は 32 ビッ ト<br />

からゼロ拡張されない )。<br />

もう1 つの分岐タイプが、 単純なカウン ト 指定ループ向けに用意されている。 この<br />

分岐タ イ プでは、 ル ー プ ・ カ ウ ン ト (LC) アプ リ ケーシ ョ ン ・ レジスタを使用して分<br />

岐条件を判定し、 修飾プレデ ィ ケー ト は使用しない。<br />

• cloop: LC レ ジス タがゼロでない場合は、 こ の値がデ ク リ メ ン ト され、 分岐が発生す<br />

る。<br />

こ れ ら の単純な分岐タ イ プの他に、 モジ ュ ロ ・ ス ケ ジ ュ ー ル型ルー プを高速に処理<br />

するための 4 つのタイプがある ( 第 1 巻、 第 1 部の 4.5.1 項 「モジュロ ・スケジュー<br />

ル型ループのサポ ー ト 」 を参照 )。 LC レ ジス タ を使用する カ ウ ン ト 指定ループ用が<br />

2 つ と 、 修飾プ レ デ ィ ケ ー ト を使用する while ループ用が 2 つである。 これらのルー<br />

プ ・ タイプでは、 レジスタのローテーションを使用してレジスタのリネー ミングを<br />

実現し、 プ レ デ ィ ケ ー シ ョ ン を使用して空のパ イ プ ラ イ ン ・ ス テ ー ジ に対応す る命<br />

令をオフにする。<br />

エピローグ ・ カウン ト (EC) アプ リ ケーシ ョ ン ・ レジスタを使用してエピローグ ・ ス<br />

テージがカウント される。 あるいは一部の while ループについては、 プロローグ ・ ス<br />

テ ー ジの一部が カ ウ ン ト さ れる。 エ ピ ロ ー グ ・ フ ェ ー ズでは、 ルー プが一巡す る た<br />

びに EC がデク リ メン ト され、 大部分のループでは、 EC が 1 になる と、 パイプライ<br />

ンが空になってループが終了する。 特定タイプの、 ソフ ト ウェアによ ってパイプラ<br />

イ ン化 さ れたアン ロ ー ル型の最適化ルー プについては、 br.cexit または br.wext<br />

の分岐先が次の順序のバン ド ルに設定される。 こ の場合は、 EC が 1 になっても、 パ<br />

イプラインは完全には空になっていないこ とがあり、 EC がゼロであって も引き続き<br />

パイプラインから命令が排出される。<br />

これらのモジュロ・スケジュール型ループについては、 分岐が発生するかどうかの<br />

演算は、 カ ー ネル分岐条件 ( カウント指定ループに対しては LC、 while ループに対<br />

しては修飾プレディ ケー ト ) およびエピローグ条件 (EC が 1 より大きいか、 大きく<br />

ないか ) によって決まる。<br />

こ れ ら の分岐に は、 "top" と "exit" の 2 つのカテゴ リ がある。 "top" タイプ (ctop と<br />

wtop) は、 ル ー プの判定がルー プ本体の一番下にあ る と き に使用 さ れ、 したが っ て、<br />

分岐が発生す る と ル ー プを続行す る のに対し、 フ ォ ー ル ・ スルー分岐ではルー プを<br />

終了す る。 "exit" タイプ (cexit と wexit) は、 ルー プの判定がル ー プの一番下以外の ど<br />

こかにあるときに使用され、 したがって、 フォール・ スルー分岐ではループを続行<br />

するのに対して、 分岐が発生する とループを終了する。 "exit" タイプは、 アンロール<br />

型のパイプラ イン化されたループ内の中間点に も使用される。 ( 詳細は第 1 巻、 第 1<br />

部の 4.5.1 項 「モジュロ ・スケジュール型ループのサポート」 を参照。 )<br />

モジュロ・スケジュール型ループのタイプを以下に示す。<br />

• ctop と cexit: こ れ ら の分岐タ イ プの動作は、 分岐す る か ど う かの判定以外は同じ で<br />

ある。 br.ctop は、 LC がゼロでないか、 EC が 1 より大きい場合に分岐が発生す<br />

第 3 巻 : 命令リファレンス 3:19


る。 br.cexit では、 その反対があてはまる。 つま り、 LC がゼロでないか、 EC が<br />

1 よ り 大きい場合は分岐は発生せず、 そ う でない場合は分岐が発生する。<br />

これらの分岐タイプでは、 レジスタのローテーションとプレディケー トの初期化の<br />

制御に も LC と EC を使用する。 プロロ ーグ ・ フ ェ ーズ と カ ーネル ・ フ ェ ーズ (LC が<br />

0 ではない ) では、 LC がカウン ト ・ ダウンされる。 LC が 0 で br.ctop または<br />

br.cexit が実行される と エピ ロ ーグ ・ フ ェ ーズにな り、 EC がカウン ト ・ ダウンさ<br />

れる。 LC が 0、 かつ EC が 1 のときにbr.ctop または br.cexit が実行される と、<br />

EC の最後のデ ク リ メ ン ト ( カウント ・ダウン ) と最後のレジスタのローテーション<br />

が行われる。 LC と EC が と も にゼ ロ の場合は、 レ ジ ス タ の ロ ー テ ー シ ョ ンが停止す<br />

る。 分岐の判定以外の こ れら の効果は ど ち ら の分岐タ イ プで も 同じ であ り 、 図 2-3<br />

に示す と おり である。<br />

wtop と wexit: これら の分岐タ イ プの動作は、 分岐するか ど う かの判定以外は同じ で<br />

ある。 br.wtop は、 修飾プレデ ィ ケー ト が 1 であるか、 EC が 1 より大きい場合に<br />

分岐が発生す る。 br.wexit では、 その反対があてはまる。 つま り、 修飾プレディ ケー トが1 であるか、 EC が 1 よ り 大きい場合は分岐は発生せず、 そ う でない場合は<br />

分岐が発生す る。<br />

図 2-3. br.ctop および br.cexit の操作<br />

ctop, cexit<br />

( プロローグ /<br />

カーネル )<br />

LC?<br />

EC = EC<br />

PR[63] = 1<br />

RRB--<br />

!= 0<br />

== 0 ( エピローグ )<br />

ctop: 分岐 ctop: フォール・スルー<br />

cexit: フォール・スル ー<br />

cexit: 分岐<br />

これらの分岐タイプでは、 レジスタのローテーションおよびプレディケー トの初期<br />

化の制御に も修飾プレデ ィ ケ ー ト と EC を使用する。 プロ ローグ ・ フ ェ ーズでは、<br />

ル ー プのプ ロ グ ラ ミ ン グに使用 さ れる方式に応じ て、 修飾プ レ デ ィ ケ ー ト はゼ ロ か 1<br />

である。 カーネル ・ フ ェ ーズでは、 修飾プレデ ィ ケー ト は 1 である。 エピローグ ・<br />

フェーズでは、 修飾プレディケートはゼロであり、 EC がカウン ト ・ ダウンされる。<br />

修飾プ レ デ ィ ケ ー ト がゼ ロ、 かつ EC が 1 のときにbr.wtop または br.wexit が実<br />

行されると、 EC の最後のデ ク リ メ ン ト ( カウント ・ダウン ) と最後のレジスタの<br />

ロ ーテーシ ョ ンが行われる。 修飾プレデ ィ ケー ト と EC がともにゼロの場合は、 レジ<br />

ス タ の ロ ー テ ー シ ョ ンが停止する。 分岐の判定以外の こ れ ら の効果は ど ち ら の分岐<br />

タイプでも同じであり、 図 2-4 に示す と おり である。<br />

3:20 第 3 巻 : 命令リファレンス<br />

EC--<br />

PR[63] = 0<br />

RRB--<br />

> 1<br />

EC?<br />

EC--<br />

PR[63] = 0<br />

RRB--<br />

== 1<br />

( 特殊なアンロール型<br />

ループ )<br />

== 0<br />

LC-- LC = LC LC = LC LC = LC<br />

EC = EC<br />

PR[63] = 0<br />

RRB = RRB<br />

br


図 2-4. br.wtop および br.wexit の操作<br />

wtop, wexit<br />

( プロローグ /<br />

カーネル )<br />

ループ・ タイプの分岐 (br.cloop、 br.ctop、 br.cexit、 br.wtop、 br.wexit) は、<br />

同一バン ド ル内の命令スロ ッ ト 2 でしか実行でき ない。 こ のよ う な命令をスロ ッ ト 0 か 1<br />

で実行する と 、 分岐が発生したかど う かに関わら ず、 無効操作フ ォ ルト が発生する 。<br />

分岐命令では、 リ ー ド ・ ア フ タ ー ・ ラ イ ト ( RAW) およびライ ト ・アフター ・ リー ド<br />

(WAR) の依存関係についての必要条件はわずかに異な る。 非分岐命令に よ る BR、 PR、<br />

PFS の変更は、 同一命令グルー プ内のそれ ら 以降の分岐命令か ら は検出 さ れない ( つま<br />

り 、 こ れ ら の リ ソ ー ス に は制限 さ れた RAW が許可される )。 したがって、 例えば、 低レ<br />

イ テ ン シの比較分岐シ ー ケ ン ス は使用で き る。 RAW に対する通常の必要条件は、 LC と<br />

EC 両アプ リ ケ ーシ ョ ン ・ レ ジス タや RRB にあてはま る。<br />

読み取 り命令や書き込み命令が分岐である場合は、 同一の命令グループ内での PR63 に<br />

対する WAR の依存関係は許されない。 例えば、 br.wtop または br.wexit は、 その修<br />

飾プレデ ィ ケー ト と して PR[63] を使用してはならない。 また、 PR[63] は、 同一命令グ<br />

ループ内の br.wtop または br.wexit よ り 前にあ る分岐命令の修飾プ レ デ ィ ケ ー ト で<br />

あってはならない。<br />

依存関係のために、 分岐が発生するかど う かに関わ らず、 ループ ・ タ イプの分岐は結果<br />

的に常にそれぞれが関連付け られている リ ソ ースに書き込む。 cloop タイプは結果的に常<br />

に LC に書き込む。 LC が 0 のときは、 cloop 分岐は LC を変更しないが、 ハー ド ウ ェアが<br />

LC に同じ値を再書き込みする形でその更新を実現でき る。 同様に、 br.ctop と<br />

br.cexit は結果的に常に LC、 EC、 RRB、 PR[63] に書き込む。 br.wtop と br.wexit は<br />

結果的に常に EC、 RRB、 PR[63] に書き込む。<br />

各種の分岐 ヒ ン ト の コ ン プ リ ー タ の値を以下の表に示す。 分岐有無の予測ス ト ラ テ ジ<br />

(Whether Prediction Strategy) ヒントを表 2-7 に、 シーケンシャル ・ プ リ フ ェ ッチ<br />

(Sequential Prefetch) ヒントを表 2-8 に、 ま た分岐キ ャ ッ シ ュ 割 り 当て解除 (Branch Cache<br />

Deallocation) ヒントを表 2-9 にそれぞれ示す。 第 1 巻、 第 1 部の 4.5.2 項 「分岐予測ヒ ン<br />

ト」 を参照のこ と。<br />

表 2-7. 分岐有無予測ヒント<br />

PR[qp]?<br />

EC = EC<br />

PR[63] = 0<br />

RRB--<br />

== 1<br />

==0 ( プロローグ / エピローグ )<br />

( プロローグ /<br />

エピローグ )<br />

wtop: 分岐 wtop: フォール・スル ー<br />

wexit: フォール・スルー wexit: 分岐<br />

bwh コンプリータ 分岐有無予測ヒント<br />

spnt 静的に処理されない<br />

sptk 静的に処理する<br />

dpnt 動的に処理されない<br />

dptk 動的に処理する<br />

第 3 巻 : 命令リファレンス 3:21<br />

EC--<br />

PR[63] = 0<br />

RRB--<br />

> 1<br />

( エピローグ )<br />

EC?<br />

EC--<br />

PR[63] = 0<br />

RRB--<br />

== 1<br />

( 特殊なアンロール型<br />

ループ )<br />

== 0<br />

EC = EC<br />

PR[63] = 0<br />

RRB = RRB


表 2-8. シーケンシャル・プリフェッチ・ヒント<br />

ph コンプリータ シーケンシャル・プリフェッチ・ヒント<br />

few もしくは none 少数ライン<br />

many 多数ライン<br />

表 2-9. 分岐キャッシュ割り当て解除ヒント<br />

dh コンプリータ 分岐キャッシュ割り当て解除ヒント<br />

none 割り当て解除なし<br />

clr 分岐情報割り当て解除あり<br />

操作 : if (ip_relative_form) // determine branch target<br />

tmp_IP = IP + sign_ext((imm 21


CFM.sor = 0;<br />

CFM.rrb.gr = 0;<br />

CFM.rrb.fr = 0;<br />

CFM.rrb.pr = 0;<br />

} else // normal branch return<br />

CFM = AR[PFS].pfm;<br />

rse_enable_current_frame_load();<br />

AR[EC] = AR[PFS].pec;<br />

if (PSR.cpl u< AR[PFS].ppl) { // ... and restores privilege<br />

PSR.cpl = AR[PFS].ppl;<br />

lower_priv_transition = 1;<br />

}<br />

}<br />

break;<br />

case ‘ia’: // switch to IA mode<br />

tmp_taken = 1;<br />

if (qp != 0)<br />

illegal_operation_fault();<br />

if (AR[BSPSTORE] != AR[BSP])<br />

illegal_operation_fault();<br />

if (PSR.di)<br />

disabled_instruction_set_transition_fault();<br />

PSR.is = 1; // set IA-32 Instruction Set Mode<br />

CFM.sof = 0; //force current stack frame<br />

CFM.sol = 0; //to zero<br />

CFM.sor = 0;<br />

CFM.rrb.gr = 0;<br />

CFM.rrb.fr = 0;<br />

CFM.rrb.pr = 0;<br />

rse_invalidate_non_current_regs();<br />

//compute effective instruction pointer<br />

EIP{31:0} = tmp_IP{31:0} - AR[CSD].Base;<br />

// Note the register stack is disabled during IA-32 instruction<br />

// set execution<br />

break;<br />

case ‘cloop’: // simple counted loop<br />

if (slot != 2)<br />

illegal_operation_fault();<br />

tmp_taken = (AR[LC] != 0);<br />

if (AR[LC] != 0)<br />

AR[LC]--;<br />

break;<br />

case ‘ctop’:<br />

case ‘cexit’: // SW pipelined counted loop<br />

if (slot != 2)<br />

illegal_operation_fault();<br />

if (btype == ‘ctop’) tmp_taken = ((AR[LC] != 0) || (AR[EC] u> 1));<br />

if (btype == ‘cexit’)tmp_taken = !((AR[LC] != 0) || (AR[EC] u> 1));<br />

if (AR[LC] != 0) {<br />

AR[LC]--;<br />

AR[EC] = AR[EC];<br />

PR[63] = 1;<br />

rotate_regs();<br />

} else if (AR[EC] != 0) {<br />

AR[LC] = AR[LC];<br />

AR[EC]--;<br />

PR[63] = 0;<br />

第 3 巻 : 命令リファレンス 3:23


otate_regs();<br />

} else {<br />

AR[LC] = AR[LC];<br />

AR[EC] = AR[EC];<br />

PR[63] = 0;<br />

CFM.rrb.gr = CFM.rrb.gr;<br />

CFM.rrb.fr = CFM.rrb.fr;<br />

CFM.rrb.pr = CFM.rrb.pr;<br />

}<br />

break;<br />

case ‘wtop’:<br />

case ‘wexit’: // SW pipelined while loop<br />

if (slot != 2)<br />

illegal_operation_fault();<br />

if (btype == ‘wtop’) tmp_taken = (PR[qp] || (AR[EC] u> 1));<br />

if (btype == ‘wexit’)tmp_taken = !(PR[qp] || (AR[EC] u> 1));<br />

if (PR[qp]) {<br />

AR[EC] = AR[EC];<br />

PR[63] = 0;<br />

rotate_regs();<br />

} else if (AR[EC] != 0) {<br />

AR[EC]--;<br />

PR[63] = 0;<br />

rotate_regs();<br />

} else {<br />

AR[EC] = AR[EC];<br />

PR[63] = 0;<br />

CFM.rrb.gr = CFM.rrb.gr;<br />

CFM.rrb.fr = CFM.rrb.fr;<br />

CFM.rrb.pr = CFM.rrb.pr;<br />

}<br />

break;<br />

}<br />

if (tmp_taken) {<br />

taken_branch = 1;<br />

IP = tmp_IP; // set the new value for IP<br />

if ((PSR.it && unimplemented_virtual_address(tmp_IP))<br />

|| (!PSR.it && unimplemented_physical_address(tmp_IP)))<br />

unimplemented_instruction_address_trap(lower_priv_transition,<br />

tmp_IP);<br />

if (lower_priv_transition && PSR.lp)<br />

lower_privilege_transfer_trap();<br />

if (PSR.tb)<br />

taken_branch_trap();<br />

}<br />

割り込み : 無効操作フ ォ ル ト 下位特権遷移 ト ラ ッ プ<br />

命令セ ッ ト 移行無効フ ォ ル ト 分岐発生 ト ラ ッ プ<br />

実装 さ れていない命令ア ド レ ス ・ ト ラ ッ プ<br />

分岐先の IA-32 命令での追加フ ォ ル ト :<br />

IA-32_Exception(GPFault)<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfh が 1 の場合 )<br />

3:24 第 3 巻 : 命令リファレンス<br />

br


eak<br />

break ─ ブレーク (Break)<br />

書式 : (qp) break imm 21 擬似オペ コ ー ド<br />

(qp) break.i imm 21 i_unit_form I19<br />

(qp) break.b imm 21 b_unit_form B9<br />

(qp) break.m imm 21 m_unit_form M37<br />

(qp) break.f imm 21 f_unit_form F15<br />

(qp) break.x imm 62 x_unit_form X1<br />

説明 : Break Instruction ( ブレーク命令) フォルトが発生する。 i_unit_form、 f_unit_form、<br />

m_unit_form では、 imm21 で指定 される値がゼ ロ拡張 さ れ、 割 り 込み即値 (Interruption<br />

Immediate: IIM) コントロール・ レジスタに格納される。<br />

b_unit_form では、 imm21 が無視され、 値 0 が IIM コント ロール・ レジスタに格納される。<br />

x_unit_form では、 imm62 で指定される値の下位 21 ビットがゼロ拡張され、 IIM コント<br />

ロール・ レジスタに格納される。 バンドルのL スロッ ト に imm62 の上位 41 ビットが入<br />

る。<br />

break.i 命令は、 MLI テンプレー ト ・ バンドル内にエンコー ドできる。 この場合は、 そ<br />

のバン ド ルの L スロッ トは無視される。<br />

この命令には 5 つの形式があ る が、 各形式は、 それぞれ特定の タ イ プの実行ユニ ッ ト に<br />

対してのみ実行で き る。 実行するユニ ッ ト の タ イ プが重要でない場合は、 擬似オペ コ ー<br />

ドを使用してよい。<br />

操作 : if (PR[qp]) {<br />

if (b_unit_form)<br />

immediate = 0;<br />

else if (x_unit_form)<br />

immediate = zero_ext(imm 62 , 21);<br />

else // i_unit_form || m_unit_form || f_unit_form<br />

immediate = zero_ext(imm 21, 21);<br />

}<br />

割り込み : ブレーク命令フォルト<br />

break_instruction_fault(immediate);<br />

第 3 巻 : 命令リファレンス 3:25


l ─ ロング型分岐 (Branch Long)<br />

書式 : (qp) brl.btype.bwh.ph.dh target64 X3<br />

(qp) brl.btype.bwh.ph.dh b1 = target64 call_form X4<br />

brl.ph.dh target64 擬似オペ コ ー ド<br />

説明 : 分岐条件が評価され、 分岐が発生するか、 ま たは次のシ ー ケンシ ャ ル命令で実行が継続<br />

さ れる。 分岐の実行は、 論理的には、 同じ命令グルー プ内のすべての先行する非分岐命<br />

令の実行の後に続 く 。 分岐が発生した場合、 実行は ス ロ ッ ト 0 から始まる。<br />

ロ ン グ型分岐は、 常に IP 相対分岐であ る。 target64 オペラン ド は、 アセンブ リ内で、 分<br />

岐先の ラベルを指定す る。 こ の命令を含むバン ド ルか ら 分岐先バン ド ル ま での変位が計<br />

算され、 即値 (imm60 ) と して ロ ング型分岐命令内にエン コ ー ド さ れる (imm60 = target64 -<br />

IP >> 4)。 このバン ドルの L スロッ ト に、 imm60 の 39 ビットが入る。<br />

表 2-10. ロング型分岐のタイプ<br />

btype 機能 分岐条件 分岐先アドレス<br />

cond or none 条件付き分岐 修飾プレディケート IP 相対<br />

call 条件付きプロシージャ・コール 修飾プレディケート IP 相対<br />

ロ ン グ型無条件分岐に は擬似オペ コ ー ド がある。 こ の擬似オペ コ ー ド は、 条件付き分岐<br />

(btype = cond) と同じようにエンコー ド され、 qp フィールドでPR 0 を指定し、 bwh ヒン<br />

ト sptk を持つ。<br />

分岐タ イ プに よ っ て、 分岐条件の計算方法 と 、 分岐に よ る副次的作用 ( リンク・レジス<br />

タへの書き込みなど ) が発生するかど う かが決ま る。 すべてのロ ング型分岐タ イプでは、<br />

分岐条件は、 単に、 指定 さ れたプ レ デ ィ ケ ー ト ・ レ ジ ス タ の値であ る。<br />

• cond: 修飾プ レ デ ィ ケ ー ト が 1 の場合は、 分岐が発生す る。 それ以外の場合は、 分岐<br />

は発生しない。<br />

• call: 修飾プ レ デ ィ ケ ー ト が 1 の場合は、 分岐が発生し、 次の よ う な他の動作が行わ<br />

れる。<br />

• 現在の フ レ ー ム ・ マ ー カ (CFM) の現在値、 EC アプ リ ケーシ ョ ン ・ レジスタ、 現<br />

在の特権レベルが、 以前の関数の状態アプ リ ケ ーシ ョ ン ・ レ ジスタ に保存され<br />

る。<br />

• 呼び出し元のスタ ッ ク ・ フ レ ー ムがセーブ され、 呼び出し元の出力エ リ アだけを<br />

含むフ レ ー ムが呼び出し先に渡される。<br />

• CFM 内のローテーション ・ リネーム ・ベース ・ レジスタが 0 にリセットされる。<br />

• リターン・ リンクの値が、 BR b1 に格納される。<br />

ロ ン グ型分岐命令での リ ー ド ・ ア フ タ ー ・ ラ イ ト (RAW) およびライ ト ・アフター ・ リー<br />

ド (WAR) 依存関係の要件は、 他の命令での要件 と は多少異な る が、 分岐命令での要件 と<br />

同じである。 詳細は、 3:21 ページを参照のこ と。<br />

こ の命令は、 直後にス ト ッ プが必要であ る。 直後に ス ト ッ プがない場合、 こ の命令の動<br />

作は不定である。<br />

各種の分岐 ヒ ン ト ・ コ ン プ リ ー タ の値は、 分岐命令 と 同じ である。 3:21 ページの表 2-7<br />

に、 分岐有無予測ス ト ラ テ ジ ・ ヒ ン ト を示す。 3:21 ページの表 2-8 に、 シーケンシャル ・<br />

プリフェッチ・ ヒントを示す。 3:21 ページの表 2-9 に、 分岐キャ ッ シ ュ割り当て解除ヒ<br />

ントを示す。 第 1 巻、 第 1 部の 4.5.2 項 「分岐予測 ヒ ン ト 」 を参照のこ と。<br />

この命令は、 Itanium アーキテクチャのプロセッサには実装されていない。 Itanium アーキ<br />

テ ク チ ャ のプ ロ セ ッ サは、 ロ ン グ型分岐命令が検出される と 、 分岐が発生す る か ど う かに<br />

3:26 第 3 巻 : 命令リファレンス<br />

brl


l<br />

関係な く 、 無効操作フ ォ ル ト を生成する。 Itanium アーキテクチャのプロセッサでロング<br />

型分岐をサポ ー ト す る に は、 オペレ ー テ ィ ン グ ・ シ ス テ ムが、 処理 さ れる ロ ン グ型分岐 と<br />

処理されないロ ング型分岐をエ ミ ュ レ ー ト する無効操作フ ォ ル ト ・ハン ド ラ を提供する必<br />

要がある。 こ の命令を実装しているプロセ ッ サでは、 CPUID レジスタ 4 の lb ビッ トが1<br />

になる。 第 1 巻、 第 1 部の 3.1.11 項 「プロセッサ識別レジスタ」 を参照のこ と。<br />

操作 : tmp_IP = IP + (imm 60


p ─ 分岐予測 (Branch Predict)<br />

書式 : brp.ipwh.ih target 25 , tag 13 ip_relative_form B6<br />

brp.indwh.ih b 2 , tag 13 indirect_form B7<br />

brp.ret.indwh.ih b 2 , tag 13 return_form, indirect_form B7<br />

説明 : この命令を使用して、 将来の分岐に関する情報を前も ってハー ド ウ ェアに与える こ と が<br />

で き る。 こ の命令は、 パ フ ォ ー マン ス上の効果以外は nop 命令 と して動作するため、<br />

アーキテ クチャ上のマシン状態に影響を与えない。<br />

tag13 オペラ ン ド は、 アセンブ リ 内で、 こ の予測情報が適用 さ れる分岐命令のア ド レ ス を<br />

指定する。 この命令を含むバン ド ルから予測される分岐を含むバン ド ルまでの変位を計<br />

算し、 符号付き即値 (timm9 ) と して分岐予測命令内にエン コ ー ド さ れる (timm9 = tag13 - IP<br />

>> 4)。<br />

target25 オペラン ド は、 アセンブ リ内で、 予測される分岐の分岐先のラベルを指定する。<br />

分岐命令の場合 と 全 く 同じ よ う に、 こ の命令を含むバン ド ルか ら 分岐先バン ド ル ま での<br />

変位を計算し、 符号付き即値 (imm21 ) と して分岐予測命令内にエン コ ー ド さ れる (imm21 =<br />

target25 - IP >> 4)。 indirect_form を使用して、 間接分岐を予測で き る。 indirect_form では、<br />

予測 さ れる分岐の タ ー ゲ ッ ト は、 BR b2 で指定される。<br />

return_form を使用して、 予測される分岐がリ ターンであるこ とを指示できる。<br />

予測 さ れる分岐について、 その他の ヒ ン ト を指定で き る。 各種の ヒ ン ト ・ コ ンプ リ ー タ<br />

の値を以下の表に示す。 詳細は、 第 1 巻、 第 1 部の 4.5.2 項 「分岐予測 ヒ ン ト 」 を参照の<br />

こと。<br />

ipwh および indwh コ ンプ リ ー タ は、 分岐条件の最 も 良い予測方法 と 、 分岐に到達す る時<br />

間に関する情報を指定する。<br />

表 2-11. IP 相対分岐有無予測ヒント<br />

ipwh コンプリータ IP 相対分岐有無予測ヒント<br />

sptk 予測される分岐は、「静的に処理」で予測される。<br />

loop 予測される分岐は、br.cloop、br.ctop、または br.wtop である。<br />

exit 予測される分岐は、br.cexit または br.wexit である。<br />

dptk 予測される分岐は、「動的」に予測される。<br />

表 2-12. 間接分岐有無予測ヒント<br />

indwh コンプリータ 間接分岐有無予測ヒント<br />

sptk 予測される分岐は、「静的に処理」で予測される。<br />

dptk 予測される分岐は、「動的」に予測される。<br />

ih コンプリータを使用して、 少数の非常に重要な分岐( 例えば、 内側ル ー プの分岐 ) を<br />

マ ー ク で き る。 これに よ っ て、 重要な分岐に対して、 高速で小 さ い予測構造を使用す る<br />

よ う に、 ハー ド ウ ェアに通知でき る。<br />

表 2-13. 重要度ヒント<br />

ih コンプリータ 分岐重要度予測ヒント<br />

none 重要度が低い<br />

imp 重要度が高い<br />

3:28 第 3 巻 : 命令リファレンス<br />

brp


p<br />

操作 : tmp_tag = IP + sign_ext((timm 9


sw ─ バンク・スイッチ (Bank Switch)<br />

書式 : bsw.0 zero_form B8<br />

bsw.1 one_form B8<br />

説明 : この命令は、 指定されたレジスタ ・バンクに切り替える。 zero_form は、 GR16 ~ GR31<br />

用にバン ク 0 を指定する。 one_form は、 GR16 ~ GR31 用にバン ク 1 を指定する。 バン<br />

ク ・ スイッチの実行後、 以前のレジスタ ・バンクはアクセスできなくなるが、 バンクの<br />

現在の状態を維持す る。 新しいレ ジ ス タ ・ バン ク と 古い レ ジ ス タ ・ バン ク に同じ バン ク<br />

を指定した場合は、 bsw 命令は nop にな る が、 こ れに よ っ てパ フ ォ ー マン スが多少低下<br />

する と きがある。<br />

bsw 命令は、 命令グルー プ内の最後の命令でなければな ら ない。 そ う でない場合は、 無<br />

効操作フ ォ ル ト が発生する。 GR16 ~ GR31 にアクセスする、 同じ命令グループ内の命令<br />

は、 以前のレジスタ ・ バンク を参照する。 後続の命令グループは、 新しいレジスタ ・ バ<br />

ンクを参照する。<br />

こ の命令は、 最高の特権レ ベル以外では実行で き ない。<br />

こ の命令に はプ レ デ ィ ケ ー ト を使用で き ない。<br />

操作 : if (!followed_by_stop())<br />

illegal_operation_fault();<br />

if (PSR.cpl != 0)<br />

privileged_operation_fault(0);<br />

if (zero_form)<br />

PSR.bn = 0;<br />

else // one_form<br />

PSR.bn = 1;<br />

割り込み : 無効操作フ ォ ル ト 特権操作フ ォ ル ト<br />

シリアル化 : こ の命令は、 追加の命令やデー タ のシ リ アル化操作を必要 と しない。 バン ク ・ ス イ ッ チ<br />

は、 命令の実行 と 同時に発生する。<br />

3:30 第 3 巻 : 命令リファレンス<br />

bsw


chk<br />

chk ─ スペキュレーション・チェック (Speculation Check)<br />

書式 : (qp) chk.sr 2 , target 25 擬似オペ コ ー ド<br />

(qp) chk.s.ir 2 , target 25 control_form, i_unit_form, gr_form I20<br />

(qp) chk.s.mr 2 , target 25 control_form, m_unit_form, gr_form M20<br />

(qp) chk.sf 2 , target 25 control_form, fr_form M21<br />

(qp) chk.a.aclr r 1 , target 25 data_form, gr_form M22<br />

(qp) chk.a.aclr f 1 , target 25 data_form, fr_form M23<br />

説明 : コント ロール・スペキュレーションまたはデータ ・ スペキュレーションによる計算の結<br />

果をチェ ックして、 成功か失敗かが確認される。 チェ ックが失敗した場合は、 target25 へ<br />

の分岐が実行される。<br />

control_form では、 成否はソース ・ レジスタに対する NaT ビッ トにより判定される。<br />

gr_form で GR r2 に対応する NaT ビッ トが1 の場合、 あるいは fr_form で FR f2 の内容が<br />

NaTVal の場合は、 チェ ッ ク は失敗である。<br />

data_form では、 成否は ALAT で判定される。 ALAT は、 gr_form の場合には 汎用レ ジ ス<br />

タ指定子 r1 を、 fr_form の場合に は浮動小数点レ ジ ス タ指定子 f1 を使用して照会される。<br />

一致す る ALAT エン ト リがない場合は、 チェ ッ クは失敗である。 ALAT エン ト リが一致<br />

したかど う かに関わらず、 チェ ッ ク を必要に応じて失敗させる こ とができ る。 汎用レジ<br />

スタ指定子r0 ま たは浮動小数点レ ジ ス タ指定子 f0 または f1 をとる chk.a 命令は、 常に<br />

失敗す る。<br />

target25 オペラ ン ド で、 アセン ブ リ で分岐先の ラベルを指定する。 こ の命令を含むバン ド<br />

ルか ら 分岐先バン ド ル ま での変位を計算し、 符号付き即値 (imm21 ) と して こ の命令内に<br />

エンコ ー ド される (imm21 = target25 - IP >> 4)。<br />

こ の命令の分岐動作は、 オプシ ョ ン に よ り 、 実装しな く て も よ い。 分岐動作が実装 さ れ<br />

ていないに も かかわ ら ず、 こ の命令が分岐した場合は、 スペキ ュ レ ー テ ィ ブ操作フ ォ ル<br />

トが発生し、 imm21 で指定した値がゼロ拡張されて、 割り込み即値コン ト ロール ・ レジ<br />

スタ (IIM) に格納される。 フ ォル ト ・ ハン ド ラは、 IIM の値を符号拡張して IIP に加算<br />

し、 制御を戻す と、 分岐をエ ミ ュ レー ト する。<br />

汎用レ ジ ス タ ・ チ ェ ッ ク 用の こ の命令の control_form は、 I ユニ ッ ト に対して も M ユ<br />

ニ ッ ト に対して も エン コ ー ド 可能である。 実行す る ユニ ッ ト の タ イ プが重要でない場合<br />

は、 擬似オペ コ ー ド を使用して よ い。<br />

data_form では、 一致する ALAT エン ト リ がある場合は、 aclr コンプリータの値に基づい<br />

て、 一致する ALAT エン ト リ を必要に応じて無効にでき る ( 表 2-14 を参照 )。<br />

表 2-14. ALAT クリアのためのコンプリータ<br />

aclr コンプリータ ALAT に対する効果<br />

clr 一致する ALAT エントリを無効にする<br />

nc 無効にしない<br />

aclr コンプリータに clr 値を指定してチェ ッ クが成功した場合は、 ALAT の一致するエン<br />

ト リ が無効に される。 ただし、 チ ェ ッ クが失敗した ( 一致す る ALAT エン ト リ があって<br />

も失敗するこ とがある ) 場合は、 一致す る ALAT エン ト リ を必要に応じて無効にでき る<br />

が、 必ずし も 無効にす る必要はない。 したが っ て、 デ ー タ ・ スペキ ュ レ ー シ ョ ンのため<br />

のリカバリコードでは、 一致する ALAT エン ト リ が存在しないものと想定してはならな<br />

い。<br />

第 3 巻 : 命令リファレンス 3:31


操作 : if (PR[qp]) {<br />

if (control_form) {<br />

if (fr_form && (tmp_isrcode = fp_reg_disabled(f 2 , 0, 0, 0)))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

check_type = gr_form ? CHKS_GENERAL : CHKS_FLOAT;<br />

fail = (gr_form && GR[r 2 ].nat) || (fr_form && FR[f 2 ] == NATVAL);<br />

} else { // data_form<br />

if (gr_form) {<br />

reg_type = GENERAL;<br />

check_type = CHKA_GENERAL;<br />

alat_index = r 1 ;<br />

always_fail = (alat_index == 0);<br />

} else { // fr_form<br />

reg_type = FLOAT;<br />

check_type = CHKA_FLOAT;<br />

alat_index = f 1 ;<br />

always_fail = ((alat_index == 0) || (alat_index == 1));<br />

}<br />

fail = (always_fail || (!alat_cmp(reg_type, alat_index)));<br />

}<br />

if (fail) {<br />

if (check_branch_implemented(check_type)) {<br />

taken_branch = 1;<br />

IP = IP + sign_ext((imm 21


clrrrb<br />

clrrrb ─ RRB のクリア (Clear RRB)<br />

書式 : clrrrb all_form B8<br />

clrrrb.pr pred_form B8<br />

説明 : all_form では、 レジスタ ・ リネーム ・ ベース ・ レジスタ (CFM.rrb.gr、 CFM.rrb.pr、<br />

CFM.rrb.pr) がク リアされる。 pred_form では、 プレディケー ト用のレジスタ ・ リネーム ・<br />

ベース ・ レジスタ (CFM.rrb.pr) だけがク リアされる。<br />

こ の命令は、 同一の命令グル ー プ内の最後の命令でなければな ら ない。 そ う でない場合<br />

は、 Illegal Operation ( 無効操作 ) フォルトが発生する。<br />

こ の命令に はプ レ デ ィ ケ ー ト は使用で き ない。<br />

操作 : if (!followed_by_stop())<br />

illegal_operation_fault();<br />

if (all_form) {<br />

CFM.rrb.gr = 0;<br />

CFM.rrb.fr = 0;<br />

CFM.rrb.pr = 0;<br />

} else { // pred_form<br />

CFM.rrb.pr = 0;<br />

}<br />

割り込み : 無効操作フ ォ ル ト<br />

第 3 巻 : 命令リファレンス 3:33


cmp ─ 比較 (Compare)<br />

書式 : (qp) cmp.crel.ctype p 1 , p 2 = r 2 , r 3 register_form A6<br />

(qp) cmp.crel.ctype p 1 , p 2 = imm 8 , r 3 imm8_form A8<br />

(qp) cmp.crel.ctype p 1 , p 2 = r0, r 3 parallel_inequality_form A7<br />

(qp) cmp.crel.ctype p 1 , p 2 = r 3 , r0 擬似オペ コ ー ド<br />

説明 : 2 つのソース ・ オペラン ド が、 crel で指定される 10 種類の関係のいずれか 1 つについて<br />

比較 さ れる。 こ れに よ っ て、 ブ ー ル結果が生成される。 ブ ー ル結果は、 比較条件が真の<br />

場合は 1 に、 真でない場合は 0 になる。 この結果は、 2 つのプレデ ィ ケー ト ・ レジスタ ・<br />

デステ ィ ネーシ ョ ン p1 および p2 に書き込まれる。 結果が両デステ ィ ネーシ ョ ンにどの<br />

ように書き込まれるかは、 ctype で指定される比較タイプによ り決まる。<br />

比較タ イ プは、 プ レ デ ィ ケ ー ト ・ タ ー ゲ ッ ト が ど の よ う に比較結果に基づいて更新 さ れ<br />

るかを示す。 通常タ イ プでは、 比較結果を一方のタ ーゲ ッ ト に書き、 結果の補数を他方<br />

の タ ー ゲ ッ ト に書 く 。 並列タ イ プでは、 特定の比較結果に対してのみ両タ ー ゲ ッ ト を更<br />

新する。 これに よ り、 同じ プレデ ィ ケー ト ・ レ ジスタ を タ ーゲ ッ ト と して、 複数の OR<br />

タ イ プの同時比較や複数の AND タ イ プの同時比較が可能にな る。<br />

unc タ イプは、 修飾プレデ ィ ケー ト には関わらず、 まず最初に両プレデ ィ ケー ト ・ タ ー<br />

ゲッ トを0 に初期化す る点が特殊である。 その後、 通常タ イ プ と 同じ操作を実行す る。<br />

こ れ ら の比較タ イ プの動作を表 2-15 に示す。 空白のエン ト リ は、 プレデ ィ ケー ト ・ ター<br />

ゲ ッ ト が変わら ないこ と を示す。<br />

表 2-15. 比較タイプ<br />

ctype<br />

擬似<br />

オペコード<br />

PR[qp]==0<br />

結果 ==0、<br />

ソースに NaT なし<br />

PR[qp]==1<br />

結果 ==1、<br />

ソースに NaT なし<br />

register_from では、 第 1 オペラン ド は GR r2 であり、 imm8_form では、 第 1 オペラン ド<br />

は符号拡張された imm8 エンコ ーデ ィ ング ・ フ ィ ール ド で与えられる。 また、<br />

parallel_inequality_form では、 第 1 オペラン ド は GR 0 でなければならない。<br />

parallel_inequality_form は、 比較タ イ プが並列タ イ プのいずれかであ り 、 かつ関係が不等<br />

(>、 >=、


cmp<br />

る関係を利用する。 一部の imm8_form の擬似オペコ ー ド 比較では、 アセンブラは即値か<br />

ら 1 を引いて、 許容 さ れる即値範囲をわずかに変更す る。 6 つの並列比較タ イ プの う ち、<br />

3 つのタイプは実際には擬似オペコー ドである。 アセンブラは、 単に、 サポー ト されて<br />

い る タ イ プ と 否定の関係を使用す る。 サポ ー ト さ れてい る関係 と 、 擬似オペ コ ー ド がそ<br />

れらの関係にどのよ うにマップされているかを、 通常タイプや unc タ イ プの比較につい<br />

ては表 2-16 に、 並列タ イ プの比較については表 2-17 にそれぞれ示す。<br />

表 2-16. 通常および unc の比較での 64 ビット比較関係<br />

crel<br />

比較関係<br />

(a rel b)<br />

register_form での<br />

擬似オペコード<br />

imm8_form での<br />

擬似オペコード<br />

eq a == b -128 .. 127<br />

ne a != b eq p 1 ↔ p 2 eq p 1 ↔ p 2 -128 .. 127<br />

lt a < b 符号付き -128 .. 127<br />

le a b lt a ↔ b lt a-1 p1 ↔ p2 -127 .. 128<br />

ge a >= b lt p1 ↔ p2 lt p1 ↔ p2 -128 .. 127<br />

即値の範囲<br />

ltu a < b 符号なし 0 .. 127, 2 64 -128 .. 2 64 -1<br />

leu a b ltu a ↔ b ltu a-1 p 1 ↔ p 2 1 .. 128, 2 64 -127 .. 2 64<br />

geu a >= b ltu p 1 ↔ p 2 ltu p 1 ↔ p 2 0 .. 127, 2 64 -128 .. 2 64 -1<br />

並列タ イ プは、 限定 さ れた関係 と オペラ ン ド のセ ッ ト に対してのみ使用で き る。 こ れ ら<br />

のタイプでは、 2 つのレジスタ間またはレジスタと即値との間の等および不等比較に使<br />

用でき る。 あるいは、 レ ジス タ と GR 0 と の間の不等比較に使用でき る。 符号なしの関<br />

係は、 ど ち ら かのオペラ ン ド がゼ ロ の と き はあ ま り 有用でないので用意 さ れていない。<br />

並列の不等比較は、 第 1 オペラン ド (GR r 2 ) が GR 0 である比較についてのみ、 ハー ド<br />

ウ ェ アで直接サポ ー ト さ れている。 第 2 オペラン ド が GR 0 である比較は擬似オペコ ー<br />

ド であ り 、 アセンブ ラ は その レ ジ ス タ指定子を切 り 換えて、 反対の関係を利用す る。<br />

表 2-17. 並列比較での 64 ビット比較関係<br />

crel 比較関係 (a rel b) register_form での擬似オペコード 即値の範囲<br />

eq a == b -128 .. 127<br />

ne a != b -128 .. 127<br />

lt 0 < b 符号付き imm8_form なし<br />

lt a < 0 gt a ↔ b<br />

le 0 0 lt a ↔ b<br />

ge 0 >= b<br />

ge a >= 0 le a ↔ b<br />

第 3 巻 : 命令リファレンス 3:35


操作 : if (PR[qp]) {<br />

if (p1 == p2)<br />

illegal_operation_fault();<br />

tmp_nat = (register_form ? GR[r 2 ].nat : 0) || GR[r 3 ].nat;<br />

if (register_form)<br />

tmp_src = GR[r 2 ];<br />

else if (imm8_form)<br />

tmp_src = sign_ext(imm 8 , 8);<br />

else // parallel_inequality_form<br />

tmp_src = 0;<br />

if (crel == ‘eq’) tmp_rel = tmp_src == GR[r 3 ];<br />

else if (crel == ‘ne’) tmp_rel = tmp_src != GR[r 3 ];<br />

else if (crel == ‘lt’) tmp_rel = lesser_signed(tmp_src, GR[r 3 ]);<br />

else if (crel == ‘le’) tmp_rel = lesser_equal_signed(tmp_src, GR[r 3 ]);<br />

else if (crel == ‘gt’) tmp_rel = greater_signed(tmp_src, GR[r 3 ]);<br />

else if (crel == ‘ge’) tmp_rel = greater_equal_signed(tmp_src, GR[r 3 ]);<br />

else if (crel == ‘ltu’) tmp_rel = lesser(tmp_src, GR[r 3 ]);<br />

else if (crel == ‘leu’) tmp_rel = lesser_equal(tmp_src, GR[r 3 ]);<br />

else if (crel == ‘gtu’) tmp_rel = greater(tmp_src, GR[r 3 ]);<br />

else tmp_rel = greater_equal(tmp_src, GR[r 3 ]);//‘geu’<br />

switch (ctype) {<br />

case ‘and’: // and-type compare<br />

if (tmp_nat || !tmp_rel) {<br />

PR[p 1 ] = 0;<br />

PR[p 2 ] = 0;<br />

}<br />

break;<br />

case ‘or’: // or-type compare<br />

if (!tmp_nat && tmp_rel) {<br />

PR[p 1 ] = 1;<br />

PR[p 2] = 1;<br />

}<br />

break;<br />

case ‘or.andcm’: // or.andcm-type compare<br />

if (!tmp_nat && tmp_rel) {<br />

PR[p 1 ] = 1;<br />

PR[p 2] = 0;<br />

}<br />

break;<br />

case ‘unc’: // unc-type compare<br />

default: // normal compare<br />

if (tmp_nat) {<br />

PR[p 1] = 0;<br />

PR[p 2 ] = 0;<br />

} else {<br />

PR[p 1] = tmp_rel;<br />

PR[p 2 ] = !tmp_rel;<br />

}<br />

break;<br />

}<br />

} else {<br />

if (ctype == ‘unc’) {<br />

if (p1 == p2)<br />

illegal_operation_fault();<br />

PR[p 1] = 0;<br />

PR[p 2 ] = 0;<br />

}<br />

}<br />

割り込み : 無効操作フ ォ ル ト<br />

3:36 第 3 巻 : 命令リファレンス<br />

cmp


cmp4<br />

cmp4 ─ 4 バイト比較 (Compare 4 Bytes)<br />

書式 : (qp) cmp4.crel.ctype p 1 , p 2 = r 2 , r 3 register_form A6<br />

(qp) cmp4.crel.ctype p 1 , p 2 = imm 8 , r 3 imm8_form A8<br />

(qp) cmp4.crel.ctype p 1 , p 2 = r0, r 3 parallel_inequality_form A7<br />

(qp) cmp4.crel.ctype p 1 , p 2 = r 3 , r0 擬似オペ コ ー ド<br />

説明 : 2 つのソース ・ オペラン ド のそれぞれの最下位 32 ビッ トが、 crel で指定される 10 種類の<br />

関係のいずれか 1 つについて比較される。 この比較によ り、 ブール結果が生成される。<br />

ブール結果は、 比較条件が真の場合に 1 になり、 真でない場合に 0 になる。 この結果は、<br />

2 つのプレディケート ・レジスタ・デスティネーションp1 と p2 に書き込 ま れる。 結果が<br />

デステ ィ ネーシ ョ ンにどのよ う に書き込まれるかは、 ctype で指定される比較タ イプに よ<br />

り決まる。 Compare 命令 と 表 2-15 を参照のこ と。<br />

register_form では、 第 1 オペラン ド は GR r2 であり、 imm8_form では、 第 1 オペラン ド<br />

は符号拡張された imm8 エンコ ーデ ィ ング ・ フ ィ ール ド で与えられる。 また、<br />

parallel_inequality_form では、 第 1 オペラン ド は GR 0 でなければならない。<br />

parallel_inequality_form は、 比較タイプが並列タイプのいずれかであり、 かつ関係が不等<br />

(>、 >=、 = b 0 .. 127, 2 32 -128 .. 2 32 -1<br />

即値の範囲<br />

第 3 巻 : 命令リファレンス 3:37


操作 : if (PR[qp]) {<br />

if (p1 == p2)<br />

illegal_operation_fault();<br />

tmp_nat = (register_form ? GR[r 2].nat : 0) || GR[r 3].nat;<br />

if (register_form)<br />

tmp_src = GR[r 2 ];<br />

else if (imm8_form)<br />

tmp_src = sign_ext(imm 8 , 8);<br />

else // parallel_inequality_form<br />

tmp_src = 0;<br />

if (crel == ‘eq’) tmp_rel = tmp_src{31:0} == GR[r 3 ]{31:0};<br />

else if (crel == ‘ne’) tmp_rel = tmp_src{31:0} != GR[r 3 ]{31:0};<br />

else if (crel == ‘lt’)<br />

tmp_rel = lesser_signed(sign_ext(tmp_src, 32),<br />

sign_ext(GR[r 3 ], 32));<br />

else if (crel == ‘le’)<br />

tmp_rel = lesser_equal_signed(sign_ext(tmp_src, 32),<br />

sign_ext(GR[r 3 ], 32));<br />

else if (crel == ‘gt’)<br />

tmp_rel = greater_signed(sign_ext(tmp_src, 32),<br />

sign_ext(GR[r 3 ], 32));<br />

else if (crel == ‘ge’)<br />

tmp_rel = greater_equal_signed(sign_ext(tmp_src, 32),<br />

sign_ext(GR[r 3 ], 32));<br />

else if (crel == ‘ltu’)<br />

tmp_rel = lesser(zero_ext(tmp_src, 32),<br />

zero_ext(GR[r 3 ], 32));<br />

else if (crel == ‘leu’)<br />

tmp_rel = lesser_equal(zero_ext(tmp_src, 32),<br />

zero_ext(GR[r 3 ], 32));<br />

else if (crel == ‘gtu’)<br />

tmp_rel = greater(zero_ext(tmp_src, 32),<br />

zero_ext(GR[r 3 ], 32));<br />

else // ‘geu’<br />

tmp_rel = greater_equal(zero_ext(tmp_src, 32),<br />

zero_ext(GR[r 3 ], 32));<br />

cmp4<br />

switch (ctype) {<br />

case ‘and’: // and-type compare<br />

if (tmp_nat || !tmp_rel) {<br />

PR[p 1 ] = 0;<br />

PR[p 2 ] = 0;<br />

}<br />

break;<br />

case ‘or’: // or-type compare<br />

if (!tmp_nat && tmp_rel) {<br />

PR[p 1 ] = 1;<br />

PR[p 2 ] = 1;<br />

}<br />

break;<br />

case ‘or.andcm’: // or.andcm-type compare<br />

if (!tmp_nat && tmp_rel) {<br />

PR[p 1 ] = 1;<br />

PR[p 2 ] = 0;<br />

}<br />

break;<br />

case ‘unc’: // unc-type compare<br />

default: // normal compare<br />

if (tmp_nat) {<br />

3:38 第 3 巻 : 命令リファレンス


cmp4<br />

PR[p1 ] = 0;<br />

PR[p2] = 0;<br />

} else {<br />

PR[p1 ] = tmp_rel;<br />

PR[p2] = !tmp_rel;<br />

}<br />

break;<br />

}<br />

} else {<br />

if (ctype == ‘unc’) {<br />

if (p1 == p2)<br />

illegal_operation_fault();<br />

PR[p1 ] = 0;<br />

PR[p2 ] = 0;<br />

}<br />

}<br />

割り込み : 無効操作フ ォ ル ト<br />

第 3 巻 : 命令リファレンス 3:39


cmpxchg ─ 比較交換 (Compare And Exchange)<br />

cmpxchg<br />

書式 : (qp) cmpxchgsz.sem.ldhint r 1 = [r 3 ], r 2 , ar.ccv M16<br />

(qp) cmp8xchg16.sem.ldhint r1 = [r 3 ], r 2 , ar.csd, ar.ccv sixteen_byte_form M16<br />

説明 : GR r3 の値で指定されるアドレスから始まるメモリ位置から sz バイ ト (cmp8xchg16 では<br />

8 バイ ト ) の値が読み込 ま れる。 こ の値はゼ ロ拡張 さ れ、 比較交換での比較値 (cmpxchg<br />

Compare Value) アプ リ ケーシ ョ ン ・ レジスタの内容 (AR[CCV]) と比較される。 2 つが等<br />

しい場合は、 GR r2 の最下位の sz ビッ トが取り出され、 GR r3 の値で指定されるア ド レ ス<br />

から始まるメモリ位置に書き込まれる。 cmp8xchg16 の場合、 2 つが等しい場合は、 ビ ッ<br />

ト 3 を無視する指定されたア ド レ ス (GR r3 & ~ 0x4) に GR r2 からの8 バイ ト がス ト アさ<br />

れ、 そのア ド レ ス に 8 を加えたア ド レス ((GR r3 & ~ 0x4)+ 8) に Compare and Store Data<br />

アプ リ ケーシ ョ ン ・ レジスタ (AR[CSD]) からの8 バイ ト がス ト アされる。 メモリから読<br />

み込まれ、 ゼロ拡張された値は GR r1 に格納され、 GR r1 に対応する NaT ビッ トがクリ<br />

アされる。<br />

sz コンプリータの値を表 2-19 に示す。 sem コンプリータでセマフォ操作のタイプを指定<br />

する。 それらの操作の説明を、 表 2-20 に示す。 メモ リ順序の詳細は、 第 2 巻、 第 1 部の<br />

4.4.7 項 「シーケンシャル属性と順序付け」 を参照のこ と。<br />

表 2-19. 比較交換のメモリ・サイズ<br />

表 2-20. 比較交換セマフォのタイプ<br />

sem<br />

コンプリータ<br />

acq 取得<br />

rel 解放<br />

sz コンプリータ アクセスされるバイト数<br />

1 1<br />

2 2<br />

4 4<br />

8 8<br />

順序付けの<br />

セマンティックス<br />

セマフォ操作<br />

後続のすべてのデータ・メモリ・アクセスの前に、メモリに対する読<br />

み取り / 書き込みが検出可能になる。<br />

先行のすべてのデータ・メモリ・アクセスの後に、メモリに対する読<br />

み取り / 書き込みが検出可能になる。<br />

GR r3 の値で指定されるア ド レ スが、 メモ リ でア クセス されるサイズに自然にアラ イ メ<br />

ントされていない場合は、 ユーザ・マスク (User Mask) アライメン ト ・ チェ ッ ク ・ ビッ ト<br />

UM.ac ( プロセッサ ・ ステータス ・ レジスタの PSR.ac) の状態に関わらず、 非アラ イ メン<br />

ト・データ参照 (Unaligned Data Reference) フォルトが発生する。 cmp8xchg16 命令では、<br />

指定 さ れる ア ド レ ス は 8 バイ ト にアライメン トが合っていなければならない。<br />

メモ リ に対する読み取り およ び書き込みはア ト ミ ッ ク な操作である こ と が保証されてい<br />

る。 cmp8xchg16 命令では、 8 バイ ト のメモリ読み取り と 16 バイ ト のメモリ書き込みは<br />

ア ト ミ ッ ク な操作であ る こ と が保証 さ れている。<br />

参照 さ れるペー ジ に対する読み取 り お よ び書き込みの両方のア ク セス特権が必要であ る。<br />

メモ リ への書き込みが行われるかど う かに関わらず、 書み込みアク セス特権のチェ ッ ク<br />

が行われる。<br />

こ の命令は、 ラ イ ト バ ッ ク書き込みポ リ シ ー を持つキ ャ ッ シ ュ可能ペー ジ に対してのみ<br />

有効であ る。 NaTPage にアクセスする と、 データ NaT ペー ジ参照フ ォ ル ト が発生す る。<br />

他のメモ リ 属性を持つペー ジにアク セスする と、 サポ ー ト されないデー タ参照フ ォ ル ト<br />

が発生する。<br />

3:40 第 3 巻 : 命令リファレンス


cmpxchg<br />

ldhint コ ンプ リ ー タの値で、 メモ リ ・ ア クセスの局所性を指定する。 ldhint コンプリータ<br />

の値の一覧を 3:136 ページの表 2-34 に示してい る。 局所性 ヒ ン ト はプ ロ グ ラ ムの機能に<br />

は影響せず、 プログラム ・ コ ー ド では無視も でき る。 詳細は第 1 巻、 第 1 部の 4.4.6 項<br />

「メモ リ 階層の制御 と 整合性」 を参照のこ と。<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1 );<br />

}<br />

if (GR[r 3].nat || GR[r 2].nat)<br />

register_nat_consumption_fault(SEMAPHORE);<br />

if (sixteen_byte_form)<br />

sz = 8;<br />

paddr = tlb_translate(GR[r 3], sz, SEMAPHORE, PSR.cpl, &mattr,<br />

&tmp_unused);<br />

if (!ma_supports_semaphores(mattr))<br />

unsupported_data_reference_fault(SEMAPHORE, GR[r 3 ]);<br />

if (sixteen_byte_form) {<br />

if (sem == ‘acq’)<br />

val = mem_xchg16_cond(AR[CCV], GR[r 2], AR[CSD], paddr, UM.be,<br />

mattr, ACQUIRE, ldhint);<br />

else // ‘rel’<br />

val = mem_xchg16_cond(AR[CCV], GR[r 2], AR[CSD], paddr, UM.be,<br />

mattr, RELEASE, ldhint);<br />

} else {<br />

if (sem == ‘acq’)<br />

val = mem_xchg_cond(AR[CCV], GR[r 2 ], paddr, sz, UM.be, mattr,<br />

ACQUIRE, ldhint);<br />

else // ‘rel’<br />

val = mem_xchg_cond(AR[CCV], GR[r 2 ], paddr, sz, UM.be, mattr,<br />

RELEASE, ldhint);<br />

val = zero_ext(val, sz * 8);<br />

}<br />

if (AR[CCV] == val)<br />

alat_inval_multiple_entries(paddr, sz);<br />

GR[r 1] = val;<br />

GR[r 1 ].nat = 0;<br />

割り込み : 無効操作フ ォ ル ト デー タ ・ キ ー ・ ミ ス ・ フ ォ ル ト<br />

レジスタ NaT 参照フ ォ ル ト デー タ ・ キ ー許可フ ォ ル ト<br />

実装 さ れていないデ ー タ ・ ア ド レ ス ・ フ ォ ル ト デー タ ・ ア ク セス権フ ォ ル ト<br />

データがネス ト された TLB フォルト データ・ダーティ・ビット ・フォルト<br />

別のデー タ TLB フォルト データ・アクセス・ビット ・フォルト<br />

VHPT データ ・ フォル ト データ ・ デバッグ ・ フォル ト<br />

データ TLB フ ォ ル ト 符号なしデー タ参照フ ォ ル ト<br />

データ ・ ページ不在フォルト サポー ト されないデータ参照フォルト<br />

データ NaT ページ参照フォル ト<br />

第 3 巻 : 命令リファレンス 3:41


cover ─ スタック・フレームのカバー (Cover Stack Frame)<br />

cover<br />

書式 : cover B8<br />

説明 : 以前のフレームからのレジスタを含まない、 サイズがゼロの新しいスタック ・ フレーム<br />

が割り 当て られる ( 以前のフレーム内のすべての出力レジスタは、 ローカル・ レジスタ<br />

であるかのよ う に処理される )。 レジスタ ・ リネーム ・ベース ・ レジスタはリセッ ト され<br />

る。 割り込みコレクションがディスエーブルにされている場合は(PSR.ic が 0)、 現在の<br />

フレーム ・マーカ (CFM) の古い値が割り込み関数の状態レジスタ (IFS) にコピーされ、<br />

IFS.v が 1 にセッ ト される。<br />

cover 命令は、 命令グルー プ内の最後の命令でなければな ら ない。 そ う でない場合は、<br />

無効操作フ ォ ル ト が発生す る。<br />

こ の命令に はプ レ デ ィ ケ ー ト を使用で き ない。<br />

操作 : if (!followed_by_stop())<br />

illegal_operation_fault();<br />

alat_frame_update(CFM.sof, 0);<br />

rse_preserve_frame(CFM.sof);<br />

if (PSR.ic == 0) {<br />

CR[IFS].ifm = CFM;<br />

CR[IFS].v = 1;<br />

}<br />

CFM.sof = 0;<br />

CFM.sol = 0;<br />

CFM.sor = 0;<br />

CFM.rrb.gr = 0;<br />

CFM.rrb.fr = 0;<br />

CFM.rrb.pr = 0;<br />

割り込み : 無効操作フ ォ ル ト<br />

3:42 第 3 巻 : 命令リファレンス


czx<br />

czx ─ ゼロ・インデックスの算出 (Compute Zero Index)<br />

書式 : (qp) czx1.lr 1 = r 3 one_byte_form, left_form I29<br />

(qp) czx1.rr 1 = r 3 one_byte_form, right_form I29<br />

(qp) czx2.lr 1 = r 3 two_byte_form, left_form I29<br />

(qp) czx2.rr 1 = r 3 two_byte_form, right_form I29<br />

説明 : ゼロ要素を探して GR r 3 がスキャンされる。 要素は、 8 ビッ トにアライメントされた1 バ<br />

イト (one_byte_form) か 16 ビッ トにアライメントされた2 バイ ト (two_byte_form) である。<br />

最初に検出されたゼロ要素のインデッ クスが GR r 1 に格納される。 GR r 3 にゼロ要素がな<br />

い場合は、 デフ ォ ル ト 値が GR r 2 に格納される。 表 2-21 に起こ り う る結果を示す。<br />

left_form では、 ソ ー スが最上位要素か ら 最下位要素にスキ ャ ン さ れ、 right_form では、<br />

ソ ー スが最下位要素か ら 最上位要素に ス キ ャ ン さ れる。<br />

表 2-21. czx の結果の範囲<br />

サイズ 要素幅<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1);<br />

ゼロ要素が検出された場合の<br />

結果の範囲<br />

ゼロ要素が検出されなかった場合の<br />

デフォルト結果<br />

1 8 ビット 0-7 8<br />

2 16 ビット 0-3 4<br />

if (one_byte_form) {<br />

if (left_form) { // scan from most significant down<br />

if ((GR[r 3 ] & 0xff00000000000000) == 0) GR[r 1 ] = 0;<br />

else if ((GR[r 3 ] & 0x00ff000000000000) == 0) GR[r 1 ] = 1;<br />

else if ((GR[r 3] & 0x0000ff0000000000) == 0) GR[r 1] = 2;<br />

else if ((GR[r 3 ] & 0x000000ff00000000) == 0) GR[r 1 ] = 3;<br />

else if ((GR[r 3 ] & 0x00000000ff000000) == 0) GR[r 1 ] = 4;<br />

else if ((GR[r 3] & 0x0000000000ff0000) == 0) GR[r 1] = 5;<br />

else if ((GR[r 3 ] & 0x000000000000ff00) == 0) GR[r 1 ] = 6;<br />

else if ((GR[r 3 ] & 0x00000000000000ff) == 0) GR[r 1 ] = 7;<br />

else GR[r 1] = 8;<br />

} else { // right_form scan from least significant up<br />

if ((GR[r 3 ] & 0x00000000000000ff) == 0) GR[r 1 ] = 0;<br />

else if ((GR[r 3] & 0x000000000000ff00) == 0) GR[r 1] = 1;<br />

else if ((GR[r 3 ] & 0x0000000000ff0000) == 0) GR[r 1 ] = 2;<br />

else if ((GR[r 3 ] & 0x00000000ff000000) == 0) GR[r 1 ] = 3;<br />

else if ((GR[r 3 ] & 0x000000ff00000000) == 0) GR[r 1 ] = 4;<br />

else if ((GR[r 3 ] & 0x0000ff0000000000) == 0) GR[r 1 ] = 5;<br />

else if ((GR[r 3 ] & 0x00ff000000000000) == 0) GR[r 1 ] = 6;<br />

else if ((GR[r 3 ] & 0xff00000000000000) == 0) GR[r 1 ] = 7;<br />

else GR[r 1 ] = 8;<br />

}<br />

} else { // two_byte_form<br />

if (left_form) { // scan from most significant down<br />

if ((GR[r 3 ] & 0xffff000000000000) == 0) GR[r 1 ] = 0;<br />

else if ((GR[r 3 ] & 0x0000ffff00000000) == 0) GR[r 1 ] = 1;<br />

else if ((GR[r 3 ] & 0x00000000ffff0000) == 0) GR[r 1 ] = 2;<br />

else if ((GR[r 3 ] & 0x000000000000ffff) == 0) GR[r 1 ] = 3;<br />

else GR[r 1 ] = 4;<br />

} else { // right_form scan from least significant up<br />

if ((GR[r 3 ] & 0x000000000000ffff) == 0) GR[r 1 ] = 0;<br />

else if ((GR[r 3 ] & 0x00000000ffff0000) == 0) GR[r 1 ] = 1;<br />

else if ((GR[r 3 ] & 0x0000ffff00000000) == 0) GR[r 1 ] = 2;<br />

else if ((GR[r 3 ] & 0xffff000000000000) == 0) GR[r 1 ] = 3;<br />

else GR[r 1 ] = 4;<br />

第 3 巻 : 命令リファレンス 3:43


}<br />

}<br />

}<br />

GR[r1 ].nat = GR[r3 ].nat;<br />

割り込み : 無効操作フ ォ ル ト<br />

3:44 第 3 巻 : 命令リファレンス<br />

czx


dep<br />

dep ─ デポジット (Deposit)<br />

書式 : (qp) depr 1 = r 2 , r 3 , pos 6 , len 4 merge_form, register_form I15<br />

(qp) depr 1 = imm 1 , r 3, pos 6 , len 6 merge_form, imm_form I14<br />

(qp) dep.zr 1 = r 2 , pos 6 , len 6 zero_form, register_form I12<br />

(qp) dep.zr 1 = imm 8 , pos 6 , len 6 zero_form, imm_form I13<br />

説明 : merge_form では、 第 1 ソース・オペランドから右寄せビット ・フィールドが取り出され<br />

て、 それを GR r3 の値の任意の ビ ッ ト 位置に挿入した結果が GR r1 に格納される。<br />

register_form では、 第 1 ソース・オペランドはGR r2 であり、 imm_form では、 第 1 オペ<br />

ランドは imm1 を符号拡張した ( つまり、 すべて "1" かすべて "0") 値である。 結果が挿入<br />

されるビッ ト ・ フ ィ ールドは、 即値 pos6 で指定される ビ ッ ト 位置か ら 始 ま り 、 左方向に<br />

( 最上位ビ ッ ト 方向に ) 即値 len で指定される ビ ッ ト 数のサイズを も つ。 即値 len の範囲<br />

は、 register_form では 1 ~ 16、 imm_form では 1 ~ 64 であるのに注意する。 即値 pos6 の<br />

範囲は 0 ~ 63 である。<br />

zero_form では、 GR r2 の値 (register_form の場合 ) か imm8 を符号拡張した値 (imm_form<br />

の場合 ) で与え られる右寄せビ ッ ト ・ フ ィ ール ド が GR r1 に挿入され、 GR r1 のその他の<br />

すべてのビ ッ ト がゼロ ・ ク リ アされる。 GR r1 に挿入されるビ ッ ト ・ フ ィ ール ド は、 即<br />

値 pos6 で指定 さ れる ビ ッ ト 位置か ら 始 ま り 、 左方向に ( 最上位ビ ッ ト 方向に ) 即値 len<br />

で指定される ビ ッ ト 数のサイズを も つ。 即値 len の範囲は 1 ~ 64 で、 即値 pos6 の範囲は<br />

0 ~ 63 である。<br />

挿入されるビット・フィールドがターゲットのビット63 を超える場合、 つま り、 len +<br />

pos6 > 64 である場合は、 挿入されるビ ッ ト ・ フ ィ ール ド の最上位の len + pos6 - 64 ビッ ト<br />

が切り 捨て られる。 即値 len は命令内では len - 1 としてエンコードされる。<br />

dep r 1 = r 2 , 36, 16 の操作の図解を図 2-5 に示す。<br />

図 2-5. デポジットの例<br />

GR r 3:<br />

dep.z r 1 = r 2, r 3, 36, 16 の操作の図解を図 2-6 に示す。<br />

図 2-6. デポジットの例 (zero_form)<br />

52<br />

36<br />

GR r 1 :<br />

GR r 2 :<br />

GR r 1 :<br />

0<br />

52<br />

第 3 巻 : 命令リファレンス 3:45<br />

52<br />

0<br />

36<br />

36<br />

GR r 2 :<br />

1615<br />

0<br />

0<br />

0<br />

0<br />

16<br />

0


操作 : if (PR[qp]) {<br />

check_target_register(r 1);<br />

}<br />

if (imm_form) {<br />

tmp_src = (merge_form ? sign_ext(imm 1,1) : sign_ext(imm 8, 8));<br />

tmp_nat = merge_form ? GR[r 3 ].nat : 0;<br />

tmp_len = len 6 ;<br />

} else { // register_form<br />

tmp_src = GR[r 2 ];<br />

tmp_nat = (merge_form ? GR[r 3 ].nat : 0) || GR[r 2 ].nat;<br />

tmp_len = merge_form ? len 4 : len 6 ;<br />

}<br />

if (pos 6 + tmp_len u> 64)<br />

tmp_len = 64 - pos 6 ;<br />

if (merge_form)<br />

GR[r 1 ] = GR[r 3 ];<br />

else // zero_form<br />

GR[r 1 ] = 0;<br />

割り込み : 無効操作フ ォ ル ト<br />

GR[r 1 ]{(pos 6 + tmp_len - 1):pos 6 } = tmp_src{(tmp_len - 1):0};<br />

GR[r 1 ].nat = tmp_nat;<br />

3:46 第 3 巻 : 命令リファレンス<br />

dep


epc<br />

epc ─ 特権コードへの移行 (Enter Privileged Code)<br />

書式 : epc B8<br />

説明 : この命令は、 特権レベルを上げる。 新しい特権レベルは、 この命令を含むページの TLB<br />

エントリで指定される。 この命令を使用して、割り込みのオーバーヘッドなしに、上位<br />

の特権を持つルーチンの呼び出しを実行で き る。<br />

特権レベルを上げ る前に、 チ ェ ッ ク が実行 さ れる。 PFS.ppl( 以前の特権レベル ) が<br />

チ ェ ッ ク され、 以前の特権レベルが現在の特権レベル よ り 高 く ない こ と が確認される。<br />

こ のチ ェ ッ ク にパス しなか っ た場合は、 こ の命令に よ っ て無効操作フ ォ ル ト が発生す る。<br />

チェックにパスした場合は、 次のように特権レベルが上げられる。<br />

• 命令ア ド レ ス変換が イ ネ ー ブルに さ れてお り 、 epc 命令を含むペー ジが 「実行のみ」<br />

のペー ジ ・ アク セス権を持ち、 そのペー ジに割り当てられた特権レベルが現在の特<br />

権レベルよ り高い ( 数値が小 さ い ) 場合は、 現在の特権レベルは、 epc 命令を含む<br />

ページの変換エン ト リ の特権レベル ・ フ ィ ール ド に合わせて設定される。 この命令<br />

は、 特権レベルを上げ られるが、 下げる こ と はできない。 新しい特権は、 TLB エン<br />

トリから得られる。<br />

命令ア ド レ ス変換がデ ィ スエ ー ブルに さ れてい る場合は、 現在の特権レベルは 0( 最<br />

高の特権レベル ) に設定される。<br />

同じ命令グループ内の epc よ り 後の命令は、 古い特権レベルで も 、 新しい上位の特<br />

権レベルで も 実行で き る。 後続の命令グルー プ内の命令は、 新しい上位の特権レ ベ<br />

ルで実行される。<br />

• epc 命令を含むペー ジ が「 実行のみ」 以外のアク セス 権を 持つ場合や、 そのペー ジ に<br />

割り 当てら れた特権レ ベルが現在の特権レ ベルよ り 低いか等し い ( 数値がよ り 大き い<br />

か等しい ) 場合は、 操作は 何も 実行さ れない ( 現在の特権レ ベルは変更さ れない )。<br />

ITLB は、 実際には、 命令のフ ェ ッ チ時に一度だけ読み込まれる。 その後、 アクセス権の<br />

情報 と変換エン ト リ の特権レベル ・ フ ィ ール ド が、 こ の命令の実行に使用される。<br />

こ の命令に はプ レ デ ィ ケ ー ト を使用で き ない。<br />

操作 : if (AR[PFS].ppl u< PSR.cpl)<br />

illegal_operation_fault();<br />

if (PSR.it)<br />

PSR.cpl = tlb_enter_privileged_code();<br />

else<br />

PSR.cpl = 0;<br />

割り込み : 無効操作フ ォ ル ト<br />

第 3 巻 : 命令リファレンス 3:47


extr ─ 抽出 (Extract)<br />

書式 : (qp) extrr 1 = r 3 , pos 6 , len 6 signed_form I11<br />

(qp) extr.ur 1 = r 3 , pos 6 , len 6 unsigned_form I11<br />

説明 : GR r3 か ら フ ィ ー ル ド が抽出 さ れ、 ゼ ロ拡張 ま たは符号拡張されて GR r1 に格納される。<br />

抽出 さ れる フ ィ ー ル ド は、 第 2 オペラ ン ド で与え ら れる ビ ッ ト 位置か ら 始ま り 、 左方向<br />

に len6 のビット数のサイズをもつ。 フィールドの開始ビット位置は即値pos6 で指定され<br />

る。 抽出されたフ ィ ール ド は、 signed_form では符号拡張 さ れ、 unsigned_form ではゼロ<br />

拡張される。 符号は、 抽出されたフィ ールドの最上位ビッ ト から取られる。 指定された<br />

フィールドがGR r3 の最上位ビッ ト を超える場合は、 符号は GR r3 の最上位ビ ッ ト と な<br />

る。 即値 len6 には、 範囲 0 ~ 63 内の任意の値を使用でき、 命令内では len6 - 1 としてエ<br />

ンコード される。 即値pos6 は、 範囲 1 ~ 64 内の任意の値を使用でき る。<br />

extr r1 = r3 , 7, 50 の操作の図解を図 2-7 に示す。<br />

図 2-7. 抽出の例<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1 );<br />

}<br />

GR r 3 :<br />

GR r 1 :<br />

tmp_len = len 6 ;<br />

割り込み : 無効操作フ ォ ル ト<br />

63<br />

63<br />

sign<br />

if (pos 6 + tmp_len u> 64)<br />

tmp_len = 64 - pos 6 ;<br />

if (unsigned_form)<br />

GR[r 1 ] = zero_ext(shift_right_unsigned(GR[r3], pos6), tmp_len);<br />

else // signed_form<br />

GR[r 1 ] = sign_ext(shift_right_unsigned(GR[r3], pos6), tmp_len);<br />

GR[r 1 ].nat = GR[r 3 ].nat;<br />

56 7 0<br />

49 0<br />

3:48 第 3 巻 : 命令リファレンス<br />

extr


fabs<br />

fabs ─ 浮動小数点絶対値 (Floating-point Absolute Value)<br />

書式 : (qp) fabsf 1 = f 3 (qp) fmerge.s f 1 = f0, f 3 の擬似オペコ ー ド<br />

説明 : FR f3 の絶対値が計算 され、 その結果が FR f1 に格納される。<br />

FR f3 が NaTVal である場合は、 FR f1 は計算結果ではな く NaTVal に設定される。<br />

操作 : 3:72 ページの 「fmerge — 浮動小数点マ ー ジ (Floating-point Merge)」 を参照のこ と 。<br />

第 3 巻 : 命令リファレンス 3:49


fadd ─ 浮動小数点加算 (Floating-point Add)<br />

書式 : (qp) fadd.pc.sf f 1 = f 3 , f 2 (qp) fma.pc.sf f 1 = f 3 , f1, f 2 の擬似オペコ ー ド<br />

説明 : FR f3 と FR f2 とが加算 ( 無限の精度で計算 ) され、 FPSR.sf.rc に指定されている丸めモー<br />

ドとpc ( さらにFPSR.sf.pc と FPSR.sf.wre) で指定される精度にしたがっ て丸められ、 そ<br />

の結果が FR f1 に格納される。 FR f3 か FR f2 が NaTVal である場合は、 FR f1 は計算結果<br />

ではな く NaTVal に設定される。<br />

オペコ ー ド の pc のニーモニ ッ ク値を表 2-22 に、 sf のニーモニッ ク値を表 2-23 にそれぞ<br />

れ示す。 ス テ ー タ ス ・ フ ィ ー ル ド の pc、 wre、 rc のエン コ ーデ ィ ング と意味については、<br />

第 1 巻、 第 1 部の表 5-5 および第 1 巻、 第 1 部の表 5-6 を参照のこ と。<br />

表 2-22. pc ニーモニックの指定値<br />

pc ニーモニック 指定される精度<br />

.s 単精度<br />

.d 倍精度<br />

無指定 動的 ( つまり、ステータス・フィールドの pc 値を使用 )<br />

表 2-23. sf ニーモニックの値<br />

sf ニーモニック アクセスされるステータス・フィールド<br />

.s0 または無指定<br />

sf0<br />

.s1 sf1<br />

.s2 sf2<br />

.s3 sf3<br />

操作 : 3:70 ページの 「fma — 浮動小数点積和 (Floating-point Multiply Add)」 を参照のこと 。<br />

3:50 第 3 巻 : 命令リファレンス<br />

fadd


famax<br />

famax ─ 浮動小数点絶対最大値 (Floating-point Absolute Maximum)<br />

書式 : (qp) famax.sf f 1 = f 2 , f 3 F8<br />

説明 : 絶対値が大き い方のオペラ ン ド が FR f1 に格納される。 FR f2 の絶対値が FR f3 の絶対値 と<br />

等しい場合は、 FR f1 には FR f3 の値が格納される。<br />

FR f2 か FR f3 が NaN である場合は、 FR f1 には FR f3 の値が格納される。<br />

FR f2 か FR f3 が NaTVal である場合は、 FR f1 は計算結果ではな く NaTVal に設定される。<br />

こ の操作は、 他の浮動小数点算術演算命令 と は異な り 、 NaN を伝播させない。 fcmp.lt<br />

操作 と 同じ方法で無効操作 (Invalid Operation) が通知される。<br />

sf のニーモニ ッ ク値は、 3:50 ページの表 2-23 に示している。<br />

操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1);<br />

if (tmp_isrcode = fp_reg_disabled(f 1 , f 2 , f 3 , 0))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

}<br />

if (fp_is_natval(FR[f 2 ]) || fp_is_natval(FR[f 3 ])) {<br />

FR[f 1 ] = NATVAL;<br />

} else {<br />

fminmax_exception_fault_check(f 2 , f 3 , sf, &tmp_fp_env);<br />

if (fp_raise_fault(tmp_fp_env))<br />

fp_exception_fault(fp_decode_fault(tmp_fp_env));<br />

}<br />

tmp_right = fp_reg_read(FR[f 2 ]);<br />

tmp_left = fp_reg_read(FR[f 3 ]);<br />

tmp_right.sign = FP_SIGN_POSITIVE;<br />

tmp_left.sign = FP_SIGN_POSITIVE;<br />

tmp_bool_res = fp_less_than(tmp_left, tmp_right);<br />

FR[f 1 ] = tmp_bool_res ? FR[f 2 ] : FR[f 3 ];<br />

fp_update_fpsr(sf, tmp_fp_env);<br />

fp_update_psr(f 1 );<br />

FP 例外 : 無効操作 (Invalid Operation: V)<br />

デノーマル/ アンノ ーマル ・ オペラン ド (Denormal/Unnormal Operand: D)<br />

ソフ ト ウェア・アシスト (Software Assist: SWA) フォルト<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点例外フ ォ ル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト<br />

第 3 巻 : 命令リファレンス 3:51


famin ─ 浮動小数点絶対最小値 (Floating-point Absolute Minimum)<br />

famin<br />

書式 : (qp) famin.sf f 1 = f 2 , f 3 F8<br />

説明 : 絶対値が小 さ い方のオペラ ン ド が FR f1 に格納される。 FR f2 の絶対値が FR f3 の絶対値 と<br />

等しい場合は、 FR f1 には FR f3 の値が格納される。<br />

FR f2 か FR f3 が NaN である場合は、 FR f1 には FR f3 の値が格納される。<br />

FR f2 か FR f3 が NaTVal である場合は、 FR f1 は計算結果ではな く NaTVal に設定される。<br />

こ の操作は、 他の浮動小数点算術演算命令 と は異な り 、 NaN を伝播させない。 fcmp.lt<br />

操作 と 同じ方法で無効操作 (Invalid Operation) が通知される。<br />

sf のニーモニ ッ ク値は、 3:50 ページの表 2-23 に示している。<br />

操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1);<br />

if (tmp_isrcode = fp_reg_disabled(f 1 , f 2 , f 3 , 0))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

}<br />

if (fp_is_natval(FR[f 2 ]) || fp_is_natval(FR[f 3 ])) {<br />

FR[f 1 ] = NATVAL;<br />

} else {<br />

fminmax_exception_fault_check(f 2 , f 3 , sf, &tmp_fp_env);<br />

if (fp_raise_fault(tmp_fp_env))<br />

fp_exception_fault(fp_decode_fault(tmp_fp_env));<br />

}<br />

tmp_left = fp_reg_read(FR[f 2 ]);<br />

tmp_right = fp_reg_read(FR[f 3 ]);<br />

tmp_left.sign = FP_SIGN_POSITIVE;<br />

tmp_right.sign = FP_SIGN_POSITIVE;<br />

tmp_bool_res = fp_less_than(tmp_left, tmp_right);<br />

FR[f 1 ] = tmp_bool_res ? FR[f 2 ] : FR[f 3 ];<br />

fp_update_fpsr(sf, tmp_fp_env);<br />

fp_update_psr(f 1 );<br />

FP 例外 : 無効操作 (Invalid Operation: V)<br />

デノーマル/ アンノ ーマル ・ オペラン ド (Denormal/Unnormal Operand: D)<br />

ソフ ト ウェア・アシスト (Software Assist: SWA) フォルト<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点例外フ ォ ル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト<br />

3:52 第 3 巻 : 命令リファレンス


fand<br />

fand ─ 浮動小数点論理積 (Floating-point Logical And)<br />

書式 : (qp) fandf 1 = f 2 , f 3 F9<br />

説明 : FR f2 と FR f3 の両仮数フ ィ ー ル ド 間の ビ ッ ト 単位の論理積が計算 さ れる。 結果の値は FR<br />

f1 の仮数フ ィ ール ド に格納される。 FR f1 の指数フ ィ ール ド は 2.063 (0x1003E) のバイアス<br />

付き指数に設定され、 FR f1 の符号フ ィ ール ド は正に対応する 0 に設定される。<br />

FR f2 か FR f3 が NaTVal である場合は、 FR f1 は計算結果ではな く NaTVal に設定される。<br />

操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1 );<br />

if (tmp_isrcode = fp_reg_disabled(f 1 , f 2 , f 3 , 0))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

}<br />

FP 例外 : なし。<br />

if (fp_is_natval(FR[f 2 ]) || fp_is_natval(FR[f 3 ])) {<br />

FR[f 1] = NATVAL;<br />

} else {<br />

FR[f 1 ].significand = FR[f 2 ].significand & FR[f 3 ].significand;<br />

FR[f 1].exponent = FP_INTEGER_EXP;<br />

FR[f 1 ].sign = FP_SIGN_POSITIVE;<br />

}<br />

fp_update_psr(f 1);<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点レ ジ ス タ無効フ ォ ル ト<br />

第 3 巻 : 命令リファレンス 3:53


fandcm ─ 浮動小数点補数の論理積 (Floating-point And Complement)<br />

fandcm<br />

書式 : (qp) fandcmf 1 = f 2 , f 3 F9<br />

説明 : FR f2 の仮数フ ィ ール ド と 、 FR f3 の仮数フ ィ ール ド をビ ッ ト 単位に補数を と っ た も の と<br />

の間でビ ッ ト 単位の論理積が計算される。 結果の値は FR f1 の仮数フ ィ ール ド に格納さ<br />

れる。 FR f1 の指数フ ィ ール ド は 2.063 (0x1003E) のバイアス付き指数に設定 さ れ、 FR f1 の符号フ ィ ール ド は正に対応する 0 に設定される。<br />

FR f2 か FR f3 が NaTVal である場合は、 FR f1 は計算結果ではな く NaTVal に設定される。<br />

操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1 );<br />

if (tmp_isrcode = fp_reg_disabled(f 1 , f 2 , f 3 , 0))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

}<br />

FP 例外 : なし。<br />

if (fp_is_natval(FR[f 2 ]) || fp_is_natval(FR[f 3 ])) {<br />

FR[f 1] = NATVAL;<br />

} else {<br />

FR[f 1 ].significand = FR[f 2 ].significand & ~FR[f 3 ].significand;<br />

FR[f 1].exponent = FP_INTEGER_EXP;<br />

FR[f 1 ].sign = FP_SIGN_POSITIVE;<br />

}<br />

fp_update_psr(f 1);<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点レ ジ ス タ無効フ ォ ル ト<br />

3:54 第 3 巻 : 命令リファレンス


fc<br />

fc ─ キャッシュのフラッシュ (Flush Cache)<br />

書式 : (qp) fcr 3 invalidate_line_form M28<br />

(qp) fc.ir 3 instruction_cache_coherent_form M28<br />

説明 : invalidate_line_form では、 GR r3 の値で指定されるアド レスに関連付けられるキャ ッ<br />

シュ ・ ラインが、 プロセッサ ・ キャ ッシュ階層のすべてのレベルから無効にされる。 こ<br />

の無効化は コ ヒ ー レ ンス ・ ド メ イ ン全体にブ ロ ー ド キ ャ ス ト される。 その ラ イ ンが<br />

キャッシュ階層のどのレベルでもメモリ と整合しない場合は、 無効にされる前にメモリ<br />

に書き込まれる。 操作の対象と なる ライン ・ サイズは最低 32 バイ ト である (32 バイ ト境<br />

界にアラ イ メン ト される )。 設計により、それより大きなラインをフラッシュできる。<br />

instruction_cache_coherent 形式の場合、 GR r3 で指定されたキ ャ ッ シ ュ ・ ラ イ ンはプロ<br />

セッサ固有の方法でフラッシュされ、 命令キャッシュがデータ ・キャッシュに対してコ<br />

ヒーレントにされる。 キャッシュがメモリと整合していなくても、 fc.i 命令で タ ー ゲ ッ<br />

ト ・ キ ャ ッ シ ュ ・ ラ イ ン を無効化した り 、 タ ー ゲ ッ ト ・ キ ャ ッ シ ュ ・ ラ イ ン を メ モ リ に<br />

書き戻す必要はない。 ただし、 命令キ ャ ッ シ ュ をデー タ ・ キ ャ ッ シ ュ に対して コ ヒ ー レ<br />

ントにする必要がある場合はfc.i 命令でそれを行 っ て も か ま わない。 命令キ ャ ッ シ ュ<br />

をすべてコ ヒーレン ト にするには、 必要に応じて fc.i 命令を コ ヒ ー レ ンス ・ ド メ イ ン全<br />

体にブロ ー ド キ ャ ス ト する。 操作の対象と なる ラ イン ・ サイズは最低 32 バイ ト である<br />

(32 バイ ト境界にアライメン ト される )。 設計によ り、 それよ り大きなラインをフラッ<br />

シュできる。<br />

特権レベル 0 で実行 さ れた場合、 fc および fc.i は、 ア ク セス権や保護キ ー のチ ェ ッ ク<br />

を実行しない。 その他の特権レベルでは、 fc および fc.i は、 1 バイ ト読み込みである<br />

かのよ う にアクセス権チェ ッ クを実行するが、 PSR.pk の値に関係な く 、 保護キ ー の<br />

チェックは実行しない。<br />

操作の対象 と な る ラ イ ン を含むペー ジの メ モ リ 属性は、 こ れら の命令の動作に影響を与<br />

えない。 fc 命令を使用して、 最初に メ モ リ 属性を キ ャ ッ シ ュ 不可に変更し、 次にア ド レ<br />

スの範囲を フ ラ ッ シ ュ すれば、 キ ャ ッ シ ュ か ら特定のア ド レ ス範囲を削除で き る。<br />

こ れ ら の命令はデー タ依存のルールに従 う 。 つ ま り 、 同一ラ イ ン に対す る先行お よ び後<br />

続のメモ リ 参照に関して順序付け される。 このプロセ ッ サに よ って行われる先行するす<br />

べてのス ト アが、 フ ラ ッ シュ操作に含まれる点で、 fc および fc.i 命令にはデー タ依存<br />

が存在する。 fc および fc.i 命令は順序付けのない操作であ り 、 メモ リ ・ フ ェ ンス (mf)<br />

命令に よ っ て影響 さ れない。 こ れら の命令は sync.i 命令に関して順序付け ら れる。<br />

操作 : if (PR[qp]) {<br />

itype = NON_ACCESS|FC|READ;<br />

if (GR[r 3 ].nat)<br />

register_nat_consumption_fault(itype);<br />

tmp_paddr = tlb_translate_nonaccess(GR[r 3], itype);<br />

}<br />

if (invalidate_line_form)<br />

mem_flush(tmp_paddr);<br />

else // instruction_cache_coherent_form<br />

make_icache_coherent(tmp_paddr);<br />

割り込み : レジスタ NaT 参照フ ォ ル ト デー タ TLB フォルト<br />

実装 さ れていないデ ー タ ・ ア ド レ ス ・ フ ォ ル ト デー タ ・ ペー ジ不在フ ォ ル ト<br />

データがネス ト された TLB フォルト データNaT ページ参照フォル ト<br />

別のデー タ TLB フォルト データ・アクセス権フォルト<br />

VHPT データ ・ フォル ト<br />

第 3 巻 : 命令リファレンス 3:55


fchkf ─ 浮動小数点フラグ・チェック (Floating-point Check Flags)<br />

書式 : (qp) fchkf.sf target 25 F14<br />

説明 : FPSR.sf.flags のフラグが FPSR.s0.flags および FPSR.traps と比較される。 FPSR.sf.flags 内の<br />

セ ッ ト されている フ ラグのなかでイネ ーブルに されている FPSR.traps に対応する も のが<br />

ある場合、 あるいは FPSR.sf.flags 内のセ ッ ト されている フ ラグのなかで FPSR.s0.flags に<br />

セ ッ ト さ れていない も のがあ る場合に は、 target25 への分岐が発生する。<br />

target25 オペラ ン ド に は分岐先の ラベルを指定す る。 こ れで、 こ の命令を含むバン ド ルか<br />

ら 分岐先バン ド ル ま での変位が計算 さ れて、 符号付き即値 (imm21 ) として命令にエン<br />

コードされる (imm21 = target25 - IP >> 4)。<br />

こ の命令の分岐動作は、 オプシ ョ ン に よ り 、 実装しな く て も よ い。 分岐動作が実装 さ れ<br />

ていないに も かかわ ら ず、 こ の命令が分岐した場合は、 スペキ ュ レ ー テ ィ ブ操作フ ォ ル<br />

トが発生し、 imm21 で指定された値がゼロ拡張されて、 割り込み即値コ ン ト ロ ール ・ レ<br />

ジスタ (IIM) に格納される。 フ ォル ト ・ ハン ド ラは、 IIM の値を符号拡張して IIP に加算<br />

し、 制御を戻す と、 分岐をエ ミ ュ レー ト する。<br />

sf のニーモニ ッ ク値は 3:50 ページの表 2-23 に示している。<br />

操作 : if (PR[qp]) {<br />

switch (sf) {<br />

case ‘s0’:<br />

tmp_flags = AR[FPSR].sf0.flags;<br />

break;<br />

case ‘s1’:<br />

tmp_flags = AR[FPSR].sf1.flags;<br />

break;<br />

case ‘s2’:<br />

tmp_flags = AR[FPSR].sf2.flags;<br />

break;<br />

case ‘s3’:<br />

tmp_flags = AR[FPSR].sf3.flags;<br />

break;<br />

}<br />

if ((tmp_flags & ~AR[FPSR].traps) || (tmp_flags & ~AR[FPSR].sf0.flags)) {<br />

if (check_branch_implemented(FCHKF)) {<br />

taken_branch = 1;<br />

IP = IP + sign_ext((imm 21


fclass<br />

fclass ─ 浮動小数点分類 (Floating-point Class)<br />

書式 : (qp) fclass.fcrel.fctype p 1 , p 2 = f 2 , fclass 9 F5<br />

説明 : FR f2 の内容が、 表 2-25 に示すよ う に、 fclass9 コンプリータに従ってクラスに分類され<br />

る。 この操作によ り、 fcrel コンプリータによる指定に従って、 FR f2 の内容が fclass9 で指<br />

定 される浮動小数点数形式に一致してい る か ど う かが判定 さ れ、 ブ ー ル結果が生成 さ れ<br />

る。 こ の結果は 2 つのプレデ ィ ケー ト ・ レジスタ ・ デステ ィ ネーシ ョ ン p1 および p2 に<br />

書き込まれる。 両デスティ ネーシ ョ ンに書き込まれる結果は、 fctype で指定される比較<br />

タイプによって決まる。<br />

使用で き る タ イ プは、 通常 ( または無指定) と unc である。 3:60 ページの表 2-26 を参照<br />

の こ と。 アセンブ リ のシン タ ッ ク スでは メンバシ ッ プの有無の指定が可能であ り 、 アセ<br />

ンブラがタ ーゲ ッ ト ・ プレデ ィ ケ ー ト をスワ ッ プして、 必要な結果を達成する。<br />

表 2-24. 浮動小数点クラスの関係<br />

fcrel 判定テストの関係<br />

m FR f2 が fclass9 で指定されるパターンと一致する ( メンバ資格あり )。<br />

nm FR f2 が fclass9 で指定されるパターンと一致しない ( メンバ資格なし )。<br />

以下のいずれかの条件が成立する場合に、 数値は fclass9 で指定されるパタ ー ン と 一致し<br />

ている と判定される。<br />

• 数値が NaTVal であり、 かつ fclass9 {8} が 1 である。<br />

• 数値が ク ワ イ エ ッ ト 型 NaN であり、 かつ fclass9 {7} が 1 である。<br />

• 数値がシ グナル型 NaN であり、 かつ fclass9 {6} が 1 である。<br />

• 数値の符号が、 fclass9 の下位 2 ビ ッ ト のいずれかで指定される符号 と 一致し、 かつ<br />

数値の型 ( 符号は無視 ) が、 表 2-25 に従って、 fclass9 の次の 4 ビッ トによって指定<br />

される数値の型と一致する。<br />

注 : fclass9 を 0x1FF にする と 、 サポ ー ト されているいずれかのオペラ ン ド であるかど う<br />

かを判定するこ と になる。 表 2-25 に使用されている ク ラス名は、 第 1 巻、 第 1 部<br />

の表 5-2 「浮動小数点レ ジ ス タ のエン コ ー デ ィ ン グ」 に定義してある。<br />

表 2-25. 浮動小数点のクラス<br />

fclass9 下のパターンで右側の型を判定できる。<br />

クラス ニーモニック<br />

0x0100 NaTVal @nat<br />

0x080 クワイエット型 NaN @qnan<br />

0x040 シグナル型 NaN @snan<br />

下の 2 つのパターンの論理和で右側の型を判定できる。<br />

0x001 正 @pos<br />

0x002 負 @neg<br />

下の 4 つのパターンの論理和との論理積で右側の型を判定できる。<br />

0x004 ゼロ @zero<br />

0x008 非正規数 @unorm<br />

0x010 正規数 @norm<br />

0x020 無限大 @inf<br />

第 3 巻 : 命令リファレンス 3:57


操作 : if (PR[qp]) {<br />

if (p 1 == p 2)<br />

illegal_operation_fault();<br />

FP 例外 : なし。<br />

if (tmp_isrcode = fp_reg_disabled(f 2, 0, 0, 0))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

tmp_rel = ((fclass 9 {0} && !FR[f 2 ].sign || fclass 9 {1} && FR[f 2 ].sign)<br />

&& ((fclass 9 {2} && fp_is_zero(FR[f 2 ]))||<br />

(fclass 9 {3} && fp_is_unorm(FR[f 2 ])) ||<br />

(fclass 9 {4} && fp_is_normal(FR[f 2 ])) ||<br />

(fclass 9 {5} && fp_is_inf(FR[f 2 ]))<br />

)<br />

)<br />

|| (fclass 9 {6} && fp_is_snan(FR[f 2 ]))<br />

|| (fclass 9 {7} && fp_is_qnan(FR[f 2 ]))<br />

|| (fclass 9 {8} && fp_is_natval(FR[f 2 ]));<br />

tmp_nat = fp_is_natval(FR[f 2 ]) && (!fclass 9 {8});<br />

if (tmp_nat) {<br />

PR[p 1 ] = 0;<br />

PR[p 2 ] = 0;<br />

} else {<br />

PR[p 1 ] = tmp_rel;<br />

PR[p 2 ] = !tmp_rel;<br />

}<br />

} else {<br />

if (fctype == ‘unc’) {<br />

if (p1 == p2)<br />

illegal_operation_fault();<br />

PR[p 1 ] = 0;<br />

PR[p 2 ] = 0;<br />

}<br />

}<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点レ ジ ス タ無効フ ォ ル ト<br />

fclass<br />

3:58 第 3 巻 : 命令リファレンス


fclrf<br />

fclrf ─ 浮動小数点フラグ・クリア (Floating-Point Clear Flags)<br />

書式 : (qp) fclrf.sf F13<br />

説明 : ステータス ・ フ ィ ールドの 6 ビッ トのフラグ ・ フ ィ ールドをゼロにリセッ トする。 sf の<br />

ニーモニッ ク値は 3:50 ページの表 2-23 に示している。<br />

操作 : if (PR[qp]) {<br />

fp_set_sf_flags(sf, 0);<br />

}<br />

FP 例外 : なし。<br />

割り込み : なし<br />

第 3 巻 : 命令リファレンス 3:59


fcmp ─ 浮動小数点比較 (Floating-point Compare)<br />

書式 : (qp) fcmp.frel.fctype.sf p 1 , p 2 = f 2 , f 3 F4<br />

説明 : 2 つのソース ・ オペラン ド が、 frel で指定される 12 種類の比較関係のいずれか 1 つと比<br />

較される。 こ の操作に よ り 、 比較条件が真の場合にブール型の結果が 1 になり、 真でな<br />

い場合に 0 にな る。 こ の比較結果は、 2 つのプレデ ィ ケー ト ・ レジスタ ・ デステ ィ ネー<br />

ションp 1 および p 2 に書き込まれる。 結果がどのよ うにデステ ィ ネーシ ョ ンに書き込ま<br />

れるかは、 fctype で指定される比較タ イ プに よ っ て決ま る。 使用で き る比較タ イ プは通<br />

常 ( ま たは無指定 ) と unc である。<br />

表 2-26. 浮動小数点の比較タイプ<br />

fctype<br />

PR[qp]==0<br />

結果 ==0、ソースに<br />

NaTVal なし<br />

PR[qp]==1<br />

結果 ==1、ソースに<br />

NaTVal なし<br />

3:60 第 3 巻 : 命令リファレンス<br />

fcmp<br />

ソースに NaTVal が 1<br />

つ以上あり<br />

PR[p1 ] PR[p2 ] PR[p1 ] PR[p2 ] PR[p1 ] PR[p2 ] PR[p1 ] PR[p2 ]<br />

none 0 1 1 0 0 0<br />

unc 0 0 0 1 1 0 0 0<br />

sf のニーモニ ッ ク値は 3:50 ページの表 2-23 に示している。<br />

各比較タ イ プに対して定義 さ れてい る比較関係の一覧を表 2-27 に示す。 12 種類の比較関<br />

係のすべてがハー ド ウ ェ アで直接サポ ー ト されているわけではない。 一部は実際には擬<br />

似オペコ ー ド である。 それらの比較関係に対しては、 アセンブラが単にソ ース ・ オペラ<br />

ン ド 指定子やプレデ ィ ケー ト ・ タ ーゲ ッ ト 指定子を切り換えて、 サポ ー ト されている比<br />

較関係を利用す る。<br />

表 2-27. 浮動小数点の比較関係<br />

frel frel コンプリータの意味 関係 擬似オペコード<br />

オペランドが<br />

クワイエット型 NaN の<br />

場合の無効通知の有無<br />

eq 等しい f2 == f3 なし<br />

lt より小 f2 < f3 あり<br />

le より小か等しい f2 f3 lt f2 ↔ f3 あり<br />

ge より大か等しい f2 >= f3 le f2 ↔ f3 あり<br />

unord 非順序化 ( アンオーダー) f2 ? f3 なし<br />

neq 等しくない !(f2 == f3 ) eq p1 ↔ p2 なし<br />

nlt より小でない !(f2 < f3 ) lt p1 ↔ p2 あり<br />

nle より小でないか等しい !(f2 f3 ) lt f2 ↔ f3 p1 ↔ p2 あり<br />

nge より大でないか等しい !(f2 >= f3 ) le f2 ↔ f3 p1 ↔ p2 あり<br />

ord 順序化 ( オーダー ) !(f2 ? f3 ) unord p1 ↔ p2 なし


fcmp<br />

操作 : if (PR[qp]) {<br />

if (p 1 == p 2)<br />

illegal_operation_fault();<br />

if (tmp_isrcode = fp_reg_disabled(f 2, f 3, 0, 0))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

if (fp_is_natval(FR[f 2 ]) || fp_is_natval(FR[f 3 ])) {<br />

PR[p 1 ] = 0;<br />

PR[p 2 ] = 0;<br />

} else {<br />

fcmp_exception_fault_check(f 2 , f 3 , frel, sf, &tmp_fp_env);<br />

if (fp_raise_fault(tmp_fp_env))<br />

fp_exception_fault(fp_decode_fault(tmp_fp_env));<br />

tmp_fr2 = fp_reg_read(FR[f 2 ]);<br />

tmp_fr3 = fp_reg_read(FR[f 3 ]);<br />

if (frel == ‘eq’) tmp_rel = fp_equal(tmp_fr2,<br />

tmp_fr3);<br />

else if (frel == ‘lt’) tmp_rel = fp_less_than(tmp_fr2,<br />

tmp_fr3);<br />

else if (frel == ‘le’) tmp_rel = fp_lesser_or_equal(tmp_fr2,<br />

tmp_fr3);<br />

else if (frel == ‘gt’) tmp_rel = fp_less_than(tmp_fr3,<br />

tmp_fr2);<br />

else if (frel == ‘ge’) tmp_rel = fp_lesser_or_equal(tmp_fr3,<br />

tmp_fr2);<br />

else if (frel == ‘unord’)tmp_rel = fp_unordered(tmp_fr2,<br />

tmp_fr3);<br />

else if (frel == ‘neq’) tmp_rel = !fp_equal(tmp_fr2,<br />

tmp_fr3);<br />

else if (frel == ‘nlt’) tmp_rel = !fp_less_than(tmp_fr2,<br />

tmp_fr3);<br />

else if (frel == ‘nle’) tmp_rel = !fp_lesser_or_equal(tmp_fr2,<br />

tmp_fr3);<br />

else if (frel == ‘ngt’) tmp_rel = !fp_less_than(tmp_fr3,<br />

tmp_fr2);<br />

else if (frel == ‘nge’) tmp_rel = !fp_lesser_or_equal(tmp_fr3,<br />

tmp_fr2);<br />

else tmp_rel = !fp_unordered(tmp_fr2,<br />

tmp_fr3); //‘ord’<br />

PR[p 1 ] = tmp_rel;<br />

PR[p 2 ] = !tmp_rel;<br />

fp_update_fpsr(sf, tmp_fp_env);<br />

}<br />

} else {<br />

if (fctype == ‘unc’) {<br />

if (p1 == p2)<br />

illegal_operation_fault();<br />

PR[p1 ] = 0;<br />

PR[p2 ] = 0;<br />

}<br />

}<br />

FP 例外 : 無効操作 (Invalid Operation: V)<br />

デノーマル/ アンノ ーマル ・ オペラン ド (Denormal/Unnormal Operand: D)<br />

ソフ ト ウェア・アシスト (Software Assist: SWA) フォルト<br />

第 3 巻 : 命令リファレンス 3:61


割り込み : 無効操作フ ォ ル ト 浮動小数点例外フ ォ ル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト<br />

3:62 第 3 巻 : 命令リファレンス<br />

fcmp


fcvt.fx<br />

fcvt.fx ─ 浮動小数点から整数への変換 (Convert Floating-point to Integer)<br />

書式 : (qp) fcvt.fx.sf f 1 = f 2 signed_form F10<br />

(qp) fcvt.fx.trunc.sf f 1 = f 2 signed_form, trunc_form F10<br />

(qp) fcvt.fxu.sf f 1 = f 2 unsigned_form F10<br />

(qp) fcvt.fxu.trunc.sf f 1 = f 2 unsigned_form, trunc_form F10<br />

説明 : FR f2 が レ ジ ス タ形式の浮動小数点値 と して扱われ、 FPSR.sf.rc で指定される丸めモー ド<br />

を使用するか、 あるいは trunc_form の場合にはゼロ側への丸めモー ド を使用して、 符号<br />

付き (signed_form の場合 ) または符号なし (unsigned_form の場合 ) の整数に変換される。<br />

結果は、 FR f1 の 64 ビットの仮数フィールドに格納される。 FR f1 の指数フ ィ ール ド は<br />

2.0 63 (0x1003E) のバイアス付き指数に設定 さ れ、 FR f1 の符号フ ィ ール ド は正に対応する<br />

0 に設定 さ れる。 変換の結果を 64 ビ ッ ト 整数で表現で き ない場合は、 IEEE 無効操作浮<br />

動小数点例外フ ォ ル ト がデ ィ スエ ー ブルに さ れている と き は、 変換結果 と して 64 ビッ ト<br />

整数不定値 0x8000000000000000 が使用される。<br />

FR f2 が NaTVal である場合は、 FR f1 は計算結果ではな く NaTVal に設定される。<br />

sf のニーモニ ッ ク値は 3:50 ページの表 2-23 に示している。<br />

操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1);<br />

if (tmp_isrcode = fp_reg_disabled(f 1 , f 2 , 0, 0))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

}<br />

if (fp_is_natval(FR[f 2 ])) {<br />

FR[f 1 ] = NATVAL;<br />

fp_update_psr(f 1);<br />

} else {<br />

tmp_default_result = fcvt_exception_fault_check(f 2 , signed_form,<br />

trunc_form, sf, &tmp_fp_env);<br />

if (fp_raise_fault(tmp_fp_env))<br />

fp_exception_fault(fp_decode_fault(tmp_fp_env));<br />

}<br />

if (fp_is_nan(tmp_default_result)) {<br />

FR[f 1 ].significand = INTEGER_INDEFINITE;<br />

FR[f 1].exponent = FP_INTEGER_EXP;<br />

FR[f 1 ].sign = FP_SIGN_POSITIVE;<br />

} else {<br />

tmp_res = fp_ieee_rnd_to_int(fp_reg_read(FR[f 2]), &tmp_fp_env);<br />

if (tmp_res.exponent)<br />

tmp_res.significand = fp_U64_rsh(<br />

tmp_res.significand, (FP_INTEGER_EXP - tmp_res.exponent));<br />

if (signed_form && tmp_res.sign)<br />

tmp_res.significand = (~tmp_res.significand) + 1;<br />

}<br />

FR[f 1 ].significand = tmp_res.significand;<br />

FR[f 1 ].exponent = FP_INTEGER_EXP;<br />

FR[f 1].sign = FP_SIGN_POSITIVE;<br />

fp_update_fpsr(sf, tmp_fp_env);<br />

fp_update_psr(f 1 );<br />

if (fp_raise_traps(tmp_fp_env))<br />

fp_exception_trap(fp_decode_trap(tmp_fp_env));<br />

第 3 巻 : 命令リファレンス 3:63


FP 例外 : 無効操作 (Invalid Operation: V) 不正確結果 (Inexact: I)<br />

デノーマル/ アンノ ーマル ・ オペラン ド (Denormal/Unnormal Operand: D)<br />

ソフ ト ウェア・アシスト (Software Assist: SWA) フォルト<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点例外フ ォ ル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト 浮動小数点例外 ト ラ ッ プ<br />

fcvt.fx<br />

3:64 第 3 巻 : 命令リファレンス


fcvt.xf<br />

fcvt.xf ─ 符号付き整数から浮動小数点への変換<br />

(Convert Signed Integer to Floating-point)<br />

書式 : (qp) fcvt.xff 1 = f 2 F11<br />

説明 : FR f2 の 64 ビ ッ ト の仮数が符号付き整数 と して扱われ、 その レ ジ ス タ ・ フ ァ イ ル精度の<br />

浮動小数点表現が FR f1 に格納される。<br />

FR f2 が NaTVal である場合は、 FR f1 は計算結果ではな く NaTVal に設定される。<br />

この操作は常に正確であり、 丸めモー ド によ る影響を受けない。<br />

操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1 );<br />

if (tmp_isrcode = fp_reg_disabled(f 1, f 2, 0, 0))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

}<br />

FP 例外 : なし。<br />

if (fp_is_natval(FR[f 2])) {<br />

FR[f 1 ] = NATVAL;<br />

} else {<br />

tmp_res = FR[f 2];<br />

if (tmp_res.significand{63}) {<br />

tmp_res.significand = (~tmp_res.significand) + 1;<br />

tmp_res.sign = 1;<br />

} else<br />

tmp_res.sign = 0;<br />

tmp_res.exponent = FP_INTEGER_EXP;<br />

tmp_res = fp_normalize(tmp_res);<br />

FR[f1 ].significand = tmp_res.significand;<br />

FR[f1 ].exponent = tmp_res.exponent;<br />

FR[f1].sign = tmp_res.sign;<br />

}<br />

fp_update_psr(f1 );<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点レ ジ ス タ無効フ ォ ル ト<br />

第 3 巻 : 命令リファレンス 3:65


fcvt.xuf ─ 符号付き整数から浮動小数点への変換<br />

(Convert Unsigned Integer to Floating-point)<br />

書式 : (qp) fcvt.xuf.pc.sf f 1 = f 3 (qp) fma.pc.sf f 1 = f 3, f 1, f0 の擬似オペコ ー ド<br />

fcvt.xuf<br />

説明 : FR f3 が FR 1 と乗算され、 FPSR.sf.rc で指定される丸めモー ド と pc ( さらにFPSR.sf.pc お<br />

よび FPSR.sf.wre) で指定される精度にしたがって丸められ、 その結果が FR f1 に格納され<br />

る。<br />

注 : FR f3 を FR 1 (1.0) と乗算する と 、 浮動小数点レジスタ ・ フ ァ イル内で整数の標準表<br />

現が正規化 さ れ、 通常の浮動小数点数が生成 さ れる。<br />

FR f3 が NaTVal である場合は、 FR f1 は計算結果ではな く NaTVal に設定される。<br />

オペコ ー ド の pc のニーモニ ッ ク値は 3:50 ページの表 2-22 に示している。 sf のニーモ<br />

ニック値は3:50 ページの表 2-23 に示している。 ステータス ・ フ ィ ール ド の pc、 wre、 rc<br />

のエンコ ーデ ィ ング と意味については、 第 1 巻、 第 1 部の表 5-5 および第 1 巻、 第 1 部<br />

の表 5-6 を参照のこ と。<br />

操作 : 3:70 ページの 「fma — 浮動小数点積和 (Floating-point Multiply Add)」 を参照の こ と 。<br />

3:66 第 3 巻 : 命令リファレンス


fetchadd<br />

fetchadd ─ 即値のフェッチおよび加算 (Fetch And Add Immediate)<br />

書式 : (qp) fetchadd4.sem.ldhint r 1 = [r 3 ], inc 3 four_byte_form M17<br />

(qp) fetchadd8.sem.ldhint r 1 = [r 3 ], inc 3 eight_byte_form M17<br />

説明 : 4 または 8 バイ ト からなる値が、 GR r3 の値で指定されるア ド レ スか ら始ま る メモ リ 位置<br />

から読み込まれる。 この値がゼロ拡張され、 inc3 で指定 さ れる符号拡張 さ れた即値に加<br />

算される。 inc3 で指定でき る値は、 -16、 -8、 -4、 -1、 1、 4、 8、 16 である。 次に、 加算結<br />

果の最下位 4 または 8 バイ ト が、 GR r3 の値で指定されるア ド レ スか ら始ま る メモ リ 位<br />

置に書き込まれる。 メモリから読み込まれたゼロ拡張された値が GR r1 に格納され、 GR<br />

r1 に対応する NaT ビッ トがクリアされる。<br />

sem コ ンプ リ ー タ でセマ フ ォ 操作を指定す る。 こ れ ら の操作の説明を表 2-28 に示す。 メ<br />

モリ順序の詳細は、 第 2 巻、 第 1 部の 4.4.7 項 「シ ー ケ ン シ ャ ル属性 と 順序付け」 を参照<br />

のこ と。<br />

表 2-28. フェッチおよび加算セマフォのタイプ<br />

sem<br />

コンプリータ<br />

順序付けの<br />

セマンティックス<br />

セマフォ操作<br />

acq 取得 後続のすべてのデータ・メモリ・アクセスの前に、メモリに対する読<br />

み取り / 書き込みが検出可能になる。<br />

rel 解放 後続のすべてのデータ・メモリ・アクセスの後に、メモリに対する読<br />

み取り / 書き込みが検出可能になる。<br />

ラ イ ト バ ッ ク ・ メ モ リ 属性を持つキ ャ ッ シ ュ 可能ペー ジ にア ク セスする場合、 メ モ リ に<br />

対する読み取 り と書き込みは、 ア ト ミ ッ ク な操作である こ と が保証されている。 その他<br />

のメモリ ・ タイプにアクセスする場合は、 操作がアト ミ ッ クであるかど うかは、 プラッ<br />

ト フ ォ ー ム に依存す る。 メ モ リ 属性の詳細は、 第 2 巻、 第 1 部の 4.4 節 「メモリ属性」<br />

を参照のこ と。<br />

GR r3 の値で指定されるア ド レ スが、 メモ リ でア クセス されるサイズに自然にアラ イ メ<br />

ントされていない場合は、 ユーザ・マスク (User Mask) アライメン ト ・ チェ ッ ク ・ ビッ ト<br />

UM.ac ( プロセッサ ・ ステータス ・ レジスタの PSR.ac) の状態に関わらず、 非アラ イ メン<br />

ト・データ参照 (Unaligned Data Reference) フォルトが発生する。<br />

参照 さ れるペー ジ に対する読み取 り お よ び書き込みの両方のア ク セス特権が必要であ る。<br />

メモリへの書き込が行われるかど うかに関わらず、 書き込みアクセス特権のチェックが 行われる。<br />

UCE ページまたはライ ト バッ ク書き込みポ リ シーを持つキャ ッシュ可能ページへのアク<br />

セス以外は許可されていない。 NaTPage にアクセスする と、 データ NaT ページ参照フォ ル ト が発生する。 その他のメモ リ 属性を持つペー ジにアクセスする と、 サポ ー ト されな<br />

いデー タ参照フ ォル ト が発生する。<br />

fetchadd のエクスポー ト をサポー ト するプロセ ッサ ・ モデル上で、 UCE ページに対し<br />

て fetchadd を発行す る と 、 フ ェ ッ チお よ び加算操作がプ ロ セ ッ サの外部にエ ク ス ポ ー<br />

トされる。 プラットフォームがfetchadd のエクスポー ト をサポー ト しない場合は、 動<br />

作は不定である。 fetchadd のエクスポー ト をサポー ト しないプロセ ッサ ・ モデル上で、<br />

UCE ページに対して fetchadd を発行する と、 サポ ー ト されないデー タ参照フ ォ ル ト が<br />

発生す る。 第 2 巻、 第 1 部の 4.4.9 項 「メ モ リ 参照命令に対する メ モ リ 属性の影響」 を参<br />

照の こ と。<br />

ldhint コ ンプ リ ー タ の値で メ モ リ ・ ア ク セスの局所性を指定する。 ldhint コンプリータの<br />

値の一覧が、 3:136 ページの表 2-34 に示してい る。 局所性 ヒ ン ト はプ ロ グ ラ ムの機能に<br />

第 3 巻 : 命令リファレンス 3:67


fetchadd<br />

は影響せず、 プ ロ グ ラ ム ・ コ ー ド に よ り 無視 も で き る。 詳細は、 第 1 巻、 第 1 部の 4.4.6<br />

項 「メ モ リ 階層の制御 と 整合性」 を参照のこ と。<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1 );<br />

}<br />

if (GR[r 3].nat)<br />

register_nat_consumption_fault(SEMAPHORE);<br />

size = four_byte_form ? 4 : 8;<br />

paddr = tlb_translate(GR[r 3 ], size, SEMAPHORE, PSR.cpl, &mattr,<br />

&tmp_unused);<br />

if (!ma_supports_fetchadd(mattr))<br />

unsupported_data_reference_fault(SEMAPHORE, GR[r 3 ]);<br />

if (sem == ‘acq’)<br />

val = mem_xchg_add(inc 3 , paddr, size, UM.be, mattr, ACQUIRE, ldhint);<br />

else // ‘rel’<br />

val = mem_xchg_add(inc 3 , paddr, size, UM.be, mattr, RELEASE, ldhint);<br />

alat_inval_multiple_entries(paddr, size);<br />

GR[r 1 ] = zero_ext(val, size * 8);<br />

GR[r 1].nat = 0;<br />

割り込み : 無効操作フ ォ ル ト デー タ ・ キ ー ・ ミ ス ・ フ ォ ル ト<br />

レジスタ NaT 参照フ ォ ル ト デー タ ・ キ ー許可フ ォ ル ト<br />

実装 さ れていないデ ー タ ・ ア ド レ ス ・ フ ォ ル ト デー タ ・ ア ク セス権フ ォ ル ト<br />

データがネス ト された TLB フォルト データ・ダーティ・ビット ・フォルト<br />

別のデー タ TLB フォルト データ・アクセス・ビット ・フォルト<br />

VHPT データ ・ フォル ト データ ・ デバッグ ・ フォル ト<br />

データ TLB フ ォル ト アライ メン ト の合っていないデー タ参照<br />

データ ・ページ不在フォルト フォルト<br />

データ NaT ページ参照フォル ト サポー ト されないデータ参照フォル ト<br />

3:68 第 3 巻 : 命令リファレンス


flushrs<br />

flushrs ─ レジスタ・スタックのフラッシュ (Flush Register Stack)<br />

書式 : flushrs M25<br />

説明 : レジスタ・スタックのダーティなパーティションにスタックされているすべての汎用レ<br />

ジス タがバ ッ キング ・ ス ト アに書き込まれてか ら、 実行が継続される。 ダー テ ィ なパー<br />

ティションには、 以前のプロシージャ・フレームの、 まだバッキング・ストアにセーブ<br />

されていないレジスタが含まれている。 レジスタ ・ スタックのパーティションについて<br />

の詳細は、 第 2 巻、 第 1 部の第 6 章 「レジスタ ・ スタ ッ ク ・ エンジン」 を参照のこ と。<br />

未処理の外部割 り 込みは、 イ ネ ー ブルに さ れてい る場合、 RSE によるストア・ループに<br />

割り込みをかける場合がある。<br />

こ の命令の実行を終了した後は、 BSPSTORE が BSP に等し く なる。<br />

こ の命令は、 同一命令グルー プ内の最初の命令でなければな ら ない。 さ ら に、 こ の命令<br />

は、 命令スロ ッ ト 0 またはスロッ ト 0 の後にス ト ッ プ情報があるテンプレ ー ト の命令ス<br />

ロッ ト 1 のいずれかに入っていなければならない。 そ う でない場合は、 結果は不定にな<br />

る。 こ の命令ではプ レ デ ィ ケ ー ト は使用で き ない。<br />

操作 : while (AR[BSPSTORE] != AR[BSP]) {<br />

rse_store(MANDATORY); // increments AR[BSPSTORE]<br />

deliver_unmasked_pending_external_interrupt();<br />

}<br />

割り込み : 実装されていないデータ・アドレス・フォルト データ・キー・ミス・フォルト<br />

VHPT データ ・ フォル ト データ ・ キー許可フォル ト<br />

データがネス ト された TLB フォルト データ・アクセス権フォルト<br />

データ TLB フォルト データ・ダーティ・ビット ・フォルト<br />

別のデー タ TLB フォルト データ・アクセス・ビット ・フォルト<br />

データ ・ ページ不在フォルト データ ・ デバッグ ・ フォルト<br />

データ NaT ページ参照フォル ト<br />

第 3 巻 : 命令リファレンス 3:69


fma ─ 浮動小数点積和 (Floating-point Multiply Add)<br />

書式 : (qp) fma.pc.sf f 1 = f 3 , f 4 , f 2 F1<br />

説明 : FR f3 と FR f4 と の積が無限の精度で計算され、 次に FR f2 がこの積にやはり無限の精度で<br />

加算される。 次に、 結果の値が、 FPSR.sf.rc で指定される丸めモー ド と pc ( さらに<br />

FPSR.sf.pc および FPSR.sf.wre) で指定される精度にしたが って丸められ、 その結果が FR<br />

f1 に格納される。<br />

FR f3 、 FR f4 、 FR f2 のどれか 1 つでも NaTVal である場合は、 FR f1 は計算結果ではな く<br />

NaTVal に設定される。<br />

f2 が f0 の場合は、 積和演算の代わ り に IEEE の乗算が行われる。 3:77 ページの 「fmpy —<br />

浮動小数点乗算 (Floating-point Multiply)」 を参照のこ と。<br />

オペコ ー ド の pc のニーモニ ッ ク値は 3:50 ページの表 2-22 に示している。 sf のニーモ<br />

ニック値は3:50 ページの表 2-23 に示している。 ステータス ・ フ ィ ール ド の pc、 wre、 rc<br />

のエンコ ーデ ィ ング と意味については、 第 1 巻、 第 1 部の表 5-5 および第 1 巻、 第 1 部<br />

の表 5-6 を参照のこ と。<br />

操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1);<br />

if (tmp_isrcode = fp_reg_disabled(f 1 , f 2 , f 3 , f 4 ))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

}<br />

if (fp_is_natval(FR[f 2 ]) || fp_is_natval(FR[f 3 ]) ||<br />

fp_is_natval(FR[f 4 ])) {<br />

FR[f 1] = NATVAL;<br />

fp_update_psr(f 1 );<br />

} else {<br />

tmp_default_result = fma_exception_fault_check(f 2, f 3, f 4,<br />

pc, sf, &tmp_fp_env);<br />

if (fp_raise_fault(tmp_fp_env))<br />

fp_exception_fault(fp_decode_fault(tmp_fp_env));<br />

}<br />

if (fp_is_nan_or_inf(tmp_default_result)) {<br />

FR[f 1] = tmp_default_result;<br />

} else {<br />

tmp_res = fp_mul(fp_reg_read(FR[f 3 ]), fp_reg_read(FR[f 4 ]));<br />

if (f 2 != 0)<br />

tmp_res = fp_add(tmp_res, fp_reg_read(FR[f 2 ]), tmp_fp_env);<br />

FR[f 1 ] = fp_ieee_round(tmp_res, &tmp_fp_env);<br />

}<br />

fp_update_fpsr(sf, tmp_fp_env);<br />

fp_update_psr(f 1);<br />

if (fp_raise_traps(tmp_fp_env))<br />

fp_exception_trap(fp_decode_trap(tmp_fp_env));<br />

FP 例外 : 無効操作 (Invalid Operation: V) アンダーフロー (Underflow: U)<br />

デノーマル/ アンノ ーマル ・ オペラン ド オーバーフロー (Overflow: O)<br />

(Denormal/Unnormal Operand: D) 不正確結果 (Inexact: I)<br />

ソフ ト ウェア・アシスト ソフ ト ウェア・アシスト<br />

(Software Assist: SWA) フォルト (Software Assist: SWA) ト ラップ<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点例外フ ォ ル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト 浮動小数点例外 ト ラ ッ プ<br />

3:70 第 3 巻 : 命令リファレンス<br />

fma


fmax<br />

fmax ─ 浮動小数点最大値 (Floating-point Maximum)<br />

書式 : (qp) fmax.sf f 1 = f 2 , f 3 F8<br />

説明 : 2 つのオペラン ド の値が大きい方が FR f1 に格納される。 FR f2 が FR f3 と等しい場合は、<br />

FR f1 には FR f3 が格納される。<br />

FR f2 か FR f3 が NaN である場合は、 FR f1 には FR f3 が格納される。<br />

FR f2 か FR f3 が NaTVal である場合は、 FR f1 は計算結果ではな く NaTVal に設定される。<br />

こ の操作は、 他の浮動小数点算術演算命令 と は異な り 、 NaN を伝播させない。 fcmp.lt<br />

操作 と 同じ方法で無効操作 (Invalid Operation) が通知される。<br />

sf のニーモニ ッ ク値は、 3:50 ページの表 2-23 に示している。<br />

操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1);<br />

if (tmp_isrcode = fp_reg_disabled(f 1 , f 2 , f 3 , 0))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

}<br />

if (fp_is_natval(FR[f 2 ]) || fp_is_natval(FR[f 3 ])) {<br />

FR[f 1 ] = NATVAL;<br />

} else {<br />

fminmax_exception_fault_check(f 2 , f 3 , sf, &tmp_fp_env);<br />

if (fp_raise_fault(tmp_fp_env))<br />

fp_exception_fault(fp_decode_fault(tmp_fp_env));<br />

tmp_bool_res = fp_less_than(fp_reg_read(FR[f 3 ]),<br />

fp_reg_read(FR[f 2 ]));<br />

FR[f 1 ] = (tmp_bool_res ? FR[f 2 ] : FR[f 3 ]);<br />

fp_update_fpsr(sf, tmp_fp_env);<br />

}<br />

fp_update_psr(f1 );<br />

FP 例外 : 無効操作 (Invalid Operation: V)<br />

デノーマル/ アンノ ーマル ・ オペラン ド (Denormal/Unnormal Operand: D)<br />

ソフ ト ウェア・アシスト (Software Assist: SWA) フォルト<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点例外フ ォ ル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト<br />

第 3 巻 : 命令リファレンス 3:71


fmerge ─ 浮動小数点マージ (Floating-point Merge)<br />

fmerge<br />

書式 : (qp) fmerge.nsf 1 = f 2 , f 3 neg_sign_form F9<br />

(qp) fmerge.sf 1 = f 2 , f 3 sign_form F9<br />

(qp) fmerge.sef 1 = f 2 , f 3 sign_exp_form F9<br />

説明 : FR f2 およびFR f3 か ら 、 それぞれ符号、 指数、 仮数の各フ ィ ー ル ド が抽出され、 それ ら<br />

がマ ー ジ されて、 その結果が FR f1 に格納される。<br />

neg_sign_form では、 FR f2 の符号が否定され ( つまり反転され)、 FR f3 の指数およ び仮数<br />

と連結される。 この形式を使用すると、 FR f2 と FR f3 に同じ レ ジ ス タ を使用すれば、 浮<br />

動小数点数の否定を求め ら れる。<br />

sign_form では、 FR f2 の符号が FR f3 の指数およ び仮数と連結される。<br />

sign_exp_form では、 FR f2 の符号 と 指数が FR f3 の仮数 と 連結される。<br />

すべての形式について、 FR f2 か FR f3 が NaTVal である場合は、 FR f1 は計算結果ではな<br />

く NaTVal に設定される。<br />

図 2-8. 浮動小数点マージでの符号否定操作<br />

FR f 2<br />

図 2-9. 浮動小数点マージでの符号操作<br />

81 80 64 63 0 81 80 64 63<br />

0<br />

否定された<br />

符号ビット<br />

FR f 1<br />

図 2-10. 浮動小数点マージでの符号および指数操作<br />

81 80 64 63<br />

0<br />

3:72 第 3 巻 : 命令リファレンス<br />

FR f 3<br />

81 80 64 63 0 81 80 64 63<br />

0<br />

FR f2 FR f3 FR f 1<br />

81 80 64 63<br />

0<br />

81 80 64 63 0 81 80 64 63<br />

0<br />

FR f2 FR f3 FR f 1<br />

81 80 64 63<br />

0


fmerge<br />

操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1);<br />

if (tmp_isrcode = fp_reg_disabled(f 1 , f 2 , f 3 , 0))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

}<br />

FP 例外 : なし。<br />

if (fp_is_natval(FR[f 2 ]) || fp_is_natval(FR[f 3 ])) {<br />

FR[f 1 ] = NATVAL;<br />

} else {<br />

FR[f 1 ].significand = FR[f 3 ].significand;<br />

if (neg_sign_form) {<br />

FR[f 1 ].exponent = FR[f 3 ].exponent;<br />

FR[f 1 ].sign = !FR[f 2 ].sign;<br />

} else if (sign_form) {<br />

FR[f 1 ].exponent = FR[f 3 ].exponent;<br />

FR[f 1 ].sign = FR[f 2 ].sign;<br />

} else { // sign_exp_form<br />

FR[f 1 ].exponent = FR[f 2 ].exponent;<br />

FR[f 1 ].sign = FR[f 2 ].sign;<br />

}<br />

}<br />

fp_update_psr(f 1 );<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点レ ジ ス タ無効フ ォ ル ト<br />

第 3 巻 : 命令リファレンス 3:73


fmin ─ 浮動小数点最小値 (Floating-point Minimum)<br />

書式 : (qp) fmin.sf f 1 = f 2 , f 3 F8<br />

説明 : 2 つのオペラン ド の値が小さい方が FR f1 に格納される。 FR f2 が FR f3 と等しい場合は、<br />

FR f1 には FR f3 が格納される。<br />

FR f2 か FR f3 が NaN である場合は、 FR f1 には FR f3 が格納される。<br />

FR f2 か FR f3 が NaTVal である場合は、 FR f1 は計算結果ではな く NaTVal に設定される。<br />

こ の操作は、 他の浮動小数点算術演算命令 と は異な り 、 NaN を伝播させない。 fcmp.lt<br />

操作の場合 と 同じ方法で無効操作 (Invalid Operation) が通知される。<br />

sf のニーモニ ッ ク値は、 3:50 ページの表 2-23 に示している。<br />

操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1);<br />

if (tmp_isrcode = fp_reg_disabled(f 1 , f 2 , f 3 , 0))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

}<br />

if (fp_is_natval(FR[f 2 ]) || fp_is_natval(FR[f 3 ])) {<br />

FR[f 1 ] = NATVAL;<br />

} else {<br />

fminmax_exception_fault_check(f 2 , f 3 , sf, &tmp_fp_env);<br />

if (fp_raise_fault(tmp_fp_env))<br />

fp_exception_fault(fp_decode_fault(tmp_fp_env));<br />

tmp_bool_res = fp_less_than(fp_reg_read(FR[f 2 ]),<br />

fp_reg_read(FR[f 3 ]));<br />

FR[f 1 ] = tmp_bool_res ? FR[f 2 ] : FR[f 3 ];<br />

fp_update_fpsr(sf, tmp_fp_env);<br />

}<br />

fp_update_psr(f1 );<br />

FP 例外 : 無効操作 (Invalid Operation: V)<br />

デノーマル/ アンノ ーマル ・ オペラン ド (Denormal/Unnormal Operand: D)<br />

ソフ ト ウェア・アシスト (Software Assist: SWA) フォルト<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点例外フ ォ ル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト<br />

3:74 第 3 巻 : 命令リファレンス<br />

fmin


fmix<br />

fmix ─ 浮動小数点ミックス (Floating-point Mix)<br />

書式 : (qp) fmix.lf 1 = f 2 , f 3 mix_l_form F9<br />

(qp) fmix.rf 1 = f 2 , f 3 mix_r_form F9<br />

(qp) fmix.lrf 1 = f 2 , f 3 mix_lr_form F9<br />

説明 : mix_1_form (mix_r_form) では、 FR f2 の左側 ( 右側 ) の単精度値が FR f3 の左側 ( 右側 ) の<br />

単精度値 と 連結 される。 mix_lr_form では、 FR f2 の左側の単精度値が FR f3 の右側の単精<br />

度値 と 連結 さ れる。<br />

すべての形式で、 FR f1 の指数フ ィ ール ド は 2.063 (0x1003E) のバイアス付き指数に設定さ<br />

れ、 FR f1 の符号フ ィ ール ド は正に対応する 0 に設定される。<br />

すべての形式で、 FR f2 か FR f3 が NaTVal である場合は、 FR f1 は計算結果ではな く<br />

NaTVal に設定される。<br />

図 2-11. 浮動小数点左ミックス<br />

FR f 2<br />

図 2-12. 浮動小数点右ミックス<br />

FR f 2<br />

図 2-13. 浮動小数点左右ミックス<br />

FR f 2<br />

81 80 64 63 32 31<br />

0 81 80 64 63 32 31<br />

0<br />

FR f 1<br />

81 80 64 63 32 31<br />

0<br />

0 1003E<br />

第 3 巻 : 命令リファレンス 3:75<br />

FR f 3<br />

81 80 64 63 32 31<br />

0 81 80 64 63 32 31<br />

0<br />

FR f 1<br />

FR f 3<br />

81 80 64 63 32 31<br />

0<br />

0 1003E<br />

81 80 64 63 32 31<br />

0 81 80 64 63 32 31<br />

0<br />

FR f 1<br />

FR f 3<br />

81 80 64 63 32 31<br />

0<br />

0 1003E


操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1);<br />

if (tmp_isrcode = fp_reg_disabled(f 1 , f 2 , f 3 , 0))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

}<br />

FP 例外 : なし。<br />

if (fp_is_natval(FR[f 2 ]) || fp_is_natval(FR[f 3 ])) {<br />

FR[f 1 ] = NATVAL;<br />

} else {<br />

if (mix_l_form) {<br />

tmp_res_hi = FR[f 2 ].significand{63:32};<br />

tmp_res_lo = FR[f 3 ].significand{63:32};<br />

} else if (mix_r_form) {<br />

tmp_res_hi = FR[f 2 ].significand{31:0};<br />

tmp_res_lo = FR[f 3 ].significand{31:0};<br />

} else { // mix_lr_form<br />

tmp_res_hi = FR[f 2 ].significand{63:32};<br />

tmp_res_lo = FR[f 3 ].significand{31:0};<br />

}<br />

FR[f 1 ].significand = fp_concatenate(tmp_res_hi, tmp_res_lo);<br />

FR[f 1 ].exponent = FP_INTEGER_EXP;<br />

FR[f 1 ].sign = FP_SIGN_POSITIVE;<br />

}<br />

fp_update_psr(f 1 );<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点レ ジ ス タ無効フ ォ ル ト<br />

3:76 第 3 巻 : 命令リファレンス<br />

fmix


fmpy<br />

fmpy ─ 浮動小数点乗算 (Floating-point Multiply)<br />

書式 : (qp) fmpy.pc.sf f 1 = f 3 , f 4 (qp) fma.pc.sf f 1 = f 3 , f 4 , f0 の擬似オペコ ー ド<br />

説明 : FR f3 と FR f4 と の積が無限の精度で計算される。 次に、 結果の値が、 FPSR.sf.rc で指定さ<br />

れる丸めモー ド と pc ( さらにFPSR.sf.pc および FPSR.sf.wre) で指定される精度にした<br />

が っ て丸め ら れ、 その結果が FR f1 に格納される。<br />

FR f3 か FR f4 が NaTVal である場合は、 FR f1 は計算結果ではな く NaTVal に設定される。<br />

オペコ ー ド の pc のニーモニ ッ ク値は 3:50 ページの表 2-22 に示している。 sf のニーモ<br />

ニック値は3:50 ページの表 2-23 に示している。 ステータス ・ フ ィ ール ド の pc、 wre、 rc<br />

のエンコ ーデ ィ ング と意味については、 第 1 巻、 第 1 部の表 5-5 および第 1 巻、 第 1 部<br />

の表 5-6 を参照のこ と。<br />

操作 : 3:70 ページの 「fma — 浮動小数点積和 (Floating-point Multiply Add)」 を参照のこと 。<br />

第 3 巻 : 命令リファレンス 3:77


fms ─ 浮動小数点積差 (Floating-point Multiply Subtract)<br />

書式 : (qp) fms.pc.sf f 1 = f 3 , f 4 , f 2 F1<br />

説明 : FR f3 と FR f4 と の積が無限の精度で計算され、 次に FR f2 がこの積からやはり無限の精度<br />

で減算される。 この結果の値が、 FPSR.sf.rc で指定される丸めモー ド と pc ( さらに<br />

FPSR.sf.pc および FPSR.sf.wre) で指定される精度にしたが って丸められ、 その結果が FR<br />

f1 に格納される。<br />

FR f3 、 FR f4 、 FR f2 のどれか 1 つでも NaTVal である場合は、 FR f1 は計算結果ではな く<br />

NaTVal に設定される。<br />

f2 が f0 の場合は、 積差演算の代わ り に IEEE の乗算が行われる。 3:77 ページの 「fmpy —<br />

浮動小数点乗算 (Floating-point Multiply)」 を参照のこ と。<br />

オペコ ー ド の pc のニーモニ ッ ク値は 3:50 ページの表 2-22 に示している。 sf のニーモ<br />

ニック値は3:50 ページの表 2-23 に示している。 ステータス ・ フ ィ ール ド の pc、 wre、 お<br />

よび rc のエン コ ーデ ィ ング と意味については、 第 1 巻、 第 1 部の表 5-5 および第 1 巻、<br />

第 1 部の表 5-6 を参照のこ と。<br />

操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1 );<br />

if (tmp_isrcode = fp_reg_disabled(f 1, f 2, f 3, f 4))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

}<br />

if (fp_is_natval(FR[f 2 ]) || fp_is_natval(FR[f 3 ]) ||<br />

fp_is_natval(FR[f 4 ])) {<br />

FR[f 1 ] = NATVAL;<br />

fp_update_psr(f 1);<br />

} else {<br />

tmp_default_result = fms_fnma_exception_fault_check(f 2 , f 3 , f 4 ,<br />

pc, sf, &tmp_fp_env);<br />

if (fp_raise_fault(tmp_fp_env))<br />

fp_exception_fault(fp_decode_fault(tmp_fp_env));<br />

}<br />

if (fp_is_nan_or_inf(tmp_default_result)) {<br />

FR[f 1 ] = tmp_default_result;<br />

} else {<br />

tmp_res = fp_mul(fp_reg_read(FR[f 3 ]), fp_reg_read(FR[f 4 ]));<br />

tmp_fr2 = fp_reg_read(FR[f 2 ]);<br />

tmp_fr2.sign = !tmp_fr2.sign;<br />

if (f 2 != 0)<br />

tmp_res = fp_add(tmp_res, tmp_fr2, tmp_fp_env);<br />

FR[f 1 ] = fp_ieee_round(tmp_res, &tmp_fp_env);<br />

}<br />

fp_update_fpsr(sf, tmp_fp_env);<br />

fp_update_psr(f 1 );<br />

if (fp_raise_traps(tmp_fp_env))<br />

fp_exception_trap(fp_decode_trap(tmp_fp_env));<br />

FP 例外 : 無効操作 (Invalid Operation: V) アンダーフロー (Underflow: U)<br />

デノーマル/ アンノ ーマル ・ オペラン ド オーバーフロー (Overflow: O)<br />

(Denormal/Unnormal Operand: D) 不正確結果 (Inexact: I)<br />

ソフ ト ウェア・アシスト ソフ ト ウェア・アシスト<br />

(Software Assist: SWA) フォルト (Software Assist: SWA) ト ラップ<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点例外フ ォ ル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト 浮動小数点例外 ト ラ ッ プ<br />

3:78 第 3 巻 : 命令リファレンス<br />

fms


fneg<br />

fneg ─ 浮動小数点否定 (Floating-point Negate)<br />

書式 : (qp) fnegf 1 = f 3 (qp) fmerge.nsf 1 = f 3 , f 3 の擬似オペコ ー ド<br />

説明 : FR f3 の値が否定され、 FR f1 に格納される。<br />

FR f3 が NaTVal である場合は、 FR f1 は計算結果ではな く NaTVal に設定される。<br />

操作 : 3:72 ページの 「fmerge — 浮動小数点マ ー ジ (Floating-point Merge)」 を参照のこ と 。<br />

第 3 巻 : 命令リファレンス 3:79


fnegabs<br />

fnegabs ─ 浮動小数点絶対値の否定 (Floating-point Negate Absolute Value)<br />

書式 : (qp) fnegabs f 1 = f 3 (qp) fmerge.nsf 1 = f0, f 3 の擬似オペコ ー ド<br />

説明 : FR f3 の値の絶対値が計算 さ れ、 それが否定 さ れて、 FR f1 に格納される。<br />

FR f3 が NaTVal である場合は、 FR f1 は計算結果ではな く NaTVal に設定される。<br />

操作 : 3:72 ページの 「fmerge — 浮動小数点マ ー ジ (Floating-point Merge)」 を参照のこ と 。<br />

3:80 第 3 巻 : 命令リファレンス


fnma<br />

fnma ─ 浮動小数点積和の否定 (Floating-point Negative Multiply Add)<br />

書式 : (qp) fnma.pc.sf f 1 = f 3 , f 4 , f 2 F1<br />

説明 : FR f3 と FR f4 と の積が無限の精度で計算され、 否定され、 次に FR f2 がこの積にやはり無限<br />

の精度で加算される。 その後、 結果の値が、 FPSR.sf.rc で指定される丸めモー ド と pc ( さら<br />

に FPSR.sf.pc および FPSR.sf.wre) で指定される精度にしたがって丸められ、 その結果が FR<br />

f1 に格納される。<br />

FR f3 、 FR f4 、 FR f2 のどれか 1 つでも NaTVal である場合は、 FR f1 は計算結果ではな く<br />

NaTVal に設定される。<br />

f2 が f0 の場合は、 IEEE の乗算が行われた後、 その乗算結果が否定される。 3:82 ページ<br />

の 「fnmpy — 浮動小数点乗算の否定 (Floating-point Negative Multiply)」 を参照のこ と。<br />

オペコ ー ド の pc のニーモニ ッ ク値は 3:50 ページの表 2-22 に示している。 sf のニーモ<br />

ニック値は3:50 ページの表 2-23 に示している。 ステータス ・ フ ィ ール ド の pc、 wre、 rc<br />

のエンコ ーデ ィ ング と意味については、 第 1 巻、 第 1 部の表 5-5 および第 1 巻、 第 1 部<br />

の表 5-6 を参照のこ と。<br />

操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1 );<br />

if (tmp_isrcode = fp_reg_disabled(f 1, f 2, f 3, f 4))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

}<br />

if (fp_is_natval(FR[f 2 ]) || fp_is_natval(FR[f 3 ]) ||<br />

fp_is_natval(FR[f 4 ])) {<br />

FR[f 1 ] = NATVAL;<br />

fp_update_psr(f 1);<br />

} else {<br />

tmp_default_result = fms_fnma_exception_fault_check(f 2 , f 3 , f 4 ,<br />

pc, sf, &tmp_fp_env);<br />

if (fp_raise_fault(tmp_fp_env))<br />

fp_exception_fault(fp_decode_fault(tmp_fp_env));<br />

}<br />

if (fp_is_nan_or_inf(tmp_default_result)) {<br />

FR[f 1 ] = tmp_default_result;<br />

} else {<br />

tmp_res = fp_mul(fp_reg_read(FR[f 3 ]), fp_reg_read(FR[f 4 ]));<br />

tmp_res.sign = !tmp_res.sign;<br />

if (f 2 != 0)<br />

tmp_res = fp_add(tmp_res, fp_reg_read(FR[f 2 ]), tmp_fp_env);<br />

FR[f 1 ] = fp_ieee_round(tmp_res, &tmp_fp_env);<br />

}<br />

fp_update_fpsr(sf, tmp_fp_env);<br />

fp_update_psr(f 1);<br />

if (fp_raise_traps(tmp_fp_env))<br />

fp_exception_trap(fp_decode_trap(tmp_fp_env));<br />

FP 例外 : 無効操作 (Invalid Operation: V) アンダーフロー (Underflow: U)<br />

デノーマル/ アンノ ーマル ・ オペラン ド オーバーフロー (Overflow: O)<br />

(Denormal/Unnormal Operand: D) 正確結果 (Inexact: I)<br />

ソフ ト ウェア・アシスト ソフ ト ウェア・アシスト<br />

(Software Assist: SWA) フォルト (Software Assist: SWA) ト ラップ<br />

割り込み : 浮動小数点レ ジ ス タ無効フ ォ ル ト 浮動小数点例外 ト ラ ッ プ<br />

浮動小数点例外フ ォ ル ト<br />

第 3 巻 : 命令リファレンス 3:81


fnmpy ─ 浮動小数点乗算の否定 (Floating-point Negative Multiply)<br />

書式 : (qp) fnmpy.pc.sf f 1 = f 3 , f 4 (qp) fnma.pc.sf f 1 = f 3 , f 4 ,f0 の擬似オペコ ー ド<br />

fnmpy<br />

説明 : FR f3 と FR f4 と の積が無限の精度で計算され、 次に否定される。 その後、 結果の値が、<br />

FPSR.sf.rc で指定される丸めモー ド と pc ( さらにFPSR.sf.pc および FPSR.sf.wre) で指定さ<br />

れる精度にしたがって丸められ、 その結果が FR f1 に格納される。<br />

FR f3 か FR f4 が NaTVal である場合は、 FR f1 は計算結果ではな く NaTVal に設定される。<br />

オペコ ー ド の pc のニーモニ ッ ク値は 3:50 ページの表 2-22 に示している。 sf のニーモ<br />

ニック値は3:50 ページの表 2-23 に示している。 ステータス ・ フ ィ ール ド の pc、 wre、 rc<br />

のエンコ ーデ ィ ング と意味については、 第 1 巻、 第 1 部の表 5-5 および第 1 巻、 第 1 部<br />

の表 5-6 を参照のこ と。<br />

操作 : 3:81 ページの 「fnma — 浮動小数点積和の否定 (Floating-point Negative Multiply Add)」 を参<br />

照の こ と 。<br />

3:82 第 3 巻 : 命令リファレンス


fnorm<br />

fnorm ─ 浮動小数点正規化 (Floating-point Normalize)<br />

書式 : (qp) fnorm.pc.sf f 1 = f 3 (qp) fma.pc.sf f 1 = f 3 , f1, f0 の擬似オペコ ー ド<br />

説明 : FR f3 がノーマライズされ、 FPSR.sf.rc で指定される丸めモー ド と pc ( さらにFPSR.sf.pc<br />

およびFPSR.sf.wre) で指定される精度にしたがっ て丸め られ、 その結果が FR f1 に格納さ<br />

れる。<br />

FR f3 が NaTVal である場合は、 FR f1 は計算結果ではな く NaTVal に設定される。<br />

オペコ ー ド の pc のニーモニ ッ ク値は 3:50 ページの表 2-22 に示している。 sf のニーモ<br />

ニック値は3:50 ページの表 2-23 に示している。 ステータス ・ フ ィ ール ド の pc、 wre、 rc<br />

のエンコ ーデ ィ ング と意味については、 第 1 巻、 第 1 部の表 5-5 および第 1 巻、 第 1 部<br />

の表 5-6 を参照のこ と。<br />

操作 : 3:70 ページの 「fma — 浮動小数点積和 (Floating-point Multiply Add)」 を参照の こ と 。<br />

第 3 巻 : 命令リファレンス 3:83


for ─ 浮動小数点論理和 (Floating-point Logical Or)<br />

書式 : (qp) forf 1 = f 2 , f 3 F9<br />

説明 : FR f2 およびFR f3 の両仮数フ ィ ー ル ド 間のビ ッ ト 単位の論理和が計算され、 結果の値が<br />

FR f1 の仮数フ ィ ール ド に格納される。 FR f1 の指数フ ィ ール ド は 2.063 (0x1003E) のバイ<br />

アス付き指数に設定 さ れ、 FR f1 の符号フ ィ ール ド は正に対応する 0 に設定される。<br />

FR f2 か FR f3 が NaTVal である場合は、 FR f1 は計算結果ではな く NaTVal に設定される。<br />

操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1 );<br />

if (tmp_isrcode = fp_reg_disabled(f 1 , f 2 , f 3 , 0))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

}<br />

FP 例外 : なし。<br />

if (fp_is_natval(FR[f 2 ]) || fp_is_natval(FR[f 3 ])) {<br />

FR[f 1] = NATVAL;<br />

} else {<br />

FR[f 1 ].significand = FR[f 2 ].significand | FR[f 3 ].significand;<br />

FR[f 1].exponent = FP_INTEGER_EXP;<br />

FR[f 1 ].sign = FP_SIGN_POSITIVE;<br />

}<br />

fp_update_psr(f 1 );<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点レ ジ ス タ無効フ ォ ル ト<br />

3:84 第 3 巻 : 命令リファレンス<br />

for


fpabs<br />

fpabs ─ 浮動小数点並列絶対値 (Floating-point Parallel Absolute Value)<br />

書式 : (qp) fpabs f 1 = f 3 (qp) fpmerge.sf 1 = f0, f 3 の擬似オペコ ー ド<br />

説明 : FR f3 の仮数フ ィ ー ル ド 内の単精度値ペアの絶対値が計算 さ れ、 結果が FR f1 の仮数<br />

フィールドに格納される。 FR f1 の指数フ ィ ール ド は 2.063 (0x1003E) のバイアス付き指数<br />

に設定され、 FR f1 の符号フ ィ ール ド は正に対応する 0 に設定される。<br />

FR f3 が NaTVal である場合は、 FR f1 は計算結果ではな く NaTVal に設定される。<br />

操作 : 3:99 ページの 「fpmerge — 浮動小数点並列マ ー ジ (Floating-point Parallel Merge)」 を参照の<br />

こと。<br />

第 3 巻 : 命令リファレンス 3:85


fpack ─ 浮動小数点パック (Floating-point Pack)<br />

fpack<br />

書式 : (qp) fpack f 1 = f 2 , f 3 pack_form F9<br />

説明 : FR f2 およびFR f3 に格納 さ れてい る レ ジ ス タ形式の 2 つの数値が単精度の メ モ リ 形式に<br />

変換 さ れる。 こ れ ら 2 つの単精度数値が連結 さ れ、 FR f1 の仮数フ ィ ール ド に格納され<br />

る。 FR f1 の指数フ ィ ール ド は 2.063 (0x1003E) のバイアス付き指数に設定され、 FR f1 の<br />

符号フ ィ ー ル ド は正に対応す る 0 に設定される。<br />

FR f2 か FR f3 が NaTVal である場合は、 FR f1 は計算結果ではな く NaTVal に設定される。<br />

図 2-14. 浮動小数点パック<br />

操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1 );<br />

if (tmp_isrcode = fp_reg_disabled(f 1 , f 2 , f 3 , 0))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

}<br />

FP 例外 : なし。<br />

FR f 2<br />

81 80 64 63 0 81 80 64 63<br />

0<br />

FR f 1<br />

82 ビットの FR から単精度メモリ形式への変換<br />

81 80 64 63 32 31<br />

0<br />

0 1003E<br />

if (fp_is_natval(FR[f 2 ]) || fp_is_natval(FR[f 3 ])) {<br />

FR[f 1] = NATVAL;<br />

} else {<br />

tmp_res_hi = fp_single(FR[f 2 ]);<br />

tmp_res_lo = fp_single(FR[f 3]);<br />

FR[f1 ].significand = fp_concatenate(tmp_res_hi, tmp_res_lo);<br />

FR[f1].exponent = FP_INTEGER_EXP;<br />

FR[f1 ].sign = FP_SIGN_POSITIVE;<br />

}<br />

fp_update_psr(f1); 割り込み : 無効操作フ ォ ル ト 浮動小数点レ ジ ス タ無効フ ォ ル ト<br />

3:86 第 3 巻 : 命令リファレンス<br />

FR f 3


fpamax<br />

fpamax ─ 浮動小数点並列最大絶対値<br />

(Floating-point Parallel Absolute Maximum)<br />

書式 : (qp) fpamax.sf f 1 = f 2 , f 3 F8<br />

説明 : FR f2 およびFR f3 の両仮数フ ィ ー ル ド に格納 さ れてい る単精度値のペアを それぞれ比較<br />

し、 絶対値が大きい方のオペラン ド が FR f1 の仮数フ ィ ール ド に返される。<br />

FR f3 の上 ( 下 ) 位の絶対値が FR f2 の上 ( 下 ) 位の絶対値よ り も 小 さ い場合は、 FR f1 の<br />

上 ( 下 ) 位には FR f2 の上 ( 下 ) 位が格納 さ れる。 そ う でない場合は、 FR f1 の上 ( 下 ) 位<br />

には FR f3 の上 ( 下 ) 位が格納される。<br />

FR f2 の上 ( 下 ) 位または FR f3 の上 ( 下 ) 位が NaN であって、 かつ FR f2 も FR f3 も<br />

NaTVal でない場合は、 FR f1 の上 ( 下 ) 位には FR f3 の上 ( 下 ) 位が格納される。<br />

FR f1 の指数フ ィ ール ド は 2.063 (0x1003E) のバイアス付き指数に設定 さ れ、 FR f1 の符号<br />

フィールドは正に対応する0 に設定される。<br />

FR f2 か FR f3 が NaTVal である場合は、 FR f1 は計算結果ではな く NaTVal に設定される。<br />

こ の操作は、 他の浮動小数点算術演算命令 と は異な り 、 NaN を伝播させない。 fcmp.lt<br />

操作の場合 と 同じ方法で無効操作 (Invalid Operation) が通知される。<br />

sf のニーモニ ッ ク値は、 3:50 ページの表 2-23 に示している。<br />

操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1 );<br />

if (tmp_isrcode = fp_reg_disabled(f 1 , f 2 , f 3 , 0))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

}<br />

if (fp_is_natval(FR[f 2 ]) || fp_is_natval(FR[f 3 ])) {<br />

FR[f 1] = NATVAL;<br />

} else {<br />

fpminmax_exception_fault_check(f 2 , f 3 , sf, &tmp_fp_env);<br />

if (fp_raise_fault(tmp_fp_env))<br />

fp_exception_fault(fp_decode_fault(tmp_fp_env));<br />

tmp_fr2 = tmp_right = fp_reg_read_hi(f 2);<br />

tmp_fr3 = tmp_left = fp_reg_read_hi(f 3 );<br />

tmp_right.sign = FP_SIGN_POSITIVE;<br />

tmp_left.sign = FP_SIGN_POSITIVE;<br />

tmp_bool_res = fp_less_than(tmp_left, tmp_right);<br />

tmp_res_hi = fp_single(tmp_bool_res ? tmp_fr2: tmp_fr3);<br />

tmp_fr2 = tmp_right = fp_reg_read_lo(f 2 );<br />

tmp_fr3 = tmp_left = fp_reg_read_lo(f 3 );<br />

tmp_right.sign = FP_SIGN_POSITIVE;<br />

tmp_left.sign = FP_SIGN_POSITIVE;<br />

tmp_bool_res = fp_less_than(tmp_left, tmp_right);<br />

tmp_res_lo = fp_single(tmp_bool_res ? tmp_fr2: tmp_fr3);<br />

FR[f 1 ].significand = fp_concatenate(tmp_res_hi, tmp_res_lo);<br />

FR[f 1].exponent = FP_INTEGER_EXP;<br />

FR[f 1 ].sign = FP_SIGN_POSITIVE;<br />

fp_update_fpsr(sf, tmp_fp_env);<br />

}<br />

fp_update_psr(f1 );<br />

第 3 巻 : 命令リファレンス 3:87


FP 例外 : 無効操作 (Invalid Operation: V)<br />

デノーマル/ アンノ ーマル ・ オペラン ド (Denormal/Unnormal Operand: D)<br />

ソフ ト ウェア・アシスト (Software Assist: SWA) フォルト<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点例外フ ォ ル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト<br />

fpamax<br />

3:88 第 3 巻 : 命令リファレンス


fpamin<br />

fpamin ─ 浮動小数点並列絶対最小値<br />

(Floating-point Parallel Absolute Minimum)<br />

書式 : (qp) fpamin.sf f 1 = f 2 , f 3 F8<br />

説明 : FR f2 およびFR f3 の両仮数フ ィ ー ル ド に格納 さ れてい る単精度値のペアを それぞれ比較<br />

し、 絶対値が小さい方のオペラン ド が FR f1 の仮数フ ィ ール ド に返される。<br />

FR f2 の上 ( 下 ) 位の絶対値が FR f3 の上 ( 下 ) 位の絶対値よ り も 小 さ い場合は、 FR f1 の<br />

上 ( 下 ) 位には FR f2 の上 ( 下 ) 位が格納 さ れる。 そ う でない場合は、 FR f1 の上 ( 下 ) 位<br />

には FR f3 の上 ( 下 ) 位が格納される。<br />

FR f2 の上 ( 下 ) 位または FR f3 の上 ( 下 ) 位が NaN であって、 かつ FR f2 も FR f3 も<br />

NaTVal でない場合は、 FR f1 の上 ( 下 ) 位には上 ( 下 ) 位の FR f3 が格納される。<br />

FR f1 の指数フ ィ ール ド は 2.063 (0x1003E) のバイアス付き指数に設定 さ れ、 FR f1 の符号<br />

フィールドは正に対応する0 に設定される。<br />

FR f2 か FR f3 が NaTVal である場合は、 FR f1 は計算結果ではな く NaTVal に設定される。<br />

こ の操作は、 他の浮動小数点算術演算命令 と は異な り 、 NaN を伝播させない。<br />

fpcmp.lt 操作の場合 と 同じ方法で無効操作 (Invalid Operation) が通知される。<br />

sf のニーモニ ッ ク値は、 3:50 ページの表 2-23 に示している。<br />

操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1 );<br />

if (tmp_isrcode = fp_reg_disabled(f 1 , f 2 , f 3 , 0))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

}<br />

if (fp_is_natval(FR[f 2 ]) || fp_is_natval(FR[f 3 ])) {<br />

FR[f 1] = NATVAL;<br />

} else {<br />

fpminmax_exception_fault_check(f 2 , f 3 , sf, &tmp_fp_env);<br />

if (fp_raise_fault(tmp_fp_env))<br />

fp_exception_fault(fp_decode_fault(tmp_fp_env));<br />

tmp_fr2 = tmp_left = fp_reg_read_hi(f 2);<br />

tmp_fr3 = tmp_right = fp_reg_read_hi(f 3 );<br />

tmp_left.sign = FP_SIGN_POSITIVE;<br />

tmp_right.sign = FP_SIGN_POSITIVE;<br />

tmp_bool_res = fp_less_than(tmp_left, tmp_right);<br />

tmp_res_hi = fp_single(tmp_bool_res ? tmp_fr2: tmp_fr3);<br />

tmp_fr2 = tmp_left = fp_reg_read_lo(f 2 );<br />

tmp_fr3 = tmp_right = fp_reg_read_lo(f 3 );<br />

tmp_left.sign = FP_SIGN_POSITIVE;<br />

tmp_right.sign = FP_SIGN_POSITIVE;<br />

tmp_bool_res = fp_less_than(tmp_left, tmp_right);<br />

tmp_res_lo = fp_single(tmp_bool_res ? tmp_fr2: tmp_fr3);<br />

FR[f 1 ].significand = fp_concatenate(tmp_res_hi, tmp_res_lo);<br />

FR[f 1].exponent = FP_INTEGER_EXP;<br />

FR[f 1 ].sign = FP_SIGN_POSITIVE;<br />

fp_update_fpsr(sf, tmp_fp_env);<br />

}<br />

fp_update_psr(f1 );<br />

第 3 巻 : 命令リファレンス 3:89


FP 例外 : 無効操作 (Invalid Operation: V)<br />

デノーマル/ アンノ ーマル ・ オペラン ド (Denormal/Unnormal Operand: D)<br />

ソフ ト ウェア・アシスト (Software Assist: SWA) フォルト<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点例外フ ォ ル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト<br />

fpamin<br />

3:90 第 3 巻 : 命令リファレンス


fpcmp<br />

fpcmp ─ 浮動小数点並列比較 (Floating-point Parallel Compare)<br />

書式 : (qp) fpcmp.frel.sf f 1 = f 2 , f 3 F8<br />

説明 : FR f 2 およびFR f 3 の両仮数フ ィ ー ル ド に格納 さ れてい る単精度ソ ー ス ・ オペラ ン ド の各<br />

ペアが、 frel で指定される 12 種類の関係のいずれか 1 つについて比較される。 この操作<br />

に よ り ブ ー ル結果が生成 さ れる。 結果は、 比較条件が真であ る場合は 32 個の "1" からな<br />

るマスクになり、 偽の場合は 32 個の "0" からなるマスクになる。 この結果は、 FR f 1 の<br />

仮数フ ィ ー ル ド に 32 ビット整数のペアとして書き込まれる。 FR f 1 の指数フ ィ ール ド は<br />

2.0 63 (0x1003E) のバイアス付き指数に設定 さ れ、 FR f 1 の符号フ ィ ール ド は正に対応する<br />

0 に設定される。<br />

表 2-29. 浮動小数点並列比較の結果<br />

PR[qp]==0<br />

結果 ==0、ソースに<br />

NaTVal なし<br />

PR[qp]==1<br />

結果 ==1、ソースに<br />

NaTVal なし<br />

sf のニーモニ ッ ク値は 3:50 ページの表 2-23 に示している。<br />

各比較タ イ プに対して定義されてい る比較関係の一覧を表 2-30 に示す。 12 種類の関係の<br />

すべてがハー ド ウ ェ アで直接サポ ー ト さ れてい る わけではない。 一部は実際に は擬似オ<br />

ペコー ドである。 それらの関係に対しては、 アセンブラは単にソース ・ オペランド指定<br />

子やプレデ ィ ケ ー ト ・ タ イプ指定子を切り換えて、 サポ ー ト されている関係を利用する。<br />

FR f2 か FR f3 が NaTVal である場合は、 FR f1 は計算結果ではな く NaTVal に設定される。<br />

操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1);<br />

if (tmp_isrcode = fp_reg_disabled(f 1 , f 2 , f 3 , 0))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

if (fp_is_natval(FR[f 2 ]) || fp_is_natval(FR[f 3 ])) {<br />

FR[f 1 ] = NATVAL;<br />

ソースに NaTVal が<br />

1 つ以上あり<br />

無変更 0...0 1...1 NaTVal<br />

表 2-30. 浮動小数点並列比較関係<br />

frel frel コンプリータの意味 関係 擬似オペコード<br />

オペランドが<br />

クワイエット型 NaN の<br />

場合の無効通知の有無<br />

eq 等しい f2 == f3 なし<br />

lt より小 f2 < f3 あり<br />

le より小か等しい f2 f3 lt f2 ↔ f3 あり<br />

ge より大か等しい f2 >= f3 le f2 ↔ f3 あり<br />

unord 非順序化 ( アンオーダー ) f2 ? f3 なし<br />

neq 等しくない !(f2 == f3 ) なし<br />

nlt より小でない !(f2 < f3 ) あり<br />

nle より小でないか等しい !(f2 f3 ) nlt f2 ↔ f3 あり<br />

nge より大でないか等しい !(f2 >= f3 ) nle f2 ↔ f3 あり<br />

ord 順序化 ( オーダー ) !(f2 ? f3 ) なし<br />

第 3 巻 : 命令リファレンス 3:91


}<br />

} else {<br />

fpcmp_exception_fault_check(f 2, f 3, frel, sf, &tmp_fp_env);<br />

if (fp_raise_fault(tmp_fp_env))<br />

fp_exception_fault(fp_decode_fault(tmp_fp_env));<br />

tmp_fr2 = fp_reg_read_hi(f 2 );<br />

tmp_fr3 = fp_reg_read_hi(f 3 );<br />

if (frel == ‘eq’) tmp_rel = fp_equal(tmp_fr2, tmp_fr3);<br />

else if (frel == ‘lt’) tmp_rel = fp_less_than(tmp_fr2, tmp_fr3);<br />

else if (frel == ‘le’) tmp_rel = fp_lesser_or_equal(tmp_fr2,<br />

tmp_fr3);<br />

else if (frel == ‘gt’) tmp_rel = fp_less_than(tmp_fr3, tmp_fr2);<br />

else if (frel == ‘ge’) tmp_rel = fp_lesser_or_equal(tmp_fr3,<br />

tmp_fr2);<br />

else if (frel == ‘unord’)tmp_rel = fp_unordered(tmp_fr2, tmp_fr3);<br />

else if (frel == ‘neq’) tmp_rel = !fp_equal(tmp_fr2, tmp_fr3);<br />

else if (frel == ‘nlt’) tmp_rel = !fp_less_than(tmp_fr2, tmp_fr3);<br />

else if (frel == ‘nle’) tmp_rel = !fp_lesser_or_equal(tmp_fr2,<br />

tmp_fr3);<br />

else if (frel == ‘ngt’) tmp_rel = !fp_less_than(tmp_fr3, tmp_fr2);<br />

else if (frel == ‘nge’) tmp_rel = !fp_lesser_or_equal(tmp_fr3,<br />

tmp_fr2);<br />

else tmp_rel = !fp_unordered(tmp_fr2,<br />

tmp_fr3); //‘ord’<br />

tmp_res_hi = (tmp_rel ? 0xFFFFFFFF : 0x00000000);<br />

tmp_fr2 = fp_reg_read_lo(f 2 );<br />

tmp_fr3 = fp_reg_read_lo(f 3 );<br />

if (frel == ‘eq’) tmp_rel = fp_equal(tmp_fr2, tmp_fr3);<br />

else if (frel == ‘lt’) tmp_rel = fp_less_than(tmp_fr2, tmp_fr3);<br />

else if (frel == ‘le’) tmp_rel = fp_lesser_or_equal(tmp_fr2,<br />

tmp_fr3);<br />

else if (frel == ‘gt’) tmp_rel = fp_less_than(tmp_fr3, tmp_fr2);<br />

else if (frel == ‘ge’) tmp_rel = fp_lesser_or_equal(tmp_fr3,<br />

tmp_fr2);<br />

else if (frel == ‘unord’)tmp_rel = fp_unordered(tmp_fr2, tmp_fr3);<br />

else if (frel == ‘neq’) tmp_rel = !fp_equal(tmp_fr2, tmp_fr3);<br />

else if (frel == ‘nlt’) tmp_rel = !fp_less_than(tmp_fr2, tmp_fr3);<br />

else if (frel == ‘nle’) tmp_rel = !fp_lesser_or_equal(tmp_fr2,<br />

tmp_fr3);<br />

else if (frel == ‘ngt’) tmp_rel = !fp_less_than(tmp_fr3, tmp_fr2);<br />

else if (frel == ‘nge’) tmp_rel = !fp_lesser_or_equal(tmp_fr3,<br />

tmp_fr2);<br />

else tmp_rel = !fp_unordered(tmp_fr2,<br />

tmp_fr3); //‘ord’<br />

tmp_res_lo = (tmp_rel ? 0xFFFFFFFF : 0x00000000);<br />

FR[f 1 ].significand = fp_concatenate(tmp_res_hi, tmp_res_lo);<br />

FR[f 1 ].exponent = FP_INTEGER_EXP;<br />

FR[f 1].sign = FP_SIGN_POSITIVE;<br />

fp_update_fpsr(sf, tmp_fp_env);<br />

}<br />

fp_update_psr(f1 );<br />

fpcmp<br />

3:92 第 3 巻 : 命令リファレンス


fpcmp<br />

FP 例外 : 無効操作 (Invalid Operation: V)<br />

デノーマル/ アンノ ーマル ・ オペラン ド (Denormal/Unnormal Operand: D)<br />

ソフ ト ウェア・アシスト (Software Assist: SWA) フォルト<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点例外フ ォ ル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト<br />

第 3 巻 : 命令リファレンス 3:93


fpcvt.fx ─ 並列浮動小数点から整数への変換<br />

(Convert Parallel Floating-point to Integer)<br />

fpcvt.fx<br />

書式 : (qp) fpcvt.fx.sf f 1 = f 2 signed_form F10<br />

(qp) fpcvt.fx.trunc.sf f 1 = f 2 signed_form, trunc_form F10<br />

(qp) fpcvt.fxu.sf f 1 = f 2 unsigned_form F10<br />

(qp) fpcvt.fxu.trunc.sf f 1 = f 2 unsigned_form, trunc_form F10<br />

説明 : FR f2 の仮数フ ィ ー ル ド 内の単精度値のペアが、 FPSR.sf.rc で指定される丸めモー ド を使<br />

用して、 あるいは こ の命令の trunc_form が使用された場合はゼロ側への丸めモー ド を使<br />

用し、 符号付き (signed_form の場合 ) または符号なし (unsigned_form の場合 ) の 32 ビッ<br />

ト整数のペアに変換される。 この結果が、 32 ビット整数のペアとしてFR f1 の仮数<br />

フィールドに書き込まれる。 FR f1 の指数フ ィ ール ド は 2.063 (0x1003E) のバイアス付き指<br />

数に設定され、 FR f1 の符号フ ィ ール ド は正に対応する 0 に設定される。 IEEE 無効操作<br />

浮動小数点例外 (Invalid Operation Floating-Point Exception) フォルトがディスエーブルにさ<br />

れて、 変換の結果が 32 ビ ッ ト 整数 と して表現で き なか っ た場合は、 結果 と して 32 ビッ<br />

ト の不定整数値 0x80000000 が使用される。<br />

FR f2 が NaTVal である場合は、 FR f1 は計算結果ではな く NaTVal に設定される。<br />

sf のニーモニ ッ ク値は 3:50 ページの表 2-23 に示している。<br />

操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1 );<br />

if (tmp_isrcode = fp_reg_disabled(f 1 , f 2 , 0, 0))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

if (fp_is_natval(FR[f 2 ])) {<br />

FR[f 1] = NATVAL;<br />

fp_update_psr(f 1 );<br />

} else {<br />

tmp_default_result_pair = fpcvt_exception_fault_check(f 2,<br />

signed_form, trunc_form, sf, &tmp_fp_env);<br />

if (fp_raise_fault(tmp_fp_env))<br />

fp_exception_fault(fp_decode_fault(tmp_fp_env));<br />

if (fp_is_nan(tmp_default_result_pair.hi)) {<br />

tmp_res_hi = INTEGER_INDEFINITE_32_BIT;<br />

} else {<br />

tmp_res = fp_ieee_rnd_to_int_sp(fp_reg_read_hi(f 2 ), HIGH,<br />

&tmp_fp_env);<br />

if (tmp_res.exponent)<br />

tmp_res.significand = fp_U64_rsh(<br />

tmp_res.significand, (FP_INTEGER_EXP - tmp_res.exponent));<br />

if (signed_form && tmp_res.sign)<br />

tmp_res.significand = (~tmp_res.significand) + 1;<br />

}<br />

tmp_res_hi = tmp_res.significand{31:0};<br />

if (fp_is_nan(tmp_default_result_pair.lo)) {<br />

tmp_res_lo = INTEGER_INDEFINITE_32_BIT;<br />

} else {<br />

tmp_res = fp_ieee_rnd_to_int_sp(fp_reg_read_lo(f 2 ), LOW,<br />

&tmp_fp_env);<br />

if (tmp_res.exponent)<br />

tmp_res.significand = fp_U64_rsh(<br />

tmp_res.significand, (FP_INTEGER_EXP - tmp_res.exponent));<br />

if (signed_form && tmp_res.sign)<br />

3:94 第 3 巻 : 命令リファレンス


fpcvt.fx<br />

}<br />

}<br />

}<br />

tmp_res.significand = (~tmp_res.significand) + 1;<br />

tmp_res_lo = tmp_res.significand{31:0};<br />

FR[f 1 ].significand = fp_concatenate(tmp_res_hi, tmp_res_lo);<br />

FR[f 1 ].exponent = FP_INTEGER_EXP;<br />

FR[f 1 ].sign = FP_SIGN_POSITIVE;<br />

fp_update_fpsr(sf, tmp_fp_env);<br />

fp_update_psr(f 1 );<br />

if (fp_raise_traps(tmp_fp_env))<br />

fp_exception_trap(fp_decode_trap(tmp_fp_env));<br />

FP 例外 : 無効操作 (Invalid Operation: V) 不正確結果 (Inexact: I)<br />

デノーマル/ アンノ ーマル ・ オペラン ド (Denormal/Unnormal Operand: D)<br />

ソフ ト ウェア・アシスト (Software Assist: SWA) フォルト<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点例外フ ォ ル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト 浮動小数点例外 ト ラ ッ プ<br />

第 3 巻 : 命令リファレンス 3:95


fpma ─ 浮動小数点並列積和 (Floating-point Parallel Multiply Add)<br />

書式 : (qp) fpma.sf f 1 = f 3 , f 4 , f 2 F1<br />

説明 : FR f3 およびFR f4 の両仮数フ ィ ー ル ド に格納 さ れてい る単精度値のペアのそれぞれの積<br />

が無限の精度で計算 さ れ、 次に、 FR f2 の仮数フ ィ ー ル ド の単精度値のペアが、 計算結果<br />

の 2 つの積にやは り 無限の精度で加算 さ れる。 その後、 得 ら れた 2 つの値が FPSR.sf.rc<br />

で指定される丸めモー ド を使用して単精度に丸められる。 丸められた結果のペアが FR f1 の仮数フ ィ ール ド に格納される。 FR f1 の指数フ ィ ール ド は 2.0 63 (0x1003E) のバイアス付<br />

き指数に設定 さ れ、 FR f1 の符号フ ィ ール ド は正に対応する 0 に設定される。<br />

FR f3 、 FR f4 、 FR f2 のどれか 1 つでも NaTVal である場合は、 FR f1 は計算結果ではな く<br />

NaTVal に設定される。<br />

注 : fmpa 命令の f2 が f0 の場合は、 単に IEEE の乗算が行われる (3:102 ページの<br />

「fpmpy — 浮動小数点並列乗算 (Floating-point Parallel Multiply)」 を参照のこ と )。 FR<br />

f1 は、 オペラン ド と しては、 パッ ク された値 1.0 のペアではない。 単に、 レジス<br />

タ・ファイル形式の値1.0 である。<br />

sf のニーモニ ッ ク値は 3:50 ページの表 2-23 に示している。<br />

ステータス ・ フ ィ ールドの rc のエンコ ーデ ィ ング と意味は、 第 1 巻、 第 1 部の表 5-5 に<br />

示している。<br />

操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1 );<br />

if (tmp_isrcode = fp_reg_disabled(f 1, f 2, f 3, f 4))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

if (fp_is_natval(FR[f 2 ]) || fp_is_natval(FR[f 3 ]) ||<br />

fp_is_natval(FR[f 4 ])) {<br />

FR[f 1 ] = NATVAL;<br />

fp_update_psr(f 1 );<br />

} else {<br />

tmp_default_result_pair = fpma_exception_fault_check(f 2 ,<br />

f 3 , f 4 , sf, &tmp_fp_env);<br />

if (fp_raise_fault(tmp_fp_env))<br />

fp_exception_fault(fp_decode_fault(tmp_fp_env));<br />

if (fp_is_nan_or_inf(tmp_default_result_pair.hi)) {<br />

tmp_res_hi = fp_single(tmp_default_result_pair.hi);<br />

} else {<br />

tmp_res = fp_mul(fp_reg_read_hi(f 3 ), fp_reg_read_hi(f 4 ));<br />

if (f 2 != 0)<br />

tmp_res = fp_add(tmp_res, fp_reg_read_hi(f 2 ), tmp_fp_env);<br />

tmp_res_hi = fp_ieee_round_sp(tmp_res, HIGH, &tmp_fp_env);<br />

}<br />

if (fp_is_nan_or_inf(tmp_default_result_pair.lo)) {<br />

tmp_res_lo = fp_single(tmp_default_result_pair.lo);<br />

} else {<br />

tmp_res = fp_mul(fp_reg_read_lo(f 3 ), fp_reg_read_lo(f 4 ));<br />

if (f 2 != 0)<br />

tmp_res = fp_add(tmp_res, fp_reg_read_lo(f 2 ), tmp_fp_env);<br />

tmp_res_lo = fp_ieee_round_sp(tmp_res, LOW, &tmp_fp_env);<br />

}<br />

FR[f 1 ].significand = fp_concatenate(tmp_res_hi, tmp_res_lo);<br />

FR[f 1].exponent = FP_INTEGER_EXP;<br />

FR[f 1 ].sign = FP_SIGN_POSITIVE;<br />

3:96 第 3 巻 : 命令リファレンス<br />

fpma


fpma<br />

}<br />

}<br />

fp_update_fpsr(sf, tmp_fp_env);<br />

fp_update_psr(f 1 );<br />

if (fp_raise_traps(tmp_fp_env))<br />

fp_exception_trap(fp_decode_trap(tmp_fp_env));<br />

FP 例外 : 無効操作 (Invalid Operation: V) アンダーフロー (Underflow: U)<br />

デノーマル/ アンノ ーマル ・ オペラン ド オーバーフロー (Overflow: O)<br />

(Denormal/Unnormal Operand: D) 不正確結果 (Inexact: I)<br />

ソフ ト ウェア・アシスト ソフ ト ウェア・アシスト<br />

(Software Assist: SWA) フォルト (Software Assist: SWA) ト ラップ<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点例外フ ォ ル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト 浮動小数点例外 ト ラ ッ プ<br />

第 3 巻 : 命令リファレンス 3:97


fpmax ─ 浮動小数点並列最大値 (Floating-point Parallel Maximum)<br />

fpmax<br />

書式 : (qp) fpmax.sf f 1 = f 2 , f 3 F8<br />

説明 : FR f2 およびFR f3 の両仮数フ ィ ー ル ド に格納 さ れてい る単精度値のペアがそれぞれ比較<br />

される。 値が大きい方のオペランドが FR f1 の仮数フ ィ ール ド に返される。<br />

FR f3 の上 ( 下 ) 位の値が FR f2 の上 ( 下 ) 位の値よ り も 小さ い場合は、 FR f1 の上 ( 下 ) 位<br />

には FR f2 の上 ( 下 ) 位が格納される。 そ う でない場合は、 FR f1 の上 ( 下 ) 位には FR f3 の上 ( 下 ) 位が格納される。<br />

FR f2 の上 ( 下 ) 位または FR f3 の上 ( 下 ) 位が NaN である場合は、 FR f1 の上 ( 下 ) 位に<br />

はの FR f3 の上 ( 下 ) 位が格納される。<br />

FR f1 の指数フ ィ ール ド は 2.0 63 (0x1003E) のバイアス付き指数に設定され、 FR f1 の符号<br />

フィールドは正に対応する0 に設定される。<br />

FR f2 か FR f3 が NaTVal である場合は、 FR f1 は計算結果ではな く NaTVal に設定される。<br />

こ の操作は、 他の浮動小数点算術演算命令 と は異な り 、 NaN を伝播させない。<br />

fpcmp.lt 操作の場合 と 同じ方法で無効操作 (Invalid Operation) が通知される。<br />

sf のニーモニ ッ ク値は、 3:50 ページの表 2-23 に示している。<br />

操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1 );<br />

if (tmp_isrcode = fp_reg_disabled(f 1, f 2, f 3, 0))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

}<br />

if (fp_is_natval(FR[f 2 ]) || fp_is_natval(FR[f 3 ])) {<br />

FR[f 1 ] = NATVAL;<br />

} else {<br />

fpminmax_exception_fault_check(f 2, f 3, sf, &tmp_fp_env);<br />

if (fp_raise_fault(tmp_fp_env))<br />

fp_exception_fault(fp_decode_fault(tmp_fp_env));<br />

tmp_fr2 = tmp_right = fp_reg_read_hi(f 2 );<br />

tmp_fr3 = tmp_left = fp_reg_read_hi(f 3 );<br />

tmp_bool_res = fp_less_than(tmp_left, tmp_right);<br />

tmp_res_hi = fp_single(tmp_bool_res ? tmp_fr2 : tmp_fr3);<br />

tmp_fr2 = tmp_right = fp_reg_read_lo(f 2 );<br />

tmp_fr3 = tmp_left = fp_reg_read_lo(f 3 );<br />

tmp_bool_res = fp_less_than(tmp_left, tmp_right);<br />

tmp_res_lo = fp_single(tmp_bool_res ? tmp_fr2 : tmp_fr3);<br />

FR[f 1 ].significand = fp_concatenate(tmp_res_hi, tmp_res_lo);<br />

FR[f 1 ].exponent = FP_INTEGER_EXP;<br />

FR[f 1 ].sign = FP_SIGN_POSITIVE;<br />

fp_update_fpsr(sf, tmp_fp_env);<br />

}<br />

fp_update_psr(f1 );<br />

FP 例外 : 無効操作 (Invalid Operation: V)<br />

デノーマル/ アンノ ーマル ・ オペラン ド (Denormal/Unnormal Operand: D)<br />

ソフ ト ウェア・アシスト (Software Assist: SWA) フォルト<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点例外フ ォ ル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト<br />

3:98 第 3 巻 : 命令リファレンス


fpmerge<br />

fpmerge ─ 浮動小数点並列マージ (Floating-point Parallel Merge)<br />

書式 : (qp) fpmerge.nsf 1 = f 2 , f 3 neg_sign_form F9<br />

(qp) fpmerge.sf 1 = f 2 , f 3 sign_form F9<br />

(qp) fpmerge.sef 1 = f 2 , f 3 sign_exp_form F9<br />

説明 : neg_sign_form では、 FR f2 の仮数フ ィ ー ル ド 内の単精度値ペアの両符号が否定 さ れ、 FR<br />

f3 の仮数フ ィ ール ド 内の単精度値ペアの両指数お よ び両仮数 と 連結され、 FR f1 の仮数<br />

フ ィ ー ル ド に格納 さ れる。 こ の形式を使用する と 、 f2 と f3 に同じ レ ジ ス タ を使用して、<br />

単精度浮動小数点数ペアの否定を得 ら れる。<br />

sign_from では、 FR f2 の仮数フ ィ ー ル ド 内の単精度値ペアの両符号が、 FR f3 の仮数<br />

フ ィ ー ル ド 内の単精度値ペアの両指数お よ び両仮数 と 連結 さ れ、 FR f1 の仮数フ ィ ール ド<br />

に格納される。<br />

sign_exp_form では、 FR f2 の仮数フ ィ ー ル ド 内の単精度値ペアの両符号お よ び両指数が、<br />

FR f3 の仮数フ ィ ー ル ド 内の単精度値ペアのそれぞれの単精度仮数 と 連結され、 FR f1 の<br />

仮数フ ィ ー ル ド に格納 さ れる。<br />

すべての形式について、 FR f1 の指数フ ィ ール ド は 2.063 (0x1003E) のバイアス付き指数に<br />

設定 さ れ、 FR f1 の符号フ ィ ール ド は正に対応する 0 に設定される。<br />

すべての形式について、 FR f2 か FR f3 が NaTVal である場合は、 FR f1 は計算結果ではな<br />

く NaTVal に設定される。<br />

図 2-15. 浮動小数点並列マージでの符号否定操作<br />

FR f 2<br />

81 80 64 63 62 32 31 30 0 81 80 64 63 62 32 31 30 0<br />

図 2-16. 浮動小数点並列マージでの符号操作<br />

FR f 2<br />

否定された符号ビット<br />

81 80 64 63 62 32 31 30 0<br />

FR f 1<br />

0 1003E<br />

図 2-17. 浮動小数点並列マージでの符号および指数操作<br />

FR f 2<br />

第 3 巻 : 命令リファレンス 3:99<br />

FR f 3<br />

81 80 64 63 62 32 31 30 0 81 80 64 63 62 32 31 30 0<br />

FR f 1<br />

FR f 1<br />

FR f 3<br />

81 80 64 63 62 32 31 30 0<br />

0 1003E<br />

81 80 64 63 55 54 32 31 23 22 0<br />

0 1003E<br />

FR f 3<br />

81 80 64 63 55 54<br />

32 31 23 22 0<br />

81 80 64 63 55 54 32 31 23 22 0


操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1);<br />

if (tmp_isrcode = fp_reg_disabled(f 1 , f 2 , f 3 , 0))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

}<br />

if (fp_is_natval(FR[f 2 ]) || fp_is_natval(FR[f 3 ])) {<br />

FR[f 1 ] = NATVAL;<br />

} else {<br />

if (neg_sign_form) {<br />

tmp_res_hi = (!FR[f 2 ].significand{63}


fpmin<br />

fpmin ─ 浮動小数点並列最小値 (Floating-point Parallel Minimum)<br />

書式 : (qp) fpmin.sf f 1 = f 2 , f 3 F8<br />

説明 : FR f2 およびFR f3 の両仮数フ ィ ー ル ド に格納 さ れてい る単精度値のペアがそれぞれ比較<br />

される。 値が小さい方のオペランドが FR f1 の仮数フ ィ ール ド に返される。<br />

FR f2 の上 ( 下 ) 位の値が FR f3 の上 ( 下 ) 位の値よ り も 小さ い場合は、 FR f1 の上 ( 下 ) 位<br />

には FR f2 の上 ( 下 ) 位が格納される。 そ う でない場合は、 FR f1 の上 ( 下 ) 位には FR f3 の上 ( 下 ) 位が格納される。<br />

FR f2 の上 ( 下 ) 位または FR f3 の上 ( 下 ) 位が NaN である場合は、 FR f1 の上 ( 下 ) 位に<br />

は FR f3 の上 ( 下 ) 位が格納される。<br />

FR f1 の指数フ ィ ール ド は 2.0 63 (0x1003E) のバイアス付き指数に設定 さ れ、 FR f1 の符号<br />

フィールドは正に対応する0 に設定される。<br />

FR f2 か FR f3 が NaTVal である場合は、 FR f1 は計算結果ではな く NaTVal に設定される。<br />

こ の操作は、 他の浮動小数点算術演算命令 と は異な り 、 NaN を伝播させない。<br />

fpcmp.lt 操作の場合 と 同じ方法で無効操作 (Invalid Operation) が通知される。<br />

sf のニーモニ ッ ク値は、 3:50 ページの表 2-23 に示している。<br />

操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1 );<br />

if (tmp_isrcode = fp_reg_disabled(f 1, f 2, f 3, 0))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

}<br />

if (fp_is_natval(FR[f 2 ]) || fp_is_natval(FR[f 3 ])) {<br />

FR[f 1 ] = NATVAL;<br />

} else {<br />

fpminmax_exception_fault_check(f 2, f 3, sf, &tmp_fp_env);<br />

if (fp_raise_fault(tmp_fp_env))<br />

fp_exception_fault(fp_decode_fault(tmp_fp_env));<br />

tmp_fr2 = tmp_left = fp_reg_read_hi(f 2 );<br />

tmp_fr3 = tmp_right = fp_reg_read_hi(f 3 );<br />

tmp_bool_res = fp_less_than(tmp_left, tmp_right);<br />

tmp_res_hi = fp_single(tmp_bool_res ? tmp_fr2: tmp_fr3);<br />

tmp_fr2 = tmp_left = fp_reg_read_lo(f 2 );<br />

tmp_fr3 = tmp_right = fp_reg_read_lo(f 3 );<br />

tmp_bool_res = fp_less_than(tmp_left, tmp_right);<br />

tmp_res_lo = fp_single(tmp_bool_res ? tmp_fr2: tmp_fr3);<br />

FR[f 1 ].significand = fp_concatenate(tmp_res_hi, tmp_res_lo);<br />

FR[f 1 ].exponent = FP_INTEGER_EXP;<br />

FR[f 1 ].sign = FP_SIGN_POSITIVE;<br />

fp_update_fpsr(sf, tmp_fp_env);<br />

}<br />

fp_update_psr(f1 );<br />

FP 例外 : 無効操作 (Invalid Operation: V)<br />

デノーマル/ アンノ ーマル ・ オペラン ド (Denormal/Unnormal Operand: D)<br />

ソフ ト ウェア・アシスト (Software Assist: SWA) フォルト<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点例外フ ォ ル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト<br />

第 3 巻 : 命令リファレンス 3:101


fpmpy ─ 浮動小数点並列乗算 (Floating-point Parallel Multiply)<br />

書式 : (qp) fpmpy.sf f 1 = f 3 , f 4 (qp) fpma.sf f 1 = f 3 , f 4 , f0 の擬似オペコ ー ド<br />

fpmpy<br />

説明 : FR f3 およびFR f4 の両仮数フ ィ ー ル ド に格納 さ れてい る単精度値ペア間の積が無限の精<br />

度で計算される。 次に、 それぞれの結果の値が、 FPSR.sf.rc で指定される丸めモー ド を使<br />

用して、 単精度に丸められる。 丸められた結果のペアが FR f1 の仮数フ ィ ール ド に格納<br />

される。 FR f1 の指数フ ィ ール ド は 2.0 63 (0x1003E) のバイアス付き指数に設定 さ れ、 FR f1 の符号フ ィ ール ド は正に対応する 0 に設定される。<br />

FR f3 か FR f4 が NaTVal である場合は、 FR f1 は計算結果ではな く NaTVal に設定される。<br />

sf のニーモニ ッ ク値は 3:50 ページの表 2-23 に示している。<br />

ステータス ・ フ ィ ールドの rc のエンコ ーデ ィ ング と意味は、 第 1 巻、 第 1 部の表 5-5 に<br />

示している。<br />

操作 : 3:96 ページの 「fpma — 浮動小数点並列積和 (Floating-point Parallel Multiply Add)」 を参照<br />

のこと。<br />

3:102 第 3 巻 : 命令リファレンス


fpms<br />

fpms ─ 浮動小数点並列積差 (Floating-point Parallel Multiply Subtract)<br />

書式 : (qp) fpms.sf f 1 = f 3 , f 4 , f 2 F1<br />

説明 : FR f3 およびFR f4 の両仮数フ ィ ー ル ド に格納 さ れてい る単精度値ペア間の積が無限の精<br />

度で計算され、 次にそれぞれの積か ら FR f2 の仮数フ ィ ー ル ド 内の単精度値ペアがやは<br />

り無限の精度で減算される。 次に、 それぞれの結果の値が、 FPSR.sf.rc で指定される丸め<br />

モー ド を使用して単精度に丸められる。 丸められた結果のペアが FR f1 の仮数フ ィ ール<br />

ドに格納される。 FR f1 の指数フ ィ ール ド は 2.0 63 (0x1003E) のバイアス付き指数に設定さ<br />

れ、 FR f1 の符号フ ィ ール ド は正に対応する 0 に設定される。<br />

注 : FR f3 、 FR f4 、 FR f2 のどれか 1 つでも NaTVal である場合は、 FR f1 は計算結果では<br />

なく NaTVal に設定される。<br />

マッピング : fmps 命令の f2 が f0 の場合は、 単に IEEE の乗算が実行される。<br />

sf のニーモニ ッ ク値は 3:50 ページの表 2-23 に示している。<br />

ステータス ・ フ ィ ールドの rc のエンコ ーデ ィ ング と意味は、 第 1 巻、 第 1 部の表 5-5 に<br />

示している。<br />

操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1 );<br />

if (tmp_isrcode = fp_reg_disabled(f 1 , f 2 , f 3 , f 4 ))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

if (fp_is_natval(FR[f 2 ]) || fp_is_natval(FR[f 3 ]) ||<br />

fp_is_natval(FR[f 4])) {<br />

FR[f 1 ] = NATVAL;<br />

fp_update_psr(f 1 );<br />

} else {<br />

tmp_default_result_pair = fpms_fpnma_exception_fault_check(f 2 , f 3 ,<br />

f 4 , sf, &tmp_fp_env);<br />

if (fp_raise_fault(tmp_fp_env))<br />

fp_exception_fault(fp_decode_fault(tmp_fp_env));<br />

if (fp_is_nan_or_inf(tmp_default_result_pair.hi)) {<br />

tmp_res_hi = fp_single(tmp_default_result_pair.hi);<br />

} else {<br />

tmp_res = fp_mul(fp_reg_read_hi(f 3), fp_reg_read_hi(f 4));<br />

if (f 2 != 0) {<br />

tmp_sub = fp_reg_read_hi(f 2 );<br />

tmp_sub.sign = !tmp_sub.sign;<br />

tmp_res = fp_add(tmp_res, tmp_sub, tmp_fp_env);<br />

}<br />

tmp_res_hi = fp_ieee_round_sp(tmp_res, HIGH, &tmp_fp_env);<br />

}<br />

if (fp_is_nan_or_inf(tmp_default_result_pair.lo)) {<br />

tmp_res_lo = fp_single(tmp_default_result_pair.lo);<br />

} else {<br />

tmp_res = fp_mul(fp_reg_read_lo(f 3), fp_reg_read_lo(f 4));<br />

if (f 2 != 0) {<br />

tmp_sub = fp_reg_read_lo(f 2 );<br />

tmp_sub.sign = !tmp_sub.sign;<br />

tmp_res = fp_add(tmp_res, tmp_sub, tmp_fp_env);<br />

}<br />

tmp_res_lo = fp_ieee_round_sp(tmp_res, LOW, &tmp_fp_env);<br />

}<br />

第 3 巻 : 命令リファレンス 3:103


}<br />

}<br />

FR[f 1 ].significand = fp_concatenate(tmp_res_hi, tmp_res_lo);<br />

FR[f 1].exponent = FP_INTEGER_EXP;<br />

FR[f 1 ].sign = FP_SIGN_POSITIVE;<br />

fp_update_fpsr(sf, tmp_fp_env);<br />

fp_update_psr(f 1 );<br />

if (fp_raise_traps(tmp_fp_env))<br />

fp_exception_trap(fp_decode_trap(tmp_fp_env));<br />

FP 例外 : 無効操作 (Invalid Operation: V) アンダーフロー (Underflow: U)<br />

デノーマル/ アンノ ーマル ・ オペラン ド ) オーバーフロー (Overflow: O<br />

(Denormal/Unnormal Operand: D) 不正確結果 (Inexact: I)<br />

ソフ ト ウェア・アシスト ソフ ト ウェア・アシスト<br />

(Software Assist: SWA) フォルト (Software Assist: SWA) ト ラップ<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点例外フ ォ ル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト 浮動小数点例外 ト ラ ッ プ<br />

3:104 第 3 巻 : 命令リファレンス<br />

fpms


fpneg<br />

fpneg ─ 浮動小数点並列否定 (Floating-point Parallel Negate)<br />

書式 : (qp) fpnegf 1 = f 3 (qp) fpmerge.nsf 1 = f 3 , f 3 の擬似オペコ ー ド<br />

説明 : FR f3 の仮数フ ィ ー ル ド 内の単精度値のペアが否定 さ れ、 FR f1 の仮数フ ィ ール ド に格納<br />

される。 FR f1 の指数フ ィ ール ド は 2.063 (0x1003E) のバイアス付き指数に設定 さ れ、 FR f1 の符号フ ィ ール ド は正に対応する 0 に設定される。<br />

FR f3 が NaTVal である場合は、 FR f1 は計算結果ではな く NaTVal に設定される。<br />

操作 : 3:99 ページの 「fpmerge — 浮動小数点並列マ ー ジ (Floating-point Parallel Merge)」 を参照の<br />

こと。<br />

第 3 巻 : 命令リファレンス 3:105


fpnegabs ─ 浮動小数点並列絶対値否定<br />

(Floating-point Parallel Negate Absolute Value)<br />

書式 : (qp) fpnegabsf 1 = f 3 (qp) fpmerge.nsf 1 = f0, f 3 の擬似オペコ ー ド<br />

fpnegabs<br />

説明 : FR f3 の仮数フ ィ ー ル ド 内の単精度値ペアの絶対値が計算、 否定 さ れ、 次に FR f1 の仮数<br />

フィールドに格納される。 FR f1 の指数フ ィ ール ド は 2.063 (0x1003E) のバイアス付き指数<br />

に設定され、 FR f1 の符号フ ィ ール ド は正に対応する 0 に設定される。<br />

FR f3 が NaTVal である場合は、 FR f1 は計算結果ではな く NaTVal に設定される。<br />

操作 : 3:99 ページの 「fpmerge — 浮動小数点並列マ ー ジ (Floating-point Parallel Merge)」 を参照の<br />

こと。<br />

3:106 第 3 巻 : 命令リファレンス


fpnma<br />

fpnma ─ 浮動小数点並列積和否定<br />

(Floating-point Parallel Negative Multiply Add)<br />

書式 : (qp) fpnma.sf f 1 = f 3 , f 4 , f 2 F1<br />

説明 : FR f3 およびFR f4 の両仮数フ ィ ー ル ド に格納 さ れてい る単精度値ペア間の積が最大精度<br />

ま で計算され、 否定され、 次に FR f2 の仮数フ ィ ー ル ド 内の単精度値ペアが、 それぞれ<br />

の否定された積にやは り無限の精度で加算される。 その後、 加算結果のそれぞれの値が<br />

FPSR.sf.rc で指定される丸めモー ド を使用して単精度に丸められる。 丸められた結果のペ<br />

アが FR f1 の仮数フ ィ ール ド に格納される。 FR f1 の指数フ ィ ール ド は 2.063 (0x1003E) の<br />

バイアス付き指数に設定 さ れ、 FR f1 の符号フ ィ ール ド は正に対応する 0 に設定される。<br />

FR f3 、 FR f4 、 FR f2 のどれか 1 つでも NaTVal である場合は、 FR f1 は計算結果ではな く<br />

NaTVal に設定される。<br />

注 : fmnma 命令の f2 が f0 の場合は、 単に IEEE の乗算が実行 さ れる ( 積が否定された後<br />

に丸められる )。<br />

sf のニーモニ ッ ク値は 3:50 ページの表 2-23 に示している。<br />

ステータス ・ フ ィ ールドの rc のエンコ ーデ ィ ング と意味は、 第 1 巻、 第 1 部の表 5-5 に<br />

示している。<br />

操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1 );<br />

if (tmp_isrcode = fp_reg_disabled(f 1 , f 2 , f 3 , f 4 ))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

if (fp_is_natval(FR[f 2 ]) || fp_is_natval(FR[f 3 ]) ||<br />

fp_is_natval(FR[f 4])) {<br />

FR[f 1 ] = NATVAL;<br />

fp_update_psr(f 1 );<br />

} else {<br />

tmp_default_result_pair = fpms_fpnma_exception_fault_check(f 2 , f 3 ,<br />

f 4 , sf, &tmp_fp_env);<br />

if (fp_raise_fault(tmp_fp_env))<br />

fp_exception_fault(fp_decode_fault(tmp_fp_env));<br />

if (fp_is_nan_or_inf(tmp_default_result_pair.hi)) {<br />

tmp_res_hi = fp_single(tmp_default_result_pair.hi);<br />

} else {<br />

tmp_res = fp_mul(fp_reg_read_hi(f 3), fp_reg_read_hi(f 4));<br />

tmp_res.sign = !tmp_res.sign;<br />

if (f 2 != 0)<br />

tmp_res = fp_add(tmp_res, fp_reg_read_hi(f 2), tmp_fp_env);<br />

tmp_res_hi = fp_ieee_round_sp(tmp_res, HIGH, &tmp_fp_env);<br />

}<br />

if (fp_is_nan_or_inf(tmp_default_result_pair.lo)) {<br />

tmp_res_lo = fp_single(tmp_default_result_pair.lo);<br />

} else {<br />

tmp_res = fp_mul(fp_reg_read_lo(f 3 ), fp_reg_read_lo(f 4 ));<br />

tmp_res.sign = !tmp_res.sign;<br />

if (f 2 != 0)<br />

tmp_res = fp_add(tmp_res, fp_reg_read_lo(f 2 ), tmp_fp_env);<br />

tmp_res_lo = fp_ieee_round_sp(tmp_res, LOW, &tmp_fp_env);<br />

}<br />

FR[f 1 ].significand = fp_concatenate(tmp_res_hi, tmp_res_lo);<br />

FR[f 1].exponent = FP_INTEGER_EXP;<br />

第 3 巻 : 命令リファレンス 3:107


}<br />

}<br />

FR[f 1 ].sign = FP_SIGN_POSITIVE;<br />

fp_update_fpsr(sf, tmp_fp_env);<br />

fp_update_psr(f 1 );<br />

if (fp_raise_traps(tmp_fp_env))<br />

fp_exception_trap(fp_decode_trap(tmp_fp_env));<br />

FP 例外 : 無効操作 (Invalid Operation: V) アンダーフロー (Underflow: U)<br />

デノーマル/ アンノ ーマル ・ オペラン ド オーバーフロー (Overflow: O)<br />

(Denormal/Unnormal Operand: D) 不正確結果 js (Inexact: I)<br />

ソフ ト ウェア・アシスト ソフ ト ウェア・アシスト<br />

(Software Assist: SWA) フォルト (Software Assist: SWA) ト ラップ<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点例外フ ォ ル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト 浮動小数点例外 ト ラ ッ プ<br />

fpnma<br />

3:108 第 3 巻 : 命令リファレンス


fpnmpy<br />

fpnmpy ─ 浮動小数点並列乗算否定 (Floating-point Parallel Negative Multiply)<br />

書式 : (qp) fpnmpy.sf f 1 = f 3 , f 4 (qp) fpnma.sf f 1 = f 3 , f 4 ,f0 の擬似オペコ ー ド<br />

説明 : FR f3 およびFR f4 の両仮数フ ィ ー ル ド に格納 さ れてい る単精度値ペア間の積が最大精度<br />

ま で計算され、 次に否定される。 その後、 それぞれの結果の値が FPSR.sf.rc で指定され<br />

る丸めモ ー ド を使用して単精度に丸め ら れる。 丸め ら れた結果のペアが FR f1 の仮数<br />

フィールドに格納される。 FR f1 の指数フ ィ ール ド は 2.0 63 (0x1003E) のバイアス付き指数<br />

に設定され、 FR f1 の符号フ ィ ール ド は正に対応する 0 に設定される。<br />

FR f3 か FR f4 が NaTVal である場合は、 FR f1 は計算結果ではな く NaTVal に設定される。<br />

sf のニーモニ ッ ク値は 3:50 ページの表 2-23 に示している。<br />

ステータス ・ フ ィ ールドの rc のエンコ ーデ ィ ング と意味は、 第 1 巻、 第 1 部の表 5-5 に<br />

示している。<br />

操作 : 3:107 ページの 「fpnma — 浮動小数点並列積和否定 (Floating-point Parallel Negative<br />

Multiply Add)」 を参照のこ と。<br />

第 3 巻 : 命令リファレンス 3:109


fprcpa ─ 浮動小数点並列逆数近似<br />

(Floating-point Parallel Reciprocal Approximation)<br />

fprcpa<br />

書式 : (qp) fprcpa.sf f 1 ,p 2 = f 2 , f 3 F6<br />

説明 : PR qp が 0 の場合、 RP p2 がク リアされる。 FR f1 はそのま ま変わらない。<br />

PR qp が 1 の場合、 以下が行われる。<br />

• FR f1 の仮数の上下各半分が、 FR f3 の対応する半分の逆数の近似値 ( 相対誤差<br />


fprcpa<br />

} else if (fp_is_zero(num) && fp_is_finite(den)) {<br />

tmp_res = FP_ZERO;<br />

tmp_res.sign = num.sign ^ den.sign;<br />

tmp_pred_hi = 0;<br />

} else {<br />

tmp_res = fp_ieee_recip(den);<br />

if (limits_check.hi_fr2_or_quot)<br />

tmp_pred_hi = 0;<br />

else<br />

tmp_pred_hi = 1;<br />

}<br />

tmp_res_hi = fp_single(tmp_res);<br />

}<br />

if (fp_is_nan_or_inf(tmp_default_result_pair.lo) ||<br />

limits_check.lo_fr3) {<br />

tmp_res_lo = fp_single(tmp_default_result_pair.lo);<br />

tmp_pred_lo = 0;<br />

} else {<br />

num = fp_normalize(fp_reg_read_lo(f2 ));<br />

den = fp_normalize(fp_reg_read_lo(f3 ));<br />

if (fp_is_inf(num) && fp_is_finite(den)) {<br />

tmp_res = FP_INFINITY;<br />

tmp_res.sign = num.sign ^ den.sign;<br />

tmp_pred_lo = 0;<br />

} else if (fp_is_finite(num) && fp_is_inf(den)) {<br />

tmp_res = FP_ZERO;<br />

tmp_res.sign = num.sign ^ den.sign;<br />

tmp_pred_lo = 0;<br />

} else if (fp_is_zero(num) && fp_is_finite(den)) {<br />

tmp_res = FP_ZERO;<br />

tmp_res.sign = num.sign ^ den.sign;<br />

tmp_pred_lo = 0;<br />

} else {<br />

tmp_res = fp_ieee_recip(den);<br />

if (limits_check.lo_fr2_or_quot)<br />

tmp_pred_lo = 0;<br />

else<br />

tmp_pred_lo = 1;<br />

}<br />

tmp_res_lo = fp_single(tmp_res);<br />

}<br />

FR[f 1].significand = fp_concatenate(tmp_res_hi, tmp_res_lo);<br />

FR[f 1 ].exponent = FP_INTEGER_EXP;<br />

FR[f 1 ].sign = FP_SIGN_POSITIVE;<br />

PR[p 2] = tmp_pred_hi && tmp_pred_lo;<br />

fp_update_fpsr(sf, tmp_fp_env);<br />

}<br />

fp_update_psr(f1 );<br />

} else {<br />

PR[p2] = 0;<br />

}<br />

FP 例外 : 無効操作 (Invalid Operation: V)<br />

ゼロ除算 (Zero Divide: Z)<br />

デノーマル/ アンノ ーマル ・ オペラン ド (Denormal/Unnormal Operand: D)<br />

ソフ ト ウェア・アシスト (Software Assist: SWA) フォルト<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点例外フ ォ ル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト<br />

第 3 巻 : 命令リファレンス 3:111


fprsqrta ─ 浮動小数点並列平方根逆数近似<br />

(Floating-point Parallel Reciprocal Square Root Approximation)<br />

fprsqrta<br />

書式 : (qp) fprsqrta.sf f 1 ,p 2 = f 3 F7<br />

説明 : PR qp が 0 の場合、 RP p2 がク リアされる。 FR f1 はそのま ま変わらない。<br />

PR qp が 1 の場合、 以下が行われる。<br />

• FR f1 の仮数の上下各半分が、 FR f3 の対応す る半分の平方根の逆数の近似値 ( 相対誤<br />


fprsqrta<br />

}<br />

tmp_pred_hi = 0;<br />

else<br />

tmp_pred_hi = 1;<br />

}<br />

tmp_res_hi = fp_single(tmp_res);<br />

if (fp_is_nan(tmp_default_result_pair.lo)) {<br />

tmp_res_lo = fp_single(tmp_default_result_pair.lo);<br />

tmp_pred_lo = 0;<br />

} else {<br />

tmp_fr3 = fp_normalize(fp_reg_read_lo(f 3 ));<br />

if (fp_is_zero(tmp_fr3)) {<br />

tmp_res = FP_INFINITY;<br />

tmp_res.sign = tmp_fr3.sign;<br />

tmp_pred_lo = 0;<br />

} else if (fp_is_pos_inf(tmp_fr3)) {<br />

tmp_res = FP_ZERO;<br />

tmp_pred_lo = 0;<br />

} else {<br />

tmp_res = fp_ieee_recip_sqrt(tmp_fr3);<br />

if (limits_check.lo)<br />

tmp_pred_lo = 0;<br />

else<br />

tmp_pred_lo = 1;<br />

}<br />

tmp_res_lo = fp_single(tmp_res);<br />

}<br />

FR[f 1 ].significand = fp_concatenate(tmp_res_hi, tmp_res_lo);<br />

FR[f 1 ].exponent = FP_INTEGER_EXP;<br />

FR[f 1 ].sign = FP_SIGN_POSITIVE;<br />

PR[p 2 ] = tmp_pred_hi && tmp_pred_lo;<br />

fp_update_fpsr(sf, tmp_fp_env);<br />

}<br />

fp_update_psr(f1); } else {<br />

PR[p2 ] = 0;<br />

}<br />

FP 例外 : 無効操作 (Invalid Operation: V)<br />

デノーマル/ アンノ ーマル ・ オペラン ド (Denormal/Unnormal Operand: D)<br />

ソフ ト ウェア・アシスト (Software Assist: SWA) フォルト<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点例外フ ォ ル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト<br />

第 3 巻 : 命令リファレンス 3:113


frcpa ─ 浮動小数点逆数近似 (Floating-point Reciprocal Approximation)<br />

書式 : (qp) frcpa.sf f 1 , p 2 = f 2 , f 3 F6<br />

説明 : PR qp が 0 の場合、 RP p2 がク リアされる。 FR f1 はそのま ま変わらない。<br />

PR qp が 1 の場合、 以下が行われる。<br />

• FR f1 が、 FR f3 の逆数の近似値 ( 相対誤差


frcpa<br />

}<br />

fp_update_fpsr(sf, tmp_fp_env);<br />

}<br />

fp_update_psr(f1 );<br />

} else {<br />

PR[p2 ] = 0;<br />

}<br />

// fp_ieee_recip()<br />

fp_ieee_recip(den)<br />

{<br />

RECIP_TABLE[256] = {<br />

0x3fc, 0x3f4, 0x3ec, 0x3e4, 0x3dd, 0x3d5, 0x3cd, 0x3c6,<br />

0x3be, 0x3b7, 0x3af, 0x3a8, 0x3a1, 0x399, 0x392, 0x38b,<br />

0x384, 0x37d, 0x376, 0x36f, 0x368, 0x361, 0x35b, 0x354,<br />

0x34d, 0x346, 0x340, 0x339, 0x333, 0x32c, 0x326, 0x320,<br />

0x319, 0x313, 0x30d, 0x307, 0x300, 0x2fa, 0x2f4, 0x2ee,<br />

0x2e8, 0x2e2, 0x2dc, 0x2d7, 0x2d1, 0x2cb, 0x2c5, 0x2bf,<br />

0x2ba, 0x2b4, 0x2af, 0x2a9, 0x2a3, 0x29e, 0x299, 0x293,<br />

0x28e, 0x288, 0x283, 0x27e, 0x279, 0x273, 0x26e, 0x269,<br />

0x264, 0x25f, 0x25a, 0x255, 0x250, 0x24b, 0x246, 0x241,<br />

0x23c, 0x237, 0x232, 0x22e, 0x229, 0x224, 0x21f, 0x21b,<br />

0x216, 0x211, 0x20d, 0x208, 0x204, 0x1ff, 0x1fb, 0x1f6,<br />

0x1f2, 0x1ed, 0x1e9, 0x1e5, 0x1e0, 0x1dc, 0x1d8, 0x1d4,<br />

0x1cf, 0x1cb, 0x1c7, 0x1c3, 0x1bf, 0x1bb, 0x1b6, 0x1b2,<br />

0x1ae, 0x1aa, 0x1a6, 0x1a2, 0x19e, 0x19a, 0x197, 0x193,<br />

0x18f, 0x18b, 0x187, 0x183, 0x17f, 0x17c, 0x178, 0x174,<br />

0x171, 0x16d, 0x169, 0x166, 0x162, 0x15e, 0x15b, 0x157,<br />

0x154, 0x150, 0x14d, 0x149, 0x146, 0x142, 0x13f, 0x13b,<br />

0x138, 0x134, 0x131, 0x12e, 0x12a, 0x127, 0x124, 0x120,<br />

0x11d, 0x11a, 0x117, 0x113, 0x110, 0x10d, 0x10a, 0x107,<br />

0x103, 0x100, 0x0fd, 0x0fa, 0x0f7, 0x0f4, 0x0f1, 0x0ee,<br />

0x0eb, 0x0e8, 0x0e5, 0x0e2, 0x0df, 0x0dc, 0x0d9, 0x0d6,<br />

0x0d3, 0x0d0, 0x0cd, 0x0ca, 0x0c8, 0x0c5, 0x0c2, 0x0bf,<br />

0x0bc, 0x0b9, 0x0b7, 0x0b4, 0x0b1, 0x0ae, 0x0ac, 0x0a9,<br />

0x0a6, 0x0a4, 0x0a1, 0x09e, 0x09c, 0x099, 0x096, 0x094,<br />

0x091, 0x08e, 0x08c, 0x089, 0x087, 0x084, 0x082, 0x07f,<br />

0x07c, 0x07a, 0x077, 0x075, 0x073, 0x070, 0x06e, 0x06b,<br />

0x069, 0x066, 0x064, 0x061, 0x05f, 0x05d, 0x05a, 0x058,<br />

0x056, 0x053, 0x051, 0x04f, 0x04c, 0x04a, 0x048, 0x045,<br />

0x043, 0x041, 0x03f, 0x03c, 0x03a, 0x038, 0x036, 0x033,<br />

0x031, 0x02f, 0x02d, 0x02b, 0x029, 0x026, 0x024, 0x022,<br />

0x020, 0x01e, 0x01c, 0x01a, 0x018, 0x015, 0x013, 0x011,<br />

0x00f, 0x00d, 0x00b, 0x009, 0x007, 0x005, 0x003, 0x001,<br />

};<br />

}<br />

tmp_index = den.significand{62:55};<br />

tmp_res.significand = (1


frsqrta ─ 浮動小数点平方根逆数近似<br />

(Floating-point Reciprocal Square Root Approximation)<br />

frsqrta<br />

書式 : (qp) frsqrta.sf f 1 , p 2 = f 3 F7<br />

説明 : PR qp が 0 の場合、 RP p2 がク リアされる。 FR f1 はそのま ま変わらない。<br />

PR qp が 1 の場合、 以下が行われる。<br />

• FR f1 が、 FR f3 の平方根の逆数の近似値 ( 相対誤差


frsqrta<br />

}<br />

PR[p 2 ] = 0;<br />

// fp_ieee_recip_sqrt()<br />

fp_ieee_recip_sqrt(root)<br />

{<br />

RECIP_SQRT_TABLE[256] = {<br />

0x1a5, 0x1a0, 0x19a, 0x195, 0x18f, 0x18a, 0x185, 0x180,<br />

0x17a, 0x175, 0x170, 0x16b, 0x166, 0x161, 0x15d, 0x158,<br />

0x153, 0x14e, 0x14a, 0x145, 0x140, 0x13c, 0x138, 0x133,<br />

0x12f, 0x12a, 0x126, 0x122, 0x11e, 0x11a, 0x115, 0x111,<br />

0x10d, 0x109, 0x105, 0x101, 0x0fd, 0x0fa, 0x0f6, 0x0f2,<br />

0x0ee, 0x0ea, 0x0e7, 0x0e3, 0x0df, 0x0dc, 0x0d8, 0x0d5,<br />

0x0d1, 0x0ce, 0x0ca, 0x0c7, 0x0c3, 0x0c0, 0x0bd, 0x0b9,<br />

0x0b6, 0x0b3, 0x0b0, 0x0ad, 0x0a9, 0x0a6, 0x0a3, 0x0a0,<br />

0x09d, 0x09a, 0x097, 0x094, 0x091, 0x08e, 0x08b, 0x088,<br />

0x085, 0x082, 0x07f, 0x07d, 0x07a, 0x077, 0x074, 0x071,<br />

0x06f, 0x06c, 0x069, 0x067, 0x064, 0x061, 0x05f, 0x05c,<br />

0x05a, 0x057, 0x054, 0x052, 0x04f, 0x04d, 0x04a, 0x048,<br />

0x045, 0x043, 0x041, 0x03e, 0x03c, 0x03a, 0x037, 0x035,<br />

0x033, 0x030, 0x02e, 0x02c, 0x029, 0x027, 0x025, 0x023,<br />

0x020, 0x01e, 0x01c, 0x01a, 0x018, 0x016, 0x014, 0x011,<br />

0x00f, 0x00d, 0x00b, 0x009, 0x007, 0x005, 0x003, 0x001,<br />

0x3fc, 0x3f4, 0x3ec, 0x3e5, 0x3dd, 0x3d5, 0x3ce, 0x3c7,<br />

0x3bf, 0x3b8, 0x3b1, 0x3aa, 0x3a3, 0x39c, 0x395, 0x38e,<br />

0x388, 0x381, 0x37a, 0x374, 0x36d, 0x367, 0x361, 0x35a,<br />

0x354, 0x34e, 0x348, 0x342, 0x33c, 0x336, 0x330, 0x32b,<br />

0x325, 0x31f, 0x31a, 0x314, 0x30f, 0x309, 0x304, 0x2fe,<br />

0x2f9, 0x2f4, 0x2ee, 0x2e9, 0x2e4, 0x2df, 0x2da, 0x2d5,<br />

0x2d0, 0x2cb, 0x2c6, 0x2c1, 0x2bd, 0x2b8, 0x2b3, 0x2ae,<br />

0x2aa, 0x2a5, 0x2a1, 0x29c, 0x298, 0x293, 0x28f, 0x28a,<br />

0x286, 0x282, 0x27d, 0x279, 0x275, 0x271, 0x26d, 0x268,<br />

0x264, 0x260, 0x25c, 0x258, 0x254, 0x250, 0x24c, 0x249,<br />

0x245, 0x241, 0x23d, 0x239, 0x235, 0x232, 0x22e, 0x22a,<br />

0x227, 0x223, 0x220, 0x21c, 0x218, 0x215, 0x211, 0x20e,<br />

0x20a, 0x207, 0x204, 0x200, 0x1fd, 0x1f9, 0x1f6, 0x1f3,<br />

0x1f0, 0x1ec, 0x1e9, 0x1e6, 0x1e3, 0x1df, 0x1dc, 0x1d9,<br />

0x1d6, 0x1d3, 0x1d0, 0x1cd, 0x1ca, 0x1c7, 0x1c4, 0x1c1,<br />

0x1be, 0x1bb, 0x1b8, 0x1b5, 0x1b2, 0x1af, 0x1ac, 0x1aa,<br />

};<br />

}<br />

tmp_index = (root.exponent{0}


fselect ─ 浮動小数点選択 (Floating-point Select)<br />

fselect<br />

書式 : (qp) fselect f 1 = f 3 , f 4 , f 2 F3<br />

説明 : FR f3 の仮数フ ィ ール ド と FR f2 の仮数フ ィ ー ル ド と の論理積が取 ら れ、 FR f4 の仮数<br />

フィールドと FR f2 の仮数フ ィ ール ド の "1" の補数 と の論理積が取 ら れる。 次に、 2 つの<br />

結果間の論理和が取 ら れ、 その結果が FR f1 の仮数フ ィ ール ド に格納される。<br />

FR f1 の指数フ ィ ール ド は 2.063 (0x1003E) のバイアス付き指数に設定 さ れ、 FR f1 の符号<br />

フィールドは正に対応する0 に設定される。<br />

FR f3 、 FR f4 、 FR f2 のどれか 1 つでも NaTVal である場合は、 FR f1 は計算結果ではな く<br />

NaTVal に設定される。<br />

操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1);<br />

if (tmp_isrcode = fp_reg_disabled(f 1 , f 2 , f 3 , f 4 ))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

}<br />

FP 例外 : なし。<br />

if (fp_is_natval(FR[f 2 ]) || fp_is_natval(FR[f 3 ]) ||<br />

fp_is_natval(FR[f 4 ])) {<br />

FR[f 1 ] = NATVAL;<br />

} else {<br />

FR[f 1 ].significand = (FR[f 3 ].significand & FR[f 2 ].significand)<br />

| (FR[f 4 ].significand & ~FR[f 2 ].significand);<br />

FR[f 1 ].exponent = FP_INTEGER_EXP;<br />

FR[f 1 ].sign = FP_SIGN_POSITIVE;<br />

}<br />

fp_update_psr(f 1 );<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点レ ジ ス タ無効フ ォ ル ト<br />

3:118 第 3 巻 : 命令リファレンス


fsetc<br />

fsetc ─ 浮動小数点コントロール設定 (Floating-point Set Controls)<br />

書式 : (qp) fsetc.sf amask 7 , omask 7 F12<br />

説明 : sf0.controls と amask7 即値フィ ールドの論理積を取り、 その結果と omask7 即値フ ィ ー ル<br />

ド と の論理和を取 っ て得 ら れる値にス テ ー タ ス ・ フ ィ ー ル ド の コ ン ト ロ ー ル ・ ビ ッ ト が<br />

初期化 さ れる。<br />

sf のニーモニ ッ ク値は 3:50 ページの表 2-23 に示している。<br />

操作 : if (PR[qp]) {<br />

tmp_controls = (AR[FPSR].sf0.controls & amask 7 ) | omask 7 ;<br />

if (is_reserved_field(FSETC, sf, tmp_controls))<br />

reserved_register_field_fault();<br />

fp_set_sf_controls(sf, tmp_controls);<br />

}<br />

FP 例外 : なし。<br />

割り込み : 予約レ ジ ス タ / フィールド ・フォルト<br />

第 3 巻 : 命令リファレンス 3:119


fsub ─ 浮動小数点減算 (Floating-point Subtract)<br />

書式 : (qp) fsub.pc.sf f 1 = f 3 , f 2 (qp) fms.pc.sf f 1 = f 3 , f1, f 2 の擬似オペコ ー ド<br />

説明 : FR f3 から FR f2 が減算され ( 無限の精度で計算される )、 FPSR.sf.rc で指定される丸め<br />

モー ド と pc ( さらにFPSR.sf.pc および FPSR.sf.wre) で指定される精度にしたが って丸め<br />

られ、 その結果が FR f1 に格納される。<br />

FR f3 か FR f2 が NaTVal である場合は、 FR f1 は計算結果ではな く NaTVal に設定される。<br />

オペコ ー ド の pc のニーモニ ッ ク値は 3:50 ページの表 2-22 に示している。 sf のニーモ<br />

ニック値は3:50 ページの表 2-23 に示している。 ステータス ・ フ ィ ール ド の pc、 wre、 お<br />

よび rc のエン コ ー デ ィ ン グ と 意味については第 1 巻、 第 1 部の表 5-5 および第 1 巻、 第<br />

1 部の表 5-6 を参照のこ と。<br />

操作 : 3:78 ページの 「fms — 浮動小数点積差 (Floating-point Multiply Subtract)」 を参照のこ と。<br />

3:120 第 3 巻 : 命令リファレンス<br />

fsub


fswap<br />

fswap ─ 浮動小数点スワップ (Floating-point Swap)<br />

書式 : (qp) fswapf 1 = f 2 , f 3 swap_form F9<br />

(qp) fswap.nlf 1 = f 2 , f 3 swap_nl_form F9<br />

(qp) fswap.nrf 1 = f 2 , f 3 swap_nr_form F9<br />

説明 : swap_form では、 FR f2 内の左側の単精度値が FR f3 内の右側の単精度値 と 連結 さ れる。<br />

次に、 連結されたペアがスワ ッ プする。<br />

swap_nl_form では、 FR f2 内の左側の単精度値が FR f3 内の右側の単精度値 と 連結される。<br />

次に、 連結されたペアがスワップし、 左側の単精度値が否定される。<br />

swap_nr_form では、 FR f2 内の左側の単精度値が FR f3 内の右側の単精度値 と 連結 さ れる。<br />

次に、 連結されたペアがスワップし、 右側の単精度値が否定される。<br />

すべての形式で、 FR f1 の指数フ ィ ール ド は 2.063 (0x1003E) のバイアス付き指数に設定さ<br />

れ、 FR f1 の符号フ ィ ール ド は正に対応する 0 に設定される。<br />

すべての形式で、 FR f2 か FR f3 が NaTVal である場合は、 FR f1 は計算結果ではな く<br />

NaTVal に設定される。<br />

図 2-18. 浮動小数点スワップ<br />

FR f 2<br />

81 80 64 63 32 31<br />

0 81 80 64 63 32 31<br />

0<br />

FR f 1<br />

図 2-19. 浮動小数点スワップの左否定<br />

FR f 2<br />

図 2-20. 浮動小数点スワップの右否定<br />

FR f 2<br />

81 80 64 63 32 31<br />

0<br />

0 1003E<br />

第 3 巻 : 命令リファレンス 3:121<br />

FR f 3<br />

81 80 64 63 32 31<br />

0 81 80 64 63 32 31 30 0<br />

FR f 1<br />

FR f 3<br />

否定された符号ビット<br />

81 80 64 63 62 32 31<br />

0<br />

0 1003E<br />

81 80 64 63<br />

62 32 31<br />

0 81 80 64 63 32 31<br />

0<br />

FR f 3<br />

否定された符号ビット<br />

81 80 64 63 32 31 30 0<br />

FR f 1<br />

0 1003E


操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1);<br />

if (tmp_isrcode = fp_reg_disabled(f 1 , f 2 , f 3 , 0))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

}<br />

if (fp_is_natval(FR[f 2 ]) || fp_is_natval(FR[f 3 ])) {<br />

FR[f 1 ] = NATVAL;<br />

} else {<br />

if (swap_form) {<br />

tmp_res_hi = FR[f 3 ].significand{31:0};<br />

tmp_res_lo = FR[f 2 ].significand{63:32};<br />

} else if (swap_nl_form) {<br />

tmp_res_hi = (!FR[f 3 ].significand{31}


fsxt<br />

fsxt ─ 浮動小数点符号拡張 (Floating-point Sign Extend)<br />

書式 : (qp) fsxt.lf 1 = f 2 , f 3 sxt_l_form F9<br />

(qp) fsxt.rf 1 = f 2 , f 3 sxt_r_form F9<br />

説明 : sxt_l_form (sxt_r_form) では、 FR f2 内の左 ( 右 ) 側の単精度値の符号が 32 ビッ トに拡張さ<br />

れ、 FR f3 内の左 ( 右 ) 側の単精度値 と 連結 さ れる。<br />

すべての形式で、 FR f1 の指数フ ィ ール ド は 2.0 63 (0x1003E) のバイアス付き指数に設定さ<br />

れ、 FR f1 の符号フ ィ ール ド は正に対応する 0 に設定される。<br />

すべての形式で、 FR f2 か FR f3 が NaTVal である場合は、 FR f1 は計算結果ではな く<br />

NaTVal に設定される。<br />

図 2-21. 浮動小数点左符号拡張<br />

図 2-22. 浮動小数点右符号拡張<br />

操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1);<br />

if (tmp_isrcode = fp_reg_disabled(f 1 , f 2 , f 3 , 0))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

}<br />

if (fp_is_natval(FR[f 2 ]) || fp_is_natval(FR[f 3 ])) {<br />

FR[f 1 ] = NATVAL;<br />

} else {<br />

if (sxt_l_form) {<br />

tmp_res_hi = (FR[f 2 ].significand{63} ? 0xFFFFFFFF : 0x00000000);<br />

tmp_res_lo = FR[f 3].significand{63:32};<br />

} else { // sxt_r_form<br />

tmp_res_hi = (FR[f 2 ].significand{31} ? 0xFFFFFFFF : 0x00000000);<br />

tmp_res_lo = FR[f 3].significand{31:0};<br />

}<br />

}<br />

FP 例外 : なし。<br />

FR f 2<br />

FR f 2<br />

81 80 64 63 62 32 31 0 81 80 64 63 32 31<br />

0<br />

拡張<br />

FR[f 1].significand = fp_concatenate(tmp_res_hi, tmp_res_lo);<br />

FR[f 1 ].exponent = FP_INTEGER_EXP;<br />

FR[f 1 ].sign = FP_SIGN_POSITIVE;<br />

fp_update_psr(f 1 );<br />

FR f 1<br />

81 80 64 63 32 31<br />

0<br />

0 1003E<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点レ ジ ス タ無効フ ォ ル ト<br />

第 3 巻 : 命令リファレンス 3:123<br />

FR f 3<br />

81 80 64 63 32 31 30<br />

0 81 80 64 63 32 31<br />

0<br />

FR f 1<br />

FR f 3<br />

拡張<br />

81 80 64 63 32 31<br />

0<br />

0 1003E


fwb ─ ライト・バッファのフラッシュ (Flush Write Buffer)<br />

書式 : (qp) fwb M24<br />

説明 : この命令は、 ライ ト ・バッファまたはコーレシング・バッファ内に保持されている未処<br />

理のストアをすべてフラッシュするよ うに、 プロセッサに指示する。 この命令はヒント であるため、 プロセッサは、 実際に未処理のストアをフラ ッシュする こ と も、 実際には<br />

操作を実行しないこ と も でき る。 プロセ ッサは、 以前のス ト アのフ ラ ッ シュの完了を通<br />

知しない。 fwb 命令は、 先行するス ト ア よ り前に後続のス ト アをフ ラ ッ シ ュ する場合が<br />

あ る ため、 ス ト アの順序付け を保証しない。<br />

以前に コ ー レ シ ン グ さ れたス ト アが、 最近のス ト ア よ り 前に検出す る に は、 ソ フ ト ウ ェ<br />

アは、 各ス ト アの間に リ リ ース操作を発行しなければならない ( リリース操作の一覧に<br />

ついては、 第 2 巻、 第 1 部の表 4-14 を参照 )。<br />

この命令を使用して、 ライ ト ・バッファまたはコーレシング ・バッファ内に保持されて<br />

い る ス ト アが長時間滞留しない よ う に した り 、 高い優先順位を持つス ト アをプ ロ セ ッ サ<br />

から排出できる。<br />

操作 : if (PR[qp]) {<br />

mem_flush_pending_stores();<br />

}<br />

割り込み : なし<br />

3:124 第 3 巻 : 命令リファレンス<br />

fwb


fxor<br />

fxor ─ 浮動小数点排他的論理和 (Floating-point Exclusive Or)<br />

書式 : (qp) fxorf 1 = f 2 , f 3 F9<br />

説明 : FR f2 およびFR f3 の両仮数フ ィ ー ル ド 間の ビ ッ ト 単位の排他的論理和が計算 さ れる。 結<br />

果の値は FR f1 の仮数フ ィ ールド に格納される。 FR f1 の指数フ ィ ール ド は 2.063 (0x1003E) のバイアス付き指数に設定され、 FR f1 の符号フ ィ ール ド は正に対応する 0 に<br />

設定 さ れる。<br />

FR f2 か FR f3 が NaTVal である場合は、 FR f1 は計算結果ではな く NaTVal に設定される。<br />

操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1 );<br />

if (tmp_isrcode = fp_reg_disabled(f 1 , f 2 , f 3 , 0))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

}<br />

FP 例外 : なし。<br />

if (fp_is_natval(FR[f 2 ]) || fp_is_natval(FR[f 3 ])) {<br />

FR[f 1] = NATVAL;<br />

} else {<br />

FR[f 1 ].significand = FR[f 2 ].significand ^ FR[f 3 ].significand;<br />

FR[f 1].exponent = FP_INTEGER_EXP;<br />

FR[f 1 ].sign = FP_SIGN_POSITIVE;<br />

}<br />

fp_update_psr(f 1 );<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点レ ジ ス タ無効フ ォ ル ト<br />

第 3 巻 : 命令リファレンス 3:125


getf ─ 浮動小数点値、指数、仮数の取得<br />

(Get Floating-point Value or Exponent or Significand)<br />

書式 : (qp) getf.sr 1 = f 2 single_form M19<br />

(qp) getf.dr 1 = f 2 double_form M19<br />

(qp) getf.exp r 1 = f 2 exponent_form M19<br />

(qp) getf.sigr 1 = f 2 significand_form M19<br />

説明 : single_form および double_form では、 第 1 巻、 第 1 部の図 5-4 と 第 1 巻、 第 1 部の図 5-5<br />

にそれぞれ示 さ れる よ う に、 FR f2 の値が単精度 (single_form) ま たは倍精度 (double_form)<br />

メ モ リ 表現に変換 さ れ、 GR r1 に格納される。 single_form では、 GR r1 の最上位の 32<br />

ビッ トが0 に設定される。<br />

exponent_form では、 FR f2 の指数フ ィ ール ド が GR r1 のビッ ト 16:0 にコピーされ、 FR f2 の値の符号ビ ッ ト が GR r1 のビッ ト 17 にコピーされる。 GR r1 の最上位の 46 ビットが0<br />

に設定される。<br />

図 2-23. getf.exp の機能<br />

significand_form では、 FR f 2 の値の仮数フ ィ ール ド が GR r 1 にコピーされる。<br />

図 2-24. getf.sig の機能<br />

FR f 2<br />

GR r 1<br />

FR f 2<br />

GR r 1<br />

s 指数<br />

仮数<br />

すべての形式について、 FR f 2 が NaTVal である場合は、 GR r 1 に対応する NaT ビッ トが1<br />

に設定される。<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1 );<br />

if (tmp_isrcode = fp_reg_disabled(f 2 , 0, 0, 0))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

s<br />

63<br />

指数<br />

63<br />

if (single_form) {<br />

GR[r 1]{31:0} = fp_fr_to_mem_format(FR[f 2], 4, 0);<br />

GR[r 1 ]{63:32} = 0;<br />

} else if (double_form) {<br />

GR[r 1] = fp_fr_to_mem_format(FR[f 2], 8, 0);<br />

} else if (exponent_form) {<br />

GR[r 1 ]{63:18} = 0;<br />

GR[r 1]{16:0} = FR[f 2].exponent;<br />

GR[r 1 ]{17} = FR[f 2 ].sign;<br />

} else // significand_form<br />

3:126 第 3 巻 : 命令リファレンス<br />

0<br />

46<br />

64<br />

18<br />

1<br />

仮数<br />

16<br />

17<br />

0<br />

0<br />

getf


getf<br />

}<br />

GR[r 1 ] = FR[f 2 ].significand;<br />

if (fp_is_natval(FR[f 2]))<br />

GR[r 1 ].nat = 1;<br />

else<br />

GR[r 1].nat = 0;<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点レ ジ ス タ無効フ ォ ル ト<br />

第 3 巻 : 命令リファレンス 3:127


hint ─ パフォーマンス・ヒント (Performance Hint)<br />

書式 : (qp) hintimm 21 疑似オペ コ ー ド<br />

(qp) hint.i imm 21 i_unit_form I18<br />

(qp) hint.b imm 21 b_unit_form B9<br />

(qp) hint.m imm 21 m_unit_form M48<br />

(qp) hint.f imm 21 f_unit_form F16<br />

(qp) hint.x imm 62 x_unit_form X5<br />

説明 : 実行中のプ ロ グ ラ ム に関す る パ フ ォ ー マンス ・ ヒ ン ト をプ ロ セ ッ サに提供する。 こ の命<br />

令は、 パ フ ォ ー マン ス上の効果以外は nop 命令 と して動作す る ため、 アー キテ ク チ ャ上<br />

のマシン状態に影響を与えない。<br />

即値 imm21 または imm62 は、 ヒ ン ト を指定す る。 x_unit_form の場合、 バン ド ルの L ス<br />

ロッ トには、 imm62 の上位 41 ビッ トが含まれる。<br />

この命令には 5 つの形式があ る が、 これ ら の形式は それぞれ特定の実行ユニ ッ ト ・ タ イ<br />

プに対してしか実行で き ない。 実行する ユニ ッ ト ・ タ イ プが重要でない場合は、 擬似オ<br />

ペコー ドを使用できる。<br />

表 2-31. ヒントの即値<br />

操作 : if (PR[qp]) {<br />

if (x_unit_form)<br />

hint = imm 62 ;<br />

else // i_unit_form || b_unit_form || m_unit_form || f_unit_form<br />

hint = imm 21;<br />

}<br />

割り込み : なし<br />

imm 21 または<br />

imm 62<br />

ニーモ<br />

ニック<br />

if (is_supported_hint(hint))<br />

execute_hint(hint);<br />

ヒント<br />

0x0 @pause 現在実行中のストリームが優先度の低いタスクを待機、スピン、または実行<br />

していることをプロセッサに知らせる。このヒントをプロセッサで使用する<br />

と、同じプロセッサ上で実行中の別のストリームに対して、より多くのリ<br />

ソースや時間を割り当てることができる。<br />

0x01-0x3f これらの値は、将来のアーキテクチャ拡張で使用可能であり、現在のプロ<br />

セッサ上では nop として実行される。これらの値を使用すると、将来のプロ<br />

セッサ上で予期せぬパフォーマンスの問題が発生する可能性があるので、使<br />

用すべきではない。<br />

その他 プロセッサ固有。プロセッサ固有のヒント・アクションを実行する。詳細に<br />

ついては、各プロセッサの資料を参照のこと。<br />

3:128 第 3 巻 : 命令リファレンス<br />

hint


invala<br />

invala ─ ALAT の無効化 (Invalidate ALAT)<br />

書式 : (qp) invala complete_form M24<br />

(qp) invala.e r 1 gr_form, entry_form M26<br />

(qp) invala.e f 1 fr_form, entry_form M27<br />

説明 : ALAT 内の選択 さ れた単一 ま たは複数のエン ト リ が無効に さ れる。<br />

complete_form では、 ALAT のすべてのエン ト リ が無効に される。 entry_form では、 汎用<br />

レ ジ ス タ指定子 r1 (gr_form の場合 )、 あるいは浮動小数点レ ジ ス タ指定子 f1 (fr_form の場<br />

合 ) を使用して ALAT が照会 さ れ、 いずれかの ALAT エン ト リ が一致した場合に、 その<br />

エン ト リ が無効にされる。<br />

操作 : if (PR[qp]) {<br />

if (complete_form)<br />

alat_inval();<br />

else { // entry_form<br />

if (gr_form)<br />

alat_inval_single_entry(GENERAL, r 1);<br />

else // fr_form<br />

alat_inval_single_entry(FLOAT, f 1 );<br />

}<br />

}<br />

割り込み : なし<br />

第 3 巻 : 命令リファレンス 3:129


itc ─ トランスレーション・キャッシュの挿入 (Insert Translation Cache)<br />

書式 : (qp) itc.i r 2 instruction_form M41<br />

(qp) itc.d r 2 data_form M41<br />

説明 : こ の命令は、 命令 ま たはデ ー タ の ト ラ ン ス レ ー シ ョ ン ・ キ ャ ッ シ ュ にエン ト リ を挿入す<br />

る。 GR r2 は、 変換エン ト リ の物理ア ド レ ス部を指定する。 ITIR は、 保護キー、 ページ ・<br />

サ イ ズ、 追加情報を指定す る。 仮想ア ド レ ス は IFA レジスタで指定され、 リージョン ・<br />

レジスタは IFA{63:61} で選択される。 プロセ ッ サは、 プロセ ッ サ固有の置換アルゴ リ ズ<br />

ム に基づいて、 ど のエン ト リ を置換する かを決定する。<br />

itc 命令は、 後続す る メ モ リ 操作よ り 前に、 外部で生成 さ れる パ ー ジ (ptc.g、 ptc.ga)<br />

から参照可能にならなければならない。 ソフ ト ウェアの観点から見ると、 これは acquire<br />

のセマンテ ィ ッ ク スに よ く 似ている。 こ の場合も、 挿入された変換エン ト リ の副次的作<br />

用が検出される よ う に、 シ リ アル化操作が必要である。<br />

itc 命令は、 命令グルー プ内の最後の命令でなければな ら ない。 そ う でない場合は、 こ<br />

の命令の動作 ( 順序付けのセマンテ ィ ッ ク ス を含む ) は不定である。<br />

第 2 巻、 第 1 部の表 4-1 に示すよ うに、 挿入されたエン ト リ と重なるエン ト リが、 最初<br />

に TLB からパージされる。<br />

こ の命令は、 最高の特権レ ベル以外では実行で き ない。 ま た、 PSR.ic は 0 でなければな<br />

らない。<br />

プ ロ グ ラ ムが正常に実行 さ れる よ う に、 ソ フ ト ウ ェ アは、 変換エン ト リ を要求す る命令<br />

に対して rfi が実行される ま で、 PSR.ic が 0 のままであることを保証しなければならな<br />

い。<br />

操作 : if (PR[qp]) {<br />

if (!followed_by_stop())<br />

undefined_behavior();<br />

if (PSR.ic)<br />

illegal_operation_fault();<br />

if (PSR.cpl != 0)<br />

privileged_operation_fault(0);<br />

if (GR[r 2 ].nat)<br />

register_nat_consumption_fault(0);<br />

}<br />

tmp_size = CR[ITIR].ps;<br />

tmp_va = CR[IFA]{60:0};<br />

tmp_rid = RR[CR[IFA]{63:61}].rid;<br />

tmp_va = align_to_size_boundary(tmp_va, tmp_size);<br />

if (is_reserved_field(TLB_TYPE, GR[r 2 ], CR[ITIR]))<br />

reserved_register_field_fault();<br />

if (unimplemented_virtual_address(CR[IFA]))<br />

unimplemented_data_address_fault(0);<br />

if (instruction_form) {<br />

tlb_must_purge_itc_entries(tmp_rid, tmp_va, tmp_size);<br />

tlb_may_purge_dtc_entries(tmp_rid, tmp_va, tmp_size);<br />

slot = tlb_replacement_algorithm(ITC_TYPE);<br />

tlb_insert_inst(slot, GR[r 2], CR[ITIR], CR[IFA], tmp_rid, TC);<br />

} else { // data_form<br />

tlb_must_purge_dtc_entries(tmp_rid, tmp_va, tmp_size);<br />

tlb_may_purge_itc_entries(tmp_rid, tmp_va, tmp_size);<br />

slot = tlb_replacement_algorithm(DTC_TYPE);<br />

tlb_insert_data(slot, GR[r 2], CR[ITIR], CR[IFA], tmp_rid, TC);<br />

}<br />

3:130 第 3 巻 : 命令リファレンス<br />

itc


itc<br />

割り込み : マシン ・ チェ ッ ク ・ アボー ト 予約レジスタ / フィールド ・フォルト<br />

不正操作フ ォ ル ト 実装 さ れていないデ ー タ ・<br />

特権操作フ ォ ル ト ア ド レ ス ・ フ ォ ル ト<br />

レジスタ NaT 参照フ ォ ル ト<br />

シリアル化 : instruction_form では、 ソ フ ト ウ ェ アは、 新しい変換エン ト リ に依存する命令のフ ェ ッ<br />

チ ・ ア ク セスの前に、 命令のシ リ アル化操作を発行しなければな ら ない。 data_form で<br />

は、 ソ フ ト ウ ェアは、 新しい変換に依存するデータ ・ アクセス または非アクセス参照を<br />

発行す る前に、 デー タ のシ リ アル化操作を発行しなければな ら ない。<br />

第 3 巻 : 命令リファレンス 3:131


itr ─ トランスレーション・レジスタの挿入 (Insert Translation Register)<br />

書式 : (qp) itr.i itr[r 3 ] = r 2 instruction_form M42<br />

(qp) itr.d dtr[r 3 ] = r 2 data_form M42<br />

説明 : この命令は、 GR r3 の内容によ って指定される、 命令またはデータの ト ランスレーショ<br />

ン ・ レ ジ ス タ に変換エン ト リ を挿入する。 GR r2 は、 変換エン ト リ の物理ア ド レ ス部を<br />

指定す る。 ITIR は、 保護キ ー、 ペー ジ ・ サイ ズ、 追加情報を指定す る。 仮想ア ド レ ス は<br />

IFA レジスタによって指定され、 リージョン ・ レジスタは IFA{63:61} によって選択され<br />

る。<br />

第 2 巻、 第 1 部の表 4-1 「TLB 命令のパ ー ジ動作」 で説明する よ う に、 新たに挿入され<br />

た変換エン ト リ と重なるエン ト リ が、 最初に TLB からパージされる。 GR r3 によって指<br />

定される TR スロッ トに入っていた変換エントリは、 プロセッサのTLB からパージされ<br />

ない。 以前の TR 変換エン ト リ をパ ー ジす る に は、 新しい TR エン ト リ を挿入する前にソ<br />

フ ト ウ ェ アが明示的な ptr 命令を発行しなければな ら ない。<br />

こ の命令は、 最高の特権レ ベル以外では実行で き ない。 ま た、 PSR.ic は 0 でなければな<br />

らない。<br />

操作 : if (PR[qp]) {<br />

if (PSR.ic)<br />

illegal_operation_fault();<br />

if (PSR.cpl != 0)<br />

privileged_operation_fault(0);<br />

if (GR[r 3].nat || GR[r 2].nat)<br />

register_nat_consumption_fault(0);<br />

}<br />

slot = GR[r 3]{7:0};<br />

tmp_size = CR[ITIR].ps;<br />

tmp_va = CR[IFA]{60:0};<br />

tmp_rid = RR[CR[IFA]{63:61}].rid;<br />

tmp_va = align_to_size_boundary(tmp_va, tmp_size);<br />

tmp_tr_type = instruction_form ? ITR_TYPE : DTR_TYPE;<br />

if (is_reserved_reg(tmp_tr_type, slot))<br />

reserved_register_field_fault();<br />

if (is_reserved_field(TLB_TYPE, GR[r 2 ], CR[ITIR]))<br />

reserved_register_field_fault();<br />

if (unimplemented_virtual_address(CR[IFA]))<br />

unimplemented_data_address_fault(0);<br />

if (instruction_form) {<br />

tlb_must_purge_itc_entries(tmp_rid, tmp_va, tmp_size);<br />

tlb_may_purge_dtc_entries(tmp_rid, tmp_va, tmp_size);<br />

tlb_insert_inst(slot, GR[r 2], CR[ITIR], CR[IFA], tmp_rid, TR);<br />

} else { // data_form<br />

tlb_must_purge_dtc_entries(tmp_rid, tmp_va, tmp_size);<br />

tlb_may_purge_itc_entries(tmp_rid, tmp_va, tmp_size);<br />

tlb_insert_data(slot, GR[r 2 ], CR[ITIR], CR[IFA], tmp_rid, TR);<br />

}<br />

割り込み : マシン ・ チェ ッ ク ・ アボー ト 予約レジスタ / フィールド ・フォルト<br />

不正操作フ ォ ル ト 実装 さ れていないデ ー タ ・ ア ド レ ス ・<br />

特権操作フ ォ ル ト フ ォ ル ト<br />

レジスタ NaT 参照フ ォ ル ト<br />

3:132 第 3 巻 : 命令リファレンス<br />

itr


itr<br />

シリアル化 : instruction_form では、 ソ フ ト ウ ェ アは、 新しい変換エン ト リ に依存する命令のフ ェ ッ<br />

チ ・ ア ク セスの前に、 命令のシ リ アル化操作を発行しなければな ら ない。 data_form で<br />

は、 ソ フ ト ウ ェアは、 新しい変換エン ト リ に依存するデータ ・ アクセス または非アクセ<br />

ス参照を発行する前に、 データのシ リ アル化操作を発行しなければならない。<br />

注 : プロセッサは、 ト ランスレーション ・ キャッシュ ・エン ト リ用に、 無効なト ランス<br />

レーション ・ レジスタを使用できる。 プロセッサのモデルによっては、 ト ランス<br />

レーション ・ レジスタ 0 を始点と して、 レジスタ番号を増やす方向に連続して ト ラ<br />

ンスレーシ ョ ン ・ レジスタを割り当てる と、 パフォーマンスが向上する場合があ<br />

る。<br />

第 3 巻 : 命令リファレンス 3:133


ld ─ Load<br />

書式 : (qp) ldsz.ldtype.ldhint r 1 = [r 3 ] no_base_update_form M1<br />

(qp) ldsz.ldtype.ldhint r 1 = [r 3 ], r 2 reg_base_update_form M2<br />

(qp) ldsz.ldtype.ldhint r 1 = [r 3 ], imm 9 imm_base_update_form M3<br />

(qp) ld16.ldhint r 1 , ar.csd = [r 3 ] sixteen_byte_form, no_base_update_form M1<br />

(qp) ld16.acq.ldhint r 1 , ar.csd = [r 3 ] sixteen_byte_form, acquire_form, no_base_update_form M1<br />

(qp) ld8.fill.ldhint r 1 = [r 3 ] fill_form, no_base_update_form M1<br />

(qp) ld8.fill.ldhint r 1 = [r 3 ], r 2 fill_form, reg_base_update_form M2<br />

(qp) ld8.fill.ldhint r 1 = [r 3 ], imm 9 fill_form, imm_base_update_form M3<br />

説明 : sz バイ ト からなる値が、 GR r3 の値によ って指定されるアド レスから始まるメモリ位置<br />

か ら読み込 ま れる。 次に、 こ の値がゼ ロ拡張 さ れ、 GR r1 に格納される。 sz コンプリー<br />

タの値を表 2-32 に示す。 後述のア ド バン ス ド ・ ロ ー ド の場合を除いて、 GR r1 に対応す<br />

る NaT ビッ トがクリアされる。 ldtype コンプリータで特殊なロード操作を指定する。 そ<br />

れらの操作については、 表 2-33 で説明している。<br />

sixteen_byte_form では、 2 つの 8 バイ ト値が 16 バイ ト のメモリ読み込みとして 1 回で<br />

ロード される。 最下位アドレスの値は GR r1 に格納 さ れ、 最上位ア ド レ スの値は<br />

Compare and Store Data アプ リ ケーシ ョ ン ・ レジスタ (AR[CSD]) に格納される。 この<br />

sixteen_byte_form では、 none と acq のみがロー ド ・ タ イプ と してサポー ト される。<br />

fill_form では、 8 バイ ト の値がロー ド され、 UNAT アプ リ ケーシ ョ ン ・ レジスタの特定<br />

ビッ トがターゲット ・レジスタのNaT ビッ トにコピーされる。 この命令は、 スピルした<br />

レジスタと Nat のペアをロー ド する場合に使用される。 詳細は、 第 1 巻、 第 1 部の 4.4.4<br />

項 「コン ト ロール ・ スペキュレーシ ョ ン」 を参照のこ と。<br />

ベー ス更新形式では、 CR r3 の値が符号付き即値 (imm9 ) または GR r2 の値に加算され、<br />

その結果が GR r3 に戻される。 このベース ・ レジスタの更新はロー ド 後に行われ、 ロー<br />

ド・アドレスには影響しない。reg_update_form では、 GR r2 に対応する NaT ビットが<br />

セッ ト されている場合は、 GR r3 に対応する NaT ビ ッ ト がセ ッ ト さ れ、 フ ォ ル ト は発生<br />

しない。 ld16 命令では、 ベー ス ・ レ ジ ス タ の更新はサポ ー ト さ れていない。<br />

表 2-32. sz コンプリータ<br />

表 2-33. ロード・タイプ<br />

sz コンプリータ アクセスされるバイト数<br />

1 1 バイト<br />

2 2 バイト<br />

4 4 バイト<br />

8 8 バイト<br />

ldtype<br />

コンプリータ<br />

意味 特殊 Load 操作<br />

none 通常のロード<br />

s スペキュレー<br />

ティブ・ロード<br />

特定の例外を、フォルトを発生させないでデファーする ( 据え置かせる )<br />

ことができる。例外をデファーする ( 据え置く ) と、ターゲット・レジ<br />

スタの NaT ビットがセットされる。NaT ビットは後でデファード ( 据え<br />

置き ) の検出に利用される。<br />

3:134 第 3 巻 : 命令リファレンス<br />

ld


ld<br />

表 2-33. ロード・タイプ(続き)<br />

ldtype<br />

コンプリータ<br />

a アドバンスド・<br />

ロード<br />

sa スペキュレー<br />

ティブ・アドバ<br />

ンスド・ロード<br />

c.nc チェック・ロー<br />

ド - クリアなし<br />

c.clr チェック・ロー<br />

ド - クリアあり<br />

c.clr.acq 順序付けされた<br />

チェック・ロー<br />

ド - クリアあり<br />

acq 順序付けされた<br />

ロード<br />

bias バイアスされた<br />

ロード<br />

意味 特殊 Load 操作<br />

ALAT にエントリが追加される。それにより、以降の命令でストアの衝<br />

突の有無を確認できる。参照されたデータ・ページに非スペキュレー<br />

ティブ属性があった場合は、ターゲット・レジスタの NaT ビットがクリ<br />

アされ、プロセッサによって、ターゲット・レジスタに対する ALAT エ<br />

ントリが存在しないことが保証される。ALAT エントリが存在しないと<br />

いうことを利用して、後でデファード ( 据え ) または衝突を検出する。<br />

ALAT にエントリが追加され、特定の例外を据え置かせることができる。<br />

例外を据え置くと、ターゲット・レジスタの NaT ビットがセットされ、<br />

プロセッサによって、ターゲット・レジスタに対する ALAT エントリが<br />

存在しないことが保証される。ALAT エントリが存在しないことを利用<br />

して、後でデファード ( 据え ) または衝突を検出する。<br />

ALAT を検索して一致するエントリが探され、見つかった場合は、ロー<br />

ドは実行されず、ターゲット・レジスタは変更されない。指定されてい<br />

る場合には、ALAT のヒットまたはミスに関わらず、ベース・レジスタ<br />

の更新が実行される。ALAT エントリの一致の有無に関わらず、必要に<br />

応じて ALAT ルックアップを失敗させることができる。見つからなかっ<br />

た場合は、ロードが実行され、参照されたデータ・ページに非スペキュ<br />

レーティブ属性がない場合は、エントリが ALAT に追加される。非スペ<br />

キュレーティブ属性があった場合は、ALAT エントリは割り当てられな<br />

い。<br />

ALAT が検索されて一致するエントリが探され、見つかった場合は、そ<br />

のエントリが削除され、ロードは実行されず、ターゲット・レジスタは<br />

変更されない。指定されている場合には、ALAT のヒットまたはミスに<br />

関わらず、ベース・レジスタ更新が実行される。ALAT エントリの一致<br />

の有無に関わらず、ALAT ルックアップを必要に応じて失敗させること<br />

ができる。見つからなかった場合は、クリア・チェック・ロードの動作<br />

は通常のロードと同様になる。<br />

このタイプの動作は、ALAT ルックアップ ( および、ALAT エントリが見<br />

つからなかった場合、結果のロード ) が acquire ( 取得 ) のセマンティッ<br />

クスを使用して実行される以外は、順序付けなしのクリア形式と同じで<br />

ある。<br />

acquire のセマンティックスを使用して順序付けされたロードが実行され<br />

る。<br />

アクセスされるキャッシュ・ラインの排他的所有権を取得するよう指示<br />

するヒントが提示される。<br />

順序付け されたロ ー ド 、 バイアス さ れた ロ ー ド 、 スペキ ュ レ ー テ ィ ブ ・ ロ ー ド 、 ア ド バ<br />

ンス ド ・ ロー ド、 チェ ッ ク ・ ロー ドの詳細は、 第 1 巻、 第 1 部の 4.4.4 項 「コン ト ロー<br />

ル ・ スペキュ レーシ ョ ン」 と 第 1 巻、 第 1 部の 4.4.5 項 「データ ・ スペキュレーシ ョ ン」<br />

を参照。 順序付け さ れたロ ー ド の詳細は、 第 1 巻、 第 1 部の 4.4.7 項 「メモリ ・ アクセス<br />

順序」 を参照。 バイアス されたロ ー ド の詳細は、 第 1 巻、 第 1 部の 4.4.6 項 「メモリ階層<br />

の制御 と 整合性」 を参照。 メモ リ 属性の詳細は、 第 2 巻、 第 1 部の 4.4 節 「メモリ属性」<br />

を参照のこ と。<br />

非スペキ ュ レ ーテ ィ ブ ・ ロ ー ド ・ タ イプについては、 GR r3 に対応する NaT ビットが1<br />

の場合は、 レ ジス タ NaT 参照 (Register NaT Consumption) フォルトが発生する。 スペキュ<br />

レーティブ・ ロードおよびスペキュレーティブ・アドバンスド ・ ロードでは、 フォルト<br />

は発生せず、 例外がデフ ァ ー される ( 据え置かれる )。 ベース更新の計算では、 GR r2 に<br />

対応す る NaT ビッ トが1 の場合、 GR r3 に対応する NaT ビッ トが1 に設定され、 フ ォル<br />

トは発生しない。<br />

第 3 巻 : 命令リファレンス 3:135


ldhint コ ンプ リ ー タの値で、 メモ リ ・ ア クセスの局所性を指定する。 ldhint コンプリータ<br />

の値を表 2-34 に示す。 ベー ス更新形式には、 暗黙的にプ リ フ ェ ッ チ ・ ヒ ン ト の意味があ<br />

る。 ベー ス更新後の GR r 3 の値で指定されるアド レスには、 指定されたキャ ッシュ ・ ラ<br />

インをプリフェッチするよう指示するヒントの働きがある。 このプリフェッチは、 ldhint<br />

で指定される局所性ヒ ン ト を使用する。 プ リ フ ェ ッ チ と 局所性の ヒ ン ト はプ ロ グ ラ ムの<br />

機能には影響せず、 イ ン プ リ メ ン テ ー シ ョ ンで も 無視で き る。 詳細は、 第 1 巻、 第 1 部<br />

の 4.4.6 項 「メ モ リ 階層の制御 と 整合性」 を参照のこ と。<br />

表 2-34. ロードのヒント<br />

ldhint コンプリータ 意味<br />

none 時間的局所性、レベル 1<br />

nt1 時間的局所性なし、レベル 1<br />

nta 時間的局所性なし、全レベル<br />

no_base_update 形式では GR r3 の値は変更されず、 この形式にはプ リ フ ェ ッ チ ・ ヒ ン ト の<br />

暗黙的意味 も ない。<br />

ベー ス更新形式の場合は、 r1 と r3 に同じ レ ジ ス タ ・ ア ド レ ス を指定する と 、 無効操作<br />

(Illegal Operation) フォルトが発生する。<br />

ライ トバック ・ ポリシーを持つキャッシュ可能ページでも NaTPage でもないページを参<br />

照する ld16 命令がハ ー ド ウ ェ ア上でサポ ー ト さ れる か ど う かは、 プ ロ セ ッ サに よ っ て異<br />

なる。 このよ うな ld16 アクセスをサポー ト しないプロセッサ ・モデル上で、 サポー ト さ<br />

れていない参照を行お う と する と、 サポ ー ト されないデー タ参照フ ォ ル ト が発生する。<br />

操作 : if (PR[qp]) {<br />

size = fill_form ? 8 : (sixteen_byte_form ? 16 : sz);<br />

speculative = (ldtype == ‘s’ || ldtype == ‘sa’);<br />

advanced = (ldtype == ‘a’ || ldtype == ‘sa’);<br />

check_clear = (ldtype == ‘c.clr’ || ldtype == ‘c.clr.acq’);<br />

check_no_clear = (ldtype == ‘c.nc’);<br />

check = check_clear || check_no_clear;<br />

acquire = (acquire_form || ldtype == ‘acq’ || ldtype == ‘c.clr.acq’);<br />

otype = acquire ? ACQUIRE : UNORDERED;<br />

bias = (ldtype == ‘bias’) ? BIAS : 0 ;<br />

itype = READ;<br />

if (speculative) itype |= SPEC ;<br />

if (advanced) itype |= ADVANCE ;<br />

if (size == 16) itype |= UNCACHE_OPT ;<br />

if ((reg_base_update_form || imm_base_update_form) && (r 1 == r 3 ))<br />

illegal_operation_fault();<br />

check_target_register(r 1 );<br />

if (reg_base_update_form || imm_base_update_form)<br />

check_target_register(r 3 );<br />

if (reg_base_update_form) {<br />

tmp_r2 = GR[r 2 ];<br />

tmp_r2nat = GR[r 2 ].nat;<br />

}<br />

if (!speculative && GR[r 3 ].nat) // fault on NaT address<br />

register_nat_consumption_fault(itype);<br />

defer = speculative && (GR[r 3 ].nat || PSR.ed);// defer exception if spec<br />

3:136 第 3 巻 : 命令リファレンス<br />

ld


ld<br />

if (check && alat_cmp(GENERAL, r 1 )) { // no load on ld.c & ALAT hit<br />

if (check_clear) // remove entry on ld.c.clr or ld.c.clr.acq<br />

alat_inval_single_entry(GENERAL, r 1 );<br />

} else {<br />

if (!defer) {<br />

paddr = tlb_translate(GR[r 3 ], size, itype, PSR.cpl, &mattr,<br />

&defer);<br />

spontaneous_deferral(paddr, size, UM.be, mattr, otype,<br />

bias | ldhint, &defer);<br />

if (!defer) {<br />

if (size == 16) {<br />

mem_read_pair(&val, &val_ar, paddr, size, UM.be, mattr,<br />

otype, ldhint);<br />

}<br />

else {<br />

val = mem_read(paddr, size, UM.be, mattr, otype,<br />

bias | ldhint);<br />

}<br />

}<br />

}<br />

if (check_clear || advanced) // remove any old ALAT entry<br />

alat_inval_single_entry(GENERAL, r 1 );<br />

if (defer) {<br />

if (speculative) {<br />

GR[r 1 ] = natd_gr_read(paddr, size, UM.be, mattr, otype,<br />

bias | ldhint);<br />

GR[r 1 ].nat = 1;<br />

} else {<br />

GR[r 1 ] = 0; // ld.a to sequential memory<br />

GR[r 1 ].nat = 0;<br />

}<br />

} else { // execute load normally<br />

if (fill_form) { // fill NaT on ld8.fill<br />

bit_pos = GR[r 3]{8:3};<br />

GR[r 1 ] = val;<br />

GR[r 1 ].nat = AR[UNAT]{bit_pos};<br />

} else { // clear NaT on other types<br />

if (size == 16) {<br />

GR[r 1 ] = val;<br />

AR[CSD] = val_ar;<br />

}<br />

else {<br />

GR[r 1] = zero_ext(val, size * 8);<br />

}<br />

GR[r 1 ].nat = 0;<br />

}<br />

if ((check_no_clear || advanced) && ma_is_speculative(mattr))<br />

// add entry to ALAT<br />

alat_write(GENERAL, r 1, paddr, size);<br />

}<br />

}<br />

if (imm_base_update_form) { // update base register<br />

GR[r 3 ] = GR[r 3 ] + sign_ext(imm 9 , 9);<br />

GR[r 3].nat = GR[r 3].nat;<br />

} else if (reg_base_update_form) {<br />

GR[r 3 ] = GR[r 3 ] + tmp_r2;<br />

GR[r 3].nat = GR[r 3].nat || tmp_r2nat;<br />

}<br />

if ((reg_base_update_form || imm_base_update_form) && !GR[r 3].nat)<br />

第 3 巻 : 命令リファレンス 3:137


}<br />

mem_implicit_prefetch(GR[r 3 ], ldhint | bias, itype);<br />

割り込み : 無効操作フ ォ ル ト デー タ NaT ページ参照フォル ト<br />

レジスタ NaT 参照フォルト データ・キー・ ミス・フォルト<br />

実装されていないデータ ・アドレス ・ フォルト データ ・キー許可フォルト<br />

データがネス ト された TLB フォルト データ・アクセス権フォルト<br />

別のデー タ TLB フォルト データ・アクセス・ビット ・フォルト<br />

VHPT データ ・ フォル ト データ ・ デバッグ ・ フォル ト<br />

データ TLB フ ォル ト アライ メン ト の合っていないデー タ参照<br />

データ ・ページ不在フォルト フォルト<br />

サポー ト されていないデータ参照<br />

フォルト<br />

3:138 第 3 巻 : 命令リファレンス<br />

ld


ldf<br />

ldf ─ 浮動小数点ロード (Floating-point Load)<br />

書式 : (qp) ldffsz.fldtype.ldhint f 1 = [r 3 ] no_base_update_form M6<br />

(qp) ldffsz.fldtype.ldhint f 1 = [r 3 ], r 2 reg_base_update_form M7<br />

(qp) ldffsz.fldtype.ldhint f 1 = [r 3 ], imm 9 imm_base_update_form M8<br />

(qp) ldf8.fldtype.ldhint f 1 = [r 3 ] integer_form, no_base_update_form M6<br />

(qp) ldf8.fldtype.ldhint f 1 = [r 3 ], r 2 integer_form, reg_base_update_form M7<br />

(qp) ldf8.fldtype.ldhint f 1 = [r 3 ], imm 9 integer_form, imm_base_update_form M8<br />

(qp) ldf.fill.ldhint f 1 = [r 3 ] fill_form, no_base_update_form M6<br />

(qp) ldf.fill.ldhint f 1 = [r 3 ], r 2 fill_form, reg_base_update_form M7<br />

(qp) ldf.fill.ldhint f 1 = [r 3 ], imm 9 fill_form, imm_base_update_form M8<br />

説明 : fsz バイ ト からなる値が、 GR r3 の値によって指定されるアド レスから始まるメモリ位置<br />

から読み込まれる。 次に、 この値が浮動小数点レジスタ形式に変換され、 FR f1 に格納さ<br />

れる。 浮動小数点レ ジ ス タ形式への変換の詳細は、 第 1 巻、 第 1 部の 5.1 節 「データ型<br />

お よ び形式」 を参照のこ と。 fsz コンプリータの値を表 2-35 に示す。 fldtype コンプリータ<br />

で特殊なロ ー ド 操作を指定する。 それら の操作については、 表 2-36 で説明している。<br />

integer_form では、 8 バイ ト値がロー ド され、 変換されずに FR f1 の仮数フ ィ ール ド に格<br />

納される。 FR f1 の指数フ ィ ール ド は 2.063 (0x1003E) のバイアス付き指数に設定され、<br />

FR f1 の符号フ ィ ール ド は正に対応する 0 に設定される。<br />

fill_form では、 16 バイ ト値がロー ド され、 FR f1 の対応する フ ィ ール ド に変換されずに格<br />

納される。 この命令は、 スピルしたレジスタを再ロー ド する場合に使用される。 詳細は、<br />

第 1 巻、 第 1 部の 4.4.4 項 「コン ト ロール ・ スペキュレーシ ョ ン」 を参照のこ と。<br />

ベー ス更新形式では、 CR r3 の値が符号付き即値 (imm9 ) または GR r2 の値に加算され、<br />

その結果が GR r3 に戻される。 このベース ・ レジスタの更新はロー ド 後に実行され、<br />

ロード ・アドレスには影響しない。 reg_update_form では、 GR r2 に対応する NaT ビッ ト<br />

がセッ ト されている場合は、 GR r3 に対応する NaT ビッ トがセットされ、 フォルトは発<br />

生しない。<br />

表 2-35. fsz コンプリータ<br />

表 2-36. FP ロードのタイプ<br />

fsz コンプリータ アクセスされるバイト数 メモリ形式<br />

s 4 バイト 単精度<br />

d 8 バイト 倍精度<br />

e 10 バイト 拡張精度<br />

fldtype<br />

コンプリータ<br />

意味 特殊ロード操作<br />

none 通常のロード<br />

s スペキュレーティ<br />

ブ・ロード<br />

a アドバンスド・<br />

ロード<br />

特定の例外を、フォルトを発生させないでデファーさせる ( 据え ) こと<br />

ができる。例外を据え置くと、ターゲット・レジスタが NaTVal に設定<br />

される。NaTVal ビットは後でデファード ( 据え ) の検出に利用される。<br />

ALAT にエントリが追加される。それにより、以降の命令でストアの衝突<br />

の有無を確認できる。参照されるデータ・ページに非スペキュレーティ<br />

ブ属性があった場合は、ALAT にエントリが追加されず、ターゲット・レ<br />

ジスタは次のように設定される。integer_form では、指数が 0x1003E に<br />

設定され、符号および仮数がゼロに設定される。これ以外の形式では、<br />

符号、指数、仮数がゼロに設定される。ALAT エントリが存在しないこと<br />

を利用して、後でデファード ( 据え ) または衝突を検出する。<br />

第 3 巻 : 命令リファレンス 3:139


表 2-36. FP ロードのタイプ(続き)<br />

fldtype<br />

コンプリータ<br />

sa スペキュレーティ<br />

ブ・アドバンス<br />

ド・ロード<br />

c.nc チェック・ロード<br />

- クリアなし<br />

c.clr チェック・ロード<br />

- クリアあり<br />

意味 特殊ロード操作<br />

ALAT にエントリが追加され、特定の例外をデファーさせる ( 据え ) こ<br />

とができる。例外をデファーする ( 据え ) と、ターゲット・レジスタが<br />

NaTVal に設定され、プロセッサによって、ターゲット・レジスタに対<br />

する ALAT エントリが存在しないことが保証される。ALAT エントリが<br />

存在しないことを利用して、後でデファード ( 据え ) または衝突を検出<br />

する。<br />

ALAT を検索して一致するエントリが探され、見つかった場合は、ロー<br />

ドは実行されず、ターゲット・レジスタは変更されない。指定されてい<br />

る場合には、ALAT のヒットまたはミスに関わらず、ベース・レジスタ<br />

の更新が実行される。ALAT エントリの一致の有無に関わらず、必要に<br />

応じて ALAT ルックアップを失敗させることができる。見つからなかっ<br />

た場合は、ロードが実行され、参照されたデータ・ページに非スペキュ<br />

レーティブ属性がない場合は、エントリが ALAT に追加される。非スペ<br />

キュレーティブ属性があった場合は、ALAT エントリは割り当てられな<br />

い。<br />

ALAT が検索されて一致するエントリが探され、見つかった場合は、そ<br />

のエントリが削除され、ロードは実行されず、ターゲット・レジスタは<br />

変更されない。指定されている場合には、ALAT のヒットまたはミスに<br />

関わらず、ベース・レジスタの更新が実行される。ALAT エントリの一<br />

致の有無に関わらず、必要に応じて ALAT ルックアップを失敗させるこ<br />

とができる。見つからなかった場合は、クリア・チェック・ロードの動<br />

作は通常のロードと同様になる。<br />

「スペキ ュ レーテ ィ ブ」、 「ア ド バンス ド 」、 「チェ ッ ク型」 の各タ イプのロー ド の詳細は、<br />

第 1 巻、 第 1 部の 4.4.4 項 「コン ト ロール ・ スペキュレーシ ョ ン」 および第 1 巻、 第 1 部<br />

の 4.4.5 項 「データ ・ スペキュレーショ ン」 を参照の こ と 。 メ モ リ 属性の詳細は、 第 2<br />

巻、 第 1 部の 4.4 節 「メモリ属性」 を参照のこ と。<br />

非スペキ ュ レ ーテ ィ ブ ・ ロ ー ド ・ タ イプで、 GR r3 に対応する NaT ビッ トが1 の場合は、<br />

レジスタ NaT 参照 (Register NaT Consumption) フォルトが発生する。 スペキュレーティ<br />

ブ・ロードおよびスペキュレーティブ・アドバンスド ・ロードでは、 フォルトは発生せ<br />

ず、 例外がデフ ァ ー される ( 据え置かれる )。 ベース更新の計算では、 GR r2 に対応する<br />

NaT ビッ トが1 の場合、 GR r3 に対応する NaT ビッ トが1 に設定 さ れ、 フ ォ ル ト は発生<br />

しない。<br />

ldhint コ ンプ リ ー タ の値で メ モ リ ・ ア ク セスの局所性を指定する。 ldhint コンプリータの<br />

値は 3:136 ページの表 2-34 に示してい る。 ベー ス更新形式には、 暗黙的にプ リ フ ェ ッ<br />

チ ・ ヒ ン ト の意味があ る。 ベー ス更新後の GR r3 の値に よ っ て指定されるア ド レ スには、<br />

指定されたキャッシュ ・ラインをプリフェッチするよう指示するヒントの働きがある。<br />

このプリフェッチは、 ldhint で指定される局所性ヒン ト を使用する。 プリ フェ ッチと局所<br />

性の ヒ ン ト はプログラムの機能性には影響せず、 プロ グラ ム ・ コ ー ド に よ り無視も でき<br />

る。 詳細は、 第 1 巻、 第 1 部の 4.4.6 項 「メ モ リ 階層の制御 と 整合性」 を参照のこ と。<br />

no_base_update 形式では GR r3 の値は変更されず、 この形式にはプ リ フ ェ ッ チ ・ ヒ ン ト の<br />

暗黙的意味 も ない。<br />

PSR.mfl ビットおよびPSR.mfh ビッ トが更新されて、 FR f1 の変更を記録す る。<br />

ライ トバック ・ ポリシーを持つキャッシュ可能ページでも NaTPage でもないページを参<br />

照する ldfe(10 バイ ト ) 命令が、 ハー ド ウ ェ ア上でサポ ー ト さ れる か ど う かは、 プ ロ<br />

セッサによって異なる。 このようなldfe アクセスをサポー トしないプロセッサ・モデ<br />

ル上で、 サポ ー ト さ れていない参照を行 う と 、 サポ ー ト さ れないデ ー タ参照フ ォ ル ト が<br />

発生す る。 こ の フ ォ ル ト は、 通常、 ア ド バン ス ト 、 チ ェ ッ ク ・ ロ ー ド の各タ イ プの<br />

3:140 第 3 巻 : 命令リファレンス<br />

ldf


ldf<br />

ldfe でのみ発生する。 コン ト ロール ・ スペキュ レーテ ィ ブ ・ タイプの ldfe では、 サ<br />

ポー ト されないデータ参照フォルトは常にデファーされる ( 据え置かれる )。<br />

操作 : if (PR[qp]) {<br />

size = (fill_form ? 16 : (integer_form ? 8 : fsz));<br />

speculative = (fldtype == ‘s’ || fldtype == ‘sa’);<br />

advanced = (fldtype == ‘a’ || fldtype == ‘sa’);<br />

check_clear = (fldtype == ‘c.clr’ );<br />

check_no_clear = (fldtype == ‘c.nc’);<br />

check = check_clear || check_no_clear;<br />

itype = READ;<br />

if (speculative) itype |= SPEC;<br />

if (advanced) itype |= ADVANCE;<br />

if (size == 10) itype |= UNCACHE_OPT;<br />

if (reg_base_update_form || imm_base_update_form)<br />

check_target_register(r 3 );<br />

fp_check_target_register(f 1);<br />

if (tmp_isrcode = fp_reg_disabled(f 1 , 0, 0, 0))<br />

disabled_fp_register_fault(tmp_isrcode, itype);<br />

if (!speculative && GR[r 3 ].nat) // fault on NaT address<br />

register_nat_consumption_fault(itype);<br />

defer = speculative && (GR[r 3 ].nat || PSR.ed);// defer exception if spec<br />

if (check && alat_cmp(FLOAT, f 1)) { // no load on ldf.c & ALAT hit<br />

if (check_clear) // remove entry on ldf.c.clr<br />

alat_inval_single_entry(FLOAT, f 1 );<br />

} else {<br />

if (!defer) {<br />

paddr = tlb_translate(GR[r 3 ], size, itype, PSR.cpl, &mattr,<br />

&defer);<br />

spontaneous_deferral(paddr, size, UM.be, mattr, UNORDERED,<br />

ldhint, &defer);<br />

if (!defer)<br />

val = mem_read(paddr, size, UM.be, mattr, UNORDERED, ldhint);<br />

}<br />

if (check_clear || advanced) // remove any old ALAT entry<br />

alat_inval_single_entry(FLOAT, f 1 );<br />

if (speculative && defer) {<br />

FR[f 1 ] = NATVAL;<br />

} else if (advanced && !speculative && defer) {<br />

FR[f 1 ] = (integer_form ? FP_INT_ZERO : FP_ZERO);<br />

} else { // execute load normally<br />

FR[f 1 ] = fp_mem_to_fr_format(val, size, integer_form);<br />

}<br />

}<br />

if ((check_no_clear || advanced) && ma_is_speculative(mattr))<br />

// add entry to ALAT<br />

alat_write(FLOAT, f 1 , paddr, size);<br />

if (imm_base_update_form) { // update base register<br />

GR[r 3 ] = GR[r 3 ] + sign_ext(imm 9 , 9);<br />

GR[r 3 ].nat = GR[r 3 ].nat;<br />

} else if (reg_base_update_form) {<br />

GR[r 3 ] = GR[r 3 ] + GR[r 2 ];<br />

GR[r 3].nat = GR[r 3].nat || GR[r 2].nat;<br />

}<br />

第 3 巻 : 命令リファレンス 3:141


}<br />

if ((reg_base_update_form || imm_base_update_form) && !GR[r 3].nat)<br />

mem_implicit_prefetch(GR[r 3 ], ldhint, itype);<br />

fp_update_psr(f 1);<br />

割り込み : 無効操作フ ォ ル ト デー タ NaT ページ参照フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト デー タ ・ キ ー ・ ミ ス ・ フ ォ ル ト<br />

レジスタ NaT 参照フ ォ ル ト デー タ ・ キ ー許可フ ォ ル ト<br />

実装 さ れていないデ ー タ ・ ア ド レ ス ・ フ ォ ル ト デー タ ・ ア ク セス権フ ォ ル ト<br />

データがネス ト された TLB フォルト データ・アクセス・ビット ・フォルト<br />

別のデー タ TLB フォルト データ・デバッグ・フォルト<br />

VHPT デー タ ・ フ ォル ト アライ メン ト の合っていないデー タ参照<br />

データ TLB フォルト フォルト<br />

データ ・ ページ不在フォルト サポー ト されないデータ参照フォルト<br />

3:142 第 3 巻 : 命令リファレンス<br />

ldf


ldfp<br />

ldfp ─ 浮動小数点ペア・ロード (Floating-point Load Pair)<br />

書式 : (qp) ldfps.fldtype.ldhint f 1 , f 2 = [r 3 ] single_form, no_base_update_form M11<br />

(qp) ldfps.fldtype.ldhint f 1 , f 2 = [r 3 ], 8 single_form, base_update_form M12<br />

(qp) ldfpd.fldtype.ldhint f 1 , f 2 = [r 3 ] double_form, no_base_update_form M11<br />

(qp) ldfpd.fldtype.ldhint f 1 , f 2 = [r 3 ], 16 double_form, base_update_form M12<br />

(qp) ldfp8.fldtype.ldhint f 1 , f 2 = [r 3 ] integer_form, no_base_update_form M11<br />

(qp) ldfp8.fldtype.ldhint f 1 , f 2 = [r 3 ], 16 integer_form, base_update_form M12<br />

説明 : 8 (single_form の場合 ) または 16 (double_form/integer_form の場合 ) バイ ト が、 GR r3 の値<br />

によって指定されるアド レスから始まるメモリ位置から読み込まれる。 読み込まれた値<br />

は、 single_form/double_form では連続した浮動小数点数ペア と して、 integer_form では整<br />

数 / 並列 FP デー タ と して扱われる。 各数値は浮動小数点レ ジ ス タ形式に変換 さ れる。 下<br />

位ア ド レスの値は、 FR f1 に格納 さ れ、 上位ア ド レ スの値は FR f2 に格納される。 浮動小<br />

数点レ ジ ス タ形式への変換の詳細は、 第 1 巻、 第 1 部の 5.1 節 「データ型および形式」<br />

を参照のこ と。 fldtype コンプ リ ータで特殊なロー ド操作を指定する。 それらの操作につ<br />

いては、 3:139 ページの表 2-36 で説明している。<br />

「スペキ ュ レ ー テ ィ ブ」、 「ア ド バンス ド 」、 お よ び 「チ ェ ッ ク」 の各タ イプのロ ー ド の詳<br />

細は、 第 1 巻、 第 1 部の 4.4.4 項 「コン ト ロール ・ スペキュレーシ ョ ン」 および第 1 巻、<br />

第 1 部の 4.4.5 項 「データ ・ スペキュレーショ ン」 を参照のこ と。<br />

非スペキ ュ レ ーテ ィ ブ ・ ロ ー ド ・ タ イプでは、 GR r3 に対応する NaT ビットが1 であっ<br />

た場合、 レ ジスタ NaT 参照 (Register NaT Consumption) フォルトが発生する。 スペキュ<br />

レーティブ・ ロードおよびスペキュレーティブ・アドバンスド ・ ロードでは、 フォルト<br />

は発生せず、 例外がデフ ァ ー される ( 据え置かれる )。<br />

base_update_form では、 GR r3 の値が暗黙指定の ( データ ・ サイズの 2 倍に等しい ) 即値<br />

に加算 さ れ、 その結果が GR f3 に格納される。 このベース ・ レジスタの更新は、 ロ ー ド<br />

の後に行われ、 ロ ー ド ・ ア ド レ スには影響しない。<br />

ldhint コ ンプ リ ー タの値で、 メモ リ ・ ア クセスの局所性を指定する。 ldhint のニーモニッ<br />

ク値は 3:136 ページの表 2-34 に示してい る。 ベー ス更新形式に は、 暗黙的にプ リ フ ェ ッ<br />

チ ・ ヒ ン ト の意味があ る。 ベー ス更新後の GR r3 の値で指定されるア ド レ スには、 指定<br />

さ れたキ ャ ッ シ ュ ・ ラ イ ンをプ リ フ ェ ッ チする よ う に指示す る ヒ ン ト の働き があ る。 こ<br />

のプ リ フ ェ ッチは、 ldhint で指定される局所性 ヒ ン ト を使用する。 プ リ フ ェ ッ チ と 局所性<br />

のヒ ン ト はプログラ ムの機能には影響せず、 プログラ ム ・ コ ー ド に よ って無視する こ と<br />

もできる。 詳細は、 第 1 巻、 第 1 部の 4.4.6 項 「メ モ リ 階層の制御 と 整合性」 を参照のこ<br />

と。<br />

no_base_update 形式では GR r3 の値は変更されず、 この形式にはプ リ フ ェ ッ チ ・ ヒ ン ト の<br />

暗黙的意味 も ない。<br />

RSP.mfl ビッ トおよびPSR.mfh ビッ トが更新されて、 FR f1 と FR f2 の変更を記録す る。<br />

ターゲッ ト ・ レジスタの選択には制約がある。 レジスタ指定子f 1 と f 2 は、 それぞれ、 奇<br />

数番号の物理 FR と 偶数番号の物理 FR を 1 つずつ指定しなければならない。 奇数または<br />

偶数番号だけの レ ジ ス タ を 2 つ選択する と 、 無効操作 (Illegal Operation) フォルトが発生<br />

する。 この制約は、 レジスタ ・ ローテーション後の物理レジスタ番号に課せられる。 つ<br />

まり、 f 1 と f 2 にスタテ ィ ッ ク ・ レジスタを指定したり、 両方にローテー ト ・ レジスタを<br />

指定す る場合は、 f 1 と f 2 は奇数 / 偶数 ま たは偶数 / 奇数の組み合わせでなければな ら な<br />

い。 f 1 と f 2 が同一のスタティ ッ ク ・ レジスタまたは同一のローテー ト ・ レジスタを指定<br />

す る場合は、 制約は CFM.rrb.fr に応じて異なる。 CFM.rrb.fr が偶数の場合は、 制約条件<br />

は同じであり、 つま り f 1 と f 2 は奇数 / 偶数 ま たは偶数 / 奇数でなければな ら ない。<br />

CFM.rrb.fr が奇数の場合は、 f 1 と f 2 は偶数 / 偶数 ま たは奇数 / 奇数でなければな ら ない。<br />

第 3 巻 : 命令リファレンス 3:143


スタティ ック ・ レジスタとローテー ト ・ レジスタを 1 つずつ指定するのは、 CFM.rrb.fr<br />

の値が予測可能な値 (0 など ) になる と きに限られる。<br />

操作 : if (PR[qp]) {<br />

size = single_form ? 8 : 16;<br />

speculative = (fldtype == ‘s’ || fldtype == ‘sa’);<br />

advanced = (fldtype == ‘a’ || fldtype == ‘sa’);<br />

check_clear = (fldtype == ‘c.clr’);<br />

check_no_clear = (fldtype == ‘c.nc’);<br />

check = check_clear || check_no_clear;<br />

itype = READ;<br />

if (speculative) itype |= SPEC;<br />

if (advanced) itype |= ADVANCE;<br />

if (fp_reg_bank_conflict(f1, f2))<br />

illegal_operation_fault();<br />

if (base_update_form)<br />

check_target_register(r 3 );<br />

fp_check_target_register(f 1 );<br />

fp_check_target_register(f 2 );<br />

if (tmp_isrcode = fp_reg_disabled(f 1, f 2, 0, 0))<br />

disabled_fp_register_fault(tmp_isrcode, itype);<br />

if (!speculative && GR[r 3].nat) // fault on NaT address<br />

register_nat_consumption_fault(itype);<br />

defer = speculative && (GR[r 3].nat || PSR.ed);// defer exception if spec<br />

if (check && alat_cmp(FLOAT, f 1 )) { // no load on ldfp.c & ALAT hit<br />

if (check_clear) // remove entry on ldfp.c.clr<br />

alat_inval_single_entry(FLOAT, f 1 );<br />

} else {<br />

if (!defer) {<br />

paddr = tlb_translate(GR[r 3 ], size, itype, PSR.cpl, &mattr,<br />

&defer);<br />

spontaneous_deferral(paddr, size, UM.be, mattr, UNORDERED,<br />

ldhint, &defer);<br />

if (!defer)<br />

mem_read_pair(&f1_val, &f2_val, paddr, size, UM.be,<br />

mattr, UNORDERED, ldhint);<br />

}<br />

if (check_clear || advanced) // remove any old ALAT entry<br />

alat_inval_single_entry(FLOAT, f 1 );<br />

if (speculative && defer) {<br />

FR[f 1 ] = NATVAL;<br />

FR[f 2 ] = NATVAL;<br />

} else if (advanced && !speculative && defer) {<br />

FR[f 1 ] = (integer_form ? FP_INT_ZERO : FP_ZERO);<br />

FR[f 2 ] = (integer_form ? FP_INT_ZERO : FP_ZERO);<br />

} else { // execute load normally<br />

FR[f 1 ] = fp_mem_to_fr_format(f1_val, size/2, integer_form);<br />

FR[f 2 ] = fp_mem_to_fr_format(f2_val, size/2, integer_form);<br />

}<br />

if ((check_no_clear || advanced) && ma_is_speculative(mattr))<br />

// add entry to ALAT<br />

alat_write(FLOAT, f 1, paddr, size);<br />

3:144 第 3 巻 : 命令リファレンス<br />

ldfp


ldfp<br />

}<br />

}<br />

if (base_update_form) { // update base register<br />

GR[r 3 ] = GR[r 3 ] + size;<br />

GR[r 3].nat = GR[r 3].nat;<br />

if (!GR[r 3 ].nat)<br />

mem_implicit_prefetch(GR[r 3 ], ldhint, itype);<br />

}<br />

fp_update_psr(f 1 );<br />

fp_update_psr(f 2 );<br />

割り込み : 無効操作フ ォ ル ト デー タ ・ ペー ジ不在フ ォ ル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト デー タ NaT ページ参照フォル ト<br />

レジスタ NaT 参照フォルト データ・キー・ ミス・フォルト<br />

実装されていないデータ ・アドレス ・ フォルト データ ・キー許可フォルト<br />

データがネス ト された TLB フォルト データ・アクセス権フォルト<br />

別のデー タ TLB フォルト データ・アクセス・ビット ・フォルト<br />

VHPT データ ・ フォル ト データ ・ デバッグ ・ フォル ト<br />

データ TLB フ ォル ト アライ メン ト の合っていないデー タ参照<br />

フォルト<br />

第 3 巻 : 命令リファレンス 3:145


lfetch ─ ライン・プリフェッチ (Line Prefetch)<br />

lfetch<br />

書式 : (qp) lfetch.lftype.lfhint [r 3 ] no_base_update_form M13<br />

(qp) lfetch.lftype.lfhint [r 3 ], r 2 reg_base_update_form M14<br />

(qp) lfetch.lftype.lfhint [r 3 ], imm 9 imm_base_update_form M15<br />

(qp) lfetch.lftype.excl.lfhint [r 3 ] no_base_update_form, exclusive_form M13<br />

(qp) lfetch.lftype.excl.lfhint [r 3 ], r 2 reg_base_update_form, exclusive_form M14<br />

(qp) lfetch.lftype.excl.lfhint [r 3 ], imm 9 imm_base_update_form, exclusive_form M15<br />

説明 : GR r3 の値で指定されるア ド レスのラインが、 データ ・ メモ リ階層の最上位レベルに移<br />

動される。 lfhint 変更子で メ モ リ ・ ア ク セスの局所性を指定す る。 詳細は、 第 1 巻、 第 1<br />

部の 4.4 節 「メ モ リ ・ ア ク セス命令」 を参照のこ と。 lfhint のニーモニッ ク値を表 2-38 に<br />

示す。<br />

メモリ読み取りの動作は、 アクセスされるページに関連付けられているメモリ属性に<br />

よっても決まる。 詳細は、 第 2 巻、 第 1 部の 4 章 「アド レス指定と保護」 を参照のこ と。<br />

ライン ・サイズはプロセッサに依存するが、 32 バイ ト以上の 2 の倍数でなければな ら な<br />

い。 排他形式では、 キ ャ ッ シ ュ ・ ラ イ ン は排他的状態でマ ー キングで き る。 こ の修飾子<br />

は、 プ ロ グ ラ ムがその ラ イ ン上の特定の メ モ リ 位置をす ぐ に変更す る と 予想す る場合に<br />

使用 さ れる。 その ラ イ ンがあ るペー ジの メ モ リ 属性がキ ャ ッ シング不可能であ る場合は、<br />

参照は行われない。<br />

lftype コ ン プ リ ー タ で、 こ の命令が、 正規の ロ ー ド に通常に関連付け られている フ ォ ル ト<br />

を発生す る か ど う かを指定す る。 表 2-37 に、 それらの 2 つのオプシ ョ ンの定義を示す。<br />

表 2-37. lftype のニーモニック値<br />

lftype ニーモニック 意味<br />

none フォルトを無視する<br />

fault フォルトを発生する<br />

ベース更新形式では、 GR r3 の値がメモ リ のア ド レス指定に使用された後に、 imm9 の符号<br />

拡張値 (imm_base_update_form の場合 ) または GR r2 の値 (reg_base_update_form の場合 ) だ<br />

けインク リ メント される。 reg_base_update_form では、 GR r2 に対応する NaT ビッ トが<br />

セッ ト されている場合は、 GR r3 に対応する NaT ビッ トがセットされて、 フォルトは発生<br />

しない。<br />

reg_base_update_form と imm_base_update_form では、 GR r3 に対応する NaT ビッ トがクリ<br />

ア されている場合は、 ポ ス ト ・ イ ン ク リ メ ン ト 処理後の GR r3 の値に よ っ て指定 さ れる<br />

ア ド レスには、 指定されたキ ャ ッ シ ュ ・ ラインをプ リ フ ェ ッ チする よ う に暗黙的に指示<br />

す る ヒ ン ト の働き があ る。 こ の暗黙指定のプ リ フ ェ ッ チでは、 lfhint によって指定される<br />

局所性 ヒ ン ト を使用す る。 暗黙指定プ リ フ ェ ッ チ と 局所性の ヒ ン ト はプ ロ グ ラ ムの機能<br />

には影響せず、 プログラム ・ コー ドで無視できる。<br />

no_base_update_form では GR r3 の値は変更されず、 この形式にはプ リ フ ェ ッ チ ・ ヒ ン ト<br />

の暗黙的意味 も ない。<br />

GR r3 に対応する NaT ビ ッ ト がセッ ト されている場合は、 メモ リ の状態は影響を受けな<br />

い。 reg_base_update_form と imm_base_update_form では、 GR r3 のポス ト ・ インク リ メン<br />

ト が行われ、 上記の よ う に ヒ ン ト に よ っ てプ リ フ ェ ッ チが指示 さ れる。<br />

lfetch 命令は、 ハ ー ド ウ ェ ア ・ プ リ フ ェ ッ チ と 同様に、 順序付け可能な操作ではない。<br />

すなわ ち、 こ れ ら の命令は、 先行ま たは後続の メ モ リ 操作に対する順序付け を持たない。<br />

3:146 第 3 巻 : 命令リファレンス


lfetch<br />

表 2-38. lfhint のニーモニック値<br />

lfhint ニーモニック 意味<br />

none 時間的局所性、レベル 1<br />

nt1 時間的局所性なし、レベル 1<br />

nt2 時間的局所性なし、レベル 2<br />

nta 時間的局所性なし、全レベル<br />

実装 さ れていないア ド レ ス に対して、 フ ォ ル ト を発生す る lfetch を発行する と、 実装<br />

されていないデータ ・ ア ド レス ・ フ ォル ト が発生する。 実装されていないア ド レスに対<br />

して、 フ ォル ト を発生しない lfetch を発行する と 、 実装されていないデー タ ・ ア ド レ<br />

ス ・ フ ォ ル ト は発生せず、 プ リ フ ェ ッ チ要求 も 発行 さ れない。 ただし、 指定した場合は、<br />

レジスタのポスト ・インクリメントが行われる。<br />

フォルトを発生しない形式のlfetch と フ ォ ル ト を発生す る形式の lfetch はいずれも<br />

スペキ ュ レ ー テ ィ ブに使用でき る。 フ ォ ル ト を発生する形式の lfetch でフォルト を発<br />

生 さ せ る目的は、 ア ド レ ス に関す る問題を オペレ ー テ ィ ン グ ・ シ ス テ ムが迅速に解決で<br />

き る よ う にす る ためである。 ア ド レ ス に関する問題を迅速に解決で き ない と 、 OS はその<br />

ま まプログラムに戻り、 データ ・ プリ フェ ッチを強制的にスキップする。<br />

特に、 フ ォル ト を発生する lfetch が、 リ ス ト に示すフ ォ ル ト ( 無効操作フ ォ ル ト 以外 )<br />

を発生させた場合、 オペレーティング ・ システムは、 迅速に、 かつ割り込まれたプログ<br />

ラ ム に対して透過的に こ の フ ォ ル ト を処理する必要がある。 フ ォ ル ト を迅速かつ透過的<br />

に処理できない場合 ( フ ォ ル ト を処理す る と プ ロ グ ラ ムが終了す る場合な ど )、 OS は割<br />

り込まれたプログラムに戻り、 データ ・ プリ フェ ッチをスキップする必要がある。 これ<br />

を行うのは簡単で、 IPSR.ed ビッ トに1 をセッ ト してから rfi を実行し、 プロセスに戻<br />

れば よい。 これに よ り lfetch.fault は、 ベース ・ レジスタのポス ト ・ イン ク リ メン<br />

ト 処理を実行す る が ( 指定された場合 )、 プリ フェ ッチ要求はどれも抑止されるため、 プ<br />

リフェッチ関連のフォルトも抑止される。 OS は、 フ ォル ト を発生する lfetch がフォ<br />

ルトの原因であったかどうかを容易に識別できる。 その方法としては、 ISR.na が 1 であ<br />

り ISR.code{3:0} が 4 である こ と を観察すれば よ い。 ただし、 無効操作フ ォ ル ト は例外で<br />

ある。 このフォルト は、 ベース ・ レジスタのポス ト ・ インク リ メン ト処理が指定されて<br />

おり、 ベース ・ レジスタが現在のスタック ・ フレームの外部にある、 または GR0 である<br />

場合に、 lfetch.fault によって発生する場合がある。 この1 つのフ ォル ト は、<br />

lfetch.fault のプ リ フ ェ ッ チの側面ではな く 、 ベー ス更新部分に関連してい る。 その<br />

ため、 lfetch.fault の無効操作フ ォ ル ト は、 その他の命令の場合 と 同様に処理する必<br />

要がある。<br />

操作 : if (PR[qp]) {<br />

itype = READ|NON_ACCESS;<br />

itype |= (lftype == ‘fault’) ? LFETCH_FAULT : LFETCH;<br />

if (reg_base_update_form || imm_base_update_form)<br />

check_target_register(r 3 );<br />

if (lftype == ‘fault’) { // faulting form<br />

if (GR[r 3 ].nat && !PSR.ed) // fault on NaT address<br />

register_nat_consumption_fault(itype);<br />

}<br />

excl_hint = (exclusive_form) ? EXCLUSIVE : 0;<br />

if (!GR[r 3 ].nat && !PSR.ed) {// faulting form already faulted if r 3 is nat<br />

paddr = tlb_translate(GR[r 3], 1, itype, PSR.cpl, &mattr, &defer);<br />

if (!defer)<br />

第 3 巻 : 命令リファレンス 3:147


}<br />

}<br />

mem_promote(paddr, mattr, lfhint | excl_hint);<br />

if (imm_base_update_form) {<br />

GR[r 3] = GR[r 3] + sign_ext(imm 9, 9);<br />

GR[r 3 ].nat = GR[r 3 ].nat;<br />

} else if (reg_base_update_form) {<br />

GR[r 3 ] = GR[r 3 ] + GR[r 2 ];<br />

GR[r 3 ].nat = GR[r 2 ].nat || GR[r 3 ].nat;<br />

}<br />

if ((reg_base_update_form || imm_base_update_form) && !GR[r 3 ].nat)<br />

mem_implicit_prefetch(GR[r 3 ], lfhint | excl_hint, itype);<br />

割り込み : 無効操作フ ォ ル ト デー タ ・ ペー ジ不在フ ォ ル ト<br />

レジスタ NaT 参照フ ォ ル ト デー タ NaT ページ参照フォル ト<br />

実装されていないデータ・アドレス・フォルト データ・キー・ミス・フォルト<br />

データがネス ト された TLB フォルト データ・キー許可フォルト<br />

別のデー タ TLB フォルト データ・アクセス権フォルト<br />

VHPT データ ・ フォル ト データ ・ アクセス ・ ビッ ト ・ フォル ト<br />

データ TLB フォルト データ・デバッグ・フォルト<br />

lfetch<br />

3:148 第 3 巻 : 命令リファレンス


loadrs<br />

loadrs ─ レジスタ・スタックのロード (Load Register Stack)<br />

書式 : loadrs M25<br />

説明 : こ の命令は、 現在の BSP より下位の指定したバイト数( レジスタ値または NaT コレク<br />

ション、 あるいはその両方) が、 バッキング ・ ス トアから、 スタ ッ ク された汎用レジス<br />

タにロード されるようにする。 ロード されたレジスタは、 レジスタ ・スタックのダー<br />

ティ ・パーティションに格納される。 その他のすべてのスタックされた汎用レジスタは、<br />

バッキング ・ ストアにセーブされず、 無効としてマークされる。<br />

ロード されるバイト数は、 RSC アプ リ ケーシ ョ ン ・ レジスタのサブフ ィ ール ド<br />

(RSC.loadrs) で指定される。 バ ッ キング ・ ス ト アのア ド レ スは、 常に 8 バイ ト にアライメ<br />

ントが合わされるため、 loadrs フィールドの下位3ビッ ト (RSC.loadrs{2:0}) は無視さ<br />

れる。 RSC.loadrs を 0 に設定して こ の命令を使用する と 、 現在のフ レ ー ムの外部のス<br />

タ ッ ク さ れた レ ジ ス タ をすべて無効化で き る。<br />

こ の命令は、 以下のいずれかの条件で、 無効操作フ ォ ル ト を発生す る。<br />

• RSE が強制レ イ ジ ー ・ モー ド にな っ ていない (RSC.mode が 0 以外の値であ る )。<br />

• CFM.sof と RSC.loadrs が両方と も 0 以外の値であ る。<br />

• スタ ッ ク された物理レ ジスタ ・ フ ァ イル内で使用可能な数を超え る レ ジスタ をロ ー<br />

ドしようとした。<br />

こ の命令は、 命令グル ー プ内の最初の命令でなければな ら ない。 さ ら に、 こ の命令は、<br />

命令ス ロ ッ ト 0 またはスロッ ト 0 の後にス ト ッ プ情報がある テンプレ ー ト の命令ス ロ ッ<br />

ト 1 のいずれかに入っていなければならない。 そ う でない場合は、 結果は不定である。<br />

こ の命令に はプ レ デ ィ ケ ー ト を使用で き ない。<br />

操作 : if (AR[RSC].mode != 0)<br />

illegal_operation_fault();<br />

if ((CFM.sof != 0) && (AR[RSC].loadrs != 0))<br />

illegal_operation_fault();<br />

rse_ensure_regs_loaded(AR[RSC].loadrs);// can raise faults listed below<br />

AR[RNAT] = undefined();<br />

割り込み : 無効操作フ ォ ル ト デー タ NaT ページ参照フォル ト<br />

実装されていないデータ・アドレス・フォルト データ・キー・ミス・フォルト<br />

データがネス ト された TLB フォルト データ・キー許可フォルト<br />

別のデー タ TLB フォルト データ・アクセス権フォルト<br />

VHPT データ ・ フォル ト データ ・ アクセス ・ ビッ ト ・ フォル ト<br />

データ TLB フォルト データ・デバッグ・フォルト<br />

データ ・ ページ不在フォルト<br />

第 3 巻 : 命令リファレンス 3:149


mf ─ メモリ・フェンス (Memory Fence)<br />

書式 : (qp) mf ordering_form M24<br />

(qp) mf.a acceptance_form M24<br />

説明 : こ の命令は、 先行 と 後続の メ モ リ ・ ア ク セスの間の順序付け を強制する。 ordering_form<br />

では、 先行す る すべてのデ ー タ ・ メ モ リ ・ ア ク セスが参照可能にな っ てか ら 、 後続の<br />

デ ー タ ・ メ モ リ ・ ア ク セスが参照可能にな る こ と が保証 さ れる。 こ の形式では、 先行す<br />

る デー タ ・ メ モ リ 参照が外部プ ラ ッ ト フ ォ ー ム に受け入れ ら れた ど う か、 さ ら に、 先行<br />

す る デ ー タ ・ メ モ リ 参照が検出可能であ る か ど う かは保証 さ れない。<br />

acceptance_form では、 以下の処置が終了する ま で、 プロセ ッ サに よ る後続のデー タ ・ メ<br />

モ リ ・ ア ク セス に よ っ て外部プ ラ ッ ト フ ォ ー ムへの ト ラ ンザ ク シ ョ ン を開始す る のを禁<br />

止する。<br />

• シーケンシャルなページに対するすべての先行するロードが、 データを返した。<br />

• シーケンシャルなページに対するすべての先行するストアが、 外部プラット フォー<br />

ムによ って受け入れられた。<br />

「受け入れ」 の定義はプ ラ ッ ト フ ォ ー ム に よ っ て異な る。 acceptance_form は、 一般的に、<br />

プロセッサが、 メモリ ・ マップド IO トランザクションが 「受け入れられる」 まで 「待っ<br />

て」 か ら 、 次の外部 ト ラ ンザ ク シ ョ ン を開始す る よ う に保証す る場合に使用 さ れる。<br />

acceptance_form では、 順序付け を保証していない。 ま た、 シ ー ケ ン シ ャ ルなペー ジ以外<br />

のメモリ ・ エリアへの受け入れも保証されない。<br />

操作 : if (PR[qp]){<br />

if (acceptance_form)<br />

acceptance_fence();<br />

else // ordering_form<br />

ordering_fence();<br />

}<br />

割り込み : なし<br />

3:150 第 3 巻 : 命令リファレンス<br />

mf


mix<br />

mix ─ ミックス (Mix)<br />

書式 : (qp) mix1.l r 1 = r 2 , r 3 one_byte_form, left_form I2<br />

(qp) mix2.l r 1 = r 2 , r 3 two_byte_form, left_form I2<br />

(qp) mix4.l r 1 = r 2 , r 3 four_byte_form, left_form I2<br />

(qp) mix1.r r 1 = r 2 , r 3 one_byte_form, right_form I2<br />

(qp) mix2.r r 1 = r 2 , r 3 two_byte_form, right_form I2<br />

(qp) mix4.r r 1 = r 2 , r 3 four_byte_form, right_form I2<br />

説明 : GR r 2 および r 3 のデ ー タ要素が図 2-25 に示すよ う に ミ ッ ク スされ、 その結果が GR r 1 に<br />

格納 さ れる。 両方の ソ ー ス ・ レ ジ ス タ内の ソ ー ス ・ オペラ ン ド は、 1、 2、 あるいは 4 対<br />

のグループに分けられ、 各ペアから 1 要素ずつ選択 さ れて結果に組み込 ま れる。<br />

left_form では、 各ペアの左側要素か ら ミ ッ ク ス さ れる。 right_form では、 結果は各右側<br />

要素か ら 形成 さ れる。 要素は 2 つの ソ ー ス ・ レ ジ ス タ か ら 交互に選択 さ れる。<br />

第 3 巻 : 命令リファレンス 3:151


図 2-25. ミックスの例<br />

GR r 2 :<br />

GR r 2 :<br />

GR r 2 :<br />

GR r 2 :<br />

GR r 2 :<br />

GR r 2 :<br />

mix1.l<br />

mix1.r<br />

mix2.l<br />

mix2.r<br />

mix4.l<br />

mix4.r<br />

GR r 1 :<br />

GR r 1 :<br />

GR r 1 :<br />

GR r 1 :<br />

GR r 1 :<br />

GR r 1 :<br />

3:152 第 3 巻 : 命令リファレンス<br />

GR r 3 :<br />

GR r 3 :<br />

GR r 3 :<br />

GR r 3 :<br />

GR r 3 :<br />

GR r 3 :<br />

mix


mix<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1);<br />

}<br />

割り込み : 無効操作フ ォ ル ト<br />

if (one_byte_form) { // one-byte elements<br />

x[0] = GR[r 2]{7:0}; y[0] = GR[r 3]{7:0};<br />

x[1] = GR[r 2 ]{15:8}; y[1] = GR[r 3 ]{15:8};<br />

x[2] = GR[r 2 ]{23:16};y[2] = GR[r 3 ]{23:16};<br />

x[3] = GR[r 2 ]{31:24};y[3] = GR[r 3 ]{31:24};<br />

x[4] = GR[r 2 ]{39:32};y[4] = GR[r 3 ]{39:32};<br />

x[5] = GR[r 2 ]{47:40};y[5] = GR[r 3 ]{47:40};<br />

x[6] = GR[r 2 ]{55:48};y[6] = GR[r 3 ]{55:48};<br />

x[7] = GR[r 2 ]{63:56};y[7] = GR[r 3 ]{63:56};<br />

if (left_form)<br />

GR[r 1 ] = concatenate8(x[7], y[7], x[5], y[5],<br />

x[3], y[3], x[1], y[1]);<br />

else // right_form<br />

GR[r 1 ] = concatenate8(x[6], y[6], x[4], y[4],<br />

x[2], y[2], x[0], y[0]);<br />

} else if (two_byte_form) { // two-byte elements<br />

x[0] = GR[r 2 ]{15:0}; y[0] = GR[r 3 ]{15:0};<br />

x[1] = GR[r 2 ]{31:16};y[1] = GR[r 3 ]{31:16};<br />

x[2] = GR[r 2 ]{47:32};y[2] = GR[r 3 ]{47:32};<br />

x[3] = GR[r 2 ]{63:48};y[3] = GR[r 3 ]{63:48};<br />

if (left_form)<br />

GR[r 1 ] = concatenate4(x[3], y[3], x[1], y[1]);<br />

else // right_form<br />

GR[r 1 ] = concatenate4(x[2], y[2], x[0], y[0]);<br />

} else { // four-byte elements<br />

x[0] = GR[r 2 ]{31:0}; y[0] = GR[r 3 ]{31:0};<br />

x[1] = GR[r 2]{63:32};y[1] = GR[r 3]{63:32};<br />

if (left_form)<br />

GR[r1] = concatenate2(x[1], y[1]);<br />

else // right_form<br />

GR[r1 ] = concatenate2(x[0], y[0]);<br />

}<br />

GR[r1 ].nat = GR[r2 ].nat || GR[r3 ].nat;<br />

第 3 巻 : 命令リファレンス 3:153


mov ─ アプリケーション・レジスタの移動 (Move Application Register)<br />

mov ar<br />

書式 : (qp) movr1 = ar3 擬似オペ コ ー ド<br />

(qp) movar3 = r2 擬似オペ コ ー ド<br />

(qp) movar3 = imm8 擬似オペ コ ー ド<br />

(qp) mov.ir1 = ar3 i_form, from_form I28<br />

(qp) mov.iar3 = r2 i_form, register_form, to_form I26<br />

(qp) mov.iar3 = imm8 i_form, immediate_form, to_form I27<br />

(qp) mov.mr1 = ar3 m_form, from_form M31<br />

(qp) mov.mar3 = r2 m_form, register_form, to_form M29<br />

(qp) mov.mar3 = imm8 m_form, immediate_form, to_form M30<br />

説明 : ソース・オペランドがデスティネーション・レジスタにコピーされる。<br />

from_form では、 ar3 レジスタによって指定されるアプリケーション ・ レジスタがGR r1 にコピーされ、 対応する NaT ビッ トがクリアされる。<br />

to_form では、 GR r2 の値 (register_form の場合 )、 あるいは imm8 の符号拡張された値<br />

(immediate_form の場合 ) が AR ar3 に格納される。 register_form では、 GR r2 に対応する<br />

NaT ビッ トがセットされている場合は、 レジスタNaT 参照 (Register NaT Consumption)<br />

フォルトが発生する。<br />

各実行ユニ ッ ト (M または I) からは、 それぞれアプリケーション ・ レジスタの特定のサ<br />

ブセッ ト に対してしかアクセスできない。 第 1 巻、 第 1 部の表 3-3 に、 どの実行ユニッ<br />

ト・タイプからどのアプリケーション・レジスタにアクセスできるかを示している。間<br />

違 っ たユニ ッ ト ・ タ イ プか ら アプ リ ケ ー シ ョ ン ・ レ ジ ス タ にア ク セス さ れる と 、 無効操<br />

作 (Illegal Operation) フォルトが発生する。<br />

この命令には、 擬似オペコ ー ド が対応していて、 したがって実行ユニッ ト を指定する必<br />

要がない形式が 3 つある。 AR へのア ク セス は常に暗黙的にシ リ アル化 さ れる。 暗黙的<br />

にシ リ アル化が行われる と き は、 リ ー ド ・ アフ タ ー ・ ラ イ ト の依存関係違反 と ラ イ ト ・<br />

ア フ タ ー ・ ラ イ ト の依存関係違反は避けなければな ら ない。 例えば、 同一命令グルー プ<br />

内で CCV を設定してから cmpxchg 命令を使用した り 、 ld.fill 命令に よ る UNAT レ<br />

ジスタへの書き込みと UNAT への移動を同時に行 っ た り する こ と な ど が挙げ ら れる。<br />

3:154 第 3 巻 : 命令リファレンス


mov ar<br />

操作 : if (PR[qp]) {<br />

tmp_type = (i_form ? AR_I_TYPE : AR_M_TYPE);<br />

if (is_reserved_reg(tmp_type, ar 3 ))<br />

illegal_operation_fault();<br />

}<br />

if (from_form) {<br />

check_target_register(r 1 );<br />

if (((ar 3 == BSPSTORE) || (ar 3 == RNAT)) && (AR[RSC].mode != 0))<br />

illegal_operation_fault();<br />

if (ar 3 == ITC && PSR.si && PSR.cpl != 0)<br />

privileged_register_fault();<br />

GR[r 1 ] = (is_ignored_reg(ar 3 )) ? 0 : AR[ar 3 ];<br />

GR[r 1 ].nat = 0;<br />

} else { // to_form<br />

tmp_val = (register_form) ? GR[r 2 ] : sign_ext(imm 8 , 8);<br />

}<br />

if (is_read_only_register(AR_TYPE, ar 3 ) ||<br />

(((ar 3 == BSPSTORE) || (ar 3 == RNAT)) && (AR[RSC].mode != 0)))<br />

illegal_operation_fault();<br />

if (register_form && GR[r 2 ].nat)<br />

register_nat_consumption_fault(0);<br />

if (is_reserved_field(AR_TYPE, ar 3 , tmp_val))<br />

reserved_register_field_fault();<br />

if ((is_kernel_reg(ar 3 ) || ar 3 == ITC) && (PSR.cpl != 0))<br />

privileged_register_fault();<br />

if (!is_ignored_reg(ar 3 )) {<br />

tmp_val = ignored_field_mask(AR_TYPE, ar 3 , tmp_val);<br />

// check for illegal promotion<br />

if (ar 3 == RSC && tmp_val{3:2} u< PSR.cpl)<br />

tmp_val{3:2} = PSR.cpl;<br />

AR[ar 3] = tmp_val;<br />

}<br />

if (ar 3 == BSPSTORE) {<br />

AR[BSP] = rse_update_internal_stack_pointers(tmp_val);<br />

AR[RNAT] = undefined();<br />

}<br />

割り込み : 無効操作フ ォル ト 予約レジスタ / フィールド ・フォルト<br />

レジスタ NaT 参照フ ォ ル ト 特権レ ジ ス タ ・ フ ォ ル ト<br />

第 3 巻 : 命令リファレンス 3:155


mov ─ 分岐レジスタの移動 (Move Branch Register)<br />

mov br<br />

書式 : (qp) movr1 = b2 from_form I22<br />

(qp) movb1 = r2 擬似オペ コ ー ド<br />

(qp) mov.mwh.ih b1 = r2 , tag13 to_form I21<br />

(qp) mov.ret.mwh.ih b1 = r2 , tag13 return_form, to_form I21<br />

説明 : ソース・オペランドがデスティネーション・レジスタにコピーされる。<br />

from_form では、 b2 によって指定される分岐レジスタがGR r1 にコピーされる。 GR r1 に<br />

対応す る NaT ビッ トがクリアされる。<br />

to_form では、 GR r2 の値が BR b1 にコピーされる。 GR r2 に対応する NaT ビッ トが1 で<br />

ある場合は、 レジスタ NaT 参照 (Register NaT Consumption) フォルトが発生する。<br />

分岐レ ジ ス タ に移動す る と き、 一連の ヒ ン ト も 指定で き る。 こ れ ら の ヒ ン ト は、 brp 命<br />

令で指定される ヒ ン ト に非常に よ く 似てお り、 BR b1 に移動 さ れる値を使用する可能性<br />

がある将来の分岐に関する予測情報を提供する。 return_form を使用して、 この値が リ<br />

タ ー ン型分岐で使用 さ れる ヒ ン ト を指定で き る。<br />

表 2-39 に、 mwh 分岐有無予測 ヒ ン ト の コ ン プ リ ー タ の値を示す。 ih ヒントのコンプリー<br />

タ は、 分岐予測命令の説明 と 、 3:28 ページの表 2-13 を参照のこ と。<br />

表 2-39. BR への移動の分岐有無予測ヒント<br />

mwh コンプリータ BR への移動の分岐有無予測ヒント<br />

none すべてのヒントを無視する<br />

sptk 静的に処理される<br />

dptk 動的<br />

ヒ ン ト 情報が指定 さ れない場合に汎用レ ジ ス タ を分岐レ ジ ス タ に コ ピ ー す る ための疑似<br />

オペコ ー ド が用意されている。 この疑似オペコ ー ド をエンコ ー ド するには、 tag 13 には 0、<br />

ヒント ・ コンプリータには none に対応する値を使用する。<br />

操作 : if (PR[qp]) {<br />

if (from_form) {<br />

check_target_register(r 1 );<br />

GR[r 1 ] = BR[b 2 ];<br />

GR[r 1].nat = 0;<br />

} else { // to_form<br />

tmp_tag = IP + sign_ext((timm 9


mov cr<br />

mov ─ コントロール・レジスタの移動 (Move Control Register)<br />

書式 : (qp) movr 1 = cr 3 from_form M33<br />

(qp) movcr 3 = r 2 to_form M32<br />

説明 : ソース・オペランドがデスティネーション・レジスタにコピーされる。<br />

from_form では、 cr3 で指定されるコン ト ロール ・ レジスタが読み込まれ、 その値が GR<br />

r1 にコピーされる。<br />

to_form では、 GR r2 が読み込まれ、 その値が CR cr3 にコピーされる。<br />

コ ン ト ロ ー ル ・ レ ジ ス タ には、 最高の特権レベル以外ではア ク セスで き ない。 PSR.ic<br />

ビッ トが1 の場合、 割 り 込み コ ン ト ロ ー ル ・ レ ジ ス タ (CR16 ~ CR25) の読み込み ま たは<br />

書き込みを行 う と 、 無効操作フ ォ ル ト が発生す る。<br />

操作 : if (PR[qp]) {<br />

if (is_reserved_reg(CR_TYPE, cr 3 )<br />

|| to_form && is_read_only_reg(CR_TYPE, cr 3 )<br />

|| PSR.ic && is_interruption_cr(cr 3 ))<br />

{<br />

illegal_operation_fault();<br />

}<br />

}<br />

if (from_form)<br />

check_target_register(r 1 );<br />

if (PSR.cpl != 0)<br />

privileged_operation_fault(0);<br />

if (from_form) {<br />

if (cr 3 == IVR)<br />

check_interrupt_request();<br />

if (cr 3 == ITIR)<br />

GR[r 1 ] = impl_itir_cwi_mask(CR[ITIR]);<br />

else<br />

GR[r 1 ] = CR[cr 3 ];<br />

GR[r 1 ].nat = 0;<br />

} else { // to_form<br />

if (GR[r 2 ].nat)<br />

register_nat_consumption_fault(0);<br />

}<br />

if (is_reserved_field(CR_TYPE, cr 3 , GR[r 2 ]))<br />

reserved_register_field_fault();<br />

if (cr 3 == EOI)<br />

end_of_interrupt();<br />

tmp_val = ignored_field_mask(CR_TYPE, cr 3 , GR[r 2 ]);<br />

CR[cr 3 ] = tmp_val;<br />

if (cr 3 == IIPA)<br />

last_IP = tmp_val;<br />

割り込み : 無効操作フ ォ ル ト レ ジ ス タ NaT 参照フ ォ ル ト<br />

特権操作フ ォル ト 予約レジスタ / フィールド ・フォルト<br />

第 3 巻 : 命令リファレンス 3:157


mov cr<br />

シリアル化 : コン ト ロール ・ レジスタの読み込みは、 すべての先行する命令グループ と割り込みの結<br />

果を反映する。<br />

一般的に、 コン ト ロ ール ・ レジスタへの書き込みは、 ただちに後続の命令に影響を与え<br />

る わけではない。 ソ フ ト ウ ェ アは、 変更された リ ソ ー ス に依存する命令がその リ ソ ー ス<br />

を使用する前に、 シ リ アル化操作を発行しなければならない。<br />

コント ロール・ レジスタへの書き込みは、 それに対応するコントロール・ レジスタの読<br />

み込み と 暗黙的に同期化 さ れる わけではない。 コ ン ト ロ ー ル ・ レ ジ ス タ への書き込みに<br />

は、 デ ー タ のシ リ アル化操作が必要であ る。<br />

3:158 第 3 巻 : 命令リファレンス


mov fr<br />

mov ─ 浮動小数点レジスタの移動 (Move Floating-point Register)<br />

書式 : (qp) movf 1 = f 3 (qp) fmerge.sf 1 = f 3 , f 3 の擬似オペコ ー ド<br />

説明 : FR f 3 の値が FR f 1 にコピーされる。<br />

操作 : 3:72 ページの 「fmerge — 浮動小数点マ ー ジ (Floating-point Merge)」 を参照のこ と。<br />

第 3 巻 : 命令リファレンス 3:159


mov ─ 汎用レジスタの移動 (Move General Register)<br />

書式 : (qp) movr 1 = r 3 (qp) addsr 1 = 0, r 3 の擬似オペコ ー ド<br />

説明 : GR r 3 の値が GR r 1 にコピーされる。<br />

操作 : 3:11 ページの 「add — 加算 (Add)」 を参照の こ と 。<br />

mov gr<br />

3:160 第 3 巻 : 命令リファレンス


mov imm<br />

mov ─ 即値の移動 (Move Immediate)<br />

書式 : (qp) movr 1 = imm 22 (qp) addlr 1 = imm 22 , r0 の擬似オペコ ー ド<br />

説明 : 即値 imm 22 が 64 ビ ッ ト に符号拡張 さ れ、 GR r 1 に格納される。<br />

操作 : 3:11 ページの 「add — 加算 (Add)」 を参照の こ と 。<br />

第 3 巻 : 命令リファレンス 3:161


mov ─ 間接レジスタの移動 (Move Indirect Register)<br />

mov indirect<br />

書式 : (qp) movr 1 = ireg[r 3 ] from_form M43<br />

(qp) movireg[r 3 ] = r 2 to_form M42<br />

説明 : ソース・オペランドがデスティネーション・レジスタにコピーされる。<br />

間接レ ジ ス タ か ら の移動では、 GR r3 が読み込まれ、 その値が、 ireg で指定される レ ジス<br />

タ・ファイル ( 下の表 2-40 を参照 ) へのインデ ッ ク ス と して使用される。 インデ ッ ク ス<br />

されたレ ジスタが読み込まれ、 その値が GR r1 にコピーされる。<br />

間接レ ジ ス タ への移動では、 GR r3 が読み込まれ、 その値が、 iregde で指定される レ ジス<br />

タ・ファイルへのインデックスとして使用される。 GR r2 が読み込まれ、 その値が、 イ<br />

ンデッ クスを付けられたレジスタにコピー される。<br />

表 2-40. 間接レジスタ・ファイルのニーモニック<br />

ireg レジスタ・ファイル<br />

cpuid プロセッサ識別 (PI) レジスタ<br />

dbr データ・ブレークポイント (DB) レジスタ<br />

ibr 命令ブレークポイント (IB) レジスタ<br />

pkr 保護キー (PK) レジスタ<br />

pmc パフォーマンス監視設定 (PMC) レジスタ<br />

pmd パフォーマンス・モニタ・データ (PMD) レジスタ<br />

rr リージョン (R) レジスタ<br />

リ ー ジ ョ ン ・ レ ジ ス タ以外のすべての レ ジ ス タ ・ フ ァ イ ルでは、 GR r3 のビッ ト {7:0} が<br />

インデッ クスとして使用される。 リ ージョン ・ レジスタでは、 ビッ ト {63:61} が使用さ<br />

れる。 その他のビッ ト は無視される。<br />

命令ブレークポイント ・レジスタ、 データ・ブレークポイント ・レジスタ、 パフォーマ<br />

ンス監視設定レジスタ、 保護キー ・ レジスタ、 リージョン ・ レジスタは、 最高の特権レ<br />

ベル以外ではア ク セスで き ない。 パ フ ォ ーマンス監視デー タ ・ レ ジ ス タ は、 最高の特権<br />

レベル以外では書き込めない。<br />

CPU 識別レ ジ ス タ には、 読み込み以外は実行で き ない。 こ の命令には to_form が存在し<br />

ない。<br />

保護キ ー ・ レ ジ ス タ への移動では、 プ ロ セ ッ サは、 すべての保護キ ー ・ レ ジ ス タ に対し<br />

て新しい有効な保護キ ー をチ ェ ッ ク する と 、 保護キ ー の独自性を保証す る。 一致する<br />

キ ーが見つか っ た場合は、 重複する保護キ ー は無効に される。<br />

PMC レジスタ ・ ファイルと PMD レジスタ ・ ファイルを除いて、 存在しないレジスタに<br />

アクセスすると、 予約レジスタ / フィールド (Reserved Register/Field) フォルトが発生す<br />

る。 PMC レジスタ ・ ファイルと PMD レ ジ ス タ ・ フ ァ イ ルのプ ロ セ ッ サ依存部分へのア<br />

ク セスはすべて、 プロセ ッ サに よ って異なる動作を生じ るが、 フ ォ ル ト は発生しない。<br />

以下のいずれかの変換に使用 さ れている、 リ ー ジ ョ ン ・ レ ジ ス タ ま たは保護キ ー ・ レ ジ<br />

ス タ を修正した場合の動作は不定である。<br />

• 実行中の命令ス ト リ ー ム (PSR.it==1 の場合 )<br />

• RSE による次の参照のためのデータ空間(PSR.rt==1 の場合 )<br />

3:162 第 3 巻 : 命令リファレンス


mov indirect<br />

操作 : if (PR[qp]) {<br />

if (ireg == RR_TYPE)<br />

tmp_index = GR[r 3 ]{63:61};<br />

else // all other register types<br />

tmp_index = GR[r 3]{7:0};<br />

}<br />

if (from_form) {<br />

check_target_register(r 1 );<br />

if (PSR.cpl != 0 && !(ireg == PMD_TYPE || ireg == CPUID_TYPE))<br />

privileged_operation_fault(0);<br />

if (GR[r 3 ].nat)<br />

register_nat_consumption_fault(0);<br />

if (is_reserved_reg(ireg, tmp_index))<br />

reserved_register_field_fault();<br />

if (ireg == PMD_TYPE) {<br />

if ((PSR.cpl != 0) && ((PSR.sp == 1) ||<br />

(tmp_index > 3 &&<br />

tmp_index


mov indirect<br />

割り込み : 無効操作フ ォ ル ト レ ジ ス タ NaT 参照フ ォ ル ト<br />

特権操作フ ォル ト 予約レジスタ / フィールド ・フォルト<br />

シリアル化 : データ ・ ブレ ー ク ポイン ト ・ レジスタへの移動では、 ソフ ト ウ ェアは、 変更されたレジ<br />

ス タ に依存す る メ モ リ 参照を発行す る前に、 デ ー タ のシ リ アル化操作を発行しなければ<br />

ならない。<br />

命令ブ レ ー ク ポ イ ン ト ・ レ ジ ス タ への移動では、 ソ フ ト ウ ェ アは、 変更 さ れたレ ジ ス タ<br />

に依存する命令をフ ェ ッ チする前に、 命令のシ リ アル化操作を発行しなければなら ない。<br />

保護キ ー ・ レ ジ ス タ、 リ ー ジ ョ ン ・ レ ジ ス タ、 パ フ ォ ー マンス監視設定レ ジ ス タ、 お よ<br />

びパ フ ォ ー マン ス監視デー タ ・ レ ジ ス タ への移動では、 ソ フ ト ウ ェ アは、 変更 さ れたレ<br />

ジ ス タ に依存す る命令を発行する前に、 命令 ま たはデ ー タ のシ リ アル化操作を発行して、<br />

変更を検出でき る よ う にしなければならない。<br />

ソ フ ト ウ ェアは、 精度を向上させるために、 パフ ォ ーマンス監視レ ジスタ を読み込む前<br />

に、 命令ま たはデー タのシ リ アル化操作を発行する こ と がで き る。<br />

3:164 第 3 巻 : 命令リファレンス


mov ip<br />

mov ─ 命令ポインタの移動 (Move Instruction Pointer)<br />

書式 : (qp) movr 1 = ip I25<br />

説明 : この命令があるバンドルの命令ポインタ (IP) が GR r 1 にコピーされる。<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1 );<br />

}<br />

GR[r 1] = IP;<br />

GR[r 1 ].nat = 0;<br />

割り込み : 無効操作フ ォ ル ト<br />

第 3 巻 : 命令リファレンス 3:165


mov ─ プレディケートの移動 (Move Predicates)<br />

mov pr<br />

書式 : (qp) movr 1 = pr from_form I25<br />

(qp) mov pr = r 2 , mask 17 to_form I23<br />

(qp) mov pr.rot = imm 44 to_rotate_form I24<br />

説明 : ソース・オペランドがデスティネーション・レジスタにコピーされる。<br />

GR へのプ レ デ ィ ケ ー ト の移動では、 PR i が GR r1 内のビ ッ ト 位置 i にコピーされる。<br />

プレデ ィ ケー ト への移動では、 ソ ースには汎用レジスタ と即値が使用でき る。 to_form で<br />

は、 ソ ース ・ オペラン ド は GR r2 であり、 即値 mask17 で指定されるプレデ ィ ケー ト だけ<br />

が書き込まれる。 mask17 の値は、 imm16 = mask17 >> 1 になる よ う に命令内で imm16 フ ィ ールド にエンコー ド される。 プレディ ケー ト ・ レジスタ 0 は常に 1 である。 mask17 の値は符号拡張 される。 したが っ て、 mask17 の最上位ビ ッ ト は ロ ー テ ー ト ・ プレデ ィ<br />

ケー トのすべてに対するマスク ・ ビッ トである。 GR r2 に対してデフ ァ ー ド ( 据え置き )<br />

例外が存在していた (NaT ビッ トが1) 場合は、 レ ジ ス タ NaT 参照 (Register NaT<br />

Consumption) フォルトが発生する。<br />

to_rotate_form では、 48 のローテー ト ・ プレディ ケー ト しか書けない。 ソース ・ オペラン<br />

ドはmask44 オペラン ド で与えられる ( 命令内では、 mask28 = imm44 >> 16 になる よ うに、<br />

imm28 フィールドにエンコードされる)。 下位16 ビッ トはスタティックなプレディケー<br />

ト ・ レ ジ ス タ に対応す る。 こ の即値が符号拡張されて、 上位 21 のプレデ ィ ケー ト を設定<br />

する。 ソース ・ オペランドのビッ ト位置i が PR i にコピーされる。<br />

この命令の操作は、 現在のフレーム ・マーカ (CFM.rrb.pr) 内のプレデ ィ ケ ー ト ・ ロ ー<br />

テーション ・ベースがゼロであった場合と同様になる。<br />

操作 : if (PR[qp]) {<br />

if (from_form) {<br />

check_target_register(r 1 );<br />

GR[r 1 ] = 1; // PR[0] is always 1<br />

for (i = 1; i


mov psr<br />

mov ─ プロセッサ・ステータス・レジスタの移動<br />

(Move Processor Status Register)<br />

書式 : (qp) movr 1 = psr from_form M36<br />

(qp) mov psr.l = r 2 to_form M35<br />

説明 : ソース・オペランドがデスティネーション・レジスタにコピーされる。 詳細は、 第 2 巻、<br />

第 1 部の 3.3.2 項 「プロセッサ ・ ステータス ・ レジスタ (PSR)」 を参照のこ と。<br />

プロセッサ ・ ステータス ・ レジスタからの移動では、 PSR のビ ッ ト {36:35} および<br />

{31:0} が読み込まれ、 GR r1 にコピーされる。 PSR のその他のビ ッ ト は、 すべて 0 とし<br />

て読み込まれる。<br />

プ ロ セ ッ サ ・ ス テ ー タ ス ・ レ ジ ス タ への移動では、 GR r2 が読み込まれ、 ビ ッ ト {31:0}<br />

が PSR{31:0} にコピーされ、 ビッ ト {45:32} は無視される。 PSR の予約フ ィ ール ド に対<br />

応する GR r2 のすべてのビ ッ ト は、 0 になっていなければならない。 そ うでない場合は、<br />

予約レ ジ ス タ / フィールド ・フォルトが発生する。<br />

PSR への移動と PSR か ら の移動は、 最高の特権レベル以外では実行できない。<br />

PSR.ic ビ ッ ト が イ ネ ー ブルに されてか ら 後続の命令のシ リ アル化操作が発行 さ れる ま で<br />

の間に割 り 込みが発生した場合、 (PSR.ic ビッ トが1 の場合に上書き される ) 割り込みリ<br />

ソ ー スの内容は不定にな る。<br />

操作 : if (PR[qp]) {<br />

if (from_form)<br />

check_target_register(r 1 );<br />

if (PSR.cpl != 0)<br />

privileged_operation_fault(0);<br />

}<br />

if (from_form) {<br />

tmp_val = zero_ext(PSR{31:0}, 32); // read lower 32 bits<br />

tmp_val |= PSR{36:35}


mov ─ ユーザ・マスクの移動 (Move User Mask)<br />

mov um<br />

書式 : (qp) movr 1 = psr.um from_form M36<br />

(qp) mov psr.um = r 2 to_form M35<br />

説明 : ソース・オペランドがデスティネーション・レジスタにコピーされる<br />

ユ ーザ ・ マス ク か ら の移動では、 PSR {5:0} が読み込まれ、 ゼロ拡張されて、 GR r1 にコ<br />

ピーされる。<br />

ユーザ ・ マスクへの移動では、 GR r2 のビッ ト {5:0} が PSR {5:0} に書き込まれる。<br />

PSR.up を変更で き る のは、 機密保護パ フ ォ ー マン ス監視ビ ッ ト (PSR.sp) が 0 の場合に限<br />

ら れる。 それ以外の場合は、 PSR.up は変更されない。<br />

PSR の他の部分にゼロでない値を書き込むと、 予約レジスタ / フィールド ・フォルトが<br />

発生す る。<br />

操作 : if (PR[qp]) {<br />

if (from_form) {<br />

check_target_register(r 1);<br />

}<br />

GR[r 1 ] = zero_ext(PSR{5:0}, 6);<br />

GR[r 1].nat = 0;<br />

} else { // to_form<br />

if (GR[r 2 ].nat)<br />

register_nat_consumption_fault(0);<br />

}<br />

if (is_reserved_field(PSR_TYPE, PSR_UM, GR[r 2 ]))<br />

reserved_register_field_fault();<br />

PSR{1:0} = GR[r 2 ]{1:0};<br />

if (PSR.sp == 0) // unsecured perf monitor<br />

PSR{2} = GR[r 2 ]{2};<br />

PSR{5:3} = GR[r 2 ]{5:3};<br />

割り込み : 無効操作フ ォル ト 予約レジスタ / フィールド ・フォルト<br />

レジスタ NaT 参照フ ォ ル ト<br />

シリアル化 : すべてのユーザ ・ マスクの変更は、 次の命令グループによ って検出される。<br />

3:168 第 3 巻 : 命令リファレンス


movl<br />

movl ─ ロング型即値の移動 (Move Long Immediate)<br />

書式 : (qp) movlr 1 = imm 64 X2<br />

説明 : 即値 imm 64 が GR r 1 にコピーされる。 バンドルのL スロッ トに imm 64 の 41 ビッ トが入<br />

る。<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1 );<br />

}<br />

GR[r 1] = imm 64;<br />

GR[r 1 ].nat = 0;<br />

割り込み : 無効操作フ ォ ル ト<br />

第 3 巻 : 命令リファレンス 3:169


mux ─ 置換 (Mux)<br />

書式 : (qp) mux1r 1 = r 2 , mbtype 4 one_byte_form I3<br />

(qp) mux2r 1 = r 2 , mhtype 8 two_byte_form I4<br />

説明 : 1 つのソース ・ レジスタ GR r 2 内のパ ッ ク形式の要素に対して置換が行われ、 その結果が<br />

GR r 1 に格納される。 8 ビ ッ ト 要素に対しては、 可能なすべての置換タ イ プのなかの一部<br />

しか指定できない。 5 つの可能な置換と それらの図解を、 それぞれ表 2-41 と 図 2-26 に示<br />

す。<br />

表 2-41. 8 ビット要素に対する Mux による置換<br />

mbtype4 機能<br />

@rev バイトの順序を逆にする。<br />

@mix GR r2 の両半分に対してミックス操作を実行する。<br />

@shuf GR r2 の両半分に対してシャッフル操作を実行する。<br />

@alt GR r2 の両半分に対して交互操作を実行する。<br />

@brcst GR r2 の最下位バイトに対してブロードキャスト操作を実行する。<br />

図 2-26. Mux1 の操作 (8 ビット要素 )<br />

GR r 2 :<br />

GR r 1 :<br />

GR r 2 :<br />

GR r 1 :<br />

mux1 r 1 = r 2 , @rev<br />

mux1 r 1 = r 2 , @shuf<br />

GR r 2 :<br />

GR r 1 :<br />

16 ビ ッ ト 要素に対しては、 反復の有無にかかわ ら ず、 可能なすべての置換タ イ プを指定<br />

できる。 これらの置換は、 4 つの 16 ビッ ト ・データ要素のインデックスをエンコーディ<br />

ングしたものである 8 ビッ トのmhtype 8 フ ィ ールドで表現される。 インデッ クスされた<br />

GR r 2 の 16 ビッ ト要素が、 ターゲッ ト ・レジスタGR r 1 の対応する 16 ビット位置にコ<br />

ピーされる。 インデックスはリ トル・エンディアン型の順序でエンコードされる。<br />

(mhtype 8 の 8 ビッ ト [7:0] がビ ッ ト 対のグル ー プに分け ら れ、 操作の項では、 mhtype 8 [3]、<br />

mhtype 8 [2]、 mhtype 8 [1]、 mhtype 8 [0] と命名されている。 )<br />

3:170 第 3 巻 : 命令リファレンス<br />

GR r 2 :<br />

GR r 1 :<br />

GR r 2 :<br />

GR r 1 :<br />

mux1 r 1 = r 2 , @brcst<br />

mux1 r 1 = r 2 , @mix<br />

mux1 r 1 = r 2 , @alt<br />

mux


mux<br />

図 2-27. Mux2 の例 (16 ビット要素 )<br />

GR r 2 :<br />

GR r 1 :<br />

GR r 2 :<br />

GR r 1 :<br />

mux2 r1 = r2, 0x8d( シャトル 10 00 11 01)<br />

mux2 r 1 = r 2 , 0xd8( オルタネート 11 01 10 00)<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1 );<br />

if (one_byte_form) {<br />

x[0] = GR[r 2 ]{7:0};<br />

x[1] = GR[r 2]{15:8};<br />

x[2] = GR[r 2 ]{23:16};<br />

x[3] = GR[r 2 ]{31:24};<br />

x[4] = GR[r 2]{39:32};<br />

x[5] = GR[r 2 ]{47:40};<br />

x[6] = GR[r 2 ]{55:48};<br />

x[7] = GR[r 2]{63:56};<br />

switch (mbtype) {<br />

case ‘@rev’:<br />

GR[r 1 ] = concatenate8(x[0], x[1], x[2], x[3],<br />

x[4], x[5], x[6], x[7]);<br />

break;<br />

case ‘@mix’:<br />

GR[r 1] = concatenate8(x[7], x[3], x[5], x[1],<br />

x[6], x[2], x[4], x[0]);<br />

break;<br />

case ‘@shuf’:<br />

GR[r 1 ] = concatenate8(x[7], x[3], x[6], x[2],<br />

x[5], x[1], x[4], x[0]);<br />

break;<br />

case ‘@alt’:<br />

GR[r 1 ] = concatenate8(x[7], x[5], x[3], x[1],<br />

x[6], x[4], x[2], x[0]);<br />

break;<br />

case ‘@brcst’:<br />

GR[r1] = concatenate8(x[0], x[0], x[0], x[0],<br />

x[0], x[0], x[0], x[0]);<br />

break;<br />

}<br />

} else { // two_byte_form<br />

第 3 巻 : 命令リファレンス 3:171<br />

GR r 2 :<br />

GR r 1 :<br />

GR r 2<br />

GR r 1 :<br />

mux2 r 1 = r 2 , 0x1b ( リバース 00 01 10 11)<br />

mux2 r 1 = r 2 , 0xaa ( ブロードキャスト 10 10 10 10)


}<br />

割り込み : 無効操作フ ォ ル ト<br />

x[0] = GR[r 2 ]{15:0};<br />

x[1] = GR[r 2]{31:16};<br />

x[2] = GR[r 2 ]{47:32};<br />

x[3] = GR[r 2 ]{63:48};<br />

res[0] = x[mhtype8{1:0}];<br />

res[1] = x[mhtype8{3:2}];<br />

res[2] = x[mhtype8{5:4}];<br />

res[3] = x[mhtype8{7:6}];<br />

GR[r1 ] = concatenate4(res[3], res[2], res[1], res[0]);<br />

}<br />

GR[r1 ].nat = GR[r2 ].nat;<br />

3:172 第 3 巻 : 命令リファレンス<br />

mux


nop<br />

nop ─ ノー・オペレーション (No Operation)<br />

書式 : (qp) nopimm 21 擬似オペ コ ー ド<br />

(qp) nop.iimm 21 i_unit_form I18<br />

(qp) nop.bimm 21 b_unit_form B9<br />

(qp) nop.mimm 21 m_unit_form M48<br />

(qp) nop.fimm 21 f_unit_form F16<br />

(qp) nop.ximm 62 x_unit_form X5<br />

説明 : 何の操作も行われない。<br />

ソフ ト ウェアは、 即値imm21 または imm62 をプログラム ・ コー ド内でマーカ として使用<br />

できる。 ハー ド ウェアはこのマーカを無視する。<br />

x_unit_form では、 バン ドルの L スロッ ト に imm62 の上位 41 ビッ トが入る。<br />

nop.i 命令は、 MLI テンプレー ト ・バンドル内にエンコードできる。 この場合は、 この<br />

バン ド ルの L スロッ ト は無視される。<br />

この命令には 5 つの形式があ る が、 こ れら の形式は それぞれ特定の実行ユニ ッ ト ・ タ イ<br />

プに対してしか実行で き ない。 実行する ユニ ッ ト ・ タ イ プが重要でない場合は、 擬似オ<br />

ペコー ドを使用できる。<br />

操作 : if (PR[qp]) {<br />

; // no operation<br />

}<br />

割り込み : なし<br />

第 3 巻 : 命令リファレンス 3:173


or ─ 論理和 (Logical Or)<br />

書式 : (qp) orr 1 = r 2 , r 3 register_form A1<br />

(qp) orr 1 = imm 8 , r 3 imm8_form A3<br />

説明 : 2 つの ソ ー ス ・ オペラ ン ド の論理和が取られ、 結果が GR r 1 に格納される。 レジスタ形式<br />

では、 第 1 オペラン ド は GR r 2 であ り 、 即値形式では、 第 1 オペラン ド は imm 8 のエン<br />

コーディング・フィールドで与えられる。<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1);<br />

}<br />

割り込み : 無効操作フ ォ ル ト<br />

tmp_src = (register_form ? GR[r 2 ] : sign_ext(imm 8 , 8));<br />

tmp_nat = (register_form ? GR[r 2].nat : 0);<br />

GR[r 1 ] = tmp_src | GR[r 3 ];<br />

GR[r 1].nat = tmp_nat || GR[r 3].nat;<br />

3:174 第 3 巻 : 命令リファレンス<br />

or


pack<br />

pack ─ パック (Pack)<br />

書式 : (qp) pack2.sss r 1 = r 2 , r 3 two_byte_form, signed_saturation_form I2<br />

(qp) pack2.uss r 1 = r 2 , r 3 two_byte_form, unsigned_saturation_form I2<br />

(qp) pack4.sss r 1 = r 2 , r 3 four_byte_form, signed_saturation_form I2<br />

説明 : GR r 2 および GR r 3 の 32 ビッ トまたは16 ビッ ト要素が、 それぞれ、 16 ビッ トまたは8<br />

ビ ッ ト の要素に変換 さ れ、 その結果が GR r 1 に格納 さ れる。 ソ ー ス要素は符号付き の値<br />

と して扱われる。 ソ ー ス要素が結果の要素 と して表現で き ない場合は、 飽和に よ る ク<br />

リ ッ ピングが行われる。 飽和は、 符号付き、 符号なしのいずれの場合もあり得る。 要素<br />

が上限値よ り大きい場合は、 結果は上限値になる。 要素が下限値よ り小さい場合は、 結<br />

果は下限値にな る。 飽和の上下限値を表 2-42 に示す。<br />

表 2-42. パックでの飽和の上下限値<br />

サイズ ソース要素の幅 結果要素の幅 飽和の区別 上限値 下限値<br />

2 16 ビット 8 ビット 符号付き 0x7f 0x80<br />

2 16 ビット 8 ビット 符号なし 0xff 0x00<br />

4 32 ビット 16 ビット 符号付き 0x7fff 0x8000<br />

図 2-28. パックの操作<br />

GR r 3 :<br />

GR r 3 :<br />

GR r 1 :<br />

GR r 1 :<br />

第 3 巻 : 命令リファレンス 3:175<br />

GR r 2 :<br />

pack4<br />

GR r 2 :<br />

pack2


操作 : if (PR[qp]) {<br />

check_target_register(r 1);<br />

}<br />

割り込み : 無効操作フ ォ ル ト<br />

3:176 第 3 巻 : 命令リファレンス<br />

pack<br />

if (two_byte_form) {<br />

if (signed_saturation_form) {<br />

max = sign_ext(0x7f, 8);<br />

min = sign_ext(0x80, 8);<br />

} else { // unsigned_saturation_form<br />

max = 0xff;<br />

min = 0x00;<br />

}<br />

temp[0] = sign_ext(GR[r 2 ]{15:0}, 16);<br />

temp[1] = sign_ext(GR[r 2 ]{31:16}, 16);<br />

temp[2] = sign_ext(GR[r 2 ]{47:32}, 16);<br />

temp[3] = sign_ext(GR[r 2 ]{63:48}, 16);<br />

temp[4] = sign_ext(GR[r 3 ]{15:0}, 16);<br />

temp[5] = sign_ext(GR[r 3 ]{31:16}, 16);<br />

temp[6] = sign_ext(GR[r 3 ]{47:32}, 16);<br />

temp[7] = sign_ext(GR[r 3 ]{63:48}, 16);<br />

for (i = 0; i < 8; i++) {<br />

if (temp[i] > max)<br />

temp[i] = max;<br />

}<br />

if (temp[i] < min)<br />

temp[i] = min;<br />

GR[r 1 ] = concatenate8(temp[7], temp[6], temp[5], temp[4],<br />

temp[3], temp[2], temp[1], temp[0]);<br />

} else { // four_byte_form<br />

max = sign_ext(0x7fff, 16); // signed_saturation_form<br />

min = sign_ext(0x8000, 16);<br />

temp[0] = sign_ext(GR[r 2 ]{31:0}, 32);<br />

temp[1] = sign_ext(GR[r 2 ]{63:32}, 32);<br />

temp[2] = sign_ext(GR[r 3]{31:0}, 32);<br />

temp[3] = sign_ext(GR[r 3 ]{63:32}, 32);<br />

for (i = 0; i < 4; i++) {<br />

if (temp[i] > max)<br />

temp[i] = max;<br />

}<br />

if (temp[i] < min)<br />

temp[i] = min;<br />

GR[r1 ] = concatenate4(temp[3], temp[2], temp[1], temp[0]);<br />

}<br />

GR[r1 ].nat = GR[r2 ].nat || GR[r3 ].nat;


padd<br />

padd ─ 並列加算 (Parallel Add)<br />

書式 : (qp) padd1r 1 = r 2 , r 3 one_byte_form, modulo_form A9<br />

(qp) padd1.sss r 1 = r 2 , r 3 one_byte_form, sss_saturation_form A9<br />

(qp) padd1.uus r 1 = r 2 , r 3 one_byte_form, uus_saturation_form A9<br />

(qp) padd1.uuu r 1 = r 2 , r 3 one_byte_form, uuu_saturation_form A9<br />

(qp) padd2r 1 = r 2 , r 3 two_byte_form, modulo_form A9<br />

(qp) padd2.sss r 1 = r 2 , r 3 two_byte_form, sss_saturation_form A9<br />

(qp) padd2.uus r 1 = r 2 , r 3 two_byte_form, uus_saturation_form A9<br />

(qp) padd2.uuu r 1 = r 2 , r 3 two_byte_form, uuu_saturation_form A9<br />

(qp) padd4r 1 = r 2 , r 3 four_byte_form, modulo_form A9<br />

説明 : 2 つのソース ・ オペラン ド の要素セッ ト が加え合わされ、 その結果が GR r1 に格納され<br />

る。<br />

2 つの要素の和が結果要素 と して表現で き ず、 飽和 コ ン プ リ ー タ が指定 さ れてい る場合<br />

は、 飽和に よ る ク リ ッ ピングが行われる。 飽和は、 表 2-43 に示す よ う に、 符号付き、 符<br />

号なしのいずれの場合も 指定でき る。 要素が上限値よ り大きい場合は、 結果は上限値に<br />

な る。 要素が下限値 よ り 小さ い場合は、 結果は下限値にな る。 飽和の上下限値を表 2-44<br />

に示す。<br />

表 2-43. 並列加算の飽和コンプリータ<br />

コンプリータ 結果 r1 の処理 ソース r2 の処理 ソース r3 の処理<br />

sss 符号付き 符号付き 符号付き<br />

uus 符号なし 符号なし 符号付き<br />

uuu 符号なし 符号なし 符号なし<br />

表 2-44. 並列加算における飽和の制限<br />

図 2-29. 並列加算の例<br />

サイズ 要素幅<br />

符号付きの結果 r1 上限値 下限値<br />

符号なしの結果 r1 上限値 下限値<br />

1 8 ビット 0x7f 0x80 0xff 0x00<br />

2 16 ビット 0x7fff 0x8000 0xffff 0x0000<br />

GR r 3 :<br />

GR r 2 :<br />

GR r 1 :<br />

+ +<br />

+ + + + + +<br />

第 3 巻 : 命令リファレンス 3:177<br />

GR r 3 :<br />

GR r 2 :<br />

GR r 1 :<br />

padd1 padd2<br />

+<br />

+<br />

+<br />

+


操作 : if (PR[qp]) {<br />

check_target_register(r 1);<br />

if (one_byte_form) { // one-byte elements<br />

x[0] = GR[r 2]{7:0}; y[0] = GR[r 3]{7:0};<br />

x[1] = GR[r 2 ]{15:8}; y[1] = GR[r 3 ]{15:8};<br />

x[2] = GR[r 2 ]{23:16}; y[2] = GR[r 3 ]{23:16};<br />

x[3] = GR[r 2 ]{31:24}; y[3] = GR[r 3 ]{31:24};<br />

x[4] = GR[r 2 ]{39:32}; y[4] = GR[r 3 ]{39:32};<br />

x[5] = GR[r 2 ]{47:40}; y[5] = GR[r 3 ]{47:40};<br />

x[6] = GR[r 2 ]{55:48}; y[6] = GR[r 3 ]{55:48};<br />

x[7] = GR[r 2 ]{63:56}; y[7] = GR[r 3 ]{63:56};<br />

if (sss_saturation_form) {<br />

max = sign_ext(0x7f, 8);<br />

min = sign_ext(0x80, 8);<br />

for (i = 0; i < 8; i++) {<br />

temp[i] = sign_ext(x[i], 8) + sign_ext(y[i], 8);<br />

}<br />

} else if (uus_saturation_form) {<br />

max = 0xff;<br />

min = 0x00;<br />

for (i = 0; i < 8; i++) {<br />

temp[i] = zero_ext(x[i], 8) + sign_ext(y[i], 8);<br />

}<br />

} else if (uuu_saturation_form) {<br />

max = 0xff;<br />

min = 0x00;<br />

for (i = 0; i < 8; i++) {<br />

temp[i] = zero_ext(x[i], 8) + zero_ext(y[i], 8);<br />

}<br />

} else { // modulo_form<br />

for (i = 0; i < 8; i++) {<br />

temp[i] = zero_ext(x[i], 8) + zero_ext(y[i], 8);<br />

}<br />

}<br />

if (sss_saturation_form || uus_saturation_form ||<br />

uuu_saturation_form) {<br />

for (i = 0; i < 8; i++) {<br />

if (temp[i] > max)<br />

temp[i] = max;<br />

}<br />

if (temp[i] < min)<br />

temp[i] = min;<br />

}<br />

GR[r 1 ] = concatenate8(temp[7], temp[6], temp[5], temp[4],<br />

temp[3], temp[2], temp[1], temp[0]);<br />

} else if (two_byte_form) { // 2-byte elements<br />

x[0] = GR[r 2]{15:0}; y[0] = GR[r 3]{15:0};<br />

x[1] = GR[r 2 ]{31:16}; y[1] = GR[r 3 ]{31:16};<br />

x[2] = GR[r 2 ]{47:32}; y[2] = GR[r 3 ]{47:32};<br />

x[3] = GR[r 2]{63:48}; y[3] = GR[r 3]{63:48};<br />

if (sss_saturation_form) {<br />

max = sign_ext(0x7fff, 16);<br />

min = sign_ext(0x8000, 16);<br />

3:178 第 3 巻 : 命令リファレンス<br />

padd


padd<br />

}<br />

割り込み : 無効操作フ ォ ル ト<br />

for (i = 0; i < 4; i++) {<br />

temp[i] = sign_ext(x[i], 16) + sign_ext(y[i], 16);<br />

}<br />

} else if (uus_saturation_form) {<br />

max = 0xffff;<br />

min = 0x0000;<br />

for (i = 0; i < 4; i++) {<br />

temp[i] = zero_ext(x[i], 16) + sign_ext(y[i], 16);<br />

}<br />

} else if (uuu_saturation_form) {<br />

max = 0xffff;<br />

min = 0x0000;<br />

for (i = 0; i < 4; i++) {<br />

temp[i] = zero_ext(x[i], 16) + zero_ext(y[i], 16);<br />

}<br />

} else { // modulo_form<br />

for (i = 0; i < 4; i++) {<br />

temp[i] = zero_ext(x[i], 16) + zero_ext(y[i], 16);<br />

}<br />

}<br />

if (sss_saturation_form || uus_saturation_form ||<br />

uuu_saturation_form) {<br />

for (i = 0; i < 4; i++) {<br />

if (temp[i] > max)<br />

temp[i] = max;<br />

}<br />

if (temp[i] < min)<br />

temp[i] = min;<br />

}<br />

GR[r 1 ] = concatenate4(temp[3], temp[2], temp[1], temp[0]);<br />

} else { // four-byte elements<br />

x[0] = GR[r 2 ]{31:0}; y[0] = GR[r 3 ]{31:0};<br />

x[1] = GR[r 2 ]{63:32}; y[1] = GR[r 3 ]{63:32};<br />

}<br />

for (i = 0; i < 2; i++) { // modulo_form<br />

temp[i] = zero_ext(x[i], 32) + zero_ext(y[i], 32);<br />

}<br />

GR[r 1 ] = concatenate2(temp[1], temp[0]);<br />

GR[r 1 ].nat = GR[r 2 ].nat || GR[r 3 ].nat;<br />

第 3 巻 : 命令リファレンス 3:179


pavg ─ 並列平均 (Parallel Average)<br />

書式 : (qp) pavg1r 1 = r 2 , r 3 normal_form, one_byte_form A9<br />

(qp) pavg1.raz r 1 = r 2 , r 3 raz_form, one_byte_form A9<br />

(qp) pavg2r 1 = r 2 , r 3 normal_form, two_byte_form A9<br />

(qp) pavg2.raz r 1 = r 2 , r 3 raz_form, two_byte_form A9<br />

説明 : GR r2 の符号なしの各デー タ要素が GR r3 の対応する符号なしデー タ要素に加算され、 次<br />

に こ の加算結果がそれぞれ独立に右に 1 ビ ッ ト だけ シ フ ト さ れる。 各要素の最上位ビ ッ<br />

ト に は加算のキ ャ リ ー ・ ビ ッ ト が埋め ら れる。 丸め誤差を累積 さ せないために、 平均操<br />

作が行われる。 符号なしの結果が GR r1 に格納される。<br />

平均操作は次の と お り であ る。 normal_form では、 対応す る加算結果の最下位 2 ビッ トの<br />

少な く と も いずれかが 1 の場合、 それぞれの加算結果の最下位ビ ッ ト が 1 に設定される。<br />

raz_form ( ゼロか ら離れる方向の丸め形式 ) では、 それぞれの加算結果に 1 を加算して、<br />

平均がゼ ロ か ら 丸め ら れる。<br />

図 2-30. 並列平均の例<br />

GR r 3 :<br />

GR r 2 :<br />

16 ビットの和<br />

+<br />

キャリー<br />

1 ビット<br />

右シフト<br />

GR r 1 :<br />

+<br />

+<br />

pavg2<br />

+<br />

3:180 第 3 巻 : 命令リファレンス<br />

+<br />

キャリー・<br />

ビット<br />

最下位ビットを平均して<br />

1 ビット右シフト<br />

和ビット<br />

or<br />

pavg


pavg<br />

図 2-31. 並列平均でのゼロから離れる方向の丸めの例<br />

GR r 3 :<br />

GR r 2 :<br />

16 ビットの和<br />

+<br />

キャリー<br />

1 ビット<br />

右シフト<br />

GR r 1 :<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1);<br />

+<br />

1 1 1 1<br />

+<br />

if (one_byte_form) {<br />

x[0] = GR[r 2]{7:0}; y[0] = GR[r 3]{7:0};<br />

x[1] = GR[r 2 ]{15:8}; y[1] = GR[r 3 ]{15:8};<br />

x[2] = GR[r 2 ]{23:16}; y[2] = GR[r 3 ]{23:16};<br />

x[3] = GR[r 2]{31:24}; y[3] = GR[r 3]{31:24};<br />

x[4] = GR[r 2 ]{39:32}; y[4] = GR[r 3 ]{39:32};<br />

x[5] = GR[r 2 ]{47:40}; y[5] = GR[r 3 ]{47:40};<br />

x[6] = GR[r 2]{55:48}; y[6] = GR[r 3]{55:48};<br />

x[7] = GR[r 2 ]{63:56}; y[7] = GR[r 3 ]{63:56};<br />

+<br />

pavg2.raz<br />

if (raz_form) {<br />

for (i = 0; i < 8; i++) {<br />

temp[i] = zero_ext(x[i], 8) + zero_ext(y[i], 8) + 1;<br />

res[i] = shift_right_unsigned(temp[i], 1);<br />

}<br />

} else { // normal form<br />

for (i = 0; i < 8; i++) {<br />

temp[i] = zero_ext(x[i], 8) + zero_ext(y[i], 8);<br />

res[i] = shift_right_unsigned(temp[i], 1) | (temp[i]{0});<br />

}<br />

}<br />

GR[r 1 ] = concatenate8(res[7], res[6], res[5], res[4],<br />

res[3], res[2], res[1], res[0]);<br />

} else { // two_byte_form<br />

x[0] = GR[r 2 ]{15:0}; y[0] = GR[r 3 ]{15:0};<br />

x[1] = GR[r 2 ]{31:16}; y[1] = GR[r 3 ]{31:16};<br />

x[2] = GR[r 2 ]{47:32}; y[2] = GR[r 3 ]{47:32};<br />

x[3] = GR[r 2 ]{63:48}; y[3] = GR[r 3 ]{63:48};<br />

if (raz_form) {<br />

for (i = 0; i < 4; i++) {<br />

temp[i] = zero_ext(x[i], 16) + zero_ext(y[i], 16) + 1;<br />

第 3 巻 : 命令リファレンス 3:181<br />

+<br />

キャリー・<br />

ビット<br />

1 ビット右シフト<br />

和ビット


}<br />

割り込み : 無効操作フ ォ ル ト<br />

res[i] = shift_right_unsigned(temp[i], 1);<br />

}<br />

} else { // normal form<br />

for (i = 0; i < 4; i++) {<br />

temp[i] = zero_ext(x[i], 16) + zero_ext(y[i], 16);<br />

res[i] = shift_right_unsigned(temp[i], 1) | (temp[i]{0});<br />

}<br />

}<br />

GR[r1 ] = concatenate4(res[3], res[2], res[1], res[0]);<br />

}<br />

GR[r1 ].nat = GR[r2 ].nat || GR[r3 ].nat;<br />

3:182 第 3 巻 : 命令リファレンス<br />

pavg


pavgsub<br />

pavgsub ─ 並列平均減算 (Parallel Average Subtract)<br />

書式 : (qp) pavgsub1r 1 = r 2 , r 3 one_byte_form A9<br />

(qp) pavgsub2r 1 = r 2 , r 3 two_byte_form A9<br />

説明 : GR r 3 の符号なしの各デー タ要素が GR r 2 の対応する符号なしデー タ要素か ら 減算 さ れ、<br />

次に こ の減算結果がそれぞれ独立に右に 1 ビ ッ ト 位置だけシ フ ト される。 各要素の最上<br />

位ビットには減算のボロー・ビット (ALU のキャ リ ーの補数 ) が埋め られる。 丸め誤差<br />

を累積 さ せないために、 平均操作が行われる。 対応す る減算結果の最下位 2 ビッ トの少<br />

なく ともいずれかが1 の場合、 それぞれの減算結果の最下位ビ ッ ト が 1 に設定される。<br />

符号付き の結果が GR r 1 に格納される。<br />

図 2-32. 並列平均減算の例<br />

GR r 3 :<br />

GR r 2 :<br />

16 ビットの差<br />

+<br />

キャリー<br />

1 ビット<br />

右シフト<br />

GR r 1 :<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1 );<br />

-<br />

-<br />

if (one_byte_form) {<br />

x[0] = GR[r 2 ]{7:0}; y[0] = GR[r 3 ]{7:0};<br />

x[1] = GR[r 2 ]{15:8}; y[1] = GR[r 3 ]{15:8};<br />

x[2] = GR[r 2]{23:16}; y[2] = GR[r 3]{23:16};<br />

x[3] = GR[r 2 ]{31:24}; y[3] = GR[r 3 ]{31:24};<br />

x[4] = GR[r 2 ]{39:32}; y[4] = GR[r 3 ]{39:32};<br />

x[5] = GR[r 2]{47:40}; y[5] = GR[r 3]{47:40};<br />

x[6] = GR[r 2 ]{55:48}; y[6] = GR[r 3 ]{55:48};<br />

x[7] = GR[r 2 ]{63:56}; y[7] = GR[r 3 ]{63:56};<br />

-<br />

pavgsub2<br />

for (i = 0; i < 8; i++) {<br />

temp[i] = zero_ext(x[i], 8) - zero_ext(y[i], 8);<br />

res[i] = (temp[i]{8:0} u>> 1) | (temp[i]{0});<br />

}<br />

GR[r 1 ] = concatenate8(res[7], res[6], res[5], res[4],<br />

res[3], res[2], res[1], res[0]);<br />

} else { // two_byte_form<br />

x[0] = GR[r 2]{15:0}; y[0] = GR[r 3]{15:0};<br />

x[1] = GR[r 2 ]{31:16}; y[1] = GR[r 3 ]{31:16};<br />

第 3 巻 : 命令リファレンス 3:183<br />

-<br />

ボロー・<br />

ビット<br />

最下位ビットを<br />

平均して 1 ビット右シフト<br />

和ビット<br />

or


}<br />

割り込み : 無効操作フ ォ ル ト<br />

x[2] = GR[r 2 ]{47:32}; y[2] = GR[r 3 ]{47:32};<br />

x[3] = GR[r 2]{63:48}; y[3] = GR[r 3]{63:48};<br />

for (i = 0; i < 4; i++) {<br />

temp[i] = zero_ext(x[i], 16) - zero_ext(y[i], 16);<br />

res[i] = (temp[i]{16:0} u>> 1) | (temp[i]{0});<br />

}<br />

GR[r1 ] = concatenate4(res[3], res[2], res[1], res[0]);<br />

}<br />

GR[r1 ].nat = GR[r2 ].nat || GR[r3 ].nat;<br />

pavgsub<br />

3:184 第 3 巻 : 命令リファレンス


pcmp<br />

pcmp ─ 並列比較 (Parallel Compare)<br />

書式 : (qp) pcmp1.prel r 1 = r 2 , r 3 one_byte_form A9<br />

(qp) pcmp2.prel r 1 = r 2 , r 3 two_byte_form A9<br />

(qp) pcmp4.prel r 1 = r 2 , r 3 four_byte_form A9<br />

説明 : 2 つのソース ・ オペラン ド が、 表 2-45 に示す 12 種類の関係のいずれかに比較される。<br />

GR r 2 と GR r 3 の対応するデー タ要素は比較条件が真である場合は、 GR r 1 の対応する<br />

データ要素がすべて 1 ビ ッ ト に設定 さ れる。 比較条件が偽である場合は、 GR r 1 の対応<br />

するデータ要素がすべて 0 ビッ トに設定される。 ‘>’ の関係については、 両オペラン ド が<br />

符号付き と して解釈 さ れる。<br />

表 2-45. 並列の比較関係<br />

図 2-33. 並列比較の例<br />

prel 比較関係 (r 2 prel r 3 )<br />

eq r2 == r3 gt r2 > r3 ( 符号付き )<br />

GR r 3 :<br />

GR r 2 :<br />

GR r 1 :<br />

> > > > > > > ><br />

t f t t f f f t<br />

ff 00<br />

ff ff 00 00 00 ff<br />

pcmp1.ge<br />

GR r 3 :<br />

GR r 2 :<br />

GR r 1 :<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1);<br />

真<br />

if (one_byte_form) { // one-byte elements<br />

x[0] = GR[r 2]{7:0}; y[0] = GR[r 3]{7:0};<br />

x[1] = GR[r 2 ]{15:8}; y[1] = GR[r 3 ]{15:8};<br />

x[2] = GR[r 2 ]{23:16}; y[2] = GR[r 3 ]{23:16};<br />

x[3] = GR[r 2]{31:24}; y[3] = GR[r 3]{31:24};<br />

x[4] = GR[r 2 ]{39:32}; y[4] = GR[r 3 ]{39:32};<br />

x[5] = GR[r 2 ]{47:40}; y[5] = GR[r 3 ]{47:40};<br />

x[6] = GR[r 2]{55:48}; y[6] = GR[r 3]{55:48};<br />

x[7] = GR[r 2 ]{63:56}; y[7] = GR[r 3 ]{63:56};<br />

for (i = 0; i < 8; i++) {<br />

if (prel == ‘eq’)<br />

第 3 巻 : 命令リファレンス 3:185<br />

=<br />

GR r 3 :<br />

GR r 2 :<br />

GR r 1 :<br />

偽<br />

0xffffffff 0x00000000<br />

pcmp4.eq<br />

真<br />

=<br />

=<br />

=<br />

=<br />

偽 真 真<br />

0xffff 0x0000 0xffff 0xffff<br />

pcmp2.eq<br />

=


}<br />

割り込み : 無効操作フ ォ ル ト<br />

tmp_rel = x[i] == y[i];<br />

else // ‘gt’<br />

tmp_rel = greater_signed(sign_ext(x[i], 8),<br />

sign_ext(y[i], 8));<br />

if (tmp_rel)<br />

res[i] = 0xff;<br />

else<br />

res[i] = 0x00;<br />

}<br />

GR[r1 ] = concatenate8(res[7], res[6], res[5], res[4],<br />

res[3], res[2], res[1], res[0]);<br />

} else if (two_byte_form) { // two-byte elements<br />

x[0] = GR[r2 ]{15:0}; y[0] = GR[r3 ]{15:0};<br />

x[1] = GR[r2 ]{31:16}; y[1] = GR[r3 ]{31:16};<br />

x[2] = GR[r2 ]{47:32}; y[2] = GR[r3 ]{47:32};<br />

x[3] = GR[r2 ]{63:48}; y[3] = GR[r3 ]{63:48};<br />

for (i = 0; i < 4; i++) {<br />

if (prel == ‘eq’)<br />

tmp_rel = x[i] == y[i];<br />

else // ‘gt’<br />

tmp_rel = greater_signed(sign_ext(x[i], 16),<br />

sign_ext(y[i], 16));<br />

if (tmp_rel)<br />

res[i] = 0xffff;<br />

else<br />

res[i] = 0x0000;<br />

}<br />

GR[r1 ] = concatenate4(res[3], res[2], res[1], res[0]);<br />

} else { // four-byte elements<br />

x[0] = GR[r2 ]{31:0}; y[0] = GR[r3 ]{31:0};<br />

x[1] = GR[r2 ]{63:32}; y[1] = GR[r3 ]{63:32};<br />

for (i = 0; i < 2; i++) {<br />

if (prel == ‘eq’)<br />

tmp_rel = x[i] == y[i];<br />

else // ‘gt’<br />

tmp_rel = greater_signed(sign_ext(x[i], 32),<br />

sign_ext(y[i], 32));<br />

if (tmp_rel)<br />

res[i] = 0xffffffff;<br />

else<br />

res[i] = 0x00000000;<br />

}<br />

GR[r 1] = concatenate2(res[1], res[0]);<br />

}<br />

GR[r 1 ].nat = GR[r 2 ].nat || GR[r 3 ].nat;<br />

pcmp<br />

3:186 第 3 巻 : 命令リファレンス


pmax<br />

pmax ─ 並列最大値 (Parallel Maximum)<br />

書式 : (qp) pmax1.ur 1 = r 2 , r 3 one_byte_form I2<br />

(qp) pmax2r 1 = r 2 , r 3 two_byte_form I2<br />

説明 : 2 つの ソ ー ス ・ オペラ ン ド の最大値が結果レ ジ ス タ に格納 さ れる。 one_byte_form では、<br />

GR r 2 の符号なし 8 ビッ トの各要素がGR r 3 の対応する符号なし 8 ビ ッ ト 要素 と 比較 さ<br />

れ、 要素の大き い方が GR r 1 の対応する 8 ビッ ト要素に格納される。 two_byte_form で<br />

は、 GR r 2 の符号付き 16 ビッ トの各要素がGR r 3 の対応す る符号付き 16 ビッ ト要素と比<br />

較され、 要素の大きい方が GR r 1 の対応する 16 ビット要素に格納される。<br />

図 2-34. 並列最大値の例<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1 );<br />

}<br />

GR r 3 :<br />

GR r 2 :<br />

GR r 1 :<br />

割り込み : 無効操作フ ォ ル ト<br />

t<br />

<<br />

f<br />

<<br />

t<br />

<<br />

t<br />

<<br />

f<br />

<<br />

f<br />

pmax1.u<br />

<<br />

f<br />

if (one_byte_form) { // one-byte elements<br />

x[0] = GR[r 2 ]{7:0}; y[0] = GR[r 3 ]{7:0};<br />

x[1] = GR[r 2 ]{15:8}; y[1] = GR[r 3 ]{15:8};<br />

x[2] = GR[r 2]{23:16}; y[2] = GR[r 3]{23:16};<br />

x[3] = GR[r 2 ]{31:24}; y[3] = GR[r 3 ]{31:24};<br />

x[4] = GR[r 2 ]{39:32}; y[4] = GR[r 3 ]{39:32};<br />

x[5] = GR[r 2]{47:40}; y[5] = GR[r 3]{47:40};<br />

x[6] = GR[r 2 ]{55:48}; y[6] = GR[r 3 ]{55:48};<br />

x[7] = GR[r 2 ]{63:56}; y[7] = GR[r 3 ]{63:56};<br />

for (i = 0; i < 8; i++) {<br />

res[i] = (zero_ext(x[i],8) < zero_ext(y[i],8)) ? y[i] : x[i];<br />

}<br />

GR[r 1] = concatenate8(res[7], res[6], res[5], res[4],<br />

res[3], res[2], res[1], res[0]);<br />

} else { // two-byte elements<br />

x[0] = GR[r 2]{15:0}; y[0] = GR[r 3]{15:0};<br />

x[1] = GR[r 2 ]{31:16}; y[1] = GR[r 3 ]{31:16};<br />

x[2] = GR[r 2 ]{47:32}; y[2] = GR[r 3 ]{47:32};<br />

x[3] = GR[r 2]{63:48}; y[3] = GR[r 3]{63:48};<br />

for (i = 0; i < 4; i++) {<br />

res[i] = (sign_ext(x[i],16) < sign_ext(y[i],16)) ? y[i] : x[i];<br />

}<br />

GR[r 1 ] = concatenate4(res[3], res[2], res[1], res[0]);<br />

}<br />

GR[r 1].nat = GR[r 2].nat || GR[r 3].nat;<br />

第 3 巻 : 命令リファレンス 3:187<br />

<<br />

t<br />

<<br />

GR r 3 :<br />

GR r 2 :<br />

GR r 1 :<br />

<<br />

<<br />

真 偽 真 真<br />

pmax2<br />

<<br />


pmin ─ 並列最小値 (Parallel Minimum)<br />

書式 : (qp) pmin1.ur 1 = r 2 , r 3 one_byte_form I2<br />

(qp) pmin2r 1 = r 2 , r 3 two_byte_form I2<br />

説明 : 2 つの ソ ー ス ・ オペラ ン ド の最小値が結果レ ジ ス タ に格納 さ れる。 one_byte_form では、<br />

GR r 2 の符号なし 8 ビッ トの各要素がGR r 3 の対応する符号なし 8 ビ ッ ト 要素 と 比較 さ<br />

れ、 要素の小 さ い方が GR r 1 の対応する 8 ビッ ト要素に格納される。 two_byte_form で<br />

は、 GR r 2 の符号付き 16 ビッ トの各要素がGR r 3 の対応す る符号付き 16 ビッ ト要素と比<br />

較され、 要素の小さい方が GR r 1 の対応する 16 ビット要素に格納される。<br />

図 2-35. 並列最小値の例<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1);<br />

}<br />

GR r 3 :<br />

GR r 2 :<br />

GR r 1 :<br />

割り込み : 無効操作フ ォ ル ト<br />

t<br />

<<br />

f<br />

<<br />

t<br />

<<br />

t<br />

<<br />

f<br />

<<br />

pmin1.u<br />

f<br />

<<br />

f<br />

if (one_byte_form) { // one-byte elements<br />

x[0] = GR[r 2]{7:0}; y[0] = GR[r 3]{7:0};<br />

x[1] = GR[r 2 ]{15:8}; y[1] = GR[r 3 ]{15:8};<br />

x[2] = GR[r 2 ]{23:16}; y[2] = GR[r 3 ]{23:16};<br />

x[3] = GR[r 2]{31:24}; y[3] = GR[r 3]{31:24};<br />

x[4] = GR[r 2 ]{39:32}; y[4] = GR[r 3 ]{39:32};<br />

x[5] = GR[r 2 ]{47:40}; y[5] = GR[r 3 ]{47:40};<br />

x[6] = GR[r 2]{55:48}; y[6] = GR[r 3]{55:48};<br />

x[7] = GR[r 2 ]{63:56}; y[7] = GR[r 3 ]{63:56};<br />

for (i = 0; i < 8; i++) {<br />

res[i] = (zero_ext(x[i],8) < zero_ext(y[i],8)) ? x[i] : y[i];<br />

}<br />

GR[r 1 ] = concatenate8(res[7], res[6], res[5], res[4],<br />

res[3], res[2], res[1], res[0]);<br />

} else { // two-byte elements<br />

x[0] = GR[r 2 ]{15:0}; y[0] = GR[r 3 ]{15:0};<br />

x[1] = GR[r 2]{31:16}; y[1] = GR[r 3]{31:16};<br />

x[2] = GR[r 2 ]{47:32}; y[2] = GR[r 3 ]{47:32};<br />

x[3] = GR[r 2 ]{63:48}; y[3] = GR[r 3 ]{63:48};<br />

for (i = 0; i < 4; i++) {<br />

res[i] = (sign_ext(x[i],16) < sign_ext(y[i],16)) ? x[i] : y[i];<br />

}<br />

GR[r 1 ] = concatenate4(res[3], res[2], res[1], res[0]);<br />

}<br />

GR[r 1 ].nat = GR[r 2 ].nat || GR[r 3 ].nat;<br />

3:188 第 3 巻 : 命令リファレンス<br />

<<br />

t<br />

<<br />

GR r 3 :<br />

GR r 2 :<br />

GR r 1 :<br />

<<br />

真 偽<br />

真 真<br />

<<br />

pmin2<br />

<<br />

<<br />

pmin


pmpy<br />

pmpy ─ 並列乗算 (Parallel Multiply)<br />

書式 : (qp) pmpy2.r r 1 = r 2 , r 3 right_form I2<br />

(qp) pmpy2.l r 1 = r 2 , r 3 left_form I2<br />

説明 : GR r 2 の 2 つの符号付き 16 ビット ・データ要素が、 図 2-36 に示すよ う に、 GR r 3 の対応<br />

する 2 つの符号付き 16 ビッ ト ・データ要素と乗算される。 2 つの 32 ビ ッ ト の結果が GR<br />

r 1 に格納される。<br />

図 2-36. 並列乗算の操作<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1 );<br />

}<br />

GR r 3 :<br />

GR r 2 :<br />

GR r 1 :<br />

割り込み : 無効操作フ ォ ル ト<br />

*<br />

pmpy2.l<br />

if (right_form) {<br />

GR[r 1 ]{31:0} = sign_ext(GR[r 2 ]{15:0}, 16) *<br />

sign_ext(GR[r 3]{15:0}, 16);<br />

GR[r 1 ]{63:32} = sign_ext(GR[r 2 ]{47:32}, 16) *<br />

sign_ext(GR[r 3 ]{47:32}, 16);<br />

} else { // left_form<br />

GR[r 1 ]{31:0} = sign_ext(GR[r 2 ]{31:16}, 16) *<br />

sign_ext(GR[r 3 ]{31:16}, 16);<br />

GR[r 1]{63:32} = sign_ext(GR[r 2]{63:48}, 16) *<br />

sign_ext(GR[r 3 ]{63:48}, 16);<br />

}<br />

GR[r 1 ].nat = GR[r 2 ].nat || GR[r 3 ].nat;<br />

*<br />

第 3 巻 : 命令リファレンス 3:189<br />

GR r 3 :<br />

GR r 2 :<br />

GR r 1 :<br />

*<br />

pmpy2.r<br />

*


pmpyshr ─ 並列乗算および右シフト (Parallel Multiply and Shift Right)<br />

pmpyshr<br />

書式 : (qp) pmpyshr2r 1 = r 2 , r 3 , count 2 signed_form I1<br />

(qp) pmpyshr2.u r 1 = r 2 , r 3 , count 2 unsigned_form I1<br />

説明 : GR r 2 の4つの16 ビッ ト ・データ要素が、 図 2-37 に示すよ う に、 GR r 3 の対応する 4 つ<br />

の 16 ビ ッ ト ・ デ ー タ要素 と 乗算 される。 こ の乗算に は、 符号付き (pmpyshr2) と符号な<br />

し (pmpyshr2.u) を指定でき る。 次に、 各積が count 2 ビットだけ右にシフトされ、 シフト<br />

されたそれぞれの積の最下位 16 ビッ トから 4 つの 16 ビ ッ ト の結果が形成 さ れる。 それ<br />

らの結果がGR r 1 に格納される。 count 2 が 0 である場合は、 各結果は積の下位 16 ビッ ト<br />

になり、 count 2 が 16 の場合は、 各結果は積の上位 16 ビッ トになる。 count 2 に使用でき<br />

る値を表 2-46 に示す。<br />

表 2-46. pmpyshr のシフト・オプション<br />

count2 32 ビットの積から選択されるビット・フィールド<br />

0 15:0<br />

7 22:7<br />

15 30:15<br />

16 31:16<br />

図 2-37. 並列乗算右シフトの操作<br />

GR r 3 :<br />

GR r 2 :<br />

count2 ビット<br />

だけ<br />

右にシフト<br />

GR r 1 :<br />

*<br />

3:190 第 3 巻 : 命令リファレンス<br />

*<br />

pmpyshr2<br />

*<br />

*<br />

16 ビットの<br />

ソース要素<br />

32 ビットの積<br />

16 ビットの<br />

結果要素


pmpyshr<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1);<br />

x[0] = GR[r 2 ]{15:0}; y[0] = GR[r 3 ]{15:0};<br />

x[1] = GR[r 2 ]{31:16}; y[1] = GR[r 3 ]{31:16};<br />

x[2] = GR[r 2]{47:32}; y[2] = GR[r 3]{47:32};<br />

x[3] = GR[r 2 ]{63:48}; y[3] = GR[r 3 ]{63:48};<br />

for (i = 0; i < 4; i++) {<br />

if (unsigned_form) // unsigned multiplication<br />

temp[i] = zero_ext(x[i], 16) * zero_ext(y[i], 16);<br />

else // signed multiplication<br />

temp[i] = sign_ext(x[i], 16) * sign_ext(y[i], 16);<br />

}<br />

割り込み : 無効操作フ ォ ル ト<br />

}<br />

res[i] = temp[i]{(count 2 + 15):count 2 };<br />

GR[r 1 ] = concatenate4(res[3], res[2], res[1], res[0]);<br />

GR[r 1 ].nat = GR[r 2 ].nat || GR[r 3 ].nat;<br />

第 3 巻 : 命令リファレンス 3:191


popcnt ─ ポピュレーション・カウント (Population Count)<br />

popcnt<br />

書式 : (qp) popcntr 1 = r 3 I9<br />

説明 : GR r 3 の値が 1 であ る ビ ッ ト がカ ウ ン ト さ れ、 結果の合計値が GR r 1 に格納される。<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1 );<br />

}<br />

res = 0;<br />

// Count up all the one bits<br />

for (i = 0; i < 64; i++) {<br />

res += GR[r 3]{i};<br />

}<br />

GR[r 1] = res;<br />

GR[r 1 ].nat = GR[r 3 ].nat;<br />

割り込み : 無効操作フ ォ ル ト<br />

3:192 第 3 巻 : 命令リファレンス


probe<br />

probe ─ アクセスのプローブ (Probe Access)<br />

書式 : (qp) probe.rr 1 = r 3 , r 2 read_form, register_form M38<br />

(qp) probe.wr 1 = r 3 , r 2 write_form, register_form M38<br />

(qp) probe.rr 1 = r 3 , imm 2 read_form, immediate_form M39<br />

(qp) probe.wr 1 = r 3 , imm 2 write_form, immediate_form M39<br />

(qp) probe.r.faultr 3 , imm 2 fault_form, read_form, immediate_form M40<br />

(qp) probe.w.fault r 3 , imm 2 fault_form, write_form, immediate_form M40<br />

(qp) probe.rw.fault r 3 , imm 2 fault_form, read_write_form, immediate_form M40<br />

説明 : この命令は、 ( 指定された特権レベルでの ) 指定 さ れた仮想ア ド レ スへの読み込み ま たは<br />

書き込みアクセスが許可されるかど うかを判定する。 指定されたアクセスが許可される<br />

場合は、 GR r1 が 1 に設定される。 許可されない場合は、 GR r1 が 0 に設定される。<br />

fault_form では、 指定 さ れたア ク セスが許可される場合、 こ の命令は何 も 実行しない。 指<br />

定されたアクセスが許可されない場合は、 フォルトが発生する。<br />

PSR.dt が 1 の場合は、 DTLB および VHPT 内で現在の変換エン ト リ の クエ リ が行われ、<br />

GR r3 のビ ッ ト {60:0} によって指定された仮想アドレスおよびGR r3 のビ ッ ト {63:61} に<br />

よ ってインデッ クスが付けられたリ ージ ョ ン ・ レジスタへのアクセスが、 GR r2 のビ ッ<br />

ト {1:0} または imm2 によ って指定される特権レベルで許可されるかど うかを判定する。<br />

PSR.pk が 1 の場合は、 保護キー ・ チェ ッ ク も 実行される。 read_form と write_form は、<br />

こ の命令が、 読み込みアクセスをチ ェ ッ ク するか、 書き込みアクセスをチェ ッ ク するか、<br />

あるいはその両方をチェックするかを指定する。 PSR.dt が 0 の場合は、 VHPT ウォーカがディスエーブルにされるため、 フォルトを発生<br />

しないプロ ーブは、 命令のア ド レ ス ・ オペラ ン ド を仮想ア ド レス と して使用して、<br />

DTLB のクエリだけを実行する。 プローブされるアドレスが DTLB 内で見つか った場合<br />

は、 フ ォル ト を発生しないプローブは、 適切な値を返す ( 別のデー タ TLB フォルトが発<br />

生しない場合 )。<br />

PSR.dt が 0 の場合は、 フ ォ ル ト を発生する プロ ーブは、 命令のア ド レ ス ・ オペラ ン ド を<br />

物理ア ド レ ス と して取 り 扱 う 。 こ の場合、 TLB に関連する フ ォル ト は発生しない。<br />

実装 さ れていない仮想ア ド レ ス に対して、 フ ォ ル ト を発生しないプ ロ ー ブを発行する と 、<br />

0 が返される。 実装されていない仮想アドレスに対して (PSR.dt が 1 の場合 )、 または実<br />

装されていない物理ア ド レ スに対して (PSR.dt が 0 の場合 )、 フ ォ ル ト を発生す る プ ロ ー<br />

ブを発行する と 、 実装されていないデー タ ・ ア ド レ ス ・ フ ォ ル ト が発生する。<br />

こ の命令でフ ォ ル ト が発生した場合、 こ の命令は、 ISR 内の非アクセス ・ ビ ッ ト をセ ッ<br />

トし、 コンプリータに基づいてISR の読み込みビッ ト または書き込みビッ ト をセッ ト す<br />

る。 実装されていないデータ ・ アド レス、 データ ・ キー許可、 データ ・ アクセス権、<br />

データ ・ ダーティ ・ ビッ ト、 データ ・ アクセス ・ ビッ ト、 データ ・ デバッグの各フォル<br />

ト は、 フ ォ ル ト を発生する形式のプ ロ ー ブ命令でのみ発生す る。 フ ォ ル ト を発生しない<br />

形式のプローブ命令では、 これらのフ ォル ト は発生しない。<br />

こ の命令は、 現在の特権レ ベル と 同じ か、 それよ り 下位の特権レベルについてのみ、 プ<br />

ロ ー ブを実行で き る。 指定された特権レ ベルの方が上位 ( 小さい数値 ) である場合は、<br />

プローブは現在の特権レベルで実行される。<br />

第 3 巻 : 命令リファレンス 3:193


probe<br />

操作 : if (PR[qp]) {<br />

itype = NON_ACCESS;<br />

itype |= (read_write_form) ? READ|WRITE : ((write_form) ? WRITE : READ);<br />

itype |= (fault_form) ? PROBE_FAULT : PROBE;<br />

}<br />

if (!fault_form)<br />

check_target_register(r 1 );<br />

if (GR[r 3 ].nat || (register_form ? GR[r 2 ].nat : 0))<br />

register_nat_consumption_fault(itype);<br />

tmp_pl = (register_form) ? GR[r 2 ]{1:0} : imm 2 ;<br />

if (tmp_pl < PSR.cpl)<br />

tmp_pl = PSR.cpl;<br />

if (fault_form) {<br />

tlb_translate(GR[r 3 ], 1, itype, tmp_pl, &mattr, &defer);<br />

} else {<br />

GR[r 1 ] = tlb_grant_permission(GR[r 3 ], itype, tmp_pl);<br />

GR[r 1 ].nat = 0;<br />

}<br />

割り込み : 無効操作フ ォ ル ト デー タ NaT ページ参照フォル ト<br />

レジスタ NaT 参照フォルト データ・キー・ ミス・フォルト<br />

実装されていないデータ ・アドレス ・ フォルト データ ・キー許可フォルト<br />

データがネス ト された TLB フォルト データ・アクセス権フォルト<br />

別のデー タ TLB フォルト データ・ダーティ・ビット ・フォルト<br />

VHPT データ ・ フォル ト データ ・ アクセス ・ ビッ ト ・ フォル ト<br />

データ TLB フォルト データ・デバッグ・フォルト<br />

データ ・ ページ不在フォルト<br />

3:194 第 3 巻 : 命令リファレンス


psad<br />

psad ─ 並列絶対差累計 (Parallel Sum of Absolute Difference)<br />

書式 : (qp) psad1r 1 = r 2 , r 3 I2<br />

説明 : GR r 2 の符号なし 8 ビッ トの各要素がGR r 3 の対応する符号なし 8 ビッ ト要素から減算さ<br />

れる。 各減算結果の絶対値がすべての要素について累計 さ れ、 GR r 1 に格納される。<br />

図 2-38. 並列絶対差累計の例<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1);<br />

}<br />

割り込み : 無効操作フ ォ ル ト<br />

GR r3:<br />

GR r 2 :<br />

GR r 1 :<br />

- - - - - - - -<br />

abs abs abs abs abs abs abs abs<br />

+ + + +<br />

x[0] = GR[r 2 ]{7:0}; y[0] = GR[r 3 ]{7:0};<br />

x[1] = GR[r 2]{15:8}; y[1] = GR[r 3]{15:8};<br />

x[2] = GR[r 2 ]{23:16}; y[2] = GR[r 3 ]{23:16};<br />

x[3] = GR[r 2 ]{31:24}; y[3] = GR[r 3 ]{31:24};<br />

x[4] = GR[r 2]{39:32}; y[4] = GR[r 3]{39:32};<br />

x[5] = GR[r 2 ]{47:40}; y[5] = GR[r 3 ]{47:40};<br />

x[6] = GR[r 2 ]{55:48}; y[6] = GR[r 3 ]{55:48};<br />

x[7] = GR[r 2]{63:56}; y[7] = GR[r 3]{63:56};<br />

GR[r 1 ] = 0;<br />

for (i = 0; i < 8; i++) {<br />

temp[i] = zero_ext(x[i], 8) - zero_ext(y[i], 8);<br />

if (temp[i] < 0)<br />

temp[i] = -temp[i];<br />

GR[r 1 ] += temp[i];<br />

}<br />

GR[r 1 ].nat = GR[r 2 ].nat || GR[r 3 ].nat;<br />

第 3 巻 : 命令リファレンス 3:195<br />

+<br />

psad1<br />

+<br />

+


pshl ─ 並列左シフト (Parallel Shift Left)<br />

書式 : (qp) pshl2r 1 = r 2 , r 3 two_byte_form, variable_form I7<br />

(qp) pshl2r 1 = r 2 , count 5 two_byte_form, fixed_form I8<br />

(qp) pshl4r 1 = r 2 , r 3 four_byte_form, variable_form I7<br />

(qp) pshl4r 1 = r 2 , count 5 four_byte_form, fixed_form I8<br />

説明 : GR r 2 の各デー タ要素が、 GR r 3 または即値フ ィールド count 5 のスカラ ・ シフ ト ・ カウン<br />

ト だけ、 それぞれ独立に左にシフ ト される。 各要素の下位ビ ッ ト にはゼロが埋められる。<br />

シフ ト ・ カウント は符号なしとして解釈される。 シフ ト ・ カウン トが 15 (16 ビッ トの数<br />

値の場合 ) あるいは 31 (32 ビ ッ ト の数値の場合 ) を超え る場合は、 結果はすべてゼ ロ ・<br />

ビッ トになる。 結果はGR r 1 に格納される。<br />

図 2-39. 並列左シフトの例<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1 );<br />

}<br />

GR r 2 :<br />

GR r 1 :<br />

割り込み : 無効操作フ ォ ル ト<br />

0<br />

shift_count = (variable_form ? GR[r 3 ] : count 5 );<br />

tmp_nat = (variable_form ? GR[r 3 ].nat : 0);<br />

if (two_byte_form) { // two_byte_form<br />

if (shift_count u> 16)<br />

shift_count = 16;<br />

GR[r 1 ]{15:0} = GR[r 2 ]{15:0}


pshladd<br />

pshladd ─ 並列左シフトおよび加算 (Parallel Shift Left and Add)<br />

書式 : (qp) pshladd2 r 1 = r 2 , count 2 , r 3 A10<br />

説明 : GR r 2 の 4 つの符号付き 16 ビット ・データ要素が、 count 2 ビ ッ ト だけ、 それぞれ独立に<br />

左にシフ ト ( 下位ビ ッ ト にゼ ロ がシ フ ト ・ イ ン ) され、 GR r 3 の 4 つの符号付き 16 ビッ<br />

ト ・ デー タ要素に加算される。 左シフ ト と加算の両操作は と も に飽和する。 つま り、 シ<br />

フ ト ま たは加算の結果が符号付き 16 ビ ッ ト 値 と して表現で き ない場合に は、 最終結果が<br />

飽和す る。 4 つの符号付き 16 ビッ ト結果はGR r 1 に格納される。 第 1 オペラン ド に対し<br />

てシフ ト できるビ ッ ト数は、 1、 2、 あるいは 3 に限られる。<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1 );<br />

}<br />

割り込み : 無効操作フ ォ ル ト<br />

x[0] = GR[r 2 ]{15:0}; y[0] = GR[r 3 ]{15:0};<br />

x[1] = GR[r 2 ]{31:16}; y[1] = GR[r 3 ]{31:16};<br />

x[2] = GR[r 2 ]{47:32}; y[2] = GR[r 3 ]{47:32};<br />

x[3] = GR[r 2 ]{63:48}; y[3] = GR[r 3 ]{63:48};<br />

max = sign_ext(0x7fff, 16);<br />

min = sign_ext(0x8000, 16);<br />

for (i = 0; i < 4; i++) {<br />

temp[i] = sign_ext(x[i], 16) max)<br />

res[i] = max;<br />

else if (temp[i] < min)<br />

res[i] = min;<br />

else {<br />

res[i] = temp[i] + sign_ext(y[i], 16);<br />

if (res[i] > max)<br />

res[i] = max;<br />

if (res[i] < min)<br />

res[i] = min;<br />

}<br />

GR[r 1] = concatenate4(res[3], res[2], res[1], res[0]);<br />

GR[r 1 ].nat = GR[r 2 ].nat || GR[r 3 ].nat;<br />

第 3 巻 : 命令リファレンス 3:197


pshr ─ 並列右シフト (Parallel Shift Right)<br />

書式 : (qp) pshr2r 1 = r 3 , r 2 signed_form, two_byte_form, variable_form I5<br />

(qp) pshr2r 1 = r 3 , count 5 signed_form, two_byte_form, fixed_form I6<br />

(qp) pshr2.ur 1 = r 3 , r 2 unsigned_form, two_byte_form, variable_form I5<br />

(qp) pshr2.ur 1 = r 3 , count 5 unsigned_form, two_byte_form, fixed_form I6<br />

(qp) pshr4r 1 = r 3 , r 2 signed_form, four_byte_form, variable_form I5<br />

(qp) pshr4r 1 = r 3 , count 5 signed_form, four_byte_form, fixed_form I6<br />

(qp) pshr4.ur 1 = r 3 , r 2 unsigned_form, four_byte_form, variable_form I5<br />

(qp) pshr4.ur 1 = r 3 , count 5 unsigned_form, four_byte_form, fixed_form I6<br />

説明 : GR r 2 の各デー タ要素が、 GR r 3 または即値フ ィールド count 5 のスカラ ・ シフ ト ・ カウン<br />

ト だけ、 それぞれ独立に右にシフ ト される。 各要素の上位ビ ッ ト には、 算術シフ ト の場<br />

合は GR r 3 の各デー タ要素の符号ビ ッ ト の初期値が埋め ら れ、 論理シ フ ト の場合はゼ ロ<br />

が埋められる。 シフ ト ・ カウン ト は符号なし として解釈される。 シフ ト ・ カウン ト が 15<br />

(16 ビ ッ ト の数値の場合 ) あるいは 31 (32 ビ ッ ト の数値の場合 ) を超える場合は、 GR r 3<br />

の各デ ー タ要素の符号ビ ッ ト の初期値、 お よ び符号付き、 符号なしの ど ち ら のシ フ ト が<br />

行われたかに よ って、 結果はすべて 0 ビットかすべて1 ビッ トになる。 結果はGR r 1 に<br />

格納 さ れる。<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1 );<br />

shift_count = (variable_form ? GR[r 2 ] : count 5 );<br />

tmp_nat = (variable_form ? GR[r 2 ].nat : 0);<br />

if (two_byte_form) { // two_byte_form<br />

if (shift_count u> 16)<br />

shift_count = 16;<br />

if (unsigned_form) { // unsigned shift<br />

GR[r 1 ]{15:0} = shift_right_unsigned(zero_ext(GR[r 3 ]{15:0}, 16),<br />

shift_count);<br />

GR[r 1 ]{31:16} = shift_right_unsigned(zero_ext(GR[r 3 ]{31:16}, 16),<br />

shift_count);<br />

GR[r 1 ]{47:32} = shift_right_unsigned(zero_ext(GR[r 3 ]{47:32}, 16),<br />

shift_count);<br />

GR[r 1 ]{63:48} = shift_right_unsigned(zero_ext(GR[r 3 ]{63:48}, 16),<br />

shift_count);<br />

} else { // signed shift<br />

GR[r 1 ]{15:0} = shift_right_signed(sign_ext(GR[r 3 ]{15:0}, 16),<br />

shift_count);<br />

GR[r 1 ]{31:16} = shift_right_signed(sign_ext(GR[r 3 ]{31:16}, 16),<br />

shift_count);<br />

GR[r 1 ]{47:32} = shift_right_signed(sign_ext(GR[r 3 ]{47:32}, 16),<br />

shift_count);<br />

GR[r 1 ]{63:48} = shift_right_signed(sign_ext(GR[r 3 ]{63:48}, 16),<br />

shift_count);<br />

}<br />

} else { // four_byte_form<br />

if (shift_count > 32)<br />

shift_count = 32;<br />

if (unsigned_form) { // unsigned shift<br />

GR[r 1 ]{31:0} = shift_right_unsigned(zero_ext(GR[r 3 ]{31:0}, 32),<br />

shift_count);<br />

GR[r 1 ]{63:32} = shift_right_unsigned(zero_ext(GR[r 3 ]{63:32}, 32),<br />

shift_count);<br />

} else { // signed shift<br />

GR[r 1]{31:0} = shift_right_signed(sign_ext(GR[r 3]{31:0}, 32),<br />

shift_count);<br />

3:198 第 3 巻 : 命令リファレンス<br />

pshr


pshr<br />

}<br />

割り込み : 無効操作フ ォ ル ト<br />

}<br />

}<br />

GR[r 1 ]{63:32} = shift_right_signed(sign_ext(GR[r 3 ]{63:32}, 32),<br />

shift_count);<br />

GR[r 1 ].nat = GR[r 3 ].nat || tmp_nat;<br />

第 3 巻 : 命令リファレンス 3:199


pshradd ─ 並列右シフトおよび加算 (Parallel Shift Right and Add)<br />

pshradd<br />

書式 : (qp) pshradd2r 1 = r 2 , count 2 , r 3 A10<br />

説明 : GR r 2 の 4 つの符号付き 16 ビット ・データ要素が、 count 2 ビ ッ ト だけ、 それぞれ独立に<br />

右にシフ ト され、 GR r 3 の 4 つの符号付き 16 ビ ッ ト ・ デ ー タ要素に加算 さ れる。 こ の右<br />

シフ ト操作では、 各要素の上位ビッ ト に GR r 2 の各デー タ要素の符号ビ ッ ト の初期値が<br />

埋められる。 加算操作の実行には符号付きの飽和が行われる。 4 つの符号付き 16 ビッ ト<br />

の加算結果は GR r 1 に格納される。 第 1 オペラン ド に対してシフ ト でき る ビ ッ ト 数は、<br />

1、 2、 あるいは 3 に限られる。<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1 );<br />

}<br />

割り込み : 無効操作フ ォ ル ト<br />

x[0] = GR[r 2 ]{15:0}; y[0] = GR[r 3 ]{15:0};<br />

x[1] = GR[r 2 ]{31:16}; y[1] = GR[r 3 ]{31:16};<br />

x[2] = GR[r 2 ]{47:32}; y[2] = GR[r 3 ]{47:32};<br />

x[3] = GR[r 2 ]{63:48}; y[3] = GR[r 3 ]{63:48};<br />

max = sign_ext(0x7fff, 16);<br />

min = sign_ext(0x8000, 16);<br />

for (i = 0; i < 4; i++) {<br />

temp[i] = shift_right_signed(sign_ext(x[i], 16), count 2 );<br />

}<br />

res[i] = temp[i] + sign_ext(y[i], 16);<br />

if (res[i] > max)<br />

res[i] = max;<br />

if (res[i] < min)<br />

res[i] = min;<br />

GR[r 1] = concatenate4(res[3], res[2], res[1], res[0]);<br />

GR[r 1 ].nat = GR[r 2 ].nat || GR[r 3 ].nat;<br />

3:200 第 3 巻 : 命令リファレンス


psub<br />

psub ─ 並列減算 (Parallel Subtract)<br />

書式 : (qp) psub1r 1 = r 2 , r 3 one_byte_form, modulo_form A9<br />

(qp) psub1.sss r 1 = r 2 , r 3 one_byte_form, sss_saturation_form A9<br />

(qp) psub1.uus r 1 = r 2 , r 3 one_byte_form, uus_saturation_form A9<br />

(qp) psub1.uuu r 1 = r 2 , r 3 one_byte_form, uuu_saturation_form A9<br />

(qp) psub2r 1 = r 2 , r 3 two_byte_form, modulo_form A9<br />

(qp) psub2.sss r 1 = r 2 , r 3 two_byte_form, sss_saturation_form A9<br />

(qp) psub2.uus r 1 = r 2 , r 3 two_byte_form, uus_saturation_form A9<br />

(qp) psub2.uuu r 1 = r 2 , r 3 two_byte_form, uuu_saturation_form A9<br />

(qp) psub4r 1 = r 2 , r 3 four_byte_form, modulo_form A9<br />

説明 : 2 つのソ ー ス ・ オペラ ン ド のの要素セ ッ ト 間の減算が行われ、 結果が GR r1 に格納され<br />

る。<br />

対応す る 2 つの要素間の差が結果要素 と して表現で き ないで、 かつ飽和 コ ンプ リ ー タ が<br />

指定 さ れてい る場合は、 飽和に よ る ク リ ッ ピ ン グが行われる。 飽和は、 表 2-47 に示すよ<br />

う に、 符号付き、 符号なし を指定で き る。 2 つの要素の差が上限値よ り 大き い場合は、<br />

結果は上限値にな る。 下限値 よ り 小 さ い場合は、 結果は下限値にな る。 こ の操作の飽和<br />

の上下限値を表 2-48 に示す。<br />

表 2-47. 並列減算の飽和コンプリータ<br />

コンプリータ 結果 r1 の処理 ソース r2 の処理 ソース r3 の処理<br />

sss 符号付き 符号付き 符号付き<br />

uus 符号なし 符号なし 符号付き<br />

uuu 符号なし 符号なし 符号なし<br />

表 2-48. 並列減算での飽和の上下限値<br />

図 2-40. 並列減算の例<br />

サイズ 要素幅<br />

符号付きの結果 r1 上限値 下限値<br />

符号なしの結果 r1 上限値 下限値<br />

1 8 bit 0x7f 0x80 0xff 0x00<br />

2 16 bit 0x7fff 0x8000 0xffff 0x0000<br />

GR r 3 :<br />

GR r 2 :<br />

GR r 1 :<br />

- -<br />

- - - - - -<br />

第 3 巻 : 命令リファレンス 3:201<br />

GR r 3 :<br />

GR r 2 :<br />

GR r 1 :<br />

psubl psub2<br />

-<br />

-<br />

-<br />

-


操作 : if (PR[qp]) {<br />

check_target_register(r 1);<br />

if (one_byte_form) { // one-byte elements<br />

x[0] = GR[r 2]{7:0}; y[0] = GR[r 3]{7:0};<br />

x[1] = GR[r 2 ]{15:8}; y[1] = GR[r 3 ]{15:8};<br />

x[2] = GR[r 2 ]{23:16}; y[2] = GR[r 3 ]{23:16};<br />

x[3] = GR[r 2 ]{31:24}; y[3] = GR[r 3 ]{31:24};<br />

x[4] = GR[r 2 ]{39:32}; y[4] = GR[r 3 ]{39:32};<br />

x[5] = GR[r 2 ]{47:40}; y[5] = GR[r 3 ]{47:40};<br />

x[6] = GR[r 2 ]{55:48}; y[6] = GR[r 3 ]{55:48};<br />

x[7] = GR[r 2 ]{63:56}; y[7] = GR[r 3 ]{63:56};<br />

if (sss_saturation_form) { // sss_saturation_form<br />

max = sign_ext(0x7f, 8);<br />

min = sign_ext(0x80, 8);<br />

for (i = 0; i < 8; i++) {<br />

temp[i] = sign_ext(x[i], 8) - sign_ext(y[i], 8);<br />

}<br />

} else if (uus_saturation_form) { // uus_saturation_form<br />

max = 0xff;<br />

min = 0x00;<br />

for (i = 0; i < 8; i++) {<br />

temp[i] = zero_ext(x[i], 8) - sign_ext(y[i], 8);<br />

}<br />

} else if (uuu_saturation_form) { // uuu_saturation_form<br />

max = 0xff;<br />

min = 0x00;<br />

for (i = 0; i < 8; i++) {<br />

temp[i] = zero_ext(x[i], 8) - zero_ext(y[i], 8);<br />

}<br />

} else { // modulo_form<br />

for (i = 0; i < 8; i++) {<br />

temp[i] = zero_ext(x[i], 8) - zero_ext(y[i], 8);<br />

}<br />

}<br />

if (sss_saturation_form || uus_saturation_form ||<br />

uuu_saturation_form) {<br />

for (i = 0; i < 8; i++) {<br />

if (temp[i] > max)<br />

temp[i] = max;<br />

if (temp[i] < min)<br />

temp[i] = min;<br />

}<br />

}<br />

GR[r 1 ] = concatenate8(temp[7], temp[6], temp[5], temp[4],<br />

temp[3], temp[2], temp[1], temp[0]);<br />

} else if (two_byte_form) { // two-byte elements<br />

x[0] = GR[r 2 ]{15:0}; y[0] = GR[r 3 ]{15:0};<br />

x[1] = GR[r 2]{31:16}; y[1] = GR[r 3]{31:16};<br />

x[2] = GR[r 2 ]{47:32}; y[2] = GR[r 3 ]{47:32};<br />

x[3] = GR[r 2 ]{63:48}; y[3] = GR[r 3 ]{63:48};<br />

if (sss_saturation_form) { // sss_saturation_form<br />

max = sign_ext(0x7fff, 16);<br />

min = sign_ext(0x8000, 16);<br />

for (i = 0; i < 4; i++) {<br />

temp[i] = sign_ext(x[i], 16) - sign_ext(y[i], 16);<br />

}<br />

} else if (uus_saturation_form) { // uus_saturation_form<br />

3:202 第 3 巻 : 命令リファレンス<br />

psub


psub<br />

}<br />

割り込み : 無効操作フ ォ ル ト<br />

max = 0xffff;<br />

min = 0x0000;<br />

for (i = 0; i < 4; i++) {<br />

temp[i] = zero_ext(x[i], 16) - sign_ext(y[i], 16);<br />

}<br />

} else if (uuu_saturation_form) { // uuu_saturation_form<br />

max = 0xffff;<br />

min = 0x0000;<br />

for (i = 0; i < 4; i++) {<br />

temp[i] = zero_ext(x[i], 16) - zero_ext(y[i], 16);<br />

}<br />

} else { // modulo_form<br />

for (i = 0; i < 4; i++) {<br />

temp[i] = zero_ext(x[i], 16) - zero_ext(y[i], 16);<br />

}<br />

}<br />

if (sss_saturation_form || uus_saturation_form ||<br />

uuu_saturation_form) {<br />

for (i = 0; i < 4; i++) {<br />

if (temp[i] > max)<br />

temp[i] = max;<br />

if (temp[i] < min)<br />

temp[i] = min;<br />

}<br />

}<br />

GR[r 1 ] = concatenate4(temp[3], temp[2], temp[1], temp[0]);<br />

} else { // four-byte elements<br />

x[0] = GR[r 2 ]{31:0}; y[0] = GR[r 3 ]{31:0};<br />

x[1] = GR[r 2 ]{63:32}; y[1] = GR[r 3 ]{63:32};<br />

}<br />

for (i = 0; i < 2; i++) { // modulo_form<br />

temp[i] = zero_ext(x[i], 32) - zero_ext(y[i], 32);<br />

}<br />

GR[r 1] = concatenate2(temp[1], temp[0]);<br />

GR[r 1].nat = GR[r 2].nat || GR[r 3].nat;<br />

第 3 巻 : 命令リファレンス 3:203


ptc.e ─ トランスレーション・キャッシュ・エントリのパージ<br />

(Purge Translation Cache Entry)<br />

書式 : (qp) ptc.er 3 M47<br />

説明 : ローカル ・ プロセッサの命令トランスレーション ・ キャ ッシュとデータ ・ ト ランスレー<br />

ション・キャッシュから、 1 つ以上の変換エン ト リ がパー ジ される。 ト ランスレ ーシ ョ<br />

ン・レジスタとVHPT は変更されない。<br />

パージされる ト ランスレーション ・ キャ ッシュ ・ エント リの数は、 プロセッサによって<br />

異な る。 一部のプ ロ セ ッ サでは、 PTC.e を 1 回反復するだけで、 ト ランスレーション ・<br />

キャッシュ階層のすべてのレベルがパージされる。 その他のプロセッサでは、 命令トラ<br />

ンスレーシ ョ ン ・ キャ ッシュ とデータ ・ ト ランスレーシ ョ ン ・ キャ ッシュのすべてのレ<br />

ベル、 セッ ト、 アソシアティブをフラッシュするには、 ptc.e を数回反復する必要があ<br />

る。 GR r3 は、 各反復に関連する、 プ ロ セ ッ サ固有のパ ラ メ ー タ を指定す る。<br />

以下のループは、 すべてのプロセ ッサ ・ モデルで、 ト ランスレーシ ョ ン ・ キ ャ ッ シ ュ全<br />

体をフラッシュするよ うに定義されている。 ソフ ト ウェアは、 プロシージャ ・ インタ<br />

フェースを介してアクセスされる、 プロセッサに依存するレイヤを介して、 パラメータ<br />

を取得す る。 ル ー プの実行中に、 選択 さ れた領域レ ジ ス タ の状態が変更 さ れてはな ら な<br />

い。<br />

disable_interrupts();<br />

addr = base;<br />

for (i = 0; i < count1; i++) {<br />

for (j = 0; j < count2; j++) {<br />

ptc.e(addr);<br />

addr += stride2;<br />

}<br />

addr += stride1;<br />

}<br />

enable_interrupts();<br />

操作 : if (PR[qp]) {<br />

if (PSR.cpl != 0)<br />

privileged_operation_fault(0);<br />

if (GR[r 3 ].nat)<br />

register_nat_consumption_fault(0);<br />

tlb_purge_translation_cache(GR[r 3 ]);<br />

}<br />

割り込み : 特権操作フ ォ ル ト レ ジ ス タ NaT 参照フ ォ ル ト<br />

シリアル化 : ソ フ ト ウ ェ アは、 パ ー ジ に依存す る デー タ ・ ア ク セス ま たは非ア ク セス参照を発行す る<br />

前に、 デ ー タ のシ リ アル化操作を発行して、 パ ー ジ を完了しなければな ら ない。 ま た、<br />

ソ フ ト ウ ェ アは、 パ ー ジ に依存す る命令を フ ェ ッ チす る前に、 命令のシ リ アル化操作を<br />

発行しなければな ら ない。<br />

3:204 第 3 巻 : 命令リファレンス<br />

ptc.e


ptc.g, ptc.ga<br />

ptc.g, ptc.ga ─ グローバル・トランスレーション・キャッシュのパージ<br />

(Purge Global Translation Cache)<br />

書式 : (qp) ptc.gr 3 , r 2 global_form M45<br />

(qp) ptc.gar 3 , r 2 global_alat_form M45<br />

説明 : ローカルTLB コヒーレンシ ・ ドメイン内の各プロセッサの命令トランスレーション ・<br />

キャッシュとデータ ・ トランスレーション・キャッシュ内で、 仮想アドレスおよびペー<br />

ジ ・ サ イ ズが、 指定 さ れたパ ー ジ仮想ア ド レ スお よ びパ ー ジ ・ ア ド レ ス範囲 と 部分的 ま<br />

たは完全に重な る、 すべてのエン ト リ が検索 さ れる。 該当す る エン ト リ は削除 さ れる。<br />

パージ仮想アドレスは、 GR r3 のビッ ト {60:0} によって指定される。 パージ ・ リージョ<br />

ン識別子は、 GR r3 のビ ッ ト {63:61} によって選択される。 GR r2 は、 パージのア ド レス<br />

範囲を、 1


操作 : if (PR[qp]) {<br />

if (!followed_by_stop())<br />

undefined_behavior();<br />

if (PSR.cpl != 0)<br />

privileged_operation_fault(0);<br />

if (GR[r 3 ].nat || GR[r 2 ].nat)<br />

register_nat_consumption_fault(0);<br />

if (unimplemented_virtual_address(GR[r 3 ]))<br />

unimplemented_data_address_fault(0);<br />

}<br />

tmp_rid = RR[GR[r 3 ]{63:61}].rid;<br />

tmp_va = GR[r 3 ]{60:0};<br />

tmp_size = GR[r 2 ]{7:2};<br />

tmp_va = align_to_size_boundary(tmp_va, tmp_size);<br />

tlb_must_purge_dtc_entries(tmp_rid, tmp_va, tmp_size);<br />

tlb_must_purge_itc_entries(tmp_rid, tmp_va, tmp_size);<br />

if (global_alat_form) tmp_ptc_type = GLOBAL_ALAT_FORM;<br />

else tmp_ptc_type = GLOBAL_FORM;<br />

tlb_broadcast_purge(tmp_rid, tmp_va, tmp_size, tmp_ptc_type);<br />

ptc.g, ptc.ga<br />

割り込み : マシン ・ チェ ッ ク ・ アボー ト レジスタ NaT 参照フ ォ ル ト<br />

特権操作フ ォ ル ト 実装 さ れていないデ ー タ ・ ア ド レ ス ・<br />

フォルト<br />

シリアル化 : ブロー ドキャス ト ・ パージ TC は、 リ モー ト ・ プ ロ セ ッ サ上の命令ス ト リ ー ム と 同期さ<br />

れない。 ソ フ ト ウ ェ アは、 命令ス ト リ ー ム と の こ の よ う な同期に依存してはな ら ない。<br />

リモート ・マシン上のハードウェアは、 ブロードキャスト ・パージTC を確認した後、<br />

TLB 内の I サイ ド ・ アクセスを再変換してからでなければ、 メモリ またはキャ ッシュか<br />

ら命令を再ロー ドできない。 ハー ド ウェアは、 i ス ト リ ーム ・ デー タ を含むペー ジに対す<br />

るブロー ドキャス ト ・ パージ TC を確認する前に取得した、 命令ス ト リ ーム ・ デー タの<br />

有効なプ ラ イ ベー ト ・ コ ピ ー ( 通常は I バッファ内にある ) を使用し続け られる。 ハー ド<br />

ウ ェ アは、 割 り 込みや明示的 ま たは暗黙的な命令シ リ アル化イベン ト ( 例えば、 srlz.i、<br />

rfi) が発生した と き は、 命令ペー ジへのア ク セス を再変換しなければな ら ない。<br />

ソ フ ト ウ ェ アは、 パ ー ジ に依存す る ロ ー カ ル ・ デー タ ・ ア ク セス、 非ア ク セス参照、 ま<br />

たは ロ ー カ ル命令の フ ェ ッ チを行 う 前に、 デー タ ま たは命令、 あるいは その両方の適切<br />

なシ リ アル化操作を発行して、 パ ー ジ を完了しなければな ら ない。<br />

3:206 第 3 巻 : 命令リファレンス


ptc.l<br />

ptc.l ─ ローカル・トランスレーション・キャッシュのパージ<br />

(Purge Local Translation Cache)<br />

書式 : (qp) ptc.lr 3 , r 2 M45<br />

説明 : ローカル ・ プロセッサの命令トランスレーション ・ キャ ッシュとデータ ・ ト ランスレー<br />

シ ョ ン ・ キ ャ ッ シ ュ 内で、 仮想ア ド レ スお よ びペー ジ ・ サイ ズが、 指定 さ れたパ ー ジ仮<br />

想ア ド レ スお よ びパ ー ジ ・ ア ド レ ス範囲 と 部分的 ま たは完全に重な る、 すべてのエン ト<br />

リ が検索される。 該当するエン ト リ はすべて削除される。<br />

パージ仮想アドレスは、 GR r3 のビッ ト {60:0} によって指定される。 パージ ・ リージョ<br />

ン識別子は、 GR r3 のビ ッ ト {63:61} によって選択される。 GR r2 は、 パージのア ド レス<br />

範囲を、 1


ptr ─ トランスレーション・レジスタのパージ (Purge Translation Register)<br />

書式 : (qp) ptr.d r 3 , r 2 data_form M45<br />

(qp) ptr.i r 3 , r 2 instruction_form M45<br />

説明 : こ の命令のデー タ形式では、 デー タ ・ ト ラ ン ス レ ー シ ョ ン ・ レ ジ ス タ と デー タ ・ ト ラ ン<br />

ス レ ー シ ョ ン ・ キ ャ ッ シ ュ内で、 仮想ア ド レ ス と ペー ジ ・ サイズが、 指定されたパー ジ<br />

仮想ア ド レ スお よ びパ ー ジ ・ ア ド レ ス範囲 と 部分的 ま たは完全に重な る、 すべてのエン<br />

ト リが検索される。 該当するエン ト リはすべて削除される。 ただし、 命令ト ランスレー<br />

ション・レジスタ内のエントリは、 データ形式のパージの影響を受けない。<br />

命令形式では、 命令 ト ラ ン ス レ ー シ ョ ン ・ レ ジ ス タ と 命令 ト ラ ン ス レ ー シ ョ ン ・ キ ャ ッ<br />

シ ュ内で、 仮想ア ド レス と ペー ジ ・ サイズが、 指定されたパー ジ仮想ア ド レスおよ び<br />

パ ー ジ ・ ア ド レ ス範囲 と 部分的 ま たは完全に重な る、 すべてのエン ト リ が検索 さ れる。<br />

該当す る エン ト リ はすべて削除 さ れる。 ただし、 デー タ ・ ト ラ ン ス レ ー シ ョ ン ・ レ ジ ス<br />

タ内のエン ト リ は、 命令形式のパ ー ジの影響を受けない。<br />

また、 いずれの形式でも、 パージ ・ パラメータで指定された数より多くの変換エントリ が、 命令ま たはデー タの ト ラ ン ス レ ー シ ョ ン ・ キ ャ ッ シ ュ か ら削除される こ と がある。<br />

最大では、 ト ラ ン ス レ ー シ ョ ン ・ キ ャ ッ シ ュ 内のすべてのエン ト リ が削除される。<br />

パージ仮想アドレスは、 GR r3 のビッ ト {60:0} で指定される。 パージ ・ リージョン識別<br />

子は、 GR r3 のビ ッ ト {63:61} で選択される。 GR r2 は、 パージのア ド レス範囲を、<br />

1


ptr<br />

割り込み : 特権操作フ ォ ル ト 実装 さ れていないデ ー タ ・<br />

レジスタ NaT 参照フ ォ ル ト ア ド レ ス ・ フ ォ ル ト<br />

シリアル化 : デ ー タ形式では、 ソ フ ト ウ ェ アは、 パ ー ジ に依存する命令を発行す る前に、 デー タ のシ<br />

リ アル化操作を発行して、 パ ー ジ を完了しなければな ら ない。 命令形式では、 ソ フ ト<br />

ウ ェアは、 パー ジに依存する命令を フ ェ ッ チする前に、 命令のシ リ アル化操作を発行し<br />

て、 パー ジを完了しなければな ら ない。<br />

第 3 巻 : 命令リファレンス 3:209


fi ─ 割り込みからのリターン (Return From Interruption)<br />

書式 : rfi B8<br />

説明 : 割り込み以前のマシン ・ コンテキス ト が復元される。 PSR は IPSR から復元され、 IPSR<br />

は変更されず、 IP は IIP から復元される。 IP にロード されるバンドル ・アド レス、<br />

PSR.ri にロー ド される命令スロッ ト から、 実行が再開される。<br />

こ の命令は、 直後にス ト ッ プが必要であ る。 直後に ス ト ッ プがない場合は、 無効操作<br />

フォルトが発生する。 この命令は、 IPSR.bn によって指定されるレジスタ ・バンクに切<br />

り替える。 GR 16 ~ GR 31 にア ク セスする、 同じ命令グルー プ内の命令は、 以前のレ ジ<br />

スタ ・バンクを参照する。 後続の命令グループは、 新しいレジスタ ・バンクを参照する。<br />

こ の命令は、 命令のシ リ アル化を実行する。 これに よ って、 以下が保証される。<br />

• 後続の命令グループのフ ェ ッチに影響を与えるプロセッサ ・ レジスタ ・ リ ソースに<br />

対する、 先行す る変更が検出 さ れる。<br />

• 後続のプ ロ グ ラ ム実行 ま たはデー タ ・ メ モ リ ・ ア ク セス に影響を与え る プ ロ セ ッ サ ・<br />

レ ジ ス タ ・ リ ソ ー ス に対す る、 先行する変更が検出 さ れる。<br />

• 先行す る メ モ リ 同期 (sync.i) 操作は、 ロ ー カ ル ・ プ ロ セ ッ サの命令キ ャ ッ シ ュ に影<br />

響を与える。<br />

• 後続の命令グル ー プの フ ェ ッ チ ( 戻り先の命令グループを含む ) は、 rfi の完了後に<br />

再び開始される。<br />

rfi 命令は、 シ リ アル化 さ れる操作を含む命令グルー プ よ り 後の命令グル ー プに含 ま れ<br />

ていなければならない。<br />

こ の命令は、 最高の特権レ ベル以外では実行で き ない。 こ の命令にはプ レ デ ィ ケ ー ト を<br />

使用で き ない。<br />

PSR.ic または PSR.i が 1 の場合は、 この命令の実行は不定になる。 ソ フ ト ウ ェアは、 IIP、<br />

IPSR、 IFS が書き込まれてから次の rfi が実行される ま での間に、 IIP、 IPSR、 または<br />

IFS を変更する割り込みが発生しないよ う に保証しなければならない。<br />

こ の命令は、 下位特権遷移 ト ラ ッ プ、 分岐発生 ト ラ ッ プ、 シ ン グル ・ ス テ ッ プ ・ ト ラ ッ<br />

プを発生しない。<br />

この命令がPSR.ri を 2 に設定し、 戻り先が MIX バン ド ルの場合は、 戻り先のバン ド ル上<br />

で無効操作フ ォ ル ト が発生す る。<br />

IPSR.is が 1 の場合、 コ ン ト ロ ールは、 IA-32 命令セ ッ ト 内で、 IIP{31:0} に よ っ て指定 さ<br />

れる仮想リニア ・ ア ド レスから再開される。 PSR.di は、 こ の命令での命令セ ッ ト の移行<br />

を禁止しない。 rfi の実行が完了した後に PSR.dfh が 1 になる場合は、 戻り先の IA-32<br />

命令で、 浮動小数点レ ジ ス タ無効フ ォ ル ト が発生する。<br />

IPSR.is が 1 であ り 、 実装 さ れていない命令ア ド レ ス ・ ト ラ ッ プが発生した場合、 IIP に<br />

は、 元の 64 ビッ トの戻り先IP が格納される。 こ の値は、 32 ビットからゼロ拡張されな<br />

い。<br />

IA-32 命令セ ッ ト に移行する場合、 現行のス タ ッ ク ・ フ レ ー ムのサイ ズは 0 に設定され<br />

る。 また、 スタ ッ ク された汎用レ ジスタ は、 すべて不定の状態のま ま になる。 ソ フ ト<br />

ウ ェアは、 命令セ ッ ト の移行の前後で、 これら のレ ジス タの値に依存してはな ら ない。<br />

IA-32 命令セ ッ ト への移行時に、 ソ フ ト ウ ェ アは、 BSPSTORE==BSP を保証しなければ<br />

な ら ない。 こ の条件を満た さ ない場合の動作は不定である。<br />

IA-32 プロセッサとの整合性のあるメモリ参照と Itanium アーキテクチャの順序付けなし<br />

のメモ リ 参照の間に、 メモ リ ・ ア ク セスの順序が必要である場合は、 ソ フ ト ウ ェ アは、<br />

3:210 第 3 巻 : 命令リファレンス<br />

rfi


fi<br />

この命令を発行する前に、 mf 命令を発行しなければな ら ない。 プ ロ セ ッ サは、 命令ス ト<br />

リーム内で、 Itanium 命令セ ッ ト に よ っ て生成 さ れた書き込みが、 後続の IA-32 命令か ら<br />

検出で き る こ と を保証していない。<br />

ソフ ト ウェアは、 この命令を発行する前に、 コード ・セグメント ・ディスク リプタおよ<br />

びセレ ク タがロー ド される よ う にしなければならない。 戻り先の EIP 値がコ ー ド ・ セグ<br />

メ ン ト 制限を超え る場合や、 その値に コ ー ド ・ セグ メ ン ト 特権違反があ る場合は、 戻 り<br />

先の IA-32 命令で、 IA-32_Exception(GPFault) 例外が発生す る。 16 ビットのIA-32 コード<br />

への移行では、 IIP が CSD.base の 64K バイ ト の範囲か ら 外れる場合、 戻 り 先の命令で<br />

GPFault が発生する。<br />

戻り先の IA-32 命令が正常に終了す る ま で、 EFLAG.rf と PSR.id は変更されない。 戻り先<br />

の IA-32 命令の実行が開始 さ れる前に、 PSR.da、 PSR.dd、 PSR.ia、 および PSR.ed は 0 に<br />

クリアされる。<br />

IA-32 命令セ ッ ト が実行 さ れた場合、 ALAT の内容は不定になる。 ソフトウェアは、 命令<br />

セ ッ ト の移行の前後で、 ALAT の状態に依存してはな ら ない。 IA-32 コードへの移行の際<br />

は、 ALAT 内の既存のエン ト リ は無視される。<br />

操作 : if (!followed_by_stop())<br />

illegal_operation_fault();<br />

unimplemented_address = 0;<br />

if (PSR.cpl != 0)<br />

privileged_operation_fault(0);<br />

taken_rfi = 1;<br />

PSR = CR[IPSR];<br />

if (CR[IPSR].is == 1) { //resume IA-32 instruction set<br />

tmp_IP = CR[IIP];<br />

if ((CR[IPSR].it && unimplemented_virtual_address(tmp_IP))<br />

|| (!CR[IPSR].it && unimplemented_physical_address(tmp_IP)))<br />

unimplemented_address = 1;<br />

//compute effective instruction pointer<br />

EIP{31:0} = CR[IIP]{31:0} - AR[CSD].Base;<br />

//force zero-sized restored frame<br />

rse_restore_frame(0, 0, CFM.sof);<br />

CFM.sof = 0;<br />

CFM.sol = 0;<br />

CFM.sor = 0;<br />

CFM.rrb.gr = 0;<br />

CFM.rrb.fr = 0;<br />

CFM.rrb.pr = 0;<br />

rse_invalidate_non_current_regs();<br />

//The register stack engine is disabled during IA-32<br />

//instruction set execution.<br />

} else { //return to Itanium instruction set<br />

tmp_IP = CR[IIP] & ~0xf;<br />

slot = CR[IPSR].ri;<br />

if ((CR[IPSR].it && unimplemented_virtual_address(tmp_IP))<br />

|| (!CR[IPSR].it && unimplemented_physical_address(tmp_IP)))<br />

unimplemented_address = 1;<br />

if (CR[IFS].v) {<br />

tmp_growth = -CFM.sof;<br />

alat_frame_update(-CR[IFS].ifm.sof, 0);<br />

rse_restore_frame(CR[IFS].ifm.sof, tmp_growth, CFM.sof);<br />

CFM = CR[IFS].ifm;<br />

}<br />

rse_enable_current_frame_load();<br />

第 3 巻 : 命令リファレンス 3:211


}<br />

IP = tmp_IP;<br />

instruction_serialize();<br />

if (unimplemented_address)<br />

unimplemented_instruction_address_trap(0, tmp_IP);<br />

割り込み : 無効操作フ ォ ル ト 特権操作フ ォ ル ト<br />

実装 さ れていない命令ア ド レ ス ・ ト ラ ッ プ<br />

戻り先の IA-32 命令での追加フ ォ ル ト :<br />

IA-32_Exception(GPFault)<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfh が 1 の場合 )<br />

シリアル化 : 命令お よ びデ ー タ の暗黙的なシ リ アル化操作が実行 さ れる。<br />

3:212 第 3 巻 : 命令リファレンス<br />

rfi


sm<br />

rsm ─ システム・マスクのリセット (Reset System Mask)<br />

書式 : (qp) rsmimm 24 M44<br />

説明 : この命令は、 imm24 オペラ ン ド の補数 と シ ス テ ム ・ マス ク (PSR{23:0}) の AND( 論理積 )<br />

演算を実行し、 その結果をシステム ・ マス クに格納する。 第 2 巻、 第 1 部の 3.3.2 項 「プ<br />

ロセッサ ・ ステータス ・ レジスタ (PSR)」 を参照のこ と。<br />

PSR シ ス テ ム ・ マス ク は、 最高の特権レベル以外では書き込めない。<br />

現在の特権レ ベルが 0(PSR.cpl が 0) の場合、 マス ク が PSR.i を含む rsm 命令を発行す る<br />

と、 その rsm 命令の修飾プレデ ィ ケ ー ト が偽であ っ て も 、 一定の数の命令に対する外部<br />

割り込みがディスエーブルにされる ( 命令の数は、 プ ロ セ ッ サに依存す る )。 アーキテク<br />

チャ上では、 この外部割り込みディスエーブル 「ウィンドウ」 の範囲は、 次のように定<br />

義される。<br />

• rsm 命令の修飾プレデ ィ ケー ト の値に関係な く 、 rsm と同じ命令グループの命令に<br />

対する外部割 り 込みがデ ィ スエー ブルに さ れる。 こ れら の命令に は、 シ ー ケ ン シ ャ<br />

ルなプログラム順序内で rsm に先行する命令も含まれる。<br />

• rsm の修飾プレデ ィ ケー ト が真の場合は、 rsm 命令の直後の外部割 り 込みがデ ィ ス<br />

エーブルにされる。<br />

• rsm の修飾プレデ ィ ケー ト が偽の場合は、 rsm 命令に後続す る次のデー タ ・ シ リ ア<br />

ル化操作ま で、 外部割 り 込みがデ ィ スエー ブルに される。<br />

外部割 り 込みデ ィ スエ ー ブル ・ ウ ィ ン ド ウ は、 上の基準に よ っ て定義 さ れる範囲よ り 大<br />

き く なら ないこ と が保証されているが、 プロセ ッ サのモデルに よ っ ては、 上の基準の範<br />

囲よ り小さ くなる と きがある。<br />

現在の特権レ ベルが 0 でない (PSR.cpl が 0 でない ) 場合、 マス ク が PSR.i を含む rsm 命<br />

令を発行する と、 rsm 命令の修飾プレデ ィ ケー ト の値に関係な く 、 外部割り込みが短時<br />

間デ ィ スエーブルに される こ と がある。 ただし、 ( 例えば、 値が 0 の修飾プレデ ィ ケ ー ト<br />

を持つ rsm 命令の長いシ ー ケン スに よ っ て ) 非特権 コ ー ド が外部割 り 込みを無期限に禁<br />

止できない。 これは、 プロセ ッ サで保証される。<br />

操作 : if (PR[qp]) {<br />

if (PSR.cpl != 0)<br />

privileged_operation_fault(0);<br />

}<br />

if (is_reserved_field(PSR_TYPE, PSR_SM, imm 24 ))<br />

reserved_register_field_fault();<br />

if (imm 24 {1}) PSR{1} = 0;) // be<br />

if (imm 24 {2}) PSR{2} = 0;) // up<br />

if (imm 24{3}) PSR{3} = 0;) // ac<br />

if (imm 24 {4}) PSR{4} = 0;) // mfl<br />

if (imm 24 {5}) PSR{5} = 0;) // mfh<br />

if (imm 24{13}) PSR{13} = 0;) // ic<br />

if (imm 24 {14}) PSR{14} = 0;) // i<br />

if (imm 24 {15}) PSR{15} = 0;) // pk<br />

if (imm 24 {17}) PSR{17} = 0;) // dt<br />

if (imm 24 {18}) PSR{18} = 0;) // dfl<br />

if (imm 24 {19}) PSR{19} = 0;) // dfh<br />

if (imm 24 {20}) PSR{20} = 0;) // sp<br />

if (imm 24 {21}) PSR{21} = 0;) // pp<br />

if (imm 24 {22}) PSR{22} = 0;) // di<br />

if (imm 24 {23}) PSR{23} = 0;) // si<br />

第 3 巻 : 命令リファレンス 3:213


割り込み : 特権操作フ ォル ト 予約レジスタ / フィールド ・フォルト<br />

シリアル化 : ソフ ト ウェアは、 変更されたPSR ビッ ト (PSR.i ビッ トを除く ) に依存する命令を発行す<br />

る前に、 デー タ ま たは命令のシ リ アル化操作を実行しなければな ら ない。 PSR.i ビッ ト<br />

は、 暗黙的にシ リ アル化 さ れる。 プ ロ セ ッ サは、 次の命令が実行 さ れる ま で、 外部割 り<br />

込みがマス ク される よ う にする。<br />

3:214 第 3 巻 : 命令リファレンス<br />

rsm


um<br />

rum ─ ユーザ・マスクのリセット (Reset User Mask)<br />

書式 : (qp) rumimm 24 M44<br />

説明 : imm24 オペラン ド の補数とユーザ ・ マスク (PSR{5:0}) と の論理積が取られ、 その結果が<br />

ユーザ ・ マスクに格納される。 第 2 巻、 第 1 部の 3.3.2 項 「プロセッサ ・ ステータス ・ レ<br />

ジスタ (PSR)」 を参照のこ と。<br />

PSR.up は、 セキ ュ リ テ ィ ・ パフ ォ ーマンス ・ モニタ ・ ビ ッ ト (PSR.sp) がゼロの場合に限<br />

りクリアされる。 そうでない場合は、 RSP.up は変更されない<br />

操作 : if (PR[qp]) {<br />

if (is_reserved_field(PSR_TYPE, PSR_UM, imm 24 ))<br />

reserved_register_field_fault();<br />

}<br />

if (imm 24 {1}) PSR{1} = 0;<br />

if (imm 24 {2} && PSR.sp == 0) //non-secure perf monitor<br />

PSR{2} = 0;<br />

if (imm 24 {3}) PSR{3} = 0;<br />

if (imm 24 {4}) PSR{4} = 0;<br />

if (imm 24{5}) PSR{5} = 0;<br />

割り込み : 予約レ ジ ス タ / フィールド ・フォルト<br />

シリアル化 : すべてのユーザ ・ マスクの変更は、 次の命令グループによ って検出される。<br />

第 3 巻 : 命令リファレンス 3:215


setf ─ 浮動小数点数、指数、仮数の設定<br />

(Set Floating-point Value, Exponent, or Significand)<br />

書式 : (qp) setf.sf 1 = r 2 single_form M18<br />

(qp) setf.df 1 = r 2 double_form M18<br />

(qp) setf.expf 1 = r 2 exponent_form M18<br />

(qp) setf.sigf 1 = r 2 significand_form M18<br />

説明 : 単精度お よ び倍精度形式では、 第 1 巻、 第 1 部の図 5-7 および第 1 巻、 第 1 部の図 5-8 に<br />

それぞれ示される よ う に、 GR r2 がそれぞれ単精度 (single_form の場合 ) または倍精度<br />

(double_form の場合 ) の メ モ リ 表現 と して扱われ、 浮動小数点レ ジ ス タ形式に変換 され、<br />

FR f1 に格納される。<br />

exponent_from では、 GR r2 のビッ ト 16:0 が FR f1 の指数フ ィ ール ド に コ ピ ー され、 GR r2 のビ ッ ト 17 が FR f1 の符号ビ ッ ト に コ ピ ー される。 FR f1 の仮数フ ィ ール ド は 1<br />

(0x800...000) に設定される。<br />

図 2-41. setf.exp の機能<br />

significand_form では、 GR r2 の値が FR f1 の仮数フ ィ ール ド に コ ピ ー される。<br />

FR f1 の指数フ ィ ール ド は 2.063 (0x1003E) のバイアス付き指数に設定 さ れ、 FR f1 の符号<br />

フィールドは正に対応する0 に設定される。<br />

図 2-42. setf.sig の機能<br />

GR r 1<br />

FR f 1<br />

GR r 1<br />

FR f 1<br />

s<br />

0<br />

63<br />

指数<br />

63<br />

0x1003E<br />

すべての形式で、 r 2 に対応する NaT ビットが1 の場合は、 FR f 1 は計算結果ではな く<br />

NatVal に設定される。<br />

3:216 第 3 巻 : 命令リファレンス<br />

1000<br />

18 17<br />

. . .<br />

仮数<br />

0<br />

0<br />

000<br />

setf


setf<br />

操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1);<br />

if (tmp_isrcode = fp_reg_disabled(f 1 , 0, 0, 0))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

}<br />

if (!GR[r 2 ].nat) {<br />

if (single_form)<br />

FR[f 1 ] = fp_mem_to_fr_format(GR[r 2 ], 4, 0);<br />

else if (double_form)<br />

FR[f 1 ] = fp_mem_to_fr_format(GR[r 2 ], 8, 0);<br />

else if (significand_form) {<br />

FR[f 1 ].significand = GR[r 2 ];<br />

FR[f 1 ].exponent = FP_INTEGER_EXP;<br />

FR[f 1 ].sign = 0;<br />

} else { // exponent_form<br />

FR[f1].significand = 0x8000000000000000;<br />

FR[f1].exp = GR[r2]{16:0};<br />

FR[f1].sign = GR[r2]{17};<br />

}<br />

} else<br />

FR[f 1 ] = NATVAL;<br />

fp_update_psr(f 1 );<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点レ ジ ス タ無効フ ォ ル ト<br />

第 3 巻 : 命令リファレンス 3:217


shl ─ 左シフト (Shift Left)<br />

書式 : (qp) shlr 1 = r 2 , r 3 I7<br />

(qp) shlr 1 = r 2 , count 6 (qp) dep.zr 1 = r 2 , count 6 , 64–count 6 の擬似オペコ ー ド<br />

説明 : GR r2 の値が左にシフト され、 空きになったビッ ト位置にゼロが埋められ、 GR r1 に格納<br />

される。 シフ ト されるビッ ト数は、 GR r3 または即値count6 によって指定される。 この<br />

シフ ト ・ カウント は符号なし数値として解釈される。 GR r3 の値が 63 より大きい場合<br />

は、 結果はすべてゼロ ・ ビ ッ ト になる。<br />

即値形式については、 3:45 ページの 「dep — デポジ ッ ト (Deposit)」 を参照のこ と。<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1 );<br />

}<br />

割り込み : 無効操作フ ォ ル ト<br />

count = GR[r 3 ];<br />

GR[r 1 ] = (count > 63) ? 0: GR[r 2 ]


shladd<br />

shladd ─ 左シフトおよび加算 (Shift Left and Add)<br />

書式 : (qp) shladdr 1 = r 2 , count 2 , r 3 A2<br />

説明 : 第 1 ソース・オペランドが、 count 2 ビットだけ左にシフトされ、 次に、 第2 ソース・オ<br />

ペラ ン ド に加算 され、 その結果が GR r 1 に格納される。 第 1 オペラン ド に対しては 1、<br />

2、 3、 あるいは 4 ビットだけシフトできる。<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1 );<br />

}<br />

割り込み : 無効操作フ ォ ル ト<br />

GR[r 1] = (GR[r 2]


shladdp4 ─ ポインタの左シフトおよび加算 (Shift Left and Add Pointer)<br />

shladdp4<br />

書式 : (qp) shladdp4 r 1 = r 2 , count 2 , r 3 A2<br />

説明 : 第 1 ソース・オペランドが、 count 2 ビッ トだけ左にシフトされ、 次に、 第2ソース・オ<br />

ペラン ド に加算される。 結果の上位32 ビッ トがゼロにクリアされ、 次に、 GR r 3 のビッ<br />

ト {31:30} が結果のビ ッ ト {62:61} に コ ピ ー さ れる。 こ の結果が GR r 1 に格納される。 第<br />

1 オペラン ド は、 1、 2、 3、 あるいは 4 ビッ トだけシフトできる。<br />

図 2-43. ポインタの左シフトおよび加算<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1 );<br />

}<br />

GR r 2 :<br />

割り込み : 無効操作フ ォ ル ト<br />

GR r 1 :<br />

tmp_res = (GR[r 2 ]


shr<br />

shr ─ 右シフト (Shift Right)<br />

書式 : (qp) shrr1 = r3 , r2 signed_form I5<br />

(qp) shr.ur1 = r3 , r2 unsigned_form I5<br />

(qp) shrr1 = r3 , count6 (qp) extrr1 = r3 , count6 , 64–count6 の擬似オペコ ー ド<br />

(qp) shr.ur1 = r3 , count6 (qp) extr.ur1 = r3 , count6 , 64–count6 の擬似オペコ ー ド<br />

説明 : GR r3 内の値が右にシ フ ト され、 GR r1 に格納される。 signed_form では、 空きになった<br />

ビッ ト位置にGR r3 のビッ ト 63 が埋め られ、 unsigned_form では、 空きになったビ ッ ト<br />

位置にゼ ロ が埋め ら れる。 シ フ ト さ れる ビ ッ ト 数は、 GR r2 の値ま たは即値 count6 で指<br />

定 される。 シ フ ト ・ カ ウ ン ト は符号なし数値 と して解釈 さ れる。 GR r2 の値が 63 より大<br />

きい場合の結果は、 unsigned_form の場合あるいは GR r3 のビッ ト 63 が 0 の場合はすべ<br />

て 0 ビットに、 signed_form で GR r3 のビッ ト 63 が 1 の場合にはすべて 1 ビッ トになる。<br />

.u コ ンプ リ ー タが指定された場合はシフ ト は符号なし ( 論理 ) シフ ト になり、 指定されな<br />

い場合は符号付き ( 算術 ) シフ トになる。<br />

即値形式については、 3:48 ページの 「extr — 抽出 (Extract)」 を参照のこ と。<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1);<br />

}<br />

割り込み : 無効操作フ ォ ル ト<br />

if (signed_form) {<br />

count = (GR[r 2] > 63) ? 63 : GR[r 2];<br />

GR[r 1 ] = shift_right_signed(GR[r 3 ], count);<br />

} else {<br />

count = GR[r 2];<br />

GR[r 1 ] = (count > 63) ? 0 : shift_right_unsigned(GR[r 3 ], count);<br />

}<br />

GR[r 1 ].nat = GR[r 2 ].nat || GR[r 3 ].nat;<br />

第 3 巻 : 命令リファレンス 3:221


shrp ─ ペア右シフト (Shift Right Pair)<br />

書式 : (qp) shrpr 1 = r 2 , r 3 , count 6 I10<br />

説明 : 2 つのソース ・ オペラン ド GR r2 と GR r3 が連結されて 128 ビッ ト値が形成され、 count6 ビ ッ ト だけ右にシ フ ト される。 結果の最下位 64 ビットがGR r1 に格納される。<br />

即値 count6 には 0 ~ 63 の範囲内の任意の数値を使用で き る。<br />

図 2-44. ペア右シフト<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1 );<br />

}<br />

GR r 2 :<br />

割り込み : 無効操作フ ォ ル ト<br />

temp1 = shift_right_unsigned(GR[r 3], count 6);<br />

temp2 = GR[r 2 ]


srlz<br />

srlz ─ シリアル化 (Serialize)<br />

書式 : (qp) srlz.i instruction_form M24<br />

(qp) srlz.d data_form M24<br />

説明 : 命令のシ リ アル化 (srlz.i) によって、 以下のことが保証される。<br />

• 後続の命令グループのフェッチに影響するプロセッサ・ レジスタ ・ リソースに対す<br />

る、 先行する変更が検出で き る。<br />

• 後続のプ ロ グ ラ ム実行 ま たはデー タ ・ メ モ リ ・ ア ク セス に影響す る プ ロ セ ッ サ ・ レ<br />

ジスタ ・ リ ソースに対する、 先行する変更が検出できる。<br />

• 先行メ モ リ 同期 (sync.i) 操作が、 ロ ー カ ル ・ プ ロ セ ッ サの命令キ ャ ッ シ ュ に対して<br />

効果を与え る。<br />

• srlz.i 命令終了後の後続の命令グル ー プの フ ェ ッ チが再初期化される。<br />

srlz.i 命令は、 シ リ アル化される操作がある命令グループ よ り後の命令グループ内にな<br />

ければな ら ない。 シ リ アル化に依存する操作は、 srlz.i 命令がある命令グル ー プ よ り<br />

後の命令グループになければな ら ない。<br />

データのシリアル化(srlz.d) によって、 以下のことが保証される。<br />

• 後続のプ ロ グ ラ ム実行 ま たはデー タ ・ メ モ リ ・ ア ク セスに影響を与え る プ ロ セ ッ サ ・<br />

レ ジ ス タ ・ リ ソ ー ス に対す る、 先行する変更が検出 さ れる。<br />

srlz.d 命令は、 シ リ アル化される操作を含む命令グループ よ り後の命令グループに含ま<br />

れていなければな ら ない。 シ リ アル化に依存する操作は、 srlz.d よ り 後に置かれてい<br />

なければならないが、 srlz.d と同じ命令グループに含まれていてもかまわない。<br />

srlz を使用して、 先行するデータ ・ メモ リ参照またはメモ リ ・ フ ェンスが外部プラ ッ ト<br />

フ ォ ー ムに よ っ て検出可能になる か 「受け入れられる」 ま で、 プ ロ セ ッ サのデー タ ・ メ<br />

モリ参照を停止できない。<br />

以下のプ ロ セ ッ サ ・ リ ソ ー ス は、 副次的作用が検出 さ れる よ う に、 シ リ アル化操作が必<br />

要である。 CR、 PSR、 DBR、 IBR、 PMD、 PMC、 RR、 PKR、 TR、 TC( 詳細は、 第 2 巻、<br />

第 1 部の 3.2 節 「シ リアル化」 を参照 )。<br />

操作 : if (PR[qp]) {<br />

if (instruction_form)<br />

instruction_serialize();<br />

else // data_form<br />

data_serialize();<br />

}<br />

割り込み : なし<br />

第 3 巻 : 命令リファレンス 3:223


ssm ─ システム・マスクの設定 (Set System Mask)<br />

書式 : (qp) ssmimm 24 M44<br />

説明 : この命令は、 imm24 オペラン ド と システム ・ マスク (PSR{23:0}) の OR( 論理和 ) 演算を実<br />

行し、 その結果をシステム ・ マスクに格納する。 第 2 巻、 第 1 部の 3.3.2 項 「プロセッ<br />

サ・ステータス・レジスタ(PSR)」 を参照のこ と。<br />

PSR シ ス テ ム ・ マス ク は、 最高の特権レベル以外では書き込めない。<br />

PSR.ic ビ ッ ト が イ ネ ー ブルに されてか ら 後続の命令シ リ アル化操作が発行される ま での<br />

間に割り込みが発生した場合、 (PSR.ic ビッ トが1 の場合に上書き される ) 割り込みリ<br />

ソ ー スの内容は不定にな る。<br />

操作 : if (PR[qp]) {<br />

if (PSR.cpl != 0)<br />

privileged_operation_fault(0);<br />

}<br />

if (is_reserved_field(PSR_TYPE, PSR_SM, imm 24 ))<br />

reserved_register_field_fault();<br />

if (imm 24 {1}) PSR{1} = 1;) // be<br />

if (imm 24 {2}) PSR{2} = 1;) // up<br />

if (imm 24 {3}) PSR{3} = 1;) // ac<br />

if (imm 24 {4}) PSR{4} = 1;) // mfl<br />

if (imm 24 {5}) PSR{5} = 1;) // mfh<br />

if (imm 24 {13}) PSR{13} = 1;) // ic<br />

if (imm 24 {14}) PSR{14} = 1;) // i<br />

if (imm 24 {15}) PSR{15} = 1;) // pk<br />

if (imm 24 {17}) PSR{17} = 1;) // dt<br />

if (imm 24 {18}) PSR{18} = 1;) // dfl<br />

if (imm 24 {19}) PSR{19} = 1;) // dfh<br />

if (imm 24 {20}) PSR{20} = 1;) // sp<br />

if (imm 24 {21}) PSR{21} = 1;) // pp<br />

if (imm 24 {22}) PSR{22} = 1;) // di<br />

if (imm 24 {23}) PSR{23} = 1;) // si<br />

割り込み : 特権操作フ ォル ト 予約レジスタ / フィールド ・フォルト<br />

シリアル化 : ソフ ト ウェアは、 ssm 命令に よ っ て変更された PSR ビッ トに依存する命令を発行する前<br />

に、 デー タ ま たは命令のシ リ アル化操作を発行しなければな ら ない。 rsm 命令の場合 と<br />

は異な り、 PSR.i ビ ッ ト がセ ッ ト された場合に特別に扱われる ( 暗黙的にシ リ アル化 さ れ<br />

る ) ことはない。 シリアル化についての詳細は、 第 2 巻、 第 1 部の 3.2 節 「シリアル化」<br />

を参照のこ と。<br />

3:224 第 3 巻 : 命令リファレンス<br />

ssm


st<br />

st ─ ストア (Store)<br />

書式 : (qp) stsz.sttype.sthint [r 3 ] = r 2 normal_form, no_base_update_form M4<br />

(qp) stsz.sttype.sthint [r 3 ] = r 2 , imm 9 normal_form, imm_base_update_form M5<br />

(qp) st16.sttype.sthint [r 3] = r 2, ar.csd sixteen_byte_form, no_base_update_form M4<br />

(qp) st8.spill.sthint [r 3 ] = r 2 spill_form, no_base_update_form M4<br />

(qp) st8.spill.sthint [r 3 ] = r 2 , imm 9 spill_form, imm_base_update_form M5<br />

説明 : GR r2 から最下位から sz バイ ト の値が取り出され、 GR r3 の値に よ っ て指定されるア ド レ<br />

スから始まるメモリ位置に書き込まれる。 sz コンプリータの値は、 3:134 ページの表 2-32<br />

に示している。 sttype コ ンプ リ ー タで特殊なス ト ア操作を指定する。 それら の操作の説明<br />

を表 2-49 に示す。 GR r3 に対応する NaT ビッ トが1 であ る場合、 ま たは<br />

sixteen_byte_form または normal_form では、 GR r2 に対応する NaT ビッ トが1 である場合<br />

は、 レジスタ NaT 参照 (Register NaT Consumption) フォルトが発生する。<br />

sixteen_byte_form では、 2 つの 8 バイ ト値が 16 バイ ト のアト ミ ッ ク ・ メモリ書き込みと<br />

して 1 回でス ト アされる。 GR r2 の値は、 GR r3 の値で指定されるア ド レスから メモ リ に<br />

書き込まれる。 Compare and Store Data アプ リ ケーシ ョ ン ・ レジスタ (AR[CSD]) の値は、<br />

GR r3 の値に 8 を加えた値で指定されるアド レスからメモリに書き込まれる。<br />

spill_form では、 8 バイ ト値がス ト アされ、 GR r2 に対応する NaT ビットがUNAT アプ リ<br />

ケーション ・ レジスタの特定ビットにコピーされる。 この命令は、 レジスタ /NaT のペア<br />

を ス ピルする場合に使用 さ れる。 詳細は、 第 1 巻、 第 1 部の 4.4.4 項 「コン ト ロール ・ ス<br />

ペキュ レーシ ョ ン」 を参照のこ と。<br />

imm_base_update 形式では、 GR r3 の値が符号付き即値 (imm9 ) に加算 さ れ、 その結果が<br />

GR r3 に戻される。 こ のベース ・ レ ジス タの更新はス ト アの後で行われ、 ス ト ア ・ ア ド<br />

レスにも、 ス トアされる値(r3 と r2 が同じ レ ジス タを指定している場合 ) にも影響しな<br />

い。 ベース ・ レ ジス タ更新は、 st16 命令ではサポ ー ト さ れていない。<br />

表 2-49. ストアのタイプ<br />

sttype<br />

コンプリータ<br />

意味 特殊なストア操作<br />

none 通常のストア<br />

rel 順序付けされたストア<br />

release セマンティックス付きで順序付けされたストアが実<br />

行される。<br />

順序付け されたス ト アの詳細は、 第 1 巻、 第 1 部の 4.4.7 項 「メモリ ・ アクセスの順序」<br />

を参照のこ と。<br />

物理メ モ リ ・ ア ド レ ス と ア ク セス ・ サイ ズを使用して ALAT が照会され、 すべてのオ ー<br />

バラ ップ ・ エン ト リが無効にされる。<br />

sthint コ ンプ リ ー タの値で、 メモ リ ・ ア ク セスの局所性を指定する。 sthint コンプリータ<br />

の値を表 2-50 に示す。 base_update 形式に は、 プ リ フ ェ ッ チ ・ ヒ ン ト が暗黙的に含 ま れて<br />

いる。 ベースの更新後の GR r3 の値で指定される ア ド レ スが、 指定 さ れたキ ャ ッ シ ュ ・<br />

ラインをプリフェッチするように指示するヒント として機能する。 このプリフェッチは、<br />

sthint で指定 さ れる局所性 ヒ ン ト を使用す る。 詳細は、 第 1 巻、 第 1 部の 4.4.6 項 「メモ<br />

リ 階層の制御 と 整合性」 を参照のこ と。<br />

ライ トバック ・ ポリシーを持つキャッシュ可能ページでも NaTPage でもないページを参<br />

照する st16 命令がハー ド ウ ェ ア上でサポ ー ト されるか ど う かは、 プ ロセ ッ サに よ っ て<br />

異なる。 この よ う な st16 アクセスをサポー ト しないプロセッサ ・モデル上で、 サポー<br />

ト されていない参照を行 う と 、 サポ ー ト さ れないデー タ参照フ ォ ル ト が発生す る。<br />

第 3 巻 : 命令リファレンス 3:225


表 2-50. ストアのヒント<br />

操作 : if (PR[qp]) {<br />

size = spill_form ? 8 : (sixteen_byte_form ? 16 : sz);<br />

itype = WRITE;<br />

if (size == 16) itype |= UNCACHE_OPT;<br />

otype = (sttype == ‘rel’) ? RELEASE : UNORDERED;<br />

}<br />

sthint コンプリータ 意味<br />

none 時間的局所性、レベル 1<br />

nta 非時間的局所性、全レベル<br />

if (imm_base_update_form)<br />

check_target_register(r 3);<br />

if (GR[r 3 ].nat || ((sixteen_byte_form || normal_form) && GR[r 2 ].nat))<br />

register_nat_consumption_fault(WRITE);<br />

paddr = tlb_translate(GR[r 3 ], size, itype, PSR.cpl, &mattr,<br />

&tmp_unused);<br />

if (spill_form && GR[r 2].nat) {<br />

natd_gr_write(GR[r 2 ], paddr, size, UM.be, mattr, otype, sthint);<br />

}<br />

else {<br />

if (sixteen_byte_form)<br />

mem_write16(GR[r 2 ], AR[CSD], paddr, UM.be, mattr, otype, sthint);<br />

else<br />

mem_write(GR[r 2 ], paddr, size, UM.be, mattr, otype, sthint);<br />

}<br />

if (spill_form) {<br />

bit_pos = GR[r 3 ]{8:3};<br />

AR[UNAT]{bit_pos} = GR[r 2 ].nat;<br />

}<br />

alat_inval_multiple_entries(paddr, size);<br />

if (imm_base_update_form) {<br />

GR[r 3 ] = GR[r 3 ] + sign_ext(imm 9 , 9);<br />

GR[r 3 ].nat = 0;<br />

mem_implicit_prefetch(GR[r 3 ], sthint, WRITE);<br />

}<br />

割り込み : 無効操作フ ォ ル ト デー タ ・ キ ー ・ ミ ス ・ フ ォ ル ト<br />

レジスタ NaT 参照フ ォ ル ト デー タ ・ キ ー許可フ ォ ル ト<br />

実装 さ れていないデ ー タ ・ ア ド レ ス ・ フ ォ ル ト デー タ ・ ア ク セス権フ ォ ル ト<br />

データがネス ト された TLB フォルト データ・ダーティ・ビット ・フォルト<br />

別のデー タ TLB フォルト データ・アクセス・ビット ・フォルト<br />

VHPT データ ・ フォル ト データ ・ デバッグ ・ フォル ト<br />

データ TLB フ ォル ト アライ メン ト の合っていないデー タ参照<br />

データ ・ページ不在フォルト フォルト<br />

データ Nat ページ参照フ ォル ト サポー ト されていないデー タ参照<br />

フォルト<br />

3:226 第 3 巻 : 命令リファレンス<br />

st


stf<br />

stf ─ 浮動小数点ストア (Floating-point Store)<br />

書式 : (qp) stffsz.sthint [r 3 ] = f 2 normal_form, no_base_update_form M9<br />

(qp) stffsz.sthint [r 3 ] = f 2 , imm 9 normal_form, imm_base_update_form M10<br />

(qp) stf8.sthint [r 3 ] = f 2 integer_form, no_base_update_form M9<br />

(qp) stf8.sthint [r 3 ] = f 2 , imm 9 integer_form, imm_base_update_form M10<br />

(qp) stf.spill.sthint [r 3 ] = f 2 spill_form, no_base_update_form M9<br />

(qp) stf.spill.sthint [r 3 ] = f 2 , imm 9 spill_form, imm_base_update_form M10<br />

説明 : FR f2 から fsz バイ ト の値が取り出され、 GR r3 の値で指定されるアド レスから始まるメモ<br />

リ位置に書き込まれる。 normal_form では、 FR f2 の値が メ モ り 形式に変換 さ れてか ら ス<br />

トアされる。 integer_form では、 FR f2 の仮数がス ト アされる。 fsz コンプリータの値は<br />

3:139 ページの表 2-35 に示している。 normal_form または integer_from では、 GR r3 に対<br />

応する NaT ビットが1 か、 あるいは FR f2 の内容が NaTVal である場合は、 レジスタ NaT<br />

参照 (Register NaT Consumption) フ ォ ル ト が発生する。 浮動小数点レジス タ形式か らの変<br />

換の詳細は、 第 1 巻、 第 1 部の 5.1 節 「データ型および形式」 を参照のこ と。<br />

spill_form では、 FR f2 から 16 バイ ト の値が取り出されて、 変換されないでストアされ る。 こ の命令は レ ジ ス タ を ス ピルす る場合に使用 さ れる。 詳細は、 第 1 巻、 第 1 部の<br />

4.4.4 項 「コン ト ロール ・ スペキュレーシ ョ ン」 を参照のこ と。<br />

imm_base_update 形式では、 GR r3 の値が符号付き即値 (imm9 ) に加算 さ れ、 結果が GR r3 に戻される。 こ のベース ・ レ ジス タの更新はス ト アの後で行われ、 ス ト ア ・ ア ド レスに<br />

は影響しない。<br />

物理メ モ リ ・ ア ド レ ス と ア ク セス ・ サイ ズを使用して ALAT が照会され、 すべてのオ ー<br />

バラ ップ ・ エン ト リが無効にされる。<br />

sthint コ ン プ リ ー タ の値で メ モ リ ・ ア ク セスの局所性を指定す る。 stint コンプリータの値<br />

は、 3:226 ページの表 2-50 に示している。 base_update 形式には、 プ リ フ ェ ッ チ ・ ヒ ン ト<br />

が暗黙的に含まれている。 ベー スの更新後の GR r3 の値に よ っ て指定されるア ド レスが、<br />

指定 さ れたキ ャ ッ シ ュ ・ ラ イ ン をプ リ フ ェ ッ チす る よ う に指示する ヒ ン ト と して機能す<br />

る。 このプ リ フ ェ ッチは、 sthint で指定される局所性ヒン ト を使用する。 第 1 巻、 第 1 部<br />

の 4.4.6 項 「メ モ リ 階層の制御 と 整合性」 を参照のこ と。<br />

ライ トバック ・ ポリシーを持つキャッシュ可能ページでも NaTPage でもないページを参<br />

照する stfe(10 バイ ト ) 命令が、 ハー ド ウ ェ ア上でサポ ー ト さ れる か ど う かは、 プ ロ<br />

セッサによって異なる。 このようなstfe アクセスをサポー トしないプロセッサ・モデ<br />

ル上で、 サポ ー ト さ れていない参照を行 う と 、 サポ ー ト さ れないデ ー タ参照フ ォ ル ト が<br />

発生す る。<br />

操作 : if (PR[qp]) {<br />

if (imm_base_update_form)<br />

check_target_register(r 3);<br />

if (tmp_isrcode = fp_reg_disabled(f 2 , 0, 0, 0))<br />

disabled_fp_register_fault(tmp_isrcode, WRITE);<br />

if (GR[r 3 ].nat || (!spill_form && (FR[f 2 ] == NATVAL)))<br />

register_nat_consumption_fault(WRITE);<br />

size = spill_form ? 16 : (integer_form ? 8 : fsz);<br />

itype = WRITE;<br />

if (size == 10) itype |= UNCACHE_OPT;<br />

paddr = tlb_translate(GR[r 3 ], size, itype, PSR.cpl, &mattr, &tmp_unused);<br />

val = fp_fr_to_mem_format(FR[f 2], size, integer_form);<br />

mem_write(val, paddr, size, UM.be, mattr, UNORDERED, sthint);<br />

第 3 巻 : 命令リファレンス 3:227


}<br />

alat_inval_multiple_entries(paddr, size);<br />

if (imm_base_update_form) {<br />

GR[r 3 ] = GR[r 3 ] + sign_ext(imm 9 , 9);<br />

GR[r 3].nat = 0;<br />

mem_implicit_prefetch(GR[r 3 ], sthint, WRITE);<br />

}<br />

割り込み : 無効操作フ ォ ル ト デー タ NaT ページ参照フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト デー タ ・ キ ー ・ ミ ス ・ フ ォ ル ト<br />

レジスタ NaT 参照フ ォ ル ト デー タ ・ キ ー許可フ ォ ル ト<br />

実装 さ れていないデ ー タ ・ ア ド レ ス ・ フ ォ ル ト デー タ ・ ア ク セス権フ ォ ル ト<br />

データがネス ト された TLB フォルト データ・ダーティ・ビット ・フォルト<br />

別のデー タ TLB フォルト データ・アクセス・ビット ・フォルト<br />

VHPT データ ・ フォル ト データ ・ デバッグ ・ フォル ト<br />

データ TLB フォルト アライメントの合っていない<br />

データ ・ ページ不在フォルト データ参照フォルト<br />

3:228 第 3 巻 : 命令リファレンス<br />

stf


sub<br />

sub ─ 減算 (Subtract)<br />

書式 : (qp) subr 1 = r 2 , r 3 register_form A1<br />

(qp) subr 1 = r 2 , r 3 , 1 minus1_form, register_form A1<br />

(qp) subr 1 = imm 8 , r 3 imm8_form A3<br />

説明 : 第 2 ソース・オペランド ( および任意設定の定数1) が第 1 オペラ ン ド か ら 減算 さ れ、 結<br />

果が GR r1 に格納される。 レジスタ形式では、 第 1 オペラン ド は GR r2 であ り 、 即値形<br />

式では、 第 1 オペラ ン ド は符号拡張 さ れた imm8 のエンコ ーデ ィ ング ・ フ ィ ール ド で与<br />

えられる。<br />

minus1_form は、 register_form でのみ使用可能である ( ただし、 即値を調整する と、 即値<br />

形式で も 同じ結果が得 ら れる )。<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1 );<br />

}<br />

割り込み : 無効操作フ ォ ル ト<br />

tmp_src = (register_form ? GR[r 2 ] : sign_ext(imm 8 , 8));<br />

tmp_nat = (register_form ? GR[r 2 ].nat : 0);<br />

if (minus1_form)<br />

GR[r 1 ] = tmp_src - GR[r 3 ] - 1;<br />

else<br />

GR[r 1 ] = tmp_src - GR[r 3 ];<br />

GR[r 1 ].nat = tmp_nat || GR[r 3 ].nat;<br />

第 3 巻 : 命令リファレンス 3:229


sum ─ ユーザ・マスクの設定 (Set User Mask)<br />

書式 : (qp) sumimm 24 M44<br />

説明 : imm24 オペラン ド とユーザ ・ マスク (PSR{5:0}) との論理和が取られ、 結果がユーザ・マ<br />

スクに戻される。 第 2 巻、 第 1 部の 3.3.2 項 「プロセッサ ・ ステータス ・ レジスタ<br />

(PSR)」 を参照のこ と。<br />

PSR.up は、 セキ ュ リ テ ィ ・ パフ ォ ーマンス ・ モニタ ・ ビ ッ ト (PSR.sp) がゼロの場合に限<br />

りセッ トできる。 そうでない場合は、 PSR.up は変更できない。<br />

操作 : if (PR[qp]) {<br />

if (is_reserved_field(PSR_TYPE, PSR_UM, imm 24 ))<br />

reserved_register_field_fault();<br />

}<br />

if (imm 24 {1}) PSR{1} = 1;) // be<br />

if (imm 24 {2} && PSR.sp == 0) //non-secure perf monitor<br />

PSR{2} = 1;) // up<br />

if (imm 24 {3}) PSR{3} = 1;) // ac<br />

if (imm 24 {4}) PSR{4} = 1;) // mfl<br />

if (imm 24{5}) PSR{5} = 1;) // mfh<br />

割り込み : 予約レ ジ ス タ / フィールド ・フォルト<br />

シリアル化 : すべてのユーザ ・ マスクの変更は、 次の命令グループによ って検出される。<br />

3:230 第 3 巻 : 命令リファレンス<br />

sum


sxt<br />

sxt ─ 符号拡張 (Sign Extend)<br />

書式 : (qp) sxtxsz r 1 = r 3 I29<br />

説明 : GR r 3 の値が、 xsz に よ っ て指定される ビ ッ ト 位置か ら 符号拡張 さ れ、 結果が GR r 1 に格<br />

納される。 xsz のニーモニ ッ ク値を表 2-51 に示す。<br />

表 2-51. xsz ニーモニック値<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1 );<br />

}<br />

割り込み : 無効操作フ ォ ル ト<br />

xsz ニーモニック ビット位置<br />

1 7<br />

2 15<br />

4 31<br />

GR[r 1] = sign_ext(GR[r 3],xsz * 8);<br />

GR[r 1 ].nat = GR[r 3 ].nat;<br />

第 3 巻 : 命令リファレンス 3:231


sync ─ メモリ同期化 (Memory Synchronization)<br />

書式 : (qp) sync.i M24<br />

説明 : sync.i 命令に よ っ て、 ロ ー カ ル ・ プ ロ セ ッ サか ら 以前に発行さ れたキ ャ ッ シ ュ のフ ラ ッ<br />

シュ (fc、 fci) 操作がロ ー カル ・ デー タ ・ メ モ リ の参照で検出可能にな っ た時点に、 先行<br />

の fc 操作がロ ー カル ・ プ ロセ ッ サの命令フ ェ ッ チ ・ ス ト リ ー ムか ら も 検出される こ と が<br />

保証 される。 さ ら に、 fc、 fci 操作が事前に起動 されている と 、 それら の操作が リ モー<br />

ト・プロセッサ上のデータ・メモリの参照で検出されるようになった時点に、 リモート・<br />

プ ロセ ッ サ上の命令メモ リ 参照で も 検出 される こ と が保証 される。 sync.i は、 別のプロ<br />

セッサから観察される よ う に、 すべてのキャ ッ シュ ・ フラ ッ シュ操作に対して順序付け<br />

される。 sync.i とそれに先行する fc は、 別々の命令グループになければならない。 セ<br />

マンテ ィ ッ クス上の必要がある場合、 sync.i により fc、 fci が他のプロセ ッ サ上のデー<br />

タ ・ ス ト リ ー ムか ら検出で き る よ う に適切に強制す るためには、 プ ラ グ ラ マは明示的に<br />

順序づけ されたデー タ参照 (acquire ( 取得 )、 release ( 解放 )、 fence ( フェンス) のいずれか<br />

のタイプ ) を挿入しなければならない。<br />

sync.i は、 ロー カル ・ プロセ ッサおよび リ モー ト ・ プロセッサ上の命令キ ャ ッ シ ュ と<br />

デ ー タ ・ キ ャ ッ シ ュ と の間の順序付け関係を維持する場合に使用 さ れる。 命令を シ リ ア<br />

ル化す る操作を使用して、 ロ ー カ ル ・ プ ロ セ ッ サで sync.i に よ っ て起動された同期化<br />

操作がプ ロ グ ラ ム実行中の特定の時点で観察 さ れていた こ と を確認で き る。<br />

自己修正コ ー ド ( ローカル・プロセッサ) の例 :<br />

3:232 第 3 巻 : 命令リファレンス<br />

sync<br />

st [L1] = data //store into local instruction stream<br />

fc L1 //flush stale datum from instruction/data cache<br />

;; //require instruction boundary between fc and sync.i<br />

sync.i //ensure local and remote data/inst caches<br />

//are synchronized<br />

;;<br />

srlz.i //ensure sync has been observed by the local processor,<br />

;; //ensure subsequent instructions observe<br />

//modified memory<br />

L1: target //instruction modified<br />

操作 : if (PR[qp]) {<br />

instruction_synchronize();<br />

}<br />

割り込み : なし


tak<br />

tak ─ トランスレーション・アクセス・キー (Translation Access Key)<br />

書式 : (qp) takr 1 = r 3 M46<br />

説明 : こ の命令は、 指定 さ れた仮想ア ド レ スの保護キ ー を取得し、 GR r1 に格納する。<br />

PSR.dt が 1 の場合は、 DTLB および VHPT 内で、 GR r3 に指定される仮想ア ド レス と、<br />

GR r3 のビ ッ ト {63:61} でインデッ クスが付けられたリ ージ ョ ン ・ レジスタが検索され<br />

る。 一致する現在の変換エン ト リ が見つか った場合は、 その変換エン ト リ の保護キーが<br />

GR r1 に格納される。 一致する現在の変換エン ト リ が見つか ら ない場合や、 実装されて<br />

いない仮想アド レスが GR r3 で指定された場合は、 1 の値が返される。<br />

PSR.dt が 0 の場合は、 VHPT ウォーカがディスエーブルにされるため、 DTLB だけが検<br />

索される。 DTLB 内で一致する現在の変換エン ト リ が見つか ら ない場合は、 1 の値が返<br />

される。<br />

NaTPage 属性を持つ変換エン ト リ も 同じ よ う に扱われ、 そのエン ト リ のキ ー ・ フ ィ ー ル<br />

ドが返される。<br />

こ の命令は、 最高の特権レ ベル以外では実行で き ない。<br />

操作 : if (PR[qp]) {<br />

itype = NON_ACCESS|TAK;<br />

check_target_register(r 1 );<br />

}<br />

if (PSR.cpl != 0)<br />

privileged_operation_fault(itype);<br />

if (GR[r 3].nat)<br />

register_nat_consumption_fault(itype);<br />

GR[r1] = tlb_access_key(GR[r3], itype);<br />

GR[r 1 ].nat = 0;<br />

割り込み : 無効操作フ ォ ル ト レ ジ ス タ NaT 参照フ ォ ル ト<br />

特権操作フ ォ ル ト<br />

第 3 巻 : 命令リファレンス 3:233


tbit ─ ビット・テスト (Test Bit)<br />

書式 : (qp) tbit.trel.ctype p 1 , p 2 = r 3 , pos 6 I16<br />

説明 : 即値 pos6 で指定される ビ ッ ト が GR r3 か ら 選択 さ れる。 選択 さ れたビ ッ ト は、 trel コン<br />

プリータに応じて補数を取られるかそのままで、 単一ビッ トの結果を形成する。 この結<br />

果は、 2 つのプレディケート ・レジスタ・デスティネーションp1 と p2 に書き込まれる。<br />

結果がデスティネーションにどのように書き込まれるかは、 ctype で指定される比較タ イ<br />

プによ って決まる。 Compare 命令 と 3:34 ページの表 2-15 を参照のこ と。<br />

trel コンプリータの値.nz および .z は、 それぞれ、 非ゼ ロ判定かゼ ロ判定かを示す。 通常<br />

タイプと unc タイプの比較では、 .z の値だけがハー ド ウ ェアに よ って直接サポ ー ト され<br />

ている。 つま り、 .nz 値は、 実際には擬似オペコ ー ド である。 .nz 値では、 アセンブラは<br />

単にプ レ デ ィ ケ ー ト ・ タ ー ゲ ッ ト 指定子を切 り 換え、 サポ ー ト さ れてい る関係を利用す<br />

る。 並列タイプは、 両方の関係がハー ド ウ ェアでサポー ト されている。<br />

表 2-52. 通常および unc タイプのビット判定での関係<br />

trel 判定関係 擬似オペコード<br />

nz 選択されたビット == 1 z p1 ↔ p2 z 選択されたビット == 0<br />

表 2-53. 並列タイプのビット判定での関係<br />

trel 判定関係<br />

nz 選択されたビット == 1<br />

z 選択されたビット == 0<br />

2 つのプレデ ィ ケー ト レジスタ ・ デステ ィ ネーシ ョ ンが同じ (p 1 と p 2 が同一のプレデ ィ<br />

ケー ト ・ レジスタを指定) 場合は、 修飾プ レ デ ィ ケ ー ト がセ ッ ト さ れてい る か、 比較タ<br />

イプが unc であれば、 こ の命令は無効操作 (Illegal Operation) フォルトを発生する。<br />

操作 : if (PR[qp]) {<br />

if (p1 == p2)<br />

illegal_operation_fault();<br />

if (trel == ‘nz’) // ‘nz’ - test for 1<br />

tmp_rel = GR[r 3 ]{pos 6 };<br />

else // ‘z’ - test for 0<br />

tmp_rel = !GR[r 3 ]{pos 6 };<br />

switch (ctype) {<br />

case ‘and’: // and-type compare<br />

if (GR[r 3 ].nat || !tmp_rel) {<br />

PR[p 1 ] = 0;<br />

PR[p 2 ] = 0;<br />

}<br />

break;<br />

case ‘or’: // or-type compare<br />

if (!GR[r 3 ].nat && tmp_rel) {<br />

PR[p 1 ] = 1;<br />

PR[p 2 ] = 1;<br />

}<br />

break;<br />

case ‘or.andcm’: // or.andcm-type compare<br />

if (!GR[r 3 ].nat && tmp_rel) {<br />

PR[p 1] = 1;<br />

3:234 第 3 巻 : 命令リファレンス<br />

tbit


tbit<br />

PR[p2 ] = 0;<br />

}<br />

break;<br />

case ‘unc’: // unc-type compare<br />

default: // normal compare<br />

if (GR[r3 ].nat) {<br />

PR[p1 ] = 0;<br />

PR[p2 ] = 0;<br />

} else {<br />

PR[p1 ] = tmp_rel;<br />

PR[p2 ] = !tmp_rel;<br />

}<br />

break;<br />

}<br />

} else {<br />

if (ctype == ‘unc’) {<br />

if (p1 == p2)<br />

illegal_operation_fault();<br />

PR[p1 ] = 0;<br />

PR[p2 ] = 0;<br />

}<br />

}<br />

割り込み : 無効操作フ ォ ル ト<br />

第 3 巻 : 命令リファレンス 3:235


thash ─ トランスレーション・ハッシュ・エントリ・アドレス<br />

(Translation Hashed Entry Address)<br />

thash<br />

書式 : (qp) thashr 1 = r 3 M46<br />

説明 : 指定した仮想ア ド レ ス に基づいて、 仮想ハ ッ シ ュ ・ ペー ジ ・ テ ー ブル (VHPT) エン ト リ ・<br />

ア ド レ スが生成 され、 結果が GR r1 に格納される。 仮想アド レスは GR r3 によって指定<br />

され、 リ ージ ョ ン ・ レジスタは GR r3 のビッ ト {63:61} によって選択される。<br />

thash 命令への入力 と して、 NaT 入力引数ま たは実装 さ れていない仮想ア ド レ スが指定<br />

された場合は、 得られるターゲッ ト ・ レジスタの値は不定であり、 NaT ビッ トが1 に<br />

セッ ト される。<br />

プロセッサが、 領域に基づく ショ ー ト形式の VHPT を使用する よ う に設定されている場<br />

合 (PTA.vf=0)、 thash の戻 り 値は、 アー キテ ク チ ャ上のシ ョ ー ト 形式のハ ッ シ ュ 関数に<br />

よって定義される。 第 2 巻、 第 1 部の 4.1.5.3 項 「リ ージ ョン ・ ベースの VHPT ショート<br />

形式」 を参照のこ と。<br />

プロセッサが、 リ ージ ョンに基づく ロング形式の VHPT を使用する よ う に設定されてい<br />

る場合 (PTA.vf=1)、 thash は、 指定された仮想ア ド レ スに対して、 プロセ ッ サ固有のロ<br />

ング形式のハッシュ関数を実行し、 ロング形式の VHPT へのハッ シュ ・ インデ ッ ク スを<br />

生成す る。<br />

ロング形式では、 VHPT 内の変換エン ト リ は、 こ の命令に よ っ て生成 さ れたハ ッ シ ュ ・<br />

インデッ クスと、 ttag 命令に よ っ て生成されたハ ッ シ ュ ・ タ グに よ っ て、 一意に識別<br />

されなければならない。<br />

ハ ッ シ ュ関数は、 実装されたすべての リ ー ジ ョ ン ・ ビ ッ ト と 、 仮想ア ド レ ス ・ ビ ッ ト<br />

{60:0} を使用して、 VHPT へのオ フ セ ッ ト を計算しなければな ら ない。 仮想ア ド レ ス ・<br />

ビッ ト {63:61} は、 シ ョ ー ト 形式のハッ シ ュでのみ、 VHPT の リ ー ジ ョ ンの計算に使用 さ<br />

れる。<br />

この命令は、 VHPT ウォーカを実装していないプロセッサ・モデルを含む、 すべてのプ<br />

ロ セ ッ サ ・ モデル上に実装 さ れていなければな ら ない。<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1 );<br />

}<br />

割り込み : 無効操作フ ォ ル ト<br />

if (GR[r 3 ].nat || unimplemented_virtual_address(GR[r 3 ])) {<br />

GR[r 1 ] = undefined();<br />

GR[r 1 ].nat = 1;<br />

} else {<br />

tmp_vr = GR[r 3 ]{63:61};<br />

tmp_va = GR[r 3 ]{60:0};<br />

GR[r 1 ] = tlb_vhpt_hash(tmp_vr, tmp_va, RR[tmp_vr].rid,<br />

RR[tmp_vr].ps);<br />

GR[r 1 ].nat = 0;<br />

}<br />

3:236 第 3 巻 : 命令リファレンス


tnat<br />

tnat ─ Test Nat テスト (Test NaT)<br />

書式 : (qp) tnat.trel.ctype p 1 , p 2 = r 3 I17<br />

説明 : GR r3 の Nat ビッ トが、 trel コンプリータに応じて補数を取られるかそのままで、 単一<br />

ビ ッ ト の結果を形成す る。 こ の結果は、 プ レ デ ィ ケ ー ト ・ レ ジ ス タ ・ デス テ ィ ネ ー シ ョ<br />

ン p1 およびp2 に書き込まれる。 結果がデスティネーションにどのように書き込まれる<br />

かは、 ctype で指定される比較タ イプに よ って決ま る。 Compare 命令 と 3:34 ページの表<br />

2-15 を 参照の こ と 。<br />

trel コンプリータの値.nz および .z は、 それぞれ、、 非ゼロ判定かゼロ判定かを示す。 通<br />

常タイプと unc タ イ プの比較では、 .z の値だけがハー ド ウ ェアに よ っ て直接サポ ー ト さ<br />

れている。 つま り、 .nz 値は、 実際には擬似オペコ ー ド である。 .nz 値では、 アセンブラ<br />

は単にプレディ ケー ト ・ ターゲッ ト指定子を切り換え、 サポー ト されている関係を利用<br />

する。 並列タイプは、 両方の関係がハー ド ウ ェアでサポー ト される。<br />

表 2-54. 通常および unc タイプの Nat 判定での関係<br />

trel 判定関係 擬似オペコード<br />

nz 選択されたビット == 1 z p1 ↔ p2 z 選択されたビット == 0<br />

表 2-55. 並列タイプの NaT 判定での関係<br />

trel 判定関係<br />

nz 選択されたビット == 1<br />

z 選択されたビット == 0<br />

2 つのプレデ ィ ケー ト レジスタ ・ デステ ィ ネーシ ョ ンが同じ (p 1 と p 2 が同一のプレデ ィ<br />

ケー ト ・ レジスタを指定) 場合は、 修飾プ レ デ ィ ケ ー ト がセ ッ ト さ れてい る か、 比較タ<br />

イプが unc であれば、 こ の命令は無効操作 (Illegal Operation) フォルトを発生する。<br />

操作 : if (PR[qp]) {<br />

if (p1 == p2)<br />

illegal_operation_fault();<br />

if (trel == ‘nz’) // ‘nz’ - test for 1<br />

tmp_rel = GR[r 3 ].nat;<br />

else // ‘z’ - test for 0<br />

tmp_rel = !GR[r 3 ].nat;<br />

switch (ctype) {<br />

case ‘and’: // and-type compare<br />

if (!tmp_rel) {<br />

PR[p 1 ] = 0;<br />

PR[p 2 ] = 0;<br />

}<br />

break;<br />

case ‘or’: // or-type compare<br />

if (tmp_rel) {<br />

PR[p 1 ] = 1;<br />

PR[p 2 ] = 1;<br />

}<br />

break;<br />

case ‘or.andcm’: // or.andcm-type compare<br />

if (tmp_rel) {<br />

PR[p 1] = 1;<br />

第 3 巻 : 命令リファレンス 3:237


PR[p2 ] = 0;<br />

}<br />

break;<br />

case ‘unc’: // unc-type compare<br />

default: // normal compare<br />

PR[p1 ] = tmp_rel;<br />

PR[p2 ] = !tmp_rel;<br />

break;<br />

}<br />

} else {<br />

if (ctype == ‘unc’) {<br />

if (p1 == p2)<br />

illegal_operation_fault();<br />

PR[p1 ] = 0;<br />

PR[p2 ] = 0;<br />

}<br />

}<br />

割り込み : 無効操作フ ォ ル ト<br />

3:238 第 3 巻 : 命令リファレンス<br />

tnat


tpa<br />

tpa ─ 物理アドレスへの変換 (Translate to Physical Address)<br />

書式 : (qp) tpar 1 = r 3 M46<br />

説明 : この命令は、 GR r3 に よ っ て指定される仮想ア ド レ ス に対応する物理ア ド レ ス を取得し、<br />

GR r1 に格納する。<br />

PSR.dt が 1 の場合は、 DTLB および VHPT 内で、 GR r3 によって指定される仮想アドレ<br />

スと、 GR r3 のビ ッ ト {63:61} によってインデックスが付けられたリージョン ・ レジスタ<br />

が検索 さ れる。 一致す る現在の変換エン ト リ が見つか っ た場合は、 その変換エン ト リ の<br />

物理ア ド レ スが GR r1 に格納される。 一致する現在の変換エン ト リ が見つか ら ない場合<br />

は、 適切な TLB フォルトが発生する。<br />

PSR.dt が 0 の場合は、 VHPT ウォーカがディスエーブルにされるため、 DTLB だけが検<br />

索される。 DTLB 内で一致する現在の変換エン ト リ が見つか ら ない場合は、 psr.ic が 1 の<br />

場合は別のデ ー タ TLB フォルトが発生し、 psr.ic が 0 の場合はデー タがネス ト された<br />

TLB フォルトが発生する。<br />

こ の命令でフ ォ ル ト が発生した場合は、 ISR 内の非アク セス ・ ビ ッ ト がセ ッ ト される。<br />

ISR の読み込みビットと書き込みビットはセットされない。<br />

こ の命令は、 最高の特権レ ベル以外では実行で き ない。<br />

操作 : if (PR[qp]) {<br />

itype = NON_ACCESS|TPA;<br />

check_target_register(r 1 );<br />

}<br />

if (PSR.cpl != 0)<br />

privileged_operation_fault(itype);<br />

if (GR[r 3 ].nat)<br />

register_nat_consumption_fault(itype);<br />

GR[r 1 ] = tlb_translate_nonaccess(GR[r 3 ], itype);<br />

GR[r 1 ].nat = 0;<br />

割り込み : 無効操作フ ォ ル ト 別のデ ー タ TLB フォルト<br />

特権操作フ ォ ル ト VHPT データ ・ フォル ト<br />

レジスタ NaT 参照フ ォ ル ト デー タ TLB フォルト<br />

実装 さ れていないデ ー タ ・ ア ド レ ス ・ フ ォ ル ト デー タ ・ ペー ジ不在フ ォ ル ト<br />

データがネス ト された TLB フォルト データNaT ページ参照フォル ト<br />

第 3 巻 : 命令リファレンス 3:239


ttag ─ トランスレーション・ハッシュ・エントリ・タグ<br />

(Translation Hashed Entry Tag)<br />

書式 : (qp) ttag r 1 = r 3 M46<br />

説明 : ロ ン グ形式の仮想ハ ッ シ ュ ・ ペー ジ ・ テ ー ブル (VHPT) の検索時に照合に使用される タ<br />

グが生成され、 GR r1 に格納される。 仮想ア ド レスは GR r3 に指定 さ れ、 リ ー ジ ョ ン ・ レ<br />

ジスタは GR r3 のビッ ト {63:61} に選択される。<br />

ttag 命令への入力 と して、 NaT 入力引数ま たは実装 さ れていない仮想ア ド レ スが指定 さ<br />

れた場合は、 得られるターゲ ッ ト ・ レジスタの値は不定であ り、 NaT ビットが1 にセッ<br />

トされる。<br />

タグ生成関数は、 プロセ ッ サ固有のロ ング形式の VHPT タグを生成する。 タグ生成関数<br />

は、 実装されたすべてのリージョン・ビットと、 仮想アドレス・ビット {60:0} を使用し<br />

なければならない。 この命令は、 PTA.vf を無視する。<br />

ロング形式の VHPT 内の変換エン ト リ は、 thash 命令に よ っ て生成 さ れる ハ ッ シ ュ ・ イ<br />

ンデッ クス と、 この命令によ って生成されるタグによ って、 一意に識別されなければな<br />

らない。<br />

この命令は、 VHPT ウォーカを実装していないプロセッサ・モデルを含む、 すべてのプ<br />

ロ セ ッ サ ・ モデル上に実装 さ れていなければな ら ない。<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1 );<br />

}<br />

割り込み : 無効操作フ ォ ル ト<br />

if (GR[r 3 ].nat || unimplemented_virtual_address(GR[r 3 ])) {<br />

GR[r 1 ] = undefined();<br />

GR[r 1 ].nat = 1;<br />

} else {<br />

tmp_vr = GR[r 3 ]{63:61};<br />

tmp_va = GR[r 3 ]{60:0};<br />

GR[r 1 ] = tlb_vhpt_tag(tmp_va, RR[tmp_vr].rid, RR[tmp_vr].ps);<br />

GR[r 1 ].nat = 0;<br />

}<br />

3:240 第 3 巻 : 命令リファレンス<br />

ttag


unpack<br />

unpack ─ アンパック (Unpack)<br />

書式 : (qp) unpack1.h r 1 = r 2 , r 3 one_byte_form, high_form I2<br />

(qp) unpack2.h r 1 = r 2 , r 3 two_byte_form, high_form I2<br />

(qp) unpack4.h r 1 = r 2 , r 3 four_byte_form, high_form I2<br />

(qp) unpack1.l r 1 = r 2 , r 3 one_byte_form, low_form I2<br />

(qp) unpack2.l r 1 = r 2 , r 3 two_byte_form, low_form I2<br />

(qp) unpack4.l r 1 = r 2 , r 3 four_byte_form, low_form I2<br />

説明 : GR r 2 および r 3 の各デー タ要素がアンパ ッ ク さ れ、 結果が GR r 1 に格納される。<br />

high_form では、 各ソ ー ス ・ レ ジ ス タ の最上位要素が選択 さ れ、 それに対して low_form<br />

では、 各ソ ー ス ・ レ ジ ス タ の最下位要素が選択される。 要素は それぞれの ソ ー ス ・ レ ジ<br />

ス タ か ら 交互に選択 さ れる。<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1 );<br />

}<br />

if (one_byte_form) { // one-byte elements<br />

x[0] = GR[r 2 ]{7:0}; y[0] = GR[r 3 ]{7:0};<br />

x[1] = GR[r 2]{15:8}; y[1] = GR[r 3]{15:8};<br />

x[2] = GR[r 2 ]{23:16}; y[2] = GR[r 3 ]{23:16};<br />

x[3] = GR[r 2 ]{31:24}; y[3] = GR[r 3 ]{31:24};<br />

x[4] = GR[r 2]{39:32}; y[4] = GR[r 3]{39:32};<br />

x[5] = GR[r 2 ]{47:40}; y[5] = GR[r 3 ]{47:40};<br />

x[6] = GR[r 2 ]{55:48}; y[6] = GR[r 3 ]{55:48};<br />

x[7] = GR[r 2]{63:56}; y[7] = GR[r 3]{63:56};<br />

if (high_form)<br />

GR[r 1] = concatenate8( x[7], y[7], x[6], y[6],<br />

x[5], y[5], x[4], y[4]);<br />

else // low_form<br />

GR[r 1] = concatenate8( x[3], y[3], x[2], y[2],<br />

x[1], y[1], x[0], y[0]);<br />

} else if (two_byte_form) { // two-byte elements<br />

x[0] = GR[r 2]{15:0}; y[0] = GR[r 3]{15:0};<br />

x[1] = GR[r 2 ]{31:16}; y[1] = GR[r 3 ]{31:16};<br />

x[2] = GR[r 2 ]{47:32}; y[2] = GR[r 3 ]{47:32};<br />

x[3] = GR[r 2]{63:48}; y[3] = GR[r 3]{63:48};<br />

if (high_form)<br />

GR[r 1] = concatenate4(x[3], y[3], x[2], y[2]);<br />

else // low_form<br />

GR[r 1 ] = concatenate4(x[1], y[1], x[0], y[0]);<br />

} else { // four-byte elements<br />

x[0] = GR[r 2 ]{31:0}; y[0] = GR[r 3 ]{31:0};<br />

x[1] = GR[r 2 ]{63:32}; y[1] = GR[r 3 ]{63:32};<br />

if (high_form)<br />

GR[r1 ] = concatenate2(x[1], y[1]);<br />

else // low_form<br />

GR[r1 ] = concatenate2(x[0], y[0]);<br />

}<br />

GR[r1].nat = GR[r2].nat || GR[r3].nat; 第 3 巻 : 命令リファレンス 3:241


割り込み : 無効操作フ ォ ル ト<br />

図 2-45. アンパックの操作<br />

GR r 2 :<br />

unpack1.h<br />

GR r 2 :<br />

unpack1.l<br />

GR r 2 :<br />

unpack2.h<br />

GR r 2 :<br />

unpack2.l<br />

GR r 2 :<br />

unpack4.h<br />

GR r 2 :<br />

unpack4.l<br />

GR r 1 :<br />

GR r 1 :<br />

GR r 1 :<br />

GR r 1 :<br />

GR r 1 :<br />

GR r 1 :<br />

unpack<br />

3:242 第 3 巻 : 命令リファレンス<br />

GR r 3 :<br />

GR r 3 :<br />

GR r 3 :<br />

GR r 3 :<br />

GR r 3 :<br />

GR r 3 :


xchg<br />

xchg ─ 交換 (Exchange)<br />

書式 : (qp) xchgsz.ldhint r 1 = [r 3 ], r 2 M16<br />

説明 : sz バイ ト の値が、 GR r3 の値で指定されるアドレスから始まるメモリ位置から読み込ま<br />

れる。 GR r2 の値の最下位 sz ビッ トが、 GR r3 の値で指定されるアド レスから始まるメモ<br />

リ位置に書き込まれる。 次に、 メモリから読み込まれた値がゼロ拡張され、 GR r1 に格<br />

納され、 GR r1 に対応する NaT ビッ トがクリアされる。 sz コンプリータの値を表 2-56 に<br />

示す。<br />

IGR r3 の値で指定されるア ド レスが、 メモ リ でアクセス されるサイズに自然にアラ イ メ<br />

ントされていない場合は、 ユーザ・マスク (User Mask) アライメン ト ・ チェ ッ ク ・ ビッ ト<br />

UM.ac ( プロセッサ ・ ステータス ・ レジスタの PSR.ac) の状態に関わらず、 非アラ イ メン<br />

ト・データ参照 (Unaligned Data Reference) フォルトが発生する。 参照先ページに対する<br />

読み取 り およ び書き込み両方のアク セス特権が必要である。<br />

表 2-56. メモリ交換のサイズ<br />

sz コンプリータ アクセスされるバイト数<br />

1 1 バイト<br />

2 2 バイト<br />

4 4 バイト<br />

8 8 バイト<br />

こ の メ モ リ 交換操作は、 aquire ( 取得 ) のセマンテ ィ ッ クスを使用して実行される。 つま<br />

り、 このメモリに対する読み取り / 書き込みは、 以降のすべてのデー タ ・ メ モ リ ・ ア ク<br />

セスの前に見える よ うになる。 メモリ順序の詳細は、 第 2 巻、 第 1 部の 4.4.7 項 「シーケ<br />

ンシャル属性と順序付け」 を参照のこ と。<br />

メモリ に対する読み取り / 書き込みはア ト ミ ッ ク な操作である こ と が保証されている。<br />

こ の命令は、 ラ イ ト バ ッ ク書き込みポ リ シ ー を持つキ ャ ッ シ ュ可能ペー ジ に対してのみ<br />

有効であ る。 NaTPage にアクセスする と、 データ NaT ペー ジ参照フ ォ ル ト が発生す る。<br />

その他のメモリ属性を持つページにアクセスする と、 サポー ト されないデータ参照フォ ルトが発生する。<br />

ldhint コ ンプ リ ー タ の値で メ モ リ ・ ア ク セスの局所性を指定する。 ldhint コンプリータの<br />

値は 3:136 ページの表 2-34 に示してい る。 局所性の ヒ ン ト はプ ロ グ ラ ムの機能には影響<br />

せず、 したがってプログラム ・ コ ー ド によ って も無視でき る。 第 1 巻、 第 1 部の 4.4.6 項<br />

「メモ リ 階層の制御 と 整合性」 を参照のこ と。<br />

第 3 巻 : 命令リファレンス 3:243


操作 : if (PR[qp]) {<br />

check_target_register(r 1);<br />

}<br />

if (GR[r 3 ].nat || GR[r 2 ].nat)<br />

register_nat_consumption_fault(SEMAPHORE);<br />

paddr = tlb_translate(GR[r 3 ], sz, SEMAPHORE, PSR.cpl, &mattr,<br />

&tmp_unused);<br />

if (!ma_supports_semaphores(mattr))<br />

unsupported_data_reference_fault(SEMAPHORE, GR[r 3 ]);<br />

val = mem_xchg(GR[r 2 ], paddr, sz, UM.be, mattr, ACQUIRE, ldhint);<br />

alat_inval_multiple_entries(paddr, sz);<br />

GR[r 1 ] = zero_ext(val, sz * 8);<br />

GR[r 1 ].nat = 0;<br />

割り込み : 無効操作フ ォ ル ト デー タ ・ キ ー ・ ミ ス ・ フ ォ ル ト<br />

レジスタ NaT 参照フ ォ ル ト デー タ ・ キ ー許可フ ォ ル ト<br />

実装 さ れていないデ ー タ ・ ア ド レ ス ・ フ ォ ル ト デー タ ・ ア ク セス権フ ォ ル ト<br />

データがネス ト された TLB フォルト データ・ダーティ・ビット ・フォルト<br />

別のデー タ TLB フォルト データ・アクセス・ビット ・フォルト<br />

VHPT データ ・ フォル ト データ ・ デバッグ ・ フォル ト<br />

データ TLB フォルト アライメントの合っていない<br />

データ ・ ページ不在フォルト データ参照フォルト<br />

データ NaT ページ参照フォル ト サポー ト されないデータ参照フォル ト<br />

3:244 第 3 巻 : 命令リファレンス<br />

xchg


xma<br />

xma ─ 固定小数点積和 (Fixed-Point Multiply Add)<br />

書式 : (qp) xma.lf1 = f3 , f4, f2 low_form F2<br />

(qp) xma.luf1 = f3 , f4, f2 (qp) xma.lf1 = f3 , f4 , f2 の擬似オペコ ー ド<br />

(qp) xma.hf1 = f3 , f4, f2 high_form F2<br />

(qp) xma.huf1 = f3 , f4, f2 high_unsigned_form F2<br />

説明 : 2 つのソース ・ オペラン ド (FR f3 および FR f4 ) が符号付き ま たは符号なしの整数 と して扱<br />

われ、 両オペラン ド 間の乗算が行われる。 第 3 のソース ・ オペラン ド (FR f2 ) がゼロ拡張<br />

され、 得られた積に加算される。 結果の上位ま たは下位の 64 ビ ッ ト が選択 さ れ、 FR f1 に格納される。<br />

high_unsigned_form では、 FR f3 と FR f4 の両仮数フ ィ ー ル ド が符号なし整数 と して扱わ<br />

れ、 乗算 されて全 128 ビ ッ ト の符号なし結果が生成 さ れる。 FR f2 の仮数フ ィ ール ド がゼ<br />

ロ拡張 さ れ、 積に加算 さ れる。 結果の最上位 64 ビットがFR f1 の仮数フ ィ ール ド に格納<br />

される。<br />

high_form では、 FR f3 と FR f4 の両仮数フ ィ ー ル ド が符号付き整数 と して扱われ、 乗算さ<br />

れて全 128 ビ ッ ト の符号付き結果が生成 さ れる。 FR f2 の仮数フ ィ ール ド がゼロ拡張さ<br />

れ、 積に加算 さ れる。 結果の最上位 64 ビッ トがFR f1 の仮数フ ィ ール ド に格納される。<br />

low_form では、 FR f3 と FR f4 の両仮数フ ィ ー ル ド が符号付き整数 と して扱われ、 乗算 さ<br />

れて全 128 ビ ッ ト の符号付き結果が生成 さ れる。 FR f2 の仮数フ ィ ール ド がゼロ拡張さ<br />

れ、 積に加算 さ れる。 結果の最下位 64 ビッ トがFR f1 の仮数フ ィ ール ド に格納される。<br />

すべての形式で、 FR f1 の指数フ ィ ール ド は 2.063 (0x1003E) のバイアス付き指数に設定さ<br />

れ、 FR f1 の符号フ ィ ール ド は正に対応する 0 に設定される。<br />

注 : オペラン ド と しての f1 は整数の 1 でな く 、 レジスタ ・ フ ァ イル形式の値 1.0 であ<br />

る。<br />

すべての形式で、 FR f3 、 FR f4 、 FR f2 のどれか 1 つでも NaTVal である場合は、 FR f1 は計<br />

算結果ではな く NatVal に設定される。<br />

操作 : if (PR[qp]) {<br />

fp_check_target_register(f 1 );<br />

if (tmp_isrcode = fp_reg_disabled(f 1, f 2, f 3, f 4))<br />

disabled_fp_register_fault(tmp_isrcode, 0);<br />

if (fp_is_natval(FR[f 2]) || fp_is_natval(FR[f 3]) ||<br />

fp_is_natval(FR[f 4 ])) {<br />

FR[f 1 ] = NATVAL;<br />

} else {<br />

if (low_form || high_form)<br />

tmp_res_128 =<br />

fp_I64_x_I64_to_I128(FR[f 3].significand, FR[f 4].significand);<br />

else // high_unsigned_form<br />

tmp_res_128 =<br />

fp_U64_x_U64_to_U128(FR[f 3].significand, FR[f 4].significand);<br />

tmp_res_128 =<br />

fp_U128_add(tmp_res_128, fp_U64_to_U128(FR[f 2].significand));<br />

if (high_form || high_unsigned_form)<br />

FR[f 1].significand = tmp_res_128.hi;<br />

else // low_form<br />

FR[f 1 ].significand = tmp_res_128.lo;<br />

FR[f 1 ].exponent = FP_INTEGER_EXP;<br />

第 3 巻 : 命令リファレンス 3:245


}<br />

}<br />

FR[f 1 ].sign = FP_SIGN_POSITIVE;<br />

fp_update_psr(f 1 );<br />

割り込み : 浮動小数点レ ジ ス タ無効フ ォ ル ト<br />

3:246 第 3 巻 : 命令リファレンス<br />

xma


xmpy<br />

xmpy ─ 固定小数点乗算 (Fixed-Point Multiply)<br />

書式 : (qp) xmpy.lf1 = f3 , f4 (qp) xma.lf1 = f3 , f4 , f0 の擬似オペコ ー ド<br />

(qp) xmpy.luf1 = f3 , f4 (qp) xma.lf1 = f3 , f4 , f0 の擬似オペコ ー ド<br />

(qp) xmpy.hf1 = f3 , f4 (qp) xma.hf1 = f3 , f4, f0 の擬似オペコ ー ド<br />

(qp) xmpy.huf1 = f3 , f4 (qp) xma.huf1 = f3 , f4 , f0 の擬似オペコ ー ド<br />

説明 : 2 つのソース ・ オペラン ド (FR f3 と FR f3 ) が符号付き ま たは符号なしの整数 と して扱わ<br />

れ、 両オペラ ン ド 間の乗算が行われる。 結果の上位 ま たは下位 64 ビ ッ ト が選択 さ れ、<br />

FR f1 に格納される。<br />

high_unsigned_form では、 FR f3 と FR f4 の両仮数フ ィ ー ル ド が符号なし整数 と して扱わ<br />

れ、 乗算 されて全 128 ビ ッ ト の符号なし結果が生成 さ れる。 結果の最上位 64 ビッ トが<br />

FR f1 の仮数フ ィ ール ド に格納される。<br />

high_form では、 FR f3 と FR f4 の両仮数フ ィ ー ル ド が符号付き整数 と して扱われ、 乗算さ<br />

れて全 128 ビ ッ ト の符号付き結果が生成 さ れる。 結果の最上位 64 ビッ トがFR f1 の仮数<br />

フィールドに格納される。<br />

low_form では、 FR f3 と FR f4 の両仮数フ ィ ー ル ド が符号付き整数 と して扱われ、 乗算 さ<br />

れて全 128 ビ ッ ト の符号付き結果が生成 さ れる。 結果の最下位 64 ビッ トがFR f1 の仮数<br />

フィールドに格納される。<br />

すべての形式で、 FR f1 の指数フ ィ ール ド は 2.063 (0x1003E) のバイアス付き指数に設定さ<br />

れ、 FR f1 の符号フ ィ ール ド は正に対応する 0 に設定される。<br />

注 : オペラン ド と しての f1 は整数の 1 でな く 、 レジスタ ・ フ ァ イル形式の値 1.0 であ<br />

る。<br />

操作 : 3:245 ページの 「xma — 固定小数点積和 (Fixed-Point Multiply Add)」 を参照のこ と。<br />

第 3 巻 : 命令リファレンス 3:247


xor ─ 排他的論理和 (Exclusive Or)<br />

書式 : (qp) xorr 1 = r 2 , r 3 register_form A1<br />

(qp) xorr 1 = imm 8 , r 3 imm8_form A3<br />

説明 : 2 つの ソ ー ス ・ オペラ ン ド 間の排他的論理和 (XOR) が取られ、 結果が GR r 1 に格納され<br />

る。 register_form では、 第 1 オペラン ド は GR r 2 であり、 imm8_form では、 第 1 オペラ<br />

ンドはimm 8 のエン コ ーデ ィ ング ・ フ ィ ール ド で与え られる。<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1);<br />

}<br />

割り込み : 無効操作フ ォ ル ト<br />

tmp_src = (register_form ? GR[r 2 ] : sign_ext(imm 8 , 8));<br />

tmp_nat = (register_form ? GR[r 2].nat : 0);<br />

GR[r 1 ] = tmp_src ^ GR[r 3 ];<br />

GR[r 1].nat = tmp_nat || GR[r 3].nat;<br />

3:248 第 3 巻 : 命令リファレンス<br />

xor


zxt<br />

zxt ─ ゼロ拡張 (Zero Extend)<br />

書式 : (qp) zxtxsz r 1 = r 3 I29<br />

説明 : GR r 3 の値が、 xsz に よ っ て指定される ビ ッ ト 位置の上 ま でゼ ロ拡張 さ れ、 結果が GR r 1<br />

に格納される。 xsz のニーモニッ ク値は 3:231 ページの表 2-51 に示している。<br />

操作 : if (PR[qp]) {<br />

check_target_register(r 1 );<br />

}<br />

割り込み : 無効操作フ ォ ル ト<br />

GR[r 1] = zero_ext(GR[r 3],xsz * 8);<br />

GR[r 1 ].nat = GR[r 3 ].nat;<br />

第 3 巻 : 命令リファレンス 3:249


3:250 第 3 巻 : 命令リファレンス


擬似コード関数 3<br />

この章では、 Itanium ® 命令のペー ジで使用しているすべての擬似コ ー ド 関数を示す。<br />

表 3-1. 擬似コード関数<br />

関数 操作<br />

xxx_fault(parameters ...) フォルト関数はいくつか存在する。個々のフォルト関数は、そのフォルトに固有の<br />

パラメータを受け付ける ( 例外コード値、仮想アドレスなど )。フォルトがスペ<br />

キュレーティブ・ロード例外のためにデファーされた ( 据え置かれた ) 場合、フォ<br />

ルト・ルーチンでデファー ( 据え置き ) が行われたことの通知とともに返る。それ<br />

以外の場合、フォルト・ルーチンは返らず、命令シーケンスを終了させる。<br />

xxx_trap(parameters ...) トラップ関数はいくつか存在する。個々のトラップ関数は、そのトラップに固有の<br />

パラメータを受け付ける ( トラップ・コード値、仮想アドレスなど )。トラップ・<br />

ルーチンは返らない。<br />

acceptance_fence() キャッシングされていない順序付きシーケンシャル・メモリ・ページに対する先行<br />

のデータ・メモリ参照が、後続のデータ・メモリ参照がプロセッサによって実行さ<br />

れる前に「受け付けられる」ようにする。<br />

alat_cmp(rtype, raddr) rtype によって指定されたレジスタ・タイプと、raddr によって指定されたレジス<br />

タ・アドレスに一致する ALAT エントリを見つけた場合に 1 を返す。それ以外の場<br />

合はゼロを返す。この関数はプロセッサ固有である。プロセッサは、ALAT 内に一<br />

致するエントリが存在している場合でも、( 一致するものがなかったことを示す )<br />

ゼロを返すように任意に設定できる。これにより、高速な ALAT ルックアップ・<br />

サーキットを設計する際のプロセッサの柔軟性が実現されている。<br />

alat_frame_update(delta_bof, delta_sof) ALAT に対して、フレームの下端やフレームのサイズが変更されたことを通知する。<br />

これにより、ALAT のタグ・ビットを管理したり、その他の必要な管理機能を実現<br />

できる。<br />

alat_inval() ALAT 内のすべてのエントリを無効にする。<br />

alat_inval_multiple_entries(paddr, size) ALAT に対して、paddr によって指定された物理メモリ・アドレスと、size に<br />

よって指定されたアクセス・サイズを使って照会を発行する。一致したすべての<br />

ALAT エントリが無効になる。値は返されない。<br />

alat_inval_single_entry(rtype, rega) ALAT に対して、rtype によって指定されたレジスタ・タイプと、rega によって<br />

指定されたレジスタ・アドレスを使って照会を発行する。一致した ALAT エントリ<br />

が 1 つだけ無効になる。値は返されない。<br />

alat_write(rtype, raddr, paddr, size) rtype によって指定されたレジスタ・タイプ、raddr で指定されたレジスタ・アド<br />

レス、paddr で指定された物理メモリ・アドレス、size で指定されたアクセス・<br />

サイズを使って、新しい ALAT エントリを割り当てる。値は返されない。この関数<br />

によって、特定の raddr に対応する ALAT エントリが 1 つしか存在しないことが<br />

保証される。ld.c.nc、ldf.c.nc、または ldfp.c.nc 命令の raddr が既存の<br />

ALAT エントリのレジスタ・タグに一致したが、命令の size や paddr が既存のエ<br />

ントリとは異なる場合、この関数は既存のエントリを保存するか、それを無効にし<br />

て、命令で指定された size と paddr を使って新しいエントリを書き込む。<br />

align_to_size_boundary(vaddr, size) size によって指定される境界にアライメントが合わされた vaddr を返す。<br />

branch_predict(wh, ih, ret, target, tag) プロセッサの分岐予測構造を更新する、プロセッサに依存するルーチン。<br />

check_branch_implemented(check_type) 失敗したチェック命令によって分岐が発生する場合は TRUE、スペキュレーティブ<br />

操作フォルトが発生する場合は FALSE を返す、プロセッサに依存するルーチン。<br />

結果は、チェック命令のタイプ (CHKS_GENERAL、CHKS_FLOAT、<br />

CHKA_GENERAL、CHKA_FLOAT) によって異なる。また、結果は他の導入されて<br />

いるパラメータに依存する。<br />

第 3 巻 : 擬似コード関数 3:251


表 3-1. 擬似コード関数 ( 続き )<br />

check_target_register(r1) r1 がフレーム範囲外のスタックされたレジスタ (CFM によって定義 ) をターゲット<br />

にすると、無効操作フォルトが発生し、この関数は返らない。<br />

check_target_register_sof(r1, newsof) r1 がフレーム範囲外のスタックされたレジスタ (newsof パラメータによって定義 )<br />

をターゲットにすると、無効操作フォルトが発生し、この関数は返らない。<br />

concatenate2(x1, x2) 2 つの引数の下位 32 ビットを連結し、64 ビットの結果を返す。<br />

concatenate4(x1, x2, x3, x4) 4 つの引数の下位 16 ビットを連結し、64 ビットの結果を返す。<br />

concatenate8(x1, x2, x3, x4, x5, x6, x7,<br />

x8)<br />

8 つの引数の下位 8 ビットを連結し、64 ビットの結果を返す。<br />

data_serialize() 副次的作用を持つすべての先行するレジスタの更新が、後続のプログラム実行およ<br />

びデータ・メモリ参照が実行される前に、検出されるようにする。<br />

deliver_unmasked_pending_interrupt() このプロセッサ固有の関数は、未処理のマスクされていない外部割り込みがあるか<br />

どうかをチェックし、このような割り込みがある場合は、外部割り込みベクタに制<br />

御を渡す。<br />

execute_hint(hint) hint によって指定されたヒントを実行する。<br />

fadd(fp_dp, fr2) 無限精度の積に浮動小数点レジスタの値を加え、丸めの準備ができた無限精度の和<br />

を返す。<br />

fcmp_exception_fault_check(f2, f3, frel, fcmp 命令のためにすべての浮動小数点フォルト条件をチェックする。<br />

sf, *tmp_fp_env)<br />

fcvt_fx_exception_fault_check<br />

(fr2, signed_form, trunc_form,<br />

sf *tmp_fp_env)<br />

fma_exception_fault_check<br />

(f2, f3, f4, pc, sf, *tmp_fp_env)<br />

fminmax_exception_fault_check<br />

(f2, f3, sf, *tmp_fp_env)<br />

fms_fnma_exception_fault_check<br />

(f2, f3, f4, pc, sf, *tmp_fp_env)<br />

関数 操作<br />

fcvt.fx、fcvt.fxu、fcvt.fx.trunc、fcvt.fxu.trunc 命令のためにすべて<br />

の浮動小数点フォルト条件をチェックする。NaN は伝播する。<br />

fma 命令のためにすべての浮動小数点フォルト条件をチェックする。NaN および特<br />

殊な IEEE 結果は伝播する。<br />

famax、famin、fmax、および fmin 命令のためにすべての浮動小数点フォルト条<br />

件をチェックする。<br />

fms および fnma 命令のためにすべての浮動小数点フォルト条件をチェックする。<br />

NaN および特殊な IEEE 結果は伝播する。<br />

fmul(fr3, fr4) 2 つの浮動小数点レジスタ値の無限精度の乗算を実行する。<br />

followed_by_stop() 現在の命令の後にストップが続いている場合には TRUE を返す。それ以外の場合は<br />

FALSE を返す。<br />

fp_check_target_register(f1) 指定された浮動小数点レジスタ識別子が 0 または 1 であれば、この関数は無効操作<br />

フォルトを発生させる。<br />

fp_decode_fault(tmp_fp_env) ISR.code のための浮動小数点例外フォルト・コード値を返す。<br />

fp_decode_traps(tmp_fp_env) ISR.code のための浮動小数点トラップ・コード値を返す。<br />

fp_is_nan_or_inf(freg) 浮動小数点例外フォルト・チェック関数が、IEEE フォルトがディスエーブルにさ<br />

れたデフォルトの結果または伝播された NaN を返した場合に、true を返す。<br />

fp_equal(fr1, fr2) IEEE 標準の等値関係テスト。<br />

fp_ieee_recip(num, den) 特殊なオペランドのセットに対する真の商、またはソフトウェア除算アルゴリズム<br />

で使用される除数の逆数の近似値を返す。<br />

fp_ieee_recip_sqrt(root) 特殊なオペランドに対する真の平方根の結果、またはソフトウェア平方根アルゴリ<br />

ズムで使用される平方根の逆数の近似値を返す。<br />

fp_is_nan(freg) 浮動小数点レジスタが NaN を含んでいる場合に true を返す。<br />

fp_is_natval(freg) 浮動小数点レジスタが NaTVal を含んでいる場合に true を返す。<br />

fp_is_normal(freg) 浮動小数点レジスタがノーマル数を含んでいる場合に true を返す。<br />

fp_is_pos_inf(freg) 浮動小数点レジスタが正の無限大を含んでいる場合に true を返す。<br />

3:252 第 3 巻 : 擬似コード関数


表 3-1. 擬似コード関数 ( 続き )<br />

fp_is_qnan(freg) 浮動小数点レジスタがクワイエット型 NaN を含んでいる場合に true を返す。<br />

fp_is_snan(freg) 浮動小数点レジスタがシグナル型 NaN を含んでいる場合に true を返す。<br />

fp_is_unorm(freg) 浮動小数点レジスタがアンノーマル数を含んでいる場合に true を返す。<br />

fp_is_unsupported(freg) 浮動小数点レジスタがサポートされていない形式を含んでいる場合に true を返す。<br />

fp_less_than(fr1, fr2) IEEE 標準の「未満」関係テスト。<br />

fp_lesser_or_equal(fr1, fr2) IEEE 標準の「以下」関係テスト。<br />

fp_normalize(fr1) アンノーマルの fp 値を正規化する。この関数は、レジスタ・ファイルで表現でき<br />

ないアンノーマル数値をすべてゼロにフラッシュする。<br />

fp_raise_fault(tmp_fp_env) ローカル命令状態をチェックして、割り込みの発生を必要とするフォルト条件が存<br />

在するかどうかを調べる。<br />

fp_raise_traps(tmp_fp_env) ローカル命令状態をチェックして、割り込みの発生を必要とするトラップ条件が存<br />

在するかどうかを調べる。<br />

fp_reg_bank_conflict(f1, f2) 2 つの指定された FR が同じバンクにある場合に true を返す。<br />

fp_reg_disabled(f1, f2, f3, f4) ディスエーブルにされている浮動小数点レジスタ・フォルトが存在するかどうかを<br />

チェックする。<br />

fp_reg_read(freg) FR を読み込み、標準の拡張倍精度のデノーマル数 ( および擬似デノーマル数 ) に、<br />

真の数学的指数を与える。これ以外のクラスのオペランドは変更されない。<br />

fp_unordered(fr1, fr2) IEEE 標準の順序付けなしの関係。<br />

fp_fr_to_mem_format(freg, size) レジスタ形式の浮動小数点値を、浮動小数点メモリ形式に変換する。レジスタ内の<br />

浮動小数点値が、size パラメータに対応する正しい精度に事前に丸められている<br />

前提がある。<br />

fpcmp_exception_fault_check<br />

(f2, f3, frel, sf, *tmp_fp_env)<br />

fpcmp 命令について、すべての浮動小数点フォルト条件をチェックする。<br />

fpcvt_exception_fault_check<br />

(f2, signed_form, trunc_form, sf,<br />

*tmp_fp_env)<br />

関数 操作<br />

fpma_exception_fault_check<br />

(f2, f3, f4, sf, *tmp_fp_env)<br />

fpminmax_exception_fault_check<br />

(f2, f3, sf, *tmp_fp_env)<br />

fpms_fpnma_exception_fault<br />

_check(f2, f3, f4, sf, *tmp_fp_env)<br />

fprcpa_exception_fault_check<br />

(f2, f3, sf, *tmp_fp_env, *limits_check)<br />

fprsqrta_exception_fault_check<br />

(f3, sf, *tmp_fp_env, *limits_check)<br />

frcpa_exception_fault_check<br />

(f2, f3, sf, *tmp_fp_env)<br />

frsqrta_exception_fault_check<br />

(f3, sf, *tmp_fp_env)<br />

fpcvt.fx、fpcvt.fxu、fpcvt.fx.trunc、fpcvt.fxu.trunc 命令について、<br />

すべての浮動小数点フォルト条件をチェックする。NaN は伝播する。<br />

fpma 命令について、すべての浮動小数点フォルト条件をチェックする。NaN と特<br />

殊な IEEE 結果は伝播する。<br />

fpmin、fpmax、fpamin、fpamax 命令について、すべての浮動小数点フォルト条<br />

件をチェックする。<br />

fpms および fpnma 命令について、すべての浮動小数点フォルト条件をチェックす<br />

る。NaN と特殊な IEEE 結果は伝播する。<br />

fprcpa 命令について、すべての浮動小数点フォルト条件をチェックする。NaN と<br />

特殊な IEEE 結果は伝播する。オペランド制限違反も表示する。<br />

fprsqrta 命令について、すべての浮動小数点フォルト条件をチェックする。NaN<br />

と特殊な IEEE 結果は伝播する。オペランド制限違反も表示する。<br />

frcpa 命令のためにすべての浮動小数点フォルト条件をチェックする。NaN および<br />

特殊な IEEE 結果は伝播する。<br />

frsqrta 命令のためにすべての浮動小数点フォルト条件をチェックする。NaN およ<br />

び特殊な IEEE 結果は伝播する。<br />

ignored_field_mask(regclass, reg, value) 指定されたレジスタとレジスタ・タイプの無視ビットに対応するビットを 0 にクリ<br />

アして値を返すブール関数。<br />

impl_itir_cwi_mask() 渡された値をそのまま返すか、ビット位置 {63:32} と {1:0} ( またはそのいずれか一<br />

方 ) をゼロでマスクして返すプロセッサ固有の関数。<br />

第 3 巻 : 擬似コード関数 3:253


表 3-1. 擬似コード関数 ( 続き )<br />

関数 操作<br />

instruction_serialize() 副作用を持つ先行するすべてのレジスタ更新が、それ以降の命令とデータ・メモリ<br />

参照が実行される前に行われることが保証される。また、先行の SYNC.i 操作が命<br />

令キャッシュによって検出されることが保証される。<br />

instruction_synchronize() キャッシュ・フラッシュ (FC) 操作のために命令とデータ・ストリームを同期させ<br />

る。この関数により、先行のキャッシュ・フラッシュ操作がローカル・データ・<br />

キャッシュで検出されたときには、ローカル命令キャッシュでも検出されることが<br />

保証される。また、先行の FC 操作が別のプロセッサのデータ・キャッシュで検出<br />

されたときには、同じプロセッサの命令キャッシュ内でも検出されることが保証さ<br />

れる。<br />

is_finite(freg) 浮動小数点レジスタが有限数を含んでいる場合に true を返す。<br />

is_ignored_reg(regnum) regnum が無視されたアプリケーション・レジスタである場合に true を返し、それ<br />

以外の場合に false を返すブール関数。<br />

is_inf(freg) 浮動小数点レジスタが無限数を含んでいる場合に true を返す。<br />

is_interruption_cr(regnum) regnum が割り込みコントロール・レジスタである場合は true を返し、それ以外の<br />

場合は false を返すブール関数 ( 第 2 巻、第 1 部の 3.3.5 項「割り込みコントロー<br />

ル・レジスタ」を参照 )。<br />

is_kernel_reg(ar_addr) ar_addr がカーネル・レジスタ・アプリケーション・レジスタのアドレスである場<br />

合に 1 を返す。<br />

is_read_only_reg(rtype, raddr) rtype タイプのレジスタ・バンク内の raddr によってアドレス指定されるレジスタ<br />

が、読み取り専用レジスタである場合は、1 を返す。<br />

is_reserved_field(regclass, arg2, arg3) 指定されたデータが予約済みフィールドに 1 を書き込む場合に true を返す。<br />

is_reserved_reg(regclass, regnum) regnum が regclass レジスタ・ファイルで予約されている場合に true を返す。<br />

is_supported_hint(hint) 指定された hint をプロセッサがサポートしている場合は true を返す。この関数<br />

は、hint 値以外の要素に依存する場合がある ( 実行元の実行ユニットや、命令が<br />

エンコードされたスロット番号など )。<br />

long_branch_implemented() ロング型分岐が実装されているかどうかで TRUE または FALSE を返す、プロセッ<br />

サに依存するルーチン。<br />

make_icache_coherent(paddr) 物理アドレス paddr によってアドレス指定されているキャッシュ・ラインがプロ<br />

セッサ固有の方法でフラッシュされ、命令キャッシュがデータ・キャッシュに対し<br />

てコヒーレントにされる。<br />

mem_flush(paddr) 物理アドレス paddr によってアドレス指定されているラインは、メモリ階層の中<br />

のメモリよりも上のすべてのレベルで無効にされ、メモリとの間に整合性がない場<br />

合にはメモリに書き戻される。<br />

mem_flush_pending_stores() ライト・コーレシング・バッファおよびライト・バッファ内の未処理のストアの排<br />

出を開始するように、プロセッサに指示する。この操作は「ヒント」である。先行<br />

するストアが実際に排出されたかどうかは表示されない。<br />

mem_implicit_prefetch(vaddr, hint, type) vaddr によってアドレス指定されているラインを、hint によって指定されたメモ<br />

リ階層の位置に移動する。この関数はプロセッサに依存しており、無視される場合<br />

がある。type によって、プロセッサは、各種の命令タイプのプリフェッチを区別<br />

できる。<br />

mem_promote(paddr, mtype, hint) paddr でアドレス指定されているラインを、hint に指定されたアクセス・ヒント<br />

の条件に従って、メモリ階層の最高レベルに移動する。この関数はプロセッサに依<br />

存しており、無視される場合がある。<br />

mem_read(paddr, size, border, mattr,<br />

otype, hint)<br />

paddr で指定された物理メモリ位置から始まる size バイトを、border で指定され<br />

たバイト順序、mattr で指定されたメモリ属性、hint で指定されたアクセス・ヒ<br />

ントで返す。otype はこのアクセスのメモリ・アクセス順序属性を指定するもの<br />

で、UNORDERED または ACQUIRE でなくてはならない。<br />

3:254 第 3 巻 : 擬似コード関数


表 3-1. 擬似コード関数 ( 続き )<br />

関数 操作<br />

mem_read_pair(*low_value,<br />

*high_value, paddr, size, border, mattr,<br />

otype, hint)<br />

border で指定したバイト順序、mattr で指定したメモリ属性、hint で指定したア<br />

クセス・ヒントを使用して、paddr で指定される物理メモリ・アドレスから始まる<br />

size/2 バイトのメモリを low_value に読み込み、(paddr+size/2) で指定される物<br />

理メモリ・アドレスから始まる size/2 バイトのメモリを high_value に読み込<br />

む。otype はこのアクセスのメモリ順序属性を指定するもので、UNORDERED ま<br />

たは ACQUIRE でなくてはならない。値は返されない。<br />

fp_mem_to_fr_format(mem, size) メモリ形式の浮動小数点値を浮動小数点レジスタ形式に変換する。<br />

mem_write(value, paddr, size, border,<br />

mattr, otype, hint)<br />

mem_write16(gr_value, ar_value, paddr,<br />

border, mattr, otype, hint)<br />

mem_xchg(data, paddr, size, byte_order,<br />

mattr, otype, hint)<br />

mem_xchg_add(add_val, paddr, size,<br />

byte_order, mattr, otype, hint)<br />

mem_xchg_cond(cmp_val, data, paddr,<br />

size, byte_order, mattr, otype, hint)<br />

mem_xchg16_cond(cmp_val, gr_data,<br />

ar_data, paddr, byte_order, mattr, otype,<br />

hint)<br />

value の下位 size バイトを、parrd で指定された物理メモリ・アドレスから始ま<br />

るメモリに書き込む。この際には、border で指定されたバイト順序、mattr で指<br />

定されたメモリ属性、hint で指定されたアクセス・ヒントが使用される。otype<br />

はこのアクセスのメモリ・アクセス順序属性を指定するもので、UNORDERED ま<br />

たは RELEASE でなくてはならない。値は返されない。<br />

border で指定したバイト順序、mattr で指定したメモリ属性、hint で指定したア<br />

クセス・ヒントを使用して、paddr で指定される物理メモリ・アドレスから始まる<br />

メモリに gr_value の 8 バイトを書き込み、(paddr+8) で指定される物理メモリ・<br />

アドレスから始まるメモリに ar_value の 8 バイトを書き込む。otype はこのア<br />

クセスのメモリ順序属性を指定するもので、UNORDERED または RELEASE でな<br />

くてはならない。値は返されない。<br />

paddr で指定された物理アドレスから始まる size バイトを返す。この読み込みは<br />

hint で指定された局所性ヒントの条件に従う。読み込みの後、データの下位 size<br />

バイトが、メモリ内の paddr で指定された物理アドレスから始まる size バイト<br />

に書き込まれる。読み込みと書き込みはアトミックに実行される。読み込みと書き<br />

込みの両方が、mattr で指定されたメモリ属性の条件に従い、メモリ内のバイト順<br />

序は byte_order で指定される。otype はこのアクセスのメモリ・アクセス順序<br />

属性を指定するもので、ACQUIRE でなくてはならない。<br />

paddr で指定された物理アドレスから始まる size バイトを返す。この読み込みは<br />

hint で指定された局所性ヒントの条件に従う。その後、メモリから読み込まれた<br />

値の和の下位 size バイトと add_val がメモリ内の paddr で指定された物理アド<br />

レスから始まる size バイトに書き込まれる。読み込みと書き込みはアトミックに<br />

実行される。読み込みと書き込みの両方が、mattr で指定されたメモリ属性の条件<br />

に従い、メモリ内のバイト順序は byte_order で指定される。otype はこのアク<br />

セスのメモリ・アクセス順序属性を指定するもので、ACQUIRE または RELEASE<br />

でなくてはならない。<br />

paddr で指定された物理アドレスから始まる size バイトを返す。この読み込みは<br />

hint で指定された局所性ヒントの条件に従う。メモリから読み込まれた値が<br />

cmp_val と等しければ、データの下位 size バイトが、メモリ内の paddr で指定さ<br />

れた物理アドレスから始まる size バイトに書き込まれる。書き込みが実行される<br />

場合、読み込みと書き込みはアトミックに実行される。読み込みと書き込みの両方<br />

が、mattr で指定されたメモリ属性の条件に従い、メモリ内のバイト順序は<br />

byte_order で指定される。otype はこのアクセスのメモリ・アクセス順序属性を<br />

指定するもので、ACQUIRE または RELEASE でなくてはならない。<br />

paddr で指定された物理アドレスで始まるメモリから 8 バイトを返す。この読み込<br />

みは、hint で指定された局所性ヒントの条件に従う。メモリから読み込まれた値<br />

が cmp_val に等しい場合は、(paddr & ~0x4) で指定された物理アドレスから始ま<br />

るメモリの 8 バイトに gr_data の 8 バイトが書き込まれ、((paddr & ~0x4)+8) で<br />

指定された物理アドレスから始まるメモリの 8 バイトに ar_data の 8 バイトが書<br />

き込まれる。書き込みが実行される場合、読み込みと書き込みはアトミックに実行<br />

される。読み込みと書き込みの両方が、mattr で指定されたメモリ属性の条件に従<br />

い、メモリ内のバイト順序は byte_order で指定される。バイト順序は、保存さ<br />

れた各 8 バイト値内でのバイト順序付けにのみ影響を与える。otype はこのアク<br />

セスのメモリ順序属性を指定するもので、ACQUIRE または RELEASE でなくては<br />

ならない。<br />

ordering_fence() 先行のデータ・メモリ参照が、将来のデータ・メモリ参照がプロセッサから見える<br />

ようになる前に見えることが保証される。<br />

第 3 巻 : 擬似コード関数 3:255


表 3-1. 擬似コード関数 ( 続き )<br />

partially_implemented_ip() プロセッサに依存するルーチンで、TRUE を返す場合と FALSE を返す場合がある。<br />

IP の次の値であったはずのアドレスに対して符号拡張された仮想アドレスまたはゼ<br />

ロ拡張された物理アドレスが、実装されていない命令アドレス・トラップの発生時<br />

にプロセッサによって IIP に書き込まれる場合は、TRUE を返す。IP の次の値で<br />

あったはずのフルアドレスが、このトラップが発生したプロセッサによって IIP に<br />

書き込まれる場合は、FALSE を返す。<br />

pr_phys_to_virt(phys_id) プレディケートの物理レジスタ ID、phys_id から、プレディケートの仮想レジス<br />

タ ID を返す<br />

rotate_regs() レジスタ・リネーム・ベース・レジスタをデクリメントし、結果としてレジスタ・<br />

ファイルのローテートを行う。CFM.rrb.gr は CFM.sor がゼロでない場合にのみデ<br />

クリメントされる。<br />

rse_enable_current_frame_load() RSE ロード・ポインタ (RSE.BSPLoad) が AR[BSP] よりも大きい場合、RSE によ<br />

る強制ロードによってカレント・フレームのレジスタを復元できることを示す<br />

RSE.CFLE ビットが設定される ( 他のケースでは、RSE はカレント・フレームのレジ<br />

スタのスピルまたはフィルを行わない )。この関数は必須の RSE によるロードを実<br />

行しない。この手順で割り込みは発生しない。<br />

rse_ensure_regs_loaded<br />

(number_of_bytes)<br />

関数 操作<br />

AR[BSP]と(AR[BSP] - number_of_bytes)の間のレジスタおよびNaTコレクショ<br />

ンのうち、スタックされたレジスタにまだ入っていないものがすべて、RSE によ<br />

る強制ロードによってレジスタ・スタックにロードされる。ロードされるレジスタ<br />

の数が RSE.N_STACK_PHYS より大きい場合は、無効操作フォルトが発生する。<br />

バッキング・ストア・アドレス (AR[BSP] - 8) を始点として、バッキング・ストア・<br />

アドレス (AR[BSP] - number_of_bytes) ( このアドレスを含む ) までデクリメントし<br />

ていくすべてのレジスタは、ダーティ・パーティションの一部になる。現在のフ<br />

レームを除く、その他のすべてのスタックされたレジスタは、無効パーティション<br />

の一部になる。number_of_bytes に 0 も指定できる。この関数で発生する RSE<br />

ロードのシーケンスは、割り込みをかけられるときがある。RSE による強制ロー<br />

ドによって、割り込みが発生するときがある。第 2 巻、第 1 部の表 6-6 を参照のこ<br />

と。<br />

rse_invalidate_non_current_regs() カレント・フレームの外のすべてのレジスタが無効にされる。<br />

rse_load(type) レジスタまたは NaT コレクションをバッキング・ストアから復元する<br />

(load_address = RSE.BspLoad - 8)。load_address{8:3} が 0x3f に等しい<br />

場合は、NaT コレクションが NaT 分散レジスタにロードされる ( 分散レ ジ ス タは、<br />

AR[RNAT] と同じでなくてもかまわない )。load_address{8:3} が 0x3f と等しくな<br />

い場合は、レジスタ RSE.LoadReg - 1 がロードされ、そのレジスタの NaT ビッ<br />

トが dispersal_register{load_address{8:3}} にセットされる。ロードが成<br />

功した場合は、RSE.BspLoad が 8 だけデクリメントされる。ロードが成功し、レ<br />

ジスタがロードされた場合は、RSE.LoadReg が 1 だけデクリメントされる ( ス<br />

タックされたレジスタでのラッピングが行われることがある )。このロードは、<br />

RSE.CFLE が 1 の場合は、無効なパーティションから現在のフレームにレジスタを<br />

移動し、RSE.CFLE が 0 の場合は、クリーンなパーティションにレジスタを移動す<br />

る。RSE による強制ロードでは、type は MANDATORY になる。RSE による強制<br />

ロードによって、割り込みが発生するときがある。第 2 巻、第 1 部の表 6-6 を参照<br />

のこと。<br />

rse_new_frame(current_frame_size,<br />

new_frame_size)<br />

レジスタ・リネームをまったく変更せずに、新しいフレームが定義される。新しい<br />

フレーム・サイズは new_frame_size パラメータによって完全に定義される ( 連<br />

続したコールは累積しない )。new_frame_size が current_frame_size より<br />

も大きく、無効でクリーンなパーティション内のレジスタの数がフレームの増加し<br />

たサイズよりも小さい場合には、十分な数のレジスタが使用可能になるまで RSE<br />

による強制ストアが発行される。結果として生じる RSE ストアのシーケンスは割<br />

り込まれるときがある。RSE による強制ストアによって割り込みが発生するとき<br />

がある。第 2 巻、第 1 部の表 6-6 を参照のこと。<br />

3:256 第 3 巻 : 擬似コード関数


表 3-1. 擬似コード関数 ( 続き )<br />

rse_preserve_frame<br />

(preserved_frame_size)<br />

rse_restore_frame(preserved_sol,<br />

growth, current_frame_size)<br />

preserved_frame_size で指定される数のレジスタが、RSE によって予約される<br />

ようにマークされる。レジスタ・リネームにより、GR[32] 以降の<br />

preserved_frame_size 個のレジスタが GR[32] にリネームされる。AR[BSP]<br />

が、新しい GR[32] が格納されるバッキング・ストア・アドレスを含むように更新<br />

される。<br />

最初の 2 つのパラメータは、分岐リターンまたは rfi により、現在のフレームが<br />

どのように更新されるかを定義する。preserved_sol は、RSE.BOF の下に復元<br />

される必要があるレジスタの数を定義する。growth は、現在のフレームのトップ<br />

で成長するレジスタの数を定義する ( 成長は通常は負の方向になる )。<br />

preserved_sol で指定された数のレジスタが、復元されるようにマークされる。<br />

レジスタ・リネーミングにより、GR[32] より前の preserved_sol 個のレジスタ<br />

が、GR[32] にリネームされる。AR[BSP] が更新され、新しい GR[32] がストア<br />

されるバッキング・ストア・アドレスを示す。ダーティ・レジスタとクリーン・レ<br />

ジスタの数が preserved_sol より小さい場合は、RSE による強制ロードが発行<br />

されるまで、新しい現在のフレームは有効であると見なされない。この関数は、<br />

RSE による強制ロードを実行しない。維持されるフレームが無効なエリアおよび<br />

クリーンなエリアを超えてダーティなエリア内に成長する場合は、この関数は<br />

TRUE を返す。この場合は、3 番目の引数 current_frame_size を使用して、戻<br />

り先のフレームを強制的にゼロにする ( 第 2 巻、第 1 部の 6.5.5 項「分岐リターン<br />

によって使用される不正な PFS」を参照 )。<br />

rse_store(type) レジスタまたは NaT コレクションをバッキング・ストアに保存する<br />

(store_address = AR[BSPSTORE])。store_address{8:3} が 0x3f に等しい場合には、<br />

NaT コレクション AR[RNAT] がストアされる。store_address{8:3} が 0x3f に等し<br />

くない場合は、レジスタ RSE.StoreReg がストアされ、そのレジスタの NaT ビッ<br />

トが AR[RNAT]{store_address{8:3}} に格納される。ストアが成功すると、<br />

AR[BSPSTORE] が 8 だけインクリメントされる。ストアが成功し、レジスタがス<br />

トアされた場合、RSE.StoreReg が 1 だけインクリメントされる ( スタックされた<br />

レジスタでのラッピングが行われることがある )。このストアによって、ダー<br />

ティー・パーティションからクリーン・パーティションにレジスタを移動する。<br />

RSE による強制ストアでは、タイプは MANDATORY である。RSE による強制ス<br />

トアによって、割り込みが発生するときがある。第 2 巻、第 1 部の表 6-6 を参照の<br />

こと。<br />

rse_update_internal_stack_pointers<br />

(new_store_pointer)<br />

この関数は、AR[BSPSTORE] に新しい値 (new_store_pointer) が与えられたと<br />

きに、AR[BSP] の新しい値を計算する。この値は、new_store_pointer に、<br />

ダーティー・レジスタの数と、その間にある NaT コレクションの数を加えたもの<br />

に等しい。つまり、ダーティー・パーティションのサイズは、AR[BSPSTORE] の<br />

書き込みの前後で同じである。すべてのクリーン・レジスタは無効なパーティショ<br />

ンに移動される。<br />

sign_ext(value, pos) ビット pos-1 から 0 までが value で埋められ、ビット位置 pos から 63 までが<br />

value のビットpos-1 で埋められている64 ビットの数値を返す。pos が 64 以上であ<br />

る場合には、value が返される。<br />

spontaneous_deferral(paddr, size,<br />

border, mattr, otype, hint, *defer)<br />

関数 操作<br />

次の 3 つの条件がすべて該当した場合に、必要に応じて *defer を強制的に TRUE<br />

にする、プロセッサに依存するルーチン。(1) 自然発生デファーがイネーブル、(2)<br />

自然発生デファーがプログラミング・モデルによって許可されている、(3) スペ<br />

キュレーティブ・ロードをデファーするのが有利であるとプロセッサが判断した場<br />

合 ( 特定のレベルのキャッシュ内のミスに基づく )。<br />

spontaneous_deferral_enabled() プロセッサに依存するルーチン。スペキュレーティブ・ロードの自然発生デファー<br />

がプロセッサ内でイネーブルまたはディスエーブルのどちらであるのか応じて、<br />

TRUE または FALSE を返す、<br />

tlb_access_key(vaddr) この関数は、vaddr に対応するエントリのアクセス・キーを TLB から返す。<br />

第 3 巻 : 擬似コード関数 3:257


表 3-1. 擬似コード関数 ( 続き )<br />

tlb_broadcast_purge(rid, vaddr, size,<br />

type)<br />

マルチプロセッサ・コヒーレンシ・ドメイン内の他のプロセッサに対して、ブロー<br />

ドキャスト・パージ DTC および ITC トランザクションを送信する。リージョン識<br />

別子 (rid)、仮想アドレス (vaddr)、ページ・サイズ (size) は、パージする変換エ<br />

ントリを指定する。パージ命令を受信したすべてのプロセッサがパージ操作を完了<br />

するまで、プログラムの実行を待機する。パージ・タイプ (type) は、他のプロ<br />

セッサ上の ALAT も TC と一緒にパージするかどうかを指定する。<br />

tlb_enter_privileged_code() この関数は、この命令を含むページの TLB エントリから、epc のための新しい特<br />

権レベルを決定する。epc 命令を含むページが「実行のみ」のページ・アクセス権<br />

を持ち、そのページに割り当てられた特権レベルが現在の特権レベルより高い ( 数<br />

値が小さい ) 場合は、現在の特権レベルは、epc 命令を含むページの変換エントリ<br />

の特権レベル・フィールドに合わせて設定される。<br />

tlb_grant_permission(vaddr, type, pl) 指定された仮想メモリ・アドレス (vaddr) および特権レベル (pl) の読み込み / 書き<br />

込みアクセスが許可されるかどうかを示すブール値を返す。アクセス・タイプ<br />

(type) は、読み込みか書き込みかを指定する。VHPT 変換、TLB ミス、ネストされ<br />

た TLB、ページ不在、NaT ページ参照、キー・ミスの各フォルトがチェックされ<br />

る。フォルトが発生した場合は、この関数は結果を返さない。<br />

tlb_insert_data(slot, pte0, pte1, vaddr,<br />

rid, tr)<br />

tlb_insert_inst(slot, pte0, pte1, vaddr, rid,<br />

tr)<br />

tlb_may_purge_dtc_entries<br />

(rid, vaddr, size)<br />

tlb_may_purge_itc_entries<br />

(rid, vaddr, size)<br />

tlb_must_purge_dtc_entries<br />

(rid, vaddr, size)<br />

関数 操作<br />

DTLB の指定されたスロッ ト番号にエントリを挿入する。pte0、pte1 が変換エン<br />

トリを構成する。vaddr と rid は、変換エントリの仮想アドレスとリージョン識<br />

別子を指定する。tr が true の場合は、エントリは TR セクションに格納され、そ<br />

れ以外の場合は、TC セクションに格納される。<br />

ITLB の指定されたスロッ ト番号にエントリを挿入する。pte0、pte1 が変換エント<br />

リを構成する。vaddr と rid は、変換エントリの仮想アドレスとリージョン識別<br />

子を指定する。tr が true の場合は、エントリは TR セクションに格納され、それ<br />

以外の場合は、TC セクションに格納される。<br />

指定された仮想アドレス (vaddr)、リージョン識別子 (rid)、およびページ・サイ<br />

ズ (size) に一致する DTC エントリをローカルにパージできる。また、これらのパ<br />

ラメータと部分的に重なるエントリを無効化することもできる。パージ操作の範囲<br />

は、プロセッサに依存する。パージ・サイズのパラメータがサポートされていない<br />

場合、プロセッサは、マシン・チェック・アボートを生成するか、指定された範囲<br />

を超えてトランスレーション・キャッシュをパージすることがある。最大では、ト<br />

ランスレーション・キャッシュからすべてのエントリが削除される。<br />

指定された仮想アドレス (vaddr)、リージョン識別子 (rid)、ページ・サイズ<br />

(size) に一致する ITC エントリをローカルにパージできる。また、これらのパラ<br />

メータと部分的に重なるエントリの無効化もできる。パージ操作の範囲は、プロ<br />

セッサに依存する。パージ・サイズのパラメータがサポートされていない場合、プ<br />

ロセッサは、マシン・チェック・アボートを生成するか、指定された範囲を超えて<br />

トランスレーション・キャッシュをパージするときがある。最大では、トランス<br />

レーション・キャッシュからすべてのエントリが削除される。<br />

指定されたリージョン識別子 (rid)、仮想アドレス (vaddr)、ページ・サイズ<br />

(size) に一致する、すべてのローカルな ( 重なることがある ) DTC エントリをパー<br />

ジする。パージでは、vaddr{63:61} (VRN) は無視される。つまり、VRN ビット<br />

に関係なく、vaddr{60:0} に一致するすべてのエントリは、必ずパージされる。<br />

パージ・サイズ・パラメータがサポートされていない場合、プロセッサは、マシ<br />

ン・チェック・アボートを生成するか、指定された範囲を超えてトランスレーショ<br />

ン・キャッシュをパージするときがある。最大では、トランスレーション・キャッ<br />

シュからすべてのエントリが削除される。指定されたパージ・パラメータの値が既<br />

存の DTR 変換エントリと重なる場合は、マシン・チェック・アボートが発生する<br />

ときがある。<br />

3:258 第 3 巻 : 擬似コード関数


表 3-1. 擬似コード関数 ( 続き )<br />

tlb_must_purge_itc_entries<br />

(rid, vaddr, size)<br />

tlb_must_purge_dtr_entries<br />

(rid, vaddr, size)<br />

tlb_must_purge_itr_entries<br />

(rid, vaddr, size)<br />

関数 操作<br />

指定されたリージョン識別子 (rid)、仮想アドレス (vaddr)、ページ・サイズ<br />

(size) に一致する、すべてのローカルな ( 重なることがある ) ITC エントリをパー<br />

ジする。パージでは、vaddr{63:61} (VRN) は無視される。つまり、VRN ビット<br />

に関係なく、vaddr{60:0} に一致するすべてのエントリは、必ずパージされる。<br />

パージ・サイズ・パラメータがサポートされていない場合、プロセッサは、マシ<br />

ン・チェック・アボートを生成するか、指定された範囲を超えてトランスレーショ<br />

ン・キャッシュをパージするときがある。最大では、トランスレーション・キャッ<br />

シュからすべてのエントリが削除される。指定されたパージ・パラメータの値が既<br />

存の ITR 変換エントリと重なる場合は、マシン・チェック・アボートが発生すると<br />

きがある。<br />

指定されたリージョン識別子 (rid)、仮想アドレス (vaddr)、ページ・サイズ<br />

(size) に一致する、すべてのローカルな ( 重なることがある ) DTR エントリをパー<br />

ジする。パージでは、vaddr{63:61} (VRL) は無視される。つまり、VRN ビット<br />

に関係なく、vaddr{60:0} に一致するすべてのエントリは、必ずパージされる。<br />

パージ・サイズ・パラメータがサポートされていない場合、プロセッサは、マシ<br />

ン・チェック・アボートを生成するか、指定された範囲を超えてトランスレーショ<br />

ン・キャッシュをパージするときがある。最大では、トランスレーション・キャッ<br />

シュからすべてのエントリが削除される。<br />

指定されたリージョン識別子 (rid)、仮想アドレス (vaddr)、ページ・サイズ<br />

(size) に一致する、すべてのローカルな ( 重なることがある ) ITR エントリをパー<br />

ジする。パージでは、vaddr{63:61} (VRL) は無視される。つまり、VRN ビット<br />

に関係なく、vaddr{60:0} に一致するすべてのエントリは、必ずパージされる。<br />

パージ・サイズ・パラメータがサポートされていない場合、プロセッサは、マシ<br />

ン・チェック・アボートを生成するか、指定された範囲を超えてトランスレーショ<br />

ン・キャッシュをパージするときがある。最大では、トランスレーション・キャッ<br />

シュからすべてのエントリが削除される。<br />

tlb_purge_translation_cache(loop) ローカル・プロセッサの ITC および DTC から、1 ~ N 個の変換エントリを削除す<br />

る。削除されるエントリの数は、プロセッサ固有である。パラメータ loop を使用<br />

して、プロセッサ固有のパージ・パラメータを生成できる。<br />

tlb_replacement_algorithm(tlb) 置換される次の ITC または DTC スロット番号を返す。置換アルゴリズムは、プロ<br />

セッサ固有である。tlb は、ITC または DTC 上で置換アルゴリズムを実行するよ<br />

うに指定する。<br />

tlb_search_pkr(key) key に一致する保護キーを持つ、有効な保護キー・レジスタを検索する。検索アル<br />

ゴリズムはプロセッサ固有である。該当するレジスタが見つかった場合は、その<br />

PKR レジスタのスロット番号を返す。それ以外の場合は、Not Found を返す。<br />

第 3 巻 : 擬似コード関数 3:259


表 3-1. 擬似コード関数 ( 続き )<br />

tlb_translate(vaddr, size, type, cpl, *attr,<br />

*defer)<br />

変換がイネーブルのときに、指定された仮想メモリ・アドレス (vaddr) の変換後の<br />

データ物理アドレスを返す。イネーブルでない場合は、vaddr を返す。size でア<br />

クセスのサイズを指定し、type でアクセスのタイプを指定する (read、write、<br />

advance、spec など )。cpl でアクセス・チェックのための特権レベルを指定す<br />

る。*attr はマップされた物理メモリ属性を返す。フォルト条件が検出され、据え<br />

置かれた場合、tlb_translate は *defer を設定して返る。フォルトが生成された<br />

が、フォルトがデファーされ ( 据え置かれ ) なかった場合、tlb_translate は返らな<br />

い。tlb_translate は、以下のフォルトをチェックする。<br />

VHPT データ・フォルト<br />

データがネストされた TLB フォルト<br />

データ TLB フォルト<br />

別のデータ TLB フォルト<br />

データ・ページ不在フォルト<br />

データ NaT ページ参照フォルト<br />

データ・キー・ミス・フォルト<br />

データ・キー許可フォルト<br />

データ・アクセス権フォルト<br />

データ・ダーティ・ビット・フォルト<br />

データ・アクセス・ビット・フォルト<br />

データ・デバッグ・フォルト<br />

サポートされないデータ参照フォルト<br />

tlb_translate_nonaccess(vaddr, type) 指定された仮想メモリ・アドレス (vaddr) の変換後のデータ物理アドレスを返す。<br />

type でアクセスのタイプを指定する (FC、TPA など )。フォルトが生成された場合、<br />

tlb_translate_nonaccess は返らない。以下のフォルトがチェックされる。<br />

VHPT データ・フォルト<br />

データ TLB フォルト<br />

データがネストされた TLB フォルト<br />

データ・ページ不在フォルト<br />

データ NaT ページ参照フォルト<br />

tlb_vhpt_hash(vrn, vaddr61, rid, size) 指定された仮想リージョン番号 (vrn) と、61 ビットの仮想オフセット (vaddr61)、<br />

リージョン識別子 (rid)、ページ・サイズ (size) を持つ VHPT エントリのアドレ<br />

スを生成する。tlb_vhpt_hash は、vaddr、rid、size パラメータをハッシュ処理<br />

して、ハッシュ・インデックスを生成する。次に、このハッシュ・インデックスを<br />

PTA.size に基づいてマスクして、PTA.base と連結し、VHPT エントリのアドレス<br />

を生成する。ロング形式のハッシュ法は、プロセッサ固有である。<br />

tlb_vhpt_tag(vaddr, rid, size) 指定された仮想アドレス (vaddr)、リージョン識別子 (rid)、ページ・サイズ<br />

(size) を持つ VHPT タグ識別子を生成する。tlb_vhpt_tag は、vaddr、rid、size<br />

パラメータをハッシュ処理して、変換エントリの識別子を生成する。このタグと<br />

ハッシュ・インデックスを組み合わせて、VHPT 内の変換エントリを一意に識別で<br />

きる。タグの生成方法は、プロセッサ固有である。すべてのプロセッサ・モデルの<br />

タグ関数は、生成されたタグのビット 63 (ti ビット ) が必ず 0 になるようにしなけ<br />

ればならない。<br />

unimplemented_physical_address<br />

(paddr)<br />

指定された物理アドレスが、このプロセッサ・モデルでサポートされていない場合<br />

に TRUE を返す。それ以外の場合には FALSE を返す。この関数はモデル固有であ<br />

る。<br />

undefined() 不定の 64 ビット値を返す。<br />

undefined_behavior() 不定のプロセッサ動作を発生させる。不定な動作の程度については、第 1 巻、第 1<br />

部の 3.5 節「未定義の動作」を参照のこと。<br />

unimplemented_virtual_address<br />

(vaddr)<br />

関数 操作<br />

指定された仮想アドレスが、このプロセッサ・モデルでサポートされていない場合<br />

に TRUE を返す。それ以外の場合には FALSE を返す。この関数はモデル固有であ<br />

る。<br />

fp_update_fpsr(sf, tmp_fp_env) 浮動小数点命令のローカル状態をグローバル FPSR にコピーする。<br />

3:260 第 3 巻 : 擬似コード関数


表 3-1. 擬似コード関数 ( 続き )<br />

関数 操作<br />

fp_update_psr(dest_freg) dest_freg に基づいて、PSR.mfl または PSR.mfh を条件付きで設定する。<br />

zero_ext(value, pos) ビット pos-1 から 0 までが value で埋められ、ビット位置 pos から 63 までがゼ<br />

ロとなっている 64 ビットの符号なし数値を返す。pos が 64 以上である場合には、<br />

value が返される。<br />

第 3 巻 : 擬似コード関数 3:261


3:262 第 3 巻 : 擬似コード関数


命令形式 4<br />

個々の Itanium ® 命令は、 6 つの タ イ プに分類 さ れる。 各命令タ イ プは 1 つまたは複数の実<br />

行ユニ ッ ト ・ タ イプ上で実行でき る。 表 4-1 に、 命令タ イプ と、 それら を実行でき る実行<br />

ユニッ ト ・ タイプを示す。<br />

表 4-1. 命令タイプと実行ユニット・タイプの関係<br />

命令タイプ 説明 実行ユニット・タイプ<br />

A 整数 ALU I ユニットまたは M ユニット<br />

I 非 ALU 整数 I ユニット<br />

M メモリ M ユニット<br />

F 浮動小数点 F ユニット<br />

B 分岐 B ユニット<br />

L+X 拡張 I ユニット /B ユニット a<br />

a. L+X 命令タイプのメジャー・オペコード 0 ~ 7 は、I ユニット上で実行される。L+X 命令タイプのメ<br />

ジャー・オペコード 8 ~ F は、B ユニット上で実行される。<br />

3 つの命令が、 128 ビットのサイズでアラインメントされて、 バンドル と呼ばれるコンテ<br />

ナにグループ化される。 各バン ド ルは、 41 ビッ トの命令スロット 3 つと、 5 ビッ トのテン<br />

プレー ト ・ フ ィ ールド 1 つを含んでいる。 バン ド ルの形式を図 4-1 に示す。<br />

図 4-1. バンドルの形式<br />

127 87 86 46 45 5 4 0<br />

命令スロット 2 命令スロット 1 命令スロット 0 テンプ<br />

レート<br />

41 41 41 5<br />

テンプレー ト ・ フ ィ ールド は、 カレン ト ・バン ドル内のスト ップと、 命令スロッ ト から実<br />

行ユニ ッ ト ・ タ イプへのマ ッ ピングの 2 つのプ ロ パテ ィ を指定する。 こ の 2 つのプロパ<br />

ティのすべての組み合わせが許容されているわけではない。表 4-2 に定義されている組み<br />

合わせを示す。 右側の 3 つの列は、 バン ド ル内の 3 つの命令ス ロ ッ ト に対応する。 個々の<br />

列では、 テンプレ ー ト ・ フ ィ ール ド のエン コ ーデ ィ ングご と に、 その命令ス ロ ッ ト に よ っ<br />

て制御 さ れる実行ユニ ッ ト の タ イ プが示されてい る。命令ス ロ ッ ト の右側にある二重の線<br />

は、 カ レン ト ・ バン ド ル内のそのポイン ト でス ト ッ プが起こ る こ と を示している。 ス ト ッ<br />

プの定義については、 第 1 巻、 第 1 部の 3.3 節 「命令のエン コ ー デ ィ ン グの概要」 を参照<br />

のこ と。 バンドルの中では、 実行順序はスロッ ト 0 からスロッ ト 2 に向か う。 使用されて<br />

いないテンプレー ト 値 ( 表 4-2 では空のスロ ッ ト として示している ) は予約されてお り、<br />

無効操作フ ォ ル ト を発生 さ せ る。<br />

ロ ング型即値整数命令お よ び ロ ング型分岐命令に使用 される拡張命令は、 2 つの命令ス<br />

ロ ッ ト を占有す る。 拡張命令は、 メ ジ ャ ー ・ オペ コ ー ド に基づいて、 B ユニ ッ ト 上 ( ロン<br />

グ型分岐 / 呼び出し ) または I ユニ ッ ト 上 ( その他のすべての L+X 命令 ) で実行される。<br />

第 3 巻 : 命令形式 3:263


表 4-2. テンプレート・フィールドのエンコーディングと命令スロットのマッピング<br />

4.1 形式の要約<br />

テンプレート スロット 0 スロット 1 スロット 2<br />

00 M ユニット I ユニット I ユニット<br />

01 M ユニット I ユニット I ユニット<br />

02 M ユニット I ユニット I ユニット<br />

03 M ユニット I ユニット I ユニット<br />

04 M ユニット L ユニット X ユニット a<br />

05 M ユニット L ユニット X ユニット a<br />

06<br />

07<br />

08 M ユニット M ユニット I ユニット<br />

09 M ユニット M ユニット I ユニット<br />

0A M ユニット M ユニット I ユニット<br />

0B M ユニット M ユニット I ユニット<br />

0C M ユニット F ユニット I ユニット<br />

0D M ユニット F ユニット I ユニット<br />

0E M ユニット M ユニット F ユニット<br />

0F M ユニット M ユニット F ユニット<br />

10 M ユニット I ユニット B ユニット<br />

11 M ユニット I ユニット B ユニット<br />

12 M ユニット B ユニット B ユニット<br />

13<br />

14<br />

15<br />

M ユニット B ユニット B ユニット<br />

16 B ユニット B ユニット B ユニット<br />

17 B ユニット B ユニット B ユニット<br />

18 M ユニット M ユニット B ユニット<br />

19<br />

1A<br />

1B<br />

M ユニット M ユニット B ユニット<br />

1C M ユニット F ユニット B ユニット<br />

1D<br />

1E<br />

1F<br />

M ユニット F ユニット B ユニット<br />

a. MLX テンプレートは、以前は MLI と呼ばれていた。互換性を保つために、X スロットは、X ユニットの命<br />

令以外に、break.i と nop.i をエンコードできる。<br />

命令セ ッ ト のすべての命令は長 さ 41 ビ ッ ト である。 各命令の左側の 4 ビット (40:37) はメ<br />

ジャー ・オペコードである。 表 4-3 に、 ALU (A)、 整数(I)、 メモリ (M)、 浮動小数点 (F)、<br />

分岐 (B) の 5 つの命令タイプのメジ ャ ー ・ オペコ ー ド の割り当てを示す。 バン ド ルのテン<br />

プレー ト ・ ビッ ト は 4 つの列を区別するために使用されているので、 各列の中で同じ メ<br />

ジ ャ ー ・ オペ コ ー ド 値が再利用 さ れてい る場合がある。<br />

3:264 第 3 巻 : 命令形式


使用 さ れていないメ ジ ャ ー ・オペ コ ー ド ( 表 4-3 では空のエント リ として示している ) は、<br />

次の 3 つのう ちのいずれかの動作をする。<br />

• 無視 さ れる メ ジ ャ ー ・ オペ コ ー ド ( 表 4-3 の白のエン ト リ ) は、 nop 命令 と して実行<br />

される。<br />

• 予約済みの メ ジ ャ ー ・ オペ コ ー ド ( 表 4-3 の、 グ レ ー ・ ス ケ ー ル版では薄灰色、 カ<br />

ラー版では茶色) は、 無効操作フ ォ ル ト を発生さ せ る。<br />

• PR[qp] が 1 の場合に予約済み と なる メ ジ ャ ー ・ オペコ ー ド ( 表 4-3 の、 グレ ー ・ ス<br />

ケ ー ル版では濃灰色、 カ ラ ー版では紫色 ) は、 命令の qp フィールド ( ビッ ト 5:0) で<br />

指定 さ れる プ レ デ ィ ケ ー ト ・ レ ジ ス タ が 1 であ る場合に は無効操作フ ォ ル ト を発生<br />

させ、 0 の場合は nop 命令 と して実行される。<br />

• PR[qp] が 1 の場合に予約済み と なる B ユニッ ト のメジ ャ ー ・ オペコ ー ド ( 表 4-3 の<br />

グレー ・ スケール版では中間の灰色、 カ ラー ・ バージ ョ ンでは水色 ) は、 命令の qp<br />

フィールド ( ビッ ト 5:0) で指定されるプレデ ィ ケー ト ・ レ ジスタが 1 である場合に<br />

は無効操作フ ォ ル ト を発生さ せ、 0 の場合には nop 命令として実行される。 これら<br />

のメジャー ・ オペコー ド と、 PR[qp] が 1 の場合に予約済み と な る メ ジ ャ ー ・ オペ<br />

コ ー ド の相違点は、 RAW 依存関係での動作だけである (5.3.2 項 「RAW の依存関係<br />

表」 を参照 )。<br />

表 4-3. メジャー・オペコードの割り当て<br />

メジャー・<br />

命令タイプ<br />

オペコード<br />

( ビット 40:37)<br />

I/A M/A F B L+X<br />

0<br />

Misc<br />

0 0<br />

Sys/Mem Mgmt FP Misc<br />

0 Misc/Indirect<br />

Branch 0 Misc<br />

0<br />

1<br />

1 1<br />

Sys/Mem Mgmt FP Misc<br />

1<br />

Indirect Call<br />

1 1<br />

2 2 2 2 Indirect Predict/<br />

Nop 2<br />

2<br />

3<br />

3 3 3 3 3<br />

4<br />

Deposit<br />

4 4<br />

Int Ld +Reg/getf FP Compare 4 IP-relative<br />

Branch 4<br />

4<br />

5 Shift/Test Bit 5<br />

Int Ld/St +Imm 5<br />

FP Class<br />

5<br />

IP-rel Call<br />

5 5<br />

6 6 FP Ld/St +Reg/<br />

setf 6<br />

6 6<br />

movl<br />

6<br />

7<br />

MM Mpy/Shift 7 FP Ld/St +Imm 7 7 IP-relative<br />

Predict<br />

7<br />

7<br />

8 ALU/MM ALU 8 ALU/MM ALU 8 fma 8 e 8 8<br />

9 Add Imm22 9<br />

Add Imm22 9<br />

fma<br />

9 e 9 9<br />

A<br />

A A<br />

fms<br />

A e A A<br />

B B B fms B e B B<br />

C Compare<br />

D Compare<br />

C<br />

D<br />

Compare<br />

Compare<br />

3:266 ページの表 4-4 に、 すべての命令形式の要約を示す。 命令フ ィ ー ル ド は、 3:268 ペー<br />

ジの表 4-5 で説明している よ う に、 見やすい よ う に色分け されている。 本章では、 命令エ<br />

ン コ ーデ ィ ングの操作と 特に関係の深い命令フ ィ ール ド について色分けをしている。<br />

本章で使用している命令フ ィ ール ド名については、 3:268 ページの表 4-6 で説明している。<br />

特殊な表記 ( その命令が命令グル ー プの最初の命令でな く てはな ら ない、 な ど ) について<br />

は、 3:269 ページの表 4-7 で説明している。 こ れら の表記は オペ コ ー ド 表の 「命令」 の列<br />

に示されている。<br />

第 3 巻 : 命令形式 3:265<br />

C<br />

D<br />

fnma<br />

fnma<br />

C e C Long Branch C<br />

D e D Long Call<br />

E Compare E Compare E fselect/xma E e E E<br />

F<br />

F F F e F F<br />

D


即値を含んでいる大部分の命令は、 これら の即値を複数の命令フ ィ ー ル ド にエン コ ー ド し<br />

ている。 たと えば、 Add Imm 14 命令 ( 形式 A4) の 14 ビットの即値は、 imm 7b 、 imm 6d 、 お<br />

よび s フ ィ ールドから作られる。 3:341 ページの表 4-74 は、 即値を持つ個々の命令につい<br />

て、 命令フ ィ ール ド か ら即値がどのよ う に生成されるかを示している。<br />

表 4-4. 命令形式の要約<br />

40393837363534333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1 0<br />

ALU A1 8 x 2a v e x 4 x 2b r 3 r 2 r 1 qp<br />

Shift L and Add A2 8 x 2a v e x 4 ct 2d r 3 r 2 r 1 qp<br />

ALU Imm 8 A3 8 s x 2a v e x 4 x 2b r 3 imm 7b r 1 qp<br />

Add Imm 14 A4 8 s x 2a v e imm 6d r 3 imm 7b r 1 qp<br />

Add Imm 22 A5 9 s imm 9d imm 5c r 3 imm 7b r 1 qp<br />

Compare A6 C - E t b x 2 t a p 2 r 3 r 2 c p 1 qp<br />

Compare to Zero A7 C - E t b x 2 t a p 2 r 3 0 c p 1 qp<br />

Compare Imm 8 A8 C - E s x 2 t a p 2 r 3 imm 7b c p 1 qp<br />

MM ALU A9 8 z a x 2a z b x 4 x 2b r 3 r 2 r 1 qp<br />

MM Shift and Add A10 8 z a x 2a z b x 4 ct 2d r 3 r 2 r 1 qp<br />

MM Multiply Shift I1 7 z a x 2a z b v e ct 2d x 2b r 3 r 2 r 1 qp<br />

MM Mpy/Mix/Pack I2 7 z a x 2a z b v e x 2c x 2b r 3 r 2 r 1 qp<br />

MM Mux1 I3 7 z a x 2a z b v e x 2c x 2b mbt 4c r 2 r 1 qp<br />

MM Mux2 I4 7 z a x 2a z b v e x 2c x 2b mht 8c r 2 r 1 qp<br />

Shift R Variable I5 7 z a x 2a z b v e x 2c x 2b r 3 r 2 r 1 qp<br />

MM Shift R Fixed I6 7 z a x 2a z b v e x 2c x 2b r 3 count 5b r 1 qp<br />

Shift L Variable I7 7 z a x 2a z b v e x 2c x 2b r 3 r 2 r 1 qp<br />

MM Shift L Fixed I8 7 z a x 2a z b v e x 2c x 2b ccount 5c r 2 r 1 qp<br />

Popcount I9 7 z a x 2a z b v e x 2c x 2b r 3 0 r 1 qp<br />

Shift Right Pair I10 5 x 2 x count 6d r 3 r 2 r 1 qp<br />

Extract I11 5 x 2 x len 6d r 3 pos 6b y r 1 qp<br />

Dep.Z I12 5 x 2 x len 6d y cpos 6c r 2 r 1 qp<br />

Dep.Z Imm 8 I13 5 s x 2 x len 6d y cpos 6c imm 7b r 1 qp<br />

Deposit Imm 1 I14 5 s x 2 x len 6d r 3 cpos 6b r 1 qp<br />

Deposit I15 4 cpos 6d len 4d r 3 r 2 r 1 qp<br />

Test Bit I16 5 t b x 2 t a p 2 r 3 pos 6b y c p 1 qp<br />

Test NaT I17 5 t b x 2 t a p 2 r 3 y c p 1 qp<br />

Nop/Hint I18 0 i x 3 x 6 y imm 20a qp<br />

Break I19 0 i x 3 x 6 imm 20a qp<br />

Int Spec Check I20 0 s x 3 imm 13c r 2 imm 7a qp<br />

Move to BR I21 0 x 3 timm 9c ih x wh r 2 b 1 qp<br />

Move from BR I22 0 x 3 x 6 b 2 r 1 qp<br />

Move to Pred I23 0 s x 3 mask 8c r 2 mask 7a qp<br />

Move to Pred Imm 44 I24 0 s x 3 imm 27a qp<br />

Move from Pred/IP I25 0 x 3 x 6 r 1 qp<br />

Move to AR I26 0 x 3 x 6 ar 3 r 2 qp<br />

Move to AR Imm 8 I27 0 s x 3 x 6 ar 3 imm 7b qp<br />

Move from AR I28 0 x 3 x 6 ar 3 r 1 qp<br />

Sxt/Zxt/Czx I29 0 x 3 x 6 r 3 r 1 qp<br />

Int Load M1 4 m x 6 hint x r 3 r 1 qp<br />

Int Load +Reg M2 4 m x 6 hint x r 3 r 2 r 1 qp<br />

Int Load +Imm M3 5 s x 6 hint i r 3 imm 7b r 1 qp<br />

Int Store M4 4 m x 6 hint x r 3 r 2 qp<br />

Int Store +Imm M5 5 s x 6 hint i r 3 r 2 imm 7a qp<br />

FP Load M6 6 m x 6 hint x r 3 f 1 qp<br />

FP Load +Reg M7 6 m x 6 hint x r 3 r 2 f 1 qp<br />

FP Load +Imm M8 7 s x 6 hint i r 3 imm 7b f 1 qp<br />

FP Store M9 6 m x 6 hint x r 3 f 2 qp<br />

40393837363534333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1 0<br />

3:266 第 3 巻 : 命令形式


表 4-4. 命令形式の要約 ( 続き )<br />

40393837363534333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1 0<br />

FP Store +Imm M10 7 s x6 hint i r3 f2 imm7a qp<br />

FP Load Pair M11 6 m x6 hint x r3 f2 f1 qp<br />

FP Load Pair +Imm M12 6 m x6 hint x r3 f2 f1 qp<br />

Line Prefetch M13 6 m x6 hint x r3 qp<br />

Line Prefetch +Reg M14 6 m x6 hint x r3 r2 qp<br />

Line Prefetch +Imm M15 7 s x6 hint i r3 imm7b qp<br />

(Cmp &) Exchg M16 4 m x6 hint x r3 r2 r1 qp<br />

Fetch & Add M17 4 m x6 hint x r3 s i2b r1 qp<br />

Set FR M18 6 m x6 x r2 f1 qp<br />

Get FR M19 4 m x6 x f2 r1 qp<br />

Int Spec Check M20 1 s x3 imm13c r2 imm7a qp<br />

FP Spec Check M21 1 s x3 imm13c f2 imm7a qp<br />

Int ALAT Check M22 0 s x3 imm20b r1 qp<br />

FP ALAT Check M23 0 s x3 imm20b f1 qp<br />

Sync/Srlz/ALAT M24 0 x3 x2 x4 qp<br />

RSE Control M25 0 x3 x2 x4 0<br />

Int ALAT Inval M26 0 x3 x2 x4 r1 qp<br />

FP ALAT Inval M27 0 x3 x2 x4 f1 qp<br />

Flush Cache M28 1 x x3 x6 r3 qp<br />

Move to AR M29 1 x3 x6 ar3 r2 qp<br />

Move to AR Imm8 M30 0 s x3 x2 x4 ar3 imm7b qp<br />

Move from AR M31 1 x3 x6 ar3 r1 qp<br />

Move to CR M32 1 x3 x6 cr3 r2 qp<br />

Move from CR M33 1 x3 x6 cr3 r1 qp<br />

Alloc M34 1 x3 sor sol sof r1 qp<br />

Move to PSR M35 1 x3 x6 r2 qp<br />

Move from PSR M36 1 x3 x6 r1 qp<br />

Break M37 0 i x3 x2 x4 imm20a qp<br />

Probe M38 1 x3 x6 r3 r2 r1 qp<br />

Probe Imm2 M39 1 x3 x6 r3 i2b r1 qp<br />

Probe Fault Imm2 M40 1 x3 x6 r3 i2b qp<br />

TC Insert M41 1 x3 x6 r2 qp<br />

Mv to Ind/TR Ins M42 1 x3 x6 r3 r2 qp<br />

Mv from Ind M43 1 x3 x6 r3 r1 qp<br />

Set/Reset Mask M44 0 i x3 i2d x4 imm21a qp<br />

Translation Purge M45 1 x3 x6 r3 r2 qp<br />

Translation Access M46 1 x3 x6 r3 r1 qp<br />

TC Entry Purge M47 1 x3 x6 r3 qp<br />

Nop/Hint M48 0 i x3 x2 x4 y imm20a qp<br />

IP-Relative Branch B1 4 s d wh imm20b p btype qp<br />

Counted Branch B2 4 s d wh imm20b p btype 0<br />

IP-Relative Call B3 5 s d wh imm20b p b1 qp<br />

Indirect Branch B4 0 d wh x6 b2 p btype qp<br />

Indirect Call B5 1 d wh b2 p b1 qp<br />

IP-Relative Predict B6 7 s ih t2e imm20b timm7a wh<br />

Indirect Predict B7 2 ih t2e x6 b2 timm7a wh<br />

Misc B8 0 x6 0<br />

Break/Nop/Hint B9 0/2 i x6 imm20a qp<br />

FP Arithmetic F1 8 - D x sf f4 f3 f2 f1 qp<br />

Fixed Multiply Add F2 E x x2 f4 f3 f2 f1 qp<br />

FP Select F3 E x f4 f3 f2 f1 qp<br />

FP Compare F4 4 rb sf ra p2 f3 f2 ta p1 qp<br />

FP Class F5 5 fc2 p2 fclass7c f2 ta p1 qp<br />

40393837363534333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1 0<br />

第 3 巻 : 命令形式 3:267


表 4-4. 命令形式の要約 ( 続き )<br />

40393837363534333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1 0<br />

FP Recip Approx F6 0 - 1 q sf x p2 f3 f2 f1 qp<br />

FP Recip Sqrt App F7 0 - 1 q sf x p2 f3 f1 qp<br />

FP Min/Max/Pcmp F8 0 - 1 sf x x6 f3 f2 f1 qp<br />

FP Merge/Logical F9 0 - 1 x x6 f3 f2 f1 qp<br />

Convert FP to Fixed F10 0 - 1 sf x x6 f2 f1 qp<br />

Convert Fixed to FP F11 0 x x6 f2 f1 qp<br />

FP Set Controls F12 0 sf x x6 omask7c amask7b qp<br />

FP Clear Flags F13 0 sf x x6 qp<br />

FP Check Flags F14 0 s sf x x6 imm20a qp<br />

Break F15 0 i x x6 imm20a qp<br />

Nop/Hint F16 0 i x x6 y imm20a qp<br />

Break X1 0 i x3 x6 imm20a qp imm41 Move Imm64 X2 6 i imm9d imm5c ic vc imm7b r1 qp imm41 Long Branch X3 C i d wh imm20b p btype qp imm39 Long Call X4 D i d wh imm20b p b1 qp imm39 Nop/Hint X5 0 i x3 x6 y imm20a qp imm41 40393837363534333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1 0<br />

表 4-5. 命令フィールドのカラー・キー<br />

フィールドとカラー<br />

ALU 命令 オペコード拡張<br />

整数命令 オペコード・ヒント拡張<br />

メモリ命令 即値<br />

分岐命令 間接ソース<br />

浮動小数点命令 プレディケート・デスティネーション<br />

整数ソース 整数デスティネーション<br />

メモリ・ソース メモリのソースとデスティネーション<br />

シフト・ソース シフト・即値<br />

特殊レジスタ・ソース 特殊レジスタ・デスティネーション<br />

浮動小数点ソース 浮動小数点デスティネーション<br />

分岐ソース 分岐デスティネーション<br />

アドレス・ソース 分岐タグの即値<br />

修飾プレディケート 予約済み命令<br />

無視されるフィールド / 命令 PR[qp] が 1 の場合の予約済み命令<br />

表 4-6. 命令フィールド名<br />

PR[qp] が 1 の場合に予約済みとなる B タイプ命令<br />

フィールド名 説明<br />

ar3 アプリケーション・レジスタのソース / ターゲット<br />

b1 , b2 分岐レジスタのソース / ターゲット<br />

btype 分岐タイプのオペコード拡張<br />

c 補数比較関係のオペコード拡張<br />

ccount5c マルチメディア向け左シフト補数シフトのカウントの即値<br />

count5b , count6d マルチメディア向け右シフト / ペア右シフトのカウントの即値<br />

cposx デポジットの補数ビット位置の即値<br />

3:268 第 3 巻 : 命令形式


表 4-6. 命令フィールド名 ( 続き )<br />

フィールド名 説明<br />

cr3 コントロール・レジスタのソース / ターゲット<br />

ct2d マルチメディア向け乗算シフト / シフトおよび加算のシフト・カウントの即値<br />

d 分岐キャッシュ割り当て解除ヒントのオペコード拡張<br />

fn 浮動小数点レジスタのソース / ターゲット<br />

fc2 , fclass7c 浮動小数点クラスの即値<br />

hint メモリ参照ヒントのオペコード拡張<br />

i, i2b, i2d, immx 長さ 1、2、または x の即値<br />

ih 分岐重要度ヒントのオペコード拡張<br />

len4d , len6d 抽出 / デポジットの長さの即値<br />

m メモリ参照での事後変更のオペコード拡張<br />

maskx プレディケートの即値マスク<br />

mbt4c , mht8c マルチメディア向け mux1/mux2 の即値<br />

p シーケンシャル・プリフェッチ・ヒントのオペコード拡張<br />

p1, p2 プレディケート・レジスタのターゲット<br />

pos6b ビット・テスト / 抽出でのビット位置の即値<br />

q 浮動小数点逆数 / 逆数平方根のオペコード拡張<br />

qp 修飾プレディケート・レジスタのソース<br />

rn 汎用レジスタのソース / ターゲット<br />

s 即値符号ビット<br />

sf 浮動小数点ステータス・フィールドのオペコード拡張<br />

sof, sol, sor フレームの割り当てサイズ、ローカル・エリアのサイズ、ローテート・エリアのサイズ<br />

の即値<br />

ta, tb 比較タイプのオペコード拡張<br />

t2e , timmx 分岐予測タグの即値<br />

vx 予約済みオペコード拡張フィールド<br />

wh 分岐有無ヒントのオペコード拡張<br />

x, xn 長さ 1 または n のオペコード拡張<br />

y 抽出 / デポジット / ビット・テスト /NaT テストのオペコード拡張<br />

za, zb マルチメディア向けオペランド・サイズのオペコード拡張<br />

表 4-7. 特殊な命令表記<br />

表記 説明<br />

e 命令が実行されたとき、命令グループは終了する。「PR[qp] が 1 の場合に予約済み」のエ<br />

ンコーディングと、修飾プレディケートを持つ非分岐命令では、PR[qp] が 1 のとき、命<br />

令グループは終了する。「予約済み」のエンコーディングでは、無条件に命令グループは<br />

終了する。<br />

f 命令は同一命令グループ内の最初の命令でなければならない。さらに、この命令は、命<br />

令スロット 0 またはスロット 0 の後にストップ情報があるテンプレートの命令スロット 1<br />

のいずれかに入っていなければならない。<br />

i 命令は MLI テンプレートの I スロットに入れることができる。<br />

l 命令は命令グループ内の最後の命令でなくてはならない<br />

p 特権命令。<br />

t 命令は命令スロット 2 にしか入らない<br />

本章の以降では、 すべての命令のエン コ ー デ ィ ン グを詳し く 説明す る。 ま ず 「A ユニッ ト<br />

命令エン コ ー デ ィ ン グ」 を示し、 その後に、 4-280 ページで 「I ユニッ ト 命令エン コ ーデ ィ<br />

第 3 巻 : 命令形式 3:269


ング」、 4-293 ページで 「M ユニ ッ ト 命令エンコ ーデ ィ ング」、 4-321 ページで 「B ユニッ<br />

ト命令エンコーディング」、 4-328 ページで 「F ユニ ッ ト 命令エンコ ーデ ィ ング」、 4-337<br />

ページで 「X ユニ ッ ト 命令エン コ ー デ ィ ング」 を示す。<br />

個々の節の中では、 命令を機能ご と にグループ化し、 3:266 ページの表 4-4 「命令形式の<br />

要約」 で示したの と 同じ順序でその命令形式を示している。 オペ コ ー ド 拡張フ ィ ー ル ド に<br />

ついて も 簡単に説明し、 オペ コ ー ド 拡張割 り 当て も 表に示してい る。 使用 さ れていない命<br />

令エン コ ーデ ィ ング ( オペコ ー ド 拡張の表では空のエン ト リ と して示している ) は、 次の<br />

4 つのいずれかの動作をする。<br />

• 無視 さ れる命令 ( 表の白のエン ト リ ) は、 nop 命令 と して実行 さ れる。<br />

• 予約済みの命令 ( 表のグレ ー ・ スケ ール版では薄灰色、 カ ラ ー版では茶色 ) は、 無効<br />

操作フ ォ ル ト を発生 さ せる。<br />

• PR[qp] が 1 の場合に予約済み と なる命令 ( 表のグレ ー ・ スケ ール版では濃灰色、 カ<br />

ラー版では紫色) は、 命令の qp フィールド ( ビッ ト 5:0) で指定されるプレデ ィ ケー<br />

ト・レジスタが1 であ る場合に は無効操作フ ォ ル ト を発生 さ せ、 0 の場合は nop 命<br />

令として実行される。<br />

• PR[qp] が 1 の場合に予約済み と なる B ユニッ ト の命令 ( 表のグレ ー ・ スケ ール版で<br />

は中間の灰色、 カ ラ ー版では水色 ) は、 命令の qp フィールド ( ビッ ト 5:0) で指定さ<br />

れるプレディ ケー ト ・ レジスタが 1 であ る場合に は無効操作フ ォ ル ト を発生 さ せ、 0<br />

の場合には nop 命令として実行される。 これらの命令と、 PR[qp] が 1 の場合に予約<br />

済み と なる命令の相違点は、 RAW 依存関係での動作だけである (3:346 ページの<br />

「RAW の依存関係表」 を参照 )。<br />

プロセッサによっては、 「PR[qp] が 1 の場合に予約済み」 お よ び 「PR[qp] が 1 の場合に予<br />

約済み と な る B ユニ ッ ト 」 のエンコ ーデ ィ ングを、 L+X オペ コ ー ド 空間内に 「予約済み」<br />

と して実装する も のがある。 これらのエン コ ーデ ィ ングは、 3:265 ページの表 4-3 の L+X<br />

の項目 と 、 3:338 ページの表 4-69、 3:338 ページの表 4-70、 3:339 ページの表 4-71、 3:339<br />

ページの表 4-72 に示 さ れてい る。 こ れ ら のエン コ ー デ ィ ン グを 「予約済み」 (茶) と して<br />

実装するプロセッサでは、 オペレーテ ィ ング ・ システムが、 無効操作フォルト ・ハン ド ラ<br />

を提供する必要がある。 このハン ド ラが、 予約済みのオペコ ー ド をデコ ー ド して、 修飾プ<br />

レディ ケー ト をチェ ッ クし、 PR[qp] が 0 の場合は次の命令に戻る と 、 「予約済み」 のエン<br />

コーディングを 「PR[qp] が 1 (水色 / 紫) の場合に予約済み」 と してエ ミ ュ レ ー ト す る。<br />

命令の定数 0 のフ ィ ールド は 0 でな く てはな ら ず、 それ以外の場合は未定義の操作が発生<br />

す る。 未定義の操作には、 定数フ ィ ー ル ド が 0 であるかど うかをチェ ッ クし、 そ うでない<br />

場合には無効操作フ ォ ル ト を発生さ せる よ う な も の も ある。定数 0 のフ ィ ールド を持つ命<br />

令が修飾プレデ ィ ケ ー ト (qp フィールド ) も持っている場合、 PR[qp] が 0 ならば、 フォル<br />

ト やその他の未定義の操作は発生しない。 命令ビッ ト 5:0 ( 通常、 qp に使用される ) にあ<br />

る定数 0 の フ ィ ー ル ド の場合、 フ ォ ル ト ま たは その他の未定義の操作は、 こ れ ら の ビ ッ ト<br />

がア ド レス指定する PR に依存することもしないこともある。<br />

命令の無視 さ れる ( ホワイ ト ・スペース ) フィールドは0 としてコーディングするべきで<br />

ある。 アーキテクチャのこのリビジョンでは無視されるが、 将来のアーキテクチャでこれ<br />

ら の フ ィ ール ド を ヒ ン ト 拡張 と して使用する可能性がある。 これ ら の ヒ ン ト 拡張は、 各<br />

フィールドの0 の値がデフ ォ ル ト 設定の ヒ ン ト に対応す る よ う な形で定義される。 アセン<br />

ブ ラ がデ フ ォ ル ト で こ れ ら の フ ィ ー ル ド を自動的にゼ ロ に設定する こ と が求め ら れる。<br />

3:270 第 3 巻 : 命令形式


4.2 A ユニット命令エンコーディング<br />

4.2.1 整数 ALU<br />

すべての整数 ALU 命令は、 メ ジ ャ ー ・ オペ コ ー ド 8 の中にエン コ ー ド される。 ビ ッ ト<br />

35:34(x 2a ) に 2 ビッ トのオペコード拡張フィールドを持ち、 ほとんどのものは、 ビッ ト<br />

28:27(x 2b ) に第 2 の 2 ビッ トのオペコード拡張フィールド、ビッ ト 32:29(x 4 ) に 4 ビッ トの<br />

オペコ ー ド拡張フ ィ ール ド、ビ ッ ト 33(v e ) に 1 ビ ッ ト の予約済みオペ コ ー ド 拡張フ ィ ー ル<br />

ドを持つ。 表 4-8 は、 2 ビッ トのx 2a と 1 ビッ トのv e の割り当てを示してお り、 表 4-9 は<br />

整数 ALU の 4 ビッ ト +2 ビッ トの割り当てを示しており、3:276 ページの表 4-12 はマルチ<br />

メディア ALU の 1 ビッ ト +2 ビッ トの割り当てを示している( これもメジャー・オペコー<br />

ド 8 を共有する )。<br />

表 4-8. 整数 ALU の 2 ビット +1 ビット・オペコード拡張<br />

オペ<br />

コード・<br />

ビット<br />

40:377<br />

8<br />

X 2a<br />

ビット<br />

35:34<br />

0<br />

Ve ビット 33<br />

0 1<br />

整数 ALU 4 ビット +2 ビット拡張<br />

( 表 4-9)<br />

1 マルチメディア ALU 1 ビット +2 ビット拡張 ( 表 4-12)<br />

2 adds - imm14 A4<br />

3 addp4 - imm 14 A4<br />

表 4-9. 整数 ALU の 4 ビット +2 ビット・オペコード拡張<br />

オペ<br />

コード・<br />

ビット<br />

40:377<br />

x 2a<br />

ビット<br />

35:34<br />

v e<br />

ビット<br />

33<br />

8 0 0<br />

x 4<br />

ビット<br />

32:29<br />

x2b ビット 28:27<br />

0 1 2 3<br />

0 add A1 add +1 A1<br />

1 sub -1 A1 sub A1<br />

2 addp4 A1<br />

3 and A1 andcm A1 or A1 xor A1<br />

4<br />

5<br />

shladd A2<br />

6<br />

7<br />

8<br />

shladdp4 A2<br />

9 sub - imm8 A3<br />

A<br />

B<br />

C<br />

D<br />

E<br />

F<br />

and - imm8 A3 andcm - imm8 A3 or - imm8 A3 xor - imm8 A3<br />

第 3 巻 : 命令形式 3:271


4.2.1.1 Integer ALU - Register-Register<br />

A1<br />

4.2.1.2 Shift Left and Add<br />

A2<br />

4.2.1.3 Integer ALU ─ Immediate 8 -Register<br />

A3<br />

40 37 36 35 34 33 32 29 28 27 26 20 19 13 12 6 5 0<br />

add<br />

sub<br />

8 x 2a v e x 4 x 2b r 3 r 2 r 1 qp<br />

4 1 2 1 4 2 7 7 7 6<br />

命令 オペランド オペコード<br />

3:272 第 3 巻 : 命令形式<br />

拡張<br />

x 2a v e x 4 x 2b<br />

r1 = r2 , r3 r1 = r2 , r3 , 1<br />

0<br />

0<br />

1<br />

r1 = r2 , r3 1<br />

r 1 = r 2 , r 3 , 1 0<br />

addp4<br />

8 0 0 2 0<br />

and<br />

0<br />

andcm<br />

or<br />

r1 = r2 , r3 3<br />

1<br />

2<br />

xor 3<br />

40 37 36 35 34 33 32 29 28 27 26 20 19 13 12 6 5 0<br />

8 x 2a v e x 4 ct 2d r 3 r 2 r 1 qp<br />

4 1 2 1 4 2 7 7 7 6<br />

拡張<br />

命令 オペランド オペコード<br />

x2a ve x4 shladd<br />

shladdp4<br />

r1 = r2 , count2 , r3 8 0 0<br />

4<br />

6<br />

40 37 36 35 34 33 32 29 28 27 26 20 19 13 12 6 5 0<br />

8 s x 2a v e x 4 x 2b r 3 imm 7b r 1 qp<br />

4 1 2 1 4 2 7 7 7 6<br />

拡張<br />

命令 オペランド オペコード<br />

x2a ve x4 x2b sub<br />

9 1<br />

and<br />

0<br />

andcm<br />

or<br />

r1 = imm8 , r3 8 0 0<br />

B<br />

1<br />

2<br />

xor 3<br />

1


4.2.1.4 Add Immediate 14<br />

A4<br />

4.2.1.5 Add Immediate 22<br />

A5<br />

4.2.2 整数比較<br />

40 37 36 35 34 33 32 27 26 20 19 13 12 6 5 0<br />

8 s x2a ve imm6d r3 imm7b r1 qp<br />

4 1 2 1 6 7 7 7 6<br />

命令 オペランド オペコード<br />

adds<br />

2<br />

r1 = imm14 , r3 8<br />

addp4 3<br />

40 37 36 35 27 26 22 21 20 19 13 12 6 5 0<br />

9 s imm 9d imm 5c r 3 imm 7b r 1 qp<br />

4 1 9 5 2 7 7 6<br />

整数比較命令は、 メ ジ ャ ー ・ オペ コ ー ド C-E の中にエン コ ー ド される。 表 4-10 に示すよ<br />

うに、 ビッ ト 35:34 に 2 ビッ トのオペコード拡張フィールド (x 2 )、 ビッ ト 33(t a )、 36(t b )、<br />

12(c) に 3 つの 1 ビ ッ ト ・ オペ コ ー ド 拡張フ ィ ー ル ド を使用する。 整数比較即値命令は、<br />

メジャー・オペコード C-E の中にエン コ ー ド され、 表 4-11 に示すよ う に、 ビ ッ ト 35:34 に<br />

2 ビットのオペコード拡張フィールド (x 2 )、ビット33(t a ) と 12(c) に 2 つの 1 ビット ・オペ<br />

コード拡張フィールドを使用する。<br />

表 4-10. 整数比較オペコード拡張<br />

x 2<br />

ビット<br />

35:34<br />

0<br />

1<br />

第 3 巻 : 命令形式 3:273<br />

x 2a<br />

拡張<br />

命令 オペランド オペコード<br />

addl r 1 = imm 22 , r 3 9<br />

t b<br />

ビット<br />

36<br />

0<br />

1<br />

0<br />

1<br />

t a<br />

ビット<br />

33<br />

0<br />

1<br />

0<br />

1<br />

0<br />

1<br />

0<br />

1<br />

c<br />

ビット<br />

12<br />

C<br />

オペコード・ビット 40:37<br />

D E<br />

0 cmp.lt A6 cmp.ltu A6 cmp.eq A6<br />

1 cmp.lt.unc A6 cmp.ltu.unc A6 cmp.eq.unc A6<br />

0 cmp.eq.and A6 cmp.eq.or A6 cmp.eq.or.andcm A6<br />

1 cmp.ne.and A6 cmp.ne.or A6 cmp.ne.or.andcm A6<br />

0 cmp.gt.and A7 cmp.gt.or A7 cmp.gt.or.andcm A7<br />

1 cmp.le.and A7 cmp.le.or A7 cmp.le.or.andcm A7<br />

0 cmp.ge.and A7 cmp.ge.or A7 cmp.ge.or.andcm A7<br />

1 cmp.lt.and A7 cmp.lt.or A7 cmp.lt.or.andcm A7<br />

0 cmp4.lt A6 cmp4.ltu A6 cmp4.eq A6<br />

1 cmp4.lt.unc A6 cmp4.ltu.unc A6 cmp4.eq.unc A6<br />

0 cmp4.eq.and A6 cmp4.eq.or A6 cmp4.eq.or.andcm A6<br />

1 cmp4.ne.and A6 cmp4.ne.or A6 cmp4.ne.or.andcm A6<br />

0 cmp4.gt.and A7 cmp4.gt.or A7 cmp4.gt.or.andcm A7<br />

1 cmp4.le.and A7 cmp4.le.or A7 cmp4.le.or.andcm A7<br />

0 cmp4.ge.and A7 cmp4.ge.or A7 cmp4.ge.or.andcm A7<br />

1 cmp4.lt.and A7 cmp4.lt.or A7 cmp4.lt.or.andcm A7<br />

v e<br />

0


表 4-11. 整数比較即値オペコード拡張<br />

4.2.2.1 Integer Compare ─ Register-Register<br />

A6<br />

x 2<br />

ビット<br />

35:34<br />

2<br />

3<br />

t a<br />

ビット<br />

36<br />

0<br />

1<br />

0<br />

1<br />

c<br />

ビット<br />

12<br />

C<br />

オペコード・ビット 40:37<br />

D E<br />

0 cmp.lt - imm8 A8 cmp.ltu - imm8 A8 cmp.eq - imm8 A8<br />

1 cmp.lt.unc - imm8 A8 cmp.ltu.unc - imm8 A8 cmp.eq.unc - imm8 A8<br />

0 cmp.eq.and - imm8 A8 cmp.eq.or - imm8 A8 cmp.eq.or.andcm - imm8 A8<br />

1 cmp.ne.and - imm8 A8 cmp.ne.or - imm8 A8 cmp.ne.or.andcm - imm8 A8<br />

0 cmp4.lt - imm8 A8 cmp4.ltu - imm8 A8 cmp4.eq - imm8 A8<br />

1 cmp4.lt.unc - imm8 A8 cmp4.ltu.unc - imm8 A8 cmp4.eq.unc - imm8 A8<br />

0 cmp4.eq.and - imm8 A8 cmp4.eq.or - imm8 A8 cmp4.eq.or.andcm - imm8 A8<br />

1 cmp4.ne.and - imm8 A8 cmp4.ne.or - imm8 A8 cmp4.ne.or.andcm - imm8 A8<br />

40 37 36 35 34 33 32 27 26 20 19 13 12 11 6 5 0<br />

C - E t b x 2 t a p 2 r 3 r 2 c p 1 qp<br />

cmp.lt<br />

4 1 2 1 6 7 7 1 6 6<br />

命令 オペランド オペコード<br />

cmp.ltu D<br />

cmp.eq E<br />

cmp.lt.unc C<br />

cmp.ltu.unc D<br />

cmp.eq.unc E<br />

cmp.eq.and C<br />

cmp.eq.or D<br />

cmp.eq.or.andcm E<br />

cmp.ne.and C<br />

cmp.ne.or D<br />

cmp.ne.or.andcm<br />

cmp4.lt<br />

p1 , p2 = r2 , r3 E<br />

C<br />

cmp4.ltu D<br />

cmp4.eq E<br />

cmp4.lt.unc C<br />

cmp4.ltu.unc D<br />

cmp4.eq.unc E<br />

cmp4.eq.and C<br />

cmp4.eq.or D<br />

cmp4.eq.or.andcm E<br />

cmp4.ne.and C<br />

cmp4.ne.or D<br />

cmp4.ne.or.andcm E<br />

拡張<br />

x2 tb ta c<br />

3:274 第 3 巻 : 命令形式<br />

C<br />

0 0<br />

1 0<br />

0<br />

1<br />

0<br />

1<br />

0<br />

1<br />

0<br />

1<br />

0<br />

1<br />

0<br />

1


4.2.2.2 Integer Compare to Zero ─ Register<br />

A7<br />

40 37 36 35 34 33 32 27 26 20 19 13 12 11 6 5 0<br />

C - E t b x 2 t a p 2 r 3 0 c p 1 qp<br />

4 1 2 1 6 7 7 1 6 6<br />

cmp.gt.and<br />

命令 オペランド オペコード<br />

cmp.gt.or D<br />

cmp.gt.or.andcm E<br />

cmp.le.and C<br />

cmp.le.or D<br />

cmp.le.or.andcm E<br />

cmp.ge.and C<br />

cmp.ge.or D<br />

cmp.ge.or.andcm E<br />

cmp.lt.and C<br />

cmp.lt.or D<br />

cmp.lt.or.andcm<br />

cmp4.gt.and<br />

p1 , p2 = r0, r3 E<br />

C<br />

cmp4.gt.or D<br />

cmp4.gt.or.andcm E<br />

cmp4.le.and C<br />

cmp4.le.or D<br />

cmp4.le.or.andcm E<br />

cmp4.ge.and C<br />

cmp4.ge.or D<br />

cmp4.ge.or.andcm E<br />

cmp4.lt.and C<br />

cmp4.lt.or D<br />

cmp4.lt.or.andcm E<br />

拡張<br />

x2 tb ta c<br />

第 3 巻 : 命令形式 3:275<br />

C<br />

0<br />

1<br />

1<br />

0<br />

1<br />

0<br />

1<br />

0<br />

1<br />

0<br />

1<br />

0<br />

1<br />

0<br />

1


4.2.2.3 Integer Compare ─ Immediate-Register<br />

A8<br />

4.2.3 マルチメディア<br />

40 37 36 35 34 33 32 27 26 20 19 13 12 11 6 5 0<br />

C - E s x2 ta p2 r3 imm7b c p1 qp<br />

4 1 2 1 6 7 7 1 6 6<br />

cmp.lt<br />

命令 オペランド オペコード<br />

cmp.ltu D<br />

cmp.eq E<br />

cmp.lt.unc C<br />

cmp.ltu.unc D<br />

cmp.eq.unc E<br />

cmp.eq.and C<br />

cmp.eq.or D<br />

cmp.eq.or.andcm E<br />

cmp.ne.and C<br />

cmp.ne.or D<br />

cmp.ne.or.andcm<br />

cmp4.lt<br />

p1 , p2 = imm8 , r3 E<br />

C<br />

cmp4.ltu D<br />

cmp4.eq E<br />

cmp4.lt.unc C<br />

cmp4.ltu.unc D<br />

cmp4.eq.unc E<br />

cmp4.eq.and C<br />

cmp4.eq.or D<br />

cmp4.eq.or.andcm E<br />

cmp4.ne.and C<br />

cmp4.ne.or D<br />

cmp4.ne.or.andcm E<br />

x2 拡張<br />

ta c<br />

すべてのマルチメデ ィ ア ALU 命令は、 メ ジ ャ ー ・ オペ コ ー ド 8 の中にエン コ ー ド される。<br />

表 4-12 に示すよ う に、 ビ ッ ト 36(z a ) と 33(z b ) に 2 つの 1 ビッ ト ・オペコード拡張フィー<br />

ルド、 ビッ ト 35:34(x 2a ) に 1 つの 2 ビット・オペコード拡張フィールドを使用する。 また、<br />

マルチメデ ィ ア ALU 命令は、 3:277 ページの表 4-13 に示すよ う に、 ビ ッ ト 32:29(x 4 ) に 4<br />

ビッ トのオペコード拡張フィールドを、 ビッ ト 28:27(x 2b ) に 2 ビッ トのオペコード拡張<br />

フィールドを持つ。<br />

表 4-12. マルチメディア ALU の 2 ビット +1 ビット・オペコード拡張<br />

オペコード・<br />

ビット 40:37<br />

x 2a<br />

ビット 35:34<br />

8 1<br />

z a<br />

ビット 36<br />

0<br />

1<br />

z b<br />

ビット 33<br />

3:276 第 3 巻 : 命令形式<br />

C<br />

0 マルチメディア ALU サイズ 1 ( 表 4-13)<br />

1 マルチメディア ALU サイズ 2 ( 表 4-14)<br />

0 マルチメディア ALU サイズ 4 ( 表 4-15)<br />

1<br />

2<br />

3<br />

0<br />

1<br />

0<br />

1<br />

0<br />

1<br />

0<br />

1<br />

0<br />

1<br />

0<br />

1


表 4-13. マルチメディア ALU サイズ 1 の 4 ビット +2 ビット・オペコード拡張<br />

オペ<br />

コード・<br />

ビット<br />

40:37<br />

x 2a<br />

ビット<br />

35:34<br />

z a<br />

ビット<br />

36<br />

z b<br />

ビット<br />

33<br />

8 1 0 0<br />

x 4<br />

ビット<br />

32:29<br />

x2b ビット 28:27<br />

0 1 2 3<br />

0 padd1 A9 padd1.sss A9<br />

padd1.uuu<br />

A9<br />

padd1.uus A9<br />

1 psub1 A9 psub1.sss A9 psub1.uuu A9 psub1.uus A9<br />

2 pavg1 A9 pavg1.raz A9<br />

3 pavgsub1 A9<br />

4<br />

5<br />

6<br />

7<br />

8<br />

9 pcmp1.eq A9 pcmp1.gt A9<br />

表 4-14. マルチメディア ALU サイズ 2 の 4 ビット +2 ビット・オペコード拡張<br />

オペ<br />

コード・<br />

ビット<br />

40:37<br />

x 2a<br />

ビット<br />

35:34<br />

z a<br />

ビット<br />

36<br />

z b<br />

ビット<br />

33<br />

8 1 0 1<br />

A<br />

B<br />

C<br />

D<br />

E<br />

F<br />

x 4<br />

ビット<br />

32:29<br />

x2b ビット 28:27<br />

0 1 2 3<br />

0 padd2 A9 padd2.sss A9 padd2.uuu A9 padd2.uus A9<br />

1 psub2 A9 psub2.sss A9 psub2.uuu A9 psub2.uus A9<br />

2 pavg2 A9 pavg2.raz A9<br />

3 pavgsub2 A9<br />

4<br />

5<br />

pshladd2 A10<br />

6<br />

7<br />

8<br />

pshradd2 A10<br />

9 pcmp2.eq A9 pcmp2.gt A9<br />

A<br />

B<br />

C<br />

D<br />

E<br />

F<br />

第 3 巻 : 命令形式 3:277


表 4-15. マルチメディア ALU サイズ 4 の 4 ビット +2 ビット・オペコード拡張<br />

オペ<br />

コード・<br />

ビット<br />

40:37<br />

x 2a<br />

ビット<br />

35:34<br />

z a<br />

ビット<br />

36<br />

z b<br />

ビット<br />

33<br />

8 1 1 0<br />

x 4<br />

ビット<br />

32:29<br />

0 padd4 A9<br />

1 psub4 A9<br />

2<br />

3<br />

4<br />

5<br />

6<br />

7<br />

8<br />

x2b ビット 28:27<br />

0 1 2 3<br />

9 pcmp4.eq A9 pcmp4.gt A9<br />

A<br />

B<br />

C<br />

D<br />

E<br />

F<br />

3:278 第 3 巻 : 命令形式


4.2.3.1 Multimedia ALU<br />

A9<br />

4.2.3.2 Multimedia Shift and Add<br />

A10<br />

40 37 36 35 34 33 32 29 28 27 26 20 19 13 12 6 5 0<br />

8 z a x 2a z b x 4 x 2b r 3 r 2 r 1 qp<br />

4 1 2 1 4 2 7 7 7 6<br />

命令 オペランド オペコード<br />

x2a za 拡張<br />

zb x4 x2b padd1<br />

padd2<br />

0<br />

0<br />

1<br />

padd4 1 0<br />

padd1.sss<br />

padd2.sss<br />

0<br />

0<br />

1<br />

padd1.uuu<br />

padd2.uuu<br />

0<br />

0<br />

1<br />

padd1.uus<br />

padd2.uus<br />

0<br />

0<br />

1<br />

psub1<br />

psub2<br />

0<br />

0<br />

1<br />

psub4 1 0<br />

psub1.sss<br />

psub2.sss<br />

0<br />

0<br />

1<br />

psub1.uuu<br />

psub2.uuu<br />

r1 = r2 , r3 8 1 0<br />

0<br />

1<br />

psub1.uus<br />

psub2.uus<br />

0<br />

0<br />

1<br />

pavg1<br />

pavg2<br />

0<br />

0<br />

1<br />

pavg1.raz<br />

pavg2.raz<br />

0<br />

0<br />

1<br />

pavgsub1<br />

pavgsub2<br />

0<br />

0<br />

1<br />

pcmp1.eq<br />

pcmp2.eq<br />

0<br />

0<br />

1<br />

pcmp4.eq 1 0<br />

pcmp1.gt<br />

pcmp2.gt<br />

0<br />

0<br />

1<br />

pcmp4.gt 1 0<br />

第 3 巻 : 命令形式 3:279<br />

0<br />

1<br />

2<br />

0<br />

1<br />

2<br />

3<br />

0<br />

1<br />

2<br />

3<br />

2<br />

3<br />

3 2<br />

40 37 36 35 34 33 32 29 28 27 26 20 19 13 12 6 5 0<br />

8 za x2a zb x4 ct2d r3 r2 r1 qp<br />

4 1 2 1 4 2 7 7 7 6<br />

拡張<br />

命令 オペランド オペコード<br />

x2a za zb x4 pshladd2<br />

pshradd2<br />

r1 = r2 , count2 , r3 8 1 0 1<br />

4<br />

6<br />

9<br />

0<br />

1


4.3 I ユニット命令エンコーディング<br />

4.3.1 マルチメディアおよび変数シフト<br />

すべてのマルチメデ ィ ア乗算/ シフ ト / 最大値 / 最小値 / ミックス/ 置換 / パック/ アンパッ<br />

ク、 変数シフ ト命令は、 メジャー ・オペコー ド 7 の中にエン コ ーデ ィ ング される。 表 4-16<br />

に示すよ う に、 ビ ッ ト 36(z a ) と 33(z b ) に 2 つの 1 ビッ ト ・オペコード拡張フィールド、<br />

ビッ ト 32(v e ) に 1 ビ ッ ト の予約済みオペ コ ー ド 拡張を使用す る。 ま た、 表 4-17 に示すよ<br />

うに、 ビッ ト 35:34(x 2a ) に 2 ビットのオペコード拡張フィールド、 ビッ ト 29:28(x 2b ) に 2<br />

ビッ ト・フィールドを持ち、ほとんどがビッ ト 31:30(x 2c ) に 2 ビッ ト・フィールドを持つ。<br />

表 4-16. マルチメディアおよび変数シフトの 1 ビット・オペコード拡張<br />

オペ<br />

コード・<br />

ビット<br />

40:37<br />

7<br />

z a<br />

ビット<br />

36<br />

0<br />

1<br />

z b<br />

ビット<br />

33<br />

0 マルチメディア・サイズ 1 ( 表 4-17)<br />

1 マルチメディア・サイズ 2 ( 表 4-18)<br />

0 マルチメディア・サイズ 4 ( 表 4-19)<br />

1 変数シフト ( 表 4-20)<br />

ve ビット 32<br />

0 1<br />

表 4-17. マルチメディア・オペコード 7 のサイズ 1 の 2 ビット・オペコード拡張<br />

オペ<br />

コード・<br />

ビット<br />

40:37<br />

z a<br />

ビット<br />

36<br />

z b<br />

ビット<br />

33<br />

v e<br />

ビット<br />

32<br />

7 0 0 0<br />

x 2a<br />

ビット<br />

35:34<br />

0<br />

1<br />

2<br />

3<br />

x 2b<br />

ビット<br />

29:28<br />

x2c ビット 31:30<br />

0 1 2 3<br />

3:280 第 3 巻 : 命令形式<br />

0<br />

1<br />

2<br />

3<br />

0<br />

1<br />

2<br />

3<br />

0 unpack1.h I2 mix1.r I2<br />

1 pmin1.u I2 pmax1.u I2<br />

2 unpack1.l I2 mix1.l I2<br />

3 psad1 I2<br />

0<br />

1<br />

2 mux1 I3<br />

3


表 4-18. マルチメディア・オペコード 7 のサイズ 2 の 2 ビット・オペコード拡張<br />

オペ<br />

コード・<br />

ビット<br />

40:37<br />

z a<br />

ビット<br />

36<br />

z b<br />

ビット<br />

33<br />

v e<br />

ビット<br />

32<br />

7 0 1 0<br />

x 2a<br />

ビット<br />

35:34<br />

0<br />

1<br />

2<br />

3<br />

x 2b<br />

ビット<br />

29:28<br />

0<br />

x2c ビット 31:30<br />

1 2 3<br />

0 pshr2.u - var I5 pshl2 - var I7<br />

1 pmpyshr2.u I1<br />

2 pshr2 - var I5<br />

3 pmpyshr2 I1<br />

0<br />

1 pshr2.u - fixed I6 popcnt I9<br />

2<br />

3 pshr2 - fixed I6<br />

0 pack2.uss I2 unpack2.h I2 mix2.r I2<br />

1 pmpy2.r I2<br />

2 pack2.sss I2 unpack2.l I2 mix2.l I2<br />

3 pmin2 I2 pmax2 I2 pmpy2.l I2<br />

0<br />

1 pshl2 - fixed I8<br />

2 mux2 I4<br />

表 4-19. マルチメディア・オペコード 7 のサイズ 4 の 2 ビット・オペコード拡張<br />

オペ<br />

コード・<br />

ビット<br />

40:37<br />

z a<br />

ビット<br />

36<br />

z b<br />

ビット<br />

33<br />

v e<br />

ビット<br />

32<br />

7 1 0 0<br />

x 2a<br />

ビット<br />

35:34<br />

0<br />

1<br />

2<br />

3<br />

3<br />

x 2b<br />

ビット<br />

29:28<br />

0<br />

x2c ビット 31:30<br />

1 2 3<br />

0 pshr4.u - var I5 pshl4 - var I7<br />

1<br />

2 pshr4 - var I5<br />

3<br />

0<br />

1 pshr4.u - fixed I6<br />

2<br />

3 pshr4 - fixed I6<br />

0 unpack4.h I2 mix4.r I2<br />

1<br />

2 pack4.sss I2 unpack4.l I2 mix4.l I2<br />

3<br />

0<br />

1 pshl4 - fixed I8<br />

2<br />

3<br />

第 3 巻 : 命令形式 3:281


表 4-20. 変数シフト・オペコード 7 の 2 ビット・オペコード拡張<br />

4.3.1.1 Multimedia Multiply and Shift<br />

I1<br />

オペ<br />

コード・<br />

ビット<br />

40:37<br />

z a<br />

ビット<br />

36<br />

z b<br />

ビット<br />

33<br />

v e<br />

ビット<br />

32<br />

7 1 1 0<br />

x 2a<br />

ビット<br />

35:34<br />

0<br />

1<br />

2<br />

3<br />

x 2b<br />

ビット<br />

29:28<br />

0<br />

x2c ビット 31:30<br />

1 2 3<br />

0 shr.u - var I5 shl - var I7<br />

1<br />

2 shr - var I5<br />

3<br />

0<br />

1<br />

2<br />

3<br />

0<br />

1<br />

2<br />

3<br />

0<br />

1<br />

2<br />

3<br />

40 37 36 35 34 33 32 31 30 29 28 27 26 20 19 13 12 6 5 0<br />

7 z a x 2a z b v e ct 2d x 2b r 3 r 2 r 1 qp<br />

4 1 2 1 1 2 2 1 7 7 7 6<br />

命令 オペランド<br />

オペ<br />

コード za zb 拡張<br />

ve x2a x2b pmpyshr2<br />

pmpyshr2.u<br />

r1 = r2 , r3 , count2 7 0 1 0 0<br />

3<br />

1<br />

3:282 第 3 巻 : 命令形式


4.3.1.2 Multimedia Multiply/Mix/Pack/Unpack<br />

I2<br />

4.3.1.3 Multimedia Mux1<br />

I3<br />

40 37 36 35 34 33 32 31 30 29 28 27 26 20 19 13 12 6 5 0<br />

7 z a x 2a z b v e x 2c x 2b r 3 r 2 r 1 qp<br />

4 1 2 1 1 2 2 1 7 7 7 6<br />

命令 オペランド<br />

オペ<br />

コード<br />

pack4.sss 1 0<br />

r1 = r2 , r3 7<br />

unpack1.h 0 0<br />

第 3 巻 : 命令形式 3:283<br />

拡張<br />

z a z b v e x 2a x 2b x 2c<br />

pmpy2.r<br />

pmpy2.l<br />

0 1<br />

1<br />

3<br />

mix1.r 0 0<br />

mix2.r 0 1<br />

0<br />

mix4.r 1 0<br />

mix1.l 0 0<br />

mix2.l 0 1<br />

2<br />

mix4.l 1 0<br />

pack2.uss 0 1 0<br />

pack2.sss 0 1<br />

unpack2.h 0 1<br />

unpack4.h 1 0<br />

unpack1.l 0 0<br />

0 2<br />

unpack2.l 0 1<br />

2<br />

unpack4.l 1 0<br />

pmin1.u<br />

pmax1.u<br />

0 0 1<br />

0<br />

1<br />

pmin2<br />

pmax2<br />

0 1 3<br />

0<br />

1<br />

psad1 0 0 3 2<br />

40 37 36 35 34 33 32 31 30 29 28 27 24 23 20 19 13 12 6 5 0<br />

7 za x2a zb ve x2c x2b mbt4c r2 r1 qp<br />

4 1 2 1 1 2 2 4 4 7 7 6<br />

命令 オペランド<br />

オペ<br />

コード<br />

拡張<br />

z a z b v e x 2a x 2b x 2c<br />

mux1 r 1 = r 2 , mbtype 4 7 0 0 0 3 2 2<br />

2<br />

0<br />

3<br />

2<br />

0<br />

1


4.3.1.4 Multimedia Mux2<br />

I4<br />

4.3.1.5 Shift Right ─ Variable<br />

I5<br />

4.3.1.6 Multimedia Shift Right ─ Fixed<br />

I6<br />

4.3.1.7 Shift Left ─ Variable<br />

I7<br />

40 37 36 35 34 33 32 31 30 29 28 27 20 19 13 12 6 5 0<br />

7 z a x 2a z b v e x 2c x 2b mht 8c r 2 r 1 qp<br />

4 1 2 1 1 2 2 8 7 7 6<br />

命令 オペランド<br />

オペ<br />

コード<br />

3:284 第 3 巻 : 命令形式<br />

拡張<br />

z a z b v e x 2a x 2b x 2c<br />

mux2 r 1 = r 2 , mhtype 8 7 0 1 0 3 2 2<br />

40 37 36 35 34 33 32 31 30 29 28 27 26 20 19 13 12 6 5 0<br />

pshr2<br />

7 z a x 2a z b v e x 2c x 2b r 3 r 2 r 1 qp<br />

4 1 2 1 1 2 2 1 7 7 7 6<br />

命令 オペランド<br />

オペ<br />

コード<br />

shr 1 1<br />

r1 = r3 , r2 7<br />

pshr2.u 0 1<br />

拡張<br />

z a z b v e x 2a x 2b x 2c<br />

0 1<br />

pshr4 1 0<br />

pshr4.u 1 0<br />

shr.u 1 1<br />

0 0<br />

40 37 36 35 34 33 32 31 30 29 28 27 26 20 19 18 14 13 12 6 5 0<br />

7 za x2a zb ve x2c x2b r3 count5b r1 qp<br />

4 1 2 1 1 2 2 1 7 1 5 1 7 6<br />

pshr2<br />

命令 オペランド<br />

オペ<br />

コード<br />

pshr4 r1 = r3 ,<br />

1 0<br />

7<br />

pshr2.u count5 0 1<br />

拡張<br />

z a z b v e x 2a x 2b x 2c<br />

0 1<br />

pshr4.u 1 0<br />

0 1<br />

40 37 36 35 34 33 32 31 30 29 28 27 26 20 19 13 12 6 5 0<br />

pshl2<br />

7 z a x 2a z b v e x 2c x 2b r 3 r 2 r 1 qp<br />

4 1 2 1 1 2 2 1 7 7 7 6<br />

命令 オペランド<br />

r 1 = r 2 , r 3<br />

オペ<br />

コード<br />

拡張<br />

z a z b v e x 2a x 2b x 2c<br />

0 1<br />

pshl4 7 1 0<br />

shl 1 1<br />

0 0 0 1<br />

2<br />

0<br />

3<br />

1<br />

0<br />

0


4.3.1.8 Multimedia Shift Left ─ Fixed<br />

I8<br />

4.3.1.9 Population Count<br />

I9<br />

4.3.2 整数シフト<br />

40 37 36 35 34 33 32 31 30 29 28 27 25 24 20 19 13 12 6 5 0<br />

7 z a x 2a z b v e x 2c x 2b ccount 5c r 2 r 1 qp<br />

4 1 2 1 1 2 2 3 5 7 7 6<br />

命令 オペランド<br />

pshl2 r 1 = r 2 ,<br />

オペ<br />

コード<br />

0 1<br />

7<br />

pshl4 count5 1 0<br />

整数シフト、 ビッ ト ・テスト、 NaT テス ト命令は、 メジャー ・ オペコー ド 5 の中にエン<br />

コードされる。 ビッ ト 35:34(x 2 ) に 2 ビッ トのオペコード拡張フィールド、 ビット 33(x) に<br />

1 ビ ッ ト のオペコ ー ド 拡張フ ィ ール ド を使用する。 ま た、 抽出およ びビ ッ ト ・ テス ト 命令<br />

はビッ ト 13(y) に 1 ビッ トのオペコード拡張フィールドを持つ。 表 4-21 に、 ビ ッ ト ・ テス<br />

ト、 抽出、 ペア右シフトの割り当てを示す。<br />

また、 ほとんどのデポジッ ト命令は、 ビッ ト 26(y) に 1 ビッ トのオペコード拡張フィール<br />

ドを持つ。 表 4-22 にこれらの割り当てを示す。<br />

第 3 巻 : 命令形式 3:285<br />

拡張<br />

z a z b v e x 2a x 2b x 2c<br />

0 3 1 1<br />

40 37 36 35 34 33 32 31 30 29 28 27 26 20 19 13 12 6 5 0<br />

7 z a x 2a z b v e x 2c x 2b r 3 0 r 1 qp<br />

4 1 2 1 1 2 2 1 7 7 7 6<br />

命令 オペランド<br />

オペ<br />

コード<br />

拡張<br />

z a z b v e x 2a x 2b x 2c<br />

popcnt r 1 = r 3 7 0 1 0 1 1 2<br />

表 4-21. 整数シフト / ビット・テスト /NaT テストの 2 ビット・オペコード拡張<br />

オペコード・<br />

ビット<br />

40:37<br />

5<br />

x 2<br />

ビット<br />

35:34<br />

x<br />

ビット<br />

33<br />

表 4-22. デポジットのオペコード拡張<br />

オペコード・<br />

ビット 40:37<br />

5<br />

y<br />

ビット 13<br />

0 1<br />

Test Bit ( 表 4-23) Test NaT ( 表 4-23)<br />

0<br />

1<br />

2<br />

0<br />

extr.u I11 extr I11<br />

3 shrp I10<br />

x 2<br />

ビット<br />

35:34<br />

x<br />

ビット<br />

33<br />

y<br />

ビット 26<br />

0 1<br />

ビット・テスト / テスト NaT ( 表 4-23)<br />

0<br />

1<br />

2<br />

1<br />

dep.z I12 dep.z - imm8 I13<br />

3 dep - imm1 I14


4.3.2.1 Shift Right Pair<br />

I10<br />

4.3.2.2 Extract<br />

I11<br />

4.3.2.3 Zero and Deposit<br />

I12<br />

4.3.2.4 Zero and Deposit Immediate 8<br />

I13<br />

4.3.2.5 Deposit Immediate 1<br />

I14<br />

40 37 36 35 34 33 32 27 26 20 19 13 12 6 5 0<br />

5 x 2 x count 6d r 3 r 2 r 1 qp<br />

4 1 2 1 6 7 7 7 6<br />

命令 オペランド オペコード<br />

shrp r 1 = r 2 , r 3 , count 6 5 3 0<br />

40 37 36 35 34 33 32 27 26 20 19 14 13 12 6 5 0<br />

5 x 2 x len 6d r 3 pos 6b y r 1 qp<br />

4 1 2 1 6 7 6 1 7 6<br />

拡張<br />

命令 オペランド オペコード<br />

x2 x y<br />

extr.u<br />

extr<br />

r1 = r3 , pos6 , len6 5 1 0<br />

0<br />

1<br />

40 37 36 35 34 33 32 27 26 25 20 19 13 12 6 5 0<br />

5 x 2 x len 6d y cpos 6c r 2 r 1 qp<br />

4 1 2 1 6 1 6 7 7 6<br />

命令 オペランド オペコード<br />

3:286 第 3 巻 : 命令形式<br />

x 2<br />

拡張<br />

x<br />

x2 拡張<br />

x y<br />

dep.z r 1 = r 2 , pos 6 , len 6 5 1 1 0<br />

40 37 36 35 34 33 32 27 26 25 20 19 13 12 6 5 0<br />

5 s x 2 x len 6d y cpos 6c imm 7b r 1 qp<br />

4 1 2 1 6 1 6 7 7 6<br />

命令 オペランド オペコード<br />

x2 拡張<br />

x y<br />

dep.z r 1 = imm 8 , pos 6 , len 6 5 1 1 1<br />

40 37 36 35 34 33 32 27 26 20 19 14 13 12 6 5 0<br />

5 s x 2 x len 6d r 3 cpos 6b r 1 qp<br />

4 1 2 1 6 7 6 1 7 6<br />

命令 オペランド オペコード<br />

dep r 1 = imm 1 , r 3 , pos 6 , len 6 5 3 1<br />

x 2<br />

拡張<br />

x


4.3.2.6 Deposit<br />

I15<br />

4.3.3 ビット・テスト<br />

4.3.3.1 Test Bit<br />

I16<br />

40 37 36 31 30 27 26 20 19 13 12 6 5 0<br />

4 cpos6d len4d r3 r2 r1 qp<br />

4 6 4 7 7 7 6<br />

命令 オペランド オペコード<br />

dep r 1 = r 2 , r 3 , pos 6 , len 4 4<br />

すべてのビ ッ ト ・ テス ト 命令は、 メジ ャ ー ・ オペコ ー ド 5 の中にエン コ ー ド される。 ビ ッ<br />

ト 35:34(x 2 ) に 2 ビッ トのオペコード拡張フィールドを使用し、ビッ ト 33(t a )、36(t b )、12(c)、<br />

19(y) に 4 つの 1 ビッ ト ・オペコード拡張フィールドを使用する。 表 4-23 にこれらの割り<br />

当てを要約する。<br />

表 4-23. ビット・テストのオペコード拡張<br />

オペコード・<br />

ビット 40:37<br />

x 2<br />

ビット<br />

35:34<br />

5 0<br />

t a<br />

ビッ<br />

ト 33<br />

0<br />

1<br />

t b<br />

ビッ<br />

ト 36<br />

0<br />

1<br />

0<br />

1<br />

c<br />

ビッ<br />

ト 12<br />

y<br />

ビット 13<br />

0 1<br />

0 tbit.z I16 tnat.z I17<br />

1 tbit.z.unc I16 tnat.z.unc I17<br />

0 tbit.z.and I16 tnat.z.and I17<br />

1 tbit.nz.and I16 tnat.nz.and I17<br />

0 tbit.z.or I16 tnat.z.or I17<br />

1 tbit.nz.or I16 tnat.nz.or I17<br />

0 tbit.z.or.andcm I16 tnat.z.or.andcm I17<br />

1 tbit.nz.or.andcm I16 tnat.nz.or.andcm I17<br />

40 37 36 35 34 33 32 27 26 20 19 14 13 12 11 6 5 0<br />

5 t b x 2 t a p 2 r 3 pos 6b y c p 1 qp<br />

4 1 2 1 6 7 6 1 1 6 6<br />

命令 オペランド<br />

オペ<br />

コード x2 ta 拡張<br />

tb y c<br />

tbit.z<br />

tbit.z.unc<br />

tbit.z.and<br />

tbit.nz.and<br />

tbit.z.or<br />

tbit.nz.or<br />

tbit.z.or.andcm<br />

tbit.nz.or.andcm<br />

p1 , p2 = r3 , pos6 5 0<br />

0<br />

1<br />

0<br />

1<br />

0<br />

1<br />

0<br />

0<br />

1<br />

0<br />

1<br />

0<br />

1<br />

0<br />

1<br />

第 3 巻 : 命令形式 3:287


4.3.3.2 Test NaT<br />

I17<br />

40 37 36 35 34 33 32 27 26 20 19 14 13 12 11 6 5 0<br />

4.3.4 その他の I ユニット命令<br />

5 t b x 2 t a p 2 r 3 y c p 1 qp<br />

4 1 2 1 6 7 6 1 1 6 6<br />

命令 オペランド<br />

オペ<br />

コード x2 ta 拡張<br />

tb y c<br />

tnat.z<br />

tnat.z.unc<br />

tnat.z.and<br />

tnat.nz.and<br />

tnat.z.or<br />

tnat.nz.or<br />

tnat.z.or.andcm<br />

tnat.nz.or.andcm<br />

p1 , p2 = r3 5 0<br />

0<br />

1<br />

0<br />

1<br />

0<br />

1<br />

1<br />

0<br />

1<br />

0<br />

1<br />

0<br />

1<br />

0<br />

1<br />

その他の I ユニッ ト 命令は、 メジ ャ ー ・ オペコ ー ド 0 の中にエン コ ー ド される。 ビ ッ ト<br />

35:33 に、 3 ビッ トのオペコード拡張フィールド (x 3 ) を使用する。 また、 一部の命令は、<br />

ビッ ト 32:27 に 6 ビットのオペコード拡張フィールド (x 6 ) を持つ。 表 4-24 に 3 ビッ トの<br />

割り当てを、 表 4-25 に 6 ビッ トの割り当てを示す。<br />

表 4-24. その他の I ユニットの 3 ビット・オペコード拡張<br />

オペコード・<br />

ビット 40:37<br />

0<br />

x 3<br />

ビット 35:33<br />

0 6 ビット拡張 ( 表 4-25)<br />

1 chk.s.i - int I20<br />

2 mov to pr.rot - imm44 I24<br />

3 mov to pr I23<br />

4<br />

5<br />

6<br />

7 mov to I21<br />

3:288 第 3 巻 : 命令形式


表 4-25. その他の I ユニットの 6 ビット・オペコード拡張<br />

4.3.4.1 Nop/Hint (I ユニット )<br />

I18<br />

オペ<br />

コード・<br />

ビット<br />

40:37<br />

x 3<br />

ビット<br />

35:33<br />

0 0<br />

ビット<br />

30:27<br />

I ユニ ッ ト nop/hint 命令を メ ジ ャ ー ・ オペ コ ー ド 0 の中にエン コ ー ド する際は、 ビ ッ ト<br />

35:33(x 3 ) 内の 3 ビッ ト ・オペコード拡張フィールド、 ビット 32:27(x 6 ) 内の 6 ビッ ト ・オ<br />

ペ コ ー ド 拡張フ ィ ー ル ド 、 ビ ッ ト 26(y) 内の 1 ビッ ト ・オペコード拡張フィールドが使用<br />

される ( 表 4-26 を参照 )。<br />

第 3 巻 : 命令形式 3:289<br />

x 6<br />

0<br />

ビット 32:31<br />

1 2 3<br />

0 break.i I19 zxt1 I29 mov from ip I25<br />

1 1 ビット拡張 ( 表 4-26) zxt2 I29 mov from b I22<br />

2 zxt4 I29 mov.i from ar I28<br />

3 mov from pr I25<br />

4 sxt1 I29<br />

5 sxt2 I29<br />

6 sxt4 I29<br />

7<br />

8 czx1.l I29<br />

9 czx2.l I29<br />

A mov.i to ar - imm 8 I27 mov.i to ar I26<br />

B<br />

C czx1.r I29<br />

D czx2.r I29<br />

表 4-26. 各種の I ユニット 1 ビット・オペコード拡張<br />

オペコード・<br />

ビット 40:37<br />

E<br />

F<br />

x 3<br />

ビット 35:33<br />

x 6<br />

ビット 32:27<br />

0 0 01<br />

y<br />

ビット 26<br />

0 nop.i<br />

1 hint.i<br />

40 37 36 35 33 32 27 26 25 6 5 0<br />

0 i x3 x6 y imm20a qp<br />

4 1 3 6 1 20 6<br />

拡張<br />

命令 オペランド オペコード<br />

x3 x6 y<br />

nop.i i<br />

hint.i<br />

imm21 0 0 01<br />

0<br />

1


4.3.4.2 Break (I ユニット )<br />

I19<br />

4.3.4.3 Integer Speculation Check (I ユニット )<br />

I20<br />

4.3.5 GR/BR 移動<br />

GR/BR 移動命令は、 メ ジ ャ ー ・ オペ コ ー ド 0 の中にエン コ ー ド される。 オペコ ー ド 拡張<br />

の要約については、 3:288 ページの 4.3.4 項「その他のI ユニ ッ ト 命令」 を参照のこ と。 BR<br />

への移動命令は、 表 4-27 に示すよ う に、 ビ ッ ト 21:20(wh) に 2 ビ ッ ト の 「分岐有無」 予測<br />

ヒ ン ト ・ フ ィ ー ル ド を使用す る。<br />

BR への移動命令は、 ビ ッ ト 22 の 1 ビッ トのオペコード拡張フィールド (x) を使用して、<br />

通常の形式 と リ タ ー ンの形式を区別する。 ま た、 ビ ッ ト 23(ih) に 1 ビッ トのヒント拡張を<br />

使用す る (3:326 ページの表 4-56 を参照 )。<br />

4.3.5.1 Move to BR<br />

I21<br />

40 37 36 35 33 32 27 26 25 6 5 0<br />

0 i x 3 x 6 imm 20a qp<br />

4 1 3 6 1 20 6<br />

拡張<br />

命令 オペランド オペコード<br />

x3 x6 break.i i imm21 0 0 00<br />

40 37 36 35 33 32 20 19 13 12 6 5 0<br />

0 s x 3 imm 13c r 2 imm 7a qp<br />

4 1 3 13 7 7 6<br />

命令 オペランド オペコード<br />

chk.s.i r 2 , target 25 0 1<br />

表 4-27. BR への移動命令の分岐有無予測ヒント・コンプリータ<br />

wh<br />

ビット 21:20<br />

mwh<br />

0 .sptk<br />

1 none<br />

2 .dptk<br />

3<br />

3:290 第 3 巻 : 命令形式<br />

拡張<br />

x3 40 37 36 35 33 32 24 23 22 21 20 19 13 12 9 8 6 5 0<br />

0 x 3 timm 9c ih x wh r 2 b 1 qp<br />

4 1 3 9 1 1 2 7 4 3 6<br />

命令 オペランド<br />

オペ<br />

コード<br />

x3 x<br />

拡張<br />

ih wh<br />

mov.mwh.ih<br />

0 3:326 ページ<br />

b1 = r2 , tag13 0 7<br />

の表 4-56 を<br />

mov.ret.mwh.ih 1<br />

参照<br />

3:290 ページ<br />

の表 4-27 を<br />

参照


4.3.5.2 Move from BR<br />

I22<br />

4.3.6 GR/ プレディケート /IP 移動<br />

GR/ プレディケー ト /IP 移動命令は、 メ ジ ャ ー ・ オペ コ ー ド 0 の中にエン コ ー ド される。<br />

オペコ ー ド拡張の要約については、 3:288 ページの 4.3.4 項「その他のI ユニ ッ ト 命令」 を<br />

参照の こ と 。<br />

4.3.6.1 Move to Predicates ─ Register<br />

I23<br />

4.3.6.2 Move to Predicates ─ Immediate 44<br />

I24<br />

4.3.6.3 Move from Predicates/IP<br />

I25<br />

40 37 36 35 33 32 27 26 16 15 13 12 6 5 0<br />

0 x 3 x 6 b 2 r 1 qp<br />

4.3.7 GR/AR 移動 (I ユニット )<br />

4 1 3 6 11 3 7 6<br />

命令 オペランド オペコード<br />

mov r 1 = b 2 0 0 31<br />

40 37 36 35 33 32 31 24 23 20 19 13 12 6 5 0<br />

0 s x 3 mask 8c r 2 mask 7a qp<br />

4 1 3 1 8 4 7 7 6<br />

命令 オペランド オペコード<br />

mov pr = r 2 , mask 17 0 3<br />

I ユニ ッ ト GR/AR 移動命令は、 メ ジ ャ ー ・ オペ コ ー ド 0 の中にエン コ ー ド される ( 一部の<br />

AR は、 M ユニッ ト のシステム / メ モ リ 管理命令を使 っ てア ク セス さ れる。 3:313 ページの<br />

4.4.7 項 「GR/AR 移動 (M ユニ ッ ト )」 を参照のこ と )。 I ユニッ ト GR/AR オペコー ド拡張<br />

の要約については、 3:288 ページの 4.3.4 項 「その他の I ユニ ッ ト 命令」 を参照のこ と。<br />

第 3 巻 : 命令形式 3:291<br />

x 3<br />

拡張<br />

拡張<br />

x3 40 37 36 35 33 32 6 5 0<br />

0 s x 3 imm 27a qp<br />

4 1 3 27 6<br />

拡張<br />

命令 オペランド オペコード<br />

x3 mov pr.rot = imm44 0 2<br />

40 37 36 35 33 32 27 26 13 12 6 5 0<br />

mov<br />

0 x 3 x 6 r 1 qp<br />

4 1 3 6 14 7 6<br />

命令 オペランド オペコード<br />

x 3<br />

拡張<br />

r1 = ip<br />

30<br />

0 0<br />

r1 = pr 33<br />

x 6<br />

x 6


4.3.7.1 Move to AR ─ Register (I ユニット )<br />

I26<br />

4.3.7.2 Move to AR ─ Immediate 8 (I ユニット )<br />

I27<br />

4.3.7.3 Move from AR (I ユニット )<br />

I28<br />

4.3.8 符号拡張 / ゼロ拡張 / ゼロ・インデックス計算<br />

I29<br />

40 37 36 35 33 32 27 26 20 19 13 12 6 5 0<br />

0 x 3 x 6 ar 3 r 2 qp<br />

4 1 3 6 7 7 7 6<br />

命令 オペランド オペコード<br />

mov.i ar 3 = r 2 0 0 2A<br />

40 37 36 35 33 32 27 26 20 19 13 12 6 5 0<br />

0 s x 3 x 6 ar 3 imm 7b qp<br />

4 1 3 6 7 7 7 6<br />

命令 オペランド オペコード<br />

mov.i ar 3 = imm 8 0 0 0A<br />

40 37 36 35 33 32 27 26 20 19 13 12 6 5 0<br />

0 x 3 x 6 ar 3 r 1 qp<br />

4 1 3 6 7 7 7 6<br />

命令 オペランド オペコード<br />

mov.i r 1 = ar 3 0 0 32<br />

40 37 36 35 33 32 27 26 20 19 13 12 6 5 0<br />

0 x 3 x 6 r 3 r 1 qp<br />

4 1 3 6 7 7 7 6<br />

拡張<br />

命令 オペランド オペコード<br />

x3 x6 zxt1<br />

10<br />

zxt2 11<br />

zxt4 12<br />

sxt1 14<br />

sxt2<br />

sxt4<br />

r1 = r3 0 0<br />

15<br />

16<br />

czx1.l 18<br />

czx2.l 19<br />

czx1.r 1C<br />

czx2.r 1D<br />

3:292 第 3 巻 : 命令形式<br />

x 3<br />

x 3<br />

x 3<br />

拡張<br />

拡張<br />

拡張<br />

x 6<br />

x 6<br />

x 6


4.4 M ユニット命令エンコーディング<br />

4.4.1 ロードとストア<br />

すべてのロー ド およびス ト ア命令は、 メジ ャ ー ・ オペコ ー ド 4、 5、 6、 7 の中にエン コ ー<br />

ドされる。 ビット 35:30(x 6 ) の 6 ビ ッ ト のオペコー ド拡張フ ィ ールド が使用される。 メ<br />

ジャー ・オペコード 4 の命令 ( 整数ロ ー ド / ストア、 セマフォ、 FR 取得 ) は、 表 4-28 に<br />

示すよ う に、 ビ ッ ト 36(m) とビッ ト 27(x) に 2 つの 1 ビッ ト ・オペコード拡張フィールド<br />

を使用する。 メジ ャ ー ・ オペコ ー ド 6 の命令 ( 浮動小数点ロ ー ド / ストア、ペア・ロード、<br />

FR 設定 ) は、 表 4-29 に示すよ う に、 ビ ッ ト 36(m) とビッ ト 27(x) に 2 つの 1 ビッ ト ・オ<br />

ペ コ ー ド 拡張フ ィ ー ル ド を使用す る。<br />

表 4-28. 整数ロード / ストア / セマフォ /FR 取得の 1 ビット・オペコード拡張<br />

オペコード・<br />

ビット 40:37<br />

4<br />

m<br />

ビット 36<br />

x<br />

ビット 27<br />

0 0 ロード / ストア ( 表 4-30)<br />

0 1 セマフォ /FR 取得 ( 表 4-33)<br />

1 0 ロード +Reg ( 表 4-31)<br />

1 1<br />

表 4-29. 浮動小数点ロード / ストア / ペア・ロード /FR 設定の 1 ビット・オペコード拡張<br />

オペコード・<br />

ビット 40:37<br />

6<br />

m<br />

ビット 36<br />

x<br />

ビット 27<br />

0 0 FP ロード / ストア ( 表 4-34)<br />

0 1 FP ペア・ロード /FR 設定 ( 表 4-37)<br />

1 0 FP ロード +Reg ( 表 4-35)<br />

1 1 FP ペア・ロード +Imm ( 表 4-38)<br />

整数ロ ー ド / ストアのオペコード拡張は、 3:294 ページの表 4-30、 3:294 ページの表 4-31、<br />

3:295 ページの表 4-32 に要約している。 セマフ ォおよび FR 取得オペ コ ー ド 拡張は、 3:296<br />

ページの表 4-33 に要約してい る。 浮動小数点ロ ー ド / ストア・オペコード拡張は、 3:297<br />

ページの表 4-34、 3:297 ページの表 4-35、 および 3:298 ページの表 4-36 に要約している。<br />

浮動小数点ペア ・ ロ ー ド お よ び FR 設定オペ コ ー ド 拡張は、 3:298 ページの表 4-37 と 3:299<br />

ページの表 4-38 に要約している。<br />

第 3 巻 : 命令形式 3:293


表 4-30. 整数ロード / ストアのオペコード拡張<br />

オペ<br />

コード・<br />

ビット<br />

40:37<br />

m<br />

ビット<br />

36<br />

x<br />

ビット<br />

27<br />

4 0 0<br />

ビット<br />

35:32<br />

表 4-31. 整数ロード +Reg のオペコード拡張<br />

オペ<br />

コード・<br />

ビット<br />

40:37<br />

m<br />

ビット<br />

36<br />

x<br />

ビット<br />

27<br />

4 1 0<br />

3:294 第 3 巻 : 命令形式<br />

x 6<br />

ビット 31:30<br />

0 1 2 3<br />

0 ld1 M1 ld2 M1 ld4 M1 ld8 M1<br />

1 ld1.s M1 ld2.s M1 ld4.s M1 ld8.s M1<br />

2 ld1.a M1 ld2.a M1 ld4.a M1 ld8.a M1<br />

3 ld1.sa M1 ld2.sa M1 ld4.sa M1 ld8.sa M1<br />

4 ld1.bias M1 ld2.bias M1 ld4.bias M1 ld8.bias M1<br />

5 ld1.acq M1 ld2.acq M1 ld4.acq M1 ld8.acq M1<br />

6<br />

7<br />

ld8.fill M1<br />

8 ld1.c.clr M1 ld2.c.clr M1 ld4.c.clr M1 ld8.c.clr M1<br />

9 ld1.c.nc M1 ld2.c.nc M1 ld4.c.nc M1 ld8.c.nc M1<br />

A<br />

B<br />

ld1.c.clr.acq M1 ld2.c.clr.acq M1 ld4.c.clr.acq M1 ld8.c.clr.acq M1<br />

C st1 M4 st2 M4 st4 M4 st8 M4<br />

D st1.rel M4 st2.rel M4 st4.rel M4 st8.rel M4<br />

E<br />

F<br />

st8.spill M4<br />

ビット<br />

35:32<br />

x 6<br />

ビット 31:30<br />

0 1 2 3<br />

0 ld1 M2 ld2 M2 ld4 M2 ld8 M2<br />

1 ld1.s M2 ld2.s M2 ld4.s M2 ld8.s M2<br />

2 ld1.a M2 ld2.a M2 ld4.a M2 ld8.a M2<br />

3 ld1.sa M2 ld2.sa M2 ld4.sa M2 ld8.sa M2<br />

4 ld1.bias M2 ld2.bias M2 ld4.bias M2 ld8.bias M2<br />

5 ld1.acq M2 ld2.acq M2 ld4.acq M2 ld8.acq M2<br />

6<br />

7<br />

ld8.fill M2<br />

8 ld1.c.clr M2 ld2.c.clr M2 ld4.c.clr M2 ld8.c.clr M2<br />

9 ld1.c.nc M2 ld2.c.nc M2 ld4.c.nc M2 ld8.c.nc M2<br />

A<br />

B<br />

C<br />

D<br />

E<br />

F<br />

ld1.c.clr.acq M2 ld2.c.clr.acq M2 ld4.c.clr.acq M2 ld8.c.clr.acq M2


表 4-32. 整数ロード / ストア +Imm のオペコード拡張<br />

オペ<br />

コード・<br />

ビット<br />

40:37<br />

5<br />

ビット<br />

35:32<br />

第 3 巻 : 命令形式 3:295<br />

x 6<br />

ビット 31:30<br />

0 1 2 3<br />

0 ld1 M3 ld2 M3 ld4 M3 ld8 M3<br />

1 ld1.s M3 ld2.s M3 ld4.s M3 ld8.s M3<br />

2 ld1.a M3 ld2.a M3 ld4.a M3 ld8.a M3<br />

3 ld1.sa M3 ld2.sa M3 ld4.sa M3 ld8.sa M3<br />

4 ld1.bias M3 ld2.bias M3 ld4.bias M3 ld8.bias M3<br />

5 ld1.acq M3 ld2.acq M3 ld4.acq M3 ld8.acq M3<br />

6<br />

7<br />

ld8.fill M3<br />

8 ld1.c.clr M3 ld2.c.clr M3 ld4.c.clr M3 ld8.c.clr M3<br />

9 ld1.c.nc M3 ld2.c.nc M3 ld4.c.nc M3 ld8.c.nc M3<br />

A<br />

B<br />

ld1.c.clr.acq M3 ld2.c.clr.acq M3 ld4.c.clr.acq M3 ld8.c.clr.acq M3<br />

C st1 M5 st2 M5 st4 M5 st8 M5<br />

D st1.rel M5 st2.rel M5 st4.rel M5 st8.rel M5<br />

E<br />

F<br />

st8.spill M5


表 4-33. セマフォ /FR 取得のオペコード拡張<br />

オペ<br />

コード・<br />

ビット<br />

40:37<br />

m<br />

ビ<br />

ッ<br />

ト<br />

36<br />

x<br />

ビ<br />

ッ<br />

ト<br />

27<br />

4 0 1<br />

ビット<br />

35:32<br />

0 cmpxchg1.acq M16<br />

3:296 第 3 巻 : 命令形式<br />

x 6<br />

ビット 31:30<br />

0 1 2 3<br />

cmpxchg2.acq<br />

M16<br />

cmpxchg4.acq<br />

M16<br />

cmpxchg8.acq<br />

M16<br />

1 cmpxchg1.rel M16 cmpxchg2.rel M16 cmpxchg4.rel M16 cmpxchg8.rel M16<br />

2<br />

3<br />

xchg1 M16 xchg2 M16 xchg4 M16 xchg8 M16<br />

4<br />

fetchadd4.acq<br />

M17<br />

fetchadd8.acq<br />

M17<br />

5<br />

6<br />

fetchadd4.rel M17 fetchadd8.rel M17<br />

7 getf.sig M19 getf.exp M19 getf.s M19 getf.d M19<br />

8 cmp8xchg16.acq M16<br />

9 cmp8xchg16.rel M16<br />

A ld16 M1<br />

B ld16.acq M1<br />

C st16 M4<br />

D st16.rel M4<br />

E<br />

F


表 4-34. 浮動小数点ロード / ストア /Lfetch のオペコード拡張<br />

オペ<br />

コード・<br />

ビット<br />

40:37<br />

m<br />

ビット<br />

36<br />

x<br />

ビット<br />

27<br />

6 0 0<br />

ビット<br />

35:32<br />

表 4-35. 浮動小数点ロード /Lfetch+Reg のオペコード拡張<br />

オペ<br />

コード・<br />

ビット<br />

40:37<br />

m<br />

ビット<br />

36<br />

x<br />

ビット<br />

27<br />

6 1 0<br />

第 3 巻 : 命令形式 3:297<br />

x 6<br />

ビット 31:30<br />

0 1 2 3<br />

0 ldfe M6 ldf8 M6 ldfs M6 ldfd M6<br />

1 ldfe.s M6 ldf8.s M6 ldfs.s M6 ldfd.s M6<br />

2 ldfe.a M6 ldf8.a M6 ldfs.a M6 ldfd.a M6<br />

3<br />

4<br />

5<br />

ldfe.sa M6 ldf8.sa M6 ldfs.sa M6 ldfd.sa M6<br />

6<br />

7<br />

ldf.fill M6<br />

8 ldfe.c.clr M6 ldf8.c.clr M6 ldfs.c.clr M6 ldfd.c.clr M6<br />

9<br />

A<br />

ldfe.c.nc M6 ldf8.c.nc M6 ldfs.c.nc M6 ldfd.c.nc M6<br />

B lfetch M13 lfetch.excl M13 lfetch.fault M13<br />

lfetch.fault.excl<br />

M13<br />

C<br />

D<br />

stfe M9 stf8 M9 stfs M9 stfd M9<br />

E<br />

F<br />

stf.spill M9<br />

ビット<br />

35:32<br />

x 6<br />

0 1<br />

ビット 31:30<br />

2 3<br />

0 ldfe M7 ldf8 M7 ldfs M7 ldfd M7<br />

1 ldfe.s M7 ldf8.s M7 ldfs.s M7 ldfd.s M7<br />

2 ldfe.a M7 ldf8.a M7 ldfs.a M7 ldfd.a M7<br />

3<br />

4<br />

5<br />

ldfe.sa M7 ldf8.sa M7 ldfs.sa M7 ldfd.sa M7<br />

6<br />

7<br />

ldf.fill M7<br />

8 ldfe.c.clr M7 ldf8.c.clr M7 ldfs.c.clr M7 ldfd.c.clr M7<br />

9<br />

A<br />

ldfe.c.nc M7 ldf8.c.nc M7 ldfs.c.nc M7 ldfd.c.nc M7<br />

B<br />

C<br />

D<br />

E<br />

F<br />

lfetch M14 lfetch.excl M14 lfetch.fault M14 lfetch.fault.excl M14


表 4-36. 浮動小数点ロード / ストア /Lfetch+Imm のオペコード拡張<br />

オペ<br />

コード・<br />

ビット<br />

40:37<br />

7<br />

ビット<br />

35:32<br />

3:298 第 3 巻 : 命令形式<br />

x 6<br />

ビット 31:30<br />

0 1 2 3<br />

0 ldfe M8 ldf8 M8 ldfs M8 ldfd M8<br />

1 ldfe.s M8 ldf8.s M8 ldfs.s M8 ldfd.s M8<br />

2 ldfe.a M8 ldf8.a M8 ldfs.a M8 ldfd.a M8<br />

3<br />

4<br />

5<br />

ldfe.sa M8 ldf8.sa M8 ldfs.sa M8 ldfd.sa M8<br />

6<br />

7<br />

ldf.fill M8<br />

8 ldfe.c.clr M8 ldf8.c.clr M8 ldfs.c.clr M8 ldfd.c.clr M8<br />

9<br />

A<br />

ldfe.c.nc M8 ldf8.c.nc M8 ldfs.c.nc M8 ldfd.c.nc M8<br />

B lfetch M15 lfetch.excl M15 lfetch.fault M15 lfetch.fault.excl M15<br />

C<br />

D<br />

stfe M10 stf8 M10 stfs M10 stfd M10<br />

E<br />

F<br />

stf.spill M10<br />

表 4-37. 浮動小数点ペア・ロード /SR 設定のオペコード拡張<br />

オペ<br />

コード・<br />

ビット<br />

40:37<br />

m<br />

ビット<br />

36<br />

x<br />

ビット<br />

27<br />

6 0 1<br />

ビット<br />

35:32<br />

x 6<br />

ビット 31:30<br />

0 1 2 3<br />

0 ldfp8 M11 ldfps M11 ldfpd M11<br />

1 ldfp8.s M11 ldfps.s M11 ldfpd.s M11<br />

2 ldfp8.a M11 ldfps.a M11 ldfpd.a M11<br />

3<br />

4<br />

5<br />

6<br />

ldfp8.sa M11 ldfps.sa M11 ldfpd.sa M11<br />

7 setf.sig M18 setf.exp M18 setf.s M18 setf.d M18<br />

8 ldfp8.c.clr M11 ldfps.c.clr M11 ldfpd.c.clr M11<br />

9<br />

A<br />

B<br />

C<br />

D<br />

E<br />

F<br />

ldfp8.c.nc M11 ldfps.c.nc M11 ldfpd.c.nc M11


表 4-38. 浮動小数点ペア・ロード +Imm のオペコード拡張<br />

オペ<br />

コード・<br />

ビット<br />

40:37<br />

m<br />

ビット<br />

36<br />

x<br />

ビット<br />

27<br />

6 1 1<br />

ビット<br />

35:32<br />

ロードおよびストア命令は、 いずれもビッ ト 29:28(hint) に、 局所性 ヒ ン ト 情報をエン コ ー<br />

ドしている2 ビッ トのオペコード拡張フィールドを持っている。 表 4-39 と 表 4-40 にこれ<br />

ら の割 り当てを要約する。<br />

表 4-39. ロード・ヒント・コンプリータ<br />

ヒント・<br />

ビット 29:28<br />

ldhint<br />

0 none<br />

1 .nt1<br />

2<br />

3 .nta<br />

表 4-40. ストア・ヒント・コンプリータ<br />

ヒント・<br />

ビット 29:28<br />

sthint<br />

0 none<br />

1<br />

2<br />

3 .nta<br />

第 3 巻 : 命令形式 3:299<br />

x 6<br />

ビット 31:30<br />

0 1 2 3<br />

0 ldfp8 M12 ldfps M12 ldfpd M12<br />

1 ldfp8.s M12 ldfps.s M12 ldfpd.s M12<br />

2 ldfp8.a M12 ldfps.a M12 ldfpd.a M12<br />

3<br />

4<br />

5<br />

6<br />

7<br />

ldfp8.sa M12 ldfps.sa M12 ldfpd.sa M12<br />

8 ldfp8.c.clr M12 ldfps.c.clr M12 ldfpd.c.clr M12<br />

9<br />

A<br />

B<br />

C<br />

D<br />

E<br />

F<br />

ldfp8.c.nc M12 ldfps.c.nc M12 ldfpd.c.nc M12


4.4.1.1 Integer Load<br />

M1<br />

40 37 36 35 30 29 28 27 26 20 19 13 12 6 5 0<br />

4 m x 6 hint x r 3 r 1 qp<br />

4 1 6 2 1 7 7 7 6<br />

ld1.ldhint<br />

命令 オペランド オペコード<br />

m x<br />

拡張<br />

x6 00<br />

ヒント<br />

ld2.ldhint 01<br />

ld4.ldhint 02<br />

ld8.ldhint 03<br />

ld1.s.ldhint 04<br />

ld2.s.ldhint 05<br />

ld4.s.ldhint 06<br />

ld8.s.ldhint 07<br />

ld1.a.ldhint 08<br />

ld2.a.ldhint 09<br />

ld4.a.ldhint 0A<br />

ld8.a.ldhint 0B<br />

ld1.sa.ldhint 0C<br />

ld2.sa.ldhint 0D<br />

ld4.sa.ldhint 0E<br />

ld8.sa.ldhint 0F<br />

ld1.bias.ldhint 10<br />

ld2.bias.ldhint 11<br />

ld4.bias.ldhint<br />

ld8.bias.ldhint<br />

r1 = [r3 ]<br />

4<br />

0 0 12<br />

13<br />

ld1.acq.ldhint 14<br />

ld2.acq.ldhint 15<br />

ld4.acq.ldhint 16<br />

ld8.acq.ldhint 17<br />

ld8.fill.ldhint 1B<br />

ld1.c.clr.ldhint 20<br />

ld2.c.clr.ldhint 21<br />

ld4.c.clr.ldhint 22<br />

ld8.c.clr.ldhint 23<br />

ld1.c.nc.ldhint 24<br />

ld2.c.nc.ldhint 25<br />

ld4.c.nc.ldhint 26<br />

ld8.c.nc.ldhint 27<br />

ld1.c.clr.acq.ldhint 28<br />

ld2.c.clr.acq.ldhint 29<br />

ld4.c.clr.acq.ldhint 2A<br />

ld8.c.clr.acq.ldhint 2B<br />

ld16.ldhint<br />

ld16.acq.ldhint<br />

r1 , ar.csd = [r3 ] 0 1<br />

28<br />

2C<br />

3:299 ページの<br />

表 4-39 参照<br />

3:300 第 3 巻 : 命令形式


4.4.1.2 Integer Load ─ Increment by Register<br />

M2<br />

40 37 36 35 30 29 28 27 26 20 19 13 12 6 5 0<br />

4 m x 6 hint x r 3 r 2 r 1 qp<br />

4 1 6 2 1 7 7 7 6<br />

ld1.ldhint<br />

命令 オペランド オペコード<br />

m x<br />

拡張<br />

x6 00<br />

hint<br />

ld2.ldhint 01<br />

ld4.ldhint 02<br />

ld8.ldhint 03<br />

ld1.s.ldhint 04<br />

ld2.s.ldhint 05<br />

ld4.s.ldhint 06<br />

ld8.s.ldhint 07<br />

ld1.a.ldhint 08<br />

ld2.a.ldhint 09<br />

ld4.a.ldhint 0A<br />

ld8.a.ldhint 0B<br />

ld1.sa.ldhint 0C<br />

ld2.sa.ldhint 0D<br />

ld4.sa.ldhint 0E<br />

ld8.sa.ldhint 0F<br />

ld1.bias.ldhint 10<br />

ld2.bias.ldhint 11<br />

ld4.bias.ldhint<br />

ld8.bias.ldhint<br />

r1 = [r3 ], r2 4 1 0 12<br />

13<br />

ld1.acq.ldhint 14<br />

ld2.acq.ldhint 15<br />

ld4.acq.ldhint 16<br />

ld8.acq.ldhint 17<br />

ld8.fill.ldhint 1B<br />

ld1.c.clr.ldhint 20<br />

ld2.c.clr.ldhint 21<br />

ld4.c.clr.ldhint 22<br />

ld8.c.clr.ldhint 23<br />

ld1.c.nc.ldhint 24<br />

ld2.c.nc.ldhint 25<br />

ld4.c.nc.ldhint 26<br />

ld8.c.nc.ldhint 27<br />

ld1.c.clr.acq.ldhint 28<br />

ld2.c.clr.acq.ldhint 29<br />

ld4.c.clr.acq.ldhint 2A<br />

ld8.c.clr.acq.ldhint 2B<br />

3:299 ページの<br />

表 4-39 参照<br />

第 3 巻 : 命令形式 3:301


4.4.1.3 Integer Load ─ Increment by Immediate<br />

M3<br />

40 37 36 35 30 29 28 27 26 20 19 13 12 6 5 0<br />

5 s x 6 hint i r 3 imm 7b r 1 qp<br />

4 1 6 2 1 7 7 7 6<br />

命令 オペランド オペコード<br />

ld1.ldhint<br />

ld2.ldhint 01<br />

ld4.ldhint 02<br />

ld8.ldhint 03<br />

ld1.s.ldhint 04<br />

ld2.s.ldhint 05<br />

ld4.s.ldhint 06<br />

ld8.s.ldhint 07<br />

ld1.a.ldhint 08<br />

ld2.a.ldhint 09<br />

ld4.a.ldhint 0A<br />

ld8.a.ldhint 0B<br />

ld1.sa.ldhint 0C<br />

ld2.sa.ldhint 0D<br />

ld4.sa.ldhint 0E<br />

ld8.sa.ldhint 0F<br />

ld1.bias.ldhint 10<br />

ld2.bias.ldhint 11<br />

ld4.bias.ldhint<br />

ld8.bias.ldhint<br />

r1 = [r3 ], imm9 5 12<br />

13<br />

ld1.acq.ldhint 14<br />

ld2.acq.ldhint 15<br />

ld4.acq.ldhint 16<br />

ld8.acq.ldhint 17<br />

ld8.fill.ldhint 1B<br />

ld1.c.clr.ldhint 20<br />

ld2.c.clr.ldhint 21<br />

ld4.c.clr.ldhint 22<br />

ld8.c.clr.ldhint 23<br />

ld1.c.nc.ldhint 24<br />

ld2.c.nc.ldhint 25<br />

ld4.c.nc.ldhint 26<br />

ld8.c.nc.ldhint 27<br />

ld1.c.clr.acq.ldhint 28<br />

ld2.c.clr.acq.ldhint 29<br />

ld4.c.clr.acq.ldhint 2A<br />

ld8.c.clr.acq.ldhint 2B<br />

拡張<br />

ヒント<br />

3:302 第 3 巻 : 命令形式<br />

x6 00<br />

3:299 ページの表<br />

4-39 参照


4.4.1.4 Integer Store<br />

M4<br />

4.4.1.5 Integer Store ─ Increment by Immediate<br />

I15<br />

40 37 36 35 30 29 28 27 26 20 19 13 12 6 5 0<br />

4 m x 6 hint x r 3 r 2 qp<br />

4 1 6 2 1 7 7 7 6<br />

拡張<br />

命令 オペランド オペコード<br />

m x x6 ヒント<br />

st1.sthint<br />

30<br />

st2.sthint 31<br />

st4.sthint 32<br />

st8.sthint 33<br />

st1.rel.sthint [r3 ] = r2 0 0 34<br />

st2.rel.sthint<br />

st4.rel.sthint<br />

4<br />

35<br />

36<br />

3:299 ページの<br />

表 4-40 参照<br />

st8.rel.sthint 37<br />

st8.spill.sthint 3B<br />

st16.sthint<br />

st16.rel.sthint<br />

[r3 ] = r2 , ar.csd 0 1<br />

30<br />

34<br />

40 37 36 35 30 29 28 27 26 20 19 13 12 6 5 0<br />

5 s x6 hint i r3 r2 imm7a qp<br />

4 1 6 2 1 7 7 7 6<br />

st1.sthint<br />

命令 オペランド オペコード<br />

st2.sthint 31<br />

st4.sthint 32<br />

st8.sthint 33<br />

[r 3 ] = r 2 , imm 9<br />

st1.rel.sthint 5 34<br />

st2.rel.sthint 35<br />

st4.rel.sthint 36<br />

st8.rel.sthint 37<br />

st8.spill.sthint 3B<br />

拡張<br />

ヒント<br />

第 3 巻 : 命令形式 3:303<br />

x 6<br />

30<br />

3:299 ページの表<br />

4-40 参照


4.4.1.6 Floating-point Load<br />

M6<br />

40 37 36 35 30 29 28 27 26 20 19 13 12 6 5 0<br />

6 m x 6 hint x r 3 f 1 qp<br />

4 1 6 2 1 7 7 7 6<br />

ldfs.ldhint<br />

命令 オペランド オペコード<br />

m x<br />

拡張<br />

x6 ヒント<br />

ldfd.ldhint 03<br />

ldf8.ldhint 01<br />

ldfe.ldhint 00<br />

ldfs.s.ldhint 06<br />

ldfd.s.ldhint 07<br />

ldf8.s.ldhint 05<br />

ldfe.s.ldhint 04<br />

ldfs.a.ldhint 0A<br />

ldfd.a.ldhint 0B<br />

ldf8.a.ldhint 09<br />

ldfe.a.ldhint 08<br />

ldfs.sa.ldhint f1 = [r3 ] 6 0 0 0E<br />

ldfd.sa.ldhint 0F<br />

ldf8.sa.ldhint 0D<br />

ldfe.sa.ldhint 0C<br />

ldf.fill.ldhint 1B<br />

ldfs.c.clr.ldhint 22<br />

ldfd.c.clr.ldhint 23<br />

ldf8.c.clr.ldhint 21<br />

ldfe.c.clr.ldhint 20<br />

ldfs.c.nc.ldhint 26<br />

ldfd.c.nc.ldhint 27<br />

ldf8.c.nc.ldhint 25<br />

ldfe.c.nc.ldhint 24<br />

3:304 第 3 巻 : 命令形式<br />

02<br />

3:299 ページの<br />

表 4-39 参照


4.4.1.7 Floating-point Load ─ Increment by Register<br />

M7<br />

40 37 36 35 30 29 28 27 26 20 19 13 12 6 5 0<br />

6 m x 6 hint x r 3 r 2 f 1 qp<br />

4 1 6 2 1 7 7 7 6<br />

ldfs.ldhint<br />

命令 オペランド オペコード<br />

m x<br />

拡張<br />

x6 ヒント<br />

ldfd.ldhint 03<br />

ldf8.ldhint 01<br />

ldfe.ldhint 00<br />

ldfs.s.ldhint 06<br />

ldfd.s.ldhint 07<br />

ldf8.s.ldhint 05<br />

ldfe.s.ldhint 04<br />

ldfs.a.ldhint 0A<br />

ldfd.a.ldhint 0B<br />

ldf8.a.ldhint 09<br />

ldfe.a.ldhint 08<br />

ldfs.sa.ldhint f1 = [r3 ], r2 6 1 0 0E<br />

ldfd.sa.ldhint 0F<br />

ldf8.sa.ldhint 0D<br />

ldfe.sa.ldhint 0C<br />

ldf.fill.ldhint 1B<br />

ldfs.c.clr.ldhint 22<br />

ldfd.c.clr.ldhint 23<br />

ldf8.c.clr.ldhint 21<br />

ldfe.c.clr.ldhint 20<br />

ldfs.c.nc.ldhint 26<br />

ldfd.c.nc.ldhint 27<br />

ldf8.c.nc.ldhint 25<br />

ldfe.c.nc.ldhint 24<br />

第 3 巻 : 命令形式 3:305<br />

02<br />

3:299 ページの<br />

表 4-39 参照


4.4.1.8 Floating-point Load ─ Increment by Immediate<br />

M8<br />

4.4.1.9 Floating-point Store<br />

M9<br />

40 37 36 35 30 29 28 27 26 20 19 13 12 6 5 0<br />

7 s x 6 hint i r 3 imm 7b f 1 qp<br />

4 1 6 2 1 7 7 7 6<br />

ldfs.ldhint<br />

命令 オペランド オペコード<br />

ldfd.ldhint 03<br />

ldf8.ldhint 01<br />

ldfe.ldhint 00<br />

ldfs.s.ldhint 06<br />

ldfd.s.ldhint 07<br />

ldf8.s.ldhint 05<br />

ldfe.s.ldhint 04<br />

ldfs.a.ldhint 0A<br />

ldfd.a.ldhint 0B<br />

ldf8.a.ldhint 09<br />

ldfe.a.ldhint 08<br />

f 1 = [r 3 ], imm 9<br />

ldfs.sa.ldhint 7 0E<br />

ldfd.sa.ldhint 0F<br />

ldf8.sa.ldhint 0D<br />

ldfe.sa.ldhint 0C<br />

ldf.fill.ldhint 1B<br />

ldfs.c.clr.ldhint 22<br />

ldfd.c.clr.ldhint 23<br />

ldf8.c.clr.ldhint 21<br />

ldfe.c.clr.ldhint 20<br />

ldfs.c.nc.ldhint 26<br />

ldfd.c.nc.ldhint 27<br />

ldf8.c.nc.ldhint 25<br />

ldfe.c.nc.ldhint 24<br />

拡張<br />

ヒント<br />

3:306 第 3 巻 : 命令形式<br />

x 6<br />

02<br />

3:299 ページの表<br />

4-39 参照<br />

40 37 36 35 30 29 28 27 26 20 19 13 12 6 5 0<br />

6 m x6 hint x r3 f2 qp<br />

4 1 6 2 1 7 7 7 6<br />

拡張<br />

命令 オペランド オペコード<br />

m x x6 ヒント<br />

stfs.sthint<br />

32<br />

stfd.sthint 33<br />

stf8.sthint<br />

stfe.sthint<br />

[r3 ] = f2 6 0 0 31<br />

30<br />

3:299 ページの<br />

表 4-40 参照<br />

stf.spill.sthint 3B


4.4.1.10 Floating-point Store ─ Increment by Immediate<br />

M10<br />

4.4.1.11 Floating-point Load Pair<br />

M11<br />

40 37 36 35 30 29 28 27 26 20 19 13 12 6 5 0<br />

7 s x 6 hint i r 3 f 2 imm 7a qp<br />

4 1 6 2 1 7 7 7 6<br />

stfs.sthint<br />

命令 オペランド オペコード<br />

stfd.sthint 33<br />

stf8.sthint [r3 ] = f2 , imm9 7 31<br />

stfe.sthint 30<br />

stf.spill.sthint 3B<br />

拡張<br />

ヒント<br />

第 3 巻 : 命令形式 3:307<br />

x 6<br />

32<br />

3:299 ページの表<br />

4-40 参照<br />

40 37 36 35 30 29 28 27 26 20 19 13 12 6 5 0<br />

6 m x6 hint x r3 f2 f1 qp<br />

4 1 6 2 1 7 7 7 6<br />

ldfps.ldhint<br />

命令 オペランド オペコード<br />

m x<br />

拡張<br />

x6 ヒント<br />

ldfpd.ldhint 03<br />

ldfp8.ldhint 01<br />

ldfps.s.ldhint 06<br />

ldfpd.s.ldhint 07<br />

ldfp8.s.ldhint 05<br />

ldfps.a.ldhint 0A<br />

ldfpd.a.ldhint 0B<br />

ldfp8.a.ldhint<br />

ldfps.sa.ldhint<br />

f1 , f2 = [r3 ] 6 0 1<br />

09<br />

0E<br />

ldfpd.sa.ldhint 0F<br />

ldfp8.sa.ldhint 0D<br />

ldfps.c.clr.ldhint 22<br />

ldfpd.c.clr.ldhint 23<br />

ldfp8.c.clr.ldhint 21<br />

ldfps.c.nc.ldhint 26<br />

ldfpd.c.nc.ldhint 27<br />

ldfp8.c.nc.ldhint 25<br />

02<br />

3:299 ページの<br />

表 4-39 参照


4.4.1.12 Floating-point Load Pair ─ Increment by Immediate<br />

M12<br />

4.4.2 ライン・プリフェッチ<br />

40 37 36 35 30 29 28 27 26 20 19 13 12 6 5 0<br />

6 m x 6 hint x r 3 f 2 f 1 qp<br />

4 1 6 2 1 7 7 7 6<br />

命令 オペランド<br />

ldfps.ldhint f 1 , f 2 = [r 3 ], 8<br />

ldfpd.ldhint<br />

オペ<br />

コード<br />

m x<br />

拡張<br />

x6 ヒント<br />

03<br />

f1 , f2 = [r3 ], 16<br />

ldfp8.ldhint 01<br />

ldfps.s.ldhint f 1 , f 2 = [r 3 ], 8 06<br />

ldfpd.s.ldhint<br />

07<br />

f1 , f2 = [r3 ], 16<br />

ldfp8.s.ldhint 05<br />

ldfps.a.ldhint f 1 , f 2 = [r 3 ], 8 0A<br />

ldfpd.a.ldhint<br />

f 1 , f 2 = [r 3 ], 16<br />

ldfp8.a.ldhint 09<br />

6 1 1<br />

ldfps.sa.ldhint f 1 , f 2 = [r 3 ], 8 0E<br />

ldfpd.sa.ldhint<br />

0F<br />

f1 , f2 = [r3 ], 16<br />

ldfp8.sa.ldhint 0D<br />

ldfps.c.clr.ldhint f 1 , f 2 = [r 3 ], 8 22<br />

ldfpd.c.clr.ldhint<br />

23<br />

f1 , f2 = [r3 ], 16<br />

ldfp8.c.clr.ldhint 21<br />

ldfps.c.nc.ldhint f 1 , f 2 = [r 3 ], 8 26<br />

ldfpd.c.nc.ldhint<br />

27<br />

f1 , f2 = [r3 ], 16<br />

ldfp8.c.nc.ldhint 25<br />

ラ イ ン ・ プ リ フ ェ ッ チ命令は、 浮動小数点ロ ー ド / ストア命令とともに、 メジャー・オペ<br />

コード 6 と 7 の中にエン コ ー ド される。 オペコ ー ド 拡張の要約については、 3:293 ページ<br />

の 4.4.1 項 「ロー ド とス ト ア」 を参照のこ と。<br />

すべてのライン ・ プ リ フ ェ ッチ命令は、 表 4-41 に示す局所性ヒン ト 情報をエン コ ー ド し<br />

ている 2 ビッ トのオペコード拡張フィールドをビッ ト 29:28 ( ヒント ) に持っている。<br />

表 4-41. ライン・プリフェッチ・ヒント・コンプリータ<br />

ヒント・<br />

ビット 29:28<br />

lfhint<br />

0 none<br />

1 .nt1<br />

2 .nt2<br />

3 .nta<br />

3:308 第 3 巻 : 命令形式<br />

02<br />

0B<br />

3:299 ページの<br />

表 4-39 参照


4.4.2.1 Line Prefetch<br />

M13<br />

4.4.2.2 Line Prefetch ─ Increment by Register<br />

M14<br />

4.4.2.3 Line Prefetch ─ Increment by Immediate<br />

M15<br />

4.4.3 セマフォ<br />

40 37 36 35 30 29 28 27 26 20 19 6 5 0<br />

6 m x 6 hint x r 3 qp<br />

4 1 6 2 1 7 14 6<br />

命令 オペランド<br />

オペ<br />

コード m x<br />

拡張<br />

x6 ヒント<br />

lfetch.lfhint<br />

2C<br />

lfetch.excl.lfhint<br />

lfetch.fault.lfhint<br />

[r3 ] 6 0 0<br />

2D<br />

2E<br />

3:308 ページの<br />

表 4-41 参照<br />

lfetch.fault.excl.lfhint 2F<br />

40 37 36 35 30 29 28 27 26 20 19 13 12 6 5 0<br />

6 m x6 hint x r3 r2 qp<br />

4 1 6 2 1 7 7 7 6<br />

命令 オペランド<br />

オペ<br />

コード m x<br />

拡張<br />

x6 ヒント<br />

lfetch.lfhint<br />

2C<br />

lfetch.excl.lfhint<br />

lfetch.fault.lfhint<br />

[r3 ], r2 6 1 0<br />

2D<br />

2E<br />

3:308 ページの<br />

表 4-41 参照<br />

lfetch.fault.excl.lfhint 2F<br />

40 37 36 35 30 29 28 27 26 20 19 13 12 6 5 0<br />

7 s x6 hint i r3 imm7b qp<br />

4 1 6 2 1 7 7 7 6<br />

命令 オペランド オペコード<br />

x6 lfetch.lfhint<br />

2C<br />

lfetch.excl.lfhint<br />

lfetch.fault.lfhint<br />

[r3 ], imm9 7<br />

2D<br />

2E<br />

lfetch.fault.excl.lfhint 2F<br />

拡張<br />

ヒント<br />

3:308 ページの表<br />

4-41 参照<br />

セマ フ ォ 命令は、 整数ロ ー ド / ストア命令とともに、 メジャー・オペコード 4 の中にエン<br />

コ ー ド さ れる。 オペ コ ー ド 拡張の要約については、 3:293 ページの 4.4.1 項「ロードとスト<br />

ア」 を参照のこ と。<br />

第 3 巻 : 命令形式 3:309


4.4.3.1 Exchange/Compare and Exchange<br />

M16<br />

4.4.3.2 Fetch and Add ─ Immediate<br />

M17<br />

4.4.4 FR 設定 / 取得<br />

40 37 36 35 30 29 28 27 26 20 19 13 12 6 5 0<br />

4 m x 6 hint x r 3 r 2 r 1 qp<br />

4 1 6 2 1 7 7 7 6<br />

命令 オペランド<br />

cmpxchg1.acq.ldhint<br />

オペ<br />

コード<br />

m x<br />

拡張<br />

x6 ヒント<br />

cmpxchg2.acq.ldhint 01<br />

cmpxchg4.acq.ldhint 02<br />

cmpxchg8.acq.ldhint<br />

cmpxchg1.rel.ldhint<br />

r1 = [r3 ], r2 , ar.ccv<br />

03<br />

04<br />

cmpxchg2.rel.ldhint 05<br />

cmpxchg4.rel.ldhint<br />

cmpxchg8.rel.ldhint<br />

4 0 1<br />

06<br />

07<br />

cmp8xchg16.acq.ldhint<br />

cmp8xchg16.rel.ldhint<br />

r1 = [r3 ], r2 , ar.csd, ar.ccv<br />

20<br />

24<br />

xchg1.ldhint<br />

xchg2.ldhint<br />

xchg4.ldhint<br />

r1 = [r3 ], r2 08<br />

09<br />

0A<br />

xchg8.ldhint 0B<br />

FR 設定命令は、 浮動小数点ロ ー ド / ストア命令とともに、 メジャー・オペコード 6 の中<br />

にエンコー ド される。 FR 取得命令は、 整数ロ ー ド / ストア命令とともに、 メジャー・オ<br />

ペコー ド 6 の中にエンコー ド される。 オペコー ド拡張の要約については、 3:293 ページの<br />

4.4.1 項 「ロー ド とス ト ア」 を参照のこ と。<br />

3:310 第 3 巻 : 命令形式<br />

00<br />

3:299 ページ<br />

の表 4-39 参照<br />

40 37 36 35 30 29 28 27 26 20 19 16 15 14 13 12 6 5 0<br />

4 m x6 hint x r3 s i2b r1 qp<br />

4 1 6 2 1 7 4 1 2 7 6<br />

命令 オペランド<br />

fetchadd4.acq.ldhint<br />

オペ<br />

コード<br />

m x<br />

拡張<br />

x6 ヒント<br />

fetchadd8.acq.ldhint<br />

fetchadd4.rel.ldhint<br />

r1 = [r3 ], inc3 4 0 1<br />

13<br />

16<br />

fetchadd8.rel.ldhint 17<br />

12<br />

3:299 ページの<br />

表 4-39 参照


4.4.4.1 Set FR<br />

M18<br />

4.4.4.2 Get FR<br />

M19<br />

4.4.5 スペキュレーションおよびアドバンスド・ロード・チェック<br />

スペキュ レーシ ョ ンおよびア ド バンス ド ・ ロー ド ・ チェ ッ ク命令は、 システム / メモリ管<br />

理命令 と と も に、 メ ジ ャ ー ・ オペ コ ー ド 0 と 1 の中にエン コ ー ド される。 オペコ ー ド 拡張<br />

の要約については、 3:316 ページの 4.4.10 項 「システム / メモリ管理」 を参照のこ と。<br />

4.4.5.1 Integer Speculation Check (M ユニット )<br />

M20<br />

4.4.5.2 Floating-point Speculation Check<br />

M21<br />

40 37 36 35 30 29 28 27 26 20 19 13 12 6 5 0<br />

6 m x 6 x r 2 f 1 qp<br />

4 1 6 2 1 7 7 7 6<br />

拡張<br />

命令 オペランド オペコード<br />

m x x6 setf.sig<br />

1C<br />

setf.exp<br />

setf.s<br />

f1 = r2 6 0 1<br />

1D<br />

1E<br />

setf.d 1F<br />

40 37 36 35 30 29 28 27 26 20 19 13 12 6 5 0<br />

4 m x 6 x f 2 r 1 qp<br />

4 1 6 2 1 7 7 7 6<br />

拡張<br />

命令 オペランド オペコード<br />

m x x6 getf.sig<br />

1C<br />

getf.exp<br />

getf.s<br />

r1 = f2 4 0 1<br />

1D<br />

1E<br />

getf.d 1F<br />

40 37 36 35 33 32 20 19 13 12 6 5 0<br />

1 s x 3 imm 13c r 2 imm 7a qp<br />

4 1 3 13 7 7 6<br />

命令 オペランド オペコード<br />

chk.s.m r 2 , target 25 1 1<br />

第 3 巻 : 命令形式 3:311<br />

拡張<br />

x3 40 37 36 35 33 32 20 19 13 12 6 5 0<br />

1 s x 3 imm 13c f 2 imm 7a qp<br />

4 1 3 13 7 7 6<br />

命令 オペランド オペコード<br />

chk.s f 2 , target 25 1 3<br />

拡張<br />

x3


4.4.5.3 Integer Advanced Load Check<br />

M22<br />

4.4.5.4 Floating-point Advanced Load Check<br />

M23<br />

4.4.6 キャッシュ / 同期 /RSE/ALAT<br />

キャッシュ / 同期 /RSE/ALAT 命令は、 メ モ リ 管理命令 と と も に、 メ ジ ャ ー ・ オペ コ ー ド 0<br />

の中にエン コ ー ド される。 オペコ ー ド 拡張の要約については、 3:316 ページの 4.4.10 項「シ<br />

ステム / メ モ リ 管理」 を参照のこ と。<br />

4.4.6.1 Sync/Fence/Serialize/ALAT Control<br />

M24<br />

40 37 36 35 33 32 13 12 6 5 0<br />

0 s x 3 imm 20b r 1 qp<br />

4 1 3 20 7 6<br />

拡張<br />

命令 オペランド オペコード<br />

x3 chk.a.nc<br />

chk.a.clr<br />

r1 , target25 0<br />

4<br />

5<br />

40 37 36 35 33 32 13 12 6 5 0<br />

0 s x 3 imm 20b f 1 qp<br />

4 1 3 20 7 6<br />

拡張<br />

命令 オペランド オペコード<br />

x3 chk.a.nc<br />

chk.a.clr<br />

f1 , target25 0<br />

6<br />

7<br />

40 37 36 35 33 32 31 30 27 26 6 5 0<br />

0 x 3 x 2 x 4 qp<br />

4 1 3 2 4 21 6<br />

拡張<br />

命令 オペコード<br />

x3 x4 x2 invala<br />

0 1<br />

fwb 0<br />

mf 2<br />

2<br />

mf.a 0 0<br />

3<br />

srlz.d 0<br />

srlz.i 1<br />

3<br />

sync.i 3<br />

3:312 第 3 巻 : 命令形式


4.4.6.2 RSE Control<br />

M25<br />

4.4.6.3 Integer ALAT Entry Invalidate<br />

M26<br />

4.4.6.4 Floating-point ALAT Entry Invalidate<br />

M27<br />

4.4.6.5 Flush Cache<br />

M28<br />

40 37 36 35 33 32 31 30 27 26 6 5 0<br />

4.4.7 GR/AR 移動 (M ユニット )<br />

0 x 3 x 2 x 4 0<br />

4 1 3 2 4 21 6<br />

拡張<br />

命令 オペコード<br />

x3 x4 x2 flushrs f<br />

loadrs<br />

0 0<br />

C<br />

0<br />

f A<br />

40 37 36 35 33 32 31 30 27 26 13 12 6 5 0<br />

0 x 3 x 2 x 4 r 1 qp<br />

4 1 3 2 4 14 7 6<br />

拡張<br />

命令 オペランド オペコード<br />

x3 x4 x2 invala.e r1 0 0 2 1<br />

40 37 36 35 33 32 31 30 27 26 13 12 6 5 0<br />

0 x 3 x 2 x 4 f 1 qp<br />

4 1 3 2 4 14 7 6<br />

拡張<br />

命令 オペランド オペコード<br />

x3 x4 x2 invala.e f1 0 0 3 1<br />

40 37 36 35 33 32 27 26 20 19 6 5 0<br />

1 x 3 x 6 r 3 qp<br />

4 1 3 6 7 14 6<br />

拡張<br />

命令 オペランド オペコード<br />

x3 x6 x<br />

fc<br />

fc.i<br />

r3 1 0 30<br />

0<br />

1<br />

M ユニッ ト GR/AR 移動命令は、 シ ス テ ム / メ モ リ 管理命令 と と も に、 メ ジ ャ ー ・ オペ コ ー<br />

ド 0 の中にエン コ ー ド される ( 一部の AR は、 I ユニ ッ ト 上のシステム制御命令を使 っ て<br />

アクセスされる。 3:291 ページの 4.3.7 項 「GR/AR 移動 (I ユニッ ト )」 を参照のこ と )。 M<br />

ユニッ ト GR/AR オペコ ー ド拡張の要約については、 3:316 ページの 4.4.10 項 「システム /<br />

メ モ リ 管理」 を参照のこ と。<br />

第 3 巻 : 命令形式 3:313


4.4.7.1 Move to AR ─ Register (M ユニット )<br />

M29<br />

4.4.7.2 Move to AR ─ Immediate 8 (M ユニット )<br />

M30<br />

4.4.7.3 Move from AR (M ユニット )<br />

M31<br />

4.4.8 GR/CR 移動<br />

GR/CR 移動命令は、 シ ス テ ム / メモリ管理命令と と もに、 メジャー ・オペコー ド 0 の中に<br />

エンコ ー ド される。 オペコ ー ド拡張の一覧については、 3:316 ページの 4.4.10 項 「システ<br />

ム / メモリ管理」 を参照のこ と。<br />

4.4.8.1 Move to CR<br />

M32<br />

4.4.8.2 Move from CR<br />

M33<br />

40 37 36 35 33 32 27 26 20 19 13 12 6 5 0<br />

1 x 3 x 6 ar 3 r 2 qp<br />

4 1 3 6 7 7 7 6<br />

命令 オペランド オペコード<br />

mov.m ar 3 = r 2 1 0 2A<br />

40 37 36 35 33 32 31 30 27 26 20 19 13 12 6 5 0<br />

0 s x 3 x 2 x 4 ar 3 imm 7b qp<br />

4 1 3 2 4 7 7 7 6<br />

命令 オペランド オペコード<br />

3:314 第 3 巻 : 命令形式<br />

x 3<br />

拡張<br />

拡張<br />

x 6<br />

x 3 x 4 x 2<br />

mov.m ar 3 = imm 8 0 0 8 2<br />

40 37 36 35 33 32 27 26 20 19 13 12 6 5 0<br />

1 x 3 x 6 ar 3 r 1 qp<br />

4 1 3 6 7 7 7 6<br />

命令 オペランド オペコード<br />

mov.m r 1 = ar 3 1 0 22<br />

40 37 36 35 33 32 27 26 20 19 13 12 6 5 0<br />

1 x 3 x 6 cr 3 r 2 qp<br />

4 1 3 6 7 7 7 6<br />

命令 オペランド オペコード<br />

mov p cr 3 = r 2 1 0 2C<br />

40 37 36 35 33 32 27 26 20 19 13 12 6 5 0<br />

1 x 3 x 6 cr 3 r 1 qp<br />

4 1 3 6 7 7 7 6<br />

命令 オペランド オペコード<br />

mov p r 1 = cr 3 1 0 24<br />

x 3<br />

x 3<br />

x 3<br />

拡張<br />

拡張<br />

拡張<br />

x 6<br />

x 6<br />

x 6


4.4.9 その他の M ユニット命令<br />

その他の M ユニッ ト 命令は、 システム / メモリ管理命令と と もに、 メジャー ・ オペコー<br />

ド 0 の中にエン コ ー ド される。 オペコ ー ド 拡張の要約については、 3:316 ページの 4.4.10<br />

項 「システム / メ モ リ 管理」 を参照のこ と。<br />

4.4.9.1 Allocate Register Stack Frame<br />

M34<br />

注 : 命令エン コ ー デ ィ ン グ内の 3 つの即値は、 以下のオペラ ン ド か ら 構成 さ れる。<br />

sof = i + l + o<br />

sol = i + l<br />

sor = r >> 3<br />

4.4.9.2 Move to PSR<br />

M35<br />

4.4.9.3 Move from PSR<br />

M36<br />

4.4.9.4 Break (M ユニット )<br />

M37<br />

40 37 36 35 33 32 31 30 27 26 20 19 13 12 6 5 0<br />

1 x 3 sor sol sof r 1 0<br />

4 1 3 2 4 7 7 7 6<br />

命令 オペランド オペコード<br />

alloc f r 1 = ar.pfs, i, l, o, r 1 6<br />

第 3 巻 : 命令形式 3:315<br />

拡張<br />

x3 40 37 36 35 33 32 27 26 20 19 13 12 6 5 0<br />

1 x 3 x 6 r 2 qp<br />

4 1 3 6 7 7 7 6<br />

拡張<br />

命令 オペランド オペコード<br />

x3 x6 mov p<br />

mov<br />

psr.l = r2 psr.um = r2 1 0<br />

2D<br />

29<br />

40 37 36 35 33 32 27 26 13 12 6 5 0<br />

1 x 3 x 6 r 1 qp<br />

4 1 3 6 14 7 6<br />

拡張<br />

命令 オペランド オペコード<br />

x3 x6 mov p mov<br />

r1 = psr<br />

r1 = psr.um<br />

1 0<br />

25<br />

21<br />

40 37 36 35 33 32 31 30 27 26 25 6 5 0<br />

0 i x 3 x 2 x 4 imm 20a qp<br />

4 1 3 2 4 1 20 6<br />

拡張<br />

命令 オペランド オペコード<br />

x3 x4 x2 break.m imm21 0 0 0 0


4.4.10 システム / メモリ管理<br />

すべてのシステム / メ モ リ 管理命令は、 メ ジ ャ ー ・ オペ コ ー ド 0 と 1 の中にエン コ ー ド さ<br />

れる。 ビ ッ ト 35:33 に 3 ビッ トのオペコード拡張フィールド (x 3 ) を使用する。 また、 一部<br />

の命令は、 ビ ッ ト 30:27 に 4 ビッ トのオペコード拡張フィールド (x 4 ) か、 ビ ッ ト 32:27 に<br />

6 ビッ トのオペコード拡張フィールド (x 6 ) を持つ。 4 ビッ トのオペコード拡張フィールド<br />

持つ命令のほ と んど は、 ビ ッ ト 32:31 にも 2 ビ ッ ト の拡張フ ィ ー ル ド (x 2 ) を持つ。 表 4-42<br />

はオペコー ド 0 の 3 ビッ トの割り当てを示し、表 4-43 はオペコー ド 0 の 4 ビッ ト +2 ビッ<br />

トの割り当てを要約し、 表 4-44 はオペコー ド 1 の 3 ビットの割り当てを示し、 表 4-45 は<br />

オペコ ー ド 1 の 6 ビットの割り当てを要約している。<br />

表 4-42. オペコード 0 のシステム / メモリ管理の 3 ビット・オペコード拡張<br />

オペコード・<br />

ビット 40:37<br />

0<br />

x 3<br />

ビット 35:33<br />

0 システム / メモリ管理 4 ビット +2 ビット拡張 ( 表 4-43)<br />

1<br />

2<br />

3<br />

4 chk.a.nc - int M22<br />

5 chk.a.clr - int M22<br />

6 chk.a.nc - fp M23<br />

7 chk.a.clr - fp M23<br />

表 4-43. オペコード 0 のシステム / メモリ管理の 4 ビット +2 ビット・オペコード拡張<br />

オペ<br />

コード・<br />

ビット<br />

40:37<br />

x 3<br />

ビット<br />

35:33<br />

0 0<br />

x 4<br />

ビット<br />

30:27<br />

x2 ビット 32:31<br />

0 1 2 3<br />

0 break.m M37 invala M24 fwb M24 srlz.d M24<br />

1<br />

1 ビット拡張<br />

( 表 4-46)<br />

srlz.i M24<br />

2 invala.e - int M26 mf M24<br />

3 invala.e - fp M27 mf.a M24 sync.i M24<br />

4 sum M44<br />

5 rum M44<br />

6 ssm M44<br />

7 rsm M44<br />

8 mov.m to ar - imm8 M30<br />

9<br />

A loadrs M25<br />

B<br />

C flushrs M25<br />

D<br />

E<br />

F<br />

3:316 第 3 巻 : 命令形式


表 4-44. オペコード 1 のシステム / メモリ管理の 3 ビット・オペコード拡張<br />

オペコード・<br />

ビット 40:37<br />

1<br />

x 3<br />

ビット 35:33<br />

0 システム / メモリ管理 6 ビット拡張 ( 表 4-45)<br />

1 chk.s.m - int M20<br />

2<br />

3 chk.s - fp M21<br />

4<br />

5<br />

6 alloc M34<br />

7<br />

表 4-45. オペコード 1 のシステム / メモリ管理の 6 ビット・オペコード拡張<br />

オペ<br />

コード・<br />

ビット<br />

40:37<br />

x 3<br />

ビット<br />

35:33<br />

1 0<br />

ビット<br />

30:27<br />

第 3 巻 : 命令形式 3:317<br />

x 6<br />

ビット 32:31<br />

0 1 2 3<br />

0 mov to rr M42 mov from rr M43 fc M28<br />

1 mov to dbr M42 mov from dbr M43<br />

mov from psr.um<br />

M36<br />

2 mov to ibr M42 mov from ibr M43 mov.m from ar M31<br />

probe.rw.fault -<br />

imm 2 M40<br />

probe.r.fault -<br />

imm 2 M40<br />

3 mov to pkr M42 mov from pkr M43<br />

probe.w.fault -<br />

imm2 M40<br />

4 mov to pmc M42 mov from pmc M43 mov from cr M33 ptc.e M28<br />

5 mov to pmd M42 mov from pmd M43 mov from psr M36<br />

6<br />

7 mov from cpuid M43<br />

8 probe.r - imm2 M39 probe.r M38<br />

9 ptc.l M45 probe.w - imm2 M39 mov to psr.um M35 probe.w M38<br />

A ptc.g M45 thash M46 mov.m to ar M29<br />

B ptc.ga M45 ttag M46<br />

C ptr.d M45 mov to cr M32<br />

D ptr.i M45 mov to psr.l M35<br />

E itr.d M42 tpa M46 itc.d M41<br />

F itr.i M42 tak M46 itc.i M41


4.4.10.1 Probe ─ Register<br />

M38<br />

4.4.10.2 Probe ─ Immediate 2<br />

M39<br />

4.4.10.3 Probe Fault ─ Immediate 2<br />

M40<br />

4.4.10.4 Translation Cache Insert<br />

M41<br />

40 37 36 35 33 32 27 26 20 19 13 12 6 5 0<br />

1 x 3 x 6 r 3 r 2 r 1 qp<br />

4 1 3 6 7 7 7 6<br />

拡張<br />

命令 オペランド オペコード<br />

x3 x6 probe.r<br />

probe.w<br />

r1 = r3 , r2 1 0<br />

38<br />

39<br />

40 37 36 35 33 32 27 26 20 19 15 14 13 12 6 5 0<br />

1 x 3 x 6 r 3 i 2b r 1 qp<br />

4 1 3 6 7 5 2 7 6<br />

拡張<br />

命令 オペランド オペコード<br />

x3 x6 probe.r<br />

probe.w<br />

r1 = r3 , imm2 1 0<br />

18<br />

19<br />

40 37 36 35 33 32 27 26 20 19 15 14 13 12 6 5 0<br />

1 x 3 x 6 r 3 i 2b qp<br />

4 1 3 6 7 5 2 7 6<br />

拡張<br />

命令 オペランド オペコード<br />

x3 x6 probe.rw.fault<br />

31<br />

probe.r.fault r3 , imm2 1 0<br />

32<br />

probe.w.fault 33<br />

40 37 36 35 33 32 27 26 20 19 13 12 6 5 0<br />

1 x 3 x 6 r 2 qp<br />

4 1 3 6 7 7 7 6<br />

l p<br />

itc.d<br />

l p<br />

itc.i<br />

命令 オペランド オペコード<br />

r 2 1 0<br />

3:318 第 3 巻 : 命令形式<br />

x 3<br />

拡張<br />

x 6<br />

2E<br />

2F


4.4.10.5 Move to Indirect Register/Translation Register Insert<br />

M42<br />

4.4.10.6 Move from Indirect Register<br />

M43<br />

4.4.10.7 Set/Reset User/System Mask<br />

M44<br />

40 37 36 35 33 32 27 26 20 19 13 12 6 5 0<br />

1 x 3 x 6 r 3 r 2 qp<br />

4 1 3 6 7 7 7 6<br />

拡張<br />

命令 オペランド オペコード<br />

x3 x6 mov p<br />

rr[r3 ] = r2 00<br />

dbr[r3 ] = r2 01<br />

ibr[r3 ] = r2 pkr[r3 ] = r2 pmc[r3 ] = r2 1 0<br />

02<br />

03<br />

04<br />

pmd[r3 ] = r2 05<br />

itr.d p dtr[r3 ] = r2 0E<br />

itr.i p itr[r3 ] = r2 0F<br />

40 37 36 35 33 32 27 26 20 19 13 12 6 5 0<br />

mov p<br />

mov<br />

1 x 3 x 6 r 3 r 1 qp<br />

4 1 3 6 7 7 7 6<br />

命令 オペランド オペコード<br />

r 1 = rr[r 3 ]<br />

第 3 巻 : 命令形式 3:319<br />

x 3<br />

拡張<br />

r 1 = dbr[r 3 ] 11<br />

r 1 = ibr[r 3 ] 12<br />

r1 = pkr[r3 ] 1 0<br />

13<br />

r1 = pmc[r3 ] 14<br />

r1 = pmd[r3 ] 15<br />

r 1 = cpuid[r 3 ] 17<br />

40 37 36 35 33 32 31 30 27 26 6 5 0<br />

0 i x 3 i 2d x 4 imm 21a qp<br />

4 1 3 2 4 21 6<br />

拡張<br />

命令 オペランド オペコード<br />

x3 x4 sum<br />

4<br />

rum<br />

ssm<br />

imm24 0 0<br />

5<br />

p<br />

6<br />

rsm p<br />

7<br />

x 6<br />

10


4.4.10.8 Translation Purge<br />

M45<br />

4.4.10.9 Translation Access<br />

M46<br />

4.4.10.10 Purge Translation Cache Entry<br />

M47<br />

40 37 36 35 33 32 27 26 20 19 13 12 6 5 0<br />

1 x 3 x 6 r 3 r 2 qp<br />

4 1 3 6 7 7 7 6<br />

拡張<br />

命令 オペランド オペコード<br />

x3 x6 ptc.l p<br />

09<br />

ptc.g<br />

r3 , r2 1 0<br />

l p 0A<br />

ptc.ga l p 0B<br />

ptr.d p 0C<br />

ptr.i p 0D<br />

40 37 36 35 33 32 27 26 20 19 13 12 6 5 0<br />

1 x3 x6 r3 r1 qp<br />

4 1 3 6 7 7 7 6<br />

拡張<br />

命令 オペランド オペコード<br />

x3 x6 thash<br />

1A<br />

ttag<br />

tpa<br />

r1 = r3 1 0<br />

1B<br />

p<br />

1E<br />

tak p<br />

1F<br />

40 37 36 35 33 32 27 26 20 19 6 5 0<br />

1 x3 x6 r3 qp<br />

4 1 3 6 7 14 6<br />

拡張<br />

命令 オペランド オペコード<br />

x3 x6 ptc.e p r3 1 0 34<br />

3:320 第 3 巻 : 命令形式


4.4.11 Nop/Hint (M- ユニット )<br />

M ユニ ッ ト nop/hint 命令を メ ジ ャ ー ・ オペ コ ー ド 0 の中にエン コ ー ド する際は、 ビ ッ ト<br />

35:33(x 3 ) 内の 3 ビッ ト ・オペコード拡張フィールド、 ビット 32:31(x 2 ) 内の 2 ビッ ト ・オ<br />

ペ コ ー ド 拡張フ ィ ー ル ド 、 ビ ッ ト 30:27(x 4 ) 内の 4 ビッ ト ・オペコード拡張フィールド、<br />

ビッ ト 26(y) 内の 1 ビ ッ ト ・ オペコ ー ド拡張フ ィ ール ド が使用される ( 表 4-46 を参照 )。<br />

表 4-46. 各種の M ユニット 1 ビット・オペコード拡張<br />

M48<br />

4.5 B ユニット命令エンコーディング<br />

4.5.1 分岐<br />

オペコード・<br />

ビット 40:37<br />

x 3<br />

ビット<br />

35:33<br />

x 4<br />

ビット<br />

30:27<br />

x 2<br />

ビット<br />

32:31<br />

0 0 1 0<br />

y<br />

ビット 26<br />

分岐ユニ ッ ト に は、 分岐 と その他の命令が含 ま れる。<br />

0 nop.m<br />

1 hint.m<br />

40 37 36 35 33 32 31 30 27 26 25 6 5 0<br />

0 i x3 x2 x4 y imm20a qp<br />

4 1 3 2 4 1 20 6<br />

拡張<br />

命令 オペランド オペコード<br />

x3 x4 x2 y<br />

nop.m<br />

hint.m<br />

imm21 0 0 1<br />

0 0<br />

1<br />

間接分岐に は オペ コ ー ド 0、 間接コールにはオペコード1、 IP 相対分岐にはオペ コ ー ド 4、<br />

IP 相対 コ ー ルにはオペ コ ー ド 5 が使用される。<br />

メジャー ・オペコード 4 の中にエン コ ー ド される IP 相対分岐命令は、 表 4-47 に示すよ う<br />

に、分岐のタイプを区別するために、ビ ッ ト 8:6(btype) に 3 ビッ トのオペコード拡張フィー<br />

ルドを使用する。<br />

表 4-47. IP 相対分岐タイプ<br />

オペコード・<br />

ビット 40:37<br />

4<br />

btype<br />

ビット 8:6<br />

0 br.cond B1<br />

e<br />

1<br />

2 br.wexit B1<br />

3 br.wtop B1<br />

e<br />

4<br />

5 br.cloop B2<br />

6 br.cexit B2<br />

7 br.ctop B2<br />

第 3 巻 : 命令形式 3:321


間接分岐、 間接 リ タ ー ン、 その他の分岐ユニ ッ ト 命令は、 メ ジ ャ ー ・ オペ コ ー ド 0 の中に<br />

エンコ ー ド される。 ビ ッ ト 32:27(x 6 ) に 6 ビッ トのオペコード拡張フィールドを使用する。<br />

表 4-48 に こ れ ら の割 り 当てを要約す る。<br />

表 4-48. 間接 / その他の分岐のオペコード拡張<br />

オペコード・<br />

ビット 40:37<br />

0<br />

ビット<br />

30:27<br />

メジャー・オペコード 0 の中にエン コ ー ド さ れる間接分岐命令は、 表 4-49 に示すよ う に、<br />

分岐の タ イ プを区別す る ために、 ビ ッ ト 8:6(btype) に 3 ビッ トのオペコード拡張フィール<br />

ドを使用する。<br />

表 4-49. 間接分岐タイプ<br />

オペコード・<br />

ビット 40:37<br />

3:322 第 3 巻 : 命令形式<br />

x 6<br />

ビット 32:31<br />

0 1 2 3<br />

0 break.b B9 epc B8<br />

間接分岐<br />

( 表 4-49)<br />

1 e 間接リターン<br />

( 表 4-50)<br />

2 cover B8<br />

3<br />

4 clrrrb B8<br />

5 clrrrb.pr B8<br />

6<br />

7<br />

8 rfi B8<br />

9<br />

A<br />

B<br />

C bsw.0 B8<br />

D bsw.1 B8<br />

E<br />

F<br />

x 6<br />

ビット 32:27<br />

0 20<br />

e e e<br />

e e e e<br />

e e e<br />

e e e<br />

e e e e<br />

e e e e<br />

e e e<br />

e e e<br />

e e e e<br />

e e e e<br />

e e e<br />

e e e<br />

e e e e<br />

e e e e<br />

btype<br />

ビット 8:6<br />

0 br.cond B4<br />

1 br.ia B4<br />

e<br />

2<br />

e<br />

3<br />

e<br />

4<br />

e<br />

5<br />

e<br />

6<br />

e<br />

7<br />

e<br />

e


メジャー ・ オペコード 0 の中にエン コ ー ド さ れる間接 リ タ ー ン分岐命令は、 表 4-50 に示<br />

すように、 分岐のタイプを区別するために、 ビッ ト 8:6(btype) に 3 ビッ トのオペコード拡<br />

張フ ィ ール ド を使用する。<br />

表 4-50. 間接リターン分岐タイプ<br />

オペコード・<br />

ビット 40:37<br />

x 6<br />

ビット 32:27<br />

0 21<br />

btype<br />

ビット 8:6<br />

0 e<br />

1 e<br />

2 e<br />

3 e<br />

4 br.ret B4<br />

5 e<br />

6 e<br />

7 e<br />

すべての分岐命令は、 シ ー ケ ン シ ャ ル ・ プ リ フ ェ ッ チ ・ ヒ ン ト を提供する 1 ビッ トのオペ<br />

コード拡張フィールドをビッ ト 12 に持つ。 表 4-51 に こ れ ら の割 り 当てを要約す る。<br />

表 4-51. シーケンシャル・プリフェッチ・ヒント・コンプリータ<br />

p<br />

ビット 12<br />

ph<br />

0 .few<br />

1 .many<br />

IP 相対お よ び間接分岐命令は、 いずれ も 表 4-52 に示した分岐予測有無 ヒ ン ト 情報をエン<br />

コードする 2 ビッ トのオペコード拡張フィールドをビット 34:33(wh) に持つ。 間接コ ール<br />

命令は、 表 4-53 に示すよ う に、 " 有無 " ヒント情報を提供する 3 ビッ トのオペコード拡張<br />

フィールドをビット 34:32(wh) に持つ。<br />

表 4-52. 分岐有無ヒント・コンプリータ<br />

wh<br />

ビット 34:33<br />

bwh<br />

0 .sptk<br />

1 .spnt<br />

2 .dptk<br />

3 .dpnt<br />

第 3 巻 : 命令形式 3:323


表 4-53. 間接コール有無ヒント・コンプリータ<br />

ま た、 分岐命令は、 表 4-54 に示すよ う に、 分岐キャ ッ シュ割り当て解除ヒ ン ト をエン コ ー<br />

ドする 1 ビッ トのオペコード拡張フィールドをビッ ト 35(d) に持つ。<br />

4.5.1.1 IP-Relative Branch<br />

B1<br />

4.5.1.2 IP-Relative Counted Branch<br />

B2<br />

wh<br />

ビット 34:32<br />

bwh<br />

0<br />

1 .sptk<br />

2<br />

3 .spnt<br />

4<br />

5 .dptk<br />

6<br />

7 .dpnt<br />

表 4-54. 分岐キャッシュ割り当て解除ヒント・コンプリータ<br />

d<br />

ビット 35<br />

dh<br />

0 none<br />

1 .clr<br />

40 37 36 35 34 33 32 13 12 11 9 8 6 5 0<br />

4 s d wh imm20b p btype qp<br />

4 1 1 2 20 1 3 3 6<br />

命令<br />

br.cond.bwh.ph.dh e<br />

e t<br />

br.wexit.bwh.ph.dh<br />

e t<br />

br.wtop.bwh.ph.dh<br />

オペ<br />

ランド<br />

target 25<br />

オペ<br />

コード<br />

拡張<br />

btype p wh d<br />

3:324 第 3 巻 : 命令形式<br />

4<br />

0 3:323 ペー<br />

2<br />

ジの表<br />

4-51 を<br />

3 参照<br />

3:323 ペー<br />

ジの表<br />

4-52 を<br />

参照<br />

3:324 ペー<br />

ジの表<br />

4-54 を<br />

参照<br />

40 37 36 35 34 33 32 13 12 11 9 8 6 5 0<br />

4 s d wh imm20b p btype 0<br />

4 1 1 2 20 1 3 3 6<br />

命令<br />

e t<br />

br.cloop.bwh.ph.dh<br />

br.cexit.bwh.ph.dh t<br />

br.ctop.bwh.ph.dh t<br />

オペ<br />

ランド<br />

target 25<br />

オペ<br />

コード<br />

4<br />

拡張<br />

btype p wh d<br />

5 3:323 ペー<br />

6<br />

ジの表<br />

4-51 を<br />

7<br />

参照<br />

3:323 ペー<br />

ジの表<br />

4-52 を<br />

参照<br />

3:324 ペー<br />

ジの表<br />

4-54 を<br />

参照


4.5.1.3 IP-Relative Call<br />

B3<br />

4.5.1.4 Indirect Branch<br />

B4<br />

4.5.1.5 Indirect Call<br />

B5<br />

4.5.2 分岐予測と nop<br />

40 37 36 35 34 33 32 13 12 11 9 8 6 5 0<br />

5 s d wh imm 20b p b 1 qp<br />

4 1 1 2 20 1 3 3 6<br />

命令 オペランド<br />

オペ<br />

コード<br />

br.call.bwh.ph.dh e b 1 = target 25 5<br />

p<br />

拡張<br />

wh d<br />

3:323 ページ<br />

の表 4-51 を<br />

参照<br />

3:323 ページ<br />

の表 4-52 を<br />

参照<br />

3:324 ページ<br />

の表 4-54 を<br />

参照<br />

40 37 36 35 34 33 32 27 26 16 15 13 12 11 9 8 6 5 0<br />

0 d wh x6 b2 p btype qp<br />

4 1 1 2 6 11 3 1 3 3 6<br />

命令 オペランド オペ<br />

コード<br />

br.cond.bwh.ph.dh e<br />

br.ia.bwh.ph.dh e<br />

br.ret.bwh.ph.dh e<br />

b 2<br />

拡張<br />

x6 btype p wh d<br />

分岐予測命令 と nop 命令は、メ ジ ャ ー・オペ コ ー ド 2 (Indirect Predict/Nop/Hint) とメジャー・<br />

オペコ ー ド 7 (IP-relative Predict) の中にエン コ ー ド される。 メ ジ ャ ー ・ オペコ ー ド 2 の間<br />

接予測命令 と nop 命令は、 ビ ッ ト 32:27(x 6 ) に 6 ビッ トのオペコード拡張フィールドを使<br />

用する。 表 4-55 にこれらの割り当てを要約する。<br />

第 3 巻 : 命令形式 3:325<br />

0<br />

20<br />

0<br />

1<br />

3:323<br />

ページの<br />

表 4-51 を<br />

21 4<br />

参照<br />

3:323<br />

ページの<br />

表 4-52 を<br />

参照<br />

3:324<br />

ページの<br />

表 4-54 を<br />

参照<br />

40 37 36 35 34 32 31 16 15 13 12 11 9 8 6 5 0<br />

1 d wh b2 p b1 qp<br />

4 1 1 3 16 3 1 3 3 6<br />

命令 オペランド オペ<br />

コード<br />

br.call.bwh.ph.dh e b 1 = b 2 1<br />

p<br />

拡張<br />

wh d<br />

3:323 ページの<br />

表 4-51 を参照<br />

3:324 ページの<br />

表 4-53 を参照<br />

3:324 ページの<br />

表 4-54 を参照


表 4-55. 間接予測 /nop のオペコード拡張<br />

オペコード・<br />

ビット 40:37<br />

2<br />

ビット<br />

30:27<br />

すべての分岐予測命令は、 ビ ッ ト 35(ih) に、 分岐重要度ヒ ン ト をエン コ ー ド する 1 ビッ ト<br />

のオペ コ ー ド 拡張フ ィ ー ル ド を持つ。 BR への移動命令 (3:291 ページ ) も、 ビッ ト 23 にこ<br />

のヒント を持つ。 表 4-56 は、 これらの割り当てを示している。<br />

表 4-56. 分岐重要度ヒント・コンプリータ<br />

ih<br />

ビット 23 または<br />

ビット 35<br />

IP 相対分岐予測命令は、 表 4-57 に示すよ う に、 ビ ッ ト 4:3(wh) に、 「分岐有無」 予測 ヒ ン<br />

ト情報をエンコードする 2 ビ ッ ト のオペ コ ー ド 拡張フ ィ ー ル ド を持つ。 ただし、 分岐有無<br />

ヒント ・ コンプリータ .loop または .exit と 重要度 ヒ ン ト ・ コ ンプ リ ー タ none を組み合わ<br />

せて使用した場合、 その結果は不定である。<br />

3:326 第 3 巻 : 命令形式<br />

x 6<br />

ビット 32:31<br />

0 1 2 3<br />

0 nop.b B9 brp B7<br />

1<br />

2<br />

3<br />

4<br />

5<br />

6<br />

7<br />

8<br />

9<br />

A<br />

B<br />

C<br />

D<br />

E<br />

F<br />

hint.b B9 brp.ret B7<br />

ih<br />

0 none<br />

1 .imp<br />

表 4-57. IP 相対分岐有無予測ヒント・コンプリータ<br />

wh<br />

ビット 4:3<br />

ipwh<br />

0 .sptk<br />

1 .loop<br />

2 .dptk<br />

3 .exit


間接分岐予測命令は、 表 4-58 に示すよ う に、 ビ ッ ト 4:3(wh) に、 「分岐有無」 予測ヒ ン ト<br />

情報をエン コ ー ド す る 2 ビットのオペコード拡張フィールドを持つ。<br />

表 4-58. 間接分岐有無予測ヒント・コンプリータ<br />

4.5.2.1 IP-Relative Predict<br />

B6<br />

4.5.2.2 Indirect Predict<br />

B7<br />

wh<br />

ビット 4:3<br />

4.5.3 その他の B ユニット命令<br />

indwh<br />

0 .sptk<br />

1<br />

2 .dptk<br />

3<br />

40 37 36 35 34 33 32 13 12 6 5 4 3 2 0<br />

7 s ih t2e imm20b timm7a wh<br />

4 1 1 2 20 7 1 2 3<br />

命令 オペランド<br />

オペ<br />

コード<br />

brp.ipwh.ih target 25 , tag 13 7<br />

拡張<br />

ih wh<br />

3:326 ページの表<br />

4-56 を参照<br />

3:326 ページの表<br />

4-57 を参照<br />

40 37 36 35 34 33 32 27 26 16 15 13 12 6 5 4 3 2 0<br />

2 ih t 2e x 6 b 2 timm 7a wh<br />

4 1 1 2 6 11 3 7 1 2 3<br />

brp.indwh.ih<br />

命令 オペランド<br />

オペ<br />

コード<br />

10<br />

b2 , tag13 2<br />

brp.ret.indwh.ih 11<br />

拡張<br />

x6 ih wh<br />

3:326 ページの表<br />

4-56 を参照<br />

3:327 ページの表<br />

4-58 を参照<br />

その他の分岐ユニッ ト命令には、 3:322 ページの表 4-48 で説明している よ う に、 ビ ッ ト<br />

32:27(x 6 ) に 6 ビットのオペコード拡張フィールドを使用する、メジャー・オペコード 0 の<br />

中にエンコ ー ド された命令をい く つか含んでいる。<br />

第 3 巻 : 命令形式 3:327


4.5.3.1 Miscellaneous (B ユニット )<br />

B8<br />

4.5.3.2 Break/Nop/Hint (B ユニット )<br />

B9<br />

40 37 36 33 32 27 26 6 5 0<br />

0 x 6 0<br />

4 4 6 21 6<br />

拡張<br />

命令 オペコード<br />

x6 cover l<br />

02<br />

clrrrb<br />

0<br />

l<br />

04<br />

clrrrb.pr l<br />

05<br />

e l p<br />

rfi 08<br />

l p<br />

bsw.0 0C<br />

l p<br />

bsw.1 0D<br />

epc 10<br />

40 37 36 35 33 32 27 26 25 6 5 0<br />

0/2 i x 6 imm 20a qp<br />

4 1 3 6 1 20 6<br />

拡張<br />

命令 オペランド オペコード<br />

x6 break.b e<br />

nop.b<br />

hint.b<br />

imm21 0<br />

2<br />

00<br />

01<br />

4.6 F ユニット命令エンコーディング<br />

浮動小数点命令は、 浮動小数点お よ び固定小数点算術演算では メ ジ ャ ー ・ オペ コ ー ド 8-E、<br />

浮動小数点比較では オペ コ ー ド 4、 浮動小数点分類では オペ コ ー ド 5、 その他の浮動小数<br />

点命令は オペ コ ー ド 0 と 1 の中にエン コ ー ド される。<br />

その他の浮動小数点命令 と 浮動小数点逆数近似命令は、 メ ジ ャ ー ・ オペ コ ー ド 0 と 1 の中<br />

にエンコー ド される。 ビ ッ ト 33 に 1 ビッ トのオペコード拡張フィールド (x) を使用し、 さ<br />

らにビッ ト 36(q) に 1 ビッ トの拡張フィールドか、 ビッ ト 32:27 に 6 ビッ トのオペコード<br />

拡張フ ィ ー ル ド (x6) を使用する。 表 4-59 に 1 ビッ トのx の割 り 当てを示し、 表 4-62 に逆<br />

数近似命令のための追加の 1 ビッ トのq の割 り 当てを示す。 表 4-60 と 表 4-61 は、 6 ビッ<br />

トのx6 の割 り 当てを要約してい る。<br />

表 4-59. その他の浮動小数点の 1 ビット・オペコード拡張<br />

オペコード・<br />

ビット 40:37<br />

0<br />

1<br />

x<br />

ビット 33<br />

0 6 ビット拡張 ( 表 4-60)<br />

1 逆数近似 ( 表 4-62)<br />

0 6 ビット拡張 ( 表 4-61)<br />

1 逆数近似 ( 表 4-62)<br />

3:328 第 3 巻 : 命令形式


表 4-60. オペコード 0 のその他の浮動小数点の 6 ビット・オペコード拡張<br />

オペ<br />

コード・<br />

ビット<br />

40:37<br />

x<br />

ビット<br />

33<br />

0 0<br />

ビット<br />

30:27<br />

第 3 巻 : 命令形式 3:329<br />

x 6<br />

0<br />

ビット 32:31<br />

1 2 3<br />

0 break.f F15 fmerge.s F9<br />

1 1 ビット拡張 ( 表 4-69) fmerge.ns F9<br />

2 fmerge.se F9<br />

3<br />

4 fsetc F12 fmin F8 fswap F9<br />

5 fclrf F13 fmax F8 fswap.nl F9<br />

6 famin F8 fswap.nr F9<br />

7 famax F8<br />

8 fchkf F14 fcvt.fx F10 fpack F9<br />

9 fcvt.fxu F10 fmix.lr F9<br />

A fcvt.fx.trunc F10 fmix.r F9<br />

B fcvt.fxu.trunc F10 fmix.l F9<br />

C fcvt.xf F11 fand F9 fsxt.r F9<br />

D fandcm F9 fsxt.l F9<br />

E for F9<br />

F fxor F9<br />

表 4-61. オペコード 1 のその他の浮動小数点の 6 ビット・オペコード拡張<br />

オペ<br />

コード・<br />

ビット<br />

40:37<br />

x<br />

ビット<br />

33<br />

1 0<br />

ビット<br />

30:27<br />

x 6<br />

0<br />

ビット 32:31<br />

1 2 3<br />

0 fpmerge.s F9 fpcmp.eq F8<br />

1 fpmerge.ns F9 fpcmp.lt F8<br />

2 fpmerge.se F9 fpcmp.le F8<br />

3<br />

fpcmp.unord<br />

F8<br />

4 fpmin F8 fpcmp.neq F8<br />

5 fpmax F8 fpcmp.nlt F8<br />

6 fpamin F8 fpcmp.nle F8<br />

7 fpamax F8 fpcmp.ord F8<br />

8 fpcvt.fx F10<br />

9 fpcvt.fxu F10<br />

A fpcvt.fx.trunc F10<br />

B fpcvt.fxu.trunc F10<br />

C<br />

D<br />

E<br />

F


表 4-62. 逆数近似の 1 ビット・オペコード拡張<br />

4.6.1 算術演算<br />

オペコード・<br />

ビット 40:37<br />

0<br />

1<br />

x<br />

ビット 33<br />

1<br />

q<br />

ビット 36<br />

0 frcpa F6<br />

1 frsqrta F7<br />

0 fprcpa F6<br />

1 fprsqrta F7<br />

ほ と ん ど の浮動小数点命令は、 使用す る FPSR ステータス・ フ ィ ールド をエンコー ドする<br />

2 ビットのオペコード拡張フィールドをビッ ト 35:34(sf) に持つ。 表 4-63 にこれらの割り<br />

当てを要約する。<br />

表 4-63. 浮動小数点ステータス・フィールド・コンプリータ<br />

sf<br />

ビット 35:34<br />

sf<br />

0 .s0<br />

1 .s1<br />

2 .s2<br />

3 .s3<br />

浮動小数点算術命令は、 メ ジ ャ ー ・ オペ コ ー ド 8-D の中にエン コ ー ド される。 ビ ッ ト 36<br />

に 1 ビッ トのオペコード拡張フィールド (x) を、 ビ ッ ト 35:34 に 2 ビッ トのオペコード拡<br />

張フ ィ ール ド (sf) を使用する。 表 4-64 にオペコー ド と x の割り当てを示す。<br />

表 4-64. 浮動小数点算術の 1 ビット・オペコード拡張<br />

x<br />

ビット<br />

36<br />

オペコード・<br />

ビット 40:37<br />

8 9 A B C D<br />

0 fma F1 fma.d F1 fms F1 fms.d F1 fnma F1 fnma.d F1<br />

1 fma.s F1 fpma F1 fms.s F1 fpms F1 fnma.s F1 fpnma F1<br />

固定小数点算術命令 と 並列浮動小数点選択命令は、 ビ ッ ト 36 に 1 ビッ トのオペコード拡<br />

張フ ィ ール ド (x) を使用して、 メジ ャ ー ・ オペコ ー ド E の中にエン コ ー ド される。 また、<br />

固定小数点算術命令は、ビ ッ ト 35:34 に 2 ビットのオペコード拡張フィールド (x 2 ) を持つ。<br />

表 4-65 にこれらの割り当てを示す。<br />

表 4-65. 固定小数点の積和および選択のオペコード拡張<br />

オペコード・<br />

ビット 40:37<br />

E<br />

x<br />

ビット<br />

36<br />

x2 ビット 35:34<br />

0 1 2 3<br />

0 fselect F3<br />

1 xma.l F2 xma.hu F2 xma.h F2<br />

3:330 第 3 巻 : 命令形式


4.6.1.1 Floating-point Multiply Add<br />

F1<br />

4.6.1.2 Fixed-point Multiply Add<br />

F2<br />

4.6.2 並列浮動小数点 Select<br />

F3<br />

4.6.3 比較と分類<br />

40 37 36 35 34 33 27 26 20 19 13 12 6 5 0<br />

8 - D x sf f4 f3 f2 f1 qp<br />

4 1 2 7 7 7 7 6<br />

命令 オペランド オペコード<br />

fma.sf<br />

fma.s.sf<br />

8<br />

0<br />

1<br />

fma.d.sf<br />

fpma.sf<br />

9<br />

0<br />

1<br />

fms.sf<br />

fms.s.sf<br />

fms.d.sf<br />

fpms.sf<br />

f1 = f3 , f4 , f2 A<br />

B<br />

0<br />

1<br />

0<br />

1<br />

fnma.sf<br />

fnma.s.sf<br />

C<br />

0<br />

1<br />

fnma.d.sf<br />

fpnma.sf<br />

D<br />

0<br />

1<br />

拡張<br />

x sf<br />

3:330 ページの表<br />

4-63 を参照<br />

40 37 36 35 34 33 27 26 20 19 13 12 6 5 0<br />

E x x2 f4 f3 f2 f1 qp<br />

4 1 2 7 7 7 7 6<br />

拡張<br />

命令 オペランド オペコード<br />

x x2 xma.l<br />

0<br />

xma.h f1 = f3 , f4 , f2 E 1<br />

3<br />

xma.hu 2<br />

40 37 36 35 34 33 27 26 20 19 13 12 6 5 0<br />

E x f 4 f 3 f 2 f 1 qp<br />

4 1 2 7 7 7 7 6<br />

命令 オペランド オペコード<br />

fselect f 1 = f 3 , f 4 , f 2 E 0<br />

プ レ デ ィ ケ ー ト を設定す る浮動小数点比較命令は、 メ ジ ャ ー ・ オペ コ ー ド 4 の中にエン<br />

コードされる。 ビッ ト 33(r a)、 36(r b)、 12(t a) に 3 つの 1 ビッ ト ・オペコード拡張フィール<br />

ドを使用し、 ビット 35:34 に 2 ビッ トのオペコード拡張フィールド (sf) を使用する。 表<br />

4-66 にオペコー ド r a、 r b、 t a の割 り 当てを示す。 sf の割り当ては、 3:330 ページの表 4-63<br />

に示している。<br />

第 3 巻 : 命令形式 3:331<br />

拡張<br />

x


並列浮動小数点比較命令については、 3:334 ページで説明する。<br />

表 4-66. 浮動小数点比較のオペコード拡張<br />

浮動小数点分類命令は、 メ ジ ャ ー ・ オペ コ ー ド 5 の中にエン コ ー ド される。 表 4-67 に示<br />

すように、 ビッ ト 12(t a ) に 1 ビットのオペコード拡張フィールドを使用する。<br />

4.6.3.1 Floating-point Compare<br />

F4<br />

4.6.3.2 Floating-point Class<br />

F5<br />

オペコード・<br />

ビット 40:37<br />

4<br />

r a<br />

ビット<br />

33<br />

0<br />

1<br />

r b<br />

ビット<br />

36<br />

表 4-67. 浮動小数点分類の 1 ビット・オペコード拡張<br />

オペコード・<br />

ビット 40:37<br />

5<br />

ta ビット 12<br />

0 1<br />

0 fcmp.eq F4 fcmp.eq.unc F4<br />

1 fcmp.lt F4 fcmp.lt.unc F4<br />

0 fcmp.le F4 fcmp.le.unc F4<br />

1 fcmp.unord F4 fcmp.unord.unc F4<br />

t a<br />

ビット 12<br />

0 fclass.m F5<br />

1 fclass.m.unc F5<br />

40 37 36 35 34 33 32 27 26 20 19 13 12 11 6 5 0<br />

4 r b sf r a p 2 f 3 f 2 t a p 1 qp<br />

4 1 2 1 6 7 7 1 6 6<br />

命令 オペランド オペコード<br />

fcmp.eq.sf<br />

0<br />

0<br />

fcmp.lt.sf 1<br />

fcmp.le.sf<br />

fcmp.unord.sf<br />

fcmp.eq.unc.sf<br />

fcmp.lt.unc.sf<br />

p1 , p2 = f2 , f3 4<br />

1<br />

0<br />

0<br />

1<br />

0<br />

1<br />

fcmp.le.unc.sf<br />

fcmp.unord.unc.sf<br />

1<br />

0<br />

1<br />

ra rb 拡張<br />

ta sf<br />

3:332 第 3 巻 : 命令形式<br />

0<br />

1<br />

3:330 ページの<br />

表 4-63 を参照<br />

40 37 36 35 34 33 32 27 26 20 19 13 12 11 6 5 0<br />

5 fc2 p2 fclass7c f2 ta p1 qp<br />

4 2 2 6 7 7 1 6 6<br />

拡張<br />

命令 オペランド オペコード<br />

ta fclass.m<br />

fclass.m.unc<br />

p1 , p2 = f2 , fclass9 5<br />

0<br />

1


4.6.4 近似<br />

4.6.4.1 Floating-point Reciprocal Approximation<br />

F6<br />

逆数近似命令は 2 つ存在する。 第 1 のメジャー ・ オペコー ド 0 に含まれる命令は、 フル ・<br />

レジスタ形式をエンコードする。 第2 のメジャー ・オペコー ド 1 に含まれる命令は、 並列<br />

形式をエン コ ー ド す る。<br />

4.6.4.2 Floating-point Reciprocal Square Root Approximation<br />

F7<br />

40 37 36 35 34 33 32 27 26 20 19 13 12 6 5 0<br />

0 - 1 q sf x p2 f3 f2 f1 qp<br />

4 1 2 1 6 7 7 7 6<br />

frcpa.sf<br />

命令 オペランド オペコード<br />

f 1 , p 2 = f 2 , f 3<br />

fprcpa.sf 1<br />

拡張<br />

x q sf<br />

平方根逆数近似命令は 2 つ存在する。 第 1 のメジャー ・ オペコー ド 0 に含まれる命令は、<br />

フル ・ レジスタ形式をエンコー ドする。 第 2 のメジャー ・ オペコー ド 1 に含まれる命令<br />

は、 並列形式をエン コ ー ド す る。<br />

第 3 巻 : 命令形式 3:333<br />

0<br />

1 0<br />

3:330 ページの表 4-63<br />

を参照<br />

40 37 36 35 34 33 32 27 26 20 19 13 12 6 5 0<br />

0 - 1 q sf x p 2 f 3 f 1 qp<br />

4 1 2 1 6 7 7 7 6<br />

frsqrta.sf<br />

命令 オペランド オペコード<br />

f 1 , p 2 = f 3<br />

fprsqrta.sf 1<br />

0<br />

拡張<br />

x q sf<br />

1 1<br />

3:330 ページの表 4-63<br />

を参照


4.6.5 最小値 / 最大値と並列比較<br />

F8<br />

最小値 / 最大値命令に は 2 つのグループがある。 第 1 のメジャー ・ オペコー ド 0 に含まれ<br />

るグループは、 フル・ レジスタ形式をエンコー ドする。 第2 のメジャー ・ オペコー ド 1 に<br />

含 まれる グル ー プは、 並列形式をエン コ ー ド す る。 並列比較命令はすべてメ ジ ャ ー ・ オペ<br />

コード 1 の中にエン コ ー ド される。<br />

40 37 36 35 34 33 32 27 26 20 19 13 12 6 5 0<br />

0 - 1 sf x x6 f3 f2 f1 qp<br />

4 1 2 1 6 7 7 7 6<br />

fmin.sf<br />

命令 オペランド オペコード<br />

fmax.sf<br />

famin.sf<br />

0<br />

15<br />

16<br />

famax.sf 17<br />

fpmin.sf<br />

14<br />

fpmax.sf 15<br />

fpamin.sf 16<br />

fpamax.sf<br />

fpcmp.eq.sf<br />

f1 = f2 , f3 0<br />

17<br />

30<br />

fpcmp.lt.sf<br />

fpcmp.le.sf<br />

1<br />

31<br />

32<br />

fpcmp.unord.sf 33<br />

fpcmp.neq.sf 34<br />

fpcmp.nlt.sf 35<br />

fpcmp.nle.sf 36<br />

fpcmp.ord.sf 37<br />

拡張<br />

x x6 sf<br />

3:334 第 3 巻 : 命令形式<br />

14<br />

3:330 ページの表<br />

4-63 を参照


4.6.6 マージと論理<br />

F9<br />

4.6.7 変換<br />

4.6.7.1 Convert Floating-point to Fixed-point<br />

F10<br />

40 37 36 34 33 32 27 26 20 19 13 12 6 5 0<br />

0 - 1 x x6 f3 f2 f1 qp<br />

4 3 1 6 7 7 7 6<br />

拡張<br />

命令 オペランド オペコード<br />

x x6 fmerge.s<br />

10<br />

fmerge.ns 11<br />

fmerge.se 12<br />

fmix.lr 39<br />

fmix.r 3A<br />

fmix.l 3B<br />

fsxt.r 3C<br />

fsxt.l<br />

fpack<br />

0<br />

3D<br />

28<br />

fswap f1 = f2 , f3 0<br />

34<br />

fswap.nl 35<br />

fswap.nr 36<br />

fand 2C<br />

fandcm 2D<br />

for 2E<br />

fxor 2F<br />

fpmerge.s<br />

10<br />

fpmerge.ns 1<br />

11<br />

fpmerge.se 12<br />

40 37 36 35 34 33 32 27 26 20 19 13 12 6 5 0<br />

0 - 1 sf x x 6 f 2 f 1 qp<br />

4 1 2 1 6 7 7 7 6<br />

fcvt.fx.sf<br />

命令 オペランド オペコード<br />

fcvt.fxu.sf<br />

fcvt.fx.trunc.sf<br />

0<br />

19<br />

1A<br />

fcvt.fxu.trunc.sf<br />

fpcvt.fx.sf<br />

f1 = f2 0<br />

1B<br />

18<br />

fpcvt.fxu.sf<br />

fpcvt.fx.trunc.sf<br />

1<br />

19<br />

1A<br />

fpcvt.fxu.trunc.sf 1B<br />

拡張<br />

x x6 sf<br />

第 3 巻 : 命令形式 3:335<br />

18<br />

3:330 ページの表<br />

4-63 を参照


4.6.7.2 Convert Fixed-point to Floating-point<br />

F11<br />

4.6.8 ステータス・フィールド操作<br />

4.6.8.1 Floating-point Set Controls<br />

F12<br />

4.6.8.2 Floating-point Clear Flags<br />

F13<br />

4.6.8.3 Floating-point Check Flags<br />

F14<br />

40 37 36 34 33 32 27 26 20 19 13 12 6 5 0<br />

0 x x6 f2 f1 qp<br />

4 3 1 6 7 7 7 6<br />

命令 オペランド オペコード<br />

3:336 第 3 巻 : 命令形式<br />

拡張<br />

x x 6<br />

fcvt.xf f 1 = f 2 0 0 1C<br />

40 37 36 35 34 33 32 27 26 20 19 13 12 6 5 0<br />

0 sf x x 6 omask 7c amask 7b qp<br />

4 1 2 1 6 7 7 7 6<br />

命令 オペランド オペコード<br />

fsetc.sf amask 7 , omask 7 0 0 04<br />

拡張<br />

x x6 sf<br />

3:330 ページの<br />

表 4-63 を参照<br />

40 37 36 35 34 33 32 27 26 6 5 0<br />

0 sf x x 6 qp<br />

4 1 2 1 6 21 6<br />

命令 オペコード<br />

fclrf.sf 0 0 05<br />

拡張<br />

x x6 sf<br />

3:330 ページの表 4-63 を<br />

参照<br />

40 37 36 35 34 33 32 27 26 25 6 5 0<br />

0 s sf x x6 imm20a qp<br />

4 1 2 1 6 1 20 6<br />

命令 オペランド オペコード<br />

fchkf.sf target 25 0 0 08<br />

拡張<br />

x x6 sf<br />

3:330 ページの表<br />

4-63 を参照


4.6.9 その他の F ユニット命令<br />

4.6.9.1 Break (F ユニット )<br />

F15<br />

4.6.9.2 Nop/Hint (F ユニット )<br />

F ユニ ッ ト nop/hint 命令を メ ジ ャ ー ・ オペ コ ー ド 0 の中にエン コ ー ド する際は、 ビ ッ ト<br />

35:33(x 3) 内の 3 ビッ ト ・オペコード拡張フィールド、 ビット 32:27(x 6) 内の 6 ビッ ト ・オ<br />

ペ コ ー ド 拡張フ ィ ー ル ド 、 ビ ッ ト 30:27(x 4 ) 内の 4 ビッ ト ・オペコード拡張フィールド、<br />

ビッ ト 26(y) 内の 1 ビ ッ ト ・ オペコ ー ド拡張フ ィ ール ド が使用される ( 表 4-46 を参照 )。<br />

F16<br />

40 37 36 35 34 33 32 27 26 25 6 5 0<br />

4.7 X ユニット命令エンコーディング<br />

X ユニッ ト 命令は、 L と X の 2 つの命令スロ ッ ト を占有する。 メジ ャ ー ・ オペコ ー ド 、 オ<br />

ペ コ ー ド 拡張 と ヒ ン ト 、 qp、 小さな即値フィールドがX 命令ス ロ ッ ト を占有す る。 movl、<br />

break.x、 nop.x では、 imm 41 フィールドが L 命令ス ロ ッ ト を占有する。 br1 では、 imm 39<br />

フィールドと 2 ビッ トの無視フィールドがL 命令ス ロ ッ ト を占有す る。<br />

4.7.1 その他の X ユニット命令<br />

0 i x x 6 imm 20a qp<br />

4 1 2 1 6 1 20 6<br />

拡張<br />

命令 オペランド オペコード<br />

x x6 break.f imm21 0 0 00<br />

表 4-68. 各種の M ユニット 1 ビット・オペコード拡張<br />

オペコード・<br />

ビット 40:37<br />

x<br />

ビット 33<br />

x 6<br />

ビット<br />

32:27<br />

0 0 01<br />

y<br />

ビット 26<br />

0 nop.f<br />

1 hint.f<br />

40 37 36 35 34 33 32 27 26 25 6 5 0<br />

0 i x x6 y imm20a qp<br />

4 1 2 1 6 1 20 6<br />

拡張<br />

命令 オペランド オペコード<br />

x x6y nop.f<br />

hint.f<br />

imm21 0 0 01<br />

0<br />

1<br />

その他の X ユニッ ト 命令は、 メジ ャ ー ・ オペコ ー ド 0 の中にエン コ ー ド される。 ビ ッ ト<br />

35:33 に 3 ビッ トのオペコード拡張フィールド (x 3 ) を、ビ ッ ト 32:27 に 6 ビッ トのオペコー<br />

ド拡張フィールド (x 6 ) を使用する。 表 4-69 に 3 ビッ トの割り当てを、 表 4-70 に 6 ビッ ト<br />

の割 り 当てを示す。 これら の命令は I ユニッ ト によ って実行される。<br />

第 3 巻 : 命令形式 3:337


表 4-69. その他の X ユニットの 3 ビット・オペコード拡張<br />

4.7.1.1 Break (X ユニット )<br />

X1<br />

オペコード・<br />

ビット 40:37<br />

0<br />

x 3<br />

ビット 35:33<br />

表 4-70. その他の X ユニットの 6 ビット・オペコード拡張<br />

オペコード・<br />

ビット 40:37<br />

x 3<br />

ビット<br />

35:33<br />

0 0<br />

ビット<br />

30:27<br />

0 break.x X1<br />

1<br />

2<br />

3<br />

4<br />

5<br />

6<br />

7<br />

8<br />

9<br />

A<br />

B<br />

C<br />

D<br />

E<br />

F<br />

0 6 ビット拡張 ( 表 4-70)<br />

1<br />

2<br />

3<br />

4<br />

5<br />

6<br />

7<br />

3:338 第 3 巻 : 命令形式<br />

x 6<br />

ビット 32:31<br />

0 1 2 3<br />

1 ビット拡張<br />

( 表 4-73)<br />

40 373635 3332 272625 6 5 0 40 0<br />

0 i x 3 x 6 imm 20a qp imm 41<br />

4 1 3 6 1 20 6 41<br />

拡張<br />

命令 オペランド オペコード<br />

x3 x6 break.x imm62 0 0 00


4.7.2 ロング型即値 64 移動<br />

X2<br />

ロ ン グ型即値移動命令は、 メ ジ ャ ー ・ オペ コ ー ド 6 の中にエン コ ー ド される。 表 4-71 に<br />

示すよ う に、 ビ ッ ト 20(v c ) に 1 ビ ッ ト の予約済みオペ コ ー ド 拡張を使用す る。 こ の命令は<br />

I ユニ ッ ト に よ って実行される。<br />

表 4-71. ロング型移動の 1 ビット・オペコード拡張<br />

オペコード・<br />

ビット 40:37<br />

4.7.3 ロング型分岐<br />

6<br />

v c<br />

ビット 20<br />

0 movl X2<br />

1<br />

40 373635 2726 22212019 1312 6 5 0 40 0<br />

6 i imm9d imm5c ic vc imm7b r1 qp imm41 4 1 9 5 1 1 7 7 6 41<br />

命令 オペランド オペコード<br />

movl i r 1 = imm 64 6 0<br />

ロ ン グ型分岐は、 B ユニ ッ ト に よ っ て実行 される。 ロ ン グ型分岐にはオペ コ ー ド C が使用<br />

され、 ロング型呼び出しにはオペコー ド D が使用される。<br />

メジャー ・ オペコード C の中にエン コ ー ド さ れたロ ン グ型分岐命令は、 表 4-72 に示すよ<br />

うに、 ビッ ト 8:6(btype) に 3 ビットのオペコード拡張フィールドを使用して、 分岐タイプ<br />

を区別する。<br />

表 4-72. ロング型分岐タイプ<br />

オペコード・<br />

ビット 40:37<br />

C<br />

btype<br />

ビット 8:6<br />

0 brl.cond X3<br />

1<br />

2<br />

3<br />

4<br />

5<br />

6<br />

7<br />

ロ ン グ型分岐命令は、 ビ ッ ト 12(p)、 ビッ ト 34:33(wh)、 ビ ッ ト 35(d) に、 通常の IP 相対分<br />

岐と同じオペコー ド ・ ヒント ・ フ ィ ールドを持つ。 3:323 ページの表 4-51、 3:323 ページ<br />

の表 4-52、 3:324 ページの表 4-54 に、 これらのヒ ン ト を示す。<br />

第 3 巻 : 命令形式 3:339<br />

拡張<br />

vc


4.7.3.1 Long Branch<br />

X3<br />

4.7.3.2 Long Call<br />

X4<br />

4.7.4 Nop/Hint (X ユニット )<br />

X5<br />

40 373635343332 131211 9 8 6 5 0 40 2 1 0<br />

C i d wh imm 20b p btype qp imm 39<br />

4 1 1 2 20 1 3 3 6 39 2<br />

命令 オペランド オペ<br />

コード<br />

brl.cond.bwh.ph.dh e l target 64 C 0<br />

拡張<br />

btype p wh d<br />

3:323 ページの<br />

表 4-51 を参照<br />

3:323 ページの<br />

表 4-52 を参照<br />

3:324 ページの<br />

表 4-54 を参照<br />

40 373635343332 131211 9 8 6 5 0 40 2 1 0<br />

D i d wh imm 20b p b 1 qp imm 39<br />

4 1 1 2 20 1 3 3 6 39 2<br />

命令 オペランド<br />

オペ<br />

コード<br />

brl.call.bwh.ph.dh e l b 1 = target 64 D<br />

p<br />

拡張<br />

wh d<br />

3:323 ページの<br />

表 4-51 を参照<br />

3:323 ページの<br />

表 4-52 を参照<br />

3:324 ページの<br />

表 4-54 を参照<br />

X ユニ ッ ト nop/hint 命令を メ ジ ャ ー ・ オペ コ ー ド 0 の中にエン コ ー ド する際は、 ビ ッ ト<br />

35:33(x 3 ) 内の 3 ビッ ト ・オペコード拡張フィールド、 ビット 32:27(x 6 ) 内の 6 ビッ ト ・オ<br />

ペ コ ー ド 拡張フ ィ ー ル ド 、 ビ ッ ト 30:27(x 4 ) 内の 4 ビッ ト ・オペコード拡張フィールド、<br />

ビッ ト 26(y) 内の 1 ビ ッ ト ・ オペコ ー ド拡張フ ィ ールド が使用される ( 表 4-73 を参照 )。<br />

これらの命令は、 I ユニ ッ ト で実行される。<br />

表 4-73. 各種の M ユニット 1 ビット・オペコード拡張<br />

オペコード・<br />

ビット 40:37<br />

x 3<br />

ビット 35:33<br />

x 6<br />

ビット 32:27<br />

0 0 01<br />

y<br />

ビット 26<br />

0 nop.m<br />

1 hint.m<br />

40 373635 3332 272625 6 5 0 40 0<br />

0 i x3 x6 y imm20a qp imm41 4 1 3 6 1 20 6 41<br />

命令 オペランド オペコード<br />

x3 Extension<br />

x6 y<br />

nop.x<br />

hint.x<br />

imm62 0 0 01<br />

0<br />

1<br />

3:340 第 3 巻 : 命令形式


4.8 即値の生成<br />

表 4-74 は、 1 つ ま たは複数の即値を持つ個々の命令について、 それ ら の即値の生成方法を<br />

示している。 個々の式で、 等号の左辺のシンボルはその即値のアセンブ リ 言語名である。<br />

右辺のシ ン ボルは、 命令エン コ ー デ ィ ン グにおけ る フ ィ ー ル ド 名である。<br />

表 4-74. 即値の生成<br />

命令形式 即値の生成<br />

A2 count2 = ct2d + 1<br />

A3 A8 I27 M30 imm8 = sign_ext(s


表 4-74. 即値の生成 ( 続き )<br />

命令形式 即値の生成<br />

M34<br />

il = sol<br />

o = sof - sol<br />

r = sor


0<br />

リソースと依存関係のセマンティックス 5<br />

5.1 リソースの読み込みおよび書き込み<br />

Itanium ® 命令は、 (1) 修飾プ レデ ィ ケ ー ト が 1 の場合、 (2) 修飾プ レデ ィ ケ ー ト が存在しな<br />

い場合、 (3) 修飾プ レデ ィ ケ ー ト が 0 であ って も それが リ ソ ー スを読み込む命令の一つで<br />

ある場合、 (4) 命令の実行がその リ ソ ースに依存している場合に リ ソ ースのリーダ と呼ば<br />

れる。<br />

Itanium 命令は、 (1) 修飾プ レ デ ィ ケ ー ト が 1 の場合、 (2) 命令が修飾プ レデ ィ ケ ー ト を持<br />

たない場合、 (3) 修飾プ レデ ィ ケ ー ト が 0 であ っ て も リ ソ ー ス を書き込む場合、 (4) 命令の<br />

実行に よ っ てその リ ソ ー スが書き込 ま れる場合に リ ソ ー スのライタ と呼ばれる。<br />

Itanium 命令は、 次の場合であ っ て も リ ソ ー スの リ ー ダ ま たは ラ イ タ と 呼ばれる。 (1) その<br />

リ ソ ー ス に依存する と き があ る場合、 (2) リ ソースを読み込むのか書き込むのかを静的に<br />

決定で き ない場合。 例えば、 cover が CR[IFS] を書き込むのは PSR.ic が 0 の場合のみで<br />

あ る。 しかし、 依存関係の目的で、 cover は常に リ ソースを書き込むものであるかのよ<br />

う に扱われる。 なぜな ら 、 こ の条件は静的に決定で き ないか ら であ る。 一方 rsm は、 命<br />

令内の即値 と してエン コ ー ド さ れる マス ク に応じ て、 条件付き で PSR にい く つかのビッ トを書き込む。 書き込まれる PSR ビッ トは、 エンコードされた命令を検査して決定でき<br />

る。 そのためこの命令は、 対応するマスク・ビッ ト ・セットを持つビッ トを書き込むもの<br />

と してのみ扱われる。 こ れ ら の一般規則に対する例外はすべて、 こ の付録で説明してい る。<br />

5.2 依存関係とシリアル化<br />

RAW ( リード・アフター・ライト ) の依存関係は、 先頭のイベン ト が リ ソ ースのラ イ タで<br />

あり、 2 番目の イベン ト が同じ リ ソ ー スの リ ー ダであ る よ う な 2 つのイベン ト のシーケン<br />

スである。 イベン ト の例と しては、 命令、 割り込み、 または命令ス ト リ ーム ・ フ ェ ッチや<br />

VHPT ウ ォ ー ク の よ う な リ ソ ー スのその他の 「使用」 な ど がある。 表 5-2 は、 命令の リ ー<br />

ダお よ び ラ イ タ に基づ く 依存関係のみを示してい る。<br />

WAW ( ライト ・アフター ・ ライト ) の依存関係は、 両方のイベン ト が問題の リ ソ ースを<br />

書き込むよ うな 2 つのイベン ト のシーケンスである。 イベン ト の例としては、 命令、 割り<br />

込み、 ま たは リ ソ ー スのその他の 「更新」 などがある。 表 5-3 は、 命令のライタに基づ く<br />

依存関係のみを示している。<br />

WAR ( ライ ト ・アフター ・ リード ) の依存関係は、 先頭の命令が リ ソ ー スの リ ー ダであ<br />

り、 2 番目の命令が同じ リ ソ ー スの ラ イ タ であ る よ う な 2 つの命令のシーケンスである。<br />

こ の よ う な依存関係は、 表 5-4 で示す場合を除いて常に許可され、 命令の リ ーダおよ びラ<br />

イタに関連するものだけが含まれる。<br />

RAR ( リード ・アフター・ リード ) の依存関係は、 両方の命令が同じ リ ソ ー スの リ ー ダで<br />

あるよ うな 2 つの命令のシ ー ケ ン スであ る。 こ の よ う な依存関係は常に許可 さ れる。<br />

一般に RAW および WAW の依存関係は、 特定のタ イプのシ リ アル化イベン ト ( 先頭の書<br />

き込み命令の後の暗黙、 デー タ、 または命令のシ リ アル化 ) なしでは許可されない ( シリ<br />

アル化の詳細は、 第 2 巻、 第 1 部の 3.2 節 「シ リアル化」 を参照 )。 こ の付録の表およ び<br />

関連す る規則では、 リ ソ ー スの リ ー ダ と ラ イ タ について詳細に説明す る。 ま た、 観察対象<br />

の依存関係で必要なシ リ アル化や必要なシ リ アル化が満たされない場合に起こ り得る結<br />

果について も 説明す る。特定の未許可の依存関係を検査しないマシ ンの コ ー ド を タ ー ゲ ッ<br />

ト にする場合であっても、 コー ド ・シーケンスはアーキテクチャ的には未定義と見なされ<br />

第 3 巻 : リソースと依存関係のセマンティックス 3:343


る。 ま た、 その よ う な コ ー ド ・ シ ー ケ ン ス に よ っ て、 同じ プ ロ グ ラ ムの実行中、 プ ロ セ ッ<br />

サ間で、 オペレーテ ィ ング ・ システム間で、 さらにはコー ド ・ シーケンスの個別の実行の<br />

間で さ え も 、 コ ー ド の動作が異な る と き がある。 各種のシ リ アル化に よ っ て、 さ ま ざ ま で<br />

はあるが明確な結果が得 ら れる場合 も あ る。<br />

アプ リ ケーシ ョ ン ・ レベル ( 非特権 ) のリソースのシリアル化は、 常に暗黙指定される。<br />

つ ま り、その リ ソ ースのラ イ タおよ びその同じ リ ソ ースの後続の読み込みが別々の命令グ<br />

ル ー プ内にあ る場合、 リ ー ダは書き込 ま れた値を検出す る。 ま た、 ラ イ タ が非分岐命令で<br />

あり、 リーダが分岐命令であるようなPR および BR に対する依存関係の場合、 ラ イ タ と<br />

リ ー ダは同じ命令グル ー プ内に存在する場合がある。<br />

通常、 シ ス テ ム ・ リ ソ ー ス は、 明示的なシ リ アル化を必要 と す る。 つ ま り 、 その リ ソ ー ス<br />

の書き込みおよ び読み込みの間で srlz.i 命令ま たは srlz.d 命令を使用する必要があ<br />

る。 CR への RAW アクセスは例外でないこ と に注意する必要がある。 これらのアクセス<br />

では、 明示的なデー タ ま たは命令のシ リ アル化が必要 と な る。 ただし、 命令のペアが同じ<br />

リ ソ ー ス を明示的にエン コ ー ド す る よ う な場合 (CR 以外 )、シ リ アル化は暗黙指定される。<br />

シ リ アル化を省略する こ とがアーキテ クチャ的に許可され、 CPU からの応答をアトミ ッ<br />

ク ( 古い状態ま たは新しい状態のいずれか一方のみ ) にしなければならない場合が存在す<br />

る。 こ の付録の表は、 依存関係を常に観察す る こ と が望ま しい結果である仮定の元での依<br />

存関係要件を示してい る。 プ ロ グ ラ マは、 古い状態 ま たは新しい状態が使用されてい る か<br />

どうか、 そのような状況が許可されているかどうかを気にしなくてもよい場合があるが、<br />

検出 さ れる値は決定値 と はな ら ない。<br />

一方、 impliedF の依存関係が侵害 さ れた場合は、 プ ロ グ ラ ムが不適切に コ ー デ ィ ン グ さ<br />

れ、 プ ロ セ ッ サの動作が未定義 と な る。<br />

5.3 リソースと依存関係の表の形式についての注意事項<br />

• 依存関係表の 「ラ イ タ」 列 と 「 リ ー ダ」 列に は、 各命令ペー ジの形式セ ク シ ョ ン に<br />

示すよ う な命令ク ラ ス名およ び命令ニーモニ ッ ク ・ プ リ フ ィ ッ ク スが含まれている。<br />

あいまいさを避けるために、命令クラスは太字で示し、命令ニーモニック・プリ<br />

フ ィ ッ ク ス は通常の字体で示してい る。 命令ニ ー モニ ッ ク ・ プ リ フ ィ ッ ク スの場合、<br />

指定された名前に完全に一致する命令、 ま たは指定しテキス ト の後に 「.」、 さ ら に任<br />

意のテ キス ト が続 く 命令は一致す る。<br />

• スーパースク リプトが提示されない限り、 または 5.3.1 項の特別なケー スの命令規則<br />

のいずれかが適用されない限り、 命令の中でどの よ う な値がエン コ ー ド されて も、<br />

オペラ ン ド の中でどのよ う な動的な値が発生して も 、 リ ス ト した命令に対する依存<br />

関係は有効である。 リ ス ト された命令はそれで も、 修飾プレデ ィ ケー ト に関する規<br />

則に従う。<br />

• 命令ク ラスは、 関連する命令のグループである。 わか り やす く するために、 それら<br />

の名前は太字で示している。 命令ク ラ スはすべて表 5-5 に記載している。 同じ命令<br />

が複数の命令 ク ラ ス内に現れる場合があ り 、 命令 ク ラ スが他の ク ラ ス を含む よ う に<br />

拡張す る場合がある こ と に注意す る必要がある。 ま た完全に拡張した と き は、 一連<br />

のクラス ( 例:特定のリソースのリーダ) が同じ命令を何回も含む場合がある こ と に<br />

注意す る必要がある。<br />

• 構文 「x\y」 (x と y は と も に命令 ク ラ ス ) は、 命令 ク ラ ス x に含まれている命令の う<br />

ち、 命令クラス y には含まれていない も のをすべて包含する名前なし命令ク ラ スを<br />

示す。 同様に、 構文 「x\y\z」 は、 命令クラス x に含まれている命令の う ち、 命令ク<br />

ラス y または命令クラスz に含 ま れてい る も のを除いたすべての命令を意味する。<br />

• 表の個別の行のリソースは、 独立したリソースである。 このことは、 リソースの1 つ<br />

を参照する イベン ト が存在し、 その後に別の リ ソ ー スを使用する イベン ト が続 く 場合<br />

3:344 第 3 巻 : リソースと依存関係のセマンティックス


は、 シ リ アル化の要件が存在しない こ と を意味する。 リ ソ ー スが副行に分割された場<br />

合、 依存関係は副行内の命令間でのみ適用される。 副行内に現れない命令は、 問題の<br />

リ ソ ー ス に対して依存関係 ( リーダ/ ライタまたはライタ / ラ イ タの依存関係 ) を持<br />

たない。 ただし、 その他の特定の リ ソースに対しては依存関係を持つ場合がある。<br />

• 命令ペアについて リ ス ト さ れてい る、 各 リ ソ ー ス に対す る依存関係は固有ではない。<br />

同じ命令ペアが、 異なる依存関係セマンテ ィ ッ ク スを持つその他の リ ソ ー スに対し<br />

て も 依存関係を持つ場合があ る。 同じ命令ペアについて リ ソ ー ス依存関係が複数存<br />

在する場合は、 次の よ う な最 も 厳格なセマン テ ィ ッ ク スが想定 さ れる。 instr がデー<br />

タ をオーバーライ ドし、 そのデータが impliedF をオーバーライ ドし、 その impliedF<br />

が implied をオーバーライ ド し、 その implied が none をオーバーライ ドする。<br />

• 一連の番号付き リ ソ ー ス は、 リ ソ ー ス番号の代わ り に % 表記を使用して、 表の単一<br />

行内で示 される。 その場合、 表は、 各番号付き リ ソ ー スがその表内に独自の行を<br />

持っているかのよ うなセマンティ ッ クスになる。 したがって各番号付き リ ソースは<br />

独立した リ ソ ー ス と な る。 % が取り う る値の範囲は、 「リ ソース名」 列に示してい<br />

る。<br />

• 「リソース名」 列のアスタリスク 「*」 は、 関連する物理リ ソースをそのリ ソースが<br />

持つこ と はできないが、 特別な依存関係を強制するために追加されている こ と を示<br />

す。<br />

• 「リソース名」 列のポンド記号 「#」 は、 そのリ ソースが GR 内の値に よ ってイン<br />

デ ッ ク スが付け られた一連の リ ソ ースである こ と を示す。 一連の要素の中の個々の<br />

要素の番号は、 各 リ ソ ー スの詳細説明の中に記載してい る。<br />

• 「依存関係のセマン テ ィ ッ ク ス」 列は、 各種のシ リ アル化お よ び命令グルー プ境界条<br />

件が与え られた結果を示している。 各キーワー ド の正確な定義は、 表 5-1 に示して<br />

いる。<br />

表 5-1. 依存関係のセマンティックスのコード<br />

依存関係の<br />

セマンティックス<br />

のコード<br />

必要なシリアル化のタイプ シリアル化違反の結果<br />

instr 命令のシリアル化 ( 第 2 巻、第 1 部の<br />

3.2.1 項「命令のシリアル化」を参照 )。<br />

data データのシリアル化 ( 第 2 巻、第 1 部の<br />

3.2.2 項「データのシリアル化」を参照 )。<br />

implied 命令グループ・ブレーク。ライタとリーダ<br />

は、別々の命令グループ内に存在する必要<br />

がある ( 第 1 巻、第 1 部の 3.4 節「命令<br />

シーケンスの考慮事項」を参照 )。<br />

アトミック:不十分なシリアル化書き込み<br />

を 1 回以上行ってからリソースを読み込も<br />

うとすると、レジスタの以前の値 ( 任意の<br />

非シリアル化書き込みの前の )、または任<br />

意の非シリアル化書き込みのいずれかの値<br />

となる。返される値は予測できず、不十分<br />

なシリアル化読み込みを複数行うと異なる<br />

結果が得られる。不十分なシリアル化に<br />

よってフォルトは発生しない。<br />

impliedF 命令グループ・ブレーク ( 上記と同様 )。 未定義の値が返されるか、無効操作フォルト<br />

stop ストップ。ライタとリーダは、ストップに<br />

よって分離する必要がある。<br />

なし N/A N/A<br />

specific プロセッサ固有<br />

が発生する。フォルトが発生しない場合、返<br />

される値は予測できず、過去の書き込みと関<br />

連がない場合があるが、現在のプロセスがア<br />

クセスできるデータとはならない ( 例:<br />

PSR.cpl != 0 の場合、コントロール・レジス<br />

タによっては、返される未定義の値を読み込<br />

めない )。<br />

SC 特別なケース 本書の他の個所で説明。エントリの参照セ<br />

クションを参照のこと。<br />

第 3 巻 : リソースと依存関係のセマンティックス 3:345


5.3.1 特別なケースの命令規則<br />

次の規則は、 表 5-2、 表 5-3、 表 5-4、 または表 5-5 内の特定の命令に適用 さ れる。<br />

• 修飾プ レ デ ィ ケ ー ト が 1 であり、表の「リーダ」列に示されている命令は、常に所<br />

定の リ ソ ー スを読み込む ( 特に注記のない限 り )。 修飾プレディケートが1 であり、<br />

表の「ライタ」列に示されている命令は、常に所定のリソースを書き込む( 特に注<br />

記のない限り )。 修飾プレディ ケー トが 0 の命令は、 指定された リ ソ ースの読み込み<br />

も書き込み も行わない。 これらの規則は、 分岐およ びその修飾プレデ ィ ケ ー ト を含<br />

む。 unpredicatable-instructions クラス内の命令は、 修飾プレディケートを持たない<br />

ため、 常にそれらの リ ソースの読み込みまたは書き込みを行う ( 特に注記のない限<br />

り )。<br />

• mov-from-PR タイプの命令は、 その PR[qp] が true の場合は、 すべての PR を読み込<br />

む。 PR[qp] が false の場合は、 PR[qp] のみが読み込まれる。<br />

• mov-to-PR タ イ プの命令は、 命令内でエン コ ー ド さ れた即値マス ク に よ っ て示 さ れ<br />

る PR のみを書き込む。<br />

• st8.spill は AR[UNAT]{X} のみを書き込む (X は、 ス ト アのデータ ・ ア ド レスの<br />

ビッ ト 8:3 の値に等しい )。 ld8.fill 命令は AR[UNAT]{Y} のみを読み込む (Y は、<br />

ロードのデータ ・アドレスのビッ ト 8:3 の値に等しい )。<br />

• mod-sched-brs タイプの命令は、 常に AR[EC] および CFM のローテー ト ・ レジス<br />

タ ・ ベース ・ レ ジスタを読み込み、 AR[EC]、 CFM のローテー ト ・ レジスタ ・ ベー<br />

ス、 PR[63] を書き込む ( その値を変更しない場合、 PR[qp] が false の場合 も 同じ )。<br />

• mod-sched-brs-counted タイプの命令は、 常に AR[LC] の読み込み と 書き込みを行 う<br />

( その値を変更しない場合も同じ )。<br />

• pr-or-writers タイプまたはpr-and-writers タ イ プの命令の場合、 コ ンプ リ ー タ が<br />

or.andcm であれば、 先頭のターゲッ ト ・ プレデ ィ ケー ト のみが or-compare であり、<br />

2 番目のタ ー ゲ ッ ト ・ プ レデ ィ ケ ー ト は and-compare である。 同様に、 コンプ リ ー<br />

タが and.orcm であれば、 2 番目のターゲッ ト ・ プレディ ケー ト のみが or-compare で<br />

あり、 先頭のターゲッ ト ・プレディケー トはand-compare である。<br />

• PSR.up ( ビット 2) に対応する ビ ッ ト が命令の即値フ ィ ール ド にセ ッ ト される と き は、<br />

rum と sum のみが PSR.sp を読み込む。<br />

5.3.2 RAW の依存関係表<br />

表 5-2 は、 アーキテクチャ的に次の情報を定義している。<br />

• Itanium ア ー キテ ク チ ャ 内のア ー キテ ク チ ャ 的に定義 さ れた独立書き込み可能なすべ<br />

てのリ ソースのリ ス ト。 各行は 「ア ト ミ ッ ク」 リ ソースを示す。 したがって、 表内<br />

の各行で、 ハ ー ド ウ ェ アは個別の書き込み可能コ ン ト ロ ー ル信号を必要 と するのが<br />

一般的である。<br />

• 各リソースにおける、 リーダとライタの詳細なリスト。<br />

• 各命令の読み込みお よ び書き込み対象のすべての リ ソ ー スの詳細な リ ス ト 。 こ の リ<br />

ス ト は、 各命令が現れる すべての行の論理和 (OR) をとる。<br />

3:346 第 3 巻 : リソースと依存関係のセマンティックス


表 5-2. リソース別に編成した RAW の依存関係<br />

リソース名 ライタ リーダ<br />

ALAT chk.a.clr,<br />

mem-readers-alat,<br />

mem-writers, invala-all<br />

AR[BSP] br.call, brl.call, br.ret, cover,<br />

mov-to-AR-BSPSTORE, rfi<br />

AR[BSPSTORE] alloc, loadrs, flushrs,<br />

mov-to-AR-BSPSTORE<br />

mem-readers-alat,<br />

mem-writers, chk-a,<br />

invala.e<br />

br.call, brl.call, br.ia, br.ret, cover,<br />

flushrs, loadrs,<br />

mov-from-AR-BSP, rfi<br />

alloc, br.ia, flushrs,<br />

mov-from-AR-BSPSTORE<br />

AR[CCV] mov-to-AR-CCV br.ia, cmpxchg,<br />

mov-from-AR-CCV<br />

依存関係の<br />

セマンティックス<br />

第 3 巻 : リソースと依存関係のセマンティックス 3:347<br />

none<br />

impliedF<br />

impliedF<br />

impliedF<br />

AR[CFLG] mov-to-AR-CFLG br.ia, mov-from-AR-CFLG impliedF<br />

AR[CSD] ld16, mov-to-AR-CSD br.ia, cmp8xchg16,<br />

mov-from-AR-CSD, st16<br />

impliedF<br />

AR[EC] mod-sched-brs, br.ret,<br />

mov-to-AR-EC<br />

br.call, brl.call, br.ia, mod-sched-brs,<br />

mov-from-AR-EC<br />

impliedF<br />

AR[EFLAG] mov-to-AR-EFLAG br.ia, mov-from-AR-EFLAG impliedF<br />

AR[FCR] mov-to-AR-FCR br.ia, mov-from-AR-FCR impliedF<br />

AR[FDR] mov-to-AR-FDR br.ia, mov-from-AR-FDR impliedF<br />

AR[FIR] mov-to-AR-FIR br.ia, mov-from-AR-FIR impliedF<br />

AR[FPSR].sf0.controls mov-to-AR-FPSR, fsetc.s0 br.ia, fp-arith-s0, fcmp-s0, fpcmp-s0,<br />

fsetc, mov-from-AR-FPSR<br />

impliedF<br />

AR[FPSR].sf1.controls mov-to-AR-FPSR, fsetc.s1 br.ia, fp-arith-s1, fcmp-s1, fpcmp-s1,<br />

mov-from-AR-FPSR<br />

AR[FPSR].sf2.controls mov-to-AR-FPSR, fsetc.s2 br.ia, fp-arith-s2, fcmp-s2, fpcmp-s2,<br />

mov-from-AR-FPSR<br />

AR[FPSR].sf3.controls mov-to-AR-FPSR, fsetc.s3 br.ia, fp-arith-s3, fcmp-s3, fpcmp-s3,<br />

mov-from-AR-FPSR<br />

AR[FPSR].sf0.flags fp-arith-s0, fclrf.s0, fcmp-s0,<br />

fpcmp-s0, mov-to-AR-FPSR<br />

AR[FPSR].sf1.flags fp-arith-s1, fclrf.s1, fcmp-s1,<br />

fpcmp-s1, mov-to-AR-FPSR<br />

AR[FPSR].sf2.flags fp-arith-s2, fclrf.s2, fcmp-s2,<br />

fpcmp-s2, mov-to-AR-FPSR<br />

AR[FPSR].sf3.flags fp-arith-s3, fclrf.s3, fcmp-s3,<br />

fpcmp-s3, mov-to-AR-FPSR<br />

br.ia, fchkf,<br />

mov-from-AR-FPSR<br />

br.ia, fchkf.s1,<br />

mov-from-AR-FPSR<br />

br.ia, fchkf.s2,<br />

mov-from-AR-FPSR<br />

br.ia, fchkf.s3,<br />

mov-from-AR-FPSR<br />

AR[FPSR].traps mov-to-AR-FPSR br.ia, fp-arith, fchkf, fcmp, fpcmp,<br />

mov-from-AR-FPSR<br />

AR[FPSR].rv mov-to-AR-FPSR br.ia, fp-arith, fchkf, fcmp, fpcmp,<br />

mov-from-AR-FPSR<br />

impliedF<br />

impliedF<br />

impliedF<br />

AR[FSR] mov-to-AR-FSR br.ia, mov-from-AR-FSR impliedF<br />

AR[ITC] mov-to-AR-ITC br.ia, mov-from-AR-ITC impliedF<br />

AR[K%],<br />

% in 0 - 7<br />

mov-to-AR-K1 br.ia, mov-from-AR-K1 impliedF<br />

AR[LC] mod-sched-brs-counted,<br />

mov-to-AR-LC<br />

br.ia, mod-sched-brs-counted,<br />

mov-from-AR-LC<br />

impliedF


表 5-2. リソース別に編成した RAW の依存関係 ( 続き )<br />

AR[PFS] br.call, brl.call alloc, br.ia, br.ret, epc,<br />

mov-from-AR-PFS<br />

AR[RNAT] alloc, flushrs, loadrs,<br />

mov-to-AR-RNAT,<br />

mov-to-AR-BSPSTORE<br />

mov-to-AR-PFS alloc, br.ia, epc,<br />

mov-from-AR-PFS<br />

impliedF<br />

impliedF<br />

br.ret none<br />

alloc, br.ia, flushrs, loadrs,<br />

mov-from-AR-RNAT<br />

AR[RSC] mov-to-AR-RSC alloc, br.ia, flushrs, loadrs,<br />

mov-from-AR-RSC,<br />

mov-from-AR-BSPSTORE,<br />

mov-to-AR-RNAT,<br />

mov-from-AR-RNAT,<br />

mov-to-AR-BSPSTORE<br />

impliedF<br />

impliedF<br />

AR[SSD] mov-to-AR-SSD br.ia, mov-from-AR-SSD impliedF<br />

AR[UNAT]{%},<br />

% in 0 - 63<br />

AR%,<br />

% in 8-15, 20, 22-23, 31,<br />

33-35, 37-39, 41-43, 45-47,<br />

67-111<br />

AR%,<br />

% in 48-63, 112-127<br />

BR%,<br />

% in 0 - 7<br />

リソース名 ライタ リーダ<br />

mov-to-AR-UNAT, st8.spill br.ia, ld8.fill,<br />

mov-from-AR-UNAT<br />

none br.ia, mov-from-AR-rv 1<br />

impliedF<br />

3:348 第 3 巻 : リソースと依存関係のセマンティックス<br />

none<br />

mov-to-AR-ig 1 br.ia, mov-from-AR-ig 1 impliedF<br />

br.call 1 , brl.call 1 indirect-brs 1 , indirect-brp 1 ,<br />

mov-from-BR 1<br />

impliedF<br />

mov-to-BR1 indirect-brs1 none<br />

indirect-brp 1 ,<br />

mov-from-BR 1<br />

impliedF<br />

CFM mod-sched-brs mod-sched-brs impliedF<br />

cover, alloc, rfi, loadrs, br.ret, br.call,<br />

brl.call<br />

impliedF<br />

br.call, brl.call, br.ret, clrrrb, cover,<br />

rfi<br />

cfm-readers 2<br />

impliedF<br />

cfm-readers impliedF<br />

alloc cfm-readers none<br />

CPUID# none mov-from-IND-CPUID3 specific<br />

CR[CMCV] mov-to-CR-CMCV mov-from-CR-CMCV data<br />

CR[DCR] mov-to-CR-DCR mov-from-CR-DCR,<br />

mem-readers-spec<br />

data<br />

依存関係の<br />

セマンティックス<br />

CR[EOI] mov-to-CR-EOI none SC<br />

第 2 巻、第 1 部<br />

の 5.8.3.4 項<br />

CR[GPTA] mov-to-CR-GPTA mov-from-CR-GPTA, thash data<br />

CR[IFA] mov-to-CR-IFA itc.i, itc.d, itr.i, itr.d implied<br />

mov-from-CR-IFA data


表 5-2. リソース別に編成した RAW の依存関係 ( 続き )<br />

リソース名 ライタ リーダ<br />

CR[IFS] mov-to-CR-IFS mov-from-CR-IFS data<br />

rfi implied<br />

cover rfi, mov-from-CR-IFS implied<br />

CR[IHA] mov-to-CR-IHA mov-from-CR-IHA data<br />

CR[IIM] mov-to-CR-IIM mov-from-CR-IIM data<br />

CR[IIP] mov-to-CR-IIP mov-from-CR-IIP data<br />

rfi implied<br />

CR[IIPA] mov-to-CR-IIPA mov-from-CR-IIPA data<br />

CR[IPSR] mov-to-CR-IPSR mov-from-CR-IPSR data<br />

rfi implied<br />

CR[IRR%],<br />

% in 0 - 3<br />

mov-from-CR-IVR mov-from-CR-IRR1 data<br />

CR[ISR] mov-to-CR-ISR mov-from-CR-ISR data<br />

CR[ITIR] mov-to-CR-ITIR mov-from-CR-ITIR data<br />

itc.i, itc.d, itr.i, itr.d implied<br />

CR[ITM] mov-to-CR-ITM mov-from-CR-ITM data<br />

CR[ITV] mov-to-CR-ITV mov-from-CR-ITV data<br />

CR[IVA] mov-to-CR-IVA mov-from-CR-IVA instr<br />

CR[IVR] none mov-from-CR-IVR SC<br />

第 2 巻、第 1 部<br />

の 5.8.3.2 項<br />

CR[LID] mov-to-CR-LID mov-from-CR-LID SC<br />

第 2 巻、第 1 部<br />

の 5.8.3.1 項<br />

CR[LRR%],<br />

% in 0 - 1<br />

mov-to-CR-LRR 1<br />

mov-from-CR-LRR 1<br />

data<br />

CR[PMV] mov-to-CR-PMV mov-from-CR-PMV data<br />

CR[PTA] mov-to-CR-PTA mov-from-CR-PTA, thash data<br />

CR[TPR] mov-to-CR-TPR mov-from-CR-TPR,<br />

mov-from-CR-IVR<br />

data<br />

CR%,<br />

% in 3-7, 10-15, 18, 26-63,<br />

75-79, 82-127<br />

DBR# mov-to-IND-DBR 3<br />

none mov-from-CR-rv 1<br />

DTC ptc.e, ptc.g, ptc.ga, ptc.l, ptr.i, ptr.d,<br />

itc.i, itc.d, itr.i, itr.d<br />

mov-to-PSR-l, rfi, rsm, ssm SC<br />

第 2 巻、第 1 部<br />

の 5.8.3.3 項<br />

mov-from-IND-DBR 3<br />

probe-all, lfetch-all,<br />

mem-readers, mem-writers<br />

mem-readers,<br />

mem-writers, fc, probe-all, tak, tpa<br />

itc.i, itc.d, itr.i, itr.d ptc.e, ptc.g, ptc.ga, ptc.l, ptr.i, ptr.d, itc.i,<br />

itc.d, itr.i, itr.d<br />

依存関係の<br />

セマンティックス<br />

第 3 巻 : リソースと依存関係のセマンティックス 3:349<br />

none<br />

impliedF<br />

data<br />

data<br />

impliedF<br />

ptc.e, ptc.g, ptc.ga, ptc.l, ptr.i, ptr.d ptc.e, ptc.g, ptc.ga, ptc.l, ptr.i, ptr.d none<br />

itc.i, itc.d, itr.i, itr.d impliedF


表 5-2. リソース別に編成した RAW の依存関係 ( 続き )<br />

DTC_LIMIT* ptc.g, ptc.ga ptc.g, ptc.ga impliedF<br />

DTR itr.d mem-readers, mem-writers, fc,<br />

probe-all, tak, tpa<br />

data<br />

FR%,<br />

% in 0 - 1<br />

リソース名 ライタ リーダ<br />

ptc.g, ptc.ga, ptc.l, ptr.d, itr.d impliedF<br />

ptr.d mem-readers, mem-writers, fc,<br />

probe-all, tak, tpa<br />

data<br />

ptc.g, ptc.ga, ptc.l, ptr.d none<br />

itr.d, itc.d impliedF<br />

none fr-readers 1 none<br />

FR%,<br />

fr-writers<br />

% in 2 - 127<br />

1 \ldf-c1 \ldfp-c1 fr-readers1 impliedF<br />

ldf-c 1 , ldfp-c 1<br />

fr-readers 1<br />

none<br />

GR0 none gr-readers 1<br />

none<br />

GR%,<br />

ld-c<br />

% in 1 - 127<br />

1,13 gr-readers1 none<br />

gr-writers 1 \ld-c 1,13<br />

gr-readers 1<br />

impliedF<br />

IBR# mov-to-IND-IBR 3<br />

mov-from-IND-IBR 3<br />

impliedF<br />

InService* mov-to-CR-EOI mov-from-CR-IVR data<br />

mov-from-CR-IVR mov-from-CR-IVR impliedF<br />

mov-to-CR-EOI mov-to-CR-EOI impliedF<br />

IP all all none<br />

ITC ptc.e, ptc.g, ptc.ga, ptc.l, ptr.i, ptr.d epc instr<br />

itc.i, itc.d, itr.i, itr.d impliedF<br />

ptr.i, ptr.d, ptc.e, ptc.g, ptc.ga, ptc.l none<br />

itc.i, itc.d, itr.i, itr.d epc instr<br />

itc.d, itc.i, itr.d, itr.i, ptr.d, ptr.i, ptc.g,<br />

ptc.ga, ptc.l<br />

impliedF<br />

ITC_LIMIT* ptc.g, ptc.ga ptc.g, ptc.ga impliedF<br />

ITR itr.i itr.i, itc.i, ptc.g, ptc.ga, ptc.l, ptr.i impliedF<br />

epc instr<br />

ptr.i itc.i, itr.i impliedF<br />

ptc.g, ptc.ga, ptc.l, ptr.i none<br />

epc instr<br />

memory mem-writers mem-readers none<br />

PKR# mov-to-IND-PKR 3<br />

mem-readers, mem-writers,<br />

mov-from-IND-PKR 4 , probe-all<br />

data<br />

PMC# mov-to-IND-PMC 3<br />

PMD# mov-to-IND-PMD 3<br />

mov-to-IND-PKR 4<br />

none<br />

mov-from-IND-PKR3 impliedF<br />

mov-to-IND-PKR 3<br />

impliedF<br />

mov-from-IND-PMC 3<br />

impliedF<br />

mov-from-IND-PMD3 SC3 第 2 巻、第 1 部<br />

の 7.1.1 項<br />

mov-from-IND-PMD 3<br />

依存関係の<br />

セマンティックス<br />

impliedF<br />

3:350 第 3 巻 : リソースと依存関係のセマンティックス


表 5-2. リソース別に編成した RAW の依存関係 ( 続き )<br />

PR0 pr-writers 1<br />

PR%,<br />

% in 1 - 15<br />

PR%,<br />

% in 16 - 62<br />

リソース名 ライタ リーダ<br />

pr-writers 1 ,<br />

mov-to-PR-allreg 7<br />

pr-writers-fp 1<br />

pr-writers-int1 ,<br />

mov-to-PR-allreg 7<br />

pr-writers 1 ,<br />

mov-to-PR-allreg 7 ,<br />

mov-to-PR-rotreg<br />

pr-writers-fp 1<br />

pr-writers-int1 ,<br />

mov-to-PR-allreg 7 ,<br />

mov-to-PR-rotreg<br />

PR63 mod-sched-brs,<br />

pr-writers 1 ,<br />

mov-to-PR-allreg 7 ,<br />

mov-to-PR-rotreg<br />

pr-writers-fp 1 ,<br />

mod-sched-brs<br />

pr-writers-int 1 ,<br />

mov-to-PR-allreg 7 ,<br />

mov-to-PR-rotreg<br />

PSR.ac user-mask-writers-partial 7 ,<br />

mov-to-PSR-um<br />

sys-mask-writers-partial 7 ,<br />

mov-to-PSR-l, rfi<br />

user-mask-writers-partial 7 ,<br />

mov-to-PSR-um,<br />

sys-mask-writers-partial 7 ,<br />

mov-to-PSR-l, rfi<br />

PSR.be user-mask-writers-partial 7 ,<br />

mov-to-PSR-um<br />

sys-mask-writers-partial 7 ,<br />

mov-to-PSR-l, rfi<br />

user-mask-writers-partial 7 ,<br />

mov-to-PSR-um,<br />

sys-mask-writers-partial 7 ,<br />

mov-to-PSR-l, rfi<br />

pr-readers-br 1 ,<br />

pr-readers-nobr-nomovpr 1 ,<br />

mov-from-PR12 ,<br />

mov-to-PR 12<br />

pr-readers-nobr-nomovpr1 ,<br />

mov-from-PR,<br />

mov-to-PR 12<br />

依存関係の<br />

セマンティックス<br />

none<br />

impliedF<br />

pr-readers-br 1<br />

impliedF<br />

pr-readers-br1 none<br />

pr-readers-nobr-nomovpr 1 ,<br />

mov-from-PR,<br />

mov-to-PR 12<br />

pr-readers-br 1<br />

impliedF<br />

impliedF<br />

pr-readers-br 1 none<br />

pr-readers-nobr-nomovpr 1 ,<br />

mov-from-PR,<br />

mov-to-PR 12<br />

impliedF<br />

pr-readers-br 1 impliedF<br />

pr-readers-br 1 none<br />

mem-readers, mem-writers implied<br />

mem-readers, mem-writers data<br />

mov-from-PSR,<br />

mov-from-PSR-um<br />

impliedF<br />

mem-readers, mem-writers implied<br />

mem-readers, mem-writers data<br />

mov-from-PSR,<br />

mov-from-PSR-um<br />

impliedF<br />

PSR.bn bsw, rfi gr-readers10 , gr-writers10 impliedF<br />

PSR.cpl epc, br.ret, rfi priv-ops, br.call, brl.call, epc,<br />

mov-from-AR-ITC,<br />

mov-to-AR-ITC,<br />

mov-to-AR-RSC,<br />

mov-to-AR-K,<br />

mov-from-IND-PMD,<br />

probe-all, mem-readers,<br />

mem-writers, lfetch-all<br />

implied<br />

第 3 巻 : リソースと依存関係のセマンティックス 3:351


表 5-2. リソース別に編成した RAW の依存関係 ( 続き )<br />

PSR.da rfi mem-readers, lfetch-fault,<br />

mem-writers, probe-fault<br />

data<br />

PSR.db mov-to-PSR-l mem-readers,<br />

mem-writers, probe-fault<br />

data<br />

mov-from-PSR impliedF<br />

rfi mem-readers,<br />

mem-writers,<br />

mov-from-PSR, probe-fault<br />

data<br />

PSR.dd rfi mem-readers, probe-fault,<br />

mem-writers, lfetch-fault<br />

data<br />

PSR.dfh sys-mask-writers-partial 7 , fr-readers<br />

mov-to-PSR-l, rfi<br />

8 , fr-writers 8<br />

data<br />

mov-from-PSR impliedF<br />

PSR.dfl sys-mask-writers-partial 7 , fr-writers<br />

mov-to-PSR-l, rfi<br />

8 , fr-readers 8<br />

data<br />

mov-from-PSR impliedF<br />

PSR.di sys-mask-writers-partial7 , br.ia data<br />

mov-to-PSR-l, rfi<br />

mov-from-PSR impliedF<br />

PSR.dt sys-mask-writers-partial 7 , mem-readers, mem-writers data<br />

mov-to-PSR-l, rfi<br />

mov-from-PSR impliedF<br />

PSR.ed rfi lfetch-all,<br />

mem-readers-spec<br />

data<br />

PSR.i sys-mask-writers-partial 7 ,<br />

mov-to-PSR-l<br />

mov-from-PSR impliedF<br />

rfi mov-from-PSR data<br />

PSR.ia rfi none none<br />

PSR.ic sys-mask-writers-partial 7 リソース名 ライタ リーダ<br />

依存関係の<br />

セマンティックス<br />

, mov-from-PSR impliedF<br />

mov-to-PSR-l, rfi<br />

cover, itc.i, itc.d, itr.i, itr.d,<br />

mov-from-CR-ITIR,<br />

mov-from-CR-IFS,<br />

mov-from-CR-IIM,<br />

mov-from-CR-IIP,<br />

mov-from-CR-IPSR,<br />

mov-from-CR-ISR,<br />

mov-from-CR-IFA,<br />

mov-from-CR-IHA,<br />

mov-from-CR-IIPA,<br />

mov-to-CR-ITIR,<br />

mov-to-CR-IFS,<br />

mov-to-CR-IIM,<br />

mov-to-CR-IIP,<br />

mov-to-CR-IPSR,<br />

mov-to-CR-ISR,<br />

mov-to-CR-IFA,<br />

mov-to-CR-IHA,<br />

mov-to-CR-IIPA<br />

data<br />

PSR.id rfi none none<br />

PSR.is br.ia, rfi none none<br />

PSR.it rfi branches, mov-from-PSR, chk, epc,<br />

fchkf<br />

data<br />

3:352 第 3 巻 : リソースと依存関係のセマンティックス


表 5-2. リソース別に編成した RAW の依存関係 ( 続き )<br />

PSR.lp mov-to-PSR-l mov-from-PSR impliedF<br />

br.ret data<br />

rfi mov-from-PSR, br.ret data<br />

PSR.mc rfi mov-from-PSR none<br />

PSR.mfh fr-writers9 ,<br />

user-mask-writers-partial 7 ,<br />

mov-to-PSR-um,<br />

sys-mask-writers-partial7 リソース名 ライタ リーダ<br />

依存関係の<br />

セマンティックス<br />

mov-from-PSR-um,<br />

impliedF<br />

,<br />

mov-to-PSR-l, rfi<br />

mov-from-PSR<br />

PSR.mfl fr-writers 9 ,<br />

user-mask-writers-partial 7 ,<br />

mov-to-PSR-um,<br />

sys-mask-writers-partial 7 ,<br />

mov-to-PSR-l, rfi<br />

PSR.pk sys-mask-writers-partial 7 ,<br />

mov-to-PSR-l, rfi<br />

mov-from-PSR-um,<br />

mov-from-PSR<br />

mem-readers,<br />

mem-writers, probe-all<br />

impliedF<br />

mov-from-PSR impliedF<br />

PSR.pp sys-mask-writers-partial 7 ,<br />

mov-to-PSR-l, rfi<br />

mov-from-PSR impliedF<br />

PSR.ri rfi none none<br />

PSR.rt mov-to-PSR-l mov-from-PSR impliedF<br />

alloc, flushrs, loadrs data<br />

rfi mov-from-PSR, alloc, flushrs, loadrs data<br />

PSR.si sys-mask-writers-partial 7 , mov-from-PSR impliedF<br />

mov-to-PSR-l, rfi<br />

mov-from-AR-ITC data<br />

PSR.sp sys-mask-writers-partial7 , mov-from-PSR impliedF<br />

mov-to-PSR-l, rfi<br />

mov-from-IND-PMD,<br />

mov-to-PSR-um, rum, sum<br />

data<br />

PSR.ss rfi all data<br />

PSR.tb mov-to-PSR-l, rfi branches, chk, fchkf data<br />

mov-from-PSR impliedF<br />

PSR.up user-mask-writers-partial 7 ,<br />

mov-to-PSR-um,<br />

sys-mask-writers-partial 7 mov-from-PSR-um,<br />

impliedF<br />

,<br />

mov-to-PSR-l, rfi<br />

mov-from-PSR<br />

RR# mov-to-IND-RR 6<br />

RSE rse-writers 14<br />

mem-readers, mem-writers, itc.i, itc.d,<br />

itr.i, itr.d, probe-all, ptc.g, ptc.ga, ptc.l,<br />

ptr.i, ptr.d, tak, thash, tpa, ttag<br />

mov-from-IND-RR 6<br />

rse-readers 14<br />

第 3 巻 : リソースと依存関係のセマンティックス 3:353<br />

data<br />

data<br />

impliedF<br />

impliedF


5.3.3 WAW の依存関係表<br />

WAW の表に固有の一般規則は、 次の と お り である。<br />

• すべての リ ソ ー ス は、 命令グルー プ ・ ブ レ ー ク があれば、 連続的な動作を提供で き<br />

る。<br />

• リ ソ ー スに よ っ ては、 命令グルー プ ・ ブ レ ー ク がな く て も 、 連続的な動作を提供で<br />

きる。<br />

• 本書の他の個所で さ ら に詳し く 説明してい る特別なケ ー スがあ り 、 それ ら は SC ( 特<br />

別なケ ース ) の結果 と と も に示している。<br />

• ラ イ タの各副行は、 命令グループを表し、 任意の組み合わせのペアで、 依存関係の<br />

結果を示す。 列が副列に分割 さ れる場合、 依存関係のセマンテ ィ ッ ク ス は、 左の副<br />

列 と 右の副列か ら選択して組み合わせた任意の命令ペアに適用 さ れる。<br />

表 5-3. リソース別に編成した WAW の依存関係<br />

リソース名 ライタ<br />

ALAT mem-readers-alat, mem-writers, chk.a.clr,<br />

invala-all<br />

依存関係の<br />

セマンティックス<br />

AR[BSP] br.call, brl.call, br.ret, cover, mov-to-AR-BSPSTORE, rfi impliedF<br />

AR[BSPSTORE] alloc, loadrs, flushrs, mov-to-AR-BSPSTORE impliedF<br />

AR[CCV] mov-to-AR-CCV impliedF<br />

AR[CFLG] mov-to-AR-CFLG impliedF<br />

AR[CSD] ld16, mov-to-AR-CSD impliedF<br />

AR[EC] br.ret, mod-sched-brs, mov-to-AR-EC impliedF<br />

AR[EFLAG] mov-to-AR-EFLAG impliedF<br />

AR[FCR] mov-to-AR-FCR impliedF<br />

AR[FDR] mov-to-AR-FDR impliedF<br />

AR[FIR] mov-to-AR-FIR impliedF<br />

AR[FPSR].sf0.controls mov-to-AR-FPSR, fsetc.s0 impliedF<br />

AR[FPSR].sf1.controls mov-to-AR-FPSR, fsetc.s1 impliedF<br />

AR[FPSR].sf2.controls mov-to-AR-FPSR, fsetc.s2 impliedF<br />

AR[FPSR].sf3.controls mov-to-AR-FPSR, fsetc.s3 impliedF<br />

AR[FPSR].sf0.flags fp-arith-s0, fcmp-s0, fpcmp-s0 none<br />

fclrf.s0, fcmp-s0, fp-arith-s0,<br />

fpcmp-s0, mov-to-AR-FPSR<br />

fclrf.s0, mov-to-AR-FPSR impliedF<br />

AR[FPSR].sf1.flags fp-arith-s1, fcmp-s1, fpcmp-s1 none<br />

fclrf.s1, fcmp-s1, fp-arith-s1,<br />

fpcmp-s1, mov-to-AR-FPSR<br />

fclrf.s1, mov-to-AR-FPSR impliedF<br />

AR[FPSR].sf2.flags fp-arith-s2, fcmp-s2, fpcmp-s2 none<br />

fclrf.s2, fcmp-s2, fp-arith-s2,<br />

fpcmp-s2, mov-to-AR-FPSR<br />

fclrf.s2, mov-to-AR-FPSR impliedF<br />

AR[FPSR].sf3.flags fp-arith-s3, fcmp-s3, fpcmp-s3 none<br />

fclrf.s3, fcmp-s3, fp-arith-s3,<br />

fpcmp-s3, mov-to-AR-FPSR<br />

fclrf.s3, mov-to-AR-FPSR impliedF<br />

AR[FPSR].rv mov-to-AR-FPSR impliedF<br />

3:354 第 3 巻 : リソースと依存関係のセマンティックス<br />

none


表 5-3. リソース別に編成した WAW の依存関係 ( 続き )<br />

リソース名 ライタ<br />

AR[FPSR].traps mov-to-AR-FPSR impliedF<br />

AR[FSR] mov-to-AR-FSR impliedF<br />

AR[ITC] mov-to-AR-ITC impliedF<br />

AR[K%],<br />

% in 0 - 7<br />

mov-to-AR-K1 impliedF<br />

AR[LC] mod-sched-brs-counted, mov-to-AR-LC impliedF<br />

AR[PFS] br.call, brl.call none<br />

br.call, brl.call mov-to-AR-PFS impliedF<br />

AR[RNAT] alloc, flushrs, loadrs,<br />

mov-to-AR-RNAT,<br />

mov-to-AR-BSPSTORE<br />

impliedF<br />

AR[RSC] mov-to-AR-RSC impliedF<br />

AR[SSD] mov-to-AR-SSD impliedF<br />

AR[UNAT]{%},<br />

% in 0 - 63<br />

mov-to-AR-UNAT, st8.spill impliedF<br />

AR%,<br />

% in 8-15, 20, 22-23, 31,<br />

33-35, 37-39, 41-43, 45-47,<br />

67-111<br />

AR%,<br />

% in 48 - 63, 112-127<br />

none none<br />

mov-to-AR-ig 1<br />

impliedF<br />

BR%,<br />

br.call<br />

% in 0 - 7<br />

1 , brl.call 1<br />

mov-to-BR 1<br />

impliedF<br />

mov-to-BR 1<br />

impliedF<br />

br.call1 , brl.call1 none<br />

CFM mod-sched-brs, br.call, brl.call, br.ret, alloc, clrrrb, cover, rfi impliedF<br />

CPUID# none none<br />

CR[CMCV] mov-to-CR-CMCV impliedF<br />

CR[DCR] mov-to-CR-DCR impliedF<br />

CR[EOI] mov-to-CR-EOI SC<br />

第 2 巻、第 1 部<br />

の 5.8.3.4 項<br />

CR[GPTA] mov-to-CR-GPTA impliedF<br />

CR[IFA] mov-to-CR-IFA impliedF<br />

CR[IFS] mov-to-CR-IFS, cover impliedF<br />

CR[IHA] mov-to-CR-IHA impliedF<br />

CR[IIM] mov-to-CR-IIM impliedF<br />

CR[IIP] mov-to-CR-IIP impliedF<br />

CR[IIPA] mov-to-CR-IIPA impliedF<br />

CR[IPSR] mov-to-CR-IPSR impliedF<br />

CR[IRR%],<br />

% in 0 - 3<br />

mov-from-CR-IVR impliedF<br />

CR[ISR] mov-to-CR-ISR impliedF<br />

依存関係の<br />

セマンティックス<br />

第 3 巻 : リソースと依存関係のセマンティックス 3:355


表 5-3. リソース別に編成した WAW の依存関係 ( 続き )<br />

CR[ITIR] mov-to-CR-ITIR impliedF<br />

CR[ITM] mov-to-CR-ITM impliedF<br />

CR[ITV] mov-to-CR-ITV impliedF<br />

CR[IVA] mov-to-CR-IVA impliedF<br />

CR[IVR] none SC<br />

CR[LID] mov-to-CR-LID SC<br />

CR[LRR%],<br />

% in 0 - 1<br />

mov-to-CR-LRR1 impliedF<br />

CR[PMV] mov-to-CR-PMV impliedF<br />

CR[PTA] mov-to-CR-PTA impliedF<br />

CR[TPR] mov-to-CR-TPR impliedF<br />

CR%,<br />

% in 3-7, 10-15, 18, 26-63,<br />

75-79, 82-127<br />

none none<br />

DBR# mov-to-IND-DBR3 impliedF<br />

DTC ptc.e, ptc.g, ptc.ga, ptc.l, ptr.i, ptr.d none<br />

ptc.e, ptc.g, ptc.ga, ptc.l, ptr.i, ptr.d,<br />

itc.i, itc.d, itr.i, itr.d<br />

itc.i, itc.d, itr.i, itr.d impliedF<br />

DTC_LIMIT* ptc.g, ptc.ga impliedF<br />

DTR itr.d impliedF<br />

itr.d ptr.d impliedF<br />

ptr.d none<br />

FR%,<br />

% in 0 - 1<br />

none none<br />

FR%,<br />

% in 2 - 127<br />

リソース名 ライタ<br />

fr-writers 1 , ldf-c 1 , ldfp-c 1 impliedF<br />

依存関係の<br />

セマンティックス<br />

GR0 none none<br />

GR%,<br />

% in 1 - 127<br />

ld-c 1 , gr-writers 1<br />

impliedF<br />

IBR# mov-to-IND-IBR 3<br />

impliedF<br />

InService* mov-to-CR-EOI, mov-from-CR-IVR SC<br />

IP all none<br />

ITC ptc.e, ptc.g, ptc.ga, ptc.l, ptr.i, ptr.d none<br />

ptc.e, ptc.g, ptc.ga, ptc.l, ptr.i, ptr.d,<br />

itc.i, itc.d, itr.i, itr.d<br />

itc.i, itc.d, itr.i, itr.d impliedF<br />

ITR itr.i itr.i, ptr.i impliedF<br />

ptr.i none<br />

memory mem-writers none<br />

PKR# mov-to-IND-PKR3 mov-to-IND-PKR4 none<br />

mov-to-IND-PKR3 impliedF<br />

PMC# mov-to-IND-PMC3 impliedF<br />

3:356 第 3 巻 : リソースと依存関係のセマンティックス


表 5-3. リソース別に編成した WAW の依存関係 ( 続き )<br />

PMD# mov-to-IND-PMD3 impliedF<br />

PR0 pr-writers1 none<br />

PR%,<br />

pr-and-writers<br />

% in 1 - 15<br />

1 none<br />

pr-or-writers1 none<br />

pr-unc-writers-fp1 ,<br />

pr-unc-writers-int 1 ,<br />

pr-norm-writers-fp 1 ,<br />

pr-norm-writers-int1 ,<br />

pr-and-writers 1 ,<br />

mov-to-PR-allreg 7<br />

pr-unc-writers-fp1 ,<br />

pr-unc-writers-int 1 ,<br />

pr-norm-writers-fp 1 ,<br />

pr-norm-writers-int1 ,<br />

pr-or-writers 1 ,<br />

mov-to-PR-allreg 7<br />

リソース名 ライタ<br />

依存関係の<br />

セマンティックス<br />

impliedF<br />

PR%,<br />

% in 16 - 62<br />

pr-and-writers 1<br />

pr-or-writers 1<br />

pr-unc-writers-fp 1 ,<br />

pr-unc-writers-int1 ,<br />

pr-norm-writers-fp 1 ,<br />

pr-norm-writers-int 1 ,<br />

pr-and-writers1 ,<br />

mov-to-PR-allreg 7 pr-unc-writers-fp<br />

,<br />

mov-to-PR-rotreg<br />

1 ,<br />

pr-unc-writers-int1 ,<br />

pr-norm-writers-fp 1 ,<br />

pr-norm-writers-int 1 ,<br />

pr-or-writers1 ,<br />

mov-to-PR-allreg 7 ,<br />

mov-to-PR-rotreg<br />

PR63 pr-and-writers 1<br />

pr-or-writers 1<br />

mod-sched-brs,<br />

pr-unc-writers-fp1 ,<br />

pr-unc-writers-int 1 ,<br />

pr-norm-writers-fp 1 ,<br />

pr-norm-writers-int1 ,<br />

pr-and-writers 1 ,<br />

mov-to-PR-allreg7 ,<br />

mov-to-PR-rotreg<br />

mod-sched-brs,<br />

pr-unc-writers-fp 1 ,<br />

pr-unc-writers-int 1 ,<br />

pr-norm-writers-fp 1 ,<br />

pr-norm-writers-int 1 ,<br />

pr-or-writers 1 ,<br />

mov-to-PR-allreg 7 ,<br />

mov-to-PR-rotreg<br />

PSR.ac user-mask-writers-partial 7 , mov-to-PSR-um,<br />

sys-mask-writers-partial 7 , mov-to-PSR-l, rfi<br />

PSR.be user-mask-writers-partial 7 , mov-to-PSR-um,<br />

sys-mask-writers-partial 7 , mov-to-PSR-l, rfi<br />

第 3 巻 : リソースと依存関係のセマンティックス 3:357<br />

none<br />

none<br />

impliedF<br />

none<br />

none<br />

impliedF<br />

impliedF<br />

impliedF<br />

PSR.bn bsw, rfi impliedF<br />

PSR.cpl epc, br.ret, rfi impliedF<br />

PSR.da rfi impliedF<br />

PSR.db mov-to-PSR-l, rfi impliedF<br />

PSR.dd rfi impliedF<br />

PSR.dfh sys-mask-writers-partial7 , mov-to-PSR-l, rfi impliedF<br />

PSR.dfl sys-mask-writers-partial7 , mov-to-PSR-l, rfi impliedF<br />

PSR.di sys-mask-writers-partial7 , mov-to-PSR-l, rfi impliedF<br />

PSR.dt sys-mask-writers-partial7 , mov-to-PSR-l, rfi impliedF<br />

PSR.ed rfi impliedF<br />

PSR.i sys-mask-writers-partial7 , mov-to-PSR-l, rfi impliedF<br />

PSR.ia rfi impliedF


表 5-3. リソース別に編成した WAW の依存関係 ( 続き )<br />

PSR.ic sys-mask-writers-partial7 , mov-to-PSR-l, rfi impliedF<br />

PSR.id rfi impliedF<br />

PSR.is br.ia, rfi impliedF<br />

PSR.it rfi impliedF<br />

PSR.lp mov-to-PSR-l, rfi impliedF<br />

PSR.mc rfi impliedF<br />

PSR.mfh fr-writers9 リソース名 ライタ<br />

依存関係の<br />

セマンティックス<br />

none<br />

5.3.4 WAR の依存関係表<br />

user-mask-writers-partial 7 ,<br />

mov-to-PSR-um, fr-writers 9 ,<br />

sys-mask-writers-partial 7 ,<br />

mov-to-PSR-l, rfi<br />

user-mask-writers-partial 7 ,<br />

mov-to-PSR-um,<br />

sys-mask-writers-partial 7 ,<br />

mov-to-PSR-l, rfi<br />

PSR.mfl fr-writers 9 none<br />

user-mask-writers-partial 7 ,<br />

mov-to-PSR-um, fr-writers 9 ,<br />

sys-mask-writers-partial 7 ,<br />

mov-to-PSR-l, rfi<br />

user-mask-writers-partial 7 ,<br />

mov-to-PSR-um,<br />

sys-mask-writers-partial 7 ,<br />

mov-to-PSR-l, rfi<br />

impliedF<br />

impliedF<br />

PSR.pk sys-mask-writers-partial7 , mov-to-PSR-l, rfi impliedF<br />

PSR.pp sys-mask-writers-partial7 , mov-to-PSR-l, rfi impliedF<br />

PSR.ri rfi impliedF<br />

PSR.rt mov-to-PSR-l, rfi impliedF<br />

PSR.si sys-mask-writers-partial7 , mov-to-PSR-l, rfi impliedF<br />

PSR.sp sys-mask-writers-partial7 , mov-to-PSR-l, rfi impliedF<br />

PSR.ss rfi impliedF<br />

PSR.tb mov-to-PSR-l, rfi impliedF<br />

PSR.up user-mask-writers-partial 7 , mov-to-PSR-um,<br />

sys-mask-writers-partial 7 , mov-to-PSR-l, rfi<br />

impliedF<br />

RR# mov-to-IND-RR 6<br />

RSE rse-writers 14<br />

impliedF<br />

impliedF<br />

WAW の表に固有の一般規則は、 次の と お り である。<br />

1. WAR の依存関係は、 表 5-4 内のエン ト リ を除いて、 命令グループ内で常に許可さ<br />

れる。 リ ーダおよび指定された後続のライタは、 定義された動作を得るために、<br />

ス ト ッ プで分離する必要がある。<br />

表 5-4. リソース別に編成した WAR の依存関係<br />

リソース名 リーダ ライタ 依存関係のセマンティックス<br />

PR63 pr-readers-br 1<br />

mod-sched-brs stop<br />

3:358 第 3 巻 : リソースと依存関係のセマンティックス


5.3.5 依存関係表で参照される規則のリスト<br />

次の規則は、表内のい く つかの命令が依存関係の原因 と なる よ う な特定のイ ンス タ ンス を<br />

制限す る も のであ り 、 それ ら のエン ト リ を正確に解釈す る ために参照個所に適用す る必要<br />

がある。 規則が適用されるのは、 命令クラスのインスタンス、 または規則がスーパースク<br />

リ プ ト として参照される命令ニーモニッ ク ・プ リ フ ィ ッ クスだけである。 命令クラスが定<br />

義された表 5-5 で規則を参照する場合、 規則は命令 ク ラ スのすべての イ ン ス タ ン ス に適用<br />

される。<br />

規則 1. こ れ ら の命令は、 レ ジ ス タ番号が命令の タ ー ゲ ッ ト と して明示的にエン コ ー ド さ<br />

れるときに限りレジスタを書き込み、 レジスタ番号が命令のソース ( またはその<br />

PR[qp]) としてエンコードされるときに限り読み込まれる。<br />

規則 2. こ れ ら の命令は、 ロ ー テ ー ト GR、 FR、 または PR にアクセスする と きに限り<br />

CFM を読み込む。 mov-to-PR および mov-from-PR は、 修飾プレデ ィ ケー ト が<br />

ローテート領域にあるときに限り CFM にアクセスする。<br />

規則 3. こ れ ら の命令は、 汎用レ ジ ス タ の値を使用して、 ア ク セス さ れた特定の間接レ ジ<br />

スタを判別する。 これらの命令は、 インデックス ・ レジスタの動的な値のビッ ト<br />

{7:0} の値で指定されたレ ジス タ ・ リ ソ ー スにのみア クセスする。<br />

規則 4. こ れ ら の命令は、 間接イ ンデ ッ ク ス ・ レ ジ ス タ のビ ッ ト {7:0} がリソースのレジ<br />

スタ番号と同じでない場合に限って、 所定の リ ソ ー スを読み込む。<br />

規則 5. 規則はすべて、 プ ロ セ ッ サご と に異な る。<br />

規則 6. 依存関係が存在する のは、 リ ー ダが指定したイ ンデ ッ ク ス と ラ イ タが指定したイ<br />

ンデッ クスの両方がビ ッ ト {63:61} に同じ値を持つ場合に限られる。<br />

規則 7. こ れ ら の命令は、 対応する マス ク ・ ビ ッ ト がセ ッ ト さ れた と き に限 っ て、 指定 さ<br />

れた リ ソ ー スにアクセスする。<br />

規則 8. PSR.dfh は、 こ れら の命令が FR32-127 を参照する と き に限り読み込まれる。<br />

PSR.dfl は、 これらの命令が FR2-31 を参照する と き に限り読み込まれる。<br />

規則 9. PSR.mfl は、 これらの命令が FR2-31 を書き込むと きに限り書き込まれる。<br />

PSR.mfh は、 こ れ ら の命令が FR32-127 を書き込む と きに限り書き込まれる。<br />

規則 10.PSR.bn ビ ッ ト は、 命令内で GR16-31 のいずれかが指定 さ れた と き に限 り ア ク セ<br />

スされる。<br />

規則 11. ターゲッ ト ・プレディケー トは PR[qp] とは無関係に書き込まれるが、 ソース ・<br />

レジスタは PR[qp] が true の場合に限って読み込まれる。<br />

規則 12. こ の命令が、 指定されたプレデ ィ ケ ー ト ・ レ ジスタ を読み込むのは、 そのレ ジス<br />

タが PR[qp] である と きに限られる。<br />

規則 13.ld-c へのこの参照は、 ポス ト ・ インク リ メン ト されたア ド レス ・ レジスタではな<br />

く、 メモリから返されたデータで値がロー ド される GR にのみ適用される。 した<br />

がって、 ポスト ・ インク リ メン トする ld-c と、 ポスト ・ インク リ メント された<br />

GR を読み込む消費側との間では依然と してス ト ッ プが必要である。<br />

第 3 巻 : リソースと依存関係のセマンティックス 3:359


規則 14.RSE リ ソ ー スに は、 プ ロセ ッ サ固有の内部状態が含まれる。 こ れら の リ ソ ー スの<br />

最低 1 つ ( それ以上の場合も ある ) は、 rse-readers ク ラ ス に リ ス ト された各命令<br />

によ って読み込まれる。 これらのリ ソースの最低 1 つ ( それ以上の場合も ある )<br />

は、 rse-writers ク ラ ス に リ ス ト された各命令に よ っ て書き込ま れる。 それぞれの<br />

リ ソ ー スを個々に読み込むま たは書き込む命令を正確に判別する には、 対応する<br />

命令のペー ジ を参照の こ と 。<br />

規則 15. このクラスは、 PR[qp] が 1 B タイプ命令(3:264 ページの 4.1 節 「形式の要約」 を<br />

参照 ) の場合に予約済み と してマー ク される命令をすべて表現する。<br />

規則 16. このクラスは、 PR[qp] が 1 命令 (3:264 ページの 4.1 節 「形式の要約」 を参照 ) の<br />

場合に予約済み と してマ ー ク さ れる命令をすべて表現す る。<br />

3:360 第 3 巻 : リソースと依存関係のセマンティックス


5.4 サポートに関する表<br />

表 5-5. 命令クラス<br />

クラス イベント / 命令<br />

all predicatable-instructions, unpredicatable-instructions<br />

branches indirect-brs, ip-rel-brs<br />

cfm-readers fr-readers, fr-writers, gr-readers, gr-writers, mod-sched-brs, predicatable-instructions,<br />

pr-writers, alloc, br.call, brl.call, br.ret, cover, loadrs, rfi, chk-a, invala.e<br />

chk-a chk.a.clr, chk.a.nc<br />

cmpxchg cmpxchg1, cmpxchg2, cmpxchg4, cmpxchg8, cmp8xchg16<br />

czx czx1, czx2<br />

fcmp-s0 fcmp[Field(sf)==s0]<br />

fcmp-s1 fcmp[Field(sf)==s1]<br />

fcmp-s2 fcmp[Field(sf)==s2]<br />

fcmp-s3 fcmp[Field(sf)==s3]<br />

fetchadd fetchadd4, fetchadd8<br />

fp-arith fadd, famax, famin, fcvt.fx, fcvt.fxu, fcvt.xuf, fma, fmax, fmin, fmpy, fms, fnma, fnmpy, fnorm,<br />

fpamax, fpamin, fpcvt.fx, fpcvt.fxu, fpma, fpmax, fpmin, fpmpy, fpms, fpnma, fpnmpy, fprcpa,<br />

fprsqrta, frcpa, frsqrta, fsub<br />

fp-arith-s0 fp-arith[Field(sf)==s0]<br />

fp-arith-s1 fp-arith[Field(sf)==s1]<br />

fp-arith-s2 fp-arith[Field(sf)==s2]<br />

fp-arith-s3 fp-arith[Field(sf)==s3]<br />

fp-non-arith fabs, fand, fandcm, fclass, fcvt.xf, fmerge, fmix, fneg, fnegabs, for, fpabs, fpmerge, fpack,<br />

fpneg, fpnegabs, fselect, fswap, fsxt, fxor, xma<br />

fpcmp-s0 fpcmp[Field(sf)==s0]<br />

fpcmp-s1 fpcmp[Field(sf)==s1]<br />

fpcmp-s2 fpcmp[Field(sf)==s2]<br />

fpcmp-s3 fpcmp[Field(sf)==s3]<br />

fr-readers fp-arith, fp-non-arith, pr-writers-fp, chk.s[Format in {M21}], getf<br />

fr-writers fp-arith, fp-non-arith\fclass, mem-readers-fp, setf<br />

gr-readers gr-readers-writers, mem-readers, mem-writers, chk.s, cmp, cmp4, fc, itc.i, itc.d, itr.i, itr.d,<br />

mov-to-AR-gr, mov-to-BR, mov-to-CR, mov-to-IND, mov-from-IND, mov-to-PR-allreg,<br />

mov-to-PSR-l, mov-to-PSR-um, probe-all, ptc.e, ptc.g, ptc.ga, ptc.l, ptr.i, ptr.d, setf, tbit, tnat<br />

gr-readers-writers mov-from-IND, add, addl, addp4, adds, and, andcm, czx, dep\dep[Format in {I13}], extr,<br />

mem-readers-int, ld-all-postinc, lfetch-postinc, mix, mux, or, pack, padd, pavg, pavgsub,<br />

pcmp, pmax, pmin, pmpy, pmpyshr, popcnt, probe-nofault, psad, pshl, pshladd, pshr,<br />

pshradd, psub, shl, shladd, shladdp4, shr, shrp, st-postinc, sub, sxt, tak, thash, tpa, ttag,<br />

unpack, xor, zxt<br />

gr-writers alloc, dep, getf, gr-readers-writers, mem-readers-int, mov-from-AR, mov-from-BR,<br />

mov-from-CR, mov-from-PR, mov-from-PSR, mov-from-PSR-um, mov-ip, movl<br />

indirect-brp brp[Format in {B7}]<br />

indirect-brs br.call[Format in {B5}], br.cond[Format in {B4}], br.ia, br.ret<br />

invala-all invala[Format in {M24}], invala.e<br />

ip-rel-brs mod-sched-brs, br.call[Format in {B3}], brl.call, brl.cond, br.cond[Format in {B1}], br.cloop<br />

第 3 巻 : リソースと依存関係のセマンティックス 3:361


表 5-5. 命令クラス ( 続き )<br />

クラス イベント / 命令<br />

ld ld1, ld2, ld4, ld8, ld8.fill, ld16<br />

ld-a ld1.a, ld2.a, ld4.a, ld8.a<br />

ld-all-postinc ld[Format in {M2 M3}], ldfp[Format in {M12}], ldf[Format in {M7 M8}]<br />

ld-c ld-c-nc, ld-c-clr<br />

ld-c-clr ld1.c.clr, ld2.c.clr, ld4.c.clr, ld8.c.clr, ld-c-clr-acq<br />

ld-c-clr-acq ld1.c.clr.acq, ld2.c.clr.acq, ld4.c.clr.acq, ld8.c.clr.acq<br />

ld-c-nc ld1.c.nc, ld2.c.nc, ld4.c.nc, ld8.c.nc<br />

ld-s ld1.s, ld2.s, ld4.s, ld8.s<br />

ld-sa ld1.sa, ld2.sa, ld4.sa, ld8.sa<br />

ldf ldfs, ldfd, ldfe, ldf8, ldf.fill<br />

ldf-a ldfs.a, ldfd.a, ldfe.a, ldf8.a<br />

ldf-c ldf-c-nc, ldf-c-clr<br />

ldf-c-clr ldfs.c.clr, ldfd.c.clr, ldfe.c.clr, ldf8.c.clr<br />

ldf-c-nc ldfs.c.nc, ldfd.c.nc, ldfe.c.nc, ldf8.c.nc<br />

ldf-s ldfs.s, ldfd.s, ldfe.s, ldf8.s<br />

ldf-sa ldfs.sa, ldfd.sa, ldfe.sa, ldf8.sa<br />

ldfp ldfps, ldfpd, ldfp8<br />

ldfp-a ldfps.a, ldfpd.a, ldfp8.a<br />

ldfp-c ldfp-c-nc, ldfp-c-clr<br />

ldfp-c-clr ldfps.c.clr, ldfpd.c.clr, ldfp8.c.clr<br />

ldfp-c-nc ldfps.c.nc, ldfpd.c.nc, ldfp8.c.nc<br />

ldfp-s ldfps.s, ldfpd.s, ldfp8.s<br />

ldfp-sa ldfps.sa, ldfpd.sa, ldfp8.sa<br />

lfetch-all lfetch<br />

lfetch-fault lfetch[Field(lftype)==fault]<br />

lfetch-nofault lfetch[Field(lftype)==]<br />

lfetch-postinc lfetch[Format in {M14 M15}]<br />

mem-readers mem-readers-fp, mem-readers-int<br />

mem-readers-alat ld-a, ldf-a, ldfp-a, ld-sa, ldf-sa, ldfp-sa, ld-c, ldf-c, ldfp-c<br />

mem-readers-fp ldf, ldfp<br />

mem-readers-int cmpxchg, fetchadd, xchg, ld<br />

mem-readers-spec ld-s, ld-sa, ldf-s, ldf-sa, ldfp-s, ldfp-sa<br />

mem-writers mem-writers-fp, mem-writers-int<br />

mem-writers-fp stf<br />

mem-writers-int cmpxchg, fetchadd, xchg, st<br />

mix mix1, mix2, mix4<br />

mod-sched-brs br.cexit, br.ctop, br.wexit, br.wtop<br />

mod-sched-brs-counted br.cexit, br.cloop, br.ctop<br />

mov-from-AR mov-from-AR-M, mov-from-AR-I, mov-from-AR-IM<br />

3:362 第 3 巻 : リソースと依存関係のセマンティックス


表 5-5. 命令クラス ( 続き )<br />

クラス イベント / 命令<br />

mov-from-AR-BSP mov-from-AR-M[Field(ar3) == BSP]<br />

mov-from-AR-BSPSTORE mov-from-AR-M[Field(ar3) == BSPSTORE]<br />

mov-from-AR-CCV mov-from-AR-M[Field(ar3) == CCV]<br />

mov-from-AR-CFLG mov-from-AR-M[Field(ar3) == CFLG]<br />

mov-from-AR-CSD mov-from-AR-M[Field(ar3) == CSD]<br />

mov-from-AR-EC mov-from-AR-I[Field(ar3) == EC]<br />

mov-from-AR-EFLAG mov-from-AR-M[Field(ar3) == EFLAG]<br />

mov-from-AR-FCR mov-from-AR-M[Field(ar3) == FCR]<br />

mov-from-AR-FDR mov-from-AR-M[Field(ar3) == FDR]<br />

mov-from-AR-FIR mov-from-AR-M[Field(ar3) == FIR]<br />

mov-from-AR-FPSR mov-from-AR-M[Field(ar3) == FPSR]<br />

mov-from-AR-FSR mov-from-AR-M[Field(ar3) == FSR]<br />

mov-from-AR-I mov_ar[Format in {I28}]<br />

mov-from-AR-ig mov-from-AR-IM[Field(ar3) in {48-63 112-127}]<br />

mov-from-AR-IM mov_ar[Format in {I28 M31}]<br />

mov-from-AR-ITC mov-from-AR-M[Field(ar3) == ITC]<br />

mov-from-AR-K mov-from-AR-M[Field(ar3) in {K0 K1 K2 K3 K4 K5 K6 K7}]<br />

mov-from-AR-LC mov-from-AR-I[Field(ar3) == LC]<br />

mov-from-AR-M mov_ar[Format in {M31}]<br />

mov-from-AR-PFS mov-from-AR-I[Field(ar3) == PFS]<br />

mov-from-AR-RNAT mov-from-AR-M[Field(ar3) == RNAT]<br />

mov-from-AR-RSC mov-from-AR-M[Field(ar3) == RSC]<br />

mov-from-AR-rv none<br />

mov-from-AR-SSD mov-from-AR-M[Field(ar3) == SSD]<br />

mov-from-AR-UNAT mov-from-AR-M[Field(ar3) == UNAT]<br />

mov-from-BR mov_br[Format in {I22}]<br />

mov-from-CR mov_cr[Format in {M33}]<br />

mov-from-CR-CMCV mov-from-CR[Field(cr3) == CMCV]<br />

mov-from-CR-DCR mov-from-CR[Field(cr3) == DCR]<br />

mov-from-CR-EOI mov-from-CR[Field(cr3) == EOI]<br />

mov-from-CR-GPTA mov-from-CR[Field(cr3) == GPTA]<br />

mov-from-CR-IFA mov-from-CR[Field(cr3) == IFA]<br />

mov-from-CR-IFS mov-from-CR[Field(cr3) == IFS]<br />

mov-from-CR-IHA mov-from-CR[Field(cr3) == IHA]<br />

mov-from-CR-IIM mov-from-CR[Field(cr3) == IIM]<br />

mov-from-CR-IIP mov-from-CR[Field(cr3) == IIP]<br />

mov-from-CR-IIPA mov-from-CR[Field(cr3) == IIPA]<br />

mov-from-CR-IPSR mov-from-CR[Field(cr3) == IPSR]<br />

mov-from-CR-IRR mov-from-CR[Field(cr3) in {IRR0 IRR1 IRR2 IRR3}]<br />

第 3 巻 : リソースと依存関係のセマンティックス 3:363


表 5-5. 命令クラス ( 続き )<br />

クラス イベント / 命令<br />

mov-from-CR-ISR mov-from-CR[Field(cr3) == ISR]<br />

mov-from-CR-ITIR mov-from-CR[Field(cr3) == ITIR]<br />

mov-from-CR-ITM mov-from-CR[Field(cr3) == ITM]<br />

mov-from-CR-ITV mov-from-CR[Field(cr3) == ITV]<br />

mov-from-CR-IVA mov-from-CR[Field(cr3) == IVA]<br />

mov-from-CR-IVR mov-from-CR[Field(cr3) == IVR]<br />

mov-from-CR-LID mov-from-CR[Field(cr3) == LID]<br />

mov-from-CR-LRR mov-from-CR[Field(cr3) in {LRR0 LRR1}]<br />

mov-from-CR-PMV mov-from-CR[Field(cr3) == PMV]<br />

mov-from-CR-PTA mov-from-CR[Field(cr3) == PTA]<br />

mov-from-CR-rv none<br />

mov-from-CR-TPR mov-from-CR[Field(cr3) == TPR]<br />

mov-from-IND mov_indirect[Format in {M43}]<br />

mov-from-IND-CPUID mov-from-IND[Field(ireg) == cpuid]<br />

mov-from-IND-DBR mov-from-IND[Field(ireg) == dbr]<br />

mov-from-IND-IBR mov-from-IND[Field(ireg) == ibr]<br />

mov-from-IND-PKR mov-from-IND[Field(ireg) == pkr]<br />

mov-from-IND-PMC mov-from-IND[Field(ireg) == pmc]<br />

mov-from-IND-PMD mov-from-IND[Field(ireg) == pmd]<br />

mov-from-IND-priv mov-from-IND[Field(ireg) in {dbr ibr pkr pmc rr}]<br />

mov-from-IND-RR mov-from-IND[Field(ireg) == rr]<br />

mov-from-PR mov_pr[Format in {I25}]<br />

mov-from-PSR mov_psr[Format in {M36}]<br />

mov-from-PSR-um mov_um[Format in {M36}]<br />

mov-ip mov_ip[Format in {I25}]<br />

mov-to-AR mov-to-AR-M, mov-to-AR-I<br />

mov-to-AR-BSP mov-to-AR-M[Field(ar3) == BSP]<br />

mov-to-AR-BSPSTORE mov-to-AR-M[Field(ar3) == BSPSTORE]<br />

mov-to-AR-CCV mov-to-AR-M[Field(ar3) == CCV]<br />

mov-to-AR-CFLG mov-to-AR-M[Field(ar3) == CFLG]<br />

mov-to-AR-CSD mov-to-AR-M[Field(ar3) == CSD]<br />

mov-to-AR-EC mov-to-AR-I[Field(ar3) == EC]<br />

mov-to-AR-EFLAG mov-to-AR-M[Field(ar3) == EFLAG]<br />

mov-to-AR-FCR mov-to-AR-M[Field(ar3) == FCR]<br />

mov-to-AR-FDR mov-to-AR-M[Field(ar3) == FDR]<br />

mov-to-AR-FIR mov-to-AR-M[Field(ar3) == FIR]<br />

mov-to-AR-FPSR mov-to-AR-M[Field(ar3) == FPSR]<br />

mov-to-AR-FSR mov-to-AR-M[Field(ar3) == FSR]<br />

mov-to-AR-gr mov-to-AR-M[Format in {M29}], mov-to-AR-I[Format in {I26}]<br />

3:364 第 3 巻 : リソースと依存関係のセマンティックス


表 5-5. 命令クラス ( 続き )<br />

クラス イベント / 命令<br />

mov-to-AR-I mov_ar[Format in {I26 I27}]<br />

mov-to-AR-ig mov-to-AR-IM[Field(ar3) in {48-63 112-127}]<br />

mov-to-AR-IM mov_ar[Format in {I26 I27 M29 M30}]<br />

mov-to-AR-ITC mov-to-AR-M[Field(ar3) == ITC]<br />

mov-to-AR-K mov-to-AR-M[Field(ar3) in {K0 K1 K2 K3 K4 K5 K6 K7}]<br />

mov-to-AR-LC mov-to-AR-I[Field(ar3) == LC]<br />

mov-to-AR-M mov_ar[Format in {M29 M30}]<br />

mov-to-AR-PFS mov-to-AR-I[Field(ar3) == PFS]<br />

mov-to-AR-RNAT mov-to-AR-M[Field(ar3) == RNAT]<br />

mov-to-AR-RSC mov-to-AR-M[Field(ar3) == RSC]<br />

mov-to-AR-SSD mov-to-AR-M[Field(ar3) == SSD]<br />

mov-to-AR-UNAT mov-to-AR-M[Field(ar3) == UNAT]<br />

mov-to-BR mov_br[Format in {I21}]<br />

mov-to-CR mov_cr[Format in {M32}]<br />

mov-to-CR-CMCV mov-to-CR[Field(cr3) == CMCV]<br />

mov-to-CR-DCR mov-to-CR[Field(cr3) == DCR]<br />

mov-to-CR-EOI mov-to-CR[Field(cr3) == EOI]<br />

mov-to-CR-GPTA mov-to-CR[Field(cr3) == GPTA]<br />

mov-to-CR-IFA mov-to-CR[Field(cr3) == IFA]<br />

mov-to-CR-IFS mov-to-CR[Field(cr3) == IFS]<br />

mov-to-CR-IHA mov-to-CR[Field(cr3) == IHA]<br />

mov-to-CR-IIM mov-to-CR[Field(cr3) == IIM]<br />

mov-to-CR-IIP mov-to-CR[Field(cr3) == IIP]<br />

mov-to-CR-IIPA mov-to-CR[Field(cr3) == IIPA]<br />

mov-to-CR-IPSR mov-to-CR[Field(cr3) == IPSR]<br />

mov-to-CR-IRR mov-to-CR[Field(cr3) in {IRR0 IRR1 IRR2 IRR3}]<br />

mov-to-CR-ISR mov-to-CR[Field(cr3) == ISR]<br />

mov-to-CR-ITIR mov-to-CR[Field(cr3) == ITIR]<br />

mov-to-CR-ITM mov-to-CR[Field(cr3) == ITM]<br />

mov-to-CR-ITV mov-to-CR[Field(cr3) == ITV]<br />

mov-to-CR-IVA mov-to-CR[Field(cr3) == IVA]<br />

mov-to-CR-IVR mov-to-CR[Field(cr3) == IVR]<br />

mov-to-CR-LID mov-to-CR[Field(cr3) == LID]<br />

mov-to-CR-LRR mov-to-CR[Field(cr3) in {LRR0 LRR1}]<br />

mov-to-CR-PMV mov-to-CR[Field(cr3) == PMV]<br />

mov-to-CR-PTA mov-to-CR[Field(cr3) == PTA]<br />

mov-to-CR-TPR mov-to-CR[Field(cr3) == TPR]<br />

mov-to-IND mov_indirect[Format in {M42}]<br />

mov-to-IND-CPUID mov-to-IND[Field(ireg) == cpuid]<br />

第 3 巻 : リソースと依存関係のセマンティックス 3:365


表 5-5. 命令クラス ( 続き )<br />

クラス イベント / 命令<br />

mov-to-IND-DBR mov-to-IND[Field(ireg) == dbr]<br />

mov-to-IND-IBR mov-to-IND[Field(ireg) == ibr]<br />

mov-to-IND-PKR mov-to-IND[Field(ireg) == pkr]<br />

mov-to-IND-PMC mov-to-IND[Field(ireg) == pmc]<br />

mov-to-IND-PMD mov-to-IND[Field(ireg) == pmd]<br />

mov-to-IND-priv mov-to-IND<br />

mov-to-IND-RR mov-to-IND[Field(ireg) == rr]<br />

mov-to-PR mov-to-PR-allreg, mov-to-PR-rotreg<br />

mov-to-PR-allreg mov_pr[Format in {I23}]<br />

mov-to-PR-rotreg mov_pr[Format in {I24}]<br />

mov-to-PSR-l mov_psr[Format in {M35}]<br />

mov-to-PSR-um mov_um[Format in {M35}]<br />

mux mux1, mux2<br />

none -<br />

pack pack2, pack4<br />

padd padd1, padd2, padd4<br />

pavg pavg1, pavg2<br />

pavgsub pavgsub1, pavgsub2<br />

pcmp pcmp1, pcmp2, pcmp4<br />

pmax pmax1, pmax2<br />

pmin pmin1, pmin2<br />

pmpy pmpy2<br />

pmpyshr pmpyshr2<br />

pr-and-writers pr-gen-writers-int[Field(ctype) in {and andcm}],<br />

pr-gen-writers-int[Field(ctype) in {or.andcm and.orcm}]<br />

pr-gen-writers-fp fclass, fcmp<br />

pr-gen-writers-int cmp, cmp4, tbit, tnat<br />

pr-norm-writers-fp pr-gen-writers-fp[Field(ctype)==]<br />

pr-norm-writers-int pr-gen-writers-int[Field(ctype)==]<br />

pr-or-writers pr-gen-writers-int[Field(ctype) in {or orcm}],<br />

pr-gen-writers-int[Field(ctype) in {or.andcm and.orcm}]<br />

pr-readers-br br.call, br.cond, brl.call, brl.cond, br.ret, br.wexit, br.wtop, break.b, nop.b, ReservedBQP<br />

pr-readers-nobr-nomovpr add, addl, addp4, adds, and, andcm, break.f, break.i, break.m, break.x, chk.s, chk-a, cmp,<br />

cmp4, cmpxchg, czx, dep, extr, fp-arith, fp-non-arith, fc, fchkf, fclrf, fcmp, fetchadd, fpcmp,<br />

fsetc, fwb, getf, invala-all, itc.i, itc.d, itr.i, itr.d, ld, ldf, ldfp, lfetch-all, mf, mix,<br />

mov-from-AR-M, mov-from-AR-IM, mov-from-AR-I, mov-to-AR-M, mov-to-AR-I,<br />

mov-to-AR-IM, mov-to-BR, mov-from-BR, mov-to-CR, mov-from-CR, mov-to-IND,<br />

mov-from-IND, mov-ip, mov-to-PSR-l, mov-to-PSR-um, mov-from-PSR,<br />

mov-from-PSR-um, movl, mux, nop.f, nop.i, nop.m, nop.x, or, pack, padd, pavg, pavgsub,<br />

pcmp, pmax, pmin, pmpy, pmpyshr, popcnt, probe-all, psad, pshl, pshladd, pshr,<br />

pshradd, psub, ptc.e, ptc.g, ptc.ga, ptc.l, ptr.d, ptr.i, ReservedQP, rsm, setf, shl, shladd,<br />

shladdp4, shr, shrp, srlz.i, srlz.d, ssm, st, stf, sub, sum, sxt, sync, tak, tbit, thash, tnat, tpa,<br />

ttag, unpack, xchg, xma, xmpy, xor, zxt<br />

3:366 第 3 巻 : リソースと依存関係のセマンティックス


表 5-5. 命令クラス ( 続き )<br />

クラス イベント / 命令<br />

pr-unc-writers-fp pr-gen-writers-fp[Field(ctype)==unc] 11 , fprcpa 11 , fprsqrta 11 , frcpa 11 , frsqrta 11<br />

pr-unc-writers-int pr-gen-writers-int[Field(ctype)==unc] 11<br />

pr-writers pr-writers-int, pr-writers-fp<br />

pr-writers-fp pr-norm-writers-fp, pr-unc-writers-fp<br />

pr-writers-int pr-norm-writers-int, pr-unc-writers-int, pr-and-writers, pr-or-writers<br />

predicatable-instructions mov-from-PR, mov-to-PR, pr-readers-br, pr-readers-nobr-nomovpr<br />

priv-ops mov-to-IND-priv, bsw, itc.i, itc.d, itr.i, itr.d, mov-to-CR, mov-from-CR, mov-to-PSR-l,<br />

mov-from-PSR, mov-from-IND-priv, ptc.e, ptc.g, ptc.ga, ptc.l, ptr.i, ptr.d, rfi, rsm, ssm, tak,<br />

tpa<br />

probe-all probe-fault, probe-nofault<br />

probe-fault probe[Format in {M40}]<br />

probe-nofault probe[Format in {M38 M39}]<br />

psad psad1<br />

pshl pshl2, pshl4<br />

pshladd pshladd2<br />

pshr pshr2, pshr4<br />

pshradd pshradd2<br />

psub psub1, psub2, psub4<br />

ReservedBQP - 15<br />

ReservedQP - 16<br />

rse-readers alloc, br.call, br.ia, br.ret, brl.call, cover, flushrs, loadrs, mov-from-AR-BSP,<br />

mov-from-AR-BSPSTORE, mov-to-AR-BSPSTORE, mov-from-AR-RNAT,<br />

mov-to-AR-RNAT, rfi<br />

rse-writers alloc, br.call, br.ia, br.ret, brl.call, cover, flushrs, loadrs, mov-to-AR-BSPSTORE, rfi<br />

st st1, st2, st4, st8, st8.spill, st16<br />

st-postinc stf[Format in {M10}], st[Format in {M5}]<br />

stf stfs, stfd, stfe, stf8, stf.spill<br />

sxt sxt1, sxt2, sxt4<br />

sys-mask-writers-partial rsm, ssm<br />

unpack unpack1, unpack2, unpack4<br />

unpredicatable-instructions alloc, br.cloop, br.ctop, br.cexit, br.ia, brp, bsw, clrrrb, cover, epc, flushrs, loadrs, rfi<br />

user-mask-writers-partial rum, sum<br />

xchg xchg1, xchg2, xchg4, xchg8<br />

zxt zxt1, zxt2, zxt4<br />

第 3 巻 : リソースと依存関係のセマンティックス 3:367


3:368 第 3 巻 : リソースと依存関係のセマンティックス


第 II 部 : IA-32命令セットの説明


IA-32 基本命令リファレンス 1<br />

本章では、すべての IA-32命令 と 、Itanium ® アーキテクチャに基づく プロセッサ上のItanium<br />

ベー ス ・ シ ス テ ム環境お よ び IA-32 システム環境内での各命令の動作を示す。 特に断ら な<br />

い限り 、 すべての IA-32 命令、 MMX ® 命令、 ス ト リ ー ミ ング SIMD 拡張命令は、 『IA-32<br />

インテル ® アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル』 の定義に従っ<br />

て動作する。<br />

3 巻では、 整数、 浮動小数点、 MMX テクノロジ、 スト リーミング SIMD 拡張命令テ ク ノ<br />

ロジ、システム用の命令をカバーする IA-32 アー キテ ク チャの完全な命令セ ッ ト を構成す<br />

る各命令を説明する。 命令の説明はアルフ ァ ベ ッ ト 順に整理してある。 各命令について、<br />

オペ コ ー ド 、 必要なオペラ ン ド 、 説明の各項か ら な る特定の記述形式に よ り 各オペラ ン ド<br />

の組み合わせを示している。 その他に、 各命令について、 命令およびそのオペラン ド 、 操<br />

作に関する説明、 EFLAGS レ ジ ス タの フ ラ グに対する命令の影響の説明、 発生する可能性<br />

がある例外の要約 も併記する。<br />

すべての IA-32 命令について、 以下の関係が適用 さ れる。<br />

• 書き込み - IA-32 命令に よ る、 任意の IA-32 汎用レ ジ ス タ、 浮動小数点ま たは ス ト<br />

リーミングSIMD 拡張命令レ ジ ス タ、 MMX テクノロジ ・ レジスタの書き込みは、<br />

IA-32 命令セ ッ ト の実行が完了した と き、 IA-32 状態を保持す る よ う に定義 さ れた<br />

Itanium アーキテクチャのレジスタに反映される。<br />

• 読み込み - IA-32 命令に よ る、 任意の IA-32 汎用レ ジ ス タ、 浮動小数点ま たは ス ト<br />

リーミングSIMD 拡張命令レ ジ ス タ、 MMX テクノロジ ・ レジスタの読み込みは、<br />

IA-32 命令セ ッ ト に移行した後、 IA-32 状態を保持する よ う に定義 さ れた Itanium<br />

アーキテクチャのレジスタの状態を参照する。<br />

• 状態のマッピング - IA-32 数値命令は、 FCW、 FSW、 FTW、 FCS、 FIP、 FOP、 FDS、<br />

およびFEA レ ジ ス タ内の命令ス テ ー タ ス に よ っ て制御 さ れ、 そのス テ ー タ ス を反映<br />

する。 IA-32 命令セ ッ ト か ら 移行す る と き、 IA-32 状態を保持す る よ う に定義された<br />

Itanium アーキテクチャ数値ステータスおよびコン ト ロール ・ リ ソースは、 FCR、<br />

FSR、 FIR、 FDR レジスタ内のすべての先行する IA-32 数値命令の結果を反映す る。<br />

IA-32 命令セ ッ ト に移行す る と き、 IA-32 状態を保持す る よ う に定義 さ れた Itanium<br />

アーキテクチャ数値ステータスおよびコン ト ロール ・ リ ソースは、 IA-32 数値命令に<br />

よって参照される。<br />

1.1 追加のインテル ® Itanium ® アーキテクチャ・フォルト<br />

Itanium ベース ・ システム環境内のすべての IA-32 命令について、 以下の フ ォ ル ト 動作が<br />

定義 さ れてい る。<br />

• IA-32 フォルト - 特に断らない限り、 すべての IA-32 フォルトは、 『IA-32 インテル ®<br />

ア ー キテ ク チ ャ ・ ソ フ ト ウ ェ ア ・ デベロ ッ パ ー ズ ・ マニ ュ アル』 の定義に従 っ て実<br />

行される。 IA-32 フォルトは、 IA-32_Exception 割り込みベク タ に よ って発生する。<br />

• IA-32 GPFault - セグメン ト ・ デ ィ スク リ プタ ・ レジスタの P ビッ トが0 にセッ ト さ<br />

れてい る場合、 そのセグ メ ン ト は NULL セグメン ト である。 P ビッ トが0 にセッ ト<br />

された DSD、 ESD、 FSD、 GSD レジスタを介してIA-32 メモリ参照を行う と、 IA-32<br />

GPFault が発生する。<br />

• Itanium アーキテクチャ Low FP Reg ( 下位浮動小数点レジスタ ) フォルト - PSR.dfl<br />

が 1 の場合、 任意の IA-32 MMX テクノロジ命令、 スト リーミングSIMD 拡張命令、<br />

第 3 巻 : IA-32 基本命令リファレンス 3:371


ま たは浮動小数点命令を実行する と 、 FR2 ~ 31 が参照されるかど う かに関係な く 、<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト が発生す る。<br />

• Itanium アーキテクチャ High FP Reg フォルト ( 上位浮動小数点レジスタ ) フォルト<br />

- PSR.dfh が 1 の場合、 br.ia または rfi に続 く 最初のターゲ ッ ト IA-32 命令を実行<br />

する と、 FR32 ~ 127 が参照される か ど う かに関係な く 、 浮動小数点レ ジ ス タ無効<br />

フォルトが発生する。<br />

• Itanium 命令メモリ・フォルト - IA-32 命令、 MMX 命令、 ま たは ス ト リ ー ミ ング<br />

SIMD 拡張命令を実行のために フ ェ ッ チする と き、 参照 さ れる各仮想ペー ジ上で、 以<br />

下の追加の Itanium 命令メモ リ ・ フ ォ ル ト が発生する場合がある。<br />

• 代替命令 TLB フォルト<br />

• VHPT 命令フ ォ ル ト<br />

• 命令 TLB フォルト<br />

• 命令ペー ジ不在フ ォ ル ト<br />

• 命令 NaT ページ参照フォル ト<br />

• 命令キ ー ・ ミ ス ・ フ ォ ル ト<br />

• 命令キ ー許可フ ォ ル ト<br />

• 命令ア ク セス権フ ォ ル ト<br />

• 命令ア ク セス ・ ビ ッ ト ・ フ ォ ル ト<br />

• Itanium アーキテクチャ・データ・メモリ・フォルト - MMX 命令お よ びス ト リ ー ミ<br />

ング SIMD 拡張命令を含む IA-32 命令セ ッ ト か らのメモ リ ・ オペラ ン ド の読み込み<br />

または書き込みを行う とき、 影響を受ける各仮想ページ上で、 以下の追加のItanium<br />

アーキテクチャ ・ データ ・ メモリ ・ フォルトが発生する場合がある。<br />

• ネス ト された TLB フォルト<br />

• 代替デ ー タ TLB フォルト<br />

• VHPT データ ・ フォル ト<br />

• データ TLB フォルト<br />

• データ ・ ページ不在フォルト<br />

• データ NaT ページ参照フォル ト<br />

• データ ・ キー ・ ミス ・ フォルト<br />

• データ ・ キー許可フォルト<br />

• データ ・ アクセス権フォルト<br />

• データ・ダーティ・ビット ・フォルト<br />

• データ・アクセス・ビット ・フォルト<br />

1.2 IA-32 命令リファレンス・ページの読み方<br />

本節では、 本章の大部分を構成す る命令 リ フ ァ レ ン ス ・ ペー ジの さ ま ざ ま な説明項の記載<br />

内容について説明す る。 さ ら に、 それ ら の項で使用 さ れる表記法 と 省略形式について も 説<br />

明する。<br />

1.2.1 IA-32 命令フォーマット<br />

以下に、本章の各イ ン テル ® アーキテクチャ命令の説明に使用するフォーマッ トの例を示<br />

す。<br />

3:372 第 3 巻 : IA-32 基本命令リファレンス


CMC ─ Complement Carry Flag<br />

1.2.1.1 オペコード欄<br />

1.2.1.2 命令欄<br />

オペコード 命令 説明<br />

F5 CMC キャリー・フラグの補数をとる。<br />

「オペ コ ー ド 」 欄には、 各命令フ ォ ー マ ッ ト に対して生成される完全なオブジ ェ ク ト ・ コ ー<br />

ド を示す。 可能な場合、 コ ー ド は、 メモ リ 内に現れるの と 同じ順序で 16 進バイ ト と して<br />

示される。 16 進バイ ト 以外のエン ト リ の定義は、 以下の と お り であ る。<br />

• /digit - 0 から 7 ま での数字で、 命令の ModR/M バイ ト が r/m ( レジスタまたはメモリ )<br />

オペラン ド だけを使用する こ と を示す。 reg フィールドには、 命令のオペコードを拡<br />

張する数字が入っ ている。<br />

• /r - 命令の ModR/M バイ ト に、 レジスタ ・ オペラン ド と R/M オペラン ド の両方があ<br />

ることを示す。<br />

• cb、cw、cd、cp - オペコー ド の後に続 く 1 バイ ト (cb)、 2 バイ ト (cw)、 4 バイ ト<br />

(cd)、 または 6 バイ ト (cp) の値であ り、 コ ー ド ・ オフセ ッ ト 、 お よ びコ ー ド ・ セグメ<br />

ント ・レジスタの新しい値を指定できる。<br />

• ib、iw、id - オペコ ー ド、 ModM/R バイ ト、 またはスケール ・ インデク ッス ・ バイ ト<br />

の後に続 く 命令への 1 バイ ト (ib)、 2 バイ ト (iw)、 または 4 バイ ト (id) の即値オペラ<br />

ン ド である。 オペラン ド が符号付きかど うかは、 オペコ ー ド によ って決ま る。 すべ<br />

てのワ ー ド およびダブルワ ー ド が下位バイ ト から先に示される。<br />

• +rb、+rw、+rd - 0 から 7 までのレジスタ ・ コードであり、 + 符号の左側に現れる 16<br />

進バイ ト に加算されて、 単一のオペコ ー ド ・ バイ ト を構成する。 すべてのレ ジスタ ・<br />

コードを表 1-1 に示す。<br />

• +i - オペラン ド の 1 つが FPU レジスタ ・ スタックからのST(i) であ る と き に浮動小数<br />

点命令で使用 さ れる数値。 数値 i (0 から 7 までの数値) は + 符号の左側に現れる 16<br />

進バイ ト に加算されて、 単一のオペコ ー ド ・ バイ ト を構成する。<br />

表 1-1. +rb、+rw、+rd に対応するレジスタのコード化<br />

rb rw rd<br />

AL = 0 AX = 0 EAX = 0<br />

CL = 1 CX = 1 ECX = 1<br />

DL = 2 DX = 2 EDX = 2<br />

BL = 3 BX = 3 EBX = 3<br />

rb rw rd<br />

AH = 4 SP = 4 ESP = 4<br />

CH = 5 BP = 5 EBP = 5<br />

DH = 6 SI = 6 ESI = 6<br />

BH = 7 DI = 7 EDI = 7<br />

「命令」 欄は、 ASM386 プ ロ グ ラ ムに現れる場合の命令文のシン タ ッ ク スを示す。 以下に、<br />

命令文内のオペラ ン ド を表現する ために使用 さ れる記号の一覧を示す。<br />

• rel8 - 命令の終 り の前の 128 バイ ト から命令の終りの後の 127 バイ ト までの範囲の相<br />

対ア ド レス。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:373


• rel16 および rel32 - アセンブル結果の命令と 同じ コ ー ド ・ セグメ ン ト 内の相対ア ド レ<br />

ス。 記号 rel16 は、 オペラン ド ・ サイズ属性が 16 ビ ッ ト である命令に適用 さ れ、<br />

rel32 はオペラン ド ・ サイズ属性が 32 ビ ッ ト であ る命令に適用される。<br />

• ptr16:16 および ptr16:32 - 一般的に命令のコード・セグメントとは異なるコード・セ<br />

グメント内のfar ポインタ。 16:16 の表記法は、 ポ イ ン タの値が 2 つの部分からなっ<br />

ている こ と を示す。 コ ロ ンの左側の値は、 16 ビットのセレクタ、 すなわちコード ・<br />

セグメント ・レジスタに送られる値である。 右側の値はデスティネーション・セグ<br />

メン ト内のオフセッ ト に対応する。 記号ptr16:16 は命令のオペラン ド ・ サイズ属性<br />

が 16 ビ ッ ト であ る場合に使用 さ れ、 記号 ptr16:32 は オペラ ン ド ・ サ イ ズ属性が 32<br />

ビ ッ ト である場合に使用 さ れる。<br />

• r8 - 汎用バイ ト ・ レ ジ ス タ AL、 CL、 DL、 BL、 AH、 CH、 DH、 BH の中の 1 つ。<br />

• r16 - 汎用ワ ー ド ・ レ ジ ス タ AX、 CX、 DX、 BX、 SP、 BP、 SI、 DI の中の 1 つ。<br />

• r32 - 汎用ダブルワ ー ド ・ レ ジ ス タ EAX、 ECX、 EDX、 EBX、 ESP、 EBP、 ESI、 EDI<br />

の中の 1 つ。<br />

• imm8 - 即値バイ ト 値。 記号 imm8 は -128 から +127 ま での符号付き数値であ る。<br />

imm8 が ワ ー ド ま たはダブルワ ー ド のオペラ ン ド と 結合 さ れる命令については、 即値<br />

は符号拡張されてワ ー ド ま たはダブルワ ー ド を構成する。 その場合は、 ワ ー ド の上<br />

位バイ ト は即値の最上位ビ ッ ト で埋められる。<br />

• imm16 - オペラン ド ・ サイズ属性が 16 ビ ッ ト である命令に使用 さ れる即値ワ ー ド<br />

値。 こ れは -32,768 から +32,767 までの数値である。<br />

• imm32 - オペラン ド ・ サイズ属性が 32 ビ ッ ト である命令に使用 さ れる即値ダブル<br />

ワード値。 これには -2,147,483,648 から +2,147,483,647 までの数値を使用できる。<br />

• r/m8 - 汎用バイ ト ・ レ ジ ス タ (AL、 BL、 CL、 DL、 AH、 BH、 CH、 および DH) か、<br />

メモリからのバイ ト かの内容であるバイ ト ・ オペラン ド。<br />

• r/m16 - オペラン ド ・ サイズ属性が 16 ビッ トである命令に使用される汎用ワード ・<br />

レジスタ・オペランドまたはメモリ ・オペランド。 汎用ワード ・レジスタは、 AX、<br />

BX、 CX、 DX、 SP、 BP、 SI、 DI である。 メモ リ の内容は、 実効アド レスの計算に<br />

よって与えられるアドレスにある。<br />

• r/m32 - オペラン ド ・ サイズ属性が 32 ビ ッ ト である命令に使用 さ れる汎用ダブル<br />

ワード ・レジスタ・オペランドまたはメモリ・オペランド。 汎用ダブルワード ・レ<br />

ジスタは、 EAX、 EBX、 ECX、 EDX、 ESP、 EBP、 ESI、 EDI である。 メモ リ の内容<br />

は、 実効アドレスの計算によって与えられるアドレスにある。<br />

• m - 16 または 32 ビットのメモリ ・オペランド。<br />

• m8 - 通常、 変数名 ま たは配列名 と して表されるが、 DS:(E)SI または ES:(E)DI レジス<br />

タによってアド レス指定されるバイト ・ メモリ ・ オペランド。 これはスト リング命<br />

令およ び XLAT 命令に対してのみ使用される。<br />

• m16 - 通常、 変数名ま たは配列名 と して表されるが、 DS:(E)SI または ES:(E)DI レジ<br />

スタによってアドレス指定されるワー ド ・ メモリ ・ オペランド。 これはスト リング<br />

命令に対してのみ使用 さ れる。<br />

• m32 - 通常、 変数名ま たは配列名 と して表されるが、 DS:(E)SI または ES:(E)DI レジ<br />

スタによってアドレス指定されるダブルワー ド ・ メモリ ・ オペランド。 これはスト<br />

リング命令に対してのみ使用される。<br />

• m64 - クワッ ドワード ・メモリ ・オペランド。 これはCMPXCHG8B 命令に対しての<br />

み使用される。<br />

• m16:16、m16:32 - 2 つの数値からなる far ポインタを内容とするメモリ ・ オペラン<br />

ド 。 コ ロ ンの左側の数値は ポ イ ン タ のセグ メ ン ト ・ セ レ ク タ に対応し、 右側の数値<br />

は ポ イ ン タ のオ フ セ ッ ト に対応す る。<br />

3:374 第 3 巻 : IA-32 基本命令リファレンス


1.2.1.3 説明欄<br />

1.2.1.4 説明<br />

1.2.2 操作<br />

• m16&32、m16&16、m32&32 - サイズがアンパーサン ド記号の左側と右側に示され<br />

るデータ項目の対からなるメモリ ・ オペラン ド。 すべてのメモリ ・ アド レス指定<br />

モー ドが可能である。 m16&16 と m32&32 オペラン ド は BOUND 命令で使用され、<br />

配列イ ンデ ッ ク スの上限 と 下限を内容 と す る オペラ ン ド を提供す る。 m16&32 オペ<br />

ランドは LIDT と LGDT で使用 さ れ、 対応する GDTR および IDTR レジスタのlimit<br />

フィールドにロードするワード、 ベース・フィールドにロードするダブルワードを<br />

提供す る。<br />

• moffs8、moffs16、moffs32 - MOV 命令の一部のバ リ エー シ ョ ンに よ っ て使用される<br />

バイ ト、 ワー ド、 またはダブルワー ド型のシンプル ・ メモリ変数 ( メモリ ・ オフ<br />

セッ ト )。 実際のアドレスは、 セグメン ト ・ ベースからのシンプル ・ オフセッ ト に<br />

よって与えられる。 命令にはModR/M バイ ト は使用されない。 moffs の次の数値はセ<br />

グメン ト のサイズであり、 これは命令のアドレス ・ サイズ属性によ って決まる。<br />

• Sreg - セグメン ト ・ レジスタ。 セグメン ト ・ レジスタのビ ッ ト割り当ては、 ES=0、<br />

CS=1、 SS=2、 DS=3、 FS=4、 GS=5。<br />

• m32real、m64real、m80real - ( それぞれ ) 単精度、 倍精度、 お よ び拡張浮動小数点<br />

数のメモ リ ・ オペラ ン ド である。<br />

• m16int、m32int、m64int - ( それぞれ ) ワード、 ショート、 ロング整数のメモリ ・オ<br />

ペラン ドである。<br />

• ST または ST(0) - FPU レ ジ ス タ ・ ス タ ッ ク の一番上の要素。<br />

• ST(i) - FPU レジスタ ・ スタックの一番上から i 番目の要素 (i = 0 ~ 7)。<br />

• mm - MMX テクノロジ ・ レジスタ。 64 ビット MMX テクノロジ ・ レジスタ MM0 か<br />

ら MM7 まで。<br />

• mm/m32 - MMX テクノロジ ・ レジスタの下位32 ビッ トまたは32 ビッ トのメモリ ・<br />

オペラン ド。 64 ビッ トのMMX テクノロジ ・ レジスタは MM0 から MM7 まで。 メ<br />

モリの内容は、 実効アドレス計算によって与えられるアドレスにある。<br />

• mm/m64 - MMX テクノロジ ・ レジスタまたは 64 ビッ トのメモリ ・オペランド。 64<br />

ビッ ト MMX テクノロジ ・ レジスタは MM0 から MM7 まで。 メモリの内容は実効ア<br />

ドレス計算によって与えられるアドレスにある。<br />

「命令」 欄の次の 「説明」 欄では、 各種の命令フ ォ ーマ ッ ト について簡単に説明する。 命<br />

令のフ ォ ーマ ッ ト の下の 「説明」 およ び 「操作」 の項には、 命令の動作の詳細が記載して<br />

ある。<br />

「説明」 の項では、 命令の目的と 必要なオペラ ン ド について説明する。 さ ら に、 命令のフ<br />

ラグに対する影響についても説明する。<br />

「操作」 の項には、 命令のアルゴ リ ズム に関す る説明を記載す る ( 疑似 コ ー ド で記述 )。 こ<br />

の疑似コ ー ド は、 Algol または Pascal 言語に似た表記法を使用してい る。 アルゴ リ ズム は、<br />

以下の要素か ら な っ ている。<br />

• コメントは記号の対"(*" および"*)" で囲まれる。<br />

• 複合文は、 それぞれ、 if 文では IF、 THEN、 ELSE、 FI、 do 文では DO と OD、 また<br />

は case 文では CASE ... OF と ESAC などのキーワー ドで囲まれる。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:375


• レ ジ ス タ名は暗黙に レ ジ ス タ の内容を意味する。 ブ ラ ケ ッ ト で囲 ま れたレ ジ ス タ名<br />

は、 暗黙に、 アド レスがそのレジスタにストアされているロケーションの内容を意 味する。 例えば、 ES:[DI] は、 ES セグメン ト相対アド レスがレジスタ DI にス トアさ<br />

れている ロ ケ ーシ ョ ンの内容を示す。 [SI] は、 レジスタ SI にス トアされている、 SI<br />

のデフ ォル ト ・ セグメン ト (DS) またはオーバライド されたセグメントの相対アドレ スの内容を示す。<br />

• 例えば (E)SI のよ うに、 汎用レジスタ名の中で "E" がかっ こで囲まれているのは、 現<br />

在のア ド レ ス ・ サイズ属性が 16 である場合はオフセッ ト が SI レジスタから読み込<br />

まれ、 アド レス ・ サイズ属性が 32 である場合は ESI レジスタから読み込まれること<br />

を示す。<br />

• ブラケ ッ ト はメモ リ ・ オペラン ド に対しても使用され、 その場合は、 メモ リ ・ ロ<br />

ケ ー シ ョ ンの内容がセグ メ ン ト 相対オ フ セ ッ ト である こ と を意味す る。 例えば、<br />

[SRC] はソース ・ オペランドの内容がセグメント相対オフセットであることを示す。 • A ← B; は、 B の値が A に代入される こ と を示す。<br />

• 記号 =、 ≠、 ≧、 ≦は 2 つの値の比較に使用される関係演算子であ り 、 それぞれ、<br />

「等しい」、 「等し く ない」、 「 よ り 大き いか等しい」、 「 よ り 小 さ いか等しい」 を意味す<br />

る。 例えば、 関係式 A=B は、 A の値が B に等しい場合は TRUE ( 真 ) であり、 そ う<br />

でない場合は FALSE ( 偽 ) である。<br />

• 式 "> COUNT" は、 デステ ィ ネーシ ョ ン ・ オペラン ド がカウン ト ・<br />

オペラン ド が示すビッ ト 数だけそれぞれ左または右にシフ ト されるこ と を示す。<br />

以下の識別子が、 アルゴ リ ズムの記述に使用 さ れる。<br />

• OperandSize と AddressSize - OperandSize 識別子は、 16 ビッ トか32 ビッ トの命令<br />

のオペラン ド ・ サイズ属性を表す。 AddressSize 識別子は、 16 ビッ トか32 ビットの<br />

ア ド レ ス ・ サ イ ズ属性を表す。 例えば、 以下の疑似 コ ー ド は、 オペラ ン ド ・ サイ ズ<br />

属性が使用 さ れる CMPS 命令の フ ォ ー マ ッ ト に依存す る こ と を示している。<br />

F instruction = CMPSW<br />

THEN OperandSize ← 16;<br />

ELSE<br />

IF instruction = CMPSD<br />

THEN OperandSize ← 32;<br />

FI;<br />

FI;<br />

こ れ ら の属性の決定方法の一般的ガ イ ド ラ イ ン については、 『IA-32 インテル ® アー<br />

キテクチャ ・ ソフ ト ウェア ・ ディベロッパーズ ・ マニュアル、 上巻』 第 3 章の 「オ<br />

ペラン ド ・ サイズ属性とアド レス ・ サイズ属性」 を参照のこ と。<br />

• StackAddrSize - 命令に関連す る ス タ ッ ク のア ド レ ス ・ サイ ズ属性を表す。 こ の属性<br />

の値は 16 または 32 ビッ トである( 『IA-32 インテル ® アーキテクチャ ・ ソフ ト ウェ<br />

ア・ディベロッパーズ・マニュアル、 上巻』 第 4 章の 4.2.3 項 「スタッ ク ・ アクセス<br />

におけ る ア ド レ ス ・ サ イ ズ属性」 を参照のこ と )。<br />

• SRC - ソース ・オペランドを表す。<br />

• DEST - デステ ィ ネーシ ョ ン ・ オペラン ド を表す。<br />

以下の関数が、 アルゴ リ ズムの記述に使用 さ れる。<br />

• ZeroExtend ( 値 ) - 命令のオペラ ン ド ・ サイ ズ属性に合わせたゼ ロ拡張値を返す。 例<br />

えば、 オペラ ン ド ・ サ イ ズ属性が 32 である場合は、 -10 のバイ ト 値をゼロ拡張する<br />

と、 そのバイト は F6H からダブルワー ド値000000F6H に変換される。 ZeroEztend 関<br />

数に渡された値と オペラ ン ド ・ サイズ属性が同じサイズである場合は、 ZeroExtend<br />

はその値を変えずにそのまま返す。<br />

3:376 第 3 巻 : IA-32 基本命令リファレンス


• SignExtend ( 値 ) - 命令のオペラ ン ド ・ サイズ属性に合わせた符号拡張値を返す。 例<br />

えば、 オペラ ン ド ・ サ イ ズ属性が 32 である場合は、 内容が値 -10 であるバイ ト を符<br />

号拡張す る と 、 そのバイ ト は F6H からダブルワード値FFFFFFF6H に変換される。<br />

SignEztend 関数に渡された値 と オペラ ン ド ・ サ イ ズ属性 と が同じ サ イ ズである場合<br />

は、 SignExtend はその値を変えずにそのまま返す。<br />

• SaturateSignedWordToSignedByte - 符号付き 16 ビ ッ ト 値を符号付き 8 ビット値に変<br />

換する。 符号付き 16 ビット値が-128 より小さい場合は、 その値は飽和値-128 (80H)<br />

で表される。 127 よ り 大き い場合は、 飽和値 127 (7FH) で表される。<br />

• SaturateSignedDWordToSignedWord - 符号付き 32 ビ ッ ト 値を符号付き 16 ビッ ト値<br />

に変換す る。 符号付き 32 ビッ ト値が-32768 よ り 小 さ い場合は、 その値は飽和値<br />

-32768 (8000H) で表される。 32767 よ り 大き い場合は、 飽和値 32767 (7FFFH) で表さ<br />

れる。<br />

• SaturateSignedWordToUnsignedByte - 符号付き 16 ビッ ト値を符号なし8ビッ ト値<br />

に変換す る。 符号付き 16 ビッ ト値が0 よ り 小 さ い場合は、 その値は飽和値 0 (00H)<br />

で表される。 255 よ り 大き い場合は、 飽和値 255 (FFH) で表される。<br />

• SaturateToSignedByte - 演算の結果を符号付き 8 ビ ッ ト 値と して表す。 結果が -128<br />

より小さい場合は、 その値は飽和値-128 (80H) で表される。 127 より大きい場合は、<br />

飽和値 127 (7FH) で表される。<br />

• SaturateToSignedWord - 演算の結果を符号付き 16 ビ ッ ト 値 と して表す。 結果が<br />

-32768 より小さい場合は、 その値は飽和値-32768 (8000H) で表される。 32767 より大<br />

き い場合は、 飽和値 32767 (7FFFH) で表される。<br />

• SaturateToUnsignedByte - 演算の結果を符号なし 8 ビ ッ ト 値 と して表す。 結果が 0<br />

より小さい場合は、 その値は飽和値0 (00H) で表される。 255 より大きい場合は、 飽<br />

和値 255 (FFH) で表される。<br />

• SaturateToUnsignedWord - 演算の結果を符号なし 16 ビ ッ ト 値と して表す。 結果が 0<br />

より小さい場合は、 その値は飽和値0 (00H) で表される。 65535 より大きい場合は、<br />

飽和値 65535 (FFFFH) で表される。<br />

• LowOrderWord (DEST * SRC) - ワード・オペランドにワード・オペランドを掛け、<br />

ダブルワードの結果の下位ワードをデスティネーション・オペランドにストアする。<br />

• HighOrderWord (DEST * SRC) - ワード ・オペランドにワード ・ オペランドを掛け、<br />

ダブルワードの結果の上位ワードをデスティネーション・オペランドにストアする。<br />

• Push ( 値 ) - 値をスタ ッ ク にプ ッ シュする。 プ ッ シュ されるバイ ト 数は命令のオペラ<br />

ンド ・サイズ属性によって決まる。<br />

• Pop() - 一番上のス タ ッ ク か ら値を削除し、 その値を返す。 文 EAX ← Pop(); は、 一番<br />

上のス タ ッ ク か ら 32 ビット値をEAX に代入する。 Pop は、 オペラン ド ・ サイズ属<br />

性に応じて、 ワ ー ド かダブルワ ー ド を返す。<br />

• PopRegisterStack - FPU の ST(0) レジスタを空としてマークし、 FPU レジスタ ・ ス<br />

タック ・ポインタ(TOP) を 1 だけインク リ メン ト する。<br />

• Switch-Tasks - タスク ・ スイッチを行う。<br />

• Bit(BitBase, BitOffset) - メモリまたはレジスタ内の一連のビットであるビット・スト<br />

リング内の特定ビットの値を返す。 ビットには、 レジスタ内またはメモリ ・バイト<br />

内で下位か ら上位に番号が割り振られている。 ベー ス ・ オペラン ド がレ ジス タであ<br />

る場合は、 存在可能なオ フ セ ッ ト の範囲は 0 ~ 31 である。 このオフセッ ト は、 指定<br />

されたレジスタ内のビッ ト のアド レスを指定する。 例として、 図 1-1 に関数<br />

Bit[EAX,21] の図解を示す。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:377


図 1-1. BIT[EAX,21] のビット・オフセット<br />

BitBase がメモリ ・ アド レスである場合は、 BitOffset の存在可能な範囲は -2G ビット<br />

から 2G ビッ トまでである。 アドレス指定されるビッ トには、 アドレス(BitBase +<br />

(BitOffset DIV 8)) のバイ ト 内の番号 (Offset MOD 8) が与え られる。 ただし、 DIV は負<br />

の無限大に向か う丸めを伴う符号付き除算であ り、 MOD は正の数値を返す。 図 1-2<br />

に、 こ の操作の図解を示す。<br />

図 1-2. メモリ・ビットのインデックス操作<br />

1.2.3 影響を受けるフラグ<br />

「影響を受けるフ ラグ」 の項には、命令の影響を受ける EFLAGS レジスタのフラグを示す。<br />

フラグはクリアされたときは 0 に等し く 、 セ ッ ト された と き は 1 に等しい。 算術演算およ<br />

び論理演算命令は、通常、一定の方法で値をス テ ー タ ス・ フ ラ グに代入する ( 詳細は 『IA-32<br />

インテル ® アー キ テ ク チ ャ ・ ソ フ ト ウ ェ ア ・ デ ィ ベロ ッ パ ー ズ ・ マニ ュ アル、 上巻』 付録<br />

A 「EFLAGS クロス・ リファレンス」 を参照のこ と )。 「操作」 の項では、 非従来型の代入<br />

について説明してい る。 未定義 と して示してい る フ ラ グの値は、 不確定な方法で変更 さ れ<br />

る場合がある。 記載されていないフ ラグは命令に よ って変更されない。<br />

1.2.4 影響を受ける FPU フラグ<br />

31<br />

21<br />

7 5 0 7<br />

0<br />

BitBase + 1<br />

BitOffset = 21<br />

7 0 7<br />

0 7 5<br />

BitBase<br />

BitOffset = +13<br />

BitBase BitBase − 1<br />

BitBase − 1<br />

BitOffset = −11<br />

浮動小数点命令については、 「影響を受け る FPU フ ラ グ」 の項があ り 、 そ こ で、 各命令が<br />

FPU ステータス・ワー ドの 4 つの条件 コ ー ド ・ フ ラ グに ど の よ う に影響を与え る かを説明<br />

している。<br />

3:378 第 3 巻 : IA-32 基本命令リファレンス<br />

7<br />

BitBase − 2<br />

0<br />

0<br />

0


1.2.5 保護モード例外<br />

「保護モー ド 例外」 の項には、 命令を保護モー ド で実行した と き に発生する可能性がある<br />

例外お よ びそれ ら の例外の理由を示す。 各例外は、 番号記号 (#) とその後に続く 2 文字か<br />

らなるニーモニッ ク、 括弧で囲まれたオプシ ョ ンのエラー ・ コー ドで表される。 例えば、<br />

#GP(0) はエラー ・ コー ド 0 を伴 う 一般保護例外を示す。 表 1-2 に、 各 2 文字のニー モニ ッ<br />

ク と 割 り 込みベ ク タ番号お よ び例外名 と の対応を示す。 こ れら の例外の詳細は、<br />

『IA-32 インテル ® アーキテクチャ ・ ソフ ト ウェア ・ ディベロッパーズ ・ マニュアル、 下<br />

巻』 第 5 章 「割り込み と例外の処理」 を参照のこ と。<br />

アプリケーション ・プログラマは、 例外が発生した場合は、 該当するオペレーティング・<br />

システムに付属のマニ ュアルを調べて対処する こ と 。<br />

1.2.6 実アドレス・モード例外<br />

「実ア ド レ ス ・ モー ド 例外」 の項には、 命令を実ア ド レ ス ・ モー ド で実行した と き に発生<br />

する可能性がある例外を示す。<br />

表 1-2. 例外のニーモニック、名称、およびベクタ番号<br />

ベクタ<br />

番号<br />

ニーモニック 名称 発生源<br />

0 #DE 除算エラー DIV および IDIV 命令<br />

1 #DB デバッグ 任意のコードまたはデータ参照<br />

3 #BP ブレークポイント INT 3 命令<br />

4 #OF オーバフロー INTO 命令<br />

5 #BR BOUND 範囲外 BOUND 命令<br />

6 #UD 無効オペコード ( 未定義オペコー<br />

ド )<br />

UD2 命令または予約オペコード a<br />

7 #NM デバイスなし ( 算術演算コプロ<br />

セッサなし )<br />

8 #DF<br />

ダブル・フォルト<br />

浮動小数点または WAIT/FWAIT 命令<br />

例外、NMI、または INTR を発生する可能性<br />

がある任意の命令<br />

10 #TS 無効 TSS タスク・スイッチまたは TSS アクセス<br />

11 #NP<br />

セグメントなし<br />

セグメント・レジスタのロードまたはシス<br />

テム・セグメントのアクセス<br />

12 #SS スタック・セグメント・フォルト スタック操作および SS レジスタ・ロード<br />

13 #GP<br />

一般保護<br />

任意のメモリ参照およびその他の保護<br />

チェック<br />

14 #PF ページ・フォルト 任意のメモリ参照<br />

16 #MF 浮動小数点エラー ( 算術演算フォ<br />

ルト )<br />

浮動小数点または WAIT/FWAIT 命令<br />

17 #AC アライメント・チェック 任意のメモリ・データ参照 b<br />

18 #MC マシン・チェック モデルに依存 c<br />

a. UD2 命令は、Pentium ® Pro プロセッサに導入された。<br />

b. この例外は、Intel486 TM プロセッサに導入された。<br />

c. この例外は、Pentium プロセッサに導入され、Pentium Pro プロセッサで強化された。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:379


1.2.7 仮想 8086 モード例外<br />

「仮想 8086 モ ー ド 例外」 の項には、 命令を仮想 8086 モー ドで実行したと きに発生する可<br />

能性があ る例外を示す。<br />

1.2.8 浮動小数点例外<br />

「浮動小数点例外」 の項には、 浮動小数点命令を任意のモー ド で実行した と き に発生する<br />

可能性がある追加の例外を示す。 こ れら の例外条件はすべて浮動小数点エラ ー例外 (#MF、<br />

ベクタ番号16) を発生させる。 表 1-3 に、 各 1 または 2 文字のニーモニ ッ ク と 例外名 と の<br />

対応を示す。 こ れ ら の例外の詳細は、 『IA-32 インテル ® アーキテクチャ ・ ソフ ト ウェア・<br />

デ ィ ベロ ッ パ ー ズ ・ マニ ュ アル、 上巻』 第 7 章の 7.8 節 「浮動小数点例外条件」 の説明を<br />

参照の こ と 。<br />

表 1-3. 浮動小数点例外のニーモニックおよび名称<br />

ベクタ<br />

番号<br />

16<br />

ニーモニック 名称 発生源<br />

1.3 IA-32 基本命令リファレンス<br />

#IS<br />

#IA<br />

無効浮動小数点演算 :<br />

- スタック・オーバフローまたはス<br />

タック・アンダフロー<br />

- 無効算術演算<br />

- FPU スタック・オーバフローまたは<br />

FPU スタック・アンダフロー<br />

- 無効 FPU 算術演算<br />

16 #Z 0 での浮動小数点除算 0 での FPU 除算<br />

16 #D デノーマライズされた浮動小数点演算 デノーマライズされた数値に対する演算<br />

16 #O 浮動小数点数値オーバフロー FPU 数値オーバフロー<br />

16 #U 浮動小数点数値アンダフロー FPU 数値アンダフロー<br />

16 #P 浮動小数点不正確結果 ( 精度 ) 不正確結果 ( 精度 )<br />

本章の以降では、 インテル ・ アーキテ クチャの各命令の詳細について説明する。<br />

3:380 第 3 巻 : IA-32 基本命令リファレンス


AAA ─ ASCII Adjust After Addition<br />

オペコード 命令 説明<br />

37 AAA 加算後に AL を ASCII 調整する。<br />

説明<br />

2 つのアンパ ッ ク BCD 値の和を調整して、 アンパ ッ ク BCD 結果を作成する。 AL レジス<br />

タは、 こ の命令の暗黙のソ ース兼デステ ィ ネ ー シ ョ ン ・ オペラン ド である。 AAA 命令<br />

は、 ADD 命令の次に実行した と き に限 り 有効であ る。 ADD 命令は、 2 つのアンパ ッ ク<br />

BCD 値を加算 (2 進加算 ) し、 バ イ ト の結果を AL レジスタにストアする。 次に、 AAA<br />

命令が AL レジスタの内容を調整して、 正しい1 桁のアンパ ッ ク BCD 結果に ま と める。<br />

加算に よ っ て 10 進キ ャ リ ーが生じた場合は、 AH レジスタが1 インク リメン ト され、 CF<br />

およびAF フラグがセッ ト される。 10 進キ ャ リ ーが生じなかった場合は、 CF およびAF<br />

フラグはクリアされ、 AH レジスタは変わらない。 どちらの場合も、 AL レジスタのビッ<br />

ト 4 から 7 までは 0 にクリアされる。<br />

操作<br />

IF ((AL AND FH) > 9) OR (AF = 1)<br />

THEN<br />

AL ← (AL + 6);<br />

AH ← AH + 1;<br />

AF ← 1;<br />

CF ← 1;<br />

ELSE<br />

AF ← 0;<br />

CF ← 0;<br />

FI;<br />

AL ← AL AND FH;<br />

影響を受けるフラグ<br />

調整に よ っ て 10 進キ ャ リ ーが生じた場合は、 AF および CF フラグが1 にセッ ト される。<br />

10 進キ ャ リ ー が生じ なか っ た場合は、 両フ ラ グが 0 にク リアされる。 OF、 SF、 ZF、 PF<br />

フ ラ グは未定義。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

例外 ( すべての操作モード )<br />

なし。<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:381


AAD ─ ASCII Adjust AX Before Division<br />

オペコード 命令 説明<br />

D5 0A AAD 除算前に AX を ASCII 調整する。<br />

説明<br />

調整結果に対して除算を行った場合に正しいアンパ ッ ク BCD 値が生じ る よ う に、 2 桁の<br />

アンパッ ク BCD 数 (AL レジスタの下位桁と AH レ ジ ス タ の上位桁 ) を調整する。 AAD<br />

命令は、 AX レジスタの調整結果の値をアンパックBCD 値で除算 (2 進除算 ) する DIV<br />

命令の直前に実行した と き に限 り 有効である。<br />

AAD 命令は、 AL レジスタの値を (AL + (10*AH)) に設定し、 次に AH レジスタを 00H に<br />

クリアする。 したがって、 AX レジスタの値は、 AL および AH レジスタの元のパックさ<br />

れていない 2 桁の数に等価な 2 進値に等しい。<br />

操作<br />

tempAL ← AL;<br />

tempAH ← AH;<br />

AL ← (tempAL + (tempAH ∗ imm8)) AND FFH;<br />

AH ← 0<br />

即値 (imm8) は命令の第 2 バイ ト から与えられる。 この値は、 通常のアセンブリでは 0AH<br />

(10 進数では 10) である。 ただし、 この即値を変更して、 異なる結果を得るこ と もできる。<br />

影響を受けるフラグ<br />

SF、 ZF、 PF フラグは、 結果に従ってセット される。 OF、 AF、 CF フラグは未定義であ<br />

る。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

例外 ( すべての操作モード )<br />

なし。<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

3:382 第 3 巻 : IA-32 基本命令リファレンス


AAM ─ ASCII Adjust AX After Multiply<br />

オペコード 命令 説明<br />

D4 0A AAM 乗算後に AX を ASCII 調整する。<br />

説明<br />

2 つのアンパ ッ ク BCD 値間の乗算結果を調整して、 1 対のアンパ ッ ク BCD 値を作成す<br />

る。 AX レジスタは、 この命令の暗黙のソース兼デスティネーション ・オペランドであ<br />

る。 AAM 命令は、 2 つのアンパ ッ ク BCD 値を乗算 (2 進乗算 ) し、 ワ ー ド の結果を AX<br />

レジスタにストアする MUL 命令の次に実行した と き に限 り 有効であ る。 次に、 AAM 命<br />

令が AX レ ジ ス タ の内容を調整して、 2 桁のアンパ ッ ク BCD 結果に ま と める。<br />

操作<br />

tempAL ← AL;<br />

AH ← tempAL / imm8;<br />

AL ← tempAL MOD imm8;<br />

即値 (imm8) は命令の第 2 バイ ト から与えられる。 この値は、 通常のアセンブリでは 0AH<br />

(10 進数では 10) である。 ただし、 この即値を変更して、 異なる結果を得るこ と もできる。<br />

影響を受けるフラグ<br />

SF、 ZF、 PF フ ラ グが結果に従 っ てセ ッ ト される。 OF、 AF、 CF フ ラ グは未定義。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

例外 ( すべての操作モード )<br />

なし。<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:383


AAS ─ ASCII Adjust AL After Subtraction<br />

オペコード 命令 説明<br />

3F AAS 減算後に AL を ASCII 調整する。<br />

説明<br />

2 つのアンパ ッ ク BCD 値間の減算結果を調整して、 アンパ ッ ク BCD の結果を作成す る。<br />

AL レジスタは、 この命令の暗黙のソース兼デスティネーション ・ オペランドである。<br />

AAS 命令は、 1 つのアンパ ッ ク BCD 値か ら も う 1 つのアンパ ッ ク BCD 値を減算 (2 進減<br />

算 ) し、 バイ ト の結果を AL レジスタにストアする SUB 命令の次に実行した と き に限 り<br />

有効であ る。 次に、 AAS 命令が AL レジスタの内容を調整して、 正しい 1 桁のアンパ ッ<br />

ク BCD の結果に ま と める。<br />

減算に よ っ て 10 進キ ャ リ ーが生じた場合は、 AH レジスタが1 デク リメント され、 CF<br />

およびAF フラグがセッ ト される。 10 進キ ャ リ ーが生じなかった場合は、 CF およびAF<br />

フラグはクリアされ、 AH レジスタは変わらない。 どちらの場合も、 AL レジスタの上位<br />

ニブルは 0 に設定されたま まである。<br />

操作<br />

IF ((AL AND FH) > 9) OR (AF = 1)<br />

THEN<br />

AL ← AL - 6;<br />

AH ← AH - 1;<br />

AF ← 1;<br />

CF ← 1;<br />

ELSE<br />

CF ← 0;<br />

AF ← 0;<br />

FI;<br />

AL ← AL AND FH;<br />

影響を受けるフラグ<br />

10 進ボロ ーが生じた場合は、 AF および CF フラグが1 にセッ ト され、 10 進ボロ ーが生<br />

じなかった場合は両フラグが 0 にク リアされる。 OF、 SF、 ZF、 PF フ ラ グは未定義。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

例外 ( すべての操作モード )<br />

なし。<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

3:384 第 3 巻 : IA-32 基本命令リファレンス


ADC ─ Add with Carry<br />

オペコード 命令 説明<br />

14 ib ADC AL,imm8 キャリーを加えて imm8 を AL に加算する。<br />

15 iw ADC AX,imm16 キャリーを加えて imm16 を AX に加算する。<br />

15 id ADC EAX,imm32 キャリーを加えて imm32 を EAX に加算する。<br />

80 /2 ib ADC r/m8,imm8 キャリーを加えて imm8 を r/m8 に加算する。<br />

81 /2 iw ADC r/m16,imm16 キャリーを加えて imm16 を r/m16 に加算する。<br />

81 /2 id ADC r/m32,imm32 CF を加えて imm32 を r/m32 に加算する。<br />

83 /2 ib ADC r/m16,imm8 CF を加えて符号拡張 imm8 を r/m16 に加算する。<br />

83 /2 ib ADC r/m32,imm8 CF を加えて符号拡張 imm8 を r/m32 に加算する。<br />

10 /r ADC r/m8,r8 キャリーを加えてバイト・レジスタを r/m8 に加算する。<br />

11 /r ADC r/m16,r16 キャリーを加えて r16 を r/m16 に加算する。<br />

11 /r ADC r/m32,r32 CF を加えて r32 を r/m32 に加算する。<br />

12 /r ADC r8,r/m8 キャリーを加えて r/m8 をバイト・レジスタに加算する。<br />

13 /r ADC r16,r/m16 キャリーを加えて r/m16 を r16 に加算する。<br />

13 /r ADC r32,r/m32 CF を加えて r/m32 を r32 に加算する。<br />

説明<br />

デステ ィ ネーシ ョ ン ・ オペラン ド ( 第 1 オペラン ド )、 ソース ・ オペラン ド ( 第 2 オペラ<br />

ンド )、 キャ リ ー (CF) を加算し、 結果をデステ ィ ネーシ ョ ン ・ オペラン ド にス ト アする。<br />

デスティネーション ・ オペランドには、 レジスタまたはメモリ ・ ロケーションを使用で<br />

きる。 ソース ・ オペランドには、 即値、 レジスタ、 またはメモリ ・ ロケーションを使用<br />

できる。 CF フ ラグの状態は、 前の加算か らのキ ャ リ ー を表す。 オペラ ン ド と して即値を<br />

使用した場合は、 その即値はデス テ ィ ネ ー シ ョ ン ・ オペラ ン ド ・ フ ォ ー マ ッ ト の長 さ に<br />

符号拡張 される。<br />

ADC 命令は符号付き と 符号なしのオペラ ン ド を区別しない。 その代わ り に、 プ ロ セ ッ サ<br />

が両デー タ型について結果を評価し、 OF およびCF フ ラ グをセ ッ ト して、 それぞれ符号<br />

付き または符号なしの結果のキ ャ リ ー を示す。 SF フ ラ グが符号付き結果の符号を示す。<br />

ADC 命令は、 通常、 複数バイ ト ま たは複数ワ ー ド 間の加算の一部 と して実行 さ れ、 その<br />

ときにADD 命令の後に ADC 命令が実行 さ れる。<br />

操作<br />

DEST ← DEST + SRC + CF;<br />

影響を受けるフラグ<br />

OF、 SF、 ZF、 AF、 CF、 PF フ ラ グが結果に従 っ てセ ッ ト さ れる。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:385


ADC ─ Add with Carry ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

保護モード例外<br />

#GP(0) デステ ィ ネー シ ョ ンが書き込み不可能なセグメ ン ト にある<br />

場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタを使用してメモリをア<br />

クセスしたが、 その内容が NULL セグメン ト ・ セレ ク タ<br />

であ っ た場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 現行<br />

特権レベルが 3 のときにアライメントが合わないメモリ参<br />

照を行った場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メ ン ト が合わないメモ リ 参照を行っ た場合。<br />

3:386 第 3 巻 : IA-32 基本命令リファレンス


ADD ─ Add<br />

オペコード 命令 説明<br />

04 ib ADD AL,imm8 imm8 を AL に加算する。<br />

05 iw ADD AX,imm16 imm16 を AX に加算する。<br />

05 id ADD EAX,imm32 imm32 を EAX に加算する。<br />

80 /0 ib ADD r/m8,imm8 imm8 を r/m8 に加算する。<br />

81 /0 iw ADD r/m16,imm16 imm16 を r/m16 に加算する。<br />

81 /0 id ADD r/m32,imm32 imm32 を r/m32 に加算する。<br />

83 /0 ib ADD r/m16,imm8 符号拡張 imm8 を rm16 に加算する。<br />

83 /0 ib ADD r/m32,imm8 符号拡張 imm8 を rm32 に加算する。<br />

00 /r ADD r/m8,r8 r8 を r/m8 に加算する。<br />

01 /r ADD r/m16,r16 r16 を r/m16 に加算する。<br />

01 /r ADD r/m32,r32 r32 を r/m32 に加算する。<br />

02 /r ADD r8,r/m8 r/m8 を r8 に加算する。<br />

03 /r ADD r16,r/m16 r/m16 を r16 に加算する。<br />

03 /r ADD r32,r/m32 r/m32 を r32 に加算する。<br />

説明<br />

デステ ィ ネーシ ョ ン ・ オペラン ド ( 第 1 オペラン ド ) とソース・オペランド ( 第 2 オペラ<br />

ンド ) を加算し、 結果をデステ ィ ネーシ ョ ン ・ オペラン ド にス ト アする。 デステ ィ ネー<br />

ション・オペランドには、 レジスタまたはメモリ ・ロケーションを使用できる。 ソー<br />

ス ・ オペラ ン ド に は、 即値、 レ ジ ス タ、 ま たは メ モ リ ・ ロ ケ ー シ ョ ン を使用で き る。 オ<br />

ペラ ン ド と して即値を使用した場合は、 その即値はデス テ ィ ネ ー シ ョ ン ・ オペラ ン ド ・<br />

フ ォ ー マ ッ ト の長 さ に符号拡張 さ れる。<br />

ADD 命令は符号付き と 符号なしのオペラ ン ド を区別しない。 その代わ り に、 プ ロ セ ッ サ<br />

が両デー タ型について結果を評価し、 OF およびCF フ ラ グをセ ッ ト して、 それぞれ符号<br />

付き または符号なしの結果のキ ャ リ ー を示す。 SF フ ラ グが符号付き結果の符号を示す。<br />

操作<br />

DEST ← DEST + SRC;<br />

影響を受けるフラグ<br />

OF、 SF、 ZF、 AF、 CF、 PF フ ラ グが結果に従 っ てセ ッ ト さ れる。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:387


ADD ─ Add ( 続き )<br />

保護モード例外<br />

#GP(0) デステ ィ ネー シ ョ ンが書き込み不可能なセグメ ン ト にある<br />

場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタを使用してメモリをア<br />

クセスしたが、 その内容が NULL セグメン ト ・ セレ ク タ<br />

であ っ た場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 現行<br />

特権レベルが 3 のときにアライメントが合わないメモリ参<br />

照を行った場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メ ン ト が合わないメモ リ 参照を行っ た場合。<br />

3:388 第 3 巻 : IA-32 基本命令リファレンス


AND ─ Logical AND<br />

オペコード 命令 説明<br />

24 ib AND AL,imm8 AL と imm8 との AND をとる。<br />

25 iw AND AX,imm16 AX と imm16 との AND をとる。<br />

25 id AND EAX,imm32 EAX と imm32 との AND をとる。<br />

80 /4 ib AND r/m8,imm8 r/m8 と imm8 との AND をとる。<br />

81 /4 iw AND r/m16,imm16 r/m16 と imm16 との AND をとる。<br />

81 /4 id AND r/m32,imm32 r/m32 と imm32 との AND をとる。<br />

83 /4 ib AND r/m16,imm8 r/m16 と imm8 との AND をとる。<br />

83 /4 ib AND r/m32,imm8 r/m32 と imm8 との AND をとる。<br />

20 /r AND r/m8,r8 r/m8 と r8 との AND をとる。<br />

21 /r AND r/m16,r16 r/m16 と r16 との AND をとる。<br />

21 /r AND r/m32,r32 r/m32 と r32 との AND をとる。<br />

22 /r AND r8,r/m8 r8 と r/m8 との AND をとる。<br />

23 /r AND r16,r/m16 r16 と r/m16 との AND をとる。<br />

23 /r AND r32,r/m32 r32 と r/m32 との AND をとる。<br />

説明<br />

デステ ィ ネーシ ョ ン ( 第 1) オペラン ド と ソース ( 第 2) オペラン ド との間のビ ッ ト 単位の<br />

AND ( 論理積 ) 演算を実行し、 結果をデス テ ィ ネ ー シ ョ ン ・ オペラ ン ド にス ト アす る。<br />

ソース ・オペランドには、 即値、 レジスタ、 またはメモリ ・ ロケーションを使用できる。<br />

デスティネーション ・ オペランドには、 レジスタまたはメモリ ・ ロケーションを使用で<br />

きる。<br />

操作<br />

DEST ← DEST AND SRC;<br />

影響を受けるフラグ<br />

OF および CF フラグがクリアされ、 SF、 ZF、 PF フラグが結果に従ってセット される。<br />

AF フ ラ グの状態は未定義。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:389


AND ─ Logical AND ( 続き )<br />

保護モード例外<br />

#GP(0) デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド の指示先が書き込み不可<br />

能なセグ メ ン ト の場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 現行<br />

特権レベルが 3 のときにアライメントが合わないメモリ参<br />

照を行った場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メ ン ト が合わないメモ リ 参照を行っ た場合。<br />

3:390 第 3 巻 : IA-32 基本命令リファレンス


ARPL ─ Adjust RPL Field of Segment Selector<br />

オペコード 命令 説明<br />

63 /r ARPL r/m16,r16 r/m16 の RPL を r16 の RPL 未満に調整する。<br />

説明<br />

2 つのセグメン ト ・ セレ ク タの RPL フィールドを比較する。 第1 オペラン ド ( デステ ィ<br />

ネーション ・ オペランド ) に一方のセグメン ト ・ セレ ク タがあり、 第 2 オペラン ド ( ソー<br />

ス・オペランド ) に他方のセグメン ト ・ セレ ク タがある。 (RPL フィールドは各オペランド<br />

のビッ ト 0 と 1 を占める。 ) デステ ィ ネーシ ョ ン ・ オペラン ド の RPL フィールドがソー<br />

ス・オペランドのRPL フィールドより小さい場合は、 ZF フラグがセッ ト され、 デスティ<br />

ネーション ・ オペランドの RPL フィールドが増加されてソース・オペランドのRPL<br />

フィールドに合わせられる。 そうでない場合は、 ZF フラグがクリアされ、 デスティネー<br />

ション・オペランドの変更は行われない。 ( デステ ィ ネーシ ョ ン ・ オペラン ド には、 ワー<br />

ド・レジスタまたはメモリ・ロケーションを使用できる。 ソース・オペランドは、 ワー<br />

ド・レジスタでなければならない。)<br />

APRL 命令は、 オペレ ー テ ィ ン グ ・ シ ス テ ム ・ プ ロ シ ー ジ ャ に使用 さ せるために設け ら<br />

れている ( ただし、 アプ リ ケーシ ョ ン も使用でき る )。 この命令は、 一般に、 アプ リ ケー<br />

シ ョ ンからオペレーテ ィ ング ・ システムに渡されていたセグメント ・ セレクタの RPL を<br />

調整して、 アプ リ ケ ー シ ョ ン ・ プ ロ グ ラ ムの特権レベルに合わせる ために使用す る。 こ<br />

こで、 オペレーティング ・ システムに渡されていたセグメント ・セレクタがデスティ<br />

ネーション・オペランドに入れられ、 アプリケーション・プログラムのコード ・セグメ<br />

ントのセグメント ・セレクタがソース・オペランドに入れられる。 ( ソース・オペランド<br />

の RPL フィールドはアプリケーション・プログラムの特権レベルを表す。 ) 次に、 ARPL<br />

命令を実行すれば、 オペレ ー テ ィ ン グ ・ シ ス テ ムが受け取 っ ていたセグ メ ン ト ・ セレ ク<br />

タの RPL をアプ リ ケーシ ョ ン ・ プログラムの特権レベルよ り低く ( 特権レベルを高 く )<br />

させないように保証できる。 ( アプ リ ケーシ ョ ン ・ プログラムのコ ー ド ・ セグメン ト のセ<br />

グメント ・セレクタはプロシージャ ・ コールの後でスタックから読み出せる。 )<br />

こ の命令の使用方法の詳細は、 『IA-32 インテル ® アーキテクチャ ・ ソフ ト ウェア ・ ディ<br />

ベロッパーズ ・ マニュアル、 下巻』 を参照のこ と。<br />

操作<br />

IF DEST(RPL) < SRC(RPL)<br />

THEN<br />

ZF ← 1;<br />

DEST(RPL) ← SRC(RPL);<br />

ELSE<br />

ZF ← 0;<br />

FI;<br />

影響を受けるフラグ<br />

デステ ィ ネーシ ョ ン ・ オペラン ド の RPL フィールドがソース・オペランドのRPL<br />

フィールドより小さい場合は、 ZF フラグが1 にセッ ト される。 そ う でない場合は、 ZF<br />

フラグが0 にク リアされる。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:391


ARPL ─ Adjust RPL Field of Segment Selector ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

保護モード例外<br />

#GP(0) デステ ィ ネー シ ョ ンが書き込み不可能なセグメ ン ト にある<br />

場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタを使用してメモリをア<br />

クセスしたが、 その内容が NULL セグメン ト ・ セレ ク タ<br />

であ っ た場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 現行<br />

特権レベルが 3 のときにアライメントが合わないメモリ参<br />

照を行った場合。<br />

実アドレス・モード例外<br />

#UD 実ア ド レ ス ・ モー ド では、 ARPL 命令は認識 さ れない。<br />

仮想 8086 モード例外<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

#UD 仮想 8086 モー ドでは、 ARPL 命令は認識 さ れない。<br />

3:392 第 3 巻 : IA-32 基本命令リファレンス


BOUND ─ Check Array Index Against Bounds<br />

オペコード 命令 説明<br />

62 /r BOUND r16,m16&16 r16 ( 配列インデックス ) が m16&16 の指定範囲内かどうかを確認す<br />

る。<br />

62 /r BOUND r32,m32&32 r32 ( 配列インデックス ) が m16&16 の指定範囲内かどうかを確認す<br />

る。<br />

説明<br />

第 1 オペラン ド ( 配列イ ンデ ッ ク ス ) が第 2 オペラン ド ( 範囲オペラ ン ド ) によって指定<br />

される配列の下限か ら 上限 ま での範囲内であるか ど う か判定する。 配列イ ンデ ッ ク ス は、<br />

レ ジ ス タ内の符号付き 整数である。 範囲オペラ ン ド は、 オペラ ン ド ・ サイズ属性が 32 の<br />

場合は 1 対の符号付き ダブルワ ー ド 整数を、 オペラ ン ド ・ サイ ズ属性が 16 の場合は 1 対<br />

の符号付き ワ ー ド 整数を示すメモ リ ・ ロケーシ ョ ンである。 第 1 のダブルワー ド ( または<br />

ワード ) が配列の下限であ り 、 第 2 のダブルワー ド ( またはワー ド ) が配列の上限である。<br />

配列イ ンデ ッ ク ス は下限よ り 大きいか等し く なければな ら ず、 かつ上限にバイ ト 単位の<br />

オペラン ド ・ サイズを加算した値よ り小さいか等し く なければならない。 インデッ クス<br />

が上下限の範囲内でない場合は、 BOUND 範囲外例外 (#BR) が報告される。 ( この例外が<br />

発生した と き は、 セ ー ブ さ れた リ タ ー ン命令ポ イ ン タが BOUND 命令を指している。 )<br />

上下限範囲デ ー タ構造 ( 配列の上下限を内容 と する 2 つのワ ー ド またはダブルワ ー ド )<br />

は、 通常、 配列自体の直前に置いて、 配列の先頭か ら の一定のオ フ セ ッ ト で上下限をア<br />

ドレス指定できるようにする。 配列のアドレスはすでにレジスタにストアされているの<br />

で、 上記の よ う な慣行に よ っ て、 配列の上下限の実効ア ド レ ス を得るために余分なバ<br />

ス・サイクルを避けられる。<br />

操作<br />

IF (ArrayIndex < LowerBound OR ArrayIndex > (UppderBound + OperandSize/8]))<br />

(* Below lower bound or above upper bound *)<br />

THEN<br />

#BR;<br />

FI;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:393


BOUND ─ Check Array Index Against Bounds ( 続き )<br />

保護モード例外<br />

#BR 範囲テ ス ト が失敗した場合。<br />

#UD 第 2 オペラン ド がメモ リ ・ ロケーシ ョ ンでない場合。<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 現行<br />

特権レベルが 3 のときにアライメントが合わないメモリ参<br />

照を行った場合。<br />

実アドレス・モード例外<br />

#BR 範囲テ ス ト が失敗した場合。<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#BR 範囲テ ス ト が失敗した場合。<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メ ン ト が合わないメモ リ 参照を行っ た場合。<br />

3:394 第 3 巻 : IA-32 基本命令リファレンス


BSF ─ Bit Scan Forward<br />

オペコード 命令 説明<br />

0F BC BSF r16,r/m16 r/m16 を順方向にビット・スキャンする。<br />

0F BC BSF r32,r/m32 r/m32 を順方向にビット・スキャンする。<br />

説明<br />

ソース ・オペランド ( 第 2 オペラン ド ) を検索して、 最下位のセ ッ ト ・ ビ ッ ト ( 値 1 の<br />

ビッ ト ) を探す。 最下位のセット・ビットが見つかると、 そのビット・インデックスが<br />

デステ ィ ネーシ ョ ン ・ オペラン ド ( 第 1 オペラン ド ) にス トアされる。 ソース ・ オペラ<br />

ンドには、 レジスタまたはメモリ ・ロケーションを使用できる。 デスティネーション・<br />

オペラン ド はレジスタである。 ビ ッ ト ・ インデッ クスは、 ソース ・ オペラン ド のビ ッ ト<br />

0 か ら の符号なし オ フ セ ッ ト であ る。 ソ ー ス ・ オペラ ン ド の内容が 0 の場合は、 デス<br />

テ ィ ネ ー シ ョ ン ・ オペラ ン ド の内容は未定義にな る。<br />

操作<br />

IF SRC = 0<br />

THEN<br />

ZF ← 1;<br />

DEST is undefined;<br />

ELSE<br />

ZF ← 0;<br />

temp ← 0;<br />

WHILE Bit(SRC, temp) = 0<br />

DO<br />

temp ← temp + 1;<br />

DEST ← temp;<br />

OD;<br />

FI;<br />

影響を受けるフラグ<br />

ソース ・オペランドのすべてのビットが0 の場合は、 ZF フラグが1 にセッ ト される。 そ<br />

うでない場合は、 ZF フラグがクリアされる。 CF、 OF、 SF、 AF、 PF フ ラ グは未定義。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:395


BSF ─ Bit Scan Forward ( 続き )<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 現行<br />

特権レベルが 3 のときにアライメントが合わないメモリ参<br />

照を行った場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メ ン ト が合わないメモ リ 参照を行っ た場合。<br />

3:396 第 3 巻 : IA-32 基本命令リファレンス


BSR ─ Bit Scan Reverse<br />

オペコード 命令 説明<br />

0F BD BSR r16,r/m16 r/m16 を逆方向にビット・スキャンする。<br />

0F BD BSR r32,r/m32 r/m32 を逆方向にビット・スキャンする。<br />

説明<br />

ソース ・オペランド ( 第 2 オペラン ド ) を検索して、 最上位のセ ッ ト ・ ビ ッ ト ( 値 1 の<br />

ビッ ト ) を探す。 最上位のセット・ビットが見つかると、 そのビット・インデックスが<br />

デステ ィ ネーシ ョ ン ・ オペラン ド ( 第 1 オペラン ド ) にス トアされる。 ソース ・ オペラ<br />

ンドには、 レジスタまたはメモリ ・ロケーションを使用できる。 デスティネーション・<br />

オペラン ド はレジスタである。 ビ ッ ト ・ インデッ クスは、 ソース ・ オペラン ド のビ ッ ト<br />

0 か ら の符号なし オ フ セ ッ ト であ る。 ソ ー ス ・ オペラ ン ド の内容が 0 の場合は、 デス<br />

テ ィ ネ ー シ ョ ン ・ オペラ ン ド の内容は未定義にな る。<br />

操作<br />

IF SRC = 0<br />

THEN<br />

ZF ← 1;<br />

DEST is undefined;<br />

ELSE<br />

ZF ← 0;<br />

temp ← OperandSize - 1;<br />

WHILE Bit(SRC, temp) = 0<br />

DO<br />

temp ← temp − 1;<br />

DEST ← temp;<br />

OD;<br />

FI;<br />

影響を受けるフラグ<br />

ソース ・オペランドのすべてのビットが0 の場合は、 ZF フラグが1 にセッ ト される。 そ<br />

うでない場合は、 ZF フラグはクリアされる。 CF、 OF、 SF、 AF、 PF フ ラ グは未定義。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:397


BSR ─ Bit Scan Reverse ( 続き )<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 現行<br />

特権レベルが 3 のときにアライメントが合わないメモリ参<br />

照を行った場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メ ン ト が合わないメモ リ 参照を行っ た場合。<br />

3:398 第 3 巻 : IA-32 基本命令リファレンス


BSWAP ─ Byte Swap<br />

オペコード 命令 説明<br />

0F C8+rd BSWAP r32 32 ビット・レジスタのバイト順序を逆にする。<br />

説明<br />

32 ビッ トの( デステ ィ ネーシ ョ ン ) レジスタのバイ ト の順序を逆にする。 すなわち、<br />

ビッ ト 0 から 7 がビ ッ ト 24 から 31 と 入れ換え ら れ、 ビ ッ ト 8 から 15 がビ ッ ト 16 から<br />

23 と入れ換えられる。 この命令は、 リ トル・エンディアン値をビッグ・エンディアン・<br />

フ ォ ーマ ッ ト に、 およびその逆に変換するために設けられている。<br />

ワード値(16 ビッ ト ・レジスタ) 内のバイ ト を入れ換え る には、 XCHG 命令を使用する。<br />

BSWAP 命令が 16 ビット ・レジスタを参照すると、 結果は未定義になる。<br />

操作<br />

TEMP ← DEST<br />

DEST(7..0) ← TEMP(31..24)<br />

DEST(15..8) ← TEMP(23..16)<br />

DEST(23..16) ← TEMP(15..8)<br />

DEST(31..24) ← TEMP(7..0)<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

例外 ( すべての操作モード )<br />

なし。<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

インテル・アーキテクチャの互換性<br />

BSWAP 命令は、 Intel486 プロセッサ ・ ファ ミ リ よ り以前のインテル ・ アーキテクチャ ・<br />

プロセ ッ サに対してはサポ ー ト されていない。 この命令と の互換性を保証するためには、<br />

Intel486 プロセッサ ・ ファ ミ リ よ り以前のインテル ・ プロセッサで実行できる、 機能的に<br />

等価な コ ー ド を組み込む こ と 。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:399


BT ─ Bit Test<br />

オペコード 命令 説明<br />

0F A3 BT r/m16,r16 選択したビットを CF フラグにストアする。<br />

0F A3 BT r/m32,r32 選択したビットを CF フラグにストアする。<br />

0F BA /4 ib BT r/m16,imm8 選択したビットを CF フラグにストアする。<br />

0F BA /4 ib BT r/m32,imm8 選択したビットを CF フラグにストアする。<br />

説明<br />

ビッ ト ・ベース・オペランド ( 第 1 オペラン ド ) によって指定されるビット ・ スト リング<br />

内で、 ビット・オフセット・オペランド( 第 2 オペラン ド ) に よ っ て指定さ れる ビ ッ ト 位<br />

置のビッ トを選択し、 そのビッ トの値をCF フラグにストアする。 ビッ ト ・ベース ・ オペ<br />

ランドには、 レジスタまたはメモリ ・ ロケーションを使用できる。 ビッ ト ・ オフセッ ト ・<br />

オペラン ド には、 レジスタ または即値を使用でき る。 ビ ッ ト ・ ベース ・ オペラン ド がレ<br />

ジ ス タ を指定している場合は、 こ の命令は ビ ッ ト ・ オ フ セ ッ ト ・ オペラ ン ド の ( レジス<br />

タ・サイズに従って) 16 または 32 の剰余を と り 、 それぞれ 16 または 32 ビッ トのレジス<br />

タ で任意のビ ッ ト 位置を選択で き る よ う にしている。 ビ ッ ト ・ ベー ス ・ オペラ ン ド がメ<br />

モ リ ・ ロ ケ ー シ ョ ンを指定している場合は、 こ のオペラ ン ド は対象のビ ッ ト ・ ス ト リ ン<br />

グのビ ッ ト ・ ベース ( 指定さ れたバイ ト のビ ッ ト 0) を含むメモ リ内のバイ ト のア ド レス<br />

を表している。 したがって、 オフセッ ト ・ オペランド は、 レジスタ ・ オフセッ トの場合<br />

は -231 から 231 - 1 までの範囲のビ ッ ト 位置を、 また即値オフセ ッ ト の場合は 0 から 31 ま<br />

での範囲のビ ッ ト 位置を選択する。<br />

一部のアセンブ ラ は、 即値ビ ッ ト ・ オ フ セ ッ ト ・ フ ィ ー ル ド を メ モ リ ・ オペラ ン ド の<br />

デ ィ スプレ ー スメ ン ト ・ フ ィ ール ド と 組み合わせて使用して、 31 より大きい即値ビッ<br />

ト・オフセットをサポートしている。その場合は、アセンブラによって、即値ビット・<br />

オフセッ トの下位3 または 5 ビッ ト (16 ビッ ト ・オペランドの場合は3、 32 ビッ ト ・オ<br />

ペラン ドの場合は 5) が即値ビット・オフセット・フィールドにストアされ、上位ビット<br />

はシ フ ト され、 ア ド レス指定モー ド のバイ ト ・ デ ィ スプレ ー ス メ ン ト と 組み合わされる。<br />

プロセッサは、 0 でな く て も 、 上位ビ ッ ト を無視す る。<br />

メ モ リ 内の ビ ッ ト をア ク セスする と き は、 プ ロ セ ッ サは、 以下の関係を使用して、 32<br />

ビッ トのオペランド ・サイズのメモリ ・アドレスから始まる 4 バイ ト をアクセスできる。<br />

実効アドレス + (4 * (BitOffset DIV 32))<br />

ま たは、 以下の関係を使用して、 16 ビッ ト ・ オペランドのメモリ ・アド レスから始まる<br />

2 バイ ト をアクセスできる。<br />

実効アドレス + (2 * (BitOffset DIV 16))<br />

該当す る ビ ッ ト に到達する のに 1 バイ ト だけのア ク セスで足 り る と き で も 、上記の操作に<br />

差し支えはない。 このビ ッ ト ・ ア ド レス指定方式を使用する と きは、 ソ フ ト ウ ェアはア ド<br />

レス ・ スペー ス ・ ホ ールに近いメモ リ 領域の参照を避ける よ う にする こ と。 特に、 メモ<br />

リ・マップドI/O レジスタへの参照は避けなければならない。 その代わりに、 ソフトウェ<br />

アにMOV 系の命令を使用してそれらのアドレスからロードまたはそれらのアドレスにス<br />

ト アさせ、 レジスタ形式のこれらの命令を使用してデータを操作する よ う にする。<br />

操作<br />

CF ← Bit(BitBase, BitOffset)<br />

影響を受けるフラグ<br />

CF フラグに選択されたビッ トの値がスト アされる。 OF、 SF、 ZF、 AF、 PF フラグは未<br />

定義。<br />

3:400 第 3 巻 : IA-32 基本命令リファレンス


BT ─ Bit Test ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 現行<br />

特権レベルが 3 のときにアライメントが合わないメモリ参<br />

照を行った場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メ ン ト が合わないメモ リ 参照を行っ た場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:401


BTC ─ Bit Test and Complement<br />

オペコード 命令 説明<br />

0F BB BTC r/m16,r16 選択したビットを CF フラグにストアし、補数をとる。<br />

0F BB BTC r/m32,r32 選択したビットを CF フラグにストアし、補数をとる。<br />

0F BA /7 ib BTC r/m16,imm8 選択したビットを CF フラグにストアし、補数をとる。<br />

0F BA /7 ib BTC r/m32,imm8 選択したビットを CF フラグにストアし、補数をとる。<br />

説明<br />

ビッ ト ・ベース・オペランド ( 第 1 オペラン ド ) によって指定されるビット ・ スト リング<br />

内で、 ビット・オフセット・オペランド( 第 2 オペラン ド ) に よ っ て指定さ れる ビ ッ ト 位<br />

置のビッ トを選択し、 そのビッ トの値をCF フラグにストアし、 ビッ ト ・ スト リング内の<br />

選択したビ ッ ト を補数に変換する。 ビ ッ ト ・ ベー ス ・ オペラ ン ド に は、 レ ジ ス タ ま たは<br />

メモリ・ロケーションを使用できる。 ビット・オフセット・オペランドには、 レジスタ<br />

または即値を使用でき る。 ビ ッ ト ・ ベース ・ オペラン ド がレ ジスタを指定している場合<br />

は、 この命令はビット・オフセット・オペランドの( レジスタ ・サイズに従って) 16 また<br />

は 32 の剰余を と り、 それぞれ 16 または 32 ビッ トのレジスタで任意のビッ ト位置を選択<br />

できるようにしている。 ビット ・ベース・オペランドがメモリ ・ロケーションを指定し<br />

ている場合は、 このオペランドは対象のビッ ト ・スト リングのビッ ト ・ベース( 指定 され<br />

たバイ ト のビ ッ ト 0) を含むメモ リ 内のバイ ト のア ド レスを表している。 したがって、 オ<br />

フセット ・オペランドは、 レジスタ・オフセットの場合は-231 から 231 - 1 までの範囲の<br />

ビ ッ ト 位置を、 また即値オフセッ ト の場合は 0 から 31 までの範囲のビット位置を選択す る。<br />

一部のアセンブ ラ は、 即値ビ ッ ト ・ オ フ セ ッ ト ・ フ ィ ー ル ド を メ モ リ ・ オペラ ン ド の<br />

デ ィ スプレ ー スメ ン ト ・ フ ィ ール ド と 組み合わせて使用して、 31 より大きい即値ビッ<br />

ト ・ オ フ セ ッ ト をサポ ー ト してい る。 こ のア ド レ ス指定方式の詳細は、 3:400 ページの<br />

「BT—Bit Test」 を参照のこ と。<br />

操作<br />

CF ← Bit(BitBase, BitOffset)<br />

Bit(BitBase, BitOffset) ← NOT Bit(BitBase, BitOffset);<br />

影響を受けるフラグ<br />

CF フラグに選択されたビッ トの補数に変換される前の値がストアされる。 OF、 SF、 ZF、<br />

AF、 PF フ ラ グは未定義。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

3:402 第 3 巻 : IA-32 基本命令リファレンス


BTC ─ Bit Test and Complement ( 続き )<br />

保護モード例外<br />

#GP(0) デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド の指示先が書き込み不可<br />

能なセグ メ ン ト の場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 現行<br />

特権レベルが 3 のときにアライメントが合わないメモリ参<br />

照を行った場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メ ン ト が合わないメモ リ 参照を行っ た場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:403


BTR ─ Bit Test and Reset<br />

オペコード 命令 説明<br />

0F B3 BTR r/m16,r16 選択したビットを CF フラグにストアし、クリアする。<br />

0F B3 BTR r/m32,r32 選択したビットを CF フラグにストアし、クリアする。<br />

0F BA /6 ib BTR r/m16,imm8 選択したビットを CF フラグにストアし、クリアする。<br />

0F BA /6 ib BTR r/m32,imm8 選択したビットを CF フラグにストアし、クリアする。<br />

説明<br />

ビッ ト ・ベース・オペランド ( 第 1 オペラン ド ) によって指定されるビット ・ スト リング<br />

内で、 ビット・オフセット・オペランド( 第 2 オペラン ド ) に よ っ て指定さ れる ビ ッ ト 位<br />

置のビッ トを選択し、 そのビッ トの値をCF フラグにストアし、 ビッ ト ・ スト リング内の<br />

選択したビ ッ ト を 0 にク リアする。 ビッ ト ・ベース ・ オペランドには、 レジスタまたはメ<br />

モリ ・ ロケーションを使用できる。 ビッ ト ・ オフセッ ト ・ オペランドには、 レジスタま<br />

たは即値を使用で き る。 ビ ッ ト ・ ベー ス ・ オペラ ン ド がレ ジ ス タ を指定している場合は、<br />

この命令はビット・オフセット・オペランドの( レジスタ ・サイズに従って) 16 または<br />

32 の剰余を と り、 それぞれ 16 または 32 ビッ トのレジスタで任意のビッ ト位置を選択で<br />

きるようにしている。 ビッ ト ・ベース ・ オペランドがメモリ ・ ロケーションを指定して<br />

いる場合は、 こ のオペラ ン ド は対象のビ ッ ト ・ ス ト リ ングのビ ッ ト ・ ベー ス ( 指定さ れた<br />

バイ ト のビッ ト 0) を含むメモ リ内のバイ ト のア ド レスを表している。 したがって、 オフ<br />

セッ ト ・オペランドは、 レジスタ ・オフセッ トの場合は -231 から 231 - 1 までの範囲の<br />

ビ ッ ト 位置を、 また即値オフセッ ト の場合は 0 から 31 までの範囲のビット位置を選択す る。<br />

一部のアセンブ ラ は、 即値ビ ッ ト ・ オ フ セ ッ ト ・ フ ィ ー ル ド を メ モ リ ・ オペラ ン ド の<br />

デ ィ スプレ ー スメ ン ト ・ フ ィ ール ド と 組み合わせて使用して、 31 より大きい即値ビッ<br />

ト ・ オ フ セ ッ ト をサポ ー ト してい る。 こ のア ド レ ス指定方式の詳細は、 3:400 ページの<br />

「BT—Bit Test」 を参照のこ と。<br />

操作<br />

CF ← Bit(BitBase, BitOffset)<br />

Bit(BitBase, BitOffset) ← 0;<br />

影響を受けるフラグ<br />

CF フラグに選択されたビッ トのク リアされる前の値がストアされる。 OF、 SF、 ZF、<br />

AF、 PF フ ラ グは未定義。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

3:404 第 3 巻 : IA-32 基本命令リファレンス


BTR ─ Bit Test and Reset ( 続き )<br />

保護モード例外<br />

#GP(0) デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド の指示先が書き込み不可<br />

能なセグ メ ン ト の場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 現行<br />

特権レベルが 3 のときにアライメントが合わないメモリ参<br />

照を行った場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メ ン ト が合わないメモ リ 参照を行っ た場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:405


BTS ─ Bit Test and Set<br />

オペコード 命令 説明<br />

0F AB BTS r/m16,r16 選択したビットを CF フラグにストアし、セットする。<br />

0F AB BTS r/m32,r32 選択したビットを CF フラグにストアし、セットする。<br />

0F BA /5 ib BTS r/m16,imm8 選択したビットを CF フラグにストアし、セットする。<br />

0F BA /5 ib BTS r/m32,imm8 選択したビットを CF フラグにストアし、セットする。<br />

説明<br />

ビッ ト ・ベース・オペランド ( 第 1 オペラン ド ) によって指定されるビット ・ スト リング<br />

内で、 ビット・オフセット・オペランド( 第 2 オペラン ド ) に よ っ て指定さ れる ビ ッ ト 位<br />

置のビッ トを選択し、 そのビッ トの値をCF フラグにストアし、 ビッ ト ・ スト リング内の<br />

選択したビ ッ ト を 1 にセットする。 ビット・ベース・オペランドには、 レジスタまたはメ<br />

モリ ・ ロケーションを使用できる。 ビッ ト ・ オフセッ ト ・ オペランドには、 レジスタま<br />

たは即値を使用で き る。 ビ ッ ト ・ ベー ス ・ オペラ ン ド がレ ジ ス タ を指定している場合は、<br />

この命令はビット・オフセット・オペランドの( レジスタ ・サイズに従って) 16 または<br />

32 の剰余を と り、 それぞれ 16 または 32 ビッ トのレジスタで任意のビッ ト位置を選択で<br />

きるようにしている。 ビッ ト ・ベース ・ オペランドがメモリ ・ ロケーションを指定して<br />

いる場合は、 こ のオペラ ン ド は対象のビ ッ ト ・ ス ト リ ングのビ ッ ト ・ ベー ス ( 指定さ れた<br />

バイ ト のビッ ト 0) を含むメモ リ内のバイ ト のア ド レスを表している。 したがって、 オフ<br />

セッ ト ・オペランドは、 レジスタ ・オフセッ トの場合は -231 から 231 - 1 までの範囲の<br />

ビ ッ ト 位置を、 また即値オフセッ ト の場合は 0 から 31 までの範囲のビット位置を選択す る。<br />

一部のアセンブ ラ は、 即値ビ ッ ト ・ オ フ セ ッ ト ・ フ ィ ー ル ド を メ モ リ ・ オペラ ン ド の<br />

デ ィ スプレ ー スメ ン ト ・ フ ィ ール ド と 組み合わせて使用して、 31 より大きい即値ビッ<br />

ト ・ オ フ セ ッ ト をサポ ー ト してい る。 こ のア ド レ ス指定機構の詳細は、 3:400 ページの<br />

「BT—Bit Test」 を参照のこ と。<br />

操作<br />

CF ← Bit(BitBase, BitOffset)<br />

Bit(BitBase, BitOffset) ← 1;<br />

影響を受けるフラグ<br />

CF フラグに選択されたビッ トのセッ ト される前の値がストアされる。 OF、 SF、 ZF、<br />

AF、 PF フ ラ グは未定義。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

3:406 第 3 巻 : IA-32 基本命令リファレンス


BTS ─ Bit Test and Set ( 続き )<br />

保護モード例外<br />

#GP(0) デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド の指示先が書き込み不可<br />

能なセグ メ ン ト の場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 現行<br />

特権レベルが 3 のときにアライメントが合わないメモリ参<br />

照を行った場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メ ン ト が合わないメモ リ 参照を行っ た場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:407


CALL ─ Call Procedure<br />

オペコード 命令 説明<br />

E8 cw CALL rel16 near コール、次の命令とディスプレースメント相対。<br />

E8 cd CALL rel32 near コール、次の命令とディスプレースメント相対。<br />

FF /2 CALL r/m16 near コール、r/m16 間接。<br />

FF /2 CALL r/m32 near コール、r/m32 間接。<br />

9A cd CALL ptr16:16 far コール、所定のフルポインタへ。<br />

9A cp CALL ptr16:32 far コール、所定のフルポインタへ。<br />

FF /3 CALL m16:16 far コール、r/m16 でアドレスを指定。<br />

FF /3 CALL m16:32 far コール、r/m32 でアドレスを指定。<br />

説明<br />

プロシージャ ・ リンク情報をプロシージャ ・ スタックにセーブし、 デスティネーション<br />

( ターゲッ ト ) オペラン ド で指定されるプロシージ ャ ( コール先プロシージャ ) にジャン<br />

プする。 ターゲッ ト ・ オペランドは、 コール先プロシージャの最初の命令のアドレスを 指定す る。 こ のオペラ ン ド に は、 即値、 汎用レ ジ ス タ、 ま たは メ モ リ ・ ロ ケ ー シ ョ ン を<br />

使用で き る。<br />

この命令を使用して、 以下の異なる 4 つのタイプのコ ールを実行でき る。<br />

• near コール - 現在の コ ー ド ・ セグ メ ン ト ( 現在の CS レジスタの指示先のセグメント )<br />

内にあるプロシージャへのコール。 セグメント内コールともいう。<br />

• far コール - 現在の コ ー ド ・ セグ メ ン ト と は異なるセグ メ ン ト 内にある プ ロ シ ー ジ ャ<br />

へのコ ール。 セグメン ト 間コ ール と もいう。<br />

• 特権レ ベル間 far コール - 現在実行中のプログラムまたはプロシージャの特権レベル<br />

とは異なる特権レベルのセグメント内にあるプロシージャへのコール。 Itanium ベー<br />

ス・システム環境では、IA-32_Intercept(Gate) が発生する。<br />

• タスク ・ スイッチ - 異なる タス ク内にあるプロシー ジ ャ へのコ ール。 Itanium ベー<br />

ス・システム環境では、IA-32_Intercept(Gate) が発生する。<br />

上記の最後の 2 つのコ ール ・ タイプ ( 特権レベル間 コ ー ル と タ ス ク ・ ス イ ッ チ ) は、 保<br />

護モー ド でのみ実行でき る。 CALL 命令に よ る タ ス ク ・ ス イ ッ チの実行の詳細は、<br />

『IA-32 インテル ® アーキテクチャ ・ ソフ ト ウェア ・ ディベロッパーズ ・ マニュアル、 下<br />

巻』 第 6 章を参照のこ と。<br />

near コールを実行する と きは、 プロセッサは、 EIP レジスタの値(CALL 命令の次の命令<br />

のア ド レ ス を内容 と す る ) を ( 後で リ タ ー ン命令のポ イ ン タ と して使用す る ために ) プロ<br />

シージャ・スタックにプッシュする。 次に、 プロセッサは、 ターゲット ・オペランドで<br />

指定される、 コール先プロシージャのアドレスにジャンプする。 ターゲット ・オペラン<br />

ドは、 コード ・セグメント内の絶対アドレス( すなわち、 コ ー ド ・ セグメン ト のベース<br />

からのオフセッ ト ) か、 相対オ フ セ ッ ト (CALL の次の命令を指示先 と する、 EIP レジス<br />

タ内の命令ポ イ ン タ の現在値に相対的な符号付き デ ィ スプ レ ー ス メ ン ト ) かを指定す る。<br />

絶対ア ド レ ス は、 レ ジ ス タ内で直接指定される か、 ま たは メ モ リ ・ ロ ケ ー シ ョ ン内で間<br />

接的に指定 さ れる (r/m16 または r/m32 ターゲッ ト ・オペランド形式)。 スタッ ク ・ ポイ<br />

ンタ (ESP) をベース ・ レジスタ と して使用して、 絶対アド レスに間接的にアクセスする<br />

場合は、 使用 さ れる ベー ス値は、 命令が実行 さ れる前の ESP の値である。 相対オフセ ッ<br />

ト (rel16 または rel32) は、 一般的に、 アセンブ リ ・ コ ー ド では ラ ベル と して指定 さ れる<br />

が、 マシン ・ コ ー ド ・ レベルでは符号付きの 16 ビットまたは32 ビット即値としてコー<br />

ド化され、 この値が命令ポインタに加算される。<br />

3:408 第 3 巻 : IA-32 基本命令リファレンス


CALL ─ Call Procedure ( 続き )<br />

near コ ールを実行する と き、 絶対ア ド レ スを示すタ ーゲ ッ ト ・ オペラ ン ド のサイズ (16<br />

ビッ トまたは32 ビッ ト ) は、 オペラン ド ・ サイズ属性によ って決ま る。 絶対アド レス<br />

は、 EIP レ ジ ス タ に直接ロ ー ド さ れる。 相対オ フ セ ッ ト が指定 さ れてい る場合は、 その<br />

値が EIP レジスタの値に加算される。 オペランド ・サイズ属性が16 の場合は、 EIP レジ<br />

スタの上位2 バイ ト が 0 にク リアされ、 命令ポインタの最大サイズは 16 ビッ トになる。<br />

CS レジスタは near コールでは変わらない。<br />

far コールを実行する と きは、 プロセッサは、 リ ターン命令ポインタ として使用するため<br />

に、 CS および EIP 両レ ジ ス タ の現在の値をプ ロ シ ー ジ ャ ・ ス タ ッ ク にプ ッ シ ュ す る。 プ<br />

ロセッサは、 次にコール先プロシージャのターゲット ・オペランドで指定されるコー<br />

ド・セグメントとオペランドへのfar ジャンプを実行する。 この場合、 ターゲット ・オ<br />

ペラン ド は、 絶対far アドレスをポインタ (ptr16:16 または ptr16:32) で直接的に、 ま たは<br />

メモリ ・ ロケーシ ョ ン (m16:16 または m16:32) で間接的に指定す る。 ポ イ ン タ方式では、<br />

コ ー ル先プ ロ シ ー ジ ャ のセグ メ ン ト と ア ド レ ス は、 命令内で 4 バイ ト (16 ビッ ト ・オペ<br />

ランド ・ サイズ ) または 6 バイ ト (32 ビッ ト ・オペランド ・サイズ) の far 即値ア ド レ ス<br />

を使用して コ ー ド 化 さ れる。 間接方式では、 タ ー ゲ ッ ト ・ オペラ ン ド は、 4 バイ ト (16<br />

ビッ ト ・オペランド ・サイズ) または 6 バイ ト (32 ビッ ト ・オペランド ・サイズ) の far<br />

アドレスがストアされているメモリ ・ロケーションを指定する。 オペランド ・サイズ属<br />

性に よ って far アドレス内のオフセットのサイズ(16 または 32 ビット ) が決ま る。 far ア<br />

ドレスはCS および EIP レジスタに直接ロード される。 オペランド ・サイズ属性が16 の<br />

場合は、 EIP レジスタの上位2バイ ト が 0 にク リアされる。<br />

32 ビッ ト ・ コード ・セグメントから 16 ビッ ト ・ コード ・セグメントへのfar コールは、<br />

32 ビ ッ ト ・ コ ー ド ・ セグ メ ン ト の最初の 64K バイ ト から実行しなければならない。 これ<br />

は、 命令のオペラ ン ド ・ サ イ ズ属性が 16 に設定されるため、 16 ビッ トのリターン・ア<br />

ドレス・オフセットだけがセーブされるからである。 また、 このコールは、 16 ビット値<br />

がスタ ッ ク上にプッ シュ される よ うに、 16 ビ ッ ト ・ コール ・ ゲー ト を使用して実行しな<br />

ければならない。<br />

プ ロ セ ッ サが保護モ ー ド で動作している と き は、 far コ ー ルを使用して、 異な る特権レベ<br />

ルにあるコー ド ・ セグメン ト にアクセスしたり、 タスクを切り替えられる。 この場合、<br />

プロセッサは、 far アドレスのセグメント ・セレクタ部を使用して、 ジャンプ先セグメン<br />

トのセグメント ・ディスク リプタにアクセスする。 CALL 命令は、 セグ メ ン ト ・ セレ ク<br />

タ内の タ イ プお よ びア ク セス権情報の値に基づいて、 以下の操作を実行で き る。<br />

• 同じ特権レベルへの far コール( 前の段落で説明 )。<br />

• 異なる特権レベルへの far コール。 Itanium ベース・システム環境では、<br />

IA-32_Intercept(Gate) が発生する。<br />

• タスク ・ スイッチ。 Itanium ベース・システム環境では、IA-32_Intercept(Gate) が発<br />

生する。<br />

特権レベル間の far コールを実行するときは、 コール先プロシージャのコード ・セグメ<br />

ン ト にはコール ・ ゲー ト を介してアクセスする。 コール ・ ゲー ト はターゲッ ト ・ オペラ<br />

ンドによって指定されるセグメント ・セレクタによって指定される。 コール・ゲートを<br />

介して コ ー ルを実行す る と き に特権レベルの移行が発生する場合は、 プ ロ セ ッ サは、<br />

コール先プロシージャの特権レベルのスタックに切り替え、 CS および EIP レジスタの現<br />

在値 と 元のス タ ッ ク の SS および ESP 値を新しいスタ ッ クにプッ シュしてから、 新しい<br />

コード ・セグメントへのfar ジャンプを実行する。 新しいコード ・セグメントは、 コー<br />

ル ・ ゲ ー ト ・ デ ィ ス ク リ プ タ で指定 さ れる。 新しいス タ ッ ク ・ セグ メ ン ト は、 現在実行<br />

中のタ ス クの TSS で指定される。 新しい コ ー ド ・ セグメ ン ト へのジ ャ ンプはスタ ッ ク ・<br />

スイッチの後で行われる。 プロセッサは、 新しいスタックに、 コール元プロシージャの<br />

スタックのセグメント ・セレクタとスタック ・ ポインタ、 およびコール元プロシージャ<br />

のコー ド ・ セグメン トのセグメン ト ・ セレクタと命令ポインタをプッシュする。 ( コー<br />

ル・ゲート記述子内の値によって、 新しいスタックにコピーするパラメータの数が決ま<br />

る。 )<br />

第 3 巻 : IA-32 基本命令リファレンス 3:409


CALL ─ Call Procedure ( 続き )<br />

プロセッサは、 最後に新しいコ ー ド ・ セグメン ト 内のコ ール先プロシージ ャのア ド レス<br />

にジャンプする。 このプロシージャ ・ アド レスは、 ターゲッ ト ・ オペランドで指定され<br />

たオ フ セ ッ ト である。 こ の場合 も 、 タ ー ゲ ッ ト ・ オペラ ン ド は、 ポ イ ン タ (ptr16:16 また<br />

は ptr16:32) を使用して直接に、 またはメモ リ ・ ロケーシ ョ ン (m16:16 または m16:32) を<br />

使用して間接的に、 コ ー ル ・ ゲー ト と プ ロ シ ー ジ ャ の far アドレスを指定できる。<br />

CALL 命令で タ ス ク ・ ス イ ッ チを実行す る のは、 コ ー ル ・ ゲ ー ト を介した コ ー ルを実行<br />

す る のに似てい る。 タ ス ク ・ ス イ ッ チの場合、 タ ー ゲ ッ ト ・ オペラ ン ド は、 切 り 替え先<br />

タスクへのタスク・ゲートのセグメント ・セレクタと、 切り替え先タスク内のコール先<br />

プロシージャのアド レスを指定する。 次に、 タスク ・ゲー トがタスクの TSS を指す。<br />

TSS の内容はタスクのコー ドおよびスタックの両セグメン トのセグメン ト ・ セレクタで<br />

ある。 CALL 命令は、 TSS のセグ メ ン ト ・ セレ ク タ を直接指定で き る。 タ ス ク ・ ス イ ッ<br />

チの仕組みの詳細は、 『IA-32 インテル ® アーキテクチャ ・ ソフ ト ウェア ・ ディベロッ<br />

パ ー ズ ・ マニ ュ アル、 下巻』 を参照の こ と 。<br />

操作<br />

IF near call<br />

THEN IF near relative call<br />

IF the instruction pointer is not within code segment limit THEN #GP(0); FI;<br />

THEN IF OperandSize = 32<br />

THEN<br />

IF stack not large enough for a 4-byte return address THEN #SS(0); FI;<br />

Push(EIP);<br />

EIP ← EIP + DEST; (* DEST is rel32 *)<br />

ELSE (* OperandSize = 16 *)<br />

IF stack not large enough for a 2-byte return address THEN #SS(0); FI;<br />

Push(IP);<br />

EIP ← (EIP + DEST) AND 0000FFFFH; (* DEST is rel16 *)<br />

FI;<br />

FI;<br />

ELSE (* near absolute call *)<br />

IF the instruction pointer is not within code segment limit THEN #GP(0); FI;<br />

IF OperandSize = 32<br />

THEN<br />

IF stack not large enough for a 4-byte return address THEN #SS(0); FI;<br />

Push(EIP);<br />

EIP ← DEST; (* DEST is r/m32 *)<br />

ELSE (* OperandSize = 16 *)<br />

IF stack not large enough for a 2-byte return address THEN #SS(0); FI;<br />

Push(IP);<br />

EIP ← DEST AND 0000FFFFH; (* DEST is r/m16 *)<br />

FI;<br />

FI:<br />

IF Itanium System Environment AND PSR.tb THEN IA-32_Exception(Debug);<br />

FI;<br />

IF far call AND (PE = 0 OR (PE = 1 AND VM = 1)) (* real address or virtual 8086 mode *)<br />

THEN<br />

IF OperandSize = 32<br />

THEN<br />

IF stack not large enough for a 6-byte return address THEN #SS(0); FI;<br />

IF the instruction pointer is not within code segment limit THEN #GP(0); FI;<br />

Push(CS); (* padded with 16 high-order bits *)<br />

Push(EIP);<br />

3:410 第 3 巻 : IA-32 基本命令リファレンス


CALL ─ Call Procedure ( 続き )<br />

FI;<br />

CS ← DEST[47:32]; (* DEST is ptr16:32 or [m16:32] *)<br />

EIP ← DEST[31:0]; (* DEST is ptr16:32 or [m16:32] *)<br />

ELSE (* OperandSize = 16 *)<br />

IF stack not large enough for a 4-byte return address THEN #SS(0); FI;<br />

IF the instruction pointer is not within code segment limit THEN #GP(0); FI;<br />

Push(CS);<br />

Push(IP);<br />

CS ← DEST[31:16]; (* DEST is ptr16:16 or [m16:16] *)<br />

EIP ← DEST[15:0]; (* DEST is ptr16:16 or [m16:16] *)<br />

EIP ← EIP AND 0000FFFFH; (* clear upper 16 bits *)<br />

FI;<br />

IF Itanium System Environment AND PSR.tb THEN IA-32_Exception(Debug);<br />

IF far call AND (PE = 1 AND VM = 0) (* Protected mode, not virtual 8086 mode *)<br />

THEN<br />

IF segment selector in target operand null THEN #GP(0); FI;<br />

IF segment selector index not within descriptor table limits<br />

THEN #GP(new code selector);<br />

FI;<br />

Read type and access rights of selected segment descriptor;<br />

IF segment type is not a conforming or nonconforming code segment, call gate,<br />

task gate, or TSS THEN #GP(segment selector); FI;<br />

Depending on type and access rights<br />

GO TO CONFORMING-CODE-SEGMENT;<br />

GO TO NONCONFORMING-CODE-SEGMENT;<br />

GO TO CALL-GATE;<br />

GO TO TASK-GATE;<br />

GO TO TASK-STATE-SEGMENT;<br />

FI;<br />

CONFORMING-CODE-SEGMENT:<br />

IF DPL > CPL THEN #GP(new code segment selector); FI;<br />

IF not present THEN #NP(selector); FI;<br />

IF OperandSize = 32<br />

THEN<br />

IF stack not large enough for a 6-byte return address THEN #SS(0); FI;<br />

IF the instruction pointer is not within code segment limit THEN #GP(0); FI;<br />

Push(CS); (* padded with 16 high-order bits *)<br />

Push(EIP);<br />

CS ← DEST(NewCodeSegmentSelector);<br />

(* segment descriptor information also loaded *)<br />

CS(RPL) ← CPL<br />

EIP ← DEST(offset);<br />

ELSE (* OperandSize = 16 *)<br />

IF stack not large enough for a 4-byte return address THEN #SS(0); FI;<br />

IF the instruction pointer is not within code segment limit THEN #GP(0); FI;<br />

Push(CS);<br />

Push(IP);<br />

CS ← DEST(NewCodeSegmentSelector);<br />

(* segment descriptor information also loaded *)<br />

CS(RPL) ← CPL<br />

EIP ← DEST(offset) AND 0000FFFFH; (* clear upper 16 bits *)<br />

FI;<br />

第 3 巻 : IA-32 基本命令リファレンス 3:411


CALL ─ Call Procedure ( 続き )<br />

IF Itanium System Environment AND PSR.tb THEN IA-32_Exception(Debug);<br />

END;<br />

NONCONFORMING-CODE-SEGMENT:<br />

IF (RPL > CPL) OR (DPL ≠ CPL) THEN #GP(new code segment selector); FI;<br />

IF stack not large enough for return address THEN #SS(0); FI;<br />

tempEIP ← DEST(offset)<br />

IF OperandSize=16<br />

THEN<br />

tempEIP ← tempEIP AND 0000FFFFH; (* clear upper 16 bits *)<br />

FI;<br />

IF tempEIP outside code segment limit THEN #GP(0); FI;<br />

IF OperandSize = 32<br />

THEN<br />

Push(CS); (* padded with 16 high-order bits *)<br />

Push(EIP);<br />

CS ← DEST(NewCodeSegmentSelector);<br />

(* segment descriptor information also loaded *)<br />

CS(RPL) ← CPL;<br />

EIP ← tempEIP;<br />

ELSE (* OperandSize = 16 *)<br />

Push(CS);<br />

Push(IP);<br />

CS ← DEST(NewCodeSegmentSelector);<br />

(* segment descriptor information also loaded *)<br />

CS(RPL) ← CPL;<br />

EIP ← tempEIP;<br />

FI;<br />

IF Itanium System Environment AND PSR.tb THEN IA-32_Exception(Debug);<br />

END;<br />

CALL-GATE:<br />

IF call gate DPL < CPL or RPL THEN #GP(call gate selector); FI;<br />

IF not present THEN #NP(call gate selector); FI;<br />

IF Itanium System Environment THEN IA-32_Intercept(Gate,CALL);<br />

IF call gate code-segment selector is null THEN #GP(0); FI;<br />

IF call gate code-segment selector index is outside descriptor table limits<br />

THEN #GP(code segment selector); FI;<br />

Read code segment descriptor;<br />

IF code-segment segment descriptor does not indicate a code segment<br />

OR code-segment segment descriptor DPL > CPL<br />

THEN #GP(code segment selector); FI;<br />

IF code segment not present THEN #NP(new code segment selector); FI;<br />

IF code segment is non-conforming AND DPL < CPL<br />

THEN go to MORE-PRIVILEGE;<br />

ELSE go to SAME-PRIVILEGE;<br />

FI;<br />

END;<br />

MORE-PRIVILEGE:<br />

IF current TSS is 32-bit TSS<br />

THEN<br />

TSSstackAddress ← new code segment (DPL ∗ 8) + 4<br />

3:412 第 3 巻 : IA-32 基本命令リファレンス


CALL ─ Call Procedure ( 続き )<br />

IF (TSSstackAddress + 7) > TSS limit<br />

THEN #TS(current TSS selector); FI;<br />

newSS ← TSSstackAddress + 4;<br />

newESP ← stack address;<br />

ELSE (* TSS is 16-bit *)<br />

TSSstackAddress ← new code segment (DPL ∗ 4) + 2<br />

IF (TSSstackAddress + 4) > TSS limit<br />

THEN #TS(current TSS selector); FI;<br />

newESP ← TSSstackAddress;<br />

newSS ← TSSstackAddress + 2;<br />

FI;<br />

IF stack segment selector is null THEN #TS(stack segment selector); FI;<br />

IF stack segment selector index is not within its descriptor table limits<br />

THEN #TS(SS selector); FI<br />

Read code segment descriptor;<br />

IF stack segment selector's RPL ≠ DPL of code segment<br />

OR stack segment DPL ≠ DPL of code segment<br />

OR stack segment is not a writable data segment<br />

THEN #TS(SS selector); FI<br />

IF stack segment not present THEN #SS(SS selector); FI;<br />

IF CallGateSize = 32<br />

THEN<br />

IF stack does not have room for parameters plus 16 bytes<br />

THEN #SS(SS selector); FI;<br />

IF CallGate(InstructionPointer) not within code segment limit THEN #GP(0); FI;<br />

SS ← newSS;<br />

(* segment descriptor information also loaded *)<br />

ESP ← newESP;<br />

CS:EIP ← CallGate(CS:InstructionPointer);<br />

(* segment descriptor information also loaded *)<br />

Push(oldSS:oldESP); (* from calling procedure *)<br />

temp ← parameter count from call gate, masked to 5 bits;<br />

Push(parameters from calling procedure’s stack, temp)<br />

Push(oldCS:oldEIP); (* return address to calling procedure *)<br />

ELSE (* CallGateSize = 16 *)<br />

IF stack does not have room for parameters plus 8 bytes<br />

THEN #SS(SS selector); FI;<br />

IF (CallGate(InstructionPointer) AND FFFFH) not within code segment limit<br />

THEN #GP(0); FI;<br />

SS ← newSS;<br />

(* segment descriptor information also loaded *)<br />

ESP ← newESP;<br />

CS:IP ← CallGate(CS:InstructionPointer);<br />

(* segment descriptor information also loaded *)<br />

Push(oldSS:oldESP); (* from calling procedure *)<br />

temp ← parameter count from call gate, masked to 5 bits;<br />

Push(parameters from calling procedure’s stack, temp)<br />

Push(oldCS:oldEIP); (* return address to calling procedure *)<br />

FI;<br />

CPL ← CodeSegment(DPL)<br />

CS(RPL) ← CPL<br />

END;<br />

第 3 巻 : IA-32 基本命令リファレンス 3:413


CALL ─ Call Procedure ( 続き )<br />

SAME-PRIVILEGE:<br />

IF CallGateSize = 32<br />

THEN<br />

IF stack does not have room for 8 bytes<br />

THEN #SS(0); FI;<br />

IF EIP not within code segment limit then #GP(0); FI;<br />

CS:EIP ← CallGate(CS:EIP) (* segment descriptor information also loaded *)<br />

Push(oldCS:oldEIP); (* return address to calling procedure *)<br />

ELSE (* CallGateSize = 16 *)<br />

IF stack does not have room for parameters plus 4 bytes<br />

THEN #SS(0); FI;<br />

IF IP not within code segment limit THEN #GP(0); FI;<br />

CS:IP ← CallGate(CS:instruction pointer)<br />

(* segment descriptor information also loaded *)<br />

Push(oldCS:oldIP); (* return address to calling procedure *)<br />

FI;<br />

CS(RPL) ← CPL<br />

END;<br />

TASK-GATE:<br />

IF task gate DPL < CPL or RPL<br />

THEN #GP(task gate selector);<br />

FI;<br />

IF task gate not present<br />

THEN #NP(task gate selector);<br />

FI;<br />

IF Itanium System Environment THEN IA-32_Intercept(Gate,CALL);<br />

Read the TSS segment selector in the task-gate descriptor;<br />

IF TSS segment selector local/global bit is set to local<br />

OR index not within GDT limits<br />

THEN #GP(TSS selector);<br />

FI;<br />

Access TSS descriptor in GDT;<br />

IF TSS descriptor specifies that the TSS is busy (low-order 5 bits set to 00001)<br />

THEN #GP(TSS selector);<br />

FI;<br />

IF TSS not present<br />

THEN #NP(TSS selector);<br />

FI;<br />

SWITCH-TASKS (with nesting) to TSS;<br />

IF EIP not within code segment limit<br />

THEN #GP(0);<br />

FI;<br />

END;<br />

TASK-STATE-SEGMENT:<br />

IF TSS DPL < CPL or RPL<br />

ORTSS segment selector local/global bit is set to local<br />

OR TSS descriptor indicates TSS not available<br />

THEN #GP(TSS selector);<br />

FI;<br />

IF TSS is not present<br />

THEN #NP(TSS selector);<br />

3:414 第 3 巻 : IA-32 基本命令リファレンス


CALL ─ Call Procedure ( 続き )<br />

FI;<br />

IF Itanium System Environment THEN IA-32_Intercept(Gate,CALL);<br />

SWITCH-TASKS (with nesting) to TSS<br />

IF EIP not within code segment limit<br />

THEN #GP(0);<br />

FI;<br />

END;<br />

影響を受けるフラグ<br />

タスク ・ スイッチが行われた場合はすべてのフラグが影響を受け、 タスク ・ スイッチが<br />

行われなか っ た場合は どのフ ラグ も影響を受けない。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

VHPT データ・ フォ ルト 、 ネスト さ れた TLB フォルト 、<br />

データ TLB フォルト 、 代替データ TLB フォルト 、 データ・<br />

ペー ジ 不在フ ォ ルト 、 デー タ NaT ペー ジ参照アボー ト 、<br />

データ・キー・ミス・フォルト、データ・キー許可フォル<br />

ト 、 データ・ アク セス権フォ ルト 、 データ・ アク セス・<br />

ビッ ト ・ フォルト 、 データ・ ダーティ ・ ビッ ト ・ フォルト 。<br />

IA-32_Intercept CALL ゲー ト、 タスク ・ ゲー ト、 タスク ・ セグメン ト を介<br />

した CALL のゲー ト ・ インタ ーセプ ト 。<br />

IA-32_Exception 発生した分岐のデバ ッ グ例外 (PSR.tb が 1 の場合 )。<br />

保護モード例外<br />

#GP(0) デステ ィ ネーシ ョ ン ・ オペラン ド内のターゲッ ト ・ オフ<br />

セ ッ ト が新しいコ ー ド ・ セグ メン ト の範囲外の場合。<br />

デステ ィ ネーシ ョ ン ・ オペラン ド内のセグメン ト ・ セレク<br />

タが NULL の場合。<br />

ゲート内のコード ・セグメント ・セレクタがNULL の場<br />

合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタを使用してメモリがア<br />

クセスされ、 レジスタの内容が NULL セグメン ト ・ セレ<br />

クタであった場合。<br />

#GP( セレクタ ) コード ・セグメント、 ゲート、 またはTSS のセレ ク タ ・<br />

イ ンデ ッ ク スが記述子テ ー ブルの範囲外の場合。<br />

デスティネーション ・ オペランド にあるセグメン ト ・ セレ<br />

ク タ の指示先のセグ メ ン ト 記述子が コ ン フ ォ ー ミ ン グ ・<br />

コード・セグメント、非コンフォーミング・コード・セグ<br />

メント、 コール・ゲート、 タスク ・ゲート、 またはタス<br />

ク・ステート・セグメントのいずれのものでもなかった場<br />

合。<br />

非コンフォー ミング ・ コー ド ・ セグメン ト の DPL が CPL<br />

に等し くないか、 またはセグメン トのセグメン ト ・セレク<br />

タの RPL が CPL より大きい場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:415


CALL ─ Call Procedure ( 続き )<br />

コンフォーミ ング・ コード ・ セグメント の DPL が CPL より<br />

大き い場合。<br />

コール ・ ゲー ト、 タスク ・ ゲー ト、 または TSS のセグメ<br />

ント記述子からのDPL が、 CPL、 またはコール ・ ゲー ト、<br />

タスク ・ゲー ト、 または TSS のセグメン ト ・ セレ ク タの<br />

RPL よ り 小さ い場合。<br />

コール・ゲートからのセグメント ・セレクタのセグメント<br />

記述子が、 そのコール・ゲートがコード ・セグメントであ<br />

る こ と を示していない場合。<br />

コール・ゲートからのセグメント ・セレクタが記述子テー<br />

ブルの範囲外の場合。<br />

コール ・ ゲー ト から得られたコー ド ・ セグメン ト の DPL<br />

が CPL よ り 大き い場合。<br />

TSS のセグメン ト ・ セレ ク タのローカル / グローバル ・<br />

ビ ッ ト がローカルと してセッ ト されている場合。<br />

TSS のセグ メ ン ト 記述子が、 TSS がビジーであるか、 また<br />

は使用不可能であ る こ と を示してい る場合。<br />

#SS(0) スタック・スイッチが行われなかったときに、リターン・ア<br />

ド レス、 パラメータ、 またはスタック・ セグメント ・ ポイン<br />

タをスタックにプッシュした結果、 スタック・ セグメント の<br />

範囲を超えた場合。<br />

メモリ・オペランドの実効アドレスがSS セグメント の範囲<br />

外の場合。<br />

#SS( セレクタ ) ス タ ッ ク ・ ス イ ッ チが行われた と き に、 リ タ ー ン ・ ア ド レ<br />

ス、 パラ メータ、 またはスタ ッ ク ・ セグメン ト ・ ポインタ<br />

をスタックにプッシュした結果、 スタック ・セグメントの<br />

範囲を超えた場合。<br />

ス タ ッ ク ・ ス イ ッ チの一環 と して SS レジスタへのロード<br />

が行われよ う と する と き、 指示先のセグメ ン ト が存在しな<br />

い と マ ー ク さ れていた場合。<br />

ス タ ッ ク ・ ス イ ッ チが行われた と き、 リ タ ーン ・ ア ド レ<br />

ス、 パラ メータ、 またはスタ ッ ク ・ セグメン ト ・ ポインタ<br />

をス ト アするための余裕がスタック ・ セグメン ト にない場<br />

合。<br />

#NP( セレクタ ) コード ・セグメント、 データ ・セグメント、 スタック ・セ<br />

グメント、 コール・ゲート、 タスク・ゲート、 またはTSS<br />

が存在しない場合。<br />

#TS( セレクタ ) 新しいスタ ッ ク ・ セグメン ト ・ セレ ク タ と ESP が TSS の<br />

終 り を超えてい る場合。<br />

新しいスタ ッ ク ・ セグメン ト ・ セレ ク タが NULL の場合。<br />

TSS 内の新しいス タ ッ ク ・ セグメン ト ・ セレ ク タの RPL<br />

がアクセス先のコ ー ド ・ セグメン ト の DPL と等し くない<br />

場合。<br />

3:416 第 3 巻 : IA-32 基本命令リファレンス


CALL ─ Call Procedure ( 続き )<br />

新しいスタック ・セグメント用のスタック ・セグメント記<br />

述子の DPL が コ ー ド ・ セグ メ ン ト 記述子の DPL と等し く<br />

ない場合。<br />

新しいスタ ッ ク ・ セグメン ト が書き込み可能なデータ ・ セ<br />

グメン ト でない場合。<br />

スタック ・セグメン トのセグメン ト ・セレクタ ・ インデッ<br />

ク スが記述子テ ー ブルの範囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

タ ー ゲ ッ ト ・ オ フ セ ッ ト が コ ー ド ・ セグ メ ン ト の範囲外の<br />

場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

タ ー ゲ ッ ト ・ オ フ セ ッ ト が コ ー ド ・ セグ メ ン ト の範囲外の<br />

場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:417


CBW/CWDE ─ Convert Byte to Word/Convert Word to Doubleword<br />

オペコード 命令 説明<br />

98 CBW AX ← AL の符号拡張<br />

98 CWDE EAX ← AX の符号拡張<br />

説明<br />

符号拡張に よ り 、 ソ ー ス ・ オペラ ン ド のサイ ズを 2 倍に拡張する。 CBW ( バイ ト から<br />

ワードへの変換) 命令は、 ソ ー ス ・ オペラ ン ド の符号 ( ビット 7) を AH レジスタのすべ<br />

てのビ ッ ト にコ ピーする。 CWDE ( ワードからダブルワードへの変換) 命令は、 AX レジ<br />

スタ内のワー ドの符号( ビッ ト 15) を EAX レジスタの上位16 ビッ トにコピーする。<br />

CBW および CWDE ニーモニッ クは同じオペコー ド を参照する。 CBW 命令は オペラ ン<br />

ド・サイズ属性が16 のとき、 またCWDE 命令は オペラ ン ド ・ サイズ属性が 32 のときに<br />

使用す る こ と を目的 と してい る。 一部のアセンブ ラ には、 CBW が使用された と き はオペ<br />

ランド ・ サイズを 16 ビットに、 またCWDE が使用された と き は 32 ビ ッ ト に強制で き る<br />

ものがある。 その他のアセンブラは、 これらのニーモニックを同義語(CBW/CWDE) と<br />

して取 り 扱い、 ど ち ら のニ ー モニ ッ ク が使用 さ れて も 、 その と き のオペラ ン ド ・ サイ ズ<br />

属性の設定を使用して変換対象の値のサ イ ズを判定で き る。<br />

CWDE 命令は、 CWD ( ワードからダブルへの変換) 命令 と は異なる。 すなわち、 CWD<br />

命令はデスティネーション・オペランドしてDX:AX レ ジ ス タ ・ ペアを使用す る のに対<br />

し、 CWDE 命令はデス テ ィ ネ ー シ ョ ン と して EAX レジスタを使用する。<br />

操作<br />

IF OperandSize = 16 (* instruction = CBW *)<br />

THEN AX ← SignExtend(AL);<br />

ELSE (* OperandSize = 32, instruction = CWDE *)<br />

EAX ← SignExtend(AX);<br />

FI;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

例外 ( すべての操作モード )<br />

なし。<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

3:418 第 3 巻 : IA-32 基本命令リファレンス


CDQ ─ Convert Double to Quad<br />

「CWD/CDQ - Convert Word to Double/Convert Double to Quad」 を参照のこ と。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:419


CLC ─ Clear Carry Flag<br />

オペコード 命令 説明<br />

F8 CLC CF フラグをクリアする。<br />

説明<br />

EFLAGS レジスタ内のCF フラグをクリアする。<br />

操作<br />

CF ← 0;<br />

影響を受けるフラグ<br />

CF フラグが0 にクリアされる。 OF、 ZF、 SF、 AF、 PF フラグは影響を受けない。<br />

例外 ( すべての操作モード )<br />

なし。<br />

3:420 第 3 巻 : IA-32 基本命令リファレンス


CLD ─ Clear Direction Flag<br />

オペコード 命令 説明<br />

FC CLD DF フラグをクリアする。<br />

説明<br />

EFLAGS レジスタ内のDF フラグをクリアする。 DF フラグが0 にセッ ト されている と き<br />

は、 ス ト リ ング操作を行う と、 インデ ッ クス ・ レジスタ (ESI または EDI、 あるいは両方)<br />

がインク リ メン ト される。<br />

操作<br />

DF ← 0;<br />

影響を受けるフラグ<br />

DF フラグが0 にクリアされる。 CF、 OF、 ZF、 SF、 AF、 PF フラグは影響を受けない。<br />

例外 ( すべての操作モード )<br />

なし。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:421


CLI ─ Clear Interrupt Flag<br />

オペコード 命令 説明<br />

FA CLI 割り込みフラグをクリアする。割り込みフラグがクリアされている<br />

ときは割り込みはディスエーブルにされる。<br />

説明<br />

この命令は、 EFLAGS レジスタ内のIF フラグをクリアする。 その他のフラグは影響を受<br />

けない。 IF フ ラ グを ク リ アす る と 、 プ ロ セ ッ サはマス ク 可能な外部割 り 込みを無視す<br />

る。 IF フラグと CLI および STI 命令は、 例外お よ び NMI 割り込みの発生には関係しな<br />

い。 Itanium ベース・システム環境では、IA-32 命令に対する外部割り込みは、PSR.i が<br />

1 で、~ CFLG.if または EFLAG.if が 1 である場合にイネーブルにされる。Itanium 命令<br />

に対する外部割り込みは、PSR.i が 1 の場合にイネーブルにされる。<br />

以下のデシ ジ ョ ン ・ テ ー ブルに、 プ ロ セ ッ サの動作モ ー ド に よ る CLI 命令の処置 ( テー<br />

ブルの横の太い線の下側 ) と、 そのと き実行中のプログラムまたはプロシージャの CPL<br />

およびIOPL( テーブルの横の太い線の上側 ) を示す。<br />

PE = 0 1 1 1 1<br />

VM = X 0 X 0 1<br />

CPL X ≤ IOPL X > IOPL X<br />

IOPL X X = 3 X < 3<br />

IF ← 0 Y Y Y N N<br />

#GP(0) N N N Y Y<br />

注 :<br />

X 無指定。<br />

N 左端の欄の処置が行われない。<br />

Y 左端の欄の処置が行われる。<br />

操作<br />

OLD_IF


CLI ─ Clear Interrupt Flag ( 続き )<br />

ELSE (*CR4.PVI==0 *)<br />

IF IOPL < CPL<br />

THEN #GP(0);<br />

ELSE IF


CLTS—Clear Task-Switched Flag in CR0<br />

オペコード 命令 説明<br />

0F 06 CLTS CR0 の TS フラグをクリアする。<br />

説明<br />

CR0 レジスタ内のタスク ・ スイッチ (TS) フラグをクリアする。 この命令は、 オペレー<br />

テ ィ ング ・ システム内で使用するこ とを目的としている。 これは CPL = 0 でのみ実行で<br />

き る特権命令である。 こ の命令は、 保護モー ド 向けの初期化を可能にす る ため、 実ア ド<br />

レス ・ モー ドで実行できるよ うになっている。<br />

プロセッサはタスク ・ スイッチが行われるたびに TS フラグをセットする。 このフラグ<br />

は、 マルチタスキング ・ アプリ ケーシ ョ ンでの FPU コンテキストのセーブを同期させる<br />

ために使用される。 このフラグの詳細は、 『IA-32 インテル ® アーキテクチャ ・ ソフ ト<br />

ウ ェ ア ・ デ ィ ベロ ッ パ ー ズ ・ マニ ュ アル、 下巻』 の TS フラグに関する説明を参照のこ<br />

と。<br />

操作<br />

IF Itanium System Environment THEN IA-32_Intercept(INST,CLTS);<br />

CR0(TS) ← 0;<br />

影響を受けるフラグ<br />

CR0 レジスタ内のTS フラグがクリアされる。 追加の Itanium ベース・システム環境例外<br />

IA-32_Intercept 強制命令イ ン タ ー セプ ト ・ フ ォ ル ト 。<br />

保護モード例外<br />

#GP(0) CPL が 0 より大きい場合。<br />

実アドレス・モード例外<br />

なし。<br />

仮想 8086 モード例外<br />

#GP(0) CPL が 0 より大きい場合。<br />

3:424 第 3 巻 : IA-32 基本命令リファレンス


CMC—Complement Carry Flag<br />

オペコード 命令 説明<br />

F5 CMC CF フラグの状態を反転する。<br />

説明<br />

EFLAGS レジスタ内のCF フラグの状態を反転する。<br />

操作<br />

CF ← NOT CF;<br />

影響を受けるフラグ<br />

CF フ ラグの内容がその元の値の補数になる。 OF、 ZF、 SF、 AF、 PF フラグは影響を受<br />

けない。<br />

例外 ( すべての操作モード )<br />

なし。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:425


CMOVcc—Conditional Move<br />

オペコード 命令 説明<br />

0F 47 cw/cd CMOVA r16, r/m16 より上 (CF=0 および ZF=0) の場合転送する。<br />

0F 47 cw/cd CMOVA r32, r/m32 より上 (CF=0 および ZF=0) の場合転送する。<br />

0F 43 cw/cd CMOVAE r16, r/m16 より上か等しい (CF=0) 場合転送する。<br />

0F 43 cw/cd CMOVAE r32, r/m32 より上か等しい (CF=0) 場合転送する。<br />

0F 42 cw/cd CMOVB r16, r/m16 より下 (CF=1) の場合転送する。<br />

0F 42 cw/cd CMOVB r32, r/m32 より下 (CF=1) の場合転送する。<br />

0F 46 cw/cd CMOVBE r16, r/m16 より下か等しい (CF=1 または ZF=1) 場合転送する。<br />

0F 46 cw/cd CMOVBE r32, r/m32 より下か等しい (CF=1 または ZF=1) 場合転送する。<br />

0F 42 cw/cd CMOVC r16, r/m16 キャリーがある (CF=1) 場合転送する。<br />

0F 42 cw/cd CMOVC r32, r/m32 キャリーがある (CF=1) 場合転送する。<br />

0F 44 cw/cd CMOVE r16, r/m16 等しい (ZF=1) 場合転送する。<br />

0F 44 cw/cd CMOVE r32, r/m32 等しい (ZF=1) 場合転送する。<br />

0F 4F cw/cd CMOVG r16, r/m16 より大きい (ZF=0 および SF=OF) 場合転送する。<br />

0F 4F cw/cd CMOVG r32, r/m32 より大きい (ZF=0 および SF=OF) 場合転送する。<br />

0F 4D cw/cd CMOVGE r16, r/m16 より大きいか等しい (SF=OF) 場合転送する。<br />

0F 4D cw/cd CMOVGE r32, r/m32 より大きいか等しい (SF=OF) 場合転送する。<br />

0F 4C cw/cd CMOVL r16, r/m16 より小さい (SFOF) 場合転送する。<br />

0F 4C cw/cd CMOVL r32, r/m32 より小さい (SFOF) 場合転送する。<br />

0F 4E cw/cd CMOVLE r16, r/m16 より小さいか等しい (ZF=1 または SFOF) 場合転送する。<br />

0F 4E cw/cd CMOVLE r32, r/m32 より小さいか等しい (ZF=1 または SFOF) 場合転送する。<br />

0F 46 cw/cd CMOVNA r16, r/m16 より上でない (CF=1 または ZF=1) 場合転送する。<br />

0F 46 cw/cd CMOVNA r32, r/m32 より上でない (CF=1 または ZF=1) 場合転送する。<br />

0F 42 cw/cd CMOVNAE r16, r/m16 より上でなく等しくない (CF=1) 場合転送する。<br />

0F 42 cw/cd CMOVNAE r32, r/m32 より上でなく等しくない (CF=1) 場合転送する。<br />

0F 43 cw/cd CMOVNB r16, r/m16 より下でない (CF=0) 場合転送する。<br />

0F 43 cw/cd CMOVNB r32, r/m32 より下でない (CF=0) 場合転送する。<br />

0F 47 cw/cd CMOVNBE r16, r/m16 より下でなく等しくない (CF=0 および ZF=0) 場合転送する。<br />

0F 47 cw/cd CMOVNBE r32, r/m32 より下でなく等しくない (CF=0 および ZF=0) 場合転送する。<br />

0F 43 cw/cd CMOVNC r16, r/m16 キャリーがない (CF=0) 場合転送する。<br />

0F 43 cw/cd CMOVNC r32, r/m32 キャリーがない (CF=0) 場合転送する。<br />

0F 45 cw/cd CMOVNE r16, r/m16 等しくない (ZF=0) 場合転送する。<br />

0F 45 cw/cd CMOVNE r32, r/m32 等しくない (ZF=0) 場合転送する。<br />

0F 4E cw/cd CMOVNG r16, r/m16 より大きくない (ZF=1 または SFOF) 場合転送する。<br />

0F 4E cw/cd CMOVNG r32, r/m32 より大きくない (ZF=1 または SFOF) 場合転送する。<br />

0F 4C cw/cd CMOVNGE r16, r/m16 より大きくなく等しくない (SFOF) 場合転送する。<br />

0F 4C cw/cd CMOVNGE r32, r/m32 より大きくなく等しくない (SFOF) 場合転送する。<br />

0F 4D cw/cd CMOVNL r16, r/m16 より小さくない (SF=OF) 場合転送する。<br />

3:426 第 3 巻 : IA-32 基本命令リファレンス


CMOVcc—Conditional Move ( 続き )<br />

オペコード 命令 説明<br />

0F 4D cw/cd CMOVNL r32, r/m32 より小さくない (SF=OF) 場合転送する。<br />

0F 4F cw/cd CMOVNLE r16, r/m16 より小さくなく等しくない (ZF=0 および SF=OF) 場合転送する。<br />

0F 4F cw/cd CMOVNLE r32, r/m32 より小さくなく等しくない (ZF=0 および SF=OF) 場合転送する。<br />

0F 41 cw/cd CMOVNO r16, r/m16 オーバフローがない (OF=0) 場合転送する。<br />

0F 41 cw/cd CMOVNO r32, r/m32 オーバフローがない (OF=0) 場合転送する。<br />

0F 4B cw/cd CMOVNP r16, r/m16 パリティがない (PF=0) 場合転送する。<br />

0F 4B cw/cd CMOVNP r32, r/m32 パリティがない (PF=0) 場合転送する。<br />

0F 49 cw/cd CMOVNS r16, r/m16 符号がない (SF=0) 場合転送する。<br />

0F 49 cw/cd CMOVNS r32, r/m32 符号がない (SF=0) 場合転送する。<br />

0F 45 cw/cd CMOVNZ r16, r/m16 ゼロでない (ZF=0) 場合転送する。<br />

0F 45 cw/cd CMOVNZ r32, r/m32 ゼロでない (ZF=0) 場合転送する。<br />

0F 40 cw/cd CMOVO r16, r/m16 オーバフローがある (OF=0) 場合転送する。<br />

0F 40 cw/cd CMOVO r32, r/m32 オーバフローがある (OF=0 ) 場合転送する。<br />

0F 4A cw/cd CMOVP r16, r/m16 パリティがある (PF=1) 場合転送する。<br />

0F 4A cw/cd CMOVP r32, r/m32 パリティがある (PF=1) 場合転送する。<br />

0F 4A cw/cd CMOVPE r16, r/m16 パリティが偶数 (PF=1) の場合転送する。<br />

0F 4A cw/cd CMOVPE r32, r/m32 パリティが偶数 (PF=1) の場合転送する。<br />

0F 4B cw/cd CMOVPO r16, r/m16 パリティが奇数 (PF=0) の場合転送する。<br />

0F 4B cw/cd CMOVPO r32, r/m32 パリティが奇数 (PF=0) の場合転送する。<br />

0F 48 cw/cd CMOVS r16, r/m16 符号がある (SF=1) 場合転送する。<br />

0F 48 cw/cd CMOVS r32, r/m32 符号がある (SF=1) 場合転送する。<br />

0F 44 cw/cd CMOVZ r16, r/m16 ゼロ (ZF=1) の場合転送する。<br />

0F 44 cw/cd CMOVZ r32, r/m32 ゼロ (ZF=1) の場合転送する。<br />

説明<br />

CMOVcc 命令は、 EFLAGS レジスタ内のステータス ・ フラグ (CF、 OF、 PF、 SF、 ZF) の<br />

1 つ以上の状態を調べ、 それらのフ ラグが指定された状態 ( または条件) の場合、 転送操<br />

作を実行する。 各命令ご と に特定の条件コ ー ド (cc) が対応してお り、 テス ト 対象の条件<br />

を示している。 条件が満たされなか った場合は、 転送は行われず、 CMOVcc 命令の次の<br />

命令か ら 実行が継続 さ れる。<br />

メ モ リ 形式で状態が偽であ る場合、 プ ロ セ ッ サ ・ モデルに よ っ ては、 ロ ー ド が開始 さ れ<br />

( ロード されたデータが廃棄され)、 メモリ ・ フォル トが発生する可能性がある。 他のプ<br />

ロ セ ッ サ ・ モデルでは、 状態が偽である場合は、 ロ ー ド は開始 さ れず、 フ ォ ル ト は発生<br />

しない。<br />

これらの命令では、 メモリからいずれかの汎用レジスタに、 または 1 つの汎用レジスタ<br />

か ら他の汎用レ ジ ス タ に 16 または 32 ビットの値を転送する。 8 ビッ ト ・レジスタ・オ<br />

ペラ ン ド の条件付き転送はサポ ー ト さ れていない。<br />

各 CMOVcc ニーモニ ッ クの条件は、 上記の表の説明欄に示している。 「よ り小さ い」 と<br />

「 よ り 大き い」 の表現は、 符号付き整数の比較に使用 さ れ、 「 よ り 上」 と 「 よ り 下」 の表<br />

現は符号なし整数の比較に使用 さ れてい る。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:427


CMOVcc—Conditional Move ( 続き )<br />

ス テ ー タ ス ・ フ ラ グの特定の状態は と き と して 2 種類に解釈される こ と があるので、 一<br />

部のオペコ ー ド に対しては 2 つのニーモニ ッ クが定義されている。 例えば、 CMOVA ( よ<br />

り上条件付き転送) 命令 と CMOVNBE ( よ り 下でな く 等し く ない条件付き転送 ) 命令 と<br />

は、 同一のオペコ ー ド 0F 47H に対する 2 つのニーモニッ クである。<br />

CMOVcc 命令は Pentium Pro プ ロ セ ッ サ ・ フ ァ ミ リ に新たに導入 さ れたが、 こ れ ら の命令<br />

はこのファミ リのすべてのプロセッサでサポート されているわけではない。 CMOVcc 命<br />

令がサポ ー ト されているかど う かは、 CPUID 命令でプ ロ セ ッ サの機能情報を調べ る こ と<br />

により判定できる (3:440 ページの 「CPUID—CPU Identification」 を参照 )。<br />

操作<br />

temp ← DEST<br />

IF condition TRUE<br />

THEN<br />

DEST ← SRC<br />

ELSE<br />

DEST ← temp<br />

FI;<br />

影響を受けるフラグ<br />

なし。<br />

メ モ リ 形式で状態が偽であ る場合、 プ ロ セ ッ サ ・ モデルに よ っ ては、 ロ ー ド が開始 さ れ<br />

( ロード されたデータが廃棄され)、 メモリ ・ フォル トが発生する可能性がある。 他のプ<br />

ロ セ ッ サ ・ モデルでは、 状態が偽である場合は、 ロ ー ド は開始 さ れず、 フ ォ ル ト は発生<br />

しない。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

3:428 第 3 巻 : IA-32 基本命令リファレンス


CMOVcc—Conditional Move ( 続き )<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:429


CMP—Compare Two Operands<br />

オペコード 命令 説明<br />

3C ib CMP AL, imm8 imm8 を AL と比較する。<br />

3D iw CMP AX, imm16 imm16 を AX と比較する。<br />

3D id CMP EAX, imm32 imm32 を EAX と比較する。<br />

80 /7 ib CMP r/m8, imm8 imm8 を r/m8 と比較する。<br />

81 /7 iw CMP r/m16, imm16 imm16 を r/m16 と比較する。<br />

81 /7 id CMP r/m32,imm32 imm32 を r/m32 と比較する。<br />

83 /7 ib CMP r/m16,imm8 imm8 を r/m16 と比較する。<br />

83 /7 ib CMP r/m32,imm8 imm8 を r/m32 と比較する。<br />

38 /r CMP r/m8,r8 r8 を r/m8 と比較する。<br />

39 /r CMP r/m16,r16 r16 を r/m16 と比較する。<br />

39 /r CMP r/m32,r32 r32 を r/m32 と比較する。<br />

3A /r CMP r8,r/m8 r/m8 を r8 と比較する。<br />

3B /r CMP r16,r/m16 r/m16 を r16 と比較する。<br />

3B /r CMP r32,r/m32 r/m32 を r32 と比較する。<br />

説明<br />

第 1 ソース・オペランドを第2 ソース・オペランド と比較し、 結果に従ってEFLAGS レ<br />

ジスタ内のステータス・フラグをセットする。比較は、第1 オペラン ド から第 2 オペラ<br />

ンドを引き、 次にSUB 命令の場合 と 同様にス テ ー タ ス ・ フ ラ グをセ ッ ト して行われる。<br />

オペラン ド と して即値を使用した場合は、 そのオペラン ド は第 1 オペラン ド の長さに符<br />

号拡張 さ れる。<br />

CMP 命令は、 一般的に条件付き ジ ャ ン プ (Jcc)、 条件付き転送(CMOVcc)、 または SETcc<br />

命令 と 併用 さ れる。 Jcc、 CMOVcc、 SETcc 命令が使用す る条件 コ ー ド は CMP 命令の結<br />

果に基づ く 。<br />

操作<br />

temp ← SRC1 − SignExtend(SRC2);<br />

ModifyStatusFlags; (* Modify status flags in the same manner as the SUB instruction*)<br />

影響を受けるフラグ<br />

CF、 OF、 SF、 ZF、 AF、 PF フ ラ グが結果に従 っ てセ ッ ト さ れる。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

3:430 第 3 巻 : IA-32 基本命令リファレンス


CMP—Compare Two Operands ( 続き )<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:431


CMPS/CMPSB/CMPSW/CMPSD—Compare String Operands<br />

オペコード 命令 説明<br />

A6 CMPS DS:(E)SI, ES:(E)DI アドレス DS:(E)SI のバイトをアドレス ES:(E)DI のバイトと比<br />

較し、結果に従ってステータス・フラグをセットする。<br />

A7 CMPS DS:SI, ES:DI アドレス DS:SI のワードをアドレス ES:DI のバイトと比較し、<br />

結果に従ってステータス・フラグをセットする。<br />

A7 CMPS DS:ESI, ES:EDI アドレス DS:ESI のダブルバイトをアドレス ES:EDI のバイトと<br />

比較し、結果に従ってステータス・フラグをセットする。<br />

A6 CMPSB アドレス DS:(E)SI のバイトをアドレス ES:(E)DI のバイトと比<br />

較し、結果に従ってステータス・フラグをセットする。<br />

A7 CMPSW アドレス DS:SI のバイトをアドレス ES:DI のバイトと比較し、<br />

結果に従ってステータス・フラグをセットする。<br />

A7 CMPSD アドレス DS:ESI のバイトをアドレス ES:EDI のバイトと比較<br />

し、結果に従ってステータス・フラグをセットする。<br />

説明<br />

第 1 ソース・オペランドで指定されるバイト、 ワード、 またはダブルワードを第2 ソー<br />

ス ・ オペラン ド で指定されるバイ ト 、 ワ ー ド 、 またはダブルワ ー ド と比較し、 結果に<br />

従って EFLAGS レジスタ内のステータス ・ フラグをセッ トする。 第1 ソース ・ オペラン<br />

ドは、 アドレスDS:ESI のメモリ ・ ロケーションを指定する。 第2 ソース ・オペランド<br />

は、 ア ド レス ES:EDI の メ モ リ ・ ロ ケ ー シ ョ ン を指定す る。 オペラ ン ド ・ サイ ズ属性が<br />

16 の場合は、 SI レジスタがソース ・ インデックス ・ レジスタとして使用され、 DI レジ<br />

スタがデスティネーション・インデックス・レジスタとして使用される。 DS セグメン ト<br />

はセグメン ト ・ オーバライ ド ・ プ リ フ ィ ッ クスでオーバライ ド もできるが、 ES セグメン<br />

トはオーバライドできない。<br />

CMPSB、 CMPSW、 CMPSD ニーモニッ クは、 それぞれ CMPS 命令のバイ ト 、 ワ ー ド 、<br />

ダブルワ ー ド ・ バー ジ ョ ンの別名である。 これら のニーモニ ッ ク は使い方が簡単である<br />

が、 タ イプ ・ チ ェ ッ ク やセグメ ン ト ・ チ ェ ッ ク は実行で きない。 CMPS 命令では、<br />

"DS:ESI" と "ES:EDI" を命令の中で明示的に指定しなければな ら ない。<br />

比較の後、 EFLAGS レジスタ内のDF フラグの設定に従って、 ESI と EDI レジスタが自<br />

動的に イ ン ク リ メ ン ト ま たはデ ク リ メ ン ト さ れる。 (DF フラグが0 の場合は ESI と EDI<br />

レジスタはインクリメント され、 DF フラグが1 の場合はデ ク リ メ ン ト される。 ) これら<br />

のレジスタは、 バイ ト操作の場合は 1、 ワー ド操作の場合は 2、 ダブルワー ド操作の場合<br />

は 4 それぞれイン ク リ メン ト またはデク リ メン ト される。<br />

CMPS、 CMPSB、 CMPSW、 CMPSD 命令は、 前に REP プリフィックスを付けると、 ECX<br />

バイ ト、 ワー ド、 またはダブルワー ドのブロ ッ ク比較を行える。 ただし、 これらの命令<br />

は、 次の比較が行われる前にステ ー タ スの設定に基づいてなん らかの処置を行 う LOOP<br />

構成体で使用される方が多い。<br />

3:432 第 3 巻 : IA-32 基本命令リファレンス


CMPS/CMPSB/CMPSW/CMPSD—Compare String Operands ( 続き )<br />

操作<br />

temp ←SRC1 − SRC2;<br />

SetStatusFlags(temp);<br />

IF (byte comparison)<br />

THEN IF DF = 0<br />

THEN (E)DI ← 1; (E)SI ← 1;<br />

ELSE (E)DI ← -1; (E)SI ← -1;<br />

FI;<br />

ELSE IF (word comparison)<br />

THEN IF DF = 0<br />

THEN DI ← 2; (E)SI ← 2;<br />

ELSE DI ← -2; (E)SI ← -2;<br />

FI;<br />

ELSE (* doubleword comparison *)<br />

THEN IF DF = 0<br />

THEN EDI ← 4; (E)SI ← 4;<br />

ELSE EDI ← -4; (E)SI ← -4;<br />

FI;<br />

FI;<br />

FI;<br />

影響を受けるフラグ<br />

CF、 OF、 SF、 ZF、 AF、 PF フ ラ グが比較の一時的結果に従 っ てセ ッ ト さ れる。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:433


CMPS/CMPSB/CMPSW/CMPSD—Compare String Operands ( 続き )<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:434 第 3 巻 : IA-32 基本命令リファレンス


CMPXCHG—Compare and Exchange<br />

オペコード 命令 説明<br />

0F B0/r CMPXCHG r/m8,r8 AL を r/m8 と比較し、等しい場合は ZF をセットし、r8 を r/m8 に<br />

ロードする。等しくない場合は ZF をクリアし、r/m8 を AL にロー<br />

ドする。<br />

0F B1/r CMPXCHG r/m16,r16 AX を r/m16 と比較し、等しい場合は ZF をセットし、r16 を r/m16<br />

にロードする。等しくない場合は ZF をクリアし、r/m16 を AL に<br />

ロードする。<br />

0F B1/r CMPXCHG r/m32,r32 EAX を r/m32 と比較し、等しい場合は ZF をセットし、r32 を<br />

r/m32 にロードする。等しくない場合は ZF をクリアし、r/m32 を<br />

AL にロードする。<br />

説明<br />

( オペラン ド のサイズに従って ) AL、 AX、 または EAX レジスタの値を第1オペラン ド<br />

( デステ ィ ネーシ ョ ン ・ オペラン ド ) と比較する。 2 つの値が等しい場合は、 第 2 オペラ<br />

ンド ( ソース ・オペランド ) がデスティネーション・オペランドにロードされる。 等し<br />

くない場合は、 デスティネーション・オペランドがAL、 AX、 または EAX レジスタに<br />

ロード される。<br />

この命令は、 前に LOCK プ リ フ ィ ッ ク ス を付け る こ と に よ り 、 自動的に実行 さ せる こ と<br />

ができ る。 プロセッサのバス と のインタ フ ェ ースを単純にするため、 デステ ィ ネーシ ョ<br />

ン ・ オペラ ン ド は比較の結果にかかわ り な く 書き込みサイ ク ルを受け る。 比較が失敗し<br />

た場合はデステ ィ ネーシ ョ ン ・ オペラン ド がデステ ィ ネーシ ョ ンに書き戻され、 比較が<br />

成功した場合は ソ ー ス ・ オペラ ン ド がデス テ ィ ネ ー シ ョ ン に書き込まれる。 ( プロセッサ<br />

は、 同時にロッ ク書き込みも伴わずにロッ ク読み取りを生じるこ とは決してない。 )<br />

操作<br />

(* accumulator = AL, AX, or EAX, depending on whether *)<br />

(* a byte, word, or doubleword comparison is being performed*)<br />

IF Itanium System Environment AND External_Atomic_Lock_Required AND DCR.lc<br />

THEN IA-32_Intercept(LOCK,CMPXCHG);<br />

IF accumulator = DEST<br />

THEN<br />

ZF ← 1<br />

DEST ← SRC<br />

ELSE<br />

ZF ← 0<br />

accumulator ← DEST<br />

FI;<br />

影響を受けるフラグ<br />

デステ ィ ネーシ ョ ン ・ オペラン ド と AL、 AX、 または EAX レジスタの値が等しい場合は<br />

ZF フラグがセッ ト され、 等し く ない場合はク リ アされる。 CF、 PF、 AF、 SF、 OF フラ<br />

グは比較演算の結果に従 っ てセ ッ ト さ れる。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:435


CMPXCHG—Compare and Exchange ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

IA-32_Intercept ロック・インターセプト - DCR.lc が 1 であ り 、 こ の操作を<br />

完了するために外部ア ト ミ ッ ク ・ バス ・ ロ ッ ク が必要であ<br />

る場合は、 ア ト ミ ッ ク ・ ト ランザクシ ョ ンは発生せず、 こ<br />

の命令は失敗し、 IA-32_Intercept(Lock) フォルトが発生す<br />

る。 ソフ ト ウェア ・ ロ ッ ク ・ ハン ド ラが、 この命令をエ<br />

ミュレートする役割を受け持つ。<br />

保護モード例外<br />

#GP(0) デステ ィ ネー シ ョ ンが書き込み不可能なセグメ ン ト にある<br />

場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

3:436 第 3 巻 : IA-32 基本命令リファレンス


CMPXCHG—Compare and Exchange ( 続き )<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

インテル・アーキテクチャにおける互換性<br />

この命令は、 Intel486 プロセッサよ り以前のインテル ・ プロセッサではサポー ト されてい<br />

ない。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:437


CMPXCHG8B—Compare and Exchange 8 Bytes<br />

オペコード 命令 説明<br />

0F C7 /1 m64 CMPXCHG8B m64 EDX:EAX を m64 と比較し、等しい場合は ZF をセットし、<br />

ECX:EBX を m64 にロードする。等しくない場合は ZF をクリアし、<br />

m64 を EDX:EAX にロードする。<br />

説明<br />

EDX:EAX の 64 ビット値をオペランド ( デステ ィ ネーシ ョ ン ・ オペラン ド ) と比較する。<br />

値が等しい場合は、 ECX:EBX の 64 ビット値がデスティネーション・オペランドにスト<br />

アされる。 等しくない場合は、 デスティネーション ・ オペランドの値がEDX:EAX に<br />

ロードされる。 デスティネーション・オペランドは8 バイ ト のメモリ ・ ロケーシ ョンで<br />

ある。 EDX:EAX および ECX:EBX のレジスタ ・ ペアでは、 EDX と ECX の内容が 64<br />

ビッ ト値の上位32 ビッ トであり、 EAX と EBX の内容が下位 32 ビッ トである。<br />

この命令は、 前に LOCK プリフィックスを付けると、 自動的に実行できる。 プロセッサ<br />

のバスとのインタフェースを単純にするため、 デスティネーション ・ オペランドは比較<br />

の結果にかかわ り な く 書き込みサ イ ク ルを受け る。 比較が失敗した場合はデス テ ィ ネ ー<br />

ション・オペランドがデスティネーションに書き戻され、 比較が成功した場合はソー<br />

ス ・ オペラン ドがデステ ィ ネーシ ョ ンに書き込まれる。 ( プロセッサは、 同時にロック書 き込みも伴わずにロッ ク読み取りを生じるこ とは決してない。 )<br />

操作<br />

IF Itanium System Environment AND External_Atomic_Lock_Required AND DCR.lc<br />

THEN IA-32_Intercept(LOCK,CMPXCHG);<br />

IF (EDX:EAX = DEST)<br />

ZF ← 1<br />

DEST ← ECX:EBX<br />

ELSE<br />

ZF ← 0<br />

EDX:EAX ← DEST<br />

影響を受けるフラグ<br />

デステ ィ ネーシ ョ ン ・ オペラン ド と EDX:EAX が等しい場合は ZF フラグがセット され、<br />

等し く ない場合は ク リ アされる。 CF、 PF、 AF、 SF、 および OF フラグは影響を受けな<br />

い。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

3:438 第 3 巻 : IA-32 基本命令リファレンス


CMPXCHG8B—Compare and Exchange 8 Bytes ( 続き )<br />

IA-32_Intercept ロック・インターセプト - DCR.lc が 1 であ り 、 こ の操作を<br />

完了するために外部ア ト ミ ッ ク ・ バス ・ ロ ッ ク が必要であ<br />

る場合は、 ア ト ミ ッ ク ・ ト ランザクシ ョ ンは発生せず、 こ<br />

の命令は失敗し、 IA-32_Intercept(Lock) フォルトが発生す<br />

る。 ソフ ト ウェア ・ ロ ッ ク ・ ハン ド ラが、 この命令をエ<br />

ミュレートする役割を受け持つ。<br />

保護モード例外<br />

#UD デステ ィ ネーシ ョ ン ・ オペラン ド がメモリ ・ ロケーシ ョ ン<br />

でない場合。<br />

#GP(0) デステ ィ ネー シ ョ ンが書き込み不可能なセグメ ン ト にある<br />

場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

インテル・アーキテクチャにおける互換性<br />

この命令は、 Pentium プロセッサよ り以前のインテル ・ プロセッサではサポー ト されてい<br />

ない。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:439


CPUID—CPU Identification<br />

オペコード 命令 説明<br />

0F A2 CPUID EAX ← プロセッサ識別情報<br />

説明<br />

プ ロ セ ッ サの識別情報を EAX、 EBX、 ECX、 EDX レジスタにロードする。 この情報は、<br />

インテルをベンダー と して識別し、 プロセッサのフ ァ ミ リ 、 モデル、 およびステ ッ ピン<br />

グ、 機能情報、 お よ びキ ャ ッ シ ュ 情報を提供す る。 EAX レジスタにロード された入力値<br />

によって、 表 1-4 に示す よ う に、 ど の よ う な情報が返されたかがわか る。<br />

表 1-4. CPUID 命令から返される情報<br />

EAX の初期値 提供されるプロセッサに関する情報<br />

0 EAX<br />

EBX<br />

ECX<br />

EDX<br />

1 EAX<br />

EBX<br />

ECX<br />

EDX<br />

2 EAX<br />

EBX<br />

ECX<br />

EDX<br />

CPUID の最大入力値<br />

756E6547H “Genu” (BL 内の G)<br />

6C65746EH “nteI” (CL 内の n)<br />

49656E69H “inel” (DL 内の i)<br />

CPUID 命令は、 ど の特権レベルで も 実行で き て命令の実行を シ リ アル化で き る。 命令の<br />

実行を シ リ アル化す る と 、 前の命令に対して、 フ ラ グ、 レ ジ ス タ、 ま たは メ モ リ の修正<br />

が行われた場合、 それ ら の修正がすべて完了してか ら 、 次の命令が フ ェ ッ チ さ れ、 実行<br />

されるよ うに保証される。<br />

EAX レ ジ ス タ の入力値が 0 のときは、 プロセッサは EAX レジスタに CPUID 命令が認識<br />

する最大値を返す。 Itanium プ ロセ ッ サでは、 認識される最大値は 3 である。 EBX、<br />

ECX、 EDX レジスタにはベンダー識別ス ト リ ングが返される。 インテル ・ プロセッサの<br />

場合、 ベンダ ー識別ス ト リ ン グは以下に示す よ う に "GenuineIntel" である。<br />

EBX ← 756e6547h (* "Genu", with G in the low nibble of BL *)<br />

EDX ← 49656e69h (* "ineI", with i in the low nibble of DL *)<br />

ECX ← 6c65746eh (* "ntel", with n in the low nibble of CL *)<br />

バージョン情報 ( ファミリ、モデル、およびステッピング ID)<br />

予約済み<br />

予約済み<br />

機能情報<br />

キャッシュ情報<br />

キャッシュ情報<br />

キャッシュ情報<br />

キャッシュ情報<br />

EAX レ ジ ス タ の入力値が 1 のときは、 プロセッサは EAX レジスタにバージョン情報を<br />

返し、 EDX レ ジ ス タ に機能情報を返す。<br />

図 1-3. EAX レジスタのバージョン情報<br />

EAX<br />

ファミリ ID<br />

モデル (1 から始まる )<br />

31 28 27 20 19 16 15 12 11 8 7 4 3 0<br />

拡張ファミリ ID<br />

拡張モデル<br />

ID<br />

ファミリ<br />

3:440 第 3 巻 : IA-32 基本命令リファレンス<br />

モデル<br />

ステッピング<br />

ID


CPUID—CPU Identification ( 続き )<br />

バー ジ ョ ン情報に は、 イ ン テル ・ ア ー キテ ク チ ャ 拡張フ ァ ミ リ 識別子、 拡張モデル識別<br />

子、 イ ン テル ・ アー キテ ク チ ャ ・ フ ァ ミ リ 識別子、 モデル識別子、 ス テ ッ ピ ン グ ID が含<br />

まれる。<br />

以前の イ ンテル ・ アー キテ ク チ ャ ・ プ ロ セ ッ サの識別に関する詳細は、 イ ン テル ・ アプ<br />

リケーション・ノート 485、 『インテル ® プロセッサの識別と CPUID 命令』 を参照の こ<br />

と。 インテルでは、 必要に応じて、 ステッピング ID に関する情報を公表する。<br />

機能フ ラ グが 1 にセッ ト されているのは、 対応する機能がサポー ト されている こ と を示<br />

す。 各機能フラグを正しく解釈するためには、 ソフトウェアはインテルをベンダーとし<br />

て識別する必要がある。<br />

注 : Itanium ベース ・ システム環境内では使用できない IA-32 シ ス テ ム環境機能に も 、<br />

Itanium ベース ・ システム環境内で IA-32 システム環境機能ビットがセッ ト される場<br />

合がある。<br />

表 1-5. EDX レジスタに返される機能フラグ<br />

ビット IA-32 システム環境機能<br />

0 FPU - オンチップ浮動小数<br />

点ユニット<br />

Itanium ベース・<br />

システム環境機能<br />

第 3 巻 : IA-32 基本命令リファレンス 3:441<br />

説明<br />

使用可能 プロセッサは FPU を搭載し、Intel387 命令セットを実行す<br />

る。<br />

1 VME - 仮想 8086 モード強化 使用可能 プロセッサは、以下の仮想 8086 モード強化項目をサポー<br />

トする。<br />

CR4.VME ビットにより仮想 8086 モード拡張がイネー<br />

ブルにされる。<br />

CR4.PVI ビットにより保護モード仮想割り込みがイ<br />

ネーブルにされる。<br />

3 PSE - ページ・サイズ拡張 使用不可<br />

インテル Itanium アーキ<br />

テクチャのページング<br />

は、広範囲にわたるペー<br />

ジ・サイズをサポートす<br />

る。<br />

4 TSC - タイム・スタンプ・<br />

カウンタ<br />

5 MSR - モデル固有レジスタ 使用不可<br />

PAL インタフェースを使<br />

用して、モデル固有の機<br />

能をプログラミングす<br />

る。<br />

6 PAE - 物理アドレス拡張 使用不可<br />

Itanium アーキテクチャ<br />

は、32 ビットを超える<br />

物理アドレス指定を常に<br />

サポートする。<br />

ソフトウェア・インダイレクション・ビットマップに<br />

よる TSS の拡張。<br />

EFLAGS.VIF ビット仮想割り込み可能フラグ。<br />

EFLAGS.VIP ビット仮想割り込み可能未処理フラグ。<br />

プロセッサは、ページ・サイズ拡張をイネーブルにするた<br />

めの CR4.DE ビット、ページ・ディレクトリ・エントリ<br />

(PDE)、ページ・ディレクトリ・エントリ、ページ・テー<br />

ブル・エントリ (PTE) の修正済みビットを含めて、4 M バ<br />

イト・ページをサポートする。<br />

使用可能 プロセッサは、CPL と連携して、タイム・スタンプ・カウ<br />

ンタ読み取り可能 / 不可能を制御する CR4.TSD ビットを<br />

含めて、RDTSC ( タイム・スタンプ・カウンタ読み取り )<br />

命令をサポートする。<br />

プロセッサは、RDMSR ( モデル固有レジスタ読み取り ) お<br />

よび WRMSR ( モデル固有レジスタ書き込み ) 命令をサ<br />

ポートする。<br />

プロセッサは、32 ビットを超える物理アドレス、拡張ペー<br />

ジ・テーブル・エントリ・フォーマット、ページ変換テー<br />

ブル内の特別レベル、2 M バイト・ページをサポートす<br />

る。CR4.PAE ビットによりこの機能がイネーブルにされ<br />

る。アドレス・ビット数はインプリメンテーション固有。


CPUID—CPU Identification ( 続き )<br />

表 1-5. EDX レジスタに返される機能フラグ ( 続き )<br />

ビット IA-32 システム環境機能<br />

7 MCE - マシン・チェック例<br />

外<br />

Itanium ベース・<br />

システム環境機能<br />

使用不可<br />

プロセッサは、PAL で定<br />

義された MCHK アーキ<br />

テクチャを使用する。<br />

3:442 第 3 巻 : IA-32 基本命令リファレンス<br />

説明<br />

プロセッサは、マシン・チェック例外をイネーブルにする<br />

CR4.MCE ビットをサポートする。ただし、この機能はモ<br />

デル固有インプリメンテーションのマシン・チェック・エ<br />

ラー・ロギング、レポート、またはプロセッサ・シャット<br />

ダウンの定義は行わない。マシン・チェック例外ハンドラ<br />

は、モデル固有の例外処理を実行するためにプロセッサ・<br />

バージョンの確認、または標準のマシン・チェック機能の<br />

有無の確認が必要な場合があるかもしれない。<br />

8 CX8 - CMPXCHG8B 命令 使用可能 プロセッサは CMPXCHG8B (8 バイト比較および交換 ) 命<br />

令をサポートする。<br />

9 APIC 使用不可<br />

Itanium 割り込み機構で<br />

置き換えられる。<br />

10 予約済み ゼロに返す。<br />

12 MTRR - メモリ・タイプ範<br />

囲レジスタ<br />

13 PGE - PTE グローバル・フ<br />

ラグ<br />

14 MCA - マシン・チェック・<br />

アーキテクチャ<br />

15 CMOV - 条件付き転送およ<br />

び比較命令<br />

16 PSE-36 - 36 ビット・ペー<br />

ジ・サイズ拡張<br />

使用不可<br />

プロセッサは、Itanium<br />

アーキテクチャによって<br />

定義された TLB から得<br />

られるメモリ属性を利用<br />

する。<br />

使用不可<br />

Itanium アーキテクチャ<br />

で定義された仮想リー<br />

ジョンで置き換えられ<br />

る。<br />

使用不可<br />

プロセッサは、PAL で定<br />

義された MCHK アーキ<br />

テクチャを使用する。<br />

プロセッサは、オンチップのアドバンスト・プログラム可<br />

能割り込みコントローラ (APIC) を内蔵し、イネーブルに<br />

し、使用可能にしてある。<br />

プロセッサは、マシン固有のメモリ・タイプ範囲レジスタ<br />

(MTRR) をサポートする。MTRR には、プロセッサがサ<br />

ポートするメモリ・タイプと可変 MTRR の数、およびプ<br />

ロセッサが固定 MTRR をサポートするかどうかをカバー<br />

する、プロセッサの MTRR 能力を示すビット・フィール<br />

ドがある。<br />

プロセッサは、PTDE および PTE 両方のグローバル・ビッ<br />

トをイネーブルにする CR4.PGE フラグをサポートする。<br />

これらのビットは、各種のタスクに共通であり、制御レジ<br />

スタ CR3 が書き込まれたときにフラッシュする必要がな<br />

い変換ルックアサイド・バッファ (TLB) のエントリの指示<br />

に使用される。<br />

プロセッサは、MCG_CAP ( マシン・チェック・グローバ<br />

ル能力 ) MSR をサポートする。MCG_CAP レジスタはプ<br />

ロセッサがエラー・レポート用 MSR バンクをいくつサ<br />

ポートするかを示す。<br />

使用可能 プロセッサは、CMOV CC 命令をサポートする。さらに、<br />

FPU 機能フラグ ( ビット 0) もセットされている場合は、<br />

FCMOV CC および FCOMI 命令をサポートする。<br />

使用不可。Itanium アー<br />

キテクチャは、32 ビッ<br />

トを超える物理アドレス<br />

指定を常にサポートす<br />

る。<br />

17 PAT - メモリ属性パレット ページングでは使用不<br />

可。インテル Itanium<br />

アーキテクチャで定義さ<br />

れた仮想リージョンで置<br />

き換えられる。<br />

18 PPN - 物理プロセッサ番号 使用不可<br />

インテル Itanium アーキ<br />

テクチャは、この機能を<br />

サポートしない。<br />

23 MMX - インテル MMX テク<br />

ノロジ<br />

プロセッサが、4GB を超える物理メモリをアドレス指定で<br />

きる 4M バイト・ページをサポートするかどうかを示す。<br />

この機能は、4M バイト・ページの物理アドレスの上位 4<br />

ビットが、ページ・ディレクトリ・エントリのビット 13<br />

~ 16 によってコード化されることを示す。<br />

プロセッサは、IA-32 物理属性テーブルをサポートする。<br />

プロセッサは、物理プロセッサ番号機能をサポートしてお<br />

り、この機能がイネーブルになっている。<br />

使用可能 プロセッサはインテル MMX テクノロジをサポートする。<br />

24 FXSR 使用可能 プロセッサはストリーミング SIMD 拡張命令の FXRSTOR<br />

命令と FXSAVE 命令をサポートする。


CPUID—CPU Identification ( 続き )<br />

表 1-5. EDX レジスタに返される機能フラグ ( 続き )<br />

ビット IA-32 システム環境機能<br />

25 XMM - ストリーミングSIMD<br />

拡張命令<br />

30 インテル Itanium アーキテ<br />

クチャに基づくプロセッサ<br />

Itanium ベース・<br />

システム環境機能<br />

EAX レ ジ ス タ の入力値が 2 のと きは、 プロセッサはプロセッサの内部キャッシュおよび TLB に関する情報を EAX、 EBX、 ECX、 EDX レジスタに返す。 これらのレジスタの<br />

コード化は、 以下のとおりである。<br />

• EAX レジスタ (AL レジスタ ) の最下位バイ ト は、 入力値を 2 として、 プロセッサの<br />

キャッシュと TLB の完全な記述を得るために CPUID 命令が実行されなければな ら<br />

ない回数を示す。<br />

• 各レ ジ ス タ の最上位ビ ッ ト ( ビッ ト 31) は、 レジスタに有効な情報がある (0 にクリ<br />

ア ) か、 予約されている (1 にセッ ト ) かを示す。<br />

プロセッサの内部キャッシュ と TLB の戻 り 値をデ コ ー ド する方法の詳細は、 プ ロ セ ッ サ<br />

の補足資料を参照の こ と 。<br />

CPUID は、命令のシリアル化操作とメモリ・フェンス操作を実行する。<br />

操作<br />

CASE (EAX) OF<br />

EAX = 0:<br />

EAX ← highest input value understood by CPUID; (* 2 for Itanium processor *)<br />

EBX ← Vendor identification string;<br />

EDX ← Vendor identification string;<br />

ECX ← Vendor identification string;<br />

BREAK;<br />

EAX = 1:<br />

EAX[3:0] ← Stepping ID;<br />

EAX[7:4] ← Model;<br />

EAX[11:8] ← Family;<br />

EAX[15:12] ← Reserved;<br />

EAX[19:16] ← Extended Model ID;<br />

EAX[27:20] ← Extended Family ID;<br />

EAX[31:28] ← Reserved;<br />

EBX ← Reserved;<br />

ECX ← Reserved;<br />

EDX ← Feature flags;<br />

BREAK;<br />

EAX = 2:<br />

EAX[7:0] ← N_Param_Descrip_Blocks = 1;<br />

EAX[31:8], EBX, ECX, EDX = cache and TLB parameters<br />

BREAK;<br />

DEFAULT: (* EAX > highest value recognized by CPUID *)<br />

EAX ← Reserved, Undefined;<br />

第 3 巻 : IA-32 基本命令リファレンス 3:443<br />

説明<br />

使用可能 プロセッサは、インテル アーキテクチャ・ストリーミング<br />

SIMD 拡張命令をサポートする。<br />

使用可能 プロセッサは、インテル Itanium アーキテクチャに基づい<br />

ており、インテル Itanium 命令セットを実行できる。<br />

インテル Itanium 命令セットに切り換える前に IA-32 アプ<br />

リケーション・レベルでも実行中のオペレーティング・シ<br />

ステムをチェックして、システムが Itanium アーキテク<br />

チャのコードにも対応しているか確認する必要がある。


CPUID—CPU Identification ( 続き )<br />

EBX ← Reserved, Undefined;<br />

ECX ← Reserved, Undefined;<br />

EDX ← Reserved, Undefined;<br />

BREAK;<br />

ESAC;<br />

memory_fence();<br />

instruction_serialize();<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

例外 ( すべての操作モード )<br />

なし。<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

インテル・アーキテクチャにおける互換性<br />

CPUID 命令は、 初期モデルの Intel486 プロセッサまたは Intel486 プロセッサよ り も以前<br />

のすべてのインテル ・ アーキテ クチャ ・ プロセ ッサでサポー ト されていない。 EFLAGS<br />

レジスタのID フ ラ グを使用して、 こ の命令がサポ ー ト されている か ど う かを判定で き<br />

る。 プロシージ ャがこのフラグをセッ ト またはク リアできれば、 プロセッサがそのプロ<br />

シージャを実行して CPUID をサポー ト できる。<br />

3:444 第 3 巻 : IA-32 基本命令リファレンス


CWD/CDQ—Convert Word to Doubleword/Convert Doubleword to Quadword<br />

オペコード 命令 説明<br />

99 CWD DX:AX ← AX の符号拡張<br />

99 CDQ EDX:EAX ← EAX の符号拡張<br />

説明<br />

( オペラン ド ・ サイズによ り ) AX または EAX レジスタ内のオペランドのサイズを符号<br />

拡張に よ っ て 2 倍に拡張し、 結果を それぞれ DX:AX または EDX:EAX レジスタにストア<br />

する。 CWD 命令は、 AX レ ジスタの値の符号 ( ビッ ト 15) を DX レジスタのすべての<br />

ビッ ト位置にコピーする。 CDQ 命令は、 EAX レジスタの値の符号( ビット 31) を EDX<br />

レ ジ ス タ のすべての ビ ッ ト 位置に コ ピ ー す る。<br />

CWD 命令を使用す る と 、 ワ ー ド 除算の前に ワ ー ド か ら ダブルワ ー ド の被除数を作る こ と<br />

ができ、 CDQ 命令を使用する と、 ダブルワ ー ド 除算の前にダブルワ ー ド か ら ク ワ ッ ド<br />

ワードの被除数を作れる。<br />

CWD および CDQ ニーモニッ クは同じオペコー ド を参照する。 CWD 命令は オペラ ン ド ・<br />

サイズ属性が 16 のとき、 またCDQ 命令は オペラ ン ド ・ サイ ズ属性が 32 のときに使用<br />

するこ とを目的としている。 一部のアセンブラには、 CWD が使用された と き はオペラン<br />

ド・サイズを16 ビッ トに、 またCDQ が使用された と き は 32 ビ ッ ト に強制で き る も の<br />

がある。 その他のアセンブ ラ は、 こ れ ら のニー モニ ッ ク を同義語 (CWD/CDQ) として取<br />

り 扱い、 ど ち ら のニ ー モニ ッ ク が使用 さ れて も 、 その と き のオペラ ン ド ・ サイ ズ属性の<br />

設定を使用して変換対象の値のサイズを判定でき る。<br />

操作<br />

IF OperandSize = 16 (* CWD instruction *)<br />

THEN DX ← SignExtend(AX);<br />

ELSE (* OperandSize = 32, CDQ instruction *)<br />

EDX ← SignExtend(EAX);<br />

FI;<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

影響を受けるフラグ<br />

なし。<br />

例外 ( すべての操作モード )<br />

なし。<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:445


CWDE—Convert Word to Doubleword<br />

「CBW/CWDE - Convert Byte to Word/Convert Word to Doubleword」 を参照のこ と。<br />

3:446 第 3 巻 : IA-32 基本命令リファレンス


DAA—Decimal Adjust AL after Addition<br />

オペコード 命令 説明<br />

27 DAA 加算後に AL を 10 進調整する。<br />

説明<br />

2 つのパ ッ ク BCD 値の和を調整して、 パ ッ ク BCD 結果を作成す る。 AL レジスタは、 こ<br />

の命令の暗黙のソース兼デスティネーション ・ オペランドである。 DAA 命令は、 2 桁の<br />

パック BCD 値を加算 (2 進加算 ) し、 バイ ト 結果を AL レジスタにストアする ADD 命令<br />

の次に実行した と き に限 り 有効である。 そ こ で、 DAA 命令が AL レジスタの内容を調整<br />

して、 正しい 2 桁のパ ッ ク BCD 結果に ま と め る。 10 進キ ャ リ ーが検出された場合は、<br />

キャリーに従ってCF および AF フラグがセット される。<br />

操作<br />

IF (((AL AND 0FH) > 9) or AF = 1)<br />

THEN<br />

AL ← AL + 6;<br />

CF ← CF OR CarryFromLastAddition; (* CF OR carry from AL ← AL + 6 *)<br />

AF ← 1;<br />

ELSE<br />

AF ← 0;<br />

FI;<br />

IF ((AL AND F0H) > 90H) or CF = 1)<br />

THEN<br />

AL ← AL + 60H;<br />

CF ← 1;<br />

ELSE<br />

CF ← 0;<br />

FI;<br />

例<br />

ADD AL, BL Before: AL=79H BL=35H EFLAGS(OSZAPC)=XXXXXX<br />

After: AL=AEH BL=35H EFLAGS(0SZAPC)=110000<br />

DAA Before: AL=79H BL=35H EFLAGS(OSZAPC)=110000<br />

After: AL=AEH BL=35H EFLAGS(0SZAPC)=X00111<br />

影響を受けるフラグ<br />

値の調整に よ っ て結果の ど ち ら かの桁に 10 進キ ャ リ ーが生じた場合は、 CF および AF<br />

フラグがセッ ト される ( 上記の 「操作」 を参照 )。 SF、 ZF、 PF フラグが結果に従って<br />

セッ ト される。 OF フ ラ グは未定義。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

例外 ( すべての操作モード )<br />

なし。<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:447


DAS—Decimal Adjust AL after Subtraction<br />

オペコード 命令 説明<br />

2F DAS 減算後に AL を 10 進調整する。<br />

説明<br />

2 つのパ ッ ク BCD 値間の減算結果を調整して、 パ ッ ク BCD 結果を作成する。 AL レジス<br />

タは、 こ の命令の暗黙のソ ース兼デステ ィ ネ ー シ ョ ン ・ オペラン ド である。 DAS 命令<br />

は、 一方の 2 桁のパ ッ ク BCD 値から も う一方の 2 桁のパ ッ ク BDC 値を引き (2 進減算 )、<br />

バイ ト の結果を AL レジスタにストアする SUB 命令の次に実行した と き に限 り 有効であ<br />

る。 そこで、 DAS 命令が AL レジスタの内容を調整して、 正しい 2 桁のパ ッ ク BCD 結<br />

果に ま と める。 10 進ボローが検出された場合は、 ボローに従って CF および AF フラグ<br />

がセッ ト される。<br />

操作<br />

IF (AL AND 0FH) > 9 OR AF = 1<br />

THEN<br />

AL ← AL − 6;<br />

CF ← CF OR BorrowFromLastSubtraction; (* CF OR borrow from AL ← AL − 6 *)<br />

AF ← 1;<br />

ELSE AF ← 0;<br />

FI;<br />

IF ((AL > 9FH) or CF = 1)<br />

THEN<br />

AL ← AL − 60H;<br />

CF ← 1;<br />

ELSE CF ← 0;<br />

FI;<br />

例<br />

SUB AL, BL Before: AL=35H BL=47H EFLAGS(OSZAPC)=XXXXXX<br />

After: AL=EEH BL=47H EFLAGS(0SZAPC)=010111<br />

DAA Before: AL=EEH BL=47H EFLAGS(OSZAPC)=010111<br />

After: AL=88H BL=47H EFLAGS(0SZAPC)=X10111<br />

影響を受けるフラグ<br />

値の調整に よ っ て結果の ど ち ら かの桁に 10 進ボロ ーが生じた場合は、 CF および AF フ<br />

ラグがセッ ト される ( 上記の 「操作」 の項を参照 )。 SF、 ZF、 PF フラグが結果に従って<br />

セッ ト される。 OF フ ラ グは未定義。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

例外 ( すべての操作モード )<br />

なし。<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

3:448 第 3 巻 : IA-32 基本命令リファレンス


DEC—Decrement by 1<br />

オペコード 命令 説明<br />

FE /1 DEC r/m8 r/m8 を 1 デクリメントする。<br />

FF /1 DEC r/m16 r/m16 を 1 デクリメントする。<br />

FF /1 DEC r/m32 r/m32 を 1 デクリメントする。<br />

48+rw DEC r16 r16 を 1 デクリメントする。<br />

48+rd DEC r32 r32 を 1 デクリメントする。<br />

説明<br />

CF フラグの状態を変えないで、 オペランドから 1 を引 く ( デク リ メントする )。 ソー<br />

ス ・ オペラ ン ド に は、 レ ジ ス タ ま たは メ モ リ ・ ロ ケ ー シ ョ ン を使用で き る。 こ の命令で<br />

は、 CF フ ラ グの状態を変えずにルー プ ・ カ ウ ン タ を更新で き る。 (CF フラグを更新する<br />

デ ク リ メン ト 操作を実行するには、 値が 1 の即値オペラン ド を使用して SUB 命令を実行<br />

する。 )<br />

操作<br />

DEST ← DEST - 1;<br />

影響を受けるフラグ<br />

CF フラグは影響を受けない。 OF、 SF、 ZF、 AF、 PF フラグが結果に従ってセット され<br />

る。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) デステ ィ ネー シ ョ ン ・ オペラ ン ド が書き込み不可能なセグ<br />

メント にある場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:449


DEC—Decrement by 1 ( 続き )<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:450 第 3 巻 : IA-32 基本命令リファレンス


DIV—Unsigned Divide<br />

オペコード 命令 説明<br />

F6 /6 DIV r/m8 AX を r/m8 で符号なし除算する。<br />

AL ← 商、AH ← 剰余<br />

F7 /6 DIV r/m16 DX:AX を r/m16 で符号なし除算する。<br />

AX ← 商、DX ← 剰余<br />

F7 /6 DIV r/m32 EDX:EAX を r/m32 ダブルワードで符号なし除算する。EAX ← 商、<br />

EDX ← 剰余<br />

説明<br />

AL レジスタ、 AX レジスタ、 または EAX レジスタ内の値( 被除数 ) をソース ・ オペラン<br />

ド ( 除数 ) で ( 符号なしで ) 割り、 結果をそれぞれAX、 DX:AX、 または EDX:EAX レジ<br />

スタにストアする。 ソース ・ オペランドには、 汎用レジスタまたはメモリ ・ ロケーショ<br />

ンを使用で き る。 こ の命令の処理は、 以下の表に示す よ う に、 オペラ ン ド ・ サイ ズに依<br />

存する。<br />

オペランド・サイズ 被除数 除数 商 剰余 商の最大値<br />

ワード / バイト AX r/m8 AL AH 255<br />

ダブルワード / ワード DX:AX r/m16 AX DX 65,535<br />

クワッドワード / ダブルワード EDX:EAX r/m32 EAX EDX 232 − 1<br />

非整数の結果は 0 に向か っ て切 り 捨て ら れる。 剰余の絶対値は常に除数のそれ よ り 小 さ<br />

い。 オ ーバフ ロ ー は、 CF フラグではなく、 #DE ( 除算エラ ー ) 例外で示される。<br />

操作<br />

IF SRC = 0<br />

THEN #DE; (* divide error *)<br />

FI;<br />

IF OpernadSize = 8 (* word/byte operation *)<br />

THEN<br />

temp ← AX / SRC;<br />

IF temp > FFH<br />

THEN #DE; (* divide error *) ;<br />

ELSE<br />

AL ← temp;<br />

AH ← AX MOD SRC;<br />

FI;<br />

ELSE<br />

IF OpernadSize = 16 (* doubleword/word operation *)<br />

THEN<br />

temp ← DX:AX / SRC;<br />

IF temp > FFFFH<br />

THEN #DE; (* divide error *) ;<br />

ELSE<br />

AX ← temp;<br />

DX ← DX:AX MOD SRC;<br />

FI;<br />

ELSE (* quadword/doubleword operation *)<br />

temp ← EDX:EAX / SRC;<br />

第 3 巻 : IA-32 基本命令リファレンス 3:451


DIV—Unsigned Divide ( 続き )<br />

FI;<br />

FI;<br />

IF temp > FFFFFFFFH<br />

THEN #DE; (* divide error *) ;<br />

ELSE<br />

EAX ← temp;<br />

EDX ← EDX:EAX MOD SRC;<br />

FI;<br />

影響を受けるフラグ<br />

CF、 OF、 SF、 ZF、 AF、 PF フ ラ グは未定義。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#DE ソース・オペランド ( 除数 ) が 0 の場合。<br />

商が大きすぎて、 指定されたレ ジス タにス ト アできない場<br />

合。<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#DE ソース・オペランド ( 除数 ) が 0 の場合。<br />

商が大きすぎて、 指定されたレ ジス タにス ト アできない場<br />

合。<br />

3:452 第 3 巻 : IA-32 基本命令リファレンス


DIV—Unsigned Divide ( 続き )<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

仮想 8086 モード例外<br />

#DE ソース・オペランド ( 除数 ) が 0 の場合。<br />

商が大きすぎて、 指定されたレ ジス タにス ト アできない場<br />

合。<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:453


ENTER—Make Stack Frame for Procedure Parameters<br />

オペコード 命令 説明<br />

C8 iw 00 ENTER imm16,0 プロシージャのスタック・フレームを作成する。<br />

C8 iw 01 ENTER imm16,1 プロシージャのネストされたスタック・フレームを作成する。<br />

C8 iw ib ENTER imm16,imm8 プロシージャのネストされたスタック・フレームを作成する。<br />

説明<br />

プロシージャのためのスタック ・ フレームを作成する。 第1 オペラン ド ( サイズ ・ オペ<br />

ランド ) は、 スタ ッ ク ・ フ レームのサイズ ( すなわち、 プロシージ ャのスタ ッ クに割り<br />

当てられる動的記憶域のバイ ト 数 ) を指定する。 第 2 オペラン ド ( ネスティング ・ レベ<br />

ル・オペランド ) は、 プロシージ ャのレキシカル ・ ネステ ィ ング ・ レベル (0 から 31 ま<br />

で ) を指定する。 ネスティ ング ・ レベルによ って、 以前のスタック ・ フレームから新し<br />

いスタック・フレームの 「表示エリア」 にコピーされるスタック・フレーム・ポインタ<br />

の数が決ま る。 これら のオペラ ン ド は と も に即値である。<br />

スタック ・サイズ属性によって、 BP (16 ビット )、 EBP (32 ビッ ト ) のどちらのレジスタ<br />

で現在のフ レ ーム ・ ポ イ ンタ を指定するか、 SP (16 ビッ ト )、 ESP (32 ビッ ト ) のどちら<br />

のレジスタでスタッ ク ・ ポインタを指定するかが決まる。<br />

対をなす ENTER 命令 と LEAVE 命令は、 ブ ロ ッ ク 構造言語をサポ ー ト す る ために設け ら<br />

れた も のである。 これらの命令は、 他のプロ シ ー ジ ャ へのジ ャ ンプやコ ールを実行でき<br />

ない。 これらの命令は、 すでにコールされたプロシージャの新しいスタック ・ フレーム<br />

をセッ ト アップするだけである。 ENTER 命令の後に、 通常は CALL、 JMP、 または Jcc<br />

命令が続き、 プ ロ グ ラ ムの制御を コ ー ル先のプ ロ シ ー ジ ャ に渡す。<br />

ネスティ ング ・ レベルが 0 の場合は、 プロセ ッ サはフ レ ー ム ・ ポ イ ン タ を EBP レジスタ<br />

からスタックにプッシュし、 現在のスタック ・ ポインタを ESP レジスタから EBP レジス<br />

タにコピーし、 ESP レジスタに現在のスタック ・ ポインタ値からサイズ ・ オペランドの<br />

値を引いた値をロー ド する。 ネステ ィ ング ・ レベルが 1 以上の場合は、 プ ロセ ッ サはス<br />

タック ・ ポインタを調整する前に追加フレーム ・ ポインタをスタックにプッシュする。<br />

それ ら の追加フ レ ー ム ・ ポ イ ン タ に よ っ て、 コ ー ル先プ ロ シ ー ジ ャ にス タ ッ ク 上の他の<br />

ネス ト されたフレームへのアクセス ・ ポイン トが与えられる。<br />

操作<br />

NestingLevel ← NestingLevel MOD 32<br />

IF StackSize = 32<br />

THEN<br />

Push(EBP) ;<br />

FrameTemp ← ESP;<br />

ELSE (* StackSize = 16*)<br />

Push(BP);<br />

FrameTemp ← SP;<br />

FI;<br />

IF NestingLevel = 0<br />

THEN GOTO CONTINUE;<br />

FI;<br />

IF (NestingLevel > 0)<br />

FOR i ← 1 TO (NestingLevel − 1)<br />

DO<br />

IF OperandSize = 32<br />

THEN<br />

IF StackSize = 32<br />

EBP ← EBP − 4;<br />

Push([EBP]); (* doubleword push *)<br />

3:454 第 3 巻 : IA-32 基本命令リファレンス


ENTER—Make Stack Frame for Procedure Parameters ( 続き )<br />

ELSE (* StackSize = 16*)<br />

BP ← BP − 4;<br />

Push([BP]); (* doubleword push *)<br />

FI;<br />

ELSE (* OperandSize = 16 *)<br />

IF StackSize = 32<br />

THEN<br />

EBP ← EBP − 2;<br />

Push([EBP]); (* word push *)<br />

ELSE (* StackSize = 16*)<br />

BP ← BP − 2;<br />

Push([BP]); (* word push *)<br />

FI;<br />

FI;<br />

OD;<br />

IF OperandSize = 32<br />

THEN<br />

Push(FrameTemp); (* doubleword push *)<br />

ELSE (* OperandSize = 16 *)<br />

Push(FrameTemp); (* word push *)<br />

FI;<br />

GOTO CONTINUE;<br />

FI;<br />

CONTINUE:<br />

IF StackSize = 32<br />

THEN<br />

EBP ← FrameTemp<br />

ESP ← EBP − Size;<br />

ELSE (* StackSize = 16*)<br />

BP ← FrameTemp<br />

SP ← BP − Size;<br />

FI;<br />

END;<br />

影響を受けるフラグ<br />

なし。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:455


ENTER—Make Stack Frame for Procedure Parameters ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

保護モード例外<br />

#SS(0) SP または ESP レジスタの新しい値がスタック ・セグメン<br />

ト の範囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

実アドレス・モード例外<br />

なし。<br />

仮想 8086 モード例外<br />

なし。<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

3:456 第 3 巻 : IA-32 基本命令リファレンス


F2XM1—Compute 2 x -1<br />

オペコード 命令 説明<br />

D9 F0 F2XM1 ST(0) を (2 ST(0) - 1) で置き換える。<br />

説明<br />

2 の ソ ー ス ・ オペラ ン ド 乗 と い う 指数値か ら 1 を引いた値を計算する。 ソース ・ オペラ<br />

ンドはST(0) レジスタにあり、 結果も ST(0) にス ト アされる。 ソース ・ オペランドの値 は -1.0 から +1.0 までの範囲でなければならない。 ソ ース値がこの範囲外の場合は、 結果<br />

は未定義になる。<br />

以下の表に、 オーバフローもアンダフローも発生しないものとして、 さまざまなクラス<br />

の数の指数値を計算した と き に得られる結果を示す。<br />

ST(0) SRC ST(0) DEST<br />

-1.0 to −0 −0.5 ~ −0<br />

−0 −0<br />

+0 +0<br />

+0 to +1.0 +0 ~ 1.0<br />

2 以外の値の累乗は、 以下の式を使用して計算する。<br />

x y = 2 (y ∗ log 2 x)<br />

操作<br />

ST(0) ← (2 ST(0) − 1);<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト され<br />

る。<br />

不正確結果例外 (#P) が発生した場合は、 丸めの方向を示<br />

す。 0 = 切り上げなし、 1 = 切り上げ。<br />

C0、 C2、 C3 未定義。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

#IA ソース・オペランドがSNaN 値であるか、 ま たはその<br />

フォーマットがサポートされていない場合。<br />

#D 結果がデ ノ ーマル値である場合。<br />

#U 結果が小さすぎて、 デスティネーション・フォーマットで 表現で き ない場合。<br />

#P 値がデステ ィ ネ ーシ ョ ン ・ フ ォ ーマ ッ ト では正確に表現で<br />

きない場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:457


F2XM1—Compute 2 x -1 ( 続き )<br />

保護モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

実アドレス・モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

3:458 第 3 巻 : IA-32 基本命令リファレンス


FABS—Absolute Value<br />

オペコード 命令 説明<br />

D9 E1 FABS ST をその絶対値で置き換える。<br />

説明<br />

ST(0) の符号ビ ッ ト を ク リ アして、 オペラ ン ド の絶対値を作成する。 以下の表に、 さ ま ざ<br />

まなク ラスの数の絶対値を作成したと きに得られる結果を示す。<br />

注 :<br />

F 有限実数を示す。<br />

操作<br />

ST(0) SRC ST(0) DEST<br />

−∞ +∞<br />

−F +F<br />

−0 +0<br />

+0 +0<br />

+F +F<br />

+∞ +∞<br />

NaN NaN<br />

ST(0) ← |ST(0)|<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト さ<br />

れ、 発生しなか っ た場合は 0 にクリアされる。<br />

C0、 C2、 C3 未定義。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

保護モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

実アドレス・モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:459


FADD/FADDP/FIADD—Add<br />

オペコード 命令 説明<br />

D8 /0 FADD m32 real m32real を ST(0) に加え、結果を ST(0) にストアする。<br />

DC /0 FADD m64real m64real を ST(0) に加え、結果を ST(0) にストアする。<br />

D8 C0+i FADD ST(0), ST(i) ST(0) を ST(i) に加え、結果を ST(0) にストアする。<br />

DC C0+i FADD ST(i), ST(0) ST(i) を ST(0) に加え、結果を ST(i) にストアする。<br />

DE C0+i FADDP ST(i), ST(0) ST(0) を ST(i) に加え、結果を ST(i) にストアし、レジスタ・スタッ<br />

クをポップする。<br />

DE C1 FADDP ST(0) を ST(1) に加え、結果を ST(1) にストアし、レジスタ・ス<br />

タックをポップする。<br />

DA /0 FIADD m32int m32int を ST(0) に加え、結果を ST(0) にストアする。<br />

DE /0 FIADD m16int m16int を ST(0) に加え、結果を ST(0) にストアする。<br />

説明<br />

ソース・オペランドをデスティネーション・オペランドに加え、 結果をデスティネー<br />

ション・ロケーションにストアする。 デスティネーション・オペランドは常にFPU レジ<br />

スタである。 ソース ・ オペランドには、 レジスタまたはメモリ ・ ロケーションを使用で<br />

き る。 メ モ リ 内の ソ ー ス ・ オペラ ン ド には、 単精度実数、 倍精度実数、 ワ ー ド 整数、 ま<br />

たはシ ョ ー ト整数のフ ォ ーマッ ト を使用できる。<br />

この命令のオペランドなしバージョンでは、 ST(0) レジスタの内容を ST(1) レジスタに加<br />

える。 1 オペランド ・バージョンでは、 メモリ ・ ロケーションの内容( 実数値 ま たは整数<br />

値 ) を ST(0) レジスタに加える。 2 オペラン ド ・ バージ ョ ンでは、 ST(0) レジスタの内容<br />

を ST(i) レジスタに、 またはその逆に加算する。 ST(0) の値は、 以下の コ ーデ ィ ングに<br />

よって2 倍にでき る。<br />

FADD ST(0), ST(0);<br />

FADDP 命令は、 結果をス ト アした後に、 追加操作 と して FPU レジスタ ・ スタックをポッ<br />

プする。 レジスタ ・ スタ ッ クをポ ッ プするため、 プロセッサは ST(0) レジスタを空として<br />

マークし、 スタッ ク ・ ポインタ (TOP) を 1 インク リメン トする。 ( 浮動小数点加算命令の<br />

オペラン ド なしバージ ョ ンでは、 常にレジスタ ・ スタ ッ クのポ ップを伴う。 一部のアセ<br />

ンブラでは、 この命令のニーモニッ クは FADDP ではな く FADD になっている。 )<br />

FIADD 命令は、 整数の ソ ー ス ・ オペラ ン ド を拡張実数フ ォ ー マ ッ ト に変換してか ら 加算<br />

を行う。<br />

次ページの表に、 オーバフローもアンダフローも発生しないものとして、 さまざまなク<br />

ラスの数値を加算したと きに得られる結果を示す。<br />

符号が反対の 2 つのオペラン ド の和が 0 のときは、 - ∞への丸めモー ド の場合を除いて、<br />

結果は +0 である。 - ∞方向への丸めモー ド の場合は、 結果は -0 である。 ソ ース ・ オペラ<br />

ンドは、 整数0 のときは+0 として取り扱われる。<br />

両方のオペラ ン ド が同じ符号で無限大の と き は、 結果は予期される符号の∞であ る。 両<br />

方のオペラ ン ド が反対符号で無限大の場合は、 無効操作例外が発生する。<br />

3:460 第 3 巻 : IA-32 基本命令リファレンス


FADD/FADDP/FIADD—Add ( 続き )<br />

.<br />

DEST<br />

−∞ −F −0 +0 +F +∞ NaN<br />

−∞ −∞ −∞ −∞ −∞ −∞ * NaN<br />

−F or −I −∞ −F SRC SRC ±F or ±0 +∞ NaN<br />

SRC −0 −∞ DEST −0 ±0 DEST +∞ NaN<br />

+0 −∞ DEST ±0 +0 DEST +∞ NaN<br />

+For +I −∞ ±F or ±0 SRC SRC +F +∞ NaN<br />

+∞ * +∞ +∞ +∞ +∞ +∞ NaN<br />

NaN NaN NaN NaN NaN NaN NaN NaN<br />

注 :<br />

F 有限実数を示す。<br />

I 整数を示す。<br />

* 浮動小数点無効算術オペランド例外 (#IA) を示す。<br />

操作<br />

IF instruction is FIADD<br />

THEN<br />

DEST ← DEST + ConvertExtendedReal(SRC);<br />

ELSE (* source operand is real number *)<br />

DEST ← DEST + SRC;<br />

FI;<br />

IF instruction = FADDP<br />

THEN<br />

PopRegisterStack;<br />

FI;<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト され<br />

る。<br />

不正確結果例外 (#P) が発生した場合は、 丸めの方向を示<br />

す。 0 = 切り上げなし、 1 = 切り上げ。<br />

C0、 C2、 C3 未定義。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:461


FADD/FADDP/FIADD—Add ( 続き )<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

#IA オペラン ド が SNaN 値であるか、 ま たはそのフ ォ ーマ ッ ト<br />

がサポー ト されていない場合。<br />

両方のオペラ ン ド の符号が反対で、 絶対値が無限大の場<br />

合。<br />

#D 結果がデ ノ ーマル値である場合。<br />

#U 結果が小さすぎて、 デスティネーション・フォーマットで 表現で き ない場合。<br />

#O 結果が大きすぎて、 デスティネーション・フォーマットで 表現で き ない場合。<br />

#P 値がデステ ィ ネ ーシ ョ ン ・ フ ォ ーマ ッ ト では正確に表現で<br />

きない場合。<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

3:462 第 3 巻 : IA-32 基本命令リファレンス


FADD/FADDP/FIADD—Add ( 続き )<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:463


FBLD—Load Binary Coded Decimal<br />

オペコード 命令 説明<br />

DF /4 FBLD m80 dec BCD 値を実数に変換し、FPU スタックにプッシュする。<br />

説明<br />

BCD の ソ ー ス ・ オペラ ン ド を拡張実数フ ォ ー マ ッ ト に変換し、 変換結果の値を FPU ス<br />

タックにプッシュする。 ソース ・ オペランドは丸めエラーなしにロード される。 ソー<br />

ス・オペランドの符号は、 -0 の場合の符号を含めて保持される。<br />

パック BCD 数字は 0 から 9 までの範囲とみなされる。 すなわち、 この命令は無効な数字<br />

(AH から FH) の有無をチ ェ ッ ク しない。 無効な コ ー ド を ロ ー ド し よ う と する と 、 結果は<br />

未定義にな る。<br />

操作<br />

TOP ← TOP − 1;<br />

ST(0) ← ExtendedReal(SRC);<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ オ ー バフ ロ ーが発生した場合は 1 にセッ ト さ<br />

れ、 発生しなか っ た場合は 0 にクリアされる。<br />

C0、 C2、 C3 未定義。<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ オ ー バフ ロ ーが発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

3:464 第 3 巻 : IA-32 基本命令リファレンス


FBLD—Load Binary Coded Decimal ( 続き )<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:465


FBSTP—Store BCD Integer and Pop<br />

オペコード 命令 説明<br />

DF /6 FBSTP m80bcd ST(0) を m80bcd にストアし、ST(0) をポップする。<br />

説明<br />

ST(0) レジスタの値を 18 桁のパ ッ ク BCD 整数に変換し、 結果をデス テ ィ ネ ー シ ョ ン ・<br />

オペラン ド にス ト アし、 レジスタ ・ スタ ッ クをポップする。 ソース値は、 非整数値の場<br />

合、 FPU 制御ワ ー ド の RC フ ィ ールド によ って指定される丸めモー ドに従って丸められ<br />

る。 レジスタ ・ スタ ッ クをポ ップするため、 プロセッサは ST(0) レジスタを空として<br />

マークし、 スタッ ク ・ ポインタ (TOP) を 1 インク リメントする。<br />

デステ ィ ネーシ ョ ン ・ オペラン ド は、 デステ ィ ネーシ ョ ン値の最初のバイト がス ト アさ<br />

れる ア ド レ ス を指定す る。 結果の BCD 値は、 ( その符号値を含めて ) 10 バイ ト のメモリ<br />

空間を必要 と す る。<br />

以下の表に、 さ ま ざ ま な ク ラ スのパ ッ ク BCD フォーマットの数をストアしたときに得ら れる結果を示す。<br />

注 :<br />

F 有限実数を示す。<br />

D パック BCD 数を示す。<br />

* 浮動小数点無効操作 (#IA) 例外を示す。<br />

** 丸めモードによって、± 0 または± 1。<br />

ソース値が大きすぎてデスティネーション ・ フォーマッ トで表現できない場合、 無効操<br />

作例外がマス ク されていなければ、 無効操作例外が発生し、 デス テ ィ ネ ー シ ョ ン ・ オペ<br />

ラ ン ド に値は ス ト ア さ れない。 無効操作例外がマス ク さ れてい る場合は、 パ ッ ク BCD の<br />

未定義値がメ モ リ にス ト ア さ れる。<br />

ソース値がクワイエッ ト NaN の場合は、無効操作例外が発生する。通常、 クワイエット<br />

NaNs では、 この例外は発生しない。<br />

操作<br />

DEST ← BCD(ST(0));<br />

PopRegisterStack;<br />

ST(0) DEST<br />

−∞ *<br />

−F < −1 −D<br />

−1 < −F < −0 **<br />

−0 −0<br />

+0 +0<br />

+0 < +F < +1 **<br />

+F > +1 +D<br />

+∞ *<br />

NaN *<br />

3:466 第 3 巻 : IA-32 基本命令リファレンス


FBSTP—Store BCD Integer and Pop ( 続き )<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト され<br />

る。<br />

不正確結果例外 (#P) が発生した場合は、 丸めの方向を示<br />

す。 0 = 切り上げなし、 1 = 切り上げ。<br />

C0、 C2、 C3 未定義。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

#IA ソ ー ス ・ オペラ ン ド が空であ る か、 内容が NaN または±<br />

∞、 あるいはサポー ト されていないフ ォ ーマッ ト である<br />

か、 または内容値が 18 BCD 桁の長 さ を超えている場合。<br />

#P 値がデステ ィ ネ ーシ ョ ン ・ フ ォ ーマ ッ ト では正確に表現で<br />

きない場合。<br />

保護モード例外<br />

#GP(0) セグメン ト ・ レジスタに書き込み不可能なセグメン ト を指<br />

示先 と するセグ メ ン ト ・ セレ ク タがロ ー ド されよ う と した<br />

場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:467


FBSTP—Store BCD Integer and Pop ( 続き )<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:468 第 3 巻 : IA-32 基本命令リファレンス


FCHS—Change Sign<br />

オペコード 命令 説明<br />

D9 E0 FCHS ST(0) の符号を反転する。<br />

説明<br />

ST(0) の符号を反転する。 この操作は、 正の値を同じ絶対値の負の値に、 またはその逆に<br />

変換す る。 以下の表に、 さ ま ざ ま な ク ラ スの数の絶対値を作成した と き に得 ら れる結果<br />

を示す。<br />

注 :<br />

F 有限実数を示す。<br />

操作<br />

ST(0) SRC ST(0) DEST<br />

−∞ +∞<br />

−F +F<br />

−0 +0<br />

+0 −0<br />

+F −F<br />

+∞ −∞<br />

NaN NaN<br />

SignBit(ST(0)) ← NOT (SignBit(ST(0)))<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト さ<br />

れ、 発生しなか っ た場合は 0 にクリアされる。<br />

C0、 C2、 C3 未定義。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

保護モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

実アドレス・モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:469


FCLEX/FNCLEX—Clear Exceptions<br />

オペコード 命令 説明<br />

9B DB E2 FCLEX 未処理のマスクされていない浮動小数点例外の有無をチェックした<br />

後、浮動小数点例外フラグをクリアする。<br />

DB E2 FNCLEX 未処理のマスクされていない浮動小数点例外の有無をチェックしな<br />

いで、浮動小数点例外フラグをクリアする。<br />

説明<br />

FPU ス テ ー タ ス ・ ワ ー ド 内の浮動小数点例外フ ラ グ (PE、 UE、 OE、 ZE、 DE、 IE)、 例外<br />

サマ リ ・ ステータス ・ フラグ (ES)、 スタ ッ ク ・ フォル ト ・ フラグ (SF)、 ビジー ・ フラグ<br />

(B) をク リアする。 FCLEX 命令は、 未処理のマス ク さ れていない浮動小数点例外がない<br />

かど うかをチェ ッ クしてから各例外フラグをクリアする。 FNCLEX 命令は こ のチ ェ ッ ク<br />

を行わない。<br />

操作<br />

FPUStatusWord[0..7] ← 0;<br />

FPUStatusWord[15] ← 0;<br />

FPU 影響を受けるフラグ<br />

FPU ステータス ・ ワー ド内の PE、 UE、 OE、 ZE、 DE、 IE、 ES、 SF、 B フラグがクリア<br />

される。 C0、 C1、 C2、 C3 フ ラ グは未定義。<br />

浮動小数点例外<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

保護モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

実アドレス・モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

3:470 第 3 巻 : IA-32 基本命令リファレンス


FCMOVcc—Floating-Point Conditional Move<br />

オペコード 命令 説明<br />

DA C0+i FCMOVB ST(0), ST(i) より下 (CF=1) の場合転送する。<br />

DA C8+i FCMOVE ST(0), ST(i) 等しい (ZF=1) 場合転送する。<br />

DA D0+i FCMOVBE ST(0), ST(i) より下か等しい (CF=1 または ZF=1) 場合転送する。<br />

DA D8+i FCMOVU ST(0), ST(i) 順序付けなし (PF=1) の場合転送する。<br />

DB C0+i FCMOVNB ST(0), ST(i) より下でない (CF=0) 場合転送する。<br />

DB C8+i FCMOVNE ST(0), ST(i) 等しくない (ZF=0) 場合転送する。<br />

DB D0+i FCMOVNBE ST(0), ST(i) より下でなく等しくない (CF=0 および ZF=0) 場合転送する。<br />

DB D8+i FCMOVNU ST(0), ST(i) 順序付け (PF=0) の場合転送する。<br />

説明<br />

EFLAGS レ ジス タ内のステ ー タ ス ・ フ ラグをテス ト し、 与え られたテス ト 条件が真の場<br />

合、 ソ ー ス ・ オペラ ン ド ( 第 2 オペラン ド ) をデスティネーション・オペランド ( 第 1 オ<br />

ペラン ド ) に転送する。 ソ ース ・ オペラン ド は常に ST(i) レジスタにあり、 デスティネー<br />

ション・オペランドは常にST(0) である。<br />

FCMOVcc 命令は小 さ い IF 構造を最適化す る場合に有用である。 こ れら の命令は、 さ ら<br />

に IF 操作の分岐にかかわ る オ ー バヘ ッ ド お よ びプ ロ セ ッ サに よ る分岐の予測 ミ ス を排除<br />

する上でも有効である。<br />

Pentium Pro プロセッサ ・ ファ ミ リ内のプロセッサによっては、 FCMOVcc 命令をサポ ー<br />

トしていないものがある。 ソフトウェアで、 CPUID 命令 (3:440 ページの 「CPUID—CPU<br />

Identification」 を参照 ) を使用してプロセ ッサの機能情報を調べる こ と によ り、<br />

FCMOVcc 命令がサポ ー ト されているかど う かを確認でき る。 CMOV および FPU の両機<br />

能ビ ッ ト がセッ ト されていれば、 FCMOVcc 命令がサポ ー ト さ れている。<br />

操作<br />

IF condition TRUE<br />

ST(0) ← ST(i)<br />

FI;<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト され<br />

る。<br />

C0、 C2、 C3 未定義。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

Integer 影響を受けるフラグ<br />

なし。<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:471


FCMOVcc—Floating-Point Conditional Move ( 続き )<br />

保護モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

実アドレス・モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

3:472 第 3 巻 : IA-32 基本命令リファレンス


FCOM/FCOMP/FCOMPP—Compare Real<br />

オペコード 命令 説明<br />

D8 /2 FCOM m32real ST(0) を m32real と比較する。<br />

DC /2 FCOM m64real ST(0) を m64real と比較する。<br />

D8 D0+i FCOM ST(i) ST(0) を ST(i) と比較する。<br />

D8 D1 FCOM ST(0) を ST(1) と比較する。<br />

D8 /3 FCOMP m32real ST(0) を m32real と比較し、レジスタ・スタックをポップする。<br />

DC /3 FCOMP m64real ST(0) を m64real と比較し、レジスタ・スタックをポップする。<br />

D8 D8+i FCOMP ST(i) ST(0) を ST(i) と比較し、レジスタ・スタックをポップする。<br />

D8 D9 FCOMP ST(0) を ST(1) と比較し、レジスタ・スタックをポップする。<br />

DE D9 FCOMPP ST(0) を ST(1) と比較し、レジスタ・スタックを 2 回ポップする。<br />

説明<br />

ST(0) レジスタの内容とソース値を比較し、 結果に従ってFPU ステータス ・ ワー ド内の<br />

条件 コ ー ド ・ フ ラ グ C0、 C2、 C3 をセッ ト する ( 下記の表を参照 )。 ソース ・ オペラン ド<br />

には、 データ ・ レジスタまたはメモリ ・ ロケーションを使用できる。 ソース ・ オペラン<br />

ドを指定しない場合は、 ST(0) の値は ST(1) の値と比較される。 ゼロの符号は無視され<br />

る。 すなわち、 -0.0 = +0.0 である。<br />

条件 C3 C2 C0<br />

ST(0) > SRC 0 0 0<br />

ST(0) < SRC 0 0 1<br />

ST(0) = SRC 1 0 0<br />

順序付けなし a<br />

1 1 1<br />

a. マスクされていない無効算術オペランド (#IA) 例外が発生しても、フ<br />

ラグはセットされない。<br />

こ の命令は比較対象の両数値の ク ラ ス を調べ る。 いずれかのオペラ ン ド が NaN である<br />

か、 ま たは その フ ォ ー マ ッ ト がサポ ー ト さ れていない場合は、 無効算術オペラ ン ド 例外<br />

(#IA) が発生し、 さ ら に、 その例外がマス ク さ れてい る場合は、 条件フ ラ グが 「順序付け<br />

なし」 に設定 さ れる。 無効算術オペラ ン ド 例外がマス ク さ れていない場合は、 条件 コ ー<br />

ド・フラグはセットされない。<br />

FCOMP 命令は比較操作の後に レ ジ ス タ ・ ス タ ッ ク を ポ ッ プし、 FCOMPP 命令は比較操<br />

作の後にレ ジス タ ・ ス タ ッ ク を 2 回ポ ッ プする。 レジスタ ・ スタ ッ クをポ ップするため、<br />

プロセッサは ST(0) レジスタを空としてマークし、 スタック ・ ポインタ (TOP) を 1 イン<br />

クリメントする。<br />

FCOM 命令が行 う 操作は、 QNaN オペラン ド の取り扱い方を除いて FUCOM 命令のそれ<br />

と同じである。 FCOM 命令は、 一方または両方のオペラン ド が NaN 値であるか、 ま たは<br />

それ ら の フ ォ ー マ ッ ト がサポ ー ト さ れていない と き は、 無効算術オペラ ン ド 例外 (#IA)<br />

を発生する。 FUCOM 命令が行 う 操作は、 オペラ ン ド が QNaN 値であ っ て も 無効算術オ<br />

ペラン ド例外を発生しない点を除いて FCOM の操作と 同じである。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:473


FCOM/FCOMP/FCOMPP—Compare Real ( 続き )<br />

操作<br />

CASE (relation of operands) OF<br />

ST > SRC: C3, C2, C0 ← 000;<br />

ST < SRC: C3, C2, C0 ← 001;<br />

ST = SRC: C3, C2, C0 ← 100;<br />

ESAC;<br />

IF ST(0) or SRC = NaN or unsupported format<br />

THEN<br />

#IA<br />

IF FPUControlWord.IM = 1<br />

THEN<br />

C3, C2, C0 ← 111;<br />

FI;<br />

FI;<br />

IF instruction = FCOMP<br />

THEN<br />

PopRegisterStack;<br />

FI;<br />

IF instruction = FCOMPP<br />

THEN<br />

PopRegisterStack;<br />

PopRegisterStack;<br />

FI;<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト さ<br />

れ、 発生しなか っ た場合は 0 にクリアされる。<br />

C0、 C2、 C3 前ペー ジの表を参照。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

#IA 一方ま たは両方のオペラ ン ド が NaN 値であるか、 ま たは<br />

それらのフ ォ ーマッ ト がサポー ト されていない場合。<br />

レ ジ ス タ が空にマ ー ク さ れる場合。<br />

#D 一方ま たは両方のオペラ ン ド がデ ノ ーマル値である場合。<br />

3:474 第 3 巻 : IA-32 基本命令リファレンス


FCOM/FCOMP/FCOMPP—Compare Real ( 続き )<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。 .<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:475


FCOMI/FCOMIP/FUCOMI/FUCOMIP—Compare Real and Set EFLAGS<br />

オペコード 命令 説明<br />

DB F0+i FCOMI ST, ST(i) ST(0) を ST(i) と比較し、結果に従ってステータス・フラグをセット<br />

する。<br />

DF F0+i FCOMIP ST, ST(i) ST(0) を ST(i) と比較し、結果に従ってステータス・フラグをセット<br />

し、レジスタ・スタックをポップする。<br />

DB E8+i FUCOMI ST, ST(i) ST(0) を ST(i) と比較し、順序付け値の有無をチェックし、結果に<br />

従ってステータス・フラグをセットする。<br />

DF E8+i FUCOMIP ST, ST(i) ST(0) を ST(i) と比較し、順序付け値の有無をチェックし、結果に<br />

従ってステータス・フラグをセットし、レジスタ・スタックをポッ<br />

プする。<br />

説明<br />

レジスタ ST(0) と ST(i) の内容を比較し、 結果に従っ て EFLAGS レジスタ内のステータ<br />

ス・フラグZF、 PF、 CF をセッ ト する ( 以下の表を参照 )。 これらの命令の比較では、 ゼ<br />

ロの符号は無視される。 すなわち、 -0.0 = +0.0 である。<br />

比較結果 ZF PF CF<br />

ST0 > ST(i) 0 0 0<br />

ST0 < ST(i) 0 0 1<br />

ST0 = ST(i) 1 0 0<br />

順序付けなし a<br />

1 1 1<br />

a. マスクされていない無効算術オペランド (#IA) 例外が生<br />

成された場合、フラグはセットされない。<br />

FCOMI/FCOMIP 命令が行 う 操作は、 QNaN オペラン ド の取り扱い方を除いて FUCOMI/<br />

FUCOMIP 命令のそれ と 同じ である。 FCOMI/FCOMIP 命令は、 一方 ま たは両方のオペラ<br />

ンドがNaN 値 (SNaN または QNaN) であるか、 またはそれらのフ ォ ーマッ ト がサポー ト<br />

されていないと きは、 ステータス ・ フラグを 「順序付けなし」 に設定し、 無効算術オペ<br />

ランド例外(#IA) を発生する。<br />

FUCOMI/FUCOMIP 命令が行 う 操作は、 オペラ ン ド が QNaN 値であ っ て も 無効算術オペ<br />

ランド例外を発生しない点を除いて FCOMI/FCOMIP 命令の操作 と 同じ である。<br />

無効操作例外がマス ク されていない場合は、 無効算術オペラ ン ド 例外が発生して も 、 ス<br />

テータス ・ フラグはセッ ト されない。<br />

FCOMIP およびFUCOMIP 命令は、 比較操作の後に さ ら に レ ジ ス タ ・ ス タ ッ ク を ポ ッ プ<br />

する。 レジスタ ・ スタッ クをポップするため、 プロセッサは ST(0) レジスタを空として<br />

マークし、 スタッ ク ・ ポインタ (TOP) を 1 インク リメントする。<br />

3:476 第 3 巻 : IA-32 基本命令リファレンス


FCOMI/FCOMIP/FUCOMI/FUCOMIP—Compare Real and Set EFLAGS ( 続き )<br />

操作<br />

CASE (relation of operands) OF<br />

ST(0) > ST(i): ZF, PF, CF ← 000;<br />

ST(0) < ST(i): ZF, PF, CF ← 001;<br />

ST(0) = ST(i): ZF, PF, CF ← 100;<br />

ESAC;<br />

IF instruction is FCOMI or FCOMIP<br />

THEN<br />

IF ST(0) or ST(i) = NaN or unsupported format<br />

THEN<br />

#IA<br />

IF FPUControlWord.IM = 1<br />

THEN<br />

ZF, PF, CF ← 111;<br />

FI;<br />

FI;<br />

FI;<br />

IF instruction is FUCOMI or FUCOMIP<br />

THEN<br />

IF ST(0) or ST(i) = QNaN, but not SNaN or unsupported format<br />

THEN<br />

ZF, PF, CF ← 111;<br />

ELSE (* ST(0) or ST(i) is SNaN or unsupported format *)<br />

#IA;<br />

IF FPUControlWord.IM = 1<br />

THEN<br />

ZF, PF, CF ← 111;<br />

FI;<br />

FI;<br />

FI;<br />

IF instruction is FCOMIP or FUCOMIP<br />

THEN<br />

PopRegisterStack;<br />

FI;<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト さ<br />

れ、 発生しなか っ た場合は 0 にクリアされる。<br />

C0、 C2、 C3 影響を受けない。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:477


FCOMI/FCOMIP/ FUCOMI/FUCOMIP—Compare Real and Set EFLAGS ( 続き )<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

#IA (FCOMI または FCOMIP 命令 ) 一方 ま たは両方のオペラ ン<br />

ドがNaN 値であるか、 ま たはそれら のフ ォ ーマ ッ ト がサ<br />

ポー ト されていない場合。<br />

(FUCOMI または FUCOMIP 命令 ) 一方 ま たは両方のオペ<br />

ランドがSNaN 値である ( ただし、 QNaN ではない ) か、<br />

ま たは それら の フ ォ ー マ ッ ト が定義 さ れていない場合。<br />

QNaN 値が検出されても、 無効オペラン ド例外は発生しな<br />

い。<br />

保護モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

実アドレス・モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

3:478 第 3 巻 : IA-32 基本命令リファレンス


FCOS—Cosine<br />

オペコード 命令 説明<br />

D9 FF FCOS ST(0) をその余弦で置き換える。<br />

説明<br />

ST(0) レジスタ内のソース ・ オペランドの余弦を計算し、 結果を ST(0) にス トアする。<br />

ソース ・オペランドはラジアン単位の± 263 の範囲内の値でなければな ら ない。 以下の<br />

表に、 オーバフローもアンダフローも発生しないものとして、 さまざまなクラスの数の<br />

余弦を計算した と き に得 ら れる結果を示す。<br />

注 :<br />

F 有限実数を示す。<br />

* 浮動小数点無効算術オペランド (#IA) 例外を示す。<br />

ソース ・ オペラン ド が許容可能な範囲を超えた場合は、 FPU ステータス ・ ワー ドの C2<br />

フラグがセッ ト され、 ST(0) レ ジス タの値は以前の ま ま変わ ら ない。 この命令は、 ソ ー<br />

ス ・ オペラ ン ド が範囲外で も 例外を発生しない。 プ ロ グ ラ ムの責任で、 C2 フラグを調べ<br />

て範囲外条件の有無を確認しなければな ら ない。 ± 2 63 の範囲を超える ソース値は、 2 π<br />

の適切な整数倍を引 く か、 または除数を 2 π として FPREM 命令を使用して、 命令の許<br />

容範囲内に縮小で き る。<br />

操作<br />

ST(0) SRC ST(0) DEST<br />

−∞ *<br />

−F −1 ~ +1<br />

−0 +1<br />

+0 +1<br />

+F −1 ~ +1<br />

+∞ *<br />

NaN NaN<br />

IF |ST(0)| < 263<br />

THEN<br />

C2 ← 0;<br />

ST(0) ← cosine(ST(0));<br />

ELSE (*source operand is out-of-range *)<br />

C2 ← 1;<br />

FI;<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト され<br />

る。<br />

不正確結果例外 (#P) が発生した場合は、 丸めの方向を示<br />

す。 0 = 切り上げなし、 1 = 切り上げ。<br />

C2 が 1 の場合は未定義。<br />

C2 ソース・オペランドが± 2 63 の範囲外の場合は 1 にセッ ト<br />

さ れる。 範囲内の場合は 0 にク リアされる。<br />

C0、 C3 未定義。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:479


FCOS—Cosine ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

#IA ソース・オペランドがSNaN 値または∞であるか、 その<br />

フォーマットがサポートされていない場合。<br />

#D 結果がデ ノ ーマル値である場合。<br />

#U 結果が小さすぎて、 デスティネーション・フォーマットで 表現で き ない場合。<br />

#P 値がデステ ィ ネ ーシ ョ ン ・ フ ォ ーマ ッ ト では正確に表現で<br />

きない場合。<br />

保護モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

実アドレス・モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

3:480 第 3 巻 : IA-32 基本命令リファレンス


FDECSTP—Decrement Stack-Top Pointer<br />

オペコード 命令 説明<br />

D9 F6 FDECSTP FPU ステータス・ワードの TOP フィールドをデクリメントする。<br />

説明<br />

FPU ステータス ・ ワー ドの TOP フィールドから1 を引 く ( すなわち、 スタ ッ ク ・ ト ッ<br />

プ・ポインタをデクリメントする)。 FPU データ ・ レジスタおよびタグ ・ レジスタの内<br />

容は影響を受けない。<br />

操作<br />

IF TOP = 0<br />

THEN TOP ← 7;<br />

ELSE TOP ← TOP - 1;<br />

FI;<br />

FPU 影響を受けるフラグ<br />

C1 0 にセッ ト される。 そうでない場合は 0 にク リアされる。<br />

C0、 C2、 C3 未定義。<br />

浮動小数点例外<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

保護モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

実アドレス・モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:481


FDIV/FDIVP/FIDIV—Divide<br />

オペコード 命令 説明<br />

D8 /6 FDIV m32real ST(0) を m32real で割り、結果を ST(0) にストアする。<br />

DC /6 FDIV m64real ST(0) を m64real で割り、結果を ST(0) にストアする。<br />

D8 F0+i FDIV ST(0), ST(i) ST(0) を ST(i) で割り、結果を ST(0) にストアする。<br />

DC F8+i FDIV ST(i), ST(0) ST(i) を ST(0) で割り、結果を ST(i) にストアする。<br />

DE F8+i FDIVP ST(i), ST(0) ST(i) を ST(0) で割り、結果を ST(i) にストアし、レジスタ・スタッ<br />

クをポップする。<br />

DE F9 FDIVP ST(1) を ST(0) で割り、結果を ST(1) にストアし、レジスタ・ス<br />

タックをポップする。<br />

DA /6 FIDIV m32int ST(0) を m32int で割り、結果を ST(0) にストアする。<br />

DE /6 FIDIV m16int ST(0) を m64int で割り、結果を ST(0) にストアする。<br />

説明<br />

デスティネーション・オペランドをソース・オペランドで割り、 結果をデスティネー<br />

ション・ロケーションにストアする。 デスティネーション・オペランド ( 被除数 ) は常<br />

に FPU レジスタである。 ソース ・ オペランド ( 除数 ) には、 レジスタまたはメモリ ・ ロ<br />

ケ ー シ ョ ン を使用で き る。 メ モ リ 内の ソ ー ス ・ オペラ ン ド には、 単精度実数、 倍精度実<br />

数、 ワ ー ド 整数、 ま たは シ ョ ー ト 整数の フ ォ ー マ ッ ト を使用で き る。<br />

この命令のオペランドなしバージョンでは、 ST(1) レジスタの内容を ST(0) レジスタの内<br />

容で割る。 1 オペラン ド ・ バージ ョ ンでは、 ST(0) レジスタの内容をメモリ ・ ロケーショ<br />

ンの内容 ( 実数 ま たは整数値 ) で割る。 2 オペラン ド ・ バージ ョ ンでは、 ST(0) レジスタ<br />

の内容を ST(i) レ ジスタの内容で割るか、 ま たはその逆の除算を行 う 。<br />

FDIVP 命令は、 除算結果を ス ト アした後に、 追加操作 と して FPU レジスタ ・ スタックを<br />

ポップする。 レジスタ・スタックをポップするため、 プロセッサはST(0) レジスタを空<br />

としてマークし、 スタック ・ポインタ (TOP) を 1 イ ン ク リ メ ン ト す る。 こ れ ら の浮動小<br />

数点除算命令のオペラ ン ド なしバー ジ ョ ンでは、 常に レ ジ ス タ ・ ス タ ッ ク のポ ッ プを伴<br />

う。 一部のアセンブラでは、 この命令のニーモニックは FDIVP ではな く FDIV になって<br />

いる。<br />

FIDIV 命令は、 整数の ソ ー ス ・ オペラ ン ド を拡張実数フ ォ ー マ ッ ト に変換してか ら 除算<br />

を行う。 ソース ・ オペラン ド は、 整数 0 のときは +0 として取り扱われる。<br />

ゼ ロ に よ る除算例外 (#Z) が発生して も 、 それがマス ク されていない場合は結果はス ト ア<br />

されない。 こ の例外がマス ク されていた場合は、 正しい符号の∞がデステ ィ ネ ー シ ョ<br />

ン・オペランドにストアされる。<br />

以下の表に、 オーバフローもアンダフローも発生しないものとして、 さまざまなクラス<br />

の数の除算を行ったと きに得られる結果を示す。<br />

3:482 第 3 巻 : IA-32 基本命令リファレンス


FDIV/FDIVP/FIDIV—Divide ( 続き )<br />

DEST<br />

−∞ −F −0 +0 +F +∞ NaN<br />

−∞ * +0 +0 −0 −0 * NaN<br />

−F +∞ +F +0 −0 −F −∞ NaN<br />

−I +∞ +F +0 −0 −F −∞ NaN<br />

SRC −0 +∞ ** * * ** −∞ NaN<br />

+0 −∞ ** * * ** +∞ NaN<br />

+I −∞ −F −0 +0 +F +∞ NaN<br />

+F −∞ −F −0 +0 +F +∞ NaN<br />

+∞ * −0 −0 +0 +0 * NaN<br />

NaN NaN NaN NaN NaN NaN NaN NaN<br />

注 :<br />

F 有限実数を示す。<br />

I 整数を示す。<br />

* 浮動小数点無効算術オペランド (#IA) 例外を示す。<br />

** 浮動小数点 0 による除算 (#Z) 例外を示す。<br />

操作<br />

IF SRC = 0<br />

THEN<br />

#Z<br />

ELSE<br />

IF instruction is FIDIV<br />

THEN<br />

DEST ← DEST / ConvertExtendedReal(SRC);<br />

ELSE (* source operand is real number *)<br />

DEST ← DEST / SRC;<br />

FI;<br />

FI;<br />

IF instruction = FDIVP<br />

THEN<br />

PopRegisterStack<br />

FI;<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト され<br />

る。<br />

不正確結果例外 (#P) が発生した場合は、 丸めの方向を示<br />

す。 0 = 切り上げなし、 1 = 切り上げ。<br />

C0、 C2、 C3 未定義。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:483


FDIV/FDIVP/FIDIV—Divide ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

#IA オペラン ド が SNaN 値であるか、 ま たはそのフ ォ ーマ ッ ト<br />

がサポー ト されていない場合。<br />

±∞ / ±∞、 ± 0/ ± 0 の場合。<br />

#D 結果がデ ノ ーマル値である場合。<br />

#Z DEST/ ± 0 の場合。 ただし、 DEST は± 0 に等し く ない。<br />

#U 結果が小さすぎて、 デスティネーション・フォーマットで 表現で き ない場合。<br />

#O 結果が大きすぎて、 デスティネーション・フォーマットで 表現で き ない場合。<br />

#P 値がデステ ィ ネ ーシ ョ ン ・ フ ォ ーマ ッ ト では正確に表現で<br />

きない場合。<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

3:484 第 3 巻 : IA-32 基本命令リファレンス


FDIV/FDIVP/FIDIV—Divide ( 続き )<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:485


FDIVR/FDIVRP/FIDIVR—Reverse Divide<br />

オペコード 命令 説明<br />

D8 /7 FDIVR m32real m32real を ST(0) で割り、結果を ST(0) にストアする。<br />

DC /7 FDIVR m64real m64real を ST(0) で割り、結果を ST(0) にストアする。<br />

D8 F8+i FDIVR ST(0), ST(i) ST(i) を ST(0) で割り、結果を ST(0) にストアする。<br />

DC F0+i FDIVR ST(i), ST(0) ST(0) を ST(i) で割り、結果を ST(i) にストアする。<br />

DE F0+i FDIVRP ST(i), ST(0) ST(0) を ST(i) で割り、結果を ST(i) にストアし、レジスタ・スタッ<br />

クをポップする。<br />

DE F1 FDIVRP ST(0) を ST(1) で割り、結果を ST(1) にストアし、レジスタ・ス<br />

タックをポップする。<br />

DA /7 FIDIVR m32int m32int を ST(0) で割り、結果を ST(0) にストアする。<br />

DE /7 FIDIVR m16int m64int を ST(0) で割り、結果を ST(0) にストアする。<br />

説明<br />

ソース・オペランドをデスティネーション・オペランドで割り、 結果をデスティネー<br />

ション・ロケーションにストアする。 デスティネーション・オペランド ( 除数 ) は常に<br />

FPU レジスタである。 ソース ・ オペランド ( 被除数 ) には、 レジスタまたはメモリ ・ ロ<br />

ケ ー シ ョ ン を使用で き る。 メ モ リ 内の ソ ー ス ・ オペラ ン ド には、 単精度実数、 倍精度実<br />

数、 ワ ー ド 整数、 ま たは シ ョ ー ト 整数の フ ォ ー マ ッ ト を使用で き る。<br />

これらの命令は、 それぞれ FDIV、 FDIVP、 FIDIV 命令の逆の演算を行 う 。 これら は、<br />

コ ー デ ィ ン グ効率の向上をサポ ー ト する目的で設け ら れた も のであ る。<br />

これらの命令のオペランドなしバージョンでは、 ST(0) レジスタの内容を ST(1) レジスタ<br />

の内容で割る。 1 オペランド ・バージョンでは、 メモリ ・ ロケーションの内容( 実数 ま た<br />

は整数値 ) を ST(0) レジスタの内容で割る。 2 オペラン ド ・ バージ ョ ンでは、 ST(i) レジ<br />

スタの内容を ST(0) レ ジス タの内容で割るか、 ま たはその逆の除算を行 う 。<br />

FDIVRP 命令は、 除算結果を ス ト アした後に、 追加操作 と して FPU レジスタ ・ スタック<br />

をポップする。 レジスタ ・ スタッ クをポップするため、 プロセッサは ST(0) レジスタを<br />

空としてマークし、 スタッ ク ・ ポインタ (TOP) を 1 インク リ メントする。 これらの浮動<br />

小数点除算命令のオペラ ン ド なしバー ジ ョ ンでは、 常に レ ジ ス タ ・ ス タ ッ ク のポ ッ プを<br />

伴う。 一部のアセンブラでは、 この命令のニーモニッ クは FDIVRP ではな く FDIVR に<br />

なっている。<br />

FIDIVR 命令は、 整数の ソ ー ス ・ オペラ ン ド を拡張実数フ ォ ー マ ッ ト に変換してか ら 除算<br />

を行う。<br />

ゼ ロ に よ る除算例外 (#Z) が発生して も 、 それがマス ク されていない場合は結果はス ト ア<br />

されない。 こ の例外がマス ク されていた場合は、 正しい符号の∞がデステ ィ ネ ー シ ョ<br />

ン・オペランドにストアされる。<br />

以下の表に、 オーバフローもアンダフローも発生しないものとして、 さまざまなクラス<br />

の数の除算を行ったと きに得られる結果を示す。<br />

3:486 第 3 巻 : IA-32 基本命令リファレンス


FDIVR/FDIVRP/FIDIVR—Reverse Divide ( 続き )<br />

DEST<br />

−∞ −F −0 +0 +F +∞ NaN<br />

−∞ * +∞ +∞ −∞ −∞ * NaN<br />

SRC −F +0 +F ** ** -F −0 NaN<br />

−I +0 +F ** ** -F −0 NaN<br />

−0 +0 +0 * * −0 −0 NaN<br />

+0 −0 −0 * * +0 +0 NaN<br />

+I −0 −F ** ** +F +∞ NaN<br />

+F −0 −F ** ** +F +∞ NaN<br />

+∞ * −∞ −∞ +∞ +∞ * NaN<br />

NaN NaN NaN NaN NaN NaN NaN NaN<br />

注 :<br />

F 有限実数を示す。<br />

I 整数を示す。<br />

* 浮動小数点無効算術オペランド (#IA) 例外を示す。<br />

** 浮動小数点 0 による除算 (#Z) 例外を示す。<br />

ソース ・オペランドは、 整数0 の場合は +0 として取り扱われる。<br />

操作<br />

IF DEST = 0<br />

THEN<br />

#Z<br />

ELSE<br />

IF instruction is FIDIVR<br />

THEN<br />

DEST ← ConvertExtendedReal(SRC) / DEST;<br />

ELSE (* source operand is real number *)<br />

DEST ← SRC / DEST;<br />

FI;<br />

FI;<br />

IF instruction = FDIVRP<br />

THEN<br />

PopRegisterStack<br />

FI;<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト され<br />

る。<br />

不正確結果例外 (#P) が発生した場合は、 丸めの方向を示<br />

す。 0 = 切り上げなし、 1 = 切り上げ。<br />

C0、 C2、 C3 未定義。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:487


FDIVR/FDIVRP/FIDIVR—Reverse Divide ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

#IA オペラン ド が SNaN 値であるか、 ま たはそのフ ォ ーマ ッ ト<br />

がサポー ト されていない場合。<br />

±∞ / ±∞、 ± 0/ ± 0 の場合。<br />

#D 結果がデ ノ ーマル値である場合。<br />

#Z SCR/ ± 0 の場合。 ただし、 SCR は± 0 に等し く ない。<br />

#U 結果が小さすぎて、 デスティネーション・フォーマットで 表現で き ない場合。<br />

#O 結果が大きすぎて、 デスティネーション・フォーマットで 表現で き ない場合。<br />

#P 値がデステ ィ ネ ーシ ョ ン ・ フ ォ ーマ ッ ト では正確に表現で<br />

きない場合。<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

3:488 第 3 巻 : IA-32 基本命令リファレンス


FDIVR/FDIVRP/FIDIVR—Reverse Divide ( 続き )<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:489


FFREE—Free Floating-Point Register<br />

オペコード 命令 説明<br />

DD C0+i FFREE ST(i) ST(i) のタグを空に設定する。<br />

説明<br />

ST(i) レジスタに関連する FPU タグ ・ レジスタ内のタグを空(11B) に設定する。 ST(i) お<br />

よび FPU スタック ・ ト ップ ・ ポインタ (TOP) の内容は影響を受けない。<br />

操作<br />

TAG(i) ← 11B;<br />

FPU 影響を受けるフラグ<br />

C0、 C1、 C2、 C3 未定義。<br />

浮動小数点例外<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

保護モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

実アドレス・モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

3:490 第 3 巻 : IA-32 基本命令リファレンス


FICOM/FICOMP—Compare Integer<br />

オペコード 命令 説明<br />

DE /2 FICOM m16int ST(0) を m16int と比較する。<br />

DA /2 FICOM m32int ST(0) を m32int と比較する。<br />

DE /3 FICOMP m16int ST(0) を m16int と比較し、スタック・レジスタをポップする。<br />

DA /3 FICOMP m32int ST(0) を m32int と比較し、スタック・レジスタをポップする。<br />

説明<br />

ST(0) レジスタの値を整数ソース ・ オペランド と比較し、 結果に従ってFPU ステータ<br />

ス ・ ワ ー ド の条件 コ ー ド ・ フ ラ グ C0、 C2、 C3 をセッ ト する ( 以下の表を参照 )。 整数値<br />

は、 比較が行われる前に拡張実数フ ォ ー マ ッ ト に変換される。<br />

条件 C3 C2 C0<br />

ST(0) > SRC 0 0 0<br />

ST(0) < SRC 0 0 1<br />

ST(0) = SRC 1 0 0<br />

順序付けなし 1 1 1<br />

こ れ ら の命令では、 「順序付けなし比較」 を実行す る。 順序付けなし比較は、 さ ら に比較<br />

対象の 2 つの数値のクラスのチェックも行う。 どちらかのオペランドが NaN であるか、<br />

ま たは その フ ォ ー マ ッ ト が定義 さ れていない場合は、 条件フ ラ グが 「順序付けなし」 に<br />

設定 さ れる。<br />

ゼ ロ の符号は無視 さ れる。 すなわ ち、 -0.0 = +0.0 である。<br />

FICOMP 命令は、 比較後に レ ジ ス タ ・ ス タ ッ ク を ポ ッ プす る。 レ ジ ス タ ・ ス タ ッ ク を<br />

ポップするため、 プロセッサはST(0) レジスタを空としてマークし、 スタック ・ ポイン<br />

タ (TOP) を 1 インク リ メン トする。<br />

操作<br />

CASE (relation of operands) OF<br />

ST(0) > SRC: C3, C2, C0 ← 000;<br />

ST(0) < SRC: C3, C2, C0 ← 001;<br />

ST(0) = SRC: C3, C2, C0 ← 100;<br />

Unordered: C3, C2, C0 ← 111;<br />

ESAC;<br />

IF instruction = FICOMP<br />

THEN<br />

PopRegisterStack;<br />

FI;<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト さ<br />

れ、 発生しなか っ た場合は 0 にクリアされる。<br />

C0、 C2、 C3 前ペー ジの表を参照。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:491


FICOM/FICOMP—Compare Integer ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

#IA 一方ま たは両方のオペラ ン ド が NaN 値であるか、 ま たは<br />

それらのフ ォ ーマッ ト がサポー ト されていない場合。<br />

#D 一方ま たは両方のオペラ ン ド がデ ノ ーマル値である場合。<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

3:492 第 3 巻 : IA-32 基本命令リファレンス


FICOM/FICOMP—Compare Integer ( 続き )<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:493


FILD—Load Integer<br />

オペコード 命令 説明<br />

DF /0 FILD m16int m16int を FPU レジスタ・スタックにプッシュする。<br />

DB /0 FILD m32int m32int を FPU レジスタ・スタックにプッシュする。<br />

DF /5 FILD m64int m64int を FPU レジスタ・スタックにプッシュする。<br />

説明<br />

符号付き整数の ソ ー ス ・ オペラ ン ド を拡張実数フ ォ ー マ ッ ト に変換し、 変換結果の値を<br />

FPU レジスタ ・ スタ ッ クにプッシュする。 ソース ・ オペラン ド には、 ワー ド、 ショ ー ト、<br />

ま たは ロ ン グ整数値を使用で き る。 ソ ー ス ・ オペラ ン ド は丸めエラ ー なし に ロ ー ド さ れ<br />

る。 ソ ー ス ・ オペラ ン ド の符号が保持 さ れる。<br />

操作<br />

TOP ← TOP − 1;<br />

ST(0) ← ExtendedReal(SRC);<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ オ ー バフ ロ ーが発生した場合は 1 にセッ ト さ<br />

れ、 発生しなか っ た場合は 0 にクリアされる。<br />

C0、 C2、 C3 未定義。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ オ ー バフ ロ ーが発生した場合。<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

3:494 第 3 巻 : IA-32 基本命令リファレンス


FILD—Load Integer ( 続き )<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:495


FINCSTP—Increment Stack-Top Pointer<br />

オペコード 命令 説明<br />

D9 F7 FINCSTP FPU ステータス・レジスタの TOP フィールドをインクリメントす<br />

る。<br />

説明<br />

FPU ステータス ・ ワー ドの TOP フィールドに1 を加える ( すなわち、 スタ ッ ク ・ ト ッ<br />

プ・ポインタをインクリメントする)。 FPU データ ・ レジスタおよびタグ ・ レジスタの<br />

内容は影響を受けない。 この操作はスタ ッ ク をポ ッ プする こ と と等価ではない。 それは、<br />

前のス タ ッ ク ・ ト ッ プ ・ レ ジス タのタグが空にマー ク されないためである。<br />

操作<br />

IF TOP = 7<br />

THEN TOP ← 0;<br />

ELSE TOP ← TOP + 1;<br />

FI;<br />

FPU 影響を受けるフラグ<br />

C1 C1 フラグは0 にセッ ト される。 それ以外の場合は、 #IS<br />

フォルトが発生する。<br />

C0、 C2、 C3 未定義。<br />

浮動小数点例外<br />

#IS<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

保護モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

実アドレス・モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

3:496 第 3 巻 : IA-32 基本命令リファレンス


FINIT/FNINIT—Initialize Floating-Point Unit<br />

オペコード 命令 説明<br />

9B DB E3 FINIT 未処理のマスクされていない浮動小数点例外の有無をチェックした<br />

後、FPU を初期化する。<br />

DB E3 FNINIT 未処理のマスクされていない浮動小数点例外の有無をチェックしな<br />

いで、FPU を初期化する。<br />

説明<br />

これらの命令は、 FPU 制御、 ス テ ー タ ス、 タ グ、 命令ポ イ ン タ、 デ ー タ ・ ポ イ ン タ の各<br />

レ ジスタをそれぞれのデフ ォ ル ト 状態に設定する。 FPU 制御ワ ー ド は 037FH に設定され<br />

る ( 最も近い整数に丸められる、 全例外がマスクされる、 64 ビッ ト精度)。 ステータス ・<br />

ワードはクリアされる ( 全例外フ ラ グはセ ッ ト さ れず、 TOP は 0 に設定される )。 レジス<br />

タ ・ ス タ ッ ク内のデー タ ・ レ ジス タ は以前の ま ま変わら ないが、 すべて空 (11B) として<br />

タグ付けされる。 命令およびデータのポインタはク リアされる。<br />

FINIT 命令は未処理のマス ク さ れていない浮動小数点例外の有無を調べ、 処理してか ら 、<br />

初期化を行 う 。 FNINIT 命令は こ のチ ェ ッ ク を行わない。<br />

操作<br />

FPUControlWord ← 037FH;<br />

FPUStatusWord ← 0;<br />

FPUTagWord ← FFFFH;<br />

FPUDataPointer ← 0;<br />

FPUInstructionPointer ← 0;<br />

FPULastInstructionOpcode ← 0;<br />

FPU 影響を受けるフラグ<br />

C0、 C1、 C2、 C3 0 にクリアされる。<br />

浮動小数点例外<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

保護モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

実アドレス・モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:497


FIST/FISTP—Store Integer<br />

オペコード 命令 説明<br />

DF /2 FIST m16int ST(0) を m16int にストアする。<br />

DB /2 FIST m32int ST(0) を m32int にストアする。<br />

DF /3 FISTP m16int ST(0) を m16int にストアし、レジスタ・スタックをポップする。<br />

DB /3 FISTP m32int ST(0) を m32int にストアし、レジスタ・スタックをポップする。<br />

DF /7 FISTP m64int ST(0) を m64int にストアし、レジスタ・スタックをポップする。<br />

説明<br />

FIST 命令は、 ST(0) レ ジ ス タ の値を符号付き整数に変換し、 変換結果の値をデス テ ィ<br />

ネーション ・ オペランドにストアする。 値はワード整数またはショ ー ト整数のフォー<br />

マットでストアできる。 デスティネーション・オペランドは、 デスティネーション値の<br />

最初のバイ ト がス ト ア される ア ド レ ス を指定す る。<br />

FISTP 命令は、 FIST 命令 と 同じ操作を行 っ てか ら 、 レ ジ ス タ ・ ス タ ッ ク を ポ ッ プす る。<br />

レジスタ ・ スタックをポップするため、 プロセッサは ST(0) レジスタを空としてマーク<br />

し、 スタ ッ ク ・ ポインタ (TOP) を 1 インク リメントする。 FISTP 命令は、 値を ロ ン グ整<br />

数フォーマットでもストアできる。<br />

以下の表に、 さ ま ざ まな ク ラスの数を整数フ ォ ーマ ッ ト でス ト アした と き に得られる結<br />

果を示す。<br />

ST(0) DEST<br />

−∞ *<br />

−F < −1 −I<br />

−1 < −F < −0 **<br />

−0 0<br />

+0 0<br />

+0 < +F < +1 **<br />

+F > +1 +I<br />

+∞ *<br />

NaN *<br />

注 :<br />

F 有限実数を示す。<br />

I 整数を示す。<br />

* 浮動小数点無効操作 (#IA) 例外を示す。<br />

** 丸めモードにより、0 または± 1。<br />

ソース値は、 非整数値の場合は、 FPU 制御ワ ー ド の RC フィールドによって指定される<br />

丸めモ ー ド に従 っ て整数値に丸め ら れる。<br />

ストアされる値がデスティネーション・フォーマットに対して大きすぎる、 すなわち∞<br />

または NaN であるか、 あるいはそのフ ォ ーマ ッ ト がサポー ト されていない場合で、 かつ<br />

無効算術オペラ ン ド 例外 (#IA) がマス ク さ れていない場合は、 無効操作例外が発生し、<br />

値はデス テ ィ ネ ー シ ョ ン ・ オペラ ン ド にス ト ア さ れない。 無効操作例外がマス ク さ れて<br />

い る場合は、 整数の未定義値がデス テ ィ ネ ー シ ョ ン ・ オペラ ン ド にス ト ア さ れる。<br />

3:498 第 3 巻 : IA-32 基本命令リファレンス


FIST/FISTP—Store Integer ( 続き )<br />

操作<br />

DEST ← Integer(ST(0));<br />

IF instruction = FISTP<br />

THEN<br />

PopRegisterStack;<br />

FI;<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト され<br />

る。<br />

不正確結果例外 (#P) が発生した場合は、 丸めの方向を示<br />

す。 0 = 切り上げなし、 1 = 切り上げ。<br />

発生しなか っ た場合は 0 にクリアされる。<br />

C0、 C2、 C3 未定義。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

#IA ソース・オペランドが大きすぎて、 デスティネーション・<br />

フ ォ ー マ ッ ト で表現で き ない場合。<br />

ソース・オペランドがNaN 値であるか、 ま たはその<br />

フォーマットがサポートされていない場合。<br />

#P 値がデステ ィ ネ ーシ ョ ン ・ フ ォ ーマ ッ ト では正確に表現で<br />

きない場合。<br />

保護モード例外<br />

#GP(0) デステ ィ ネー シ ョ ンが書き込み不可能なセグメ ン ト にある<br />

場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタを使用してメモリがア<br />

クセスされ、 レジスタの内容が NULL セグメン ト ・ セレ<br />

クタであった場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:499


FIST/FISTP—Store Integer ( 続き )<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:500 第 3 巻 : IA-32 基本命令リファレンス


FLD—Load Real<br />

オペコード 命令 説明<br />

D9 /0 FLD m32real m32real を FPU レジスタ・スタックにプッシュする。<br />

DD /0 FLD m64real m64real を FPU レジスタ・スタックにプッシュする。<br />

DB /5 FLD m80real m80real を FPU レジスタ・スタックにプッシュする。<br />

D9 C0+i FLD ST(i) ST(i) を FPU レジスタ・スタックにプッシュする。<br />

説明<br />

ソース ・オペランドを FPU レジスタ・スタックにプッシュする。 ソース・オペランド<br />

は、 単精度実数 ま たは倍精度実数の フ ォ ー マ ッ ト の場合は、 ス タ ッ ク にプ ッ シ ュ さ れる<br />

前に自動的に拡張実数フ ォ ー マ ッ ト に変換 さ れる。<br />

FLD 命令は選択 さ れた FPU レジスタ [ST(i)] の値も スタ ッ ク にプ ッ シ ュでき る。 この場<br />

合、 ST(0) レジスタをプッシュすると、 スタック ・ ト ップとその下のスタック ・ レジスタ<br />

がともに以前のスタック ・ ト ップ値になる。<br />

操作<br />

IF SRC is ST(i)<br />

THEN<br />

temp ← ST(i)<br />

TOP ← TOP − 1;<br />

IF SRC is memory-operand<br />

THEN<br />

ST(0) ← ExtendedReal(SRC);<br />

ELSE (* SRC is ST(i) *)<br />

ST(0) ← temp;<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ オ ー バフ ロ ーが発生した場合は 1 にセッ ト さ<br />

れ、 発生しなか っ た場合は 0 にクリアされる。<br />

C0、 C2、 C3 未定義。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:501


FLD—Load Real ( 続き )<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ オ ー バフ ロ ーが発生した場合。<br />

#IA ソース・オペランドがSNaN 値であるか、 ま たはその<br />

フォーマットがサポートされていない場合。<br />

#D ソース・オペランドがデノーマル値である場合。 ソース・<br />

オペラ ン ド が拡張実数フ ォ ー マ ッ ト の場合は発生しない。<br />

保護モード例外<br />

#GP(0) デステ ィ ネー シ ョ ンが書き込み不可能なセグメ ン ト にある<br />

場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタを使用してメモリがア<br />

クセスされ、 レジスタの内容が NULL セグメン ト ・ セレ<br />

クタであった場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:502 第 3 巻 : IA-32 基本命令リファレンス


FLD1/FLDL2T/FLDL2E/FLDPI/FLDLG2/FLDLN2/FLDZ—Load Constant<br />

オペコード 命令 説明<br />

D9 E8 FLD1 +1.0 を FPU レジスタ・スタックにプッシュする。<br />

D9 E9 FLDL2T log210 を FPU レジスタ・スタックにプッシュする。<br />

D9 EA FLDL2E log2e を FPU レジスタ・スタックにプッシュする。<br />

D9 EB FLDPI πをFPU レジスタ・スタックにプッシュする。<br />

D9 EC FLDLG2 log102 を FPU レジスタ・スタックにプッシュする。<br />

D9 ED FLDLN2 loge2 を FPU レジスタ・スタックにプッシュする。<br />

D9 EE FLDZ +0.0 を FPU レジスタ・スタックにプッシュする。<br />

説明<br />

( 拡張実数フ ォ ー マ ッ ト の ) 広 く 使用 さ れてい る 7 つの定数の中の 1 つを FPU レジスタ ・<br />

スタックにプッシュする。 これらの命令でロー ドできる定数は、 +1.0、 +0.0、 log210、 log2e、 π、 log102、 loge2 である。 各定数について、 66 ビ ッ ト の内部定数が (FPU 制御<br />

ワードのRC フィールドの指定に従って) 外部実数フ ォ ー マ ッ ト に丸め ら れる。 丸めの<br />

結果 と しては、 不正確結果例外 (#P) は発生しない。<br />

操作<br />

TOP ← TOP − 1;<br />

ST(0) ← CONSTANT;<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ オ ー バフ ロ ーが発生した場合は 1 にセッ ト さ<br />

れ、 発生しなか っ た場合は 0 にクリアされる。<br />

C0、 C2、 C3 未定義。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ オ ー バフ ロ ーが発生した場合。<br />

保護モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

実アドレス・モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:503


FLD1/FLDL2T/FLDL2E/FLDPI/FLDLG2/FLDLN2/FLDZ—Load Constant ( 続き )<br />

インテル・アーキテクチャにおける互換性<br />

RC フィールドが 「最も近い整数に丸める」 (round-to-nearest) に設定されている と きは、<br />

FPU は、 インテル ® 8087 およびインテル ® 287 数値演算 コ プ ロ セ ッ サが生じ る も の と 同<br />

じ定数を生じる。<br />

3:504 第 3 巻 : IA-32 基本命令リファレンス


FLDCW—Load Control Word<br />

オペコード 命令 説明<br />

D9 /5 FLDCW m2byte m2byte から FPU 制御ワードをロードする。<br />

説明<br />

16 ビッ トのソース・オペランドをFPU 制御ワ ー ド に ロ ー ド する。 ソ ー ス ・ オペラ ン ド は<br />

メ モ リ ・ ロ ケ ー シ ョ ンであ る。 こ の命令は、 一般的に FPU の動作モー ド を設定または変<br />

更する場合に使用される。<br />

新しい FPU 制御ワ ー ド を ロ ー ド する前に、 FPU ステータス ・ ワー ド内の 1 つ以上の例外<br />

フ ラ グがセ ッ ト されていて、 新しい制御ワ ー ド がそれら の例外の 1 つ以上のマス ク を解<br />

除した場合は、 次の浮動小数点命令が実行 さ れた と き に浮動小数点例外が発生す る ( た<br />

だし、 「非同期型」 (no-wait) 浮動小数点命令の場合を除 く 。 FPU の動作モー ド を変更する<br />

際に例外を発生さ せない よ う にする には、 新しい制御ワ ー ド を ロ ー ド する前に、 (FCLEX<br />

または FNCLEX 命令を使用して ) すべての未処理例外を ク リ アす る。<br />

操作<br />

FPUControlWord ← SRC;<br />

FPU 影響を受けるフラグ<br />

C0、 C1、 C2、 C3 未定義。<br />

浮動小数点例外<br />

なし。 ただし、 この操作で FPU ス テ ー タ ス ・ ワ ー ド 内の未処理例外のマス ク を解除され<br />

る と き がある。 その場合は、 次の 「同期型」 (waiting) 浮動小数点命令が実行された と き<br />

にその例外が発生す る。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )。<br />

VHPT データ・ フォ ルト 、 ネスト さ れた TLB フォルト 、<br />

データ TLB フォルト 、 代替データ TLB フォルト 、 データ・<br />

ペー ジ 不在フ ォ ルト 、 デー タ NaT ペー ジ参照アボー ト 、<br />

データ・キー・ミス・フォルト、データ・キー許可フォル<br />

ト 、 データ・ アク セス権フォ ルト 、 データ・ アク セス・<br />

ビッ ト ・ フォルト 、 データ・ ダーティ ・ ビッ ト ・ フォルト 。<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタを使用してメモリがア<br />

クセスされ、 レジスタの内容が NULL セグメン ト ・ セレ<br />

クタであった場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:505


FLDCW—Load Control Word ( 続き )<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:506 第 3 巻 : IA-32 基本命令リファレンス


FLDENV—Load FPU Environment<br />

オペコード 命令 説明<br />

D9 /4 FLDENV m14/28byte m14byte または m28byte から FPU 環境をロードする。<br />

説明<br />

メモリから FPU レジスタに完全な FPU 動作環境を ロ ー ド す る。 ソ ー ス ・ オペラ ン ド は、<br />

メ モ リ 内の動作環境デー タ の最初のバイ ト を指定する。 こ のデー タ は、 一般的に前 も っ<br />

て FSTENV または FNSTENV 命令に よ っ て指定 さ れたメ モ リ ・ ロ ケ ー シ ョ ン に書かれて<br />

いる。<br />

FPU 動作環境は、 FPU 制御ワード、 ステータス ・ ワード、 タグ・ ワード、 命令ポインタ、<br />

デー タ ・ ポ イ ン タ、 最後のオペコ ー ド か ら な っ ている。 プロセ ッ サの動作モー ド ( 保護ま<br />

たは実アド レス ) および現在のアドレス属性のサイズ (16 ビッ トまたは32 ビッ ト ) に従っ<br />

て、 メモ リ に ロ ー ド される動作環境情報のレ イアウ ト については、 『IA-32 インテル ® アー<br />

キテクチャ ・ ソフ ト ウェア・ ディベロッパーズ ・マニュアル、 上巻』 を参照のこ と。 仮<br />

想 8086 モー ドでは、 実アド レス ・ モー ドのレイアウ トが使用される。<br />

FLDENV 命令は、 対応する FSTENV/FNSTENV 命令 と同じ動作モー ド で実行する必要が<br />

ある。<br />

新しい FPU ステータス ・ ワー ド に 1 つ以上のマス ク されていない例外フ ラ グがセ ッ ト さ<br />

れている場合は、 次の浮動小数点命令が実行 された と き に浮動小数点例外が発生す る ( た<br />

だし、 「非同期型」 (no-wait) 浮動小数点命令の場合を除 く 。 新しい環境を ロ ー ド した と き<br />

に例外を発生させないよ う にするには、 ロ ー ド される FPU ステータス ・ ワー ド内のすべ<br />

ての例外フラグを ク リ アする。<br />

操作<br />

FPUControlWord ← SRC(FPUControlWord);<br />

FPUStatusWord ← SRC(FPUStatusWord);<br />

FPUTagWord ← SRC(FPUTagWord);<br />

FPUDataPointer ← SRC(FPUDataPointer);<br />

FPUInstructionPointer ← SRC(FPUInstructionPointer);<br />

FPULastInstructionOpcode ← SRC(FPULastInstructionOpcode);<br />

FPU 影響を受けるフラグ<br />

C0、 C1、 C2、 および C3 フラグがロード される。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:507


FLDENV—Load FPU Environment ( 続き )<br />

浮動小数点例外<br />

なし。 ただし、 この操作でマス ク されていない例外がステー タス ・ ワ ー ド に ロ ー ド され<br />

た場合は、 次の 「同期型」 (waiting) 浮動小数点命令が実行 さ れた と き に その例外が発生<br />

する。<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタを使用してメモリがア<br />

クセスされ、 レジスタの内容が NULL セグメン ト ・ セレ<br />

クタであった場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:508 第 3 巻 : IA-32 基本命令リファレンス


FMUL/FMULP/FIMUL—Multiply<br />

オペコード 命令 説明<br />

D8 /1 FMUL m32real ST(0) に m32real を掛け、結果を ST(0) にストアする。<br />

DC /1 FMUL m64real ST(0) に m64real を掛け、結果を ST(0) にストアする。<br />

D8 C8+i FMUL ST(0), ST(i) ST(0) に ST(i) を掛け、結果を ST(0) にストアする。<br />

DC C8+i FMUL ST(i), ST(0) ST(i) に ST(0) を掛け、結果を ST(i) にストアする。<br />

DE C8+i FMULP ST(i), ST(0) ST(i) に ST(0) を掛け、結果を ST(i) にストアし、レジスタ・スタッ<br />

クをポップする。<br />

DE C9 FMULP ST(0) に ST(1) を掛け、結果を ST(0) にストアし、レジスタ・ス<br />

タックをポップする。<br />

DA /1 FIMUL m32int m32int に ST(0) を掛け、結果を ST(0) にストアする。<br />

DE /1 FIMUL m16int m16int に ST(0) を掛け、結果を ST(0) にストアする。<br />

説明<br />

デスティネーション・オペランドとソース・オペランドとを掛け合わせ、 結果をデス<br />

ティネーション ・ ロケーションにストアする。 デスティネーション ・ オペランドは常に<br />

FPU データ ・ レジスタである。 ソース ・ オペランド には、 FPU データ ・ レジスタまたは<br />

メ モ リ ・ ロ ケ ー シ ョ ン を使用で き る。 メ モ リ 内の ソ ー ス ・ オペラ ン ド に は、 単精度実数、<br />

倍精度実数、 ワ ー ド 整数、 ま たは シ ョ ー ト 整数の フ ォ ー マ ッ ト を使用で き る。<br />

この命令のオペランドなしバージョンでは、 ST(0) レジスタの内容に ST(1) レジスタの内<br />

容を掛ける。 1 オペラン ド ・ バージ ョ ンでは、 ST(0) レジスタの内容にメモリ ・ ロケー<br />

ションの内容( 実数値ま たは整数値 ) を掛ける。 2 オペラン ド ・ バージ ョ ンでは、 ST(0)<br />

レジスタの内容に ST(i) レジスタの内容を掛けるか、 またはその逆に掛ける。<br />

FMULP 命令は、 結果を ス ト アした後に、 追加操作 と して RPU レジスタ ・ スタックを<br />

ポップする。 レジスタ・スタックをポップするため、 プロセッサはST(0) レジスタを空<br />

としてマークし、 スタック ・ポインタ (TOP) を 1 イ ン ク リ メ ン ト す る。 浮動小数点乗算<br />

命令のオペラ ン ド なしバー ジ ョ ンでは、 常に レ ジ ス タ ・ ス タ ッ ク のポ ッ プ操作を伴 う 。<br />

一部のアセンブ ラ では、 こ の命令のニー モニ ッ ク は FMULP ではな く FMUL になってい<br />

る。<br />

FIMUL 命令は、 整数ソ ー ス ・ オペラ ン ド を拡張実数フ ォ ー マ ッ ト に変換してか ら 乗算を<br />

行う。<br />

結果の符号は、 掛け合わ さ れる一方 ま たは両方の値が 0 または∞であっても、 常にソー<br />

ス と デス テ ィ ネ ー シ ョ ンの符号の排他的論理和である。 ソ ー ス ・ オペラ ン ド は、 整数 0<br />

の場合、 +0 として取り扱われる。<br />

以下の表に、 オーバフローもアンダフローも発生しないものとして、 さまざまなクラス<br />

の数の乗算を行ったと きに得られる結果を示す。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:509


FMUL/FMULP/FIMUL—Multiply ( 続き )<br />

DEST<br />

−∞ −F −0 +0 +F +∞ NaN<br />

−∞ +∞ +∞ * * −∞ −∞NaN −F +∞ +F +0 −0 −F −∞ NaN<br />

−I +∞ +F +0 −0 −F −∞ NaN<br />

SRC −0 * +0 +0 −0 −0 * NaN<br />

+0 * −0 −0 +0 +0 * NaN<br />

+I −∞ −F −0 +0 +F +∞ NaN<br />

+F −∞ −F −0 +0 +F +∞ NaN<br />

+∞ −∞ −∞ * * +∞ +∞ NaN<br />

NaN NaN NaN NaN NaN NaN NaN NaN<br />

注 :<br />

F 有限実数を示す。<br />

I 整数を示す。<br />

* 無効算術オペランド (#IA) 例外を示す。<br />

操作<br />

IF instruction is FIMUL<br />

THEN<br />

DEST ← DEST ∗ ConvertExtendedReal(SRC);<br />

ELSE (* source operand is real number *)<br />

DEST ← DEST ∗ SRC;<br />

FI;<br />

IF instruction = FMULP<br />

THEN<br />

PopRegisterStack<br />

FI;<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト され<br />

る。<br />

不正確結果例外 (#P) が発生した場合は、 丸めの方向を示<br />

す。 0 = 切り上げなし、 1 = 切り上げ。<br />

C0、 C2、 C3 未定義。<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

#IA ソース・オペランドがSNaN 値であるか、 ま たはその<br />

フォーマットがサポートされていない場合。<br />

一方のオペラ ン ド が ± 0 であり、 他方のオペラン ド が±∞<br />

の場合。<br />

#D ソ ー ス ・ オペラ ン ド がデ ノ ー マル値である場合。<br />

#U 結果が小さすぎて、 デスティネーション・フォーマットで 表現で き ない場合。<br />

3:510 第 3 巻 : IA-32 基本命令リファレンス


FMUL/FMULP/FIMUL—Multiply ( 続き )<br />

#O 結果が大きすぎて、 デスティネーション・フォーマットで 表現で き ない場合。<br />

#P 値がデステ ィ ネ ーシ ョ ン ・ フ ォ ーマ ッ ト では正確に表現で<br />

きない場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタを使用してメモリがア<br />

クセスされ、 レジスタの内容が NULL セグメン ト ・ セレ<br />

クタであった場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:511


FMUL/FMULP/FIMUL—Multiply ( 続き )<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:512 第 3 巻 : IA-32 基本命令リファレンス


FNOP—No Operation<br />

オペコード 命令 説明<br />

D9 D0 FNOP 何の操作も実行されない。<br />

説明<br />

何の FPU 操作 も 実行 さ れない。 こ の命令は命令ス ト リ ー ム上の空間を占め るが、 EIP レ<br />

ジスタを除いて、 FPU にもマシン・ コンテキストにも影響を与えない。<br />

FPU 影響を受けるフラグ<br />

C0、 C1、 C2、 C3 未定義。<br />

浮動小数点例外<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

保護モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

実アドレス・モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:513


FPATAN—Partial Arctangent<br />

オペコード 命令 説明<br />

D9 F3 FPATAN ST(1) を arctan(ST(1)/ST(0)) で置き換え、レジスタ・スタックを<br />

ポップする。<br />

説明<br />

ST(1) レジスタ内のソース ・ オペランドを ST(0) レジスタ内のソース ・ オペランドで割っ<br />

た値の逆正接を計算し、 結果を ST(1) にス ト アし、 FPU レジスタ ・ スタックをポップす<br />

る。 ST(0) レジスタ内の結果の符号は、 ソース ・ オペランド ST(1) の符号 と 同じであ り 、<br />

結果の絶対値は + π よ り小さい。<br />

以下の表に、 アンダフローが生じないものとして、 さまざまなクラスの数の逆正接を計<br />

算した と きに得られる結果を示す。<br />

表 1-6. FPATAN の 0 と NaN<br />

ST(0)<br />

−∞ −F −0 +0 +F +∞ NaN<br />

−∞ −3π/ 4 −π/2 −π/2 −π/2 −π/2 −π/4 NaN<br />

ST(1) −F −p −π ~ −π/ 2 −π/2 −π/2 −π/ 2 ~ −0 −0 NaN<br />

−0 −p −p −p −0 −0 −0 NaN<br />

+0 +π +π +π +0 +0 +0 NaN<br />

+F +π +π ~ +π/ 2 +π/ 2 +π/ 2 +π/ 2 ~ +0 +0 NaN<br />

+∞ +3π/ 4 +π/ 2 +π/ 2 +π/ 2 +π/ 2 +π/4 NaN<br />

NaN NaN NaN NaN NaN NaN NaN NaN<br />

注 :<br />

F 有限実数を示す。<br />

FPATAN 命令が許容で き る ソ ー ス ・ オペラ ン ド の範囲に制約はない。<br />

操作<br />

ST(1) ← arctan(ST(1) / ST(0));<br />

PopRegisterStack;<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト され<br />

る。<br />

不正確結果例外 (#P) が発生した場合は、 丸めの方向を示<br />

す。 0 = 切り上げなし、 1 = 切り上げ<br />

C0、 C2、 C3 未定義。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

3:514 第 3 巻 : IA-32 基本命令リファレンス


FPATAN—Partial Arctangent ( 続き )<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

#IA ソース・オペランドがSNaN 値であるか、 ま たはその<br />

フォーマットがサポートされていない場合。<br />

#D ソ ー ス ・ オペラ ン ド がデ ノ ー マル値である場合。<br />

#U 結果が小さすぎて、 デスティネーション・フォーマットで 表現で き ない場合。<br />

#P 値がデステ ィ ネ ーシ ョ ン ・ フ ォ ーマ ッ ト では正確に表現で<br />

きない場合。<br />

保護モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

実アドレス・モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

インテル・アーキテクチャにおける互換性<br />

80287 数値演算 コ プ ロ セ ッ サでは、 こ の命令の両方の ソ ー ス ・ オペラ ン ド は下記の範囲<br />

に制限される。<br />

0 ≤ | ST(1)| < | ST(0)| < +∞<br />

第 3 巻 : IA-32 基本命令リファレンス 3:515


FPREM—Partial Remainder<br />

オペコード 命令 説明<br />

D9 F8 FPREM ST(0) を ST(1) で割って得られる剰余で ST(0) を置き換える。<br />

説明<br />

ST(0) レジスタの値( 被除数 ) を ST(1) レジスタの値( 除数 ま たは法 ) で割っ て得られる<br />

剰余を計算し、 結果を ST(0) にス トアする。 剰余の値は以下の式で表される。<br />

剰余 = ST(0) - (N * ST(1))<br />

ここで、 N は [ST(0)/ST(1)] の実数の商をゼロに向けて切り捨てて得られる整数値である。<br />

剰余の符号は被除数の符号 と 同じ である。 部分剰余が 1 回も計算されていなくても、 剰<br />

余の絶対値は法の絶対値よ り小さい ( 下で説明 )。<br />

こ の命令は正確な結果を生じ る。 精度 ( 不正確 ) 例外は発生せず、 丸め制御は効果を も<br />

たない。 以下の表に、 アンダフ ロ ーが発生しない も の と して、 さ ま ざ ま な ク ラ スの数の<br />

剰余を計算した と き に得 ら れる結果を示す。<br />

表 1-7. FPREM の 0 と NaN<br />

ST(1)<br />

−∞ −F −0 +0 +F +∞ NaN<br />

−∞ * * * * * * NaN<br />

ST(0) −F ST(0) −F or −0 ** ** −F or −0 ST(0) NaN<br />

−0 −0 −0 * * −0 −0 NaN<br />

+0 +0 +0 * * +0 +0 NaN<br />

+F ST(0) +F or +0 ** ** +F or +0 ST(0) NaN<br />

+∞ * * * * * * NaN<br />

NaN NaN NaN NaN NaN NaN NaN NaN<br />

注 :<br />

F 有限実数を示す。<br />

* 浮動小数点無効算術オペランド (#IA) 例外を示す。<br />

** 浮動小数点 0 による除算 (#Z) 例外を示す。<br />

結果が 0 のときは、 その符号は被除数の符号と同じである。 法が∞のときは、 結果は<br />

ST(0) の値に等し く なる。<br />

FPREM 命令は、 IEEE 規格 754 で定義 さ れた剰余を計算しない。 IEEE で定義された剰余<br />

は、 FPREM1 命令で計算で き る。 FPREM 命令は、 イ ン テル 8087 およびインテル287 数<br />

値演算コ プロセ ッ サ と の互換性のために用意されている。<br />

FPREM 命令の 「部分剰余」 (partial remainder) の名前は、 その剰余の計算方法に由来して<br />

いる。 こ の命令は減算を反復して最終的に剰余を得る。 すなわち、 こ の命令の 1 回の実<br />

行では ST(0) の指数を 63 までしか縮小できない。 法より小さい剰余を生じるこ とができ<br />

た場合に、 この演算は完了し、 FPU ステータス ・ ワー ド内の C2 フラグがクリアされる。<br />

法よ り小さい剰余に達するまでは、 C2 はセッ ト されており、 ST(0) 内の結果は部分剰余<br />

と 呼ばれる。 部分剰余の指数は元の被除数の指数 よ り も 最低 32 は小さ く なっている。 ソ<br />

フトウェアは、 C2 がク リアされるまで、 (ST(0) 内の部分剰余を被除数 と して使用して )<br />

この命令を繰り返し実行できる。<br />

注 : そのよ うな剰余計算ループを実行している間に、 FPU を必要とする、 優先順位が高<br />

い割 り 込みル ー チンが剰余計算ル ー プ内の命令間で コ ン テ キス ト ・ ス イ ッ チを強制<br />

するこ とが考えられるので注意する。<br />

3:516 第 3 巻 : IA-32 基本命令リファレンス


FPREM—Partial Remainder ( 続き )<br />

FPREM 命令の重要な用途は、 周期関数の引数を縮小す る こ と である。 縮小が完了す る<br />

と、 この命令は商の最下位3 ビッ トをFPU ステータス ・ ワー ドの C3、 C1、 C0 フラグに<br />

ス ト アす る。 こ の情報は、 単位円の正しい 8 等分 ( π /4) 扇形内の元の角度を示して く れ<br />

るので、 ( 法として π/4 を使用した ) 正接関数の引数の縮小に重要であ る。<br />

操作<br />

D ← exponent(ST(0)) - exponent(ST(1));<br />

IF D < 64<br />

THEN<br />

Q ← Integer(TruncateTowardZero(ST(0) / ST(1)));<br />

ST(0) ← ST(0) - (ST(1) ∗ Q);<br />

C2 ← 0;<br />

C0, C3, C1 ← LeastSignificantBits(Q); (* Q2, Q1, Q0 *)<br />

ELSE<br />

C2 ← 1;<br />

N ← an implementation-dependent number between 32 and 63;<br />

QQ ← Integer(TruncateTowardZero((ST(0) / ST(1)) / 2 (D − N) ));<br />

ST(0) ← ST(0) - (ST(1) ∗ QQ ∗ 2 (D − N) );<br />

FI;<br />

FPU 影響を受けるフラグ<br />

C0 商のビ ッ ト 2 (Q2) にセッ ト される。<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト さ<br />

れ、 発生しなか っ た場合は商の最下位ビ ッ ト (Q0) にセッ<br />

トされる。<br />

C2 縮小が完了した場合は 0 にセッ ト され、 完了していない場<br />

合は 1 にセッ ト される。<br />

C3 商のビ ッ ト 1 (Q1) にセッ ト される。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

#IA ソース・オペランドがSNaN 値であるか、 法が 0 である<br />

か、 被除数が∞であるか、 またはそれらのいずれかの<br />

フォーマットがサポートされていない場合。<br />

#D ソ ー ス ・ オペラ ン ド がデ ノ ー マル値である場合。<br />

#U 結果が小さすぎて、 デスティネーション・フォーマットで 表現で き ない場合。<br />

保護モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:517


FPREM—Partial Remainder ( 続き )<br />

実アドレス・モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

3:518 第 3 巻 : IA-32 基本命令リファレンス


FPREM1—Partial Remainder<br />

オペコード 命令 説明<br />

D9 F5 FPREM1 ST(0) を ST(1) で割って得られる IEEE 剰余で ST(0) を置き換える。<br />

説明<br />

ST(0) レジスタの値( 被除数 ) を ST(1) レジスタの値( 除数 ま たは法 ) で割っ て得られる<br />

IEEE 剰余を計算し、 結果を ST(0) にス ト アする。 剰余の値は以下の式で表される。<br />

剰余 = ST(0) - (N ∗ ST(1))<br />

ここで、 N は [ST(0)/ST(1)] の実数の商を最 も近い整数値に向けて丸めて得られる整数値<br />

である。 剰余の符号は被除数の符号 と 同じ であ る。 部分剰余が 1 回も計算されていなく<br />

て も 、 剰余の絶対値は法の絶対値の 1/2 より小さい( 下で説明 )。<br />

こ の命令は正確な結果を生じ る。 精度 ( 不正確 ) 例外は発生せず、 丸め制御は効果を も<br />

たない。 以下の表に、 アンダフ ロ ーが発生しない も の と して、 さ ま ざ ま な ク ラ スの数の<br />

剰余を計算した と き に得 ら れる結果を示す。<br />

表 1-8. FPREM1 の 0 と NaN<br />

ST(1)<br />

−∞ −F −0 +0 +F +∞ NaN<br />

−∞ * * * * * * NaN<br />

ST(0) −F ST(0) −F or −0 ** ** −F or −0 ST(0) NaN<br />

−0 −0 −0 * * −0 −0 NaN<br />

+0 +0 +0 * * +0 +0 NaN<br />

+F ST(0) +F or +0 ** ** +F or +0 ST(0) NaN<br />

+∞ * * * * * * NaN<br />

NaN NaN NaN NaN NaN NaN NaN NaN<br />

注 :<br />

F 有限実数を示す。<br />

* 浮動小数点無効算術オペランド (#IA) 例外を示す。<br />

** 浮動小数点 0 による除算 (#Z) 例外を示す。<br />

結果が 0 のときは、 その符号は被除数の符号と同じである。 法が∞のときは、 結果は<br />

ST(0) の値に等し く なる。<br />

FPREM 命令は、 IEEE 規格 754 に規定されている剰余を計算する。 こ の命令の操作は、<br />

ST(0) を ST(1) で割った商を整数に丸める点で FPREM 命令 と は異な る ( 以下の 「操作」<br />

の項を参照 )。<br />

FPREM1 命令は、 FPREM 命令と同様に、 減算を反復して最終的に剰余を計算する。 すな<br />

わち、 この命令の 1 回の実行では ST(0) の指数を 63 までしか縮小できない。 法より小さ<br />

い剰余を生じた場合に、 この演算は完了し、 FPU ステータス ・ ワー ド内の C2 フラグが<br />

クリアされる。 法より小さい剰余に達するまでは、 C2 はセッ ト されており、 ST(0) 内の<br />

結果は部分剰余 と 呼ばれる。 部分剰余の指数は元の被除数の指数 よ り も 最低 32 は小さ く<br />

なっている。 ソフ ト ウェアは、 C2 がク リアされるまで、 (ST(0) 内の部分剰余を被除数 と<br />

して使用して ) こ の命令を繰 り 返し実行で き る。<br />

注 : そのよ うな剰余計算ループを実行している間に、 FPU を必要とする、 優先順位が高<br />

い割 り 込みル ー チンが剰余計算ル ー プ内の命令間で コ ン テ キス ト ・ ス イ ッ チを強制<br />

する可能性があるので注意する。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:519


FPREM1—Partial Remainder ( 続き )<br />

FPREM 命令の重要な用途は、 周期関数の引数を縮小す る こ と である。 縮小が完了す る<br />

と 、 こ の命令は商の最下位 3 ビッ トをFPU ステータス ・ ワー ドの C3、 C1、 および C0 フ<br />

ラグにス ト アする。 こ の情報は、 単位円の正しい 8 等分 ( π /4) 扇形内の元の角度を示し<br />

てくれるので、 ( 法として π/4 を使用した ) 正接関数の引数の縮小に重要であ る。<br />

操作<br />

D ← exponent(ST(0)) - exponent(ST(1));<br />

IF D < 64<br />

THEN<br />

Q ← Integer(RoundTowardNearestInteger(ST(0) / ST(1)));<br />

ST(0) ← ST(0) - (ST(1) ∗ Q);<br />

C2 ← 0;<br />

C0, C3, C1 ← LeastSignificantBits(Q); (* Q2, Q1, Q0 *)<br />

ELSE<br />

C2 ← 1;<br />

N ← an implementation-dependent number between 32 and 63;<br />

QQ ← Integer(TruncateTowardZero((ST(0) / ST(1)) / 2 (D − N) ));<br />

ST(0) ← ST(0) - (ST(1) ∗ QQ ∗ 2 (D − N) );<br />

FI;<br />

FPU 影響を受けるフラグ<br />

C0 商のビ ッ ト 2 (Q2) にセッ ト される。<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト さ<br />

れ、 発生しなか っ た場合は商の最下位ビ ッ ト (Q0) にセッ<br />

トされる。<br />

C2 縮小が完了した場合は 0 にセッ ト され、 完了していない場<br />

合は 1 にセッ ト される。<br />

C3 商のビ ッ ト 1 (Q1) にセッ ト される。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

#IA ソース・オペランドがSNaN 値であるか、 法が 0 である<br />

か、 被除数が∞であるか、 またはそれらのいずれかの<br />

フォーマットがサポートされていない場合。<br />

#D ソ ー ス ・ オペラ ン ド がデ ノ ー マル値である場合。<br />

#U 結果が小さすぎて、 デスティネーション・フォーマットで 表現で き ない場合。<br />

保護モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

3:520 第 3 巻 : IA-32 基本命令リファレンス


FPREM1—Partial Remainder ( 続き )<br />

実アドレス・モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:521


FPTAN—Partial Tangent<br />

オペコード 命令 Clocks 説明<br />

D9 F2 FPTAN 17-173 ST(0) をその正接で置き換え、FPU スタックに 1 をプッシュ<br />

する。<br />

説明<br />

ST(0) レジスタ内のソース ・ オペランドの正接を計算し、 結果を ST(0) にス トアし、 FPU<br />

レジスタ ・ スタックに 1.0 をプッシュする。 ソース ・ オペラン ド はラジアン単位であり、<br />

± 2 63 の範囲内でなければな ら ない。 以下の表に、 アンダ フ ロ ー が発生しない も の と し<br />

て、 さ ま ざ ま な ク ラ スの数の部分正接を計算した と き に得られるマス ク されていない結<br />

果を示す。<br />

注 :<br />

F 有限実数を示す。<br />

* 浮動小数点無効算術オペランド (#IA) 例外を示す。<br />

ソ ー ス ・ オペラ ン ド が許容可能な範囲外の場合は、 FPU ステータス ・ ワー ド内の C2 フ<br />

ラグがセッ ト され、 ST(0) レ ジスタの値は変わらない。 この命令は、 ソ ース ・ オペラン ド<br />

が範囲外の と き に例外を発生しない。 C2 フ ラ グを調べて範囲外条件の有無を確認す る の<br />

はプログラムの責任である。 ソース値が± 2 63 の範囲外の場合は、 除数を 2 π として<br />

FPREM 命令を使用し、 2 π の該当する整数倍を減算すれば、 ソ ー ス値を命令の範囲内に<br />

縮小で き る。<br />

インテル 8087 およびインテル 287 数値演算コ プ ロセ ッ サ と の互換性を保つため、 正接の<br />

計算終了後に、 レ ジ ス タ ・ ス タ ッ ク に 1.0 がプッ シュ される。 この操作によ って、 さ らに<br />

他の三角関数の計算 も 単純化される。 例えば、 FPTAN 命令の後で FDIVR 命令を実行して<br />

余接 ( 正接の逆数 ) を計算でき る。<br />

操作<br />

IF<br />

ST(0) SRC ST(0) DEST<br />

−∞ *<br />

−F −F ~ +F<br />

−0 −0<br />

+0 +0<br />

+F −F ~ +F<br />

+∞ *<br />

NaN NaN<br />

IF ST(0) < 2 63<br />

THEN<br />

C2 ← 0;<br />

ST(0) ← tan(ST(0));<br />

TOP ← TOP − 1;<br />

ST(0) ← 1.0;<br />

ELSE (*source operand is out-of-range *)<br />

C2 ← 1;<br />

FI;<br />

3:522 第 3 巻 : IA-32 基本命令リファレンス


FPTAN—Partial Tangent ( 続き )<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト さ<br />

れ、 スタック ・ オーバフローが発生した場合は 1 にセッ ト<br />

される。<br />

不正確結果例外 (#P) が発生した場合は、 丸めの方向を示<br />

す。 0 = 切り上げなし、 1 = 切り上げ。<br />

C2 ソース・オペランドが± 2 63 の範囲外の場合は 1 にセッ ト<br />

され、 範囲内の場合は 0 にクリアされる。<br />

C0、 C3 未定義。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

#IA ソース・オペランドがSNaN 値であるか、 ∞であるか、 ま<br />

たはそのフ ォ ーマッ ト がサポー ト されていない場合。<br />

#D ソ ー ス ・ オペラ ン ド がデ ノ ー マル値である場合。<br />

#U 結果が小さすぎて、 デスティネーション・フォーマットで 表現で き ない場合。<br />

#P 値がデステ ィ ネ ーシ ョ ン ・ フ ォ ーマ ッ ト では正確に表現で<br />

きない場合。<br />

保護モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

実アドレス・モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:523


FRNDINT—Round to Integer<br />

オペコード 命令 説明<br />

D9 FC FRNDINT ST(0) を整数に丸める。<br />

説明<br />

ST(0) レ ジス タのソ ー ス値を、 現在の丸めモー ド (FPU 制御ワ ー ド の RC フィールドの設<br />

定 ) に従って最も近い整数値に丸め、 結果を ST(0) にス トアする。<br />

ソ ー ス値は、 ∞の場合は変更 さ れない。 ソ ー ス値が整数値でない場合は、 浮動小数点不<br />

正確結果例外 (#P) が発生する。<br />

操作<br />

ST(0) ← RoundToIntegralValue(ST(0));<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト され<br />

る。<br />

不正確結果例外 (#P) が発生した場合は、 丸めの方向を示<br />

す。 0 = 切り上げなし、 1 = 切り上げ。<br />

C0、 C2、 C3 未定義。<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

#IA ソース・オペランドがSNaN 値であるか、 ま たはその<br />

フォーマットがサポートされていない場合。<br />

#D ソ ー ス ・ オペラ ン ド がデ ノ ー マル値である場合。<br />

#P ソ ー ス ・ オペラ ン ド が整数値でない場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

保護モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

実アドレス・モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

3:524 第 3 巻 : IA-32 基本命令リファレンス


FRSTOR—Restore FPU State<br />

オペコード 命令 説明<br />

DD /4 FRSTOR m94/108byte m94byte または m108byte から FPU 状態をロードする。<br />

説明<br />

ソ ー ス ・ オペラ ン ド で指定される メ モ リ 領域か ら 、 FPU 状態 ( 動作環境 と レ ジ ス タ ・ ス<br />

タック ) を ロ ー ド す る。 こ の状態デー タ は、 一般的に前 も っ て FSAVE/FNSAVE 命令に<br />

よって指定されたメモリ ・ロケーションに書かれている。<br />

FPU 動作環境は、 FPU 制御ワード、 ステータス ・ ワード、 タグ・ ワード、 命令ポインタ、<br />

デー タ ・ ポ イ ン タ、 最後のオペコ ー ド か ら な っ ている。 プロセ ッ サの動作モー ド ( 保護ま<br />

たは実アド レス ) と現在のアドレス属性のサイズ (16 ビッ トまたは32 ビッ ト ) に従って、<br />

メ モ リ に ス ト ア さ れる動作環境情報の レ イ アウ ト については、 『IA-32 インテル ® アーキテ<br />

クチャ ・ ソフ ト ウェア・ ディベロッパーズ ・マニュアル、 上巻』 を参照のこ と。 仮想<br />

8086 モー ドでは、 実アド レス ・ モー ドのレイアウ トが使用される。 FPU レジスタ ・ ス<br />

タ ッ ク の内容は、 動作環境イ メ ー ジの直後の 80 バイ ト のエリアにス ト アされる。<br />

FRSTOR 命令は、 対応する FSAVE/FNSAVE 命令と 同じ動作モー ド で実行する必要があ<br />

る。<br />

新しい FPU ステータス ・ ワー ド内で、 1 つ以上のマス ク されていない例外ビ ッ ト がセ ッ<br />

ト された場合は、 浮動小数点例外が発生す る。 新しいオペレ ー テ ィ ン グ環境を ロ ー ド す<br />

るときに例外が発生しないようにするには、 ロードされるFPU ステータス ・ ワー ド内の<br />

すべての例外フラグを ク リ アする。<br />

操作<br />

FPUControlWord ← SRC(FPUControlWord);<br />

FPUStatusWord ← SRC(FPUStatusWord);<br />

FPUTagWord ← SRC(FPUTagWord);<br />

FPUDataPointer ← SRC(FPUDataPointer);<br />

FPUInstructionPointer ← SRC(FPUInstructionPointer);<br />

FPULastInstructionOpcode ← SRC(FPULastInstructionOpcode);<br />

ST(0) ← SRC(ST(0));<br />

ST(1) ← SRC(ST(1));<br />

ST(2) ← SRC(ST(2));<br />

ST(3) ← SRC(ST(3));<br />

ST(4) ← SRC(ST(4));<br />

ST(5) ← SRC(ST(5));<br />

ST(6) ← SRC(ST(6));<br />

ST(7) ← SRC(ST(7));<br />

FPU 影響を受けるフラグ<br />

C0、 C1、 C2、 C3 フラグがロードされる。<br />

浮動小数点例外<br />

なし。 ただし、 検出されたが、 マス ク されていたために発生しなか った既存の例外が、<br />

こ の操作に よ っ てマス ク を解除される場合がある。 その よ う な例外は、 こ こ で、<br />

FRSTOR 命令の終了後に発生する。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:525


FRSTOR—Restore FPU State ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタを使用してメモリがア<br />

クセスされ、 レジスタの内容が NULL セグメン ト ・ セレ<br />

クタであった場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:526 第 3 巻 : IA-32 基本命令リファレンス


FSAVE/FNSAVE—Store FPU State<br />

オペコード 命令 説明<br />

9B DD /6 FSAVE m94/108byte 未処理のマスクされていない浮動小数点例外の有無をチェックした<br />

後、FPU 状態を m94byte または m108byte にストアし、次に FPU<br />

を初期化する。<br />

DD /6 FNSAVE m94/108byte 未処理のマスクされていない浮動小数点例外の有無をチェックしな<br />

いで、FPU 状態を m94byte または m108byte にストアし、次に<br />

FPU を初期化する。<br />

説明<br />

現在の FPU 状態 ( 動作環境 と レ ジ ス タ ・ ス タ ッ ク ) を指定されたメモ リ内のデステ ィ<br />

ネーションにストアし、 次に FPU を再初期化する。 FSAVE 命令は、 未処理のマス ク さ<br />

れていない浮動小数点例外の有無をチ ェ ッ ク し、 処理してか ら 、 FPU 状態を ス ト アする。<br />

FNSAVE 命令は こ のチ ェ ッ ク と 処理を行わない。<br />

FPU 動作環境は、 FPU 制御ワード、 ステータス ・ ワード、 タグ・ ワード、 命令ポインタ、<br />

デー タ ・ ポ イ ン タ、 最後のオペコ ー ド か ら な っ ている。 プロセ ッ サの動作モー ド ( 保護ま<br />

たは実アド レス ) および現在のアドレス属性のサイズ (16 ビッ トまたは32 ビッ ト ) に従っ<br />

て、 メモ リ にス ト ア される動作環境情報のレ イアウ ト については、 『IA-32 インテル ® アー<br />

キテクチャ ・ ソフ ト ウェア・ ディベロッパーズ ・マニュアル、 上巻』 を参照のこ と。 仮<br />

想 8086 モー ドでは、 実アド レス ・ モー ドのレイアウ トが使用される。 FPU レジスタ ・ ス<br />

タ ッ ク の内容は、 動作環境イ メ ー ジの直後の 80 バイ ト のエリアにス ト アされる。<br />

セ ー ブ さ れた イ メ ー ジ は、 命令ス ト リ ー ム内の FSAVE/FNSAVE 命令 よ り 前のすべての浮<br />

動小数点命令が実行 さ れた後の FPU の状態を反映している。<br />

FPU 状態がセー ブ された後、 FPU は FINIT/FNINIT 命令で設定 さ れる の と 同じ デ フ ォ ル<br />

ト値にリセット される (3:497 ページの 「FINIT/FNINIT—Initialize Floating-Point Unit」 を<br />

参照 )。<br />

FSAVE/FNSAVE 命令は、 一般的にオペレーテ ィ ング ・ システムがコンテキス ト ・ スイ ッ<br />

チを実行する必要があ る と き、 例外ハン ド ラ が FPU を使用する必要がある と き、 ま たは<br />

アプリケーション ・ プログラムが 「ク リ ーン」 な ( 初期状態の ) FPU をプロシージャに<br />

渡す必要がある と き に使用される。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:527


FSAVE/FNSAVE—Store FPU State ( 続き )<br />

操作<br />

(* Save FPU State and Registers *)<br />

DEST(FPUControlWord) ← FPUControlWord;<br />

DEST(FPUStatusWord) ← FPUStatusWord;<br />

DEST(FPUTagWord) ← FPUTagWord;<br />

DEST(FPUDataPointer) ← FPUDataPointer;<br />

DEST(FPUInstructionPointer) ← FPUInstructionPointer;<br />

DEST(FPULastInstructionOpcode) ← FPULastInstructionOpcode;<br />

DEST(ST(0)) ← ST(0);<br />

DEST(ST(1)) ← ST(1);<br />

DEST(ST(2)) ← ST(2);<br />

DEST(ST(3)) ← ST(3);<br />

DEST(ST(4)) ← ST(4);<br />

DEST(ST(5)) ← ST(5);<br />

DEST(ST(6)) ← ST(6);<br />

DEST(ST(7)) ← ST(7);<br />

(* Initialize FPU *)<br />

FPUControlWord ← 037FH;<br />

FPUStatusWord ← 0;<br />

FPUTagWord ← FFFFH;<br />

FPUDataPointer ← 0;<br />

FPUInstructionPointer ← 0;<br />

FPULastInstructionOpcode ← 0;<br />

FPU 影響を受けるフラグ<br />

C0、 C1、 C2、 C3 フ ラ グがセ ー ブ さ れ、 次に ク リ ア さ れる。<br />

浮動小数点例外<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

3:528 第 3 巻 : IA-32 基本命令リファレンス


FSAVE/FNSAVE—Store FPU State ( 続き )<br />

保護モード例外<br />

#GP(0) デステ ィ ネー シ ョ ンが書き込み不可能なセグメ ン ト にある<br />

場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタを使用してメモリがア<br />

クセスされ、 レジスタの内容が NULL セグメン ト ・ セレ<br />

クタであった場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

インテル・アーキテクチャにおける互換性<br />

インテル Pentium プロセッサよ り以前のインテル ® 数値演算 コ プ ロ セ ッ サお よ び FPU の<br />

場合は、 前の FSAVE/FNSAVE 命令でス トアされたメモリ ・ イメージから読み取る前に、<br />

FWAIT 命令を実行す る。 こ の FWAIT 命令に よ っ て、 よ り 確実に ス ト ア操作を完了で き<br />

る。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:529


FSCALE—Scale<br />

オペコード 命令 説明<br />

D9 FD FSCALE ST(0) を ST(1) でスケーリングする。<br />

説明<br />

デステ ィ ネーシ ョ ン ・ オペラン ド に 2 のソース ・ オペラン ド乗を掛け、 結果をデステ ィ<br />

ネ ー シ ョ ン ・ オペラ ン ド にス ト アす る。 こ の命令に よ っ て、 2 の整数乗に よ る高速の乗<br />

算または除算が可能になる。 デスティネーション・オペランドは、 ST(0) レジスタにスト<br />

ア されている実数値である。 ソ ー ス ・ オペラ ン ド は、 ST(1) レジスタの値より小さ く、 か<br />

つそれに最も近い整数値である ( すなわち、 ST(1) レジスタの値を 0 に向かって切り捨て<br />

た、 元の値に最も近い整数値がソ ース ・ オペラ ン ド にな っている )。 実際のスケー リ ング<br />

操作は、 レ ジ ス タ ST(0) の値の指数にソ ース ・ オペラン ド ( 整数値 ) を加算して実行され<br />

る。 以下の表に、 オーバフローもアンダフローも発生しないものとして、 さまざまなク<br />

ラスの数をスケー リングしたと きに得られる結果を示す。<br />

−N<br />

ST(1)<br />

0 +N<br />

−∞ −∞ −∞ −∞<br />

ST(0) −F −F −F −F<br />

−0 −0 −0 −0<br />

+0 +0 +0 +0<br />

+F +F +F +F<br />

+∞ +∞ +∞ +∞<br />

NaN NaN NaN NaN<br />

注 :<br />

F 有限実数を示す。<br />

N 整数を示す。<br />

ほ と ん ど の場合、 指数だけが変更されて仮数は変更 さ れない。 ただし、 ST(0) 内のスケ ー<br />

リ ン グ さ れる値がデ ノ ー マル値の と き は、 仮数 も 変更され、 結果は正規化数にな る場合<br />

がある。 同様に、 ス ケ ー リ ング操作の結果オ ー バフ ロ ー ま たはアンダ フ ロ ー が発生した<br />

場合、 結果の仮数は ソ ー スの仮数 と は異な る こ と にな る。<br />

SCALE 命令を使用して、 以下の例に示す よ う に FXTRACT 命令の処理を逆に も で き る。<br />

FXTRACT;<br />

FSCALE;<br />

FSTP ST(1);<br />

この例では、 FXTRACT 命令が ST(0) の値か ら仮数 と 指数を抽出し、 それぞれ ST(0) と<br />

ST(1) にス トアしている。 次に、 FSCALE 命令が ST(0) 内の仮数を ST(1) 内の指数でス<br />

ケーリングし、 FXTRACT 操作が行われる前の元の値を作成し直している。 FSTP ST(1)<br />

命令は、 作成し直された値を、 元の値が置かれていた FPU レジスタに返す。<br />

操作<br />

ST(0) ← ST(0) ∗ 2 ST(1) ;<br />

3:530 第 3 巻 : IA-32 基本命令リファレンス


FSCALE—Scale ( 続き )<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト され<br />

る。<br />

不正確結果例外 (#P) が発生した場合は、 丸めの方向を示<br />

す。 0 = 切り上げなし、 1 = 切り上げ。<br />

C0、 C2、 C3 未定義。<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

#IA ソース・オペランドがSNaN 値であるか、 ま たはその<br />

フォーマットがサポートされていない場合。<br />

#D ソ ー ス ・ オペラ ン ド がデ ノ ー マル値である場合。<br />

#U 結果が小さすぎて、 デスティネーション・フォーマットで 表現で き ない場合。<br />

#O 結果が大きすぎて、 デスティネーション・フォーマットで 表現で き ない場合。<br />

#P 値がデステ ィ ネ ーシ ョ ン ・ フ ォ ーマ ッ ト では正確に表現で<br />

きない場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

保護モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

実アドレス・モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:531


FSIN—Sine<br />

オペコード 命令 説明<br />

D9 FE FSIN ST(0) をその正弦で置き換える。<br />

説明<br />

ST(0) レジスタ内のソース ・ オペランドの正弦を計算し、 結果を ST(0) レジスタにストア<br />

する。 ソース ・ オペランドはラジアン単位であり、 ± 263 の範囲内でなければな ら ない。<br />

以下の表に、 アンダフ ロ ーが発生しない も の と して、 さ ま ざ まな ク ラスの数の正弦を計<br />

算した と きに得られる結果を示す。<br />

注 :<br />

F 有限実数を示す。<br />

* 浮動小数点無効算術オペランド (#IA) 例外を示す。<br />

ソ ー ス ・ オペラ ン ド が許容可能な範囲外の場合は、 FPU ステータス ・ ワー ド内の C2 フ<br />

ラグがセッ ト され、 ST(0) レ ジスタの値は変わらない。 この命令は、 ソ ース ・ オペラン ド<br />

が範囲外の と き に例外を発生さ せない。 C2 フ ラグを調べて範囲外条件の有無を確認する<br />

のはプログラムの責任である。 ソース値が± 2 63 の範囲外の場合は、 2 π の該当す る整数<br />

倍を引 く か、 または除数を 2 π として FPREM 命令を使用すれば、 ソ ー ス値を命令の許<br />

容範囲内に縮小で き る。<br />

操作<br />

IF I<br />

SRC (ST(0)) DEST (ST(0))<br />

−∞ *<br />

−F −1 ~ +1<br />

−0 −0<br />

+0 +0<br />

+F −1 ~ +1<br />

+∞ *<br />

NaN NaN<br />

IF ST(0) < 2 63<br />

THEN<br />

C2 ← 0;<br />

ST(0) ← sin(ST(0));<br />

ELSE (* source operand out of range *)<br />

C2 ← 1;<br />

FI:<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト され<br />

る。<br />

不正確結果例外 (#P) が発生した場合は、 丸めの方向を示<br />

す。 0 = 切り上げなし、 1 = 切り上げ。<br />

C2 ソース・オペランドが± 263 の範囲外の場合は 1 にセッ ト<br />

され、 範囲内の場合は 0 にクリアされる。<br />

C0、 C3 未定義。<br />

3:532 第 3 巻 : IA-32 基本命令リファレンス


FSIN—Sine ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

#IA ソース・オペランドがSNaN 値であるか、 ∞であるか、 ま<br />

たはそのフ ォ ーマッ ト がサポー ト されていない場合。<br />

#D ソ ー ス ・ オペラ ン ド がデ ノ ー マル値である場合。<br />

#P 値がデステ ィ ネ ーシ ョ ン ・ フ ォ ーマ ッ ト では正確に表現で<br />

きない場合。<br />

保護モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

実アドレス・モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:533


FSINCOS—Sine and Cosine<br />

オペコード 命令 説明<br />

D9 FB FSINCOS ST(0) の正弦と余弦を計算し、ST(0) を正弦で置き換え、余弦をレジ<br />

スタ・スタックにプッシュする。<br />

説明<br />

ST(0) レ ジ ス タ内の ソ ー ス ・ オペラ ン ド の正弦 と 余弦を計算し、 正弦を ST(0) に、 余弦を<br />

FPU レジスタ ・ スタックのト ップにプッシュする。 ( この命令は、 FSIN および FCOS 命<br />

令を続けて実行する よ り高速である。 )<br />

ソ ー ス ・ オペラ ン ド は ラ ジアン単位であ り 、 ± 263 の範囲内でなければな ら ない。 以下<br />

の表に、 アンダフ ロ ーが発生しない も の と して、 さ ま ざ ま な ク ラ スの数の正弦 と 余弦を<br />

計算した と き に得 ら れる結果を示す。<br />

注 :<br />

F 有限実数を示す。<br />

* 浮動小数点無効算術オペランド (#IA) 例外を示す。<br />

ソ ー ス ・ オペラ ン ド が許容可能な範囲外の場合は、 FPU ステータス ・ ワー ド内の C2 フ<br />

ラグがセッ ト され、 ST(0) レ ジスタの値は変わらない。 この命令は、 ソ ース ・ オペラン ド<br />

が範囲外の と き に例外を発生さ せない。 C2 フ ラグを調べて範囲外条件の有無を確認する<br />

のはプログラムの責任である。 ソース値が± 2 63 の範囲外の場合は、 2 π の該当す る整数<br />

倍を引 く か、 または除数を 2 π として FPREM 命令を使用すれば、 ソ ー ス値を命令の許<br />

容範囲内に縮小で き る。<br />

操作<br />

SRC DEST<br />

ST(0)) ST(0) Cosine ST(1) Sine<br />

−∞ * *<br />

−F −1 ~ +1 −1 ~ +1<br />

−0 +1 −0<br />

+0 +1 +0<br />

+F −1 ~ +1 −1 ~ +1<br />

+∞ * *<br />

NaN NaN NaN<br />

IF ST(0) < 263 THEN<br />

C2 ← 0;<br />

TEMP ← cosine(ST(0));<br />

ST(0) ← sine(ST(0));<br />

TOP ← TOP − 1;<br />

ST(0) ← TEMP;<br />

ELSE (* source operand out of range *)<br />

C2 ← 1;<br />

FI:<br />

3:534 第 3 巻 : IA-32 基本命令リファレンス


FSINCOS—Sine and Cosine ( 続き )<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト さ<br />

れ、 スタック ・ オーバフローが発生した場合は 1 にセッ ト<br />

される。<br />

不正確結果例外 (#P) が発生した場合は、 丸めの方向を示<br />

す。 0 = 切り上げなし、 1 = 切り上げ。<br />

C2 ソース・オペランドが± 2 63 の範囲外の場合は 1 にセッ ト<br />

され、 範囲内の場合は 0 にクリアされる。<br />

C0、 C3 未定義。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

#IA ソース・オペランドがSNaN 値であるか、 ∞であるか、 ま<br />

たはそのフ ォ ーマッ ト がサポー ト されていない場合。<br />

#D ソ ー ス ・ オペラ ン ド がデ ノ ー マル値である場合。<br />

#U 結果が小さすぎて、 デスティネーション・フォーマットで 表現で き ない場合。<br />

#P 値がデステ ィ ネ ーシ ョ ン ・ フ ォ ーマ ッ ト では正確に表現で<br />

きない場合。<br />

保護モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

実アドレス・モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:535


FSQRT—Square Root<br />

オペコード 命令 説明<br />

D9 FA FSQRT ST(0) の平方根を計算し、結果を ST(0) にストアする。<br />

説明<br />

ST(0) レ ジ ス タ の ソ ー ス値の平方根を計算し、 結果を ST(0) にス トアする。<br />

以下の表に、 オーバフローもアンダフローも発生しないものとして、 さまざまなクラス<br />

の数の平方根を計算した と き に得られる結果を示す。<br />

SRC (ST(0)) DEST (ST(0))<br />

−∞ *<br />

−F *<br />

−0 −0<br />

+0 +0<br />

+F +F<br />

+∞ +∞<br />

NaN NaN<br />

注 :<br />

F 有限実数を示す。<br />

* 浮動小数点無効算術オペランド (#IA) 例外を示す。<br />

操作<br />

ST(0) ← SquareRoot(ST(0));<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト され<br />

る。<br />

不正確結果例外 (#P) が発生した場合は、 丸めの方向を示<br />

す。 0 = 切り上げなし、 1 = 切り上げ。<br />

C0、 C2、 C3 未定義。<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

#IA ソース・オペランドがSNaN 値であるか、 ま たはその<br />

フォーマットがサポートされていない場合。<br />

ソース・オペランドが負の値( ただし、 -0 は除 く ) である<br />

場合。<br />

#D ソ ー ス ・ オペラ ン ド がデ ノ ー マル値である場合。<br />

#P 値がデステ ィ ネ ーシ ョ ン ・ フ ォ ーマ ッ ト では正確に表現で<br />

きない場合。<br />

3:536 第 3 巻 : IA-32 基本命令リファレンス


FSQRT—Square Root ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

保護モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

実アドレス・モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:537


FST/FSTP—Store Real<br />

オペコード 命令 説明<br />

D9 /2 FST m32real ST(0) を m32real にコピーする。<br />

DD /2 FST m64real ST(0) を m64real にコピーする。<br />

DD D0+i FST ST(i) ST(0) を ST(i) にコピーする。<br />

D9 /3 FSTP m32real ST(0) を m32real にコピーし、レジスタ・スタックをポップする。<br />

DD /3 FSTP m64real ST(0) を m64real にコピーし、レジスタ・スタックをポップする。<br />

DB /7 FSTP m80real ST(0) を m80real にコピーし、レジスタ・スタックをポップする。<br />

DD D8+i FSTP ST(i) ST(0) を ST(i) にコピーし、レジスタ・スタックをポップする。<br />

説明<br />

ST(0) レジスタの値をデスティネーション・オペランドにコピーする。 デスティネーショ<br />

ン ・ オペランドには、 メモリ ・ ロケーションまたは FPU レジスタ ・ スタック内の別のレ<br />

ジ ス タ を使用で き る。 値を メ モ リ にス ト アする と き は、 値は単精度実数 ま たは倍精度実<br />

数のフ ォ ーマ ッ ト に変換される。<br />

FSTP 命令は、 FST 命令 と 同じ操作を実行した後に、 レ ジ ス タ ・ ス タ ッ ク を ポ ッ プす る。<br />

レジスタ ・ スタックをポップするため、 プロセッサは ST(0) レジスタを空としてマーク<br />

し、 スタ ッ ク ・ ポインタ (TOP) を 1 インク リメントする。 FSTP 命令は、 値を メ モ リ に拡<br />

張実数フ ォ ー マ ッ ト で も ス ト アで き る。<br />

デステ ィ ネーシ ョ ン ・ オペラン ド がメモ リ ・ ロケーシ ョ ンの場合、 このオペラン ド はデ<br />

スティネーション値の最初のバイトがストアされるアドレスを指定する。 デスティネー<br />

シ ョ ン ・ オペラン ド がレジスタの場合、 このオペラン ド はレジスタ ・ スタ ッ ク内のス<br />

タ ッ ク の ト ッ プか ら 相対的に レ ジ ス タ を指定す る。<br />

デス テ ィ ネ ー シ ョ ンのサイ ズが単精度実数 ま たは倍精度実数の場合、 ス ト ア さ れる値の<br />

仮数は (FPU 制御ワ ー ド の RC フ ィ ール ド に よ って指定された丸めモー ド に従って ) デス<br />

テ ィ ネーシ ョ ンの幅に丸められ、 指数はデステ ィ ネーシ ョ ン ・ フ ォ ーマッ ト の幅とバイ<br />

アスに変換される。 ス ト アされる値が大きすぎてデステ ィ ネーシ ョ ン ・ フ ォ ーマッ ト で<br />

表現で き ない場合は、 数値オ ー バフ ロ ー例外 (#0) が発生し、 その例外がマス ク されてい<br />

ない場合はデスティネーション・オペランドには何の値もストアされない。 ストアされ<br />

る値がデノーマル値であっても、 デノーマル例外(#D) は発生しない。 この条件が単に数<br />

値アンダフ ロ ー例外 (#U) 条件 と して報告される だけである。<br />

ストアされる値が±0、 ±∞、 または NaN の場合は、 仮数およ び指数の最下位ビ ッ ト が<br />

デステ ィ ネー シ ョ ン ・ フ ォ ーマ ッ ト に合わせて切り捨て られる。 こ の操作では、 値のア<br />

イデンテ ィ ティが 0、 ∞、 または NaN として保存される。<br />

デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド が空でないレ ジ ス タ の場合は、 無効操作例外は発生し<br />

ない。<br />

操作<br />

DEST ← ST(0);<br />

IF instruction = FSTP<br />

THEN<br />

PopRegisterStack;<br />

FI;<br />

3:538 第 3 巻 : IA-32 基本命令リファレンス


FST/FSTP—Store Real ( 続き )<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト され<br />

る。<br />

不正確結果例外 (#P) が発生した場合は、 丸めの方向を示<br />

す。 0 = 切り上げなし、 1 = 切り上げ。<br />

C0、 C2、 C3 未定義。<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

#IA ソース・オペランドがSNaN 値であるか、 ま たはその<br />

フォーマットがサポートされていない場合。<br />

#U 結果が小さすぎて、 デスティネーション・フォーマットで 表現で き ない場合。<br />

#O 結果が大きすぎて、 デスティネーション・フォーマットで 表現で き ない場合。<br />

#P 値がデステ ィ ネ ーシ ョ ン ・ フ ォ ーマ ッ ト では正確に表現で<br />

きない場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) デステ ィ ネー シ ョ ンが書き込み不可能なセグメ ン ト にある<br />

場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタを使用してメモリがア<br />

クセスされ、 レジスタの内容が NULL セグメン ト ・ セレ<br />

クタであった場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:539


FST/FSTP—Store Real ( 続き )<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:540 第 3 巻 : IA-32 基本命令リファレンス


FSTCW/FNSTCW—Store Control Word<br />

オペコード 命令 説明<br />

9B D9 /7 FSTCW m2byte 未処理のマスクされていない浮動小数点定例外の有無をチェックし<br />

た後、FPU 制御ワードを m2byte にストアする。<br />

D9 /7 FNSTCW m2byte 未処理のマスクされていない浮動小数点定例外の有無をチェックし<br />

ないで、FPU 制御ワードを m2byte にストアする。<br />

説明<br />

これらの命令は、 FPU 制御ワ ー ド の現在値を メ モ リ 内の指定 さ れたデス テ ィ ネ ー シ ョ ン<br />

にス トアする。 FSTCW 命令は、 未処理のマス ク さ れていない浮動小数点例外の有無を<br />

チェックし、 例外を処理してから、 制御ワー ドをストアする。 FNSTCW 命令は こ の<br />

チェックを行わない。<br />

操作<br />

DEST ← FPUControlWord;<br />

FPU 影響を受けるフラグ<br />

C0、 C1、 C2、 C3 フ ラ グは未定義。<br />

浮動小数点例外<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) デステ ィ ネー シ ョ ンが書き込み不可能なセグメ ン ト にある<br />

場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタを使用してメモリがア<br />

クセスされ、 レジスタの内容が NULL セグメン ト ・ セレ<br />

クタであった場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:541


FSTCW/FNSTCW—Store Control Word ( 続き )<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:542 第 3 巻 : IA-32 基本命令リファレンス


FSTENV/FNSTENV—Store FPU Environment<br />

オペコード 命令 説明<br />

9B D9 /6 FSTENV m14/28byte 未処理のマスクされていない浮動小数点例外の有無をチェックした<br />

後、FPU 環境を m14byte または m28byte にストアする。次に、す<br />

べての浮動小数点例外をマスクする。<br />

D9 /6 FNSTENV m14/28byte 未処理のマスクされていない浮動小数点例外の有無をチェックしな<br />

いで、FPU 環境を m14byte または m28byte にストアする。次に、<br />

すべての浮動小数点例外をマスクする。<br />

説明<br />

現在の FPU 動作環境をデス テ ィ ネ ー シ ョ ン ・ オペラ ン ド で指定された メ モ リ ・ ロ ケ ー<br />

シ ョ ン にセー ブし、 次にすべての浮動小数点例外をマス ク す る。 FPU 動作環境は、 FPU<br />

制御ワード、 ステータス・ ワード 、 タグ・ ワード 、 命令ポインタ、 データ・ ポインタ、 最<br />

後のオペコ ー ド か ら な っ てい る。 プ ロ セ ッ サの動作モ ー ド ( 保護ま たは実ア ド レ ス ) およ<br />

び現在のオペラン ド ・ サイズ属性 (16 ビッ トまたは32 ビッ ト ) に応じて、 メモ リ にス ト<br />

ア される動作環境の レ イ ア ウ ト については、 『IA-32 インテル ® アーキテクチャ ・ ソフ ト<br />

ウ ェ ア ・ デ ィ ベロ ッ パ ー ズ ・ マニ ュ アル、 上巻』 を参照の こ と 。 ( 仮想 8086 モー ドでは、<br />

実ア ド レス ・ モー ド のレ イアウ ト が使用される。 )<br />

FSTENV 命令は、 未処理のマス ク さ れていない浮動小数点例外の有無をチ ェ ッ ク し、 例<br />

外を処理してから、 FPU 環境を ス ト アする。 FNSTENV 命令は こ のチ ェ ッ ク を行わない。<br />

セ ー ブ さ れた イ メ ー ジ は、 命令ス ト リ ー ム内の FSTENV/FNSTENV 命令よ り 前のすべて<br />

の浮動小数点命令が実行 さ れた後の FPU の状態を反映してい る。<br />

これらの命令は、 FPU 命令お よ びデ ー タ両ポ イ ン タ へのア ク セス を可能にす る ので、 例<br />

外ハン ド ラ に使用 さ れる こ と が多い。 環境は一般的にプ ロ シ ー ジ ャ ・ ス タ ッ ク にセー ブ<br />

さ れる。 環境をセー ブした後にすべての例外をマス ク す る と 、 浮動小数点例外に よ る例<br />

外ハン ド ラへの割り込みがかけ られな く なる。<br />

操作<br />

DEST(FPUControlWord) ← FPUControlWord;<br />

DEST(FPUStatusWord) ← FPUStatusWord;<br />

DEST(FPUTagWord) ← FPUTagWord;<br />

DEST(FPUDataPointer) ← FPUDataPointer;<br />

DEST(FPUInstructionPointer) ← FPUInstructionPointer;<br />

DEST(FPULastInstructionOpcode) ← FPULastInstructionOpcode;<br />

FPU 影響を受けるフラグ<br />

C0、 C1、 C2、 C3 フ ラ グは未定義。<br />

浮動小数点例外<br />

なし。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:543


FSTENV/FNSTENV—Store FPU Environment ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

保護モード例外<br />

#GP(0) デステ ィ ネー シ ョ ンが書き込み不可能なセグメ ン ト にある<br />

場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタを使用してメモリがア<br />

クセスされ、 レジスタの内容が NULL セグメン ト ・ セレ<br />

クタであった場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )。<br />

VHPT データ・ フォ ルト 、 ネスト さ れた TLB フォルト 、<br />

データ TLB フォルト 、 代替データ TLB フォルト 、 データ・<br />

ペー ジ 不在フ ォ ルト 、 デー タ NaT ペー ジ参照アボー ト 、<br />

データ・キー・ミス・フォルト、データ・キー許可フォル<br />

ト 、 データ・ アク セス権フォ ルト 、 データ・ アク セス・<br />

ビッ ト ・ フォルト 、 データ・ ダーティ ・ ビッ ト ・ フォルト 。<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:544 第 3 巻 : IA-32 基本命令リファレンス


FSTSW/FNSTSW—Store Status Word<br />

オペコード 命令 説明<br />

9B DD /7 FSTSW m2byte 未処理のマスクされていない浮動小数点例外の有無をチェックした<br />

後、FPU ステータス・ワードを m2byte にストアする。<br />

9B DF E0 FSTSW AX 未処理のマスクされていない浮動小数点例外の有無をチェックした<br />

後、FPU ステータス・ワードを AX レジスタにストアする。<br />

DD /7 FNSTSW m2byte 未処理のマスクされていない浮動小数点例外の有無をチェックしな<br />

いで、FPU ステータス・ワードを m2byte にストアする。<br />

DF E0 FNSTSW AX 未処理のマスクされていない浮動小数点例外の有無をチェックしな<br />

いで、FPU ステータス・ワードを AX レジスタにストアする。<br />

説明<br />

FPU ステータス ・ ワー ドの現在値をデステ ィ ネーシ ョ ン ・ ロケーショ ンにス ト アする。<br />

デステ ィ ネーシ ョ ン ・ オペラン ド には、 2 バイ ト のメモリ ・ ロケーシ ョ ンまたは AX レ<br />

ジスタを使用できる。 FSTSW 命令は、 未処理のマス ク されていない浮動小数点例外の有<br />

無をチェ ッ クし、 例外を処理してから、 ステー タス ・ ワー ド をス ト アする。 FNSTSW 命<br />

令は このチェ ッ ク を行わない。<br />

この命令の FNSTSW AX 形式は、 主 と して分岐の方向が FPU 条件コ ー ド ・ フ ラ グの状態<br />

に依存する条件付き分岐 ( 例えば、 FPU の比較命令、 あるいは FPREM、 FPREM1、 また<br />

は FXAM 命令の後 ) で使用される。 この命令は、 さらに割り込みを使用しない環境で、<br />

( 例外フ ラ グを調べ る こ と に よ っ て ) 例外ハン ド ラ を呼び出す場合に も 使用される。<br />

FNSTSW AX 命令を実行す る と 、 プ ロセ ッ サは、 AX レ ジスタを更新してから その後の命<br />

令を実行する。 したがって、 AX レジスタにストアされているステータスは、 その前の<br />

FPU 命令の実行結果か ら与え ら れた も のであ る こ と が保証 される。<br />

操作<br />

DEST ← FPUStatusWord;<br />

FPU 影響を受けるフラグ<br />

C0、 C1、 C2、 C3 フ ラ グは未定義。<br />

浮動小数点例外<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:545


FSTSW/FNSTSW—Store Status Word ( 続き )<br />

保護モード例外<br />

#GP(0) デステ ィ ネー シ ョ ンが書き込み不可能なセグメ ン ト にある<br />

場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタを使用してメモリがア<br />

クセスされ、 レジスタの内容が NULL セグメン ト ・ セレ<br />

クタであった場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:546 第 3 巻 : IA-32 基本命令リファレンス


FSUB/FSUBP/FISUB—Subtract<br />

オペコード 命令 説明<br />

D8 /4 FSUB m32real ST(0) から m32real を引き、結果を ST(0) にストアする。<br />

DC /4 FSUB m64real ST(0) から m64real を引き、結果を ST(0) にストアする。<br />

D8 E0+i FSUB ST(0), ST(i) ST(0) から ST(i) を引き、結果を ST(0) にストアする。<br />

DC E8+i FSUB ST(i), ST(0) ST(i) から ST(0) を引き、結果を ST(i) にストアする。<br />

DE E8+i FSUBP ST(i), ST(0) ST(i) から ST(0) を引き、結果を ST(i) にストアし、レジスタ・ス<br />

タックをポップする。<br />

DE E9 FSUBP ST(1) から ST(0) を引き、結果を ST(1) にストアし、レジスタ・ス<br />

タックをポップする。<br />

DA /4 FISUB m32int ST(0) から m32int を引き、結果を ST(0) にストアする。<br />

DE /4 FISUB m16int ST(0) から m16int を引き、結果を ST(0) にストアする。<br />

説明<br />

デスティネーション ・ オペランドからソース ・ オペランドを引き、 結果をデスティネー<br />

ション・ロケーションにストアする。 デスティネーション・オペランドは、 常にFPU<br />

データ ・ レジスタである。 ソース ・ オペランドには、 レジスタまたはメモリ ・ ロケー<br />

シ ョ ン を使用で き る。 メ モ リ 内の ソ ー ス ・ オペラ ン ド に は、 単精度実数、 倍精度実数、<br />

ワ ー ド 整数、 ま たはシ ョ ー ト 整数のフ ォ ーマ ッ ト を使用でき る。<br />

この命令のオペランドなしバージョンでは、 ST(1) レジスタの内容から ST(0) レジスタの<br />

内容を引き、 結果を ST(1) レジスタにストアする。 1 オペラン ド ・ バージ ョ ンでは、<br />

ST(0) レジスタの内容からメモリ ・ ロケーションの内容( 実数値 ま たは整数値 ) を引き、<br />

結果を ST(0) にス トアする。 2 オペラン ド ・ バージ ョ ンでは、 ST(i) レジスタの内容から<br />

ST(0) レ ジスタの内容を引 く か、 またはその逆の減算を行 う。<br />

FSUBP 命令は、 減算の後に、 追加操作 と して FPU レジスタ ・ スタックをポップする。<br />

レジスタ ・ スタックをポップするため、 プロセッサは ST(0) レジスタを空としてマーク<br />

し、 スタ ッ ク ・ ポインタ (TOP) を 1 イ ン ク リ メ ン ト す る。 浮動小数点減算命令のオペラ<br />

ンドなしバージョンでは、 常にレジスタ・スタックのポップ操作を伴う。 一部のアセン<br />

ブラでは、 この命令のニーモニックは FSUBP ではな く FSUB になっている。<br />

FISUB 命令は、 整数の ソ ー ス ・ オペラ ン ド を拡張実数フ ォ ー マ ッ ト に変換してか ら 減算<br />

を行う。<br />

以下の表に、 アンダフローもオーバフローも発生しないものとして、 さまざまなクラス<br />

の数の減算を行ったと きに得られる結果を示す。 この表では、 DEST 値か ら SRC 値が引<br />

かれる (DEST - SRC = 結果 )。<br />

同符号の 2 つのオペラン ド の差が 0 のときは、 - ∞方向の丸めモー ド の場合を除いて、 結<br />

果は +0 になる。 - ∞方向の丸めモー ド の場合、 結果は -0 になる。 この命令は、 +0 - (-0)<br />

= +0、 -0 - (+0) = -0 の結果 も 保証す る。 ソ ー ス ・ オペラ ン ド は、 整数 0 のときは +0 とし<br />

て取り扱われる。<br />

一方のオペラ ン ド が∞の と き は、 結果は予期 さ れる符号の∞にな る。 両方のオペラ ン ド<br />

が同じ符号で無限大の と き は、 無効操作例外が発生す る。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:547


FSUB/FSUBP/FISUB—Subtract ( 続き )<br />

表 1-9. FSUB の 0 と NaN<br />

SRC<br />

−∞ −F or −I −0 +0 +F or +I +∞ NaN<br />

−∞ * −∞ −∞ −∞ −∞ −∞NaN −F +∞ ±F or ±0 DEST DEST −F −∞ NaN<br />

DEST −0 +∞ −SRC ±0 −0 −SRC −∞ NaN<br />

+0 +∞ −SRC +0 ±0 −SRC −∞ NaN<br />

+F +∞ +F DEST DEST ±F or ±0 −∞ NaN<br />

+∞ +∞ +∞ +∞ +∞ +∞ * NaN<br />

NaN NaN NaN NaN NaN NaN NaN NaN<br />

注 :<br />

F 有限実数を示す。<br />

I 整数を示す。<br />

* 浮動小数点無効算術オペランド (#IA) 例外を示す。<br />

操作<br />

IF instruction is FISUB<br />

THEN<br />

DEST ← DEST − ConvertExtendedReal(SRC);<br />

ELSE (* source operand is real number *)<br />

DEST ← DEST − SRC;<br />

FI;<br />

IF instruction = FSUBP<br />

THEN<br />

PopRegisterStack<br />

FI;<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト され<br />

る。<br />

不正確結果例外 (#P) が発生した場合は、 丸めの方向を示<br />

す。 0 = 切り上げなし、 1 = 切り上げ。<br />

C0、 C2、 C3 未定義。<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

#IA ソース・オペランドがSNaN 値であるか、 ま たはその<br />

フォーマットがサポートされていない場合。<br />

両方のオペラ ン ド の符号が同じ で、絶対値が無限大の場合。<br />

#D ソ ー ス ・ オペラ ン ド がデ ノ ー マル値である場合。<br />

#U 結果が小さすぎて、 デスティネーション・フォーマットで 表現で き ない場合。<br />

#O 結果が大きすぎて、 デスティネーション・フォーマットで 表現で き ない場合。<br />

3:548 第 3 巻 : IA-32 基本命令リファレンス


FSUB/FSUBP/FISUB—Subtract ( 続き )<br />

#P 値がデステ ィ ネ ーシ ョ ン ・ フ ォ ーマ ッ ト では正確に表現で<br />

きない場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタを使用してメモリがア<br />

クセスされ、 レジスタの内容が NULL セグメン ト ・ セレ<br />

クタであった場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ・フォル ト、ネス ト された TLB フォルト、デー<br />

タ TLB フォルト、代替データTLB フォルト、データ・ペー<br />

ジ不在フ ォル ト、 データ NaT ページ参照アボー ト、 デー<br />

タ・キー・ミス・フォルト、 データ・キー許可フォルト、<br />

データ ・アクセス権フォルト、 データ ・アクセス・ ビッ ト ・<br />

フォルト、 データ・ダーティ ・ビット ・フォルト。<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:549


FSUBR/FSUBRP/FISUBR—Reverse Subtract<br />

オペコード 命令 説明<br />

D8 /5 FSUBR m32real m32real から ST(0) を引き、結果を ST(0) にストアする。<br />

DC /5 FSUBR m64real m64real から ST(0) を引き、結果を ST(0) にストアする。<br />

D8 E8+i FSUBR ST(0), ST(i) ST(i) から ST(0) を引き、結果を ST(0) にストアする。<br />

DC E0+i FSUBR ST(i), ST(0) ST(0) から ST(i) を引き、結果を ST(i) にストアする。<br />

DE E0+i FSUBRP ST(i), ST(0) ST(0) から ST(i) を引き、結果を ST(i) にストアし、レジスタ・ス<br />

タックをポップする。<br />

DE E1 FSUBRP ST(0) から ST(1) を引き、結果を ST(1) にストアし、レジスタ・ス<br />

タックをポップする。<br />

DA /5 FISUBR m32int m32int から ST(0) を引き、結果を ST(0) にストアする。<br />

DE /5 FISUBR m16int m16int から ST(0) を引き、結果を ST(0) にストアする。<br />

説明<br />

ソース・オペランドからデスティネーション・オペランドを引き、 結果をデスティネー<br />

ション・ロケーションにストアする。 デスティネーション・オペランドは、 常にFPU<br />

データ ・ レジスタである。 ソース ・ オペランドには、 レジスタまたはメモリ ・ ロケー<br />

シ ョ ン を使用で き る。 メ モ リ 内の ソ ー ス ・ オペラ ン ド に は、 単精度実数、 倍精度実数、<br />

ワ ー ド 整数、 ま たはシ ョ ー ト 整数のフ ォ ーマ ッ ト を使用でき る。<br />

これらの命令は、 それぞれ FSUB、 FSUBP、 FISUB 命令の逆の操作を行 う 。 こ れ ら は、<br />

コーディングの効率向上をサポートする目的で設けられたものである。<br />

この命令のオペランドなしバージョンでは、 ST(0) レジスタの内容から ST(1) レジスタの<br />

内容を引き、 結果を ST(1) レジスタにストアする。 1 オペラン ド ・ バージ ョ ンでは、 メモ<br />

リ・ロケーションの内容( 実数値ま たは整数値 ) から ST(0) レジスタの内容を引き、 結果<br />

を ST(0) にス トアする。 2 オペラン ド ・ バージ ョ ンでは、 ST(0) レジスタの内容から ST(i)<br />

レ ジス タの内容を引 く か、 ま たはその逆の減算を行 う 。<br />

FSUBRP 命令は、 減算の後に、 追加操作 と して FPU レジスタ ・ スタックをポップする。<br />

レジスタ ・ スタックをポップするため、 プロセッサは ST(0) レジスタを空としてマーク<br />

し、 スタ ッ ク ・ ポインタ (TOP) を 1 イ ン ク リ メ ン ト す る。 浮動小数点逆減算命令のオペ<br />

ラ ン ド なしバー ジ ョ ンでは、 常に レ ジ ス タ ・ ス タ ッ ク のポ ッ プ操作を伴 う 。 一部のアセ<br />

ンブラでは、 この命令のニーモニックは FSUBRP ではな く FSUBR になっている。<br />

FISUBR 命令は、 整数の ソ ー ス ・ オペラ ン ド を拡張実数フ ォ ー マ ッ ト に変換してか ら 減<br />

算を行う。<br />

以下の表に、 アンダフローもオーバフローも発生しないものとして、 さまざまなクラス<br />

の数の減算を行ったと きに得られる結果を示す。 この表では、 SRC 値から DEST 値が引<br />

かれる (SCR - DEST = 結果 )。<br />

同符号の 2 つのオペラン ド の差が 0 のときは、 - ∞方向の丸めモー ド の場合を除いて、 結<br />

果は +0 になる。 - ∞方向の丸めモー ド の場合、 結果は -0 になる。 この命令は、 +0 - (-0)<br />

= +0、 -0 - (+0) = -0 の結果 も 保証す る。 ソ ー ス ・ オペラ ン ド は、 整数 0 のときは +0 とし<br />

て取り扱われる。<br />

一方のオペラ ン ド が∞の と き は、 結果は予期 さ れる符号の∞にな る。 両方のオペラ ン ド<br />

が同じ符号で無限大の と き は、 無効操作例外が発生す る。<br />

3:550 第 3 巻 : IA-32 基本命令リファレンス


FSUBR/FSUBRP/FISUBR—Reverse Subtract ( 続き )<br />

表 1-10. FSUBR の 0 と NaN<br />

SRC<br />

−∞ −F −0 +0 +F +∞ NaN<br />

−∞ * +∞ +∞ +∞ +∞ +∞ NaN<br />

DEST −F or −I −∞ ±F or ±0 −DEST −DEST +F +∞ NaN<br />

−0 −∞ SRC ±0 +0 SRC +∞ NaN<br />

+0 −∞ SRC −0 ±0 SRC +∞ NaN<br />

+F or +I −∞ −F−DEST −DEST ±F or ±0 +∞ NaN<br />

+∞ −∞ −∞ −∞ −∞ −∞ * NaN<br />

NaN NaN NaN NaN NaN NaN NaN NaN<br />

注 :<br />

F 有限実数を示す。<br />

I 整数を示す。<br />

* 浮動小数点無効算術オペランド (#IA) 例外を示す。<br />

操作<br />

IF instruction is FISUBR<br />

THEN<br />

DEST ← ConvertExtendedReal(SRC) − DEST;<br />

ELSE (* source operand is real number *)<br />

DEST ← SRC − DEST;<br />

FI;<br />

IF instruction = FSUBRP<br />

THEN<br />

PopRegisterStack<br />

FI;<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト され<br />

る。<br />

不正確結果例外 (#P) が発生した場合は、 丸めの方向を示<br />

す。 0 = 切り上げなし、 1 = 切り上げ。<br />

C0、 C2、 C3 未定義。<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

#IA ソース・オペランドがSNaN 値であるか、 ま たはその<br />

フォーマットがサポートされていない場合。<br />

両方のオペラ ン ド の符号が同じ で、 絶対値が無限大の場<br />

合。<br />

#D ソ ー ス ・ オペラ ン ド がデ ノ ー マル値である場合。<br />

#U 結果が小さすぎて、 デスティネーション・フォーマットで 表現で き ない場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:551


FSUBR/FSUBRP/FISUBR—Reverse Subtract ( 続き )<br />

#O 結果が大きすぎて、 デスティネーション・フォーマットで 表現で き ない場合。<br />

#P 値がデステ ィ ネ ーシ ョ ン ・ フ ォ ーマ ッ ト では正確に表現で<br />

きない場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタを使用してメモリがア<br />

クセスされ、 レジスタの内容が NULL セグメン ト ・ セレ<br />

クタであった場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

3:552 第 3 巻 : IA-32 基本命令リファレンス


FSUBR/FSUBRP/FISUBR—Reverse Subtract ( 続き )<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:553


FTST—TEST<br />

オペコード 命令 説明<br />

D9 E4 FTST ST(0) を 0.0 と比較する。<br />

説明<br />

ST(0) レジスタの値を 0.0 と比較し、 結果に従って FPU ステータス ・ ワー ド内の条件<br />

コード ・フラグC0、 C2、 C3 をセッ ト する ( 以下の表を参照 )。<br />

比較結果 C3 C2 C0<br />

ST(0) > 0.0 0 0 0<br />

ST(0) < 0.0 0 0 1<br />

ST(0) = 0.0 1 0 0<br />

順序化不可能 1 1 1<br />

こ の命令は 「順序化不可能比較」 を行 う 。 順序化不可能比較は、 比較 さ れる両数値の ク<br />

ラスのチェッ ク も行う (3:559 ページの 「FXAM—Examine」 を参照 )。 ST(0) レジスタの<br />

値が NaN であるか、 またはそのフ ォ ーマッ ト が未定義の場合は、 条件コ ー ド ・ フラグが<br />

「順序化不可能」 に設定 さ れる。<br />

ゼ ロ の符号は無視 さ れる。 すなわ ち、 -0.0 = +0.0 である。<br />

操作<br />

CASE (relation of operands) OF<br />

Not comparable: C3, C2, C0 ← 111;<br />

ST(0) > 0.0: C3, C2, C0 ← 000;<br />

ST(0) < 0.0: C3, C2, C0 ← 001;<br />

ST(0) = 0.0:<br />

ESAC;<br />

C3, C2, C0 ← 100;<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト さ<br />

れ、 発生しなか っ た場合は 0 にクリアされる。<br />

C0、 C2、 C3 上記の表を参照。<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

#IA 一方ま たは両方のオペラ ン ド が NaN 値であるか、 ま たは<br />

その フ ォ ー マ ッ ト がサポ ー ト さ れていない場合。<br />

#D 一方ま たは両方のオペラ ン ド がデ ノ ーマル値である場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

3:554 第 3 巻 : IA-32 基本命令リファレンス


FTST—TEST ( 続き )<br />

保護モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

実アドレス・モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:555


FUCOM/FUCOMP/FUCOMPP—Unordered Compare Real<br />

オペコード 命令 説明<br />

DD E0+i FUCOM ST(i) ST(0) を ST(i) と比較する。<br />

DD E1 FUCOM ST(0) を ST(1) と比較する。<br />

DD E8+i FUCOMP ST(i) ST(0) を ST(i) と比較し、レジスタ・スタックをポップする。<br />

DD E9 FUCOMP ST(0) を ST(1) と比較し、レジスタ・スタックをポップする。<br />

DA E9 FUCOMPP ST(0) を ST(1) と比較し、レジスタ・スタックを 2 回ポップする。<br />

説明<br />

ST(0) および ST(i) レ ジ ス タ の内容の順序化不可能比較を行い、 結果に従 っ て FPU ステー<br />

タス ・ ワー ド内の条件コー ド ・ フラグ C0、 C2、 C3 をセッ ト する ( 下記の表を参照 )。 オ<br />

ペラン ド を指定しなかった場合は、 ST(0) および ST(1) レ ジ ス タ の内容が比較 さ れる。 ゼ<br />

ロの符号は無視される。 すなわち、 -0.0 = +0.0 である。<br />

比較結果 C3 C2 C0<br />

ST0 > ST(i) 0 0 0<br />

ST0 < ST(i) 0 0 1<br />

ST0 = ST(i) 1 0 0<br />

順序化不可能 a<br />

1 1 1<br />

a. マスクされていない無効算術オペランド (#IA) 例外が発<br />

生した場合、フラグはセットされない。<br />

順序化不可能比較は、 比較 さ れる両数値の ク ラ スのチ ェ ッ ク を行 う (3:559 ページの<br />

「FXAM—Examine」 を参照 )。 FUCOM 命令では、 一方 ま たは両方のオペラ ン ド が SNaN<br />

である か、 ま たは それ ら の フ ォ ー マ ッ ト がサポ ー ト さ れていない と き だけ に無効算術オ<br />

ペラン ド例外 (#IA) を発生させる という点を除いて、 FUCOM 命令の操作は FCOM 命令<br />

の操作 と 同じである。 QNaN の場合は、 条件 コ ー ド ・ フ ラ グが順序化不可能に設定 さ れ<br />

る が、 例外は発生しない。 それに対して、 一方ま たは両方のオペラ ン ド がいずれかの種<br />

類の NaN 値であるか、 またはそれらのフ ォ ーマ ッ ト がサポ ー ト されていない と き は、<br />

FCOM 命令は無効操作例外を発生 さ せる。<br />

FCOM 命令の場合 と 同様に、 操作の結果に よ っ て無効算術オペラ ン ド 例外が発生す る場<br />

合は、 例外がマス ク さ れてい る場合だけ条件 コ ー ド ・ フ ラ グがセ ッ ト さ れる。<br />

FUCOMP 命令は比較操作の後に レ ジ ス タ ・ ス タ ッ ク を ポ ッ プし、 FUCOMPP 命令は比較<br />

操作の後に レ ジ ス タ ・ ス タ ッ ク を 2 回ポップする。 レジスタ ・ スタ ッ クをポップするた<br />

め、 プロセ ッ サは ST(0) レジスタを空としてマークし、 スタック ・ ポインタ (TOP) を 1<br />

インク リ メン トする。<br />

操作<br />

CASE (relation of operands) OF<br />

ST > SRC: C3, C2, C0 ← 000;<br />

ST < SRC: C3, C2, C0 ← 001;<br />

ST = SRC: C3, C2, C0 ← 100;<br />

ESAC;<br />

IF ST(0) or SRC = QNaN, but not SNaN or unsupported format<br />

THEN<br />

C3, C2, C0 ← 111;<br />

3:556 第 3 巻 : IA-32 基本命令リファレンス


FUCOM/FUCOMP/FUCOMPP—Unordered Compare Real ( 続き )<br />

ELSE (* ST(0) or SRC is SNaN or unsupported format *)<br />

#IA;<br />

IF FPUControlWord.IM = 1<br />

THEN<br />

C3, C2, C0 ← 111;<br />

FI;<br />

FI;<br />

IF instruction = FUCOMP<br />

THEN<br />

PopRegisterStack;<br />

FI;<br />

IF instruction = FUCOMPP<br />

THEN<br />

PopRegisterStack;<br />

PopRegisterStack;<br />

FI;<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト され<br />

る。<br />

C0、 C2、 C3 前ペー ジの表を参照。<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

#IA 一方ま たは両方のオペラ ン ド が SNaN 値であるか、 または<br />

それらのフ ォ ーマッ ト がサポー ト されていない場合。<br />

QNaN 値が検出されても、 無効オペラン ド例外は発生しな<br />

い。<br />

#D 一方ま たは両方のオペラ ン ド がデ ノ ーマル値である場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

保護モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

実アドレス・モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:557


FWAIT—Wait<br />

本章の 「WAIT」 を参照のこ と。<br />

3:558 第 3 巻 : IA-32 基本命令リファレンス


FXAM—Examine<br />

.<br />

オペコード 命令 説明<br />

D9 E5 FXAM ST(0) の値または数値をクラスに分類する。<br />

説明<br />

ST(0) レジスタの内容を調べ、 FPU ステータス ・ ワー ド内の条件コー ド ・ フラグ C0、<br />

C2、 C3 を設定して ST(0) レ ジス タの値ま たは数値の ク ラ スを示す ( 下表を参照 )。<br />

クラス C3 C2 C0<br />

サポートされていない 0 0 0<br />

NaN 0 0 1<br />

通常の有限値 0 1 0<br />

無限大 0 1 1<br />

ゼロ 1 0 0<br />

空 1 0 1<br />

デノーマル数 1 1 0<br />

C1 フ ラグは、 レ ジスタが空であるか値がロ ー ド されているかに関係な く 、 ST(0) の値の<br />

符号に設定 さ れる。<br />

操作<br />

C1 ← sign bit of ST; (* 0 for positive, 1 for negative *)<br />

CASE (class of value or number in ST(0)) OF<br />

Unsupported: C3, C2, C0 ← 000;<br />

NaN: C3, C2, C0 ← 001;<br />

Normal: C3, C2, C0 ← 010;<br />

Infinity: C3, C2, C0 ← 011;<br />

Zero: C3, C2, C0 ← 100;<br />

Empty: C3, C2, C0 ← 101;<br />

Denormal:<br />

ESAC;<br />

C3, C2, C0 ← 110;<br />

FPU 影響を受けるフラグ<br />

C1 ST(0) の値の符号に設定される。<br />

C0、 C2、 C3 上記の表を参照。<br />

浮動小数点例外<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

保護モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:559


FXAM—Examine ( 続き )<br />

実アドレス・モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

3:560 第 3 巻 : IA-32 基本命令リファレンス


FXCH—Exchange Register Contents<br />

オペコード 命令 説明<br />

D9 C8+i FXCH ST(i) ST(0) と ST(i) の内容を入れ換える。<br />

D9 C9 FXCH ST(0) と ST(1) の内容を入れ換える。<br />

説明<br />

ST(0) レジスタの内容と ST(i) レジスタの内容を入れ換える。 ソース ・ オペランドが指定<br />

されていない場合は、 ST(0) と ST(1) の内容が入れ換え られる。<br />

この命令によって、 FPU レジスタ ・ スタックの値をスタックのト ップである [ST(0)] に転<br />

送する単純な手段が提供される。 したがって、 転送された値は、 ST(0) の値だけを操作で<br />

き る浮動小数点命令だけ に よ っ て操作で き る よ う にな る。 例えば、 以下の命令シ ー ケ ン<br />

スでは、 レジスタ ・ スタ ッ クの ト ップから 3 番目の レ ジ ス タ の平方根を計算する。<br />

FXCH ST(3);<br />

FSQRT;<br />

FXCH ST(3);<br />

操作<br />

IF number-of-operands is 1<br />

THEN<br />

temp ← ST(0);<br />

ST(0) ← SRC;<br />

SRC ← temp;<br />

ELSE<br />

temp ← ST(0);<br />

ST(0) ← ST(1);<br />

ST(1) ← temp;<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト さ<br />

れ、 発生しなか っ た場合は 0 にクリアされる。<br />

C0、 C2、 C3 未定義。<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

保護モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

実アドレス・モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:561


FXCH—Exchange Register Contents ( 続き )<br />

仮想 8086 モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

3:562 第 3 巻 : IA-32 基本命令リファレンス


FXTRACT—Extract Exponent and Significand<br />

オペコード 命令 説明<br />

D9 F4 FXTRACT ST(0) の値を指数と仮数に分け、指数を ST(0) にストアし、仮数を<br />

レジスタ・スタックにプッシュする。<br />

説明<br />

T(0) レ ジ ス タ内の ソ ー ス値を その指数 と 仮数に分け、 指数を ST(0) に ス ト アし、 仮数を<br />

レジスタ・スタックにプッシュする。 この操作後は、 新しいスタックのトップのST(0) レ ジ ス タ の内容は元の仮数の実数表現値にな る。 こ の値の符号 と 仮数は、 ソ ー ス ・ オペ<br />

ランドにあった符号と仮数と同じであり、 指数は 3FFFH ( 真のゼロの指数に対してバイ<br />

アスがかけられた値 ) である。 ST(1) レ ジス タの内容は、 元のオペラ ン ド の真の ( バイア<br />

スなし ) 指数の実数表現値であ る。 ( この命令が実行する操作は、 IEEE 推奨の logb(x) 関<br />

数のス ーパセ ッ ト である。 )<br />

この命令と F2XM1 命令は、 べ き乗お よ び範囲のス ケ ー リ ン グ操作を行 う 場合に有用で<br />

ある。 FXTRACT 命令は、 拡張実数フ ォ ー マ ッ ト の数値を ( 例えば、 印刷または表示す<br />

るために ) 10 進表現に変換する場合に も 有用である。<br />

浮動小数点ゼ ロ での除算例外 (#Z) がマスク されていて、 ソース ・ オペラン ド がゼロであ<br />

る場合は、 指数値 と して - ∞が ST(1) レジスタにストアされ、 ソース ・ オペランドの符<br />

号 と 同じ符号の 0 が ST(0) レジスタにストアされる。<br />

操作<br />

TEMP ← Significand(ST(0));<br />

ST(0) ← Exponent(ST(0));<br />

TOP← TOP − 1;<br />

ST(0) ← TEMP;<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト さ<br />

れ、 スタック ・ オーバフローが発生した場合は 1 にセッ ト<br />

される。<br />

C0、 C2、 C3 未定義。<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

ス タ ッ ク ・ オ ー バフ ロ ーが発生した場合。<br />

#IA ソース・オペランドがSNaN 値であるか、 ま たはその<br />

フォーマットがサポートされていない場合。<br />

#Z ST(0) レジスタのオペランドが± 0。<br />

#D ソ ー ス ・ オペラ ン ド がデ ノ ー マル値である場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:563


FXTRACT—Extract Exponent and Significand ( 続き )<br />

保護モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

実アドレス・モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

3:564 第 3 巻 : IA-32 基本命令リファレンス


FYL2X—Compute y ∗ log 2x<br />

オペコード 命令 説明<br />

D9 F1 FYL2X ST(1) を (ST(1) ∗ log2ST(0)) で置き換え、レジスタ・スタックを<br />

ポップする。<br />

説明<br />

(ST(1) ∗ log2 (ST(0))) を計算し、 結果を ST(1) レジスタにストアし、 FPU レジスタ ・ ス<br />

タックをポップする。 ST(0) のソース ・ オペラン ド はゼロでない正の数値でなければなら<br />

ない。<br />

以下の表に、 オーバフローもアンダフローも発生しないものとして、 さまざまなクラス<br />

の数の対数を計算したと きに得られる結果を示す。<br />

表 1-11. FYL2X の 0 と NaN<br />

注 :<br />

F 有限実数を示す。<br />

* 浮動小数点無効操作 (#IA) 例外を示す。<br />

** 浮動小数点ゼロでの除算 (#Z) 例外を示す。<br />

ゼ ロ での除算例外がマス ク さ れていて、 ST(0) レジスタの内容が± 0 であ る場合、 こ の命<br />

令は、 ソ ー ス ・ オペラン ド の符号 と 反対の符号の∞を ST(1) レジスタに返す。<br />

FYL2X 命令は、 以下に示す組み込み関数乗算を使用して、 任意の正の底を も つ対数の計<br />

算を最適化する よ う に設計されている。<br />

logbx = (log2b) -1 ∗ log2x 操作<br />

IF<br />

ST(0)<br />

−∞ −F +0 +0 +F +∞ NaN<br />

−∞ * * +∞ +∞ +∞ −∞NaN ST(1) −F * * ** ** ±F −∞ NaN<br />

−0 * * * * +0 * NaN<br />

+0 * * * * +0 * NaN<br />

+F * * ** ** ±F +∞ NaN<br />

+∞ * * −∞ −∞ −∞ +∞ NaN<br />

NaN NaN NaN NaN NaN NaN NaN NaN<br />

ST(1) ← ST(1) ∗ log2ST(0); PopRegisterStack;<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト され<br />

る。<br />

不正確結果例外 (#P) が発生した場合は、 丸めの方向を示<br />

す。 0 = 切り上げなし、 1 = 切り上げ。<br />

C0、 C2、 C3 未定義。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:565


FYL2X—Compute y ∗ log 2 x ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

#IA いずれかのオペラン ド が SNaN であるか、 またはその<br />

フォーマットがサポートされていない場合。<br />

ST(0) レジスタのソース ・ オペランドが負の有限値(-0 は<br />

除く ) である場合。<br />

#Z ST(0) レジスタのソース ・ オペランドが± 0 である場合。<br />

#D ソ ー ス ・ オペラ ン ド がデ ノ ー マル値である場合。<br />

#U 結果が小さすぎて、 デスティネーション・フォーマットで 表現で き ない場合。<br />

#O 結果が大きすぎて、 デスティネーション・フォーマットで 表現で き ない場合。<br />

#P 値がデステ ィ ネ ーシ ョ ン ・ フ ォ ーマ ッ ト では正確に表現で<br />

きない場合。<br />

保護モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

実アドレス・モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

3:566 第 3 巻 : IA-32 基本命令リファレンス


FYL2XP1—Compute y ∗ log 2(x +1)<br />

説明<br />

ε (0 の近似値 ) の対数 (ST(1) ∗ log2 (ST(0) + 1.0)) を計算し、 結果を ST(1) レジスタにスト<br />

アし、 FPU レジスタ ・ スタックをポップする。 ST(0) の ソ ー ス ・ オペラ ン ド は、 下記の<br />

範囲でなければな ら ない。<br />

± (1 - √ 2/2)<br />

ST(1) のソース ・ オペラン ドの範囲は、 ±∞である。 いずれかのソース ・ オペラン ドの値<br />

が許容範囲か ら 外れている場合は、 結果は未定義であ り 、 例外は発生しない。<br />

以下の表に、 アンダ フ ロ ー が発生しない も のして、 さ ま ざ ま な ク ラ スの数の ε の対数を<br />

計算した と き に得 ら れる結果を示す。<br />

注 :<br />

F 有限実数を示す。<br />

* 浮動小数点無効操作 (#IA) 例外を示す。<br />

この命令は、 0 の近似値 ε [ST(0) レジスタの値] に対して最適精度を発揮す る。 ε の値<br />

が小さい場合は、 ( ε +1) を引数と して FYL2X 命令を使用す る よ り も 、 FYL2XP1 命令を<br />

使用す る方が、 多 く の有効数字を残せる。 ( ε +1) の式は、 複利や年金の計算に よ く 見受<br />

けられる。 結果は、 ST(1) ソース ・ オペランドのスケール・ ファクタを含めると、 簡単に<br />

別の対数の底の値に変換でき る。 以下の等式は、 特定の対数の底のスケール ・ フ ァ ク タ<br />

の計算に使用される。 こ こ で、 n は FYL2XP1 命令の結果に求められる対数の底である。<br />

scale factor = logn 2<br />

操作<br />

I<br />

オペコード 命令 説明<br />

D9 F9 FYL2XP1 ST(1) を (ST(1) ∗ log2(ST(0) + 1.0)) で置き換え、レジスタ・スタッ<br />

クをポップする。<br />

表 1-12. FYL2XP1 の 0 と NaN<br />

−∞ −(1 − ( 2 ⁄ 2))<br />

to −0 −0<br />

ST(0)<br />

+0 +0 to +(1 − ( 2 ⁄<br />

2))<br />

+∞ NaN<br />

−∞ * +∞ * * −∞ −∞NaN ST(1) −F * +F +0 −0 −F −∞ NaN<br />

−0 * +0 +0 −0 −0 * NaN<br />

+0 * −0 −0 +0 +0 * NaN<br />

+F * −F −0 +0 +F +∞ NaN<br />

+∞ * −∞ * * +∞ +∞ NaN<br />

NaN NaN NaN NaN NaN NaN NaN NaN<br />

ST(1) ← ST(1) ∗ log2 (ST(0) + 1.0);<br />

PopRegisterStack;<br />

第 3 巻 : IA-32 基本命令リファレンス 3:567


FYL2XP1—Compute y ∗ log 2 (x +1) ( 続き )<br />

FPU 影響を受けるフラグ<br />

C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト され<br />

る。<br />

不正確結果例外 (#P) が発生し た場合は 、 丸めの方向を 示<br />

す。 0 = 切り 上げなし 、 1 = 切り 上げ。<br />

C0、 C2、 C3 未定義。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

浮動小数点例外<br />

#IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。<br />

#IA いずれかのオペラン ド が SNaN であるか、 またはその<br />

フォーマットがサポートされていない場合。<br />

#D ソ ー ス ・ オペラ ン ド がデ ノ ー マル値である場合。<br />

#U 結果が小さすぎて、 デスティネーション・フォーマットで 表現で き ない場合。<br />

#O 結果が大きすぎて、 デスティネーション・フォーマットで 表現で き ない場合。<br />

#P 値がデステ ィ ネ ーシ ョ ン ・ フ ォ ーマ ッ ト では正確に表現で<br />

きない場合。<br />

保護モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

実アドレス・モード例外<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

仮想 8086 モード例外<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

#NM CR0 の EM または TS がセッ ト された場合。<br />

3:568 第 3 巻 : IA-32 基本命令リファレンス


HLT—Halt<br />

オペコード 命令 説明<br />

F4 HLT Halt<br />

説明<br />

命令の実行を停止し、 プ ロ セ ッ サを HALT 状態にする。 イネーブルにされている割り込<br />

み、 NMI、 またはリセッ ト によ って実行は再開される。 HLT 命令の後で割 り 込み (NMI<br />

を含む ) を使用して実行を再開する場合、 セーブされている命令ポインタ (CS:EIP) は<br />

HLT 命令の次の命令を指している。<br />

HLT 命令は特権命令である。 プロセ ッ サが保護モー ド または仮想 8086 モー ドで動作して<br />

いる場合は、 HLT 命令を実行するには、 プログラムまたはプロシージャの特権レベルが<br />

0 でなければならない。<br />

操作<br />

IF Itanium System Environment THEN IA-32_Intercept(INST,HALT);<br />

Enter Halt state;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

IA-32_Intercept 強制命令イ ン タ ー セプ ト ・ フ ォ ル ト 。<br />

保護モード例外<br />

#GP(0) 現行特権レベルが 0 でない場合。<br />

実アドレス・モード例外<br />

なし。<br />

仮想 8086 モード例外<br />

#GP(0) 現行特権レベルが 0 でない場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:569


IDIV—Signed Divide<br />

オペコード 命令 説明<br />

F6 /7 IDIV r/m8 AX ( ただし、AH の内容は AL の符号拡張でなければならない ) を<br />

r/m バイトで符号付き除算する。<br />

( 結果 : AL= 商、AH= 剰余 )<br />

F7 /7 IDIV r/m16 DX:AX ( ただし、DX の内容は AX の符号拡張でなければならない )<br />

を r/m ワードで符号付き除算する。<br />

( 結果 : AX= 商、DX= 剰余 )<br />

F7 /7 IDIV r/m32 EDX:EAX ( ただし、EDX の内容は EAX の符号拡張でなければなら<br />

ない ) を r/m ダブルワードで符号付き除算する。<br />

( 結果 : EAX= 商、EDX= 剰余 )<br />

説明<br />

AL、 AX、 または EAX レジスタの値をソース ・ オペランドで( 符号付き で ) 割り、 結果<br />

をそれぞれAX、 DX:AX、 または EDX:EAX レジスタにストアする。 ソース ・ オペラン<br />

ド に は、 汎用レ ジ ス タ ま たは メ モ リ ・ ロ ケ ー シ ョ ン を使用で き る。 こ の命令の処理は、<br />

以下の表に示す よ う にオペラ ン ド ・ サイ ズに依存する。<br />

表 1-13. IDIV オペランド<br />

オペランド・サイズ 被除数 除数 商 剰余 商の範囲<br />

ワード / バイト AX r/m8 AL AH −128 ~ +127<br />

ダブルワード / ワード DX:AX r/m16 AX DX −32,768 ~ +32,767<br />

クワッドワード / ダブルワード EDX:EAX r/m32 EAX EDX −2 31 ~ 232 − 1<br />

整数でない結果は 0 に向か っ て切 り 捨て られる。 剰余の符号は、 常に被除数の符号 と 同<br />

じである。剰余の絶対値は、常に除数の絶対値より小さい。オーバフローは、OF フラグ<br />

ではな く、 #DE ( 除算エラ ー ) 例外で示される。<br />

操作<br />

IF SRC = 0<br />

THEN #DE; (* divide error *)<br />

FI;<br />

IF OpernadSize = 8 (* word/byte operation *)<br />

THEN<br />

temp ← AX / SRC; (* signed division *)<br />

IF (temp > 7FH) OR (temp < 80H)<br />

(* if a positive result is greater than 7FH or a negative result is less than 80H *)<br />

THEN #DE; (* divide error *) ;<br />

ELSE<br />

AL ← temp;<br />

AH ← AX SignedModulus SRC;<br />

FI;<br />

ELSE<br />

IF OpernadSize = 16 (* doubleword/word operation *)<br />

THEN<br />

temp ← DX:AX / SRC; (* signed division *)<br />

IF (temp > 7FFFH) OR (temp < 8000H)<br />

(* if a positive result is greater than 7FFFH *)<br />

(* or a negative result is less than 8000H *)<br />

THEN #DE; (* divide error *) ;<br />

3:570 第 3 巻 : IA-32 基本命令リファレンス


IDIV—Signed Divide ( 続き )<br />

FI;<br />

FI;<br />

ELSE<br />

AX ← temp;<br />

DX ← DX:AX SignedModulus SRC;<br />

FI;<br />

ELSE (* quadword/doubleword operation *)<br />

temp ← EDX:EAX / SRC; (* signed division *)<br />

IF (temp > 7FFFFFFFH) OR (temp < 80000000H)<br />

(* if a positive result is greater than 7FFFFFFFH *)<br />

(* or a negative result is less than 80000000H *)<br />

THEN #DE; (* divide error *) ;<br />

ELSE<br />

EAX ← temp;<br />

EDX ← EDXE:AX SignedModulus SRC;<br />

FI;<br />

影響を受けるフラグ<br />

CF、 OF、 SF、 ZF、 AF、 PF フ ラ グは未定義。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#DE ソース・オペランド ( 除数 ) が 0 である場合。<br />

デス テ ィ ネ ー シ ョ ン に対して符号付き の結果 ( 商 ) が大き<br />

すぎる場合。<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタを使用してメモリがア<br />

クセスされ、 レジスタの内容が NULL セグメン ト ・ セレ<br />

クタであった場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:571


IDIV—Signed Divide ( 続き )<br />

実アドレス・モード例外<br />

#DE ソース・オペランド ( 除数 ) が 0 である場合。<br />

デス テ ィ ネ ー シ ョ ン に対して符号付き の結果 ( 商 ) が大き<br />

すぎる場合。<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#DE ソース・オペランド ( 除数 ) が 0 である場合。<br />

デス テ ィ ネ ー シ ョ ン に対して符号付き の結果 ( 商 ) が大き<br />

すぎる場合。<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:572 第 3 巻 : IA-32 基本命令リファレンス


IMUL—Signed Multiply<br />

オペコード 命令 説明<br />

F6 /5 IMUL r/m8 AX← AL∗ r/m バイト<br />

F7 /5 IMUL r/m16 DX:AX ← AX ∗ r/m ワード<br />

F7 /5 IMUL r/m32 EDX:EAX ← EAX ∗ r/m ダブルワード<br />

0F AF /r IMUL r16,r/m16 ワード・レジスタ ← ワード・レジスタ ∗r/m ワード<br />

0F AF /r IMUL r32,r/m32 ダブルワード・レジスタ ← ダブルワード・レジスタ ∗ r/m ダブル<br />

ワード<br />

6B /r ib IMUL r16,r/m16,imm8 ワード・レジスタ ← r/m16 ∗ 符号拡張即値バイト<br />

6B /r ib IMUL r32,r/m32,imm8 ダブルワード・レジスタ ← r/m32 ∗ 符号拡張即値バイト<br />

6B /r ib IMUL r16,imm8 ワード・レジスタ ← ワード・レジスタ ∗ 符号拡張即値バイト<br />

6B /r ib IMUL r32,imm8 ダブルワード・レジスタ ← ダブルワード・レジスタ ∗ 符号拡張即<br />

値バイト<br />

69 /r iw IMUL r16,r/m16,imm16 ワード・レジスタ ← r/m16 ∗ 即値ワード<br />

69 /r id IMUL r32,r/m32,imm32 ダブルワード・レジスタ ← r/m32 ∗ 即値ダブルワード<br />

69 /r iw IMUL r16,imm16 ワード・レジスタ ← r/m16 ∗ 即値ワード<br />

69 /r id IMUL r32,imm32 ダブルワード・レジスタ ← r/m32 ∗ 即値ダブルワード<br />

説明<br />

2 つのオペラ ン ド の符号付き乗算を行 う 。 こ の命令には、 オペラ ン ド の数に応じ て下記<br />

の 3 つの形式がある。<br />

• 1 オペランド形式 : この形式は、 MUL 命令に使用されている形式 と 同じ である。 こ<br />

の形式では、 ( 汎用レ ジ ス タ ま たは メモ リ ・ ロ ケ ー シ ョ ン内の ) ソース ・オペランド<br />

に ( オペラン ド ・ サイズに応じて ) AL、 AX、 または EAX レジスタの値が掛けられ、<br />

結果がそれぞれ AX、 DX:AX、 または EDX:EAX レジスタにストアされる。<br />

• 2 オペランド形式 : この形式では、 デスティネーション・オペランド ( 第 1 オペラン<br />

ド ) にソース ・ オペランド ( 第 2 オペラン ド ) が掛けられる。 デスティネーション・<br />

オペラ ン ド は汎用レ ジ ス タ であ り 、 ソ ー ス ・ オペラ ン ド は即値、 汎用レ ジ ス タ、 ま<br />

たは メ モ リ ・ ロ ケ ー シ ョ ンである。 乗算後、 結果はデス テ ィ ネ ー シ ョ ン ・ オペラ ン<br />

ド・ロケーションにストアされる。<br />

• 3 オペランド形式 : この形式には、 デスティネーション・オペランド ( 第 1 オペラン<br />

ド ) と 2 つのソース ・ オペラン ド ( 第 2 および第3 オペラン ド ) が必要である。 こ の<br />

形式では、 第 1 のソース ・ オペラン ド ( 汎用レ ジ ス タ ま たは メ モ リ ・ ロ ケ ー シ ョ ン )<br />

に第 2 のソース ・ オペラン ド ( 即値 ) が掛け られる。 結果はデステ ィ ネ ーシ ョ ン ・ オ<br />

ペラン ド ( 汎用レ ジ ス タ ) にス トアされる。<br />

即値は、 オペラ ン ド と して使用 さ れる と 、 デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド の フ ォ ー<br />

マッ ト の長さに符号拡張される。<br />

結果の上位半分への有効ビ ッ ト のキ ャ リ ー があ っ た と き は、 CF および OF フラグがセッ<br />

ト される。 結果が結果の下位半分に収 ま っ た と き は、 CF および OF フラグがクリアされ る。<br />

IMUL 命令の 3 つの形式は、 積の長さが両オペランドの長さの 2 倍に計算される点では<br />

みな同じである。 1 オペランド形式では、 結果はデスティネーションの長さでストアさ<br />

れる。 しかし、 2 および 3 オペランド形式では、 結果はデスティネーションの長さに切<br />

り捨てられてからデスティネーション ・ レジスタにストアされる。 この切り捨てがある<br />

ので、 CF または OF フ ラ グをテス ト して、 有効ビ ッ ト の脱落がない よ う 保証する必要が<br />

ある。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:573


IMUL—Signed Multiply ( 続き )<br />

2 および 3 オペラン ド 形式には、 積の下位半分は両オペラン ド の符号のあ りなしに関係<br />

なく同じなので、 符号なしオペランドに対しても使用できる。 ただし、 CF および OF フ<br />

ラグを使用して、 結果の上位半分が非ゼロであるかど うかを判定する こ と はできない。<br />

操作<br />

IF (NumberOfOperands = 1)<br />

THEN IF (OperandSize = 8)<br />

THEN<br />

AX ← AL ∗ SRC (* signed multiplication *)<br />

IF ((AH = 00H) OR (AH = FFH))<br />

THEN CF = 0; OF = 0;<br />

ELSE CF = 1; OF = 1;<br />

FI;<br />

ELSE IF OperandSize = 16<br />

THEN<br />

DX:AX ← AX ∗ SRC (* signed multiplication *)<br />

IF ((DX = 0000H) OR (DX = FFFFH))<br />

THEN CF = 0; OF = 0;<br />

ELSE CF = 1; OF = 1;<br />

FI;<br />

ELSE (* OperandSize = 32 *)<br />

EDX:EAX ← EAX ∗ SRC (* signed multiplication *)<br />

IF ((EDX = 00000000H) OR (EDX = FFFFFFFFH))<br />

THEN CF = 0; OF = 0;<br />

ELSE CF = 1; OF = 1;<br />

FI;<br />

FI;<br />

ELSE IF (NumberOfOperands = 2)<br />

THEN<br />

temp ← DEST ∗ SRC (* signed multiplication; temp is double DEST size*)<br />

DEST ← DEST ∗ SRC (* signed multiplication *)<br />

IF temp ≠ DEST<br />

THEN CF = 1; OF = 1;<br />

ELSE CF = 0; OF = 0;<br />

FI;<br />

FI;<br />

FI;<br />

ELSE (* NumberOfOperands = 3 *)<br />

DEST ← SRC1 ∗ SRC2 (* signed multiplication *)<br />

temp ← SRC1 ∗ SRC2 (* signed multiplication; temp is double SRC1 size *)<br />

IF temp ≠ DEST<br />

THEN CF = 1; OF = 1;<br />

ELSE CF = 0; OF = 0;<br />

FI;<br />

3:574 第 3 巻 : IA-32 基本命令リファレンス


IMUL—Signed Multiply ( 続き )<br />

影響を受けるフラグ<br />

この命令の1 オペラ ン ド 形式では、 結果の上位半分への有効ビ ッ ト のキ ャ リ ー がある と<br />

きに CF および OF フ ラ グがセ ッ ト さ れ、 結果が結果の下位半分に収 ま る と き は ク リ ア さ<br />

れる。 命令の 2 および 3 オペラン ド形式では、 デステ ィ ネーシ ョ ン ・ オペラン ド ・ サイ<br />

ズに合わせるために結果を切り捨てなければならないと きは CF および OF フラグがセッ<br />

トされ、 結果がデスティネーション・オペランド ・サイズに収まるときはクリアされる。<br />

SF、 ZF、 AF、 PF フ ラ グは未定義。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタを使用してメモリがア<br />

クセスされ、 レジスタの内容が NULL セグメン ト ・ セレ<br />

クタであった場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:575


IMUL—Signed Multiply ( 続き )<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:576 第 3 巻 : IA-32 基本命令リファレンス


IN—Input from Port<br />

オペコード 命令 説明<br />

E4 ib IN AL,imm8 I/O ポート・アドレス imm8 から AL にバイトを入力する。<br />

E5 ib IN AX,imm8 I/O ポート・アドレス imm8 から AX にバイトを入力する。<br />

E5 ib IN EAX,imm8 I/O ポート・アドレス imm8 から EAX にバイトを入力する。<br />

EC IN AL,DX DX 内の I/O ポートから AL にバイトを入力する。<br />

ED IN AX,DX DX 内の I/O ポートから AX にワードを入力する。<br />

ED IN EAX,DX DX 内の I/O ポートから EAX にダブルワードを入力する。<br />

説明<br />

値をソ ース ・ オペラン ド ( 第 2 オペラン ド ) で指定された I/O ポー トからデスティネー<br />

ション・オペランド ( 第 1 オペラン ド ) にコピーする。 ソース・オペランドには、 バイ<br />

ト即値またはDX レジスタを使用できる。 デスティネーション・オペランドには、 アク<br />

セスされるポー ト のサイズ (8、 16、 または 32 ビッ ト ) に応じて、 それぞれ AL、 AX、 ま<br />

たは EAX レジスタを使用できる。 ソース ・ オペランド としてDX レジスタを使用する<br />

と、 I/O ポー ト ・アドレス 0 ~ 65,535 をアクセスできる。 バイ ト 即値を使用する と、 I/O<br />

ポー ト ・アドレス 0 ~ 255 をアクセスできる。<br />

アクセスされる I/O ポー トのサイズは、 8 ビットのI/O ポー トではオペコードによって決<br />

まり、 16 ビッ トおよび32 ビッ トのI/O ポー トでは命令のオペランド ・サイズ属性によっ<br />

て決ま る。<br />

マシン ・ コ ー ド ・ レベルでは、 I/O 命令は、 8 ビッ トのI/O ポー ト をアクセスするときは<br />

短 く なる。 こ の場合、 ポ ー ト ・ ア ド レ スの上位 8 ビッ トは0 になる。<br />

この命令は、 プロセッサの I/O ア ド レ ス空間にある I/O ポー トのアクセスだけに有用で<br />

ある。<br />

I/O トランザクションは、すべての先行するデータ・メモリ操作の後で実行される。これ<br />

以降のデータ・メモリ操作は、I/O トランザクションを実行できない。<br />

Itanium ベース・システム環境では、I/O ポートの参照は、IOBase レジスタによって指<br />

定される 64 ビット仮想アドレスに、4K バイト仮想ページ当たり 4 ポートずつマッピン<br />

グされる。オペレーティング・システムは、Itanium アーキテクチャの TLB を利用して、<br />

任意の 4 つの I/O ポートへのパーミッションを付与または拒否できる。I/O ポート空間<br />

は、オペレーティング・システム・コードによって、任意の 64 ビット物理メモリ・ロ<br />

ケーションにマッピングできる。CFLG.io = 1 かつ CPL > IOPL の場合は、TSS を参照<br />

して、I/O パーミッションを与えるかどうかを決定する。CFLG.io = 0 または CPL


IN—Input from Port ( 続き )<br />

操作<br />

IF ((PE = 1) AND ((VM = 1) OR (CPL > IOPL)))<br />

THEN (* Protected mode or virtual-8086 mode with CPL > IOPL *)<br />

IF (CFLG.io AND Any I/O Permission Bit for I/O port being accessed = 1)<br />

THEN #GP(0);<br />

FI;<br />

ELSE ( * Real-address mode or protected mode with CPL ≤ IOPL *)<br />

(* or virtual-8086 mode with all I/O permission bits for I/O port cleared *)<br />

FI;<br />

IF (Itanium_System_Environment THEN<br />

SRC_VA = IOBase | (Port{15:2}


IN—Input from Port ( 続き )<br />

仮想 8086 モード例外<br />

#GP(0) アクセスされる I/O ポー トのTSS にある対応する I/O パー<br />

ミッション・ビットのいずれかが1 である場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:579


INC—Increment by 1<br />

オペコード 命令 説明<br />

FE /0 INC r/m8 r/m バイトを 1 インクリメントする。<br />

FF /0 INC r/m16 r/m ワードを 1 インクリメントする。<br />

FF /0 INC r/m32 r/m ダブルワードを 1 インクリメントする。<br />

40+ rw INC r16 ワード・レジスタを 1 インクリメントする。<br />

40+ rd INC r32 ダブルワード・レジスタを 1 インクリメントする。<br />

説明<br />

CF フ ラ グの状態を変えないで、 オペラ ン ド に 1 を加える。 ソース ・ オペラン ド には、 レ<br />

ジス タ ま たは メモ リ ・ ロ ケ ーシ ョ ンを使用でき る。 こ の命令では、 CF フラグの状態を変<br />

えないでループ ・ カウンタを更新できる。 (CF フラグを更新するインクリメント操作を<br />

行うには、 値1 の即値オペラン ド を使用して ADD 命令を実行す る。 )<br />

操作<br />

DEST ← DEST - 1;<br />

影響を受けるフラグ<br />

CF フラグは影響を受けない。 OF、 SF、 ZF、 AF、 PF フラグが結果に従ってセット され<br />

る。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) オペラ ン ド が書き込み不可能なセグ メ ン ト にある場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタを使用してメモリがア<br />

クセスされ、 レジスタの内容が NULL セグメン ト ・ セレ<br />

クタであった場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

3:580 第 3 巻 : IA-32 基本命令リファレンス


INC—Increment by 1 ( 続き )<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:581


INS/INSB/INSW/INSD—Input from Port to String<br />

オペコード 命令 説明<br />

6C INS ES:(E)DI, DX バイトをポート DX から ES:(E)DI に入力する。<br />

6D INS ES:DI, DX ワードをポート DX から ES:DI に入力する。<br />

6D INS ES:EDI, DX ダブルワードをポート DX から ES:EDI に入力する。<br />

6C INSB バイトをポート DX から ES:(E)DI に入力する。<br />

6D INSW ワードをポート DX から ES:EDI に入力する。<br />

6D INSD ダブルワードをポート DX から ES:EDI に入力する。<br />

説明<br />

こ れ ら の命令は、 ソ ー ス ・ オペラ ン ド ( 第 2 オペラン ド ) で指定された I/O ポー トからデ<br />

スティネーション・オペランド ( 第 1 オペラン ド ) にデータをコピーする。 ソース ・ オ<br />

ペラン ド は、 I/O ポー ト ・アドレス 0 ~ 65535 にアクセスできる よ うに、 DX レジスタで<br />

なければならない。 8 ビットのI/O ポー トにアクセスする場合は、 ポー ト ・サイズはオペ<br />

コードによって決まる。 16 ビッ トまたは32 ビッ トのI/O ポー トにアクセスする場合は、<br />

ポー ト ・サイズはオペランド ・サイズ属性によって決まる。<br />

デステ ィ ネーシ ョ ン ・ オペラン ド は、 ア ド レス ES:EDI のメモリ ・ ロケーションである。<br />

オペラン ド ・ サイズ属性が 16 の場合は、 DI レジスタがデスティネーション ・ インデッ<br />

クス ・ レジスタとして使用される。 ES セグメン ト は、 セグメン ト ・ オーバライ ド ・ プレ<br />

フィックスでは無効にできない。<br />

INSB、 INSW、 INSD ニーモニッ クは、 それぞれ INS 命令のバイ ト 、 ワ ー ド 、 ダブル ワ ー<br />

ド・バージョンの別名である。INS 命令では、 "ES:EDI" を命令の中で明示的に指定しな<br />

ければならない。<br />

バイ ト、 ワー ド、 またはダブルワー ドが I/O ポ ー ト か ら メ モ リ ・ ロ ケ ー シ ョ ン に転送 さ<br />

れた後、 EDI レジスタは EFLAGS レジスタ内のEF フ ラ グの設定に従 っ て自動的に イ ン<br />

クリメントまたはデクリメントされる。 (DF フラグが0 である場合、 EDI レジスタはイ<br />

ンクリメント される。 DF フラグが1 である場合、 EDI レジスタはデクリメント される。<br />

EDI レジスタは、 バイト操作の場合は 1、 ワー ド操作の場合は 2、 ダブルワー ド操作の場<br />

合は 4、 それぞれインク リ メン ト またはデク リ メン ト される。<br />

INS、 INSB、 INSW、 INSD 命令は、 前に REP プリフィックスを付けることにより、 ECX<br />

バイ ト、 ワー ド、 またはダブルワー ドのブロ ッ ク入力を行う こ とができる。<br />

これらの命令は、 プロセッサの I/O ア ド レ ス空間にあ る I/O ポー トのアクセスだけに有<br />

用である。<br />

I/O トランザクションは、すべての先行するデータ・メモリ操作の後で実行される。これ<br />

以降のデータ・メモリ操作は、I/O トランザクションを実行できない。<br />

Itanium ベース・システム環境では、I/O ポートの参照は、IOBase レジスタによって指<br />

定される 64 ビット仮想アドレスに、4K バイト仮想ページ当たり 4 ポートずつマッピン<br />

グされる。オペレーティング・システムは、Itanium アーキテクチャの TLB を利用して、<br />

任意の 4 つの I/O ポートへのパーミッションを付与または拒否できる。I/O ポート空間<br />

は、オペレーティング・システム・コードによって、任意の 64 ビット物理メモリ・ロ<br />

ケーションにマッピングできる。CFLG.io = 1 かつ CPL > IOPL の場合は、TSS を参照<br />

して、I/O パーミッションを与えるかどうかを決定する。CFLG.io = 0 または CPL


INS/INSB/INSW/INSD—Input from Port to String ( 続き )<br />

参照される I/O ポートが (IOBase レジスタを介して ) 実装されていない仮想アドレスに<br />

マッピングされる場合や、データ・トランスレーションがディスエーブル (PSR.dt = 0)<br />

になっている場合は、その I/O ポートを参照する INS 命令を発行すると、GPFault が発<br />

生する。<br />

操作<br />

IF ((PE = 1) AND ((VM = 1) OR (CPL > IOPL)))<br />

THEN (* Protected mode or virtual-8086 mode with CPL > IOPL *)<br />

IF (CFLG.io AND Any I/O Permission Bit for I/O port being accessed = 1)<br />

THEN #GP(0);<br />

FI;<br />

ELSE ( * I/O operation is allowed *)<br />

FI;<br />

IF (Itanium_System_Environment) THEN<br />

SRC_VA = IOBase | (Port{15:2}


INS/INSB/INSW/INSD—Input from Port to String ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

IA-32_Exception データ ・ ブレークポイン ト およびシングル ・ ステップでの<br />

デバッ グ ・ ト ラ ッ プ。<br />

IA-32_Exception アライメン ト ・ フォルト。<br />

#GP(0) 参照される ポ ー ト が実装されていない仮想ア ド レ スにマ ッ<br />

ピングされるか、 PSR.dt が 0 である。<br />

保護モード例外<br />

#GP(0) CPL が I/O 特権レベル (IOPL) より大きく ( 低い特権を も<br />

つ )、 アクセスされる I/O ポー トのTSS にある対応する<br />

I/O パー ミ ッシ ョン ・ ビッ ト のいずれかが 1 で、 かつ<br />

CFLG.io が 1 である場合。<br />

デステ ィ ネー シ ョ ンが書き込み不可能なセグメ ン ト にある<br />

場合。<br />

ES セグメン ト に不正なメモリ ・ オペラン ド の実効アド レ<br />

スが指定 さ れた場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

#GP(0) アクセスされる I/O ポー トのTSS にある対応する I/O パー<br />

ミッション・ビットのいずれかが1 である場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:584 第 3 巻 : IA-32 基本命令リファレンス


INT n/INTO/INT 3—Call to Interrupt Procedure<br />

オペコード 命令 説明<br />

CC INT 3 割り込み 3 - デバッガへのトラップ。<br />

CD ib INT imm8 即値バイトによって番号が付けられる割り込みベクタ<br />

CE INTO 割り込み 4 - オーバフロー・フラグが 1 である場合。<br />

説明<br />

INT n 命令は、 デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド で指定 さ れた割 り 込みハン ド ラ ま たは<br />

例外ハン ド ラ への コ ー ルを生成す る。 デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド は、 8 ビッ トの<br />

符号なし中間値 と して コ ー ド 化 さ れた 0 から 255 までの割り込みベクタ番号を指定する。<br />

最初の 32 個の割 り込みベク タ はシステム用に予約されている。 これら の割り込みの一部<br />

は、 内部的に生成 さ れる例外に使用 さ れる。<br />

INT n 命令は、 ソ フ ト ウ ェ アに よ っ て生成 さ れる割 り 込みハン ド ラ への コ ー ルを実行す<br />

る ための一般的ニー モニ ッ ク であ る。 INTO 命令は、 オ ー バフ ロ ー例外 (#OF)、 すなわち<br />

割り込みベクタ4 をコールするための特殊ニーモニックである。 オーバフロー割り込み<br />

は EFLAGS レジスタ内のOF フ ラグをチェ ッ ク し、 それが 1 にセッ ト されている場合に<br />

オーバフロー例外ハンドラをコールする。<br />

INT3 命令は、 デバ ッ グ例外ハン ド ラ を呼び出すための特殊なニ ー モニ ッ ク であ る。 INT3<br />

命令 ( オペコ ー ド CC) の動作は、 INT 3 命令 ( オペコ ー ド CC03) の動作と は以下の点で<br />

多少異な る。<br />

• VME モードでは割り込みのリダイレクションが行われない。 割り込みは、 保護モー<br />

ド・ハンドラによって処理される。<br />

• 仮想 8086 モー ドの IOPL チェックが行われない。 割り込みは、 IOPL レベルでのフォ ル ト を一切伴わないで取 り 扱われる。<br />

(INTO およびINT 3 命令を含む ) INT n 命令の処理は、 CALL 命令に よ っ て行われる far<br />

コ ー ルの処理に似てい る。 最 も 大き な相違は、 INT n 命令では、 EFLAGS レジスタがリ<br />

ターン ・アドレスより先にスタックにプッシュされる点である。 ( リターン・アドレス<br />

は、 CS および EIP レジスタの現在値からなる far アドレスである。 ) 割り込みプロシー<br />

ジャからのリターンはIRET 命令で処理 さ れる。 IRET 命令は ス タ ッ ク か ら EFLAGS 情報<br />

とリターン・アドレスをポップする。<br />

割り込みベクタは、 割り込みディスク リプタ ・ テーブル (IDT) 内の特定の割 り 込みデ ィ<br />

ス ク リ プ タ を指定す る。 すなわち、 こ の番号は IDT へのインデ ッ クスの役割を果たす。<br />

それに対し、 選択された割り込みデ ィ スク リ プタの内容は割り込みまたは例外ハン ド<br />

ラ ・ プロシージャへのポインタになっている。 保護モードでは、 IDT は、 それぞれが割<br />

り込みゲート、 トラップ・ゲート、 またはタスク・ゲートである8バイ ト のディ スク リ<br />

プタの配列になっている。 実アド レス ・ モー ドでは、 IDT は、 それぞれ選択されたセグ<br />

メ ン ト 内のプ ロ シ ー ジ ャ を直接指示先 と す る 4 バイ ト の far ポインタ (2 バイ ト のコー<br />

ド・セレクタと2バイ ト の命令ポインタ ) の配列である。<br />

以下のデシ ジ ョ ン ・ テ ー ブルは、 テ ー ブルの太線 よ り 上の部分の条件が与え ら れた場合<br />

に、 太線よ り 下の部分の ど の処置が行われるかを示している。 デシ ジ ョ ン ・ テ ー ブルの<br />

下の部分の各 Y は、 こ の命令の 「操作」 の項に定義されている プ ロ シ ー ジ ャ (#GP を除<br />

く ) を表している。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:585


INT n/INTO/INT 3—Call to Interrupt Procedure ( 続き )<br />

表 1-14. INT クラス<br />

PE 0 1 1 1 1 1 1 1<br />

VM ─ ─ ─ ─ ─ 0 1 1<br />

IOPL ─ ─ ─ ─ ─ ─ DPL= DPL< ─ ─<br />

CPL CPL or C CPL & NC<br />

割り込みタイプ ─ S/W ─ ─ ─ ─ ─ ─<br />

ゲート・タイプ ─ ─ タスク トラップまた トラップまた トラップまた トラップまた トラップまた<br />

は割り込み は割り込み は割り込み は割り込み は割り込み<br />

REAL-ADDRESS-MODE �<br />

PROTECTED-MODE � � � � � � �<br />

TRAP-OR-INTERRUPT-<br />

GATE<br />

� � � � �<br />

INTER-PRIVILEGE-<br />

LEVEL-INTERRUPT<br />

�<br />

INTRA-PRIVILEGE-<br />

LEVEL-INTERRUPT<br />

�<br />

INTERRUPT-FROM-<br />

VIRTUAL-8086-MODE<br />

�<br />

TASK-GATE �<br />

#GP � � �<br />

注 :<br />

− 無指定。<br />

� 処置が行われる。<br />

空白 処置は行われない。<br />

プロセッサが仮想8086 モ ー ド で動作してい る と き には、 IOPL によってINTn 命令の処<br />

置が決ま る。 IOPL が 3 よ り 小 さ い場合は、 プ ロ セ ッ サは一般保護例外 (#GP) を生成す<br />

る。 IOPL が 3 の場合は、 プロセ ッ サは特権レベル 0 への保護モー ド 割 り 込みを実行す<br />

る。 特権レベル 0 への保護モー ド 割 り 込みを実行する ためには、 割 り 込みゲ ー ト の DPL<br />

が 3 に設定されていて、 かつ割り込みハン ド ラ ・ プロシージ ャのタ ーゲッ ト CPL が 0 で<br />

なければならない。<br />

割り込みディスク リプタ ・ テーブル ・ レジスタ (IDTR) には、 IDT のベース ・ リ ニア ・ ア<br />

ド レ スお よ び範囲を指定す る。 プ ロ セ ッ サの電源投入後 ま たは リ セ ッ ト 後の IDTR の初<br />

期ベー ス ・ ア ド レ ス値は 0 である。<br />

3:586 第 3 巻 : IA-32 基本命令リファレンス


INT n/INTO/INT 3—Call to Interrupt Procedure ( 続き )<br />

操作<br />

以下の操作の記述は、 INT n 命令お よ び INTO 命令だけでな く 、 外部割 り 込みお よ び例外<br />

にも適用される。<br />

IF Itanium System EnvironmentTHEN<br />

IF INT3 Form THEN IA-32_Exception(3);<br />

IF INTO Form THEN IA-32_Exception(4);<br />

IF INT Form THEN IA-32_Interrupt(N);<br />

FI;<br />

/*IN the Itanium System Environment all of the following operations are intercepted*/<br />

IF PE=0<br />

THEN<br />

GOTO REAL-ADDRESS-MODE;<br />

ELSE (* PE=1 *)<br />

GOTO PROTECTED-MODE;<br />

FI;<br />

REAL-ADDRESS-MODE:<br />

IF ((DEST ∗ 4) + 3) is not within IDT limit THEN #GP; FI;<br />

IF stack not large enough for a 6-byte return information THEN #SS; FI;<br />

Push (EFLAGS[15:0]);<br />

IF ← 0; (* Clear interrupt flag *)<br />

TF ← 0; (* Clear trap flag *)<br />

AC ← 0; (*Clear AC flag*)<br />

Push(CS);<br />

Push(IP);<br />

(* No error codes are pushed *)<br />

CS ← IDT(Descriptor (vector ∗ 4), selector));<br />

EIP ← IDT(Descriptor (vector ∗ 4), offset)); (* 16 bit offset AND 0000FFFFH *)<br />

END;<br />

PROTECTED-MODE:<br />

IF ((DEST ∗ 8) + 7) is not within IDT limits<br />

OR selected IDT descriptor is not an interrupt-, trap-, or task-gate type<br />

THEN #GP((DEST ∗ 8) + 2 + EXT);<br />

(* EXT is bit 0 in error code *)<br />

FI;<br />

IF software interrupt (* generated by INTn, INT3, or INTO *)<br />

THEN<br />

IF gate descriptor DPL < CPL<br />

THEN #GP((vector number ∗ 8) + 2 );<br />

(* PE=1, DPL


INT n/INTO/INT 3—Call to Interrupt Procedure ( 続き )<br />

TASK-GATE: (* PE=1, task gate *)<br />

Read segment selector in task gate (IDT descriptor);<br />

IF local/global bit is set to local<br />

OR index not within GDT limits<br />

THEN #GP(TSS selector);<br />

FI;<br />

Access TSS descriptor in GDT;<br />

IF TSS descriptor specifies that the TSS is busy (low-order 5 bits set to 00001)<br />

THEN #GP(TSS selector);<br />

FI;<br />

IF TSS not present<br />

THEN #NP(TSS selector);<br />

FI;<br />

SWITCH-TASKS (with nesting) to TSS;<br />

IF interrupt caused by fault with error code<br />

THEN<br />

IF stack limit does not allow push of two bytes<br />

THEN #SS(0);<br />

FI;<br />

Push(error code);<br />

FI;<br />

IF EIP not within code segment limit<br />

THEN #GP(0);<br />

FI;<br />

END;<br />

TRAP-OR-INTERRUPT-GATE<br />

Read segment selector for trap or interrupt gate (IDT descriptor);<br />

IF segment selector for code segment is null<br />

THEN #GP(0H + EXT); (* null selector with EXT flag set *)<br />

FI;<br />

IF segment selector is not within its descriptor table limits<br />

THEN #GP(selector + EXT);<br />

FI;<br />

Read trap or interrupt handler descriptor;<br />

IF descriptor does not indicate a code segment<br />

OR code segment descriptor DPL > CPL<br />

THEN #GP(selector + EXT);<br />

FI;<br />

IF trap or interrupt gate segment is not present,<br />

THEN #NP(selector + EXT);<br />

FI;<br />

IF code segment is non-conforming AND DPL < CPL<br />

THEN IF VM=0<br />

THEN<br />

GOTO INTER-PRIVILEGE-LEVEL-INTERRUPT;<br />

(* PE=1, interrupt or trap gate, nonconforming *)<br />

(* code segment, DPL


INT n/INTO/INT 3—Call to Interrupt Procedure ( 続き )<br />

ELSE (* PE=1, interrupt or trap gate, DPL ≥ CPL *)<br />

IF VM=1 THEN #GP(new code segment selector); FI;<br />

IF code segment is conforming OR code segment DPL = CPL<br />

THEN<br />

GOTO INTRA-PRIVILEGE-LEVEL-INTERRUPT;<br />

ELSE<br />

#GP(CodeSegmentSelector + EXT);<br />

(* PE=1, interrupt or trap gate, nonconforming *)<br />

(* code segment, DPL>CPL *)<br />

FI;<br />

FI;<br />

END;<br />

INTER-PRIVILEGE-LEVEL-INTERRUPT<br />

(* PE=1, interrupt or trap gate, non-conforming code segment, DPL TSS limit<br />

THEN #TS(current TSS selector); FI;<br />

NewSS ← TSSstackAddress + 4;<br />

NewESP ← stack address;<br />

ELSE (* TSS is 16-bit *)<br />

TSSstackAddress ← new code segment (DPL ∗ 4) + 2<br />

IF (TSSstackAddress + 4) > TSS limit<br />

THEN #TS(current TSS selector); FI;<br />

NewESP ← TSSstackAddress;<br />

NewSS ← TSSstackAddress + 2;<br />

FI;<br />

IF segment selector is null THEN #TS(EXT); FI;<br />

IF segment selector index is not within its descriptor table limits<br />

OR segment selector's RPL ≠ DPL of code segment,<br />

THEN #TS(SS selector + EXT);<br />

FI;<br />

Read segment descriptor for stack segment in GDT or LDT;<br />

IF stack segment DPL ≠ DPL of code segment,<br />

OR stack segment does not indicate writable data segment,<br />

THEN #TS(SS selector + EXT);<br />

FI;<br />

IF stack segment not present THEN #SS(SS selector+EXT); FI;<br />

IF 32-bit gate<br />

THEN<br />

IF new stack does not have room for 24 bytes (error code pushed)<br />

OR 20 bytes (no error code pushed)<br />

THEN #SS(segment selector + EXT);<br />

FI;<br />

ELSE (* 16-bit gate *)<br />

IF new stack does not have room for 12 bytes (error code pushed)<br />

OR 10 bytes (no error code pushed);<br />

THEN #SS(segment selector + EXT);<br />

FI;<br />

FI;<br />

IF instruction pointer is not within code segment limits THEN #GP(0); FI;<br />

SS:ESP ← TSS(SS:ESP) (* segment descriptor information also loaded *)<br />

第 3 巻 : IA-32 基本命令リファレンス 3:589


INT n/INTO/INT 3—Call to Interrupt Procedure ( 続き )<br />

IF 32-bit gate<br />

THEN<br />

CS:EIP ← Gate(CS:EIP); (* segment descriptor information also loaded *)<br />

ELSE (* 16-bit gate *)<br />

CS:IP ← Gate(CS:IP); (* segment descriptor information also loaded *)<br />

FI;<br />

IF 32-bit gate<br />

THEN<br />

Push(far pointer to old stack); (* old SS and ESP, 3 words padded to 4 *);<br />

Push(EFLAGS);<br />

Push(far pointer to return instruction); (* old CS and EIP, 3 words padded to 4*);<br />

Push(ErrorCode); (* if needed, 4 bytes *)<br />

ELSE(* 16-bit gate *)<br />

Push(far pointer to old stack); (* old SS and SP, 2 words *);<br />

Push(EFLAGS);<br />

Push(far pointer to return instruction); (* old CS and IP, 2 words *);<br />

Push(ErrorCode); (* if needed, 2 bytes *)<br />

FI;<br />

CPL ← CodeSegmentDescriptor(DPL);<br />

CS(RPL) ← CPL;<br />

IF interrupt gate<br />

THEN IF ← 0 (* interrupt flag to 0 (disabled) *); FI;<br />

TF ← 0;<br />

VM ← 0;<br />

RF ← 0;<br />

NT ← 0;<br />

I END;<br />

INTERRUPT-FROM-VIRTUAL-8086-MODE:<br />

(* Check segment selector and descriptor for privilege level 0 stack in current TSS *)<br />

IF current TSS is 32-bit TSS<br />

THEN<br />

TSSstackAddress ← new code segment (DPL ∗ 8) + 4<br />

IF (TSSstackAddress + 7) > TSS limit<br />

THEN #TS(current TSS selector); FI;<br />

NewSS ← TSSstackAddress + 4;<br />

NewESP ← stack address;<br />

ELSE (* TSS is 16-bit *)<br />

TSSstackAddress ← new code segment (DPL ∗ 4) + 2<br />

IF (TSSstackAddress + 4) > TSS limit<br />

THEN #TS(current TSS selector); FI;<br />

NewESP ← TSSstackAddress;<br />

NewSS ← TSSstackAddress + 2;<br />

FI;<br />

IF segment selector is null THEN #TS(EXT); FI;<br />

IF segment selector index is not within its descriptor table limits<br />

OR segment selector's RPL ≠ DPL of code segment,<br />

THEN #TS(SS selector + EXT);<br />

FI;<br />

Access segment descriptor for stack segment in GDT or LDT;<br />

IF stack segment DPL ≠ DPL of code segment,<br />

OR stack segment does not indicate writable data segment,<br />

THEN #TS(SS selector + EXT);<br />

FI;<br />

IF stack segment not present THEN #SS(SS selector+EXT); FI;<br />

3:590 第 3 巻 : IA-32 基本命令リファレンス


INT n/INTO/INT 3—Call to Interrupt Procedure ( 続き )<br />

IF 32-bit gate<br />

THEN<br />

IF new stack does not have room for 40 bytes (error code pushed)<br />

OR 36 bytes (no error code pushed);<br />

THEN #SS(segment selector + EXT);<br />

FI;<br />

ELSE (* 16-bit gate *)<br />

IF new stack does not have room for 20 bytes (error code pushed)<br />

OR 18 bytes (no error code pushed);<br />

THEN #SS(segment selector + EXT);<br />

FI;<br />

FI;<br />

IF instruction pointer is not within code segment limits THEN #GP(0); FI;<br />

IF CR4.VME = 0<br />

THEN<br />

IF IOPL=3<br />

THEN<br />

IF Gate DPL = 3<br />

THEN (*CPL=3, VM=1, IOPL=3, VME=0, gate DPL=3)<br />

IF Target CPL != 0<br />

THEN #GP(0);<br />

ELSE Goto VM86_INTERURPT_TO_PRIV0;<br />

FI;<br />

ELSE (*Gate DPL < 3*)<br />

#GP(0);<br />

FI;<br />

ELSE (*IOPL < 3*)<br />

#GP(0);<br />

FI;<br />

ELSE (*VME = 1*)<br />

(*Check whether interrupt is directed for INT n instruction only,<br />

(*executes virtual 8086 interupt, protected mode interrupt or faults*)<br />

Ptr


INT n/INTO/INT 3—Call to Interrupt Procedure ( 続き )<br />

END;<br />

VM86_INTERRUPT_TO_PRIV0:<br />

tempEFLAGS ← EFLAGS;<br />

VM ← 0;<br />

TF ← 0;<br />

RF ← 0;<br />

IF service through interrupt gate THEN IF ← 0; FI;<br />

TempSS ← SS;<br />

TempESP ← ESP;<br />

SS:ESP ← TSS(SS0:ESP0); (* Change to level 0 stack segment *)<br />

(* Following pushes are 16 bits for 16-bit gate and 32 bits for 32-bit gates *)<br />

(* Segment selector pushes in 32-bit mode are padded to two words *)<br />

Push(GS);<br />

Push(FS);<br />

Push(DS);<br />

Push(ES);<br />

Push(TempSS);<br />

Push(TempESP);<br />

Push(TempEFlags);<br />

Push(CS);<br />

Push(EIP);<br />

GS ← 0; (*segment registers nullified, invalid in protected mode *)<br />

FS ← 0;<br />

DS ← 0;<br />

ES ← 0;<br />

CS ← Gate(CS);<br />

IF OperandSize=32<br />

THEN<br />

EIP ← Gate(instruction pointer);<br />

ELSE (* OperandSize is 16 *)<br />

EIP ← Gate(instruction pointer) AND 0000FFFFH;<br />

FI;<br />

(* Starts execution of new routine in Protected Mode *)<br />

END;<br />

VM86_INTERRUPT_TO_VM86:<br />

IF IOPL = 3<br />

THEN<br />

push(FLAGS OR 3000H); (*Push FLAGS w/ IOPL bits as 11B or IOPL 3*)<br />

push(CS);<br />

push(IP);<br />

CS


INT n/INTO/INT 3—Call to Interrupt Procedure ( 続き )<br />

FI;<br />

END;<br />

FLAGS


INT n/INTO/INT 3—Call to Interrupt Procedure ( 続き )<br />

保護モード例外<br />

#GP(0) IDT、 割り込みゲート、 トラップ・ゲート、 またはタス<br />

ク・ゲート内の命令ポインタがコード・セグメントの範囲<br />

を超えている場合。<br />

#GP( セレクタ ) 割り込みゲー ト、 ト ラ ップ ・ ゲー ト、 またはタスク ・ ゲー<br />

ト内のセグメント ・セレクタがNULL の場合。<br />

割り込みゲート、 トラップ・ゲート、 タスク・ゲート、<br />

コード ・セグメント、 またはTSS のセグメン ト ・ セレ ク<br />

タ・インデックスがそのディスクリプタ・テーブルの範囲<br />

外の場合。<br />

割り込みベクタがIDT の範囲外の場合。<br />

IDT ディスクリプタが、 割り込みディスクリプタ、 トラッ<br />

プ・ディスクリプタ、 またはタスク・ディスクリプタのい<br />

ずれで も ない場合。<br />

INT n 命令に よ っ て割 り 込みが発生し、 割 り 込みデ ィ ス ク リ<br />

プタ、 トラップ・ディスク リプタ、 またはタスク ・ディス<br />

クリプタのDPL が CPL より小さい場合。<br />

割り込みゲー ト または ト ラップ ・ゲー ト内のセグメント ・<br />

セレクタの指示先がコー ド ・ セグメン トのセグメン ト ・<br />

デ ィ スク リ プタでない場合。<br />

TSS のセグメン ト ・ セレ ク タのローカル / グローバル ・<br />

ビ ッ ト が ロ ー カ ルに設定されている場合。<br />

TSS のセグメン ト ・ デ ィ スク リ プタが、 その TSS がビ<br />

ジ ー であ る か使用不可能であ る と 指定してい る場合。<br />

#SS(0) リターン・アドレス、 フラグ、 またはエラー・コードをス<br />

タックにプッシュして、 スタック・セグメントの範囲を超<br />

えたが、 ス タ ッ ク ・ ス イ ッ チが行われなか っ た場合。<br />

#SS( セレクタ ) SS レジスタがロード されよう としたとき、 指示先のセグ<br />

メ ン ト が存在しない と マ ー ク さ れていた場合。<br />

リターン・アドレス、 フラグ、 エラー・コード、 またはス<br />

タック・セグメント ・ポインタをプッシュして、 新しいス<br />

タ ッ ク ・ セグ メ ン ト の範囲を超えた場合。<br />

#NP( セレクタ ) コード ・セグメント、 割り込みゲート、 トラップ・ゲー<br />

ト、 タスク ・ゲート、 またはTSS が存在しない場合。<br />

#TS( セレクタ ) TSS内のスタック・セグメント ・セレクタのRPL が、 割<br />

り込みゲー ト または ト ラップ ・ゲー トによってアクセスさ<br />

れるコー ド ・ セグメン ト の DPL に等し く ない場合。<br />

TSS 内のスタック・セグメント ・セレクタによって指され<br />

ているスタ ッ ク ・ セグメン ト ・ デ ィ ス ク リ プタの DPL が<br />

割り込みゲートまたはトラップ・ゲートのコード ・セグメ<br />

ント ・ディスクリプタのDPL に等し く ない場合。<br />

TSS 内のスタック・セグメント ・セレクタがNULL の場<br />

合。<br />

3:594 第 3 巻 : IA-32 基本命令リファレンス


INT n/INTO/INT 3—Call to Interrupt Procedure ( 続き )<br />

TSS のスタ ッ ク ・ セグメン ト が書き込み可能なデータ ・ セ<br />

グメン ト でない場合。<br />

スタック ・セグメン トのセグメン ト ・セレクタ ・ インデッ<br />

ク スがデ ィ ス ク リ プ タ ・ テ ー ブルの範囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

割り込みベクタがIDT の範囲外の場合。<br />

#SS プ ッ シ ュ 時ス タ ッ ク範囲違反の場合。<br />

ス タ ッ ク ・ ス イ ッ チが発生した と き、 リ タ ー ン ・ ア ド レ<br />

ス、 フラグ、 またはエラー ・ コ ー ド をスタ ッ ク にプ ッ シュ<br />

して、 ス タ ッ ク ・ セグ メ ン ト の範囲を超えた場合。<br />

仮想 8086 モード例外<br />

#GP(0) (INT n 命令の場合 ) IOPL が 3 より小さいか、 または割り<br />

込みゲー ト 、 ト ラ ッ プ ・ ゲー ト 、 または タ ス ク ・ ゲー ト の<br />

ディスクリプタのDPL が 3 に等し く ない場合。<br />

IDT、 割り込みゲート、 トラップ・ゲート、 またはタス<br />

ク・ゲート内の命令ポインタがコード・セグメントの範囲<br />

を超えている場合。<br />

#GP( セレクタ ) 割り込みゲー ト、 ト ラ ップ ・ ゲー ト、 またはタスク ・ ゲー<br />

ト内のセグメント ・セレクタがNULL の場合。<br />

割り込みゲート、 トラップ・ゲート、 タスク・ゲート、<br />

コード ・セグメント、 またはTSS のセグメン ト ・ セレ ク<br />

タ・インデックスがそのディスクリプタ・テーブルの範囲<br />

外の場合。<br />

割り込みベクタがIDT の範囲外の場合。<br />

IDT ディスクリプタが、 割り込みディスクリプタ、 トラッ<br />

プ・ディスク リプタ、 またはタスク ・ディスク リプタのい<br />

ずれで も ない場合。<br />

INT n 命令に よ っ て割 り 込みが発生し、 割 り 込みデ ィ ス ク<br />

リプタ、 トラップ・ディスクリプタ、 またはタスク ・ディ<br />

スクリプタのDPL が CPL より小さい場合。<br />

割り込みゲー ト または ト ラップ ・ゲー ト内のセグメント ・<br />

セレクタの指示先がコー ド ・ セグメン トのセグメン ト ・<br />

デ ィ スク リ プタでない場合。<br />

TSS のセグメン ト ・ セレ ク タのローカル / グローバル ・<br />

ビ ッ ト が ロ ー カ ルに設定されている場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:595


INT n/INTO/INT 3—Call to Interrupt Procedure ( 続き )<br />

#SS( セレクタ ) SS レジスタがロード されよう としたとき、 指示先のセグ<br />

メ ン ト が存在しない と マ ー ク さ れていた場合。<br />

リターン・アドレス、 フラグ、 エラー・コード、 スタッ<br />

ク ・ セグメン ト ・ ポインタ、 またはデータ ・ セグメン ト を<br />

プッシュして、 スタ ッ ク ・ セグメン ト の範囲を超えた場<br />

合。<br />

#NP( セレクタ ) コード ・セグメント、 割り込みゲート、 トラップ・ゲー<br />

ト、 タスク ・ゲート、 またはTSS が存在しない場合。<br />

#TS( セレクタ ) TSS内のスタック・セグメント ・セレクタのRPL が、 割<br />

り込みゲー ト または ト ラップ ・ゲー トによってアクセスさ<br />

れるコー ド ・ セグメン ト の DPL に等し く ない場合<br />

TSS のスタック ・セグメント に対するスタック ・セグメン<br />

ト・ディスクリプタのDPL が、 割り 込みゲー ト ま たは ト<br />

ラップ・ゲートのコード ・セグメント ・ディスクリプタの<br />

DPL に等し く ない場合。<br />

TSS 内のスタック・セグメント ・セレクタがNULL の場<br />

合。<br />

TSS のスタ ッ ク ・ セグメン ト が書き込み可能なデータ ・ セ<br />

グメン ト でない場合。<br />

スタック ・セグメン トのセグメン ト ・セレクタ ・ インデッ<br />

ク スがデ ィ ス ク リ プ タ ・ テ ー ブルの範囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#BP INT 3 命令が実行 された場合。<br />

#OF INTO 命令が実行 さ れ、 OF フ ラ グがセ ッ ト さ れた場合。<br />

3:596 第 3 巻 : IA-32 基本命令リファレンス


INVD—Invalidate Internal Caches<br />

オペコード 命令 説明<br />

0F 08 INVD 内部キャッシュをフラッシュする。外部キャッシュのフラッシュを<br />

開始させる。<br />

説明<br />

プ ロ セ ッ サの内部キ ャ ッ シ ュ を無効化 ( フラッシュ ) し、 外部キ ャ ッ シ ュ に も 自身を フ<br />

ラ ッ シ ュ する よ う 指示する特殊機能バス ・ サイ ク ルを発行す る。 内部キ ャ ッ シ ュ に保持<br />

されていたデータはメイン ・ メモリにライ トバッ クされない。<br />

この命令を実行した後、 プロセッサは、 外部キャッシュのフラッシュ操作の完了を待た<br />

ずに命令の実行を継続する。 キ ャ ッ シ ュ ・ フ ラ ッ シ ュ信号への応答は、 ハー ド ウ ェ アに<br />

よって行う。<br />

INVD 命令は特権命令であ る。 プ ロ セ ッ サが保護モー ド で動作してい る場合は、 こ の命<br />

令を実行するには、 プログラムまたはプロシージャの CPL が 0 でなければならない。 こ<br />

の命令はプロセ ッサのモデルに も依存する。 今後のインテル ・ アーキテクチャ ・ プロ<br />

セ ッ サでは、 こ の命令の機能が異なる可能性がある。<br />

こ の命令を使用する際は注意が必要であ る。 内部でキ ャ ッ シ ュ さ れ、 メ イ ン ・ メ モ リ に<br />

ライ トバックされないデータは失われる。 ( 例えば、 メ イン ・ メモ リ と のキ ャ ッ シ ュ ・ コ<br />

ヒ ーレンシが重要でないテス ト やフ ォル ト ・ リ カバ リ のよ う に ) 修正したキ ャ ッ シ ュ ・<br />

ラ イ ン を ラ イ ト バ ッ ク しないでキ ャ ッ シ ュ を フ ラ ッ シ ュ する特別な必要性、 ま たは そ う<br />

するこ とに特別な利点がなければ、 ソフ ト ウェアには WBINVD 命令を使用すべ き であ<br />

る。<br />

操作<br />

IF Itanium System Environment THEN IA-32_Intercept(INST,INVD);<br />

Flush(InternalCaches);<br />

SignalFlush(ExternalCaches);<br />

Continue (* Continue execution);<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

IA-32_Intercept 強制命令イ ン タ ー セプ ト ・ フ ォ ル ト 。<br />

保護モード例外<br />

#GP(0) 現行特権レベルが 0 でない場合。<br />

実アドレス・モード例外<br />

なし。<br />

仮想 8086 モード例外<br />

#GP(0) INVD 命令は仮想 8086 モー ド で実行で き ない。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:597


INVD—Invalidate Internal Caches ( 続き )<br />

インテル・アーキテクチャにおける互換性<br />

この命令は、 Intel486 プロセッサよ り以前のインテル ・ アーキテクチャ ・ プロセッサでは<br />

サポー ト されていない。<br />

3:598 第 3 巻 : IA-32 基本命令リファレンス


INVLPG—Invalidate TLB Entry<br />

オペコード 命令 説明<br />

0F 01/7 INVLPG m m があるページの TLB エントリを無効にする。<br />

説明<br />

ソース ・ オペランドで指定されたトランスレーション ・ルックアサイド ・バッファ<br />

(TLB) のエン ト リ を無効化 ( フラッシュ ) する。 ソース ・ オペラン ド は、 メモリ ・ アド レ<br />

スである。 プロセッサは、 そのアドレスが含まれるページを判定し、 そのページのTLB<br />

エン ト リ をフラ ッ シュする。<br />

INVLPG 命令は特権命令である。 プロセ ッ サが保護モー ド で動作している場合は、 この<br />

命令を実行するには、 プログラムまたはプロシージャの CPL が 0 でなければならない。<br />

こ の命令はプ ロセ ッ サのモデルに も 依存する。 今後の イ ン テル ・ アー キテ ク チ ャ ・ プ ロ<br />

セ ッ サでは、 こ の命令の機能が異なる可能性がある。<br />

通常、 INVLPG 命令は指定 さ れたペー ジの TLB エン ト リだけをフラ ッ シュするが、 場合<br />

によっては TLB 全体を フ ラ ッ シ ュ する と き も ある。<br />

操作<br />

IF Itanium System Environment THEN IA-32_Intercept(INST,INVLPG);<br />

Flush(RelevantTLBEntries);<br />

Continue (* Continue execution);<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

IA-32_Intercept 強制命令イ ン タ ー セプ ト ・ フ ォ ル ト 。<br />

保護モード例外<br />

#GP(0) 現行特権レベルが 0 でない場合。<br />

#UD オペラ ン ド が レ ジ ス タ である場合。<br />

実アドレス・モード例外<br />

なし。<br />

仮想 8086 モード例外<br />

#GP(0) INVLPG 命令は仮想 8086 モ ー ド で実行で き ない。<br />

インテル・アーキテクチャにおける互換性<br />

この命令は、 Intel486 プロセッサよ り以前のインテル ・ アーキテクチャ ・ プロセッサでは<br />

サポー ト されていない。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:599


IRET/IRETD—Interrupt Return<br />

オペコード 命令 説明<br />

CF IRET 割り込みリターン ( オペランド・サイズ : 16 ビット )。<br />

CF IRETD 割り込みリターン ( オペランド・サイズ : 32 ビット )。<br />

説明<br />

プ ロ グ ラ ム制御を例外ハン ド ラ ま たは割 り 込みハン ド ラか ら、 例外、 外部割 り 込み、 ソ<br />

フ ト ウ ェ ア生成割 り 込み ま たは ネ ス ト さ れたタ ス ク か ら の リ タ ー ン に よ っ て中断されて<br />

いたプログラムまたはプロシージャに戻す。 IRET および IRETD は同じオペコ ー ド に対<br />

する 2 つのニーモニッ クである。 IRETD ニーモニッ ク (Interrupt Return Double) は、 32<br />

ビ ッ ト のオペラ ン ド ・ サイ ズを使用してい る と き に割 り 込みか ら 戻る場合に使用する こ<br />

とを目的としているが、 ほとんどのアセンブラはどちらのオペランド ・サイズに対して<br />

も IRET ニーモニッ クを使用している。<br />

実ア ド レス ・ モー ド では、 IRET 命令は割 り 込みに よ っ て中断 されていたプ ロ グ ラ ム ま た<br />

はプロシージャへの far リターンを実行する。 この操作では、 プロセッサはスタックか<br />

ら EIP、 CS、 EFLAGS のレジスタにそれぞれリ ターン命令ポインタ、 リ ターン ・ コー<br />

ド・セグメント・セレクタ、EFLAGS イメージをポップし、 次に中断されていたプログ<br />

ラムまたはプロシージャの実行を再開する。<br />

保護モ ー ド では、 IRET 命令の処理は、 EFLAGS レジスタ内のNT ( ネス ト されたタスク )<br />

およびVM フラグの設定と、 現在のスタックにストアされている EFLAGS イメージの<br />

VM フ ラ グの設定に依存す る。 こ れ ら の フ ラ グの設定に応じ て、 プ ロ セ ッ サは以下の タ<br />

イプの割り込み リ タ ーンのいずれかを実行する。<br />

• 実モー ド<br />

• 仮想 8086 モー ドからのリ ターン<br />

• 仮想 8086 モー ドへのリ ターン<br />

• 特権レ ベル内の リ タ ー ン<br />

• 特権レ ベル間の リ タ ー ン<br />

ネス ト されたタスクからのリ ターン ( タスク ・ スイッチ)<br />

Itanium ベース・システム環境では、すべての形式の IRET 命令は、<br />

IA-32_Intercept(Inst,IRET) を発生させる。<br />

NT フラグ(EFLAGS レジスタ ) がク リアされている場合は、 IRET 命令は タ ス ク ・ ス イ ッ<br />

チなしに割り込みプロシージ ャからの far リ タ ー ンを実行する。 リ タ ーン先の コ ー ド ・<br />

セグメン ト は、 特権レベルが ( スタックからポップされたコード ・ セグメン ト ・ セレク<br />

タの RPL フィールドによって示される) 割り込みハンドラ ・ ルーチンの特権レベル以下<br />

でなければなら ない。 実ア ド レ ス ・ モー ド の割り込み リ タ ー ンの場合と 同様に、 IRET 命<br />

令は リ タ ー ン命令ポ イ ン タ、 リ タ ー ン ・ コ ー ド ・ セグ メ ン ト ・ セレ ク タ、 EFLAGS イ<br />

メージをスタックからそれぞれEIP、 CS、 EFLAGS のレジスタにポップし、 次に中断さ<br />

れていたプログラムまたはプロシージャの実行を再開する。 別の特権レベルへのリター ンの場合は、 IRET 命令は、 スタックからさらにスタック ・ ポインタと SS レジスタも<br />

ポップしてからプログラムの実行を再開する。 仮想8086 モー ドへのリ ターンの場合は、<br />

プロセッサはスタッ クからさらにデータ ・ セグメン ト ・ レジスタもポップする。<br />

NT フラグがセット されている場合は、 IRET 命令は、 ネ ス ト さ れたタ ス ク か ら の リ タ ー<br />

ンを実行する ( コール先タスクからコール元タスクに切り替える ) か、 ま たは タス ク ・<br />

スイ ッ チを発生させた割り込みま たは例外の動作を取り消す。 IRET 命令を実行してい る<br />

タ ス ク の更新後の状態がその TSS にセーブされる。 このタスクが後で再起動される場合<br />

は、 IRET 命令の次か ら コ ー ド が実行される。<br />

IRET は、命令のシリアル化操作とメモリ・フェンス操作を実行する。<br />

3:600 第 3 巻 : IA-32 基本命令リファレンス


IRET/IRETD—Interrupt Return ( 続き )<br />

操作<br />

IF(Itanium System Environment)<br />

THEN IA-32_Intercept(Inst,IRET);<br />

IF PE = 0<br />

THEN<br />

GOTO REAL-ADDRESS-MODE:;<br />

ELSE<br />

GOTO PROTECTED-MODE;<br />

FI;<br />

REAL-ADDRESS-MODE;<br />

IF OperandSize = 32<br />

THEN<br />

IF top 12 bytes of stack not within stack limits THEN #SS; FI;<br />

IF instruction pointer not within code segment limits THEN #GP(0); FI;<br />

EIP ← Pop();<br />

CS ← Pop(); (* 32-bit pop, high-order 16-bits discarded *)<br />

tempEFLAGS ← Pop();<br />

EFLAGS ← (tempEFLAGS AND 257FD5H) OR (EFLAGS AND 1A0000H);<br />

ELSE (* OperandSize = 16 *)<br />

IF top 6 bytes of stack are not within stack limits THEN #SS; FI;<br />

IF instruction pointer not within code segment limits THEN #GP(0); FI;<br />

EIP ← Pop();<br />

EIP ← EIP AND 0000FFFFH;<br />

CS ← Pop(); (* 16-bit pop *)<br />

EFLAGS[15:0] ← Pop();<br />

FI;<br />

END;<br />

PROTECTED-MODE:<br />

IF VM = 1 (* Virtual-8086 mode: PE=1, VM=1 *)<br />

THEN<br />

GOTO RETURN-FROM-VIRTUAL-8086-MODE; (* PE=1, VM=1 *)<br />

FI;<br />

IF NT = 1<br />

THEN<br />

GOTO TASK-RETURN;( *PE=1, VM=0, NT=1 *)<br />

FI;<br />

IF OperandSize=32<br />

THEN<br />

IF top 12 bytes of stack not within stack limits<br />

THEN #SS(0)<br />

FI;<br />

tempEIP ← Pop();<br />

tempCS ← Pop();<br />

tempEFLAGS ← Pop();<br />

ELSE (* OperandSize = 16 *)<br />

IF top 6 bytes of stack are not within stack limits<br />

THEN #SS(0);<br />

FI;<br />

tempEIP ← Pop();<br />

第 3 巻 : IA-32 基本命令リファレンス 3:601


IRET/IRETD—Interrupt Return ( 続き )<br />

tempCS ← Pop();<br />

tempEFLAGS ← Pop();<br />

tempEIP ← tempEIP AND FFFFH;<br />

tempEFLAGS ← tempEFLAGS AND FFFFH;<br />

FI;<br />

IF tempEFLAGS(VM) = 1 AND CPL=0<br />

THEN<br />

GOTO RETURN-TO-VIRTUAL-8086-MODE;<br />

(* PE=1, VM=1 in EFLAGS image *)<br />

ELSE<br />

GOTO PROTECTED-MODE-RETURN;<br />

(* PE=1, VM=0 in EFLAGS image *)<br />

FI;<br />

RETURN-FROM-VIRTUAL-8086-MODE:<br />

(* Processor is in virtual-8086 mode when IRET is executed and stays in virtual-8086 mode *)<br />

IF CR4.VME = 0<br />

THEN<br />

IF IOPL=3 (* Virtual mode: PE=1, VM=1, IOPL=3 *)<br />

THEN<br />

IF OperandSize = 32<br />

THEN<br />

IF top 12 bytes of stack not within stack limits THEN #SS(0); FI;<br />

IF instruction pointer not within code segment limits THEN #GP(0); FI;<br />

EIP ← Pop();<br />

CS ← Pop(); (* 32-bit pop, high-order 16-bits discarded *)<br />

EFLAGS ← Pop();<br />

(*VM,IOPL,VIP,and VIF EFLAGS bits are not modified by pop *)<br />

ELSE (* OperandSize = 16 *)<br />

IF top 6 bytes of stack are not within stack limits THEN #SS(0); FI;<br />

IF instruction pointer not within code segment limits THEN #GP(0); FI;<br />

EIP ← Pop();<br />

EIP ← EIP AND 0000FFFFH;<br />

CS ← Pop(); (* 16-bit pop *)<br />

EFLAGS[15:0] ← Pop(); (* IOPL in EFLAGS is not modified by pop *)<br />

FI;<br />

ELSE #GP(0); (* trap to virtual-8086 monitor: PE=1, VM=1, IOPL


IRET/IRETD—Interrupt Return ( 続き )<br />

END;<br />

FI;<br />

FLAGS = (FLAGS AND 3000H) OR (TempFLags AND 4FD5H)<br />

(*IOPL unmodified*)<br />

FI;<br />

ELSE (*IOPL < 3*)<br />

IF OperandSize = 16<br />

THEN<br />

IF ((STACK.TF !-0) OR (EFLAGS.VIP=1 AND STACK.IF=1))<br />

THEN #GP(0);<br />

ELSE<br />

IP


IRET/IRETD—Interrupt Return ( 続き )<br />

FI;<br />

IF TSS not present<br />

THEN #NP(TSS selector);<br />

FI;<br />

SWITCH-TASKS (without nesting) to TSS specified in link field of current TSS;<br />

Mark the task just abandoned as NOT BUSY;<br />

IF EIP is not within code segment limit<br />

THEN #GP(0);<br />

FI;<br />

END;<br />

PROTECTED-MODE-RETURN: (* PE=1, VM=0 in flags image *)<br />

IF return code segment selector is null THEN GP(0); FI;<br />

IF return code segment selector addrsses descriptor beyond descriptor table limit<br />

THEN GP(selector; FI;<br />

Read segment descriptor pointed to by the return code segment selector<br />

IF return code segment descriptor is not a code segment THEN #GP(selector); FI;<br />

IF return code segment selector RPL < CPL THEN #GP(selector); FI;<br />

IF return code segment descriptor is conforming<br />

AND return code segment DPL > return code segment selector RPL<br />

THEN #GP(selector); FI;<br />

IF return code segment descriptor is not present THEN #NP(selector); FI:<br />

IF return code segment selector RPL > CPL<br />

THEN GOTO RETURN-OUTER-PRIVILEGE-LEVEL;<br />

ELSE GOTO RETURN-TO-SAME-PRIVILEGE-LEVEL<br />

FI;<br />

END;<br />

RETURN-TO-SAME-PRIVILEGE-LEVEL: (* PE=1, VM=0 in flags image, RPL=CPL *)<br />

IF EIP is not within code segment limits THEN #GP(0); FI;<br />

EIP ← tempEIP;<br />

CS ← tempCS; (* segment descriptor information also loaded *)<br />

EFLAGS (CF, PF, AF, ZF, SF, TF, DF, OF, NT) ← tempEFLAGS;<br />

IF OperandSize=32<br />

THEN<br />

EFLAGS(RF, AC, ID) ← tempEFLAGS;<br />

FI;<br />

IF CPL ≤ IOPL<br />

THEN<br />

EFLAGS(IF) ← tempEFLAGS;<br />

FI;<br />

IF CPL = 0<br />

THEN<br />

EFLAGS(IOPL) ← tempEFLAGS;<br />

IF OperandSize=32<br />

THEN EFLAGS(VM, VIF, VIP) ← tempEFLAGS;<br />

FI;<br />

FI;<br />

END;<br />

RETURN-TO-OUTER-PRIVILGE-LEVEL:<br />

IF OperandSize=32<br />

THEN<br />

IF top 8 bytes on stack are not within limits THEN #SS(0); FI;<br />

3:604 第 3 巻 : IA-32 基本命令リファレンス


IRET/IRETD—Interrupt Return ( 続き )<br />

ELSE (* OperandSize=16 *)<br />

IF top 4 bytes on stack are not within limits THEN #SS(0); FI;<br />

FI;<br />

Read return segment selector;<br />

IF stack segment selector is null THEN #GP(0); FI;<br />

IF return stack segment selector index is not within its descriptor table limits<br />

THEN #GP(SSselector); FI;<br />

Read segment descriptor pointed to by return segment selector;<br />

IF stack segment selector RPL ≠ RPL of the return code segment selector<br />

IF stack segment selector RPL ≠ RPL of the return code segment selector<br />

OR the stack segment descriptor does not indicate a a writable data segment;<br />

OR stack segment DPL ≠ RPL of the return code segment selector<br />

THEN #GP(SS selector);<br />

FI;<br />

IF stack segment is not present THEN #NP(SS selector); FI;<br />

IF tempEIP is not within code segment limit THEN #GP(0); FI;<br />

EIP ← tempEIP;<br />

CS ← tempCS;<br />

EFLAGS (CF, PF, AF, ZF, SF, TF, DF, OF, NT) ← tempEFLAGS;<br />

IF OperandSize=32<br />

THEN<br />

EFLAGS(RF, AC, ID) ← tempEFLAGS;<br />

FI;<br />

IF CPO ≤ IOPL<br />

THEN<br />

EFLAGS(IF) ← tempEFLAGS;<br />

FI;<br />

IF CPL = 0<br />

THEN<br />

EFLAGS(IOPL) ← tempEFLAGS;<br />

IF OperandSize=32<br />

THEN EFLAGS(VM, VIF, VIP) ← tempEFLAGS;<br />

FI;<br />

FI;<br />

CPL ← RPL of the return code segment selector;<br />

FOR each of segment register (ES, FS, GS, and DS)<br />

DO;<br />

IF segment register points to data or non-conforming code segment<br />

AND CPL > segment descriptor DPL (* stored in hidden part of segment register *)<br />

THEN (* segment register invalid *)<br />

SegmentSelector ← 0; (* null segment selector *)<br />

FI;<br />

OD;<br />

END:<br />

影響を受けるフラグ<br />

プロセッサの動作モー ドに応じて、 EFLAGS レジスタ内のすべてのフラグおよびフィー<br />

ルドが修正される可能性がある。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:605


IRET/IRETD—Interrupt Return ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

IA-32_Intercept IRET のすべての形式で、 命令インタ ーセプ ト ・ ト ラ ッ プ。<br />

保護モード例外<br />

#GP(0) リターン・コードまたはスタック・セグメント ・セレクタ<br />

が NULL の場合。<br />

リターン命令ポインタがリターン・コード ・セグメントの<br />

範囲内にない場合。<br />

#GP( セレクタ ) セグメン ト ・ セレ ク タ ・ インデッ クスがデ ィ スク リ プタ ・<br />

テーブルの範囲外の場合。<br />

リターン・コード ・セグメント ・セレクタのRPL が CPL<br />

より大きい場合。<br />

コンフォーミング・コード ・セグメントのDPL がリター<br />

ン・コード ・セグメント ・セレクタのRPL より大きい場<br />

合。<br />

非コンフォー ミング ・ コー ド ・ セグメン ト の DPL がコー<br />

ド・セグメント・セレクタのRPL に等し く ない場合。<br />

スタック・セグメント ・ディスクリプタのDPL がリター<br />

ン・コード ・セグメント ・セレクタのRPL に等し く ない<br />

場合。<br />

スタック ・セグメン トが書き込み可能なデータ ・セグメン<br />

ト でない場合。<br />

スタック・セグメント ・セレクタのRPL がリターン・<br />

コード ・セグメント ・セレクタのRPL に等し く ない場合。<br />

コー ド ・ セグメン ト のセグメン ト ・ デ ィ スク リ プタが、 そ<br />

れがコ ー ド ・ セグ メ ン ト である こ と を示していない場合。<br />

TSS のセグメン ト ・ セレ ク タのローカル / グローバル ・<br />

ビ ッ ト が ロ ー カ ルに設定されている場合。<br />

TSS のセグメン ト ・ デ ィ スク リ プタが、 その TSS がビ<br />

ジ ー であ る か使用不可能であ る と 指定してい る場合。<br />

#SS(0) スタックのト ップ ・バイ トがスタックの範囲内にない場<br />

合。<br />

#NP( セレクタ ) リターン・コードまたはスタック・セグメントが存在しな<br />

い場合。<br />

3:606 第 3 巻 : IA-32 基本命令リファレンス


IRET/IRETD—Interrupt Return ( 続き )<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP リターン命令ポインタがリターン・コード ・セグメントの<br />

範囲内にない場合。<br />

#SS スタックのト ップ ・バイ トがスタックの範囲内にない場<br />

合。<br />

仮想 8086 モード例外<br />

#GP(0) リターン命令ポインタがリターン・コード ・セグメントの<br />

範囲内にない場合。<br />

IOPL が 3 に等し く ない場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#SS(0) スタックのト ップ ・バイ トがスタックの範囲内にない場<br />

合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:607


Jcc—Jump if Condition Is Met<br />

オペコード 命令 説明<br />

77 cb JA rel8 より上 (CF=0 および ZF=0) の場合 short ジャンプする。<br />

73 cb JAE rel8 より上か等しい (CF=0) 場合 short ジャンプする。<br />

72 cb JB rel8 より下 (CF=1) の場合 short ジャンプする。<br />

76 cb JBE rel8 より下か等しい (CF=1 または ZF=1) 場合 short ジャンプする。<br />

72 cb JC rel8 キャリーがある (CF=1) 場合 short ジャンプする。<br />

E3 cb JCXZ rel8 CX レジスタが 0 の場合 short ジャンプする。<br />

E3 cb JECXZ rel8 ECX レジスタが 0 の場合 short ジャンプする。<br />

74 cb JE rel8 等しい (ZF=1) 場合 short ジャンプする。<br />

7F cb JG rel8 より大きい (ZF=0 および SF=OF) 場合 short ジャンプする。<br />

7D cb JGE rel8 より大きいか等しい (SF=OF) 場合 short ジャンプする。<br />

7C cb JL rel8 より小さい (SFOF) 場合 short ジャンプする。<br />

7E cb JLE rel8 より小さいか等しい (ZF=1 または SFOF) 場合 short ジャンプす<br />

る。<br />

76 cb JNA rel8 より上でない (CF=1 または ZF=1) 場合 short ジャンプする。<br />

72 cb JNAE rel8 より上でなく等しくない (CF=1) 場合 short ジャンプする。<br />

73 cb JNB rel8 より下でない (CF=0) 場合 short ジャンプする。<br />

77 cb JNBE rel8 より下でなく等しくない (CF=0 および ZF=0) 場合 short ジャンプす<br />

る。<br />

73 cb JNC rel8 キャリーがない (CF=0) 場合 short ジャンプする。<br />

75 cb JNE rel8 等しくない (ZF=0) 場合 short ジャンプする。<br />

7E cb JNG rel8 より大きくない (ZF=1 または SFOF) 場合 short ジャンプする。<br />

7C cb JNGE rel8 より大きくなく等しくない (SFOF) 場合 short ジャンプする。<br />

7D cb JNL rel8 より小さくない (SF=OF) 場合 short ジャンプする。<br />

7F cb JNLE rel8 より小さくなく等しくない (ZF=0 および SF=OF) 場合 short ジャン<br />

プする。<br />

71 cb JNO rel8 オーバフローがない (OF=0) 場合 short ジャンプする。<br />

7B cb JNP rel8 パリティがない (PF=0) 場合 short ジャンプする。<br />

79 cb JNS rel8 符号がない (SF=0) 場合 short ジャンプする。<br />

75 cb JNZ rel8 ゼロでない (ZF=0) 場合 short ジャンプする。<br />

70 cb JO rel8 オーバフローがある (OF=1) 場合 short ジャンプする。<br />

7A cb JP rel8 パリティがある (PF=1) 場合 short ジャンプする。<br />

7A cb JPE rel8 パリティが偶数 (PF=1) の場合 short ジャンプする。<br />

7B cb JPO rel8 パリティが奇数 (PF=0) の場合 short ジャンプする。<br />

78 cb JS rel8 符号がある (SF=1) 場合 short ジャンプする。<br />

74 cb JZ rel8 ゼロ (ZF=1) の場合 short ジャンプする。<br />

0F 87 cw/cd JA rel16/32 より上 (CF=0 および ZF=0) の場合 near ジャンプ。<br />

0F 83 cw/cd JAE rel16/32 より上か等しい (CF=0) 場合 near ジャンプする。<br />

0F 82 cw/cd JB rel16/32 より下 (CF=1) の場合 near ジャンプする。<br />

3:608 第 3 巻 : IA-32 基本命令リファレンス


Jcc—Jump if Condition Is Met ( 続き )<br />

オペコード 命令 説明<br />

0F 86 cw/cd JBE rel16/32 より下か等しい (CF=1 または ZF=1) 場合 near ジャンプする。<br />

0F 82 cw/cd JC rel16/32 キャリーがある (CF=1) 場合 near ジャンプする。<br />

0F 84 cw/cd JE rel16/32 等しい (ZF=1) 場合 near ジャンプする。<br />

0F 8F cw/cd JG rel16/32 より大きい (ZF=0 および SF=OF) 場合 near ジャンプする。<br />

0F 8D cw/cd JGE rel16/32 より大きいか等しい (SF=OF) 場合 near ジャンプする。<br />

0F 8C cw/cd JL rel16/32 より小さい (SFOF) 場合 near ジャンプする。<br />

0F 8E cw/cd JLE rel16/32 より小さいか等しい (ZF=1 または SFOF) 場合 near ジャンプす<br />

る。<br />

0F 86 cw/cd JNA rel16/32 より上でない (CF=1 または ZF=1) 場合 near ジャンプする。<br />

0F 82 cw/cd JNAE rel16/32 より上でなく等しくない (CF=1) 場合 near ジャンプする。<br />

0F 83 cw/cd JNB rel16/32 より下でない (CF=0) 場合 near ジャンプする。<br />

0F 87 cw/cd JNBE rel16/32 より下でなく等しくない (CF=0 および ZF=0) 場合 near ジャンプす<br />

る。<br />

0F 83 cw/cd JNC rel16/32 キャリーがない (CF=0) 場合 near ジャンプする。<br />

0F 85 cw/cd JNE rel16/32 等しくない (ZF=0) 場合 near ジャンプする。<br />

0F 8E cw/cd JNG rel16/32 より大きくない (ZF=1 または SFOF) 場合 near ジャンプする。<br />

0F 8C cw/cd JNGE rel16/32 より大きくなく等しくない (SFOF) 場合 near ジャンプする。<br />

0F 8D cw/cd JNL rel16/32 より小さくない (SF=OF) 場合 near ジャンプする。<br />

0F 8F cw/cd JNLE rel16/32 より小さくなく等しくない (ZF=0 および SF=OF) 場合 near ジャン<br />

プする。<br />

0F 81 cw/cd JNO rel16/32 オーバフローがない (OF=0) 場合 near ジャンプする。<br />

0F 8B cw/cd JNP rel16/32 パリティがない (PF=0) 場合 near ジャンプする。<br />

0F 89 cw/cd JNS rel16/32 符号がない (SF=0) 場合 near ジャンプする。<br />

0F 85 cw/cd JNZ rel16/32 ゼロでない (ZF=0) 場合 near ジャンプする。<br />

0F 80 cw/cd JO rel16/32 オーバフローがある (OF=1) 場合 near ジャンプする。<br />

0F 8A cw/cd JP rel16/32 パリティがある (PF=1) 場合 near ジャンプする。<br />

0F 8A cw/cd JPE rel16/32 パリティが偶数 (PF=1) の場合 near ジャンプする。<br />

0F 8B cw/cd JPO rel16/32 パリティが奇数 (PF=0) の場合 near ジャンプする。<br />

0F 88 cw/cd JS rel16/32 符号がある (SF=1) 場合 near ジャンプする。<br />

0F 84 cw/cd JZ rel16/32 ゼロ (ZF=1) の場合 near ジャンプする。<br />

説明<br />

EFLAGS レジスタ内のステータス ・ フラグ (CF、 OF、 PF、 SF、 ZF) の 1 つ以上の状態を<br />

調べ、 それらのフラグが指定された状態 ( 条件 ) にある場合は、 デスティネーション・<br />

オペラ ン ド に よ って指定されたタ ーゲ ッ ト 命令へのジ ャ ンプを実行する。 各命令に特定<br />

の条件コ ー ド (cc) が対応してお り、 テス ト される条件を示している。 条件が満た されな<br />

かった場合は、 ジャンプは実行されず、 Jcc 命令の次の命令から実行が継続される。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:609


Jcc—Jump if Condition Is Met ( 続き )<br />

ターゲッ ト命令は相対オフセット (EIP レジスタ内の命令ポインタの現在値に相対的な符<br />

号付き オ フ セ ッ ト ) で指定される。 相対オフセ ッ ト (rel8、 rel16、 または rel32) は、 アセ<br />

ンブリ ・ コードでは一般的にラベルとして指定されるが、 マシン・ コード ・レベルでは、<br />

符号付き の 8 ビッ トまたは32 ビ ッ ト の即値 と して コ ー ド 化 され、 命令ポ イ ン タ に加算 さ<br />

れる。 この命令のコ ーデ ィ ングは、 -128 ~ +127 のオフセッ ト の場合に最も効率がよい。<br />

オペラン ド ・ サイズ属性が 16 である場合は、 EIP レジスタの上位2バイ ト は 0 にク リア<br />

され、 命令ポインタの最大サイズは 16 ビッ トになる。<br />

各 Jcc ニーモニッ クの条件は、 前 2 ページの表の 「説明」 欄に示している。 「よ り小さ<br />

い」 と 「よ り 大きい」 の表現は、 符号付き整数の比較に使用され、 「よ り上」 と 「よ り<br />

下」 の表現は、 符号なし整数の比較に使用 さ れている。<br />

ス テ ー タ ス ・ フ ラ グの特定の状態は と き と して 2 種類に解釈される こ と があるので、 一<br />

部のオペコ ー ド に対しては 2 つのニーモニ ッ クが定義されている。 例えば、 JA ( より上<br />

の場合ジ ャ ンプ ) 命令 と JNBE ( より下でなく等しくない場合ジャンプ) 命令は、 オペ<br />

コード 77H に対する 2 つのニーモニッ クである。<br />

Jcc 命令では、 far ジャンプ( 他の コ ー ド ・ セグメ ン ト へのジ ャ ンプ ) をサポー ト していな<br />

い。 条件付き ジ ャ ンプのタ ーゲ ッ ト が別のセグ メン ト にある場合は、 Jcc 命令に対する テ<br />

ス ト 対象の条件 と 反対の条件を使用し、 次に他のセグ メ ン ト への無条件 far ジャンプ<br />

(JMP 命令 ) で タ ー ゲ ッ ト にア ク セスする。 例えば、 以下の条件付き far ジャンプは不当<br />

である。<br />

JZ FARLABEL;<br />

このfar ジ ャ ン プを行 う に は、 以下の 2 つの命令を使用する。<br />

JNZ BEYOND;<br />

JMP FARLABEL;<br />

BEYOND:<br />

JECXZ 命令お よ び JCXZ 命令は、 ス テ ー タ ス ・ フ ラ グをチ ェ ッ ク しない点で他の Jcc 命<br />

令とは異なっている。 その代わりに、 これらの命令はそれぞれECX および CX レジスタ<br />

の内容が 0 かどうかをチェ ッ クする。 これらの命令は、 (LOOPNE などの ) 条件付き ルー<br />

プ命令で終了す る条件付き ル ー プの先頭に使用す る と 役立つ。 すなわち、 ECX または<br />

CX レジスタが0 に等しいと きループに入らないよ うにして、 ループがゼロ回でな く そ<br />

れぞれ 232 または 64K 回実行してし ま う のを回避する。<br />

条件付き ジ ャ ンプはすべて、 ジ ャ ンプ ・ ア ド レ ス に も 、 キ ャ ッ シ ュ 可能か ど う かに も 関<br />

係な く 、 1 または 2 キャッシュ ・ ラインのコード ・ フェッチに変換される。<br />

操作<br />

IF condition<br />

THEN<br />

EIP ← EIP + SignExtend(DEST);<br />

IF OperandSize = 16<br />

THEN<br />

EIP ← EIP AND 0000FFFFH;<br />

FI;<br />

IF Itanium System Environment AND PSR.tb THEN IA-32_Exception(Debug);<br />

FI;<br />

影響を受けるフラグ<br />

なし。<br />

3:610 第 3 巻 : IA-32 基本命令リファレンス


Jcc—Jump if Condition Is Met ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

IA-32_Exception 発生した分岐のデバ ッ グ例外 (PSR.tb が 1 の場合 )。<br />

保護モード例外<br />

#GP(0) ジャンプ先のオフセットがCS セグメン ト の範囲を超えて<br />

い る場合。<br />

実アドレス・モード例外<br />

#GP ジャンプ先のオフセットがCS セグメン ト の範囲を超えて<br />

いるか、 または 0 ~ FFFFH の実効ア ド レ ス空間外の場合。<br />

この状態は、 32 アドレス・サイズ・オーバライド ・プリ<br />

フィックスを使用した場合に生じるときがある。<br />

仮想 8086 モード例外<br />

#GP(0) ジャンプ先のオフセッ トがCS セグメン ト の範囲を超えて<br />

いるか、 または 0 ~ FFFFH の実効ア ド レ ス空間外の場合。<br />

この状態は、 32 アドレス・サイズ・オーバライド ・プリ<br />

フィックスを使用した場合に生じるときがある。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:611


JMP—Jump<br />

オペコード 命令 説明<br />

EB cb JMP rel8 near ジャンプ ( 相対アドレス )<br />

E9 cw JMP rel16 near ジャンプ ( 相対アドレス )<br />

E9 cd JMP rel32 near ジャンプ ( 相対アドレス )<br />

FF /4 JMP r/m16 near ジャンプ ( 間接アドレス )<br />

FF /4 JMP r/m32 near ジャンプ ( 間接アドレス )<br />

EA cd JMP ptr16:16 far ジャンプ ( 絶対アドレス )<br />

EA cp JMP ptr16:32 far ジャンプ ( 絶対アドレス )<br />

FF /5 JMP m16:16 far ジャンプ ( 間接アドレス )<br />

FF /5 JMP m16:32 far ジャンプ ( 間接アドレス )<br />

説明<br />

リ タ ー ン情報を記録しないで、 プログラ ムの制御を命令ス ト リ ー ム内の別の点に移す。<br />

デステ ィ ネーシ ョ ン ( ターゲッ ト ) オペラ ン ド に は、 ジ ャ ンプ先の命令のア ド レ ス を指<br />

定する。 こ のオペラ ン ド には、 即値、 汎用レ ジ ス タ、 ま たは メ モ リ ・ ロ ケ ー シ ョ ン を使<br />

用でき る。<br />

• near ジャンプ - 現在の コ ー ド ・ セグ メ ン ト ( 現在の CS レ ジ ス タ の指示先のセグ メ ン<br />

ト ) 内にある命令へのジ ャ ンプ。 セグメン ト 内ジ ャ ンプ と もい う。<br />

• far ジャンプ - 現在の コ ー ド ・ セグ メ ン ト と は異な る セグ メ ン ト 内にある命令への<br />

ジャンプ。 セグメント間コールともいう。<br />

• タスク ・ スイッチ - 異なる タス ク内にある命令へのジ ャ ンプ。 これは far ジャンプの<br />

形式であ る。 Itanium ベース・システム環境では、IA-32_Intercept(Gate) が発生す<br />

る。<br />

タス ク ・ ス イ ッ チは保護モー ド でしか実行できない。 JMP 命令での タ ス ク ・ ス イ ッ チの<br />

詳細は、 『IA-32 インテル ® アーキテクチャ ・ ソフ ト ウェア ・ ディベロッパーズ ・ マニュ<br />

アル、 下巻』 第 6 章を参照のこ と。<br />

near ジ ャ ンプを実行する と、 プロセ ッ サは タ ーゲ ッ ト ・ オペラ ン ド で指定された ( 現在<br />

のコー ド ・ セグメン ト内の ) アドレスにジャンプする。 ターゲット ・オペランドは、 絶<br />

対ア ド レス ( コード ・セグメントのベースからのオフセット ) か、 または相対オフセ ッ<br />

ト (EIP レ ジ ス タ内の命令ポ イ ン タ の現在値に相対的な符号付き オ フ セ ッ ト ) を指定す<br />

る。 絶対オフセッ ト は、 汎用レジスタ またはメモ リ ・ ロケーシ ョ ン (r/m16 または r/m32)<br />

で間接的に指定される。 相対オフセ ッ ト (rel8、 rel16、 または rel32) は、 一般的に、 アセ<br />

ンブリ ・ コードではラベルとして指定されるが、 マシン・ コード ・ レベルでは符号付き<br />

の 8 ビットまたは32 ビット即値としてコード化され、 この値がEIP レジスタの値に ( す<br />

なわち、 JMP 命令の次の命令に ) 加算 さ れる。 絶対ア ド レ ス を示す タ ー ゲ ッ ト ・ オペラ<br />

ンドのサイズ(16 ビットまたは32 ビット ) は、 オペラン ド ・ サイズ属性に よ って決ま<br />

る。 絶対アド レスは、 EIP レジスタに直接ロー ド される。 相対オフセッ トが指定されて<br />

いる場合は、 その値が EIP レジスタの値に加算される。 オペランド ・サイズ属性が16 の<br />

場合は、 EIP レジスタの上位2バイ ト が 0 にク リアされ、 命令ポインタの最大サイズは<br />

16 ビッ トになる。 near ジャンプでは、 CS レジスタは変更されない。<br />

3:612 第 3 巻 : IA-32 基本命令リファレンス


JMP—Jump ( 続き )<br />

far ジ ャ ンプを実行する と、 プロセ ッ サは タ ーゲ ッ ト ・ オペラ ン ド で指定されたコ ー ド ・<br />

セグメント とアドレスにジャンプする。 この場合は、 ターゲッ ト ・ オペランドは、 絶対<br />

far アドレスをポインタ (ptr16:16 または ptr16:32) で直接に、 ま たはメモ リ ・ ロ ケ ーシ ョ<br />

ン (m16:16 または m16:32) で間接的に指定する。 ポ イ ン タ方式では、 4 バイ ト (16 ビッ<br />

ト・オペランド・サイズ) または 6 バイ ト (32 ビッ ト ・オペランド ・サイズ) の far アド<br />

レ ス即値を使用して、 コ ール先プ ロ シ ー ジ ャ のセグ メ ン ト お よ びア ド レ スが命令内に<br />

コ ー ド 化される。 間接方式では、 タ ーゲ ッ ト ・ オペラ ン ド が 4 バイ ト (16 ビッ ト ・オペ<br />

ランド ・ サイズ ) または 6 バイ ト (32 ビッ ト ・オペランド ・サイズ) の far アドレスを内<br />

容とするメモリ ・ ロケーションを指定する。 far アド レスのオフセッ ト のサイズ (16 ビッ<br />

トまたは32 ビッ ト ) は、 オペラン ド ・ サイズ属性に よ って決ま る。 far アドレスは、 CS<br />

およびEIP レジスタに直接ロード される。 オペランド ・サイズ属性が16 である場合は、<br />

EIP レジスタの上位2バイ ト は 0 にクリアされる。<br />

プ ロ セ ッ サが保護モ ー ド で動作している と き は、 far ジャンプを使用して、 コール・ゲー<br />

トを介してコード ・セグメントにアクセスしたり、 タスクを切り替えられる。 この場合、<br />

プロセッサは、 far アドレスのセグメント ・セレクタ部を使用して、 ジャンプ先セグメン<br />

トのセグメント ・ディスク リプタにアクセスする。 JMP 命令は、 セグ メ ン ト ・ セ レ ク タ<br />

内のタ イプおよ びアク セス権情報の値に基づいて、 以下の操作を実行でき る。<br />

• コンフォーミングまたは非コンフォーミングのコード ・セグメントへのfar ジャン<br />

プ。 ( 前の段落で説明した far ジャンプと同じ機構であるが、 プロセッサがジャンプ<br />

先の コ ー ド ・ セグメ ン ト のア クセス権をチェ ッ ク する点が異なる )。<br />

• コール・ゲートを介したfar ジャンプ。<br />

• タスク ・ スイッチ。 Itanium ベース・システム環境では、IA-32_Intercept(Gate) が発<br />

生する。<br />

JMP 命令を使用して特権レベル間の far ジャンプを実行することはできない。<br />

コール・ゲートを介してfar ジャンプを実行するときは、 ターゲット ・オペランドに<br />

よって指定されたセグメント ・セレクタによってコール・ゲートが識別される。 ( ター<br />

ゲッ ト ・オペランドのオフセッ ト部は無視される。 ) そこで、 プロセッサはコール・ゲー<br />

ト・ディスクリプタで指定されたコード・セグメントにジャンプし、ゲートで指定され<br />

たオ フ セ ッ ト か ら命令の実行を開始する。 ス タ ッ ク ・ ス イ ッ チは行われない。 こ の場合<br />

もやはり、 ターゲッ ト ・ オペランドは、 コール・ゲー トおよび命令のfar アドレスをポ<br />

インタ (ptr16:16 または ptr16:32) で直接に も、 メモ リ ・ ロ ケ ーシ ョ ン (m16:16 または<br />

m16:32) で間接的に も指定でき る。<br />

JMP 命令でタ ス ク ・ ス イ ッ チを実行する のは、 コ ール ・ ゲー ト を介したジ ャ ンプを実行<br />

す る のに似てい る。 タ ス ク ・ ス イ ッ チの場合は、 タ ー ゲ ッ ト ・ オペラ ン ド は、 切 り 替え<br />

先タスクへのタスク ・ ゲー ト のセグメン ト ・ セレ クタを指定する ( ターゲッ ト ・ オペラ<br />

ンドのオフセット部は無視される)。 このタスク ・ ゲー ト は、 切り替え先タスクの TSS<br />

を指す。 この TSS には、 そのタスクのコード ・セグメント、 データ・セグメント、 ス<br />

タ ッ ク ・ セグメン ト のセグメン ト ・ セレ ク タ と、 ターゲッ ト 命令への命令ポインタが格<br />

納されている。 JMP 命令には、 タ ス ク ・ ゲ ー ト を通 ら ずに、 TSS に直接ジ ャ ンプする命<br />

令形式 も ある。 タ ス ク ・ ス イ ッ チの仕組みの詳細は、 『IA-32 インテル ® アーキテク<br />

チャ ・ ソフ ト ウェア・ディベロッパーズ・マニュアル、 下巻』 第13 章を参照のこ と。<br />

すべての分岐は、 ジ ャンプ ・ ア ド レスやキャ ッ シュの可否に関係な く 、 1 つまたは 2 つ<br />

のキャ ッシュ ・ ラインのコ ー ド ・ フ ェ ッチに変換される。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:613


JMP—Jump ( 続き )<br />

操作<br />

IF near jump<br />

THEN IF near relative jump<br />

THEN<br />

tempEIP ← EIP + DEST; (* EIP is instruction following JMP instruction*)<br />

ELSE (* near absolute jump *)<br />

tempEIP ← DEST;<br />

FI;<br />

IF tempEIP is beyond code segment limit THEN #GP(0); FI;<br />

IF OperandSize = 32<br />

THEN<br />

EIP ← tempEIP;<br />

ELSE (* OperandSize=16 *)<br />

EIP ← tempEIP AND 0000FFFFH;<br />

FI;<br />

IF Itanium System Environment AND PSR.tb THEN IA-32_Exception(Debug);<br />

FI:<br />

IF far jump AND (PE = 0 OR (PE = 1 AND VM = 1)) (* real address or virtual 8086 mode *)<br />

THEN<br />

tempEIP ← DEST(offset); (* DEST is ptr16:32 or [m16:32] *)<br />

IF tempEIP is beyond code segment limit THEN #GP(0); FI;<br />

CS ← DEST(segment selector); (* DEST is ptr16:32 or [m16:32] *)<br />

IF OperandSize = 32<br />

THEN<br />

EIP ← tempEIP; (* DEST is ptr16:32 or [m16:32] *)<br />

ELSE (* OperandSize = 16 *)<br />

EIP ← tempEIP AND 0000FFFFH; (* clear upper 16 bits *)<br />

FI;<br />

IF Itanium System Environment AND PSR.tb THEN IA-32_Exception(Debug);<br />

FI;<br />

IF far call AND (PE = 1 AND VM = 0) (* Protected mode, not virtual 8086 mode *)<br />

THEN<br />

IF effective address in the CS, DS, ES, FS, GS, or SS segment is illegal<br />

OR segment selector in target operand null<br />

THEN #GP(0);<br />

FI;<br />

IF segment selector index not within descriptor table limits<br />

THEN #GP(new selector);<br />

FI;<br />

Read type and access rights of segment descriptor;<br />

IF segment type is not a conforming or nonconforming code segment, call gate,<br />

task gate, or TSS THEN #GP(segment selector); FI;<br />

Depending on type and access rights<br />

GO TO CONFORMING-CODE-SEGMENT;<br />

GO TO NONCONFORMING-CODE-SEGMENT;<br />

GO TO CALL-GATE;<br />

GO TO TASK-GATE;<br />

GO TO TASK-STATE-SEGMENT;<br />

ELSE<br />

#GP(segment selector);<br />

FI;<br />

3:614 第 3 巻 : IA-32 基本命令リファレンス


JMP—Jump ( 続き )<br />

CONFORMING-CODE-SEGMENT:<br />

IF DPL > CPL THEN #GP(segment selector); FI;<br />

IF segment not present THEN #NP(segment selector); FI;<br />

tempEIP ← DEST(offset);<br />

IF OperandSize=16<br />

THEN tempEIP ← tempEIP AND 0000FFFFH;<br />

FI;<br />

IF tempEIP not in code segment limit THEN #GP(0); FI;<br />

CS ← DEST(SegmentSelector); (* segment descriptor information also loaded *)<br />

CS(RPL) ← CPL<br />

EIP ← tempEIP;<br />

IF Itanium System Environment AND PSR.tb THEN IA-32_Exception(Debug);<br />

END;<br />

NONCONFORMING-CODE-SEGMENT:<br />

IF (RPL > CPL) OR (DPL ≠ CPL) THEN #GP(code segment selector); FI;<br />

IF segment not present THEN #NP(segment selector); FI;<br />

IF instruction pointer outside code segment limit THEN #GP(0); FI;<br />

tempEIP ← DEST(offset);<br />

IF OperandSize=16<br />

THEN tempEIP ← tempEIP AND 0000FFFFH;<br />

FI;<br />

IF tempEIP not in code segment limit THEN #GP(0); FI;<br />

CS ← DEST(SegmentSelector); (* segment descriptor information also loaded *)<br />

CS(RPL) ← CPL<br />

EIP ← tempEIP;<br />

IF Itanium System Environment AND PSR.tb THEN IA-32_Exception(Debug);<br />

END;<br />

CALL-GATE:<br />

IF call gate DPL < CPL<br />

OR call gate DPL < call gate segment-selector RPL<br />

THEN #GP(call gate selector); FI;<br />

IF call gate not present THEN #NP(call gate selector); FI;<br />

IF Itanium System Environment THEN IA-32_Intercept(Gate,JMP);<br />

IF call gate code-segment selector is null THEN #GP(0); FI;<br />

IF call gate code-segment selector index is outside descriptor table limits<br />

THEN #GP(code segment selector); FI;<br />

Read code segment descriptor;<br />

IF code-segment segment descriptor does not indicate a code segment<br />

OR code-segment segment descriptor is conforming and DPL > CPL<br />

OR code-segment segment descriptor is non-conforming and DPL ≠ CPL<br />

THEN #GP(code segment selector); FI;<br />

IF code segment is not present THEN #NP(code-segment selector); FI;<br />

IF instruction pointer is not within code-segment limit THEN #GP(0); FI;<br />

tempEIP ← DEST(offset);<br />

IF GateSize=16<br />

THEN tempEIP ← tempEIP AND 0000FFFFH;<br />

FI;<br />

IF tempEIP not in code segment limit THEN #GP(0); FI;<br />

CS ← DEST(SegmentSelector); (* segment descriptor information also loaded *)<br />

CS(RPL) ← CPL<br />

EIP ← tempEIP;<br />

第 3 巻 : IA-32 基本命令リファレンス 3:615


JMP—Jump ( 続き )<br />

END;<br />

TASK-GATE:<br />

IF task gate DPL < CPL<br />

OR task gate DPL < task gate segment-selector RPL<br />

THEN #GP(task gate selector); FI;<br />

IF task gate not present THEN #NP(gate selector); FI;<br />

IF Itanium System Environment THEN IA-32_Intercept(Gate,JMP);<br />

Read the TSS segment selector in the task-gate descriptor;<br />

IF TSS segment selector local/global bit is set to local<br />

OR index not within GDT limits<br />

OR TSS descriptor specifies that the TSS is busy<br />

THEN #GP(TSS selector); FI;<br />

IF TSS not present THEN #NP(TSS selector); FI;<br />

SWITCH-TASKS to TSS;<br />

IF EIP not within code segment limit THEN #GP(0); FI;<br />

END;<br />

TASK-STATE-SEGMENT:<br />

IF TSS DPL < CPL<br />

OR TSS DPL < TSS segment-selector RPL<br />

OR TSS descriptor indicates TSS not available<br />

THEN #GP(TSS selector); FI;<br />

IF TSS is not present THEN #NP(TSS selector); FI;<br />

IF Itanium System Environment THENIA-32_Intercept(Gate,JMP);<br />

SWITCH-TASKS to TSS<br />

IF EIP not within code segment limit THEN #GP(0); FI;<br />

END;<br />

影響を受けるフラグ<br />

タス ク ・ ス イ ッ チが行われた場合はすべてのフ ラグが影響を受け、 タス ク ・ ス イ ッ チが<br />

行われなか っ た場合は どのフ ラグ も影響を受けない。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

IA-32_Intercept CALL ゲー ト、 タスク ・ ゲー ト、 タスク ・ セグメン ト を介<br />

した JMP でのゲー ト ・ インターセプ ト 。<br />

IA-32_Exception 発生した分岐のデバ ッ グ例外 (PSR.tb が 1 の場合 )。<br />

3:616 第 3 巻 : IA-32 基本命令リファレンス


JMP—Jump ( 続き )<br />

保護モード例外<br />

#GP(0) ターゲッ ト ・オペランド、 コール・ゲート、 または TSS<br />

内のオ フセ ッ ト がコ ー ド ・ セグメ ン ト の範囲を超えている<br />

場合。<br />

デステ ィ ネーシ ョ ン ・ オペラン ド、 コール ・ ゲー ト、 タス<br />

ク・ゲート、 またはTSS 内のセグメ ン ト ・ セレ ク タが<br />

NULL の場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタを使用してメモリがア<br />

クセスされ、 レジスタの内容が NULL セグメン ト ・ セレ<br />

クタであった場合。<br />

#GP( セレクタ ) セグメン ト ・ セレ ク タ ・ インデッ クスがデ ィ スク リ プタ ・<br />

テーブルの範囲外の場合。<br />

デステ ィ ネーシ ョ ン ・ オペラン ド内のセグメン ト ・ セレク<br />

タによって指されているセグメン ト ・ディスク リプタが、<br />

コンフォーミング・コード ・セグメント、 非コンフォーミ<br />

ング・コード ・セグメント、 コール・ゲート、 タスク・<br />

ゲー ト 、 タス ク ・ ステー ト ・ セグメン ト のいずれのデ ィ ス<br />

ク リ プ タ で も ない場合。<br />

非コンフォー ミング ・ コー ド ・ セグメン ト の DPL が CPL<br />

に等し く ない場合。<br />

( コ ー ル ・ ゲー ト を使用しない場合 ) セグメン ト のセグメ<br />

ント ・セレクタのRPL が CPL より大きい場合。<br />

コンフォーミング・コード ・セグメントのDPL が CPL よ<br />

り 大き い場合。<br />

コール ・ ゲー ト、 タスク ・ ゲー ト、 または TSS のセグメ<br />

ント ・ディスクリプタからのDPL が CPL より小さいか、<br />

あるいはコール・ゲート、 タスク ・ゲート、 またはTSS<br />

のセグメン ト ・ セレ ク タの RPL よ り 小さ い場合。<br />

コール・ゲート内のセレクタのセグメント ・ディスクリプ<br />

タが、 それがコー ド ・ セグメン ト であるこ とを示していな<br />

い場合。<br />

タスク ・ゲー ト内のセグメント ・セレクタのセグメン ト ・<br />

デ ィ ス ク リ プ タ が使用可能な TSS を示していない場合。<br />

TSS のセグメン ト ・ セレ ク タのローカル / グローバル ・<br />

ビ ッ ト が ロ ー カ ルに設定されている場合。<br />

TSS のセグメン ト ・ デ ィ スク リ プタが、 その TSS がビ<br />

ジ ー であ る か使用不可能であ る と 指定してい る場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NP( セレクタ ) ア ク セス さ れる コ ー ド ・ セグ メ ン ト が存在しない場合。<br />

コール ・ ゲー ト、 タスク ・ ゲー ト、 または TSS が存在し<br />

ない場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:617


JMP—Jump ( 続き )<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。 ( メモリからターゲッ ト をフェ ッチ<br />

すると きだけ発生する。 )<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#GP(0) ターゲッ ト ・オペランドがコード ・セグメントの範囲を超<br />

えてい る場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。 ( メモリ<br />

からターゲッ トをフェッチするときだけ発生する。 )<br />

3:618 第 3 巻 : IA-32 基本命令リファレンス


JMPE - Jump to Intel ® Itanium ® Instruction Set<br />

オペコード 命令 説明<br />

0F 00 /6 JMPE r/m16 インテル ® Itanium ® 命令セットへのジャンプ (r/m16 で指定される間<br />

接アドレス )<br />

0F 00 /6 JMPE r/m32 インテル ® Itanium ® 命令セットへのジャンプ (r/m32 で指定される間<br />

接アドレス )<br />

0F B8 JMPE disp16 インテル ® Itanium ® 命令セットへのジャンプ (addr16 で指定される絶<br />

対アドレス )<br />

0F B8 JMPE disp32 インテル ® Itanium ® 命令セットへのジャンプ (addr32 で指定される絶<br />

対アドレス )<br />

説明<br />

この命令は、 Itanium ベース ・ システム環境内の Itanium アーキテクチャに基づく プロ<br />

セ ッ サ上でのみ使用で き る。 それ以外の場合は、 こ の命令を特権レ ベル 1、 2、 3 で実行<br />

する と、 無効オペコー ド ・ フォルトが発生し、 特権レベル0 で実行する と、 Itanium アー<br />

キテクチャに基づく プロセッサ上の IA-32 システム環境が終了する。<br />

JMPE 命令は、 プ ロセ ッ サを Itanium 命令セ ッ ト に切 り 替え、 指定されたタ ーゲ ッ ト ・ ア<br />

ド レ スで実行を開始す る。 こ の命令に は、 間接形式 (r/m16、 r/m32) と 符号なし絶対形式<br />

(disp16、 disp32) の 2 つの形式がある。 いずれの形式も、 16 ビッ ト ・フォーマット と 32<br />

ビッ ト ・フォーマットをサポートしている。 絶対形式の JMPE 命令は、 符号なし 16 ビットまたは32 ビット ・ディスプレースメント<br />

を現在の CS ベースに加算する と、 Itanium 命令セ ッ ト 内の 16 バイ ト にアライメン ト の<br />

合った 64 ビッ ト仮想ターゲット ・アドレスを計算する(IP{31:0} = disp16/32 +<br />

CSD.base)。 間接形式の JMPE 命令は、 レ ジ ス タ ま たは メ モ リ ・ ロ ケ ー シ ョ ンの内容に<br />

よ っ て、 仮想タ ー ゲ ッ ト ・ ア ド レ ス を指定する (IP{31:0} = [r/m16/32] + CSD.base)。 ター<br />

ゲッ ト ・アドレスは、 仮想リージョン0 の中の 64 ビ ッ ト 仮想ア ド レ ス空間の下位 4G バ<br />

イトに制限されている。<br />

GR[1] には、 JMPE の次のシ ー ケンシ ャ ル命令のア ド レ スがロ ー ド される。<br />

PSR.di が 1 の場合は、 命令は無効に さ れ、 命令セ ッ ト 移行無効フ ォ ル ト が発生する。<br />

Itanium アーキテクチャ分岐デバッグがイネーブルにされている場合は、 JMPE 命令の完<br />

了後に、 IA-32_Exception( デバ ッ グ ) トラップが発生する。<br />

JMPE 命令は、 任意の特権レベルで実行で き、 プロ セ ッ サの特権レベルを変更しない。<br />

JMPE 命令は、 FWAIT 操作を実行す る。 JMPE 命令を実行す る と 、 未処理のマス ク さ れ<br />

ていない IA-32 浮動小数点例外は フ ォ ル ト と して報告 さ れる。<br />

JMPE 命令は、 メ モ リ ・ フ ェ ンス操作やシ リ アル化操作を実行しない。<br />

JMPE 命令が正常に実行される と 、 EFLAG.rf と PSR.id が 0 にク リアされる。<br />

レジスタ ・ スタック ・エンジンの即時実行がイネーブルにされている場合は、 プロセッ<br />

サが Itanium 命令セ ッ ト に移行した と き、 レ ジ ス タ ・ ス タ ッ ク ・ エン ジ ンは、 レ ジ ス タ<br />

のロー ド をただちに開始できる。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:619


JMPE—Jump to Intel ® Itanium ® Instruction Set ( 続き )<br />

操作<br />

if (NOT Itanium System Environment) {<br />

if (PSR.cpl==0) Terminate_IA-32_System_Env();<br />

else IA_32_Exception(IllegalOpcode);<br />

} else if (PSR.di==1) {<br />

Disabled_Instruction_Set_Transition_Fault();<br />

} else if (pending_numeric_exceptions()) {<br />

IA_32_exception(FPError);<br />

} else {<br />

if (absolute_form) { //compute virtual target<br />

IP{31:0} = disp16/32 + AR[CSD].base; //disp is 16/32-bit unsigned<br />

value<br />

} else if (indirect_form) {<br />

IP{31:0} = [r/m16/32] + AR[CSD].base;<br />

}<br />

PSR.is = 0; //set Itanium Instruction Set bit<br />

IP{3:0}= 0; //Force 16-byte alignment<br />

IP{63:32} = 0; //zero extend from 32-bits to<br />

64-bits<br />

GR[1]{31:0} = EIP + AR[CSD].base; //next sequential instruction<br />

address<br />

GR[1]{63:32} = 0;<br />

}<br />

PSR.id = EFLAG.rf = 0;<br />

if (PSR.tb) //taken branch trap<br />

IA_32_Exception(Debug);<br />

影響を受けるフラグ<br />

(EFLAG.rf 以外には ) なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

無効な ISA 命令セ ッ ト 移行無効フ ォ ル ト (PSR.di が 1 の場合 )。<br />

IA-32_Exception 浮動小数点エラ ー ( 未処理の浮動小数点例外があ る場合 )。<br />

IA-32_Exception 分岐発生 ト ラ ッ プ (PSR.tb が 1 の場合 )。<br />

IA-32 システム環境例外 ( すべての動作モード )<br />

#UD JMPE 命令を特権レ ベル 1、 2、 3 で実行する と、 無効オペ<br />

コード例外が発生する。 特権レベル0 で実行する と、<br />

Itanium アーキテクチャのプロセッサ上の IA-32 システム<br />

環境が終了する。<br />

3:620 第 3 巻 : IA-32 基本命令リファレンス


LAHF—Load Status Flags into AH Register<br />

オペコード 命令 説明<br />

9F LAHF AH に EFLAGS(SF:ZF:0:AF:0:PF:1:CF) をロードする。<br />

説明<br />

EFLAGS レジスタの下位バイト ( ここにはステータス・フラグSF、 ZF、 AF、 PF、 CF が<br />

ある ) を AH レジスタに転送する。 EFLAGS レジスタの予約ビット 1、 3、 5 は、 AH レジ<br />

スタ内では下記の 「操作」 に示すよ うに設定される。<br />

操作<br />

AH ← EFLAGS(SF:ZF:0:AF:0:PF:1:CF);<br />

影響を受けるフラグ<br />

なし ( すなわち、 EFLAGS レジスタ内のフラグの状態は影響を受けない )。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

例外 ( すべての操作モード )<br />

なし。<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:621


LAR—Load Access Rights Byte<br />

オペコード 命令 説明<br />

0F 02 /r LAR r16,r/m16 r16 ← FF00H でマスクされた r/m16。<br />

0F 02 /r LAR r32,r/m32 r32 ← 00FxFF00H でマスクされた r/m32。<br />

説明<br />

第 2 オペラン ド ( ソース・オペランド ) によって指定されたセグメント ・ディスク リプ<br />

タから第 1 オペラン ド ( デステ ィ ネーシ ョ ン ・ オペラン ド ) にアクセス権をロー ド し、<br />

EFLAGS レジスタ内のZF フラグをセットする。 ソース ・ オペランド ( レジスタまたはメ<br />

モリ ・ロケーション) の内容は、 アクセスされるセグメント ・ディスクリプタのセグメ<br />

ント ・セレクタである。 デスティネーション・オペランドは、 汎用レジスタである。<br />

プロセッサは、 ロー ド ・ プロセスの一環としてアクセス ・ チェ ッ クを行う。 デスティ<br />

ネーション ・ レジスタにロード されると、 ソフ ト ウェアはアクセス権情報をさらに追加<br />

チェックできる。<br />

オペラン ド ・ サイズが 32 ビッ トのときは、 セグメント ・ディスクリプタに対するアクセ<br />

ス権には、 タ イプ ・ フ ィ ール ド および DPL フィールドと、 S、 P、 AVL、 D/B、 G フラグ<br />

が含まれ、 これら はすべてセグメ ン ト ・ デ ィ ス ク リ プタの 2 番目のダブル ワ ー ド ( バイ<br />

ト 4 ~ 7) 内にある。 このダブルワ ー ド は、 00FXFF00H でマスク されてからデステ ィ<br />

ネーション ・ オペランドにロー ド される。 オペランド ・サイズが 16 ビットのときは、 ア<br />

クセス権にはタイプ ・ フィールドおよび DPL フィールドが含まれる。 この場合は、 ダブ<br />

ルワー ドの下位2 バイ ト が FF00H でマスク されてからデステ ィ ネーシ ョ ン ・ オペラン ド<br />

にロー ド される。<br />

この命令では、 アクセス権をデスティネーション・レジスタにロードする前に以下の<br />

チェックを行う。<br />

• セグメン ト ・ セレ ク タが NULL でないこ と を確認する。<br />

• セグ メ ン ト ・ セ レ ク タ の指示先がア ク セス さ れる GDT または LDT の範囲内のデ ィ<br />

スクリプタであることを確認する。<br />

• デ ィ ス ク リ プ タ の タ イ プが こ の命令に対して有効であ る こ と を確認する。 LAR 命令<br />

に対しては、 すべてのコ ー ド ・ セグメン ト ・ デ ィ スク リ プタ とデー タ ・ セグメン ト ・<br />

ディスクリプタが有効である( すなわち、 LAR 命令でア ク セスで き る )。 有効なシス<br />

テム ・ セグメン ト およびゲー ト のデ ィ スク リ プタ ・ タ イプが下記の表に示している。<br />

• セグ メ ン ト が コ ン フ ォ ー ミ ン グ ・ コ ー ド ・ セグ メ ン ト でない場合は、 こ の命令は指<br />

定されたセグメント ・ ディスク リプタが CPL でアクセスでき る ( すなわち、 CPL と<br />

セグメン ト ・ セレ ク タの RPL がセグメン ト ・ セレ ク タの DPL 以下である ) かを確認<br />

する。<br />

セグメン ト ・ ディ スク リ プタがアクセスできないか、 またはこの命令に と って無効なタ<br />

イプである場合は、 ZF フラグがクリアされ、 アクセス権は何もデスティネーション ・ オ<br />

ペラン ド にロー ド されない。<br />

LAR 命令は保護モー ド でしか実行する こ と ができない。<br />

3:622 第 3 巻 : IA-32 基本命令リファレンス


LAR—Load Access Rights Byte ( 続き )<br />

表 1-15. LAR ディスクリプタの有効性<br />

操作<br />

タイプ 名前 有効 / 無効<br />

0 予約済み 無効<br />

1 使用可能 16 ビット TSS 有効<br />

2 LDT 有効<br />

3 ビジー 16 ビット TSS 有効<br />

4 16 ビット・コール・ゲート 有効<br />

5 16 ビット /32 ビット・タスク・ゲート 有効<br />

6 16 ビット・トラップ・ゲート 無効<br />

7 16 ビット割り込みゲート 無効<br />

8 予約済み 無効<br />

9 使用可能 32 ビット TSS 有効<br />

A 予約済み 無効<br />

B ビジー 32 ビット TSS 有効<br />

C 32 ビット・コール・ゲート 有効<br />

D 予約済み 無効<br />

E 32 ビット・トラップ・ゲート 無効<br />

F 32 ビット割り込みゲート 無効<br />

IF SRC(Offset) > descriptor table limit THEN ZF ← 0; FI;<br />

Read segment descriptor;<br />

IF SegmentDescriptor(Type) ≠ conforming code segment<br />

AND (CPL > DPL) OR (RPL > DPL)<br />

OR Segment type is not valid for instruction<br />

THEN<br />

ZF ← 0<br />

ELSE<br />

IF OperandSize = 32<br />

THEN<br />

DEST ← [SRC] AND 00FxFF00H;<br />

ELSE (*OperandSize = 16*)<br />

DEST ← [SRC] AND FF00H;<br />

FI;<br />

FI;<br />

影響を受けるフラグ<br />

アクセス権が正常にロード された場合は ZF フラグが1 にセッ ト され、 ロー ド できな<br />

かった場合は 0 にクリアされる。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:623


LAR—Load Access Rights Byte ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタを使用してメモリがア<br />

クセスされ、 レジスタの内容が NULL セグメン ト ・ セレ<br />

クタであった場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。 ( メモリからターゲッ ト をフェ ッチ<br />

すると きだけ発生する。 )<br />

実アドレス・モード例外<br />

#UD LAR 命令は実ア ド レ ス ・ モー ド では認識 さ れない。<br />

仮想 8086 モード例外<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

#UD LAR 命令は仮想 8086 モー ドでは認識されない。<br />

3:624 第 3 巻 : IA-32 基本命令リファレンス


LDS/LES/LFS/LGS/LSS—Load Far Pointer<br />

オペコード 命令 説明<br />

C5 /r LDS r16,m16:16 メモリから DS:r16 に far ポインタをロードする。<br />

C5 /r LDS r32,m16:32 メモリから DS:r32 に far ポインタをロードする。<br />

0F B2 /r LSS r16,m16:16 メモリから SS:r16 に far ポインタをロードする。<br />

0F B2 /r LSS r32,m16:32 メモリから SS:r32 に far ポインタをロードする。<br />

C4 /r LES r16,m16:16 メモリから ES:r16 に far ポインタをロードする。<br />

C4 /r LES r32,m16:32 メモリから ES:r32 に far ポインタをロードする。<br />

0F B4 /r LFS r16,m16:16 メモリから FS:r16 に far ポインタをロードする。<br />

0F B4 /r LFS r32,m16:32 メモリから FS:r32 に far ポインタをロードする。<br />

0F B5 /r LGS r16,m16:16 メモリから GS:r16 に far ポインタをロードする。<br />

0F B5 /r LGS r32,m16:32 メモリから GS:r32 に far ポインタをロードする。<br />

説明<br />

第 2 オペラン ド ( ソース・オペランド ) からセグメント ・ レジスタおよび第1 オペラン<br />

ド ( デステ ィ ネーシ ョ ン ・ オペラン ド ) に far ポインタ ( セグメン ト ・ セレ ク タ と オフ<br />

セッ ト ) をロー ドする。 ソース ・ オペラン ド には、 オペラン ド ・ サイズ属性の現在の設<br />

定 (32 ビッ トまたは16 ビッ ト ) に応じて、 48 ビッ トまたは32 ビッ トのメモリ内ポイン<br />

タを指定する。 命令のオペコ ー ド とデステ ィ ネーシ ョ ン ・ オペラン ド には、 セグメン<br />

ト・レジスタ/ 汎用レ ジ ス タ ・ ペアを指定す る。 ソ ー ス ・ オペラ ン ド か ら の 16 ビッ ト ・<br />

セグ メ ン ト ・ セ レ ク タ は、 オペ コ ー ド で暗黙に示 さ れたセグ メ ン ト ・ レ ジ ス タ (DS、 SS、<br />

ES、 FS、 または GS) にロード される。 32 ビッ トまたは16 ビッ トのオフセットは、 デス<br />

テ ィ ネ ー シ ョ ン ・ オペラ ン ド で指定 さ れたレ ジ ス タ に ロ ー ド さ れる。<br />

こ れ ら の命令の 1 つを保護モー ド で実行した場合は、 ソ ー ス ・ オペラ ン ド のセグ メ ン<br />

ト・セレクタが指しているセグメント・ディスクリプタからの追加情報が、選択された<br />

セグメン ト ・ レジスタの見えない部分にロー ド される。<br />

保護モー ド で も 、 保護例外を発生さ せる こ と な く 、 DS、 ES、 FS、 または GS レジスタに<br />

NULL セレクタ (0000 ~ 0003 の値 ) をロー ドできる。 ( ロ ー ド さ れる と 、 以降は、 対応<br />

するセグメン ト ・ レジスタに NULL セレクタがロー ド されているセグメント を参照しよ<br />

う と する と 、 必ず一般保護例外 (#GP) が発生し、 そのセグ メン ト へのメモ リ 参照は行わ<br />

れない。 )<br />

操作<br />

IF ProtectedMode<br />

THEN IF SS is loaded<br />

THEN IF SegementSelector = null<br />

THEN #GP(0);<br />

FI;<br />

ELSE IF Segment selector index is not within descriptor table limits<br />

OR Segment selector RPL ≠ CPL<br />

OR Access rights indicate nonwritable data segment<br />

OR DPL ≠ CPL<br />

THEN #GP(selector);<br />

FI;<br />

ELSE IF Segment marked not present<br />

THEN #SS(selector);<br />

FI;<br />

第 3 巻 : IA-32 基本命令リファレンス 3:625


LDS/LES/LFS/LGS/LSS—Load Far Pointer ( 続き )<br />

SS ← SegmentSelector(SRC);<br />

SS ← SegmentDescriptor([SRC]);<br />

ELSE IF DS, ES, FS, or GS is loaded with non-null segment selector<br />

THEN IF Segment selector index is not within descriptor table limits<br />

OR Access rights indicate segment neither data nor readable code segment<br />

OR (Segment is data or nonconforming-code segment<br />

AND both RPL and CPL > DPL)<br />

THEN #GP(selector);<br />

FI;<br />

ELSE IF Segment marked not present<br />

THEN #NP(selector);<br />

FI;<br />

SegmentRegister ← SegmentSelector(SRC) AND RPL;<br />

SegmentRegister ← SegmentDescriptor([SRC]);<br />

ELSE IF DS, ES, FS or GS is loaded with a null selector:<br />

SegmentRegister ← NullSelector;<br />

SegmentRegister(DescriptorValidBit) ← 0; (*hidden flag; not accessible by software*)<br />

FI;<br />

FI;<br />

IF (Real-Address or Virtual 8086 Mode)<br />

THEN<br />

SS ← SegmentSelector(SRC);<br />

FI;<br />

DEST ← Offset(SRC);<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#UD ソース・オペランドがメモリ ・ ロケーションでない場合。<br />

#GP(0) SS レジスタに NULL セレクタがロー ド された場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタを使用してメモリがア<br />

クセスされ、 レジスタの内容が NULL セグメン ト ・ セレ<br />

クタであった場合。<br />

3:626 第 3 巻 : IA-32 基本命令リファレンス


LDS/LES/LFS/LGS/LSS—Load Far Pointer ( 続き )<br />

#GP( セレクタ ) SS レ ジス タがロ ー ド されよ う と した と き、 次のいずれか<br />

が真であ っ た場合。 (1) セグメン ト ・ セレク タ ・ インデッ<br />

ク スがデ ィ ス ク リ プ タ ・ テ ー ブルの範囲内でない。 (2) セ<br />

グメン ト ・セレクタの RPL が CPL に等し く ない。 (3) セグ<br />

メ ン ト が書き込み不可能なデー タ ・ セグメ ン ト である。<br />

(4) DPL が CPL に等し く ない。<br />

DS、 ES、 FS、 または GS レジスタに NULL でないセグメ<br />

ント ・セレクタがロードされようとしたとき、 次のいずれ<br />

かが真であ っ た場合。 (1) セグメン ト ・ セレク タ ・ イン<br />

デッ ク スがデ ィ スク リ プタ ・ テーブルの範囲内でない。<br />

(2) セグメントがデータ ・セグメントでも読み出し可能な<br />

コード ・セグメントでもない。 (3) セグメン ト がデータ ・<br />

セグメント または非コンフォーミング ・ コード ・セグメン<br />

トであり、 かつRPL と CPL がと もに DPL より大きい。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#SS( セレクタ ) SS レジスタがロード されよう としたとき、 セグメントが<br />

存在しない と マ ー ク さ れていた場合。<br />

#NP( セレクタ ) DS、 ES、 FS、 または GS レジスタに NULL でないセグメ<br />

ント ・セレクタがロードされようとしたとき、 セグメント<br />

が存在しない と マー ク されていた場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#UD ソース・オペランドがメモリ ・ ロケーションでない場合。<br />

仮想 8086 モード例外<br />

#UD ソース・オペランドがメモリ ・ ロケーションでない場合。<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:627


LEA—Load Effective Address<br />

オペコード 命令 説明<br />

8D /r LEA r16,m m の実効アドレスをレジスタ r16 にストアする。<br />

8D /r LEA r32,m m の実効アドレスをレジスタ r32 にストアする。<br />

説明<br />

第 2 オペラン ド ( ソース・オペランド ) の実効ア ド レ ス を計算し、 第 1 オペラン ド ( デス<br />

ティネーション・オペランド ) にス トアする。 ソース ・ オペラン ド は、 プロセッサのア<br />

ドレス指定モードの1 つで指定 さ れたメ モ リ ・ ア ド レ ス ( オフセッ ト部) である。 デス<br />

テ ィ ネ ー シ ョ ン ・ オペラ ン ド は、 汎用レ ジ ス タ である。 こ の命令が実行す る処理は、 以<br />

下の表に示す よ う に、 ア ド レ ス ・ サ イ ズ属性お よ びオペラ ン ド ・ サ イ ズ属性に よ っ て変<br />

わ る。 こ の命令のオペラ ン ド ・ サ イ ズ属性は選択 さ れたレ ジ ス タ に よ っ て決 ま り 、 ア ド<br />

レス・サイズ属性はコード ・セグメントの属性によって決まる。<br />

表 1-16. LEA のアドレスとオペランド・サイズ<br />

オペランド・<br />

サイズ<br />

アセンブ ラ が異な る と 、 ソ ー ス ・ オペラ ン ド のサイ ズ属性 と 記号参照に基づいて、 使用<br />

されるアルゴリズムが変わる場合もある。<br />

操作<br />

アドレス・<br />

サイズ<br />

IF OperandSize = 16 AND AddressSize = 16<br />

THEN<br />

DEST ← EffectiveAddress(SRC); (* 16-bit address *)<br />

ELSE IF OperandSize = 16 AND AddressSize = 32<br />

THEN<br />

temp ← EffectiveAddress(SRC); (* 32-bit address *)<br />

DEST ← temp[0..15]; (* 16-bit address *)<br />

ELSE IF OperandSize = 32 AND AddressSize = 16<br />

THEN<br />

temp ← EffectiveAddress(SRC); (* 16-bit address *)<br />

DEST ← ZeroExtend(temp); (* 32-bit address *)<br />

ELSE IF OperandSize = 32 AND AddressSize = 32<br />

THEN<br />

DEST ← EffectiveAddress(SRC); (* 32-bit address *)<br />

FI;<br />

FI;<br />

影響を受けるフラグ<br />

なし。<br />

実行される処理<br />

16 16 16 ビットの実効アドレスが計算され、要求された 16 ビット・レジスタのデ<br />

スティネーションにストアされる。<br />

16 32 32 ビットの実効アドレスが計算される。そのアドレスの下位 16 ビットが要<br />

求された 16 ビット・レジスタのデスティネーションにストアされる。<br />

32 16 16 ビットの実効アドレスが計算される。16 ビット・アドレスはゼロ拡張さ<br />

れ、要求された 32 ビット・レジスタのデスティネーションにストアされる。<br />

32 32 32 ビットの実効アドレスが計算され、要求された 32 ビット・レジスタのデ<br />

スティネーションにストアされる。<br />

3:628 第 3 巻 : IA-32 基本命令リファレンス


LEA—Load Effective Address ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

保護モード例外<br />

#UD ソース・オペランドがメモリ ・ ロケーションでない場合。<br />

実アドレス・モード例外<br />

#UD ソース・オペランドがメモリ ・ ロケーションでない場合。<br />

仮想 8086 モード例外<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

#UD ソース・オペランドがメモリ ・ ロケーションでない場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:629


LEAVE—High Level Procedure Exit<br />

オペコード 命令 説明<br />

C9 LEAVE SP を BP に設定し、次に BP をポップする。<br />

C9 LEAVE ESP を EBP に設定し、次に EBP をポップする。<br />

説明<br />

先行す る ENTER 命令で移行したプ ロ シ ー ジ ャ ( またはネスト されたプロシージャのグ<br />

ループ ) か ら の リ タ ー ン を実行す る。 こ の命令は、 EBP レジスタ内のフレーム ・ ポイン<br />

タをスタック ・ ポインタ ・ レジスタ (ESP) に コ ピ ー し、 プ ロ シ ー ジ ャ が ロ ー カ ル変数用<br />

に使用していたスタ ッ ク空間を解放する。 次に、 古いフレーム ・ ポインタ (ENTER 命令<br />

を発行するコール元プロシージャのフレーム ・ ポインタ ) がスタ ッ クから EBP レジスタ<br />

にポップされ、 コール元プロシージャのスタッ ク ・ フレームがリス トアされる。<br />

通常は、 LEAVE 命令の後に RET 命令を実行して、 プログラム制御をコール元プロシー<br />

ジャに返し、 コール先プロシージャによってスタック上にプッシュされていた引数をす<br />

べて削除する。<br />

操作<br />

IF StackAddressSize = 32<br />

THEN<br />

ESP ← EBP;<br />

ELSE (* StackAddressSize = 16*)<br />

SP ← BP;<br />

FI;<br />

IF OperandSize = 32<br />

THEN<br />

EBP ← Pop();<br />

ELSE (* OperandSize = 16*)<br />

BP ← Pop();<br />

FI;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#SS(0) EBP レ ジ ス タ の指示先の ロ ケ ー シ ョ ンが現在のス タ ッ ク ・<br />

セグ メ ン ト の範囲内にない場合。<br />

3:630 第 3 巻 : IA-32 基本命令リファレンス


LEAVE—High Level Procedure Exit ( 続き )<br />

実アドレス・モード例外<br />

#GP EBP レ ジ ス タ の指示先の ロ ケ ー シ ョ ンが 0 ~ 0FFFFH の実<br />

効ア ド レ ス空間の範囲外の場合。<br />

仮想 8086 モード例外<br />

#GP(0) EBP レ ジ ス タ の指示先の ロ ケ ー シ ョ ンが 0 ~ 0FFFFH の実<br />

効ア ド レ ス空間の範囲外の場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:631


LES—Load Full Pointer<br />

「LDS/LES/LFS/LGS/LSS」 を参照のこ と。<br />

3:632 第 3 巻 : IA-32 基本命令リファレンス


LFS—Load Full Pointer<br />

「LDS/LES/LFS/LGS/LSS」 を参照のこ と。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:633


LGDT/LIDT—Load Global/Interrupt Descriptor Table Register<br />

オペコード 命令 説明<br />

0F 01 /2 LGDT m16&32 m を GDTR にロードする。<br />

0F 01 /3 LIDT m16&32 m を IDTR にロードする。<br />

説明<br />

ソース ・ オペランド内の値をグローバル ・ ディスク リプタ ・ テーブル ・ レジスタ<br />

(GDTR) または割り込みディスク リプタ ・ テーブル・ レジスタ (IDTR) にロードする。<br />

ソース ・ オペランドは、 グローバル ・ ディスク リプタ ・ テーブル (GDT) または割り込み<br />

ディスクリプタ・テーブル(IDT) のベース ・ ア ド レス ( リニア・アドレス) と範囲( バイ<br />

ト単位のテーブル・サイズ) を内容とする、 メモ リ内の 6 バイ トのデータへのポインタ<br />

である。 オペラン ド ・ サイズ属性が 32 ビッ トである場合は、 16 ビッ トの範囲(6 バイ ト<br />

のデー タ ・ オペラン ド の下位 2 バイ ト ) と 32 ビッ トのベース・アドレス( データ ・ オペ<br />

ランドの上位4 バイ ト ) が レ ジ ス タ に ロ ー ド さ れる。 オペラ ン ド ・ サイ ズ属性が 16 ビッ<br />

トである場合は、 16 ビッ トの範囲( 下位 2 バイ ト ) と 24 ビッ トのベース・アドレス( 第<br />

3、 第4、 第5 バイ ト ) が ロ ー ド さ れる。 こ の場合は、 オペラ ン ド の上位バ イ ト は使用 さ<br />

れず、 GDTR または IDTR のベース ・ ア ド レスの上位バイ ト にはゼロが埋められる。<br />

LGDT 命令お よ び LIDT 命令は、 オペレーティ ング ・ システム ・ ソフ ト ウェアだけで使<br />

用される。 これらの命令は、 アプリ ケーシ ョン ・ プログラムでは使用されない。 保護<br />

モー ドでリニア ・ アド レス ( すなわち、 セグメン ト に相対的でないア ド レス ) と範囲を<br />

直接ロ ー ド す る のは こ れ ら の命令だけである。 LGDT 命令お よ び LIDT 命令は、 一般的<br />

に、 保護モー ド への切り替え前にプロセ ッ サの初期化を可能にするために、 実ア ド レ<br />

ス・モードで実行される。<br />

操作<br />

IF Itanium System Environment THEN IA-32_Intercept(INST,LGDT/LIDT);<br />

IF instruction is LIDT<br />

THEN<br />

IF OperandSize = 16<br />

THEN<br />

IDTR(Limit) ← SRC[0:15];<br />

IDTR(Base) ← SRC[16:47] AND 00FFFFFFH;<br />

ELSE (* 32-bit Operand Size *)<br />

IDTR(Limit) ← SRC[0:15];<br />

IDTR(Base) ← SRC[16:47];<br />

FI;<br />

ELSE (* instruction is LGDT *)<br />

IF OperandSize = 16<br />

THEN<br />

GDTR(Limit) ← SRC[0:15];<br />

GDTR(Base) ← SRC[16:47] AND 00FFFFFFH;<br />

ELSE (* 32-bit Operand Size *)<br />

GDTR(Limit) ← SRC[0:15];<br />

GDTR(Base) ← SRC[16:47];<br />

FI;<br />

FI;<br />

3:634 第 3 巻 : IA-32 基本命令リファレンス


LGDT/LIDT—Load Global/Interrupt Descriptor Table Register ( 続き )<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

IA-32_Intercept LIDT および LGDT 命令での強制命令イ ン タ ー セプ ト 。<br />

保護モード例外<br />

#UD ソース・オペランドがメモリ ・ ロケーションでない場合。<br />

#GP(0) 現行特権レベルが 0 でない場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタを使用してメモリがア<br />

クセスされ、 レジスタの内容が NULL セグメン ト ・ セレ<br />

クタであった場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

実アドレス・モード例外<br />

#UD ソース・オペランドがメモリ ・ ロケーションでない場合。<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#UD ソース・オペランドがメモリ ・ ロケーションでない場合。<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:635


LGS—Load Full Pointer<br />

「LDS/LES/LFS/LGS/LSS」 を参照のこ と。<br />

3:636 第 3 巻 : IA-32 基本命令リファレンス


LLDT—Load Local Descriptor Table Register<br />

オペコード 命令 説明<br />

0F 00 /2 LLDT r/m16 セグメント・セレクタ r/m16 を LDTR にロードする。<br />

説明<br />

ソース ・オペランドをローカル・ディスク リプタ ・ テーブル・ レジスタ (LDTR) のセグ<br />

メン ト ・ セレクタ ・ フ ィ ールドにロー ドする。 ソース ・ オペランド ( 汎用レ ジ ス タ ま た<br />

はメモリ ・ ロケーション ) の内容は、 ロ ー カル ・ デ ィ ス ク リ プタ ・ テ ーブル (LDT) を指<br />

示先とするセグメント ・セレクタである。 セグメント ・セレクタがLDTR にロード され<br />

た後に、 プロセッサはそのセグメン ト ・ セレク タを使用して、 グローバル ・ ディ スク リ<br />

プタ ・ テーブル (GDT) 内にある LDT のセグメン ト ・ デ ィ スク リ プタの位置を探す。 次<br />

に、 セグメン ト ・ デ ィ ス ク リ プタから LDTR に LDT のセグメン ト 範囲とベース ・ ア ド レ<br />

スをロー ドする。 DS、 ES、 SS、 FS、 GS、 CS の各セグメン ト ・ レ ジスタは この命令の影<br />

響を受けない。 現在のタスクに対するタスク ・ ステー ト ・ セグメン ト (TSS) 内の LDTR<br />

フィールドも影響を受けない。<br />

ソース ・オペランドが0 である場合は、 LDTR は無効と マー ク され、 LDT 内のデ ィ ス ク<br />

リプタへのすべての参照(LAR、 VERR、 VERW、 または LSL 命令に よ る も のを除 く ) に<br />

よ っ て一般保護例外 (#GP) が発生する。<br />

オペラン ド ・ サイズ属性は、 この命令には効果を もたない。<br />

LLDT 命令は、 オペレーティング・システム・ ソフトウェアで使用するために設けられ<br />

たものであり、 アプリケーション・プログラムでは使用してはならない。 さらに、 この<br />

命令は保護モー ド でしか実行できない。<br />

操作<br />

IF Itanium System Environment THEN IA-32_Intercept(INST,LLDT);<br />

IF SRC(Offset) > descriptor table limit THEN #GP(segment selector); FI;<br />

Read segment descriptor;<br />

IF SegmentDescriptor(Type) ≠ LDT THEN #GP(segment selector); FI;<br />

IF segment descriptor is not present THEN #NP(segment selector);<br />

LDTR(SegmentSelector) ← SRC;<br />

LDTR(SegmentDescriptor) ← GDTSegmentDescriptor;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

IA-32_Intercept 命令イ ン タ ーセプ ト 。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:637


LLDT—Load Local Descriptor Table Register ( 続き )<br />

保護モード例外<br />

#GP(0) 現行特権レベルが 0 でない場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#GP( セレクタ ) セレクタ ・ オペランドの指示先がグローバル ・ ディスク リ<br />

プタ ・ テーブル (GDT) でない場合、 または GDT 内のエン<br />

トリがローカル・ディスクリプタ・テーブルでない場合。<br />

セグメン ト ・ セレ ク タが GDT の範囲を超えている場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#NP( セレクタ ) LDT デ ィ ス ク リ プ タ が存在しない場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

実アドレス・モード例外<br />

#UD LLDT 命令は実ア ド レ ス ・ モー ド では認識 さ れない。<br />

仮想 8086 モード例外<br />

#UD LLDT 命令は仮想 8086 モー ドでは認識されない。<br />

3:638 第 3 巻 : IA-32 基本命令リファレンス


LIDT—Load Interrupt Descriptor Table Register<br />

「LGDT/LIDT - Load Global Description Table Register/Load Interrupt Descriptor Table Register」<br />

を参照のこ と。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:639


LMSW—Load Machine Status Word<br />

オペコード 命令 説明<br />

0F 01 /6 LMSW r/m16 r/m16 を CR0 のマシン・ステータス・ワードにロードする。<br />

説明<br />

ソース・オペランドをマシン・ステータス・ワード、 すなわちCR0 レジスタのビット 0<br />

~ 15 にロードする。 ソース ・ オペランドには、 16 ビッ ト汎用レジスタまたはメモリ ・<br />

ロケーションを使用できる。 ソース ・ オペランドの下位4 ビッ ト (PE、 MP、 EM、 TS フ<br />

ラグ ) だけが CR0 にロード される。 CR0 の PG、 CD、 NW、 AM、 WP、 NE、 ET フラグ<br />

は影響を受けない。 オペラン ド ・ サイズ属性は、 この命令には効果を もたない。<br />

ソース ・オペランドのPE フラグ ( ビット 0) が 1 にセッ ト されている場合は、 この命令<br />

によってプロセッサは保護モードに切り替わる。 CR0 レジスタのPE フラグはスティッ キー ・ ビッ トである。 一度1 にセッ ト される と、 LMSW 命令を使用して こ の フ ラ グを ク<br />

リアし、 実アドレス・モードへのスイッチ・バックを強制することはできない。<br />

LMSW 命令は、 オペレーティング・システム・ ソフトウェアで使用するために設けられ<br />

たものであり、 アプリケーション・プログラムでは使用してはならない。 保護モード ま<br />

たは仮想 8086 モ ー ド では、 こ の命令は CPL 0 でしか実行できない。<br />

この命令は、 インテル ® 286 プロセッサとの互換性を維持するために用意されている。<br />

インテル 286 よ り新しいプロセッサ向けに開発されるプログラムおよびプロシージ ャで<br />

は、 MOV ( コント ロール・ レジスタ ) 命令を使用してマシ ン ・ ス テ ー タ ス ・ ワ ー ド を<br />

ロードすることを推奨する。<br />

こ の命令は シ リ アル化命令である。<br />

操作<br />

IF Itanium System Environment THEN IA-32_Intercept(INST,LMSW);<br />

CR0[0:3] ← SRC[0:3];<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

IA-32_Intercept 強制命令イ ン タ ー セプ ト 。<br />

保護モード例外<br />

#GP(0) 現行特権レベルが 0 でない場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタを使用してメモリがア<br />

クセスされ、 レジスタの内容が NULL セグメン ト ・ セレ<br />

クタであった場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

3:640 第 3 巻 : IA-32 基本命令リファレンス


LMSW—Load Machine Status Word ( 続き )<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

仮想 8086 モード例外<br />

#GP(0) 現行特権レベルが 0 でない場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:641


LOCK—Assert LOCK# Signal Prefix<br />

オペコード 命令 説明<br />

F0 LOCK 後の命令の実行中 LOCK# 信号をアサートする。<br />

説明<br />

こ のプ リ フ ィ ッ ク スの後の命令の実行中、 プ ロ セ ッ サの LOCK# 信号をアサー ト さ せる<br />

( すなわち、 その命令をア ト ム命令に変える )。 マルチプロセッサ環境では、 LOCK# 信<br />

号は、 それがアサー ト されている間プロセ ッ サが任意の共有メモ リ を独占的に使用でき<br />

る よ う に保証す る。<br />

LOCK プリフィックスは、 ADD、 ADC、 AND、 BTC、 BTR、 BTS、 CMPXCHG、 DEC、<br />

INC、 NEG、 NOT、 OR、 SBB、 SUB、 XOR、 XADD、 XCHG の各命令と これらの命令の<br />

メ モ リ ・ オペラ ン ド を使用す る形式の前に使用で き る。 LOCK プリフィックスを上記以<br />

外の ど の命令に使用した場合 も 、 未定義オペ コ ー ド 例外が発生する。 XCHG 命令は、<br />

LOCK プリフィックスの有無に関係なく、 常にLOCK# 信号をアサー ト する。<br />

一般的に、 LOCK プリフィックスは、 共有メモリ環境内のメモリ ・ロケーションでの読<br />

み取り / 修正 / 書き込み操作を実行する場合に BTS 命令に付けて使用される。<br />

LOCK プ リ フ ッ ク スの有効性は メ モ リ ・ フ ィ ー ル ド のア ラ イ メ ン ト に よ っ て損なわれな<br />

い。 アラ イ メ ン ト がどの よ う にずれている メモ リ ・ フ ィ ール ド に対して も、 メモ リ ・<br />

ロックは変わりなく有効である。<br />

操作<br />

IF Itanium System Environment AND External_Bus_Lock_Required AND DCR.lc<br />

THEN IA-32_Intercept(LOCK);<br />

AssertLOCK#(DurationOfAccompaningInstruction)<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

IA-32_Intercept ロック・インターセプト - DCR.lc が 1 であ り 、 こ の操作を<br />

完了するために外部ア ト ミ ッ ク ・ バス ・ ロ ッ ク が必要であ<br />

る場合は、 ア ト ミ ッ ク ・ ト ランザクシ ョ ンは発生せず、 こ<br />

の命令は失敗し、 IA-32_Intercept(Lock) フォルトが発生す<br />

る。 ソフ ト ウェア ・ ロ ッ ク ・ ハン ド ラが、 この命令をエ<br />

ミュレートする責任を負う。<br />

3:642 第 3 巻 : IA-32 基本命令リファレンス


LOCK—Assert LOCK# Signal Prefix ( 続き )<br />

保護モード例外<br />

#UD LOCK プ リ フ ィ ッ ク スが、 上記の 「説明」 の項に示してい<br />

ない命令に使用 さ れた場合。 こ の、 LOCK プリフックスが<br />

適用されよ う と した命令か ら は、 他に も 例外が発生する可<br />

能性がある。<br />

実アドレス・モード例外<br />

#UD LOCK プ リ フ ィ ッ ク スが、 上記の 「説明」 の項に示してい<br />

ない命令に使用 さ れた場合。 こ の、 LOCK プリフックスが<br />

適用されよ う と した命令か ら は、 他に も 例外が発生する可<br />

能性がある。<br />

仮想 8086 モード例外<br />

#UD LOCK プ リ フ ィ ッ ク スが、 上記の 「説明」 の項に示してい<br />

ない命令に使用 さ れた場合。 こ の、 LOCK プリフックスが<br />

適用されよ う と した命令か ら は、 他に も 例外が発生する可<br />

能性がある。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:643


LODS/LODSB/LODSW/LODSD—Load String Operand<br />

オペコード 命令 説明<br />

AC LODS DS:(E)SI アドレス DS:(E)SI のバイトを AL にロードする。<br />

AD LODS DS:SI アドレス DS:SI のワードを AX にロードする。<br />

AD LODS DS:ESI アドレス DS:ESI のダブルワードを EAX にロードする。<br />

AC LODSB アドレス DS:(E)SI のバイトを AL にロードする。<br />

AD LODSW アドレス DS:SI のワードを AX にロードする。<br />

AD LODSD アドレス DS:ESI のダブルワードを EAX にロードする。<br />

説明<br />

ソース ・オペランドから AL、 AX、 または EAX レジスタに、 バイト、 ワード、 またはダ<br />

ブルワー ド をロー ド する。 ソース ・ オペラン ド は、 ア ド レス DS:ESI のメモリ ・ ロケー<br />

ションである( オペラン ド ・ サイズ属性が 16 の場合は、 SI レジスタがソース ・ インデッ<br />

ク ス ・ レ ジ ス タ と して使用 さ れる )。 DS セグメン ト は、 セグメン ト ・ オーバライ ド ・ プ<br />

リフィックスでオーバライドできる。<br />

LODSB、 LODSW、 LODSD ニーモニッ クは、 それぞれ LODS 命令のバイ ト 版、 ワ ー ド<br />

版、 ダブルワ ー ド 版のシ ノ ニムであ る (LODS 命令では、 命令の中で "DS:ESI" を明示的<br />

に指定しなければならない )。<br />

バイ ト、 ワー ド、 またはダブルワー ドがメモリ ・ ロケーシ ョ ンから AL、 AX、 または<br />

EAX レジスタに転送された後、 ESI レジスタはEFLAGS レジスタ内のDF フラグの設定<br />

に従って自動的にイン ク リ メン ト またはデク リ メン ト される。 (DF フラグが0 である場<br />

合は、 ESI レジスタはインク リメント される。 DF フラグが1 である場合は、 ESI レジス<br />

タはデク リ メン ト される。 ESI レ ジ ス タ は、 バイ ト 操作の場合は 1、 ワー ド操作の場合は<br />

2、 ま たダブルワ ー ド の場合は 4、 それぞれインク リ メン ト またはデク リ メン ト される。<br />

LODS、 LODSB、 LODSW、 LODSD 命令は、 前に REP プリフィックスを付けると、 ECX<br />

バイ ト、 ワー ド、 またはダブルワー ドのブロ ッ ク ・ ロー ド を行える。 しかし通常は、 レ<br />

ジスタ に転送されたデー タ を次の転送が行われる前に さ ら に処理する必要があるので、<br />

こ れ ら の命令は LOOP 構成体で使用される方が多い。 REP プリフィックスの説明につい<br />

ては、 3:713 ページの 「REP/REPE/REPZ/REPNE/REPNZ—Repeat String Operation Prefix」<br />

を参照のこ と。<br />

操作<br />

IF (byte load)<br />

THEN<br />

AL ← SRC; (* byte load *)<br />

THEN IF DF = 0<br />

THEN (E)SI ← 1;<br />

ELSE (E)SI ← -1;<br />

FI;<br />

ELSE IF (word load)<br />

THEN<br />

AX ← SRC; (* word load *)<br />

THEN IF DF = 0<br />

THEN SI ← 2;<br />

ELSE SI ← -2;<br />

FI;<br />

3:644 第 3 巻 : IA-32 基本命令リファレンス


LODS/LODSB/LODSW/LODSD—Load String ( 続き )<br />

FI;<br />

FI;<br />

ELSE (* doubleword transfer *)<br />

EAX ← SRC; (* doubleword load *)<br />

THEN IF DF = 0<br />

THEN ESI ← 4;<br />

ELSE ESI ← -4;<br />

FI;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:645


LODS/LODSB/LODSW/LODSD—Load String ( 続き )<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:646 第 3 巻 : IA-32 基本命令リファレンス


LOOP/LOOPcc—Loop According to ECX Counter<br />

オペコード 命令 説明<br />

E2 cb LOOP rel8 カウントをデクリメントし、カウント ≠ 0 の場合 short ジャンプす<br />

る。<br />

E1 cb LOOPE rel8 カウントをデクリメントし、カウント ≠ 0 でかつ ZF=1 の場合 short<br />

ジャンプする。<br />

E1 cb LOOPZ rel8 カウントをデクリメントし、カウント ≠ 0 でかつ ZF=1 の場合 short<br />

ジャンプする。<br />

E0 cb LOOPNE rel8 カウントをデクリメントし、カウント ≠ 0 でかつ ZF=0 の場合 short<br />

ジャンプする。<br />

E0 cb LOOPNZ rel8 カウントをデクリメントし、カウント ≠ 0 でかつ ZF=0 の場合 short<br />

ジャンプする。<br />

説明<br />

ECX または CX レジスタをカウンタ と して使用して、 ループ操作を実行する。 LOOP 命令<br />

が実行されるたびに、 カ ウ ン ト ・ レ ジス タが 1 デク リ メント され、 次に 0 かどうかチェ ッ<br />

クされる。 カウントが0 である場合は、 ループは終了し、 LOOP 命令の次の命令から プロ<br />

グラムの実行が継続される。 カウン トが 0 でない場合は、 デステ ィ ネーシ ョ ン ( ターゲッ<br />

ト ) オペラン ド への near ジャンプが行われる。 ターゲットはおそら くループの先頭であ<br />

る。 ア ド レス ・ サイズ属性が 32 ビッ トである場合は、 カウント ・レジスタとしてECX レ<br />

ジスタが使用される。 そうでない場合は、 CX レジスタが使用される。<br />

ターゲッ ト命令は相対オフセット (EIP レジスタ内の命令ポインタの現在値に相対的な符<br />

号付き オ フ セ ッ ト ) で指定される。 相対オフセ ッ ト は、 アセンブ リ ・ コ ー ド では一般的<br />

にラベルとして指定されるが、 マシン ・ コー ド ・ レベルでは、 符号付きの 8 ビッ ト即値<br />

と して コ ー ド 化され、 命令ポ イ ン タ に加算される。 こ の命令には、 -128 ~ +127 までの<br />

オフセッ トが使用できる。<br />

ループ命令(LOOPcc) の一部の形式では、 カ ウ ン ト が 0 に達する前にループを終了させ<br />

る ための条件 と して ZF フ ラ グ も 指定で き る。 それ ら の形式の命令に は、 各命令に条件<br />

コード (cc) が対応してお り、 それぞれにテス ト される条件を示している。 その場合、<br />

LOOPcc 命令その も のは ZF フラグの状態を変えない。 ZF フ ラ グを変更す る のは、 ルー<br />

プ内の他の命令である。<br />

すべての分岐は、 ジ ャンプ ・ ア ド レスやキャ ッ シュの可否に関係な く 、 1 つまたは 2 つ<br />

のキャ ッシュ ・ ラインのコ ー ド ・ フ ェ ッチに変換される。<br />

操作<br />

IF AddressSize = 32<br />

THEN<br />

Count is ECX;<br />

ELSE (* AddressSize = 16 *)<br />

Count is CX;<br />

FI;<br />

Count ← Count - 1;<br />

IF instruction in not LOOP<br />

THEN<br />

IF (instruction = LOOPE) OR (instruction = LOOPZ)<br />

THEN<br />

IF (ZF =1) AND (Count ≠ 0)<br />

THEN BranchCond ← 1;<br />

ELSE BranchCond ← 0;<br />

第 3 巻 : IA-32 基本命令リファレンス 3:647


LOOP/LOOPcc—Loop According to ECX Counter ( 続き )<br />

FI;<br />

FI;<br />

IF (instruction = LOOPNE) OR (instruction = LOOPNZ)<br />

THEN<br />

IF (ZF =0 ) AND (Count ≠ 0)<br />

THEN BranchCond ← 1;<br />

ELSE BranchCond ← 0;<br />

FI;<br />

FI;<br />

ELSE (* instruction = LOOP *)<br />

IF (Count ≠ 0)<br />

THEN BranchCond ← 1;<br />

ELSE BranchCond ← 0;<br />

FI;<br />

FI;<br />

IF BranchCond = 1<br />

THEN<br />

EIP ← EIP + SignExtend(DEST);<br />

IF OperandSize = 16<br />

THEN<br />

EIP ← EIP AND 0000FFFFH;<br />

FI;<br />

IF Itanium System Environment AND PSR.tb THEN IA-32_Exception(Debug);<br />

ELSE<br />

Terminate loop and continue program execution at EIP;<br />

FI;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

IA-32_Exception 発生した分岐のデバ ッ グ例外 (PSR.tb が 1 の場合 )。<br />

保護モード例外<br />

#GP(0) ジャンプ先のオフセットがコード ・セグメントの範囲を超<br />

えてい る場合。<br />

実アドレス・モード例外<br />

なし。<br />

仮想 8086 モード例外<br />

なし。<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

3:648 第 3 巻 : IA-32 基本命令リファレンス


LSL—Load Segment Limit<br />

オペコード 命令 説明<br />

0F 03 /r LSL r16,r/m16 "r16 ← セグメント範囲、セレクタ r/m16 " のロードを行う。<br />

0F 03 /r LSL r32,r/m32 "r32 ← セグメント範囲、セレクタ r/m32 " のロードを行う。<br />

説明<br />

スクランブルされていないセグメント範囲を第2オペラン ド ( ソース ・ オペランド ) で<br />

指定 さ れたセグ メ ン ト ・ デ ィ ス ク リ プ タ か ら 第 1 オペラン ド ( デステ ィ ネーシ ョ ン ・ オ<br />

ペラン ド ) にロー ドし、 EFLAGS レジスタ内のZF フラグをセットする。 ソース ・ オペラ<br />

ンド ( レジスタまたはメモリ ・ ロケーション ) の内容は、 ア ク セス されるセグ メン ト ・<br />

ディスクリプタのセグメント ・セレクタである。 デスティネーション・オペランドは、<br />

汎用レ ジ ス タ である。<br />

プロセッサは、 ロー ド ・ プロセスの一環としてアクセス ・ チェ ッ クを行う。 デスティ<br />

ネーション ・ レジスタにロード されると、 ソフ ト ウェアはセグメント範囲をポインタの<br />

オフセッ ト と比較できる。<br />

セグメン ト範囲は、 セグメン ト ・ ディ スク リ プタのバイ ト 0 と 1、 バイ ト 6 の最初の 4<br />

ビッ トを含む20 ビ ッ ト の値であ る。 デ ィ ス ク リ プ タ のセグ メ ン ト 範囲がバイ ト を最小単<br />

位とする ( グラニュラリティ ・ フラグが 0 にされている ) 場合は、 デス テ ィ ネ ー シ ョ ン ・<br />

オペラン ド にバイ ト 単位値 ( バイ ト範囲 ) がロー ド される。 ディ スク リプタのセグメン<br />

ト 範囲がペー ジ を最小単位 と する ( グラニュラ リティ ・ フラグが 1 にセッ ト されている )<br />

場合は、 LSL 命令はセグ メ ン ト 範囲をペー ジ単位範囲 ( ページ範囲 ) からバイ ト範囲に<br />

変換してか ら 、 それをデス テ ィ ネ ー シ ョ ン ・ オペラ ン ド に ロ ー ド す る。 こ の変換は、 20<br />

ビッ トの 「生」 の範囲を左に12 ビッ トシフトし、 下位12 ビットを1 で埋めて行われる。<br />

オペラン ド ・ サイズが 32 ビッ トのときは、 32 ビッ トのバイト範囲がデスティネーショ<br />

ン・オペランドにストアされる。 オペランド ・サイズが16 ビ ッ ト の と き は、 有効な 32<br />

ビッ トのバイト範囲が計算されるが、 上位16 ビッ トは切り捨てられ、 下位16 ビットだ<br />

けがデステ ィ ネーシ ョ ン ・ オペラン ド にロー ド される。<br />

この命令では、 セグメント範囲をデスティネーション・レジスタにロードする前に以下<br />

のチェ ッ クを行う。<br />

• セグメン ト ・ セレ ク タが NULL でないこ と を確認する。<br />

• セグ メ ン ト ・ セ レ ク タ の指示先がア ク セス さ れる GDT または LDT の範囲内のデ ィ<br />

スクリプタであることを確認する。<br />

• デ ィ ス ク リ プ タ の タ イ プが こ の命令に対して有効であ る こ と を確認する。 LSL 命令<br />

に対しては、 すべてのコ ー ド ・ セグメン ト ・ デ ィ スク リ プタ とデー タ ・ セグメン ト ・<br />

ディスクリプタが有効である( すなわち LSL 命令でア ク セスで き る )。 有効な特殊な<br />

セグメントおよびゲートのディスクリプタ・タイプが下記の表に示している。<br />

• セグ メ ン ト が コ ン フ ォ ー ミ ン グ ・ コ ー ド ・ セグ メ ン ト でない場合は、 こ の命令は指<br />

定されたセグメント ・ ディスク リプタが CPL でアクセスでき る ( すなわち、 CPL と<br />

セグメン ト ・ セレ ク タの RPL がセグメン ト ・ セレ ク タの DPL 以下である ) かを確認<br />

する。<br />

セグメン ト ・ ディ スク リ プタがアクセスできないか、 またはこの命令に と って無効なタ<br />

イプである場合は、 ZF フ ラ グが ク リ ア さ れ、 値は何 も デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド<br />

にロー ド されない。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:649


LSL—Load Segment Limit ( 続き )<br />

操作<br />

タイプ 名前 有効 / 無効<br />

0 予約済み 無効<br />

1 使用可能 16 ビット TSS 有効<br />

2 LDT 有効<br />

3 ビジー 16 ビット TSS 有効<br />

4 16 ビット・コール・ゲート 無効<br />

5 16 ビット /32 ビット・タスク・ゲート 無効<br />

6 16 ビット・トラップ・ゲート 無効<br />

7 16 ビット割り込みゲート 無効<br />

8 予約済み 無効<br />

9 使用可能 32 ビット TSS 有効<br />

A 予約済み 無効<br />

B ビジー 32 ビット TSS 有効<br />

C 32 ビット・コール・ゲート 無効<br />

D 予約済み 無効<br />

E 32 ビット・トラップ・ゲート 無効<br />

F 32 ビット割り込みゲート 無効<br />

IF SRC(Offset) > descriptor table limit<br />

THEN ZF ← 0; FI;<br />

Read segment descriptor;<br />

IF SegmentDescriptor(Type) ≠ conforming code segment<br />

AND (CPL > DPL) OR (RPL > DPL)<br />

OR Segment type is not valid for instruction<br />

THEN<br />

ZF ← 0<br />

ELSE<br />

temp ← SegmentLimit([SRC]);<br />

IF (G = 1)<br />

THEN<br />

temp ← ShiftLeft(12, temp) OR 00000FFFH;<br />

FI;<br />

IF OperandSize = 32<br />

THEN<br />

DEST ← temp;<br />

ELSE (*OperandSize = 16*)<br />

DEST ← temp AND FFFFH;<br />

FI;<br />

FI;<br />

3:650 第 3 巻 : IA-32 基本命令リファレンス


LSL—Load Segment Limit ( 続き )<br />

影響を受けるフラグ<br />

セグメン ト範囲が正常にロー ド された場合は ZF フラグが1 にセッ ト され、 ロー ド でき<br />

なか っ た場合は 0 にク リアされる。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタを使用してメモリがア<br />

クセスされ、 レジスタの内容が NULL セグメン ト ・ セレ<br />

クタであった場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#UD LSL 命令は実ア ド レ ス ・ モ ー ド では認識 さ れない。<br />

仮想 8086 モード例外<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

#UD LSL 命令は仮想 8086 モー ドでは認識されない。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:651


LSS—Load Full Pointer<br />

「LDS/LES/LFS/LGS/LSS」 を参照のこ と。<br />

3:652 第 3 巻 : IA-32 基本命令リファレンス


LTR—Load Task Register<br />

オペコード 命令 説明<br />

0F 00 /3 LTR r/m16 r/m16 を TR( タスク・レジスタ ) にロードする。<br />

説明<br />

ソース ・オペランドをタスク ・ レジスタのセグメント ・セレクタ ・ フィールドにロード<br />

する。 ソース ・ オペランド ( 汎用レ ジ ス タ ま たは メモ リ ・ ロ ケ ー シ ョ ン ) の内容は、 タ<br />

スク ・ステート ・セグメント (TSS) を指示先とするセグメン ト ・ セレ ク タである。 セグ<br />

メン ト ・ セレクタがタスク ・ レジスタにロー ド された後に、 プロセッサはそのセグメン<br />

ト・セレクタを使用して、グローバル・ディスクリプタ・テーブル(GDT) 内にある TSS<br />

のセグメン ト ・ デ ィ ス ク リ プタの位置を探す。 次に、 セグメン ト ・ デ ィ スク リ プタから<br />

タスク ・ レジスタに TSS のセグメン ト 範囲とベース ・ ア ド レスをロー ド する。 タスク ・<br />

レ ジス タの指示先のタス ク はビ ジ ー と マー ク されが、 そのタ ス ク への切 り 替えは行われ<br />

ない。<br />

LTR 命令はオペレーテ ィ ング ・ システム ・ ソフ ト ウェアで使用するために設けられたも<br />

のであ り、 アプ リ ケーシ ョ ン ・ プログラムでは使用してはならない。 この命令は、 CPL<br />

が 0 のときは保護モードでしか実行することができない。 LTR 命令は、 最初に実行され<br />

るタスクを設定する初期化コー ドでよ く使用される。<br />

オペラン ド ・ サイズ属性は、 この命令に影響を与えない。<br />

操作<br />

IF Itanium System Environment THEN IA-32_Intercept(INST,LTR);<br />

IF SRC(Offset) > descriptor table limit OR IF SRC(type) ≠ global<br />

THEN #GP(segment selector);<br />

FI;<br />

Reat segment descriptor;<br />

IF segment descriptor is not for an available TSS THEN #GP(segment selector); FI;<br />

IF segment descriptor is not present THEN #NP(segment selector);<br />

TSSsegmentDescriptor(busy) ← 1;<br />

(* Locked read-modify-write operation on the entire descriptor when setting busy flag *)<br />

TaskRegister(SegmentSelector) ← SRC;<br />

TaskRegister(SegmentDescriptor) ← TSSSegmentDescriptor;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

IA-32_Intercept 強制命令イ ン タ ー セプ ト 。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:653


LTR—Load Task Register ( 続き )<br />

保護モード例外<br />

#GP(0) 現行特権レベルが 0 でない場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタを使用してメモリがア<br />

クセスされ、 レジスタの内容が NULL セグメン ト ・ セレ<br />

クタであった場合。<br />

#GP( セレクタ ) ソ ー ス ・ セ レ ク タ の指示先のセグ メ ン ト が TSS でないか、<br />

ま たは そのセグ メ ン ト の タ ス ク がすでに ビ ジ ー の場合。<br />

セレクタが LDT を指しているか、 または GDT の範囲を超<br />

えてい る場合。<br />

#NP( セレクタ ) TSS が存在しない と マ ー ク さ れている場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

実アドレス・モード例外<br />

#UD LTR 命令は実ア ド レ ス ・ モー ド では認識 さ れない。<br />

仮想 8086 モード例外<br />

#UD LTR 命令は仮想 8086 モー ドでは認識されない。<br />

3:654 第 3 巻 : IA-32 基本命令リファレンス


MOV—Move<br />

オペコード 命令 説明<br />

88 /r MOV r/m8,r8 r8 を r/m8 に転送する。<br />

89 /r MOV r/m16,r16 r16 を r/m16 に転送する。<br />

89 /r MOV r/m32,r32 r32 を r/m32 に転送する。<br />

8A /r MOV r8,r/m8 r/m8 を r8 に転送する。<br />

8B /r MOV r16,r/m16 r/m16 を r16 に転送する。<br />

8B /r MOV r32,r/m32 r/m32 を r32 に転送する。<br />

8C /r MOV r/m16,Sreg** セグメント・レジスタを r/m16 に転送する。<br />

8E /r MOV Sreg,r/m16 r/m16 をセグメント・レジスタに転送する。<br />

A0 MOV AL,moffs8* ( セグメント : オフセット ) のバイトを AL に転送する。<br />

A1 MOV AX,moffs16* ( セグメント : オフセット ) のワードを AX に転送する。<br />

A1 MOV EAX,moffs32* ( セグメント : オフセット ) のダブルワードを EAX に転送する。<br />

A2 MOV moffs8*,AL AL を ( セグメント : オフセット ) に転送する。<br />

A3 MOV moffs16*,AX AX を ( セグメント : オフセット ) に転送する。<br />

A3 MOV moffs32*,EAX EAX を ( セグメント : オフセット ) に転送する。<br />

B0+ rb MOV r8,imm8 imm8 を r8 に転送する。<br />

B8+ rw MOV r16,imm16 imm16 を r16 に転送する。<br />

B8+ rd MOV r32,imm32 imm32 を r32 に転送する。<br />

C6 /0 MOV r/m8,imm8 imm8 を r/m8 に転送する。<br />

C7 /0 MOV r/m16,imm16 imm16 を r/m16 に転送する。<br />

C7 /0 MOV r/m32,imm32 imm32 を r/m32 に転送する。<br />

注 :<br />

* moffs8、moffs16、moffs32 オペランドは、8、16、32 がデータのサイズを参照するセグメント・ベースに<br />

相対的な単純オフセットを指定する。命令のアドレス・サイズ属性によって、オフセットのサイズ (16 ビッ<br />

トまたは 32 ビット ) が決まる。<br />

** 32 ビット・モードでは、アセンブラは、( 命令の先頭に値 66H の 1 バイトを挿入する ) 16 ビット・オペラ<br />

ンド・サイズ・プリフィックスを使用しなければならないことがある。<br />

説明<br />

第 2 オペラン ド ( ソース・オペランド ) を第 1 オペラン ド ( デステ ィ ネーシ ョ ン ・ オペラ<br />

ンド ) にコピーする。 ソース・オペランドには、 即値、 汎用レジスタ、 セグメント ・ レ<br />

ジ ス タ、 ま たは メ モ リ ・ ロ ケ ー シ ョ ン を使用で き る。 デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド<br />

には、 汎用レジスタ、 セグメン ト ・ レジスタ、 またはメモリ ・ ロケーシ ョ ンを使用でき<br />

る。 両方のオペラン ド と も、 同じサイズ ( バイ ト、 ワー ド、 またはダブルワー ド ) でな<br />

ければならない。<br />

MOV 命令を使用して CS レジスタをロードすることはできない。 そうしよう とすると、<br />

無効オペ コ ー ド 例外 (#UD) が発生する。 CS レジスタをロードするには、 RET 命令を使<br />

用する。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:655


MOV—Move ( 続き )<br />

デスティネーション ・ オペランドがセグメン ト ・ レジスタ (DS、 ES、 FS、 GS、 または<br />

SS) である場合は、 ソ ース ・ オペラン ド は有効なセグメン ト ・ セレ ク タでなければならな<br />

い。 保護モードでは、 セグメン ト ・セレクタをセグメント ・ レジスタに転送すると、 そ<br />

のセグメント ・ セレクタに関連するセグメン ト ・ディスク リプタ情報が自動的にセグメ<br />

ント ・レジスタの見えない( シャ ドー ) 部分に ロ ー ド さ れる。 こ の情報を ロ ー ド している<br />

間は、 セグメン ト ・ セレ ク タおよびセグメン ト ・ デ ィ ス ク リ プタ情報が有効になる ( 下記<br />

の 「操作」 のアルゴリズムを参照)。 セグメント ・ディスクリプタ・データは、 指定した<br />

セグメン ト ・ セレ ク タの GDT エン ト リ または LDT エン ト リ から得られる。<br />

NULL のセグメン ト ・ セレ ク タ ( 値 0000 ~ 0003) を保護例外を発生させずに DS、 ES、<br />

FS、 GS レジスタにロードすることができる。 ただし、 その対応するセグメント ・ レジ<br />

スタが NULL 値をロ ー ド されているセグメン ト をその後に参照し よ う と する と、 一般保<br />

護例外 (#GP) が発生し、 メ モ リ 参照は行われない。<br />

IA-32 システム環境では、MOV 命令を使用して SS レジスタをロードすると、次の命令<br />

の実行が完了するまで、すべての外部割り込みおよびトラップが禁止される。Itanium<br />

ベース・システム環境では、SS レジスタへの MOV を実行すると、命令の完了後に<br />

IA-32_Intercept(SystemFlag) トラップが発生する。 この操作によって、 割り込みが発生<br />

する前に、 次の命令(MOV ESP, スタック ・ ポインタ値) で ESP レジスタにスタック ・ ポ<br />

インタをロー ドできる。 LSS 命令に よ っ て、 SS レジスタと ESP レジスタをより効率的に<br />

ロードできる。<br />

32 ビッ ト ・モードで、 セグメント ・レジスタと 32 ビッ ト汎用レジスタの間でデータを<br />

転送す る と き、 Pentium Pro プロセッサでは、 16 ビッ ト ・オペランド ・サイズ・プリ<br />

フ ィ ッ ク ス を使用す る必要はない。 ただし、 一部のアセン ブ ラ は、 こ のプ リ フ ィ ッ ク ス<br />

を必要 と してい る。 プ ロ セ ッ サは、 汎用レ ジ ス タ の最下位 16 ビットがデスティネーショ<br />

ン・オペランドまたはソース・オペランドであると見なす。 セグメント ・セレクタから<br />

32 ビッ ト ・レジスタに値を転送する場合、 プロセッサは、 32 ビット ・レジスタの上位2<br />

バイ ト を 0 で埋める。<br />

操作<br />

DEST ← SRC;<br />

保護モ ー ド の間にセグ メ ン ト ・ レ ジ ス タ を ロ ー ド する と 、 以下の リ ス ト で説明してい る<br />

よ う に特殊なチ ェ ッ ク と処置が行われる。 これら のチェ ッ ク は、 セグメ ン ト ・ セレ ク タ<br />

お よ びそれが指しているセグメ ン ト ・ デ ィ ス ク リ プタ に対して行われる。<br />

IF SS is loaded;<br />

THEN<br />

IF segment selector is null<br />

THEN #GP(0);<br />

FI;<br />

IF segment selector index is outside descriptor table limits<br />

OR segment selector's RPL ≠ CPL<br />

OR segment is not a writable data segment<br />

OR DPL ≠ CPL<br />

THEN #GP(selector);<br />

FI;<br />

IF segment not marked present<br />

THEN #SS(selector);<br />

ELSE<br />

SS ← segment selector;<br />

SS ← segment descriptor;<br />

FI;<br />

FI;<br />

3:656 第 3 巻 : IA-32 基本命令リファレンス


MOV—Move ( 続き )<br />

IF DS, ES, FS or GS is loaded with non-null selector;<br />

THEN<br />

IF segment selector index is outside descriptor table limits<br />

OR segment is not a data or readable code segment<br />

OR ((segment is a data or nonconforming code segment)<br />

AND (both RPL and CPL > DPL))<br />

THEN #GP(selector);<br />

IF segment not marked present<br />

THEN #NP(selector);<br />

ELSE<br />

SegmentRegister ← segment selector;<br />

SegmentRegister ← segment descriptor;<br />

FI;<br />

FI;<br />

IF DS, ES, FS or GS is loaded with a null selector;<br />

THEN<br />

SegmentRegister ← null segment selector;<br />

SegmentRegister ← null segment descriptor;<br />

FI;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

IA-32_Intercept SS への Move でのシステム ・ フラグ ・ インターセプ ト ・<br />

トラップ。<br />

Itanium アーキテクチャ ・ NaT レ ジ ス タ参照アボ ー ト 。<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) NULL セグメン ト ・ セレ ク タで SS レジスタをロードしよ<br />

う と した場合。<br />

デステ ィ ネー シ ョ ン ・ オペラ ン ド が書き込み不可能なセグ<br />

メント にある場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:657


MOV—Move ( 続き )<br />

#GP( セレクタ ) セグメン ト ・ セレ ク タ ・ インデッ クスがデ ィ スク リ プタ ・<br />

テーブルの範囲外の場合。<br />

SS レジスタがロード され、 セグメント ・セレクタのRPL<br />

およびセグメント ・ディスク リプタの DPL が CPL に等し<br />

くない場合。<br />

SS レ ジ ス タ がロ ー ド さ れ、 指示先のセグ メ ン ト が書き込<br />

み不可能なデー タ ・ セグメン ト である場合。<br />

DS、 ES、 FS、 または GS レジスタがロード され、 指示先<br />

のセグメン ト がデータ ・ セグメン ト または書き込み可能な<br />

コード ・セグメントでない場合。<br />

DS、 ES、 FS、 または GS レジスタがロード され、 指示先<br />

のセグメン ト がデータ ・ セグメン ト または非コ ンフ ォ ー ミ<br />

ング ・ コー ド ・ セグメン ト であるが、 RPL と CPL の両方<br />

ともDPL よ り 大き い場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#SS( セレクタ ) SS レ ジ ス タ がロ ー ド さ れ、 指示先のセグ メ ン ト が存在し<br />

ないとマー ク されている場合。<br />

#NP DS、 ES、 FS、 または GS レジスタがロード され、 指示先<br />

のセグメン ト が存在しないと マー ク されている場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

#UD CS レ ジ ス タ を ロ ー ド し よ う と した場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#UD CS レ ジ ス タ を ロ ー ド し よ う と した場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

#UD CS レ ジ ス タ を ロ ー ド し よ う と した場合。<br />

3:658 第 3 巻 : IA-32 基本命令リファレンス


MOV—Move to/from Control Registers<br />

オペコード 命令 説明<br />

0F 22 /r MOV CR0,r32 0F 22 r32 を CR0 に転送する。<br />

0F 22 /r MOV CR2,r32 0F 22 r32 を CR2 に転送する。<br />

0F 22 /r MOV CR3,r32 0F 22 r32 を CR3 に転送する。<br />

0F 22 /r MOV CR4,r32 0F 22 r32 を CR4 に転送する。<br />

0F 20 /r MOV r32,CR0 0F 20 CR0 を r32 に転送する。<br />

0F 20 /r MOV r32,CR2 0F 20 CR2 を r32 に転送する。<br />

0F 20 /r MOV r32,CR3 0F 20 CR3 を r32 に転送する。<br />

0F 20 /r MOV r32,CR4 0F 20 CR4 を r32 に転送する。<br />

説明<br />

制御レ ジ ス タ (CR0、 CR2、 CR3、 または CR4) の内容を汎用レ ジス タに、 ま たはその逆<br />

に転送す る。 こ れ ら の命令のオペラ ン ド ・ サイ ズは、 オペラ ン ド ・ サイ ズ属性に関係な<br />

く常に32 ビッ トである。 ( 制御レ ジ ス タ の フ ラ グ と フ ィ ー ル ド の詳細な説明は、 『IA-32<br />

インテル ® アーキテクチャ ・ ソフ ト ウェア ・ディベロッパーズ ・マニュアル、 下巻』 を<br />

参照の こ と 。 )<br />

制御レ ジ ス タ を ロ ー ド する と き は、 プ ロ グ ラ ム は ど の予約ビ ッ ト の変更 も 試みてはな ら<br />

ない。 すなわ ち、 常に前に読み取られた値に予約ビ ッ ト を設定する。<br />

オペコ ー ド ・ レベルでは、 ModR/M バイ ト内の reg フィールドは、 どの制御レジスタを<br />

ロー ドするかまたは読み取るかを指定する。 mod フィールドの2 ビッ トは、 常に11B で<br />

ある。 r/m フ ィ ールドは、 ロー ド されるかまたは読み取られる汎用レジスタを指定する。<br />

こ れ ら の命令は、 以下の二次的な影響 も 与え る。<br />

• 制御レ ジ ス タ CR3 に書き込むと、 すべての非グローバル TLB エン ト リがフラ ッ シュ<br />

される。 ( 詳細は、 『IA-32 インテル ® アーキテクチャ・ソフトウェア・ディベロッ<br />

パーズ ・ マニュアル、 下巻』 を参照のこ と。 )<br />

• 制御レジスタのページング ・ フラグ (CR0 レジスタのPE と PG、 CR4 レジスタの<br />

PGE、 PSE、 PAE) のいずれかを修正す る と 、 グ ロ ー バル ・ エン ト リ を含めたすべて<br />

の TLB エン ト リがフラ ッ シュ される。 この命令は、 Pentium Pro プロセッサでは固有<br />

である。 将来のインテル・アーキテクチャ・プロセッサでは、 ソフトウェアはこの<br />

機能に依存してはな ら ない。<br />

• PG フラグを 1 にセッ ト し、 ( 物理ア ド レ ス拡張モー ド を イ ネ ー ブルにするために )<br />

PAE フラグを1 にセッ ト する よ う に制御レジスタ CR4 に書き込む と、 ページ ・ デ ィ<br />

レクト リ ・ポインタ ・テーブルのポインタ (PDPTR) がプロセッサに ( 内部非アー キ<br />

テクチャ ・ レジスタに) ロード される。<br />

• PAE フラグを1 にセッ ト し、 PG フラグを 1 にセ ッ ト してい る場合に、 制御レ ジ ス タ<br />

CR3 に書き込む と、 PDPTR がプロセッサに再ロー ド される。<br />

• PAE フラグを1 にセッ ト し、 PG フラグをセットするように制御レジスタCR0 に書<br />

き込むと、 PDPTR がプロセッサに再ロー ド される。<br />

操作<br />

IF Itanium System Environment AND Move To CR Form THEN IA-32_Intercept(INST,MOVCR);<br />

DEST ← SRC;<br />

第 3 巻 : IA-32 基本命令リファレンス 3:659


MOV—Move to/from Control Registers ( 続き )<br />

影響を受けるフラグ<br />

OF、 SF、 ZF、 AF、 PF、 および CF フ ラ グは未定義。<br />

追加の Itanium ベース・システム環境例外<br />

IA-32_Intercept CR# への Move :強制命令インターセプト。<br />

CR# からの Move :仮想コントロール・レジスタ値を読み<br />

込む。 CR0{15:6} は 0 を返す。<br />

保護モード例外<br />

#GP(0) 現行特権レベルが 0 でない場合。<br />

CR4 の予約ビ ッ ト に 1 を書き込 も う と した場合。<br />

制御レ ジ ス タ CR4 の PAE フラグおよび制御レジスタCR0 の PG フラグが1 にセッ ト されている と きに、 ( 拡張物理<br />

ア ド レ ス指定モ ー ド に使用 さ れる ) ページ ・ ディ レク ト<br />

リ・ポインタ・テーブルの予約ビットに書き込みを行おう<br />

とした場合。<br />

実アドレス・モード例外<br />

#GP CR4 の予約ビ ッ ト に 1 を書き込 も う と した場合。<br />

仮想 8086 モード例外<br />

#GP(0) こ れら の命令は、 仮想 8086 モー ドで実行できない。<br />

3:660 第 3 巻 : IA-32 基本命令リファレンス


MOV—Move to/from Debug Registers<br />

オペコード 命令 説明<br />

0F 21/r MOV r32, DR0-DR3 デバッグ・レジスタを r32 に転送する。<br />

0F 21/r MOV r32, DR4-DR5 デバッグ・レジスタを r32 に転送する。<br />

0F 21/r MOV r32, DR6-DR7 デバッグ・レジスタを r32 に転送する。<br />

0F 23 /r MOV DR0-DR3, r32 r32 をデバッグ・レジスタに転送する。<br />

0F 23 /r MOV DR4-DR5, r32 r32 をデバッグ・レジスタに転送する。<br />

0F 23 /r MOV DR6-DR7,r32 r32 をデバッグ・レジスタに転送する。<br />

説明<br />

2 つまたはそれ以上のデバッグ ・ レジスタ (DR0 ~ DR3、 DR4、 DR5、 または DR6、<br />

DR7) の内容を汎用レ ジ ス タ に、 ま たは その逆に転送す る。 こ れ ら の命令のオペラ ン ド ・<br />

サ イ ズは、 オペラ ン ド ・ サ イ ズ属性に関係な く 常に 32 ビットである。 デバッグ・レジス<br />

タのフラグと フ ィ ールドの詳細な説明は、 『IA-32 インテル ® アーキテクチャ ・ ソフ ト<br />

ウ ェ ア ・ デ ィ ベロ ッ パ ー ズ ・ マニ ュ アル、 下巻』 を参照の こ と 。<br />

こ れ ら の命令は、 特権レベル 0 または実アドレス ・モードで実行しなければならない。<br />

CR4 レジスタのデバッグ拡張(DE) フラグをクリアすると、 これらの命令は、 Intel386<br />

プロセッサおよび Intel486 プロセッサと互換性があるようにデバック ・ レジスタを操作<br />

する。 このモー ドでは、 DR4 と DR5 への参照は、 それぞれ DR6 と DR7 を参照する。<br />

CR4 の DE をセッ ト する と、 DR4 と DR5 への参照の試みは、 未定義オペ コ ー ド (#UD) 例<br />

外を発生させる。<br />

オペコ ー ド ・ レベルでは、 ModR/M バイ ト の reg フィールドは、 どのデバッグ・レジス<br />

タをロードするかまたは読み取るかを指定する。 mod フィールドの2 ビッ トは、 常に11<br />

である。 r/m フ ィ ールド は、 ロー ド されるかまたは読み取られる汎用レジスタを指定す<br />

る。<br />

操作<br />

IF Itanium System Environment THEN IA-32_Intercept(INST,MOVDR);<br />

IF ((DE = 1) and (SRC or DEST = DR4 or DR5))<br />

THEN<br />

#UD;<br />

ELSE<br />

DEST ← SRC;<br />

影響を受けるフラグ<br />

OF、 SF、 ZF、 AF、 PF、 CF フ ラ グは未定義。<br />

追加の Itanium ベース・システム環境例外<br />

IA-32_Intercept 強制命令イ ン タ ー セプ ト 。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:661


MOV—Move to/from Debug Registers ( 続き )<br />

保護モード例外<br />

#GP(0) 現行特権レベルが 0 でない場合。<br />

#UD CR4 の DE ( デバッ グ拡張 ) ビッ トがセットされていて、<br />

MOV 命令が DR4 または DR5 を伴 っ て実行 さ れた場合。<br />

#DB デバッ グ ・ レジスタ DR7 の GD フラグがセッ ト されてい<br />

る間に、 いずれかのデバッグ ・ レジスタがアクセスされた<br />

場合。<br />

実アドレス・モード例外<br />

#UD CR4 の DE ( デバッ グ拡張 ) ビッ トがセットされていて、<br />

MOV 命令が DR4 または DR5 を伴 っ て実行 さ れた場合。<br />

#DB デバッ グ ・ レジスタ DR7 の GD フラグがセッ ト されてい<br />

る間に、 いずれかのデバッグ ・ レジスタがアクセスされた<br />

場合。<br />

仮想 8086 モード例外<br />

#GP(0) 仮想 8086 モー ド になっている と きに、 デバッグ ・ レジス<br />

タをロー ドするかまたは読み取ることはできない。<br />

3:662 第 3 巻 : IA-32 基本命令リファレンス


MOVS/MOVSB/MOVSW/MOVSD—Move Data from String to String<br />

オペコード 命令 説明<br />

A4 MOVS ES:(E)DI,<br />

DS:(E)SI<br />

アドレス DS:(E)SI のバイトをアドレス ES:(E)DI に転送する。<br />

A5 MOVS ES:DI,DS:SI アドレス DS:SI のワードをアドレス ES:DI に転送する。<br />

A5 MOVS ES:EDI, DS:ESI アドレス DS:ESI のダブルワードをアドレス ES:EDI に転送する。<br />

A4 MOVSB アドレス DS:(E)SI のバイトをアドレス ES:(E)DI に転送する。<br />

A5 MOVSW アドレス DS:SI のワードをアドレス ES:DI に転送する。<br />

A5 MOVSD アドレス DS:ESI のダブルワードをアドレス ES:EDI に転送する。<br />

説明<br />

第 2 オペラン ド ( ソース・オペランド ) で指定されたバイ ト 、 ワ ー ド 、 ま たはダブル<br />

ワードを第1 オペラン ド ( デステ ィ ネーシ ョ ン ・ オペラン ド ) で指定されたロケーシ ョ<br />

ンに転送する。 ソース ・ オペランドは、 アドレス DS:ESI のメモリ ・ ロケーションを指定<br />

する。 デスティネーション・オペランドは、 アドレスES:EDI のメモリ ・ ロケーション<br />

を指定する ( オペラン ド ・ サイズ属性が 16 の場合は、 SI レジスタがソース ・ インデック<br />

ス・レジスタとして使用され、 DI レジスタがデスティネーション ・ インデックス ・ レジ<br />

スタとして使用される )。 DS セグメン ト は、 セグメン ト ・ オーバライ ド ・ プ リ フ ィ ッ ク<br />

スでオーバライ ド できるが、 ES セグメン ト のオーバライ ド はできない。<br />

MOVSB、 MOVSW、 MOVSD ニーモニッ クは、 それぞれ MOVS 命令のバイ ト 版、 ワ ー<br />

ド版、 ダブルワード版のシノニムである。 これらのニーモニックは使い方が簡単である<br />

が、 タ イプ ・ チ ェ ッ ク やセグメ ン ト ・ チ ェ ッ ク の機能を持たない (MOVS 命令では、 命<br />

令の中で "DS:ESI" と "ES:EDI" を明示的に指定しなければな ら ない )。<br />

移動の後、 ESI レジスタと EDI レジスタは、 EFLAGS レジスタ内のDF フラグの設定に<br />

従 っ て自動的に イ ン ク リ メ ン ト ま たはデ ク リ メ ン ト さ れる。 (DF フラグが0 である場合<br />

は、 ESI レジスタと EDI レジスタはインクリメント され、 DF フラグが1 である場合は、<br />

ESI レジスタと EDI レジスタはデクリメント される。 ) これらのレジスタは、 バイ ト操作<br />

の場合は 1、 ワー ド操作の場合は 2、 ダブル ワ ー ド 操作の場合は 4、 それぞれインク リ メ<br />

ントまたはデクリメントされる。<br />

MOVS、 MOVSB、 MOVSW、 MOVSD 命令は、 前に REP プリフィックスを付けると、<br />

ECX バイ ト 、 ワ ー ド 、 ま たはダブル ワ ー ド のブ ロ ッ ク 転送を行え る。 (3:713 ページの<br />

「REP/REPE/REPZ/REPNE/REPNZ—Repeat String Operation Prefix」 を参照 )。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:663


MOVS/MOVSB/MOVSW/MOVSD—Move Data from String to String ( 続き )<br />

操作<br />

DEST ←SRC;<br />

IF (byte move)<br />

THEN IF DF = 0<br />

THEN (E)DI ← 1;<br />

ELSE (E)DI ← -1;<br />

FI;<br />

ELSE IF (word move)<br />

THEN IF DF = 0<br />

THEN DI ← 2;<br />

ELSE DI ← -2;<br />

FI;<br />

ELSE (* doubleword move*)<br />

THEN IF DF = 0<br />

FI;<br />

FI;<br />

THEN EDI ← 4;<br />

ELSE EDI ← -4;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) デステ ィ ネー シ ョ ン ・ オペラ ン ド が書き込み不可能なセグ<br />

メント にある場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

3:664 第 3 巻 : IA-32 基本命令リファレンス


MOVS/MOVSB/MOVSW/MOVSD—Move Data from String to String ( 続き )<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:665


MOVSX—Move with Sign-Extension<br />

オペコード 命令 説明<br />

0F BE /r MOVSX r16,r/m8 バイトをワードに符号拡張して転送する。<br />

0F BE /r MOVSX r32,r/m8 バイトをダブルワードに符号拡張して転送する。<br />

0F BF /r MOVSX r32,r/m16 ワードをダブルワードに符号拡張して転送する。<br />

説明<br />

ソース ・オペランド ( レジスタまたはメモリ ・ ロケーション ) の内容をデステ ィ ネー<br />

ション・オペランド ( レジスタ ) にコピーし、 値を 16 ビッ トまたは32 ビ ッ ト に符号拡<br />

張する。 変換 さ れた値のサ イ ズは、 オペラ ン ド ・ サイ ズ属性に依存する。<br />

操作<br />

DEST ← SignExtend(SRC);<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

3:666 第 3 巻 : IA-32 基本命令リファレンス


MOVSX—Move with Sign-Extension ( 続き )<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:667


MOVZX—Move with Zero-Extend<br />

オペコード 命令 説明<br />

0F B6 /r MOVZX r16,r/m8 バイトをワードにゼロ拡張して転送する。<br />

0F B6 /r MOVZX r32,r/m8 バイトをダブルワードにゼロ拡張して転送する。<br />

0F B7 /r MOVZX r32,r/m16 ワードをダブルワードにゼロ拡張して転送する。<br />

説明<br />

ソース ・オペランド ( レジスタまたはメモリ ・ ロケーション ) の内容をデステ ィ ネー<br />

ション・オペランド ( レジスタ ) にコピーし、 値を 16 ビッ トまたは32 ビ ッ ト に符号拡<br />

張する。 変換 さ れた値のサ イ ズは、 オペラ ン ド ・ サイ ズ属性に依存する。<br />

ソース ・オペランド ( レジスタまたはメモリ ・ ロケーション ) の内容をデステ ィ ネー<br />

ション・オペランド ( レジスタ ) にコピーし、 値を 16 ビッ トまたは32 ビッ トにゼロ拡<br />

張する。 変換 さ れた値のサ イ ズは、 オペラ ン ド ・ サイ ズ属性に依存する。<br />

操作<br />

DEST ← ZeroExtend(SRC);<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

3:668 第 3 巻 : IA-32 基本命令リファレンス


MOVZX—Move with Zero-Extend ( 続き )<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:669


MUL—Unsigned Multiplication of AL, AX, or EAX<br />

:<br />

オペコード 命令 説明<br />

F6 /4 MUL r/m8 符号なし乗算 (AX ← AL∗ r/m8)<br />

F7 /4 MUL r/m16 符号なし乗算 (DX:AX ← AX ∗ r/m16)<br />

F7 /4 MUL r/m32 符号なし乗算 (EDX:EAX ← EAX∗ r/m32)<br />

説明<br />

第 1 オペラン ド ( デステ ィ ネーシ ョ ン ・ オペラン ド ) と第2 オペラン ド ( ソース ・ オペラ<br />

ンド ) と の符号なし乗算を行い、 結果をデス テ ィ ネ ー シ ョ ン ・ オペラ ン ド に ス ト アす る。<br />

デステ ィ ネーシ ョ ン ・ オペラン ド は、 ( オペラン ド のサイズに応じて ) AL、 AX、 または<br />

EAX レジスタとなる暗黙のオペランドである。 ソース ・ オペランドは、 汎用レジスタま<br />

たは メ モ リ ・ ロ ケ ー シ ョ ンである。 こ の命令の処置 と 結果の ロ ケ ー シ ョ ン は、 以下の表<br />

に示すよ う にオペコ ー ド と オペラン ド ・ サイズによ って変わる。<br />

オペラン ド ・ サイズに基づいて、 AH、 DX、 または EDX レジスタに、 積の上位ビッ トが<br />

格納 さ れる。 こ れ ら の レ ジ ス タ の う ち 1 つの内容が 0 である場合は、 CF フラグと OF フ<br />

ラ グが ク リ ア さ れる。 それ以外の場合は、 CF フラグと OF フラグがセッ ト される。<br />

操作<br />

オペランド・サイズ ソース 1 ソース 2 デスティネーション<br />

バイト AL r/m8 AX<br />

ワード AX r/m16 DX:AX<br />

ダブルワード EAX r/m32 EDX:EAX<br />

IF byte operation<br />

THEN<br />

AX ← AL ∗ SRC<br />

ELSE (* word or doubleword operation *)<br />

IF OperandSize = 16<br />

THEN<br />

DX:AX ← AX ∗ SRC<br />

ELSE (* OperandSize = 32 *)<br />

EDX:EAX ← EAX ∗ SRC<br />

FI;<br />

FI;<br />

影響を受けるフラグ<br />

結果の上半分が 0 である場合は、 OF フラグと CF フラグが0 にク リアされる。 そうでな<br />

い場合は、 それらのフ ラグが 1 にセッ ト される。 SF、 ZF、 AF、 および PF フラグは未定<br />

義。<br />

3:670 第 3 巻 : IA-32 基本命令リファレンス


MUL—Unsigned Multiplication of AL, AX, or EAX ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:671


NEG—Two's Complement Negation<br />

オペコード 命令 説明<br />

F6 /3 NEG r/m8 2 の補数が r/m8 をネゲートする。<br />

F7 /3 NEG r/m16 2 の補数が r/m16 をネゲートする。<br />

F7 /3 NEG r/m32 2 の補数が r/m32 をネゲートする。<br />

説明<br />

オペラン ド ( デステ ィ ネーシ ョ ン ・ オペラン ド ) の値をその 2 の補数で置き換える。 デ<br />

スティネーション・オペランドは、 汎用レジスタまたはメモリ ・ロケーションである。<br />

操作<br />

IF DEST = 0<br />

THEN CF ← 0<br />

ELSE CF ← 1;<br />

FI;<br />

DEST ← - (DEST)<br />

影響を受けるフラグ<br />

ソース ・オペランドが0 である場合は、 CF フラグが0 にク リ アされる。 そ う でない場合<br />

は、 CF フラグが1 にセッ ト される。 OF、 SF、 ZF、 AF、 および PF フラグが結果に従っ<br />

てセッ ト される。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ・フォル ト、ネス ト された TLB フォルト、デー<br />

タ TLB フォルト、代替データTLB フォルト、データ・ペー<br />

ジ不在フ ォル ト、 データ NaT ページ参照アボー ト、 デー<br />

タ・キー・ミス・フォルト、 データ・キー許可フォルト、<br />

データ ・アクセス権フォルト、 データ ・アクセス・ ビッ ト ・<br />

フォルト、 データ・ダーティ ・ビット ・フォルト。<br />

保護モード例外<br />

#GP(0) デステ ィ ネー シ ョ ンが書き込み不可能なセグメ ン ト にある<br />

場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

3:672 第 3 巻 : IA-32 基本命令リファレンス


NEG—Two's Complement Negation ( 続き )<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:673


NOP—No Operation<br />

オペコード 命令 説明<br />

90 NOP 操作なし<br />

説明<br />

何の操作 も 実行 されない。 こ の命令は、 命令ス ト リ ー ム内で空間を占め るが、 EIP レジ<br />

スタを除いて、 マシン ・ コンテキス ト に影響を与えない 1 バイ ト命令である。<br />

NOP 命令は、何も操作を実行しない。レジスタへのアクセスは行われず、フォルトも発<br />

生しない。<br />

影響を受けるフラグ<br />

なし。<br />

例外 ( すべての操作モード )<br />

なし。<br />

3:674 第 3 巻 : IA-32 基本命令リファレンス


NOT—One's Complement Negation<br />

オペコード 命令 説明<br />

F6 /2 NOT r/m8 r/m8 の各ビットを反転する。<br />

F7 /2 NOT r/m16 r/m16 の各ビットを反転する。<br />

F7 /2 NOT r/m32 r/m32 の各ビットを反転する。<br />

説明<br />

デステ ィ ネーシ ョ ン ・ オペラン ド にビ ッ ト単位の NOT( 否定 ) 演算 (1 つの補数 ) を実行<br />

し、 結果をデスティネーション・オペランド ・ロケーションにストアする。 デスティ<br />

ネーション ・ オペランドには、 レジスタまたはメモリ ・ ロケーションを使用できる。<br />

操作<br />

DEST ← NOT DEST;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) デステ ィ ネー シ ョ ン ・ オペラ ン ド が書き込み不可能なセグ<br />

メント を指している場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:675


NOT—One's Complement Negation ( 続き )<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:676 第 3 巻 : IA-32 基本命令リファレンス


OR—Logical Inclusive OR<br />

オペコード 命令 説明<br />

0C ib OR AL,imm8 AL と imm8 との OR をとる。<br />

0D iw OR AX,imm16 AX と imm16 との OR をとる。<br />

0D id OR EAX,imm32 EAX と imm32 との OR をとる。<br />

80 /1 ib OR r/m8,imm8 r/m8 と imm8 との OR をとる。<br />

81 /1 iw OR r/m16,imm16 r/m16 と imm16 との OR をとる。<br />

81 /1 id OR r/m32,imm32 r/m32 と imm32 との OR をとる。<br />

83 /1 ib OR r/m16,imm8 r/m16 と imm8 との OR をとる。<br />

83 /1 ib OR r/m32,imm8 r/m32 と imm8 との OR をとる。<br />

08 /r OR r/m8,r8 r/m8 と r8 との OR をとる。<br />

09 /r OR r/m16,r16 r/m16 と r16 との OR をとる。<br />

09 /r OR r/m32,r32 r/m32 と r32 との OR をとる。<br />

0A /r OR r8,r/m8 r8 と r/m8 との OR をとる。<br />

0B /r OR r16,r/m16 r16 と r/m16 との OR をとる。<br />

0B /r OR r32,r/m32 r32 と r/m32 との OR をとる。<br />

説明<br />

デステ ィ ネーシ ョ ン ・ オペラン ド ( 第 1 オペラン ド ) とソース・オペランド ( 第 2 オペラ<br />

ンド ) でビッ ト単位の OR( 論理和 ) 演算を実行し、 結果をデステ ィ ネーシ ョ ン ・ オペラ<br />

ンド ・ロケーションにストアする。 ソース・オペランドには、 即値、 レジスタ、 または<br />

メモリ ・ロケーションを使用できる。 デスティネーション・オペランドには、 レジスタ<br />

またはメモリ ・ ロケーションを使用できる。<br />

操作<br />

DEST ← DEST OR SRC;<br />

影響を受けるフラグ<br />

OF および CF フラグがクリアされ、 SF、 ZF、 PF フラグが結果に従ってセット される。<br />

AF フ ラ グの状態は未定義。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:677


OR—Logical Inclusive OR ( 続き )<br />

保護モード例外<br />

#GP(0) デステ ィ ネー シ ョ ン ・ オペラ ン ド が書き込み不可能なセグ<br />

メント を指している場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:678 第 3 巻 : IA-32 基本命令リファレンス


OUT—Output to Port<br />

オペコード 命令 説明<br />

E6 ib OUT imm8, AL AL にあるバイトを imm8I/O ポート・アドレスに出力する。<br />

E7 ib OUT imm8, AX AX にあるワードを imm8I/O ポート・アドレスに出力する。<br />

E7 ib OUT imm8, EAX EAX にあるダブルワードを imm8I/O ポート・アドレスに出力する。<br />

EE OUT DX, AL AL にあるバイトを DX にある I/O ポート・アドレスに出力する。<br />

EF OUT DX, AX AX にあるワードを DX にある I/O ポート・アドレスに出力する。<br />

EF OUT DX, EAX EAX にあるダブルワードを DX にある I/O ポート・アドレスに出力<br />

する。<br />

説明<br />

値を第 2 オペラン ド ( ソース ・ オペランド ) からデスティネーション ・ オペランド ( 第 1<br />

オペラン ド ) で指定された I/O ポー トにコピーする。 ソース ・ オペランドには、 アクセ<br />

スされるポートのサイズ(8、 16、 または 32 ビッ ト ) に応じてそれぞれ AL、 AX、 または<br />

EAX レジスタを使用できる。 デスティネーション・オペランドには、 バイト即値または<br />

DX レジスタを使用でき る。 バイ ト 即値を使用する と、 I/O ポー ト ・アドレス 0 ~ 255 を<br />

アクセスできる。 ソース ・ オペランド としてDX レジスタを使用すると、 I/O ポー ト 0 ~<br />

65,535 をアクセスするこ とができる。<br />

8 ビットのI/O ポー トにアクセスする場合は、 ポー ト ・サイズはオペコードによって決ま<br />

る。 16 ビッ トまたは32 ビッ トのI/O ポー トにアクセスする場合は、 ポー ト ・サイズはオ<br />

ペラン ド ・ サイズ属性によ って決まる。<br />

マシン ・ コ ー ド ・ レベルでは、 I/O 命令は、 8 ビッ トのI/O ポー ト をアクセスするときは<br />

短くなる。 この場合は、 ポート ・アドレスの上位8ビットは0 になる。<br />

この命令は、 プロセッサの I/O ア ド レ ス空間にある I/O ポー トのアクセスだけに有用で<br />

ある。<br />

I/O トランザクションは、すべての先行するデータ・メモリ操作の後で実行される。これ<br />

以降のデータ・メモリ操作は、I/O トランザクションを通ることができない。<br />

Itanium ベース・システム環境では、I/O ポートの参照は、IOBase レジスタで指定され<br />

る 64 ビット仮想アドレスに、4K バイト仮想ページ当たり 4 ポートずつマッピングされ<br />

る。オペレーティング・システムは、Itanium アーキテクチャの TLB を利用して、任意<br />

の 4 つの I/O ポートへのアクセス許可を付与または拒否できる。I/O ポート空間は、オペ<br />

レーティング・システム・コードによって、任意の 64 ビット物理メモリ・ロケーショ<br />

ンにマッピングされる。CFLG.io = 1 かつ CPL > IOPL の場合は、TSS を参照して、I/O<br />

許可を与えるかどうかを決定する。CFLG.io = 0 または CPL


OUT—Output to Port ( 続き )<br />

操作<br />

IF ((PE = 1) AND ((VM = 1) OR (CPL > IOPL)))<br />

THEN (* Protected mode or virtual-8086 mode with CPL > IOPL *)<br />

IF (CFLG.io AND Any I/O Permission Bit for I/O port being accessed = 1)<br />

THEN #GP(0);<br />

FI;<br />

ELSE ( * Real-address mode or protected mode with CPL ≤ IOPL *)<br />

(* or virtual-8086 mode with all I/O permission bits for I/O port cleared *)<br />

FI;<br />

IF (Itanium_System_Environment) THEN<br />

DEST_VA = IOBase | (Port{15:2}


OUT—Output to Port ( 続き )<br />

仮想 8086 モード例外<br />

#GP(0) アクセスされる I/O ポー トのTSS にある対応する I/O パー<br />

ミッション・ビットのいずれかが1 である場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:681


OUTS/OUTSB/OUTSW/OUTSD—Output String to Port<br />

オペコード 命令 説明<br />

6E OUTS DX, DS:(E)SI アドレス DS:(E)SI のバイトを DX の I/O ポートに出力する。<br />

6F OUTS DX, DS:SI アドレス DS:SI のワードを DX の I/O ポートに出力する。<br />

6F OUTS DX, DS:ESI アドレス DS:ESI のダブルワードを DX の I/O ポートに出力する。<br />

6E OUTSB アドレス DS:(E)SI のバイトを DX の I/O ポートに出力する。<br />

6F OUTSW アドレス DS:SI のワードを DX の I/O ポートに出力する。<br />

6F OUTSD アドレス DS:ESI のダブルワードを DX の I/O ポートに出力する。<br />

説明<br />

これらの命令は、 データを第2 オペラン ド ( ソース・ オペランド ) から第1 オペラン ド<br />

( デステ ィ ネーシ ョ ン ・ オペラン ド ) で指定された I/O ポー トにコピーする。 ソース ・ オペ<br />

ランドは、 アド レス DS:ESI のメモリ ・ロケーションである( オペラン ド ・ サイズ属性が 16<br />

の場合は、 SI レジスタがソース ・ インデックス ・ レジスタとして使用される )。 DS セグメ<br />

ントをセグメント ・オーバライド ・プリフィックスでオーバライドすることができる。<br />

デステ ィ ネーシ ョ ン ・ オペラン ド は、 I/O ポー ト ・アドレス 0 ~ 65535 にアクセスできる<br />

ように、 DX レジスタでなければならない。 8 ビットのI/O ポー トにアクセスする場合<br />

は、 ポー ト ・ サイズはオペコ ー ド に よ って決ま る。 16 ビッ トまたは32 ビッ トのI/O ポー<br />

トにアクセスする場合は、 ポート ・サイズはオペランド ・サイズ属性によって決まる。<br />

OUTSB、 OUTSW、 OUTSD ニーモニッ クは、 それぞれ OUTS 命令のバイ ト 版、 ワ ー ド<br />

版、 ダブルワ ー ド 版のシ ノ ニムであ る (OUTS 命令では、 命令の中で "DS:ESI" を明示的<br />

に指定しなければならない )。<br />

バイ ト、 ワー ド、 またはダブルワー ドがメモリ ・ ロケーシ ョ ンから I/O ポ ー ト に転送 さ<br />

れた後、 ESI レジスタは EFLAGS レジスタ内のDF フラグの設定に従って自動的にイン<br />

クリメントまたはデクリメントされる。 (DF フラグが0 である場合は、 ESI レジスタは<br />

インク リ メン ト される。 DF フラグが1 である場合は、 ESI レジスタはデクリメント され<br />

る。 ) ESI レ ジ ス タ は、 バイ ト 操作の場合は 1、 ワー ド操作の場合は 2、 ダブルワー ド操<br />

作の場合は 4、 それぞれインク リ メン ト またはデク リ メン ト される。<br />

OUTS、 OUTSB、 OUTSW、 OUTSD 命令は、 前に REP プリフィックスを付けると、 ECX<br />

バイ ト、 ワー ド、 またはダブルワー ドのブロ ッ ク入力を行える。 REP プリフィックスの<br />

説明については、 3:713 ページの 「REP/REPE/REPZ/REPNE/REPNZ—Repeat String<br />

Operation Prefix」 を参照のこ と。<br />

OUTS、 OUTSB、 OUTSW、 または OUTSD 命令の実行後、 プ ロ セ ッ サは、 OUT トランザ<br />

ク シ ョ ンの完了を確認してか ら、 次の命令の実行を開始する。 ただし、 OUT トランザク<br />

シ ョ ンが ま だ完了していな く て も 、 次の命令がプ リ フ ェ ッ チ さ れる場合がある。<br />

この命令は、 プロセッサのI/O アドレス空間にあるI/O ポー トのアクセスだけに有用であ<br />

る。<br />

I/O トランザクションは、すべての先行するデータ・メモリ操作の後で実行される。これ<br />

以降のデータ・メモリ操作は、I/O トランザクションを通ることができない。<br />

Itanium ベース・システム環境では、I/O ポートの参照は、IOBase レジスタで指定される<br />

64 ビット仮想アドレスに、4K バイト仮想ページ当たり 4 ポートずつマッピングされる。<br />

オペレーティング・システムは、Itanium アーキテクチャの TLB を利用して、任意の 4 つ<br />

の I/O ポートへのアクセス許可を付与または拒否できる。I/O ポート空間は、オペレーティ<br />

ング・システム・コードによって、任意の 64 ビット物理メモリ・ロケーションにマッピ<br />

ングされる。CFLG.io = 1 かつ CPL > IOPL の場合は、TSS を参照して、I/O 許可を与える<br />

かどうかを決定する。CFLG.io = 0 または CPL


OUTS/OUTSB/OUTSW/OUTSD—Output String to Port ( 続き )<br />

参照される I/O ポートが (I/O ベース・レジスタを介して ) 実装されていない仮想アドレ<br />

スにマッピングされる場合や、データ変換がディスエーブル (PSR.dt = 0) になっている<br />

場合は、その I/O ポートを参照する OUTS 命令を発行すると、GPFault が発生する。<br />

操作<br />

IF ((PE = 1) AND ((VM = 1) OR (CPL > IOPL)))<br />

THEN (* Protected mode or virtual-8086 mode with CPL > IOPL *)<br />

IF (CFLG.io AND Any I/O Permission Bit for I/O port being accessed = 1)<br />

THEN #GP(0);<br />

FI;<br />

ELSE ( * I/O operation is allowed *)<br />

FI;<br />

IF (Itanium_System_Environment) THEN<br />

DEST_VA = IOBase | (Port{15:2}


OUTS/OUTSB/OUTSW/OUTSD—Output String to Port ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

IA-32_Exception データ ・ ブレークポイン ト およびシングル ・ ステップでの<br />

デバッ グ ・ ト ラ ッ プ。<br />

IA-32_Exception アライメン ト ・ フォルト。<br />

#GP(0) 参照される ポ ー ト が実装されていない仮想ア ド レ スにマ ッ<br />

ピングされるか、 PSR.dt が 0 である。<br />

保護モード例外<br />

#GP(0) CPL が I/O 特権レベル (IOPL) より大きく ( 低い特権を も<br />

つ )、 アクセスされる I/O ポー トのTSS にある対応する<br />

I/O パー ミ ッシ ョン ・ ビッ ト のいずれかが 1 で、 かつ<br />

CFLG.io が1である場合。<br />

デステ ィ ネー シ ョ ンが書き込み不可能なセグメ ン ト にある<br />

場合。<br />

メモリ ・ オペランドの実効アドレスが ES セグメン ト の範<br />

囲外の場合。<br />

ES レジスタの内容がNULL セグ メ ン ト ・ セレ ク タ の場合。<br />

ES セグメン ト にイ リ ーガルなメモ リ ・ オペラン ド の実効<br />

ア ド レ スが指定 さ れた場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ・フォル ト、ネス ト された TLB フォルト、デー<br />

タ TLB フォルト、代替データTLB フォルト、データ・ペー<br />

ジ不在フ ォル ト、 データ NaT ページ参照アボー ト、 デー<br />

タ・キー・ミス・フォルト、 データ・キー許可フォルト、<br />

データ ・アクセス権フォルト、 データ ・アクセス・ ビッ ト ・<br />

フォルト、 データ・ダーティ ・ビット ・フォルト。<br />

#GP(0) アクセスされる I/O ポー トのTSS にある対応する I/O パー<br />

ミッション・ビットのいずれかが1 である場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

3:684 第 3 巻 : IA-32 基本命令リファレンス


OUTS/OUTSB/OUTSW/OUTSD—Output String to Port ( 続き )<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:685


POP—Pop a Value from the Stack<br />

オペコード 命令 説明<br />

8F /0 POP m16 スタックのトップを m16 にポップし、スタック・ポインタをインク<br />

リメントする。<br />

8F /0 POP m32 スタックのトップを m32 にポップし、スタック・ポインタをインク<br />

リメントする。<br />

58+ rw POP r16 スタックのトップを r16 にポップし、スタック・ポインタをインク<br />

リメントする。<br />

58+ rd POP r32 スタックのトップを r32 にポップし、スタック・ポインタをインク<br />

リメントする。<br />

1F POP DS スタックのトップを DS にポップし、スタック・ポインタをインク<br />

リメントする。<br />

07 POP ES スタックのトップを ES にポップし、スタック・ポインタをインク<br />

リメントする。<br />

17 POP SS スタックのトップを SS にポップし、スタック・ポインタをインク<br />

リメントする。<br />

0F A1 POP FS スタックのトップを FS にポップし、スタック・ポインタをインク<br />

リメントする。<br />

0F A9 POP GS スタックのトップを GS にポップし、スタック・ポインタをインク<br />

リメントする。<br />

説明<br />

値をスタックのト ップからデスティネーション ・ オペランドで指定されたロケーション<br />

にロー ドし、 スタック ・ ポインタをインク リメン トする。 デスティネーション ・ オペラ<br />

ンドには、 汎用レジスタ、 メモリ ・ロケーション、 またはセグメント ・レジスタを使用<br />

できる。<br />

スタック・セグメントの現在のアドレス・サイズ属性と、 オペランド ・サイズ属性に<br />

よって、 スタック ・ ポインタをインク リ メン トする量( 「操作」 の項を参照 ) が決ま る。<br />

例えば、 32 ビッ トのアドレス指定とオペランドが使用されている場合は、 ESP レジスタ<br />

( スタック ・ ポインタ ) が 4 ずつイン ク リ メン ト される。 16 ビッ トのアドレス指定とオ<br />

ペラン ドが使用されている場合は、 SP レジスタ (16 ビッ ト ・アドレス指定のスタック ・<br />

ポインタ ) が 2 ずつインク リ メン ト される。 スタ ッ ク ・ セグメン ト のセグメン ト ・ デ ィ<br />

スクリプタのB フラグによって、 スタックのアドレス ・サイズ属性が決まる。<br />

デスティネーション ・ オペランドがセグメント ・ レジスタ DS、 ES、 FS、 GS、 または SS<br />

の 1 つである場合は、 レ ジ ス タ に ロ ー ド さ れる値は、 有効なセグ メ ン ト ・ セレ ク タ でな<br />

ければならない。 保護モー ドでは、 セグメン ト ・ セレクタをセグメン ト ・ レジスタに<br />

ポップすると、 そのセグメン ト ・ セレクタに関連するディスクリプタ情報がセグメン ト・レジスタの見えない( シャ ドー ) 部分に自動的に ロ ー ド さ れ、 セレ ク タ お よ びデ ィ<br />

ス ク リ プ タ の情報が有効に さ れる ( 下記の 「操作」 を参照 )。<br />

一般保護フ ォ ル ト を発生 さ せずに NULL 値 (0000 ~ 0003) を DS、 ES、 FS、 または GS レ<br />

ジスタにポップできる。 ただし、 対応するセグメント ・ レジスタに NULL 値がロ ー ド さ<br />

れてい る セグ メ ン ト を その後で参照し よ う と す る と 、 一般保護例外 (#GP) が発生する。<br />

こ の状況では、 メモ リ 参照は行われず、 セグメン ト ・ レ ジスタのセーブ された値は<br />

NULL である。<br />

POP 命令では、 値を CS レジスタにポップできない。 CS レジスタにロードするには、<br />

RET 命令を使用す る。<br />

3:686 第 3 巻 : IA-32 基本命令リファレンス


POP—Pop a Value from the Stack ( 続き )<br />

IA-32 システム環境では、 POP SS 命令を実行する と、 次の命令の実行が完了する ま で、<br />

NMI 割 り 込みを含むすべての外部割 り 込みお よ び ト ラ ッ プが禁止 さ れる。 Itanium ベー<br />

ス・システム環境では、POP SS 命令を実行すると、命令の完了後に IA-32_Intercept<br />

(SystemFlag) トラップが発生する。 こ の操作に よ っ て、 割 り 込みが発生す る前に、 次の<br />

命令 (MOV ESP, スタック ・ ポインタ値) で ESP レジスタにスタック ・ ポインタをロード<br />

するこ とができる。 ただし、 SS レジスタと ESP レジスタをロードするには、 LSS 命令を<br />

使用す る方が効率的である。<br />

こ の動作に よ っ て、 割 り 込みの間に無効なス タ ッ ク が発生しない よ う に、 POS SS 命令 と<br />

MOV ESP, EBP 命令をシ ー ケンシ ャ ルに実行で き る。 ただし、 SS レジスタと ESP レジス<br />

タをロードするときは、 LSS 命令を使用す る方が望 ま しい。<br />

メモリ内のデスティネーション・オペランドのアドレスを指定するベース・レジスタと<br />

して ESP レジスタを使用すると、 POP 命令は、 ESP レジスタをインク リメントした後に<br />

オペランドの実効アドレスを計算する。<br />

POP ESP 命令は、 スタックの古いト ップにあるデータをデスティネーションに書き込む<br />

前に、 スタ ッ ク ・ ポインタ (ESP) をインク リメントする。<br />

操作<br />

IF StackAddrSize = 32<br />

THEN<br />

IF OperandSize = 32<br />

THEN<br />

DEST ← SS:ESP; (* copy a doubleword *)<br />

ESP ← ESP + 4;<br />

ELSE (* OperandSize = 16*)<br />

DEST ← SS:ESP; (* copy a word *)<br />

ESP ← ESP + 2;<br />

FI;<br />

ELSE (* StackAddrSize = 16* )<br />

IF OperandSize = 16<br />

THEN<br />

DEST ← SS:SP; (* copy a word *)<br />

SP ← SP + 2;<br />

ELSE (* OperandSize = 32 *)<br />

DEST ← SS:SP; (* copy a doubleword *)<br />

SP ← SP + 4;<br />

FI;<br />

FI;<br />

保護モ ー ド の間にセグ メ ン ト ・ レ ジ ス タ を ロ ー ド する と 、 以下の リ ス ト で説明してい る<br />

よ う に特殊なチ ェ ッ ク と 処置が行われる。 これら のチェ ッ ク は、 セグメ ン ト ・ セレ ク タ<br />

と それが指しているセグメ ン ト ・ デ ィ ス ク リ プタに対して行われる。<br />

IF SS is loaded;<br />

THEN<br />

IF segment selector is null<br />

THEN #GP(0);<br />

FI;<br />

IF segment selector index is outside descriptor table limits<br />

OR segment selector's RPL ≠ CPL<br />

OR segment is not a writable data segment<br />

OR DPL ≠ CPL<br />

THEN #GP(selector);<br />

第 3 巻 : IA-32 基本命令リファレンス 3:687


POP—Pop a Value from the Stack ( 続き )<br />

FI;<br />

IF segment not marked present<br />

THEN #SS(selector);<br />

ELSE<br />

SS ← segment selector;<br />

SS ← segment descriptor;<br />

FI;<br />

FI;<br />

IF DS, ES, FS or GS is loaded with non-null selector;<br />

THEN<br />

IF segment selector index is outside descriptor table limits<br />

OR segment is not a data or readable code segment<br />

OR ((segment is a data or nonconforming code segment)<br />

AND (both RPL and CPL > DPL))<br />

THEN #GP(selector);<br />

IF segment not marked present<br />

THEN #NP(selector);<br />

ELSE<br />

SegmentRegister ← segment selector;<br />

SegmentRegister ← segment descriptor;<br />

FI;<br />

FI;<br />

IF DS, ES, FS or GS is loaded with a null selector;<br />

THEN<br />

SegmentRegister ← null segment selector;<br />

SegmentRegister ← null segment descriptor;<br />

FI;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

IA-32_Intercept POP SS でのシステム ・ フラグ ・ インターセプ ト ・ ト ラ ッ<br />

プ。<br />

Itanium アーキテクチャ ・ NaT レ ジ ス タ参照アボ ー ト 。<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不M 在フ ォル ト 、 データ NaT ページ参照ア<br />

ボー ト、 データ ・ キー ・ ミス ・ フォルト、 データ ・ キー許<br />

可フ ォル ト 、 データ ・ アクセス権フ ォル ト 、 データ ・ アク<br />

セス・ビット・フォルト、 データ・ダーティ・ビット ・<br />

フォルト。<br />

3:688 第 3 巻 : IA-32 基本命令リファレンス


POP—Pop a Value from the Stack ( 続き )<br />

保護モード例外<br />

#GP(0) NULL セグメン ト ・ セレ ク タで SS レジスタをロードしよ<br />

う と した場合。<br />

デステ ィ ネー シ ョ ン ・ オペラ ン ド が書き込み不可能なセグ<br />

メント にある場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタを使用してメモリがア<br />

クセスされ、 レジスタの内容が NULL セグメン ト ・ セレ<br />

クタであった場合。<br />

#GP( セレクタ ) セグメン ト ・ セレ ク タ ・ インデッ クスがデ ィ スク リ プタ ・<br />

テーブルの範囲外の場合。<br />

SS レジスタがロード され、 セグメント ・セレクタのRPL<br />

およびセグメント ・ディスク リプタの DPL が CPL に等し<br />

くない場合。<br />

SS レ ジ ス タ がロ ー ド さ れ、 指示先のセグ メ ン ト が書き込<br />

み不可能なデー タ ・ セグメン ト である場合。<br />

DS、 ES、 FS、 または GS レジスタがロード され、 指示先<br />

のセグメン ト がデータ ・ セグメン ト または読み取り可能な<br />

コード ・セグメントでない場合。<br />

DS、 ES、 FS、 または GS レジスタがロード され、 指示先<br />

のセグメン ト がデータ ・ セグメン ト または非コ ンフ ォ ー ミ<br />

ング ・ コー ド ・ セグメン ト であるが、 RPL および CPL の<br />

両方 と も DPL より大きい場合。<br />

#SS(0) スタックの現在のト ップがスタック ・セグメン ト内にない<br />

場合。<br />

メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#SS( セレクタ ) SS レ ジ ス タ がロ ー ド さ れ、 指示先のセグ メ ン ト が存在し<br />

ないとマー ク されている場合。<br />

#NP DS、 ES、 FS、 または GS レジスタがロード され、 指示先<br />

のセグメン ト が存在しないと マー ク されている場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:689


POP—Pop a Value from the Stack ( 続き )<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:690 第 3 巻 : IA-32 基本命令リファレンス


POPA/POPAD—Pop All General-Purpose Registers<br />

オペコード 命令 説明<br />

61 POPA DI、SI、BP、BX、DX、CX、AX をポップする。<br />

61 POPAD EDI、ESI、EBP、EBX、EDX、ECX、EAX をポップする。<br />

説明<br />

ダブルワー ド (POPAD) またはワー ド (POPA) をスタ ッ クから汎用レジスタにポップする。<br />

レジスタがロード される順番は、 ( オペラン ド ・ サイズ属性が 32 である場合は ) EDI、<br />

ESI、 EBP、 EBX、 EDX、 ECX、 EAX であ り、 ( オペラン ド ・ サイズ属性が 16 である場<br />

合は ) DI、 SI、 BP、 BX、 DX、 CX、 AX である。 これらの命令は、 PUSHA/PUSHAD 命<br />

令の逆の操作を実行する。 ESP レジスタまたは SP レジスタのスタック上の値は無視され<br />

る。 その代わりに、 ESP レジスタまたは SP レジスタは、 各レジスタがロード された後に<br />

インク リ メン ト される。<br />

POPA ( すべてをポ ッ プ ) ニーモニッ クおよび POPAD ( すべてのダブルをポ ッ プ ) ニーモ<br />

ニックは、 同じオペコードを参照する。 POPA 命令は、 オペラ ン ド ・ サイ ズ属性が 16 で<br />

ある と きに使用するためのものであり、 POPAD 命令は、 オペラ ン ド ・ サ イ ズ属性が 32<br />

である と き に使用す る ための も のである。 一部のアセンブ ラ は、 ( 必要な場合に は オペラ<br />

ンド ・サイズ・オーバライド ・プリフィックス[66H] を使用して ) POPA が使用される と<br />

きはオペランド ・サイズを 16 に、 POPAD が使用される と き は 32 に強制する。 他のアセ<br />

ンブラは、 これらのニーモニッ クをシノニム (POPA/POPAD) として取り扱い、 オペラン<br />

ド ・ サイズ属性の現在の設定を使用して、 使用されているニーモニ ッ ク に関係な く 、 ス<br />

タックからポップする値のサイズを決定できる。<br />

操作<br />

IF OperandSize = 32 (* instruction = POPAD *)<br />

THEN<br />

EDI ← Pop();<br />

ESI ← Pop();<br />

EBP ← Pop();<br />

increment ESP by 4 (* skip next 4 bytes of stack *)<br />

EBX ← Pop();<br />

EDX ← Pop();<br />

ECX ← Pop();<br />

EAX ← Pop();<br />

ELSE (* OperandSize = 16, instruction = POPA *)<br />

DI ← Pop();<br />

SI ← Pop();<br />

BP ← Pop();<br />

increment ESP by 2 (* skip next 2 bytes of stack *)<br />

BX ← Pop();<br />

DX ← Pop();<br />

CX ← Pop();<br />

AX ← Pop();<br />

FI;<br />

影響を受けるフラグ<br />

なし。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:691


POPA/POPAD—Pop All General-Purpose Registers ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

保護モード例外<br />

#SS(0) 開始スタック ・アド レスまたは終了スタック ・アド レスが<br />

スタック ・セグメン ト内にない場合<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

3:692 第 3 巻 : IA-32 基本命令リファレンス


POPF/POPFD—Pop Stack into EFLAGS Register<br />

オペコード 命令 説明<br />

9D POPF スタックのトップを EFLAGS にポップする。<br />

9D POPFD スタックのトップを EFLAGS にポップする。<br />

説明<br />

( 現在のオペラ ン ド ・ サイズ属性が 32 である場合は ) これらの命令は、 ダブルワー ド<br />

(POPFD) をスタッ クのト ップからポップして、 値を EFLAGS レジスタにストアする。<br />

( オペラン ド ・ サイズ属性が 16 である場合は ) ワードをスタックのト ップからポップし<br />

て、 値を EFLAGS レジスタの下位16 ビッ トにストアする。 ( これらの命令は、 PUSHF/<br />

PUSHFD 命令の逆の操作を実行する。 )<br />

POPF ( フラグをポップ ) ニーモニッ クおよび POPFD ( フラグ・ダブルをポップ) ニーモ<br />

ニックは、 同じオペコードを参照する。 POPF 命令は、 オペラ ン ド ・ サイ ズ属性が 16 で<br />

ある と きに使用するためのものであり、 POPFD 命令は、 オペラ ン ド ・ サイ ズ属性が 32<br />

である と き に使用す る ための も のである。 一部のアセンブ ラ は、 POPF が使用される と<br />

きはオペランド ・サイズを 16 に、 POPFD が使用される と き は 32 に強制する。 他のアセ<br />

ンブラは、 これらのニーモニッ クをシノニム (POPF/POPFD) として取り扱い、 オペラン<br />

ド ・ サイズ属性の現在の設定を使用して、 使用されているニーモニ ッ ク に関係な く 、 ス<br />

タックからポップする値のサイズを決定できる。<br />

EFLAGS レジスタへのPOPF/POPFD 命令の影響は、 プ ロセ ッ サの動作モー ド に応じ て少<br />

し変わる。 プロセッサが特権レベル 0 の保護モー ド ( または特権レベル0 に同等である<br />

実ア ド レス ・ モー ド ) で動作している と き は、 VIP、 VIF、 VM フラグを除く EFLAGS レ<br />

ジスタのすべての非予約フラグは修正される可能性がある。 VIP と VIF フラグはクリア<br />

される。<br />

特権レベルが 0 よ り大きいけれど も保護モー ドで動作している と きは、 IOPL フィールド<br />

と VIP と VIF フ ラ グを除 く すべての フ ラ グは修正 さ れる可能性がある。 こ の場合 も 、<br />

IOPL のフラグはマスクされ、 VIP と VIF フラグはクリアされる。<br />

仮想 8086 モー ドで動作していると きは、 I/O 特権レベル (IOPL) は、 POPF/POPFD 命令を<br />

使用す る に は 3 に等し く なければならず、 VM、 RF、 IOPL、 VIP、 VIF フラグはマスクさ<br />

れる。 IOPL が 3 より小さい場合、 POPF/POPFD 命令は一般保護例外 (#GP) を発生させ<br />

る。<br />

IOPL は、 特権レベル 0 で実行した と き にのみ変更 さ れる。 割 り 込み フ ラ グは、 IOPL と<br />

同等 ま たは それ以上の特権レベルで実行した と き にのみ変更される ( 実ア ド レ ス ・ モー<br />

ドは、 特権レベル0 に相当する )。 不十分な特権レベルで POPF/POPFD 命令を実行した<br />

場合は、 例外は発生しないが、 特権ビ ッ ト は変わ ら ない。<br />

操作<br />

OLD_IF


POPF/POPFD—Pop Stack into EFLAGS Register ( 続き )<br />

FI;<br />

FI;<br />

IF CPL=0<br />

THEN<br />

IF OperandSize = 32;<br />

THEN<br />

EFLAGS ← Pop();<br />

(* All non-reserved flags except VM, RF, VIP and VIF can be *)<br />

(* modified; *)<br />

ELSE (* OperandSize = 16 *)<br />

EFLAGS[15:0] ← Pop(); (* All non-reserved flags can be modified; *)<br />

FI;<br />

ELSE (* CPL > 0 *)<br />

IF OperandSize = 32;<br />

THEN<br />

EFLAGS ← Pop()<br />

(* All non-reserved bits except IOPL, RF, VM, VIP, and VIF can *)<br />

(* be modified; *)<br />

(* IOPL is masked *)<br />

ELSE (* OperandSize = 16 *)<br />

EFLAGS[15:0] ← Pop();<br />

(* All non-reserved bits except IOPL can be modified; IOPL is masked *)<br />

FI;<br />

FI;<br />

ELSE (* In Virtual-8086 Mode *)<br />

IF IOPL=3<br />

THEN<br />

IF OperandSize=32<br />

THEN<br />

EFLAGS ← Pop()<br />

(* All non-reserved bits except VM, RF, IOPL, VIP, and VIF *)<br />

(* can be modified; VM, RF, IOPL, VIP, and VIF are masked*)<br />

ELSE<br />

EFLAGS[15:0] ← Pop()<br />

(* All non-reserved bits except IOPL can be modified; IOPL is *)<br />

(* masked *)<br />

FI;<br />

ELSE (* IOPL < 3 *)<br />

IF CR4.VME = 0<br />

THEN #GP(0);<br />

ELSE<br />

IF ((OperandSize = 32) OR (STACK.TF = 1) OR (EFLAGS.VIP = 1<br />

AND STACK.IF = 1)<br />

THEN #GP(0);<br />

ELSE<br />

TempFlags


POPF/POPFD—Pop Stack into EFLAGS Register ( 続き )<br />

IF(Itanium System Environment AND (AC, TF != OLD_AC, OLD_TF)<br />

THEN IA-32_Intercept(System_Flag,POPF);<br />

IF Itanium System Environment AND CFLG.ii AND IF != OLD_IF<br />

THEN IA-32_Intercept(System_Flag,POPF);<br />

影響を受けるフラグ<br />

予約ビ ッ ト を除 く すべての フ ラ グ。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

IA-32_Intercept CFLG.ii が 1 で、 IF フ ラ グの状態が変化した場合、 あるい<br />

は AC、 RF、 または TF の状態が変化した場合、 システ<br />

ム・フラグ・インターセプト ・ トラップ。<br />

保護モード例外<br />

#SS(0) スタックのト ップがスタック ・セグメン ト内にない場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS<br />

または GS セグ メ ン ト の範囲外の場合。<br />

I/O 特権レベルが 3 より小さい場合。<br />

オペラン ド ・ サイズ ・ オーバライ ド ・ プ リ フ ィ ッ クスの付<br />

いた POPF/POPFD 命令を実行し よ う と した場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:695


PUSH—Push Word or Doubleword onto the Stack<br />

オペコード 命令 説明<br />

FF /6 PUSH r/m16 r/m16 をプッシュする。<br />

FF /6 PUSH r/m32 r/m32 をプッシュする。<br />

50+rw PUSH r16 r16 をプッシュする。<br />

50+rd PUSH r32 r32 をプッシュする。<br />

6A PUSH imm8 imm8 をプッシュする。<br />

68 PUSH imm16 imm16 をプッシュする。<br />

68 PUSH imm32 imm32 をプッシュする。<br />

0E PUSH CS CS をプッシュする。<br />

16 PUSH SS SS をプッシュする。<br />

1E PUSH DS DS をプッシュする。<br />

06 PUSH ES ES をプッシュする。<br />

0F A0 PUSH FS FS をプッシュする。<br />

0F A8 PUSH GS GS をプッシュする。<br />

説明<br />

スタック ・ ポインタをデク リ メントし、 次にソース ・ オペランドをプロシージャ ・ ス<br />

タックのトップにストアする。 スタック ・セグメントの現在のアドレス・サイズ属性と、<br />

オペラン ド ・ サイズ属性によ って、 スタ ッ ク ・ ポインタをデク リ メン ト する量が決ま る<br />

( 下記の 「操作」 を参照 )。 例えば、 32 ビッ トのアドレス指定とオペランドが使用されて<br />

いる場合は、 ESP レジスタ ( スタック ・ ポインタ ) が 4 ずつデク リ メン ト される。 16<br />

ビッ トのアドレス指定とオペランドが使用されている場合は、 SP レジスタ (16 ビッ ト ・<br />

アドレス指定のスタック ・ポインタ) が 2 ずつデク リ メン ト される。 スタ ッ クのア ド レ<br />

ス・サイズ属性が32 である と きに 16 ビット ・オペランドをプッシュすると、 スタッ<br />

ク・ポインタでアライメント不正が発生することがある( すなわち、 スタ ッ ク ・ ポイン<br />

タはダブルワー ド境界にアライメントが合っていない )。<br />

PUSH ESP 命令は、 命令が実行される前に ESP レジスタの値が存在していたようにその<br />

値をプ ッ シ ュする。 そのため、 ESP レジスタがオペランド ・アドレスの計算にベース ・<br />

レジスタとして使用されるメモリ ・ オペランドを、 PUSH 命令が使用する と 、 ESP レジ<br />

スタがデクリ メン ト される前に、 オペランドの実効アドレスが計算される。 実ア ド レス ・ モー ド では、 PUSH 命令が実行 さ れる と き に、 ESP レジスタまたは SP レジ<br />

スタが 1 であ る場合、 プ ロ セ ッ サは ス タ ッ ク ・ スペー スの不足に よ っ てシ ャ ッ ト ・ ダ ウ<br />

ンする。 こ の状態を示す例外は生成 さ れない。<br />

操作<br />

IF StackAddrSize = 32<br />

THEN<br />

IF OperandSize = 32<br />

THEN<br />

ESP ← ESP − 4;<br />

SS:ESP ← SRC; (* push doubleword *)<br />

ELSE (* OperandSize = 16*)<br />

ESP ← ESP − 2;<br />

SS:ESP ← SRC; (* push word *)<br />

FI;<br />

3:696 第 3 巻 : IA-32 基本命令リファレンス


PUSH—Push Word or Doubleword onto the Stack ( 続き )<br />

ELSE (* StackAddrSize = 16*)<br />

IF OperandSize = 16<br />

THEN<br />

FI;<br />

FI;<br />

SP ← SP − 2;<br />

SS:SP ← SRC; (* push word *)<br />

ELSE (* OperandSize = 32*)<br />

SP ← SP − 4;<br />

SS:SP ← SRC; (* push doubleword *)<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタを使用してメモリがア<br />

クセスされ、 レジスタの内容が NULL セグメン ト ・ セレ<br />

クタであった場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

SP レジスタまたは ESP レジスタの新しい値がスタック ・<br />

セグ メ ン ト の範囲外の場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:697


PUSH—Push Word or Doubleword onto the Stack ( 続き )<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

インテル・アーキテクチャにおける互換性<br />

インテル 286 以降の イ ン テル ・ ア ー キ テ ク チ ャ ・ プ ロ セ ッ サでは、 PUSH ESP 命令は、<br />

命令が実行 さ れる前に ESP レジスタの値が存在していたよ う にその値をプ ッ シュする。<br />

( このこ とは、 実アド レス ・モー ド または仮想8086 モー ドでも同じである。 ) インテル ®<br />

8086 プロセッサでは、 PUSH SP 命令は、 (2 デク リメン ト された後の値である ) SP レジ<br />

スタの新しい値をプッシュする。<br />

3:698 第 3 巻 : IA-32 基本命令リファレンス


PUSHA/PUSHAD—Push All General-Purpose Registers<br />

オペコード 命令 説明<br />

60 PUSHA AX、CX、DX、BX、元の SP、BP、SI、および DI をプッシュする。<br />

60 PUSHAD EAX、ECX、EDX、EBX、元の ESP、EBP、ESI、および EDI を<br />

プッシュする。<br />

説明<br />

汎用レジスタの内容をスタックにプッシュする。 レジスタがスタックにストアされる順<br />

番は、 ( 現在のオペラ ン ド ・ サイズ属性が 32 である場合は ) EAX、 ECX、 EDX、 EBX、<br />

ESP( 元の値 )、 EBP、 ESI、 EDI であり、 ( オペラン ド ・ サイズ属性が 16 である場合は )<br />

AX、 CX、 DX、 BX、 SP( 元の値 )、 BP、 SI、 DI である。 ( これらの命令は、 POPA/<br />

POPAD 命令の逆の操作を実行す る。 ) ESP レジスタまたは SP レジスタとしてプッシュさ<br />

れる値は、 最初のレジスタをプッ シュする前のその値である ( 下記の 「操作」 を参照 )。<br />

PUSHA ( すべてをプ ッ シ ュ ) ニーモニッ クおよび PUSHAD ( すべてのダブルをプ ッ シュ )<br />

ニーモニッ クは、 同じオペコー ドを参照する。 PUSHA 命令は、 オペラ ン ド ・ サイ ズ属性<br />

が 16 であ る と き に使用す る ための も のであ り 、 PUSHAD 命令は、 オペラ ン ド ・ サイ ズ<br />

属性が 32 である と き に使用す る ための も のである。 一部のアセンブ ラ は、 PUSHA が使<br />

用されると きはオペラン ド ・ サイズを 16 に、 PUSHAD が使用される と き は 32 に強制す<br />

る。 他のアセンブラは、 これらのニーモニッ クをシノニム (PUSHA/PUSHAD) として取<br />

り 扱い、 オペラ ン ド ・ サイ ズ属性の現在の設定を使用して、 使用されるニーモニ ッ ク に<br />

関係なく、 スタッ クにプッシュする値のサイズを決定するこ とができる。<br />

実ア ド レス ・ モー ド では、 PUSHA/PUSHAD 命令が実行 さ れる と き に、 ESP レジスタま<br />

たは SP レジスタが1、 3、 または 5 である場合、 プ ロ セ ッ サは ス タ ッ ク ・ スペー スの不<br />

足に よ っ てシ ャ ッ ト ・ ダ ウ ンする。 こ の状態を示す例外は生成 さ れない。<br />

操作<br />

IF OperandSize = 32 (* PUSHAD instruction *)<br />

THEN<br />

Temp ← (ESP);<br />

Push(EAX);<br />

Push(ECX);<br />

Push(EDX);<br />

Push(EBX);<br />

Push(Temp);<br />

Push(EBP);<br />

Push(ESI);<br />

Push(EDI);<br />

ELSE (* OperandSize = 16, PUSHA instruction *)<br />

Temp ← (SP);<br />

Push(AX);<br />

Push(CX);<br />

Push(DX);<br />

Push(BX);<br />

Push(Temp);<br />

Push(BP);<br />

Push(SI);<br />

Push(DI);<br />

FI;<br />

第 3 巻 : IA-32 基本命令リファレンス 3:699


PUSHA/PUSHAD—Push All General-Purpose Register ( 続き )<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

保護モード例外<br />

#SS(0) 開始スタック ・アド レスまたは終了スタック ・アド レスが<br />

ス タ ッ ク ・ セグ メ ン ト 内にない場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

実アドレス・モード例外<br />

#GP ESP レジスタまたは SP レジスタの内容が7、 9、 11、 13、<br />

または 15 である場合。<br />

仮想 8086 モード例外<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

#GP(0) ESP レジスタまたは SP レジスタの内容が7、 9、 11、 13、<br />

または 15 である場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

3:700 第 3 巻 : IA-32 基本命令リファレンス


PUSHF/PUSHFD—Push EFLAGS Register onto the Stack<br />

オペコード 命令 説明<br />

9C PUSHF EFLAGS をプッシュする。<br />

9C PUSHFD EFLAGS をプッシュする。<br />

説明<br />

( 現在のオペラ ン ド ・ サイズ属性が 32 である場合は ) スタック ・ ポインタを 4 デク リメ<br />

ントし、 EFLAGS レ ジ ス タ の内容全体を ス タ ッ ク にプ ッ シ ュ する。 ( オペラン ド ・ サイ<br />

ズ属性が 16 である場合は ) スタック ・ ポインタを 2 デク リ メント し、 EFLAGS レジスタ<br />

の下位 16 ビッ トをスタックにプッシュする。 ( これらの命令は、 POPF/POPFD 命令の逆<br />

の操作を実行す る。 )<br />

EFLAGS レ ジ ス タ全体を ス タ ッ ク に コ ピ ー す る と き は、 VM および RF フラグと呼ばれ<br />

るビッ ト 16 および 17 はコピーされない。 その代わりに、 これらのフラグの値は、 ス<br />

タックにストアされるEFLAGS イメージでクリアされる。<br />

PUSHF ( フラグをプッシュ ) ニーモニッ クおよび PUSHFD ( ダブルのフラグをプ ッ シュ )<br />

ニーモニッ クは、 同じオペコー ドを参照する。 PUSHF 命令は、 オペラ ン ド ・ サイ ズ属性<br />

が 16 であ る と き に使用す る ための も のであ り 、 PUSHFD 命令は、 オペラ ン ド ・ サイ ズ属<br />

性が 32 である と きに使用するためのものである。 一部のアセンブラは、 PUSHF が使用<br />

される と きはオペラン ド ・ サイズを 16 に、 PUSHFD が使用される と き は 32 に強制する。<br />

他のアセンブラ は、 これら のニーモニ ッ ク をシ ノ ニム (PUSHF/PUSHFD) として取り扱<br />

い、 オペラ ン ド ・ サ イ ズ属性の現在の設定を使用して、 使用されてい る ニ ー モニ ッ ク に<br />

関係な く 、 ス タ ッ ク にプ ッ シ ュ す る値のサイ ズを決定で き る。<br />

仮想 8086 モー ドで I/O 特権レベル (IOPL) が 3 より小さい場合、 PUSHF/PUSHFD 命令は<br />

一般保護例外 (#GP) を発生させる。 IOPL は、 特権レベル 0 で実行した と き にのみ変更さ<br />

れる。 割り込みフラグは、 IOPL と同等またはそれ以上の特権レベルで実行したときにの<br />

み変更される ( 実ア ド レ ス ・ モー ド は、 特権レベル 0 に相当する )。 不十分な特権レ ベル<br />

で PUSHF/PUSHFD 命令を実行した場合は、 例外は発生しないが、 特権ビ ッ ト は変わら<br />

ない。<br />

実ア ド レス ・ モー ド では、 PUSHF/PUSHFD 命令が実行される と き に、 ESP レジスタまた<br />

は SP レジスタが1、 3、 または 5 であ る場合、 プ ロ セ ッ サは ス タ ッ ク ・ スペー スの不足<br />

によってシャッ ト ・ダウンする。 この状態を示す例外は生成されない。<br />

操作<br />

IF VM=0 (* Not in Virtual-8086 Mode *)<br />

THEN<br />

IF OperandSize = 32<br />

THEN<br />

push(EFLAGS AND 00FCFFFFH);<br />

(* VM and RF EFLAG bits are cleared in image stored on the stack*)<br />

ELSE<br />

push(EFLAGS); (* Lower 16 bits only *)<br />

FI;<br />

ELSE (* In Virtual-8086 Mode *)<br />

IF IOPL=3<br />

THEN<br />

IF OperandSize = 32<br />

THEN push(EFLAGS AND 0FCFFFFH);<br />

(* VM and RF EFLAGS bits are cleared in image stored on the stack*)<br />

ELSE push(EFLAGS); (* Lower 16 bits only *)<br />

第 3 巻 : IA-32 基本命令リファレンス 3:701


PUSHF/PUSHFD—Push EFLAGS Register onto the Stack ( 続き )<br />

FI;<br />

FI;<br />

FI;<br />

ELSE (*IOPL < 3*)<br />

影響を受けるフラグ<br />

なし。<br />

IF OperandSize =32 OR CR$.VME=0<br />

THEN #GP(0); (* Trap to virtual-8086 monitor *)<br />

ELSE<br />

TempFlags


RCL/RCR/ROL/ROR—Rotate<br />

オペコード 命令 説明<br />

D0 /2 RCL r/m8,1 9 ビット (CF、r/m8) を左に 1 回回転させる。<br />

D2 /2 RCL r/m8,CL 9 ビット (CF、r/m8) を左に CL 回回転させる。<br />

C0 /2 ib RCL r/m8,imm8 9 ビット (CF、r/m8) を左に imm8 回回転させる。<br />

D1 /2 RCL r/m16,1 17 ビット (CF、r/m16) を左に 1 回回転させる。<br />

D3 /2 RCL r/m16,CL 17 ビット (CF、r/m16) を左に CL 回回転させる。<br />

C1 /2 ib RCL r/m16,imm8 17 ビット (CF、r/m16) を左に imm8 回回転させる。<br />

D1 /2 RCL r/m32,1 33 ビット (CF、r/m32) を左に 1 回回転させる。<br />

D3 /2 RCL r/m32,CL 33 ビット (CF、r/m32) を左に CL 回回転させる。<br />

C1 /2 ib RCL r/m32,imm8 33 ビット (CF、r/m32) を左に imm8 回回転させる。<br />

D0 /3 RCR r/m8,1 9 ビット (CF、r/m8) を右に 1 回回転させる。<br />

D2 /3 RCR r/m8,CL 9 ビット (CF、r/m8) を右に CL 回回転させる。<br />

C0 /3 ib RCR r/m8,imm8 9 ビット (CF、r/m8) を右に imm8 回回転させる。<br />

D1 /3 RCR r/m16,1 17 ビット (CF、r/m16) を右に 1 回回転させる。<br />

D3 /3 RCR r/m16,CL 17 ビット (CF、r/m16) を右に CL 回回転させる。<br />

C1 /3 ib RCR r/m16,imm8 17 ビット (CF、r/m16) を右に imm8 回回転させる。<br />

D1 /3 RCR r/m32,1 33 ビット (CF、r/m32) を右に 1 回回転させる。<br />

D3 /3 RCR r/m32,CL 33 ビット (CF、r/m32) を右に CL 回回転させる。<br />

C1 /3 ib RCR r/m32,imm8 33 ビット (CF、r/m32) を右に imm8 回回転させる。<br />

D0 /0 ROL r/m8,1 8 ビット r/m8 を左に 1 回回転させる。<br />

D2 /0 ROL r/m8,CL 8 ビット r/m8 を左に CL 回回転させる。<br />

C0 /0 ib ROL r/m8,imm8 8 ビット r/m8 を左に imm8 回回転させる。<br />

D1 /0 ROL r/m16,1 16 ビット r/m16 を左に 1 回回転させる。<br />

D3 /0 ROL r/m16,CL 16 ビット r/m16 を左に CL 回回転させる。<br />

C1 /0 ib ROL r/m16,imm8 16 ビット r/m16 を左に imm8 回回転させる。<br />

D1 /0 ROL r/m32,1 32 ビット r/m32 を左に 1 回回転させる。<br />

D3 /0 ROL r/m32,CL 32 ビット r/m32 を左に CL 回回転させる。<br />

C1 /0 ib ROL r/m32,imm8 32 ビット r/m32 を左に imm8 回回転させる。<br />

D0 /1 ROR r/m8,1 8 ビット r/m8 を右に 1 回回転させる。<br />

D2 /1 ROR r/m8,CL 8 ビット r/m8 を右に CL 回回転させる。<br />

C0 /1 ib ROR r/m8,imm8 8 ビット r/m8 を右に imm8 回回転させる。<br />

D1 /1 ROR r/m16,1 16 ビット r/m16 を右に 1 回回転させる。<br />

D3 /1 ROR r/m16,CL 16 ビット r/m16 を右に CL 回回転させる。<br />

C1 /1 ib ROR r/m16,imm8 16 ビット r/m16 を右に imm8 回回転させる。<br />

D1 /1 ROR r/m32,1 32 ビット r/m32 を右に 1 回回転させる。<br />

D3 /1 ROR r/m32,CL 32 ビット r/m32 を右に CL 回回転させる。<br />

C1 /1 ib ROR r/m32,imm8 32 ビット r/m32 を右に imm8 回回転させる。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:703


RCL/RCR/ROL/ROR-—Rotate ( 続き )<br />

説明<br />

第 1 オペラン ド ( デステ ィ ネーシ ョ ン ・ オペラン ド ) のビッ ト を第 2 オペラン ド ( カウン<br />

ト・オペランド) に指定されたビ ッ ト 位置の数だけシ フ ト し ( 回転さ せ )、 結果をデス<br />

ティネーション ・ オペランドにストアする。 デスティネーション ・ オペランドには、 レ<br />

ジスタまたはメモリ ・ ロケーションを使用できる。 カウン ト ・ オペランドは、 即値また<br />

は CL レ ジス タの値が可能で、 符号なし整数である。 プロセ ッ サは、 最下位 5 ビッ トを<br />

除くカウント ・オペランドのすべてのビットをマスクして、 カウントを0 から 31 までの<br />

数に制限する。<br />

左に回転 (ROL) 命令お よ びキ ャ リ ー を通じ て左に回転 (RCL) 命令は、 すべての ビ ッ ト を<br />

最上位ビ ッ ト 位置の方向にシ フ ト す る が、 最上位ビ ッ ト だけ は最下位ビ ッ ト ・ ロ ケ ー<br />

シ ョ ン に回転 さ れる。 右に回転 (ROR) 命令お よ びキ ャ リ ー を通じ て右に回転 (RCR) 命令<br />

は、 すべての ビ ッ ト を最下位ビ ッ ト 位置の方向にシ フ ト するが、 最下位ビ ッ ト だけ は最<br />

上位ビ ッ ト ・ ロ ケ ー シ ョ ン に回転される。<br />

RCL 命令お よ び RCR 命令は、 回転の中に CF フラグを含める。 RCL 命令は、 CF フラグ<br />

を最下位ビッ トにシフトさせ、 最上位ビットをCF フラグにシフト させる。 RCR 命令は、<br />

CF フ ラ グを最上位ビ ッ ト にシ フ ト さ せ、 最下位ビ ッ ト を CF フラグにシフト させる。<br />

ROL 命令お よ び ROR 命令では、 CF フ ラ グの元の値は結果には含められないが、 CF フ<br />

ラグには 1 端から も う 1 端にシフ ト されたビ ッ ト のコ ピーが入る。<br />

OF フラグは、 1 ビ ッ ト の回転だけ に定義され、 その他のすべての場合は未定義である。<br />

左回転では、 OF フラグは、 ( 回転後の ) CF ビ ッ ト と 結果の最上位ビ ッ ト と の排他的論理<br />

和に設定される。 右回転では、 OF フラグは、 結果の最上位2ビッ ト の排他的論理和に設<br />

定される。<br />

操作<br />

SIZE ← OperandSize<br />

CASE (determine count) OF<br />

SIZE = 8: tempCOUNT ← (COUNT AND 1FH) MOD 9;<br />

SIZE = 16: tempCOUNT ← (COUNT AND 1FH) MOD 17;<br />

SIZE = 32: tempCOUNT ← COUNT AND 1FH;<br />

ESAC;<br />

(* ROL instruction operation *)<br />

WHILE (tempCOUNT ≠ 0)<br />

DO<br />

tempCF ← MSB(DEST);<br />

DEST ← (DEST ∗ 2) + tempCF;<br />

tempCOUNT ← tempCOUNT - 1;<br />

OD;<br />

ELIHW;<br />

CF ← tempCF;<br />

IF COUNT = 1<br />

THEN OF ← MSB(DEST) XOR CF;<br />

ELSE OF is undefined;<br />

FI;<br />

(* ROR instruction operation *)<br />

WHILE (tempCOUNT ≠ 0)<br />

DO<br />

tempCF ← LSB(SRC);<br />

DEST ← (DEST / 2) + (tempCF ∗ 2 SIZE );<br />

tempCOUNT ← tempCOUNT - 1;<br />

OD;<br />

3:704 第 3 巻 : IA-32 基本命令リファレンス


RCL/RCR/ROL/ROR-—Rotate ( 続き )<br />

IF COUNT = 1<br />

THEN OF ← MSB(DEST) XOR MSB − 1(DEST);<br />

ELSE OF is undefined;<br />

FI;<br />

(* RCL instruction operation *)<br />

WHILE (tempCOUNT ≠ 0)<br />

DO<br />

tempCF ← MSB(DEST);<br />

DEST ← (DEST ∗ 2) + tempCF;<br />

tempCOUNT ← tempCOUNT - 1;<br />

OD;<br />

ELIHW;<br />

CF ← tempCF;<br />

IF COUNT = 1<br />

THEN OF ← MSB(DEST) XOR CF;<br />

ELSE OF is undefined;<br />

FI;<br />

(* RCR instruction operation *)<br />

WHILE (tempCOUNT ≠ 0)<br />

DO<br />

tempCF ← LSB(SRC);<br />

DEST ← (DEST / 2) + (tempCF * 2SIZE );<br />

tempCOUNT ← tempCOUNT - 1;<br />

OD;<br />

IF COUNT = 1<br />

IF COUNT = 1<br />

THEN OF ← MSB(DEST) XOR MSB − 1(DEST);<br />

ELSE OF is undefined;<br />

FI;<br />

影響を受けるフラグ<br />

CF フラグは、 そこにシフト されたビットの値を持つ。 OF フラグは、 単一ビット回転( 上<br />

記の 「説明」 の項を参照 ) の場合だけ に影響を受け、 複数ビ ッ ト 回転の場合に は未定義で<br />

ある。 SF、 ZF、 AF、 PF フラグは影響を受けない。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・ NaT レ ジ ス タ参照アボ ー ト 。<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・ VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

メモリ ・ フォル ト<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:705


RCL/RCR/ROL/ROR-—Rotate ( 続き )<br />

保護モード例外<br />

#GP(0) ソ ース ・ オペラ ン ド が書き込み不可能なセグメ ン ト にある<br />

場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

インテル・アーキテクチャにおける互換性<br />

8086 は、 回転カ ウン ト をマスク しない。 Intel386 プロセッサからのすべてのインテル ・<br />

アーキテクチャ ・ プロセッサは、 すべての動作モー ドで回転カウン ト をマスクする。<br />

3:706 第 3 巻 : IA-32 基本命令リファレンス


RDMSR—Read from Model Specific Register<br />

オペコード 命令 説明<br />

0F 32 RDMSR ECX によって指定される MSR を EDX:EAX にロードする。<br />

説明<br />

ECX レジスタに指定された64 ビ ッ ト のモデル固有レジスタ (MSR) の内容を レ ジス タ<br />

EDX:EAX にロードする。 EDX レジスタには MSR の上位 32 ビッ トがロードされ、 EAX<br />

レジスタには下位32 ビットがロードされる。 読み取られるMSR に 64 より少ないビッ<br />

ト しか定義されていない場合は、 定義されていないビッ ト ・ ロケーシ ョンで EDX:EAX<br />

に返される値は未定義である。<br />

こ の命令は、 特権レ ベル 0 または実アドレス ・ モー ドで実行しなければならない。 そう<br />

しない と 、 一般保護例外 #GP(0) が生成される。 予約されているかまたは定義されていな<br />

い MSR アドレスをECX に指定して も 、 一般保護例外が生成される。<br />

MSR は、 テ ス ト 機能、 実行 ト レ ー ス、 性能モニ タ リ ン グ、 マシ ン ・ チ ェ ッ ク ・ エ ラ ー の<br />

機能を制御す る。<br />

この命令を使用する前に、 MSR がサポー ト されている (EDX[5]=1) かど うかを判断する<br />

ため、 CPUID 命令を使用する必要がある。<br />

この命令で書き込みができるすべてのMSR と、 各MSR のア ド レスについては、 モデル<br />

固有命令を参照の こ と 。<br />

操作<br />

IF Itanium System Environment THEN IA-32_Intercept(INST,RDMSR);<br />

EDX:EAX ← MSR[ECX];<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

IA-32_Intercept 強制命令イ ン タ ー セプ ト 。<br />

保護モード例外<br />

#GP(0) 現行特権レベルが 0 でない場合。<br />

ECX の値が予約されているかまたは定義されていない<br />

MSR アドレスを指定している場合。<br />

実アドレス・モード例外<br />

#GP 現行特権レベルが 0 でない場合。<br />

CX の値が予約されている または定義されていない MSR<br />

アドレスを指定している場合。<br />

仮想 8086 モード例外<br />

#GP(0) RDMSR 命令は仮想 8086 モー ドでは認識されない。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:707


RDMSR—Read from Model Specific Register ( 続き )<br />

インテル・アーキテクチャにおける互換性<br />

MSR および RDMSR 命令でそれ ら を読み取る機能は、 Pentium プロセッサでインテル ・<br />

アーキテクチャに導入された。 Pentium プロセッサよ り以前のインテル ・ アーキテク<br />

チ ャ ・ プ ロ セ ッ サで こ の命令を実行する と 、 無効オペ コ ー ド 例外 #UD が生成される。<br />

3:708 第 3 巻 : IA-32 基本命令リファレンス


RDPMC—Read Performance-Monitoring Counters<br />

オペコード 命令 説明<br />

0F 33 RDPMC ECX によって指定される性能モニタリング・カウンタを EDX:EAX<br />

に読み込む。<br />

説明<br />

ECX レジスタに指定されたNビ ッ ト の性能モニ タ リ ン グ ・ カ ウ ン タ の内容を レ ジ ス タ<br />

EDX:EAX にロードする。 EDX レジスタには、 カウンタの上位N-32 ビッ トがロードさ<br />

れ、 EAX レジスタには、 下位32 ビットがロードされる。<br />

RDPMC 命令を使用する と 、 特権レベル 1、 2、 または 3 で実行されているアプ リ ケ ー<br />

ション・コードは、 IA-32 システム環境での動作では CR4 レジスタのPCE フラグがセッ<br />

ト されている場合、 ま た Itanium ベース ・ システム環境では性能カウンタがユーザ ・ レ<br />

ベルの カ ウ ン タ と して設定されてい る場合、 性能モニ タ リ ン グ ・ カ ウ ン タ を読み取れる。<br />

この命令は、 オペレーティング ・ システム ・ プロシージャの呼び出しのオーバヘッドを 被る こ と な く 、 アプ リ ケ ー シ ョ ン ・ コ ー ド が性能モニ タ リ ン グを行え る よ う に提供 さ れ<br />

ている。<br />

性能モニ タ リ ン グ ・ カ ウ ン タ は、 デ コ ー ド さ れた命令数、 受け取 っ た割 り 込み数、<br />

キャッシュ ・ ロードの回数などのイベントをカウントするようにプログラムできるイベ<br />

ント ・カウンタである。<br />

RDPMC 命令は、 命令実行をシ リ アル化しない。 すなわち、 先行する命令に よ っ て発生<br />

したすべての イベン ト が完了してい る こ と 、 ま たは後続の命令に よ っ て発生す る イベン<br />

ト が開始していない こ と を保証していない。 正確な イ ベン ト ・ カ ウ ン ト が必要な場合は、<br />

ソフ ト ウェアは、 RDPMC 命令の実行の前、 後、 ま たは その両方で (CPUID 命令な ど の )<br />

シリアル化命令を使用しなければならない。<br />

RDPMC 命令は、 16 ビッ ト ・アドレス指定・モードまたは仮想8086 モ ー ド で実行で き る<br />

が、 ECX レジスタの内容すべてを使用してアクセスするカウンタを決定し、 N ビッ トす<br />

べての結果が返される (EAX レジスタに下位32 ビッ ト、 EDX レジスタに上位N-32 ビッ<br />

ト )。<br />

操作<br />

IF (ECX != Implemented Counters) THEN #GP(0)<br />

IF (Itanium System Environment)<br />

THEN<br />

SECURED = PSR.sp || CR4.pce==0;<br />

IF ((PSR.cpl ==0) || (PSR.cpl!=0 && ~PMC[ECX].pm && ~SECURED)))<br />

THEN<br />

EDX:EAX ← PMD[ECX+4];<br />

ELSE<br />

#GP(0)<br />

FI;<br />

ELSE<br />

IF ((CR4.PCE = 1 OR ((CR4.PCE = 0 ) AND (CPL=0)))<br />

THEN<br />

EDX:EAX ← PMD[ECX+4];<br />

ELSE (* CR4.PCE is 0 and CPL is 1, 2, or 3 *)<br />

#GP(0)<br />

FI;<br />

FI;<br />

第 3 巻 : IA-32 基本命令リファレンス 3:709


RDPMC—Read Performance-Monitoring Counters ( 続き )<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

#GP(0) 現行特権レベルが 0 でな く 、 選択 さ れた PMD レジスタの<br />

PM ビッ トが1 である場合。 または、 PSR.sp が 1 である場<br />

合。<br />

保護モード例外<br />

#GP(0) 現行特権レベルが 0 でな く 、 CR4 レジスタのPCE フラグ<br />

がク リアされている場合。<br />

/*In the IA-32 System Environment*/<br />

ECX レジスタの値が、 実装されている性能カウンタと一<br />

致しない場合。<br />

実アドレス・モード例外<br />

#GP CR4 レジスタのPCE フ ラ グが ク リ ア さ れてい る場合。<br />

/*In the IA-32 System Environment*/<br />

仮想 8086 モード例外<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

ECX レジスタの値が、 実装されている性能カウンタと一<br />

致しない場合。<br />

#GP(0) CR4 レジスタのPCE フ ラ グが ク リ ア さ れてい る場合。<br />

/*In the IA-32 System Environment*/<br />

ECX レジスタの値が、 実装されている性能カウンタと一<br />

致しない場合。<br />

3:710 第 3 巻 : IA-32 基本命令リファレンス


RDTSC—Read Time-Stamp Counter<br />

オペコード 命令 説明<br />

0F 31 RDTSC タイムスタンプ・カウンタを EDX:EAX に読み込む。<br />

説明<br />

プロセッサのタイムスタンプ ・ カウンタの現在の値を EDX:EAX レジスタにロードする。<br />

タイムスタンプ・ カウンタは、 64 ビッ トのMSR に包含されている。 MSR の上位 32<br />

ビッ トがEDX レジスタにロード され、 下位32 ビットがEAX レジスタにロード される。<br />

プロセッサは、 クロッ ク ・ サイクルごとにタイムスタンプ ・ カウンタ MSR をインク リ<br />

メン ト し、 プロセッサがリセッ ト されるとカウンタを 0 にリセットする。<br />

IA-32 シ ス テ ム環境では、 CR4 レジスタのタイムスタンプ ・ディスエーブル (TSD) フラ<br />

グは、 RDTSC 命令の使用を制限す る。 TSD フラグがクリアされていると、 RDTSC 命令<br />

はどの特権レベルでも実行できる。 このフラグがセッ ト されている と、 命令は特権レベ<br />

ル 0 だけで実行できる。 RDMSR 命令を使用してタ イ ム ス タ ンプ ・ カ ウ ン タ も 読み取れ<br />

る。<br />

Itanium ベース ・ システム環境では、 RDTSC 命令の使用は、 PSR.si と CR4.TSD によって<br />

制限 さ れる。 PSR.si がク リアされ、 CR4.TSD がク リアされている場合は、 RDTSC 命令<br />

はどの特権レベルでも実行できる。 PSR.si がセッ ト されているか、 または CR4.TSD が<br />

セッ ト されている場合は、 RDTSC 命令は特権レベル 0 以外では実行で き ない。<br />

RDTSC 命令は、 シ リ アル化命令ではない。 そのため、 カ ウ ン タ を読み取る前に、 前のす<br />

べての命令が実行される ま で待つこ と をしない。 同様に、 読み取り操作が行われる前に、<br />

後続の命令が実行を開始している場合 も ある。<br />

この命令は、 Pentium プロセッサでインテル ・ アーキテクチャに導入された。<br />

操作<br />

IF (IA-32 System Environement)<br />

IF (CR4.TSD = 0) OR ((CR4.TSD = 1) AND (CPL=0))<br />

THEN<br />

EDX:EAX ← TimeStampCounter;<br />

ELSE (* CR4 is 1 and CPL is 1, 2, or 3 *)<br />

#GP(0)<br />

FI;<br />

ELSE /*Itanium System Environment*/<br />

SECURED = PSR.si || CR4.TSD;<br />

IF (!SECURED) OR (SECURED AND (CPL=0))<br />

THEN<br />

EDX:EAX ← TimeStampCounter;<br />

ELSE (* CR4 is 1 and CPL is 1, 2, or 3 *)<br />

#GP(0)<br />

FI;<br />

FI;<br />

影響を受けるフラグ<br />

なし。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:711


RDTSC—Read Time-Stamp Counter ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

#GP(0) PSR.si が 1 または CR4.TSD が 1 で、 CPL が 0 より大きい<br />

場合。<br />

保護モード例外<br />

#GP(0) CR4 レジスタのTSD フラグがセット されていて、 CPL が<br />

0 よ り 大き い場合。<br />

/*For the IA-32 System Environment only*/<br />

実アドレス・モード例外<br />

#GP CR4 レジスタのTSD フ ラ グがセ ッ ト さ れた場合。<br />

/*For the IA-32 System Environment only*/<br />

仮想 8086 モード例外<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

#GP(0) CR4 レジスタのTSD フ ラ グがセ ッ ト さ れた場合。<br />

/*For the IA-32 System Environment only*/<br />

3:712 第 3 巻 : IA-32 基本命令リファレンス


REP/REPE/REPZ/REPNE/REPNZ—Repeat String Operation Prefix<br />

オペコード 命令 説明<br />

F3 6C REP INS r/m8, DX ECX のバイトをポート DX から ES:[EDI] に入力する。<br />

F3 6D REP INS r/m16,DX ECX のワードをポート DX から ES:[EDI] に入力する。<br />

F3 6D REP INS r/m32,DX ECX のダブルワードをポート DX から ES:[EDI] に入力する。<br />

F3 A4 REP MOVS m8,m8 ECX のバイトを DS:[ESI] から ES:[EDI] に転送する。<br />

F3 A5 REP MOVS m16,m16 ECX のワードを DS:[ESI] から ES:[EDI] に転送する。<br />

F3 A5 REP MOVS m32,m32 ECX のダブルワードを DS:[ESI] から ES:[EDI] に転送する。<br />

F3 6E REP OUTS DX,r/m8 ECX のバイトを DS:[ESI] からポート DX に出力する。<br />

F3 6F REP OUTS DX,r/m16 ECX のワードを DS:[ESI] からポート DX に出力する。<br />

F3 6F REP OUTS DX,r/m32 ECX のダブルワードを DS:[ESI] からポート DX に出力する。<br />

F3 AC REP LODS AL ECX のバイトを DS:[ESI] から AL にロードする。<br />

F3 AD REP LODS AX ECX のワードを DS:[ESI] から AX にロードする。<br />

F3 AD REP LODS EAX ECX のダブルワードを DS:[ESI] から EAX にロードする。<br />

F3 AA REP STOS m8 ES:[EDI] にある ECX のバイトを AL で埋める。<br />

F3 AB REP STOS m16 ES:[EDI] にある ECX のワードを AX で埋める。<br />

F3 AB REP STOS m32 ES:[EDI] にある ECX のダブルワードを EAX で埋める。<br />

F3 A6 REPE CMPS m8,m8 ES:[EDI] と DS:[ESI] にある一致していないバイトを探す。<br />

F3 A7 REPE CMPS m16,m16 ES:[EDI] と DS:[ESI] にある一致していないワードを探す。<br />

F3 A7 REPE CMPS m32,m32 ES:[EDI] と DS:[ESI] にある一致していないダブルワードを探す。<br />

F3 AE REPE SCAS m8 ES:[EDI] で始まる AL でないバイトを探す。<br />

F3 AF REPE SCAS m16 ES:[EDI] で始まる AX でないワードを探す。<br />

F3 AF REPE SCAS m32 ES:[EDI] で始まる EAX でないダブルワードを探す。<br />

F2 A6 REPNE CMPS m8,m8 ES:[EDI] と DS:[ESI] にある一致しているバイトを探す。<br />

F2 A7 REPNE CMPS m16,m16 ES:[EDI] と DS:[ESI] にある一致しているワードを探す。<br />

F2 A7 REPNE CMPS m32,m32 ES:[EDI] と DS:[ESI] にある一致しているダブルワードを探す。<br />

F2 AE REPNE SCAS m8 ES:[EDI] で始まる AL を探す。<br />

F2 AF REPNE SCAS m16 ES:[EDI] で始まる AX を探す。<br />

F2 AF REPNE SCAS m32 ES:[EDI] で始まる EAX を探す。<br />

説明<br />

カウンタ ・ レジスタ (ECX) に指定された回数か、 ま たは ZF フラグの指定された条件が満<br />

たされな く なる ま で、 ス ト リ ング命令を繰り返す。 REP ( リピート )、 REPE ( 等しい間は<br />

リピート )、 REPNE ( 等し く ない間は リ ピ ー ト )、 REPZ ( ゼロの間はリピー ト )、 REPNZ<br />

( ゼロでない間は リ ピー ト ) の各ニーモニ ッ ク は、 ス ト リ ング命令の 1 つに付加できるプ<br />

リフィックスである。 REP プリフィックスは、 INS、 OUTS、 MOVS、 LODS、 STOS 命令<br />

に付加する こ と ができ、 REPE、 REPNE、 REPZ、 REPNZ プリフィックスは、 CMPS およ<br />

び SCAS 命令に付加で き る。 (REPZ プリフィックスと REPNZ プリフィックスは、 それぞ<br />

れ REPE プリフィックスと REPNE プリフィックスのシノニム形式である。 ) 非ス ト リ ン<br />

グ命令と と も に使用する と、 REP プ リ フ ィ ッ ク スの行動は未定義である。<br />

REP プリフィックスは、 一度には1 つのス ト リ ン グ命令だけ に適用 さ れる。 命令ブ ロ ッ<br />

クを繰り返すには、 LOOP 命令 ま たは その他のルー プ構造体を使用する。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:713


REP/REPE/REPZ/REPNE /REPNZ—Repeat String Operation Prefix ( 続き )<br />

これらすべてのリ ピー ト ・ プリ フ ィ ッ クスは、 ECX レジスタのカウントが0 にデク リ メ<br />

ン ト される ま で、 関連す る命令を繰 り 返 さ せる ( 下記の表を参照 )。 REPE、 REPNE、<br />

REPZ、 REPNZ プリフィックスも、 各リピート後にZF フラグの状態をチェックし、 ZF フ<br />

ラ グが指定された状態になければ リ ピ ー ト ・ ル ー プを終了す る。 両方の終了条件がテ ス<br />

トされるときは、 リピート終了の原因は、 JECXZ 命令での ECX レジスタのテスト、 また<br />

は JZ、 JNZ、 JNE 命令での ZF フラグのテストによって判断することができる。<br />

表 1-17. リピート条件<br />

リピート・プリフィックス 終了条件 1 終了条件 2<br />

REP ECX=0 なし<br />

REPE/REPZ ECX=0 ZF=0<br />

REPNE/REPNZ ECX=0 ZF=1<br />

REPE/REPZ および REPNE/REPNZ プリフィックスを使用すると、 CMPS 命令 と SCAS 命<br />

令の両方が、 それ ら が行 う 比較の結果に従 っ て ZF フ ラ グに影響を与え る ので、 ZF フラ<br />

グを初期化する必要はない。<br />

リ ピ ー ト ・ ス ト リ ン グ操作は、 例外 ま たは割 り 込みに よ っ て中断 さ れる こ と があ る。 こ<br />

う な って も、 レ ジス タの状態は、 例外ハン ド ラ ま たは割り込みハン ド ラか ら の リ タ ー ン<br />

時にス ト リ ング操作を再開でき る よ う に保たれる。 ソ ース ・ レジスタおよびデステ ィ<br />

ネーション ・ レジスタは操作する次のストリング要素を指し、 EIP レジスタはスト リン<br />

グ命令を指し、 ECX レ ジスタ は命令の最後の正常な リ ピ ー ト の後に保持していた値を も<br />

つ。 こ れに よ っ て、 シ ス テ ムの割 り 込み応答時間に影響を与えずに、 長いス ト リ ン グ操<br />

作を進められる。<br />

REPNE プリフィックスの付いたCMPS 命令 ま たは SCAS 命令の実行中にペー ジ ・ フ ォ ル<br />

ト が発生した場合、 EFLAGS の値は命令の実行前の状態に リ ス ト アされないこ と がある。<br />

SCAS および CMPS は EFLAGS を入力として使用しないので、 プロセッサはページ ・<br />

フォルト ・ハンドラの後に命令を再開することができる。<br />

REP INS 命令お よ び REP OUTS 命令は、 注意して使用しなければな ら ない。 こ れ ら の命<br />

令が実行する レ ー ト を処理できない I/O ポー ト もある。<br />

REP STOS 命令は、 大き い メ モ リ ・ ブ ロ ッ ク を初期化す る最 も 速い方法であ る。<br />

操作<br />

IF AddressSize = 16<br />

THEN<br />

use CX for CountReg;<br />

ELSE (* AddressSize = 32 *)<br />

use ECX for CountReg;<br />

FI;<br />

WHILE CountReg ≠ 0<br />

DO<br />

service pending interrupts (if any);<br />

execute associated string instruction;<br />

CountReg ← CountReg - 1;<br />

IF CountReg = 0<br />

THEN exit WHILE loop<br />

FI;<br />

IF (repeat prefix is REPZ or REPE) AND (ZF=0)<br />

OR (repeat prefix is REPNZ or REPNE) AND (ZF=1)<br />

3:714 第 3 巻 : IA-32 基本命令リファレンス


REP/REPE/REPZ/REPNE /REPNZ—Repeat String Operation Prefix ( 続き )<br />

OD;<br />

FI;<br />

THEN exit WHILE loop<br />

影響を受けるフラグ<br />

なし。 ただし、 CMPS 命令お よ び SCAS 命令は、 EFLAGS レジスタのステータス ・ フラ<br />

グを設定する。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

例外 ( すべての操作モード )<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

なし。 ただし、 リ ピ ー ト ・ プ リ フ ィ ッ ク スが関係してい る命令に よ っ て例外が生成 さ れ<br />

る場合がある。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:715


RET—Return from Procedure<br />

オペコード 命令 説明<br />

C3 RET コール元プロシージャに near リターンする。<br />

CB RET コール元プロシージャに far リターンする。<br />

C2 iw RET imm16 コール元プロシージャに near リターンし、imm16 バイトをスタッ<br />

クからポップする。<br />

CA iw RET imm16 コール元プロシージャに far リターンし、imm16 バイトをスタック<br />

からポップする。<br />

説明<br />

プログラム制御をスタックのト ップにあるリターン ・ アド レスに移す。 通常、 アド レス<br />

は CALL 命令に よ っ てス タ ッ ク に置かれ、 リ タ ー ンは CALL 命令の後に続 く 命令に対し<br />

て行われる。<br />

オプションのソース・オペランドは、 リターン・アドレスがポップされた後にリリース<br />

されるスタ ッ ク ・ バイ ト数を指定し、 デフ ォル ト ではなしである。 このオペラン ド は、<br />

コール先プロシージャに渡されてもう必要ないパラメータをスタックから リ リースする<br />

ために使用でき る。<br />

RET 命令を使用して、 以下の異な る 3 つのタ イプの リ タ ーンを実行する こ と ができ る。<br />

• near リターン— 現在の コ ー ド ・ セグ メ ン ト ( 現在の CS レジスタの指示先のセグメ<br />

ント ) 内にある コ ール元プロシー ジ ャへの リ タ ーン。 セグメン ト 内 リ タ ーン と もい<br />

う。<br />

• far リターン— 現在の コ ー ド ・ セグ メ ン ト と は異なるセグ メ ン ト 内にある コ ール元<br />

プロシージャへのリ ターン。 セグメント間リ ターンと もいう。<br />

• 特権レ ベル間 far リターン— 現在実行中のプログラムまたはプロシージャの特権レ<br />

ベル と は異なる特権レベルへの far リターン。<br />

特権レベル間 リ タ ー ン ・ タ イ プは、 保護モー ド でしか実行で き ない。<br />

near リターンを実行すると、 プロセッサは、 リターン命令ポインタ( オフセッ ト ) をプ<br />

ロシージャ ・ スタッ クのト ップから EIP レジスタにポ ッ プし、 新しい命令ポインタでの<br />

プログラム実行を開始する。 CS レジスタは変更されない。<br />

far リターンを実行すると、 プロセッサは、 リターン命令ポインタをスタックのトップか<br />

ら EIP レジスタにポップし、 次にセグメント ・セレクタをプロシージャ ・ スタックの<br />

トップからCS レジスタにポ ッ プする。 プロセ ッサは、 その後、 新しい命令ポインタに<br />

ある新しいコ ー ド ・ セグメン ト でのプログラム実行を開始する。<br />

特権レベル間 far リターンのメカニズムは、 セグメント間リターンと同様であるが、 プ<br />

ロ セ ッ サが戻 さ れる コ ー ド ・ セグ メ ン ト と ス タ ッ ク ・ セグ メ ン ト の特権レ ベル と ア ク セ<br />

ス権を調べて、 制御の転送を行う こ とができ るかど うかを判断する点が異なる。 DS、<br />

ES、 FS、 GS セグメン ト ・ レジスタは、 新しい特権レベルではアクセスするこ とができ<br />

ないセグ メ ン ト を それ ら が参照している場合は、 特権レベル間 リ タ ー ン中に RET 命令に<br />

よ っ て ク リ ア さ れる。 特権レベル間 リ タ ー ンでは ス タ ッ ク ・ ス イ ッ チ も 行われる ので、<br />

ESP レジスタおよびSS レジスタがスタックからロード される。<br />

3:716 第 3 巻 : IA-32 基本命令リファレンス


RET—Return from Procedure ( 続き )<br />

操作<br />

(* Near return *)<br />

IF instruction = near return<br />

THEN;<br />

IF OperandSize = 32<br />

THEN<br />

IF top 12 bytes of stack not within stack limits THEN #SS(0); FI;<br />

EIP ← Pop();<br />

ELSE (* OperandSize = 16 *)<br />

IF top 6 bytes of stack not within stack limits<br />

THEN #SS(0)<br />

FI;<br />

tempEIP ← Pop();<br />

tempEIP ← tempEIP AND 0000FFFFH;<br />

IF tempEIP not within code segment limits THEN #GP(0); FI;<br />

EIP ← tempEIP;<br />

FI;<br />

IF instruction has immediate operand<br />

THEN IF StackAddressSize=32<br />

THEN<br />

ESP ← ESP + SRC;<br />

ELSE (* StackAddressSize=16 *)<br />

SP ← SP + SRC;<br />

FI;<br />

FI;<br />

IF Itanium System Environment AND PSR.tb THEN IA-32_Exception(Debug);<br />

FI;<br />

(* Real-address mode or virtual-8086 mode *)<br />

IF ((PE = 0) OR (PE = 1 AND VM = 1)) AND instruction = far return<br />

THEN;<br />

IF OperandSize = 32<br />

THEN<br />

IF top 12 bytes of stack not within stack limits THEN #SS(0); FI;<br />

EIP ← Pop();<br />

CS ← Pop(); (* 32-bit pop, high-order 16-bits discarded *)<br />

ELSE (* OperandSize = 16 *)<br />

IF top 6 bytes of stack not within stack limits THEN #SS(0); FI;<br />

tempEIP ← Pop();<br />

tempEIP ← tempEIP AND 0000FFFFH;<br />

IF tempEIP not within code segment limits THEN #GP(0); FI;<br />

EIP ← tempEIP;<br />

CS ← Pop(); (* 16-bit pop *)<br />

FI;<br />

IF instruction has immediate operand THEN SP ← SP + (SRC AND FFFFH); FI;<br />

IF Itanium System Environment AND PSR.tb THEN IA-32_Exception(Debug);<br />

FI;<br />

(* Protected mode, not virtual 8086 mode *)<br />

IF (PE = 1 AND VM = 0) AND instruction = far RET<br />

THEN<br />

IF OperandSize = 32<br />

第 3 巻 : IA-32 基本命令リファレンス 3:717


RET—Return from Procedure ( 続き )<br />

THEN<br />

IF second doubleword on stack is not within stack limits THEN #SS(0); FI;<br />

ELSE (* OperandSize = 16 *)<br />

IF second word on stack is not within stack limits THEN #SS(0); FI;<br />

FI;<br />

IF return code segment selector is null THEN GP(0); FI;<br />

IF return code segment selector addrsses descriptor beyond diescriptor table limit<br />

THEN GP(selector; FI;<br />

Obtain descriptor to which return code segment selector points from descriptor table<br />

IF return code segment descriptor is not a code segment THEN #GP(selector); FI;<br />

if return code segment selector RPL < CPL THEN #GP(selector); FI;<br />

IF return code segment descriptor is condorming<br />

AND return code segment DPL > return code segment selector RPL<br />

THEN #GP(selector); FI;<br />

IF return code segment descriptor is not present THEN #NP(selector); FI:<br />

IF return code segment selector RPL > CPL<br />

THEN GOTO RETURN-OUTER-PRIVILEGE-LEVEL;<br />

ELSE GOTO RETURN-TO-SAME-PRIVILEGE-LEVEL<br />

FI;<br />

END;FI;<br />

RETURN-SAME-PRIVILEGE-LEVEL:<br />

IF the return instruction pointer is not within ther return code segment limit<br />

THEN #GP(0);<br />

FI;<br />

IF OperandSize=32<br />

THEN<br />

EIP ← Pop();<br />

CS ← Pop(); (* 32-bit pop, high-order 16-bits discarded *)<br />

ESP ← ESP + SRC;<br />

ELSE (* OperandSize=16 *)<br />

EIP ← Pop();<br />

EIP ← EIP AND 0000FFFFH;<br />

CS ← Pop(); (* 16-bit pop *)<br />

ESP ← ESP + SRC;<br />

FI;<br />

IF Itanium System Environment AND PSR.tb THEN IA-32_Exception(Debug);<br />

RETURN-OUTER-PRIVILEGE-LEVEL:<br />

IF top (16 + SRC) bytes of stack are not within stack limits (OperandSize=32)<br />

OR top (8 + SRC) bytes of stack are not within stack limits (OperandSize=16)<br />

THEN #SS(0); FI;<br />

FI;<br />

Read return segment selector;<br />

IF stack segment selector is null THEN #GP(0); FI;<br />

IF return stack segment selector index is not within its descriptor table limits<br />

THEN #GP(selector); FI;<br />

Read segment descriptor pointed to by return segment selector;<br />

IF stack segment selector RPL ≠ RPL of the return code segment selector<br />

OR stack segment is not a writable data segment<br />

OR stack segment descriptor DPL ≠ RPL of the return code segment selector<br />

THEN #GP(selector); FI;<br />

3:718 第 3 巻 : IA-32 基本命令リファレンス


RET—Return from Procedure ( 続き )<br />

IF stack segment not present THEN #SS(StackSegmentSelector); FI;<br />

IF the return instruction pointer is not within the return code segment limit THEN #GP(0); FI:<br />

CPL ← ReturnCodeSegmentSelector(RPL);<br />

IF OperandSize=32<br />

THEN<br />

EIP ← Pop();<br />

CS ← Pop(); (* 32-bit pop, high-order 16-bits discarded *)<br />

(* segment descriptor information also loaded *)<br />

CS(RPL) ← CPL;<br />

ESP ← ESP + SRC;<br />

tempESP ← Pop();<br />

tempSS ← Pop(); (* 32-bit pop, high-order 16-bits discarded *)<br />

(* segment descriptor information also loaded *)<br />

ESP ← tempESP;<br />

SS ← tempSS;<br />

ELSE (* OperandSize=16 *)<br />

EIP ← Pop();<br />

EIP ← EIP AND 0000FFFFH;<br />

CS ← Pop(); (* 16-bit pop; segment descriptor information also loaded *)<br />

CS(RPL) ← CPL;<br />

ESP ← ESP + SRC;<br />

tempESP ← Pop();<br />

tempSS ← Pop(); (* 16-bit pop; segment descriptor information also loaded *)<br />

(* segment descriptor information also loaded *)<br />

ESP ← tempESP;<br />

SS ← tempSS;<br />

FI;<br />

FOR each of segment register (ES, FS, GS, and DS)<br />

DO;<br />

IF segment register points to data or non-conforming code segment<br />

AND CPL > segment descriptor DPL; (* DPL in hidden part of segment register *)<br />

THEN (* segment register invalid *)<br />

SegmentSelector/Descriptor ← 0; (* null segment selector *)<br />

FI;<br />

OD;<br />

For each of ES, FS, GS, and DS<br />

DO<br />

IF segment descriptor indicates the segment is not a data or<br />

readable code segment<br />

OR if the segment is a data or non-conforming code segment and the segment<br />

descriptor’s DPL < CPL or RPL of code segment’s segment selector<br />

THEN<br />

segment selector register ← null selector;<br />

OD;<br />

影響を受けるフラグ<br />

なし。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:719


RET—Return from Procedure ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

IA-32_Exception 発生した分岐のデバ ッ グ例外 (PSR.tb が 1 の場合 )。<br />

保護モード例外<br />

#GP(0) リターン・コードまたはスタック・セグメント ・セレクタ<br />

が NULL の場合。<br />

リターン命令ポインタがリターン・コード ・セグメントの<br />

範囲内にない場合。<br />

#GP( セレクタ ) リターン・コード ・セグメント ・セレクタのRPL が CPL<br />

より小さい場合。<br />

リターン・コードまたはスタック・セグメント ・セレク<br />

タ・インデックスがそのディスクリプタ・テーブルの範囲<br />

内にない場合。<br />

リターン・コード ・セグメント ・ディスクリプタがコー<br />

ド ・ セグ メ ン ト を指定していない場合。<br />

リターン・コード ・セグメントが非コンフォーミングであ<br />

り、 セグメント ・セレクタの DPL がコー ド ・ セグメント のセグメン ト ・ セレ ク タの RPL に等し く ない場合。<br />

リターン・コード ・セグメントがコンフォーミングであ<br />

り、 セグメント ・セレクタの DPL がコー ド ・ セグメント のセグメン ト ・ セレ ク タの RPL よ り 大き い場合。<br />

スタック ・セグメン トが書き込み可能なデータ ・セグメン<br />

ト でない場合。<br />

スタック・セグメント ・セレクタRPL がリターン・ コー<br />

ド・セグメント・セレクタのRPL に等し く ない場合。<br />

スタック・セグメント ・ディスクリプタDPL がリター<br />

ン・コード ・セグメント ・セレクタのRPL に等し く ない<br />

場合。<br />

#SS(0) スタックのト ップ ・バイ トがスタックの範囲内にない場<br />

合。<br />

リ タ ー ン ・ ス タ ッ ク ・ セグ メ ン ト が存在しない場合。<br />

#NP( セレクタ ) リ タ ー ン ・ コ ー ド ・ セグ メ ン ト が存在しない場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモ<br />

リ・アクセスが行われた場合。<br />

3:720 第 3 巻 : IA-32 基本命令リファレンス


RET—Return from Procedure ( 続き )<br />

実アドレス・モード例外<br />

#GP リターン命令ポインタがリターン・コード ・セグメントの<br />

範囲内にない場合。<br />

#SS スタックのト ップ ・バイ トがスタックの範囲内にない場<br />

合。<br />

仮想 8086 モード例外<br />

#GP(0) リターン命令ポインタがリターン・コード ・セグメントの<br />

範囲内にない場合。<br />

#SS(0) スタックのト ップ ・バイ トがスタックの範囲内にない場<br />

合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ ・ ア クセスが行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:721


ROL/ROR—Rotate<br />

「RCL/RCR/ROL/ROR」 を参照のこ と。<br />

3:722 第 3 巻 : IA-32 基本命令リファレンス


RSM—Resume from System Management Mode<br />

オペコード 命令 説明<br />

0F AA RSM 割り込まれたプログラムの動作を再開する。<br />

説明<br />

プログラム制御をシステム管理モー ド (SMM) からプロセッサが SMM 割り込みを受け<br />

取ったと きに割り込まれたアプリケーション ・ プログラムまたはオペレーテ ィング ・ シ<br />

ステム ・ プロシージャに戻す。 プロセッサの状態は、 SMM に入った と きに作成されたダ<br />

ンプか ら リ ス ト ア さ れる。 プ ロ セ ッ サは、 状態 リ ス ト ア中に無効な状態情報を検出す る<br />

と 、 シ ャ ッ ト ダ ウ ン状態に入る。 以下の無効な情報がシ ャ ッ ト ダ ウ ン を発生 さ せ る可能<br />

性がある。<br />

• CR4 の予約ビ ッ ト のいずれかが 1 にセッ ト されている。<br />

• (PG=1 と PE=0) や (NW=1 と CD=0) など CR0 のビ ッ ト の不当な組み合わせ。<br />

• ( インテルPentium プロセッサおよび Intel486 プロセッサのみ ) 状態ダンプ ・ ベー ス ・<br />

フィールドにストアされている値が32K バイ ト ・ アライメン ト ・ アド レスでない。<br />

モデル固有レジスタの内容は、 SMM からの リ ターンによ って影響を受けない。<br />

SMM および RSM 命令の動作の詳細は、 『IA-32 インテル ® アーキテクチャ ・ ソフ ト ウェ<br />

ア・ディベロッパーズ・マニュアル、 下巻』 第9 章を参照のこ と。<br />

操作<br />

IF Itanium System Environment THEN IA-32_Intercept(INST,RSM);<br />

ReturnFromSSM;<br />

ProcessorState ← Restore(SSMDump);<br />

影響を受けるフラグ<br />

すべて。<br />

追加の Itanium ベース・システム環境例外<br />

IA-32_Intercept 強制命令イ ン タ ー セプ ト 。<br />

保護モード例外<br />

#UD プロセッサが SMM にないと きにこの命令を実行しよ う と<br />

した場合。<br />

実アドレス・モード例外<br />

#UD プロセッサが SMM にないと きにこの命令を実行しよ う と<br />

した場合。<br />

仮想 8086 モード例外<br />

#UD プロセッサが SMM にないと きにこの命令を実行しよ う と<br />

した場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:723


SAHF—Store AH into Flags<br />

オペコード 命令 Clocks 説明<br />

9E SAHF 2 9E SF、ZF、AF、PF、CF を AH から EFLAGS レジスタに<br />

ロードする。<br />

説明<br />

EFLAGS レジスタのSF、 ZF、 AF、 PF、 CF フラグに AH レジスタの対応するビッ ト ( そ<br />

れぞれビ ッ ト 7、 6、 4、 2、 0) からの値をロードする。 レジスタ AH のビ ッ ト 1、 3、 5 は<br />

無視 さ れる。 EFLAGS レジスタの対応する予約ビット (1、 3、 5) は、 以下の 「操作」 の<br />

項に示すよ う に残る。<br />

操作<br />

EFLAGS(SF:ZF:0:AF:0:PF:1:CF) ← AH;<br />

影響を受けるフラグ<br />

SF、 ZF、 AF、 PF、 CF フラグに AH レジスタからの値がロード される。 EFLAGS レジス<br />

タのビッ ト 1、 3、 5 は、 それぞれ 1、 0、 および 0 の値がセ ッ ト される。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

例外 ( すべての操作モード )<br />

なし。<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

3:724 第 3 巻 : IA-32 基本命令リファレンス


SAL/SAR/SHL/SHR—Shift<br />

オペコード 命令 説明<br />

D0 /4 SAL r/m8,1 r/m8 に 2 を 1 回掛ける。<br />

D2 /4 SAL r/m8,CL r/m8 に 2 を CL 回掛ける。<br />

C0 /4 ib SAL r/m8,imm8 r/m8 に 2 を imm8 回掛ける。<br />

D1 /4 SAL r/m16,1 r/m16 に 2 を 1 回掛ける。<br />

D3 /4 SAL r/m16,CL r/m16 に 2 を CL 回掛ける。<br />

C1 /4 ib SAL r/m16,imm8 r/m16 に 2 を imm8 回掛ける。<br />

D1 /4 SAL r/m32,1 r/m32 に 2 を 1 回掛ける。<br />

D3 /4 SAL r/m32,CL r/m32 に 2 を CL 回掛ける。<br />

C1 /4 ib SAL r/m32,imm8 r/m32 に 2 を imm8 回掛ける。<br />

D0 /7 SAR r/m8,1 r/m8 を 2 で 1 回符号付き除算する。*<br />

D2 /7 SAR r/m8,CL r/m8 を 2 で CL 回符号付き除算する。*<br />

C0 /7 ib SAR r/m8,imm8 r/m8 を 2 で imm8 回符号付き除算する。*<br />

D1 /7 SAR r/m16,1 r/m16 を 2 で 1 回符号付き除算する。*<br />

D3 /7 SAR r/m16,CL r/m16 を 2 で CL 回符号付き除算する。*<br />

C1 /7 ib SAR r/m16,imm8 r/m16 を 2 で imm8 回符号付き除算する。*<br />

D1 /7 SAR r/m32,1 r/m32 を 2 で 1 回符号付き除算する。*<br />

D3 /7 SAR r/m32,CL r/m32 を 2 で CL 回符号付き除算する。*<br />

C1 /7 ib SAR r/m32,imm8 r/m32 を 2 で imm8 回符号付き除算する。*<br />

D0 /4 SHL r/m8,1 r/m8 に 2 を 1 回掛ける。<br />

D2 /4 SHL r/m8,CL r/m8 に 2 を CL 回掛ける。<br />

C0 /4 ib SHL r/m8,imm8 r/m8 に 2 を imm8 回掛ける。<br />

D1 /4 SHL r/m16,1 r/m16 に 2 を 1 回掛ける。<br />

D3 /4 SHL r/m16,CL r/m16 に 2 を CL 回掛ける。<br />

C1 /4 ib SHL r/m16,imm8 r/m16 に 2 を imm8 回掛ける。<br />

D1 /4 SHL r/m32,1 r/m32 に 2 を 1 回掛ける。<br />

D3 /4 SHL r/m32,CL r/m32 に 2 を CL 回掛ける。<br />

C1 /4 ib SHL r/m32,imm8 r/m32 に 2 を imm8 回掛ける。<br />

D0 /5 SHR r/m8,1 r/m8 を 2 で 1 回符号なし除算する。<br />

D2 /5 SHR r/m8,CL r/m8 を 2 で CL 回符号なし除算する。<br />

C0 /5 ib SHR r/m8,imm8 r/m8 を 2 で imm8 回符号なし除算する。<br />

D1 /5 SHR r/m16,1 r/m16 を 2 で 1 回符号なし除算する。<br />

D3 /5 SHR r/m16,CL r/m16 を 2 で CL 回符号なし除算する。<br />

C1 /5 ib SHR r/m16,imm8 r/m16 を 2 で imm8 回符号なし除算する。<br />

D1 /5 SHR r/m32,1 r/m32 を 2 で 1 回符号なし除算する。<br />

D3 /5 SHR r/m32,CL r/m32 を 2 で CL 回符号なし除算する。<br />

C1 /5 ib SHR r/m32,imm8 r/m32 を 2 で imm8 回符号なし除算する。<br />

注 :<br />

* IDIV と同じ除算形式ではないことに注意する。負の無限大方向に丸められる。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:725


SAL/SAR/SHL/SHR—Shift ( 続き )<br />

説明<br />

第 1 オペラン ド ( デステ ィ ネーシ ョ ン ・ オペラン ド ) のビッ ト を第 2 オペラン ド ( カウン<br />

ト・オペランド) に指定されたビッ ト数だけ左または右にシフ ト する。 デステ ィ ネー<br />

シ ョ ン ・ オペラ ン ド の境界を超えてシ フ ト さ れる ビ ッ ト は、 ま ず CF フラグにシフト さ<br />

れ、 次に捨てられる。 シ フ ト 操作の最後では、 CF フラグには、 デスティネーション・オ<br />

ペラン ドから最後にシフ ト されたビッ トが含まれる。<br />

デスティネーション ・ オペランドには、 レジスタまたはメモリ ・ ロケーションを使用で<br />

きる。 カウント ・ オペランドには、 即値またはレジスタ CL を使用でき る。 カウン ト は、<br />

5 ビットにマスクされ、 0 から 31 までのカウント範囲に制限される。 1 のカウン ト に対<br />

しては、 特別なオペコー ド ・ エンコーディ ングが備えられている。<br />

左への算術シ フ ト (SAL) 命令お よ び左への論理シ フ ト (SHL) 命令は、 同じ操作を実行し<br />

する。 すなわち、 デスティネーション ・ オペランドのビッ ト を左 ( 上位ビ ッ ト ・ ロ ケ ー<br />

ションの方向) にシフトする。 シフト ・カウントごとに、 デスティネーション・オペラ<br />

ン ド の最上位ビ ッ ト が CF フラグにシフト され、 最下位ビットはクリアされる。 右への算術シ フ ト (SAR) 命令お よ び右への論理シ フ ト (SHR) 命令は、 デステ ィ ネ ー シ ョ<br />

ン・オペランドのビットを右( 下位ビ ッ ト ・ ロ ケ ー シ ョ ンの方向 ) にシフ トする。 シフ<br />

ト ・ カ ウ ン ト ご と に、 デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド の最下位ビ ッ ト が CF フラグに<br />

シ フ ト さ れ、 最上位ビ ッ ト は、 命令タ イ プに応じ てセ ッ ト ま たは ク リ ア さ れる。 SHR 命<br />

令は、 最上位ビ ッ ト を ク リ アする。 SAR 命令は、 デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド の元<br />

の値の符号 ( 最上位ビ ッ ト ) に相当す る よ う に最上位ビ ッ ト をセ ッ ト ま たは ク リ アす る。<br />

実際上、 SAR 命令は、 空のビ ッ ト 位置のシフ ト された値をシフ ト されていない値の符号<br />

で埋める。<br />

SAR 命令お よ び SHR 命令を使用して、 それぞれデス テ ィ ネ ー シ ョ ン ・ オペラ ン ド に 2<br />

の累乗によ る符号付き または符号なしの除算を行える。 例えば、 SAR 命令を使用して符<br />

号付き整数を 1 ビッ ト右にシフトするのは、 値を2 で割る こ と になる。<br />

SAR 命令を使用して除算演算を実行しても、 IDIV 命令 と 同じ結果は生成 さ れない。<br />

IDIV 命令の商はゼ ロ方向に丸め られるのに対し、 SAR 命令の 「商」 は負の無限大方向に<br />

丸められる。 こ の違いは、 負の数に対してだけ明白である。 例えば、 IDIV 命令を使用し<br />

て -9 を 4 で除算する と、 結果は -2 であ り 、 剰余は -1 である。 SAR 命令を使用して -9 を<br />

右に 2 ビ ッ ト だけ シ フ ト す る と 、 結果は -3 であり、 「剰余」 は +3 である。 ただし、 SAR<br />

命令は、 剰余の最上位ビ ッ ト だけ を (CF フラグに) ストアする。<br />

OF フラグは、 1 ビ ッ ト ・ シフ ト の場合だけに影響を受ける。 左シフ ト では、 結果の最上<br />

位ビ ッ ト が CF フラグと同じである ( すなわち、 元のオペラ ン ド の最上位 2 ビッ トが同じ<br />

である ) 場合は、 OF フラグは 0 にク リ アされ、 そ う でない場合は 1 にセッ ト される。<br />

SAR 命令では、 OF フラグはすべての1ビッ ト ・シフトでクリアされる。 SHR 命令では、<br />

OF フ ラ グは元のオペラ ン ド の最上位ビ ッ ト に設定 される。<br />

操作<br />

tempCOUNT ← COUNT;<br />

tempDEST ← DEST;<br />

WHILE (tempCOUNT ≠ 0)<br />

DO<br />

IF instruction is SAL or SHL<br />

THEN<br />

CF ← MSB(DEST);<br />

ELSE (* instruction is SAR or SHR *)<br />

CF ← LSB(DEST);<br />

3:726 第 3 巻 : IA-32 基本命令リファレンス


SAL/SAR/SHL/SHR—Shift ( 続き )<br />

FI;<br />

IF instruction is SAL or SHL<br />

THEN<br />

DEST ← DEST ∗ 2;<br />

ELSE<br />

IF instruction is SAR<br />

THEN<br />

DEST ← DEST / 2 (*Signed divide, rounding toward negative infinity*);<br />

ELSE (* instruction is SHR *)<br />

DEST ← DEST / 2 ; (* Unsigned divide *);<br />

FI;<br />

FI;<br />

temp ← temp - 1;<br />

OD;<br />

(* Determine overflow for the various instructions *)<br />

IF COUNT = 1<br />

THEN<br />

IF instruction is SAL or SHL<br />

THEN<br />

OF ← MSB(DEST) XOR CF;<br />

ELSE<br />

IF instruction is SAR<br />

THEN<br />

OF ← 0;<br />

ELSE (* instruction is SHR *)<br />

OF ← MSB(tempDEST);<br />

FI;<br />

FI;<br />

ELSE<br />

OF ← undefined;<br />

FI;<br />

影響を受けるフラグ<br />

CF フラグは、 デスティネーション・オペランドから最後にシフトされたビットの値をも つ。 このフラグは、 カウントがデスティネーション ・ オペランドのサイズ以上である<br />

SHL 命令 と SHR 命令では未定義であ る。 OF フラグは、 1 ビッ ト ・シフトの場合だけに<br />

影響を受け ( 上記の 「説明」 の項を参照 )、 その他の場合は未定義である。 SF、 ZF、 PF<br />

フラグは、 結果に従って設定される。 カウントが0 である場合は、 フラグは影響を受け<br />

ない。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・ NaT レ ジ ス タ参照アボ ー ト 。<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・ VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

メモリ ・ フォル ト<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:727


SAL/SAR/SHL/SHR—Shift ( 続き )<br />

保護モード例外<br />

#GP(0) デステ ィ ネー シ ョ ンが書き込み不可能なセグメ ン ト にある<br />

場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

インテル・アーキテクチャにおける互換性<br />

8086 は、 シフ ト ・ カウン ト をマス クしない。 Intel386 プロセッサ以降のすべての<br />

インテル ・アーキテクチャ ・ プロセッサは、 すべての動作モードで、 ローテーション ・<br />

カウントをマスクする。<br />

3:728 第 3 巻 : IA-32 基本命令リファレンス


SBB—Integer Subtraction with Borrow<br />

オペコード 命令 説明<br />

1C ib SBB AL,imm8 AL から imm8 をボローありで引く。<br />

1D iw SBB AX,imm16 AX から imm16 をボローありで引く。<br />

1D id SBB EAX,imm32 EAX から imm32 をボローありで引く。<br />

80 /3 ib SBB r/m8,imm8 r/m8 から imm8 をボローありで引く。<br />

81 /3 iw SBB r/m16,imm16 r/m16 から imm16 をボローありで引く。<br />

81 /3 id SBB r/m32,imm32 r/m32 から imm32 をボローありで引く。<br />

83 /3 ib SBB r/m16,imm8 r/m16 から符号拡張された imm8 をボローありで引く。<br />

83 /3 ib SBB r/m32,imm8 r/m32 から符号拡張された imm8 をボローありで引く。<br />

18 /r SBB r/m8,r8 r/m8 から r8 をボローありで引く。<br />

19 /r SBB r/m16,r16 r/m16 から r16 をボローありで引く。<br />

19 /r SBB r/m32,r32 r/m32 から r32 をボローありで引く。<br />

1A /r SBB r8,r/m8 r8 から r/m8 をボローありで引く。<br />

1B /r SBB r16,r/m16 r16 から r/m16 をボローありで引く。<br />

1B /r SBB r32,r/m32 r32 から r/m32 をボローありで引く。<br />

説明<br />

ソース ・オペランド ( 第 2 オペラン ド ) とキャリー (CF) フ ラ グを加算し、 結果をデス<br />

ティネーション・オペランド ( 第 1 オペラン ド ) から引く。 減算の結果は、 デスティ<br />

ネーション・オペランドにストアされる。 デスティネーション・オペランドには、 レジ<br />

ス タ ま たは メ モ リ ・ ロ ケ ー シ ョ ンを使用で き る。 ソ ー ス ・ オペラ ン ド には、 即値、 レ ジ<br />

スタ、 またはメモリ ・ ロケーションを使用できる。 ( ただし、 1 つの命令で 2 つのメモ<br />

リ・オペランドを使用できない。) CF フ ラ グの状態は、 前の減算か ら のボ ロ ー を表す。<br />

即値をオペラン ド として使用する と、 デステ ィ ネーシ ョ ン ・ オペラン ドのフォ ーマッ ト<br />

の長 さ ま で符号拡張 さ れる。<br />

SBB 命令は、 符号付き オペラ ン ド と 符号なし オペラ ン ド と を区別しない。 その代わ り<br />

に、 プロセッサは、 両方のデータ型の結果を評価し、 OF フラグと CF フラグを設定し<br />

て、 それぞれ符号付き の結果 ま たは符号なしの結果のボ ロ ー を示す。 SF フラグは、 符号<br />

付き結果の符号を示す。<br />

通常、 SBB 命令は、 SUB 命令の後に SBB 命令が続 く 複数バ イ ト ま たは複数ワ ー ド の除<br />

算の一部と して実行される。<br />

操作<br />

DEST ← DEST - (SRC + CF);<br />

影響を受けるフラグ<br />

OF、 SF、 ZF、 AF、 PF、 CF フ ラ グが結果に従 っ て設定 さ れる。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:729


SBB—Integer Subtraction with Borrow ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

保護モード例外<br />

#GP(0) デステ ィ ネー シ ョ ンが書き込み不可能なセグメ ン ト にある<br />

場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:730 第 3 巻 : IA-32 基本命令リファレンス


SCAS/SCASB/SCASW/SCASD—Scan String<br />

オペコード 命令 説明<br />

AE SCAS ES:(E)DI AL を ES:(E)DI のバイトと比較し、ステータス・フラグを設定する。<br />

AF SCAS ES:DI AX を ES:DI のワードと比較し、ステータス・フラグを設定する。<br />

AF SCAS ES:EDI EAX を ES:EDI のダブルワードと比較し、ステータス・フラグを設<br />

定する。<br />

AE SCASB AL を ES:(E)DI のバイトと比較し、ステータス・フラグを設定する。<br />

AF SCASW AX を ES:DI のワードと比較し、ステータス・フラグを設定する。<br />

AF SCASD EAX を ES:EDI のダブルワードと比較し、ステータス・フラグを設<br />

定する。<br />

説明<br />

ソース ・オペランドで指定されたバイト、 ワード、 またはダブルワードを、 それぞれ<br />

AL、 AX、 または EAX レジスタの値と比較し、 結果に従ってEFLAGS レジスタのス<br />

テータス ・ フラグを設定する。 ソース ・ オペランドは、 アドレス ES:EDI のメモリ ・ ロ<br />

ケーションを指定する ( オペラン ド ・ サイズ属性が 16 の場合は、 DI レジスタがソース ・<br />

イ ンデ ッ ク ス ・ レ ジ ス タ と して使用 さ れる )。 ES セグメン ト は、 セグメン ト ・ オーバラ<br />

イド ・プリフィックスでオーバライドできない。<br />

SCASB、 SCASW、 SCASD ニーモニッ クは、 それぞれ SCAS 命令のバイ ト 版、 ワ ー ド 版、<br />

ダブルワー ド版のシノニムである。 これらのニーモニッ クは使い方が簡単であるが、 タ<br />

イプ ・ チェ ッ クやセグメント ・ チェ ッ クの機能を持たない (SCAS 命令では、 命令の中で<br />

"ES:EDI" を明示的に指定しなければならない )<br />

比較後、 EDI レジスタは EFLAGS レジスタ内のDF フ ラ グの設定に従っ て自動的に イ ン<br />

クリメントまたはデクリメントされる。 (DF フラグが0 である場合は、 EDI レジスタは<br />

インク リ メン ト される。 DF フラグが1 である場合は、 EDI レジスタはデクリメント され<br />

る。 ) EDI レ ジ ス タ は、 バイ ト 操作の場合は 1、 ワー ド操作の場合は 2、 ダブルワー ド操<br />

作の場合は 4、 それぞれインク リ メン ト またはデク リ メン ト される。<br />

SCAS、 SCASB、 SCASW、 SCASD 命令は、 前に REP プリフィックスを付けると、 ECX<br />

バイ ト、 ワー ド、 またはダブルワー ドのブロ ッ ク比較を行う こ とができる。 しかし通常<br />

は、 こ れ ら の命令は、 次の比較が行われる前にス テ ー タ ス ・ フ ラ グの設定に基づいてあ<br />

る処置を行うループ構造体で使用される こ との方が多い。 REP プ リ フ ィ ッ ク スの説明に<br />

ついては、 3:713 ページの 「REP/REPE/REPZ/REPNE/REPNZ—Repeat String Operation<br />

Prefix」 を参照のこ と。<br />

操作<br />

IF (byte cmparison)<br />

THEN<br />

temp ← AL − SRC;<br />

SetStatusFlags(temp);<br />

THEN IF DF = 0<br />

THEN (E)DI ← 1;<br />

ELSE (E)DI ← -1;<br />

FI;<br />

ELSE IF (word comparison)<br />

THEN<br />

temp ← AX − SRC;<br />

SetStatusFlags(temp)<br />

THEN IF DF = 0<br />

THEN DI ← 2;<br />

第 3 巻 : IA-32 基本命令リファレンス 3:731


SCAS/SCASB/SCASW/SCASD—Scan String ( 続き )<br />

FI;<br />

FI;<br />

ELSE DI ← -2;<br />

FI;<br />

ELSE (* doubleword comparison *)<br />

temp ← EAX − SRC;<br />

SetStatusFlags(temp)<br />

THEN IF DF = 0<br />

THEN EDI ← 4;<br />

ELSE EDI ← -4;<br />

FI;<br />

影響を受けるフラグ<br />

OF、 SF、 ZF、 AF、 PF、 および CF フ ラ グが比較の一時的な結果に従 っ て設定 さ れる。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが ES セグメン ト の範<br />

囲外の場合。<br />

ES レジスタの内容がNULL セグメン ト ・ セレク タの場<br />

合。<br />

ES レジスタに不当なメモリ ・ オペランド実効アドレスが<br />

与え ら れている場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

3:732 第 3 巻 : IA-32 基本命令リファレンス


SCAS/SCASB/SCASW/SCASD—Scan String ( 続き )<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:733


SETcc—Set Byte on Condition<br />

オペコード 命令 説明<br />

0F 97 SETA r/m8 より上 (CF=0 および ZF=0) の場合バイトを設定する。<br />

0F 93 SETAE r/m8 より上か等しい (CF=0) 場合バイトを設定する。<br />

0F 92 SETB r/m8 より下 (CF=1) の場合バイトを設定する。<br />

0F 96 SETBE r/m8 より下か等しい (CF=1 または ZF=1) 場合バイトを設定する。<br />

0F 92 SETC r/m8 キャリーがある (CF=1) 場合設定する。<br />

0F 94 SETE r/m8 等しい (ZF=1) 場合バイトを設定する。<br />

0F 9F SETG r/m8 より大きい (ZF=0 および SF=OF) 場合バイトを設定する。<br />

0F 9D SETGE r/m8 より大きいか等しい (SF=OF) 場合バイトを設定する。<br />

0F 9C SETL r/m8 より小さい (SFOF) 場合バイトを設定する。<br />

0F 9E SETLE r/m8 より小さいか等しい (ZF=1 または SFOF) 場合バイトを設定する。<br />

0F 96 SETNA r/m8 より上でない (CF=1 または ZF=1) 場合バイトを設定する。<br />

0F 92 SETNAE r/m8 より上でなく等しくない (CF=1) 場合バイトを設定する。<br />

0F 93 SETNB r/m8 より下でない (CF=0) 場合バイトを設定する。<br />

0F 97 SETNBE r/m8 より下でなく等しくない (CF=0 および ZF=0) 場合バイトを設定する。<br />

0F 93 SETNC r/m8 キャリーがない (CF=0) 場合バイトを設定する。<br />

0F 95 SETNE r/m8 等しくない (ZF=0) 場合バイトを設定する。<br />

0F 9E SETNG r/m8 より大きくない (ZF=1 または SFOF) 場合バイトを設定する。<br />

0F 9C SETNGE r/m8 より大きくなく等しくない (SFOF) 場合設定する。<br />

0F 9D SETNL r/m8 より小さくない (SF=OF) 場合バイトを設定する。<br />

0F 9F SETNLE r/m8 より小さくなく等しくない (ZF=0 および SF=OF) 場合バイトを設定する。<br />

0F 91 SETNO r/m8 オーバフローがない (OF=0) 場合バイトを設定する。<br />

0F 9B SETNP r/m8 パリティがない (PF=0) 場合バイトを設定する。<br />

0F 99 SETNS r/m8 符号がない (SF=0) 場合バイトを設定する。<br />

0F 95 SETNZ r/m8 ゼロでない (ZF=0) 場合バイトを設定する。<br />

0F 90 SETO r/m8 オーバフローがある (OF=1) 場合バイトを設定する。<br />

0F 9A SETP r/m8 パリティがある (PF=1) 場合バイトを設定する。<br />

0F 9A SETPE r/m8 パリティが偶数 (PF=1) の場合バイトを設定する。<br />

0F 9B SETPO r/m8 パリティが奇数 (PF=0) の場合バイトを設定する。<br />

0F 98 SETS r/m8 符号がある (SF=1) 場合バイトを設定する。<br />

0F 94 SETZ r/m8 ゼロ (ZF=1) の場合バイトを設定する。<br />

説明<br />

デステ ィ ネーシ ョ ン ・ オペラン ド を EFLAGS レジスタのステータス ・ フラグ(CF、 SF、<br />

OF、 ZF、 PF) の設定に従って 0 または 1 に設定する。 デステ ィ ネーシ ョ ン ・ オペラン ド<br />

は、 バイ ト ・ レ ジスタ または メモ リ 内のバイ ト を指す。 条件コ ー ド ・ サフ ィ ッ ク ス (cc)<br />

は、 テス ト される条件を示している。<br />

「よ り上」 と 「よ り下」 の表現は、 CF フ ラ グに関連付け ら れ、 2 つの符号なし整数値間<br />

の関係をいっている。 「よ り大きい」 と 「よ り小さい」 の表現は、 SF および OF フラグ<br />

に関連付け られ、 2 つの符号付き整数値間の関係をい っ てい る。<br />

3:734 第 3 巻 : IA-32 基本命令リファレンス


SETcc—Set Byte on Condition ( 続き )<br />

SETcc 命令のオペ コ ー ド の多 く には、 代替ニーモニ ッ ク があ る。 例えば、 SETG ( より大<br />

き い場合バイ ト を設定 ) と SETNLE ( よ り 小 さ く な く 等し く ない場合設定 ) は、 両方と も<br />

同じ オペ コ ー ド を も ち、 同じ条件、 すなわち、 ZF が 0 に等し く 、 SF が OF に等しいこ と<br />

をテス ト する。 これらの代替ニーモニックは、 コー ドをよ りわかりやすく するために提<br />

供されている。<br />

一部の言語では、 すべての ビ ッ ト をセ ッ ト した整数 と して論理 1 を表す。 この表現は、<br />

SETcc 命令に対して互いに両立しない条件を選択し、 その結果をデク リ メン ト すれば得<br />

られる。 例えば、 オーバフローがあるかテス トするには、 SETNO 命令を使用し、 次に結<br />

果をデク リ メン ト する。<br />

操作<br />

IF condition<br />

THEN DEST ← 1<br />

ELSE DEST ← 0;<br />

FI;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) デステ ィ ネー シ ョ ンが書き込み不可能なセグメ ン ト にある<br />

場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:735


SETcc—Set Byte on Condition ( 続き )<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:736 第 3 巻 : IA-32 基本命令リファレンス


SGDT/SIDT—Store Global/Interrupt Descriptor Table Register<br />

オペコード 命令 説明<br />

0F 01 /0 SGDT m GDTR を m にストアする。<br />

0F 01 /1 SIDT m IDTR を m にストアする。<br />

説明<br />

グローバル・ ディスク リプタ ・ テーブル ・ レジスタ (GDTR) または割り込みディスクリ プタ ・ テーブル ・ レジスタ (IDTR) をデスティネーション・オペランドにストアする。 デ<br />

スティネーション・オペランドは、 6 バイ ト のメモリ ・ ロケーシ ョ ンを指定する。 オペ<br />

ランド ・ サイズ属性が 32 ビ ッ ト であ る場合は、 レ ジ ス タ の 16 ビッ トのリ ミッ ト ・<br />

フィールドがメモリ ・ロケーションの下位2バイ ト にス ト アされ、 32 ビッ トのベース・<br />

アドレスが上位4バイ ト にス ト アされる。 オペランド ・ サイズ属性が 16 ビッ トである場<br />

合は、 範囲が下位 2 バイ ト にス ト アされ、 24 ビットのベース・アドレスが3 ~ 5 バイ ト<br />

目にス ト アされ、 6 バイ ト目は 0 で埋められる。<br />

SGDT 命令お よ び SIDT 命令は、 オペレーティング・システム・ ソフトウェアだけに有用<br />

であるが、 アプ リ ケーシ ョ ン ・ プログラムで使用でき る。<br />

操作<br />

IF Itanium System Environment THEN IA-32_Intercept(INST,SGDT/SIDT);<br />

IF instruction is IDTR<br />

THEN<br />

IF OperandSize = 16<br />

THEN<br />

DEST[0:15] ← IDTR(Limit);<br />

DEST[16:39] ← IDTR(Base); (* 24 bits of base address loaded; *)<br />

DEST[40:47] ← 0;<br />

ELSE (* 32-bit Operand Size *)<br />

DEST[0:15] ← IDTR(Limit);<br />

DEST[16:47] ← IDTR(Base); (* full 32-bit base address loaded *)<br />

FI;<br />

ELSE (* instruction is SGDT *)<br />

IF OperandSize = 16<br />

THEN<br />

DEST[0:15] ← GDTR(Limit);<br />

DEST[16:39] ← GDTR(Base); (* 24 bits of base address loaded; *)<br />

DEST[40:47] ← 0;<br />

ELSE (* 32-bit Operand Size *)<br />

DEST[0:15] ← GDTR(Limit);<br />

DEST[16:47] ← GDTR(Base); (* full 32-bit base address loaded *)<br />

FI;<br />

FI;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

IA-32_Intercept SIDT および SGDT 命令での命令イ ン タ ーセプ ト 。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:737


SGDT/SIDT—Store Global/Interrupt Descriptor Table Register ( 続き )<br />

保護モード例外<br />

#UD デスティネーション ・ オペランドがレジスタである場合。<br />

#GP(0) デステ ィ ネー シ ョ ンが書き込み不可能なセグメ ン ト にある<br />

場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 および GS レジスタを使用してメモリがア<br />

クセスされ、 レジスタの内容が NULL セグメン ト ・ セレ<br />

クタであった場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#UD デスティネーション ・ オペランドがレジスタである場合。<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#UD デスティネーション ・ オペランドがレジスタである場合。<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

インテル・アーキテクチャにおける互換性<br />

SGDT 命令お よ び SIDT 命令の 16 ビット形式は、 上位8 ビ ッ ト が参照されない場合に<br />

インテル 286 プ ロ セ ッ サ と 互換性がある。 イ ン テル 286 プロセッサはこれらのビッ ト を<br />

1 で埋め、 Pentium Pro プロセッサはこれらのビッ ト を 0 で埋める。<br />

3:738 第 3 巻 : IA-32 基本命令リファレンス


SHL/SHR—Shift Instructions<br />

「SAL/SAR/SHL/SHR」 を参照のこ と。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:739


SHLD—Double Precision Shift Left<br />

オペコード 命令 説明<br />

0F A4 SHLD r/m16,r16,imm8 r/m16 を左に imm8 位置シフトし、r16 からのビットを右からシフ<br />

ト・インする。<br />

0F A5 SHLD r/m16,r16,CL r/m16 を左に CL 位置シフトし、r16 からのビットを右からシフ<br />

ト・インする。<br />

0F A4 SHLD r/m32,r32,imm8 r/m32 を左に imm8 位置シフトし、r32 からのビットを右からシフ<br />

ト・インする。<br />

0F A5 SHLD r/m32,r32,CL r/m32 を左に CL 位置シフトし、r32 からのビットを右からシフ<br />

ト・インする。<br />

説明<br />

第 1 オペラン ド ( デステ ィ ネーシ ョ ン ・ オペラン ド ) を第 3 オペラン ド ( カウント ・ オペ<br />

ランド ) で指定されたビ ッ ト 数だけ左にシフ ト する。 第 2 オペラン ド ( ソース ・オペラ<br />

ンド ) は、 ( デステ ィ ネーシ ョ ン ・ オペラン ド のビ ッ ト 0 で始ま って ) 右か ら シ フ ト ・ イ<br />

ンするビッ トを指定する。 デスティネーション ・ オペランドには、 レジスタまたはメモ<br />

リ ・ ロケーションを使用できる。 ソース ・ オペランドは、 レジスタである。 カウン ト ・<br />

オペラ ン ド は符号なし整数で、 即値バイ ト ま たは CL レジスタの内容である。 カウント<br />

のビ ッ ト 0 ~ 4 だけが使用 さ れ、 カ ウ ン ト が 0 ~ 31 の値にマス ク される。 カ ウン ト がオ<br />

ペランド ・サイズより大きい場合は、 デスティネーション・オペランドの結果は未定義<br />

である。<br />

カウントが1 以上であ る場合は、 CF フラグにはデスティネーション・オペランドから最<br />

後にシフ ト されたビ ッ ト が入る。 1 ビット ・シフトでは、 OF フ ラ グは、 符号変更が発生<br />

するとセッ ト され、 そうでなければクリアされる。 カウン ト ・ オペランドが 0 である場<br />

合は、 フラグは影響を受けない。<br />

SHLD 命令は、 64 ビ ッ ト 以上の多重精度シフ ト に有用である。<br />

操作<br />

COUNT ← COUNT MOD 32;<br />

SIZE ← OperandSize<br />

IF COUNT = 0<br />

THEN<br />

no operation<br />

ELSE<br />

IF COUNT ≥ SIZE<br />

THEN (* Bad parameters *)<br />

DEST is undefined;<br />

CF, OF, SF, ZF, AF, PF are undefined;<br />

ELSE (* Perform the shift *)<br />

CF ← BIT[DEST, SIZE - COUNT];<br />

(* Last bit shifted out on exit *)<br />

FOR i ← SIZE - 1 DOWNTO COUNT<br />

DO<br />

Bit(DEST, i) ← Bit(DEST, i - COUNT);<br />

OD;<br />

FOR i ← COUNT - 1 DOWNTO 0<br />

DO<br />

BIT[DEST, i] ← BIT[SRC, i - COUNT + SIZE];<br />

OD;<br />

FI;<br />

FI;<br />

3:740 第 3 巻 : IA-32 基本命令リファレンス


SHLD—Double Precision Shift Left ( 続き )<br />

影響を受けるフラグ<br />

カウントが1 以上であ る場合は、 CF フラグにはデスティネーション・オペランドから最<br />

後にシフ ト されたビ ッ ト が入り、 SF、 ZF、 PF フ ラ グは結果の値に従 っ て設定 さ れる。 1<br />

ビッ ト ・シフトでは、 OF フラグは、 符号変更が発生するとセッ ト され、 そうでなければ<br />

クリアされる。 1 ビッ トより大きいシフトでは、 OF フラグは未定義である。 シフトが行<br />

われる と、 AF フラグは未定義である。 カウン ト ・ オペランドが 0 である場合は、 フ ラグ<br />

は影響を受けない。 カウン ト がオペラン ド ・ サイズよ り大きい場合は、 フ ラグは未定義<br />

である。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) デステ ィ ネー シ ョ ンが書き込み不可能なセグメ ン ト にある<br />

場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:741


SHLD—Double Precision Shift Left ( 続き )<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:742 第 3 巻 : IA-32 基本命令リファレンス


SHRD—Double Precision Shift Right<br />

オペコード 命令 説明<br />

0F AC SHRD r/m16,r16,imm8 r/m16 を右に imm8 位置シフトし、r16 からのビットを左からシフ<br />

ト・インする。<br />

0F AD SHRD r/m16,r16,CL r/m16 を右に CL 位置シフトし、r16 からのビットを左からシフ<br />

ト・インする。<br />

0F AC SHRD r/m32,r32,imm8 r/m32 を右に imm8 位置シフトし、r32 からのビットを左からシフ<br />

ト・インする。<br />

0F AD SHRD r/m32,r32,CL r/m32 を右に CL 位置シフトし、r32 からのビットを左からシフ<br />

ト・インする。<br />

説明<br />

第 1 オペラン ド ( デステ ィ ネーシ ョ ン ・ オペラン ド ) を第 3 オペラン ド ( カウント ・ オペ<br />

ランド ) で指定されたビ ッ ト 数だけ右にシフ ト する。 第 2 オペラン ド ( ソース ・オペラ<br />

ンド ) は、 ( デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド の最上位ビ ッ ト で始 ま っ て ) 左か ら シ フ<br />

ト ・インするビットを指定する。 デスティネーション・オペランドには、 レジスタまた<br />

はメモリ ・ ロケーショ ンを使用できる。 ソース ・ オペラン ド は、 レジスタである。 カウ<br />

ント ・オペランドは符号なし整数で、 即値バイトまたはCL レジスタの内容である。 カ<br />

ウン トのビッ ト 0 ~ 4 だけが使用 さ れ、 カ ウ ン ト が 0 ~ 31 の値にマス ク される。 カ ウン<br />

トがオペランド ・サイズよ り大きい場合は、 デスティネーション ・ オペランドの結果は<br />

未定義である。<br />

カウントが1 以上であ る場合は、 CF フラグにはデスティネーション・オペランドから最<br />

後にシフ ト されたビ ッ ト が入る。 1 ビット ・シフトでは、 OF フ ラ グは、 符号変更が発生<br />

するとセッ ト され、 そうでなければクリアされる。 カウン ト ・ オペランドが 0 である場<br />

合は、 フラグは影響を受けない。<br />

SHRD 命令は、 64 ビ ッ ト 以上の多重精度シ フ ト に有用である。<br />

操作<br />

COUNT ← COUNT MOD 32;<br />

SIZE ← OperandSize<br />

IF COUNT = 0<br />

THEN<br />

no operation<br />

ELSE<br />

IF COUNT ≥ SIZE<br />

THEN (* Bad parameters *)<br />

DEST is undefined;<br />

CF, OF, SF, ZF, AF, PF are undefined;<br />

ELSE (* Perform the shift *)<br />

CF ← BIT[DEST, COUNT - 1]; (* last bit shifted out on exit *)<br />

FOR i ← 0 TO SIZE - 1 - COUNT<br />

DO<br />

BIT[DEST, i] ← BIT[DEST, i - COUNT];<br />

OD;<br />

FOR i ← SIZE - COUNT TO SIZE - 1<br />

DO<br />

BIT[DEST,i] ← BIT[inBits,i+COUNT - SIZE];<br />

OD;<br />

FI;<br />

FI;<br />

第 3 巻 : IA-32 基本命令リファレンス 3:743


SHRD—Double Precision Shift Right ( 続き )<br />

影響を受けるフラグ<br />

カウントが1 以上であ る場合は、 CF フラグにはデスティネーション・オペランドから最<br />

後にシフ ト されたビ ッ ト が入り、 SF、 ZF、 PF フ ラ グは結果の値に従 っ て設定 さ れる。 1<br />

ビッ ト ・シフトでは、 OF フラグは、 符号変更が発生するとセッ ト され、 そうでなければ<br />

クリアされる。 1 ビッ トより大きいシフトでは、 OF フラグは未定義である。 シフトが行<br />

われる と、 AF フラグは未定義である。 カウン ト ・ オペランドが 0 である場合は、 フ ラグ<br />

は影響を受けない。 カウン ト がオペラン ド ・ サイズよ り大きい場合は、 フ ラグは未定義<br />

である。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) デステ ィ ネー シ ョ ンが書き込み不可能なセグメ ン ト にある<br />

場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

3:744 第 3 巻 : IA-32 基本命令リファレンス


SHRD—Double Precision Shift Right ( 続き )<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:745


SIDT—Store Interrupt Descriptor Table Register<br />

「SGDT/SIDT」 を参照のこ と。<br />

3:746 第 3 巻 : IA-32 基本命令リファレンス


SLDT—Store Local Descriptor Table Register<br />

オペコード 命令 説明<br />

0F 00 /0 SLDT r/m16 セグメント・セレクタを LDTR から r/m16 にストアする。<br />

0F 00 /0 SLDT r/m32 セグメント・セレクタを LDTR から r/m32 の下位 16 ビットにスト<br />

アする。上位 16 ビットは未定義。<br />

説明<br />

セグメン ト ・ セレ ク タをローカル ・ ディ スク リ プタ ・ テーブル ・ レジスタ (LDTR) から<br />

デステ ィ ネーシ ョ ン ・ オペラン ド にス ト アする。 デステ ィ ネーシ ョ ン ・ オペラン ド には、<br />

汎用レ ジ ス タ ま たは メ モ リ ・ ロ ケ ー シ ョ ン を使用で き る。 こ の命令でス ト ア さ れる セグ<br />

メン ト ・ セレクタは LDT を指す。<br />

デステ ィ ネーシ ョ ン ・ オペラン ドが 32 ビッ ト ・レジスタであるときは、 16 ビットのセ<br />

グメント ・セレクタがレジスタの下位16 ビットにコピーされる。 レジスタの上位16<br />

ビッ トは0 にク リアされる。 デスティネーション ・ オペランドがメモリ ・ ロケーション<br />

であるときは、 セグメント ・セレクタは、 オペランド ・サイズに関係なく、 16 ビット幅<br />

でメモリに書き込まれる。<br />

SLDT 命令は、 オペレーテ ィング ・ システム ・ ソフ ト ウェアだけに有用であるが、 アプ<br />

リ ケー シ ョ ン ・ プログラ ムで使用でき る。 また、 この命令は保護モー ド でのみ実行でき<br />

る。<br />

操作<br />

IF Itanium System Environment THEN IA-32_Intercept(INST,SLDT);<br />

DEST ← LDTR(SegmentSelector);<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

IA-32_Intercept SLDT 命令に よ っ て IA-32 イ ン タ ー セプ ト が発生す る。<br />

保護モード例外<br />

#GP(0) デステ ィ ネー シ ョ ンが書き込み不可能なセグメ ン ト にある<br />

場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 GS レジスタを使用してメモ リ がアクセス<br />

さ れ、 レ ジ ス タ の内容が NULL セグメン ト ・ セレク タで<br />

あった場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:747


SLDT—Store Local Descriptor Table Register ( 続き )<br />

実アドレス・モード例外<br />

#UD SLDT 命令は実ア ド レ ス ・ モ ー ド では認識 さ れない。<br />

仮想 8086 モード例外<br />

#UD SLDT 命令は仮想 8086 モー ドでは認識されない。<br />

3:748 第 3 巻 : IA-32 基本命令リファレンス


SMSW—Store Machine Status Word<br />

オペコード 命令 説明<br />

0F 01 /4 SMSW r32/m16 マシン・ステータス・ワードを r32 の下位 16 ビットまたは m16 に<br />

ストアし、r32 の上位 16 ビットは未定義である。<br />

説明<br />

マシン・ステータス・ワード ( 制御レ ジ ス タ CR0 のビッ ト 0 ~ 15) をデステ ィ ネーシ ョ<br />

ン・オペランドにストアする。 デスティネーション・オペランドには、 16 ビッ トの汎用<br />

レジスタまたはメモリ ・ ロケーションを使用できる。<br />

デステ ィ ネーシ ョ ン ・ オペラン ドが 32 ビッ ト ・レジスタであるときは、 CR0 レジスタの<br />

下位 16 ビットがレジスタの下位16 ビ ッ ト に コ ピ ー さ れ、 レ ジ ス タ の上位 16 ビッ トは未<br />

定義であ る。 デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド が メ モ リ ・ ロ ケ ー シ ョ ンである と き は、<br />

オペラン ド ・ サイズに関係な く 、 CR0 レジスタの下位16 ビッ トが16 ビッ ト幅でメモリ<br />

に書き込まれる。<br />

SMSW 命令は、 オペレーティング ・ システム・ ソフ ト ウェアだけに有用であるが、 特権<br />

命令ではな く 、 アプ リ ケ ー シ ョ ン ・ プ ロ グ ラ ムで使用で き る。<br />

この命令は、 インテル 286 プロセッサとの互換性を保つために設けられたものである。<br />

インテル 286 よ り新しいプロセッサ向けに開発されるプログラムおよびプロシージ ャで<br />

は、 MOV( コント ロール・ レジスタ ) 命令を使用してマシ ン ・ ステ ー タ ス ・ ワ ー ド を<br />

ロードすることを推奨する。<br />

操作<br />

IF Itanium System Environment THEN IA-32_Intercept(INST,SMSW);<br />

DEST ← CR0[15:0]; (* MachineStatusWord *);<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

IA-32_Intercept 強制命令イ ン タ ー セプ ト 。<br />

保護モード例外<br />

#GP(0) デステ ィ ネー シ ョ ンが書き込み不可能なセグメ ン ト にある<br />

場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 GS レジスタを使用してメモ リ がアクセス<br />

さ れ、 レ ジ ス タ の内容が NULL セグメン ト ・ セレク タで<br />

あった場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:749


SMSW—Store Machine Status Word ( 続き )<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:750 第 3 巻 : IA-32 基本命令リファレンス


STC—Set Carry Flag<br />

オペコード 命令 説明<br />

F9 STC CF フラグをセットする。<br />

説明<br />

EFLAGS レジスタのCF フラグをセットする。 操作<br />

CF ← 1;<br />

影響を受けるフラグ<br />

CF フラグがセッ ト される。 OF、 ZF、 SF、 AF、 PF フラグは影響を受けない。<br />

例外 ( すべての操作モード )<br />

なし。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:751


STD—Set Direction Flag<br />

オペコード 命令 説明<br />

FD STD DF フラグをセットする。<br />

説明<br />

EFLAGS レジスタのDF フラグをセットする。 DF フラグが1 にセッ ト される と、 ス ト リ<br />

ング操作はインデックス ・ レジスタ (ESI または EDI、 またはその両方 ) をデク リ メン ト<br />

する。<br />

操作<br />

DF ← 1;<br />

影響を受けるフラグ<br />

DF フラグがセット される。 CF、 OF、 ZF、 SF、 AF、 PF フラグは影響を受けない。<br />

例外 ( すべての操作モード )<br />

なし。<br />

3:752 第 3 巻 : IA-32 基本命令リファレンス


STI—Set Interrupt Flag<br />

オペコード 命令 説明<br />

FB STI 割り込みフラグをセットする。次の命令の最後で、割り込みがイ<br />

ネーブルになる。<br />

説明<br />

EFLAGS レジスタの割り込みフラグ (IF) をセッ ト する。 IA-32 システム環境では、 IF フ<br />

ラグがセ ッ ト された後、 プロセ ッ サは、 次の命令を実行した後に外部マス ク可能割り込<br />

みへの応答を開始す る。 STI 命令の後に (IF フラグをクリアする ) CLI 命令が続いてい る<br />

と、 STI 命令の効果はネゲー ト される。 Itanium ベース・システム環境では、プロセッサ<br />

は、STI 命令の実行によってトラップやインターセプトが発生しない限り、STI 命令の<br />

後ただちに割り込みに対して応答する。IA-32 命令に対する外部割り込みは、PSR.i が 1<br />

で、~ CFLG.if または EFLAG.if が 1 である場合にイネーブルにされる。<br />

IF フラグと STI 命令お よ び CLI 命令は、 例外 と NMI 割り込みの生成には影響を与えな<br />

い。<br />

以下のデシ ジ ョ ン ・ テ ー ブルは、 プ ロ セ ッ サの動作モ ー ド お よ び現在実行中のプ ロ グ ラ<br />

ムまたはプロシージャのCPL と IOPL( テーブルの上部分) によって、 STI 命令の処置<br />

( テーブルの下部分) が決ま る こ と を示している。<br />

注 :<br />

X 関係なし。<br />

N 左端の欄の処置が行われない。<br />

Y 左端の欄の処置が行われる。<br />

操作<br />

OLD_IF IOPL =3<br />

IOPL X X X =3<br />

IF ← 1 Y Y N Y<br />

#GP(0) N N Y N<br />

IF PE=0 (* Executing in real-address mode *)<br />

THEN<br />

IF ← 1; (* Set Interrupt Flag *)<br />

ELSE (* Executing in protected mode or virtual-8086 mode *)<br />

IF VM=0 (* Executing in protected mode*)<br />

THEN<br />

IF CR4.PVI = 0<br />

THEN<br />

IF CPL


STI—Set Interrupt Flag ( 続き )<br />

FI;<br />

FI;<br />

FI;<br />

IF IOPL < 3<br />

THEN<br />

IF VIP = 0<br />

THEN VIF


STI—Set Interrupt Flag ( 続き )<br />

仮想 8086 モード例外<br />

#GP(0) CPL が現在のプロ グラ ム ま たはプロ シ ー ジ ャ の IOPL より<br />

大きい ( 低い特権を も つ ) 場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:755


STOS/STOSB/STOSW/STOSD—Store String Data<br />

オペコード 命令 説明<br />

AA STOS ES:(E)DI AL をアドレス ES:(E)DI にストアする。<br />

AB STOS ES:DI AX をアドレス ES:DI にストアする。<br />

AB STOS ES:EDI EAX をアドレス ES:EDI にストアする。<br />

AA STOSB AL をアドレス ES:(E)DI にストアする。<br />

AB STOSW AX をアドレス ES:DI にストアする。<br />

AB STOSD EAX をアドレス ES:EDI にストアする。<br />

説明<br />

バイ ト、 ワー ド、 またはダブルワー ド をそれぞれ AL、 AX、 または EAX レジスタからデ<br />

スティネーション・オペランドにストアする。 デスティネーション・オペランドは、 ア<br />

ドレスES:EDI のメモリ ・ ロケーションである ( オペラン ド ・ サイズ属性が 16 の場合は、<br />

DI レジスタがソース ・ インデックス ・ レジスタとして使用される )。 ES セグメン ト は、<br />

セグメン ト ・ オーバライ ド ・ プ リ フ ィ ッ クスでオーバライ ド できない。<br />

STOSB、 STOSW、 STOSD ニーモニッ クは、 それぞれ STOS 命令のバイ ト 版、 ワ ー ド 版、<br />

ダブルワー ド版のシノニムである。 これらのニーモニッ クは使い方が簡単であるが、 タ<br />

イプ ・ チェ ッ クやセグメント ・ チェ ッ クの機能を持たない (STOS 命令では、 命令の中で<br />

"ES:EDI" を明示的に指定しなければならない )。<br />

バイ ト、 ワー ド、 またはダブルワー ドが AL、 AX、 または EAX レジスタからメモリ ・ ロ<br />

ケ ー シ ョ ン に転送 さ れた後、 EDI レジスタは EFLAGS レジスタのDF フ ラ グの設定に<br />

従 っ て自動的に イ ン ク リ メ ン ト ま たはデ ク リ メ ン ト さ れる。 (DF フラグが0 である場合<br />

は、 EDI レジスタはインクリメント される。 DF フラグが1 である場合は、 EDI レジスタ<br />

はデク リ メン ト される。 ) EDI レ ジ ス タ は、 バイ ト 操作の場合は 1、 ワー ド操作の場合は<br />

2、 ダブル ワ ー ド 操作の場合は 4、 それぞれインク リ メン ト またはデク リ メン ト される。<br />

STOS、 STOSB、 STOSW、 STOSD 命令は、 前に REP プリフィックスを付けることによ<br />

り、 ECX バイ ト、 ワー ド、 またはダブルワー ドのブロ ッ ク ・ ロー ド を行える。 しかし通<br />

常は、 デー タをス ト アするにはその前に AL、 AX、 または EAX レジスタに転送する必要<br />

がある ので、 こ れ ら の命令はルー プ構造体で使用 さ れる方が多い。 REP プリフィックス<br />

の説明については、 3:713 ページの 「REP/REPE/REPZ/REPNE/REPNZ—Repeat String<br />

Operation Prefix」 を参照のこ と。<br />

操作<br />

IF (byte store)<br />

THEN<br />

DEST ← AL;<br />

THEN IF DF = 0<br />

THEN (E)DI ← 1;<br />

ELSE (E)DI ← -1;<br />

FI;<br />

ELSE IF (word store)<br />

THEN<br />

DEST ← AX;<br />

THEN IF DF = 0<br />

THEN DI ← 2;<br />

ELSE DI ← -2;<br />

FI;<br />

3:756 第 3 巻 : IA-32 基本命令リファレンス


STOS/STOSB/STOSW/STOSD—Store String Data ( 続き )<br />

FI;<br />

FI;<br />

ELSE (* doubleword store *)<br />

DEST ← EAX;<br />

THEN IF DF = 0<br />

THEN EDI ← 4;<br />

ELSE EDI ← -4;<br />

FI;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) デステ ィ ネー シ ョ ンが書き込み不可能なセグメ ン ト にある<br />

場合。<br />

メモリ ・ オペランドの実効アドレスが ES セグメン ト の範<br />

囲外の場合。<br />

ES レジスタの内容がNULL セグメン ト ・ セレク タの場<br />

合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:757


STOS/STOSB/STOSW/STOSD—Store String Data ( 続き )<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:758 第 3 巻 : IA-32 基本命令リファレンス


STR—Store Task Register<br />

オペコード 命令 説明<br />

0F 00 /1 STR r/m16 セグメント・セレクタを TR から r/m16 にストアする。<br />

説明<br />

セグメン ト ・ セレ ク タをタスク ・ レジスタ (TR) からデスティネーション ・ オペランドに<br />

ストアする。 デスティネーション ・ オペランドには、 汎用レジスタまたはメモリ ・ ロ<br />

ケ ー シ ョ ン を使用で き る。 こ の命令でス ト ア さ れる セグ メ ン ト ・ セ レ ク タ は、 現在実行<br />

中のタ ス クのタス ク ・ ステ ー ト ・ セグメ ン ト (TSS) を指す。<br />

デステ ィ ネーシ ョ ン ・ オペラン ドが 32 ビッ ト ・レジスタであるときは、 16 ビットのセ<br />

グメント ・セレクタがレジスタの下位16 ビットにコピーされ、 レジスタの上位16 ビッ<br />

トは0 にクリアされる。 デスティネーション・オペランドがメモリ ・ ロケーションであ<br />

るときは、 セグメント ・セレクタは、 オペランド ・サイズに関係なく、 16 ビッ ト幅でメ<br />

モリに書き込まれる。<br />

STR 命令は、 オペレーティング・システム・ ソフトウェアだけに有用である。 この命令<br />

は、 保護モー ド でしか実行する こ と がで き ない。<br />

操作<br />

IF Itanium System Environment THEN IA-32_Intercept(INST,STR);<br />

DEST ← TR(SegmentSelector);<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

IA-32_Intercept 強制命令イ ン タ ー セプ ト 。<br />

保護モード例外<br />

#GP(0) デステ ィ ネー シ ョ ンが書き込み不可能なセグメ ン ト にある<br />

メモ リ ・ オペラ ン ド である場合、 ま たは実効ア ド レ スが<br />

CS、 DS、 ES、 FS、 または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 GS レジスタを使用してメモ リ がアクセス<br />

さ れ、 レ ジ ス タ の内容が NULL セグメン ト ・ セレク タで<br />

あった場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#UD STR 命令は実ア ド レ ス ・ モー ド では認識 さ れない。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:759


STR—Store Task Register ( 続き )<br />

仮想 8086 モード例外<br />

#UD STR 命令は仮想 8086 モー ドでは認識されない。<br />

3:760 第 3 巻 : IA-32 基本命令リファレンス


SUB—Integer Subtraction<br />

オペコード 命令 説明<br />

2C ib SUB AL,imm8 AL から imm8 を引く。<br />

2D iw SUB AX,imm16 AX から imm16 を引く。<br />

2D id SUB EAX,imm32 EAX から imm32 を引く。<br />

80 /5 ib SUB r/m8,imm8 r/m8 から imm8 を引く。<br />

81 /5 iw SUB r/m16,imm16 r/m16 から imm16 を引く。<br />

81 /5 id SUB r/m32,imm32 r/m32 から imm32 を引く。<br />

83 /5 ib SUB r/m16,imm8 r/m16 から符号拡張された imm8 を引く。<br />

83 /5 ib SUB r/m32,imm8 r/m32 から符号拡張された imm8 を引く。<br />

28 /r SUB r/m8,r8 r/m8 から r8 を引く。<br />

29 /r SUB r/m16,r16 r/m16 から r16 を引く。<br />

29 /r SUB r/m32,r32 r/m32 から r32 を引く。<br />

2A /r SUB r8,r/m8 r8 から r/m8 を引く。<br />

2B /r SUB r16,r/m16 r16 から r/m16 を引く。<br />

2B /r SUB r32,r/m32 r32 から r/m32 を引く。<br />

説明<br />

第 1 オペラン ド ( デステ ィ ネーシ ョ ン ・ オペラン ド ) から第2 オペラン ド ( ソース・オペ<br />

ランド ) を引き、 結果をデスティネーション・オペランドにストアする。 デスティネー<br />

ション・オペランドには、 レジスタまたはメモリ ・ロケーションを使用できる。 ソー<br />

ス ・ オペラ ン ド に は、 即値、 レ ジ ス タ、 ま たは メ モ リ ・ ロ ケ ー シ ョ ン を使用で き る。 即<br />

値をオペランド として使用すると、 デスティネーション ・ オペランドのフォーマッ トの<br />

長 さ ま で符号拡張 さ れる。<br />

SUB 命令は、 符号付き オペラ ン ド と 符号なし オペラ ン ド と を区別しない。 その代わ り<br />

に、 プロセッサは、 両方のデータ型の結果を評価し、 OF フラグと CF フラグを設定し<br />

て、 それぞれ符号付き の結果 ま たは符号なしの結果のボ ロ ー を示す。 SF フラグは、 符号<br />

付き結果の符号を示す。<br />

操作<br />

DEST ← DEST - SRC;<br />

影響を受けるフラグ<br />

OF、 SF、 ZF、 AF、 PF、 CF フ ラ グが結果に従 っ て設定 さ れる。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ・ フォ ルト 、 ネスト さ れた TLB フォルト 、<br />

データ TLB フォルト 、 代替データ TLB フォルト 、 データ・<br />

ペー ジ 不在フ ォ ルト 、 デー タ NaT ペー ジ参照アボー ト 、<br />

データ・キー・ミス・フォルト、データ・キー許可フォル<br />

ト 、 データ・ アク セス権フォ ルト 、 データ・ アク セス・<br />

ビッ ト ・ フォルト 、 データ・ ダーティ ・ ビッ ト ・ フォルト 。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:761


SUB—Subtract ( 続き )<br />

保護モード例外<br />

#GP(0) デステ ィ ネー シ ョ ンが書き込み不可能なセグメ ン ト にある<br />

場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:762 第 3 巻 : IA-32 基本命令リファレンス


TEST—Logical Compare<br />

オペコード 命令 説明<br />

A8 ib TEST AL,imm8 imm8 と AL との ADN をとり、結果に従って SF、ZF、PF を設定す<br />

る。<br />

A9 iw TEST AX,imm16 imm16 と AX との ADN をとり、結果に従って SF、ZF、PF を設定<br />

する。<br />

A9 id TEST EAX,imm32 imm32 と EAX との ADN をとり、結果に従って SF、ZF、PF を設定<br />

する。<br />

F6 /0 ib TEST r/m8,imm8 imm8 と r/m8 との ADN をとり、結果に従って SF、ZF、PF を設定<br />

する。<br />

F7 /0 iw TEST r/m16,imm16 imm16 と r/m16 との ADN をとり、結果に従って SF、ZF、PF を設<br />

定する。<br />

F7 /0 id TEST r/m32,imm32 imm32 と r/m32 との ADN をとり、結果に従って SF、ZF、PF を設<br />

定する。<br />

84 /r TEST r/m8,r8 r8 と r/m8 との ADN をとり、結果に従って SF、ZF、PF を設定す<br />

る。<br />

85 /r TEST r/m16,r16 r16 と r/m16 との ADN をとり、結果に従って SF、ZF、PF を設定す<br />

る。<br />

85 /r TEST r/m32,r32 r32 と r/m32 との ADN をとり、結果に従って SF、ZF、PF を設定す<br />

る。<br />

説明<br />

第 1 オペラン ド ( ソース1 オペラン ド ) と第2 オペラン ド ( ソース2 オペラン ド ) との間<br />

のビ ッ ト 単位の AND ( 論理積 ) 演算を実行し、 結果に従って SF、 ZF、 および PF ステー<br />

タ ス ・ フ ラ グを設定す る。 結果は、 その後捨て ら れる。<br />

操作<br />

TEMP ← SRC1 AND SRC2;<br />

SF ← MSB(TEMP);<br />

IF TEMP = 0<br />

THEN ZF ← 0;<br />

ELSE ZF ← 1;<br />

FI:<br />

PF ← BitwiseXNOR(TEMP[0:7]);<br />

CF ← 0;<br />

OF ← 0;<br />

(*AF is Undefined*)<br />

影響を受けるフラグ<br />

OF および CF フラグが0 にク リアされる。 SF、 ZF、 PF フ ラ グが結果に従っ て設定され<br />

る ( 上記の 「操作」 の項を参照 )。 AF フ ラ グの状態は未定義。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:763


TEST—Logical Compare ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:764 第 3 巻 : IA-32 基本命令リファレンス


UD2—Undefined Instruction<br />

オペコード 命令 説明<br />

0F 0B UD2 無効オペコード例外を発生させる。<br />

説明<br />

無効オペ コ ー ド を生成する。 こ の命令は、 無効オペ コ ー ド を明示的に生成してソ フ ト<br />

ウ ェアをテス ト するために提供されている。 この命令のオペコー ド は、 この目的のため<br />

に予約されている。<br />

無効オペコ ー ド例外を発生させる以外は、 この命令は NOP 命令 と 同じ である。<br />

操作<br />

IF Itanium System Environment THEN IA-32_Intercept(INST,0F0B);<br />

#UD (* Generates invalid opcode exception *);<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

IA-32_Intercept 強制命令イ ン タ ー セプ ト 。<br />

例外 ( すべての操作モード )<br />

#UD 命令は、 すべての動作モ ー ド で無効オペ コ ー ド 例外を発生<br />

させるこ とが保証されている。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:765


VERR, VERW—Verify a Segment for Reading or Writing<br />

オペコード 命令 説明<br />

0F 00 /4 VERR r/m16 r/m16 で指定されたセグメントを読み取りできる場合 ZF=1 を設定す<br />

る。<br />

0F 00 /5 VERW r/m16 r/m16 で指定されたセグメントに書き込みできる場合 ZF=1 を設定す<br />

る。<br />

説明<br />

ソース ・オペランドで指定されたコード ・セグメント またはデータ ・セグメントが現行<br />

特権レベル (CPL) から読み取り可能(VERR) または書き込み可能(VERW) であるかを検<br />

証する。 ソ ー ス ・ オペラ ン ド は、 検証するセグメン ト のセグメン ト ・ セレ ク タ を も つ 16<br />

ビッ トのレジスタまたはメモリ ・ロケーションである。 セグメントがアクセス可能で読<br />

み取り可能 (VERR) または書き込み可能(VERW) である場合は、 ZF フラグがセット され<br />

る。 そ うでない場合は、 ZF フラグがクリアされる。 コード ・セグメントが書き込み可能<br />

である と検証されない。 このチェ ッ クは、 システム ・ セグメン ト に行う こ と はできない。<br />

ZF フ ラグをセ ッ ト する には、 以下の条件が満た されていなければな ら ない。<br />

• セグメン ト ・ セレ ク タが NULL でない。<br />

• セレクタは、 ディスク リプタ ・ テーブル (GDT または LDT) の範囲内のデ ィ ス ク リ プ<br />

タを指定していなければならない。<br />

• セレクタは、 ( システム ・ セグメン ト またはゲー ト のディ スク リプタではな く ) コー<br />

ド ・セグメント またはデータ ・セグメントのディスク リプタを指定していなければ<br />

ならない。<br />

• VERR命令では、 セグメント は読み取り 可能でなければなら ない。 VERW 命令では、<br />

セグメ ン ト は 書き 込み可能なデー タ ・ セグメ ント でなければなら ない。<br />

• セグメントがコンフォーミング・コード ・セグメントでない場合は、 セグメントの<br />

DPL は、 CPL およびセグメン ト ・セレクタの RPL の両方以上 ( 以下の特権を も つ )<br />

でなければならない。<br />

こ の検証動作は、 セグ メ ン ト が DS、 ES、 FS、 または GS レジスタにロード され、 指定さ<br />

れたアク セス ( 読み取り ま たは書き込み ) が行われた場合 と同じである。 セレ ク タの値<br />

は保護例外を発生 さ せ る こ と はな く 、 ソ フ ト ウ ェ アは起 こ り 得る セグ メ ン ト ・ ア ク セス<br />

問題を前 も っ て処理で き る。<br />

操作<br />

IF SRC(Offset) > (GDTR(Limit) OR (LDTR(Limit))<br />

THEN<br />

ZF ← 0<br />

Read segment descriptor;<br />

IF SegmentDescriptor(DescriptorType) = 0 (* system segment *)<br />

OR (SegmentDescriptor(Type) ≠ conforming code segment)<br />

AND (CPL > DPL) OR (RPL > DPL)<br />

THEN<br />

ZF ← 0<br />

ELSE<br />

IF ((Instruction = VERR) AND (segment = readable))<br />

OR ((Instruction = VERW) AND (segment = writable))<br />

THEN<br />

ZF ← 1;<br />

FI;<br />

FI;<br />

3:766 第 3 巻 : IA-32 基本命令リファレンス


VERR, VERW—Verify a Segment for Reading or Writing ( 続き )<br />

影響を受けるフラグ<br />

ZF フラグは、 セグメントがアクセス可能で読み取り可能(VERR) または書き込み可能<br />

(VERW) である場合は 1 にセッ ト され、 そ うでない場合は 0 にク リアされる。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

保護モード例外<br />

こ れ ら の命令に対して生成される唯一の例外は、 ソ ー ス ・ オペラ ン ド の不当なア ド レ ス<br />

指定に関係す る例外である。<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 GS レジスタを使用してメモ リ がアクセス<br />

さ れ、 レ ジ ス タ の内容が NULL セグメン ト ・ セレク タで<br />

あった場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#UD VERR 命令お よ び VERW 命令は、 実ア ド レ ス ・ モー ド で<br />

は認識されない。<br />

仮想 8086 モード例外<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

#UD VERR 命令お よ び VERW 命令は、 仮想 8086 モー ドでは認<br />

識されない。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:767


WAIT/FWAIT—Wait<br />

オペコード 命令 説明<br />

9B WAIT 未処理のマスクされていない浮動小数点例外をチェックする。<br />

9B FWAIT 未処理のマスクされていない浮動小数点例外をチェックする。<br />

説明<br />

プ ロ セ ッ サは、 未処理のマス ク さ れていない浮動小数点例外がある かチ ェ ッ ク し、 あれ<br />

ば処理してから先に進む。 (FWAIT は、 WAIT の代替ニーモニ ッ クである。 )<br />

こ の命令は、 コ ー ド の重要な部分で例外を同期さ せる ために有用である。 浮動小数点命<br />

令の後に WAIT 命令を入れる と 、 こ の命令が発生さ せ る可能性があ る マス ク さ れていな<br />

い浮動小数点例外があれば、 プ ロ セ ッ サは それら を処理してか ら 命令の結果を修正で き<br />

ることが保証される。<br />

操作<br />

CheckPendingUnmaskedFloatingPointExceptions;<br />

FPU 影響を受けるフラグ<br />

C0、 C1、 C2、 および C3 フ ラ グは未定義。<br />

浮動小数点例外<br />

なし。<br />

保護モード例外<br />

#NM CR0 の MP および TS がセ ッ ト さ れた場合。<br />

実アドレス・モード例外<br />

#NM CR0 の MP および TS がセ ッ ト さ れた場合。<br />

仮想 8086 モード例外<br />

#NM CR0 の MP および TS がセ ッ ト さ れた場合。<br />

3:768 第 3 巻 : IA-32 基本命令リファレンス


WBINVD—Write Back and Invalidate Cache<br />

オペコード 命令 説明<br />

0F 09 WBINVD ライトバックして内部キャッシュをフラッシュする。外部キャッ<br />

シュのライトバックとフラッシュを開始させる。<br />

説明<br />

プ ロ セ ッ サの内部キ ャ ッ シ ュ で修正 さ れている すべてのキ ャ ッ シ ュ ・ ラ イ ン を メ イ ン ・<br />

メ モ リ に ラ イ ト バ ッ ク し、 内部キ ャ ッ シ ュ を無効化 ( フラッシュ ) する。 その後、 外部<br />

キ ャ ッ シ ュ に も 、 修正されている デー タ を ラ イ ト バ ッ ク する よ う 指示する特殊機能バ<br />

ス・サイクルを発行する。<br />

この命令を実行した後、 プロセッサは、 外部キャッシュのライ トバック操作とフラッ<br />

シ ュ操作の完了を待たずに、 命令の実行を継続する。 キ ャ ッ シ ュ ・ ラ イ ト バ ッ ク信号お<br />

よびキャッシュ ・フラッシュ信号に応答することは、 ハードウェアによって行う。<br />

WBINVD 命令は特権命令である。 プロセ ッ サが保護モー ド で動作している場合は、 この<br />

命令を実行するには、 プログラムまたはプロシージャの CPL が 0 でなければならない。<br />

こ の命令は シ リ アル化命令で も ある。<br />

メイン ・ メモ リ とのキャ ッ シュ ・ コ ヒ ー レンシが重要でない場合は、 ソフ ト ウ ェアは<br />

INVD 命令を使用で き る。<br />

操作<br />

IF Itanium System Environment THEN IA-32_Intercept(INST,WBINVD);<br />

WriteBack(InternalCaches);<br />

Flush(InternalCaches);<br />

SignalWriteBack(ExternalCaches);<br />

SignalFlush(ExternalCaches);<br />

Continue (* Continue execution);<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

IA-32_Intercept 強制命令イ ン タ ー セプ ト 。<br />

保護モード例外<br />

#GP(0) 現行特権レベルが 0 でない場合。<br />

実アドレス・モード例外<br />

なし。<br />

仮想 8086 モード例外<br />

#GP(0) WBINVD 命令は仮想 8086 モー ドで実行するこ とはできな<br />

い。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:769


WBINVD—Write Back and Invalidate Cache ( 続き )<br />

インテル・アーキテクチャにおける互換性<br />

WDINVD 命令はプ ロ セ ッ サに依存し、 その機能は将来の イ ン テル ・ アー キ テ ク チ ャ ・ プ<br />

ロ セ ッ サでは異な っ てサポ ー ト さ れる可能性 も ある。 こ の命令は、 Intel486 プロセッサよ<br />

り以前のインテル ・ アーキテクチャ ・ プロセッサではサポー ト されていない。<br />

3:770 第 3 巻 : IA-32 基本命令リファレンス


WRMSR—Write to Model Specific Register<br />

オペコード 命令 説明<br />

0F 30 WRMSR EDX:EAX の値を ECX で指定される MSR に書き込む。<br />

説明<br />

レジスタ EDX:EAX の内容を ECX レジスタで指定された64 ビッ トのモデル固有レジス<br />

タ (MSR) に書き込む。 上位 32 ビッ トがEDX か ら コ ピ ー さ れ、 下位 32 ビットがEAX か<br />

らコピーされる。 MSR の未定義ビ ッ ト ま たは予約ビ ッ ト は、 常に以前に読み取 ら れてい<br />

る値に設定される。<br />

WRMSR 命令は、 特権レベル 0 または実アドレス ・モー ドで実行しなければならない。<br />

そ う しない と 、 一般保護例外 #GP(0) が生成される。 予約されているかまたは定義されて<br />

いない MSR アドレスをECX に指定して も 、 一般保護例外が生成 さ れる。<br />

WRMSR 命令を使用して MTRR に書き込む と、 グロ ーバル ・ エン ト リ を含めて TLB が<br />

無効化 さ れる。 詳細は 『IA-32 インテル ® アーキテクチャ ・ ソフ ト ウェア ・ ディベロッ<br />

パーズ ・ マニュアル、 下巻』 第3 章を参照のこ と。<br />

MSR は、 テ ス ト 機能、 実行 ト レ ー ス、 性能モニ タ リ ン グ、 マシ ン ・ チ ェ ッ ク ・ エ ラ ー の<br />

機能を制御す る。 こ の命令で書き込みがで き る すべての MSR と、 各MSR のア ド レスに<br />

ついては、 モデル固有命令を参照の こ と 。<br />

WRMSR 命令は シ リ アル化命令であ る。<br />

この命令を使用する前に、 CPUID 命令を使用して MSR がサポー ト されている<br />

(EDX[5]=1) かど う かを確認する必要がある。<br />

操作<br />

IF Itanium System Environment THEN IA-32_Intercept(INST,WRMSR);<br />

MSR[ECX] ← EDX:EAX;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

IA-32_Intercept 強制命令イ ン タ ー セプ ト 。<br />

保護モード例外<br />

#GP(0) 現行特権レベルが 0 でない場合。<br />

ECX の値が予約されているかまたは定義されていない<br />

MSR アドレスを指定している場合。<br />

実アドレス・モード例外<br />

#GP 現行特権レベルが 0 でない場合。<br />

ECX の値が予約されているかまたは定義されていない<br />

MSR アドレスを指定している場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:771


WRMSR—Write to Model Specific Register ( 続き )<br />

仮想 8086 モード例外<br />

#GP(0) WRMSR 命令は仮想 8086 モー ドでは認識されない。<br />

インテル・アーキテクチャにおける互換性<br />

MSR 命令お よ び WRMSR 命令でそれ ら を読み取る機能は、 Pentium プロセッサで<br />

インテル ・ アーキテクチャに導入された。 Pentium プロセッサよ り以前のインテル ・ アー<br />

キテ ク チ ャ ・ プ ロ セ ッ サで こ の命令を実行する と 、 無効オペ コ ー ド 例外 #UD が生成され<br />

る。<br />

3:772 第 3 巻 : IA-32 基本命令リファレンス


XADD—Exchange and Add<br />

オペコード 命令 説明<br />

0F C0/r XADD r/m8,r8 r8 を r/m8 と交換し、合計を r/m8 にロードする。<br />

0F C1/r XADD r/m16,r16 r16 を r/m16 と交換し、合計を r/m16 にロードする。<br />

0F C1/r XADD r/m32,r32 r32 を r/m32 と交換し、合計を r/m32 にロードする。<br />

説明<br />

第 1 オペラン ド ( デステ ィ ネーシ ョ ン ・ オペラン ド ) を第 2 オペラン ド ( ソース ・ オペラ<br />

ンド ) と交換し、 次に 2 つの値の合計をデス テ ィ ネ ー シ ョ ン ・ オペラ ン ド に ロ ー ド す る。<br />

デスティネーション ・ オペランドには、 レジスタまたはメモリ ・ ロケーションを使用で<br />

きる。 ソース・オペランドは、 レジスタである。<br />

この命令は、 LOCK プリフィックスとともに使用することができる。<br />

操作<br />

IF Itanium System Environment AND External_Bus_Lock_Required AND DCR.lc<br />

THEN IA-32_Intercept(LOCK,XADD);<br />

TEMP ← SRC + DEST<br />

SRC ← DEST<br />

DEST ← TEMP<br />

影響を受けるフラグ<br />

CF、 PF、 AF、 SF、 ZF、 OF フラグが、 デスティネーションにストアされる結果に従って<br />

設定 さ れる。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

IA-32_Intercept ロック・インターセプト - DCR.lc が 1 であ り 、 こ の操作を<br />

完了するために外部ア ト ミ ッ ク ・ バス ・ ロ ッ ク が必要であ<br />

る場合は、 ア ト ミ ッ ク ・ ト ランザクシ ョ ンは発生せず、 こ<br />

の命令は失敗し、 IA-32_Intercept(Lock) フォルトが発生す<br />

る。 ソフ ト ウェア ・ ロ ッ ク ・ ハン ド ラが、 この命令をエ<br />

ミュレートする責任を負う。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:773


XADD—Exchange and Add ( 続き )<br />

保護モード例外<br />

#GP(0) デステ ィ ネー シ ョ ンが書き込み不可能なセグメ ン ト にある<br />

場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

インテル・アーキテクチャにおける互換性<br />

Intel486 プロセッサよ り以前のインテル ・アーキテクチャ ・ プロセッサは、 この命令を認<br />

識しない。 こ の命令を使用す る場合は、 以前のプ ロ セ ッ サ上で実行する同等の コ ー ド ・<br />

シーケンスを備えなければならない。<br />

3:774 第 3 巻 : IA-32 基本命令リファレンス


XCHG—Exchange Register/Memory with Register<br />

オペコード 命令 説明<br />

90+rw XCHG AX,r16 r16 を AX と交換する。<br />

90+rw XCHG r16,AX r16 を AX と交換する。<br />

90+rd XCHG EAX,r32 r32 を EAX と交換する。<br />

90+rd XCHG r32,EAX r32 を EAX と交換する。<br />

86 /r XCHG r/m8,r8 EA バイトをバイト・レジスタと交換する。<br />

86 /r XCHG r8,r/m8 EA バイトをバイト・レジスタと交換する。<br />

87 /r XCHG r/m16,r16 EA ワードを r16 と交換する。<br />

87 /r XCHG r16,r/m16 EA ワードを r16 と交換する。<br />

87 /r XCHG r/m32,r32 EA ダブルワードを r32 と交換する。<br />

87 /r XCHG r32,r/m32 EA ダブルワードを r32 と交換する。<br />

説明<br />

デステ ィ ネーシ ョ ン ・ オペラン ド ( 第 1 オペラン ド ) の内容を ソ ース ・ オペラ ン ド ( 第 2<br />

オペラン ド ) の内容 と 交換する。 オペラ ン ド には、 2 個の汎用レ ジ ス タ ま たは 1 つのレジ<br />

スタと 1 つのメモ リ ・ ロケーシ ョ ンを使用でき る。 オペラン ド が 2 つと もレジスタであ<br />

る場合は、 いずれか 1 つのレジスタは EAX レジスタまたは AX レジスタでなければなら<br />

ない。 メモ リ ・ オペラン ド が参照される場合は、 LOCK プリフィックスの有無やIOPL<br />

の値に関係な く 、 交換操作の実行中は自動的に LOCK# 信号がアサー ト さ れる。<br />

この命令は、 プロセスを同期するためのセマフ ォ または同様のデー タ構造体のインプ リ<br />

メンテーションに有用である。 ( バス ・ ロ ッ キングの詳細は、 『IA-32 インテル ® アーキテ<br />

ク チ ャ ・ ソ フ ト ウ ェ ア ・ デ ィ ベロ ッ パ ー ズ ・ マニ ュ アル、 下巻』 の第 8 章 「プロセッサ<br />

の管理 と 初期化」 を参照のこ と。 )<br />

XCHG 命令は、 16 ビッ ト ・オペランドではBSWAP 命令の代わ り に使用する こ と も で き<br />

る。<br />

操作<br />

IF Itanium System Environment AND External_Atomic_Lock_Required AND DCR.lc<br />

THEN IA-32_Intercept(LOCK,XCHG);<br />

TEMP ← DEST<br />

DEST ← SRC<br />

SRC ← TEMP<br />

影響を受けるフラグ<br />

なし。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:775


XCHG—Exchange Register/Memory with Register ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

IA-32_Intercept ロック・インターセプト - DCR.lc が 1 であ り 、 こ の操作を<br />

完了するために外部ア ト ミ ッ ク ・ バス ・ ロ ッ ク が必要であ<br />

る場合は、 ア ト ミ ッ ク ・ ト ランザクシ ョ ンは発生せず、 こ<br />

の命令は失敗し、 IA-32_Intercept(Lock) フォルトが発生す<br />

る。 ソフ ト ウェア ・ ロ ッ ク ・ ハン ド ラが、 この命令をエ<br />

ミュレートする責任を負う。<br />

保護モード例外<br />

#GP(0) いずれかのオペラン ド が書き込み不可能なセグメン ト にあ<br />

る場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ・フォル ト、ネス ト された TLB フォルト、デー<br />

タ TLB フォルト、代替データTLB フォルト、データ・ペー<br />

ジ不在フ ォル ト、 データ NaT ページ参照アボー ト、 デー<br />

タ・キー・ミス・フォルト、 データ・キー許可フォルト、<br />

データ ・アクセス権フォルト、 データ ・アクセス・ ビッ ト ・<br />

フォルト、 データ・ダーティ ・ビット ・フォルト。<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:776 第 3 巻 : IA-32 基本命令リファレンス


XLAT/XLATB—Table Look-up Translation<br />

オペコード 命令 説明<br />

D7 XLAT m8 AL をメモリ・バイト DS:[(E)BX+ 符号なし AL] に設定する。<br />

D7 XLATB AL をメモリ・バイト DS:[(E)BX+ 符号なし AL] に設定する。<br />

説明<br />

AL レジスタの内容をテーブル ・ インデックスとして使用して、 メモリ内のテーブルのバ<br />

イト ・エントリの位置を探し、 テーブル・エント リの内容をAL レジスタにコピーし直<br />

す。 AL レ ジスタのイ ンデ ッ ク スは、 符号なし整数 と して取り扱われる。 XLAT 命令 と<br />

XLATB 命令は、 メモリ内のテーブルのベース ・ アド レスを、 DS:EBX レジスタから ( ア<br />

ドレス・サイズ属性が16 ビッ トの場合はDS:BX レジスタから ) 取得す る。 XLAT 命令<br />

は、 セグメント ・ オーバライドを使用して、 異なるセグメント ・ レジスタを指定できる。<br />

ど ち ら の命令を使用して も 、 アセンブル時に は同じ マシ ン ・ コ ー ド が生成される。<br />

操作<br />

IF AddressSize = 16<br />

THEN<br />

AL ← (DS:BX + ZeroExtend(AL))<br />

ELSE (* AddressSize = 32 *)<br />

AL ← (DS:EBX + ZeroExtend(AL));<br />

FI;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ・ フォ ルト 、 ネスト さ れた TLB フォルト 、<br />

データ TLB フォルト 、 代替データ TLB フォルト 、 データ・<br />

ペー ジ 不在フ ォ ルト 、 デー タ NaT ペー ジ参照アボー ト 、<br />

データ・キー・ミス・フォルト、データ・キー許可フォル<br />

ト 、 データ・ アク セス権フォ ルト 、 データ・ アク セス・<br />

ビッ ト ・ フォルト 、 データ・ ダーティ ・ ビッ ト ・ フォルト 。<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:777


XLAT/XLATB—Table Look-up Translation ( 続き )<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:778 第 3 巻 : IA-32 基本命令リファレンス


XOR—Logical Exclusive OR<br />

オペコード 命令 説明<br />

34 ib XOR AL,imm8 AL と imm8 との XOR をとる。<br />

35 iw XOR AX,imm16 AX と imm16 との XOR をとる。<br />

35 id XOR EAX,imm32 EAX と imm32 との XOR をとる。<br />

80 /6 ib XOR r/m8,imm8 r/m8 と imm8 との XOR をとる。<br />

81 /6 iw XOR r/m16,imm16 r/m16 と imm16 との XOR をとる。<br />

81 /6 id XOR r/m32,imm32 r/m32 と imm32 との XOR をとる。<br />

83 /6 ib XOR r/m16,imm8 r/m16 と imm8( 符号拡張 ) との XOR をとる。<br />

83 /6 ib XOR r/m32,imm8 r/m32 と imm8( 符号拡張 ) との XOR をとる。<br />

30 /r XOR r/m8,r8 r/m8 と r8 との XOR をとる。<br />

31 /r XOR r/m16,r16 r/m16 と r16 との XOR をとる。<br />

31 /r XOR r/m32,r32 r/m32 と r32 との XOR をとる。<br />

32 /r XOR r8,r/m8 r8 と r/m8 との XOR をとる。<br />

33 /r XOR r16,r/m16 r16 と r/m16 との XOR をとる。<br />

33 /r XOR r32,r/m32 r32 と r/m32 との XOR をとる。<br />

説明<br />

デステ ィ ネーシ ョ ン ・ オペラン ド ( 第 1 オペラン ド ) とソース・オペランド ( 第 2 オペラ<br />

ンド ) と の間のビ ッ ト 単位の XOR( 排他的論理和 ) 演算を実行し、 結果をデス テ ィ ネ ー<br />

ション ・ オペランド ・ ロケーションにス トアする。 ソース ・ オペランドには、 即値、 レ<br />

ジ ス タ、 ま たは メ モ リ ・ ロ ケ ー シ ョ ン を使用で き る。 デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド<br />

には、 レジスタまたはメモリ ・ ロケーショ ンを使用できる。<br />

操作<br />

DEST ← DEST XOR SRC;<br />

影響を受けるフラグ<br />

OF および CF フラグがクリアされる。 SF、 ZF、 PF フ ラ グが結果に従 っ て設定 さ れる。<br />

AF フ ラ グの状態は未定義。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

第 3 巻 : IA-32 基本命令リファレンス 3:779


XOR—Logical Exclusive OR ( 続き )<br />

保護モード例外<br />

#GP(0) デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド の指示先が書き込み不可<br />

能なセグ メ ン ト の場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタの内容がNULL セグメ<br />

ン ト ・ セ レ ク タ の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

仮想 8086 モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:780 第 3 巻 : IA-32 基本命令リファレンス


IA-32 MMX ® テクノロジ命令リファレンス 2<br />

本章では、高度のマルチ メ デ ィ ア性能を必要 と す る アプ リ ケ ー シ ョ ンのパ フ ォ ー マン ス を<br />

強化す る ために設計 さ れた、 IA-32 MMX テクノロジ命令について説明する。<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:781


EMMS—Empty MMX State<br />

オペコード 命令 説明<br />

0F 77 EMMS FP タグ・ワードを空に設定する。<br />

説明<br />

FPU タグ ・ ワー ド内のすべてのタグの値を空( すべて 1) に設定する。 こ の操作の結果、<br />

MMX レ ジ ス タ は使用可能 と マ ー ク さ れ、 したが っ て以降は浮動小数点命令で使用で き<br />

る。 (FPU タグ ・ ワー ドのフォーマッ ト については、 『IA-32 インテル ® アーキテクチャ ・<br />

ソフ ト ウェア・ディベロッパーズ・マニュアル、 上巻』 の図7-11 を参照のこ と。 ) その<br />

他の (EMMS 命令以外の ) すべての MMX 命令は、 FPU タグ ・ ワー ド内のすべてのタグ<br />

を有効 ( すべて 0) に設定する。<br />

浮動小数点命令を実行する可能性がある他のプ ロ シ ー ジ ャ ま たはサブルー チン を コ ー ル<br />

する前には、 すべての MMX テクノロジ ・ルーチンの終わりでEMMS 命令を使用して<br />

MMX テクノロジの状態をクリアしなければならない。 FPU タグ ・ ワー ドが EMMS 命令<br />

に よ っ て リ セ ッ ト さ れる前に浮動小数点命令が FPU レジスタ ・ スタックのレジスタの1<br />

つに値を ロ ー ド した場合は、 浮動小数点ス タ ッ ク ・ オ ーバフ ロ ー が発生す る可能性があ<br />

り 、 その結果、 浮動小数点例外が発生した り 、 誤 っ た結果が生じ る こ と にな る。<br />

操作<br />

FPUTagWord ← FFFFH;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ® ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

保護モード例外<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

実アドレス・モード例外<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

3:782 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス


MOVD—Move 32 Bits<br />

オペコード 命令 説明<br />

0F 6E /r MOVD mm, r/m32 ダブルワードを r/m32 から mm に転送する。<br />

0F 7E /r MOVD r/m32, mm ダブルワードを mm から r/m32 に転送する。<br />

説明<br />

ダブルワー ド をソース ・ オペラン ド ( 第 2 オペラン ド ) からデスティネーション ・ オペ<br />

ランド ( 第 1 オペラン ド ) にコピーする。 ソース ・ オペランド とデスティネーション ・<br />

オペラン ド には、 MMX テクノロジ ・ レジスタ、 メモリ ・ ロケーション、 または 32 ビッ<br />

ト汎用レジスタを使用できるが、 MMX テクノロジ ・ レジスタから別のMMX テクノロ<br />

ジ・レジスタに、 1 つのメモリ ・ロケーションから別のメモリ ・ロケーションに、 また<br />

は 1 つの汎用レジスタから別の汎用レジスタにデータを転送できない。<br />

デステ ィ ネーシ ョ ン ・ オペラン ドが MMX テクノロジ ・ レジスタであるときは、 32 ビッ<br />

トのソース値は、 64 ビッ ト MMX テクノロジ ・ レジスタの下位32 ビッ トに書き込まれ、<br />

64 ビ ッ ト にゼ ロ拡張 さ れる ( 図 2-1 を参照 )。 ソース ・ オペラン ドが MMX テクノロジ ・<br />

レジスタであるときは、 MMX テクノロジ ・ レジスタの下位32 ビッ トが、 デスティネー<br />

ション・オペランドで選択される32 ビッ ト汎用レジスタまたは32 ビッ トのメモリ ・ロ<br />

ケーションに書き込まれる。<br />

図 2-1. MOVD 命令の動作<br />

操作<br />

IF DEST is MMX register<br />

THEN<br />

DEST ← ZeroExtend(SRC);<br />

ELSE (* SRC is MMX register *)<br />

DEST ← LowOrderDoubleword(SRC);<br />

影響を受けるフラグ<br />

なし。<br />

MOVD m32, mm<br />

63 32 31 0<br />

xxxxxxxx<br />

MOVD mm, r32<br />

mm<br />

b3 b2<br />

31 0<br />

b3 b2 b1 b0 r32<br />

3006010<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:783<br />

b1 b0<br />

15 0<br />

b3 b2 WN+1<br />

b1 b0 WN+1 m32<br />

63 32 31 0<br />

00000000 b3 b2 b1 b0<br />

mm


MOVD—Move 32 Bits ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

保護モード例外<br />

#GP(0) デステ ィ ネー シ ョ ン ・ オペラ ン ド が書き込み不可能なセグ<br />

メント にある場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

3:784 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス


MOVD—Move 32 Bits ( 続き )<br />

仮想 8086 モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:785


MOVQ—Move 64 Bits<br />

オペコード 命令 説明<br />

0F 6F /r MOVQ mm, mm/m64 クワッドワードを mm/m64 から mm に転送する。<br />

0F 7F /r MOVQ mm/m64, mm クワッドワードを mm から mm/m64 に転送する。<br />

説明<br />

この命令は、 クワッ ドワー ドをソース ・ オペランド ( 第 2 オペラン ド ) からデスティ<br />

ネーション ・ オペランド ( 第 1 オペラン ド ) にコピーする ( 図 2-2 を参照 )。 ソース ・ オ<br />

ペランドまたはデスティネーション・オペランドには、 MMX テクノロジ ・ レジスタま<br />

たはメモ リ ・ ロケーシ ョ ンを使用できるが、 1 つのメモ リ ・ ロケーシ ョ ンから別のメモ<br />

リ・ロケーションにデータを転送できない。1 つの MMX テクノロジ ・ レジスタから別<br />

の MMX テクノロジ ・ レジスタにはデータを転送できる。<br />

図 2-2. MOVQ 命令の動作<br />

操作<br />

DEST ← SRC;<br />

影響を受けるフラグ<br />

なし。<br />

MOVQ mm, m64<br />

15 0<br />

b7 b6<br />

b5 b4<br />

b3 b2<br />

b1 b0<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

WN+3<br />

WN+2<br />

WN+1<br />

WN+0<br />

3006013<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

3:786 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス<br />

m64<br />

63 48 47 32 31 16 15 0<br />

b7 b6 b5 b4 b3 b2 b1 b0<br />

mm


MOVQ—Move 64 Bits ( 続き )<br />

保護モード例外<br />

#GP(0) デステ ィ ネー シ ョ ン ・ オペラ ン ド が書き込み不可能なセグ<br />

メント にある場合。<br />

メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:787


PACKSSWB/PACKSSDW—Pack with Signed Saturation<br />

オペコード 命令 説明<br />

0F 63 /r PACKSSWB mm, mm/m64 mm からの符号付き 4 ワードと mm/m64 からの符号付き 4<br />

ワードを mm の符号付き 8 バイトにパックして飽和させる。<br />

0F 6B /r PACKSSDW mm, mm/m64 mm からの符号付き 2 ダブルワードと mm/m64 からの符号<br />

付き 2 ダブルワードを mm の符号付き 4 ワードにパックし<br />

て飽和させる。<br />

説明<br />

符号付き ワ ー ド をバイ ト に (PACKSSWB)、 または符号付きダブルワードをワードに<br />

(PACKSSDW) にパッ クして飽和させる。 PACKSSWB 命令は、 デステ ィ ネ ー シ ョ ン ・ オ<br />

ペラン ド ( 第 1 オペラン ド ) か ら の符号付き 4 ワード とソース ・ オペランド ( 第 2 オペラ<br />

ンド ) からの符号付き 4 ワードをデスティネーション・オペランドの符号付き 8 バイ ト<br />

にパ ッ ク する。 ワ ー ド の符号付き値が符号付き バイ ト の範囲を超え る場合 ( すなわち、<br />

7FH より大きいかまたは80H より小さい場合) は、 それぞれ 7FH または 80H の飽和され<br />

たバイ ト 値がデステ ィ ネーシ ョ ンにス ト アされる。<br />

PACKSSDW 命令は、 デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド ( 第 1 オペラン ド ) からの符号付<br />

き 2 ダブルワー ド と ソース ・ オペラン ド ( 第 2 オペラン ド ) からの符号付き 2 ダブル<br />

ワ ー ド をデス テ ィ ネ ー シ ョ ン ・ オペラ ン ド の符号付き 4 ワードにパックする ( 図 2-3 を<br />

参照 )。 ダブルワ ー ド の符号付き値が符号付き ワ ー ド の範囲を超え る場合 ( すなわち、<br />

7FFFH より大きいかまたは8000H より小さい場合) は、 それぞれ 7FFFH または 8000H<br />

の飽和されたワード値がデスティネーションにストアされる。<br />

PACKSSWB 命令 ま たは PACKSSDW 命令のデスティネーション・オペランドは、 MMX<br />

テクノロジ ・ レジスタでなければならない。 ソース・オペランドには、 MMX テクノロ<br />

ジ・レジスタまたはクワッドワード・メモリ・ロケーションを使用できる。<br />

図 2-3. PACKSSDW 命令の動作<br />

PACKSSDW mm, mm/m64<br />

mm/m64<br />

D C B A<br />

D’ C’ B’ A’<br />

3:788 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス<br />

mm<br />

mm


PACKSSWB/PACKSSDW—Pack with Signed Saturation ( 続き )<br />

操作<br />

IF instruction is PACKSSWB<br />

THEN<br />

DEST(7..0) ← SaturateSignedWordToSignedByte DEST(15..0);<br />

DEST(15..8) ← SaturateSignedWordToSignedByte DEST(31..16);<br />

DEST(23..16) ← SaturateSignedWordToSignedByte DEST(47..32);<br />

DEST(31..24) ← SaturateSignedWordToSignedByte DEST(63..48);<br />

DEST(39..32) ← SaturateSignedWordToSignedByte SRC(15..0);<br />

DEST(47..40) ← SaturateSignedWordToSignedByte SRC(31..16);<br />

DEST(55..48) ← SaturateSignedWordToSignedByte SRC(47..32);<br />

DEST(63..56) ← SaturateSignedWordToSignedByte SRC(63..48);<br />

ELSE (* instruction is PACKSSDW *)<br />

DEST(15..0) ← SaturateSignedDoublewordToSignedWord DEST(31..0);<br />

DEST(31..16) ← SaturateSignedDoublewordToSignedWord DEST(63..32);<br />

DEST(47..32) ← SaturateSignedDoublewordToSignedWord SRC(31..0);<br />

DEST(63..48) ← SaturateSignedDoublewordToSignedWord SRC(63..32);<br />

FI;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:789


PACKSSWB/PACKSSDW—Pack with Signed Saturation ( 続き )<br />

実アドレス・モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:790 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス


PACKUSWB—Pack with Unsigned Saturation<br />

オペコード 命令 説明<br />

0F 67 /r PACKUSWB mm, mm/m64 mm からの符号付き 4 ワードと mm/m64 からの符号付き 4<br />

ワードを mm の符号なし 8 バイトにパックして飽和させる。<br />

説明<br />

デステ ィ ネーシ ョ ン ・ オペラン ド ( 第 1 オペラン ド ) からの符号付き 4 ワード とソース・<br />

オペラン ド ( 第 2 オペラン ド ) か ら の符号付き 4 ワードをデスティネーション ・オペラ<br />

ンドの符号なし8バイ ト にパッ クして飽和させる。 ワー ドの符号付き値が符号なしバイ<br />

ト の範囲を超え る場合 ( すなわち、 FFH より大きいかまたは00H より小さい場合) は、<br />

それぞれ FFH または 00H の飽和されたバイト値がデスティネーションにストアされる<br />

( 図 2-4 を参照 )。<br />

デステ ィ ネーシ ョ ン ・ オペラン ド は、 MMX テクノロジ ・ レジスタでなければならない。<br />

ソース ・オペランドには、 MMX テクノロジ ・ レジスタまたはクワッ ドワード ・ メモリ ・<br />

ロケーションを使用できる。<br />

図 2-4. PACKUSWB 命令の動作<br />

操作<br />

DEST(7..0) ← SaturateSignedWordToUnsignedByte DEST(15..0);<br />

DEST(15..8) ← SaturateSignedWordToUnsignedByte DEST(31..16);<br />

DEST(23..16) ← SaturateSignedWordToUnsignedByte DEST(47..32);<br />

DEST(31..24) ← SaturateSignedWordToUnsignedByte DEST(63..48);<br />

DEST(39..32) ← SaturateSignedWordToUnsignedByte SRC(15..0);<br />

DEST(47..40) ← SaturateSignedWordToUnsignedByte SRC(31..16);<br />

DEST(55..48) ← SaturateSignedWordToUnsignedByte SRC(47..32);<br />

DEST(63..56) ← SaturateSignedWordToUnsignedByte SRC(63..48);<br />

影響を受けるフラグ<br />

なし。<br />

PACKUSWB mm, mm/m64<br />

mm/m64<br />

H G F E D C B A<br />

H’ G’ F’ E’ D’ C’ B’ A’<br />

mm<br />

3006014<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:791<br />

mm


PACKUSWB—Pack with Unsigned Saturation ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:792 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス


PADDB/PADDW/PADDD—Packed Add<br />

オペコード 命令 説明<br />

0F FC /r PADDB mm, mm/m64 mm/m64 からのパックド・バイトを mm のパックド・バイ<br />

トに加算する。<br />

0F FD /r PADDW mm, mm/m64 mm/m64 からのパックド・ワードを mm のパックド・ワー<br />

ドに加算する。<br />

0F FE /r PADDD mm, mm/m64 mm/m64 からのパックド・ダブルワードを mm のパックド・<br />

ダブルワードに加算する。<br />

説明<br />

ソース ・オペランド ( 第 2 オペラン ド ) の個別のパ ッ ク ド ・ デー タ要素 ( バイ ト、 ワー<br />

ド、 またはダブルワード ) をデスティネーション・オペランド ( 第 1 オペラン ド ) の個別<br />

のパッ ク ド ・ データ要素に加算する ( 図 2-5 を参照 )。 個別の加算結果が指定されたデー<br />

タ型の範囲を超える と ( オーバフロー )、 結果はラップアラウンドされる。 これは、結果<br />

の下位ビ ッ ト だけが返される ( すなわち、 キ ャ リ ー が無視 さ れる ) ように、 結果が切り<br />

詰められる こ と を意味している。<br />

デステ ィ ネーシ ョ ン ・ オペラン ド は、 MMX テクノロジ ・ レジスタでなければならない。<br />

ソース ・オペランドには、 MMX テクノロジ ・ レジスタまたはクワッ ドワード ・ メモリ ・<br />

ロケーションを使用できる。<br />

図 2-5. PADDW 命令の動作<br />

mm<br />

mm/m64<br />

mm<br />

PADDW mm, mm/m64<br />

+<br />

1000000000000000 0111111100111000<br />

1111111111111111 0001011100000111<br />

0111111111111111 1001011000111111<br />

3006015<br />

PADDB 命令は、 ソース・オペランドのバイトをデスティネーション・オペレーションの<br />

バイ ト に加算し、 結果をデス テ ィ ネ ー シ ョ ン ・ オペラ ン ド にス ト アする。 個別の結果が<br />

8 ビ ッ ト で表現す る に は大き すぎ る と き は、 結果の下位 8 ビッ トがデスティネーション・<br />

オペラン ド に書き込まれるため、 結果はラ ップアラウン ド する。<br />

PADDW 命令は、 ソース・オペランドのワードをデスティネーション・オペランドの<br />

ワ ー ド に加算し、 結果をデス テ ィ ネ ー シ ョ ン ・ オペラ ン ド にス ト アする。 個別の結果が<br />

16 ビ ッ ト で表現する には大き すぎ る と き は、 結果の下位 16 ビッ トがデスティネーショ<br />

ン・オペランドに書き込まれるため、 結果はラップアラウンドする。<br />

PADDD 命令は、 ソース ・ オペランドのダブルワードをデスティネーション ・ オペラン<br />

ドのダブルワードに加算し、 結果をデスティネーション・オペランドにストアする。 個<br />

別の結果が 32 ビ ッ ト で表現す る に は大き すぎ る と き は、 結果の下位 32 ビットがデス<br />

ティネーション・オペランドに書き込まれるため、 結果はラップアラウンドする。<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:793<br />

+<br />

+<br />

+


PADDB/PADDW/PADDD—Packed Add ( 続き )<br />

整数の ADD 命令 と 同様に、 PADDB、 PADDW、 PADDD 命令は、 符号なしまたは符号付<br />

き (2 の補数表記 ) のパ ッ ク ド 整数を操作で き る こ と に注意す る。 整数命令 と は異な り 、<br />

どの MMX 命令 も EFLAGS レジスタに影響を与えない。 MMX 命令では、 オーバフロー<br />

が発生したことを示すキャリー ・ フラグまたはオーバフロー ・ フラグがないため、 ソフ<br />

ト ウ ェアは、 値の範囲を制御するか、 ま たは 「飽和付き」 MMX 命令を使用しなければ<br />

ならない。<br />

操作<br />

IF instruction is PADDB<br />

THEN<br />

DEST(7..0) ← DEST(7..0) + SRC(7..0);<br />

DEST(15..8) ← DEST(15..8) + SRC(15..8);<br />

DEST(23..16) ← DEST(23..16)+ SRC(23..16);<br />

DEST(31..24) ← DEST(31..24) + SRC(31..24);<br />

DEST(39..32) ← DEST(39..32) + SRC(39..32);<br />

DEST(47..40) ← DEST(47..40)+ SRC(47..40);<br />

DEST(55..48) ← DEST(55..48) + SRC(55..48);<br />

DEST(63..56) ← DEST(63..56) + SRC(63..56);<br />

ELSEIF instruction is PADDW<br />

THEN<br />

DEST(15..0) ← DEST(15..0) + SRC(15..0);<br />

DEST(31..16) ← DEST(31..16) + SRC(31..16);<br />

DEST(47..32) ← DEST(47..32) + SRC(47..32);<br />

DEST(63..48) ← DEST(63..48) + SRC(63..48);<br />

ELSE (* instruction is PADDD *)<br />

DEST(31..0) ← DEST(31..0) + SRC(31..0);<br />

DEST(63..32) ← DEST(63..32) + SRC(63..32);<br />

FI;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

3:794 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス


PADDB/PADDW/PADDD—Packed Add ( 続き )<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:795


PADDSB/PADDSW—Packed Add with Saturation<br />

オペコード 命令 説明<br />

0F EC /r PADDSB mm, mm/m64 mm/m64 からの符号付きパックド・バイトを mm の符号付<br />

きパックド・バイトに加算して飽和させる。<br />

0F ED /r PADDSW mm, mm/m64 mm/m64 からの符号付きパックド・ワードを mm の符号付<br />

きパックド・ワードに加算して飽和させる。<br />

説明<br />

ソース ・オペランド ( 第 2 オペラン ド ) の個別のパ ッ ク ド 符号付き デー タ要素 ( バイ ト ま<br />

たはワー ド ) をデスティネーション・オペランド ( 第 1 オペラン ド ) の個別のパ ッ ク ド 符<br />

号付き デ ー タ要素に加算す る ( 図 2-6 を参照 )。 個別の加算結果が指定されたデー タ型の<br />

範囲を超え る と 、 結果は飽和 さ れる。 デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド は、 MMX テク<br />

ノロジ・レジスタでなければならない。 ソース・オペランドには、 MMX テクノロジ ・<br />

レジスタまたはクワッ ドワード ・ メモリ ・ ロケーションを使用できる。<br />

図 2-6. PADDSW 命令の動作<br />

mm<br />

mm/m64<br />

mm<br />

PADDSW mm, mm/m64<br />

+<br />

1000000000000000 0111111100111000<br />

1111111111111111 0001011100000111<br />

1000000000000000 0111111111111111<br />

3006016<br />

PADDSB 命令は、 ソース・オペランドの符号付きバイトをデスティネーション・オペラ<br />

ンドの符号付きバイトに加算し、 結果をデスティネーション・オペランドにストアする。<br />

個別の結果が符号付き バイ ト の範囲を超え る場合 ( すなわち、 7FH より大きいかまたは<br />

80H より小さい場合) は、 それぞれ 7FH または 80H の飽和されたバイ ト 値がデステ ィ<br />

ネーシ ョ ン ・ オペラン ド に書き込まれる。<br />

PADDSW 命令は、 ソース・オペランドの符号付きワードをデスティネーション・オペラ<br />

ンドの符号付きワードに加算し、 結果をデスティネーション・オペランドにストアする。<br />

個別の結果が符号付き ワ ー ド の範囲を超え る場合 ( すなわち、 7FFFH より大きいかまた<br />

は 8000H より小さい場合) は、 それぞれ 7FFFH または 8000H の飽和されたワ ー ド 値が<br />

デステ ィ ネーシ ョ ン ・ オペラン ド に書き込まれる。<br />

3:796 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス<br />

+<br />

+<br />

+


PADDSB/PADDSW—Packed Add with Saturation ( 続き )<br />

操作<br />

IF instruction is PADDSB<br />

THEN<br />

DEST(7..0) ← SaturateToSignedByte(DEST(7..0) + SRC (7..0)) ;<br />

DEST(15..8) ← SaturateToSignedByte(DEST(15..8) + SRC(15..8) );<br />

DEST(23..16) ← SaturateToSignedByte(DEST(23..16)+ SRC(23..16) );<br />

DEST(31..24) ← SaturateToSignedByte(DEST(31..24) + SRC(31..24) );<br />

DEST(39..32) ← SaturateToSignedByte(DEST(39..32) + SRC(39..32) );<br />

DEST(47..40) ← SaturateToSignedByte(DEST(47..40)+ SRC(47..40) );<br />

DEST(55..48) ← SaturateToSignedByte(DEST(55..48) + SRC(55..48) );<br />

DEST(63..56) ← SaturateToSignedByte(DEST(63..56) + SRC(63..56) );<br />

ELSE { (* instruction is PADDSW *)<br />

DEST(15..0) ← SaturateToSignedWord(DEST(15..0) + SRC(15..0) );<br />

FI;<br />

DEST(31..16) ← SaturateToSignedWord(DEST(31..16) + SRC(31..16) );<br />

DEST(47..32) ← SaturateToSignedWord(DEST(47..32) + SRC(47..32) );<br />

DEST(63..48) ← SaturateToSignedWord(DEST(63..48) + SRC(63..48) );<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:797


PADDSB/PADDSW—Packed Add with Saturation ( 続き )<br />

実アドレス・モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:798 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス


PADDUSB/PADDUSW—Packed Add Unsigned with Saturation<br />

オペコード 命令 説明<br />

0F DC /r PADDUSB mm, mm/m64 mm/m64 からの符号なしパックド・バイトを mm の符号な<br />

しパックド・バイトに加算して飽和させる。<br />

0F DD /r PADDUSW mm, mm/m64 mm/m64 からの符号なしパックド・ワードを mm の符号な<br />

しパックド・ワードに加算して飽和させる。<br />

説明<br />

パックされたソース・オペランド ( 第 2 オペラン ド ) の個別のパ ッ ク ド 符号なしデー タ<br />

要素 ( バイ ト またはワー ド ) をパックされたデスティネーション・オペランド ( 第 1 オペ<br />

ランド ) の個別のパ ッ ク ド 符号なしデー タ要素に加算する ( 図 2-7 を参照 )。 個別の加算<br />

結果が指定された符号なしデー タ型の範囲を超える と、 結果は飽和される。 デステ ィ<br />

ネーション ・ オペランドは、 MMX テクノロジ ・ レジスタでなければならない。 ソース ・<br />

オペラン ド には、 MMX テクノロジ ・ レジスタまたはクワッ ドワード ・ メモリ ・ ロケー<br />

ションを使用できる。<br />

図 2-7. PADDUSB 命令の動作<br />

mm<br />

mm/m64<br />

mm<br />

PADDUSB mm, mm/m64<br />

+<br />

+<br />

+<br />

00111000<br />

00000111<br />

00111111<br />

3006017<br />

PADDUSB 命令は、 ソース・オペランドの符号なしバイトをデスティネーション・オペ<br />

ラ ン ド の符号なしバイ ト に加算し、 結果をデス テ ィ ネ ー シ ョ ン ・ オペラ ン ド に ス ト アす<br />

る。 個別の結果が符号なしバイ ト の範囲を超え る場合 ( すなわち、 FFH より大きい場合)<br />

は、 FFH の飽和された符号なしバイト値がデスティネーション・オペランドに書き込ま<br />

れる。<br />

PADDUSW 命令は、 ソース・オペランドの符号なしワードをデスティネーション・オペ<br />

ラ ン ド の符号なし ワ ー ド に加算し、 結果をデス テ ィ ネ ー シ ョ ン ・ オペラ ン ド に ス ト アす<br />

る。 個別の結果が符号なし ワ ー ド の範囲を超え る場合 ( すなわち、 FFFFH より大きい場<br />

合 ) は、 FFFFH の飽和された符号なしワード値がデスティネーション・オペランドに書<br />

き込まれる。<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:799<br />

+<br />

+<br />

10000000<br />

+<br />

11111111<br />

11111111<br />

01111111<br />

+<br />

00010111<br />

10010110<br />

+


PADDUSB/PADDUSW—Packed Add Unsigned with Saturation ( 続き )<br />

操作<br />

IF instruction is PADDUSB<br />

THEN<br />

DEST(7..0) ← SaturateToUnsignedByte(DEST(7..0) + SRC (7..0) );<br />

DEST(15..8) ← SaturateToUnsignedByte(DEST(15..8) + SRC(15..8) );<br />

DEST(23..16) ← SaturateToUnsignedByte(DEST(23..16)+ SRC(23..16) );<br />

DEST(31..24) ← SaturateToUnsignedByte(DEST(31..24) + SRC(31..24) );<br />

DEST(39..32) ← SaturateToUnsignedByte(DEST(39..32) + SRC(39..32) );<br />

DEST(47..40) ← SaturateToUnsignedByte(DEST(47..40)+ SRC(47..40) );<br />

DEST(55..48) ← SaturateToUnsignedByte(DEST(55..48) + SRC(55..48) );<br />

DEST(63..56) ← SaturateToUnsignedByte(DEST(63..56) + SRC(63..56) );<br />

ELSE { (* instruction is PADDUSW *)<br />

DEST(15..0) ← SaturateToUnsignedWord(DEST(15..0) + SRC(15..0) );<br />

DEST(31..16) ← SaturateToUnsignedWord(DEST(31..16) + SRC(31..16) );<br />

DEST(47..32) ← SaturateToUnsignedWord(DEST(47..32) + SRC(47..32) );<br />

DEST(63..48) ← SaturateToUnsignedWord(DEST(63..48) + SRC(63..48) );<br />

FI;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

3:800 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス


PADDUSB/PADDUSW—Packed Add Unsigned with Saturation ( 続き )<br />

実アドレス・モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:801


PAND—Logical AND<br />

オペコード 命令 説明<br />

0F DB /r PAND mm, mm/m64 mm/m64 からのクワッドワードと mm のクワッドワードと<br />

の AND をとる。<br />

説明<br />

クワッ ドワードのソース・オペランド ( 第 2 オペラン ド ) とデスティネーション・オペ<br />

ランド ( 第 1 オペラン ド ) と の間のビ ッ ト 単位の AND( 論理積 ) 演算を実行し、 結果をデ<br />

スティネーション・オペランド ・ロケーションにストアする( 図 2-8 を参照 )。 ソース ・<br />

オペラン ド には、 MMX テクノロジ ・ レジスタまたはクワッ ドワード ・ メモリ ・ ロケー<br />

ションを使用できる。 デスティネーション・オペランドは、 MMX テクノロジ ・ レジス<br />

タでなければならない。 PAND 命令の各ビ ッ ト の結果は、 オペラ ン ド の対応する ビ ッ ト<br />

が両方 と も 1 である場合は 1 にセッ ト され、 そうでない場合はゼロになる。<br />

図 2-8. PAND 命令の動作<br />

操作<br />

mm<br />

mm/m64<br />

mm<br />

DEST ← DEST AND SRC;<br />

影響を受けるフラグ<br />

なし。<br />

PAND mm, mm/m64<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

1111111111111000000000000000010110110101100010000111011101110111<br />

0001000011011001010100000011000100011110111011110001010110010101<br />

0001000011011000000000000000000100010100100010000001010100010101<br />

3006019<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

3:802 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス<br />

&


PAND—Logical AND ( 続き )<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:803


PANDN—Logical AND NOT<br />

オペコード 命令 説明<br />

0F DF /r PANDN mm, mm/m64 mm/m64 からのクワッドワードと mm の反転されたクワッ<br />

ドワードとの AND をとる。<br />

説明<br />

クワッ ドワードのデスティネーション・オペランド ( 第 1 オペラン ド ) に ビ ッ ト 単位の<br />

NOT( 否定 ) 演算を実行する。 次に、 反転されたデステ ィ ネ ーシ ョ ン ・ オペラ ン ド と ク<br />

ワッドワードのソース・オペランド ( 第 2 オペラン ド ) と の間のビ ッ ト 単位の AND( 論<br />

理積 ) 演算を実行す る ( 図 2-9 を参照 )。 AND 演算の各ビ ッ ト の結果は、 ソ ー ス ・ ビ ッ ト<br />

と反転されたデスティネーション・ビッ トの対応するビッ トが1 である場合は 1 にセッ<br />

トされ、 そうでない場合はゼロになる。 結果は、 デスティネーション・オペランド ・ロ<br />

ケーションにストアされる。<br />

ソース ・オペランドには、 MMX テクノロジ ・ レジスタまたはクワッ ドワード ・ メモリ ・<br />

ロケーションを使用できる。 デスティネーション・オペランドは、 MMX テクノロジ ・<br />

レジスタでなければならない。<br />

図 2-9. PANDN 命令の動作<br />

操作<br />

PANDN mm, mm/m64<br />

mm<br />

mm/m64<br />

mm<br />

DEST ← (NOT DEST) AND SRC;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

11111111111110000000000000000101101101010011101111000100010001000<br />

11111111111110000000000000000101101101010011101111000100010001000<br />

11111111111110000000000000000101101101010011101111000100010001000<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

3:804 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス<br />

~<br />

&


PANDN—Logical AND NOT ( 続き )<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:805


PCMPEQB/PCMPEQW/PCMPEQD—Packed Compare for Equal<br />

オペコード 命令 説明<br />

0F 74 /r PCMPEQB mm, mm/m64 mm/m64 のパックド・バイトを mm のパックド・バイトと<br />

等しいか比較する。<br />

0F 75 /r PCMPEQW mm, mm/m64 mm/m64 のパックド・ワードを mm のパックド・ワードと<br />

等しいか比較する。<br />

0F 76 /r PCMPEQD mm, mm/m64 mm/m64 のパックド・ダブルワードを mm のパックド・ダ<br />

ブルワードと等しいか比較する。<br />

説明<br />

デステ ィ ネーシ ョ ン ・ オペラン ド ( 第 1 オペラン ド ) の個別のパ ッ ク ド ・ デー タ要素 ( バ<br />

イト、 ワード、 またはダブルワード ) をソース ・ オペランドの対応するデータ要素と比<br />

較する ( 図 2-10 を参照 )。 データ要素のペアが等しい場合は、 デステ ィ ネーシ ョ ン ・ オ<br />

ペラン ドの対応するデータ要素はすべて 1 に設定される。 そ うでない場合は、 すべてゼ<br />

ロに設定される。 デスティネーション ・ オペランドは、 MMX テクノロジ ・ レジスタで<br />

なければならない。 ソース ・ オペラン ド には、 MMX テクノロジ ・ レジスタまたは 64<br />

ビッ トのメモリ ・ロケーションを使用できる。<br />

図 2-10. PCMPEQW 命令の動作<br />

mm<br />

mm/m64<br />

mm<br />

PCMPEQW mm, mm/m64<br />

0000000000000000 0000000000000001 0000000000000111 0111000111000111<br />

==<br />

==<br />

1111111111111111 0000000000000000 0000000000000000 1111111111111111<br />

3006021<br />

PCMPEQB 命令は、 デスティネーション・オペランドのバイトをソース・オペランドの<br />

対応す るバイ ト と 比較し、 結果に従 っ てデス テ ィ ネ ー シ ョ ン ・ オペラ ン ド のバイ ト を設<br />

定する。<br />

PCMPEQW 命令は、 デスティネーション・オペランドのワードをソース・オペランドの<br />

対応す る ワ ー ド と 比較し、 結果に従 っ てデス テ ィ ネ ー シ ョ ン ・ オペラ ン ド の ワ ー ド を設<br />

定する。<br />

PCMPEQD 命令は、 デスティネーション ・ オペランドのダブルワードをソース ・ オペラ<br />

ン ド の対応す る ダブル ワ ー ド と 比較し、 結果に従 っ てデス テ ィ ネ ー シ ョ ン ・ オペラ ン ド<br />

のダブルワー ド を設定する。<br />

3:806 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス<br />

==<br />

==<br />

0000000000000000 00000000000000000111000111000111<br />

0111000111000111<br />

真 偽 偽 真


PCMPEQB/PCMPEQW/PCMPEQD—Packed Compare for Equal ( 続き )<br />

操作<br />

IF instruction is PCMPEQB<br />

THEN<br />

IF DEST(7..0) = SRC(7..0)<br />

THEN DEST(7 0) ← FFH;<br />

ELSE DEST(7..0) ← 0;<br />

* Continue comparison of second through seventh bytes in DEST and SRC *<br />

IF DEST(63..56) = SRC(63..56)<br />

THEN DEST(63..56) ← FFH;<br />

ELSE DEST(63..56) ← 0;<br />

ELSE IF instruction is PCMPEQW<br />

THEN<br />

IF DEST(15..0) = SRC(15..0)<br />

THEN DEST(15..0) ← FFFFH;<br />

ELSE DEST(15..0) ← 0;<br />

* Continue comparison of second and third words in DEST and SRC *<br />

IF DEST(63..48) = SRC(63..48)<br />

THEN DEST(63..48) ← FFFFH;<br />

ELSE DEST(63..48) ← 0;<br />

ELSE (* instruction is PCMPEQD *)<br />

IF DEST(31..0) = SRC(31..0)<br />

THEN DEST(31..0) ← FFFFFFFFH;<br />

ELSE DEST(31..0) ← 0;<br />

IF DEST(63..32) = SRC(63..32)<br />

THEN DEST(63..32) ← FFFFFFFFH;<br />

ELSE DEST(63..32) ← 0;<br />

FI;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:807


PCMPEQB/PCMPEQW/PCMPEQD—Packed Compare for Equal ( 続き )<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:808 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス


PCMPGTB/PCMPGTW/PCMPGTD—Packed Compare for Greater Than<br />

オペコード 命令 説明<br />

0F 64 /r PCMPGTB mm, mm/m64 mm のパックド・バイトが mm/m64 のパックド・バイトよ<br />

り値が大きいか比較する。<br />

0F 65 /r PCMPGTW mm, mm/m64 mm のパックド・ワードが mm/m64 のパックド・ワードよ<br />

り値が大きいか比較する。<br />

0F 66 /r PCMPGTD mm, mm/m64 mm のパックド・ダブルワードが mm/m64 のパックド・ダ<br />

ブルワードより値が大きいか比較する。<br />

説明<br />

デステ ィ ネーシ ョ ン ・ オペラン ド ( 第 1 オペラン ド ) の個別のパ ッ ク ド 符号付き デー タ<br />

要素 ( バイ ト、 ワー ド、 またはダブルワー ド ) をソース ・ オペランド ( 第 2 オペラン ド )<br />

の対応す る符号付き デー タ要素 と 比較す る ( 図 2-11 を参照 )。 デスティネーション・オ<br />

ペランドのデータ要素がソース・オペランドの対応するデータ要素より大きい場合は、<br />

デステ ィ ネーシ ョ ン ・ オペラン ド のデータ要素はすべて 1 に設定される。 そ う でない場<br />

合は、 すべて 0 に設定される。 デスティネーション・オペランドは、 MMX テクノロジ ・<br />

レジスタでなければならない。 ソース ・ オペランドには、 MMX テクノロジ ・ レジスタ<br />

または 64 ビッ トのメモリ ・ロケーションを使用できる。<br />

図 2-11. PCMPGTW 命令の動作<br />

mm<br />

mm/m64<br />

mm<br />

PCMPGTW mm, mm/m64<br />

0000000000000000 0000000000000001 0000000000000111 0111000111000111<br />

><br />

0000000000000000 0000000000000000 0111000111000111 0111000111000111<br />

0000000000000000 1111111111111111 0000000000000000 0000000000000000<br />

3006021<br />

PCMPGTB 命令は、 デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド の符号付き バイ ト を ソ ー ス ・ オペ<br />

ラ ン ド の対応す る符号付き バイ ト と 比較し、 結果に従 っ てデス テ ィ ネ ー シ ョ ン ・ オペラ<br />

ンドのバイトを設定する。<br />

PCMPGTW 命令は、 デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド の符号付き ワ ー ド を ソ ー ス ・ オペ<br />

ラ ン ド の対応す る符号付き ワ ー ド と 比較し、 結果に従 っ てデス テ ィ ネ ー シ ョ ン ・ オペラ<br />

ンドのワードを設定する。<br />

PCMPGTD 命令は、 デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド の符号付き ダブルワ ー ド を ソ ー<br />

ス ・ オペラン ド の対応する符号付きダブルワー ド と比較し、 結果に従ってデステ ィ ネー<br />

ション・オペランドのダブルワードを設定する。<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:809<br />

><br />

偽 真 偽 偽<br />

><br />

>


PCMPGTB/PCMPGTW/PCMPGTD—Packed Compare for Greater Than ( 続き )<br />

操作<br />

IF instruction is PCMPGTB<br />

THEN<br />

IF DEST(7..0) > SRC(7..0)<br />

THEN DEST(7 0) ← FFH;<br />

ELSE DEST(7..0) ← 0;<br />

* Continue comparison of second through seventh bytes in DEST and SRC *<br />

IF DEST(63..56) > SRC(63..56)<br />

THEN DEST(63..56) ← FFH;<br />

ELSE DEST(63..56) ← 0;<br />

ELSE IF instruction is PCMPGTW<br />

THEN<br />

IF DEST(15..0) > SRC(15..0)<br />

THEN DEST(15..0) ← FFFFH;<br />

ELSE DEST(15..0) ←0;<br />

* Continue comparison of second and third bytes in DEST and SRC *<br />

IF DEST(63..48) > SRC(63..48)<br />

THEN DEST(63..48) ← FFFFH;<br />

ELSE DEST(63..48) ← 0;<br />

ELSE { (* instruction is PCMPGTD *)<br />

IF DEST(31..0) > SRC(31..0)<br />

THEN DEST(31..0) ← FFFFFFFFH;<br />

ELSE DEST(31..0) ← 0;<br />

IF DEST(63..32) > SRC(63..32)<br />

THEN DEST(63..32) ← FFFFFFFFH;<br />

ELSE DEST(63..32) ← 0;<br />

FI;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

3:810 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス


PCMPGTB/PCMPGTW/PCMPGTD—Packed Compare for Greater Than ( 続き )<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:811


PMADDWD—Packed Multiply and Add<br />

オペコード 命令 説明<br />

0F F5 /r PMADDWD mm, mm/m64 mm のパックド・ワードに mm/m64 のパックド・ワードを<br />

掛ける。結果の 32 ビット・ペアを加算してダブルワードと<br />

して mm にストアする。<br />

説明<br />

デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド の個別のパ ッ ク ド 符号付き ワ ー ド に ソ ー ス ・ オペラ ン<br />

ド の対応する符号付き ワ ー ド を掛け、 4 つの符号付きダブルワ ー ド の結果を生成する ( 図<br />

2-12 を参照 )。 上位ワードの乗算による2 つのダブルワー ド の結果が加算され、 デス<br />

テ ィ ネ ー シ ョ ン ・ オペラ ン ド の上位ダブルワ ー ド に ス ト ア さ れる。 下位ワ ー ド の乗算に<br />

よる2 つのダブルワ ー ド の結果が加算され、 デステ ィ ネーシ ョ ン ・ オペラン ド の下位ダ<br />

ブルワードにストアされる。 デスティネーション・オペランドは、 MMX テクノロジ ・<br />

レジスタでなければならない。 ソース ・ オペランドには、 MMX テクノロジ ・ レジスタ<br />

または 64 ビッ トのメモリ ・ロケーションを使用できる。<br />

PMADDWD 命令は、 ソース・オペランドとデスティネーション・オペランド両方の4 つ<br />

のワー ドすべてが 8000H である と きだけに 80000000H にラップアラウンドする。<br />

図 2-12. PMADDWD 命令の動作<br />

操作<br />

mm<br />

mm/m64<br />

mm<br />

DEST(31..0) ← (DEST(15..0) ∗ SRC(15..0)) + (DEST(31..16) ∗ SRC(31..16));<br />

DEST(63..32) ← (DEST(47..32) ∗ SRC(47..32)) + (DEST(63..48) ∗ SRC(63..48));<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

PMADDWD mm, mm/m64<br />

0111000111000111 0111000111000111<br />

∗ ∗ ∗ ∗<br />

1000000000000000 0000010000000000<br />

+ +<br />

1100100011100011 1001110000000000<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォルト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 データ・<br />

ページ不在フォル ト、 データ NaT ページ参照アボー ト、<br />

データ ・ キー ・ ミス ・ フォル ト、 データ ・ キー許可フォル<br />

ト、 データ ・ アクセス権フォルト、 データ ・ アクセス ・<br />

ビッ ト ・フォルト、 データ・ダーティ ・ビッ ト ・フォルト。<br />

3:812 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス


PMADDWD—Packed Multiply and Add ( 続き )<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:813


PMULHW—Packed Multiply High<br />

オペコード 命令 説明<br />

0F E5 /r PMULHW mm, mm/m64 mm の符号付きパックド・ワードに mm/m64 の符号付き<br />

パックド・ワードを掛け、各ダブルワードの結果の上位ワー<br />

ドを mm にストアする。<br />

説明<br />

ソース ・オペランド ( 第 2 オペラン ド ) の 4 つの符号付き ワー ド にデステ ィ ネーシ ョ ン ・<br />

オペラン ド ( 第 1 オペラン ド ) の 4 つの符号付き ワ ー ド を掛け、 4 つの符号付き ダブル<br />

ワ ー ド 中間結果を生成する ( 図 2-13 を参照 )。 各中間結果の上位ワ ー ド は、 その後デス<br />

ティネーション・オペランドの対応するワード ・ロケーションに書き込まれる。 デス<br />

ティネーション・オペランドは、 MMX テクノロジ ・ レジスタでなければならない。<br />

ソース ・オペランドには、 MMX テクノロジ ・ レジスタまたは 64 ビッ トのメモリ ・ロ<br />

ケーションを使用できる。<br />

図 2-13. PMULHW 命令の動作<br />

操作<br />

mm<br />

mm/m64<br />

mm<br />

DEST(15..0) ← HighOrderWord(DEST(15..0) ∗ SRC(15..0));<br />

DEST(31..16) ← HighOrderWord(DEST(31..16) ∗ SRC(31..16));<br />

DEST(47..32) ← HighOrderWord(DEST(47..32) ∗ SRC(47..32));<br />

DEST(63..48) ← HighOrderWord(DEST(63..48) ∗ SRC(63..48));<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

PMULHW mm, mm/m64<br />

*<br />

0111000111000111<br />

1000000000000000<br />

1100011100011100<br />

3006022<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

3:814 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス<br />

*<br />

*<br />

0111000111000111<br />

*<br />

0000010000000000<br />

上位 上位 上位 上位<br />

0000000111000111


PMULHW—Packed Multiply High ( 続き )<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:815


PMULLW—Packed Multiply Low<br />

オペコード 命令 説明<br />

0F D5 /r PMULLW mm, mm/m64 mm のパックド・ワードに mm/m64 のパックド・ワードを<br />

掛け、各ダブルワードの結果の下位ワードを mm にストア<br />

する。<br />

説明<br />

ソース ・オペランド ( 第 2 オペラン ド ) の 4 つの符号付き または符号なしワー ド にデス<br />

ティネーション・オペランド ( 第 1 オペラン ド ) の 4 つの符号付き ま たは符号なし ワ ー<br />

ドを掛け、 4 つのダブルワ ー ド 中間結果を生成する ( 図 2-14 を参照 )。 各中間結果の下位<br />

ワードは、 その後デスティネーション ・ オペランドの対応するワード ・ ロケーションに<br />

書き込まれる。 デスティネーション・オペランドは、 MMX テクノロジ ・ レジスタでな<br />

ければならない。 ソ ース ・ オペラン ド には、 MMX テクノロジ ・ レジスタまたは 64 ビッ<br />

トのメモリ ・ロケーションを使用できる。<br />

図 2-14. PMULLW 命令の動作<br />

操作<br />

mm<br />

mm/m64<br />

mm<br />

DEST(15..0) ← LowOrderWord(DEST(15..0) ∗ SRC(15..0));<br />

DEST(31..16) ← LowOrderWord(DEST(31..16) ∗ SRC(31..16));<br />

DEST(47..32) ← LowOrderWord(DEST(47..32) ∗ SRC(47..32));<br />

DEST(63..48) ← LowOrderWord(DEST(63..48) ∗ SRC(63..48));<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

PMULLW mm, mm/m64<br />

*<br />

0111000111000111 0111000111000111<br />

1000000000000000 0000010000000000<br />

1000000000000000 0001110000000000<br />

3006025<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

3:816 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス<br />

*<br />

下位 下位 下位 下位<br />

*<br />

*


PMULLW—Packed Multiply Low ( 続き )<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:817


POR—Bitwise Logical OR<br />

オペコード 命令 説明<br />

0F EB /r POR mm, mm/m64 mm/m64 からのクワッドワードと mm のクワッドワードと<br />

の OR をとる。<br />

説明<br />

クワッ ドワードのソース・オペランド ( 第 2 オペラン ド ) とデスティネーション・オペ<br />

ランド ( 第 1 オペラン ド ) と の間のビ ッ ト 単位の OR( 論理和 ) 演算を実行し、 結果をデ<br />

スティネーション・オペランド ・ロケーションにストアする( 図 2-15 を参照 )。 ソース ・<br />

オペラン ド には、 MMX テクノロジ ・ レジスタまたはクワッ ドワード ・ メモリ ・ ロケー<br />

ションを使用できる。 デスティネーション・オペランドは、 MMX テクノロジ ・ レジス<br />

タでなければならない。 各ビッ トの結果は、 オペランドの対応するビッ トが両方とも 0<br />

の場合は 0 になり、 そ う でない場合は 1 になる。<br />

図 2-15. POR 命令の動作<br />

操作<br />

mm<br />

mm/m64<br />

mm<br />

DEST ← DEST OR SRC;<br />

影響を受けるフラグ<br />

なし。<br />

PAND mm, mm/m64<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

1111111111111000000000000000010110110101100010000111011101110111<br />

0001000011011001010100000011000100011110111011110001010110010101<br />

1111111111111001010100000011010110111111111011110111011111110111<br />

3006024<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

3:818 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス


POR—Bitwise Logical OR ( 続き )<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:819


PSLLW/PSLLD/PSLLQ—Packed Shift Left Logical<br />

オペコード 命令 説明<br />

0F F1 /r PSLLW mm, mm/m64 mm のワードを mm/m64 に指定されたビットだけ左にシフ<br />

トし、下位はゼロで埋める。<br />

0F 71 /6, ib PSLLW mm, imm8 mm のワードを imm8 だけ左にシフトし、下位はゼロで埋め<br />

る。<br />

0F F2 /r PSLLD mm, mm/m64 mm のダブルワードを mm/m64 に指定されたビットだけ左<br />

にシフトし、下位はゼロで埋める。<br />

0F 72 /6 ib PSLLD mm, imm8 mm のダブルワードを imm8 だけ左にシフトし、下位はゼロ<br />

で埋める。<br />

0F F3 /r PSLLQ mm, mm/m64 mm を mm/m64 に指定されたビットだけ左にシフトし、下<br />

位はゼロで埋める。<br />

0F 73 /6 ib PSLLQ mm, imm8 mm を imm だけ左にシフトし、下位はゼロで埋める。<br />

説明<br />

デステ ィ ネーシ ョ ン ・ オペラン ド ( 第 1 オペラン ド ) にあるデータ要素 ( ワード、 ダブル<br />

ワード、 またはクワッ ドワード ) のビ ッ ト を、 符号なしカウン ト ・ オペラン ド ( 第 2 オ<br />

ペラン ド ) に指定されたビ ッ ト 数だけ左にシフ ト する ( 図 2-16 を参照 )。 シフ ト操作の結<br />

果は、 デスティネーション・オペランドに書き込まれる。 データ要素のビットが左にシ フ ト される と、 空の下位ビッ ト はク リアされる ( ゼロに設定される )。 カウン ト ・ オペラ<br />

ン ド に よ っ て指定 さ れる値が ( ワードでは)15、 ( ダブルワー ド では )31、 または ( クワッ<br />

ドワードでは)63 より大きいと、 デスティネーション・オペランドはすべてゼロに設定<br />

される。<br />

デステ ィ ネーシ ョ ン ・ オペラン ド は、 MMX テクノロジ ・ レジスタでなければならない。<br />

カウント ・ オペランドには、 MMX テクノロジ ・ レジスタ、 64 ビッ トのメモリ ・ロケー<br />

ション、 または8 ビ ッ ト の即値を使用で き る。<br />

PSLLW 命令は、 デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド の 4 ワードのそれぞれを、 カウント ・<br />

オペラ ン ド に指定 さ れたビ ッ ト 数だけ左にシ フ ト する。 PSLLD 命令は、 デス テ ィ ネ ー<br />

ション・オペランドの2 ダブルワー ド のそれぞれをシフ ト し、 PSLLQ 命令は、 デス テ ィ<br />

ネーション ・ オペランドの 64 ビッ トのクワッドワードをシフトする。 個別データ要素が<br />

左にシフ ト される と、 空の下位ビッ ト 位置はゼロで埋められる。<br />

図 2-16. PSLLW 命令の動作<br />

mm<br />

mm<br />

PSLLW mm, 2<br />

1111111111111100 0001000111000111<br />

左にシフト 左にシフト 左にシフト 左にシフト<br />

1111111111110000 0100011100011100<br />

3006026<br />

3:820 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス


PSLLW/PSLLD/PSLLQ—Packed Shift Left Logical ( 続き )<br />

操作<br />

IF instruction is PSLLW<br />

THEN<br />

DEST(15..0) ← DEST(15..0)


PSLLW/PSLLD/PSLLQ—Packed Shift Left Logical ( 続き )<br />

実アドレス・モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:822 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス


PSRAW/PSRAD—Packed Shift Right Arithmetic<br />

オペコード 命令 説明<br />

0F E1 /r PSRAW mm, mm/m64 mm のワードを mm/m64 に指定されたビットだけ右にシフ<br />

トし、上位は符号ビットで埋める。<br />

0F 71 /4 ib PSRAW mm, imm8 mm のワードを imm8 だけ右にシフトし、上位は符号ビット<br />

で埋める。<br />

0F E2 /r PSRAD mm, mm/m64 mm のダブルワードを mm/m64 に指定されたビットだけ右<br />

にシフトし、上位は符号ビットで埋める。<br />

0F 72 /4 ib PSRAD mm, imm8 mm のダブルワードを imm8 だけ右にシフトし、上位は符号<br />

ビットで埋める。<br />

説明<br />

デステ ィ ネーシ ョ ン ・ オペラン ド ( 第 1 オペラン ド ) にあるデータ要素 ( ワード またはダ<br />

ブルワー ド ) のビ ッ ト を、 符号なしカウン ト ・ オペラン ド ( 第 2 オペラン ド ) に指定され<br />

たビッ ト量だけ右にシフ トする ( 図 2-17 を参照 )。 シ フ ト 操作の結果は、 デス テ ィ ネ ー<br />

シ ョ ン ・ オペラ ン ド に書き込 ま れる。 各要素の空の上位ビ ッ ト は、 デー タ要素の符号<br />

ビ ッ ト の初期値で埋め られる。 カ ウン ト ・ オペラン ド に よ って指定される値が、 ( ワード<br />

では )15 または ( ダブルワー ド では )31 より大きいと、 デスティネーションの各データ要<br />

素は、 その要素の符号ビ ッ ト の初期値で埋め ら れる。<br />

デステ ィ ネーシ ョ ン ・ オペラン ド は、 MMX テクノロジ ・ レジスタでなければならない。<br />

カウント ・ オペランド ( ソース・オペランド ) には、 MMX テクノロジ ・ レジスタ、 64<br />

ビッ トのメモリ ・ロケーション、 または8 ビ ッ ト の即値を使用で き る。<br />

PSRAW 命令は、 デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド の 4 ワードのそれぞれを、 カウント ・<br />

オペラ ン ド に指定 さ れたビ ッ ト 数だけ右にシ フ ト する。 PSRAD 命令は、 デス テ ィ ネ ー<br />

ション・オペランドの2 ダブルワ ー ド のそれぞれを シ フ ト す る。 個別のデ ー タ要素が右<br />

にシ フ ト される と 、 空の上位ビ ッ ト 位置は符号値で埋め ら れる。<br />

図 2-17. PSRAW 命令の動作<br />

mm<br />

mm<br />

PSRAW mm, 2<br />

1111111111111100 1101000111000111<br />

右にシフト 右にシフト 右にシフト 右にシフト<br />

1111111111111111 1111010001110001<br />

3006048<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:823


PSRAW/PSRAD—Packed Shift Right Arithmetic ( 続き )<br />

操作<br />

IF instruction is PSRAW<br />

THEN<br />

DEST(15..0) ← SignExtend (DEST(15..0) >> COUNT);<br />

DEST(31..16) ← SignExtend (DEST(31..16) >> COUNT);<br />

DEST(47..32) ← SignExtend (DEST(47..32) >> COUNT);<br />

DEST(63..48) ← SignExtend (DEST(63..48) >> COUNT);<br />

ELSE { (*instruction is PSRAD *)<br />

DEST(31..0) ← SignExtend (DEST(31..0) >> COUNT);<br />

DEST(63..32) ← SignExtend (DEST(63..32) >> COUNT);<br />

FI;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

3:824 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス


PSRAW/PSRAD—Packed Shift Right Arithmetic ( 続き )<br />

実アドレス・モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:825


PSRLW/PSRLD/PSRLQ—Packed Shift Right Logical<br />

オペコード 命令 説明<br />

0F D1 /r PSRLW mm, mm/m64 mm のワードを mm/m64 に指定されたビットだけ右にシフ<br />

トし、上位はゼロで埋める。<br />

0F 71 /2 ib PSRLW mm, imm8 mm のワードを imm8 だけ右にシフトする。<br />

0F D2 /r PSRLD mm, mm/m64 mm のダブルワードを mm/m64 に指定されたビットだけ右<br />

にシフトし、上位はゼロで埋める。<br />

0F 72 /2 ib PSRLD mm, imm8 mm のダブルワードを imm8 だけ右にシフトする。<br />

0F D3 /r PSRLQ mm, mm/m64 mm を mm/m64 に指定されたビットだけ右にシフトし、上<br />

位はゼロで埋める。<br />

0F 73 /2 ib PSRLQ mm, imm8 mm を imm8 だけ右にシフトし、上位はゼロで埋める。<br />

説明<br />

デステ ィ ネーシ ョ ン ・ オペラン ド ( 第 1 オペラン ド ) にあるデータ要素 ( ワード、 ダブル<br />

ワード、 またはクワッ ドワード ) のビ ッ ト を、 符号なしカウン ト ・ オペラン ド ( 第 2 オ<br />

ペラン ド ) に指定されたビ ッ ト 量だけ右にシフ ト する ( 図 2-18 を参照 )。 シフ ト操作の結<br />

果は、 デスティネーション・オペランドに書き込まれる。 データ要素のビットが右にシ フ ト される と、 空の上位ビッ ト はク リアされる ( ゼロに設定される )。 カウン ト ・ オペラ<br />

ン ド に よ っ て指定 さ れた値が ( ワードでは)15、 ( ダブルワー ド では )31、 または ( クワッ<br />

ドワードでは)63 より大きいと、 デスティネーション・オペランドはすべてゼロに設定<br />

される。<br />

デステ ィ ネーシ ョ ン ・ オペラン ド は、 MMX テクノロジ ・ レジスタでなければならない。<br />

カウント ・ オペランドには、 MMX テクノロジ ・ レジスタ、 64 ビッ トのメモリ ・ロケー<br />

ション、 または8 ビ ッ ト の即値を使用で き る。<br />

PSRLW 命令は、 デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド の 4 ワードのそれぞれを、 カウント ・<br />

オペラ ン ド に指定 さ れたビ ッ ト 数だけ右にシ フ ト する。 PSRLD 命令は、 デス テ ィ ネ ー<br />

ション・オペランドの2 ダブルワー ド のそれぞれをシフ ト し、 PSRLQ 命令は、 デス テ ィ<br />

ネーション ・ オペランドの 64 ビッ トのクワッドワードをシフトする。 個別データ要素が<br />

右にシフ ト される と、 空の上位ビッ ト 位置はゼロで埋められる。<br />

図 2-18. PSRLW 命令の動作<br />

mm<br />

mm<br />

PSRLW mm, 2<br />

1111111111111100 0001000111000111<br />

右にシフト 右にシフト 右にシフト 右にシフト<br />

0011111111111111 0000010001110001<br />

3006027<br />

3:826 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス


PSRLW/PSRLD/PSRLQ—Packed Shift Right Logical ( 続き )<br />

操作<br />

IF instruction is PSRLW<br />

THEN {<br />

DEST(15..0) ← DEST(15..0) >> COUNT;<br />

DEST(31..16) ← DEST(31..16) >> COUNT;<br />

DEST(47..32) ← DEST(47..32) >> COUNT;<br />

DEST(63..48) ← DEST(63..48) >> COUNT;<br />

ELSE IF instruction is PSRLD<br />

THEN {<br />

DEST(31..0) ← DEST(31..0) >> COUNT;<br />

DEST(63..32) ← DEST(63..32) >> COUNT;<br />

ELSE (* instruction is PSRLQ *)<br />

DEST ← DEST >> COUNT;<br />

FI;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:827


PSRLW/PSRLD/PSRLQ—Packed Shift Right Logical ( 続き )<br />

実アドレス・モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:828 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス


PSUBB/PSUBW/PSUBD—Packed Subtract<br />

オペコード 命令 説明<br />

0F F8 /r PSUBB mm, mm/m64 mm のパックド・バイトから mm/m64 のパックド・バイト<br />

を引く。<br />

0F F9 /r PSUBW mm, mm/m64 mm のパックド・ワードから mm/m64 のパックド・ワード<br />

を引く。<br />

0F FA /r PSUBD mm, mm/m64 mm のパックド・ダブルワードから mm/m64 のパックド・<br />

ダブルワードを引く。<br />

説明<br />

デステ ィ ネーシ ョ ン ・ オペラン ド ( 第 1 オペラン ド ) の個別デー タ要素 ( バイ ト、 ワー<br />

ド、 またはダブルワード ) からソース ・ オペランド ( 第 2 オペラン ド ) の個別デー タ要素<br />

を引 く ( 図 2-19 を参照 )。 減算の結果が指定されたデー タ型の範囲を超え る と ( オーバフ<br />

ロー )、 結果はラップアラウン ド される。 これは、 結果の下位ビット だけが返される ( す<br />

なわち、 キャ リ ーが無視される ) よ う に結果が切り詰められる こ と を意味している。<br />

デステ ィ ネーシ ョ ン ・ オペラン ド は、 MMX テクノロジ ・ レジスタでなければならない。<br />

ソース ・オペランドには、 MMX テクノロジ ・ レジスタまたはクワッ ドワード ・ メモリ ・<br />

ロケーションを使用できる。<br />

図 2-19. PSUBW 命令の動作<br />

mm<br />

mm/m64<br />

mm<br />

PSUBW mm, mm/m64<br />

-<br />

1000000000000000 0111111100111000<br />

0000000000000001 1110100011111001<br />

0111111111111111 0111111111111111<br />

3006028<br />

PSUBB 命令は、 デスティネーション・オペランドのバイトからソース・オペランドのバ<br />

イトを引き、 結果をデスティネーション・オペランドにストアする。 個別の結果が8<br />

ビッ トで表現するには大きすぎるときは、 結果の下位8ビッ トがデスティネーション・<br />

オペラン ド に書き込まれるため、 結果はラ ップアラウン ド する。<br />

PSUBW 命令は、 デスティネーション・オペランドのワードからソース・オペランドの<br />

ワードを引き、 結果をデスティネーション・オペランドにストアする。 個別の結果が16<br />

ビッ トで表現するには大きすぎるときは、 結果の下位16 ビッ トがデスティネーション・<br />

オペラン ド に書き込まれるため、 結果はラ ップアラウン ド する。<br />

PSUBD 命令は、 デスティネーション・オペランドのダブルワードからソース・オペラン<br />

ドのダブルワードを引き、 結果をデスティネーション・オペランドにストアする。 個別<br />

の結果が 32 ビッ トで表現するには大きすぎるときは、 結果の下位32 ビッ トがデスティ<br />

ネーシ ョ ン ・ オペラン ド に書き込まれるため、 結果はラップアラウン ドする。<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:829<br />

-<br />

-<br />

-


PSUBB/PSUBW/PSUBD—Packed Subtract ( 続き )<br />

整数の SUB 命令 と 同様に、 PSUBB、 PSUBW、 PSUBD 命令は、 符号なし ま たは符号付き<br />

(2 の補数表記 ) のパ ッ ク ド 整数を操作で き る こ と に注意する。 整数命令 と は異な り 、 ど<br />

の MMX 命令 も EFLAGS レジスタに影響を与えない。 MMX 命令では、 オ ーバフ ロ ー の<br />

発生を示すキャ リ ー ・ フラグまたはオーバフロ ー ・ フ ラグがないため、 ソ フ ト ウ ェアは、<br />

値の範囲を制御するか、 ま たは 「飽和あ り」 MMX 命令を使用しなければな ら ない。<br />

操作<br />

IF instruction is PSUBB<br />

THEN<br />

DEST(7..0) ← DEST(7..0) - SRC(7..0);<br />

DEST(15..8) ← DEST(15..8) - SRC(15..8);<br />

DEST(23..16) ← DEST(23..16) - SRC(23..16);<br />

DEST(31..24) ← DEST(31..24) - SRC(31..24);<br />

DEST(39..32) ← DEST(39..32) - SRC(39..32);<br />

DEST(47..40) ← DEST(47..40) - SRC(47..40);<br />

DEST(55..48) ← DEST(55..48) - SRC(55..48);<br />

DEST(63..56) ← DEST(63..56) - SRC(63..56);<br />

ELSEIF instruction is PSUBW<br />

THEN<br />

DEST(15..0) ← DEST(15..0) - SRC(15..0);<br />

DEST(31..16) ← DEST(31..16) - SRC(31..16);<br />

DEST(47..32) ← DEST(47..32) - SRC(47..32);<br />

DEST(63..48) ← DEST(63..48) - SRC(63..48);<br />

ELSE { (* instruction is PSUBD *)<br />

DEST(31..0) ← DEST(31..0) - SRC(31..0);<br />

DEST(63..32) ← DEST(63..32) - SRC(63..32);<br />

FI;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

3:830 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス


PSUBB/PSUBW/PSUBD—Packed Subtract ( 続き )<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:831


PSUBSB/PSUBSW—Packed Subtract with Saturation<br />

オペコード 命令 説明<br />

0F E8 /r PSUBSB mm, mm/m64 mm の符号付きパックド・バイトから mm/m64 の符号付き<br />

パックド・バイトを引き、飽和させる。<br />

0F E9 /r PSUBSW mm, mm/m64 mm の符号付きパックド・ワードから mm/m64 の符号付き<br />

パックド・ワードを引き、飽和させる。<br />

説明<br />

デステ ィ ネーシ ョ ン ・ オペラン ド ( 第 1 オペラン ド ) の個別符号付き デ ー タ要素 ( バイ ト<br />

またはワー ド ) からソース ・ オペランド ( 第 2 オペラン ド ) の個別符号付き デ ー タ要素を<br />

引く ( 図 2-20 を参照 )。 減算の結果が指定されたデー タ型の範囲を超える と、 結果は飽<br />

和される。 デスティネーション・オペランドは、 MMX テクノロジ ・ レジスタでなけれ<br />

ばならない。 ソース ・ オペラン ド には、 MMX テクノロジ ・ レジスタまたはクワッ ド<br />

ワード ・ メモリ ・ ロケーションを使用できる。<br />

図 2-20. PSUBSW 命令の動作<br />

mm<br />

mm/m64<br />

mm<br />

PSUBSW mm, mm/m64<br />

-<br />

1000000000000000 0111111100111000<br />

0000000000000001 1110100011111001<br />

100000000000000<br />

3006029<br />

PSUBSB 命令は、 デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド の符号付き バイ ト か ら ソ ー ス ・ オペ<br />

ラン ドの符号付きバイ ト を引き、 結果をデスティネーシ ョ ン ・ オペラン ド にス ト アする。<br />

個別の結果が符号付き バイ ト の範囲を超え る場合 ( すなわち、 7FH より大きいかまたは<br />

80H より小さい場合) は、 それぞれ 7FH または 80H の飽和されたバイ ト 値がデステ ィ<br />

ネーシ ョ ン ・ オペラン ド に書き込まれる。<br />

PSUBSW 命令は、 デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド の符号付き ワ ー ド か ら ソ ー ス ・ オペ<br />

ラン ドの符号付きワー ド を引き、 結果をデスティネーシ ョ ン ・ オペラン ド にス ト アする。<br />

個別の結果が符号付き ワ ー ド の範囲を超え る場合 ( すなわち、 7FFFH より大きいかまた<br />

は 8000H より小さい場合) は、 それぞれ 7FFFH または 8000H の飽和されたワ ー ド 値が<br />

デステ ィ ネーシ ョ ン ・ オペラン ド に書き込まれる。<br />

3:832 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス<br />

-<br />

-<br />

-<br />

0111111111111111


PSUBSB/PSUBSW—Packed Subtract with Saturation ( 続き )<br />

操作<br />

IF instruction is PSUBSB<br />

THEN<br />

DEST(7..0) ← SaturateToSignedByte(DEST(7..0) - SRC (7..0));<br />

DEST(15..8) ← SaturateToSignedByte(DEST(15..8) - SRC(15..8));<br />

DEST(23..16) ← SaturateToSignedByte(DEST(23..16) - SRC(23..16));<br />

DEST(31..24) ← SaturateToSignedByte(DEST(31..24) - SRC(31..24));<br />

DEST(39..32) ← SaturateToSignedByte(DEST(39..32) - SRC(39..32));<br />

DEST(47..40) ← SaturateToSignedByte(DEST(47..40) - SRC(47..40));<br />

DEST(55..48) ← SaturateToSignedByte(DEST(55..48) - SRC(55..48));<br />

DEST(63..56) ← SaturateToSignedByte(DEST(63..56) - SRC(63..56))<br />

ELSE (* instruction is PSUBSW *)<br />

DEST(15..0) ← SaturateToSignedWord(DEST(15..0) - SRC(15..0));<br />

DEST(31..16) ← SaturateToSignedWord(DEST(31..16) - SRC(31..16));<br />

DEST(47..32) ← SaturateToSignedWord(DEST(47..32) - SRC(47..32));<br />

DEST(63..48) ← SaturateToSignedWord(DEST(63..48) - SRC(63..48));<br />

FI;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:833


PSUBSB/PSUBSW—Packed Subtract with Saturation ( 続き )<br />

実アドレス・モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:834 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス


PSUBUSB/PSUBUSW—Packed Subtract Unsigned with Saturation<br />

オペコード 命令 説明<br />

0F D8 /r PSUBUSB mm, mm/m64 mm の符号なしパックド・バイトから mm/m64 の符号なし<br />

パックド・バイトを引き、飽和させる。<br />

0F D9 /r PSUBUSW mm, mm/m64 mm の符号なしパックド・ワードから mm/m64 の符号なし<br />

パックド・ワードを引き、飽和させる。<br />

説明<br />

デステ ィ ネーシ ョ ン ・ オペラン ド ( 第 1 オペラン ド ) の個別符号なしデ ー タ要素 ( バイ ト<br />

またはワー ド ) からソース ・ オペランド ( 第 2 オペラン ド ) の個別符号なしデ ー タ要素を<br />

引く ( 図 2-21 を参照 )。 個別の減算結果が指定 さ れた符号なしデー タ型の範囲を超え る<br />

と、 結果は飽和される。 デスティネーション・オペランドは、 MMX テクノロジ ・ レジ<br />

スタでなければならない。 ソース ・ オペランドには、 MMX テクノロジ ・ レジスタまた<br />

はクワッ ドワード ・ メモリ ・ ロケーションを使用できる。<br />

図 2-21. PSUBUSB 命令の動作<br />

mm<br />

mm/m64<br />

mm<br />

PSUBUSB mm, mm/m64<br />

-<br />

-<br />

-<br />

11111000<br />

00000111<br />

11110001<br />

3006030<br />

PSUBUSB 命令は、 デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド の符号なしバイ ト か ら ソ ー ス ・ オ<br />

ペランドの符号なしバイトを引き、 結果をデスティネーション・オペランドにストアす<br />

る。 個別の結果がゼロ よ り小さい ( 負の値 ) 場合は、 00H の飽和された符号なしバイ ト<br />

値がデスティネーシ ョ ン ・ オペラン ド に書き込まれる。<br />

PSUBUSW 命令は、 デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド の符号なし ワ ー ド か ら ソ ー ス ・ オ<br />

ペランドの符号なしワードを引き、 結果をデスティネーション・オペランドにストアす<br />

る。 個別の結果がゼロ よ り小さい ( 負の値 ) 場合は、 0000H の飽和された符号なしワ ー<br />

ド値がデスティネーション・オペランドに書き込まれる。<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:835<br />

-<br />

-<br />

10000000<br />

-<br />

11111111<br />

00000000<br />

01111111<br />

-<br />

00010111<br />

01101000<br />

-


PSUBUSB/PSUBUSW—Packed Subtract Unsigned with Saturation ( 続き )<br />

操作<br />

IF instruction is PSUBUSB<br />

THEN<br />

DEST(7..0) ← SaturateToUnsignedByte (DEST(7..0 - SRC (7..0) );<br />

DEST(15..8) ← SaturateToUnsignedByte ( DEST(15..8) - SRC(15..8) );<br />

DEST(23..16) ← SaturateToUnsignedByte (DEST(23..16) - SRC(23..16) );<br />

DEST(31..24) ← SaturateToUnsignedByte (DEST(31..24) - SRC(31..24) );<br />

DEST(39..32) ← SaturateToUnsignedByte (DEST(39..32) - SRC(39..32) );<br />

DEST(47..40) ← SaturateToUnsignedByte (DEST(47..40) - SRC(47..40) );<br />

DEST(55..48) ← SaturateToUnsignedByte (DEST(55..48) - SRC(55..48) );<br />

DEST(63..56) ← SaturateToUnsignedByte (DEST(63..56) - SRC(63..56) );<br />

ELSE { (* instruction is PSUBUSW *)<br />

DEST(15..0) ← SaturateToUnsignedWord (DEST(15..0) - SRC(15..0) );<br />

DEST(31..16) ← SaturateToUnsignedWord (DEST(31..16) - SRC(31..16) );<br />

DEST(47..32) ← SaturateToUnsignedWord (DEST(47..32) - SRC(47..32) );<br />

DEST(63..48) ← SaturateToUnsignedWord (DEST(63..48) - SRC(63..48) );<br />

FI;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

3:836 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス


PSUBUSB/PSUBUSW—Packed Subtract Unsigned with Saturation ( 続き )<br />

実アドレス・モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:837


PUNPCKHBW/PUNPCKHWD/PUNPCKHDQ—Unpack High Packed Data<br />

オペコード 命令 説明<br />

0F 68 /r PUNPCKHBW mm, mm/m64 mm および mm/m64 からの上位バイトを mm にインタ<br />

リーブする。<br />

0F 69 /r PUNPCKHWD mm, mm/m64 mm および mm/m64 からの上位ワードを mm にインタ<br />

リーブする。<br />

0F 6A /r PUNPCKHDQ mm, mm/m64 mm および mm/m64 からの上位ダブルワードを mm にイ<br />

ンタリーブする。<br />

説明<br />

デステ ィ ネーシ ョ ン ・ オペラン ド ( 第 1 オペラン ド ) とソース・オペランド ( 第 2 オペラ<br />

ンド ) の上位デー タ要素 ( バイ ト、 ワー ド、 またはダブルワー ド ) をデステ ィ ネーシ ョ<br />

ン・オペランドにアンパックしてインタリーブする( 図 2-22 を参照 )。 下位データ要素<br />

は無視される。 デスティネーション・オペランドは、 MMX テクノロジ ・ レジスタでな<br />

ければならない。 ソ ース ・ オペラン ド には、 MMX テクノロジ ・ レジスタまたは 64 ビッ<br />

トのメモリ ・ ロケーションを使用できる。 ソース ・データがメモリ ・ オペランドからで<br />

ある と きは、 64 ビッ トのオペランドすべてがメモリからアクセスされるが、 命令は上位<br />

32 ビ ッ ト だけ を使用す る。<br />

図 2-22. PUNPCKHBW 命令での上位バイトのアンパックとインタリーブ<br />

PUNPCKHBW mm, mm/m64<br />

mm/m64<br />

27 26 25 24 23 22 21 20 17 16 15 14<br />

13 12 11 10<br />

27 17 26 16 25 15 24 14<br />

mm<br />

3006031<br />

PUNPCKHBW 命令は、 ソ ー ス ・ オペラ ン ド の 4 上位バイ ト と デス テ ィ ネ ー シ ョ ン ・ オペ<br />

ランドの 4 上位バイ ト を イ ン タ リ ー ブして、 それら をデス テ ィ ネ ー シ ョ ン ・ オペラ ン ド<br />

に書き込む。<br />

PUNPCKHWD 命令は、 ソ ー ス ・ オペラ ン ド の 2 上位ワ ー ド と デス テ ィ ネ ー シ ョ ン ・ オペ<br />

ランドの 2 上位ワ ー ド を イ ン タ リ ー ブして、 それら をデス テ ィ ネ ー シ ョ ン ・ オペラ ン ド<br />

に書き込む。<br />

PUNPCKHDQ 命令は、 ソース ・ オペランドの上位ダブルワー ド とデスティネーション ・<br />

オペランドの上位ダブルワードをインタリ ーブして、 それらをデスティネーション ・ オ<br />

ペラン ド に書き込む。<br />

ソ ー ス ・ オペラ ン ド がすべてゼ ロ である場合、 ( デステ ィ ネーシ ョ ン ・ オペラン ド にス ト<br />

アされる ) 結果は、 デステ ィ ネ ー シ ョ ン ・ オペラン ド の元の値の上位デー タ要素がゼロ<br />

拡張 さ れた も のにな る。 PUNPCKHBW 命令では、 上位バイ ト がゼ ロ拡張され ( すなわ<br />

ち、 符号なしワー ド にアンパッ ク される )、 PUNPCKHWD 命令では、 上位ワ ー ド がゼ ロ<br />

拡張 さ れる ( 符号なしダブルワ ー ド にアンパ ッ ク さ れる )。<br />

3:838 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス<br />

mm


PUNPCKHBW/PUNPCKHWD/PUNPCKHDQ—Unpack High Packed Data ( 続き )<br />

操作<br />

IF instruction is PUNPCKHBW<br />

THEN<br />

DEST(7..0) ← DEST(39..32);<br />

DEST(15..8) ← SRC(39..32);<br />

DEST(23..16) ← DEST(47..40);<br />

DEST(31..24) ← SRC(47..40);<br />

DEST(39..32) ← DEST(55..48);<br />

DEST(47..40) ← SRC(55..48);<br />

DEST(55..48) ← DEST(63..56);<br />

DEST(63..56) ← SRC(63..56);<br />

ELSE IF instruction is PUNPCKHW<br />

THEN<br />

DEST(15..0) ← DEST(47..32);<br />

DEST(31..16) ← SRC(47..32);<br />

DEST(47..32) ← DEST(63..48);<br />

DEST(63..48) ← SRC(63..48);<br />

ELSE (* instruction is PUNPCKHDQ *)<br />

DEST(31..0) ← DEST(63..32)<br />

DEST(63..32) ← SRC(63..32);<br />

FI;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:839


PUNPCKHBW/PUNPCKHWD/PUNPCKHDQ—Unpack High Packed Data ( 続き )<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

3:840 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス


PUNPCKLBW/PUNPCKLWD/PUNPCKLDQ—Unpack Low Packed Data<br />

オペコード 命令 説明<br />

0F 60 /r PUNPCKLBW mm, mm/m32 mm および mm/m64 からの下位バイトを mm にインタ<br />

リーブする。<br />

0F 61 /r PUNPCKLWD mm, mm/m32 mm および mm/m64 からの下位ワードを mm にインタ<br />

リーブする。<br />

0F 62 /r PUNPCKLDQ mm, mm/m32 mm および mm/m64 からの下位ダブルワードを mm にイ<br />

ンタリーブする。<br />

説明<br />

デスティネーション・オペランドとソース・オペランドの下位データ要素( バイ ト、<br />

ワード、 またはダブルワード ) をデステ ィ ネーシ ョ ン ・ オペラン ド にアンパッ クしてイ<br />

ンタリ ーブする ( 図 2-23 を参照 )。 デスティネーション・オペランドは、 MMX テクノロ<br />

ジ・レジスタでなければならない。 ソース・オペランドには、 MMX テクノロジ ・ レジ<br />

スタまたはメモリ ・ ロケーションを使用できる。 ソース ・データが MMX テクノロジ ・<br />

レジスタからであるときは、 レジスタの上位32 ビットは無視される。 ソース・データが<br />

メモリからである と きは、 32 ビッ トだけがメモリからアクセスされる。<br />

図 2-23. PUNPCKLBW 命令での下位バイトのアンパックとインタリーブ<br />

PUNPCKLBW mm, mm/m32<br />

mm/m64<br />

23 22 21 20<br />

23 13 22 12 21 11 20 10<br />

mm<br />

3006032<br />

PUNPCKLBW 命令は、 ソ ー ス ・ オペラ ン ド の 4 下位バイ ト と デステ ィ ネ ー シ ョ ン ・ オペ<br />

ランドの 4 下位バイ ト を イ ン タ リ ー ブして、 それら をデス テ ィ ネ ー シ ョ ン ・ オペラ ン ド<br />

に書き込む。<br />

PUNPCKLWD 命令は、 ソ ー ス ・ オペラ ン ド の 2 下位ワ ー ド と デス テ ィ ネ ー シ ョ ン ・ オペ<br />

ランドの 2 下位ワ ー ド を イ ン タ リ ー ブして、 それら をデス テ ィ ネ ー シ ョ ン ・ オペラ ン ド<br />

に書き込む。<br />

PUNPCKLDQ 命令は、 ソース ・ オペランドの下位ダブルワー ド とデスティネーション ・<br />

オペランドの下位ダブルワードをインタリ ーブして、 それらをデスティネーション ・ オ<br />

ペラン ド に書き込む。<br />

ソ ー ス ・ オペラ ン ド がすべてゼ ロ である場合、 ( デステ ィ ネーシ ョ ン ・ オペラン ド にス ト<br />

アされる ) 結果は、 デステ ィ ネ ー シ ョ ン ・ オペラ ン ド の元の値の上位デー タ要素がゼロ<br />

拡張 さ れた も のにな る。 PUNPCKLBW 命令では、 下位バイ ト がゼ ロ拡張され ( すなわ<br />

ち、 符号なしワー ド にアンパッ ク される )、 PUNPCKLWD 命令では、 下位ワ ー ド がゼ ロ<br />

拡張 さ れる ( 符号なしダブルワ ー ド にアンパ ッ ク さ れる )。<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:841<br />

mm<br />

17 16 15 14<br />

13 12 11 10


PUNPCKLBW/PUNPCKLWD/PUNPCKLDQ—Unpack Low Packed Data ( 続き )<br />

操作<br />

IF instruction is PUNPCKLBW<br />

THEN<br />

DEST(63..56) ← SRC(31..24);<br />

DEST(55..48) ← DEST(31..24);<br />

DEST(47..40) ← SRC(23..16);<br />

DEST(39..32) ← DEST(23..16);<br />

DEST(31..24) ← SRC(15..8);<br />

DEST(23..16) ← DEST(15..8);<br />

DEST(15..8) ← SRC(7..0);<br />

DEST(7..0) ← DEST(7..0);<br />

ELSE IF instruction is PUNPCKLWD<br />

THEN<br />

DEST(63..48) ← SRC(31..16);<br />

DEST(47..32) ← DEST(31..16);<br />

DEST(31..16) ← SRC(15..0);<br />

DEST(15..0) ← DEST(15..0);<br />

ELSE (* instruction is PUNPCKLDQ *)<br />

DEST(63..32) ← SRC(31..0);<br />

DEST(31..0) ← DEST(31..0);<br />

FI;<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

3:842 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス


PUNPCKLBW/PUNPCKLWD/PUNPCKLDQ—Unpack Low Packed Data ( 続き )<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:843


PXOR—Logical Exclusive OR<br />

オペコード 命令 説明<br />

0F EF /r PXOR mm, mm/m64 mm/m64 からのクワッドワードと mm のクワッドワードと<br />

の XOR をとる。<br />

説明<br />

ソース ・オペランド ( 第 2 オペラン ド ) とデスティネーション・オペランド ( 第 1 オペラ<br />

ンド ) と の間のビ ッ ト 単位の XOR( 排他的論理和 ) 演算を実行し、 結果をデス テ ィ ネ ー<br />

ション ・ オペランド ・ ロケーションにス トアする ( 図 2-24 を参照 )。 ソース ・ オペラン<br />

ドには、 MMX テクノロジ・レジスタまたはクワッドワード・メモリ・ロケーションを<br />

使用で き る。 デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド は、 MMX テクノロジ ・ レジスタでなけ<br />

ればならない。 各ビ ッ ト の結果は、 2 つのオペラン ド の対応するビ ッ ト が異なる場合は 1<br />

にな り 、 同じ場合は 0 になる。<br />

図 2-24. PXOR 命令の動作<br />

操作<br />

mm<br />

mm/m64<br />

mm<br />

DEST ← DEST XOR SRC;<br />

影響を受けるフラグ<br />

なし。<br />

PAND mm, mm/m64<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

1111111111111000000000000000010110110101100010000111011101110111<br />

0001000011011001010100000011000100011110111011110001010110010101<br />

1110111100100001010100000011010010101011011001110110001011100010<br />

3006033<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

3:844 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス<br />

^


PXOR—Logical Exclusive OR ( 続き )<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

#GP オペラ ン ド のいずれかの部分が実効ア ド レ ス空間 0 ~<br />

FFFFH の外にある場合。<br />

#UD CR0 の EM がセッ ト された場合。<br />

#NM CR0 の TS がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ<br />

イ メン ト が合わないメモ リ 参照が行われた場合。<br />

第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス 3:845


3:846 第 3 巻 : IA-32 MMX ® テクノロジ命令リファレンス


IA-32 ストリーミング SIMD<br />

拡張命令リファレンス 3<br />

3.1 IA-32 ストリーミング SIMD 拡張命令<br />

本章では、 3D アプ リ ケ ー シ ョ ンお よ び浮動小数点演算を多用す る IA-32 アプ リ ケーシ ョ<br />

ンの処理を高速化す る ために設計された、 IA-32 ストリーミングSIMD 拡張命令について<br />

説明す る。 ス ト リ ー ミ ン グ SIMD 拡張命令についての詳細は、<br />

『IA-32 インテル ® アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル』 を参照<br />

のこ と。<br />

3.2 インテル ® アーキテクチャのストリーミング SIMD 拡張命令に<br />

ついて<br />

インテル・アーキテクチャ (IA) ストリーミング SIMD 拡張命令は、 現行の P6 世代の<br />

Pentium ® Pro プロセッサ、 Pentium II プロセッサ、 Pentium III プロセッサ上で実行される、<br />

3D グ ラ フ ィ ッ ク ス ・ アプ リ ケ ー シ ョ ンの処理を高速化す る。 ス ト リ ー ミ ング SIMD 拡張<br />

命令のプ ロ グ ラ ミ ング ・ モデルは、 MMX ® テク ノ ロジのモデルと よ く 似ているが、 4 つ<br />

の単精度浮動小数点数を格納する新しいパ ッ ク ド 浮動小数点デー タ ・ タ イ プを操作する点<br />

が異なる。<br />

スト リーミングSIMD 拡張命令には、 新しい 8 つの 128 ビット ・スト リーミングSIMD 拡<br />

張命令レ ジ ス タ を操作する、 汎用浮動小数点命令が新たに導入 された。 こ れに よ っ て、 プ<br />

ログラマは、 ス ト リ ー ミング SIMD 拡張命令 と MMX テクノロジ命令の両方を使用して、<br />

パ ッ ク ド 単精度浮動小数点数演算 と 整数演算を上手に組み合わせたアルゴ リ ズムを開発<br />

で き る。 これ ら の命令以外に、 ス ト リ ー ミ ン グ SIMD 拡張命令に は、 すべての MMX テク<br />

ノロジ ・ データ ・ タイプのキャ ッシュを制御する命令が追加された。 これらの命令には、<br />

プロセッサとの間でデータをスト リーミングするときにキャッシュの汚染を最小限に抑<br />

え る機能や、 デー タ を実際に使用する前にそのデー タ をプ リ フ ェ ッ チする機能が含ま れ<br />

る。 パ ッ ク ド 浮動小数点命令の主な目的は、 3D ジオ メ ト リ 処理の高速化である。 ま た、<br />

3D レンダリングとビデオ ・エンコーディング / デ コ ー デ ィ ン グを高速化す る ために、 追<br />

加の SIMD 整数命令が新たに定義 さ れた。新しい SIMD 命令 と キ ャ ッ シ ュ 制御命令を組み<br />

合わせる こ と に よ って、 3D グ ラ フ ィ ッ ク スの処理を大幅に高速化す る、 新しいアルゴ リ<br />

ズムの開発が可能になる。<br />

新しいス ト リ ー ミ ング SIMD 拡張命令ス テ ー ト は、 コ ン テ キス ト ・ ス イ ッ チ時に新しい状<br />

態の保存と 復元を行う ために、 OS のサポ ー ト を必要 と する。 新たに拡張された FSAVE/<br />

FRSTOR 命令は、 アプ リ ケ ー シ ョ ン と OS の新しい状態 と 既存の状態の保存 / 復元を可能<br />

にする。 これらの新しい命令を使用するためには、 アプ リ ケーシ ョ ンは、 プロセッサがス<br />

トリーミングSIMD 拡張命令をサポ ー ト してお り 、 オペレ ー テ ィ ン グ ・ シ ス テ ムがその新<br />

しい拡張をサポ ー ト している こ と を確認しなければな ら ない。 プ ロセ ッ サ と OS の両方の<br />

サポ ー ト がイ ネ ー ブルにな っ ている場合に、 ソ フ ト ウ ェ ア ・ アプ リ ケ ー シ ョ ン はその新機<br />

能を使用でき る。<br />

スト リーミングSIMD 拡張命令セ ッ ト は、 イ ン テル ・ ア ー キ テ ク チ ャ ・ マ イ ク ロ プ ロ セ ッ<br />

サ用に作成 さ れたすべての ソ フ ト ウ ェ ア と の完全な互換性を持つ。 すべての既存の ソ フ ト<br />

ウェアは、修正なしで、 スト リーミングSIMD 拡張命令を搭載す る マ イ ク ロ プ ロ セ ッ サ上<br />

で正常に動作す る。 ま た、 すべての既存の ソ フ ト ウ ェ アは、 ス ト リ ー ミ ング SIMD 拡張命<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:847


令テ ク ノ ロジを組み込んだ既存のアプ リ ケーシ ョ ンおよび新しいアプ リ ケーシ ョ ン と共<br />

存でき る。<br />

3.3 SIMD (Single Instruction, Multiple Data)<br />

スト リーミングSIMD 拡張命令は、 SIMD (Single Instruction, Multiple Data) 方式を使用す<br />

る。 SIMD 方式は、 1 つの命令で複数のデ ー タ要素を並行して処理す る と 、 ソ フ ト ウ ェ ア<br />

の処理速度をア ッ プ さ せる。 ス ト リ ー ミ ング SIMD 拡張命令は、 パ ッ ク ド 単精度浮動小数<br />

点デー タ ・ タ イプを操作する。 追加の SIMD 整数命令は、 4 つの要素からなるパ ッ ク ・<br />

データ型 ( バイ ト、 ワー ド、 またはダブルワー ド ) を操作する。 SIMD 方式が採用された<br />

理由は、ほ と ん ど の 3D グラフィ ックスおよび DSP アプ リ ケーシ ョ ンが以下の特徴を持つ<br />

ためである。<br />

• 並列処理が多用 される。<br />

• 浮動小数点値に基づいた処理のため、 ダ イ ナ ミ ッ ク ・ レ ン ジが広 く な る。<br />

• メ モ リ ・ ア ク セスのパ タ ー ンが規則的に再現 さ れる。<br />

• 局所性を も つデー タ操作が繰 り 返し実行される。<br />

• 制御フ ロ ー がデー タ に依存しない。<br />

スト リーミングSIMD 拡張命令は、 2 進浮動小数点算術演算を定義した IEEE 規格 754 に<br />

100% 適合している。 ス ト リ ー ミ ング SIMD 拡張命令には、 イ ン テル ・ アー キ テ ク チ ャ の<br />

すべての実行モー ド ( 保護モード、 実アドレス ・モード、 仮想 8086 モー ド ) からアクセ<br />

スできる。<br />

新しい機能<br />

ストリーミング SIMD 拡張命令は、 以下の新機能を備えている。 ま た、 すべての既存の<br />

IA マイクロプロセッサ、 IA アプリ ケーシ ョ ン、 およびオペレーティ ング ・ システムに対<br />

す る下方互換性 も 維持してい る。<br />

• 新しいデー タ ・ タ イプ<br />

• 8 つのス ト リ ー ミ ング SIMD 拡張命令レ ジ ス タ<br />

• 拡張 さ れた命令セ ッ ト<br />

スト リーミングSIMD 拡張命令は、 こ れ ら の機能を利用す る アプ リ ケ ー シ ョ ンのパ フ ォ ー<br />

マン ス を強化す る。<br />

3.4 新しいデータ・タイプ<br />

スト リーミングSIMD 拡張命令の主なデ ー タ ・ タ イ プは、 パ ッ ク ド 単精度浮動小数点オペ<br />

ラン ド である。 これは、 厳密には次の内容を持つ。<br />

• 4 つの 32 ビッ ト単精度(SP) 浮動小数点数 ( 図 3-1)<br />

SIMD 整数命令は、 パ ッ ク ド ・ バ イ ト 、 パ ッ ク ド ・ ワ ー ド 、 ま たはパ ッ ク ド ・ ダブルワ ー<br />

ド・データ型を操作する。プリフェッチ命令は、サイズが32 バイ ト またはそれ以上の型<br />

なしデ ー タ を処理す る。<br />

図 3-1. パックド単精度浮動小数点データ・タイプ<br />

127 96 95 65 63 32 31 0<br />

パックド単精度浮動小数点数<br />

3:848 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


3.5 ストリーミング SIMD 拡張命令レジスタ<br />

スト リーミングSIMD 拡張命令は、 8 つの 128 ビ ッ ト 汎用レ ジ ス タ を操作す る。 各レ ジ ス<br />

タは、 直接ア ド レ ス指定でき る、 これらのレ ジス タ は新しいステ ー ト であ り、 これら のレ<br />

ジ ス タ を使用す る には、 オペレ ー テ ィ ン グ ・ シ ス テ ムのサポ ー ト が必要である。<br />

スト リーミングSIMD 拡張命令レ ジ ス タ は、 128 ビッ トのパック ・データを格納できる。<br />

スト リーミングSIMD 拡張命令は、 レ ジ ス タ名 XMM0 ~ XMM7 を使用して、 各ス ト リ ー<br />

ミングSIMD 拡張命令レ ジ ス タ に直接ア ク セスす る ( 図 3-2)。<br />

図 3-2. ストリーミング SIMD 拡張命令レジスタ・セット<br />

スト リーミングSIMD 拡張命令レ ジ ス タ は、 デ ー タ の計算に使用で き る が、 メ モ リ のア ド<br />

レ ス指定に は使用で き ない。ア ド レ ス指定は、整数レ ジ ス タ と 既存の IA アドレス指定モー<br />

ドを使って行われる。<br />

スト リーミングSIMD 拡張命令レ ジ ス タ の内容は、 リ セ ッ ト 時に ク リ ア さ れる。<br />

また、新しい制御/ ステータス・レジスタ MXCSR が追加されている MXCSR を使用して、<br />

数値例外処理のマス ク / アンマス ク の設定、 丸めモー ド の設定、 ゼ ロ ・ フ ラ ッ シ ュ ・ モー<br />

ドの設定、 ステータス・フラグの表示が行える。<br />

3.6 拡張された命令セット<br />

XMM7<br />

XMM6<br />

XMM5<br />

XMM4<br />

XMM3<br />

XMM2<br />

XMM1<br />

XMM0<br />

スト リーミングSIMD 拡張命令は、 2 つのパ ッ ク ・ デ ー タ ・ オペラ ン ド のすべての要素の<br />

ペアまたは最下位の要素のペアを並行して処理する、 多数の命令を備えている。 パ ッ ク ド<br />

命令は、 図 3-3 に示すよ うに、 オペラン ドのペアを操作する。 スカラ命令は、 図 3-4 に示<br />

すように、 常に 2 つのオペラ ン ド の最下位の要素のペアを操作する。 ス カ ラ操作では、 第<br />

1 オペラン ド の上位 3 つの要素は、 その ま ま デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド に渡 さ れる。<br />

一般的に、 アライメン ト の合っていないデー タのロ ー ド / ストア命令を除くすべての命令<br />

で、 メモリ ・ オペランドのアドレスは、 16 バイ ト にアライメン トが合っていなければな<br />

らない。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:849


図 3-3. パックド操作<br />

図 3-4. スカラ操作<br />

3.6.1 命令グループの概要<br />

3.6.1.1 算術演算命令<br />

X1 (SP) X2 (SP) X3 (SP) X4 (SP)<br />

Y1 (SP) Y2 (SP) Y3 (SP) Y4 (SP)<br />

OP<br />

OP<br />

X1 op Y1 (SP) X2 op Y2 (SP) X3 op Y3 (SP) X4 op Y4 (SP)<br />

パックド / スカラ・データの加算と減算<br />

ADDPS (Add packed single-precision floating-point) 命令は、 パ ッ ク ド 単精度浮動小数点オペ<br />

ラ ン ド の要素の4つのペアを加算する。SUBPS (Subtract packed single-precision floating-point)<br />

命令は、 パ ッ ク ド 単精度浮動小数点オペラ ン ド の要素の 4 つのペアを減算する。<br />

ADDSS (Add scalar single-precision floating-point) 命令は、 パ ッ ク ド 単精度浮動小数点オペ<br />

ラ ン ド の最下位の要素のペアを加算する。 SUBSS (Subtract scalar single-precision<br />

floating-point) 命令は、パ ッ ク ド 単精度浮動小数点オペラ ン ド の最下位の要素のペアを減算<br />

する。 上位3 フィールドは、 ソース・オペランドからそのまま渡される。<br />

パックド / スカラ・データの乗算と除算<br />

MULPS (Multiply packed single-precision floating-point) 命令は、 パ ッ ク ド 単精度浮動小数点<br />

オペラ ン ド の要素の 4 つのペアを乗算する。<br />

MULSS (Multiply scalar single-precision floating-point) 命令は、 パ ッ ク ド 単精度浮動小数点オ<br />

ペラ ン ド の最下位の要素のペアを乗算する。 上位 3 フィールドは、 ソース・オペランドか<br />

らそのまま渡される。<br />

DIVPS (Divide packed single-precision floating-point) 命令は、 パ ッ ク ド 単精度浮動小数点オ<br />

ペラン ドの要素の 4 つのペアを除算する。<br />

3:850 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス<br />

OP<br />

OP<br />

X1 (SP) X2 (SP) X3 (SP) X4 (SP)<br />

Y1 (SP) Y2 (SP) Y3 (SP) Y4 (SP)<br />

OP<br />

X1 (SP) X2 (SP) X3 (SP) X4 op Y4 (SP)


DIVSS (Divide scalar single-precision floating-point) 命令は、 パ ッ ク ド 単精度浮動小数点オペ<br />

ラ ン ド の最下位の要素のペアを除算する。 上位 3 フィールドは、 ソース・オペランドから<br />

そのま ま渡される。<br />

パックド / スカラ・データの平方根<br />

SQRTPS (Square root packed single-precision floating-point) 命令は、 パ ッ ク ド 単精度浮動小数<br />

点数の 4 つの要素の平方根を、 ソ ー ス ・ オペラ ン ド か ら デス テ ィ ネ ー シ ョ ン ・ レ ジ ス タ に<br />

返す。<br />

SQRTSS (Square root scalar single-precision floating-point) 命令は、 パ ッ ク ド 単精度浮動小数<br />

点数の最下位の要素の平方根を、 ソ ー ス ・ オペラ ン ド か ら デス テ ィ ネ ー シ ョ ン ・ レ ジ ス タ<br />

に返す。 上位 3 フィールドは、 ソース・オペランドからそのまま渡される。<br />

パック・データの最大 / 最小<br />

MAXPS (Maximum packed single-precision floating-point) 命令は、 パ ッ ク ド 単精度浮動小数<br />

点数の要素の各ペアの最大値を、 デスティネーション・レジスタに返す。<br />

MAXSS (Maximum scalar single-precision floating-point) 命令は、 パ ッ ク ド 単精度浮動小数点<br />

数の最下位の要素のペアの最大値を、デステ ィ ネ ー シ ョ ン・レ ジスタ に返す。上位 3 フィー<br />

ルドは、 ソース ・ オペランドからデスティネーション ・ レジスタにそのまま渡される。<br />

MINPS (Minimum packed single-precision floating-point) 命令は、 パ ッ ク ド 単精度浮動小数点<br />

数の要素の各ペアの最小値を、 デステ ィ ネ ー シ ョ ン ・ レ ジ ス タ に返す。<br />

MINSS (Minimum scalar single-precision floating-point) 命令は、 パ ッ ク ド 単精度浮動小数点<br />

数の最下位の要素のペアの最小値を、デステ ィ ネ ー シ ョ ン・レ ジスタ に返す。上位 3 フィー<br />

ルドは、 ソース ・ オペランドからデスティネーション ・ レジスタにそのまま渡される。<br />

3.6.1.2 論理演算命令<br />

3.6.1.3 比較命令<br />

ANDPS (Bit-wise packed logical AND for single-precision floating-point) 命令は、 2 つのオペラ<br />

ンドの間のビット単位のAND ( 論理積 ) を返す。<br />

ANDNPS (Bit-wise packed logical AND NOT for single-precision floating-point) 命令は、 2 つの<br />

オペラ ン ド の間のビ ッ ト 単位の AND NOT ( 否定論理積 ) を返す。<br />

ORPS (Bit-wise packed logical OR for single-precision floating-point) 命令は、 2 つのオペラン<br />

ド の間のビ ッ ト 単位の OR ( 論理和 ) を返す。<br />

XORPS (Bit-wise packed logical XOR for single-precision floating-point) 命令は、 2 つのオペラ<br />

ンドの間のビット単位のXOR ( 排他的論理和 ) を返す。<br />

CMPPS (Compare packed single-precision floating-point) 命令は、 プ レ デ ィ ケ ー ト に即値オペ<br />

ラ ン ド を使用して、 パ ッ ク ド 単精度浮動小数点数の要素の 4 つのペアを比較し、SP フィー<br />

ルドごとにその結果をすべて"1" の 32 ビッ ト ・マスクまたはすべて"0" の 32 ビット ・マ<br />

スクで返す。 この命令は、 12 の比較条件をすべてサポー ト している ( 等しい、 よ り小さ<br />

い、 よ り 小さ いか等しい、 よ り大きい、 よ り 大きいか等しい、 比較不能、 等し く ない、 よ<br />

り小さくない、 より小さくなく等しくない、 より大きくない、 より大きくなく等しくな<br />

い、 比較可能 )。<br />

CMPSS (Compare scalar single-precision floating-point) 命令は、 CMPPS と同じよ うに、 プレ<br />

デ ィ ケ ー ト に即値オペラ ン ド を使用して、 パ ッ ク ド 単精度浮動小数点数の最下位の要素の<br />

ペアを比較し、 SP フィールドごとにその結果をすべて"1" の 32 ビット ・マスクまたはす<br />

べて "0" の 32 ビッ ト ・マスクで返す。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:851


COMISS (Compare scalar single-precision floating-point ordered and set EFLAGS) 命令は、 パ ッ<br />

ク ド 単精度浮動小数点数の最下位の要素のペアを比較し、 EFLAGS レジスタの ZF、 PF、<br />

CF ビットをセットする(OF、 SF、 AF ビッ トはクリアされる)。<br />

UCOMISS (Unordered compare scalar single-precision floating-point ordered and set EFLAGS) 命<br />

令は、 パ ッ ク ド 単精度浮動小数点数の最下位の要素のペアを比較し、 上の説明に従っ て<br />

EFLAGS レジスタのZF、PF、CF ビットをセットする(OF、SF、AF ビットはクリアされる)。<br />

3.6.1.4 シャッフル命令<br />

SHUFPS (Shuffle packed single-precision floating-point) 命令は、 第 1 ソース・オペランドの<br />

パ ッ ク ド 単精度浮動小数点数の 4 つの要素をシャ ッ フルして、 デステ ィ ネーシ ョ ン ・ オペ<br />

ランドの下位2 フ ィ ー ル ド に格納す る。 ま た、 第 2 ソ ー ス ・ オペラ ン ド のパ ッ ク ド 単精度<br />

浮動小数点数の 4 つの要素をシャッフルして、 デスティネーション・オペランドの上位2<br />

フィールドを生成する( 図 3-5)。 SHUFPS 命令は、 両方の ソ ー ス ・ オペラ ン ド に対して同<br />

じレジスタを使用すると、このレジスタから 4 つの単精度浮動小数点数を自由に組み合わ<br />

せて返せる。<br />

図 3-5. パック・データのシャッフル操作<br />

UNPCKHPS (Unpacked high packed single-precision floating-point) 命令は、 第 1 のパッ ク ド 単<br />

精度浮動小数点オペラ ン ド の上位のデー タ要素 と 第2のパ ッ ク ド 単精度浮動小数点オペラ<br />

ンドの上位のデータ要素をアンパックしてインタリーブする。 この命令は、各ソース・オ<br />

ペラ ン ド の下位半分を無視す る ( 図 3-6)。 メモリ・オペランドからアンパックする場合は、<br />

この命令は、 128 ビット ・メモリ ・オペランド全体にアクセスし、 上位 64 ビッ トだけを<br />

使用す る。<br />

図 3-6. アンパック・ハイ操作<br />

X4 X3 X2 X1<br />

Y4 Y3 Y2 Y1<br />

{Y4 ... Y1} {Y4 ... Y1} {X4 ... X1} {X4 ... X1}<br />

X4 X3 X2 X1<br />

Y4 Y3 Y2 Y1<br />

Y4 X4 Y3 X3<br />

3:852 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


3.6.1.5 変換命令<br />

UNPCKLPS (Unpacked low packed single-precision floating-point) 命令は、 第 1 のパッ ク ド 単<br />

精度浮動小数点オペラ ン ド の下位のデー タ要素 と 第2のパ ッ ク ド 単精度浮動小数点オペラ<br />

ンドの下位のデータ要素をアンパックしてインタリーブする。 この命令は、各ソース・オ<br />

ペラ ン ド の上位半分を無視す る ( 図 3-7)。 メモリ・オペランドからアンパックする場合は、<br />

この命令は、 128 ビット ・メモリ ・オペランド全体にアクセスし、 下位 64 ビッ トだけを<br />

使用す る。<br />

図 3-7. アンパック・ロー操作<br />

X4 X3 X2 X1<br />

Y4 Y3 Y2 Y1<br />

Y2 X2 Y1 X1<br />

変換命令は、 128 ビットのスト リーミングSIMD 拡張命令レ ジ ス タ と 、 64 ビッ トのMMX<br />

テクノロジ整数レジスタまたは32 ビットのIA32 整数レ ジ ス タ の間で、 パ ッ ク ・ デ ー タ ま<br />

たはスカラ ・ データの変換を実行する。 x87-FP 命令が存在す る場合、 パ ッ ク ・ デー タの<br />

変換命令は、 元の MMX 命令と同じ動作をする。 これには、 次の動作が含まれる。<br />

• x87-FP から MMX テクノロジに移行する (TOS=0、 FP 有効ビ ッ ト はすべて有効に設<br />

定される )。<br />

• MMX 命令は、 対応す る x87-FP レ ジ ス タ の指数部に 1 を書き込む。<br />

• EMMS 命令を使用して、 MMX テクノロジから x87-FP に移行する。<br />

CVTPI2PS (Convert packed 32-bit integer to packed single-precision floating-point) 命令は、MMX<br />

テクノロジ ・ レジスタ内の2 つの符号付き 32 ビッ ト整数を、 下位2 つの単精度浮動小数<br />

点数に変換す る。 変換が不正確であ る場合は、 MXCSR の丸めモー ド に従っ て丸め られた<br />

値が返される。 デスティネーション・レジスタの上位2 つの値は保持される。<br />

CVTSI2SS (Convert scalar 32-bit integer to scalar single-precision floating-point) 命令は、 MMX<br />

テクノロジ ・ レジスタ内の1 つの符号付き 32 ビ ッ ト 整数を、 最下位の単精度浮動小数点<br />

数に変換する。 変換が不正確である場合は、 MXCSR の丸めモー ド に従って丸められた値<br />

が返される。 デスティネーション ・ レジスタの上位3 つの値は保持される。<br />

CVTPS2PI (Convert packed single-precision floating-point to packed 32-bit integer) 命令は、 下<br />

位 2 つの単精度浮動小数点数を、 MMX テクノロジ・レジスタ内の2 つの符号付き 32 ビッ<br />

ト 整数に変換す る。 変換が不正確である場合は、 MXCSR の丸めモー ド に従って丸められ<br />

た値が返される。CVTTPS2PI (Convert truncate packed single-precision floating-point to packed<br />

32-bit integer) 命令は、 CVTPS2PI 命令に よ く 似てい る が、 変換が不正確であ る場合は、 切<br />

り捨てられた値が返される。<br />

CVTSS2SI (Convert scalar single-precision floating-point to a 32-bit integer) 命令は、 最下位の<br />

単精度浮動小数点数を、 イ ン テル ・ アー キ テ ク チ ャ 32 ビ ッ ト 整数レ ジ ス タ内の符号付き<br />

32 ビ ッ ト 整数に変換す る。 変換が不正確であ る場合は、 MXCSR の丸めモー ド に従って丸<br />

め られた値が返される。 CVTTSS2SI (Convert truncate scalar single-precision floating-point to<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:853


scalar 32-bit integer) 命令は、 CVTSS2SI 命令に よ く 似ているが、 変換が不正確である場合<br />

は、 切り捨てられた値が返される。<br />

3.6.1.6 データ転送命令<br />

MOVAPS (Move aligned packed single-precision floating-point) 命令は、 128 ビットのパック・<br />

データを、 メモリ とス ト リ ー ミング SIMD 拡張命令レジスタの間で転送するか、 あるいは<br />

スト リーミングSIMD 拡張命令レ ジ ス タ間で転送す る。 メ モ リ ・ ア ド レ ス は 16 バイ ト に<br />

アライメントが合っていなければならない。 アライメントが合っていない場合は、一般保<br />

護例外が発生す る。<br />

MOVUPS (Move unaligned packed single-precision floating-point) 命令は、 128 ビッ トのパッ<br />

ク・データを、 メモリとストリーミングSIMD 拡張命令レ ジ ス タ の間で転送するか、 あ る<br />

いはス ト リ ー ミ ング SIMD 拡張命令レ ジ ス タ間で転送す る。 こ の命令は、 デ ー タ のアラ イ<br />

メン トが合っていなくてもかまわない。<br />

MOVHPS (Move aligned high packed single-precision floating-point) 命令は、 64 ビッ トのパッ<br />

ク・データを、メモリとストリーミングSIMD 拡張命令レ ジ ス タ の上位 2 フィールドの間<br />

で転送する。 下位 2 フィールドはそのまま残される。<br />

MOVLPS (Move aligned low packed single-precision floating-point) 命令は、 64 ビッ トのパッ<br />

ク・データを、メモリとストリーミングSIMD 拡張命令レ ジ ス タ の下位 2 フィールドの間<br />

で転送する。 上位 2 フィールドはそのまま残される。<br />

MOVMSKPS (Move mask packed single-precision floating-point) 命令は、 4 つのパ ッ ク ド 単精<br />

度浮動小数点数の各要素の最上位ビ ッ ト を、 IA 整数レ ジ ス タ に転送する。 こ の 4 ビッ ト<br />

の値は、 分岐の実行条件 と して使用される。<br />

MOVSS (Move scalar single-precision floating-point) 命令は、 32 ビ ッ ト 単精度浮動小数点数<br />

を、 メモ リ と ス ト リ ー ミ ング SIMD 拡張命令レジスタの間で転送するか、 あるいはレジス<br />

タ間で転送する。<br />

3.6.1.7 ステート管理命令<br />

LDMXCSR (Load Streaming SIMD Extension Control and Status Register) 命令は、 ス ト リ ー ミ<br />

ング SIMD 拡張命令の制御 / ステータス ・ レジスタの内容をメモリからロー ドする。<br />

STMXCSR (Store Streaming SIMD Extension Control and Status Register) 命令は、 ス ト リ ー ミ<br />

ング SIMD 拡張命令の制御 / ステータス ・ ワー ド をメモリ にス ト アする。<br />

FXSAVE 命令は、 FP ステー ト、 MMX テク ノロジ ・ ステー ト、 ス ト リ ー ミ ング SIMD 拡<br />

張命令ス テ ー ト を メ モ リ に保存す る。 FSAVE とは異なり、 FXSAVE は、 x87-FP ステー ト<br />

をクリアしない。 FXRSTOR 命令は、 FP ステー ト、 MMX テクノロジ ・ ステー ト、 スト<br />

リーミングSIMD 拡張命令ス テ ー ト を メ モ リ か ら ロ ー ド する。<br />

3.6.1.8 追加の SIMD 整数命令<br />

3.6.1.5 項で説明した変換命令 と 同じ よ う に、 追加の SIMD 整数命令は、 x87-FP 命令が存在<br />

する場合、 元の MMX 命令 と 同じ動作をす る。<br />

PAVGB/PAVGW (Average unsigned source sub-operands, without incurring a loss in precision) 命<br />

令は、 ソース・オペランドの符号なしデータ要素をデスティネーション・レジスタの符号<br />

なしデ ー タ要素に加算する。 加算の結果は、 それぞれ独立して、 1 ビッ トずつ右にシフト<br />

さ れる。 各要素の最上位ビ ッ ト は、 和のキ ャ リ ー ・ ビ ッ ト で埋め ら れる。 累積的な丸め誤<br />

差を防 ぐ ために、 平均計算が実行 さ れる。 シ フ ト 前の中間結果の最下位 2 ビットのうち1<br />

つ以上が 1 である場合は、 シ フ ト 後の各最終結果の最下位ビ ッ ト は 1 にセッ ト される。<br />

3:854 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


PEXTRW (Extract 16-bit word from MMX technology register) 命令は、 即値オペラ ン ド の最下<br />

位 2 ビッ トによって選択される MMX テクノロジ ・ レジスタ内の1 ワードを、 32 ビッ ト<br />

整数レ ジ ス タ の下位半分に移動す る。 整数レ ジ ス タ の上位ワ ー ド は ク リ ア さ れる。<br />

PINSRW (Insert 16-bit word into MMX technology register) 命令は、 32 ビッ ト整数レジスタ内<br />

の下位ワ ー ド ま たは メモ リ 内の 16 ビッ ト ・ワードを、 即値オペランドの最下位2ビッ ト<br />

によって選択される、 MMX テクノロジ・レジスタ内の4 つのワー ド ・ ロケーシ ョ ンの う<br />

ち 1 つに移動す る。<br />

PMAXUB/PMAXSW (Maximum of packed unsigned integer bytes or signed integer words) 命令<br />

は、 パ ッ ク された要素の各ペアの最大値をデステ ィ ネーシ ョ ン ・ レ ジスタに返す。<br />

PMINUB/PMINSW (Minimum of packed unsigned integer bytes or signed integer words) 命令は、<br />

パ ッ ク さ れた要素の各ペアの最小値をデス テ ィ ネ ー シ ョ ン ・ レ ジ ス タ に返す。<br />

PMOVMSKB (Move Byte Mask from MMX technology register) 命令は、 MMX テクノロジ ・<br />

レジスタ内のソース・オペランドの各バイトの最上位ビットから作成される 8 ビッ ト・マ<br />

スクを、 IA 整数レ ジ ス タ に返す。<br />

PMULHUW (Unsigned high packed integer word multiply in MMX technology register) 命令は、<br />

2 つのソース MMX テ ク ノ ロ ジ ・ レ ジ ス タ の各ワ ー ド ・ フ ィ ー ル ド の符号なし乗算を実行<br />

し、 各乗算結果の上位ワ ー ド を MMX テクノロジ ・ レジスタに返す。<br />

PSADBW (Sum of absolute differences) 命令は、 ソ ー ス ・ サブオペラ ン ド ・ バイ ト の各ペア<br />

の差の絶対値を計算し、 8 つの差を累積して 1 つの 16 ビ ッ ト の結果を求め る。<br />

PSHUFW (Shuffle packed integer word in MMX technology register) 命令は、8 ビッ ト即値オペ<br />

ランドを使用して、 ソース・オペランドのワー ド ・ フ ィ ールドのフル・シャ ッフルを実行<br />

し、 その結果をデス テ ィ ネ ー シ ョ ン ・ オペラ ン ド の任意の ワ ー ド ・ フ ィ ー ル ド に格納す る。<br />

3.6.1.9 キャッシュ制御命令<br />

プ ロ グ ラ マが参照す る デー タ は、 時間的な局所性 ( デー タ が再び使用 さ れる ) または空間<br />

的な局所性 ( データが隣接する位置に、 例えば同じキャ ッ シュ ・ ライン上に置かれる ) を<br />

持つこ と がある。 3D グラフ ィ ッ クス ・ アプリケーションの表示リス トなど、 いくつかの<br />

マルチ メ デ ィ ア ・ デー タ型は、 一度参照 さ れる と 、 す ぐ に再使用 さ れる こ と はない。 こ の<br />

ようなデータ ・ タイプを、 非テンポラル・データと呼ぶ。 プログラムを作成するときは、<br />

アプ リ ケーシ ョ ンのキャ ッ シュ されたコ ー ド とデータが、 できるだけ非テンポラル・デー<br />

タ に よ っ て上書き さ れない よ う に注意す る必要がある。 キ ャ ッ シ ュ 制御命令に よ っ て、 プ<br />

ログラマは、 非テンポラルなアクセスによるキャ ッシュ汚染を最小限に抑えるよ うに、<br />

キャッシュ動作を制御できる。<br />

また、実行エンジンがデータ待ちでストールしないように、実行エンジンにデータを供給<br />

する必要がある。 ス ト リ ー ミング SIMD 拡張命令に よ っ て、 プ ロ グ ラ マは、 デー タ を実際<br />

に使用する前に、 そのデータをプリフェッチできる。 プリフェッチ命令は、 アーキテク<br />

チ ャ上の状態を更新しないため、 ア ー キテ ク チ ャ 命令ではない。 ま た、 プ リ フ ェ ッ チ命令<br />

は、 各プロセッサ ・ モデルに固有である。 これらの命令を利用するには、 プログラマがプ<br />

ロセッサ ・モデルに合わせてアプ リ ケーシ ョ ンを調整する必要がある。 プ リ フ ェ ッ チ命令<br />

は、単にハードウェアにヒントを与えるものであり、 これらの命令によって例外やフォル<br />

ト は発生しない。 必要以上のプ リ フ ェ ッ チ命令の使用は、 プ ロ セ ッ サに よ っ て制限される<br />

場合があ る。<br />

以下の 4 つの命令は、 キャ ッ シュ階層に ヒ ン ト を与える と、 キャ ッ シュ階層の異なる レベ<br />

ルにデータをプ リ フェ ッチし、 非テンポラル・データによ るキャ ッシュ汚染を最小限に抑<br />

えられる。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:855


MASKMOVQ (Non-temporal byte mask store of packed integer in a MMX technology register) 命<br />

令は、 MMX テクノロジ ・ レジスタから、 EDI レジスタで指定されたロケーションにデー<br />

タ を ス ト アす る。 こ の命令は、 第 2 の MMX テクノロジ・マスク・レジスタの各バイトの<br />

最上位ビ ッ ト を使用して、 第 1 の MMX テクノロジ・レジスタのデータを、 バイトごとに 選択した上で書き込む。 こ の命令は、 WC メ モ リ ・ タ イ プのすべての特性を持つ、 暗黙的<br />

に順序設定の緩いメモ リ 操作になる。 すなわち、 非テンポ ラルなス ト アを連続して実行す<br />

る と、 デー タがプログ ラムの順序でメモ リ に書き込まれない場合がある。 ラ イ ト ・ アロ<br />

ケー トは行われず( プ ロ セ ッ サは、 ス ト アを実行す る前に、 対応す る キ ャ ッ シ ュ ・ ラ イ ン<br />

を キ ャ ッ シ ュ 階層内に フ ェ ッ チしない )、 ライト・コンバイン/ コラプスが行われ、キャッ<br />

シ ュ汚染が最小限に抑え ら れる。<br />

MOVNTQ (Non-temporal store of packed integer in a MMX technology register) 命令は、 MMX<br />

テ ク ノ ロ ジ ・ レ ジ ス タ か ら メ モ リ にデー タ を ス ト アす る。 こ の命令は、 暗黙的に順序設定<br />

の緩いメモ リ 操作にな り 、 ラ イ ト ・ アロ ケ ー ト は行われず、 キ ャ ッ シ ュ汚染が最小限に抑<br />

えられる。<br />

MOVNTPS (Non-temporal store of packed single-precision floating-point) 命令は、 ス ト リ ー ミ<br />

ング SIMD 拡張命令レ ジ ス タ か ら メ モ リ にデ ー タ を ス ト アする。 メ モ リ ・ ア ド レ ス は 16<br />

バイ ト にアライメン トが合っていなければならない。 アライメン トが合っていない場合<br />

は、 一般保護例外が発生する。 こ の命令は、 暗黙的に順序設定の緩いメモ リ 操作にな り 、<br />

ラ イ ト ・ アロ ケ ー ト は行われず、 キ ャ ッ シ ュ 汚染が最小限に抑え ら れる。<br />

非テンポラルなス ト ア と通常のキャ ッ シュ可能ス ト アの主な相違点は、 ラ イ ト ・ アロケー<br />

ションのポリシーの違いである。非テンポラルなヒントは、書き込み先エリアのメモリ・<br />

タ イ プに よ っ て無効に される可能性があ る ため、 以下の事項に注意する必要があ る。<br />

• プ ロ グ ラ マが、 キ ャ ッ シ ュ 不可メ モ リ に対する非テ ン ポ ラ ルなス ト アを指定した場<br />

合は、 キ ャ ッ シ ュ不可ス ト ア と 同様のス ト ア操作が行われる。 つ ま り 、 非テ ン ポ ラ<br />

ルな ヒ ン ト は無視 さ れ、 そのエ リ アの メ モ リ ・ タ イ プは変更されない。 キ ャ ッ シ ュ<br />

不可の用語は、 書き込み先エ リ アが UC または WP メモリ ・ タイプとしてマッピン<br />

グされているの意味である。 メモリ ・エリアがWB、 WT、 または WC としてマッピ<br />

ン グ さ れてい る場合は、 非テ ン ポ ラ ルなス ト アを指定す る と 、 順序設定の緩い (WC)<br />

セマンテ ィ ッ クスの動作が実行される。<br />

• プ ロ グ ラ マが、 キ ャ ッ シ ュ 可能メ モ リ に対する非テ ン ポ ラ ルなス ト アを指定した場<br />

合は、 結果は次のいずれかになる。<br />

• デ ー タ がキ ャ ッ シ ュ 階層内にある場合は、 その命令が整合性を保証する。 ただ<br />

し、 これを実現する方法は、 プロセッサによって異なる。 例えば、 キャッシュ階<br />

層内の同じ位置でデ ー タ を更新し、 そのエ リ アに割 り 当て ら れたメ モ リ ・ タ イ プ<br />

のセマンテ ィ ッ クスを変えないこ と ができ る。 あるいは、 キャ ッ シュからデータ<br />

を排出して、 新しい非テンポラルなデー タを (WC のセマンテ ィ ッ クスを持つ )<br />

メモリ に書き込める。<br />

• データがキャ ッシュ階層内にな く、 書き込み先エリアが WB、 WT、 または WC<br />

と してマ ッ ピング されている場合は、 ト ランザク シ ョ ンは順序設定の緩いメモ リ<br />

操作になり、 すべての WC メモリのセマンティ ッ クスが適用される。 非テンポ<br />

ラルなス ト アは、 ラ イ ト ・ アロケー ト を行わない。 プロセッ サに よ っては、 これ<br />

らのストアのコラプスと コンバインを行う ものがある。<br />

• 一般的に、 WC のセマンテ ィ ッ クスでは、 ソフ ト ウ ェアが、 他のプロセッサおよび他<br />

のシステム ・ エージェン ト ( グラフ ィ ック ・ カー ドなど ) に対するコヒーレンシを保<br />

証する必要がある。 デー タ を生産するルーチン と 消費するルーチンのモデルを使用す<br />

る場合は、 適切な同期処理 と フ ェ ンス操作 ( 後述の SFENCE を参照 ) を実行しなけれ<br />

ばならない。 フ ェンス操作は、 すべてのシステム ・ エージ ェ ン ト が、 ス ト アされた<br />

デー タ をグ ロ ーバルに参照で き る よ う に保証する。 例えば、 フ ェ ンスを実行しない<br />

と、 書き込まれたキャッシュ ・ ラインがプロセッサ内に滞留し、 他のエージェントが<br />

3:856 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


そのラ イ ン を参照で き な く なる可能性がある。 ま た、 プ ロ セ ッ サに よ っ ては、 すでに<br />

キャ ッシュ階層内にあるデータを同じ位置で更新するこ とによって、 非テンポラルな<br />

ストアを実行するものがある。 このようなプロセッサでは、 書き込み先エリアが WC<br />

と してマ ッ ピングされている必要がある。 WB または WT と してマッ ピングされてい<br />

ると、 プロセッサのスペキュレーティブな読み込みによって、 データがキャッシュに<br />

ロ ー ド される可能性がある。 こ の場合、 非テン ポ ラルなス ト アを指定する と 、 デー タ<br />

が同じ位置で更新されるため、 その次のフ ェ ンス操作でデー タがプロセ ッ サか ら フ<br />

ラッシュされなくなる。<br />

• メ モ リ ・ タ イ プのエ イ リ アスが使用 さ れている場合、 バス上で参照可能な メ モ リ ・<br />

タイプは、 プロセッサによって異なる。 1 つの例と して、 バスに書き込まれる メモ<br />

リ・タイプが、( プ ロ グ ラ ムの順序で ) そのラ イ ンに対する最初のス ト アのメモ リ ・<br />

タ イ プを反映す る方式があ る。 プ ロ セ ッ サに よ っ ては、 その他の方式が使用 さ れる<br />

可能性 も ある。 したが って、 この動作は予約済み と 見なす必要がある。 特定のプロ<br />

セ ッ サの動作に依存す る と 、 今後のプ ロ セ ッ サ と の互換性を損な う おそれがあ る。<br />

PREFETCH (Load 32 or greater number of bytes) 命令は、 非テ ン ポ ラ ルなデー タ ま たは テ ン<br />

ポラルなデータを、 指定したキャッシュ ・ レベルにロードする。 このアクセスとキャッ<br />

シ ュ ・ レベルは、 ヒ ン ト と して指定 さ れる。 プ リ フ ェ ッ チ命令は、 プ ロ グ ラ ムの機能に影<br />

響を与えない。 プ リ フ ェ ッチ命令の機能は、 プロセッ サによ って異なる。<br />

SFENCE (Store Fence) 命令は、 プ ロ グ ラ ムの順序内でス ト ア ・ フ ェ ンス命令に先行するす<br />

べてのス ト ア命令が、 フ ェ ン ス に後続す る ス ト ア命令 よ り 前に、 グ ロ ーバルに参照可能に<br />

なるこ とを保証する。 SFENCE 命令は、 順序設定の緩い結果を生成するルーチン と その<br />

デ ー タ を消費す る ル ー チンの間の メ モ リ ・ア ク セスの順序を保証す る ための効率的な方法<br />

である。<br />

3.7 IEEE 規格への適合性<br />

ストリーミング SIMD 拡張命令の浮動小数点計算は、 コ ン ト ロ ー ル ・ ワ ー ド がゼ ロ ・ フ<br />

ラッシュ ・モードに設定されている場合を除いて、 IEEE-754 規格に適合する。 IEEE-754<br />

規格への適合には、 単精度符号付き無限大、 QNaN、 SNaN、 整数不定値、 符号付きゼロ、<br />

デノーマル数、 マスクされている例外とマスクされていない例外のサポー トが含まれる。<br />

単精度浮動小数点値は、 プ ロ セ ッ サ内 と メ モ リ 内で同じ よ う に表現 さ れ、 以下の形式を と<br />

る。<br />

符号部 指数部 仮数部<br />

31 30...23 22...0<br />

これは x87 浮動小数点計算か ら の変更点である。 x87 浮動小数点計算では、 すべての数値<br />

を 80 ビ ッ ト 拡張フ ォ ー マ ッ ト で内部的に表現する。 こ の変更のため、 ス ト リ ー ミ ング<br />

SIMD 拡張命令を使用で き る よ う に書き直 さ れた x87-FP ラ イ ブ ラ リ で得 ら れる計算結果<br />

は、 元の x87-FP ラ イ ブ ラ リ の計算結果 と 一致しない こ と があ る。<br />

こ の節では、 プ ロ セ ッ サ内で浮動小数点フ ォ ー マ ッ ト で実数を表現す る方法について説明<br />

す る。 ま た、 正規化数、 デ ノ ー マル数、 バイ アス された指数、 符号付き ゼ ロ、 NaN など<br />

の用語について も 説明する。 浮動小数点演算 と IEEE 規格についてすでに よ く 理解してい<br />

る読者は、 この節を読まな く てもかまわない。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:857


3.7.1 実数体系<br />

図 3-8 に示す よ う に、実数体系は、マ イ ナス無限大 (-∞) からプラス無限大(+∞) までの実数の<br />

連続体で構成 さ れる。<br />

図 3-8. 2 進実数体系<br />

コンピュータが使用できるレジスタのサイズと数には制限があるため、 実数の計算では、<br />

実数の連続体の一部しか使用で き ない。 図 3-1 の下部に示す よ う に、 特定のプ ロ セ ッ サが<br />

サポ ー ト する実数の部分集合は、 実数体系を近似的に表現した も のであ る。 こ の実数の部<br />

分集合の範囲と精度は、 プロセ ッ サが実数の表現に使用する フ ォ ーマ ッ ト に よ って決ま<br />

る。<br />

3.7.1.1 浮動小数点フォーマット<br />

2 進実数体系<br />

-100 -10 -1 0 1 10 100<br />

ςς ςς<br />

IEEE 単精度 (32 ビット ) 浮動小数点フォーマットで<br />

表現可能な 2 進実数の部分集合<br />

-100 -10 -1 0 1 10 100<br />

ςς ςς<br />

精度<br />

+10<br />

10.0000000000000000000000<br />

1.11111111111111111111111<br />

24 桁の 2 進数<br />

この範囲内の数は<br />

表現できない。<br />

コ ン ピ ュ ー タ は、 実数計算の速度 と 効率を上げ るために、 通常は 2 進浮動小数点フ ォ ー<br />

マ ッ ト で実数を表現す る。 こ の フ ォ ー マ ッ ト では、 実数は、 符号部、 仮数部、 指数部の 3<br />

つの部分で構成される。 図 3-9 は、 ス ト リ ー ミ ング SIMD 拡張命令デー タ に使用 される 2<br />

進浮動小数点フ ォ ー マ ッ ト を示している。 こ の フ ォ ー マ ッ ト は、 IEEE 規格に適合す る。<br />

3:858 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


図 3-9. 2 進浮動小数点フォーマット<br />

3.7.1.2 正規化数<br />

符号部は、 数値の正負を示す 2 進値 ( 正の場合は 0、 負の場合は1) であ る。 仮数部は、 1<br />

ビッ トの2 進整数部分 (J ビッ ト とも呼ばれる) と、 2 進小数部分で構成 さ れる。 多 く の場<br />

合、 J ビ ッ ト は表現されず、 暗黙の値 と なる。 指数部は 2 進整数であ り、 こ の指数で 2 を<br />

累乗した値が仮数に掛け ら れる。<br />

表3-1 は、通常の 10進フ ォ ーマッ ト の実数178.125 を浮動小数点フ ォ ー マ ッ ト で格納する方<br />

法を示している。 この表は、 実数表記法を、 プロセッサが使用するフ ォ ーマ ッ ト に変換す<br />

るプロセスを示している。 このフォーマッ トでは、 2 進実数は正規化され、 指数はバイア<br />

スされる。<br />

表 3-1. 実数表記法<br />

表記法 値<br />

通常の 10 進数<br />

178.125<br />

科学計算用 10 進数<br />

1.78125E102 科学計算用 2 進数<br />

1.0110010001E2111 科学計算用 2 進数<br />

( バイアスされた指数 )<br />

1.0110010001E210000110 単精度フォーマット<br />

( 正規化数 )<br />

ほ と ん ど の場合、 プ ロ セ ッ サは、 正規化形式で実数を表現する。 つ ま り 、 値が 0 の場合を<br />

除いて、 仮数部は、 常に整数 1 と 以下の小数で構成 さ れる。<br />

1.fff...ff<br />

値が 1 より小さい場合は、先頭の0 は削除される。 先頭の 0 が 1 つ削除されるたびに、 指<br />

数は 1 ずつデク リ メン ト される。<br />

正規化形式で数値を表現する と 、 特定の幅の仮数部に収ま る有効桁数が最 も 大き く な る。<br />

要約す る と 、 正規化実数は、 1 と 2 の間の実数を表す正規化 さ れた仮数部 と 、 数値の 2 進<br />

小数点を指定す る指数部で構成 さ れる。<br />

3.7.1.3 バイアスされた指数<br />

符号部<br />

指数部 仮数部<br />

整数部分または J ビット<br />

小数部分<br />

符号 バイアスされた指数 仮数<br />

0 10000110 01100100010000000000000<br />

1 ( 暗黙的 )<br />

プロセッサは、バイアスされた形式で指数を表現する。これは、バイアスされた指数が常<br />

に正の値にな る よ う な定数が、 実際の指数に加算される意味である。 バイアス定数の値<br />

は、使用 さ れてい る浮動小数点フ ォ ー マ ッ ト で指数部の表現に使用で き る ビ ッ ト 数に よ っ<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:859


て異なる。 バイアス定数には、 最小の正規化数の逆数を求めた と き、 オーバーフロ ーが発<br />

生しない値が選択される。<br />

3.7.1.4 実数と非数のエンコーディング<br />

IA プ ロ セ ッ サの浮動小数点フ ォ ー マ ッ ト は、 各種の実数 と 特殊な値を コ ー ド 化で き る。 こ<br />

れらの数と値は、 通常は以下のクラスに分類される。<br />

• 符号付き ゼ ロ<br />

• デノーマル有限数<br />

• 正規化有限数<br />

• 符号付き無限大<br />

• NaN (Not a Number)<br />

• 不定数<br />

図 3-10 は、 これ ら の数 と 非数のエン コ ー デ ィ ン グが実数連続体の ど の部分を占め る かを示<br />

している。 こ こでは、 IEEE 単精度 (32 ビッ ト ) フォーマットでのエンコーディングを示 す。 "S" は符号ビ ッ ト 、 "E" はバイアス さ れた指数、 "F" は小数部を表す ( 指数の値は 10<br />

進数で示す )。<br />

プ ロ セ ッ サは、 実行 さ れる計算の タ イ プに基づいて、 こ れ ら の値を操作した り 、 こ れ ら の<br />

値で結果を返す こ と がで き る。 以下の各項では、 これら の数 と 非数について説明する。<br />

3.7.1.5 符号付きゼロ<br />

ゼロは、 符号ビッ ト付きで +0 または -0 として表現できる。 2 つのエンコ ーデ ィ ングは、<br />

同じ値を示している。 0 の結果の符号は、 実行される演算 と 、 使用 される丸めモー ド に<br />

よ っ て決ま る。 符号付き ゼロ は、 区間演算を実行するために用意されている。 0 の符号に<br />

よ っ て、 アンダ ー フ ロ ー が発生した方向や、 逆数計算で得 ら れた ∞の符号がわかる。<br />

3.7.1.6 正規化有限数とデノーマル有限数<br />

ゼ ロ でない有限数は、 正規化有限数 と デ ノ ー マル有限数の 2 つのク ラスに分類される。 正<br />

規化有限数は、 0 ~ ∞の範囲の正規化実数フ ォ ー マ ッ ト で コ ー ド 化可能な、 ゼ ロ でないす<br />

べての有限値で構成 さ れる。 図 3-10 に示すフ ォ ーマ ッ ト では、 このグループの数は、 1 ~<br />

254 10 の範囲のバイアス された指数を持つすべての数値を含む ( バイ アス さ れない指数の<br />

範囲は、 -126 10 ~ +127 10 である )。<br />

3:860 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


図 3-10. 実数と NaNs<br />

NaN<br />

実数が限 り な く 0 に近づ く と 、 正規化数フ ォ ー マ ッ ト を使用して数を表現で き な く な る。<br />

これは、 指数の範囲が足り な く な り、 先頭の 0 を削除するために 2 進小数点を右にシ フ ト<br />

ができな く なるためである。<br />

バイアスされた指数が 0 であ る場合、 非常に小 さ い数を表現する に は、 仮数部の整数ビ ッ<br />

ト ( および通常は他の先頭ビット ) を 0 にする必要がある。 この範囲の数は、 デノ ーマル<br />

数 ( ま たは極小数 ) と呼ばれる。 デノーマル数に先頭の 0 を使用する と、 非常に小さい数<br />

を表現で き る。 ただし、 こ の非正規化に よ っ て、 精度は低下す る ( 先頭の 0 のために、 小<br />

数部分の有効ビ ッ ト 数が減る )。<br />

プ ロ セ ッ サは、 正規化浮動小数点計算を実行す る と き、 通常は正規化数を操作し、 正規化<br />

数で結果を生成する。 結果がデノ ーマル数になった場合は、 アンダー フロー状態が発生し<br />

たことを示す。<br />

デ ノ ー マル数は、 段階的アンダ ー フ ロ ー と 呼ばれる方法で計算 さ れる。 表 3-2 は、 非正規<br />

化処理時の段階的アンダ ー フ ロ ー の例を示してい る。 こ こ では単精度実数フ ォ ー マ ッ ト が<br />

使用 さ れてい る ため、 最小の指数 ( バイアスなし ) は -12610 になる。 この例では、 真の結<br />

果を正規化数で得る ためには、 -12910 の指数が必要である。 -12910 は指数の許容範囲を超<br />

えているため、 最小の指数である -12610 に達する まで先頭の 0 を挿入すれば、 計算結果<br />

が非正規化される。<br />

表 3-2. 非正規化処理<br />

32 ビット浮動小数点フォーマットでの実数と NaN のエンコーディング<br />

S E F<br />

S E F<br />

1 0 0 −0<br />

+0 0 0 0<br />

1 0 0.XXX<br />

- デノーマル<br />

有限数<br />

+ デノーマル<br />

有限数<br />

0 0<br />

1 1...254 任意の値<br />

+ 正規化<br />

有限数<br />

0 1...254 任意の値<br />

2 0.XXX2 - 正規化有限数<br />

1 255 0 −∞<br />

X 1<br />

−∞<br />

255 1.0XX 2 −SNaN<br />

X<br />

注:<br />

255 1.1XX −QNaN<br />

1. 符号ビットは無視される。<br />

2. 小数部分はゼロ以外の値でなければならない。<br />

1<br />

操作 符号部 指数部 a<br />

仮数部<br />

真の結果 0 −129 1.01011100000...00<br />

非正規化 0 −128 0.10101110000...00<br />

非正規化 0 −127 0.01010111000...00<br />

非正規化 0 −126 0.00101011100...00<br />

デノーマル数の結果 0 −126 0.00101011100...00<br />

a. 指数はバイアスなしの 10 進数で示す。<br />

- デノーマル有限数 + デノーマル有限数<br />

- 正規化有限数 −0 +0<br />

+ 正規化有限数<br />

0 255 0<br />

X 1 255 1.0XX 2<br />

255 1.1XX<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:861<br />

+∞<br />

+SNaN<br />

+QNaN X 1<br />

+∞<br />

NaN


極端な場合には、 先頭の 0 による右シフトの結果、 すべての有効ビットが失われ、 結果が<br />

0 になるこ と もある。<br />

プ ロ セ ッ サは、 以下の方法でデ ノ ー マル値を処理する。<br />

• でき るだけ数値を正規化する こ と によ って、 デノ ーマル数が発生しないよ う にする。<br />

• デノ ーマル数が発生した場合は、 プログラマがそれを検出でき る よ う に、 浮動小数<br />

点アンダー フ ロ ー例外を生成する。<br />

• 計算の ソ ー ス ・ オペラ ン ド にデ ノ ー マル値が使用 さ れた場合は、 プ ロ シ ー ジ ャ ま た<br />

はプ ロ グ ラ ムがそれを検出で き る よ う に、 浮動小数点デ ノ ー マル ・ オペラ ン ド 例外<br />

を生成する。<br />

3.7.1.7 符号付き無限大<br />

3.7.1.8 NaN<br />

3.7.1.9 不定数<br />

+∞ と -∞の 2 つの無限大は、 浮動小数点フ ォ ー マ ッ ト で表現可能な、 最大の正の実数 と 負<br />

の実数を表す。 無限大は、 常に、 0 の仮数 ( 小数部お よ び整数ビ ッ ト ) と、 指定された<br />

フォーマットで使用可能な最大のバイアスされた指数( 例えば、 単精度実数フ ォ ー マ ッ ト<br />

では 25510 ) で表現される。<br />

無限大の符号は検出 さ れる ため、 比較が可能であ る。 無限大は、 常に擬似的な意味で解釈<br />

される。 つま り、 -∞ は任意の有限数よ り小さ く 、 +∞ は任意の有限数よ り大きい。 また、<br />

無限大の算術演算は、常に正確である。例外は、無限大をソース・オペランドとして使用<br />

したために操作が無効になった場合にのみ発生する。<br />

結果がデノ ーマル数になった場合は、 アンダー フ ロ ー状態が発生したこ と を示す。 結果が<br />

+∞ または -∞ にな っ た場合は、 オ ーバー フ ロ ー状態が発生した こ と を示す。 こ の場合は、<br />

正規化 さ れた計算結果のバイアス さ れた指数が、選択 さ れた計算結果フ ォ ー マ ッ ト で使用<br />

可能な最大の指数を超えてい る。<br />

NaN は非数であるため、 実数ラインの一部ではない。 図 3-10 では、 プロセッサの浮動小<br />

数点フ ォ ー マ ッ ト 内の NaN のエンコ ーデ ィ ング空間は、 実数ラインの両端の上部に示さ<br />

れてい る。 こ の空間に は、 使用可能な最大のバイ アス さ れた指数部 と ゼ ロ でない小数部を<br />

持つ任意の値が含まれる。 NaN については、 符号ビ ッ ト は無視 さ れる。<br />

IEEE 規格では、 ク ワ イ エ ッ ト 型 NaN (QNaN) とシグナル型NaN (SNaN) の 2 つのク ラスが<br />

定義 さ れてい る。 QNaN は、 小数部分の最上位ビッ ト がセッ ト されている NaN である。<br />

SNaN は、 小数部分の最上位ビ ッ ト が ク リ ア さ れてい る NaN である。 ほ と ん ど の算術演算<br />

では、 QNaN は例外を通知せずに伝搬 さ れる。 算術演算のオペラ ン ド と して SNaN が使用<br />

さ れた場合は、 通常は無効操作例外が通知さ れる。 NaN に関連する例外と、 プロセ ッサ<br />

による NaN の処理方法については、 3.7.2 項で説明する。<br />

QNaN 不定値は、 マス ク さ れている無効操作浮動小数点例外に対する応答 と して生成 さ れ<br />

る。 整数不定値は、 単精度浮動小数点数か ら 32 ビ ッ ト 整数への変換時に発生する可能性<br />

がある値であり、 80000000H として定義されている。<br />

3.7.2 NaN の操作<br />

3.7.1.8 項で説明したよ う に、ス ト リ ー ミ ング SIMD 拡張命令は、SNaN と QNaN の 2 種類の<br />

NaN をサポー ト している。 SNaN と は、 小数部分の最上位ビ ッ ト が 0 にセッ ト され、 小数<br />

部分のその他のビ ッ ト の う ち少な く と も 1 つが 1 にセッ ト されている、 任意の NaN 値で<br />

3:862 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


ある ( 小数部分のすべてのビ ッ ト が 0 にセッ ト されている場合は、 その値は ∞ になる )。<br />

QNaN と は、 小数部分の最上位ビ ッ ト が 1 にセッ ト されている任意の NaN 値である。 NaN<br />

の符号ビ ッ ト は無視される。<br />

一般的に、 1 つ以上の浮動小数点算術演算命令に QNaN が使用された場合は、 QNaN は計<br />

算に よ って伝搬される。 一方、 SNaN が浮動小数点算術演算に使用 された場合は、 浮動小<br />

数点無効操作例外が通知 さ れる。 SNaN は、 通常は、 ト ラ ッ プを生成したり、 例外ハン ド<br />

ラを起動するために使用される。<br />

無効操作例外に対応す る フ ラ グ ・ ビ ッ ト と マス ク ・ ビ ッ ト は、 MXCSR 内にある。 マス<br />

ク・ビットは、SNaN 値の処理方法を指定す る。 無効操作マス ク ・ ビ ッ ト がセ ッ ト さ れて<br />

いる場合は、 SNaN は、 小数部分の最上位ビ ッ ト を 1 にセッ ト すれば、 QNaN に変換され<br />

る。 計算結果はデス テ ィ ネ ー シ ョ ン ・ オペラ ン ド に格納され、 無効操作フ ラ グがセ ッ ト さ<br />

れる。 無効操作マス ク が ク リ ア さ れてい る場合は、 無効操作フ ォ ル ト が通知され、 計算結<br />

果はデス テ ィ ネ ー シ ョ ン ・ オペラ ン ド に格納 さ れない。<br />

実際の演算や例外に よ っ て QNaN の結果が得 ら れた場合、 表 3-3 に示すよ う に、 結果の値<br />

はソース・オペランドによって決まる。 ただし、 MINPS 命令 と MAXPS 命令の処理は、 表<br />

3-3 の説明 と は異なる。 これらの命令では、 ソ ース ・ オペラン ド の う ち 1 つだけが NaN で<br />

ある場合、 Src2 オペラン ド (NaN または実数値) が結果に書き込まれる。 こ の動作は、 表<br />

3-3 に定義された他の命令の動作と は異なる。 表 3-3 の定義では、 ど ち らのソ ース ・ オペ<br />

ランドが NaN であるかに関係な く 、常にその NaN が結果に書き込まれる。MINPS/MAXPS<br />

命令では、 こ の方法に よ っ て、 アルゴ リ ズムの範囲チ ェ ッ ク の部分か ら NaN データが取<br />

り除かれる。 この動作の代わりに、 NaN ソース・オペランドを返す必要がある場合は、 一<br />

連の命令 ( 比較に続いて、 AND、 ANDN、 OR) を使用して、 min/max 機能をエ ミ ュ レ ー ト<br />

できる。<br />

一般的に、 ス ト リ ー ミ ン グ SIMD 拡張命令では、 Src1 と Src2 は次のよ う に使用される。<br />

ADDPS Srcl,Src2/m128<br />

ソフ ト ウェアは、 本項の始めに示した SNaN と QNaN のコード化に関する規則以外は、<br />

NaN の仮数部の ビ ッ ト を ど の よ う な目的に も 自由に使用で き る。 SNaN と QNaN をコード<br />

化すれば、 診断情報な ど のデー タ を伝達した り 格納した り で き る。<br />

表 3-3. NaN オペランドの演算の結果<br />

ソース・オペランド<br />

NaN の結果<br />

( 無効操作例外がマスクされている場合 )<br />

SNaN と QNaN Src1 の NaN (Src1 が SNaN の場合は QNaN に変<br />

換される )<br />

2 つの SNaN Src1 の NaN (QNaN に変換される )<br />

2 つの QNaN Src1 の QNaN<br />

SNaN と実数値 QNaN に変換された SNaN<br />

QNaN と実数値 QNaN ソース・オペランド<br />

SNaN/QNaN 値 ( オペランドを 1 つだけ使用する命令の<br />

場合。すなわち、RCPPS、RCPSS、RSQRTPS、<br />

RSQRTSS)<br />

QNaN に変換された SNaN/ ソースの QNaN<br />

ソース・オペランドがいずれも NaN ではなく、浮動小<br />

数点無効操作例外が通知された。<br />

デフォルトの QNaN 実数不定値<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:863


3.8 データ・フォーマット<br />

3.8.1 メモリのデータ・フォーマット<br />

インテル・アーキテクチャ ・ ス ト リ ー ミング SIMD 拡張命令には、 4 つの単精度浮動小数<br />

点数で構成 さ れる 128 ビット ・パック ・データ型が新たに導入された。 128 ビッ トには0<br />

~ 127 の番号が付け られ、 ビ ッ ト 0 が最下位ビ ッ ト (LSB)、 ビッ ト 127 が最上位ビ ッ ト<br />

(MSB) になる。<br />

新しいデータ・タイプ・フォーマットの各バイトは、 連続するメモリ・アドレスを持つ。<br />

データのメモリへの格納順は、 常にリトル・エンディアン型になる。 つまり、 メモリの下<br />

位ア ド レ ス にはデー タ の下位バイ ト が入 り 、 上位ア ド レ ス には上位バイ ト が入る。<br />

図 3-11. メモリ内の 4 つのパックド浮動小数点データ ( アドレス 1000H)<br />

バイト 15<br />

15 14<br />

メモリ・アドレス 1016d<br />

13 12 11 10<br />

9 8<br />

6 5 4 3<br />

3.8.2 ストリーミング SIMD 拡張命令レジスタのデータ・フォーマット<br />

スト リーミングSIMD 拡張命令レ ジ ス タ内の値は、 メ モ リ 内の 128 ビッ ト量のデータと同<br />

じフォーマッ トを持つ。 レジスタ内のデータへのアクセス・モードは、 128 ビッ ト ・アク<br />

セス ・ モー ド と 32 ビッ ト ・アクセス・モードの 2 種類である。 こ のデ ー タ ・ タ イ プは、<br />

IEEE 規格の単精度フ ォ ー マ ッ ト に直接対応してい る。 表 3-4 は、 このデー タ ・ タ イプの<br />

精度 と 範囲を示してい る。 仮数部は小数部分だけが コ ー ド 化 さ れる。 0 とデノーマル有限<br />

数以外のすべての数で、 整数部分は 1 と 見な さ れる。 単精度デー タ ・ タ イ プの指数部は、<br />

バイアスされた形式でコー ド化される。 単精度フ ォ ーマッ ト では、 バイアス定数は 127 で<br />

ある。<br />

表 3-4. ストリーミング SIMD 拡張命令データ・タイプの精度と範囲<br />

2 1<br />

データ・タイプ データ長<br />

精度<br />

( ビット ) 2 進数<br />

正規化数の近似的な範囲<br />

10 進数<br />

単精度 32 24 2-126 ~ 2127 1.18 × 10 -38 ~ 3.40 × 1038 表 3-5 は、 単精度実数デ ー タ ・ タ イ プについて、 実数のすべての ク ラ ス (0、 デノーマル有<br />

限数、 正規化有限数、 ∞) および NaN のエン コ ーデ ィ ングを示している。 この表は、 実数<br />

不定値のフ ォ ーマ ッ ト も示している。 これは、 複数のス ト リ ー ミ ング SIMD 拡張命令に<br />

よ っ て、 マス ク さ れてい る浮動小数点無効操作例外に対す る応答 と して生成 さ れる QNaN<br />

のエンコ ーデ ィ ングである。<br />

3:864 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス<br />

7<br />

メモリ・アドレス 1000d<br />

バイト 0<br />

0


表 3-5. 実数と NaN のエンコーディング<br />

クラス 符号<br />

バイアスされた<br />

指数<br />

整数部分<br />

仮数<br />

1 小数部分<br />

正 +∞ 0 11..11 1 00..00<br />

+ 正規化数<br />

0<br />

11..10<br />

1<br />

11..11<br />

.<br />

.<br />

.<br />

.<br />

.<br />

.<br />

.<br />

.<br />

0<br />

00..01<br />

1<br />

00..00<br />

+ デノーマル数<br />

実数値を メ モ リ に格納する と き、 単精度実数値は、 メ モ リ 内の連続す る 4 バイ ト に格納 さ<br />

れる。 128 ビッ ト ・アクセス・モードは、 128 ビッ ト ・メモリへのアクセス、 スト リーミ<br />

ング SIMD 拡張命令レ ジ ス タ間での 128 ビ ッ ト ・ デ ー タ の転送、 すべての論理演算命令、<br />

アンパ ッ ク命令、 算術演算命令に使用 さ れる。 32 ビッ ト ・アクセス・モードは、 32 ビッ<br />

ト・メモリへのアクセス、ストリーミングSIMD 拡張命令レ ジ ス タ間での 32 ビッ ト・デー<br />

タの転送、 すべての算術演算命令に使用される。<br />

スト リーミングSIMD 拡張命令セ ッ ト には、 68 個の新しい命令が追加 さ れた。 本章では、<br />

パ ッ ク ド お よ びス カ ラ浮動小数点命令をアルフ ァ ベ ッ ト 順に示し、各命令について詳し く<br />

説明す る。本章の最後の2節では、SIMD整数命令 と キ ャ ッ シ ュ 制御命令について説明す る。<br />

3.9 命令フォーマット<br />

0<br />

.<br />

.<br />

0<br />

00..00<br />

.<br />

.<br />

00..00<br />

スト リーミングSIMD 拡張命令は、 その性質上、 既存の命令フ ォ ー マ ッ ト を使用で き る。<br />

命令は、 ModR/M フォーマッ トを使用し、 先頭に0F プリフィックス・バイトが付けられ<br />

る。 一般的に、 同じ命令を使用して二方向の動作を実行す る こ と はない ( つまり、 ロー ド<br />

用の命令 と ス ト ア用の命令は別々に用意される )。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:865<br />

0<br />

.<br />

.<br />

0<br />

11.11<br />

.<br />

.<br />

00..01<br />

+0 0 00..00 0 00..00<br />

負 -0 1 00..00 0 00..00<br />

- デノーマル数 1<br />

00..00<br />

0<br />

00..01<br />

.<br />

.<br />

.<br />

.<br />

.<br />

.<br />

.<br />

.<br />

1<br />

00..00<br />

0<br />

11..11<br />

- 正規化数<br />

1<br />

.<br />

.<br />

1<br />

00..01<br />

.<br />

.<br />

11..10<br />

1<br />

.<br />

.<br />

1<br />

00..00<br />

.<br />

.<br />

11..11<br />

-∞ 1 11..11 1 00..00<br />

NaNs SNaN X 11..11 1 0X..XX2 QNaN X 11..11 1 1X..XX<br />

実数不定値<br />

(QNaN)<br />

1 11..11 1 10..00<br />

単精度 ←⎯ 8 ビット ⎯→ ←⎯ 23 ビット ⎯→


3.10 命令プリフィックス<br />

スト リーミングSIMD 拡張命令は、 表 3-6、 表 3-7、 表 3-8 に示したプ リ フ ィ ッ クスを使用<br />

する。 複数のプリフ ィ ッ クスの使用 (1 つのグループから 2 つ以上のプ リ フ ィ ッ ク スを使<br />

用する こ と ) の影響は予測不可能であ り 、 プ ロ セ ッ サに よ っ て異な る。<br />

本書で定義していない方法でプ リ フ ィ ッ ク ス を使用す る のは、予約済みの動作 と 見な さ れ<br />

る。 例えば、 表 3-6 は、 ほ と んどのス ト リ ー ミ ング SIMD 拡張命令の一般的な動作を示し<br />

ているが、 以下の命令については、 プ リ フ ィ ッ クス ( リピート、 リピート NE、 オペラン<br />

ド・サイズ) の使用は予約済みである。<br />

ANDPS、ANDNPS、COMISS、FXRSTOR、FXSAVE、ORPS、LDMXCSR、MOVAPS、MOVHPS、<br />

MOVLPS、 MOVMSKPS、 MOVNTPS、 MOVUPS、 SHUFPS、 STMXCSR、 UCOMISS、<br />

UNPCKHPS、 UNPCKLPS、 XORPS<br />

表 3-6. プリフィックスを持つストリーミング SIMD 拡張命令の動作<br />

プリフィックスのタイプ ストリーミング SIMD 拡張命令への影響<br />

アドレス・サイズ・プリフィックス<br />

(67H)<br />

メモリ・オペランドを持つストリーミング SIMD 拡張命令に影響を与<br />

える。<br />

メモリ・オペランドを持たないストリーミング SIMD 拡張命令では無<br />

視される。<br />

オペランド・サイズ (66H) 予約済みであり、予測不可能な動作が発生する。<br />

セグメント・オーバライド<br />

(2EH,36H,3EH,26H,64H,65H)<br />

メモリ・オペランドを持つストリーミング SIMD 拡張命令に影響を与<br />

える。<br />

メモリ・オペランドを持たないストリーミング SIMD 拡張命令では無<br />

視される。<br />

リピート・プリフィックス (F3H) ストリーミング SIMD 拡張命令に影響を与える。<br />

リピート NE プリフィックス (F2H) 予約済みであり、予測不可能な動作が発生する。<br />

ロック・プリフィックス (0F0H) 無効オペコード例外が発生する。<br />

表 3-7. プリフィックスを持つ SIMD 整数命令の動作<br />

プリフィックスのタイプ インテル MMX 命令への影響<br />

アドレス・サイズ・プリフィックス<br />

(67H)<br />

メモリ・オペランドを持つインテル MMX 命令に影響を与える。<br />

メモリ・オペランドを持たないインテル MMX 命令では無視される。<br />

オペランド・サイズ (66H) 予約済みであり、予測不可能な動作が発生する。<br />

セグメント・オーバライド<br />

(2EH,36H,3EH,26H,64H,65H)<br />

メモリ・オペランドを持つインテル MMX 命令に影響を与える。<br />

メモリ・オペランドを持たないインテル MMX 命令では無視される。<br />

リピート・プリフィックス (F3H) 予約済みであり、予測不可能な動作が発生する。<br />

リピート NE プリフィックス (F2H) 予約済みであり、予測不可能な動作が発生する。<br />

ロック・プリフィックス (0F0H) 無効オペコード例外が発生する。<br />

3:866 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


表 3-8. プリフィックスを持つキャッシュ制御命令の動作<br />

3.11 予約済みの動作とソフトウェアの互換性<br />

3.12 表記法<br />

プリフィックスのタイプ ストリーミング SIMD 拡張命令への影響<br />

アドレス・サイズ・プリフィックス<br />

(67H)<br />

メモリ・オペランドを持つキャッシュ制御命令に影響を与える。<br />

メモリ・オペランドを持たないキャッシュ制御命令では無視される。<br />

オペランド・サイズ (66H) 予約済みであり、予測不可能な動作が発生する。<br />

セグメント・オーバライド<br />

(2EH,36H,3EH,26H,64H,65H)<br />

メモリ・オペランドを持つキャッシュ制御命令に影響を与える。<br />

メモリ・オペランドを持たないキャッシュ制御命令では無視される。<br />

リピート・プリフィックス (F3H) 予約済みであり、予測不可能な動作が発生する。<br />

リピート NE プリフィックス (F2H) 予約済みであり、予測不可能な動作が発生する。<br />

ロック・プリフィックス (0F0H) すべてのキャッシュ命令に対して、無効オペコード例外が発生する。<br />

多 く の レ ジ ス タ と メ モ リ の レ イ ア ウ ト の説明で、特定の ビ ッ ト が予約済み としてマークさ<br />

れている。 ソ フ ト ウ ェ アは、 今後のプロセ ッ サ と の互換性を維持するために、 予約済み と<br />

してマ ー ク さ れてい る ビ ッ ト については、現時点では不明な影響を将来及ぼす も の と して<br />

扱 う 必要があ る。 予約ビ ッ ト の動作は、 予約済みの動作であ る だけでな く 、 予測不可能な<br />

動作 と 考えなければな ら ない。 一般的に、 予約済みの動作は、 他のエ リ アに も 適用される<br />

こ とがある。 ソフ ト ウ ェアは、 予約済みの動作を扱う と きは、 以下のガイ ド ラインに従う<br />

必要があ る。<br />

• 予約ビ ッ ト を含むレ ジ ス タ の値を テ ス ト す る と き、 予約済み フ ィ ー ル ド の状態に依<br />

存してはならない。 テス ト の前に予約済みフ ィ ール ド をマスクする こ と。<br />

• メ モ リ ま たは レ ジ ス タ に ス ト アす る と き、 予約済みフ ィ ー ル ド の状態に依存しては<br />

ならない。<br />

• 予約済み フ ィ ー ル ド に書き込 ま れた情報を保持す る機能に依存してはな ら ない。<br />

• レジスタをロードするとき、予約済みフィールドには、常に本書で指定された値( 存<br />

在する場合 ) を ロ ー ド するか、 ま たは同じ レ ジス タか ら以前に読み取られた値を再<br />

ロードすること。<br />

注 : ソ フ ト ウ ェ アが予約済みの状態 / 動作に依存しないよ う に注意する こ と。 予約済み<br />

の動作については、 将来のプ ロセ ッ サがその動作を ど の よ う に処理するかは未定義<br />

である。 このため、 予約済みの動作に依存する と、 将来のプロセ ッ サ と の互換性を<br />

損な う おそれがある。<br />

オペコ ー ド以外に、 2 種類の表記法が使用される。 こ れ ら の表記法は、 いずれ も ModR/M<br />

バイ ト内の情報を記述する。<br />

1. /digit (0 ~ 7 の数字 ): 命令が r/m ( レジスタおよびメモリ ) オペラン ド だけを使用す<br />

ることを示す。 reg フ ィ ール ド には、 命令のオペコ ー ド を拡張する数字が入る。<br />

2. /r: 命令の ModR/M バイ ト に、 レジスタ ・ オペラン ド と r/m オペラン ド の両方が入<br />

ることを示す。<br />

ま た、 以下の省略形が使用される。<br />

•r32: インテル ・アーキテクチャ 32 ビッ ト整数レジスタ<br />

•xmm/m128: 128 ビット ・マルチメディア・レジスタまたは128 ビット ・メモリ ・ロ<br />

ケーションを示す。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:867


•xmm/m64: 128 ビット ・マルチメディア・レジスタまたは64 ビッ ト ・メモリ ・ロ<br />

ケーションを示す。<br />

•xmm/m32: 128 ビット ・マルチメディア・レジスタまたは32 ビッ ト ・メモリ ・ロ<br />

ケーションを示す。<br />

•mm/m64: 64 ビッ ト ・マルチメディア・レジスタまたは64 ビッ ト ・メモリ ・ロ<br />

ケーションを示す。<br />

•imm8: 8 ビッ ト即値オペランドを示す。<br />

•ib: オペコ ー ド、 ModR/M バイ ト、 またはスケール ・ インデッ クス ・ バイ ト<br />

の後に、 1 バイ ト即値オペラン ドが続く こ とを示す。<br />

は っ き り 区別す る必要があ る場合は、 xmm1 が第 1 ソース・オペランド、xmm2 が第 2 ソー<br />

ス・オペランドを示す。<br />

表 3-9 は、 ス ト リ ー ミ ング SIMD 拡張命令ニーモニ ッ ク の命名規則を示している。<br />

表 3-9. ストリーミング SIMD 拡張命令の命名規則<br />

ニーモニック 説明<br />

PI パックド整数クワッドワード ( 例えば、mm0)<br />

PS パックド単精度浮動小数点数 ( 例えば、xmm0)<br />

SI スカラ整数 ( 例えば、eax)<br />

SS スカラ単精度浮動小数点数 ( 例えば、xmm0 の下位 32 ビット )<br />

3:868 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


ADDPS—Packed Single-FP Add<br />

オペコード 命令 説明<br />

0F,58,/r ADDPS xmm1, xmm2/m128 XMM1 および XMM2/Mem のパックド単精度浮動小数点値<br />

を加算して、結果を XMM1 レジスタにストアする。<br />

操作<br />

xmm1[31-0] = xmm1[31-0] + xmm2/m128[31-0];<br />

xmm1[63-32] = xmm1[63-32] + xmm2/m128[63-32];<br />

xmm1[95-64] = xmm1[95-64] + xmm2/m128[95-64];<br />

xmm1[127-96] = xmm1[127-96] + xmm2/m128[127-96];<br />

説明<br />

ADDPS 命令は、 両方のオペラ ン ド のパ ッ ク ド 単精度浮動小数点値を加算す る。<br />

例外<br />

セグメン ト を問わず、 16 バイ ト 境界にアラ イ メ ン ト が合 っ ていない場合は、 一般保護例<br />

外。<br />

数値例外<br />

オーバーフロー、 アンダーフロー、 無効、 精度、 デノーマル。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:869


ADDPS—Packed Single-FP Add ( 続き )<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ® ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

3:870 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


ADDSS—Scalar Single-FP Add<br />

オペコード 命令 説明<br />

F3,0F,58, /r ADDSS xmm1, xmm2/m32 XMM1 および XMM2/Mem の最下位の単精度浮動小数点値<br />

を加算して、結果を XMM1 レジスタにストアする。<br />

操作<br />

xmm1[31-0] = xmm1[31-0] + xmm2/m32[31-0];<br />

xmm1[63-32] = xmm1[63-32];<br />

xmm1[95-64] = xmm1[95-64];<br />

xmm1[127-96] = xmm1[127-96];<br />

説明<br />

ADDSS 命令は、 両方のオペラ ン ド の最下位の単精度浮動小数点値を加算す る。 上位の 3<br />

つのフ ィ ール ド は、 xmm1 からそのまま渡される。<br />

例外<br />

なし。<br />

数値例外<br />

オーバーフロー、 アンダーフロー、 無効、 精度、 デノーマル。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:871


ADDSS—Scalar Single-FP Add ( 続き )<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CRCR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

3:872 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


ANDNPS—Bit-wise Logical And Not For Single-FP<br />

オペコード 命令 説明<br />

0F,55,/r ANDNPS xmm1, xmm2/m128 XMM1 の 128 ビットを反転し、その結果と XMM2/Mem 内<br />

の 128 ビットの AND をとる。<br />

操作<br />

xmm1[127-0] = ~(xmm1[127-0]) & xmm2/m128[127-0];<br />

説明<br />

ANDNPS 命令は、 XMM1 の補数 と XMM2/Mem の間の ビ ッ ト 単位の AND ( 論理積 ) 演算<br />

の結果を返す。<br />

FP 例外<br />

セグメン ト を問わず、 16 バイ ト 境界にアラ イ メ ン ト が合 っ ていない場合は、 一般保護例<br />

外。<br />

数値例外<br />

なし。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:873


ANDNPS—Bit-wise Logical And Not For Single-FP ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

コメント<br />

ANDNPS での リ ピー ト ・ プ リ フ ィ ッ クス (F2H,F3H) の使用は予約済みである。 このプ リ<br />

フ ィ ッ ク スの処理は、 プ ロ セ ッ サに よ っ て変わ る可能性があ る。 ANDNPS でこのプリ<br />

フ ィ ッ ク ス を使用す る と 、 将来のプ ロ セ ッ サ と の互換性を損な う おそれがある。<br />

3:874 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


ANDPS—Bit-wise Logical And For Single-FP<br />

オペコード 命令 説明<br />

0F,54,/r ANDPS xmm1, xmm2/m128 XMM1 の 128 ビットと XMM2/Mem の 128 ビットの AND<br />

をとり、結果を XMM1 レジスタにストアする。<br />

操作<br />

xmm1[127-0] &= xmm2/m128[127-0];<br />

説明<br />

ANDPS 命令は、 XMM1 と XMM2/Mem の間の ビ ッ ト 単位の AND ( 論理積 ) 演算の結果<br />

を返す。<br />

FP 例外<br />

セグメン ト を問わず、 16 バイ ト 境界にアラ イ メ ン ト が合 っ ていない場合は、 一般保護例<br />

外。<br />

数値例外<br />

なし。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:875


ANDPS—Bit-wise Logical And for Single-FP ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

コメント<br />

ANDPS でのリピート ・プリフィックス(F2H,F3H) の使用は予約済みである。 このプ リ<br />

フ ィ ッ ク スの処理は、 プ ロ セ ッ サに よ っ て変わ る可能性があ る。 ANDPS でこのプリ<br />

フ ィ ッ ク ス を使用す る と 、 将来のプ ロ セ ッ サ と の互換性を損な う おそれがある。<br />

3:876 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


CMPPS—Packed Single-FP Compare<br />

オペコード 命令 説明<br />

0F,C2,/r,ib CMPPS xmm1, xmm2/m128,<br />

imm8<br />

操作<br />

switch (imm8) {<br />

case eq: op = eq;<br />

case lt: op = lt;<br />

case le: op = le;<br />

case unord: op = unord;<br />

case neq: op = neq;<br />

case nlt: op = nlt;<br />

case nle: op = nle;<br />

case ord: op = ord;<br />

default: Reserved;<br />

}<br />

cmp0 = op(xmm1[31-0],xmm2/m128[31-0]);<br />

cmp1 = op(xmm1[63-32],xmm2/m128[63-32]);<br />

cmp2 = op(xmm1[95-64],xmm2/m128[95-64]);<br />

cmp3 = op(xmm1[127-96],xmm2/m128[127-96]);<br />

xmm1[31-0] = (cmp0) ? 0xffffffff : 0x00000000;<br />

xmm1[63-32] = (cmp1) ? 0xffffffff : 0x00000000;<br />

xmm1[95-64] = (cmp2) ? 0xffffffff : 0x00000000;<br />

xmm1[127-96] = (cmp3) ? 0xffffffff : 0x00000000;<br />

imm8 を述語として使用して、XMM2/Mem のパックド単精<br />

度浮動小数点値と XMM1 のパックド単精度浮動小数点値を<br />

比較し、結果を XMM1 レジスタにストアする。<br />

説明<br />

CMPPS 命令は、 imm8 に よ っ て指定 さ れる比較述語を使用して、 単精度浮動小数点値の<br />

各ペアを比較し、 すべて "1" の 32 ビッ ト ・マスクまたはすべて"0" の 32 ビッ ト ・マス<br />

クを返す。 この命令の後に、 このマスクを入力オペラン ド として使用する計算命令を実<br />

行して も、 フ ォル ト は発生しない。 これは、 すべて "0" のマスク は +0.0 の浮動小数点値<br />

に対応し、 すべて "1" のマスクは -qNaN の浮動小数点値に対応するためであ る。 比較の<br />

中には、 ソフ ト ウ ェア ・ エ ミ ュ レ ーシ ョ ン以外では実行できないも のがある。 これらの<br />

比較を行 う 際は、 プ ロ グ ラ マが必要に応じ てレ ジ ス タ を コ ピ ー してデス テ ィ ネ ー シ ョ<br />

ン・オペランドになるデータを保護し、 ソース・オペランドとデスティネーション・オ<br />

ペラ ン ド を入れ替えた後、 異な る述語を使 っ て比較を実行しなければな ら ない。 こ れ ら<br />

のエ ミ ュ レ ー シ ョ ンに使用される述語は、 次の 「エ ミ ュ レ ー シ ョ ン」 の欄に記載されて<br />

いる。 次の表は、 各種の比較のタイプを示している。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:877


CMPPS—Packed Single-FP Compare ( 続き )<br />

:<br />

述語 説明 a<br />

a. 「より大きい」、「より大きいか等しい」、「より大きくない」、「より大きくなく等しくない」の関係は、ハー<br />

ドウェア上に直接実装されていない。<br />

FP 例外<br />

関係<br />

エミュレー<br />

ション<br />

imm8 の<br />

エンコー<br />

ディング<br />

NaN<br />

オペランドの<br />

場合の結果<br />

QNaN オペ<br />

ランドに対し<br />

て無効が報告<br />

されるか<br />

eq 等しい xmm1 == xmm2 000B 偽 いいえ<br />

lt より小さい xmm1 < xmm2 001B 偽 はい<br />

le より小さいか等しい xmm1 xmm2 スワップ、<br />

保護、lt<br />

偽 はい<br />

より大きいか等しい xmm1 >= xmm2 スワップ、<br />

保護、le<br />

偽 はい<br />

unord 順序付けなし xmm1 ? xmm2 011B 真 いいえ<br />

neq 等しくない !(xmm1 == xmm2) 100B 真 いいえ<br />

nlt より小さくない !(xmm1 < xmm2) 101B 真 はい<br />

nle より小さくなく等し<br />

くない<br />

!(xmm1 xmm2) スワップ、<br />

保護、nlt<br />

より大きくなく等し<br />

くない<br />

!(xmm1 >= xmm2) スワップ、<br />

保護、nle<br />

真 はい<br />

真 はい<br />

ord 順序付け !(xmm1 ? xmm2) 111B 偽 いいえ<br />

セグメン ト を問わず、 16 バイ ト 境界にアラ イ メ ン ト が合 っ ていない場合は、 一般保護例<br />

外。<br />

数値例外<br />

無効 (sNaN オペラン ド の場合 )、 無効(上記の表に記載されたqNaN および述語の場合)、<br />

デノーマル。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

3:878 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


CMPPS—Packed Single-FP Compare ( 続き )<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

コメント<br />

コンパイラとアセンブラは、 3 オペラン ド の CMPPS 命令以外に、 次の 2 オペラン ド の擬<br />

似演算をサポ ー ト す る必要がある。<br />

擬似演算 対応する CMPPS 命令<br />

CMPEQPS xmm1, xmm2 CMPPS xmm1,xmm2, 0<br />

CMPLTPS xmm1, xmm2 CMPPS xmm1,xmm2, 1<br />

CMPLEPS xmm1, xmm2 CMPPS xmm1,xmm2, 2<br />

CMPUNORDPS xmm1, xmm2 CMPPS xmm1,xmm2, 3<br />

CMPNEQPS xmm1, xmm2 CMPPS xmm1,xmm2, 4<br />

CMPNLTPS xmm1, xmm2 CMPPS xmm1,xmm2, 5<br />

CMPNLEPS xmm1, xmm2 CMPPS xmm1,xmm2, 6<br />

CMPORDPS xmm1, xmm2 CMPPS xmm1,xmm2, 7<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:879


CMPPS—Packed Single-FP Compare ( 続き )<br />

「 よ り 大き い」 の関係は、 ハー ド ウ ェ ア上で用意 さ れていないため、 2 つ以上の命令を使<br />

用してソ フ ト ウ ェア的にエ ミ ュ レ ー ト する必要がある。 したがって、 これらの関係は擬<br />

似演算 と してはサポ ー ト さ れない。 「 よ り 大き い」 の条件で比較す る場合は、 プ ロ グ ラ マ<br />

が、 対応する 「 よ り 小 さ い」 の関係の ソ ー ス ・ オペラ ン ド と デス テ ィ ネ ー シ ョ ン ・ オペ<br />

ラ ン ド を入れ替え、 ソ ー ス ・ オペラ ン ド が影響を受けない よ う に、 移動命令を使用して<br />

マスクを適切なデスティネーション・レジスタに移動しなければならない。<br />

即値フ ィ ー ル ド の ビ ッ ト 7 ~ 4 は予約済みであ る。 こ れ ら の ビ ッ ト の処理は、 プ ロ セ ッ<br />

サに よ っ て変わる可能性がある。 これら のビ ッ ト を使用する と、 将来のプロセ ッ サ と の<br />

互換性を損な う おそれがあ る。<br />

3:880 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


CMPSS—Scalar Single-FP Compare<br />

オペコード 命令 説明<br />

F3,0F,C2,/r,ib CMPSS xmm1, xmm2/m32,<br />

imm8<br />

操作<br />

switch (imm8) {<br />

case eq: op = eq;<br />

case lt: op = lt;<br />

case le: op = le;<br />

case unord: op = unord;<br />

case neq: op = neq;<br />

case nlt: op = nlt;<br />

case nle: op = nle;<br />

case ord: op = ord;<br />

default: Reserved;<br />

}<br />

cmp0 = op(xmm1[31-0],xmm2/m32[31-0]);<br />

xmm1[31-0] = (cmp0) ? 0xffffffff : 0x00000000;<br />

xmm1[63-32] = xmm1[63-32];<br />

xmm1[95-64] = xmm1[95-64];<br />

xmm1[127-96] = xmm1[127-96];<br />

imm8 を述語として使用して、XMM2/Mem の最下位の単精<br />

度浮動小数点値と XMM1 の最下位の単精度浮動小数点値を<br />

比較し、結果を XMM1 レジスタにストアする。<br />

説明<br />

CMPSS 命令は、 imm8 に よ っ て指定 さ れる比較述語を使用して、 最下位の単精度浮動小<br />

数点値のペアを比較し、 すべて "1" の 32 ビッ ト ・マスクまたはすべて"0" の 32 ビッ ト ・<br />

マスクを返す。 上位 3 つの単精度浮動小数点値のペアの値は比較しない。 こ の命令の後<br />

に、 こ のマス ク を入力オペラ ン ド と して使用す る計算命令を実行して も 、 フ ォ ル ト は発<br />

生しない。 これは、 すべて "0" のマス クは +0.0 の浮動小数点値に対応し、 すべて "1" の<br />

マスクは -qNaN の浮動小数点値に対応す る ためであ る。 比較の中に は、 ソ フ ト ウ ェ ア ・<br />

エ ミ ュ レ ー シ ョ ン以外では実行で き ない も のがある。 これら の比較を行 う 際は、 プ ロ グ<br />

ラマが必要に応じてレジスタをコピーしてデスティネーション・オペランドになるデー<br />

タを保護し、 ソース・オペランドとデスティネーション・オペランドを入れ替えた後、<br />

異なる述語を使って比較を実行しなければならない。 これらのエ ミ ュ レーシ ョ ンに使用<br />

される述語は、 次の表の 「エ ミ ュ レーシ ョ ン」 の欄に記載されている。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:881


CMPSS—Scalar Single-FP Compare ( 続き )<br />

述語 説明 a<br />

a. 「より大きい」、「より大きいか等しい」、「より大きくない」、「より大きくなく等しくない」の関係は、ハー<br />

ドウェアによって直接サポートされていない。<br />

FP 例外<br />

なし。<br />

関係<br />

エミュレー<br />

ション<br />

imm8 の<br />

エンコー<br />

ディング<br />

NaN<br />

オペランドの<br />

場合の結果<br />

qNaN オペラ<br />

ンドに対して<br />

無効が報告さ<br />

れるか<br />

eq 等しい xmm1 == xmm2 000B 偽 いいえ<br />

lt より小さい xmm1 < xmm2 001B 偽 はい<br />

le より小さいか等しい xmm1 xmm2 スワップ、<br />

保護、lt<br />

偽 はい<br />

より大きいか等しい xmm1 >= xmm2 スワップ、<br />

保護、le<br />

偽 はい<br />

unord 順序付けなし xmm1 ? xmm2 011B 真 いいえ<br />

neq 等しくない !(xmm1 == xmm2) 100B 真 いいえ<br />

nlt より小さくない !(xmm1 < xmm2) 101B 真 はい<br />

nle より小さくなく等し<br />

くない<br />

!(xmm1 xmm2) スワップ、<br />

保護、nlt<br />

より大きくなく等し<br />

くない<br />

!(xmm1 >= xmm2) スワップ、<br />

保護、nle<br />

真 はい<br />

真 はい<br />

ord 順序付け !(xmm1 ? xmm2) 111B 偽 いいえ<br />

数値例外<br />

無効 (sNaN オペラン ド の場合 )、 無効( 上記の表に記載された qNaN および述語の場合)、<br />

デノーマル。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

3:882 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


CMPSS—Scalar Single-FP Compare ( 続き )<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CRCPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:883


CMPSS—Scalar Single-FP Compare ( 続き )<br />

コメント<br />

コンパイラとアセンブラは、 3 オペラン ド の CMPSS 命令以外に、 次の 2 オペラン ド の擬<br />

似演算をサポ ー ト す る必要がある。<br />

擬似演算 対応する CMPSS 命令<br />

CMPEQSS xmm1, xmm2 CMPSS xmm1,xmm2, 0<br />

CMPLTSS xmm1, xmm2 CMPSS xmm1,xmm2, 1<br />

CMPLESS xmm1, xmm2 CMPSS xmm1,xmm2, 2<br />

CMPUNORDSS xmm1, xmm2 CMPSS xmm1,xmm2, 3<br />

CMPNEQSS xmm1, xmm2 CMPSS xmm1,xmm2, 4<br />

CMPNLTSS xmm1, xmm2 CMPSS xmm1,xmm2, 5<br />

CMPNLESS xmm1, xmm2 CMPSS xmm1,xmm2, 6<br />

CMPORDSS xmm1, xmm2 CMPSS xmm1,xmm2, 7<br />

「 よ り 大き い」 の関係は、 ハー ド ウ ェ ア上で用意 さ れていないため、 2 つ以上の命令を使<br />

用してソ フ ト ウ ェア的にエ ミ ュ レ ー ト する必要がある。 したがって、 これらの関係は擬<br />

似演算 と してはサポ ー ト さ れない。 「 よ り 大き い」 の条件で比較す る場合は、 プ ロ グ ラ マ<br />

が、 対応する 「 よ り 小 さ い」 の関係の ソ ー ス ・ オペラ ン ド と デス テ ィ ネ ー シ ョ ン ・ オペ<br />

ラ ン ド を入れ替え、 ソ ー ス ・ オペラ ン ド が影響を受けない よ う に、 移動命令を使用して<br />

マスクを適切なデスティネーション・レジスタに確実に移動しなければならない。<br />

即値フ ィ ー ル ド の ビ ッ ト 7 ~ 4 は予約済みであ る。 こ れ ら の ビ ッ ト の処理は、 プ ロ セ ッ<br />

サに よ っ て変わる可能性がある。 これら のビ ッ ト を使用する と、 将来のプロセ ッ サ と の<br />

互換性を損な う おそれがあ る。<br />

3:884 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


COMISS—Scalar Ordered Single-FP Compare and Set EFLAGS<br />

オペコード 命令 説明<br />

0F,2F,/r COMISS xmm1, xmm2/m32 XMM1 レジスタの最下位の単精度浮動小数点値と XMM2/Mem<br />

の最下位の単精度浮動小数点値を比較し、結果に従ってス<br />

テータス・フラグを設定する。<br />

操作<br />

switch (xmm1[31-0] xmm2/m32[31-0]) {<br />

OF,SF,AF = 000;<br />

case UNORDERED: ZF,PF,CF = 111;<br />

case GREATER_THAN: ZF,PF,CF = 000;<br />

case LESS_THAN: ZF,PF,CF = 001;<br />

case EQUAL: ZF,PF,CF = 100;<br />

}<br />

説明<br />

COMISS 命令は、 2 つの単精度浮動小数点値を比較し、 すでに説明した よ う に、 EFLAGS<br />

レジスタのZF、 PF、 CF ビ ッ ト をセ ッ ト す る。 デー タ型はパ ッ ク ド 単精度浮動小数点で<br />

あるが、 最下位の単精度値だけが比較される。 ま た、 EFLAGS レジスタのOF、 SF、 お<br />

よびAF ビ ッ ト はゼ ロ に さ れる。 いずれかの入力が NaN (qNaN または sNaN) の場合は、<br />

無効数値例外を発生す る。<br />

FP 例外<br />

なし。<br />

数値例外<br />

無効 (SNaN または QNaN オペラン ド の場合 )、 デノーマル。 マスク されていない数値例<br />

外が発生した場合は、 整数の EFLAGS 値はアッ プデー ト されない。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:885


COMISS—Scalar Ordered Single-FP Compare And Set EFLAGS ( 続き )<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

コメント<br />

COMISS と UCOMISS の相違点は、 COMISS は、 ソ ース ・ オペラン ド が qNaN または<br />

sNaN オペラ ン ド であ る場合に無効数値例外を報告する こ と であ る。 UCOMISS は、 ソ ー<br />

ス・オペランドがsNaN である場合にのみ無効例外を報告す る。<br />

COMISS での リ ピー ト ・ プ リ フ ィ ッ クス (F2H,F3H) およびオペランド ・サイズ ・ プリ<br />

フィックス(66H) の使用は予約済みである。 これら のプ リ フ ィ ッ ク スの処理は、 プロ<br />

セ ッ サに よ っ て変わ る可能性があ る。 COMISS でこれらのプリフ ィ ッ クスを使用すると、<br />

将来のプ ロ セ ッ サ と の互換性を損な う おそれがある。<br />

3:886 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


CVTPI2PS—Packed Signed INT32 to Packed Single-FP Conversion<br />

オペコード 命令 説明<br />

0F,2A,/r CVTPI2PS xmm, mm/m64 MM/Mem の 2 つの符号付き 32 ビット整数を 2 つの単精度<br />

浮動小数点値に変換する。<br />

操作<br />

xmm[31-0] = (float) (mm/m64[31-0]);<br />

xmm[63-32] = (float) (mm/m64[63-32]);<br />

xmm[95-64] = xmm[95-64];<br />

xmm[127-96] = xmm[127-96];<br />

説明<br />

CVTPI2PS 命令は、 符号付き 32 ビ ッ ト 整数を単精度浮動小数点値に変換す る。 変換が不<br />

正確な場合は、 MXCSR に従って丸めた値が返される。 未処理の x87 フォルトがある場<br />

合は、 #MF フォルトが報告される。<br />

FP 例外<br />

なし。<br />

数値例外<br />

精度。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:887


CVTPI2PS—Packed Signed INT32 to Packed Single-FP Conversion ( 続き )<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#AC ア ラ イ メ ン ト の合 っ ていない メ モ リ 参照を行 っ た場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

コメント<br />

x87-FP 命令がある場合は、 この命令は次のよ う に元の MMX 命令 と 同じ動作をす る。<br />

• x87-FP から MMX テクノロジへのトランジション (TOS=0、 FP 有効ビ ッ ト はすべて<br />

有効に設定 )。<br />

• MMX 命令は、 対応す る x87-FP レジスタの指数部にすべて1 を書き込む。<br />

ただし、 この命令でメモ リ ・ ソース ・ オペラン ド を使用した場合は、 上記の x87-FP から<br />

MMX テクノロジへのトランジションは発生しない。<br />

CVTPI2PS の フ ォ ル ト 動作お よ び支援動作の優先順位は次の と お り であ る。<br />

3:888 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


CVTPI2PS—Packed Signed INT32 to Packed Single-FP Conversion ( 続き )<br />

メモリ・ソース<br />

1. 無効オペ コ ー ド (CR0.EM=1)<br />

2. DNA (CR0.TS=1)<br />

3. #SS または #GP( 上下限違反の場合 )<br />

4. #PF ( ページ ・ フォル ト )<br />

5. スト リーミングSIMD 拡張命令数値フ ォ ル ト ( すなわち、 精度 )<br />

レジスタ・ソース<br />

1. 無効オペ コ ー ド (CR0.EM=1)<br />

2. DNA (CR0.TS=1)<br />

3. #MF ( 未処理の x87-FP フォルトがある場合)<br />

4. #MF からのリ ターンの後、 x87-FP から MMX テクノロジへのトランジション 5. スト リーミングSIMD 拡張命令数値フ ォ ル ト ( すなわち、 精度 )<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:889


CVTPS2PI—Packed Single-FP to Packed INT32 Conversion<br />

オペコード 命令 説明<br />

0F,2D,/r CVTPS2PI mm, xmm/m64 XMM/Mem の下位の 2 つの単精度浮動小数点値を、MM の<br />

下位の 2 つの符号付き 32 ビット整数に変換し、MXCSR<br />

で指定された方法で丸める。<br />

操作<br />

mm[31-0] = (int) (xmm/m64[31-0]);<br />

mm[63-32] = (int) (xmm/m64[63-32]);<br />

説明<br />

CVTPS2PI 命令は、 xmm/m64 の下位の 2 つの単精度浮動小数点値を、 mm の 2 つの符号<br />

付き 32 ビ ッ ト 整数に変換する。 変換が不正確な場合は、 MXCSR に従って丸めた値が返<br />

される。 変換された結果が符号付き 32 ビ ッ ト 整数の最大値 よ り 大き い場合は、 整数不定<br />

値 (0x80000000) が返される。<br />

FP 例外<br />

なし。<br />

数値例外<br />

無効、 精度。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

3:890 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


CVTPS2PI—Packed Single-FP to Packed INT32 Conversion ( 続き )<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

コメント<br />

x87-FP 命令がある場合は、 この命令は次のよ う に元の MMX 命令 と 同じ動作をす る。<br />

• x87-FP から MMX テクノロジへのトランジション (TOS=0、 FP 有効ビ ッ ト はすべて<br />

有効に設定 )。<br />

• MMX 命令は、 対応す る x87-FP レジスタの指数部にすべて1 を書き込む。<br />

CVTPS2PI の フ ォ ル ト 動作お よ び支援動作の優先順位は次の と お り であ る。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:891


CVTPS2PI—Packed Single-FP to Packed INT32 Conversion ( 続き )<br />

メモリ・ソース<br />

1. 無効オペ コ ー ド (CR0.EM=1)<br />

2. DNA (CR0.TS=1)<br />

3. #MF ( 未処理の x87-FP フォルトがある場合)<br />

4. #MF からのリ ターンの後、 x87-FP から MMX テクノロジへのトランジション 5. #SS または #GP ( 上下限違反の場合 )<br />

6. #PF ページ ・ フ ォル ト )<br />

7. スト リーミングSIMD 拡張命令数値フ ォ ル ト ( すなわ ち、 無効、 精度 )<br />

レジスタ・ソース<br />

1. 無効オペ コ ー ド (CR0.EM=1)<br />

2. DNA (CR0.TS=1)<br />

3. #MF ( 未処理の x87-FP フォルトがある場合)<br />

4. #MF からのリ ターンの後、 x87-FP から MMX テクノロジへのトランジション 5. スト リーミングSIMD 拡張命令数値フ ォ ル ト ( すなわち、 精度 )<br />

3:892 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


CVTSI2SS—Scalar Signed INT32 to Single-FP Conversion<br />

オペコード 命令 説明<br />

F3,0F,2A,/r CVTSI2SS xmm, r/m32 整数レジスタ / メモリ内の 1 つの符号付き 32 ビット整数<br />

を 1 つの単精度浮動小数点値に変換する。<br />

操作<br />

xmm[31-0] = (float) (r/m32);<br />

xmm[63-32] = xmm[63-32];<br />

xmm[95-64] = xmm[95-64];<br />

xmm[127-96] = xmm[127-96];<br />

説明<br />

CVTSI2SS 命令は、 メ モ リ 内 ま たは 32 ビッ ト整数レジスタ内の1 つの符号付き 32 ビッ<br />

ト整数を、 1 つの単精度浮動小数点値に変換す る。 変換が不正確な場合は、 MXCSR に<br />

従って丸めた値が返される。<br />

FP 例外<br />

なし。<br />

数値例外<br />

精度。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:893


CVTSI2SS—Scalar Signed INT32 to Single-FP Conversion ( 続き )<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

3:894 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


CVTSS2SI—Scalar Single-FP to Signed INT32 Conversion<br />

オペコード 命令 説明<br />

F3,0F,2D,/r CVTSS2SI r32, xmm/m32 MXCSR によって指定された丸めモードを使用して、<br />

XMM/Mem の 1 つの単精度浮動小数点値を 1 つの符号付き<br />

32 ビット整数に変換し、結果を整数レジスタに移動する。<br />

操作<br />

r32 = (int) (xmm/m32[31-0]);<br />

説明<br />

CVTSS2SI 命令は、 単精度浮動小数点値を符号付き 32 ビ ッ ト 整数に変換し、 結果を 32<br />

ビ ッ ト 整数レ ジスタ に返す。 変換が不正確な場合は、 MXCSR に従って丸めた値が返さ<br />

れる。 変換 さ れた結果が符号付き 32 ビ ッ ト 整数の最大値よ り 大き い場合は、 整数不定値<br />

(0x80000000) が返される。<br />

FP 例外<br />

なし。<br />

数値例外<br />

無効、 精度。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:895


CVTSS2SI—Scalar Single-FP to Signed INT32 Conversion ( 続き )<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

3:896 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


CVTTPS2PI—Packed Single-FP to Packed INT32 Conversion (truncate)<br />

オペコード 命令 説明<br />

0F,2C,/r CVTTPS2PI mm, xmm/m64 切り捨てを使用して、XMM/Mem の下位の 2 つの単精度浮<br />

動小数点値を MM の 2 つの符号付き 32 ビット整数に変換<br />

する。<br />

操作<br />

mm[31-0] = (int) (xmm/m64[31-0]);<br />

mm[63-32] = (int) (xmm/m64[63-32]);<br />

説明<br />

CVTTPS2PI 命令は、 xmm/m64 の下位の 2 つの単精度浮動小数点値を、 mm の 2 つの符号<br />

付き 32 ビ ッ ト 整数に変換する。 変換が不正確な場合は、 切り捨て られた結果が返され<br />

る。 変換された結果が符号付き 32 ビ ッ ト 整数の最大値 よ り 大き い場合は、 整数不定値<br />

(0x80000000) が返される。<br />

FP 例外<br />

なし。<br />

数値例外<br />

無効、 精度。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:897


CVTTPS2PI—Packed Single-FP to Packed INT32 Conversion (truncate)<br />

( 続き )<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

コメント<br />

x87-FP 命令がある場合は、 この命令は次のよ う に元の MMX 命令 と 同じ動作をす る。<br />

• x87-FP から MMX テクノロジへのトランジション (TOS=0、 FP 有効ビ ッ ト はすべて<br />

有効に設定 )。<br />

• MMX 命令は、 対応す る x87-FP レジスタの指数部にすべて1 を書き込む。<br />

CVTTPS2PI の フ ォ ル ト 動作お よ び支援動作の優先順位は次の と お り である。<br />

3:898 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


CVTTPS2PI—Packed Single-FP to Packed INT32 Conversion (truncate)<br />

( 続き )<br />

メモリ・ソース<br />

1. 無効オペ コ ー ド (CR0.EM=1)<br />

2. DNA (CR0.TS=1)<br />

3. #MF ( 未処理の x87-FP フォルトがある場合)<br />

4. #MF からのリ ターンの後、 x87-FP から MMX テクノロジへのトランジション 5. #SS または #GP ( 上下限違反の場合 )<br />

6. #PF ( ページ ・ フォル ト )<br />

7. スト リーミングSIMD 拡張命令数値フ ォ ル ト ( すなわち、 精度 )<br />

レジスタ・ソース<br />

1. 無効オペ コ ー ド (CR0.EM=1)<br />

2. DNA (CR0.TS=1)<br />

3. #MF ( 未処理の x87-FP フォルトがある場合)<br />

4. #MF からのリ ターンの後、 x87-FP から MMX テクノロジへのトランジション 5. スト リーミングSIMD 拡張命令数値フ ォ ル ト ( すなわち、 精度 )<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:899


CVTTSS2SI—Scalar Single-FP to Signed INT32 Conversion (truncate)<br />

オペコード 命令 説明<br />

F3,0F,2C,/r CVTTSS2SI r32, xmm/m32 切り捨てを使用して、XMM/Mem の最下位の単精度浮動小<br />

数点値を 1 つの符号付き 32 ビット整数に変換し、結果を<br />

整数レジスタに移動する。<br />

操作<br />

r32 = (int) (xmm/m32[31-0]);<br />

説明<br />

CVTTSS2SI 命令は、 単精度浮動小数点値を符号付き 32 ビ ッ ト 整数に変換し、 結果を 32<br />

ビ ッ ト 整数レ ジス タ に返す。 変換が不正確な場合は、 切 り 捨て られた結果が返される。<br />

変換 さ れた結果が符号付き 32 ビ ッ ト 整数の最大値 よ り 大き い場合は、 整数不定値<br />

(0x80000000) が返される。<br />

FP 例外<br />

なし。<br />

数値例外<br />

無効、 精度。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

3:900 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


CVTTSS2SI—Scalar Single-FP to Signed INT32 Conversion (truncate)<br />

( 続き )<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:901


DIVPS—Packed Single-FP Divide<br />

オペコード 命令 説明<br />

0F,5E,/r DIVPS xmm1, xmm2/m128 XMM1 のパックド単精度浮動小数点値を XMM2/Mem の<br />

パックド単精度浮動小数点値で割る。<br />

操作<br />

xmm1[31-0] = xmm1[31-0] / (xmm2/m128[31-0]);<br />

xmm1[63-32] = xmm1[63-32] / (xmm2/m128[63-32]);<br />

xmm1[95-64] = xmm1[95-64] / (xmm2/m128[95-64]);<br />

xmm1[127-96] = xmm1[127-96] / (xmm2/m128[127-96]);<br />

説明<br />

DIVPS 命令は、 両方のオペラ ン ド のパ ッ ク ド 単精度浮動小数点値を除算する。<br />

FP 例外<br />

セグメン ト を問わず、 16 バイ ト 境界にアラ イ メ ン ト が合 っ ていない場合は、 一般保護例<br />

外。<br />

数値例外<br />

オーバーフロー、 アンダーフロー、 無効、 ゼロによる除算、 精度、 デノーマル。<br />

保護モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが、 CS、 DS、 ES、<br />

FS、 または GS セグ メ ン ト の範囲外の場合。<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

3:902 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


DIVPS—Packed Single-FP Divide ( 続き )<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:903


DIVSS—Scalar Single-FP Divide<br />

オペコード 命令 説明<br />

F3,0F,5E,/r DIVSS xmm1, xmm2/m32 XMM1 の最下位の単精度浮動小数点値を XMM2/Mem の最<br />

下位の単精度浮動小数点値で割る。<br />

操作<br />

xmm1[31-0] = xmm1[31-0] / (xmm2/m32[31-0]);<br />

xmm1[63-32] = xmm1[63-32];<br />

xmm1[95-64] = xmm1[95-64];<br />

xmm1[127-96] = xmm1[127-96];<br />

説明<br />

DIVSS 命令は、 両方のオペラ ン ド の最下位の単精度浮動小数点値を除算する。 上位の 3<br />

つのフ ィ ール ド は、 xmm1 からそのまま渡される。<br />

FP 例外<br />

なし。<br />

数値例外<br />

オーバーフロー、 アンダーフロー、 無効、 ゼロによる除算、 精度、 デノーマル。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

3:904 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


DIVSS—Scalar Single-FP Divide ( 続き )<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:905


FXRSTOR—Restore FP and Intel ® MMX ® State and Streaming SIMD<br />

Extension State<br />

オペコード 命令 説明<br />

0F,AE,/1 FXRSTOR m512byte 浮動小数点状態、インテル MMX テクノロジ状態、ストリーミング<br />

SIMD 拡張命令状態を m512byte からロードする。<br />

操作<br />

FP and MMX state and Streaming SIMD Extension state = m512byte;<br />

説明<br />

FXRSTOR 命令は、 m512byte に よ っ て定義 さ れる メ モ リ ・ エ リ アか ら 、 浮動小数点状態、<br />

MMX テ ク ノ ロ ジ状態、 ス ト リ ー ミ ン グ SIMD 拡張命令状態 ( 環境 と レ ジ ス タ ) を再ロ ー<br />

ドする。 このデータは、 以前にFXSAVE によって書き込まれたものである。<br />

浮動小数点命令、 MMX テ ク ノ ロ ジ命令、 ス ト リ ー ミ ング SIMD 拡張命令の環境 と レ ジ<br />

ス タ は、 次の よ う なデー タ構造を持つ ( メモリの構造に従ってリ ト ル ・ エンディアン ・<br />

バイ ト を使用し、 各行のバイ ト ・ オ フ セ ッ ト を右の欄に示す )。<br />

3:906 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


FXRSTOR—Restore FP And Intel ® MMX ® State and Streaming SIMD<br />

Extension State ( 続き )<br />

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0<br />

予約 CS IP FOP FTW FSW FCW 0<br />

予約 MXCSR 予約 DS DP 16<br />

予約 ST0/MM0 32<br />

予約 ST1/MM1 48<br />

予約 ST2/MM2 64<br />

予約 ST3/MM3 80<br />

予約 ST4/MM4 96<br />

予約 ST5/MM5 112<br />

予約 ST6/MM6 128<br />

予約 ST7/MM7 144<br />

XMM0 160<br />

XMM1 176<br />

XMM2 192<br />

XMM3 208<br />

XMM4 224<br />

XMM5 240<br />

XMM6 256<br />

XMM7 272<br />

予約<br />

予約<br />

予約<br />

予約<br />

予約<br />

予約<br />

予約<br />

予約<br />

予約<br />

予約<br />

予約<br />

予約<br />

予約<br />

予約<br />

浮動小数点保存エ リ アの 3 つの フ ィ ー ル ド は、 表中に示していない予約ビ ッ ト を格納す<br />

る。<br />

• FOP :下位11 ビ ッ ト は オペ コ ー ド を格納し、 上位 5 ビッ トは予約済みである。<br />

• IPDP : 32 ビッ ト ・モード :32 ビッ トのIP オフセッ ト。<br />

• 16 ビッ ト ・モード :下位16 ビッ トはIP オフセッ トであり、 上位16 ビッ トは予約済<br />

みである。<br />

MXCSR の状態にマス ク されていない例外が含まれてお り 、 それに対応する ステ ー タ ス ・<br />

フ ラ グがセ ッ ト されている場合、 その状態を ロ ー ド して も 、 浮動小数点エ ラ ー条件はア<br />

サ ー ト さ れない。 こ のマス ク さ れていない例外が次に発生した と き、 浮動小数点エラ ー<br />

条件がアサー ト される。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:907<br />

288<br />

304<br />

320<br />

336<br />

352<br />

368<br />

384<br />

400<br />

416<br />

432<br />

448<br />

464<br />

480<br />

496


FXRSTOR—Restore FP And Intel ® MMX ® State and Streaming SIMD<br />

Extension State ( 続き )<br />

MXCSR の一部のビ ッ ト ( ビッ ト 31 ~ 16 とビット 6) は、 予約済みのク リ ア ・ ビ ッ ト と<br />

して定義 されている。 これ ら の ビ ッ ト にゼ ロ でない値を書き込 も う と す る と 、 一般保護<br />

例外が発生す る。<br />

FXRSTOR は、 FRSTOR と は異な り 、 未処理の x87-FP 例外を フ ラ ッ シ ュ しない。 新しい<br />

動作環境を ロ ー ド す る と き に未処理の例外をチ ェ ッ ク して処理する に は、 FXRSTOR の<br />

後で FWAIT を使用すればよい。<br />

CR4.OSFXSR ビッ トがセットされていない場合は、 保存イメージ内のストリーミング SIMD 拡張命令フ ィ ー ル ド (XMM0 ~ XMM7 および MXCSR) はプロセッサにロー ド され<br />

ない。 ス ト リ ー ミ ング SIMD 拡張命令を実行可能にす る に は、 こ の CR4 ビッ トがセット されていなければならない。<br />

FP 例外<br />

#AC 例外検出機能がデ ィ スエ ー ブルにな っ てい る場合は、 ア ド レ スのア ラ イ メ ン ト が 16<br />

バイ ト 境界に合 っ ていない と 、 一般保護例外が報告 さ れる。 ただし、 CPL が 3 であ り、<br />

#AC が イ ネ ー ブルにな っ てい る場合で も 、 #AC の報告については保証していない。 #AC<br />

が報告されるかど う かは、 プロセ ッ サに よ っ て異なる。 #AC が報告されないプロセ ッ サ<br />

では、 必ず一般保護フ ォ ル ト が報告 さ れる。 ま た、 #AC がイネーブルになっている場合<br />

のアラ イメン ト ・ チェ ッ クの幅は、 プロセッサに よ って異なる。 例えば、 あるプロセッ<br />

サでは、 2 バイ ト のミ スアライメン ト に対して #AC が報告され、 他のすべての ミ スアラ<br />

イメント (4/8/16 バイ ト ) に対して #GP が報告される。 この命令の前に LOCK オーバラ<br />

イ ド ・ プ リ フ ィ ッ ク ス を付け る と 、 無効オペ コ ー ド 例外が発生する。 MXCSR の予約<br />

ビ ッ ト にゼロでない値をロ ー ド する と、 一般保護フ ォル ト が発生する。<br />

数値例外<br />

なし。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#NM CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#NM CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

3:908 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


FXRSTOR—Restore FP and Intel ® MMX ® State And Streaming SIMD<br />

Extension State ( 続き )<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

注意<br />

FXSAVE で保存した状態を FRSTOR で復元した場合や、 FSAVE で保存した状態を<br />

FXRSTOR で復元した場合は、 プロセッサの状態が正し く 復元されない。 ア ド レス ・ サ<br />

イ ズ ・ プ リ フ ィ ッ ク ス は、 ア ド レ ス計算に は通常の影響を与え る が、 FXRSTOR イメー<br />

ジのフォーマッ ト には影響を与えない。<br />

FXRSTOR での リ ピー ト ・ プ リ フ ィ ッ クス (F2H,F3H) およびオペランド ・サイズ・プリ<br />

フィックス(66H) の使用は予約済みである。 このプ リ フ ィ ッ ク スの処理は、 プロセ ッ サ<br />

によ って変わる可能性がある。 FXRSTOR で このプ リ フ ィ ッ ク スを使用する と、 将来の<br />

プロセッサとの互換性を損なうおそれがある。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:909


FXSAVE—Store FP and Intel ® MMX ® State and Streaming SIMD Extension<br />

State<br />

オペコード 命令 説明<br />

0F,AE,/0 FXSAVE m512byte 浮動小数点状態、インテル MMX テクノロジ状態、およびストリー<br />

ミング SIMD 拡張命令状態を m512byte にストアする。<br />

操作<br />

m512byte = FP and MMX state and Streaming SIMD Extension state;<br />

説明<br />

FXSAVE 命令は、 m512byte に よ っ て定義 さ れる指定の レ ジ ス タ に、 現在の浮動小数点状<br />

態、 MMX テ ク ノ ロ ジ状態、 ス ト リ ー ミ ン グ SIMD 拡張命令状態 ( 環境 と レ ジ ス タ ) を書<br />

き込む。 このと き、 FXSAVE 命令は、 FNSAVE 命令 と 同じ よ う に、 未処理のマス ク され<br />

ていない浮動小数点例外のチ ェ ッ ク を行わない。 FSAVE/FNSAVE 命令 と は異な り 、<br />

FXSAVE 命令では、 状態が保存 さ れた後 も 、 浮動小数点状態、 MMX テ ク ノ ロ ジ状態、<br />

スト リーミングSIMD 拡張命令状態の内容がプ ロ セ ッ サに保持 される。 FXSAVE 命令は、<br />

浮動小数点状態の保存を最大限に高速化す る よ う に最適化 さ れてい る。 FXSAVE 命令は、<br />

浮動小数点状態の保存を最大限に高速化す る よ う に最適化 さ れてい る。 次の図に、 保存<br />

されるデータの構造を示す ( メモリの構造に従ってリ ト ル ・ エンディアン ・ バイ ト を使<br />

用し、 各行のバイ ト ・ オ フセ ッ ト を右の欄に示す )。<br />

3:910 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


FXSAVE—Store FP and Intel ® MMX ® State And Streaming SIMD Extension<br />

State ( 続き )<br />

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0<br />

予約 CS IP FOP FTW FSW FCW 0<br />

予約 MXCSR 予約 DS DP 16<br />

予約 ST0/MM0 32<br />

予約 ST1/MM1 48<br />

予約 ST2/MM2 64<br />

予約 ST3/MM3 80<br />

予約 ST4/MM4 96<br />

予約 ST5/MM5 112<br />

予約 ST6/MM6 128<br />

予約 ST7/MM7 144<br />

XMM0 160<br />

XMM1 176<br />

XMM2 192<br />

XMM3 208<br />

XMM4 224<br />

XMM5 240<br />

XMM6 256<br />

XMM7 272<br />

予約<br />

予約<br />

予約<br />

予約<br />

予約<br />

予約<br />

予約<br />

予約<br />

予約<br />

予約<br />

予約<br />

予約<br />

予約<br />

予約<br />

浮動小数点保存エ リ アの3つの フ ィ ー ル ド は、表中に示していない予約ビ ッ ト を格納す る。<br />

• FOP :下位11 ビ ッ ト は オペ コ ー ド を格納し、 上位 5 ビッ トは予約済みである。<br />

• IP および DP : 32 ビット ・モード :32 ビッ トのIP オフセッ ト。<br />

• 16 ビッ ト ・モード :下位16 ビッ トはIP オフセッ トであり、 上位16 ビッ トは予約済<br />

みである。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:911<br />

288<br />

304<br />

320<br />

336<br />

352<br />

368<br />

384<br />

400<br />

416<br />

432<br />

448<br />

464<br />

480<br />

496


FXSAVE—Store FP and Intel ® MMX ® State And Streaming SIMD Extension<br />

State ( 続き )<br />

FXSAVE 命令は、 オペレーティ ング ・ システムがコンテキス ト を切り替えなければなら<br />

ない と き や、 例外ハン ド ラ が FP ユニ ッ ト 、 MMX テクノロジ ・ユニッ ト、 スト リーミン<br />

グ SIMD 拡張命令ユニ ッ ト を使用しなければな ら ない と き に使用 さ れる。 FXSAVE 命令<br />

では現在の状態が保持されるため、 アプ リ ケ ー シ ョ ンプ ロ グ ラ ムが こ の命令を使っ て<br />

「きれいにした」 浮動小数点状態をプ ロ シ ー ジ ャ に渡す こ と はで き ない。 こ の操作を実行<br />

するには、 アプリケーションは FXSAVE 命令の後に明示的に FINIT 命令を実行しなけれ<br />

ばならない。<br />

FTW 以外のすべての x87-FP フィールドは、 FSAVE 命令の場合 と 同じ内部形式を持つ。<br />

FXSAVE は、 FSAVE とは異なり、 x87-FP の FTW フィールド全体ではなく、 FTW の有効<br />

ビ ッ ト だけ を保存す る。 FTW ビッ トは、 非TOS 相対順序で保存される。 つ ま り 、 常に<br />

FR0 が最初に保存され、 続いて FR1、 FR2 の順に保存される。 例えば、 TOS=4 で、 ST0、<br />

ST1、 ST2 だけが有効な場合、 FSAVE は次の形式で FTW フ ィ ー ル ド を保存す る。<br />

ST3 ST2 ST1 ST0 ST7 ST6 ST5 ST4 (TOS=4)<br />

FR7 FR6 FR5 FR4 FR3 FR2 FR1 FR0<br />

11 xx xx xx 11 11 11 11<br />

xx は (00,01,10) のいずれかである。 (11) は空のスタ ッ ク要素を示し、 (00) は有効、 (01)<br />

はゼロ、 (10) は特殊を示す。 この例では、 FXSAVE は次のベク タを保存する。<br />

FR7 FR6 FR5 FR4 FR3 FR2 FR1 FR0<br />

0 1 1 1 0 0 0 0<br />

次の表を使って、 FTW の有効ビ ッ ト お よ びス ト ア された 80 ビ ッ ト の浮動小数点デー タ<br />

から、 FSAVE 形式の FTW を再作成がで き る ( ストアされたデータはMMX テクノロジ ・<br />

レジスタの内容ではないものとする )。<br />

指数<br />

すべて 1<br />

指数<br />

すべて 0<br />

小数<br />

すべて 0<br />

J ビットおよび<br />

M ビット<br />

FTW<br />

有効ビット<br />

x87 FTW<br />

0 0 0 0x 1 特殊 10<br />

0 0 0 1x 1 有効 00<br />

0 0 1 00 1 特殊 10<br />

0 0 1 10 1 有効 00<br />

0 1 0 0x 1 特殊 10<br />

0 1 0 1x 1 特殊 10<br />

0 1 1 00 1 ゼロ 01<br />

0 1 1 10 1 特殊 10<br />

1 0 0 1x 1 特殊 10<br />

1 0 0 1x 1 特殊 10<br />

1 0 1 00 1 特殊 10<br />

1 0 1 10 1 特殊 10<br />

上記のすべての有効な組み合わせ 0 空 11<br />

J ビ ッ ト は、 仮数の小数点の左側の 1 ビットの2 進整数 と して定義 さ れる。 M ビッ トは、<br />

仮数の小数点以下の部分の最上位ビ ッ ト ( すなわち、 小数点のすぐ右側のビッ ト ) とし<br />

て定義される。<br />

M ビ ッ ト が仮数の小数点以下の部分の最上位ビ ッ ト の と き、 その小数がすべて 0 の場合<br />

は、 M ビットは0 でなければならない。<br />

メ モ リ ・ オペラ ン ド を使用しない浮動小数点命令の直後に FXSAVE 命令を使用した場合<br />

は、 FXSAVE 命令は FXSAVE イメージ内のDP フィールドの書き込み/ アップデー トを<br />

行わない。<br />

3:912 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


FXSAVE—Store FP and Intel ® MMX ® State And Streaming SIMD Extension<br />

State ( 続き )<br />

MXCSR フィールドは、 スト リーミングSIMD 拡張命令制御 / ステータス ・ レジスタの内<br />

容を保持する。 このフ ィ ール ド 詳細は、 LDMXCSR 命令を参照の こ と 。<br />

フィールドXMM0 ~ XMM7 は、 レ ジス タ内のデー タ と全 く 同一の形式で、 レ ジス タ<br />

XMM0 ~ XMM7 の内容を格納す る。<br />

CR4.OSFXSR ビッ トがセットされていない場合は、 保存イメージ内のストリーミング SIMD 拡張命令フ ィ ー ル ド (XMM0 ~ XMM7 および MXCSR) はプロセッサにロー ド され<br />

ない。 ス ト リ ー ミ ング SIMD 拡張命令を実行可能にす る に は、 こ の CR4 ビッ トがセット されていなければならない。<br />

デステ ィ ネーシ ョ ンの m512byte は、 16 バイ ト境界にアライメン ト が合っている ものと<br />

見な される。 m512byte のアラ イメン ト が 16 バイ ト境界に合っていない場合は、 FXSAVE<br />

命令を実行す る と 一般保護例外が発生す る。<br />

FP 例外<br />

#AC 例外検出機能がデ ィ スエ ー ブルにな っ てい る場合は、 ア ド レ スのア ラ イ メ ン ト が 16<br />

バイ ト 境界に合 っ ていない と 、 一般保護例外が報告 さ れる。 ただし、 CPL が 3 であ り、<br />

#AC が イ ネ ー ブルにな っ てい る場合で も 、 #AC の報告については保証していない。 #AC<br />

が報告されるかど う かは、 プロセ ッ サに よ っ て異なる。 #AC が報告されないプロセ ッ サ<br />

では、 必ず一般保護フ ォ ル ト が報告 さ れる。 ま た、 #AC がイネーブルになっている場合<br />

のアラ イメン ト ・ チェ ッ クの幅は、 プロセッサに よ って異なる。 例えば、 あるプロセッ<br />

サでは、 2 バイ ト のミ スアライメン ト に対して #AC が報告され、 他のすべての ミ スアラ<br />

イメント (4/8/16 バイ ト ) に対して #GP が報告される。 この命令の前に LOCK オーバラ<br />

イ ド ・ プ リ フ ィ ッ ク ス を付け る と 、 無効オペ コ ー ド 例外が発生する。<br />

数値例外<br />

なし。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#NM CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#NM CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:913


FXSAVE—Store FP and Intel ® MMX ® State And Streaming SIMD Extension<br />

State ( 続き )<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト、 デー<br />

タ・ダーティ・ビット ・フォルト。<br />

注意<br />

FXSAVE で保存した状態を FRSTOR で復元した場合や、 FSAVE で保存した状態を<br />

FXRSTOR で復元した場合は、 プロセッサの状態が正し く 復元されない。 ア ド レス ・ サ<br />

イ ズ ・ プ リ フ ィ ッ ク ス は、 ア ド レ ス計算に は通常の影響を与え る が、 FXSAVE イメージ<br />

のフォーマッ ト には影響を与えない。<br />

FXSAVE 命令の実行の時点で、 未処理のマス ク さ れていない浮動小数点例外があ る場合<br />

は、 FXSAVE-FWAIT-FXRSTOR のシ ー ケンスを実行する と、 プロセ ッ サの状態が正し く<br />

復元 さ れない。 FWAIT 命令は、 未処理のマス ク されていない浮動小数点例外をプ ロ セ ッ<br />

サにチェ ッ ク させ、 処理させる。 プロセッサは (FSAVE とは異なり ) FXSAVE では浮動<br />

小数点状態を ク リ アしないため、 例外は処理 さ れる が、 その こ と は保存 さ れる イ メ ー ジ<br />

に反映されない。 このため、 FXRSTOR を使用してイメ ージを再ロー ド する と き、 FSW<br />

内の例外ビ ッ ト が正し く 再ロ ー ド されない。<br />

FXSAVE での リ ピー ト ・ プ リ フ ィ ッ クス (F2H,F3H) およびオペランド ・サイズ・プリ<br />

フィックス(66H) の使用は予約済みである。 こ のプ リ フ ィ ッ ク スの処理は、 プ ロセ ッ サ<br />

によ って変わる可能性がある。 FXSAVE でこれらのプリフ ィ ッ クスを使用すると、 将来<br />

のプロセッサとの互換性を損な うおそれがある。<br />

3:914 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


LDMXCSR—Load Streaming SIMD Extension Control/Status<br />

オペコード 命令 説明<br />

0F,AE,/2 LDMXCSR m32 m32 からストリーミング SIMD 拡張命令の制御 / ステータス・ワー<br />

ドをロードする。<br />

操作<br />

MXCSR = m32;<br />

説明<br />

MXCSR 制御 / ステータス ・ レジスタを使用して、 マスク されている / マスク されていな<br />

い例外の処理をイネーブルにする、 丸めモー ド を設定する、 ゼロにフラッシュ ・ モー ド<br />

を設定す る、 例外ス テ ー タ ス ・ フ ラ グを表示す る な ど の操作を行 う こ と がで き る。 次の<br />

図は、 MXCSR レジスタの各フィ ールドのフォーマッ ト とエンコーディ ングを示してい<br />

る。<br />

31 16 15 10 5 0<br />

予約 FZ RC RC PM UM OM ZM DM IM 予約 PE UE OE ZE DE IE<br />

ビッ ト 5 ~ 0 は、 ス ト リ ー ミ ング SIMD 拡張命令数値例外が検出 さ れたか ど う かを示す。<br />

ビッ ト 5 ~ 0 は 「ステ ィ ッキー ・ フラグ」 であり、 ク リアするには、 LDMXCSR 命令を<br />

使用して各フ ィ ー ル ド にゼ ロ を書き込む必要がある。 LDMXCSR 命令がマス ク ・ ビ ッ ト<br />

を ク リ アし、 対応する例外フ ラ グ ・ ビ ッ ト をセ ッ ト して も 、 例外がす ぐ には生成されな<br />

い。 こ の例外は、 ス ト リ ー ミ ン グ SIMD 拡張命令が同じ タ イ プの例外を次に発生 さ せた<br />

ときに生成される。 スト リーミングSIMD 拡張命令は、 各例外につ き 1 つの例外フ ラ グ<br />

を使用す る。 パ ッ ク ド ・ デ ー タ ・ タ イ プ内の個々の例外を報告する機能はサポ ー ト して<br />

いない。 同じ命令の中で複数の同じ例外が発生した場合は、 関連する例外フ ラグがア ッ<br />

プデー ト され、 それらの条件のう ち少な く と も 1 つが発生した こ と を示す。 こ れら の フ<br />

ラグは、 リセッ ト時にク リアされる。<br />

ビッ ト 12 ~ 7 は、 数値例外マス ク を設定す る。 あ る例外タ イ プに対応す る ビ ッ ト がセ ッ<br />

ト された場合は、 その例外タ イプはマス ク される。 対応する ビ ッ ト が ク リ アされた場合<br />

は、 その例外タ イ プはマス ク さ れない。 こ れ ら のビ ッ ト は リ セ ッ ト 時にセ ッ ト さ れる。<br />

つ ま り 、 リ セ ッ ト す る と 、 すべての数値例外はマス ク さ れる。<br />

ビッ ト 14 ~ 13 は、 丸め制御を コ ー ド 化する。 丸め制御には、 一般的な直近への丸め、<br />

有向丸め、 真の切 り 捨ての各モー ド があ る。 丸め制御は、 算術命令 と 特定の変換命令に<br />

影響を与え る。 RC フィールドのエンコーディングは次のとおりである。<br />

丸めモード RC フィールド 説明<br />

直近への丸め ( 偶数 ) 00B 丸めの結果は、無限に正確な結果に最も近い値になる。2 つの値が<br />

同じ近さの場合は、結果は偶数値 ( すなわち、最下位ビットが 0 の<br />

値 ) になる。<br />

切り捨て ( 負の無限<br />

の方向 )<br />

切り上げ ( 正の無限<br />

の方向 )<br />

ゼロに向かっての丸<br />

め ( 切り捨て )<br />

01B 丸めの結果は、無限に正確な結果に最も近い値 ( ただし、無限に正<br />

確な結果より大きくない値 ) になる。<br />

10B 丸めの結果は、無限に正確な結果に最も近い値 ( ただし、無限に正<br />

確な結果より小さくない値 ) になる。<br />

11B 丸めの結果は、無限に正確な結果に最も近い値 ( ただし、無限に正<br />

確な結果より絶対値が大きくない値 ) になる。<br />

リ セッ ト 時には、 丸め制御は直近への丸めに設定される。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:915


LDMXCSR—Load Streaming SIMD Extension Control/Status ( 続き )<br />

ビッ ト 15 (FZ) を使用して、 ゼロにフラ ッ シュ ・ モー ド をオンに ( ビッ トをセット ) でき<br />

る。 ゼ ロ に フ ラ ッ シ ュ ・ モ ー ド を オ ン にす る と 、 アンダ ー フ ロ ー の発生時に次の動作が<br />

行われる。<br />

• 真の結果の符号を使用して、 ゼロ の結果が返される。<br />

• 精度例外フ ラ グ と アンダ ー フ ロ ー例外フ ラ グがセ ッ ト さ れる。<br />

IEEE の規定では、 アンダー フ ロ ー に対するマス ク された応答は、 デノ ーマラ イズ された<br />

結果 ( すなわち、 緩やかなアンダーフロ ー ) を返すこ と である。 したがって、 ゼロにフ<br />

ラッシュ ・モードは、 IEEE 規格 754 に適合しない。 このモー ド は、 主にパフ ォ ーマンス<br />

上の理由で用意されている。 アンダー フ ロ ーが頻繁に発生するアプ リ ケー シ ョ ンでは、<br />

精度が多少低下する代わ り に、 実行速度が向上す る。 アンダ ー フ ロ ー例外のマス ク の解<br />

除は、 ゼロにフラッシュ ・ モー ドに優先する。 したがって、 ゼロにフラッシュ ・ モー ド<br />

がイ ネ ーブルかど う かに関係な く 、 アンダー フ ロ ー例外のマス クが解除されている と き<br />

にス ト リ ー ミ ング SIMD 拡張命令に よ っ てアンダ ー フ ロ ー状態が発生した場合は、 例外<br />

ハン ド ラが起動される。<br />

MXCSR のその他のビッ ト ( ビット 31 ~ 16 とビッ ト 6) は、 予約済みの ク リ ア ・ ビ ッ ト<br />

として定義されている。 FXRSTOR または LDMXCSR 命令を使用して、 こ れ ら の ビ ッ ト<br />

にゼ ロ でない値を書き込 も う と す る と 、 一般保護例外が発生す る。<br />

リ ニア ・ ア ド レ ス は、 参照 さ れる メ モ リ ・ デー タ の最下位バイ ト のア ド レ ス に対応す る。<br />

FP 例外<br />

予約ビ ッ ト にゼ ロ でない値を ロ ー ド した場合は、 一般保護フ ォ ル ト 。<br />

数値例外<br />

なし。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

3:916 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


LDMXCSR—Load Streaming SIMD Extension Control/Status ( 続き )<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC ア ラ イ メ ン ト の合 っ ていない メ モ リ 参照を行 っ た場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

コメント<br />

LDMXCSR でのリピート ・プリフィックス(F2H,F3H) およびオペランド ・サイズ ・ プリ<br />

フィックス(66H) の使用は予約済みである。 このプ リ フ ィ ッ ク スの処理は、 プロセ ッ サ<br />

によ って変わる可能性がある。 LDMXCSR でこのプリフ ィ ックスを使用すると、 将来の<br />

プロセッサとの互換性を損なうおそれがある。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:917


MAXPS—Packed Single-FP Maximum<br />

オペコード 命令 説明<br />

0F,5F,/r MAXPS xmm1, xmm2/m128 XMM2/Mem と xmm1 の単精度浮動小数点値を比較して、<br />

各要素の最大値を返す。<br />

操作<br />

xmm1[31-0] = (xmm1[31-0] == NAN) ? xmm2[31-0] :<br />

(xmm2[31-0] == NAN) ? xmm2[31-0] :<br />

(xmm1[31-0] > xmm2/m128[31-0]) ? xmm1[31-0] ? xmm2/m128[31-0];<br />

xmm1[63-32] = (xmm1[63-32] == NAN) ? xmm2[63-32] :<br />

(xmm2[63-32] == NAN) ? xmm2[63-32] :<br />

(xmm1[63-32] > xmm2/m128[63-32]) ? xmm1[63-32] ? xmm2/<br />

m128[63-32];<br />

xmm1[95-64] = (xmm1[95-64] == NAN) ? xmm2[95-64] :<br />

(xmm2[95-64] == NAN) ? xmm2[95-64] :<br />

(xmm1[95-64] > xmm2/m128[95-64]) ? xmm1[95-64] ? xmm2/<br />

m128[95-64];<br />

xmm1[127-96] = (xmm1[127-96] == NAN) ? xmm2[127-96] :<br />

(xmm2[127-96] == NAN) ? xmm2[127-96] :<br />

(xmm1[127-96] > xmm2/m128[127-96]) ? xmm1[127-96] ? xmm2/<br />

m128[127-96];<br />

説明<br />

MAXPS 命令は、 XMM1 と XMM2/Mem の単精度浮動小数点値を比較して、 各要素の最<br />

大値を返す。 比較 さ れる値が両方 と も ゼ ロ の場合は、 source2 (xmm2/m128) が返される。<br />

source2 (xmm2/m128) が sNaN の場合は、 その sNaN が変更されずにデスティネーション<br />

に転送される ( つまり、 クワイエッ ト sNaN は返さない )。<br />

FP 例外<br />

セグメン ト を問わず、 16 バイ ト 境界にアラ イ メ ン ト が合 っ ていない場合は、 一般保護例<br />

外。<br />

数値例外<br />

無効 (qNaN ソース ・オペランドを含む)、 デノーマル。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

3:918 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


MAXPS—Packed Single-FP Maximum ( 続き )<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

コメント<br />

これらの命令では、 ソース ・ オペランドのうち一方だけが NaN である場合、 常に Src2<br />

オペラン ド (NaN または実数値) が結果に書き込まれるこ とに注意する。 この動作は、 表<br />

3-3 に定義されている他の命令の動作 と は異なる ( 他の命令では、 ど ち ら のソ ース ・ オペ<br />

ランドが NaN であるかを問わず、 常にその NaN が結果に書き込まれる )。 これによ り、<br />

コンパイラは、 一般的なC の条件付き構造に MAXPS 命令を使用で き る。 こ の動作を変<br />

更して NaN ソ ー ス ・ オペラ ン ド を返す必要があ る場合は、 一連の命令を使用して min/<br />

max 機能をエ ミ ュ レ ー ト で き る ( 比較の後、 AND、 ANDN、 OR)。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:919


MAXSS—Scalar Single-FP Maximum<br />

オペコード 命令 説明<br />

F3,0F,5F,/r MAXSS xmm1, xmm2/m32 XMM2/Mem と xmm1 の最下位の単精度浮動小数点値を比<br />

較して、最大値を返す。<br />

操作<br />

xmm1[31-0] = (xmm1[31-0] == NAN) ? xmm2[31-0] :<br />

(xmm2[31-0] == NAN) ? xmm2[31-0] :<br />

(xmm1[31-0] > xmm2/m32[31-0]) ? xmm1[31-0] : xmm2/m32[31-0];<br />

xmm1[63-32] = xmm1[63-32];<br />

xmm1[95-64] = xmm1[95-64];<br />

xmm1[127-96] = xmm1[127-96];<br />

説明<br />

MAXSS 命令は、 XMM1 と XMM2/Mem の最下位の単精度浮動小数点値を比較して、 最<br />

大値を返す。 上位の 3 つのフ ィ ール ド は、 xmm1 からそのまま渡される。 比較される値<br />

が両方 と も ゼロの場合は、 source2 (xmm2/m128) が返される。 source2 (xmm2/m128) が<br />

sNaN の場合は、 その sNaN が変更されずにデスティネーションに転送される( つまり、<br />

クワイエット sNaN は返さない )。<br />

FP 例外<br />

なし。<br />

数値例外<br />

無効 (qNaN ソース ・オペランドを含む)、 デノーマル。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

3:920 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


MAXSS—Scalar Single-FP Maximum ( 続き )<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

コメント<br />

これらの命令では、 ソース ・ オペランドのうち一方だけが NaN である場合、 常に Src2<br />

オペラン ド (NaN または実数値) が結果に書き込まれるこ とに注意する。 この動作は、 表<br />

3-3 に定義されている他の命令の動作 と は異なる ( 他の命令では、 ど ち ら のソ ース ・ オペ<br />

ランドが NaN であるかを問わず、 常にその NaN が結果に書き込まれる )。 ただし、 他の<br />

すべてのスカ ラ演算と同様に、 MAXPS 命令で も 、 上位の 3 つのオペラン ド は src1 オペ<br />

ラン ドからそのまま渡される。 これによ り、 コンパイラは、 一般的な C の条件付き構造<br />

に MAXPS 命令を使用で き る。 こ の動作を変更して NaN ソース ・オペランドを返す必要<br />

がある場合は、 一連の命令を使用して min/max 機能をエ ミ ュ レ ー ト で き る ( 比較の後、<br />

AND、 ANDN、 OR)。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:921


MINPS—Packed Single-FP Minimum<br />

オペコード 命令 説明<br />

0F,5D,/r MINPS xmm1, xmm2/m128 XMM2/Mem と XMM1 の単精度浮動小数点値を比較して、<br />

各要素の最小値を返す。<br />

操作<br />

xmm1[31-0] = (xmm1[31-0] == NAN) ? xmm2[31-0] :<br />

(xmm2[31-0] == NAN) ? xmm2[31-0] :<br />

(xmm1[31-0] < xmm2/m128[31-0]) : xmm1[31-0] ? xmm2/m128[31-0];<br />

xmm1[63-32] = (xmm1[63-32] == NAN) ? xmm2[63-32] :<br />

(xmm2[63-32] == NAN) ? xmm2[63-32] :<br />

(xmm1[63-32] < xmm2/m128[63-32]) : xmm1[63-32] ? xmm2/<br />

m128[63-32];<br />

xmm1[95-64] = (xmm1[95-64] == NAN) ? xmm2[95-64] :<br />

(xmm2[95-64] == NAN) ? xmm2[95-64] :<br />

(xmm1[95-64] < xmm2/m128[95-64]) : xmm1[95-64] ? xmm2/<br />

m128[95-64];<br />

xmm1[127-96] = (xmm1[127-96] == NAN) ? xmm2[127-96] :<br />

(xmm2[127-96] == NAN) ? xmm2[127-96] :<br />

(xmm1[127-96] < xmm2/m128[127-96]) : xmm1[127-96] ? xmm2/<br />

m128[127-96];<br />

説明<br />

MINPS 命令は、 XMM1 と XMM2/Mem の単精度浮動小数点値を比較して、 各要素の最小<br />

値を返す。 比較される値が両方 と も ゼロの場合は、 source2 (xmm2/m128) が返される。<br />

source2 (xmm2/m128) が sNaN の場合は、 その sNaN が変更されずにデスティネーション<br />

に転送される ( つまり、 クワイエッ ト sNaN は返さない )。<br />

FP 例外<br />

セグメン ト を問わず、 16 バイ ト 境界にアラ イ メ ン ト が合 っ ていない場合は、 一般保護例<br />

外。<br />

数値例外<br />

無効 (qNaN ソース ・オペランドを含む)、 デノーマル。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

3:922 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


MINPS—Packed Single-FP Minimum ( 続き )<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

コメント<br />

これらの命令では、 ソース ・ オペランドのうち一方だけが NaN である場合、 常に Src2<br />

オペラン ド (NaN または実数値) が結果に書き込まれるこ とに注意する。 この動作は、 表<br />

3-3 に定義されている他の命令の動作 と は異なる ( 他の命令では、 ど ち ら のソ ース ・ オペ<br />

ランドが NaN であるかを問わず、 常にその NaN が結果に書き込まれる )。 これによ り、<br />

コンパイラは、 一般的なC の条件付き構造に MINPS 命令を使用で き る。 こ の動作を変<br />

更して NaN ソ ー ス ・ オペラ ン ド を返す必要があ る場合は、 一連の命令を使用して min/<br />

max 機能をエ ミ ュ レ ー ト する こ と がで き る ( 比較の後、 AND、 ANDN、 OR)。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:923


MINSS—Scalar Single-FP Minimum<br />

オペコード 命令 説明<br />

F3,0F,5D,/r MINSS xmm1, xmm2/m32 XMM2/Mem と xmm1 の最下位の単精度浮動小数点値を比<br />

較して、最小値を返す。<br />

操作<br />

xmm1[31-0] =(xmm1[31-0] == NAN) ? xmm2[31-0] :<br />

(xmm2[31-0] == NAN) ? xmm2[31-0] :<br />

(xmm1[31-0] < xmm2/m32[31-0]) ? xmm1[31-0] : xmm2/m32[31-0];<br />

xmm1[63-32] = xmm1[63-32];<br />

xmm1[95-64] = xmm1[95-64];<br />

xmm1[127-96] = xmm1[127-96];<br />

説明<br />

MINSS 命令は、 XMM1 と XMM2/Mem の最下位の単精度浮動小数点値を比較して、 最小<br />

値を返す。 上位の 3 つのフ ィ ール ド は、 xmm1 からそのま ま渡される。 比較される値が<br />

両方 と も ゼ ロ の場合は、 source2 (xmm2/m128) が返される。 source2 (xmm2/m128) が sNaN<br />

の場合は、 その sNaN が変更されずにデスティネーションに転送される( つまり、 クワ<br />

イエッ ト sNaN は返さない )。<br />

FP 例外<br />

なし。<br />

数値例外<br />

無効 (qNaN ソース ・オペランドを含む)、 デノーマル。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

3:924 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


MINSS—Scalar Single-FP Minimum ( 続き )<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC ア ラ イ メ ン ト の合 っ ていない メ モ リ 参照を行 っ た場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

コメント<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

これらの命令では、 ソース ・ オペランドのう ち一方だけが NaN である場合、 常に Src2 オ<br />

ペラン ド (NaN または実数値) が結果に書き込まれる こ と に注意する。 この動作は、 表<br />

3-3 に定義されている他の命令の動作と は異なる ( 他の命令では、 ど ち ら のソ ー ス ・ オペ<br />

ランドがNaN であるかを問わず、 常にその NaN が結果に書き込まれる )。 ただし、 他の<br />

すべてのスカ ラ演算と同様に、 MINSS 命令で も 、 上位の 3 つのオペラン ド は src1 オペラ<br />

ンドからそのまま渡される。 これによ り、 コンパイラは、 一般的な C の条件付き構造に<br />

MINSS 命令を使用で き る。 こ の動作を変更して NaN ソース ・ オペランドを返す必要があ<br />

る場合は、 一連の命令を使用して min/max 機能をエ ミ ュ レ ー ト で き る ( 比較の後、 AND、<br />

ANDN、 OR)。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:925


MOVAPS—Move Aligned Four Packed Single-FP<br />

オペコード 命令 説明<br />

0F,28,/r MOVAPS xmm1, xmm2/m128 4 つのパックド単精度データを表す 128 ビットを、<br />

XMM2/Mem から XMM1 レジスタに移動する。<br />

0F,29,/r MOVAPS xmm2/m128, xmm1 4 つのパックド単精度データを表す 128 ビットを、<br />

XMM1 レジスタから XMM2/Mem に移動する。<br />

操作<br />

if (destination == xmm1) {<br />

if (source == m128) {<br />

// load instruction<br />

xmm1[127-0] = m128;<br />

}<br />

else {<br />

// move instruction<br />

xmm1[127=0] = xmm2[127-0];<br />

}<br />

}<br />

else {<br />

if (destination == m128) {<br />

// store instruction<br />

m128 = xmm1[127-0];<br />

}<br />

else {<br />

// move instruction<br />

xmm2[127-0] = xmm1[127-0];<br />

}<br />

}<br />

説明<br />

リ ニア ・ ア ド レ ス は、 参照 さ れる メ モ リ ・ デー タ の最下位バイ ト のア ド レ ス に対応す る。<br />

メモリ ・ アド レスが指定される と、 メモリ ・ ロケーシ ョン m128 の 16 バイ ト のデータが<br />

ロード またはストアされる。 この操作をレジスタ-レ ジ ス タ形式で使用す る と 、 128 ビッ<br />

トのソース・レジスタの内容が、 128 ビッ トのデスティネーション・レジスタにコピー<br />

される。<br />

FP 例外<br />

セグメン ト を問わず、 16 バイ ト 境界にアラ イ メ ン ト が合 っ ていない場合は、 一般保護例<br />

外。<br />

数値例外<br />

なし。<br />

3:926 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


MOVAPS—Move Aligned Four Packed Single-FP ( 続き )<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

コメント<br />

MOVAPS 命令は、 16 バ イ ト にア ラ イ メ ン ト の合 っ た単精度浮動小数点値を処理する場合<br />

に使用 さ れる。 デー タ のア ラ イ メ ン ト が確実でない場合は、 MOVAPS の代わ り に<br />

MOVUPS を使用する必要がある。 MOVAPS 命令の使用は、 アラ イ メ ン ト の制約条件が<br />

簡単に満た さ れる場合に限られる。 ス ト リ ー ミ ン グ SIMD 拡張命令をサポ ー ト す る プ ロ<br />

セッサ上では、 アライメントの合ったデータに対してはMOVAPS 命令が最適なパフ ォ ー<br />

マン ス を発揮す る。<br />

MOVAPS での リ ピー ト ・ プ リ フ ィ ッ ク ス (F2H,F3H) の使用は予約済みである。 こ のプ リ<br />

フ ィ ッ ク スの処理は、 プ ロ セ ッ サに よ っ て変わ る可能性があ る。 MOVAPS でこのプリ<br />

フ ィ ッ ク ス を使用す る と 、 将来のプ ロ セ ッ サ と の互換性を損な う おそれがある。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:927


MOVHLPS—Move High to Low Packed Single-FP<br />

オペコード 命令 説明<br />

OF,12,/r MOVHLPS xmm1, xmm2 上位の 2 つの単精度オペランドを表す 64 ビットを、xmm2<br />

から xmm1 レジスタの下位の 2 つのフィールドに移動す<br />

る。<br />

操作<br />

// move instruction<br />

xmm1[127-64] = xmm1[127-64];<br />

xmm1[63-0] = xmm2[127-64];<br />

説明<br />

ソース ・ レジスタxmm2 の上位 64 ビッ トが、 128 ビット ・レジスタxmm1 の下位 64<br />

ビッ トにロードされ、 xmm1 の上位 64 ビッ トはそのまま残される。<br />

FP 例外<br />

なし。<br />

数値例外<br />

なし。<br />

保護モード例外<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

実アドレス・モード例外<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )。<br />

3:928 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


MOVHLPS—Move High to Low Packed Single-FP ( 続き )<br />

コメント<br />

MOVHLPS でのリピート ・プリフィックス(F2H,F3H) およびオペランド ・サイズ ・ プリ<br />

フィックス(66H) の使用は予約済みである。 これら のプ リ フ ィ ッ ク スの処理は、 プロ<br />

セッサによって変わる可能性がある。 MOVHLPS でこれらのプリフ ィ ックスを使用する<br />

と、 将来のプロセッサとの互換性を損なうおそれがある。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:929


MOVHPS—Move High Packed Single-FP<br />

オペコード 命令 説明<br />

0F,16,/r MOVHPS xmm, m64 2 つの単精度オペランドを表す 64 ビットを、Mem から XMM レジ<br />

スタの上位の 2 つのフィールドに移動する。<br />

0F,17,/r MOVHPS m64, xmm 2 つの単精度オペランドを表す 64 ビットを、XMM レジスタの上位<br />

の 2 つのフィールドから Mem に移動する。<br />

操作<br />

if (destination == xmm) {<br />

// load instruction<br />

xmm[127-64] = m64;<br />

xmm[31-0] = xmm[31-0];<br />

xmm[63-32] = xmm[63-32];<br />

}<br />

else {<br />

// store instruction<br />

m64 = xmm[127-64];<br />

}<br />

説明<br />

リ ニア ・ ア ド レ ス は、 参照 さ れる メ モ リ ・ デー タ の最下位バイ ト のア ド レ ス に対応す る。<br />

こ の操作を ロ ー ド 形式で使用する と 、 m64 が 128 ビット ・レジスタxmm の上位 64 ビッ<br />

トにロードされ、 xmm の下位 64 ビッ トはそのまま残される。<br />

FP 例外<br />

なし。<br />

数値例外<br />

なし。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

3:930 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


MOVHPS—Move High Packed Single-FP ( 続き )<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト、 デー<br />

タ・ダーティ・ビット ・フォルト。<br />

コメント<br />

MOVHPS での リ ピー ト ・ プ リ フ ィ ッ クス (F2H,F3H) の使用は予約済みである。 このプ リ<br />

フ ィ ッ ク スの処理は、 プ ロ セ ッ サに よ っ て変わ る可能性があ る。 MOVHPS でこのプリ<br />

フ ィ ッ ク ス を使用す る と 、 将来のプ ロ セ ッ サ と の互換性を損な う おそれがある。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:931


MOVLHPS—Move Low to High Packed Single-FP<br />

オペコード 命令 説明<br />

OF,16,/r MOVLHPS xmm1, xmm2 下位の 2 つの単精度オペランドを表す 64 ビットを、xmm2<br />

から xmm1 レジスタの上位の 2 つのフィールドに移動す<br />

る。<br />

操作<br />

// move instruction<br />

xmm1[127-64] = xmm2[63-0];<br />

xmm1[63-0] = xmm1[63-0];<br />

説明<br />

ソース ・ レジスタxmm2 の下位 64 ビッ トが、 128 ビット ・レジスタxmm1 の上位 64<br />

ビッ トにロードされ、 xmm1 の下位 64 ビッ トはそのまま残される。<br />

FP 例外<br />

なし。<br />

数値例外<br />

なし。<br />

保護モード例外<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

実アドレス・モード例外<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )。<br />

3:932 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


MOVLHPS—Move Low to High Packed Single-FP ( 続き )<br />

コメント<br />

MOVLHPS でのリピート ・プリフィックス(F2H,F3H) およびオペランド ・サイズ ・ プリ<br />

フィックス(66H) の使用は予約済みである。 これら のプ リ フ ィ ッ ク スの処理は、 プロ<br />

セッサによって変わる可能性がある。 MOVLHPS でこれらのプリフ ィ ックスを使用する<br />

と、 将来のプロセッサとの互換性を損なうおそれがある。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:933


MOVLPS—Move Low Packed Single-FP<br />

オペコード 命令 説明<br />

0F,12,/r MOVLPS xmm, m64 2 つの単精度オペランドを表す 64 ビットを、Mem から<br />

XMM レジスタの下位の 2 つのフィールドに移動する。<br />

0F,13,/r MOVLPS m64, xmm 2 つの単精度オペランドを表す 64 ビットを、XMM レジス<br />

タの下位の 2 つのフィールドから Mem に移動する。<br />

操作<br />

if (destination == xmm) {<br />

// load instruction<br />

xmm[63-0] = m64;<br />

xmm[95-64] = xmm[95-64];<br />

xmm[127-96] = xmm[127-96];<br />

}<br />

else {<br />

// store instruction<br />

m64 = xmm[63-0];<br />

}<br />

説明<br />

リ ニア ・ ア ド レ ス は、 参照 さ れる メ モ リ ・ デー タ の最下位バイ ト のア ド レ ス に対応す る。<br />

こ の操作を ロ ー ド 形式で使用する と 、 m64 が 128 ビット ・レジスタxmm の下位 64 ビッ<br />

トにロードされ、 xmm の上位 64 ビッ トはそのまま残される。<br />

FP 例外<br />

なし。<br />

数値例外<br />

なし。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

3:934 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


MOVLPS—Move Low Packed Single-FP ( 続き )<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト、 デー<br />

タ・ダーティ・ビット ・フォルト。<br />

コメント<br />

MOVLPS でのリピート ・プリフィックス(F2H,F3H) の使用は予約済みであ る。 こ のプ リ<br />

フ ィ ッ ク スの処理は、 プ ロ セ ッ サに よ っ て変わ る可能性があ る。 MOVLPS でこのプリ<br />

フ ィ ッ ク ス を使用す る と 、 将来のプ ロ セ ッ サ と の互換性を損な う おそれがある。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:935


MOVMSKPS—Move Mask To Integer<br />

オペコード 命令 説明<br />

0F,50,/r MOVMSKPS r32, xmm 1 つのマスクを r32 に移動する。<br />

操作<br />

r32[3] = xmm[127]; r32[2] = xmm[95];<br />

r32[1] = xmm[63]; r32[0] = xmm[31];<br />

r32[7-4] = 0x0; r32[15-8] = 0x00;<br />

r32[31-16] = 0x0000;<br />

説明<br />

MOVMSKPS 命令は、 命令のオペラ ン ド の各単精度浮動小数点値の最上位ビ ッ ト で作成<br />

された 4 ビッ ト ・マスクを、 整数レジスタr32 に返す。<br />

FP 例外<br />

なし。<br />

数値例外<br />

なし。<br />

保護モード例外<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

実アドレス・モード例外<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

3:936 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


MOVMSKPS—Move Mask To Integer ( 続き )<br />

コメント<br />

MOVMSKPS での リ ピー ト ・ プ リ フ ィ ッ クス (F2H,F3H) の使用は予約済みである。 こ の<br />

プ リ フ ィ ッ ク スの処理は、 プ ロ セ ッ サに よ っ て変わる可能性がある。 MOVMSKPS でこ<br />

のプ リ フ ィ ッ ク スを使用する と 、 将来のプロセ ッ サ と の互換性を損な う おそれがある。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:937


MOVSS—Move Scalar Single-FP<br />

オペコード 命令 説明<br />

F3,0F,10,/r MOVSS xmm1, xmm2/m32 1 つのスカラ単精度オペランドを表す 32 ビットを、<br />

XMM2/Mem から XMM1 レジスタに移動する。<br />

F3,0F,11,/r MOVSS xmm2/m32, xmm1 1 つのスカラ単精度オペランドを表す 32 ビットを、XMM1<br />

レジスタから XMM2/Mem に移動する。<br />

操作<br />

if (destination == xmm1) {<br />

if (source == m32) {<br />

// load instruction<br />

xmm1[31-0] = m32;<br />

xmm1[63-32] = 0x00000000;<br />

xmm1[95-64] = 0x00000000;<br />

xmm1[127-96] = 0x00000000;<br />

}<br />

else {<br />

// move instruction<br />

xmm1[31-0] = xmm2[31-0];<br />

xmm1[63-32] = xmm1[63-32];<br />

xmm1[95-64] = xmm1[95-64];<br />

xmm1[127-96] = xmm1[127-96];<br />

}<br />

}<br />

else {<br />

if (destination == m32) {<br />

// store instruction<br />

m32 = xmm1[31-0];<br />

}<br />

else {<br />

// move instruction<br />

xmm2[31-0] = xmm1[31-0]<br />

xmm2[63-32] = xmm2[63-32];<br />

xmm2[95-64] = xmm2[95-64];<br />

xmm2[127-96] = xmm2[127-96];<br />

}<br />

}<br />

説明<br />

リ ニア ・ ア ド レ ス は、 参照 さ れる メ モ リ ・ デー タ の最下位バイ ト のア ド レ ス に対応す る。<br />

メモリ ・ アド レスが指定される と、 メモリ ・ ロケーシ ョン m32 の 4 バイ ト のデータが<br />

ロード またはストアされる。 この操作をロード形式で使用すると、 メモリ内の32 ビッ ト<br />

が 128 ビッ ト ・レジスタxmm の下位 32 ビ ッ ト に ロ ー ド さ れ、 上位 96 ビットはクリアさ<br />

れる。<br />

FP 例外<br />

なし。<br />

数値例外<br />

なし。<br />

3:938 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


MOVSS—Move Scalar Single-FP ( 続き )<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト、 デー<br />

タ・ダーティ・ビット ・フォルト。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:939


MOVUPS—Move Unaligned Four Packed Single-FP<br />

オペコード 命令 説明<br />

0F,10,/r MOVUPS xmm1, xmm2/m128 4 つの単精度データを表す 128 ビットを、XMM2/Mem か<br />

ら XMM1 レジスタに移動する。<br />

0F,11,/r MOVUPS xmm2/m128, xmm1 4 つの単精度データを表す 128 ビットを、XMM1 レジスタ<br />

から XMM2/Mem に移動する。<br />

操作<br />

if (destination == xmm1) {<br />

if (source == m128) {<br />

// load instruction<br />

xmm1[127-0] = m128;<br />

}<br />

else {<br />

// move instruction<br />

xmm1[127-0] = xmm2[127-0];<br />

}<br />

}<br />

else {<br />

if (destination == m128) {<br />

// store instruction<br />

m128 = xmm1[127-0];<br />

}<br />

else {<br />

// move instruction<br />

xmm2[127-0] = xmm1[127-0];<br />

}<br />

}<br />

説明<br />

リ ニア ・ ア ド レ ス は、 参照 さ れる メ モ リ ・ デー タ の最下位バイ ト のア ド レ ス に対応す る。<br />

メモリ ・ アド レスが指定される と、 メモリ ・ ロケーシ ョン m128 の 16 バイ ト のデータ<br />

が、 128 ビッ トのマルチメディア・レジスタxmm にロー ド されるか、 または 128 ビッ ト<br />

のマルチメデ ィ ア ・ レジスタ xmm からストアされる。 この操作をレジスタ - レジスタ形<br />

式で使用する と、 128 ビッ トのソース・レジスタの内容が、 128 ビッ トのレジスタxmm<br />

にコピーされる。 データのアライメントが合っている必要はない。<br />

FP 例外<br />

なし。<br />

数値例外<br />

なし。<br />

3:940 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


MOVUPS—Move Unaligned Four Packed Single-FP ( 続き )<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト、 デー<br />

タ・ダーティ・ビット ・フォルト。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:941


MOVUPS—Move Unaligned Four Packed Single-FP ( 続き )<br />

コメント<br />

MOVUPS 命令は、 デー タ のア ラ イ メ ン ト が合わない こ と がわか っ てい る場合に使用 さ れ<br />

る。 こ の命令の使用は、 ア ラ イ メ ン ト の制約条件を満たす こ と がで き ない場合に限 ら れ<br />

る。 ス ト リ ー ミ ング SIMD 拡張命令をサポ ー ト す る プ ロ セ ッ サ上では、 ア ラ イ メ ン ト の<br />

合っていないデータに対しては MOVUPS 命令が最適なパフ ォ ー マンスを発揮する。 効<br />

率的なス ト リ ー ミ ン グ SIMD 拡張命令アプ リ ケ ー シ ョ ン は、 ア ラ イ メ ン ト の合 っ ている<br />

デ ー タ を処理す る と き は (MOVUPS ではな く ) 主に MOVAPS を使用する必要がある。<br />

MOVUPS での リ ピー ト NE プリフィックス(F2H) およびオペランド ・サイズ ・ プリ<br />

フィックス(66H) の使用は予約済みである。 こ のプ リ フ ィ ッ ク スの処理は、 プ ロセ ッ サ<br />

によ って変わる可能性がある。 MOVUPS でこれらのプリフィ ックスを使用すると、 将来<br />

のプロセッサとの互換性を損な うおそれがある。<br />

16 ビッ ト ・モードでの実行中に、 128 ビット ・データ・アクセスのリニア・アドレスが<br />

16 ビ ッ ト ・ セグ メ ン ト の終わ り と 重複す る こ と は許 さ れない。 こ れは予約済み動作 と し<br />

て定義されている。 こ の場合、 ア ド レ スがセグ メン ト の範囲を超えた と き に GP フォル<br />

ト を生成する か ど う かは、 プ ロセ ッ サに よ っ て異なる。 ま た、 セグ メ ン ト の範囲を超え<br />

たア ド レスは、 そのセグメン ト の始ま り にラ ッ プアラウン ド される こ と も、 ラ ッ プアラ<br />

ウンド されないこ と もある。<br />

3:942 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


MULPS—Packed Single-FP Multiply<br />

オペコード 命令 説明<br />

0F,59,/r MULPS xmm1, xmm2/m128 XMM1 のパックド単精度浮動小数点値に XMM2/Mem の<br />

パックド単精度浮動小数点値を掛けて、結果を XMM1 レジ<br />

スタにストアする。<br />

操作<br />

xmm1[31-0] = xmm1[31-0] * xmm2/m128[31-0];<br />

xmm1[63-32] = xmm1[63-32] * xmm2/m128[63-32];<br />

xmm1[95-64] = xmm1[95-64] * xmm2/m128[95-64];<br />

xmm1[127-96] = xmm1[127-96] * xmm2/m128[127-96];<br />

説明<br />

MULPS 命令は、 両方のオペラ ン ド のパ ッ ク ド 単精度浮動小数点値を乗算する。<br />

FP 例外<br />

セグメン ト を問わず、 16 バイ ト 境界にアラ イ メ ン ト が合 っ ていない場合は、 一般保護例<br />

外。<br />

数値例外<br />

オーバーフロー、 アンダーフロー、 無効、 精度、 デノーマル。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:943


MULPS—Packed Single-FP Multiply ( 続き )<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

3:944 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


MULSS—Scalar Single-FP Multiply<br />

オペコード 命令 説明<br />

F3,0F,59,/r MULSS xmm1, xmm2/m32 XMM1 の最下位の単精度浮動小数点値に XMM2/Mem の最<br />

下位の単精度浮動小数点値を掛けて、結果を XMM1 レジス<br />

タにストアする。<br />

操作<br />

xmm1[31-0] = xmm1[31-0] * xmm2/m32[31-0];<br />

xmm1[63-32] = xmm1[63-32];<br />

xmm1[95-64] = xmm1[95-64];<br />

xmm1[127-96] = xmm1[127-96];<br />

説明<br />

MULSS 命令は、 両方のオペラ ン ド の最下位の単精度浮動小数点値を乗算する。 上位の 3<br />

つのフ ィ ール ド は xmm1 からそのまま渡される。<br />

FP 例外<br />

なし。<br />

数値例外<br />

オーバーフロー、 アンダーフロー、 無効、 精度、 デノーマル。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#AC アラ イ メ ン ト の合っ ていないメ モリ 参照を 行っ た場合。<br />

#AC 例外を イ ネ ー ブルにする には 、 3 つの条件に該当し<br />

なければなら ない (CR0.AM がセッ ト さ れている 、<br />

EFLAGS.AC がセッ ト さ れている 、 現在の CPL が 3 であ<br />

る )。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:945


MULSS—Scalar Single-FP Multiply ( 続き )<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

3:946 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


ORPS—Bit-wise Logical OR for Single-FP Data<br />

オペコード 命令 説明<br />

0F,56,/r ORPS xmm1, xmm2/m128 XMM2/Mem の 128 ビットと XMM1 の 128 ビットの OR を<br />

とり、結果を XMM1 レジスタにストアする。<br />

操作<br />

xmm1[127-0] |= xmm2/m128[127-0];<br />

説明<br />

ORPS 命令は、 xmm1 と xmm2/mem の間で ビ ッ ト 単位の OR ( 論理和 ) 演算を実行す る。<br />

FP 例外<br />

セグメン ト を問わず、 16 バイ ト 境界にアラ イ メ ン ト が合 っ ていない場合は、 一般保護例<br />

外。<br />

数値例外<br />

なし。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:947


ORPS—Bit-wise Logical OR for Single-FP Data ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

コメント<br />

ORPS での リ ピー ト ・ プ リ フ ィ ッ ク ス (F2H,F3H) の使用は予約済みである。 こ のプ リ<br />

フ ィ ッ ク スの処理は、 プ ロ セ ッ サに よ っ て変わ る可能性があ る。 ORPS でこのプリ<br />

フ ィ ッ ク ス を使用す る と 、 将来のプ ロ セ ッ サ と の互換性を損な う おそれがある。<br />

3:948 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


RCPPS—Packed Single-FP Reciprocal<br />

オペコード 命令 説明<br />

0F,53,/r RCPPS xmm1, xmm2/m128 XMM2/Mem の逆数の近似値をパックド形式で返す。<br />

操作<br />

xmm1[31-0] = approx (1.0/(xmm2/m128[31-0]));<br />

xmm1[63-32] = approx (1.0/(xmm2/m128[63-32]));<br />

xmm1[95-64] = approx (1.0/(xmm2/m128[95-64]));<br />

xmm1[127-96] = approx (1.0/(xmm2/m128[127-96]));<br />

説明<br />

RCPPS 命令は、 xmm2/m128 の単精度浮動小数点値の逆数の近似値を返す。 こ の近似値<br />

の相対誤差は次の と お り である。<br />

|Error|


RCPPS—Packed Single-FP Reciprocal ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

コメント<br />

RCPPS は、 MXCSR の丸め制御の影響を受けない。 デノ ーマル入力は、 同じ符号のゼロ<br />

と して処理される。 小さ な結果は、 オペラン ド の符号を使用して、 常にゼロにフ ラ ッ<br />

シュされる。<br />

入力値 x が次の条件を満たす場合、 結果は極小にな ら ない こ と が保証 さ れる ため、 ゼ ロ<br />

にフラッシュされない。<br />

|x|


RCPSS—Scalar Single-FP Reciprocal<br />

オペコード 命令 説明<br />

F3,0F,53,/r RCPSS xmm1, xmm2/m32 XMM2/Mem の最下位の単精度浮動小数点値の逆数の近似<br />

値を返す。<br />

操作<br />

xmm1[31-0] = approx (1.0/(xmm2/m32[31-0]));<br />

xmm1[63-32] = xmm1[63-32];<br />

xmm1[95-64] = xmm1[95-64];<br />

xmm1[127-96] = xmm1[127-96];<br />

説明<br />

RCPSS 命令は、 xmm2/m32 の最下位の単精度浮動小数点値の逆数の近似値を返す。 上位<br />

の 3 つのフ ィ ール ド は xmm1 か ら その ま ま 渡される。 こ の近似値の相対誤差は次の と お<br />

りである。<br />

|Error|


RCPSS—Scalar Single-FP Reciprocal ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

コメント<br />

RCPSS は、 MXCSR の丸め制御の影響を受けない。 デノ ーマル入力は、 同じ符号のゼロ<br />

と して処理される。 小さ な結果は、 オペラン ド の符号を使用して、 常にゼロにフ ラ ッ<br />

シュされる。<br />

入力値 x が次の条件を満たす場合、 結果は極小にな ら ない こ と が保証 さ れる ため、 ゼ ロ<br />

にフラッシュされない。<br />

|x|


RSQRTPS—Packed Single-FP Square Root Reciprocal<br />

オペコード 命令 説明<br />

0F,52,/r RSQRTPS xmm1, xmm2/m128 XMM2/Mem の平方根の逆数の近似値をパックド形式で返<br />

す。<br />

操作<br />

xmm1[31-0] = approx (1.0/sqrt(xmm2/m128[31-0]));<br />

xmm1[63-32] = approx (1.0/sqrt(xmm2/m128[63-32]));<br />

xmm1[95-64] = approx (1.0/sqrt(xmm2/m128[95-64]));<br />

xmm1[127-96] = approx (1.0/sqrt(xmm2/m128[127-96]));<br />

説明<br />

RSQRTPS 命令は、 xmm2/m128 の単精度浮動小数点値の平方根の逆数の近似値を返す。<br />

こ の近似値の相対誤差は次の と お り である。<br />

|Error|


RSQRTPS—Packed Single-FP Square Root Reciprocal ( 続き )<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

コメント<br />

RSQRTPS は、 MXCSR の丸め制御の影響を受けない。 デノ ーマル入力は、 同じ符号のゼ<br />

ロとして処理される。<br />

3:954 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


RSQRTSS—Scalar Single-FP Square Root Reciprocal<br />

オペコード 命令 説明<br />

F3,0F,52,/r RSQRTSS xmm1, xmm2/m32 XMM2/Mem の最下位の浮動小数点値の平方根の逆数の近<br />

似値を返す。<br />

操作<br />

xmm1[31-0] = approx (1.0/sqrt(xmm2/m32[31-0]));<br />

xmm1[63-32] = xmm1[63-32];<br />

xmm1[95-64] = xmm1[95-64];<br />

xmm1[127-96] = xmm1[127-96];<br />

説明<br />

RSQRTSS 命令は、 xmm2/m32 の最下位の単精度浮動小数点値の平方根の逆数の近似値を<br />

返す。 上位の 3 つのフ ィ ール ド は xmm1 か ら その ま ま 渡 さ れる。 こ の近似値の相対誤差<br />

は次の と おり である。<br />

|Error|


RSQRTSS—Scalar Single-FP Square Root Reciprocal ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

コメント<br />

RSQRTSS は、 MXCSR の丸め制御の影響を受けない。 デノ ーマル入力は、 同じ符号のゼ<br />

ロとして処理される。<br />

3:956 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


SHUFPS—Shuffle Single-FP<br />

オペコード 命令 説明<br />

0F,C6,/r, ib SHUFPS xmm1, xmm2/m128,<br />

imm8<br />

単精度値をシャッフルする。<br />

操作<br />

fp_select = (imm8 >> 0) & 0x3;<br />

xmm1[31-0] = (fp_select == 0) ? xmm1[31-0] :<br />

(fp_select == 1) ? xmm1[63-32] :<br />

(fp_select == 2) ? xmm1[95-64] :<br />

xmm1[127-96];<br />

fp_select = (imm8 >> 2) & 0x3;<br />

xmm1[63-32] = (fp_select == 0) ? xmm1[31-0] :<br />

(fp_select == 1) ? xmm1[63-32] :<br />

(fp_select == 2) ? xmm1[95-64] :<br />

xmm1[127-96];<br />

fp_select = (imm8 >> 4) & 0x3;<br />

xmm1[95-64] = (fp_select == 0) ? xmm2/m128[31-0] :<br />

(fp_select == 1) ? xmm2/m128[63-32] :<br />

(fp_select == 2) ? xmm2/m128[95-64] :<br />

xmm2/m128[127-96];<br />

fp_select = (imm8 >> 6) & 0x3;<br />

xmm1[127-96] = (fp_select == 0) ? xmm2/m128[31-0] :<br />

(fp_select == 1) ? xmm2/m128[63-32] :<br />

(fp_select == 2) ? xmm2/m128[95-64] :<br />

xmm2/m128[127-96];<br />

説明<br />

SHUFPS 命令は、 xmm1 の 4 つの単精度浮動小数点値を シ ャ ッ フ ルして下位の 2 つのデ<br />

スティネーション・フィールドを生成し、 xmm2/m128 の 4 つの単精度浮動小数点値を<br />

シャッフルして上位の2 つのデス テ ィ ネ ー シ ョ ン ・ フ ィ ー ル ド を生成する。 SHUFPS は、<br />

両方のソース ・ オペラン ド に対して同じレジスタを使用して、 そのレジスタの 4 つの単<br />

精度浮動小数点値を自由に組み合わせて返す こ と がで き る。 即値フ ィ ー ル ド の ビ ッ ト 1<br />

とビッ ト 0 を使用して、 4 つの入力単精度浮動小数点値の う ち ど の値が、 結果の最初の<br />

単精度浮動小数点値に入れられる かを選択する。 即値フ ィ ー ル ド の ビ ッ ト 3 とビット 2<br />

を使用して、 4 つの入力単精度浮動小数点値の う ち ど の値が、 結果の 2 番目の単精度浮<br />

動小数点値に入れ ら れる かを選択す る。 以下同様に、 結果の 3 番目、 4 番目の値を指定<br />

する。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:957


SHUFPS—Shuffle Single-FP ( 続き )<br />

例 :<br />

FP 例外<br />

セグメン ト を問わず、 16 バイ ト 境界にアラ イ メ ン ト が合 っ ていない場合は、 一般保護例<br />

外。<br />

数値例外<br />

なし。<br />

xmm1<br />

xmm2/m128<br />

xmm1<br />

X4 X3 X2 X1<br />

Y4 Y3 Y2 Y1<br />

{Y4 ... Y1} {Y4 ... Y1} {X4 ... X1} {X4 ... X1}<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

3:958 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


SHUFPS—Shuffle Single-FP ( 続き )<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

コメント<br />

SHUFPS でのリピート ・プリフィックス(F2H,F3H) の使用は予約済みである。 こ のプ リ<br />

フ ィ ッ ク スの処理は、 プ ロ セ ッ サに よ っ て変わ る可能性があ る。 SHUFPS でこのプリ<br />

フ ィ ッ ク ス を使用す る と 、 将来のプ ロ セ ッ サ と の互換性を損な う おそれがある。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:959


SQRTPS—Packed Single-FP Square Root<br />

オペコード 命令 説明<br />

0F,51,/r SQRTPS xmm1, xmm2/m128 XMM2/Mem のパックド単精度浮動小数点値の平方根を返<br />

す。<br />

操作<br />

xmm1[31-0] = sqrt (xmm2/m128[31-0]);<br />

xmm1[63-32] = sqrt (xmm2/m128[63-32]);<br />

xmm1[95-64] = sqrt (xmm2/m128[95-64]);<br />

xmm1[127-96] = sqrt (xmm2/m128[127-96]);<br />

説明<br />

SQRTPS 命令は、 xmm2/m128 のパ ッ ク ド 単精度浮動小数点値の平方根を返す。<br />

FP 例外<br />

セグメン ト を問わず、 16 バイ ト 境界にアラ イ メ ン ト が合 っ ていない場合は、 一般保護例<br />

外。<br />

数値例外<br />

無効、 精度、 デ ノ ー マル。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

3:960 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


SQRTPS—Packed Single-FP Square Root ( 続き )<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:961


SQRTSS—Scalar Single-FP Square Root<br />

オペコード 命令 説明<br />

F3,0F,51,/r SQRTSS xmm1, xmm2/m32 XMM2/Mem の最下位の単精度浮動小数点値の平方根を返<br />

す。<br />

操作<br />

xmm1[31-0] = sqrt (xmm2/m32[31-0]);<br />

xmm1[63-32] = xmm1[63-32];<br />

xmm1[95-64] = xmm1[95-64];<br />

xmm1[127-96] = xmm1[127-96];<br />

説明<br />

SQRTSS 命令は、 命令のオペラ ン ド の最下位の単精度浮動小数点値の平方根を返す。<br />

FP 例外<br />

なし。<br />

数値例外<br />

無効、 精度、 デ ノ ー マル。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

3:962 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


SQRTSS—Scalar Single-FP Square Root ( 続き )<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:963


STMXCSR—Store Streaming SIMD Extension Control/Status<br />

オペコード 命令 説明<br />

0F,AE,/3 STMXCSR m32 ストリーミング SIMD 拡張命令の制御 / ステータス・ワー<br />

ドを m32 にストアする。<br />

操作<br />

m32 = MXCSR;<br />

説明<br />

MXCSR 制御 / ステータス ・ レジスタを使用して、 マスク されている / マスク されていな<br />

い例外処理のイネ ーブル / デ ィ スエーブルの設定、 丸めモー ド の設定、 ゼロにフラ ッ<br />

シュ ・モードの設定、 例外ステータス・ フラグの確認を行うことができる。 MXCSR の<br />

フォーマットについては、 LDMXCSR を参照されたい。 リ ニア ・ ア ド レスは、 参照され<br />

る メ モ リ ・ デ ー タ の最下位バイ ト のア ド レ ス に対応す る。 MXCSR 内の予約ビ ッ ト は、<br />

ゼロとしてス トアされる。<br />

FP 例外<br />

なし。<br />

数値例外<br />

なし。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

3:964 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


STMXCSR—Store Streaming SIMD Extension Control/Status ( 続き )<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC ア ラ イ メ ン ト の合 っ ていない メ モ リ 参照を行 っ た場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト、 デー<br />

タ・ダーティ・ビット ・フォルト。<br />

コメント<br />

STMXCSR でのリピート ・プリフィックス(F2H,F3H) およびオペランド ・サイズ ・ プリ<br />

フィックス(66H) の使用は予約済みである。 このプ リ フ ィ ッ ク スの処理は、 プロセ ッ サ<br />

によ って変わる可能性がある。 STMXCSR で こ のプ リ フ ィ ッ ク スを使用する と 、 将来の<br />

プロセッサとの互換性を損なうおそれがある。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:965


SUBPS—Packed Single-FP Subtract<br />

オペコード 命令 説明<br />

0F,5C,/r SUBPS xmm1, xmm2/m128 XMM1 のパックド単精度浮動小数点値から XMM2/Mem の<br />

パックド単精度浮動小数点値を引く。<br />

操作<br />

xmm1[31-0] = xmm1[31-0] - xmm2/m128[31-0];<br />

xmm1[63-32] = xmm1[63-32] - xmm2/m128[63-32];<br />

xmm1[95-64] = xmm1[95-64] - xmm2/m128[95-64];<br />

xmm1[127-96] = xmm1[127-96] - xmm2/m128[127-96];<br />

説明<br />

SUBPS 命令は、 両方のオペラ ン ド のパ ッ ク ド 単精度浮動小数点値を引き算す る。<br />

FP 例外<br />

セグメン ト を問わず、 16 バイ ト 境界にアラ イ メ ン ト が合 っ ていない場合は、 一般保護例<br />

外。<br />

数値例外<br />

オーバーフロー、 アンダーフロー、 無効、 精度、 デノーマル。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

3:966 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


SUBPS—Packed Single-FP Subtract ( 続き )<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:967


SUBSS—Scalar Single-FP Subtract<br />

オペコード 命令 説明<br />

F3,0F,5C, /r SUBSS xmm1, xmm2/m32 XMM1 の最下位の単精度浮動小数点値から XMM2/Mem の<br />

最下位の単精度浮動小数点値を引く。<br />

操作<br />

xmm1[31-0] = xmm1[31-0] - xmm2/m32[31-0];<br />

xmm1[63-32] = xmm1[63-32];<br />

xmm1[95-64] = xmm1[95-64];<br />

xmm1[127-96] = xmm1[127-96];<br />

説明<br />

SUBSS 命令は、 両方のオペラ ン ド の最下位の単精度浮動小数点値を引き算す る。<br />

FP 例外<br />

なし。<br />

数値例外<br />

オーバーフロー、 アンダーフロー、 無効、 精度、 デノーマル。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

3:968 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


SUBSS—Scalar Single-FP Subtract ( 続き )<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:969


UCOMISS—Unordered Scalar Single-FP compare and set EFLAGS<br />

オペコード 命令 説明<br />

0F,2E,/r UCOMISS xmm1, xmm2/m32 XMM1 レジスタの最下位の単精度浮動小数点値と<br />

XMM2/Mem の最下位の単精度浮動小数点値を比較し、<br />

結果に従ってステータス・フラグを設定する。<br />

操作<br />

switch (xmm1[31-0] xmm2/m32[31-0]) {<br />

OF,SF,AF = 000;<br />

case UNORDERED: ZF,PF,CF = 111;<br />

case GREATER_THAN: ZF,PF,CF = 000;<br />

case LESS_THAN: ZF,PF,CF = 001;<br />

case EQUAL: ZF,PF,CF = 100;<br />

}<br />

説明<br />

UCOMISS 命令は、 2 つの最下位のス カ ラ単精度浮動小数点値を比較し、 すでに説明した<br />

ように、 EFLAGS レジスタのZF、 PF、 CF ビットをセットする。 また、 EFLAGS レジス<br />

タの OF、 SF、 AF ビットはゼロにされる。 いずれかのソース・オペランドがNaN (qNaN<br />

または sNaN) の場合は、 無効数値例外が発生す る。<br />

FP 例外<br />

なし。<br />

数値例外<br />

無効 (SNaN オペラン ド の場合 )、 デ ノ ー マル。 マス ク さ れていない数値例外が発生した<br />

場合は、 整数の EFLAGS 値はアッ プデー ト されない。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

3:970 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


UCOMISS—Unordered Scalar Single-FP compare and set EFLAGS ( 続き )<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#XM マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 1)。<br />

#UD マスク されていないスト リ ー ミ ング SIMD 拡張命令数値例<br />

外が発生した場合 (CR4.OSXMMEXCPT = 0)。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

コメント<br />

UCOMISS と COMISS の相違点は、 UCOMISS は、 ソース ・ オペラン ド が sNaN である場<br />

合にのみ無効数値例外を報告する こ と である。 COMISS は、 ソ ース ・ オペラン ド が<br />

qNaN または sNaN オペラ ン ド である場合に無効例外を報告する。<br />

UCOMISS での リ ピー ト ・ プ リ フ ィ ッ クス (F2H,F3H) の使用は予約済みであ る。 こ れ ら<br />

のプ リ フ ィ ッ クスの処理は、 プロセッサによ って変わる可能性がある。 UCOMISS でこ<br />

れらのプ リ フ ィ ッ ク スを使用する と、 将来のプロセ ッ サ と の互換性を損な う おそれがあ<br />

る。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:971


UNPCKHPS—Unpack High Packed Single-FP Data<br />

オペコード 命令 説明<br />

0F,15,/r UNPCKHPS xmm1, xmm2/m128 XMM1 の上位半分の単精度浮動小数点値と XMM2/Mem<br />

の上位半分の単精度浮動小数点値を XMM1 レジスタに<br />

インタリーブする。<br />

操作<br />

xmm1[31-0] = xmm1[95-64];<br />

xmm1[63-32] = xmm2/m128[95-64];<br />

xmm1[95-64] = xmm1[127-96];<br />

xmm1[127-96] = xmm2/m128[127-96];<br />

説明<br />

UNPCKHPS 命令は、 XMM1 と XMM2/Mem の上位半分のデー タ要素をアンパ ッ ク して<br />

イ ン タ リ ー ブす る。 ソ ー ス ・ オペラ ン ド の下位半分は無視 さ れる。<br />

例 :<br />

FP 例外<br />

セグメン ト を問わず、 16 バイ ト 境界にアラ イ メ ン ト が合 っ ていない場合は、 一般保護例<br />

外。<br />

数値例外<br />

なし。<br />

X4 X3 X2 X1<br />

Y4 Y3 Y2 Y1<br />

Y4 X4 Y3 X3<br />

xmm1<br />

xmm2/m128<br />

xmm1<br />

3:972 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


UNPCKHPS—Unpack High Packed Single-FP Data ( 続き )<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

コメント<br />

プ ロ セ ッ サに よ っ ては、 メ モ リ ・ オペラ ン ド か ら のアンパ ッ ク の際に、 適切な 64 ビッ ト<br />

だけをフ ェ ッチする場合がある。 この場合も、 16 バイ ト ・ アライメン ト のチェ ッ ク と通<br />

常のセグメ ン ト ・ チェ ッ クが行われる。<br />

UNPCKHPS での リ ピー ト ・ プ リ フ ィ ッ クス (F2H,F3H) の使用は予約済みであ る。 こ のプ<br />

リ フ ィ ッ ク スの処理は、 プ ロ セ ッ サに よ っ て変わる可能性がある。 UNPCKHPS でこのプ<br />

リ フ ィ ッ ク スを使用する と、 将来のプロセ ッ サ と の互換性を損な う おそれがある。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:973


UNPCKLPS—Unpack Low Packed Single-FP Data<br />

オペコード 命令 説明<br />

0F,14,/r UNPCKLPS xmm1, xmm2/m128 XMM1 の下位半分の単精度浮動小数点値と XMM2/Mem<br />

の下位半分の単精度浮動小数点値を XMM1 レジスタに<br />

インタリーブする。<br />

操作<br />

xmm1[31-0] = xmm1[31-0];<br />

xmm1[63-32] = xmm2/m128[31-0];<br />

xmm1[95-64] = xmm1[63-32];<br />

xmm1[127-96] = xmm2/m128[63-32];<br />

説明<br />

UNPCKLPS 命令は、 XMM1 と XMM2/Mem の下位半分のデ ー タ要素をアンパ ッ ク して イ<br />

ン タ リ ー ブす る。 ソ ー ス ・ オペラ ン ド の下位半分は無視 さ れる。<br />

例 :<br />

FP 例外<br />

セグメン ト を問わず、 16 バイ ト 境界にアラ イ メ ン ト が合 っ ていない場合は、 一般保護例<br />

外。<br />

数値例外<br />

なし。<br />

xmm1<br />

xmm2/m128<br />

xmm1<br />

X4 X3 X2 X1<br />

Y4 Y3 Y2 Y1<br />

Y2 X2 Y1 X1<br />

3:974 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


UNPCKLPS—Unpack Low Packed Single-FP Data ( 続き )<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

コメント<br />

プ ロ セ ッ サに よ っ ては、 メ モ リ ・ オペラ ン ド か ら のアンパ ッ ク の際に、 適切な 64 ビッ ト<br />

だけをフ ェ ッチする場合がある。 この場合も、 16 バイ ト ・ アライメン ト のチェ ッ ク と通<br />

常のセグメ ン ト ・ チェ ッ クが行われる。<br />

UNPCKLPS でのリピート ・プリフィックス(F2H,F3H) の使用は予約済みであ る。 こ のプ<br />

リ フ ィ ッ ク スの処理は、 プ ロ セ ッ サに よ っ て変わる可能性がある。 UNPCKLPS でこれら<br />

のプ リ フ ィ ッ ク スを使用する と 、 将来のプロセ ッ サ と の互換性を損な う おそれがある。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:975


XORPS—Bit-wise Logical Xor for Single-FP Data<br />

オペコード 命令 説明<br />

0F,57,/r XORPS xmm1, xmm2/m128 XMM2/Mem と XMM1 の 128 ビットの XOR をとり、結果<br />

を XMM1 レジスタにストアする。<br />

操作<br />

xmm[127-0] ^= xmm/m128[127-0];<br />

説明<br />

XORPS 命令は、 XMM1 と XMM2/Mem の間でビ ッ ト 単位の XOR ( 排他的論理和 ) 演算<br />

を実行する。<br />

FP 例外<br />

セグメン ト を問わず、 16 バイ ト 境界にアラ イ メ ン ト が合 っ ていない場合は、 一般保護例<br />

外。<br />

数値例外<br />

なし<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

3:976 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


XORPS—Bit-wise Logical Xor for Single-FP Data ( 続き )<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

コメント<br />

XORPS での リ ピー ト ・ プ リ フ ィ ッ クス (F2H,F3H) の使用は予約済みである。 こ のプ リ<br />

フ ィ ッ クスの処理は、 プロセッサご とに異なる可能性がある。 XORPS でこのプリ フ ィ ッ<br />

ク スを使用する と、 将来のプロセ ッ サ と の互換性が失われるおそれがある。<br />

3.13 SIMD 整数拡張命令セット<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

3D グラフ ィ ッ クスやビデオ ・ デコーディ ング / エンコーディ ングなどのアプ リ ケーシ ョ<br />

ンの処理を高速化す る ために、 新しい SIMD 整数命令が追加された。 これらの命令は、<br />

MMX テクノロジ ・ レジスタと 64 ビッ ト ・メモリ ・オペランドを操作する。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:977


PAVGB/PAVGW—Packed Average<br />

オペコード 命令 説明<br />

0F,E0, /r PAVGB mm1, mm2/m64 MM2/Mem の符号なしパックド・バイトと MM1 レジスタ<br />

の符号なしパックド・バイトを平均し、丸めた結果を<br />

MM1 レジスタにストアする。<br />

0F,E3, /r PAVGW mm1, mm2/m64 MM2/Mem の符号なしパックド・ワードと MM1 レジスタ<br />

の符号なしパックド・ワードを平均し、丸めた結果を<br />

MM1 レジスタにストアする。<br />

操作<br />

if (instruction == PAVGB) {<br />

x[0] = mm1[7-0] y[0] = mm2/m64[7-0];<br />

x[1] = mm1[15-8] y[1] = mm2/m64[15-8];<br />

x[2] = mm1[23-16] y[2] = mm2/m64[23-16];<br />

x[3] = mm1[31-24] y[3] = mm2/m64[31-24];<br />

x[4] = mm1[39-32] y[4] = mm2/m64[39-32];<br />

x[5] = mm1[47-40] y[5] = mm2/m64[47-40];<br />

x[6] = mm1[55-48] y[6] = mm2/m64[55-48];<br />

x[7] = mm1[63-56] y[7] = mm2/m64[63-56];<br />

for (i = 0; i < 8; i++) {<br />

temp[i] = zero_ext(x[i], 8) + zero_ext(y[i], 8);<br />

res[i] = (temp[i] +1) >> 1;<br />

}<br />

mm1[7-0] = res[0];<br />

...<br />

mm1[63-56] = res[7];<br />

}<br />

else if (instruction == PAVGW){<br />

x[0] = mm1[15-0] y[0] = mm2/m64[15-0];<br />

x[1] = mm1[31-16] y[1] = mm2/m64[31-16];<br />

x[2] = mm1[47-32] y[2] = mm2/m64[47-32];<br />

x[3] = mm1[63-48] y[3] = mm2/m64[63-48];<br />

for (i = 0; i < 4; i++) {<br />

temp[i] = zero_ext(x[i], 16) + zero_ext(y[i], 16);<br />

res[i] = (temp[i] +1) >> 1;<br />

}<br />

mm1[15-0] = res[0];<br />

...<br />

mm1[63-48] = res[3];<br />

}<br />

3:978 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


PAVGB/PAVGW—Packed Average ( 続き )<br />

説明<br />

ソース・オペランドの符号なしデータ要素をデスティネーション・レジスタの符号なし<br />

デ ー タ要素に加算し、 キ ャ リ ー イ ン を付け る。 次に、 加算の結果を それぞれ 1 ビッ トだ<br />

け右にシフトする。 各要素の最上位ビッ トは、 対応する和のキャリー・ビッ トで埋める。<br />

デステ ィ ネーシ ョ ン ・ オペラン ド は、 MMX テクノロジ ・ レジスタでなければならない。<br />

ソース ・オペランドには、 MMX テクノロジ ・ レジスタまたは 64 ビッ トのメモリ ・オペ<br />

ランドを使用できる。<br />

PAVGB 命令は、 符号なしパ ッ ク ド ・ バイ ト を処理する。 PAVGW 命令は、 符号なしパ ッ<br />

クド・ワードを処理する。<br />

数値例外<br />

なし。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:979


PAVGB/PAVGW—Packed Average ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

3:980 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


PEXTRW—Extract Word<br />

オペコード 命令 説明<br />

0F,C5, /r, ib PEXTRW r32, mm, imm8 imm8 によって指定されたワードを MM から抽出し、32<br />

ビット整数レジスタに移動する。<br />

操作<br />

sel = imm8 & 0x3;<br />

mm_temp = (mm >> (sel * 16)) & 0xffff;<br />

r[15-0] = mm_temp[15-0];<br />

r[31-16] = 0x0000;<br />

説明<br />

PEXTRW 命令は、 imm8 の最下位 2 ビッ トによって選択されたMM 内のワ ー ド を、 32<br />

ビ ッ ト 整数レ ジ ス タ の下位半分に移動す る。<br />

数値例外<br />

なし。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:981


PINSRW—Insert Word<br />

オペコード 命令 説明<br />

0F,C4,/r,ib PINSRW mm, r32/m16, imm8 r32 の下位半分または Mem16 からのワードを、imm8 に<br />

よって指定された MM 内の位置に挿入し、他のワードはそ<br />

のまま残す。<br />

操作<br />

sel = imm8 & 0x3;<br />

mask = (sel == 0)? 0x000000000000ffff :<br />

(sel == 1)? 0x00000000ffff0000 :<br />

(sel == 2)? 0x0000ffff00000000 :<br />

0xffff000000000000;<br />

mm = (mm & ~mask) | ((m16/r32[15-0]


PINSRW—Insert Word ( 続き )<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:983


PMAXSW—Packed Signed Integer Word Maximum<br />

オペコード 命令 説明<br />

0F,EE, /r PMAXSW mm1, mm2/m64 MM2/Mem と MM1 の各ワードを比較して最大値を返す。<br />

操作<br />

mm1[15-0] = (mm1[15-0] > mm2/m64[15-0]) ? mm1[15-0] : mm2/m64[15-0];<br />

mm1[31-16] = (mm1[31-16] > mm2/m64[31-16]) ? mm1[31-16] : mm2/m64[31-16];<br />

mm1[47-32] = (mm1[47-32] > mm2/m64[47-32]) ? mm1[47-32] : mm2/m64[47-32];<br />

mm1[63-48] = (mm1[63-48] > mm2/m64[63-48]) ? mm1[63-48] : mm2/m64[63-48];<br />

説明<br />

PMAXSW 命令は、 MM1 と MM2/Mem の 4 つの符号付き ワ ー ド を比較して、 各要素の最<br />

大値を返す。<br />

数値例外<br />

なし。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

3:984 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


PMAXSW—Packed Signed Integer Word Maximum ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:985


PMAXUB—Packed Unsigned Integer Byte Maximum<br />

オペコード 命令 説明<br />

0F,DE, /r PMAXUB mm1, mm2/m64 MM2/Mem と MM1 の各バイトを比較して最大値を返す。<br />

操作<br />

mm1[7-0] = (mm1[7-0] > mm2/m64[7-0]) ? mm1[7-0] : mm2/m64[7-0];<br />

mm1[15-8] = (mm1[15-8] > mm2/m64[15-8]) ? mm1[15-8] : mm2/m64[15-8];<br />

mm1[23-16] = (mm1[23-16] > mm2/m64[23-16]) ? mm1[23-16] : mm2/m64[23-16];<br />

mm1[31-24] = (mm1[31-24] > mm2/m64[31-24]) ? mm1[31-24] : mm2/m64[31-24];<br />

mm1[39-32] = (mm1[39-32] > mm2/m64[39-32]) ? mm1[39-32] : mm2/m64[39-32];<br />

mm1[47-40] = (mm1[47-40] > mm2/m64[47-40]) ? mm1[47-40] : mm2/m64[47-40];<br />

mm1[55-48] = (mm1[55-48] > mm2/m64[55-48]) ? mm1[55-48] : mm2/m64[55-48];<br />

mm1[63-56] = (mm1[63-56] > mm2/m64[63-56]) ? mm1[63-56] : mm2/m64[63-56];<br />

説明<br />

PMAXUB 命令は、 MM1 と MM2/Mem の 8 つの符号なしバイ ト を比較して、 各要素の最<br />

大値を返す。<br />

数値例外<br />

なし。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

3:986 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


PMAXUB—Packed Unsigned Integer Byte Maximum ( 続き )<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:987


PMINSW—Packed Signed Integer Word Minimum<br />

オペコード 命令 説明<br />

0F,EA, /r PMINSW mm1, mm2/m64 MM2/Mem と MM1 の各ワードを比較して最小値を返す。<br />

操作<br />

mm1[15-0] = (mm1[15-0] < mm2/m64[15-0]) ? mm1[15-0] : mm2/m64[15-0];<br />

mm1[31-16] = (mm1[31-16] < mm2/m64[31-16]) ? mm1[31-16] : mm2/m64[31-16];<br />

mm1[47-32] = (mm1[47-32] < mm2/m64[47-32]) ? mm1[47-32] : mm2/m64[47-32];<br />

mm1[63-48] = (mm1[63-48] < mm2/m64[63-48]) ? mm1[63-48] : mm2/m64[63-48];<br />

説明<br />

PMINSW 命令は、 MM1 と MM2/Mem の 4 つの符号付き ワ ー ド を比較して、 各要素の最<br />

小値を返す。<br />

数値例外<br />

なし。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

3:988 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


PMINSW—Packed Signed Integer Word Minimum ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:989


PMINUB—Packed Unsigned Integer Byte Minimum<br />

オペコード 命令 説明<br />

0F,DA, /r PMINUB mm1, mm2/m64 MM2/Mem と MM1 の各バイトを比較して最小値を返す。<br />

操作<br />

mm1[7-0] = (mm1[7-0] < mm2/m64[7-0]) ? mm1[7-0] : mm2/m64[7-0];<br />

mm1[15-8] = (mm1[15-8] < mm2/m64[15-8]) ? mm1[15-8] : mm2/m64[15-8];<br />

mm1[23-16] = (mm1[23-16] < mm2/m64[23-16]) ? mm1[23-16] : mm2/m64[23-16];<br />

mm1[31-24] = (mm1[31-24] < mm2/m64[31-24]) ? mm1[31-24] : mm2/m64[31-24];<br />

mm1[39-32] = (mm1[39-32] < mm2/m64[39-32]) ? mm1[39-32] : mm2/m64[39-32];<br />

mm1[47-40] = (mm1[47-40] < mm2/m64[47-40]) ? mm1[47-40] : mm2/m64[47-40];<br />

mm1[55-48] = (mm1[55-48] < mm2/m64[55-48]) ? mm1[55-48] : mm2/m64[55-48];<br />

mm1[63-56] = (mm1[63-56] < mm2/m64[63-56]) ? mm1[63-56] : mm2/m64[63-56];<br />

説明<br />

PMINUB 命令は、 MM1 と MM2/Mem の 8 つの符号なしバイ ト を比較して、 各要素の最<br />

小値を返す。<br />

数値例外<br />

なし。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

3:990 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


PMINUB—Packed Unsigned Integer Byte Minimum ( 続き )<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:991


PMOVMSKB—Move Byte Mask To Integer<br />

オペコード 命令 説明<br />

0F,D7,/r PMOVMSKB r32, mm MM のバイト・マスクを r32 に移動する。<br />

操作<br />

r32[7] = mm[63]; r32[6] = mm[55];<br />

r32[5] = mm[47]; r32[4] = mm[39];<br />

r32[3] = mm[31]; r32[2] = mm[23];<br />

r32[1] = mm[15]; r32[0] = mm[7];<br />

r32[31-8] = 0x000000;<br />

説明<br />

PMOVMSKB 命令は、 命令の ソ ー ス ・ オペラ ン ド の各バ イ ト の最上位ビ ッ ト で作成 さ れ<br />

た 8 ビット ・マスクを返す。<br />

数値例外<br />

なし。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

3:992 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


PMOVMSKB—Move Byte Mask To Integer ( 続き )<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・ 浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )。<br />

レジスタ ・ フォルト<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:993


PMULHUW—Packed Multiply High Unsigned<br />

オペコード 命令 説明<br />

0F,E4,/r PMULHUW mm1, mm2/m64 MM1 の符号なしパックド・ワードに MM2/Mem の符号な<br />

しパックド・ワードを掛けて、結果の上位 16 ビットを<br />

MM1 レジスタにストアする。<br />

操作<br />

mm1[15-0] = (mm1[15-0] * mm2/m64[15-0])[31-16];<br />

mm1[31-16] = (mm1[31-16] * mm2/m64[31-16])[31-16];<br />

mm1[47-32] = (mm1[47-32] * mm2/m64[47-32])[31-16];<br />

mm1[63-48] = (mm1[63-48] * mm2/m64[63-48])[31-16];<br />

説明<br />

PMULHUW 命令は、 デス テ ィ ネ ー シ ョ ン ・ オペラ ン ド の 4 つの符号なしワー ド にソ ー<br />

ス・オペランドの4 つの符号なしワー ド を掛けて、 32 ビ ッ ト の中間結果の上位 16 ビッ<br />

トをデスティネーション・オペランドに書き込む。<br />

数値例外<br />

なし。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

3:994 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


PMULHUW—Packed Multiply High Unsigned ( 続き )<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:995


PSADBW—Packed Sum of Absolute Differences<br />

オペコード 命令 説明<br />

0F,F6, /r PSADBW mm1, mm2/m64 MM2/Mem と MM1 の符号なしパックド・バイトの差の絶<br />

対値を計算し、得られた差を合計して 1 ワードの結果を返<br />

す。<br />

操作<br />

temp1 = ABS(mm1[7-0] - mm2/m64[7-0]);<br />

temp2 = ABS(mm1[15-8] - mm2/m64[15-8]);<br />

temp3 = ABS(mm1[23-16] - mm2/m64[23-16]);<br />

temp4 = ABS(mm1[31-24] - mm2/m64[31-24]);<br />

temp5 = ABS(mm1[39-32] - mm2/m64[39-32]);<br />

temp6 = ABS(mm1[47-40] - mm2/m64[47-40]);<br />

temp7 = ABS(mm1[55-48] - mm2/m64[55-48]);<br />

temp8 = ABS(mm1[63-56] - mm2/m64[63-56]);<br />

mm1[15:0] = temp1 + temp2 + temp3 + temp4 + temp5 + temp6 + temp7 + temp8;<br />

mm1[31:16] = 0x00000000;<br />

mm1[47:32] = 0x00000000;<br />

mm1[63:48] = 0x00000000;<br />

説明<br />

PSADBW 命令は、 mm1 と mm2/m64 の符号なしバイ ト の差の絶対値を計算し、 得られた<br />

差を合計して、 下位 16 ビッ ト ・フィールドに1 ワ ー ド の結果を返す。 上位の 3 ワードは<br />

クリアされる。<br />

デステ ィ ネーシ ョ ン ・ オペラン ド は、 MMX テクノロジ ・ レジスタでなければならない。<br />

ソース ・オペランドには、 MMX テクノロジ ・ レジスタまたは 64 ビッ トのメモリ ・オペ<br />

ランドを使用できる。<br />

数値例外<br />

なし。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

3:996 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


PSADBW—Packed Sum of Absolute Differences ( 続き )<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:997


PSHUFW—Packed Shuffle Word<br />

オペコード 命令 説明<br />

0F,70,/r,ib PSHUFW mm1, mm2/m64, imm8 imm8 のエンコーディングに基づいて MM2/Mem の<br />

ワードをシャッフルし、MM1 にストアする。<br />

操作<br />

mm1[15-0] = (mm2/m64 >> (imm8[1-0] * 16) )[15-0]<br />

mm1[31-16] = (mm2/m64 >> (imm8[3-2] * 16) )[15-0]<br />

mm1[47-32] = (mm2/m64 >> (imm8[5-4] * 16) )[15-0]<br />

mm1[63-48] = (mm2/m64 >> (imm8[7-6] * 16) )[15-0]<br />

説明<br />

PSHUF 命令は、 imm8 オペラン ド を使用して、 MM2/Mem の 4 ワード とそれらをストア<br />

する MM1 の 4 ワ ー ド の間の対応関係を指定する。 imm8 のビッ ト 1 とビッ ト 0 は、 デス<br />

ティネーション・ワード 0 (MM1[15-0]) のソースを指示する。 ビッ ト 3 とビッ ト 2 は<br />

ワード 1、 ビッ ト 5 とビッ ト 4 はワー ド 2、 ビッ ト 7 とビット 6 はワー ド 3 (MM1[63-48])<br />

を指示する。 各 2 ビットのエンコーディングによって、 ストアされるソース・ワードを<br />

表す。 例えば、 2 進コー ド化値 10 は、 ソース ・ ワ ー ド 2 (MM2/Mem[47-32]) がス ト アさ<br />

れる こ と を示す。<br />

数値例外<br />

なし。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

3:998 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


PSHUFW—Packed Shuffle Word ( 続き )<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

3.14 キャッシュ制御命令<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト。<br />

本章では、 キ ャ ッ シ ュ 制御命令について説明す る。 キ ャ ッ シ ュ 制御命令に よ っ て、 アプ<br />

リ ケ ー シ ョ ン開発者は、 デ ー タ ・ ア ク セスの レ イ テ ン シ と キ ャ ッ シ ュ 汚染を最小限に抑<br />

えられる。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:999


MASKMOVQ—Byte Mask Write<br />

オペコード 命令 説明<br />

0F,F7,/r MASKMOVQ mm1, mm2 MM2 レジスタ内のバイト・マスクを使用して、整数デー<br />

タを表す 64 ビットを、MM1 レジスタから、edi レジスタ<br />

によって指定されたメモリ・ロケーションに移動する。<br />

操作<br />

if (mm2[7]) m64[edi] = mm1[7-0];<br />

if (mm2[15]) m64[edi+1] = mm1[15-8];<br />

if (mm2[23]) m64[edi+2] = mm1[23-16];<br />

if (mm2[31]) m64[edi+3] = mm1[31-24];<br />

if (mm2[39]) m64[edi+4] = mm1[39-32];<br />

if (mm2[47]) m64[edi+5] = mm1[47-40];<br />

if (mm2[55]) m64[edi+6] = mm1[55-48];<br />

if (mm2[63]) m64[edi+7] = mm1[63-56];<br />

説明<br />

データは、 mm1 レジスタから、 (DS セグメン ト を使用して ) di/edi レジスタによって指定<br />

された位置にストアされる。 ス トアのサイズは、 アド レス ・ サイズ属性によ って決まる。<br />

マスク ・ レジスタ mm2 の各バイ ト の最上位ビッ ト に従って、 バイ ト ご と に選択した上で<br />

データが書き込まれる (0 = 書き込みなし、 1 = 書き込み )。 マスクがすべてゼロの場合、<br />

動作は次の よ う にな る。<br />

• デー タはメモ リ に書き込まれない。 ただし、 マス クの値に関係な く 、 必要に応じて<br />

浮動小数点状態か ら MMX テ ク ノ ロ ジ状態への ト ラ ンジシ ョ ンが発生する。<br />

• メモリ参照については、 ゼロ ・ バイ ト ・ マスクがあっても、 アド レス指定フォル ト<br />

( すなわち、 #GP、 #SS) は報告される。<br />

• ページ ・ フォル ト (#PG) が報告されるかど う かは、 プロセ ッ サに よ っ て異なる。<br />

• #UD、 #NM、 #MF、 および #AC フ ォ ル ト は、 マス ク の値に関係な く 報告 さ れる。<br />

• ブレークポイン ト ( コードまたはデータ ) の報告については保証していない。 ブ レ ー<br />

クポイントが報告されるかどうかは、 プロセッサによって異なる。<br />

• デステ ィ ネーシ ョ ン ・ メモリ ・ エリ アが UC または WP としてマッピングされる場<br />

合、 これらのメモ リ ・ タ イプ用の関連するセマンテ ィ ク スの実装については保証し<br />

ていない ( 予約済みであ る )。 セマンテ ィ クスの実装については、 プロセッサによ っ<br />

て異なる。 こ の場合、 特定のプ ロセ ッ サの動作に依存する こ と は、 将来のプ ロセ ッ<br />

サ と の互換性を損な う おそれがあるため、 推奨できない。<br />

ModR/M バイ ト の Mod フィールドは11 でなければな ら ない。 こ れ以外の値では、 無効<br />

オペコ ー ド例外が発生する。<br />

数値例外<br />

なし。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

3:1000 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


MASKMOVQ—Byte Mask Write ( 続き )<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )。<br />

コメント<br />

MASKMOVQ 命令を使用して、 バ イ ト を最小単位 と してデー タ をマ ー ジす る必要がある<br />

アルゴ リ ズムのパフ ォ ーマンスを強化でき る。 MASKMOVQ 命令で所有権の読み込みを<br />

行ってはならない。 これを行う と、 ス トアの前に元のデータを割り当てずに、 バイ ト ・<br />

マス ク を使用してデ ー タ が直接書き込 ま れる ため、 不要な帯域幅が発生す る。<br />

MASKMOVQ 命令は、 ス ト リ ー ミ ン グ SIMD 拡張命令の非テ ン ポ ラ ルなス ト ア命令 と 同<br />

じ よ う に、 キャ ッ シ ュ階層の汚染を最小限に抑える。 MSKMOVQ 命令は、 順序設定の緩<br />

い書き込み組み合わせ (write-combining) ストア(WC) を暗黙的に使用する。 非テ ン ポ ラ<br />

ルなス ト アの詳細は、 3.6.1.9 項を参照のこ と。<br />

こ の命令を使用する と、 順序設定の緩いメモ リ 整合性モデルが得られる。 したが って、<br />

複数のプ ロ セ ッ サが、 異な る メ モ リ ・ タ イ プを使用して、 edi によって指定された同じメ<br />

モ リ ・ ロ ケー シ ョ ンの読み込み / 書き込みを実行する可能性がある場合は、 SFENCE な<br />

ど の フ ェ ン ス操作を使用す る必要がある。<br />

x87-FP 命令がある場合は、 この命令は MMX 命令 と 同じ動作をする。 すなわち、 x87-FP<br />

から MMX テクノロジへのトランジションが発生する (TOS=0、 FP 有効ビ ッ ト はすべて<br />

有効に設定 )。<br />

MASKMOVQ 命令は、 CR4.OSFXSR の値を無視する。 こ の命令は新しいス ト リ ー ミ ング<br />

SIMD 拡張命令ス テ ー ト に影響を与えないため、 CR4.OSFXSR = 0 の場合で も 無効例外は<br />

生成 さ れない。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:1001


MOVNTPS—Move Aligned Four Packed Single-FP Non Temporal<br />

オペコード 命令 説明<br />

0F,2B, /r MOVNTPS m128, xmm キャッシュ階層の汚染を最小限に抑えて、4 つのパックド<br />

単精度浮動小数点データを表す 128 ビットを、XMM レジ<br />

スタから Mem に移動する。<br />

操作<br />

m128 = xmm;<br />

説明<br />

リ ニア ・ ア ド レ ス は、 参照 さ れる メ モ リ ・ デー タ の最下位バイ ト のア ド レ ス に対応す る。<br />

こ のス ト ア命令は、 キ ャ ッ シ ュ 汚染を最小限に抑え る。 つ ま り キ ャ ッ シ ュ 階層への書き<br />

込みを行わない。<br />

FP 例外<br />

セグメン ト を問わず、 16 バイ ト 境界にアラ イ メ ン ト が合 っ ていない場合は、 一般保護例<br />

外。<br />

数値例外<br />

なし。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#UD CRCR4.OSFXSR ( ビッ ト 9) = 0 の場合。<br />

#UD CPUID.XMM (EDX ビッ ト 25) = 0 の場合。<br />

3:1002 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


MOVNTPS—Move Aligned Four Packed Single-FP Non Temporal ( 続き )<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト、 デー<br />

タ・ダーティ・ビット ・フォルト。<br />

コメント<br />

MOVNTPS 命令は、 16 バイ ト にア ラ イ メ ン ト の合 っ た単精度浮動小数点値を処理す る場<br />

合に使用される。 MOVNTPS は、 キ ャ ッ シ ュ 階層の汚染を最小限に抑え る。 こ の命令を<br />

使用す る と 、 順序設定の緩い メ モ リ 整合性モデルが得られる。 したが っ て、 複数のプ ロ<br />

セッサが、異なるメモリ・タイプを使用して、同じメモリ・ロケーションの読み込み/<br />

書き込みを行う可能性がある場合は、 フ ェ ンス操作を使用する必要がある。 非テンポラ<br />

ルなス ト アについての詳細は、 3.6.1.9 項を参照のこ と。<br />

MOVNTPS でのリピート ・プリフィックス(F2H,F3H) の使用は予約済みであ る。 こ のプ<br />

リ フ ィ ッ ク スの処理は、 プ ロ セ ッ サに よ っ て変わる可能性がある。 MOVNTPS でこのプ<br />

リ フ ィ ッ ク スを使用する と、 将来のプロセ ッ サ と の互換性を損な う おそれがある。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:1003


MOVNTQ—Move 64 Bits Non Temporal<br />

オペコード 命令 説明<br />

0F,E7,/r MOVNTQ m64, mm キャッシュ階層の汚染を最小限に抑えて、整数オペランド<br />

(8b、16b、32b) を表す 64 ビットを、MM レジスタからメ<br />

モリに移動する。<br />

操作<br />

m64 = mm;<br />

説明<br />

リ ニア ・ ア ド レ ス は、 参照 さ れる メ モ リ ・ デー タ の最下位バイ ト のア ド レ ス に対応す る。<br />

こ のス ト ア命令は、 キ ャ ッ シ ュ 汚染を最小限に抑え る。<br />

数値例外<br />

なし。<br />

保護モード例外<br />

#GP(0) CS、 DS、 ES、 FS、 または GS セグメン ト 内のメモ リ ・ オ<br />

ペラン ドの実効アドレスが無効の場合。 #SS(0) SS セグメン ト 内のアド レスが無効の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 未処理の FPU 例外がある場合。<br />

#AC アライメントの合っていないメモリ参照を行った場合。<br />

#AC 例外を イ ネ ー ブルにす る には、 3 つの条件に該当しな<br />

ければならない(CR0.AMがセ ッ ト されている、EFLAGS.AC<br />

がセ ッ ト さ れてい る、 現在の CPL が 3 である )。<br />

実アドレス・モード例外<br />

割り込み 13 オペラン ド の一部が 0 ~ 0FFFFH の実効ア ド レス空間の範<br />

囲外の場合。<br />

#UD CR0.EM = 1 の場合。<br />

#NM CR0 の TS ビ ッ ト がセ ッ ト さ れた場合。<br />

#MF 保留中の FPU 例外がある場合。<br />

仮想 8086 モード例外<br />

実ア ド レ ス ・ モー ド と 同じ例外。<br />

#AC 現行特権レベルが 3 のときに、 アライメントの合っていな<br />

い メ モ リ 参照を行 っ た場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

3:1004 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


MOVNTQ—Move 64 Bits Non Temporal ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、<br />

NaT レ ジ ス タ参照フ ォ ル ト 。<br />

VHPT データ ・ フォル ト、 データ TLB フォルト、 代替<br />

データ TLB フォルト、 データ・ページ不在フォルト、<br />

データ NaT ページ参照アボー ト、 データ ・ キー ・ ミ ス ・<br />

フォルト、 データ・キー許可フォルト、 データ・アクセス<br />

権フォルト、 データ・アクセス・ビット ・フォルト、 デー<br />

タ・ダーティ・ビット ・フォルト。<br />

コメント<br />

MOVNTQ は、 キ ャ ッ シ ュ階層の汚染を最小限に抑え る。 こ の命令を使用す る と 、 順序<br />

設定の緩いメ モ リ 整合性モデルが得 ら れる。 したが っ て、 複数のプ ロ セ ッ サが、 異な る<br />

メモ リ ・ タ イプを使用して、 同じ メモ リ ・ ロ ケ ーシ ョ ンの読み込み / 書き込みを行う可<br />

能性があ る場合は、 フ ェ ン ス操作を使用す る必要があ る。 非テ ン ポ ラ ルなス ト アの詳細<br />

は、 3.6.1.9 項を参照のこ と。<br />

MOVNTQ 命令は、 CR4.OSFXSR の値を無視す る。 こ の命令は新しいス ト リ ー ミ ン グ<br />

SIMD 拡張命令ス テ ー ト に影響を与えないため、 CR4.OSFXSR = 0 の場合で も 無効例外は<br />

生成 さ れない。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:1005


PREFETCH—Prefetch<br />

オペコード 命令 説明<br />

0F,18,/1 PREFETCHT0 m8 t0 ヒントを使用して、アドレスで指定されたデータをプロ<br />

セッサの近くに移動する。<br />

0F,18,/2 PREFETCHT1 m8 t1 ヒントを使用して、アドレスで指定されたデータをプロ<br />

セッサの近くに移動する。<br />

0F,18,/3 PREFETCHT2 m8 t2 ヒントを使用して、アドレスで指定されたデータをプロ<br />

セッサの近くに移動する。<br />

0F,18,/0 PREFETCHNTA m8 nta ヒントを使用して、アドレスで指定されたデータをプ<br />

ロセッサの近くに移動する。<br />

操作<br />

fetch (m8);<br />

説明<br />

例外条件がない場合、 プ リ フ ェ ッ チ命令は、 ア ド レ ス ・ バイ ト を含む行を、 ロ ー カ リ<br />

テ ィ ・ ヒ ン ト に よ っ て指定 さ れたキ ャ ッ シ ュ 階層内の位置に フ ェ ッ チす る。 指定された<br />

行が、 すでにキャ ッシュ階層内のプロセッサによ り近いレベルにある場合は、 データは<br />

移動 さ れない。 ModR/M バイ ト のビッ ト 5:3 は、 次のよ う にローカ リ テ ィ ・ ヒン ト を指<br />

定する。<br />

• テンポラル ・ データ (t0) - すべてのキャ ッ シュ ・ レベルにデー タをプ リ フ ェ ッチす<br />

る。<br />

• 第 1 キャッシュ ・ レベル以上についてテンポラル(t1) - 第 0 キャッシュ ・ レベル以外<br />

のすべてのキャ ッ シュ ・ レベルにデータをプ リ フ ェ ッ チする。<br />

• 第 2 キャッシュ ・ レベル以上についてテンポラル(t2) - 第 0 および第1 キャッシュ ・<br />

レベル以外のすべてのキャ ッ シュ ・ レベルにデータをプ リ フ ェ ッチする。<br />

• すべてのキャ ッ シュ ・ レベルについて非テンポラル (nta) - 非テンポラルなキャ ッ<br />

シュ構造にデータをプリフェッチする。<br />

ローカ リ テ ィ ・ ヒン ト は、 プログラムの機能に影響を与えない。 ロ ーカ リ テ ィ ・ ヒン ト<br />

はプロセ ッ サに依存する機能であ り、 一部のプロセ ッ サでは、 無効に された り無視され<br />

た り す る可能性があ る。 プ リ フ ェ ッ チ命令は、 コ ー ド のブ レ ー ク ポ イ ン ト 以外の例外を<br />

発生 さ せない。 ま た、 こ の命令はプ ロ グ ラ ムの動作に影響を与えず、 無視される場合が<br />

ある。 プリ フェ ッチされるデータの量はプロセッサによ って異なるが、 最小でも 32 バイ<br />

トのデータがプリフェッチされる。 キャッシュ不可メモリ (UC メモリ ・ タイプまたは<br />

WC メモリ ・ タイプ ) に対す る プ リ フ ェ ッ チ命令は無視 さ れる。 上記の値以外の ModRM<br />

エン コ ー デ ィ ン グは予約済みであ る。 予約済みのエン コ ー デ ィ ン グを使用する と 、 将来<br />

のプロセッサとの互換性を損な うおそれがある。<br />

数値例外<br />

なし。<br />

保護モード例外<br />

なし。<br />

実アドレス・モード例外<br />

なし。<br />

3:1006 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


PREFETCH—Prefetch ( 続き )<br />

仮想 8086 モード例外<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

なし。<br />

コメント<br />

この命令は、 単なる ヒン ト である。 この命令は、 実行される と、 次に使用される こ と が<br />

予測 さ れる デ ー タ をプ ロ セ ッ サの近 く に移動す る。 アプ リ ケ ー シ ョ ン ・ コ ー ド 内のプ リ<br />

フ ェ ッ チ命令のパ フ ォ ー マン ス は、 プ ロ セ ッ サに よ っ て異な る。 最大限の処理速度を達<br />

成する には、 プ ロ セ ッ サご と に コ ー ド をチ ュ ー ニン グす る必要があ る。 ま た、 非テ ン ポ<br />

ラルなヒン ト は、 有益なキャ ッ シュ ・ データの汚染を最小限に抑えられる。<br />

PREFETCH 命令は、 CR4.OSFXSR の値を無視す る。 こ の命令は新しいス ト リ ー ミ ン グ<br />

SIMD 拡張命令ス テ ー ト に影響を与えないため、 CR4.OSFXSR = 0 の場合で も 無効例外は<br />

生成 さ れない。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:1007


SFENCE—Store Fence<br />

オペコード 命令 説明<br />

0F AE /7 SFENCE プログラム順序内でストア・フェンス命令より前にあるス<br />

トア命令が、フェンスより後にあるストア命令より前に、<br />

メモリへの更新を行うことを保証する。<br />

操作<br />

while (!(preceding_stores_globally_visible)) wait();<br />

説明<br />

緩やかに順序付け さ れたメ モ リ ・ ア ク セス は、 アウ ト オブオ ー ダ ー問題、 書き込み組み<br />

合わせ (write-combining)、 書き込み圧縮 (write-collapsing) などの手法によって、 パフォー<br />

マンスの向上を実現する。 こ のタ イプのメモ リ では、 デー タ を生成する側のプロセス と<br />

参照す る側のプ ロ セスの間で、 メ モ リ の順序付けの問題が発生する可能性があ る。 次の<br />

よ う な メ モ リ ・ ア ク セス を利用す る多 く の一般的なモデルが、 緩やかに順序付け さ れた<br />

メモリ ・ アクセスの影響を受ける。<br />

1. 緩やかに順序付け さ れたメ モ リ ・ ア ク セス を使用して結果を書き込むラ イ ブ ラ リ<br />

関数。<br />

2. 緩やかに順序付け されたメモ リ ・ アクセスの書き込みに よ り処理速度が向上する、<br />

コンパイラが生成したコード。<br />

3. 手作業で作成 さ れた コ ー ド 。<br />

こ れ ら の場合、 デー タ を消費する側のプ ロ セスが、 使用する デー タ の順序設定が緩い こ<br />

と を ど の程度認識している かは、 場合に よ っ て異な る。<br />

SFENCE は、 次の ModRM エンコ ーディ ングを使用する。<br />

Mod (7:6) = 11B<br />

Reg/Opcode (5:3) = 111B<br />

R/M (2:0) = 000B<br />

上記以外の ModRM エン コ ー デ ィ ン グはすべて予約済みであ る。 予約済みのエン コ ー<br />

デ ィ ングを使用する と、 将来のプロセ ッ サ と の互換性を損な う おそれがある。<br />

数値例外<br />

なし。<br />

保護モード例外<br />

なし。<br />

実アドレス・モード例外<br />

なし。<br />

仮想 8086 モード例外<br />

なし。<br />

3:1008 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


SFENCE—Store Fence ( 続き )<br />

追加の Itanium ベース・システム環境例外<br />

なし。<br />

コメント<br />

SFENCE 命令は、 CR4.OSFXSR の値を無視するため、 CR4.OSFXSR = 0 の場合で も 無効<br />

例外は生成 さ れない。<br />

第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス 3:1009


3:1010 第 3 巻 : IA-32 ストリーミング SIMD 拡張命令リファレンス


第 I 部 : インテル ® Itanium ® 命令セットの説明<br />

1 本書について . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:1<br />

1.1 「第 1 巻:アプリケーション・アーキテクチャ」の概要 . . . . . . . . . . . . . . . . . . . . . .3:1<br />

1.1.1 第 1 部:アプリケーション・アーキテクチャ・ガイド . . . . . . . . . . . . . . .3:1<br />

1.1.2 第 2 部:インテル ® Itanium ® アーキテクチャの最適化ガイド . . . . . . . . . .3:2<br />

1.2 「第 2 巻:システム・アーキテクチャ」の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:2<br />

1.2.1 第 1 部:システム・アーキテクチャ・ガイド . . . . . . . . . . . . . . . . . . . . . .3:2<br />

1.2.2 第 2 部:システム・プログラマーズ・ガイド . . . . . . . . . . . . . . . . . . . . . .3:3<br />

1.2.3 付録 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:4<br />

1.3 「第 3 巻:命令セット・リファレンス」の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:4<br />

1.3.1 第 1 部:インテル ® Itanium ® 命令セットの説明 . . . . . . . . . . . . . . . . . . . .3:4<br />

1.3.2 第 2 部:IA-32 命令セットの説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:4<br />

1.4 用語の定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:5<br />

1.5 関連文献 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:5<br />

1.6 改訂履歴 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:6<br />

2 命令リファレンス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:9<br />

2.1 命令リファレンス・ページに関する規則 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:9<br />

2.2 命令の説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:10<br />

3 擬似コード関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:251<br />

4 命令形式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:263<br />

4.1 形式の要約 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:264<br />

4.2 A ユニット命令エンコーディング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:271<br />

4.2.1 整数 ALU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:271<br />

4.2.2 整数比較 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:273<br />

4.2.3 マルチメディア . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:276<br />

4.3 I ユニット命令エンコーディング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:280<br />

4.3.1 マルチメディアおよび変数シフト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:280<br />

4.3.2 整数シフト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:285<br />

4.3.3 ビット・テスト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:287<br />

4.3.4 その他の I ユニット命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:288<br />

4.3.5 GR/BR 移動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:290<br />

4.3.6 GR/ プレディケート /IP 移動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:291<br />

4.3.7 GR/AR 移動 (I ユニット ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:291<br />

4.3.8 符号拡張 / ゼロ拡張 / ゼロ・インデックス計算 . . . . . . . . . . . . . . . . . . . .3:292<br />

4.4 M ユニット命令エンコーディング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:293<br />

4.4.1 ロードとストア . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:293<br />

4.4.2 ライン・プリフェッチ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:308<br />

4.4.3 セマフォ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:309<br />

4.4.4 FR 設定 / 取得 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:310<br />

4.4.5 スペキュレーションおよびアドバンスド・ロード・チェック . . . . . . . .3:311<br />

4.4.6 キャッシュ / 同期 /RSE/ALAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:312<br />

4.4.7 GR/AR 移動 (M ユニット ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:313<br />

4.4.8 GR/CR 移動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:314<br />

4.4.9 その他の M ユニット命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:315<br />

4.4.10 システム / メモリ管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:316<br />

4.4.11 Nop/Hint (M- ユニット ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:321<br />

4.5 B ユニット命令エンコーディング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:321<br />

4.5.1 分岐 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:321<br />

iii


4.5.2 分岐予測と nop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:325<br />

4.5.3 その他の B ユニット命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:327<br />

4.6 F ユニット命令エンコーディング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:328<br />

4.6.1 算術演算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:330<br />

4.6.2 並列浮動小数点 Select . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:331<br />

4.6.3 比較と分類 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:331<br />

4.6.4 近似 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:333<br />

4.6.5 最小値 / 最大値と並列比較 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:334<br />

4.6.6 マージと論理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:335<br />

4.6.7 変換 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:335<br />

4.6.8 ステータス・フィールド操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:336<br />

4.6.9 その他の F ユニット命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:337<br />

4.7 X ユニット命令エンコーディング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:337<br />

4.7.1 その他の X ユニット命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:337<br />

4.7.2<br />

4.7.3<br />

ロング型即値 64 移動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:339<br />

ロング型分岐 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:339<br />

4.7.4 Nop/Hint (X ユニット ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:340<br />

4.8 即値の生成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:341<br />

5 リソースと依存関係のセマンティックス. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:343<br />

5.1 リソースの読み込みおよび書き込み . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:343<br />

5.2 依存関係とシリアル化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:343<br />

5.3 リソースと依存関係の表の形式についての注意事項 . . . . . . . . . . . . . . . . . . . . . . . 3:344<br />

5.3.1 特別なケースの命令規則 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:346<br />

5.3.2 RAW の依存関係表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:346<br />

5.3.3 WAW の依存関係表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:354<br />

5.3.4 WAR の依存関係表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:358<br />

5.3.5 依存関係表で参照される規則のリスト . . . . . . . . . . . . . . . . . . . . . . . . . 3:359<br />

5.4 サポートに関する表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:361<br />

第 II 部 : IA-32 命令セットの説明<br />

1 IA-32 基本命令リファレンス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:371<br />

1.1 追加のインテル ® Itanium ® アーキテクチャ・フォルト . . . . . . . . . . . . . . . . . . . . . 3:371<br />

1.2 IA-32 命令リファレンス・ページの読み方 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:372<br />

1.2.1 IA-32 命令フォーマット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:372<br />

1.2.2 操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:375<br />

1.2.3 影響を受けるフラグ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:378<br />

1.2.4 影響を受ける FPU フラグ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:378<br />

1.2.5 保護モード例外 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:379<br />

1.2.6 実アドレス・モード例外 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:379<br />

1.2.7 仮想 8086 モード例外 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:380<br />

1.2.8 浮動小数点例外 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:380<br />

1.3 IA-32 基本命令リファレンス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:380<br />

2 IA-32 MMX ® テクノロジ命令リファレンス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:781<br />

3 IA-32 ストリーミング SIMD 拡張命令リファレンス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:847<br />

3.1 IA-32 ストリーミング SIMD 拡張命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:847<br />

3.2 インテル ® アーキテクチャのストリーミング SIMD 拡張命令について . . . . . . . . 3:847<br />

3.3 SIMD (Single Instruction, Multiple Data) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:848<br />

3.4 新しいデータ・タイプ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:848<br />

3.5 ストリーミング SIMD 拡張命令レジスタ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3:849<br />

iv


3.6 拡張された命令セット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:849<br />

3.6.1 命令グループの概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:850<br />

3.7 IEEE 規格への適合性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:857<br />

3.7.1 実数体系 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:858<br />

3.7.2 NaN の操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:862<br />

3.8 データ・フォーマット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:864<br />

3.8.1 メモリのデータ・フォーマット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:864<br />

3.8.2 ストリーミング SIMD 拡張命令レジスタのデータ・フォーマット . . . .3:864<br />

3.9 命令フォーマット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:865<br />

3.10 命令プリフィックス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:866<br />

3.11 予約済みの動作とソフトウェアの互換性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:867<br />

3.12 表記法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:867<br />

3.13 SIMD 整数拡張命令セット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:977<br />

3.14 キャッシュ制御命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3:999<br />

v


第 I 部 : インテル ® Itanium ® 命令セットの説明<br />

2-1 ポインタの加算 .......................................................................................................................3:12<br />

2-2 スタック・フレーム ................................................................................................................3:13<br />

2-3 br.ctop および br.cexit の操作..................................................................................................3:20<br />

2-4 br.wtop および br.wexit の操作................................................................................................3:21<br />

2-5 デポジットの例 .......................................................................................................................3:45<br />

2-6 デポジットの例 (zero_form)....................................................................................................3:45<br />

2-7 抽出の例 ..................................................................................................................................3:48<br />

2-8 浮動小数点マージでの符号否定操作.......................................................................................3:72<br />

2-9 浮動小数点マージでの符号操作 ..............................................................................................3:72<br />

2-10 浮動小数点マージでの符号および指数操作 ............................................................................3:72<br />

2-11 浮動小数点左ミックス ............................................................................................................3:75<br />

2-12 浮動小数点右ミックス ............................................................................................................3:75<br />

2-13 浮動小数点左右ミックス.........................................................................................................3:75<br />

2-14 浮動小数点パック....................................................................................................................3:86<br />

2-15 浮動小数点並列マージでの符号否定操作................................................................................3:99<br />

2-16 浮動小数点並列マージでの符号操作.......................................................................................3:99<br />

2-17 浮動小数点並列マージでの符号および指数操作.....................................................................3:99<br />

2-18 浮動小数点スワップ ..............................................................................................................3:121<br />

2-19 浮動小数点スワップの左否定................................................................................................3:121<br />

2-20 浮動小数点スワップの右否定................................................................................................3:121<br />

2-21 浮動小数点左符号拡張 ..........................................................................................................3:123<br />

2-22 浮動小数点右符号拡張 ..........................................................................................................3:123<br />

2-23 getf.exp の機能......................................................................................................................3:126<br />

2-24 getf.sig の機能 .......................................................................................................................3:126<br />

2-25 ミックスの例.........................................................................................................................3:152<br />

2-26 Mux1 の操作 (8 ビット要素 ).................................................................................................3:170<br />

2-27 Mux2 の例 (16 ビット要素 ) ..................................................................................................3:171<br />

2-28 パックの操作.........................................................................................................................3:175<br />

2-29 並列加算の例.........................................................................................................................3:177<br />

2-30 並列平均の例.........................................................................................................................3:180<br />

2-31 並列平均でのゼロから離れる方向の丸めの例 ......................................................................3:181<br />

2-32 並列平均減算の例..................................................................................................................3:183<br />

2-33 並列比較の例.........................................................................................................................3:185<br />

2-34 並列最大値の例 .....................................................................................................................3:187<br />

2-35 並列最小値の例 .....................................................................................................................3:188<br />

2-36 並列乗算の操作 .....................................................................................................................3:189<br />

2-37 並列乗算右シフトの操作.......................................................................................................3:190<br />

2-38 並列絶対差累計の例 ..............................................................................................................3:195<br />

2-39 並列左シフトの例..................................................................................................................3:196<br />

2-40 並列減算の例.........................................................................................................................3:201<br />

2-41 setf.exp の機能 ......................................................................................................................3:216<br />

2-42 setf.sig の機能 .......................................................................................................................3:216<br />

2-43 ポインタの左シフトおよび加算 ............................................................................................3:220<br />

2-44 ペア右シフト.........................................................................................................................3:222<br />

2-45 アンパックの操作..................................................................................................................3:242<br />

4-1 バンドルの形式 .....................................................................................................................3:263<br />

第 II 部 : IA-32 命令セットの説明<br />

1-1 BIT[EAX,21] のビット・オフセット......................................................................................3:378<br />

1-2 メモリ・ビットのインデックス操作.....................................................................................3:378<br />

vii


1-3 EAX レジスタのバージョン情報 ...........................................................................................3:440<br />

2-1 MOVD 命令の動作.................................................................................................................3:783<br />

2-2 MOVQ 命令の動作 ................................................................................................................3:786<br />

2-3 PACKSSDW 命令の動作.......................................................................................................3:788<br />

2-4 PACKUSWB 命令の動作.......................................................................................................3:791<br />

2-5 PADDW 命令の動作 ..............................................................................................................3:793<br />

2-6 PADDSW 命令の動作............................................................................................................3:796<br />

2-7 PADDUSB 命令の動作 ..........................................................................................................3:799<br />

2-8 PAND 命令の動作 .................................................................................................................3:802<br />

2-9 PANDN 命令の動作...............................................................................................................3:804<br />

2-10 PCMPEQW 命令の動作 ........................................................................................................3:806<br />

2-11 PCMPGTW 命令の動作.........................................................................................................3:809<br />

2-12 PMADDWD 命令の動作 ........................................................................................................3:812<br />

2-13 PMULHW 命令の動作 ...........................................................................................................3:814<br />

2-14 PMULLW 命令の動作 ............................................................................................................3:816<br />

2-15 POR 命令の動作....................................................................................................................3:818<br />

2-16 PSLLW 命令の動作 ...............................................................................................................3:820<br />

2-17 PSRAW 命令の動作 ..............................................................................................................3:823<br />

2-18 PSRLW 命令の動作...............................................................................................................3:826<br />

2-19 PSUBW 命令の動作 ..............................................................................................................3:829<br />

2-20 PSUBSW 命令の動作............................................................................................................3:832<br />

2-21 PSUBUSB 命令の動作 ..........................................................................................................3:835<br />

2-22 PUNPCKHBW 命令での上位バイトのアンパックとインタリーブ.......................................3:838<br />

2-23 PUNPCKLBW 命令での下位バイトのアンパックとインタリーブ .......................................3:841<br />

2-24 PXOR 命令の動作 .................................................................................................................3:844<br />

3-1 パックド単精度浮動小数点データ・タイプ..........................................................................3:848<br />

3-2 ストリーミング SIMD 拡張命令レジスタ・セット ...............................................................3:849<br />

3-3 パックド操作.........................................................................................................................3:850<br />

3-4 スカラ操作 ............................................................................................................................3:850<br />

3-5 パック・データのシャッフル操作 ........................................................................................3:852<br />

3-6 アンパック・ハイ操作 ..........................................................................................................3:852<br />

3-7 アンパック・ロー操作 ..........................................................................................................3:853<br />

3-8 2 進実数体系 .........................................................................................................................3:858<br />

3-9 2 進浮動小数点フォーマット ................................................................................................3:859<br />

3-10 実数と NaNs..........................................................................................................................3:861<br />

3-11 メモリ内の 4 つのパックド浮動小数点データ ( アドレス 1000H) ........................................3:864<br />

viii


第 I 部 : インテル ® Itanium ® 命令セットの説明<br />

2-1 命令リファレンス・ページの説明 ............................................................................................3:9<br />

2-2 命令リファレンス・ページの字体に関する規則.......................................................................3:9<br />

2-3 レジスタ・ファイルの表記法..................................................................................................3:10<br />

2-4 C シンタックスの相違点.........................................................................................................3:10<br />

2-5 命令記述コードに含まれていない一般の条件 ........................................................................3:10<br />

2-6 分岐のタイプ...........................................................................................................................3:17<br />

2-7 分岐有無予測ヒント ................................................................................................................3:21<br />

2-8 シーケンシャル・プリフェッチ・ヒント................................................................................3:22<br />

2-9 分岐キャッシュ割り当て解除ヒント.......................................................................................3:22<br />

2-10 ロング型分岐のタイプ ............................................................................................................3:26<br />

2-11 IP 相対分岐有無予測ヒント.....................................................................................................3:28<br />

2-12 間接分岐有無予測ヒント.........................................................................................................3:28<br />

2-13 重要度ヒント...........................................................................................................................3:28<br />

2-14 ALAT クリアのためのコンプリータ........................................................................................3:31<br />

2-15 比較タイプ ..............................................................................................................................3:34<br />

2-16 通常および unc の比較での 64 ビット比較関係......................................................................3:35<br />

2-17 並列比較での 64 ビット比較関係............................................................................................3:35<br />

2-18 32 ビット比較での即値範囲....................................................................................................3:37<br />

2-19 比較交換のメモリ・サイズ .....................................................................................................3:40<br />

2-20 比較交換セマフォのタイプ .....................................................................................................3:40<br />

2-21 czx の結果の範囲.....................................................................................................................3:43<br />

2-22 pc ニーモニックの指定値........................................................................................................3:50<br />

2-23 sf ニーモニックの値................................................................................................................3:50<br />

2-24 浮動小数点クラスの関係.........................................................................................................3:57<br />

2-25 浮動小数点のクラス ................................................................................................................3:57<br />

2-26 浮動小数点の比較タイプ.........................................................................................................3:60<br />

2-27 浮動小数点の比較関係 ............................................................................................................3:60<br />

2-28 フェッチおよび加算セマフォのタイプ ...................................................................................3:67<br />

2-29 浮動小数点並列比較の結果 .....................................................................................................3:91<br />

2-30 浮動小数点並列比較関係.........................................................................................................3:91<br />

2-31 ヒントの即値.........................................................................................................................3:128<br />

2-32 sz コンプリータ ....................................................................................................................3:134<br />

2-33 ロード・タイプ .....................................................................................................................3:134<br />

2-34 ロードのヒント .....................................................................................................................3:136<br />

2-35 fsz コンプリータ ...................................................................................................................3:139<br />

2-36 FP ロードのタイプ................................................................................................................3:139<br />

2-37 lftype のニーモニック値 ........................................................................................................3:146<br />

2-38 lfhint のニーモニック値 .........................................................................................................3:147<br />

2-39 BR への移動の分岐有無予測ヒント ......................................................................................3:156<br />

2-40 間接レジスタ・ファイルのニーモニック..............................................................................3:162<br />

2-41 8 ビット要素に対する Mux による置換.................................................................................3:170<br />

2-42 パックでの飽和の上下限値 ...................................................................................................3:175<br />

2-43 並列加算の飽和コンプリータ................................................................................................3:177<br />

2-44 並列加算における飽和の制限................................................................................................3:177<br />

2-45 並列の比較関係 .....................................................................................................................3:185<br />

2-46 pmpyshr のシフト・オプション............................................................................................3:190<br />

2-47 並列減算の飽和コンプリータ................................................................................................3:201<br />

2-48 並列減算での飽和の上下限値................................................................................................3:201<br />

2-49 ストアのタイプ .....................................................................................................................3:225<br />

2-50 ストアのヒント .....................................................................................................................3:226<br />

ix


2-51 xsz ニーモニック値............................................................................................................... 3:231<br />

2-52 通常および unc タイプのビット判定での関係...................................................................... 3:234<br />

2-53 並列タイプのビット判定での関係 ........................................................................................ 3:234<br />

2-54 通常および unc タイプの Nat 判定での関係 ......................................................................... 3:237<br />

2-55 並列タイプの NaT 判定での関係 .......................................................................................... 3:237<br />

2-56 メモリ交換のサイズ.............................................................................................................. 3:243<br />

3-1 擬似コード関数 ..................................................................................................................... 3:251<br />

4-1 命令タイプと実行ユニット・タイプの関係..........................................................................3:263<br />

4-2 テンプレート・フィールドのエンコーディングと命令スロットのマッピング.................... 3:264<br />

4-3 メジャー・オペコードの割り当て ........................................................................................ 3:265<br />

4-4 命令形式の要約 ..................................................................................................................... 3:266<br />

4-5 命令フィールドのカラー・キー............................................................................................ 3:268<br />

4-6 命令フィールド名 .................................................................................................................3:268<br />

4-7 特殊な命令表記 ..................................................................................................................... 3:269<br />

4-8 整数 ALU の 2 ビット +1 ビット・オペコード拡張............................................................... 3:271<br />

4-9 整数 ALU の 4 ビット +2 ビット・オペコード拡張............................................................... 3:271<br />

4-10 整数比較オペコード拡張....................................................................................................... 3:273<br />

4-11 整数比較即値オペコード拡張 ............................................................................................... 3:274<br />

4-12 マルチメディア ALU の 2 ビット +1 ビット・オペコード拡張............................................. 3:276<br />

4-13 マルチメディア ALU サイズ 1 の 4 ビット +2 ビット・オペコード拡張 .............................. 3:277<br />

4-14 マルチメディア ALU サイズ 2 の 4 ビット +2 ビット・オペコード拡張 .............................. 3:277<br />

4-15 マルチメディア ALU サイズ 4 の 4 ビット +2 ビット・オペコード拡張 .............................. 3:278<br />

4-16 マルチメディアおよび変数シフトの 1 ビット・オペコード拡張 ......................................... 3:280<br />

4-17 マルチメディア・オペコード 7 のサイズ 1 の 2 ビット・オペコード拡張 .......................... 3:280<br />

4-18 マルチメディア・オペコード 7 のサイズ 2 の 2 ビット・オペコード拡張 .......................... 3:281<br />

4-19 マルチメディア・オペコード 7 のサイズ 4 の 2 ビット・オペコード拡張 .......................... 3:281<br />

4-20 変数シフト・オペコード 7 の 2 ビット・オペコード拡張.................................................... 3:282<br />

4-21 整数シフト / ビット・テスト /NaT テストの 2 ビット・オペコード拡張.............................3:285<br />

4-22 デポジットのオペコード拡張 ............................................................................................... 3:285<br />

4-23 ビット・テストのオペコード拡張 ........................................................................................ 3:287<br />

4-24 その他の I ユニットの 3 ビット・オペコード拡張................................................................ 3:288<br />

4-25 その他の I ユニットの 6 ビット・オペコード拡張................................................................ 3:289<br />

4-26 各種の I ユニット 1 ビット・オペコード拡張....................................................................... 3:289<br />

4-27 BR への移動命令の分岐有無予測ヒント・コンプリータ...................................................... 3:290<br />

4-28 整数ロード / ストア / セマフォ /FR 取得の 1 ビット・オペコード拡張................................ 3:293<br />

4-29 浮動小数点ロード / ストア / ペア・ロード /FR 設定の 1 ビット・オペコード拡張.............. 3:293<br />

4-30 整数ロード / ストアのオペコード拡張.................................................................................. 3:294<br />

4-31 整数ロード +Reg のオペコード拡張 ..................................................................................... 3:294<br />

4-32 整数ロード / ストア +Imm のオペコード拡張 ....................................................................... 3:295<br />

4-33 セマフォ /FR 取得のオペコード拡張 .................................................................................... 3:296<br />

4-34 浮動小数点ロード / ストア /Lfetch のオペコード拡張 .......................................................... 3:297<br />

4-35 浮動小数点ロード /Lfetch+Reg のオペコード拡張 ............................................................... 3:297<br />

4-36 浮動小数点ロード / ストア /Lfetch+Imm のオペコード拡張 ................................................. 3:298<br />

4-37 浮動小数点ペア・ロード /SR 設定のオペコード拡張........................................................... 3:298<br />

4-38 浮動小数点ペア・ロード +Imm のオペコード拡張 ............................................................... 3:299<br />

4-39 ロード・ヒント・コンプリータ............................................................................................ 3:299<br />

4-40 ストア・ヒント・コンプリータ............................................................................................ 3:299<br />

4-41 ライン・プリフェッチ・ヒント・コンプリータ................................................................... 3:308<br />

4-42 オペコード 0 のシステム / メモリ管理の 3 ビット・オペコード拡張................................... 3:316<br />

4-43 オペコード 0 のシステム / メモリ管理の 4 ビット +2 ビット・オペコード拡張 .................. 3:316<br />

4-44 オペコード 1 のシステム / メモリ管理の 3 ビット・オペコード拡張................................... 3:317<br />

x


4-45 オペコード 1 のシステム / メモリ管理の 6 ビット・オペコード拡張...................................3:317<br />

4-46 各種の M ユニット 1 ビット・オペコード拡張 .....................................................................3:321<br />

4-47 IP 相対分岐タイプ.................................................................................................................3:321<br />

4-48 間接 / その他の分岐のオペコード拡張 ..................................................................................3:322<br />

4-49 間接分岐タイプ .....................................................................................................................3:322<br />

4-50 間接リターン分岐タイプ.......................................................................................................3:323<br />

4-51 シーケンシャル・プリフェッチ・ヒント・コンプリータ ....................................................3:323<br />

4-52 分岐有無ヒント・コンプリータ ............................................................................................3:323<br />

4-53 間接コール有無ヒント・コンプリータ .................................................................................3:324<br />

4-54 分岐キャッシュ割り当て解除ヒント・コンプリータ............................................................3:324<br />

4-55 間接予測 /nop のオペコード拡張 ..........................................................................................3:326<br />

4-56 分岐重要度ヒント・コンプリータ ........................................................................................3:326<br />

4-57 IP 相対分岐有無予測ヒント・コンプリータ .........................................................................3:326<br />

4-58 間接分岐有無予測ヒント・コンプリータ..............................................................................3:327<br />

4-59 その他の浮動小数点の 1 ビット・オペコード拡張 ...............................................................3:328<br />

4-60 オペコード 0 のその他の浮動小数点の 6 ビット・オペコード拡張......................................3:329<br />

4-61 オペコード 1 のその他の浮動小数点の 6 ビット・オペコード拡張......................................3:329<br />

4-62 逆数近似の 1 ビット・オペコード拡張 .................................................................................3:330<br />

4-63 浮動小数点ステータス・フィールド・コンプリータ............................................................3:330<br />

4-64 浮動小数点算術の 1 ビット・オペコード拡張 ......................................................................3:330<br />

4-65 固定小数点の積和および選択のオペコード拡張...................................................................3:330<br />

4-66 浮動小数点比較のオペコード拡張 ........................................................................................3:332<br />

4-67 浮動小数点分類の 1 ビット・オペコード拡張 ......................................................................3:332<br />

4-68 各種の M ユニット 1 ビット・オペコード拡張 .....................................................................3:337<br />

4-69 その他の X ユニットの 3 ビット・オペコード拡張 ..............................................................3:338<br />

4-70 その他の X ユニットの 6 ビット・オペコード拡張 ..............................................................3:338<br />

4-71 ロング型移動の 1 ビット・オペコード拡張..........................................................................3:339<br />

4-72 ロング型分岐タイプ ..............................................................................................................3:339<br />

4-73 各種の M ユニット 1 ビット・オペコード拡張 .....................................................................3:340<br />

4-74 即値の生成 ............................................................................................................................3:341<br />

5-1 依存関係のセマンティックスのコード .................................................................................3:345<br />

5-2 リソース別に編成した RAW の依存関係 ..............................................................................3:347<br />

5-3 リソース別に編成した WAW の依存関係 .............................................................................3:354<br />

5-4 リソース別に編成した WAR の依存関係 ..............................................................................3:358<br />

5-5 命令クラス ............................................................................................................................3:361<br />

第 II 部 : IA-32 命令セットの説明<br />

1-1 +rb、+rw、+rd に対応するレジスタのコード化 ...................................................................3:373<br />

1-2 例外のニーモニック、名称、およびベクタ番号...................................................................3:379<br />

1-3 浮動小数点例外のニーモニックおよび名称 ..........................................................................3:380<br />

1-4 CPUID 命令から返される情報 ..............................................................................................3:440<br />

1-5 EDX レジスタに返される機能フラグ....................................................................................3:441<br />

1-6 FPATAN の 0 と NaN ............................................................................................................3:514<br />

1-7 FPREM の 0 と NaN..............................................................................................................3:516<br />

1-8 FPREM1 の 0 と NaN............................................................................................................3:519<br />

1-9 FSUB の 0 と NaN.................................................................................................................3:548<br />

1-10 FSUBR の 0 と NaN ..............................................................................................................3:551<br />

1-11 FYL2X の 0 と NaN ...............................................................................................................3:565<br />

1-12 FYL2XP1 の 0 と NaN ...........................................................................................................3:567<br />

1-13 IDIV オペランド ....................................................................................................................3:570<br />

1-14 INT クラス.............................................................................................................................3:586<br />

xi


1-15 LAR ディスクリプタの有効性............................................................................................... 3:623<br />

1-16 LEA のアドレスとオペランド・サイズ.................................................................................3:628<br />

1-17 リピート条件......................................................................................................................... 3:714<br />

3-1 実数表記法 ............................................................................................................................ 3:859<br />

3-2 非正規化処理......................................................................................................................... 3:861<br />

3-3 NaN オペランドの演算の結果............................................................................................... 3:863<br />

3-4 ストリーミング SIMD 拡張命令データ・タイプの精度と範囲 ............................................. 3:864<br />

3-5 実数と NaN のエンコーディング ......................................................................................... 3:865<br />

3-6 プリフィックスを持つストリーミング SIMD 拡張命令の動作 ............................................. 3:866<br />

3-7 プリフィックスを持つ SIMD 整数命令の動作 ...................................................................... 3:866<br />

3-8 プリフィックスを持つキャッシュ制御命令の動作 ............................................................... 3:867<br />

3-9 ストリーミング SIMD 拡張命令の命名規則..........................................................................3:868<br />

xii

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!