diff --git a/404.html b/404.html index 42f5dea..fa9f44e 100644 --- a/404.html +++ b/404.html @@ -24,7 +24,7 @@ - + @@ -469,6 +469,10 @@ div.csl-indent {
2021-10-30
+2021-10-31
处理器可访问的地址空间包括寄存器空间和系统内存空间。寄存器空间包括通用寄存器、专用寄存器和控制寄存器。寄存器空间通过编码于指令中的寄存器号寻址,系统内存空间通过访存指令中的访存地址寻址。
通用寄存器是处理器中最常用的存储单元,一个处理器周期可以同时读取多条指令需要的多个寄存器值。现代指令系统都定义了一定数量的通用寄存器供编译器进行充分的指令调度。针对浮点运算,通常还定义了浮点通用寄存器。表2.1给出了部分常见指令集中整数通用寄存器的数量。
-指令集 | 整数通用寄存器数 |
Itanium | 128 |
VAX | 16 |
ARMv8 | 31 |
PowerPC | 32 |
Alpha | 32(包括“zero”) |
SPARC | 32(包括“zero”) |
MIPS | 在mips16模式下为8,在32/64位模式下为32(包括“zero”) |
ARMv7 | 在16位Thumb 模式下为7,在32位模式下为14 |
X86 | 16/32位时为8, 64位时为16 |
LoongArch | 32(包括“zero”) |
指令集
整数通用寄存器数
Itanium
128
VAX
16
ARMv8
31
PowerPC
32
Alpha
32(包括“zero”)
SPARC
32(包括“zero”)
MIPS
在mips16模式下为8,在32/64位模式下为32(包括“zero”)
ARMv7
在16位Thumb 模式下为7,在32位模式下为14
X86
16/32位时为8, 64位时为16
LoongArch
32(包括“zero”)
除表2.4之外还可以列出很多其他寻址方式,但常用的寻址方式并不多。John L.Hennessy在其经典名著《计算机系统结构:量化研究方法(第二版)》中给出了如表2.5所示的数据,他在VAX计算机(VAX机的寻址方式比较丰富)上对SPEC CPU 1989中tex、spice和gcc这三个应用的寻址方式进行了统计。
-寻址方式 | tex | spice | gcc |
偏移量寻址 | 32% | 55% | 40% |
立即数寻址 | 43% | 17% | 39% |
寄存器间接寻址 | 24% | 3% | 11% |
自增量寻址 | 0% | 16% | 6% |
存储器间接寻址 | 1% | 6% | 1% |
寻址方式
tex
spice
gcc
偏移量寻址
32%
55%
40%
立即数寻址
43%
17%
39%
寄存器间接寻址
24%
3%
11%
自增量寻址
0%
16%
6%
存储器间接寻址
1%
6%
1%
2)ALU指令。ALU指令都是寄存器型的,常见的ALU指令包括加、减、乘、除、与、或、异或、移位和比较等。表2.8为LoongArch指令集的ALU指令实例。其中带有“.W”后缀的指令操作的数据位宽为32位(字),带有“.D”后缀的指令操作的数据位宽为64位(双字)。
-指令 | 指令功能 |
ADD.W | 字加 |
ADDI.W | 字加立即数 |
SUB.W | 字减 |
ADD.D | 双字加 |
ADDI.D | 双字加立即数 |
SUB.D | 双字减 |
SLT | 有符号数比较小于置1 |
SLTI | 有符号数立即数比较小于置1 |
SLTU | 无符号数比较小于置1 |
SLTUI | 无符号数立即数比较小于置1 |
AND | 与 |
OR | 或 |
XOR | 异或 |
NOR | 或非 |
ANDI | 与立即数 |
ORI | 或立即数 |
XORI | 异或立即数 |
LU12I.W | 加载20位立即数到高位 |
SLL.W | 字逻辑左移变量位 |
SRL.W | 字逻辑右移变量位 |
SRA.W | 字算术右移变量位 |
SLLI.W | 字逻辑左移常量位 |
SRLI.W | 字逻辑右移常量位 |
SRAI.W | 字算术右移常量位 |
SLL.D | 双字逻辑左移变量位 |
SRL.D | 双字逻辑右移变量位 |
SRA.D | 双字算术右移变量位 |
SLLI.D | 双字逻辑左移常量位 |
SRLI.D | 双字逻辑右移常量位 |
SRAI.D | 双字算术右移常量位 |
MUL.W | 字乘取低半部分 |
MULH.W | 有符号字乘取高半部分 |
MULH.WU | 无符号字乘取高半部分 |
MUL.D | 双字乘取低半部分 |
MULH.D | 有符号双字乘取高半部分 |
MULH.DU | 无符号双字乘取高半部分 |
DIV.W | 有符号字除取商 |
DIV.WU | 无符号字除取商 |
MOD.W | 有符号字除取余 |
MOD.WU | 无符号字除取余 |
DIV.D | 有符号双字除取商 |
DIV.DU | 无符号双字除取商 |
MOD.D | 有符号双字除取余 |
MOD.DU | 无符号双字除取余 |
指令
指令功能
ADD.W
字加
ADDI.W
字加立即数
SUB.W
字减
ADD.D
双字加
ADDI.D
双字加立即数
SUB.D
双字减
SLT
有符号数比较小于置1
SLTI
有符号数立即数比较小于置1
SLTU
无符号数比较小于置1
SLTUI
无符号数立即数比较小于置1
AND
与
OR
或
XOR
异或
NOR
或非
ANDI
与立即数
ORI
或立即数
XORI
异或立即数
LU12I.W
加载20位立即数到高位
SLL.W
字逻辑左移变量位
SRL.W
字逻辑右移变量位
SRA.W
字算术右移变量位
SLLI.W
字逻辑左移常量位
SRLI.W
字逻辑右移常量位
SRAI.W
字算术右移常量位
SLL.D
双字逻辑左移变量位
SRL.D
双字逻辑右移变量位
SRA.D
双字算术右移变量位
SLLI.D
双字逻辑左移常量位
SRLI.D
双字逻辑右移常量位
SRAI.D
双字算术右移常量位
MUL.W
字乘取低半部分
MULH.W
有符号字乘取高半部分
MULH.WU
无符号字乘取高半部分
MUL.D
双字乘取低半部分
MULH.D
有符号双字乘取高半部分
MULH.DU
无符号双字乘取高半部分
DIV.W
有符号字除取商
DIV.WU
无符号字除取商
MOD.W
有符号字除取余
MOD.WU
无符号字除取余
DIV.D
有符号双字除取商
DIV.DU
无符号双字除取商
MOD.D
有符号双字除取余
MOD.DU
无符号双字除取余
3)控制流指令。控制流指令分为绝对转移指令和相对转移指令。相对转移的目标地址是当前的PC值加上指令中的偏移量立即数;绝对转移的目标地址由寄存器或指令中的立即数给出。表2.9为LoongArch指令集中控制流指令的实例。
-指令 | 指令功能 |
JIRL | 相对寄存器偏移跳转并链接 |
B | 无条件相对转移 |
BL | 无条件相对转移并链接 |
BEQ | 等于时相对转移 |
BNE | 不等时相对转移 |
BLT | 有符号比较小于时相对转移 |
BGE | 有符号比较大于等于时相对转移 |
BLTU | 无符号比较小于时相对转移 |
BGEU | 无符号比较大于等于时相对转移 |
BEQZ | 等于0相对转移 |
BNEZ | 不等于0时相对转移 |
指令
指令功能
JIRL
相对寄存器偏移跳转并链接
B
无条件相对转移
BL
无条件相对转移并链接
BEQ
等于时相对转移
BNE
不等时相对转移
BLT
有符号比较小于时相对转移
BGE
有符号比较大于等于时相对转移
BLTU
无符号比较小于时相对转移
BGEU
无符号比较大于等于时相对转移
BEQZ
等于0相对转移
BNEZ
不等于0时相对转移
C代码 | LoongArch汇编 |
int st(int a, int b, int c) | st: |
C代码
LoongArch汇编
int st(int a, int b, int c)
{
switch (a) {
case 15:
c = b & 0xf;
case 10:
return c + 50;
case 12:
case 17:
return b + 50;
case 14:
return b;
default:
return a;
}
}
st:
addi.w $t0,$r0,14
beq $a0,$t0,.L7 //(a==14)?
blt $t0,$a0,.L3 //(a>14)?
addi.w $t0,$r0,10
beq $a0,$t0,.L4 //(a==10)?
addi.w $t0,$r0,12
beq $a0,$t0,.L5 //(a==12)?
jr $ra //return a
.L3:
addi.w $t0,$r0,15
beq $a0,$t0,.L6 //(a==15)?
addi.w $t0,$r0,17
beq $a0,$t0,.L5 //(a==17)?
jr $ra //return a
.L6:
andi $a2,$a1,0xf //b & 0xf
.L4:
addi.w $a0,$a2,50 //c + 50
jr $ra
.L5:
addi.w $a0,$a1,50 //b + 50
jr $ra
.L7:
or $a0,$a1,$r0 //return b
jr $ra