跳转至

数值、舍入、饱和与异常语义

本页描述 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、舍入后缀和控制寄存器值一同记录。