Files
UnrealEngine/Engine/Source/ThirdParty/Intel/ISPC/ispc-1.21.0/tests/lit-tests/1470.ispc
2025-05-18 13:04:45 +08:00

79 lines
3.8 KiB
Plaintext

// This test checks that swizzle operation does not cause any compiler
// internal error when it is applied to binary expression.
// Swizzle operation is implemented through memory using insert instructions.
// The test also checks that inserts are transformed to shuffles during
// optimization when vector size equals number of program instances.
// RUN: %{ispc} %s --emit-llvm-text -h %t.h --nostdlib --target=sse2-i32x4 -o - | FileCheck %s
// RUN: %{ispc} %s --emit-llvm-text -h %t.h --nostdlib --target=sse2-i32x8 -o - | FileCheck %s
// RUN: %{ispc} %s --emit-asm -h %t.h --nostdlib --target=sse2-i32x4 -o - | FileCheck %s -check-prefix=CHECK_SSE
// RUN: %{ispc} %s --emit-llvm-text -h %t.h --nostdlib --target=sse4-i32x4 -o - | FileCheck %s
// RUN: %{ispc} %s --emit-llvm-text -h %t.h --nostdlib --target=sse4-i32x8 -o - | FileCheck %s
// RUN: %{ispc} %s --emit-llvm-text -h %t.h --nostdlib --target=sse4-i16x8 -o - | FileCheck %s
// RUN: %{ispc} %s --emit-llvm-text -h %t.h --nostdlib --target=sse4-i8x16 -o - | FileCheck %s
// RUN: %{ispc} %s --emit-asm -h %t.h --nostdlib --target=sse4-i32x4 -o - | FileCheck %s -check-prefix=CHECK_SSE
// RUN: %{ispc} %s --emit-llvm-text -h %t.h --nostdlib --target=sse4.1-i32x4 -o - | FileCheck %s
// RUN: %{ispc} %s --emit-llvm-text -h %t.h --nostdlib --target=sse4.1-i32x8 -o - | FileCheck %s
// RUN: %{ispc} %s --emit-llvm-text -h %t.h --nostdlib --target=sse4.1-i16x8 -o - | FileCheck %s
// RUN: %{ispc} %s --emit-llvm-text -h %t.h --nostdlib --target=sse4.1-i8x16 -o - | FileCheck %s
// RUN: %{ispc} %s --emit-asm -h %t.h --nostdlib --target=sse4.1-i32x4 -o - | FileCheck %s -check-prefix=CHECK_SSE
// RUN: %{ispc} %s --emit-llvm-text -h %t.h --nostdlib --target=avx1-i32x4 -o - | FileCheck %s
// RUN: %{ispc} %s --emit-llvm-text -h %t.h --nostdlib --target=avx1-i32x8 -o - | FileCheck %s
// RUN: %{ispc} %s --emit-llvm-text -h %t.h --nostdlib --target=avx1-i32x16 -o - | FileCheck %s
// RUN: %{ispc} %s --emit-llvm-text -h %t.h --nostdlib --target=avx1-i64x4 -o - | FileCheck %s
// RUN: %{ispc} %s --emit-asm -h %t.h --nostdlib --target=avx1-i32x4 -o - | FileCheck %s -check-prefix=CHECK_AVX
// RUN: %{ispc} %s --emit-llvm-text -h %t.h --nostdlib --target=avx2-i32x8 -o - | FileCheck %s
// RUN: %{ispc} %s --emit-llvm-text -h %t.h --nostdlib --target=avx2-i32x16 -o - | FileCheck %s
// RUN: %{ispc} %s --emit-llvm-text -h %t.h --nostdlib --target=avx2-i64x4 -o - | FileCheck %s
// RUN: %{ispc} %s --emit-llvm-text -h %t.h --nostdlib --target=avx512knl-x16 -o - | FileCheck %s
// RUN: %{ispc} %s --emit-llvm-text -h %t.h --nostdlib --target=avx512skx-x16 -o - | FileCheck %s
// REQUIRES: X86_ENABLED
typedef float<2> vec2;
typedef float<4> vec4;
inline vec4 MakeVec4(vec2 a, vec2 b) {
const vec4 res = {a.x, a.y, b.x, b.y};
return res;
}
unmasked vec4 test_swizzle(uniform vec4 offs0, uniform vec4 offs1, uniform vec4 offs2) {
vec4 uv = { 1.0f, 2.0f, 1.0f, 2.0f };
vec4 a1 = uv.xzyw + offs0;
vec4 a2 = (uv.xyxy + offs0).xwwy;
vec4 a3 = MakeVec4((uv.xyxy + offs0).xz, (uv.xyxy + offs1).yw) + offs2;
vec4 a4 = (MakeVec4((uv.xyyy + offs0).xz, (uv.xxxy + offs1).yw) + offs2).xyyw;
if (a1.x+a2.y > a3.z+a4.w) return a1+a3;
return a2+a4;
}
unmasked vec4 test_shuffle(uniform vec4 offs0) {
vec4 uv = { 1.0f, 2.0f, 1.0f, 2.0f };
// CHECK: @test_shuffle
// CHECK-COUNT-3: shufflevector
// CHECK_SSE: test_shuffle
// CHECK_SSE-COUNT-3: shufps {{.*#+}}
// CHECK_AVX: test_shuffle
// CHECK_AVX-COUNT-3: {{(vpermilps|vshufps)}} {{.*#+}}
return (uv.xyxy + offs0).xwwz;
}
export void test() {
const uniform vec4 offs0 = { 0, 1, 2, 3 };
const uniform vec4 offs1 = { 2, 3, 4, 5 };
const uniform vec4 offs2 = { 3, 4, 5, 6 };
vec4 a = test_swizzle(offs0, offs1, offs2);
vec4 b = test_shuffle(offs0);
}