AVX2指令集
__m256i _mm256_permute2x128_si256 (__m256i a, __m256i b, const int imm8)
作用:imm8是一个mask(8bit)。这个函数会依据imm8的前后4个bit的值[0:3]和[4:7]确定输出dst的前128bit和后128bit使用a还是b的数据。
DEFINE SELECT4(src1, src2, control) {
CASE(control[1:0]) OF
0: tmp[127:0] := src1[127:0]
1: tmp[127:0] := src1[255:128]
2: tmp[127:0] := src2[127:0]
3: tmp[127:0] := src2[255:128]
ESAC
IF control[3]
tmp[127:0] := 0
FI
RETURN tmp[127:0]
}
dst[127:0] := SELECT4(a[255:0], b[255:0], imm8[3:0])
dst[255:128] := SELECT4(a[255:0], b[255:0], imm8[7:4])
dst[MAX:256] := 0
如图,imm8用一个字节表示,低四位用b表示,b的值代表dst的低128位从src1和src2的哪一部分取128bit。a的值表示dst的高128位从src1和src2的哪一部分取128bit。
以下是举例
- 若imm8=0x20 (0010 0000)
dst的低128位用src1的低128位,dst的高128位用src2的低128位
- 若imm8=0x21 (0010 0001)
dst的低128位用src1的高128位,dst的高128位用src2的低128位