从LLVM IR中的向量寄存器中提取子向量

时间:2019-01-31 16:50:12

标签: vector llvm simd llvm-ir

我正在寻找一种更紧凑的方法来从<4 x float>(例如xmm0)寄存器中提取连续的<8 x float>(例如ymm0),这将最终使用SIMD向量宽度命名。

这可以按预期工作,但很详尽:

%out.1 = extractelement <8 x float> %out.0, i32 0
%out.2 = extractelement <8 x float> %out.0, i32 1
%out.3 = extractelement <8 x float> %out.0, i32 2
%out.4 = extractelement <8 x float> %out.0, i32 3
%out.5 = insertelement <4 x float> undef, float %out.1, i32 0
%out.6 = insertelement <4 x float> %out.5, float %out.2, i32 1
%out.7 = insertelement <4 x float> %out.6, float %out.3, i32 2
%out.8 = insertelement <4 x float> %out.7, float %out.4, i32 3

是否有更精简的方法来实现相同目标?

1 个答案:

答案 0 :(得分:2)

shufflevector将完成与上述相同的操作(前提是您仅对%out.8感兴趣),并且LLVM将其替换为简单的寄存器名称更改(例如,如果%out.1为{{ 1}},ymm0将是%out.8)。

单行替换八个:

xmm0