24531904_j
24531904_j 24531904_j
ldhint コ ンプ リ ー タの値で、 メモ リ ・ ア クセスの局所性を指定する。 ldhint コンプリータ の値を表 2-34 に示す。 ベー ス更新形式には、 暗黙的にプ リ フ ェ ッ チ ・ ヒ ン ト の意味があ る。 ベー ス更新後の GR r 3 の値で指定されるアド レスには、 指定されたキャ ッシュ ・ ラ インをプリフェッチするよう指示するヒントの働きがある。 このプリフェッチは、 ldhint で指定される局所性ヒ ン ト を使用する。 プ リ フ ェ ッ チ と 局所性の ヒ ン ト はプ ロ グ ラ ムの 機能には影響せず、 イ ン プ リ メ ン テ ー シ ョ ンで も 無視で き る。 詳細は、 第 1 巻、 第 1 部 の 4.4.6 項 「メ モ リ 階層の制御 と 整合性」 を参照のこ と。 表 2-34. ロードのヒント ldhint コンプリータ 意味 none 時間的局所性、レベル 1 nt1 時間的局所性なし、レベル 1 nta 時間的局所性なし、全レベル no_base_update 形式では GR r3 の値は変更されず、 この形式にはプ リ フ ェ ッ チ ・ ヒ ン ト の 暗黙的意味 も ない。 ベー ス更新形式の場合は、 r1 と r3 に同じ レ ジ ス タ ・ ア ド レ ス を指定する と 、 無効操作 (Illegal Operation) フォルトが発生する。 ライ トバック ・ ポリシーを持つキャッシュ可能ページでも NaTPage でもないページを参 照する ld16 命令がハ ー ド ウ ェ ア上でサポ ー ト さ れる か ど う かは、 プ ロ セ ッ サに よ っ て異 なる。 このよ うな ld16 アクセスをサポー ト しないプロセッサ ・モデル上で、 サポー ト さ れていない参照を行お う と する と、 サポ ー ト されないデー タ参照フ ォ ル ト が発生する。 操作 : if (PR[qp]) { size = fill_form ? 8 : (sixteen_byte_form ? 16 : sz); speculative = (ldtype == ‘s’ || ldtype == ‘sa’); advanced = (ldtype == ‘a’ || ldtype == ‘sa’); check_clear = (ldtype == ‘c.clr’ || ldtype == ‘c.clr.acq’); check_no_clear = (ldtype == ‘c.nc’); check = check_clear || check_no_clear; acquire = (acquire_form || ldtype == ‘acq’ || ldtype == ‘c.clr.acq’); otype = acquire ? ACQUIRE : UNORDERED; bias = (ldtype == ‘bias’) ? BIAS : 0 ; itype = READ; if (speculative) itype |= SPEC ; if (advanced) itype |= ADVANCE ; if (size == 16) itype |= UNCACHE_OPT ; if ((reg_base_update_form || imm_base_update_form) && (r 1 == r 3 )) illegal_operation_fault(); check_target_register(r 1 ); if (reg_base_update_form || imm_base_update_form) check_target_register(r 3 ); if (reg_base_update_form) { tmp_r2 = GR[r 2 ]; tmp_r2nat = GR[r 2 ].nat; } if (!speculative && GR[r 3 ].nat) // fault on NaT address register_nat_consumption_fault(itype); defer = speculative && (GR[r 3 ].nat || PSR.ed);// defer exception if spec 3:136 第 3 巻 : 命令リファレンス ld
ld if (check && alat_cmp(GENERAL, r 1 )) { // no load on ld.c & ALAT hit if (check_clear) // remove entry on ld.c.clr or ld.c.clr.acq alat_inval_single_entry(GENERAL, r 1 ); } else { if (!defer) { paddr = tlb_translate(GR[r 3 ], size, itype, PSR.cpl, &mattr, &defer); spontaneous_deferral(paddr, size, UM.be, mattr, otype, bias | ldhint, &defer); if (!defer) { if (size == 16) { mem_read_pair(&val, &val_ar, paddr, size, UM.be, mattr, otype, ldhint); } else { val = mem_read(paddr, size, UM.be, mattr, otype, bias | ldhint); } } } if (check_clear || advanced) // remove any old ALAT entry alat_inval_single_entry(GENERAL, r 1 ); if (defer) { if (speculative) { GR[r 1 ] = natd_gr_read(paddr, size, UM.be, mattr, otype, bias | ldhint); GR[r 1 ].nat = 1; } else { GR[r 1 ] = 0; // ld.a to sequential memory GR[r 1 ].nat = 0; } } else { // execute load normally if (fill_form) { // fill NaT on ld8.fill bit_pos = GR[r 3]{8:3}; GR[r 1 ] = val; GR[r 1 ].nat = AR[UNAT]{bit_pos}; } else { // clear NaT on other types if (size == 16) { GR[r 1 ] = val; AR[CSD] = val_ar; } else { GR[r 1] = zero_ext(val, size * 8); } GR[r 1 ].nat = 0; } if ((check_no_clear || advanced) && ma_is_speculative(mattr)) // add entry to ALAT alat_write(GENERAL, r 1, paddr, size); } } if (imm_base_update_form) { // update base register GR[r 3 ] = GR[r 3 ] + sign_ext(imm 9 , 9); GR[r 3].nat = GR[r 3].nat; } else if (reg_base_update_form) { GR[r 3 ] = GR[r 3 ] + tmp_r2; GR[r 3].nat = GR[r 3].nat || tmp_r2nat; } if ((reg_base_update_form || imm_base_update_form) && !GR[r 3].nat) 第 3 巻 : 命令リファレンス 3:137
- Seite 97 und 98: fpabs fpabs ─ 浮動小数点並
- Seite 99 und 100: fpamax fpamax ─ 浮動小数点
- Seite 101 und 102: fpamin fpamin ─ 浮動小数点
- Seite 103 und 104: fpcmp fpcmp ─ 浮動小数点並
- Seite 105 und 106: fpcmp FP 例外 : 無効操作 (Inv
- Seite 107 und 108: fpcvt.fx } } } tmp_res.significand
- Seite 109 und 110: fpma } } fp_update_fpsr(sf, tmp_fp_
- Seite 111 und 112: fpmerge fpmerge ─ 浮動小数点
- Seite 113 und 114: fpmin fpmin ─ 浮動小数点並
- Seite 115 und 116: fpms fpms ─ 浮動小数点並列
- Seite 117 und 118: fpneg fpneg ─ 浮動小数点並
- Seite 119 und 120: fpnma fpnma ─ 浮動小数点並
- Seite 121 und 122: fpnmpy fpnmpy ─ 浮動小数点
- Seite 123 und 124: fprcpa } else if (fp_is_zero(num) &
- Seite 125 und 126: fprsqrta } tmp_pred_hi = 0; else tm
- Seite 127 und 128: frcpa } fp_update_fpsr(sf, tmp_fp_e
- Seite 129 und 130: frsqrta } PR[p 2 ] = 0; // fp_ieee_
- Seite 131 und 132: fsetc fsetc ─ 浮動小数点コ
- Seite 133 und 134: fswap fswap ─ 浮動小数点ス
- Seite 135 und 136: fsxt fsxt ─ 浮動小数点符号
- Seite 137 und 138: fxor fxor ─ 浮動小数点排他
- Seite 139 und 140: getf } GR[r 1 ] = FR[f 2 ].signific
- Seite 141 und 142: invala invala ─ ALAT の無効化
- Seite 143 und 144: itc 割り込み : マシン ・
- Seite 145 und 146: itr シリアル化 : instruction_f
- Seite 147: ld 表 2-33. ロード・タイプ(
- Seite 151 und 152: ldf ldf ─ 浮動小数点ロー
- Seite 153 und 154: ldf ldfe でのみ発生する。
- Seite 155 und 156: ldfp ldfp ─ 浮動小数点ペア
- Seite 157 und 158: ldfp } } if (base_update_form) { //
- Seite 159 und 160: lfetch 表 2-38. lfhint のニー
- Seite 161 und 162: loadrs loadrs ─ レジスタ・
- Seite 163 und 164: mix mix ─ ミックス (Mix) 書
- Seite 165 und 166: mix 操作 : if (PR[qp]) { check_ta
- Seite 167 und 168: mov ar 操作 : if (PR[qp]) { tmp_t
- Seite 169 und 170: mov cr mov ─ コントロール
- Seite 171 und 172: mov fr mov ─ 浮動小数点レ
- Seite 173 und 174: mov imm mov ─ 即値の移動 (Mo
- Seite 175 und 176: mov indirect 操作 : if (PR[qp]) {
- Seite 177 und 178: mov ip mov ─ 命令ポインタ
- Seite 179 und 180: mov psr mov ─ プロセッサ・
- Seite 181 und 182: movl movl ─ ロング型即値の
- Seite 183 und 184: mux 図 2-27. Mux2 の例 (16 ビ
- Seite 185 und 186: nop nop ─ ノー・オペレー
- Seite 187 und 188: pack pack ─ パック (Pack) 書
- Seite 189 und 190: padd padd ─ 並列加算 (Paralle
- Seite 191 und 192: padd } 割り込み : 無効操作
- Seite 193 und 194: pavg 図 2-31. 並列平均での
- Seite 195 und 196: pavgsub pavgsub ─ 並列平均減
- Seite 197 und 198: pcmp pcmp ─ 並列比較 (Paralle
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