4
4
5
5
6
6
// CHECK: define {{.*}} i32 {{.*}}test_scalar{{.*}}(double {{.*}} [[VALD:%.*]])
7
- // CHECK: [[VALRET:%.*]] = {{.*}} call { i32, i32 } @llvm.dx.splitdouble.i32(double [[VALD]])
7
+ // CHECK: [[VALRET:%.*]] = {{.*}} call { i32, i32 } @llvm.dx.splitdouble.i32(double [[VALD]])
8
8
// CHECK-NEXT: extractvalue { i32, i32 } [[VALRET]], 0
9
9
// CHECK-NEXT: extractvalue { i32, i32 } [[VALRET]], 1
10
+ //
10
11
// SPIRV: define spir_func {{.*}} i32 {{.*}}test_scalar{{.*}}(double {{.*}} [[VALD:%.*]])
11
- // SPIRV-NOT: @llvm.dx.splitdouble.i32
12
- // SPIRV: [[REG :%.*]] = load double, ptr [[VALD]].addr, align 8
13
- // SPIRV-NEXT: [[CAST:%.*]] = bitcast double [[REG ]] to <2 x i32>
12
+ // SPIRV-NOT: @llvm.dx.splitdouble.i32
13
+ // SPIRV: [[LOAD :%.*]] = load double, ptr [[VALD]].addr, align 8
14
+ // SPIRV-NEXT: [[CAST:%.*]] = bitcast double [[LOAD ]] to <2 x i32>
14
15
// SPIRV-NEXT: extractelement <2 x i32> [[CAST]], i64 0
15
16
// SPIRV-NEXT: extractelement <2 x i32> [[CAST]], i64 1
16
17
uint test_scalar (double D) {
@@ -20,14 +21,15 @@ uint test_scalar(double D) {
20
21
}
21
22
22
23
// CHECK: define {{.*}} <1 x i32> {{.*}}test_double1{{.*}}(<1 x double> {{.*}} [[VALD:%.*]])
23
- // CHECK: [[TRUNC:%.*]] = extractelement <1 x double> %D, i64 0
24
+ // CHECK: [[TRUNC:%.*]] = extractelement <1 x double> %D, i64 0
24
25
// CHECK-NEXT: [[VALRET:%.*]] = {{.*}} call { i32, i32 } @llvm.dx.splitdouble.i32(double [[TRUNC]])
25
26
// CHECK-NEXT: extractvalue { i32, i32 } [[VALRET]], 0
26
27
// CHECK-NEXT: extractvalue { i32, i32 } [[VALRET]], 1
28
+ //
27
29
// SPIRV: define spir_func {{.*}} <1 x i32> {{.*}}test_double1{{.*}}(<1 x double> {{.*}} [[VALD:%.*]])
28
- // SPIRV-NOT: @llvm.dx.splitdouble.i32
29
- // SPIRV: [[REG :%.*]] = load <1 x double>, ptr [[VALD]].addr, align 8
30
- // SPIRV-NEXT: [[TRUNC:%.*]] = extractelement <1 x double> %1 , i64 0
30
+ // SPIRV-NOT: @llvm.dx.splitdouble.i32
31
+ // SPIRV: [[LOAD :%.*]] = load <1 x double>, ptr [[VALD]].addr, align 8
32
+ // SPIRV-NEXT: [[TRUNC:%.*]] = extractelement <1 x double> [[LOAD]] , i64 0
31
33
// SPIRV-NEXT: [[CAST:%.*]] = bitcast double [[TRUNC]] to <2 x i32>
32
34
// SPIRV-NEXT: extractelement <2 x i32> [[CAST]], i64 0
33
35
// SPIRV-NEXT: extractelement <2 x i32> [[CAST]], i64 1
@@ -38,13 +40,14 @@ uint1 test_double1(double1 D) {
38
40
}
39
41
40
42
// CHECK: define {{.*}} <2 x i32> {{.*}}test_vector2{{.*}}(<2 x double> {{.*}} [[VALD:%.*]])
41
- // CHECK: [[VALRET:%.*]] = {{.*}} call { <2 x i32>, <2 x i32> } @llvm.dx.splitdouble.v2i32(<2 x double> [[VALD]])
43
+ // CHECK: [[VALRET:%.*]] = {{.*}} call { <2 x i32>, <2 x i32> } @llvm.dx.splitdouble.v2i32(<2 x double> [[VALD]])
42
44
// CHECK-NEXT: extractvalue { <2 x i32>, <2 x i32> } [[VALRET]], 0
43
45
// CHECK-NEXT: extractvalue { <2 x i32>, <2 x i32> } [[VALRET]], 1
46
+ //
44
47
// SPIRV: define spir_func {{.*}} <2 x i32> {{.*}}test_vector2{{.*}}(<2 x double> {{.*}} [[VALD:%.*]])
45
- // SPIRV-NOT: @llvm.dx.splitdouble.i32
46
- // SPIRV: [[REG :%.*]] = load <2 x double>, ptr [[VALD]].addr, align 16
47
- // SPIRV-NEXT: [[CAST1:%.*]] = bitcast <2 x double> [[REG ]] to <4 x i32>
48
+ // SPIRV-NOT: @llvm.dx.splitdouble.i32
49
+ // SPIRV: [[LOAD :%.*]] = load <2 x double>, ptr [[VALD]].addr, align 16
50
+ // SPIRV-NEXT: [[CAST1:%.*]] = bitcast <2 x double> [[LOAD ]] to <4 x i32>
48
51
// SPIRV-NEXT: [[SHUF1:%.*]] = shufflevector <4 x i32> [[CAST1]], <4 x i32> poison, <2 x i32> <i32 0, i32 2>
49
52
// SPIRV-NEXT: [[SHUF2:%.*]] = shufflevector <4 x i32> [[CAST1]], <4 x i32> poison, <2 x i32> <i32 1, i32 3>
50
53
uint2 test_vector2 (double2 D) {
@@ -54,44 +57,33 @@ uint2 test_vector2(double2 D) {
54
57
}
55
58
56
59
// CHECK: define {{.*}} <3 x i32> {{.*}}test_vector3{{.*}}(<3 x double> {{.*}} [[VALD:%.*]])
57
- // CHECK: [[VALRET:%.*]] = {{.*}} call { <3 x i32>, <3 x i32> } @llvm.dx.splitdouble.v3i32(<3 x double> [[VALD]])
60
+ // CHECK: [[VALRET:%.*]] = {{.*}} call { <3 x i32>, <3 x i32> } @llvm.dx.splitdouble.v3i32(<3 x double> [[VALD]])
58
61
// CHECK-NEXT: extractvalue { <3 x i32>, <3 x i32> } [[VALRET]], 0
59
62
// CHECK-NEXT: extractvalue { <3 x i32>, <3 x i32> } [[VALRET]], 1
63
+ //
60
64
// SPIRV: define spir_func {{.*}} <3 x i32> {{.*}}test_vector3{{.*}}(<3 x double> {{.*}} [[VALD:%.*]])
61
- // SPIRV-NOT: @llvm.dx.splitdouble.i32
62
- // SPIRV: [[REG:%.*]] = load <3 x double>, ptr [[VALD]].addr, align 32
63
- // SPIRV-NEXT: [[VALRET1:%.*]] = shufflevector <3 x double> [[REG]], <3 x double> poison, <2 x i32> <i32 0, i32 1>
64
- // SPIRV-NEXT: [[CAST1:%.*]] = bitcast <2 x double> [[VALRET1]] to <4 x i32>
65
- // SPIRV-NEXT: [[SHUF1:%.*]] = shufflevector <4 x i32> [[CAST1]], <4 x i32> poison, <2 x i32> <i32 0, i32 2>
66
- // SPIRV-NEXT: [[SHUF2:%.*]] = shufflevector <4 x i32> [[CAST1]], <4 x i32> poison, <2 x i32> <i32 1, i32 3>
67
- // SPIRV-NEXT: [[EXTRACT:%.*]] = extractelement <3 x double> [[REG]], i64 2
68
- // SPIRV-NEXT: [[CAST:%.*]] = bitcast double [[EXTRACT]] to <2 x i32>
69
- // SPIRV-NEXT: %[[#]] = shufflevector <2 x i32> [[SHUF1]], <2 x i32> [[CAST]], <3 x i32> <i32 0, i32 1, i32 2>
70
- // SPIRV-NEXT: %[[#]] = shufflevector <2 x i32> [[SHUF2]], <2 x i32> [[CAST]], <3 x i32> <i32 0, i32 1, i32 3>
65
+ // SPIRV-NOT: @llvm.dx.splitdouble.i32
66
+ // SPIRV: [[LOAD:%.*]] = load <3 x double>, ptr [[VALD]].addr, align 32
67
+ // SPIRV-NEXT: [[CAST1:%.*]] = bitcast <3 x double> [[LOAD]] to <6 x i32>
68
+ // SPIRV-NEXT: [[SHUF1:%.*]] = shufflevector <6 x i32> [[CAST1]], <6 x i32> poison, <3 x i32> <i32 0, i32 2, i32 4>
69
+ // SPIRV-NEXT: [[SHUF2:%.*]] = shufflevector <6 x i32> [[CAST1]], <6 x i32> poison, <3 x i32> <i32 1, i32 3, i32 5>
71
70
uint3 test_vector3 (double3 D) {
72
71
uint3 A, B;
73
72
asuint (D, A, B);
74
73
return A + B;
75
74
}
76
75
77
76
// CHECK: define {{.*}} <4 x i32> {{.*}}test_vector4{{.*}}(<4 x double> {{.*}} [[VALD:%.*]])
78
- // CHECK: [[VALRET:%.*]] = {{.*}} call { <4 x i32>, <4 x i32> } @llvm.dx.splitdouble.v4i32(<4 x double> [[VALD]])
77
+ // CHECK: [[VALRET:%.*]] = {{.*}} call { <4 x i32>, <4 x i32> } @llvm.dx.splitdouble.v4i32(<4 x double> [[VALD]])
79
78
// CHECK-NEXT: extractvalue { <4 x i32>, <4 x i32> } [[VALRET]], 0
80
79
// CHECK-NEXT: extractvalue { <4 x i32>, <4 x i32> } [[VALRET]], 1
80
+ //
81
81
// SPIRV: define spir_func {{.*}} <4 x i32> {{.*}}test_vector4{{.*}}(<4 x double> {{.*}} [[VALD:%.*]])
82
82
// SPIRV-NOT: @llvm.dx.splitdouble.i32
83
- // SPIRV: [[REG:%.*]] = load <4 x double>, ptr [[VALD]].addr, align 32
84
- // SPIRV-NEXT: [[VALRET1:%.*]] = shufflevector <4 x double> [[REG]], <4 x double> poison, <2 x i32> <i32 0, i32 1>
85
- // SPIRV-NEXT: [[CAST1:%.*]] = bitcast <2 x double> [[VALRET1]] to <4 x i32>
86
- // SPIRV-NEXT: [[SHUF1:%.*]] = shufflevector <4 x i32> [[CAST1]], <4 x i32> poison, <2 x i32> <i32 0, i32 2>
87
- // SPIRV-NEXT: [[SHUF2:%.*]] = shufflevector <4 x i32> [[CAST1]], <4 x i32> poison, <2 x i32> <i32 1, i32 3>
88
- // SPIRV-NEXT: [[VALRET2:%.*]] = shufflevector <4 x double> [[REG]], <4 x double> poison, <2 x i32> <i32 2, i32 3>
89
- // SPIRV-NEXT: [[CAST2:%.*]] = bitcast <2 x double> [[VALRET2]] to <4 x i32>
90
- // SPIRV-NEXT: [[SHUF3:%.*]] = shufflevector <4 x i32> [[CAST2]], <4 x i32> poison, <2 x i32> <i32 0, i32 2>
91
- // SPIRV-NEXT: [[SHUF4:%.*]] = shufflevector <4 x i32> [[CAST2]], <4 x i32> poison, <2 x i32> <i32 1, i32 3>
92
- // SPIRV-NEXT: shufflevector <2 x i32> [[SHUF1]], <2 x i32> [[SHUF3]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>
93
- // SPIRV-NEXT: shufflevector <2 x i32> [[SHUF2]], <2 x i32> [[SHUF4]], <4 x i32> <i32 0, i32 1, i32 3, i32 3>
94
-
83
+ // SPIRV: [[LOAD:%.*]] = load <4 x double>, ptr [[VALD]].addr, align 32
84
+ // SPIRV-NEXT: [[CAST1:%.*]] = bitcast <4 x double> [[LOAD]] to <8 x i32>
85
+ // SPIRV-NEXT: [[SHUF1:%.*]] = shufflevector <8 x i32> [[CAST1]], <8 x i32> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
86
+ // SPIRV-NEXT: [[SHUF2:%.*]] = shufflevector <8 x i32> [[CAST1]], <8 x i32> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
95
87
uint4 test_vector4 (double4 D) {
96
88
uint4 A, B;
97
89
asuint (D, A, B);
0 commit comments