5.4. 浮点访存指令
浮点访存指令与第03章介绍的普通整数访存指令功能相似,用于读取内存中的数据(访问),或把数据写入内存(存储)。这里的数据通常是浮点类型。浮点访存指令不包含原子访存形式,只分为浮点普通访存指令和浮点边界检查访存指令。
5.4.1. 浮点普通访存指令
浮点普通访存指令用于从指定内存地址读取一个单精度或双精度浮点数到寄存器,也可把一个单精度或双精度浮点数写入指定内存地址。LoongArch支持的浮点普通访存指令如表4-3所示。
表4-3中,fld.s、fldx.s、fst.s、fstx.s用于在内存和浮点寄存器fd的低32位之间传送一个32位数据,fd的高32位可以为任意值。fld.d、fldx.d、fst.d、fstx.d用于在内存和浮点寄存器fd之间传送一个64位数据。浮点访存地址有两种计算方式:基于常数的base+offset方式,即表中的rj+si12;基于寄存器的base+index方式,即表中的rj+rk。其中,si12表示12位有符号立即数。
5.4.2. 浮点边界检查访存指令
浮点边界检查访存指令与浮点普通访存指令一样,都用于从指定内存地址读取数据到寄存器,或把数据写入指定内存地址。区别在于,浮点边界检查访存指令在读写前会先进行条件检查,确认目标地址是否位于给定地址范围内;如果条件不满足,就终止读写并触发边界检查例外。LoongArch支持的浮点边界检查访存指令如表4-4所示。
Tip
浮点边界检查访存指令仅在LA64架构下支持。
表4-4中,指令名前缀gt表示只有当通用寄存器rj的值大于rk时,才从rj保存的内存地址读取一个单精度(后缀.s)或双精度(后缀.d)浮点数,并写入浮点寄存器fd;否则终止访存并触发边界检查例外。le与gt条件相反,表示只有当rj小于或等于rk时才执行访存,否则触发边界检查例外。对应用程序来说,触发边界检查例外时会收到段错误信号(SIGSEGV)。
第03章已经说明,整数边界检查访存指令可用于整数数组的安全索引,以便尽早发现数组下标越界。类似地,浮点边界检查访存指令也可用于浮点数组的安全访问,这里不再展开举例。