数值、舍入、饱和与异常语义¶
本页描述 c220 指令实现中可以稳定区分的数值规则。后缀合法性仍以每条指令页面列出的“c220 接受的后缀与操作数组合”为准;同一个舍入字母不表示所有转换都接受该模式。
舍入后缀¶
| 后缀 | 模式码 | 语义 | 边界行为 |
|---|---|---|---|
r |
0 | 最近值,正中取偶 | guard=1 且 sticky 或保留位 LSB=1 时进位 |
a |
1 | 最近值,正中远离 0 | guard=1 即进位 |
f |
2 | 向负无穷 | 有丢失位且结果为负时进位 |
c |
3 | 向正无穷 | 有丢失位且结果为正时进位 |
z |
4 | 向 0 截断 | 丢弃低位,不进位 |
o |
5 | round-to-odd | 有丢失位时令保留结果最低位为 1;只出现在允许该模式的窄化转换 |
例如以下模式编码不同,且都由 dav-c220-vec 汇编器接受:
VCONV.f322s32.r [X0], [X1], X2, MASK
VCONV.f322s32.a [X0], [X1], X2, MASK
VCONV.f322s32.f [X0], [X1], X2, MASK
VCONV.f322s32.c [X0], [X1], X2, MASK
VCONV.f322s32.z [X0], [X1], X2, MASK
整数溢出¶
有符号 16/32 位加、减、乘先在更宽精度中求值,再检查是否落在 [-2^(N-1), 2^(N-1)-1]。超出范围时设置运算状态中的 overflow 标志。是否同时饱和、截断或把状态写回可见 SPR,取决于具体普通/饱和/转换指令;不能只凭 dtype 推断。
| 类别 | 普通路径 | 饱和/窄化路径 |
|---|---|---|
| 有符号加减乘 | 结果位宽和可见标志由具体指令决定 | 夹到目标最小/最大值,并记录 overflow |
| 无符号窄化 | 检查负值和超过最大值 | 负值夹到 0,正溢出夹到最大值 |
| 移位 | 右移的补位由 s/u/b 后缀决定 |
超过元素位宽的移位量必须按具体后缀测试,不能假定取模 |
浮点分类与转换¶
实现显式区分 normal、subnormal、零、无穷和 NaN。已固定的转换边界如下:
| 转换类别 | NaN | +∞ | -∞ | 有限溢出 |
|---|---|---|---|---|
| f32→s32 | 输出 0,并记录 NaN | INT32_MAX |
INT32_MIN |
按控制模式饱和到端点或走非饱和路径 |
| f16→s8 | 输出 0,并记录 NaN | INT8_MAX |
INT8_MIN |
饱和到端点并记录 overflow |
| f16→u8 | 输出 0,并记录 NaN | UINT8_MAX |
0 | 负值夹 0,正溢出夹最大值 |
| f32→f16 | NaN 输出由转换控制选择 0 或 0x7fff |
由控制选择最大有限值或 ∞ | 对称处理符号 | 由控制选择最大有限值或 ∞ |
这些是转换执行路径的边界规则,不表示普通 VADD/VMUL 会把 NaN 改成相同常量。NaN payload 是否保留、quiet/signaling 位如何处理,以及 subnormal 是否 flush-to-zero,必须针对具体 dtype/后缀做设备向量测试。
比较、min/max 与 NaN¶
标量 CMP 写标量条件状态;Vector VCMP/VCMPV/VCMPVS 写 CMPMASK 或向量结果。对于普通数值,EQ/NE/LT/LE/GT/GE 按后缀的有符号、无符号或浮点解释执行。
浮点 min/max、归约和排序辅助路径对 f16/f32 的 exponent、mantissa、sign 分字段处理,并对 NaN/∞ 使用确定的位模式排序规则。这不是“所有 NaN 均 unordered”的通用 IEEE 比较替代品。若算法依赖 NaN 优先级、NaN payload、+0/-0 选择或 signaling 异常,必须在目标设备上覆盖:
- 两个操作数分别为 qNaN/sNaN;
- NaN 与 ±∞、有限值的两个操作数顺序;
+0与-0;- 正负 subnormal。
状态与异常¶
STATUS 是只读执行状态,CTRL/FPC 等控制状态会影响部分转换。可见执行语义中的算术异常表现为状态位更新和规定结果值,没有稳定公共接口表明它们采用 CPU 式同步 trap。普通内核应按“结果 + sticky 状态”编程,不应依赖异常跳转。
Scalar 执行路径中当前可以固定的标志位如下。每条更新路径都会先保留 STATUS 其余位,再写 STATUS[23:16] = PC[9:2],因此该字段记录最近一次对应异常的低 8 位指令字地址。
| STATUS 位 | 触发类别 | 行为 |
|---|---|---|
| 3 | negative-overflow 路径 | 置 1,并更新 STATUS[23:16] |
| 4 | unsigned-overflow 路径 | 仅当该路径的 overflow 条件参数为 1 时置 1 |
| 5 | signed/general overflow 路径 | 置 1,并更新 STATUS[23:16] |
| 6 | underflow 路径 | 置 1,并更新 STATUS[23:16] |
| 13 | NaN/Inf 分类路径 | NaN 与 Inf 状态入口在 c220 执行语义中写同一位 |
| 60 | INSERT 位域越界 |
置 1,并更新 STATUS[23:16] |
INSERT 寄存器位域形式在 bit_offset + width_minus_one > 63 时置 bit 60;立即数形式在被插入的有效位超出 bit 63 时走同一状态更新。这些状态不会把错误改成同步 trap。
其余精确 STATUS 位编号没有由 c220 公共接口稳定命名,因此本文不把内部临时编号外推成 ABI。需要观测时,在操作前后读取 STATUS,用单一异常输入逐位差分,并把编译器版本、dtype、舍入后缀和控制寄存器值一同记录。