常用汇编指令总结

原文链接

浮点数相关

_mm_unpacklo_ps

Selects and interleaves the lower two SP FP values from a and b.

将两个128位浮点数的低64位分别取出,返回新的128位浮点数

1
2
3
4
5
6
7
8
9
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])

输入如果为:

1
2
a0,a1,a2,a3
b0,b1,b2,b3

则输出结果为:

1
a0,b0,a1,b1

_mm_mul_ps

1
2
3
4
FOR j := 0 to 3
i := j*32
dst[i+31:i] := a[i+31:i] * b[i+31:i]
ENDFOR

分别将两个128位浮点数的每个float相乘,结果仍然是128位浮点数
也就是:

1
2
3
4
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

1
2
3
4
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中

参考文档