复数的向量计算
当前飞腾CPU并不支持复数的向量计算。
这里复数向量计算和数学教科书上的不太一样。
1. 基本描述
单精度:
一个128位向量寄存器描述一个单精度复数
单精度虚部 I | 单精度实部 R |
一个128位向量寄存器描述两个单精度复数
单精度虚部 I1 | 单精度实部 R1 | 单精度虚部 I0 | 单精度实部 R0 |
双精度:
一个128位向量寄存器只能描述一个双精度复数
双精度虚部 I | 双精度实部 R |
2. 复数的旋转
虚部 | 实部 | |
最初值 | I | R |
逆时针旋转90 | R | -I |
逆时针旋转180 | -I | -R |
逆时针旋转180 | -R | -I |
3. 复数加法指令
第二个源向量寄存器内的复数逆时针旋转(90或270度)操作后,与第一个源向量寄存器的复数相加,并将结果写入目标向量寄存器。
指令 | 第一个源 向量寄存器 | 第二个源 向量寄存器 | 目标 向量寄存器 | 逆时针 旋转 |
fcadd v0,2d, v1,2d, v2,2d, 90 | v1.2d | v2.2d | v0.2d | 90度 |
fcadd v0,4s, v1,4s, v2,4s, 270 | v1.4s | v2.4s | v0.4s | 270度 |
4. 复数乘加指令
第二个源向量寄存器内的复数逆时针旋转(0,90,180和270度)操作后,旋转后的复数与第一个源向量寄存器的实部或虚部(只选其中一个,而不是分别)相乘,并将相乘后的复数与目标向量寄存器相加,最终将累加值写入目标向量寄存器。
指令 | 第一个源 向量寄存器/实部还是虚部 | 第二个源 向量寄存器 | 目标 向量寄存器 | 逆时针 旋转 |
fcmla v0,2d, v1,2d, v2,2d, 0 | v1.2d的实部 | v2.2d | v0.2d | 0度 |
fcmla v0,4s, v1,4s, v2,4s, 90 | v1.4s的虚部 | v2.4s | v0.4s | 90度 |
fcmla v0,2d, v1,2d, v2,2d, 180 | v1.2d的实部 | v2.2d | v0.2d | 180度 |
fcmla v0,4s, v1,4s, v2,4s, 270 | v1.4s的虚部 | v2.4s | v0.4s | 270度 |