4.4. 其他杂项指令

除前文介绍的运算指令、访存指令和转移指令外,LoongArch还提供了一些用于特殊功能且较常用的指令。LoongArch支持的其他杂项指令如表3-10所示。

LoongArch支持的其他杂项指令

表3-10列出了几类功能不同的指令,下面分别说明。

4.4.1. 系统调用指令

处理器执行syscall指令后,会立即无条件触发系统调用例外,使程序进入内核态。操作数code携带的信息可作为例外处理例程的传递参数使用,通常设置为0即可。通过系统调用指令syscall,程序可以调用内核接口函数。

内核提供的更多接口功能及对应系统调用号,可以通过头文件unistd.h查看。后续章节也会进一步介绍系统调用规则。

4.4.2. 断点例外指令

断点例外指令break用于无条件触发断点例外。指令码中的code域携带例外类型信息,具体类型由当前操作系统的break.h文件定义。调试汇编代码时,break是一种常用且有效的调试手段。

4.4.3. 读取恒定频率计时器信息指令

龙芯指令系统定义了64位恒定频率计时器,称为StableCounter。每个StableCounter都有一个由软件配置的全局唯一编号,称为CounterID。每个处理器核对应一个恒定频率计时器。例如,龙芯3A5000系列处理器有4个核,因此CounterID编号范围为0~3。指令rdtime.d rd, rj用于读取StableCounter的值并写入rd,同时把CounterID写入rj。LA32架构使用rdtimel.w rd, rjrdtimeh.w rd, rj分别读取StableCounter的低32位和高32位。

4.4.4. 读取CPU特性指令

软件运行时,可以通过cpucfg指令动态识别当前处理器实现了龙芯架构中的哪些特性。这些特性保存在一组配置信息字中。cpucfg每次根据配置字号读取一组配置信息。龙芯架构支持的部分cpucfg配置字号及其对应信息如表3-11所示。

龙架构支持的CPUCFG部分配置字号和对应的配置信息

每个配置字号均为32位,可表示一个或多个CPU特性。例如,字号0只包含处理器标识这一项特性,位下标为[31:0],助记名称为PRID;字号1包含多个CPU特性,各特性分布在不同位上,如位下标[1:0]表示架构类型,位下标[2]表示当前MMU是否支持页映射模式等。在cpucfg rd, rj中,寄存器rj保存待访问的配置字号;指令执行后,读取到的配置信息写入rd。

龙芯架构中cpucfg可访问的完整配置信息,请参阅龙芯架构参考手册。

4.4.5. CRC指令

CRC(Cyclic Redundancy Check,循环冗余校验)是一种用于验证批量数据正确性的数据检错算法,可由软件实现(如C/C++程序),也可由硬件实现(体系架构指令支持)。龙芯基础指令集提供两类32位CRC指令,分别对应IEEE 802.3多项式和Castagnoli多项式,用于加速数据检错。

Tip

CRC指令仅在LA64架构下支持。

4.4.6. 地址边界检查指令

表3-10中的asrtle.d rj, rkasrtgt.d rj, rk用于检查地址边界是否合法,即把操作数rj和rk视为有符号数进行比较;如果比较条件不成立,则触发地址边界检查例外。这里的比较条件包括小于或等于(le)和大于(gt)。程序调试阶段使用这两条指令,有助于更快发现边界相关问题。

Tip

地址边界指令仅在LA64架构下支持。