在阅读之前,请先查看《飞腾CPU体系结构(五)》的SIMD和浮点寄存器。飞腾CPU还提供了32个128 位SIMD和浮点寄存器,这32个128位寄存器可以作为标量寄存器使用,也可以作为向量寄存器来使用。
一共有0~31个标量寄存器,q/d/s/h/b分别表示128/64/32/16/8位的长度。标量访存指令的内存单元地址有按照长度对齐的要求。
标量访存指令可以有
常规单寄存器类型ldr/str 长度128643216读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.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