我正在寻找一种更紧凑的方法来从<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
是否有更精简的方法来实现相同目标?
答案 0 :(得分:2)
shufflevector
将完成与上述相同的操作(前提是您仅对%out.8
感兴趣),并且LLVM将其替换为简单的寄存器名称更改(例如,如果%out.1
为{{ 1}},ymm0
将是%out.8
)。
单行替换八个:
xmm0