24531904_j
24531904_j 24531904_j
FPREM—Partial Remainder オペコード 命令 説明 D9 F8 FPREM ST(0) を ST(1) で割って得られる剰余で ST(0) を置き換える。 説明 ST(0) レジスタの値( 被除数 ) を ST(1) レジスタの値( 除数 ま たは法 ) で割っ て得られる 剰余を計算し、 結果を ST(0) にス トアする。 剰余の値は以下の式で表される。 剰余 = ST(0) - (N * ST(1)) ここで、 N は [ST(0)/ST(1)] の実数の商をゼロに向けて切り捨てて得られる整数値である。 剰余の符号は被除数の符号 と 同じ である。 部分剰余が 1 回も計算されていなくても、 剰 余の絶対値は法の絶対値よ り小さい ( 下で説明 )。 こ の命令は正確な結果を生じ る。 精度 ( 不正確 ) 例外は発生せず、 丸め制御は効果を も たない。 以下の表に、 アンダフ ロ ーが発生しない も の と して、 さ ま ざ ま な ク ラ スの数の 剰余を計算した と き に得 ら れる結果を示す。 表 1-7. FPREM の 0 と NaN ST(1) −∞ −F −0 +0 +F +∞ NaN −∞ * * * * * * NaN ST(0) −F ST(0) −F or −0 ** ** −F or −0 ST(0) NaN −0 −0 −0 * * −0 −0 NaN +0 +0 +0 * * +0 +0 NaN +F ST(0) +F or +0 ** ** +F or +0 ST(0) NaN +∞ * * * * * * NaN NaN NaN NaN NaN NaN NaN NaN NaN 注 : F 有限実数を示す。 * 浮動小数点無効算術オペランド (#IA) 例外を示す。 ** 浮動小数点 0 による除算 (#Z) 例外を示す。 結果が 0 のときは、 その符号は被除数の符号と同じである。 法が∞のときは、 結果は ST(0) の値に等し く なる。 FPREM 命令は、 IEEE 規格 754 で定義 さ れた剰余を計算しない。 IEEE で定義された剰余 は、 FPREM1 命令で計算で き る。 FPREM 命令は、 イ ン テル 8087 およびインテル287 数 値演算コ プロセ ッ サ と の互換性のために用意されている。 FPREM 命令の 「部分剰余」 (partial remainder) の名前は、 その剰余の計算方法に由来して いる。 こ の命令は減算を反復して最終的に剰余を得る。 すなわち、 こ の命令の 1 回の実 行では ST(0) の指数を 63 までしか縮小できない。 法より小さい剰余を生じるこ とができ た場合に、 この演算は完了し、 FPU ステータス ・ ワー ド内の C2 フラグがクリアされる。 法よ り小さい剰余に達するまでは、 C2 はセッ ト されており、 ST(0) 内の結果は部分剰余 と 呼ばれる。 部分剰余の指数は元の被除数の指数 よ り も 最低 32 は小さ く なっている。 ソ フトウェアは、 C2 がク リアされるまで、 (ST(0) 内の部分剰余を被除数 と して使用して ) この命令を繰り返し実行できる。 注 : そのよ うな剰余計算ループを実行している間に、 FPU を必要とする、 優先順位が高 い割 り 込みル ー チンが剰余計算ル ー プ内の命令間で コ ン テ キス ト ・ ス イ ッ チを強制 するこ とが考えられるので注意する。 3:516 第 3 巻 : IA-32 基本命令リファレンス
FPREM—Partial Remainder ( 続き ) FPREM 命令の重要な用途は、 周期関数の引数を縮小す る こ と である。 縮小が完了す る と、 この命令は商の最下位3 ビッ トをFPU ステータス ・ ワー ドの C3、 C1、 C0 フラグに ス ト アす る。 こ の情報は、 単位円の正しい 8 等分 ( π /4) 扇形内の元の角度を示して く れ るので、 ( 法として π/4 を使用した ) 正接関数の引数の縮小に重要であ る。 操作 D ← exponent(ST(0)) - exponent(ST(1)); IF D < 64 THEN Q ← Integer(TruncateTowardZero(ST(0) / ST(1))); ST(0) ← ST(0) - (ST(1) ∗ Q); C2 ← 0; C0, C3, C1 ← LeastSignificantBits(Q); (* Q2, Q1, Q0 *) ELSE C2 ← 1; N ← an implementation-dependent number between 32 and 63; QQ ← Integer(TruncateTowardZero((ST(0) / ST(1)) / 2 (D − N) )); ST(0) ← ST(0) - (ST(1) ∗ QQ ∗ 2 (D − N) ); FI; FPU 影響を受けるフラグ C0 商のビ ッ ト 2 (Q2) にセッ ト される。 C1 ス タ ッ ク ・ アンダ フ ロ ーが発生した場合は 0 にセッ ト さ れ、 発生しなか っ た場合は商の最下位ビ ッ ト (Q0) にセッ トされる。 C2 縮小が完了した場合は 0 にセッ ト され、 完了していない場 合は 1 にセッ ト される。 C3 商のビ ッ ト 1 (Q1) にセッ ト される。 追加の Itanium ベース・システム環境例外 Itanium アーキテクチャ ・ レジスタ ・ フォルト 浮動小数点レ ジ ス タ無効フ ォ ル ト (PSR.dfl が 1 の場合 )、 NaT レ ジ ス タ参照アボ ー ト 。 浮動小数点例外 #IS ス タ ッ ク ・ アンダ フ ロ ーが発生した場合。 #IA ソース・オペランドがSNaN 値であるか、 法が 0 である か、 被除数が∞であるか、 またはそれらのいずれかの フォーマットがサポートされていない場合。 #D ソ ー ス ・ オペラ ン ド がデ ノ ー マル値である場合。 #U 結果が小さすぎて、 デスティネーション・フォーマットで 表現で き ない場合。 保護モード例外 #NM CR0 の EM または TS がセッ ト された場合。 第 3 巻 : IA-32 基本命令リファレンス 3:517
- Seite 478 und 479: FBSTP—Store BCD Integer and Pop
- Seite 480 und 481: FBSTP—Store BCD Integer and Pop (
- Seite 482 und 483: FCLEX/FNCLEX—Clear Exceptions オ
- Seite 484 und 485: FCMOVcc—Floating-Point Conditiona
- Seite 486 und 487: FCOM/FCOMP/FCOMPP—Compare Real (
- Seite 488 und 489: FCOMI/FCOMIP/FUCOMI/FUCOMIP—Compa
- Seite 490 und 491: FCOMI/FCOMIP/ FUCOMI/FUCOMIP—Comp
- Seite 492 und 493: FCOS—Cosine ( 続き ) 追加の
- Seite 494 und 495: FDIV/FDIVP/FIDIV—Divide オペコ
- Seite 496 und 497: FDIV/FDIVP/FIDIV—Divide ( 続き
- Seite 498 und 499: FDIVR/FDIVRP/FIDIVR—Reverse Divid
- Seite 500 und 501: FDIVR/FDIVRP/FIDIVR—Reverse Divid
- Seite 502 und 503: FFREE—Free Floating-Point Registe
- Seite 504 und 505: FICOM/FICOMP—Compare Integer (
- Seite 506 und 507: FILD—Load Integer オペコード
- Seite 508 und 509: FINCSTP—Increment Stack-Top Point
- Seite 510 und 511: FIST/FISTP—Store Integer オペ
- Seite 512 und 513: FIST/FISTP—Store Integer ( 続き
- Seite 514 und 515: FLD—Load Real ( 続き ) 浮動
- Seite 516 und 517: FLD1/FLDL2T/FLDL2E/FLDPI/FLDLG2/FLD
- Seite 518 und 519: FLDCW—Load Control Word ( 続き
- Seite 520 und 521: FLDENV—Load FPU Environment ( 続
- Seite 522 und 523: FMUL/FMULP/FIMUL—Multiply ( 続
- Seite 524 und 525: FMUL/FMULP/FIMUL—Multiply ( 続
- Seite 526 und 527: FPATAN—Partial Arctangent オペ
- Seite 530 und 531: FPREM—Partial Remainder ( 続き
- Seite 532 und 533: FPREM1—Partial Remainder ( 続き
- Seite 534 und 535: FPTAN—Partial Tangent オペコ
- Seite 536 und 537: FRNDINT—Round to Integer オペ
- Seite 538 und 539: FRSTOR—Restore FPU State ( 続き
- Seite 540 und 541: FSAVE/FNSAVE—Store FPU State (
- Seite 542 und 543: FSCALE—Scale オペコード 命
- Seite 544 und 545: FSIN—Sine オペコード 命令
- Seite 546 und 547: FSINCOS—Sine and Cosine オペコ
- Seite 548 und 549: FSQRT—Square Root オペコード
- Seite 550 und 551: FST/FSTP—Store Real オペコー
- Seite 552 und 553: FST/FSTP—Store Real ( 続き ) #A
- Seite 554 und 555: FSTCW/FNSTCW—Store Control Word (
- Seite 556 und 557: FSTENV/FNSTENV—Store FPU Environm
- Seite 558 und 559: FSTSW/FNSTSW—Store Status Word (
- Seite 560 und 561: FSUB/FSUBP/FISUB—Subtract ( 続
- Seite 562 und 563: FSUBR/FSUBRP/FISUBR—Reverse Subtr
- Seite 564 und 565: FSUBR/FSUBRP/FISUBR—Reverse Subtr
- Seite 566 und 567: FTST—TEST オペコード 命令
- Seite 568 und 569: FUCOM/FUCOMP/FUCOMPP—Unordered Co
- Seite 570 und 571: FWAIT—Wait 本章の 「WAIT」
- Seite 572 und 573: FXAM—Examine ( 続き ) 実アド
- Seite 574 und 575: FXCH—Exchange Register Contents (
- Seite 576 und 577: FXTRACT—Extract Exponent and Sign
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 基本命令リファレンス