24531904_j

24531904_j 24531904_j

16.02.2013 Aufrufe

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

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!