常用汇编指令总结
浮点数相关
_mm_unpacklo_ps
Selects and interleaves the lower two SP FP values from a and b.
将两个128位浮点数的低64位分别取出,返回新的128位浮点数
INTERLEAVE_DWORDS(src1[127:0], src2[127:0]){
dst[31:0] := src1[31:0]
dst[63:32] := src2[31:0]
dst[95:64] := src1[63:32]
dst[127:96] := src2[63:32]
RETURN dst[127:0]
}
dst[127:0] := INTERLEAVE_DWORDS(a[127:0], b[127:0])
输入如果为:
a0,a1,a2,a3
b0,b1,b2,b3
则输出结果为:
a0,b0,a1,b1
_mm_mul_ps
FOR j := 0 to 3
i := j*32
dst[i+31:i] := a[i+31:i] * b[i+31:i]
ENDFOR
分别将两个128位浮点数的每个float相乘,结果仍然是128位浮点数
也就是:
dst[31:0] := a[31:0] * b[31:0]
dst[63:32] := a[63:32] * b[63:32]
dst[95:64] := a[95:64] * b[95:64]
dst[127:96] := a[127:96] * b[127:96]
_mm_moveldup_ps
dst[31:0] := a[31:0]
dst[63:32] := a[31:0]
dst[95:64] := a[95:64]
dst[127:96] := a[95:64]
Source data: 0.100000 0.200000 0.300000 0.400000
Calling _mm_moveldup_ps to load the values.
Result: 0.100000 0.100000 0.300000 0.300000
将128bit浮点数的第一个及第三个float分别复制到第二个及第四个float中