操作部分

“操作”部分包含指定每條指令執行語法的程式碼。它不包含與指令獲取有關的任何行為(例如,獲取期間導致的中斷與錯誤)。

要檢視“操作”部分,請單擊任何指令標題中“操作”字樣。

這部分的字型慣例是:

程式碼 -(“操作”部分)指定指令行為的 C 程式碼。

程式碼_斜體 -(“操作”部分)對應“格式”部分列出的斜體欄位的彙編語言欄位名。

程式碼慣例

在“操作”部分,暫存器使用表示法 reg[addr].field 定址。訪問的暫存器檔案由 reg 指定,它的值從暫存器檔案表示法表格的第二列中選擇。addr 欄位按照彙編語言欄位名或暫存器助記符的形式指定暫存器地址。field 選項指定暫存器內命名的位欄位。如果 field 不存在,則訪問暫存器的所有欄位。唯一的例外是引用通用暫存器(64 位,不含 NaT)的數據欄位時,該處使用表示法 GR[addr]。“操作”部分中的程式碼與標準 C 之間的語法差異列在 C 程式碼與操作部分程式碼的語法差異表格中。

由於傳統程式語言語句的順序性質,用於指定指令操作的程式碼會在具體實現的版本上施加一些人為的限制。英特爾(R) 安騰(R) 處理器可能會提前主動去執行一些操作,後來卻確定並不需要這些操作的結果,因此隨後會抑制其體系結構上可見狀態的更新。為體現這種自由度,對於“操作”部分出現的程式碼,適用以下規則:

  1. 賦值語句右側指定的操作可獨立於前面的任何 "if" 控制語句執行。如果賦值語句的右側包含過程呼叫,則任何過程參數的求值都可獨立於前面的任何 "if" 控制語句。同樣的規則也遞迴適用於過程本身及其它衍生物中的語句。在後面的指令說明中,過程參數的表達式從不會有體系結構上可見的副作用(例如,對體系結構狀態的賦值)。

  2. 如果賦值語句左側的變數代表體系結構上可見的狀態,除非前面所有的 "if" 控制語句的值為真,否則不發生賦值。如果賦值語句左側的變數不代表體系結構上可見的狀態(例如,臨時變數),則賦值可獨立於前面的任何 "if" 控制語句發生。如果語句僅由一個過程呼叫組成,則相同的規則遞迴適用於過程本身及其衍生物中的語句。

  3. "if" 語句的條件表達式可獨立於前面的任何 "if" 控制語句的結果求值。在後面的指令說明中,"if" 語句的條件表達式從不會有體系結構上可見的副作用(例如,對體系結構狀態的賦值)。

“操作”部分的程式碼中使用增強模式的偽程式碼函式。

偽程式碼示例

if (PR[qp]) {

if (!aligned(GR[r3], sz))

unaligned_data_reference_fault(READ, GR[r3]);

tmp_paddr = tlb_translate(GR[r3], sz, READ, &mtype, &defer);

if (!defer) {

GR[r1] = zero_ext(mem_read

(tmp_paddr, sz, UM.be, mtype, ldhint), sz * 8);

alat_inval_single_entry(GENERAL, r1);

if (register_form)

GR[r3] = GR[r3] + GR[r2];

}

}

在偽程式碼示例中,根據第一項規則:

根據第二項規則:

根據第三項規則:

操作部分中的變數

“操作”部分的程式碼中出現的所有變數都是“通用數據型別”,是可變長無符號位欄位。代表體系結構狀態的變數使用固定的欄位長度,與它們的定義保持一致。臨時變數(即,非體系結構變數)預設使用最新賦值語句右側最長變數的長度。

如果賦值語句右側的變數比左側的變數長,則在賦值之前,代表右側變數的位欄位將截斷至左側變數的長度。如果賦值語句右側的變數比左側的變數短,則在賦值之前,代表右側變數的位欄位將按照零擴充套件方式擴充套件至左側變數的長度。這些規則同樣適用於在不同長度的變數上執行的操作。

“操作”部分的程式碼中使用了一些特定的常用函式。“操作”部分僅包含指定每條指令執行語義的程式碼,不包含任何與指令獲取有關的行為(例如,獲取期間導致的中斷與錯誤)。“中斷”部分不列出可能由指令獲取或強制性 RSE 載入導致的任何錯誤。“操作”部分的程式碼中不包含產生特定的普遍性錯誤與操作的程式碼。下面列出這些錯誤與操作。“單步”陷阱適用於所有的指令,因此未列在“中斷”部分。

指令說明程式碼中未包含的普遍狀況