24531904_j

24531904_j 24531904_j

16.02.2013 Aufrufe

表 3-1. 擬似コード関数 ( 続き ) partially_implemented_ip() プロセッサに依存するルーチンで、TRUE を返す場合と FALSE を返す場合がある。 IP の次の値であったはずのアドレスに対して符号拡張された仮想アドレスまたはゼ ロ拡張された物理アドレスが、実装されていない命令アドレス・トラップの発生時 にプロセッサによって IIP に書き込まれる場合は、TRUE を返す。IP の次の値で あったはずのフルアドレスが、このトラップが発生したプロセッサによって IIP に 書き込まれる場合は、FALSE を返す。 pr_phys_to_virt(phys_id) プレディケートの物理レジスタ ID、phys_id から、プレディケートの仮想レジス タ ID を返す rotate_regs() レジスタ・リネーム・ベース・レジスタをデクリメントし、結果としてレジスタ・ ファイルのローテートを行う。CFM.rrb.gr は CFM.sor がゼロでない場合にのみデ クリメントされる。 rse_enable_current_frame_load() RSE ロード・ポインタ (RSE.BSPLoad) が AR[BSP] よりも大きい場合、RSE によ る強制ロードによってカレント・フレームのレジスタを復元できることを示す RSE.CFLE ビットが設定される ( 他のケースでは、RSE はカレント・フレームのレジ スタのスピルまたはフィルを行わない )。この関数は必須の RSE によるロードを実 行しない。この手順で割り込みは発生しない。 rse_ensure_regs_loaded (number_of_bytes) 関数 操作 AR[BSP]と(AR[BSP] - number_of_bytes)の間のレジスタおよびNaTコレクショ ンのうち、スタックされたレジスタにまだ入っていないものがすべて、RSE によ る強制ロードによってレジスタ・スタックにロードされる。ロードされるレジスタ の数が RSE.N_STACK_PHYS より大きい場合は、無効操作フォルトが発生する。 バッキング・ストア・アドレス (AR[BSP] - 8) を始点として、バッキング・ストア・ アドレス (AR[BSP] - number_of_bytes) ( このアドレスを含む ) までデクリメントし ていくすべてのレジスタは、ダーティ・パーティションの一部になる。現在のフ レームを除く、その他のすべてのスタックされたレジスタは、無効パーティション の一部になる。number_of_bytes に 0 も指定できる。この関数で発生する RSE ロードのシーケンスは、割り込みをかけられるときがある。RSE による強制ロー ドによって、割り込みが発生するときがある。第 2 巻、第 1 部の表 6-6 を参照のこ と。 rse_invalidate_non_current_regs() カレント・フレームの外のすべてのレジスタが無効にされる。 rse_load(type) レジスタまたは NaT コレクションをバッキング・ストアから復元する (load_address = RSE.BspLoad - 8)。load_address{8:3} が 0x3f に等しい 場合は、NaT コレクションが NaT 分散レジスタにロードされる ( 分散レ ジ ス タは、 AR[RNAT] と同じでなくてもかまわない )。load_address{8:3} が 0x3f と等しくな い場合は、レジスタ RSE.LoadReg - 1 がロードされ、そのレジスタの NaT ビッ トが dispersal_register{load_address{8:3}} にセットされる。ロードが成 功した場合は、RSE.BspLoad が 8 だけデクリメントされる。ロードが成功し、レ ジスタがロードされた場合は、RSE.LoadReg が 1 だけデクリメントされる ( ス タックされたレジスタでのラッピングが行われることがある )。このロードは、 RSE.CFLE が 1 の場合は、無効なパーティションから現在のフレームにレジスタを 移動し、RSE.CFLE が 0 の場合は、クリーンなパーティションにレジスタを移動す る。RSE による強制ロードでは、type は MANDATORY になる。RSE による強制 ロードによって、割り込みが発生するときがある。第 2 巻、第 1 部の表 6-6 を参照 のこと。 rse_new_frame(current_frame_size, new_frame_size) レジスタ・リネームをまったく変更せずに、新しいフレームが定義される。新しい フレーム・サイズは new_frame_size パラメータによって完全に定義される ( 連 続したコールは累積しない )。new_frame_size が current_frame_size より も大きく、無効でクリーンなパーティション内のレジスタの数がフレームの増加し たサイズよりも小さい場合には、十分な数のレジスタが使用可能になるまで RSE による強制ストアが発行される。結果として生じる RSE ストアのシーケンスは割 り込まれるときがある。RSE による強制ストアによって割り込みが発生するとき がある。第 2 巻、第 1 部の表 6-6 を参照のこと。 3:256 第 3 巻 : 擬似コード関数

表 3-1. 擬似コード関数 ( 続き ) rse_preserve_frame (preserved_frame_size) rse_restore_frame(preserved_sol, growth, current_frame_size) preserved_frame_size で指定される数のレジスタが、RSE によって予約される ようにマークされる。レジスタ・リネームにより、GR[32] 以降の preserved_frame_size 個のレジスタが GR[32] にリネームされる。AR[BSP] が、新しい GR[32] が格納されるバッキング・ストア・アドレスを含むように更新 される。 最初の 2 つのパラメータは、分岐リターンまたは rfi により、現在のフレームが どのように更新されるかを定義する。preserved_sol は、RSE.BOF の下に復元 される必要があるレジスタの数を定義する。growth は、現在のフレームのトップ で成長するレジスタの数を定義する ( 成長は通常は負の方向になる )。 preserved_sol で指定された数のレジスタが、復元されるようにマークされる。 レジスタ・リネーミングにより、GR[32] より前の preserved_sol 個のレジスタ が、GR[32] にリネームされる。AR[BSP] が更新され、新しい GR[32] がストア されるバッキング・ストア・アドレスを示す。ダーティ・レジスタとクリーン・レ ジスタの数が preserved_sol より小さい場合は、RSE による強制ロードが発行 されるまで、新しい現在のフレームは有効であると見なされない。この関数は、 RSE による強制ロードを実行しない。維持されるフレームが無効なエリアおよび クリーンなエリアを超えてダーティなエリア内に成長する場合は、この関数は TRUE を返す。この場合は、3 番目の引数 current_frame_size を使用して、戻 り先のフレームを強制的にゼロにする ( 第 2 巻、第 1 部の 6.5.5 項「分岐リターン によって使用される不正な PFS」を参照 )。 rse_store(type) レジスタまたは NaT コレクションをバッキング・ストアに保存する (store_address = AR[BSPSTORE])。store_address{8:3} が 0x3f に等しい場合には、 NaT コレクション AR[RNAT] がストアされる。store_address{8:3} が 0x3f に等し くない場合は、レジスタ RSE.StoreReg がストアされ、そのレジスタの NaT ビッ トが AR[RNAT]{store_address{8:3}} に格納される。ストアが成功すると、 AR[BSPSTORE] が 8 だけインクリメントされる。ストアが成功し、レジスタがス トアされた場合、RSE.StoreReg が 1 だけインクリメントされる ( スタックされた レジスタでのラッピングが行われることがある )。このストアによって、ダー ティー・パーティションからクリーン・パーティションにレジスタを移動する。 RSE による強制ストアでは、タイプは MANDATORY である。RSE による強制ス トアによって、割り込みが発生するときがある。第 2 巻、第 1 部の表 6-6 を参照の こと。 rse_update_internal_stack_pointers (new_store_pointer) この関数は、AR[BSPSTORE] に新しい値 (new_store_pointer) が与えられたと きに、AR[BSP] の新しい値を計算する。この値は、new_store_pointer に、 ダーティー・レジスタの数と、その間にある NaT コレクションの数を加えたもの に等しい。つまり、ダーティー・パーティションのサイズは、AR[BSPSTORE] の 書き込みの前後で同じである。すべてのクリーン・レジスタは無効なパーティショ ンに移動される。 sign_ext(value, pos) ビット pos-1 から 0 までが value で埋められ、ビット位置 pos から 63 までが value のビットpos-1 で埋められている64 ビットの数値を返す。pos が 64 以上であ る場合には、value が返される。 spontaneous_deferral(paddr, size, border, mattr, otype, hint, *defer) 関数 操作 次の 3 つの条件がすべて該当した場合に、必要に応じて *defer を強制的に TRUE にする、プロセッサに依存するルーチン。(1) 自然発生デファーがイネーブル、(2) 自然発生デファーがプログラミング・モデルによって許可されている、(3) スペ キュレーティブ・ロードをデファーするのが有利であるとプロセッサが判断した場 合 ( 特定のレベルのキャッシュ内のミスに基づく )。 spontaneous_deferral_enabled() プロセッサに依存するルーチン。スペキュレーティブ・ロードの自然発生デファー がプロセッサ内でイネーブルまたはディスエーブルのどちらであるのか応じて、 TRUE または FALSE を返す、 tlb_access_key(vaddr) この関数は、vaddr に対応するエントリのアクセス・キーを TLB から返す。 第 3 巻 : 擬似コード関数 3:257

表 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 巻 : 擬似コード関数

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!