Извлечение субвектора из векторного регистра в LLVM IR - PullRequest
0 голосов
/ 31 января 2019

Я ищу более компактный способ извлечения последовательного <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 голосов
/ 01 февраля 2019

shufflevector выполнит то же, что и выше (при условии, что вас интересует только %out.8), и LLVM заменит его простым изменением имени регистра (например, если %out.1 равно ymm0, %out.8 будетbe xmm0).

Одна строка вместо восьми:

%out.8 = shufflevector <8 x float> %out.0, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
...