飞腾CPU体系结构(八)——标量访存指令
在阅读之前,请先查看《飞腾CPU体系结构(五)》的SIMD和浮点寄存器。飞腾CPU还提供了32个128 位SIMD和浮点寄存器,这32个128位寄存器可以作为标量寄存器使用,也可以作为向量寄存器来使用。
1. 标量访存指令
一共有0~31个标量寄存器,q/d/s/h/b分别表示128/64/32/16/8位的长度。标量访存指令的内存单元地址有按照长度对齐的要求。
标量访存指令可以有
- 常规单寄存器类型
ldr/str
长度 | 128 | 64 | 32 | 16 |
---|---|---|---|---|
读 | ldr q12, [x12, #-16] | ldr d12, [x12, #-8] | ldr s12, [x12, #-4] | ldr h12, [x12, #-2] |
写 | str q17, [x0] | str d17, [x0] | str s17, [x0] | str h17, [x0] |
- 偏移量为负的单寄存器类型
ldur/stur
,和ldr/str
类似,只不过立即数偏移量为负。 - 常规双寄存器类型
ldp/stp
- 面向流数据的双寄存器类型
ldnp/stnp
2. SIMD和浮点寄存器上下文的保存和恢复
- 汇编宏fpsimd_save
.macro fpsimd_save state, tmpnr
/*首先保存32个128位的SIMD和浮点寄存器*/
stp q0, q1, [\state, #16 * 0]
stp q2, q3, [\state, #16 * 2]
stp q4, q5, [\state, #16 * 4]
stp q6, q7, [\state, #16 * 6]
stp q8, q9, [\state, #16 * 8]
stp q10, q11, [\state, #16 * 10]
stp q12, q13, [\state, #16 * 12]
stp q14, q15, [\state, #16 * 14]
stp q16, q17, [\state, #16 * 16]
stp q18, q19, [\state, #16 * 18]
stp q20, q21, [\state, #16 * 20]
stp q22, q23, [\state, #16 * 22]
stp q24, q25, [\state, #16 * 24]
stp q26, q27, [\state, #16 * 26]
stp q28, q29, [\state, #16 * 28]
stp q30, q31, [\state, #16 * 30]!
/注意这条语句之后|state就更新了/
/*然后保存fpsr和fpcr寄存器,这是两个SIMD和浮点状态寄存器*/
mrs x\tmpnr, fpsr
str w\tmpnr, [\state, #16 * 2]
mrs x\tmpnr, fpcr
str w\tmpnr, [\state, #16 * 2 + 4]
.endm
- 汇编宏 fpsimd_restore
/*恢复fpcr寄存器的具体过程,如果内存保存值和寄存器fpcr值相同,就不修改寄存器fpcr的值*/
.macro fpsimd_restore_fpcr state, tmp
mrs \tmp, fpcr
cmp \tmp, \state
b.eq 9999f
msr fpcr, \state
9999:
.endm
.macro fpsimd_restore state, tmpnr
/*首先恢复32个128位的SIMD和浮点寄存器*/
ldp q0, q1, [\state, #16 * 0]
...此处省略
ldp q30, q31, [\state, #16 * 30]!
/
/*再恢复fpsr寄存器*/
ldr w\tmpnr, [\state, #16 * 2]
msr fpsr, x\tmpnr
/*最后恢复fpcr寄存器*/
ldr w\tmpnr, [\state, #16 * 2 + 4]
fpsimd_restore_fpcr x\tmpnr, \state
.endm
- 浮点状态寄存器fpsr
- 这是一个32位寄存器,EL0/1/2/3都是可读写的。
- 在AARCH64模式下,浮点类型比较结果会对处理器状态的NZCV位进行相应的设置,而不是在浮点状态寄存器fpsr中的NZCV位进行设置。
- 另外,该寄存器还包括:累积饱和位QC、
异常累积标志,这些标志常规情况下为零。输入异常累积位IDC
不精确异常累积位IXC
溢出异常累积位UFC
溢出异常累积位OFC
除零异常累积位DZC
无效操作异常累积位IOC
- 浮点控制寄存器fpcr
- 这是一个32位寄存器,EL0/1/2/3都是可读写的。
- 浮点控制寄存器fpcr尽量不要进行修改,修改可能触发“自同步”。
- 数据格式和控制模式位
半精度格式控制位AHP
默认NaN模式控制位DN
Flush到零模式控制位FZ
Rounding模式控制位RMode
- 控制异常累积发生时是否触发异常:IDE / IXE / UFE / OFE / DZE / IOE