Skip to content

Commit 8677d5d

Browse files
authored
[ESIMD] Add basic operations code generation test for half type. (#5241)
* [ESIMD] Add basic operations code generation test for half type. Signed-off-by: Konstantin S Bobrovsky <[email protected]>
1 parent 9eb7a30 commit 8677d5d

File tree

1 file changed

+89
-0
lines changed

1 file changed

+89
-0
lines changed
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
// RUN: %clangxx -fsycl -fsycl-device-only -S %s -o %t
2+
// RUN: sycl-post-link -split-esimd -lower-esimd -S %t -o %t.table
3+
// RUN: FileCheck %s -input-file=%t_esimd_0.ll
4+
5+
// The test checks that there are no unexpected extra conversions or intrinsic
6+
// calls added by the API headers or compiler when generating code
7+
// for basic C++ operations on simd<sycl::half, N> values.
8+
9+
#include <sycl/ext/intel/experimental/esimd.hpp>
10+
11+
using namespace sycl::ext::intel::experimental::esimd;
12+
using namespace sycl::ext::intel::experimental;
13+
using namespace sycl;
14+
15+
// clang-format off
16+
// --- Unary operation
17+
SYCL_EXTERNAL auto test_unary_op(simd<sycl::half, 8> val) SYCL_ESIMD_FUNCTION {
18+
// CHECK: define dso_local spir_func void @_Z13test_unary_op{{.*}}(
19+
// CHECK: {{.*}} %[[RET_VEC_ADDR:[a-zA-Z0-9_\.]+]],
20+
// CHECK: {{.*}} %[[VAL_PTR:[a-zA-Z0-9_\.]+]]){{.*}} {
21+
// CHECK-LABEL: entry:
22+
return -val;
23+
// CHECK-NEXT: %[[VAL_VEC_ADDR:[a-zA-Z0-9_\.]+]] = addrspacecast {{.*}} %[[VAL_PTR]]
24+
// CHECK-NEXT: %[[VAL_VEC:[a-zA-Z0-9_\.]+]] = load <8 x half>{{.*}} %[[VAL_VEC_ADDR]]
25+
// CHECK-NEXT: %[[RES:[a-zA-Z0-9_\.]+]] = fneg <8 x half> %[[VAL_VEC]]
26+
// CHECK-NEXT: store <8 x half>{{.*}}%[[RES]], {{.*}}%[[RET_VEC_ADDR]]
27+
// CHECK-NEXT: ret void
28+
// CHECK-LABEL: }
29+
}
30+
31+
// --- Binary operation on <half, half> pair
32+
SYCL_EXTERNAL auto test_binary_op1(simd<sycl::half, 8> val1, simd<sycl::half, 8> val2) SYCL_ESIMD_FUNCTION {
33+
// CHECK: define dso_local spir_func void @_Z15test_binary_op1{{.*}}(
34+
// CHECK: {{[^,]*}} %[[RET_VEC_ADDR:[a-zA-Z0-9_\.]+]],
35+
// CHECK: {{[^,]*}} %[[VAL1_PTR:[a-zA-Z0-9_\.]+]],
36+
// CHECK: {{.*}} %[[VAL2_PTR:[a-zA-Z0-9_\.]+]]){{.*}} {
37+
// CHECK-LABEL: entry:
38+
return val1 + val2;
39+
// CHECK-NEXT: %[[VAL1_VEC_ADDR:[a-zA-Z0-9_\.]+]] = addrspacecast {{.*}} %[[VAL1_PTR]]
40+
// CHECK-NEXT: %[[VAL1_VEC:[a-zA-Z0-9_\.]+]] = load <8 x half>{{.*}} %[[VAL1_VEC_ADDR]]
41+
// CHECK-NEXT: %[[VAL2_VEC_ADDR:[a-zA-Z0-9_\.]+]] = addrspacecast {{.*}} %[[VAL2_PTR]]
42+
// CHECK-NEXT: %[[VAL2_VEC:[a-zA-Z0-9_\.]+]] = load <8 x half>{{.*}} %[[VAL2_VEC_ADDR]]
43+
// CHECK-NEXT: %[[RES:[a-zA-Z0-9_\.]+]] = fadd <8 x half> %[[VAL1_VEC]], %[[VAL2_VEC]]
44+
// CHECK-NEXT: store <8 x half>{{.*}}%[[RES]], {{.*}}%[[RET_VEC_ADDR]]
45+
// CHECK-NEXT: ret void
46+
// CHECK-LABEL: }
47+
}
48+
49+
// --- Binary operation on <half, int64_t> pair
50+
// The integer operand is expected to be converted to half type.
51+
SYCL_EXTERNAL auto test_binary_op2(simd<sycl::half, 8> val1, simd<long long, 8> val2) SYCL_ESIMD_FUNCTION {
52+
// CHECK: define dso_local spir_func void @_Z15test_binary_op2{{[^\(]*}}(
53+
// CHECK: <8 x half>{{[^,]*}}* %[[RET_VEC_ADDR:[a-zA-Z0-9_\.]+]],
54+
// CHECK: <8 x half>* %[[VAL1_PTR:[a-zA-Z0-9_\.]+]],
55+
// CHECK: <8 x i64>* %[[VAL2_PTR:[a-zA-Z0-9_\.]+]]){{.*}} {
56+
// CHECK-LABEL: entry:
57+
return val1 + val2;
58+
// CHECK-NEXT: %[[VAL1_VEC_ADDR:[a-zA-Z0-9_\.]+]] = addrspacecast {{.*}} %[[VAL1_PTR]]
59+
// CHECK-NEXT: %[[VAL1_VEC:[a-zA-Z0-9_\.]+]] = load <8 x half>{{.*}} %[[VAL1_VEC_ADDR]]
60+
// CHECK-NEXT: %[[VAL2_VEC_ADDR:[a-zA-Z0-9_\.]+]] = addrspacecast {{.*}} %[[VAL2_PTR]]
61+
// CHECK-NEXT: %[[VAL2_VEC:[a-zA-Z0-9_\.]+]] = load <8 x i64>{{.*}} %[[VAL2_VEC_ADDR]]
62+
// CHECK-NEXT: %[[CONV:[a-zA-Z0-9_\.]+]] = sitofp <8 x i64> %[[VAL2_VEC]] to <8 x half>
63+
// CHECK-NEXT: %[[RES:[a-zA-Z0-9_\.]+]] = fadd <8 x half> %[[VAL1_VEC]], %[[CONV]]
64+
// CHECK-NEXT: store <8 x half>{{.*}}%[[RES]], {{.*}}%[[RET_VEC_ADDR]]
65+
// CHECK-NEXT: ret void
66+
// CHECK-LABEL: }
67+
}
68+
69+
// --- Comparison operation on <half, int64_t> pair
70+
// The integer operand is expected to be converted to half type.
71+
SYCL_EXTERNAL auto test_cmp_op(simd<sycl::half, 8> val1, simd<long long, 8> val2) SYCL_ESIMD_FUNCTION {
72+
// CHECK: define dso_local spir_func void @_Z11test_cmp_op{{[^\(]*}}(
73+
// CHECK: <8 x i16>{{[^,]*}}* %[[RET_VEC_ADDR:[a-zA-Z0-9_\.]+]],
74+
// CHECK: <8 x half>* %[[VAL1_PTR:[a-zA-Z0-9_\.]+]],
75+
// CHECK: <8 x i64>* %[[VAL2_PTR:[a-zA-Z0-9_\.]+]]){{.*}} {
76+
// CHECK-LABEL: entry:
77+
return val1 < val2;
78+
// CHECK-NEXT: %[[VAL1_VEC_ADDR:[a-zA-Z0-9_\.]+]] = addrspacecast {{.*}} %[[VAL1_PTR]]
79+
// CHECK-NEXT: %[[VAL1_VEC:[a-zA-Z0-9_\.]+]] = load <8 x half>{{.*}} %[[VAL1_VEC_ADDR]]
80+
// CHECK-NEXT: %[[VAL2_VEC_ADDR:[a-zA-Z0-9_\.]+]] = addrspacecast {{.*}} %[[VAL2_PTR]]
81+
// CHECK-NEXT: %[[VAL2_VEC:[a-zA-Z0-9_\.]+]] = load <8 x i64>{{.*}} %[[VAL2_VEC_ADDR]]
82+
// CHECK-NEXT: %[[CONV:[a-zA-Z0-9_\.]+]] = sitofp <8 x i64> %[[VAL2_VEC]] to <8 x half>
83+
// CHECK-NEXT: %[[CMP:[a-zA-Z0-9_\.]+]] = fcmp olt <8 x half> %[[VAL1_VEC]], %[[CONV]]
84+
// CHECK-NEXT: %[[RES:[a-zA-Z0-9_\.]+]] = zext <8 x i1> %[[CMP]] to <8 x i16>
85+
// CHECK-NEXT: store <8 x i16>{{.*}}%[[RES]], {{.*}}%[[RET_VEC_ADDR]]
86+
// CHECK-NEXT: ret void
87+
// CHECK-LABEL: }
88+
}
89+
// clang-format on

0 commit comments

Comments
 (0)