寄存器操作

这些微操作通常采用两个源并产生一个结果。大多数都有一个仅对寄存器进行操作的版本和一个对寄存器和立即数进行操作的版本。有些根据其操作可选择设置标志。其中一些可以被断言 (predicated)。

Add

加法。

add Dest, Src1, Src2

Dest # Dest <- Src1 + Src2

将 Src1 和 Src2 寄存器的内容相加,并将结果放入 Dest 寄存器。

addi Dest, Src1, Imm

Dest # Dest <- Src1 + Imm

将 Src1 寄存器的内容与立即数 Imm 相加,并将结果放入 Dest 寄存器。

标志

此微操作可选择设置 CF, ECF, ZF, EZF, PF, AF, SF, 和 OF 标志。

标志 含义
CF 和 ECF 最高有效位的进位输出。
ZF 和 EZF 结果是否为零。
PF 结果的奇偶校验。
AF 从第四位到第五位的进位。
SF 结果的符号。
OF 是否有溢出。

Adc

带进位加法。

adc Dest, Src1, Src2

Dest # Dest <- Src1 + Src2 + CF

将 Src1 和 Src2 寄存器的内容与进位标志相加,并将结果放入 Dest 寄存器。

adci Dest, Src1, Imm

Dest # Dest <- Src1 + Imm + CF

将 Src1 寄存器的内容、立即数 Imm 和进位标志相加,并将结果放入 Dest 寄存器。

标志

此微操作可选择设置 CF, ECF, ZF, EZF, PF, AF, SF, 和 OF 标志。

标志 含义
CF 和 ECF 最高有效位的进位输出。
ZF 和 EZF 结果是否为零。
PF 结果的奇偶校验。
AF 从第四位到第五位的进位。
SF 结果的符号。
OF 是否有溢出。

Sub

减法。

sub Dest, Src1, Src2

Dest # Dest <- Src1 - Src2

从 Src1 寄存器中减去 Src2 寄存器的内容,并将结果放入 Dest 寄存器。

subi Dest, Src1, Imm

Dest # Dest <- Src1 - Imm

从 Src1 寄存器中减去立即数 Imm 的内容,并将结果放入 Dest 寄存器。

标志

此微操作可选择设置 CF, ECF, ZF, EZF, PF, AF, SF, 和 OF 标志。

标志 含义
CF 和 ECF 最高有效位的借位。
ZF 和 EZF 结果是否为零。
PF 结果的奇偶校验。
AF 从第四位到第五位的借位。
SF 结果的符号。
OF 是否有溢出。

Sbb

带借位减法。

sbb Dest, Src1, Src2

Dest # Dest <- Src1 - Src2 - CF

从 Src1 寄存器中减去 Src2 寄存器的内容和进位标志,并将结果放入 Dest 寄存器。

sbbi Dest, Src1, Imm

Dest # Dest <- Src1 - Imm - CF

从 Src1 寄存器中减去立即数 Imm 和进位标志,并将结果放入 Dest 寄存器。

标志

此微操作可选择设置 CF, ECF, ZF, EZF, PF, AF, SF, 和 OF 标志。

标志 含义
CF 和 ECF 最高有效位的借位。
ZF 和 EZF 结果是否为零。
PF 结果的奇偶校验。
AF 从第四位到第五位的借位。
SF 结果的符号。
OF 是否有溢出。

Mul1s

有符号乘法。

mul1s Src1, Src2

ProdHi:ProdLo # Src1 * Src2

将 Src1 和 Src2 寄存器的无符号内容相乘,并将乘积的高位和低位部分分别放入内部寄存器 ProdHi 和 ProdLo 中。

mul1si Src1, Imm

ProdHi:ProdLo # Src1 * Imm

将 Src1 寄存器的无符号内容与立即数 Imm 相乘,并将乘积的高位和低位部分分别放入内部寄存器 ProdHi 和 ProdLo 中。

标志

此微操作不设置任何标志。

Mul1u

无符号乘法。

mul1u Src1, Src2

ProdHi:ProdLo # Src1 * Src2

将 Src1 和 Src2 寄存器的无符号内容相乘,并将乘积的高位和低位部分分别放入内部寄存器 ProdHi 和 ProdLo 中。

mul1ui Src1, Imm

ProdHi:ProdLo # Src1 * Imm

将 Src1 寄存器的无符号内容与立即数 Imm 相乘,并将乘积的高位和低位部分分别放入内部寄存器 ProdHi 和 ProdLo 中。

标志

此微操作不设置任何标志。

Mulel

卸载乘法结果低位。

mulel Dest

Dest # Dest <- ProdLo

将内部 ProdLo 寄存器的值移动到 Dest 寄存器中。

标志

此微操作不设置任何标志。

Muleh

卸载乘法结果高位。

muleh Dest

Dest # Dest <- ProdHi

将内部 ProdHi 寄存器的值移动到 Dest 寄存器中。

标志

此微操作可选择设置 CF, ECF, 和 OF 标志。

标志 含义
CF 和 ECF ProdHi 是否非零。
OF ProdHi 是否为零。

Div1

除法的第一阶段。

div1 Src1, Src2

Quotient * Src2 + Remainder # Src1 Divisor # Src2

开始除法运算,其中 SrcReg1 的内容是被除数的高位部分,SrcReg2 的内容是除数。此部分除法的余数放入内部寄存器 Remainder 中。商放入内部寄存器 Quotient 中。除数放入内部寄存器 Divisor 中。

div1i Src1, Imm:

Quotient * Imm + Remainder # Src1 Divisor # Imm

开始除法运算,其中 SrcReg1 的内容是被除数的高位部分,立即数 Imm 是除数。此部分除法的余数放入内部寄存器 Remainder 中。商放入内部寄存器 Quotient 中。除数放入内部寄存器 Divisor 中。

标志

此微操作不设置任何标志。

Div2

除法的第二阶段及后续阶段。

div2 Dest, Src1, Src2

Quotient * Divisor + Remainder # 原始 Remainder 与从 Src1 移入的位

Dest # Dest <- Src2 - 上面移入的位数

执行 div1 指令后的除法后续步骤。寄存器 Src1 的内容是被除数的低位部分。寄存器 Src2 的内容表示在此除法步骤之前 Src1 中尚未使用的位数。Dest 设置为在此步骤之后 Src1 中尚未使用的位数。内部寄存器 Quotient、Divisor 和 Remainder 由此指令更新。

如果 Src1 中没有剩余位,则此指令除了可选择计算标志外不执行任何操作。

div2i Dest, Src1, Imm

Quotient * Divisor + Remainder # 原始 Remainder 与从 Src1 移入的位

Dest # Dest <- Imm - 上面移入的位数

执行 div1 指令后的除法后续步骤。寄存器 Src1 的内容是被除数的低位部分。立即数 Imm 表示在此除法步骤之前 Src1 中尚未使用的位数。Dest 设置为在此步骤之后 Src1 中尚未使用的位数。内部寄存器 Quotient、Divisor 和 Remainder 由此指令更新。

如果 Src1 中没有剩余位,则此指令除了可选择计算标志外不执行任何操作。

标志

此微操作可选择设置 EZF 标志。

标志 含义
EZF 在此步骤之后 Src1 中是否还有任何剩余位。

Divq

卸载除法商。

divq Dest

Dest # Dest <- Quotient

将内部 Quotient 寄存器的值移动到 Dest 寄存器中。

标志

此微操作不设置任何标志。

Divr

卸载除法余数。

divr Dest

Dest # Dest <- Remainder

将内部 Remainder 寄存器的值移动到 Dest 寄存器中。

标志

此微操作不设置任何标志。

Or

逻辑或。

or Dest, Src1, Src2

Dest # Dest <- Src1 | Src2

计算 Src1 和 Src2 寄存器内容的按位或,并将结果放入 Dest 寄存器中。

ori Dest, Src1, Imm

Dest # Dest <- Src1 | Imm

计算 Src1 寄存器内容和立即数 Imm 的按位或,并将结果放入 Dest 寄存器中。

标志

此微操作可选择设置 CF, ECF, ZF, EZF, PF, AF, SF, 和 OF 标志。 没有什么能阻止计算 AF 标志的值,但其值将毫无意义。

标志 含义
CF 和 ECF 清除。
ZF 和 EZF 结果是否为零。
PF 结果的奇偶校验。
AF 未定义。
SF 结果的符号。
OF 清除。

And

逻辑与

and Dest, Src1, Src2

Dest # Dest <- Src1 & Src2

计算 Src1 和 Src2 寄存器内容的按位与,并将结果放入 Dest 寄存器中。

andi Dest, Src1, Imm

Dest # Dest <- Src1 & Imm

计算 Src1 寄存器内容和立即数 Imm 的按位与,并将结果放入 Dest 寄存器中。

标志

此微操作可选择设置 CF, ECF, ZF, EZF, PF, AF, SF, 和 OF 标志。 没有什么能阻止计算 AF 标志的值,但其值将毫无意义。

标志 含义
CF 和 ECF 清除。
ZF 和 EZF 结果是否为零。
PF 结果的奇偶校验。
AF 未定义。
SF 结果的符号。
OF 清除。

Xor

逻辑异或。

xor Dest, Src1, Src2

Dest # Dest <- Src1 | Src2

计算 Src1 和 Src2 寄存器内容的按位异或,并将结果放入 Dest 寄存器中。

xori Dest, Src1, Imm

Dest # Dest <- Src1 | Imm

计算 Src1 寄存器内容和立即数 Imm 的按位异或,并将结果放入 Dest 寄存器中。

标志

此微操作可选择设置 CF, ECF, ZF, EZF, PF, AF, SF, 和 OF 标志。 没有什么能阻止计算 AF 标志的值,但其值将毫无意义。

标志 含义
CF 和 ECF 清除。
ZF 和 EZF 结果是否为零。
PF 结果的奇偶校验。
AF 未定义。
SF 结果的符号。
OF 清除。

Sll

逻辑左移。

sll Dest, Src1, Src2

Dest # Dest <- Src1 « Src2

将 Src1 寄存器的内容向左移动 Src2 寄存器中的值,并将结果写入 Dest 寄存器。移位量被截断为 5 或 6 位,具体取决于操作数大小。

slli Dest, Src1, Imm

Dest # Dest <- Src1 « Imm

将 Src1 寄存器的内容向左移动立即数 Imm 中的值,并将结果写入 Dest 寄存器。移位量被截断为 5 或 6 位,具体取决于操作数大小。

标志

此微操作可选择设置 CF, ECF, 和 OF 标志。如果移位量为零,则不修改任何标志。

标志 含义
CF 和 ECF 移出结果的最后一位。
OF 如果请求,此指令将设置 CF 标志的值与结果的最高有效位的异或。

Srl

逻辑右移。

srl Dest, Src1, Src2

Dest # Dest <- Src1 »(logical) Src2

将 Src1 寄存器的内容向右移动 Src2 寄存器中的值,并将结果写入 Dest 寄存器。移入的位对结果进行符号扩展。移位量被截断为 5 或 6 位,具体取决于操作数大小。

srli Dest, Src1, Imm

Dest # Dest <- Src1 »(logical) Imm

将 Src1 寄存器的内容向右移动立即数 Imm 中的值,并将结果写入 Dest 寄存器。移入的位对结果进行符号扩展。移位量被截断为 5 或 6 位,具体取决于操作数大小。

标志

此微操作可选择设置 CF, ECF, 和 OF 标志。如果移位量为零,则不修改任何标志。

标志 含义
CF 和 ECF 移出结果的最后一位。
SF 原始值的最高有效位。

Sra

算术右移。

sra Dest, Src1, Src2

Dest # Dest <- Src1 »(arithmetic) Src2

将 Src1 寄存器的内容向右移动 Src2 寄存器中的值,并将结果写入 Dest 寄存器。移入的位对结果进行零扩展。移位量被截断为 5 或 6 位,具体取决于操作数大小。

srai Dest, Src1, Imm

Dest # Dest <- Src1 »(arithmetic) Imm

将 Src1 寄存器的内容向右移动立即数 Imm 中的值,并将结果写入 Dest 寄存器。移入的位对结果进行零扩展。移位量被截断为 5 或 6 位,具体取决于操作数大小。

标志

此微操作可选择设置 CF, ECF, 和 OF 标志。如果移位量为零,则不修改任何标志。

标志 含义
CF 和 ECF 移出结果的最后一位。
OF 清除。

Ror

向右旋转。

ror Dest, Src1, Src2

将 Src1 寄存器的内容向右旋转 Src2 寄存器中的值,并将结果写入 Dest 寄存器。旋转量被截断为 5 或 6 位,具体取决于操作数大小。

rori Dest, Src1, Imm

将 Src1 寄存器的内容向右旋转立即数 Imm 中的值,并将结果写入 Dest 寄存器。旋转量被截断为 5 或 6 位,具体取决于操作数大小。

标志

此微操作可选择设置 CF, ECF, 和 OF 标志。如果旋转量为零,则不修改任何标志。

标志 含义
CF 和 ECF 结果的最高有效位。
OF 原始值的最高两位有效位的异或。

Rcr

通过进位向右旋转。

rcr Dest, Src1, Src2

将 Src1 寄存器的内容通过进位标志向右旋转 Src2 寄存器中的值,并将结果写入 Dest 寄存器。旋转量被截断为 5 或 6 位,具体取决于操作数大小。

rcri Dest, Src1, Imm

将 Src1 寄存器的内容通过进位标志向右旋转立即数 Imm 中的值,并将结果写入 Dest 寄存器。旋转量被截断为 5 或 6 位,具体取决于操作数大小。

标志

此微操作可选择设置 CF, ECF, 和 OF 标志。如果旋转量为零,则不修改任何标志。

标志 含义
CF 和 ECF 移出结果的最后一位。
OF 旋转前 CF 标志与原始值的最高有效位的异或。

Rol

向左旋转。

rol Dest, Src1, Src2

将 Src1 寄存器的内容向左旋转 Src2 寄存器中的值,并将结果写入 Dest 寄存器。旋转量被截断为 5 或 6 位,具体取决于操作数大小。

roli Dest, Src1, Imm

将 Src1 寄存器的内容向左旋转立即数 Imm 中的值,并将结果写入 Dest 寄存器。旋转量被截断为 5 或 6 位,具体取决于操作数大小。

标志

此微操作可选择设置 CF, ECF, 和 OF 标志。如果旋转量为零,则不修改任何标志。

标志 含义
CF 和 ECF 结果的最低有效位。
OF 结果的最高和最低有效位的异或。

Rcl

通过进位向左旋转。

rcl Dest, Src1, Src2

将 Src1 寄存器的内容通过进位标志向左旋转 Src2 寄存器中的值,并将结果写入 Dest 寄存器。旋转量被截断为 5 或 6 位,具体取决于操作数大小。

rcli Dest, Src1, Imm

将 Src1 寄存器的内容通过进位标志向左旋转立即数 Imm 中的值,并将结果写入 Dest 寄存器。旋转量被截断为 5 或 6 位,具体取决于操作数大小。

标志

此微操作可选择设置 CF, ECF, 和 OF 标志。如果旋转量为零,则不修改任何标志。

标志 含义
CF 和 ECF 旋转出结果的最后一位。
OF 旋转前 CF 与结果的最高有效位的异或。

Mov

移动。

mov Dest, Src1, Src2

Dest # Src1 <- Src2

将 Src2 寄存器的内容合并到 Src1 的内容中,并将结果放入 Dest 寄存器中。

movi Dest, Src1, Imm

Dest # Src1 <- Imm

将立即数 Imm 的内容合并到 Src1 的内容中,并将结果放入 Dest 寄存器中。

标志

此微操作不设置任何标志。它是可选断言的。

Sext

符号扩展。

sext Dest, Src1, Imm

Dest # Dest <- sign_extend(Src1, Imm)

从立即数 Imm 中的位位置开始对 Src1 寄存器中的值进行符号扩展,并将结果放入 Dest 寄存器中。

标志

此微操作不设置任何标志。

Zext

零扩展。

zext Dest, Src1, Imm

Dest # Dest <- zero_extend(Src1, Imm)

从立即数 Imm 中的位位置开始对 Src1 寄存器中的值进行零扩展,并将结果放入 Dest 寄存器中。

标志

此微操作不设置任何标志。

Ruflag

读取用户标志。

ruflag Dest, Imm

读取立即数 Imm 指定的位位置中存储的用户级标志,并将其存储在寄存器 Dest 中。

Imm 值与用户级标志之间的映射如下表所示。

Imm 标志
0 CF (进位标志)
2 PF (奇偶校验标志)
3 ECF (仿真进位标志)
4 AF (辅助标志)
5 EZF (仿真零标志)
6 ZF (零标志)
7 CF (符号标志)
10 CF (方向标志)
11 CF (溢出标志)

标志

EZF 标志始终设置。将来这可能会变成可选的。

Ruflags

读取所有用户标志。

ruflags Dest

Dest # user flags

将用户级标志存储到 Dest 寄存器中。

标志

此微操作不设置任何标志。

Wruflags

写入所有用户标志。

wruflags Src1, Src2

user flags # Src1 ^ Src2

将用户级标志设置为 Src1 和 Src2 寄存器的异或。

wruflagsi Src1, Imm

user flags # Src1 ^ Imm

将用户级标志设置为 Src1 寄存器和立即数 Imm 的异或。

标志

见上文。

Rdip

读取指令指针。

rdip Dest

Dest # rIP

将 Dest 寄存器设置为 rIP 的当前值。

标志

此微操作不设置任何标志。

Wrip

写入指令指针。

wrip Src1, Src2

rIP # Src1 + Src2

将 rIP 设置为 Src1 和 Src2 寄存器之和。这会导致当前宏操作结束时的宏操作分支。

wripi Src1, Imm

micropc # Src1 + Imm

将 rIP 设置为 Src1 寄存器和立即数 Imm 之和。这会导致当前宏操作结束时的宏操作分支。

标志

此微操作不设置任何标志。它是可选断言的。

Chks

检查选择器。

尚未实现。

加载/存储操作 (Load/Store Ops)

Ld

加载。

ld Data, Seg, Sib, Disp

从内存加载整数寄存器 Data。

Ldf

加载浮点。

ldf Data, Seg, Sib, Disp

从内存加载浮点寄存器 Data。

Ldm

加载多媒体。

ldm Data, Seg, Sib, Disp

从内存加载多媒体寄存器 Data。 这未实现,可能永远不会实现。

Ldst

加载并检查存储。

Ldst Data, Seg, Sib, Disp

从内存加载整数寄存器 Data,同时还要检查该位置的存储是否会成功。 目前尚未实现。

Ldstl

加载并检查存储,锁定。

Ldst Data, Seg, Sib, Disp

从内存加载整数寄存器 Data,同时还要检查该位置的存储是否会成功,并提供 “LOCK” 指令前缀的语义。 目前尚未实现。

St

存储。

st Data, Seg, Sib, Disp

将整数寄存器 Data 存储到内存。

Stf

存储浮点。

stf Data, Seg, Sib, Disp

将浮点寄存器 Data 存储到内存。

Stm

存储多媒体。

stm Data, Seg, Sib, Disp

将多媒体寄存器 Data 存储到内存。 这未实现,可能永远不会实现。

Stupd

带基址更新的存储。

Stupd Data, Seg, Sib, Disp

将整数寄存器 Data 存储到内存并更新基址寄存器。

Lea

加载有效地址。

lea Data, Seg, Sib, Disp

计算此参数组合的地址并将其存储在 Data 中。

Cda

检查数据地址。

cda Seg, Sib, Disp

检查数据地址是否有效。 目前尚未实现。

Cdaf

带缓存行刷新的 CDA。

cdaf Seg, Sib, Disp

检查数据地址是否有效,并刷新缓存行。 目前尚未实现。

Cia

检查指令地址。

cia Seg, Sib, Disp

检查指令地址是否有效。 目前尚未实现。

Tia

TLB 无效地址

tia Seg, Sib, Disp

使对应于此地址的 tlb 条目无效。 目前尚未实现。

加载立即数操作 (Load immediate Op)

Limm

limm Dest, Imm

将 64 位立即数 Imm 存储到整数寄存器 Dest 中。

浮点操作 (Floating Point Ops)

Movfp

movfp Dest, Src

Dest # Src

将浮点寄存器 Src 的内容移动到浮点寄存器 Dest 中。

此指令是断言的。

Xorfp

xorfp Dest, Src1, Src2

Dest # Src1 ^ Src2

计算浮点寄存器 Src1 和 Src2 的按位异或,并将结果放入浮点寄存器 Dest 中。

Sqrtfp

sqrtfp Dest, Src

Dest # sqrt(Src)

计算浮点寄存器 Src 的平方根,并将结果放入浮点寄存器 Dest 中。

Addfp

addfp Dest, Src1, Src2

Dest # Src1 + Src2

计算浮点寄存器 Src1 和 Src2 的和,并将结果放入浮点寄存器 Dest 中。

Subfp

subfp Dest, Src1, Src2

Dest # Src1 - Src2

计算浮点寄存器 Src1 和 Src2 的差,并将结果放入浮点寄存器 Dest 中。

Mulfp

mulfp Dest, Src1, Src2

Dest # Src1 * Src2

计算浮点寄存器 Src1 和 Src2 的积,并将结果放入浮点寄存器 Dest 中。

Divfp

divfp Dest, Src1, Src2

Dest # Src1 / Src2

用 Src1 除以 Src2,并将结果放入浮点寄存器 Dest 中。

Compfp

compfp Src1, Src2

比较浮点寄存器 Src1 和 Src2。

Cvtf_i2d

cvtf_i2d Dest, Src

将整数寄存器 Src 转换为双精度浮点值,并将结果存储在 Dest 的下半部分。

Cvtf_i2d_hi

cvtf_i2d_hi Dest, Src

将整数寄存器 Src 转换为双精度浮点值,并将结果存储在 Dest 的上半部分。

Cvtf_d2i

cvtf_d2i Dest, Src

将浮点寄存器 Src 转换为整数值,并将结果存储在整数寄存器 Dest 中。

特殊操作 (Special Ops)

Fault

生成故障。

fault fault_code

使用 C++ 代码 fault_code 分配要返回的 Fault 对象。

Lddha

设置故障的默认处理程序。 目前尚未实现。

Ldaha

设置故障的备用处理程序 目前尚未实现。

排序操作 (Sequencing Ops)

这些微操作用于微码内的控制流

Br

微码分支。这永远不被视为序列的最后一个微操作。如果它出现在宏操作的末尾,则假定它分支到 ROM 中的微码。

br target

micropc # target

将 micropc 设置为 16 位立即数 target。

标志

此微操作不设置任何标志。它是可选断言的。

Eret

从仿真返回。此指令始终被视为序列中的最后一个微操作。从 ROM 执行时,这是返回正常指令解码的唯一方法。

eret

从仿真返回。

标志

此微操作不设置任何标志。它是可选断言的。