Thumb 指令集编码
本章介绍 Thumb 指令集,并说明它如何使用 Arm 程序员模型。本章包含以下小节:
- 第 A5-126 页的 Thumb 指令集编码。
- 第 A5-129 页的 16 位 Thumb 指令编码。
- 第 A5-137 页的 32 位 Thumb 指令编码。
1. Thumb 指令集编码¶
Thumb 指令流是一串按半字对齐的连续半字。每条 Thumb 指令要么是该指令流中的一个 16 位半字,要么是由该指令流中两个连续半字组成的 32 位指令。
如果正在译码的半字的 bits[15:11] 取下列任一值,该半字就是一条 32 位指令的第一个半字:
0b11101。0b11110。0b11111。
否则,该半字是一条 16 位指令。
16 位 Thumb 指令编码的详细信息参见第 A5-129 页的 16 位 Thumb 指令编码。32 位 Thumb 指令编码的详细信息参见第 A5-137 页的 32 位 Thumb 指令编码。
1.1. UNDEFINED 与 UNPREDICTABLE 指令集空间¶
尝试执行未分配的指令会导致下列情况之一:
- 不可预测的行为。该指令被描述为 UNPREDICTABLE。
- 未定义指令异常。该指令被描述为 UNDEFINED。
如果一条指令在指令描述中或在本章中被声明为 UNDEFINED,则它是 UNDEFINED。
如果满足下列条件之一,则一条指令是 UNPREDICTABLE:
- 指令编码图中标记为 (0) 或 (1) 的位分别不为 0 或 1,并且该编码的伪代码没有指示要应用不同的特殊情况。
- 该指令在指令描述中或在本章中被声明为 UNPREDICTABLE。
除非另有说明:
- 在某一体系结构变体中引入的 Thumb 指令,在更早的体系结构变体中要么是 UNPREDICTABLE,要么是 UNDEFINED。
- 由一个或多个体系结构扩展提供的 Thumb 指令,在不包含这些扩展的实现中要么是 UNPREDICTABLE,要么是 UNDEFINED。
在上述两种情况下,如果该指令是 Armv6T2 之前体系结构变体中的 32 位指令,则它是 UNPREDICTABLE;否则它是 UNDEFINED。
1.2. 使用 0b1111 作为寄存器说明符¶
在 Thumb 指令中通常不允许使用 0b1111 作为寄存器说明符。当允许使用 0b1111 时,它可以有多种含义。对于寄存器读取,这些含义是:
- 读取 PC 值,即当前指令的地址 + 4。表分支指令
TBB和TBH的基址寄存器可以是 PC。这使得分支表可以放在紧邻该指令之后的内存中。(有些指令隐式读取 PC 值而不使用寄存器说明符,例如条件分支指令B<cond>。)
注意
在 Armv7 中,在 STC 指令中使用 PC 作为基址寄存器已被弃用。
- 读取字对齐的 PC 值,即当前指令的地址 + 4,且 bits[1:0] 强制为零。
LDC、LDR、LDRB、LDRD(前索引,无回写)、LDRH、LDRSB和LDRSH指令的基址寄存器可以是字对齐的 PC。这使得 PC 相对的数据寻址成为可能。此外,ADD和SUB指令的某些编码允许其源寄存器为0b1111,用于相同目的。 - 读取零。当一条指令是另一条更通用指令的特殊情况、但其中一个操作数为零时,某些情况下会这样做。在这些情况下,这些指令列在单独的页面中,较通用指令伪代码中的特殊情况会交叉引用另一页面。
对于寄存器写入,这些含义是:
- PC 可以指定为
LDR指令的目标寄存器。这是通过将Rt编码为0b1111实现的。加载的值被当作地址,执行的效果是分支到该地址。加载值的 bit[0] 选择分支后的执行状态,且其值必须为 1。
其他一些指令以类似方式写入 PC,可以是通过:
— 隐式方式,例如 B<cond>。
— 使用寄存器掩码而不是寄存器说明符,例如 LDM。
要分支到的地址可以是:
— 加载的值,例如 LDM。
— 寄存器值,例如 BX。
— 计算的结果,例如 TBB 或 TBH。
- 丢弃计算结果。当一条指令是另一条更通用指令的特殊情况、但结果被丢弃时,某些情况下会这样做。在这些情况下,这些指令列在单独的页面中,较通用指令伪代码中的特殊情况会交叉引用另一页面。
- 如果
LDRB、LDRH、LDRSB或LDRSH指令的目标寄存器说明符为0b1111,则该指令是内存提示而不是加载操作。 - 如果
MRC指令的目标寄存器说明符为0b1111,则从协处理器传送的值中的 bits[31:28] 会写入 APSR 中的 N、Z、C 和 V 标志,bits[27:0] 被丢弃。
1.3. 使用 0b1101 作为寄存器说明符¶
R13 在 Thumb 指令集中的定义使其主要用作栈指针,在 Thumb 指令中 R13 通常标识为 SP。在 32 位 Thumb 指令中,如果使用 SP 作为通用寄存器而超出本节所述体系结构定义的约束,则结果为 UNPREDICTABLE。
以下小节描述使用 SP 的限制:
- SP[1:0] 的定义。
- 32 位 Thumb 指令对 SP 的支持。
另请参见第 A5-128 页的 16 位 Thumb 指令对 SP 的支持。
1.3.1. SP[1:0] 的定义¶
SP 的 bits[1:0] 必须被视为 SBZP(Should Be Zero or Preserved,应为零或保持不变)。向 bits[1:0] 写入非零值会导致 UNPREDICTABLE 行为。读取 bits[1:0] 返回零。
1.3.2. 32 位 Thumb 指令对 SP 的支持¶
32 位 Thumb 指令对 SP 的支持仅限于下列情形:
- SP 作为
MOV指令的源寄存器或目标寄存器。仅支持不带移位的寄存器到寄存器传送,且不设置标志:
- 以其对齐值的倍数向上或向下调整 SP:
ADD{W} SP, SP, #N ; N 为 4 的倍数
SUB{W} SP, SP, #N ; N 为 4 的倍数
ADD SP, SP, Rm, LSL #shft ; shft = 0、1、2、3
SUB SP, SP, Rm, LSL #shft ; shft = 0、1、2、3
- SP 作为任何加载或存储指令的基址寄存器
Rn。这支持加载、存储或内存提示指令基于 SP 的寻址,可带正值或负值偏移,可带或不带回写。 - SP 作为任何
ADD{S}、CMN、CMP或SUB{S}指令中的第一个操作数Rn。加减指令支持基于 SP 的地址生成,生成的地址进入通用寄存器。在某些情况下,CMN和CMP可用于栈检查。 - SP 作为任何
LDR或STR指令中被传送的寄存器Rt。 - SP 作为
POP或PUSH指令中的地址。
1.3.3. 16 位 Thumb 指令对 SP 的支持¶
对于影响高寄存器的 16 位数据处理指令,SP 只能按第 A5-127 页的 32 位 Thumb 指令对 SP 的支持 中所述的方式使用。Arm 弃用任何其他用法。这影响 CMP 和 ADD 的高寄存器形式,其中 Arm 弃用将 SP 用作 Rm。
2. 16 位 Thumb 指令编码¶
16 位 Thumb 指令的编码为:

表 A5-1 列出了 16 位指令编码的分配情况。
| opcode | 指令或指令类别 |
|---|---|
| 00xxxx | 移位(立即数)、加、减、移动和比较(第 A5-130 页) |
| 010000 | 数据处理(第 A5-131 页) |
| 010001 | 特殊数据处理指令及分支与交换(第 A5-132 页) |
| 01001x | 从字面量池加载,参见 LDR(字面量)(第 A7-248 页) |
| 0101xx 011xxx 100xxx |
加载/存储单个数据项(第 A5-133 页) |
| 10100x | 生成 PC 相对地址,参见 ADR(第 A7-198 页) |
| 10101x | 生成 SP 相对地址,参见 ADD(SP 加立即数)(第 A7-194 页) |
| 1011xx | 杂项 16 位指令(第 A5-134 页) |
| 11000x | 存储多个寄存器,参见 STM, STMIA, STMEA(第 A7-383 页) |
| 11001x | 加载多个寄存器,参见 LDM, LDMIA, LDMFD(第 A7-242 页) |
| 1101xx | 条件分支与主管调用(第 A5-136 页) |
| 11100x | 无条件分支,参见 B(第 A7-205 页) |
2.1. 移位(立即数)、加、减、移动和比较¶
移位(立即数)、加、减、移动和比较指令的编码为:

表 A5-2 列出了此空间中编码的分配情况。
| opcode | 指令 | 参见 |
|---|---|---|
| 000xx | 逻辑左移ᵃ | LSL(立即数)(第 A7-282 页) |
| 001xx | 逻辑右移 | LSR(立即数)(第 A7-284 页) |
| 010xx | 算术右移 | ASR(立即数)(第 A7-203 页) |
| 01100 | 寄存器加法 | ADD(寄存器)(第 A7-192 页) |
| 01101 | 寄存器减法 | SUB(寄存器)(第 A7-404 页) |
| 01110 | 3 位立即数加法 | ADD(立即数)(第 A7-190 页) |
| 01111 | 3 位立即数减法 | SUB(立即数)(第 A7-402 页) |
| 100xx | 移动 | MOV(立即数)(第 A7-291 页) |
| 101xx | 比较 | CMP(立即数)(第 A7-223 页) |
| 110xx | 8 位立即数加法 | ADD(立即数)(第 A7-190 页) |
| 111xx | 8 位立即数减法 | SUB(立即数)(第 A7-402 页) |
a. 当 opcode 为 0b00000 且 bits[8:6] 为 0b000 时,此编码为 MOV(寄存器),参见第 A7-293 页的 MOV(寄存器)。
2.2. 数据处理¶
数据处理指令的编码为:

表 A5-3 列出了此空间中编码的分配情况。
| opcode | 指令 | 参见 |
|---|---|---|
| 0000 | 按位与 | AND(寄存器)(第 A7-201 页) |
| 0001 | 按位异或 | EOR(寄存器)(第 A7-233 页) |
| 0010 | 逻辑左移 | LSL(寄存器)(第 A7-283 页) |
| 0011 | 逻辑右移 | LSR(寄存器)(第 A7-285 页) |
| 0100 | 算术右移 | ASR(寄存器)(第 A7-204 页) |
| 0101 | 带进位加法 | ADC(寄存器)(第 A7-188 页) |
| 0110 | 带借位减法 | SBC(寄存器)(第 A7-347 页) |
| 0111 | 循环右移 | ROR(寄存器)(第 A7-339 页) |
| 1000 | 设置按位与的标志 | TST(寄存器)(第 A7-420 页) |
| 1001 | 从 0 逆向减法 | RSB(立即数)(第 A7-341 页) |
| 1010 | 比较寄存器 | CMP(寄存器)(第 A7-224 页) |
| 1011 | 比较取负 | CMN(寄存器)(第 A7-222 页) |
| 1100 | 逻辑或 | ORR(寄存器)(第 A7-310 页) |
| 1101 | 两个寄存器相乘 | MUL(第 A7-302 页) |
| 1110 | 位清零 | BIC(寄存器)(第 A7-210 页) |
| 1111 | 按位取反 | MVN(寄存器)(第 A7-304 页) |
2.3. 特殊数据处理指令及分支与交换¶
特殊数据处理指令以及分支与交换指令的编码为:

表 A5-4 列出了此空间中编码的分配情况。
| opcode | 指令 | 参见 |
|---|---|---|
| 00xx | 寄存器加法 | ADD(寄存器)(第 A7-192 页) |
| 0100 | UNPREDICTABLE | - |
| 0101 | 比较寄存器 | CMP(寄存器)(第 A7-224 页) |
| 011x 10xx |
移动寄存器 | MOV(寄存器)(第 A7-293 页) |
| 110x | 分支与交换 | BX(第 A7-215 页) |
| 111x | 带链接与交换的分支 | BLX(寄存器)(第 A7-214 页) |
2.4. 加载/存储单个数据项¶
加载/存储单个数据项指令的编码为:

这些指令在 opA 中取下列值之一:
0b0101。0b011x。0b100x。
表 A5-5 列出了此空间中编码的分配情况。
| opA | opB | 指令 | 参见 |
|---|---|---|---|
| 0101 | 000 | 存储寄存器 | STR(寄存器)(第 A7-388 页) |
| 0101 | 001 | 存储半字寄存器 | STRH(寄存器)(第 A7-399 页) |
| 0101 | 010 | 存储字节寄存器 | STRB(寄存器)(第 A7-391 页) |
| 0101 | 011 | 加载有符号字节寄存器 | LDRSB(寄存器)(第 A7-273 页) |
| 0101 | 100 | 加载寄存器 | LDR(寄存器)(第 A7-250 页) |
| 0101 | 101 | 加载半字寄存器 | LDRH(寄存器)(第 A7-267 页) |
| 0101 | 110 | 加载字节寄存器 | LDRB(寄存器)(第 A7-255 页) |
| 0101 | 111 | 加载有符号半字寄存器 | LDRSH(寄存器)(第 A7-278 页) |
| 0110 | 0xx | 存储寄存器 | STR(立即数)(第 A7-386 页) |
| 0110 | 1xx | 加载寄存器 | LDR(立即数)(第 A7-246 页) |
| 0111 | 0xx | 存储字节寄存器 | STRB(立即数)(第 A7-389 页) |
| 0111 | 1xx | 加载字节寄存器 | LDRB(立即数)(第 A7-252 页) |
| 1000 | 0xx | 存储半字寄存器 | STRH(立即数)(第 A7-397 页) |
| 1000 | 1xx | 加载半字寄存器 | LDRH(立即数)(第 A7-264 页) |
| 1001 | 0xx | SP 相对存储寄存器 | STR(立即数)(第 A7-386 页) |
| 1001 | 1xx | SP 相对加载寄存器 | LDR(立即数)(第 A7-246 页) |
2.5. 杂项 16 位指令¶
杂项 16 位指令的编码为:

表 A5-6 列出了此空间中编码的分配情况。此空间中的其他编码为 UNDEFINED。
| opcode | 指令 | 参见 |
|---|---|---|
| 0110011 | 更改处理器状态 | CPS(第 B5-673 页) |
| 00000xx | 立即数加到 SP | ADD(SP 加立即数)(第 A7-194 页) |
| 00001xx | 从 SP 减去立即数 | SUB(SP 减立即数)(第 A7-406 页) |
| 0001xxx | 为零则比较并分支 | CBNZ, CBZ(第 A7-216 页) |
| 001000x | 有符号半字扩展 | SXTH(第 A7-415 页) |
| 001001x | 有符号字节扩展 | SXTB(第 A7-413 页) |
| 001010x | 无符号半字扩展 | UXTH(第 A7-454 页) |
| 001011x | 无符号字节扩展 | UXTB(第 A7-452 页) |
| 0011xxx | 为零则比较并分支 | CBNZ, CBZ(第 A7-216 页) |
| 010xxxx | 压入多个寄存器 | PUSH(第 A7-322 页) |
| 1001xxx | 为非零则比较并分支 | CBNZ, CBZ(第 A7-216 页) |
| 101000x | 字内字节序反转 | REV(第 A7-335 页) |
| 101001x | 打包半字内字节序反转 | REV16(第 A7-336 页) |
| 101011x | 有符号半字字节序反转 | REVSH(第 A7-337 页) |
| 1011xxx | 为非零则比较并分支 | CBNZ, CBZ(第 A7-216 页) |
| 110xxxx | 弹出多个寄存器 | POP(第 A7-319 页) |
| 1110xxx | 断点 | BKPT(第 A7-212 页) |
| 1111xxx | If-Then 与提示 | If-Then 与提示(第 A5-135 页) |
2.5.1. If-Then 与提示¶
If-Then 指令以及提示指令的编码为:

表 A5-7 列出了此空间中编码的分配情况。
此空间中的其他编码是未分配的提示。它们执行时表现为 NOP,但软件不得使用它们。
| opA | opB | 指令 | 参见 |
|---|---|---|---|
| xxxx | not 0000 | If-Then | IT(第 A7-236 页) |
| 0000 | 0000 | 空操作提示 | NOP(第 A7-306 页) |
| 0001 | 0000 | 让出提示 | YIELD(第 A7-506 页) |
| 0010 | 0000 | 等待事件提示 | WFE(第 A7-504 页) |
| 0011 | 0000 | 等待中断提示 | WFI(第 A7-505 页) |
| 0100 | 0000 | 发送事件提示 | SEV(第 A7-352 页) |
2.6. 条件分支与主管调用¶
条件分支和主管调用指令的编码为:

表 A5-8 列出了此空间中编码的分配情况。
| opcode | 指令 | 参见 |
|---|---|---|
| not 111x | 条件分支 | B(第 A7-205 页) |
| 1110 | 永久 UNDEFINED | UDF(第 A7-425 页) |
| 1111 | 主管调用 | SVC(第 A7-409 页) |
3. 32 位 Thumb 指令编码¶
32 位 Thumb 指令的编码为:

op1 != 0b00。如果 op1 == 0b00,则编码的是 16 位指令,参见第 A5-129 页的 16 位 Thumb 指令编码。
表 A5-9 列出了此空间中 Armv7-M Thumb 编码的分配情况。
| op1 | op2 | op | 指令类别 |
|---|---|---|---|
| 01 | 00xx0xx | x | 加载多个和存储多个(第 A5-144 页) |
| 01 | 00xx1xx | x | 加载/存储双字或独占、表分支(第 A5-145 页) |
| 01 | 01xxxxx | x | 数据处理(移位寄存器)(第 A5-150 页) |
| 01 | 1xxxxxx | x | 协处理器指令(第 A5-158 页) |
| 10 | x0xxxxx | 0 | 数据处理(修改的立即数)(第 A5-138 页) |
| 10 | x1xxxxx | 0 | 数据处理(纯二进制立即数)(第 A5-141 页) |
| 10 | xxxxxxx | 1 | 分支和杂项控制(第 A5-142 页) |
| 11 | 000xxx0 | x | 存储单个数据项(第 A5-149 页) |
| 11 | 00xx001 | x | 加载字节、内存提示(第 A5-148 页) |
| 11 | 00xx011 | x | 加载半字、内存提示(第 A5-147 页) |
| 11 | 00xx101 | x | 加载字(第 A5-146 页) |
| 11 | 00xx111 | x | UNDEFINED |
| 11 | 010xxxx | x | 数据处理(寄存器)(第 A5-152 页) |
| 11 | 0110xxx | x | 乘法、乘累加和绝对差(第 A5-156 页) |
| 11 | 0111xxx | x | 长乘法、长乘累加和除法(第 A5-156 页) |
| 11 | 1xxxxxx | x | 协处理器指令(第 A5-158 页) |
3.1. 数据处理(修改的立即数)¶
数据处理(修改的立即数)指令的编码为:

表 A5-10 列出了此空间中编码的分配情况。此空间中的其他编码为 UNDEFINED。
这些指令都使用修改的立即数常量,而不是简单的 12 位二进制数。这提供了更有用的取值范围。详细信息参见第 A5-139 页的 Thumb 指令中的修改的立即数常量。
| op | Rn | Rd | 指令 | 参见 |
|---|---|---|---|---|
| 0000x | not 1111 | 按位与 | AND(立即数)(第 A7-200 页) |
|
| 0000x | 1111 | 测试 | TST(立即数)(第 A7-419 页) |
|
| 0001x | 位清零 | BIC(立即数)(第 A7-209 页) |
||
| 0010x | not 1111 | 按位或 | ORR(立即数)(第 A7-309 页) |
|
| 0010x | 1111 | 移动 | MOV(立即数)(第 A7-291 页) |
|
| 0011x | not 1111 | 按位或非 | ORN(立即数)(第 A7-307 页) |
|
| 0011x | 1111 | 按位取反 | MVN(立即数)(第 A7-303 页) |
|
| 0100x | not 1111 | 按位异或 | EOR(立即数)(第 A7-232 页) |
|
| 0100x | 1111 | 测试等价 | TEQ(立即数)(第 A7-417 页) |
|
| 1000x | not 1111 | 加法 | ADD(立即数)(第 A7-190 页) |
|
| 1000x | 1111 | 比较取负 | CMN(立即数)(第 A7-221 页) |
|
| 1010x | 带进位加法 | ADC(立即数)(第 A7-187 页) |
||
| 1011x | 带借位减法 | SBC(立即数)(第 A7-346 页) |
||
| 1101x | not 1111 | 减法 | SUB(立即数)(第 A7-402 页) |
|
| 1101x | 1111 | 比较 | CMP(立即数)(第 A7-223 页) |
|
| 1110x | 逆向减法 | RSB(立即数)(第 A7-341 页) |
3.2. Thumb 指令中的修改的立即数常量¶
Thumb 指令中修改的立即数常量的编码为:

表 A5-11 列出了 Thumb 数据处理指令中可用的修改的立即数常量的范围,以及它们在指令的 a、b、c、d、e、f、g、h、i 和 imm3 字段中的编码方式。
| i:imm3:a | <const>ᵃ |
|---|---|
| 0000x | 00000000 00000000 00000000 abcdefgh |
| 0001x | 00000000 abcdefgh 00000000 abcdefghᵇ |
| 0010x | abcdefgh 00000000 abcdefgh 00000000ᵇ |
| 0011x | abcdefgh abcdefgh abcdefgh abcdefghᵇ |
| 01000 | 1bcdefgh 00000000 00000000 00000000 |
| 01001 | 01bcdefgh0000000 00000000 00000000 |
| 01010 | 001bcdefgh000000 00000000 00000000 |
| 01011 | 0001bcdefgh00000 00000000 00000000 |
| … | 8 位值移位到其他位置 |
| 11101 | 00000000 00000000 000001bc defgh000 |
| 11110 | 00000000 00000000 0000001b cdefgh00 |
| 11111 | 00000000 00000000 00000001 bcdefgh0 |
a. 本表中立即常量的值以二进制形式给出,以便将 abcdefgh 与编码图对应起来。在汇编语法中,立即数按常规方式指定(默认为十进制数)。
b. 如果 abcdefgh == 00000000,则为 UNPREDICTABLE。
进位输出
i:imm3:a 形式为 00xxx 的逻辑操作不影响进位标志。否则,设置标志的逻辑操作会将进位标志设置为修改的立即数常量的 bit[31]。
修改的立即数常量的运算
// ThumbExpandImm()
// ================
bits(32) ThumbExpandImm(bits(12) imm12)
// 调用下列函数时传入的 APSR.C 参数不影响 imm32 结果。
(imm32, -) = ThumbExpandImm_C(imm12, APSR.C);
return imm32;
// ThumbExpandImm_C()
// ==================
(bits(32), bit) ThumbExpandImm_C(bits(12) imm12, bit carry_in)
if imm12<11:10> == '00' then
case imm12<9:8> of
when '00'
imm32 = ZeroExtend(imm12<7:0>, 32);
when '01'
if imm12<7:0> == '00000000' then UNPREDICTABLE;
imm32 = '00000000' : imm12<7:0> : '00000000' : imm12<7:0>;
when '10'
if imm12<7:0> == '00000000' then UNPREDICTABLE;
imm32 = imm12<7:0> : '00000000' : imm12<7:0> : '00000000';
when '11'
if imm12<7:0> == '00000000' then UNPREDICTABLE;
imm32 = imm12<7:0> : imm12<7:0> : imm12<7:0> : imm12<7:0>;
carry_out = carry_in;
else
unrotated_value = ZeroExtend('1':imm12<6:0>, 32);
(imm32, carry_out) = ROR_C(unrotated_value, UInt(imm12<11:7>));
return (imm32, carry_out);
3.3. 数据处理(纯二进制立即数)¶
数据处理(纯二进制立即数)指令的编码为:

表 A5-12 列出了此空间中编码的分配情况。此空间中的其他编码为 UNDEFINED。
| op | Rn | 指令 | 参见 | Variant |
|---|---|---|---|---|
| 00000 | not 1111 | 宽加法,12 位 | ADD(立即数)(第 A7-190 页) |
全部 |
| 00000 | 1111 | 生成 PC 相对地址 | ADR(第 A7-198 页) |
全部 |
| 00100 | - | 宽移动,16 位 | MOV(立即数)(第 A7-291 页) |
全部 |
| 01010 | not 1111 | 宽减法,12 位 | SUB(立即数)(第 A7-402 页) |
全部 |
| 01010 | 1111 | 生成 PC 相对地址 | ADR(第 A7-198 页) |
全部 |
| 01100 | - | 移动高半字,16 位 | MOVT(第 A7-296 页) |
全部 |
| 10000 10010ᵃ |
- | 有符号饱和 | SSAT(第 A7-375 页) |
全部 |
| 10010ᵇ | - | 有符号饱和,两个 16 位 | SSAT16(第 A7-376 页) |
v7E-M |
| 10100 | - | 有符号位段提取 | SBFX(第 A7-349 页) |
全部 |
| 10110 | not 1111 | 位段插入 | BFI(第 A7-208 页) |
全部 |
| 10110 | 1111 | 位段清零 | BFC(第 A7-207 页) |
全部 |
| 11000 11010ᵃ |
- | 无符号饱和 | USAT(第 A7-444 页) |
全部 |
| 11010ᵇ | - | 无符号饱和 16 | USAT16(第 A7-445 页) |
v7E-M |
| 11100 | - | 无符号位段提取 | UBFX(第 A7-424 页) |
全部 |
a. 在指令的第二个半字中,bits[14:12.7:6] != 0b00000。
b. 在指令的第二个半字中,bits[14:12.7:6] == 0b00000。
3.4. 分支和杂项控制¶
分支和杂项控制指令的行为为:

表 A5-13 列出了此空间中编码的分配情况。此空间中的其他编码为 UNDEFINED。
| op1 | op | 指令 | 参见 |
|---|---|---|---|
| 0x0 | not x111xxx | 条件分支 | B(第 A7-205 页) |
| 0x0 | 011100x | 移动到特殊寄存器 | MSR(第 A7-301 页) |
| 0x0 | 0111010 | - | 提示指令(第 A5-143 页) |
| 0x0 | 0111011 | - | 杂项控制指令(第 A5-143 页) |
| 0x0 | 011111x | 从特殊寄存器移动 | MRS(第 A7-300 页) |
| 010 | 1111111 | 永久 UNDEFINED | UDF(第 A7-425 页) |
| 0x1 | xxxxxxx | 分支 | B(第 A7-205 页) |
| 1x1 | xxxxxxx | 带链接的分支 | BL(第 A7-213 页) |
3.4.1. 提示指令¶
32 位提示指令的编码为:

表 A5-14 列出了此空间中编码的分配情况。此空间中的其他编码是执行时表现为 NOP 的未分配提示。这些未分配的提示编码是保留的,软件不得使用它们。
| op1 | op2 | 指令 | 参见 |
|---|---|---|---|
| not 000 | xxxxxxxx | UNDEFINEDᵃ | - |
| 000 | 00000000 | 空操作提示 | NOP(第 A7-306 页) |
| 000 | 00000001 | 让出提示 | YIELD(第 A7-506 页) |
| 000 | 00000010 | 等待事件提示 | WFE(第 A7-504 页) |
| 000 | 00000011 | 等待中断提示 | WFI(第 A7-505 页) |
| 000 | 00000100 | 发送事件提示 | SEV(第 A7-352 页) |
| 000 | 00010100 | 推测数据消耗屏障 | CSDB(第 A7-228 页) |
| 000 | 1111xxxx | 调试提示 | DBG(第 A7-229 页) |
a. 在 Armv7-A 和 Armv7-R 体系结构配置中,这些编码提供 CPS 指令的 32 位形式。
3.4.2. 杂项控制指令¶
杂项控制指令的编码为:

表 A5-15 列出了此空间中编码的分配情况。在 Armv7-M 中,此空间中的其他编码为 UNDEFINED。
| opc | option | 指令 | 参见 |
|---|---|---|---|
| 0010 | 清除独占 | CLREX(第 A7-219 页) |
|
| 0100 | !=0x00 | 数据同步屏障 | DSB(第 A7-231 页) |
| 0100 | 0000 | 推测存储绕过屏障 | SSBB(第 A7-378 页) |
| 0100 | 0100 | 物理推测存储绕过屏障 | PSSBB(第 A7-321 页) |
| 0101 | 数据内存屏障 | DMB(第 A7-230 页) |
|
| 0110 | 指令同步屏障 | ISB(第 A7-235 页) |
3.5. 加载多个和存储多个¶
加载多个或存储多个指令的编码为:

表 A5-16 列出了此空间中编码的分配情况。此空间中的其他编码为 UNDEFINED。
| op | L | W:Rn | 指令 | 参见 |
|---|---|---|---|---|
| 01 | 0 | 存储多个(后增,空升序) | STM, STMIA, STMEA(第 A7-383 页) |
|
| 01 | 1 | not 11101 | 加载多个(后增,满降序) | LDM, LDMIA, LDMFD(第 A7-242 页) |
| 01 | 1 | 11101 | 从栈弹出多个寄存器 | POP(第 A7-319 页) |
| 10 | 0 | not 11101 | 存储多个(先减,满降序) | STMDB, STMFD(第 A7-385 页) |
| 10 | 0 | 11101 | 将多个寄存器压入栈 | PUSH(第 A7-322 页) |
| 10 | 1 | - | 加载多个(先减,空升序) | LDMDB, LDMEA(第 A7-244 页) |
3.6. 加载/存储双字或独占、表分支¶
加载/存储双字或独占指令以及表分支指令的编码为:

表 A5-17 列出了此空间中编码的分配情况。此空间中的其他编码为 UNDEFINED。
| op1 | op2 | op3 | 指令 | 参见 |
|---|---|---|---|---|
| 00 | 00 | xxxx | 存储独占寄存器 | STREX(第 A7-394 页) |
| 00 | 01 | xxxx | 加载独占寄存器 | LDREX(第 A7-261 页) |
| 0x | 10 | xxxx | 存储双字寄存器 | STRD(立即数)(第 A7-393 页) |
| 1x | x0 | xxxx | 存储双字寄存器 | STRD(立即数)(第 A7-393 页) |
| 0x | 11 | xxxx | 加载双字寄存器 | LDRD(立即数)(第 A7-257 页)、LDRD(字面量)(第 A7-259 页) |
| 1x | x1 | xxxx | 加载双字寄存器 | LDRD(立即数)(第 A7-257 页)、LDRD(字面量)(第 A7-259 页) |
| 01 | 00 | 0100 | 存储独占字节寄存器 | STREXB(第 A7-395 页) |
| 01 | 00 | 0101 | 存储独占半字寄存器 | STREXH(第 A7-396 页) |
| 01 | 01 | 0000 | 表分支(字节) | TBB, TBH(第 A7-416 页) |
| 01 | 01 | 0001 | 表分支(半字) | TBB, TBH(第 A7-416 页) |
| 01 | 01 | 0100 | 加载独占字节寄存器 | LDREXB(第 A7-262 页) |
| 01 | 01 | 0101 | 加载独占半字寄存器 | LDREXH(第 A7-263 页) |
3.7. 加载字¶
加载字指令的编码为:

表 A5-18 列出了此空间中编码的分配情况。此空间中的其他编码为 UNDEFINED。
| op1 | op2 | Rn | 指令 | 参见 |
|---|---|---|---|---|
| 01 | xxxxxx | not 1111 | 加载寄存器 | LDR(立即数)(第 A7-246 页) |
| 00 | 1xx1xx | not 1111 | 加载寄存器 | LDR(立即数)(第 A7-246 页) |
| 00 | 1100xx | not 1111 | 加载寄存器 | LDR(立即数)(第 A7-246 页) |
| 00 | 1110xx | not 1111 | 非特权加载寄存器 | LDRT(第 A7-281 页) |
| 00 | 000000 | not 1111 | 加载寄存器 | LDR(寄存器)(第 A7-250 页) |
| 0x | xxxxxx | 1111 | 加载寄存器 | LDR(字面量)(第 A7-248 页) |
3.8. 加载半字、内存提示¶
加载半字指令以及未分配的内存提示的编码为:

表 A5-19 列出了此空间中编码的分配情况。此空间中的其他编码为 UNDEFINED。
| op1 | op2 | Rn | Rt | 指令 | 参见 |
|---|---|---|---|---|---|
| 0x | xxxxxx | 1111 | not 1111 | 加载半字寄存器 | LDRH(字面量)(第 A7-266 页) |
| 00 | 1xx1xx | not 1111 | not 1111 | 加载半字寄存器 | LDRH(立即数)(第 A7-264 页) |
| 00 | 1100xx | not 1111 | not 1111 | 加载半字寄存器 | LDRH(立即数)(第 A7-264 页) |
| 01 | xxxxxx | not 1111 | not 1111 | 加载半字寄存器 | LDRH(立即数)(第 A7-264 页) |
| 00 | 000000 | not 1111 | not 1111 | 加载半字寄存器 | LDRH(寄存器)(第 A7-267 页) |
| 00 | 1110xx | not 1111 | not 1111 | 非特权加载半字寄存器 | LDRHT(第 A7-269 页) |
| 00 | 000000 | not 1111 | 1111 | 未分配的内存提示,视为 NOPᵃ | - |
| 00 | 1100xx | not 1111 | 1111 | 未分配的内存提示,视为 NOPᵃ | - |
| 01 | xxxxxx | not 1111 | 1111 | 未分配的内存提示,视为 NOPᵃ | - |
| 00 | 1xx1xx | not 1111 | 1111 | UNPREDICTABLE | - |
| 00 | 1110xx | not 1111 | 1111 | UNPREDICTABLE | - |
| 0x | xxxxxx | 1111 | 1111 | UNPREDICTABLE | - |
| 10 | 1xx1xx | not 1111 | not 1111 | 加载有符号半字寄存器 | LDRSH(立即数)(第 A7-275 页) |
| 10 | 1100xx | not 1111 | not 1111 | 加载有符号半字寄存器 | LDRSH(立即数)(第 A7-275 页) |
| 11 | xxxxxx | not 1111 | not 1111 | 加载有符号半字寄存器 | LDRSH(立即数)(第 A7-275 页) |
| 1x | xxxxxx | 1111 | not 1111 | 加载有符号半字寄存器 | LDRSH(字面量)(第 A7-277 页) |
| 10 | 000000 | not 1111 | not 1111 | 加载有符号半字寄存器 | LDRSH(寄存器)(第 A7-278 页) |
| 10 | 1110xx | not 1111 | not 1111 | 非特权加载有符号半字寄存器 | LDRSHT(第 A7-280 页) |
| 10 | 000000 | not 1111 | 1111 | 未分配的内存提示,视为 NOPᵃ | - |
| 10 | 1100xx | not 1111 | 1111 | 未分配的内存提示,视为 NOPᵃ | - |
| 1x | xxxxxx | 1111 | 1111 | 未分配的内存提示,视为 NOPᵃ | - |
| 10 | 1xx1xx | not 1111 | 1111 | unpredictable | - |
| 10 | 1110xx | not 1111 | 1111 | unpredictable | - |
| 11 | xxxxxx | not 1111 | 1111 | 未分配的内存提示,视为 NOPᵃ | - |
a. 软件不得使用这些编码。
3.9. 加载字节、内存提示¶
加载字节指令以及内存提示的编码为:

表 A5-20 列出了此空间中编码的分配情况。此空间中的其他编码为 UNDEFINED。
| op1 | op2 | Rn | Rt | 指令 | 参见 |
|---|---|---|---|---|---|
| 0x | xxxxxx | 1111 | not 1111 | 加载字节寄存器 | LDRB(字面量)(第 A7-254 页) |
| 01 | xxxxxx | not 1111 | not 1111 | 加载字节寄存器 | LDRB(立即数)(第 A7-252 页) |
| 00 | 1xx1xx | not 1111 | not 1111 | 加载字节寄存器 | LDRB(立即数)(第 A7-252 页) |
| 00 | 1100xx | not 1111 | not 1111 | 加载字节寄存器 | LDRB(立即数)(第 A7-252 页) |
| 00 | 1110xx | not 1111 | not 1111 | 非特权加载字节寄存器 | LDRBT(第 A7-256 页) |
| 00 | 000000 | not 1111 | not 1111 | 加载字节寄存器 | LDRB(寄存器)(第 A7-255 页) |
| 1x | xxxxxx | 1111 | not 1111 | 加载有符号字节寄存器 | LDRSB(字面量)(第 A7-272 页) |
| 11 | xxxxxx | not 1111 | not 1111 | 加载有符号字节寄存器 | LDRSB(立即数)(第 A7-270 页) |
| 10 | 1xx1xx | not 1111 | not 1111 | 加载有符号字节寄存器 | LDRSB(立即数)(第 A7-270 页) |
| 10 | 1100xx | not 1111 | not 1111 | 加载有符号字节寄存器 | LDRSB(立即数)(第 A7-270 页) |
| 10 | 1110xx | not 1111 | not 1111 | 非特权加载有符号字节寄存器 | LDRSBT(第 A7-274 页) |
| 10 | 000000 | not 1111 | not 1111 | 加载有符号字节寄存器 | LDRSB(寄存器)(第 A7-273 页) |
| 0x | xxxxxx | 1111 | 1111 | 预加载数据 | PLD(字面量)(第 A7-314 页) |
| 00 | 1100xx | not 1111 | 1111 | 预加载数据 | PLD(立即数)(第 A7-313 页) |
| 01 | xxxxxx | not 1111 | 1111 | 预加载数据 | PLD(立即数)(第 A7-313 页) |
| 00 | 000000 | not 1111 | 1111 | 预加载数据 | PLD(寄存器)(第 A7-315 页) |
| 00 | 1xx1xx | not 1111 | 1111 | UNPREDICTABLE | - |
| 00 | 1110xx | not 1111 | 1111 | UNPREDICTABLE | - |
| 1x | xxxxxx | 1111 | 1111 | 预加载指令 | PLI(立即数,字面量)(第 A7-316 页) |
| 11 | xxxxxx | not 1111 | 1111 | 预加载指令 | PLI(立即数,字面量)(第 A7-316 页) |
| 10 | 1100xx | not 1111 | 1111 | 预加载指令 | PLI(立即数,字面量)(第 A7-316 页) |
| 10 | 000000 | not 1111 | 1111 | 预加载指令 | PLI(寄存器)(第 A7-318 页) |
| 10 | 1xx1xx | not 1111 | 1111 | UNPREDICTABLE | - |
| 10 | 1110xx | not 1111 | 1111 | UNPREDICTABLE | - |
3.10. 存储单个数据项¶
存储单个数据项指令的编码为:

表 A5-21 列出了此空间中编码的分配情况。此空间中的其他编码为 UNDEFINED。
| op1 | op2 | 指令 | 参见 |
|---|---|---|---|
| 100 | xxxxxx | 存储字节寄存器 | STRB(立即数)(第 A7-389 页) |
| 000 | 1xxxxx | 存储字节寄存器 | STRB(立即数)(第 A7-389 页) |
| 000 | 0xxxxx | 存储字节寄存器 | STRB(寄存器)(第 A7-391 页) |
| 101 | xxxxxx | 存储半字寄存器 | STRH(立即数)(第 A7-397 页) |
| 001 | 1xxxxx | 存储半字寄存器 | STRH(立即数)(第 A7-397 页) |
| 001 | 0xxxxx | 存储半字寄存器 | STRH(寄存器)(第 A7-399 页) |
| 110 | xxxxxx | 存储寄存器 | STR(立即数)(第 A7-386 页) |
| 010 | 1xxxxx | 存储寄存器 | STR(立即数)(第 A7-386 页) |
| 010 | 0xxxxx | 存储寄存器 | STR(寄存器)(第 A7-388 页) |
3.11. 数据处理(移位寄存器)¶
数据处理(移位寄存器)指令的编码为:

表 A5-22 列出了此空间中编码的分配情况。此空间中的其他编码为 UNDEFINED。
| op | Rn | Rd | S | 指令 | 参见 | Variant |
|---|---|---|---|---|---|---|
| 0000 | - | not 1111 | x | 按位与 | AND(寄存器)(第 A7-201 页) |
全部 |
| 0000 | - | 1111 | 0 | UNPREDICTABLE | - | - |
| 0000 | - | 1111 | 1 | 测试 | TST(寄存器)(第 A7-420 页) |
全部 |
| 0001 | - | - | - | 位清零 | BIC(寄存器)(第 A7-210 页) |
全部 |
| 0010 | not 1111 | - | - | 按位或 | ORR(寄存器)(第 A7-310 页) |
全部 |
| 0010 | 1111 | - | - | 移动寄存器和立即数移位(第 A5-150 页) | - | - |
| 0011 | not 1111 | - | - | 按位或非 | ORN(寄存器)(第 A7-308 页) |
全部 |
| 0011 | 1111 | - | - | 按位取反 | MVN(寄存器)(第 A7-304 页) |
全部 |
| 0100 | - | not 1111 | - | 按位异或 | EOR(寄存器)(第 A7-233 页) |
全部 |
| 0100 | - | 1111 | 0 | UNPREDICTABLE | - | - |
| 0100 | - | 1111 | 1 | 测试等价 | TEQ(寄存器)(第 A7-418 页) |
全部 |
| 0110 | - | - | - | 打包半字 | PKHBT, PKHTB(第 A7-312 页) |
v7E-M |
| 1000 | - | not 1111 | - | 加法 | ADD(寄存器)(第 A7-192 页) |
全部 |
| 1000 | - | 1111 | 0 | UNPREDICTABLE | - | - |
| 1000 | - | 1111 | 1 | 比较取负 | CMN(寄存器)(第 A7-222 页) |
全部 |
| 1010 | - | - | - | 带进位加法 | ADC(寄存器)(第 A7-188 页) |
全部 |
| 1011 | - | - | - | 带借位减法 | SBC(寄存器)(第 A7-347 页) |
全部 |
| 1101 | - | not 1111 | - | 减法 | SUB(寄存器)(第 A7-404 页) |
全部 |
| 1101 | - | 1111 | 0 | UNPREDICTABLE | - | - |
| 1101 | - | 1111 | 1 | 比较 | CMP(寄存器)(第 A7-224 页) |
全部 |
| 1110 | - | - | - | 逆向减法 | RSB(寄存器)(第 A7-342 页) |
全部 |
3.11.1. 移动寄存器和立即数移位¶
移动寄存器和立即数移位指令的编码为:

表 A5-23 列出了此空间中编码的分配情况。
| type | imm3:imm2 | 指令 | 参见 |
|---|---|---|---|
| 00 | 00000 | 移动 | MOV(寄存器)(第 A7-293 页) |
| 00 | not 00000 | 逻辑左移 | LSL(立即数)(第 A7-282 页) |
| 01 | - | 逻辑右移 | LSR(立即数)(第 A7-284 页) |
| 10 | - | 算术右移 | ASR(立即数)(第 A7-203 页) |
| 11 | 00000 | 带扩展的循环右移 | RRX(第 A7-340 页) |
| 11 | not 00000 | 循环右移 | ROR(立即数)(第 A7-338 页) |
3.12. 数据处理(寄存器)¶
数据处理(寄存器)指令的编码为:

如果在指令的第二个半字中 bits[15:12] != 0b1111,则该指令为 UNDEFINED。
表 A5-24 列出了此空间中编码的分配情况。此空间中的其他编码为 UNDEFINED。
| op1 | op2 | Rn | 指令 | 参见 | Variant |
|---|---|---|---|---|---|
| 000x | 0000 | 逻辑左移 | LSL(寄存器)(第 A7-283 页) |
全部 | |
| 001x | 0000 | 逻辑右移 | LSR(寄存器)(第 A7-285 页) |
全部 | |
| 010x | 0000 | 算术右移 | ASR(寄存器)(第 A7-204 页) |
全部 | |
| 011x | 0000 | 循环右移 | ROR(寄存器)(第 A7-339 页) |
全部 | |
| 0000 | 1xxx | not 1111 | 有符号半字扩展并相加 | SXTAH(第 A7-412 页) |
v7E-M |
| 0000 | 1xxx | 1111 | 有符号半字扩展 | SXTH(第 A7-415 页) |
全部 |
| 0001 | 1xxx | not 1111 | 无符号半字扩展并相加 | UXTAH(第 A7-451 页) |
v7E-M |
| 0001 | 1xxx | 1111 | 无符号半字扩展 | UXTH(第 A7-454 页) |
全部 |
| 0010 | 1xxx | not 1111 | 有符号字节 16 扩展并相加 | SXTAB16(第 A7-411 页) |
v7E-M |
| 0010 | 1xxx | 1111 | 有符号字节 16 扩展 | SXTB16(第 A7-414 页) |
v7E-M |
| 0011 | 1xxx | not 1111 | 无符号字节 16 扩展并相加 | UXTAB16(第 A7-450 页) |
v7E-M |
| 0011 | 1xxx | 1111 | 无符号字节 16 扩展 | UXTB16(第 A7-453 页) |
v7E-M |
| 0100 | 1xxx | not 1111 | 有符号字节扩展并相加 | SXTAB(第 A7-410 页) |
v7E-M |
| 0100 | 1xxx | 1111 | 有符号字节扩展 | SXTB(第 A7-413 页) |
全部 |
| 0101 | 1xxx | not 1111 | 无符号字节扩展并相加 | UXTAB(第 A7-449 页) |
v7E-M |
| 0101 | 1xxx | 1111 | 无符号字节扩展 | UXTB(第 A7-452 页) |
全部 |
| 1xxx | 00xx | - | 有符号并行加法和减法(第 A5-152 页) | - | - |
| 1xxx | 01xx | - | 无符号并行加法和减法(第 A5-153 页) | - | - |
| 10xx | 10xx | - | 杂项操作(第 A5-155 页) | - | - |
3.13. 并行加法和减法,有符号¶
有符号并行加法和减法指令的编码为:
如果在指令的第二个半字中 bits[15:12] != 0b1111,则该指令为 UNDEFINED。

表 A5-25 列出了此空间中编码的分配情况。此空间中的其他编码为 UNDEFINED。
| op1 | op2 | 指令 | 参见 | Variant |
|---|---|---|---|---|
| 001 | 00 | 16 位加法 | SADD16(第 A7-343 页) |
v7E-M |
| 010 | 00 | 加减 | SASX(第 A7-345 页) |
v7E-M |
| 110 | 00 | 减加 | SSAX(第 A7-377 页) |
v7E-M |
| 101 | 00 | 16 位减法 | SSUB16(第 A7-379 页) |
v7E-M |
| 000 | 00 | 8 位加法 | SADD8(第 A7-344 页) |
v7E-M |
| 100 | 00 | 8 位减法 | SSUB8(第 A7-380 页) |
v7E-M |
| 饱和指令 | ||||
| 001 | 01 | 饱和 16 位加法 | QADD16(第 A7-325 页) |
v7E-M |
| 010 | 01 | 饱和加减 | QASX(第 A7-327 页) |
v7E-M |
| 110 | 01 | 饱和减加 | QSAX(第 A7-330 页) |
v7E-M |
| 101 | 01 | 饱和 16 位减法 | QSUB16(第 A7-332 页) |
v7E-M |
| 000 | 01 | 饱和 8 位加法 | QADD8(第 A7-326 页) |
v7E-M |
| 100 | 01 | 饱和 8 位减法 | QSUB8(第 A7-333 页) |
v7E-M |
| 减半指令 | ||||
| 001 | 10 | 减半 16 位加法 | SHADD16(第 A7-353 页) |
v7E-M |
| 010 | 10 | 减半加减 | SHASX(第 A7-355 页) |
v7E-M |
| 110 | 10 | 减半减加 | SHSAX(第 A7-356 页) |
v7E-M |
| 101 | 10 | 减半 16 位减法 | SHSUB16(第 A7-357 页) |
v7E-M |
| 000 | 10 | 减半 8 位加法 | SHADD8(第 A7-354 页) |
v7E-M |
| 100 | 10 | 减半 8 位减法 | SHSUB8(第 A7-358 页) |
v7E-M |
3.14. 并行加法和减法,无符号¶
无符号并行加法和减法指令的编码为:
如果在指令的第二个半字中 bits[15:12] != 0b1111,则该指令为 UNDEFINED。

表 A5-26 列出了此空间中编码的分配情况。此空间中的其他编码为 UNDEFINED。
| op1 | op2 | 指令 | 参见 | Variant |
|---|---|---|---|---|
| 001 | 00 | 16 位加法 | UADD16(第 A7-421 页) |
v7E-M |
| 010 | 00 | 加减 | UASX(第 A7-423 页) |
v7E-M |
| 110 | 00 | 减加 | USAX(第 A7-446 页) |
v7E-M |
| 101 | 00 | 16 位减法 | USUB16(第 A7-447 页) |
v7E-M |
| 000 | 00 | 8 位加法 | UADD8(第 A7-422 页) |
v7E-M |
| 100 | 00 | 8 位减法 | USUB8(第 A7-448 页) |
v7E-M |
| 饱和指令 | ||||
| 001 | 01 | 饱和 16 位加法 | UQADD16(第 A7-436 页) |
v7E-M |
| 010 | 01 | 饱和加减 | UQASX(第 A7-438 页) |
v7E-M |
| 110 | 01 | 饱和减加 | UQSAX(第 A7-439 页) |
v7E-M |
| 101 | 01 | 饱和 16 位减法 | UQSUB16(第 A7-440 页) |
v7E-M |
| 000 | 01 | 饱和 8 位加法 | UQADD8(第 A7-437 页) |
v7E-M |
| 100 | 01 | 饱和 8 位减法 | UQSUB8(第 A7-441 页) |
v7E-M |
| 减半指令 | ||||
| 001 | 10 | 减半 16 位加法 | UHADD16(第 A7-427 页) |
v7E-M |
| 010 | 10 | 减半加减 | UHASX(第 A7-429 页) |
v7E-M |
| 110 | 10 | 减半减加 | UHSAX(第 A7-430 页) |
v7E-M |
| 101 | 10 | 减半 16 位减法 | UHSUB16(第 A7-431 页) |
v7E-M |
| 000 | 10 | 减半 8 位加法 | UHADD8(第 A7-428 页) |
v7E-M |
| 100 | 10 | 减半 8 位减法 | UHSUB8(第 A7-432 页) |
v7E-M |
3.15. 杂项操作¶
某些杂项指令的编码为:
如果在指令的第二个半字中 bits[15:12] != 0b1111,则该指令为 UNDEFINED。

表 A5-27 列出了此空间中编码的分配情况。此空间中的其他编码为 UNDEFINED。
| op1 | op2 | 指令 | 参见 | Variant |
|---|---|---|---|---|
| 00 | 00 | 饱和加法 | QADD(第 A7-324 页) |
v7E-M |
| 00 | 01 | 饱和加倍加法 | QDADD(第 A7-328 页) |
v7E-M |
| 00 | 10 | 饱和减法 | QSUB(第 A7-331 页) |
v7E-M |
| 00 | 11 | 饱和加倍减法 | QDSUB(第 A7-329 页) |
v7E-M |
| 01 | 00 | 字内字节序反转 | REV(第 A7-335 页) |
全部 |
| 01 | 01 | 打包半字内字节序反转 | REV16(第 A7-336 页) |
全部 |
| 01 | 10 | 位反转 | RBIT(第 A7-334 页) |
全部 |
| 01 | 11 | 有符号半字字节序反转 | REVSH(第 A7-337 页) |
全部 |
| 10 | 00 | 选择字节 | SEL(第 A7-351 页) |
v7E-M |
| 11 | 00 | 统计前导零个数 | CLZ(第 A7-220 页) |
全部 |
3.16. 乘法、乘累加和绝对差¶
乘法、乘累加和绝对差指令的编码为:
如果在指令的第二个半字中 bits[7:6] != 0b00,则该指令为 UNDEFINED。

表 A5-28 列出了此空间中编码的分配情况。此空间中的其他编码为 UNDEFINED。
| op1 | op2 | Ra | 指令 | 参见 | Variant |
|---|---|---|---|---|---|
| 000 | 00 | not 1111 | 乘累加 | MLA(第 A7-289 页) |
全部 |
| 000 | 00 | 1111 | 乘法 | MUL(第 A7-302 页) |
全部 |
| 000 | 01 | - | 乘减 | MLS(第 A7-290 页) |
全部 |
| 001 | - | not 1111 | 半字有符号乘累加 | SMLABB, SMLABT, SMLATB, SMLATT(第 A7-359 页) |
v7E-M |
| 001 | - | 1111 | 半字有符号乘法 | SMULBB, SMULBT, SMULTB, SMULTT(第 A7-371 页) |
v7E-M |
| 010 | 0x | not 1111 | 双路有符号乘累加 | SMLAD, SMLADX(第 A7-360 页) |
v7E-M |
| 010 | 0x | 1111 | 双路有符号乘加 | SMUAD, SMUADX(第 A7-370 页) |
v7E-M |
| 011 | 0x | not 1111 | 半字有符号乘累加(字 × 半字) | SMLAWB, SMLAWT(第 A7-364 页) |
v7E-M |
| 011 | 0x | 1111 | 半字有符号乘法(字 × 半字) | SMULWB, SMULWT(第 A7-373 页) |
v7E-M |
| 100 | 0x | not 1111 | 双路有符号乘减 | SMLSD, SMLSDX(第 A7-365 页) |
v7E-M |
| 100 | 0x | 1111 | 双路有符号乘减 | SMUSD, SMUSDX(第 A7-374 页) |
v7E-M |
| 101 | 0x | not 1111 | 有符号最高字乘累加 | SMMLA, SMMLAR(第 A7-367 页) |
v7E-M |
| 101 | 0x | 1111 | 有符号最高字乘法 | SMMUL, SMMULR(第 A7-369 页) |
v7E-M |
| 110 | 0x | - | 有符号最高字乘减 | SMMLS, SMMLSR(第 A7-368 页) |
v7E-M |
| 111 | 00 | 1111 | 无符号绝对差之和并累加 | USADA8(第 A7-443 页) |
v7E-M |
| 111 | 00 | not 1111 | 无符号绝对差之和 | USAD8(第 A7-442 页) |
v7E-M |
3.17. 长乘法、长乘累加和除法¶
长乘法、长乘累加和除法指令的编码为:

表 A5-29 列出了此空间中编码的分配情况。此空间中的其他编码为 UNDEFINED。
| op1 | op2 | 指令 | 参见 | Variant |
|---|---|---|---|---|
| 000 | 0000 | 有符号长乘法 | SMULL(第 A7-372 页) |
全部 |
| 001 | 1111 | 有符号除法 | SDIV(第 A7-350 页) |
全部 |
| 010 | 0000 | 无符号长乘法 | UMULL(第 A7-435 页) |
全部 |
| 011 | 1111 | 无符号除法 | UDIV(第 A7-426 页) |
全部 |
| 100 | 0000 | 有符号长乘累加 | SMLAL(第 A7-361 页) |
全部 |
| 10xx | 半字有符号长乘累加 | SMLALBB, SMLALBT, SMLALTB, SMLALTT(第 A7-362 页) |
v7E-M | |
| 110x | 双路有符号长乘累加 | SMLALD, SMLALDX(第 A7-363 页) |
v7E-M | |
| 101 | 110x | 双路有符号长乘减 | SMLSLD, SMLSLDX(第 A7-366 页) |
v7E-M |
| 110 | 0000 | 无符号长乘累加 | UMLAL(第 A7-434 页) |
全部 |
| 110 | 0110 | 无符号长乘双累加 | UMAAL(第 A7-433 页) |
v7E-M |
3.18. 协处理器指令¶
协处理器指令的编码为:

表 A5-30 列出了此空间中编码的分配情况。此空间中的其他编码为 UNDEFINED。
| op1 | op | coproc | 指令 | 参见 |
|---|---|---|---|---|
| 0xxxx0ᵃ | x | xxxx | 存储协处理器 | STC, STC2(第 A7-381 页) |
| 0xxxx1ᵃ | x | xxxx | 加载协处理器 | LDC, LDC2(立即数)(第 A7-238 页)、LDC, LDC2(字面量)(第 A7-240 页) |
| 000100 | x | xxxx | 从两个 Arm 内核寄存器移动到协处理器 | MCRR, MCRR2(第 A7-288 页) |
| 000101 | x | xxxx | 从协处理器移动到两个 Arm 内核寄存器 | MRRC, MRRC2(第 A7-299 页) |
| 10xxxx | 0 | xxxx | 协处理器数据操作 | CDP, CDP2(第 A7-217 页) |
| 10xxx0 | 1 | xxxx | 从 Arm 内核寄存器移动到协处理器 | MCR, MCR2(第 A7-286 页) |
| 10xxx1 | 1 | xxxx | 从协处理器移动到 Arm 内核寄存器 | MRC, MRC2(第 A7-297 页) |
a. 但不包括 000x0x。
注意: 仅当目标协处理器存在并在相应特权级别上使能了访问时,协处理器指令才会成功执行,否则会产生未定义指令 UsageFault,参见第 B3-614 页的 协处理器访问控制寄存器 CPACR。在所有其他情况下,协处理器指令会产生 UsageFault 异常,且 UFSR.NOCP 位被置为 1,参见第 B3-611 页的 UsageFault 状态寄存器 UFSR。