1; RUN: llc %s -o - | FileCheck %s
2
3target triple = "spirv32-unknown-unknown"
4
5; CHECK-DAG: OpName [[TRUNC32_16:%.*]] "i32toi16"
6; CHECK-DAG: OpName [[TRUNC32_8:%.*]] "i32toi8"
7; CHECK-DAG: OpName [[TRUNC16_8:%.*]] "i16toi8"
8; CHECK-DAG: OpName [[SEXT8_32:%.*]] "s8tos32"
9; CHECK-DAG: OpName [[SEXT8_16:%.*]] "s8tos16"
10; CHECK-DAG: OpName [[SEXT16_32:%.*]] "s16tos32"
11; CHECK-DAG: OpName [[ZEXT8_32:%.*]] "u8tou32"
12; CHECK-DAG: OpName [[ZEXT8_16:%.*]] "u8tou16"
13; CHECK-DAG: OpName [[ZEXT16_32:%.*]] "u16tou32"
14
15; CHECK-DAG: OpName [[TRUNC32_16v4:%.*]] "i32toi16v4"
16; CHECK-DAG: OpName [[TRUNC32_8v4:%.*]] "i32toi8v4"
17; CHECK-DAG: OpName [[TRUNC16_8v4:%.*]] "i16toi8v4"
18; CHECK-DAG: OpName [[SEXT8_32v4:%.*]] "s8tos32v4"
19; CHECK-DAG: OpName [[SEXT8_16v4:%.*]] "s8tos16v4"
20; CHECK-DAG: OpName [[SEXT16_32v4:%.*]] "s16tos32v4"
21; CHECK-DAG: OpName [[ZEXT8_32v4:%.*]] "u8tou32v4"
22; CHECK-DAG: OpName [[ZEXT8_16v4:%.*]] "u8tou16v4"
23; CHECK-DAG: OpName [[ZEXT16_32v4:%.*]] "u16tou32v4"
24
25; CHECK-DAG: [[U32:%.*]] = OpTypeInt 32 0
26; CHECK-DAG: [[U16:%.*]] = OpTypeInt 16 0
27; CHECK-DAG: [[U8:%.*]] = OpTypeInt 8 0
28; CHECK-DAG: [[U32v4:%.*]] = OpTypeVector [[U32]] 4
29; CHECK-DAG: [[U16v4:%.*]] = OpTypeVector [[U16]] 4
30; CHECK-DAG: [[U8v4:%.*]] = OpTypeVector [[U8]] 4
31
32
33; CHECK: [[TRUNC32_16]] = OpFunction [[U16]]
34; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U32]]
35; CHECK: OpLabel
36; CHECK: [[R:%.*]] = OpUConvert [[U16]] [[A]]
37; CHECK: OpReturnValue [[R]]
38; CHECK-NEXT: OpFunctionEnd
39define i16 @i32toi16(i32 %a) {
40    %r = trunc i32 %a to i16
41    ret i16 %r
42}
43
44; CHECK: [[TRUNC32_8]] = OpFunction [[U8]]
45; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U32]]
46; CHECK: OpLabel
47; CHECK: [[R:%.*]] = OpUConvert [[U8]] [[A]]
48; CHECK: OpReturnValue [[R]]
49; CHECK-NEXT: OpFunctionEnd
50define i8 @i32toi8(i32 %a) {
51    %r = trunc i32 %a to i8
52    ret i8 %r
53}
54
55; CHECK: [[TRUNC16_8]] = OpFunction [[U8]]
56; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U16]]
57; CHECK: OpLabel
58; CHECK: [[R:%.*]] = OpUConvert [[U8]] [[A]]
59; CHECK: OpReturnValue [[R]]
60; CHECK-NEXT: OpFunctionEnd
61define i8 @i16toi8(i16 %a) {
62    %r = trunc i16 %a to i8
63    ret i8 %r
64}
65
66
67; CHECK: [[SEXT8_32]] = OpFunction [[U32]]
68; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8]]
69; CHECK: OpLabel
70; CHECK: [[R:%.*]] = OpSConvert [[U32]] [[A]]
71; CHECK: OpReturnValue [[R]]
72; CHECK-NEXT: OpFunctionEnd
73define i32 @s8tos32(i8 %a) {
74  %r = sext i8 %a to i32
75  ret i32 %r
76}
77
78; CHECK: [[SEXT8_16]] = OpFunction [[U16]]
79; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8]]
80; CHECK: OpLabel
81; CHECK: [[R:%.*]] = OpSConvert [[U16]] [[A]]
82; CHECK: OpReturnValue [[R]]
83; CHECK-NEXT: OpFunctionEnd
84define i16 @s8tos16(i8 %a) {
85  %r = sext i8 %a to i16
86  ret i16 %r
87}
88
89; CHECK: [[SEXT16_32]] = OpFunction [[U32]]
90; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U16]]
91; CHECK: OpLabel
92; CHECK: [[R:%.*]] = OpSConvert [[U32]] [[A]]
93; CHECK: OpReturnValue [[R]]
94; CHECK-NEXT: OpFunctionEnd
95define i32 @s16tos32(i16 %a) {
96  %r = sext i16 %a to i32
97  ret i32 %r
98}
99
100; CHECK: [[ZEXT8_32]] = OpFunction [[U32]]
101; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8]]
102; CHECK: OpLabel
103; CHECK: [[R:%.*]] = OpUConvert [[U32]] [[A]]
104; CHECK: OpReturnValue [[R]]
105; CHECK-NEXT: OpFunctionEnd
106define i32 @u8tou32(i8 %a) {
107  %r = zext i8 %a to i32
108  ret i32 %r
109}
110
111; CHECK: [[ZEXT8_16]] = OpFunction [[U16]]
112; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8]]
113; CHECK: OpLabel
114; CHECK: [[R:%.*]] = OpUConvert [[U16]] [[A]]
115; CHECK: OpReturnValue [[R]]
116; CHECK-NEXT: OpFunctionEnd
117define i16 @u8tou16(i8 %a) {
118  %r = zext i8 %a to i16
119  ret i16 %r
120}
121
122; CHECK: [[ZEXT16_32]] = OpFunction [[U32]]
123; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U16]]
124; CHECK: OpLabel
125; CHECK: [[R:%.*]] = OpUConvert [[U32]] [[A]]
126; CHECK: OpReturnValue [[R]]
127; CHECK-NEXT: OpFunctionEnd
128define i32 @u16tou32(i16 %a) {
129  %r = zext i16 %a to i32
130  ret i32 %r
131}
132
133; CHECK: [[TRUNC32_16v4]] = OpFunction [[U16v4]]
134; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U32v4]]
135; CHECK: OpLabel
136; CHECK: [[R:%.*]] = OpUConvert [[U16v4]] [[A]]
137; CHECK: OpReturnValue [[R]]
138; CHECK-NEXT: OpFunctionEnd
139define <4 x i16> @i32toi16v4(<4 x i32> %a) {
140    %r = trunc <4 x i32> %a to <4 x i16>
141    ret <4 x i16> %r
142}
143
144; CHECK: [[TRUNC32_8v4]] = OpFunction [[U8v4]]
145; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U32v4]]
146; CHECK: OpLabel
147; CHECK: [[R:%.*]] = OpUConvert [[U8v4]] [[A]]
148; CHECK: OpReturnValue [[R]]
149; CHECK-NEXT: OpFunctionEnd
150define <4 x i8> @i32toi8v4(<4 x i32> %a) {
151    %r = trunc <4 x i32> %a to <4 x i8>
152    ret <4 x i8> %r
153}
154
155; CHECK: [[TRUNC16_8v4]] = OpFunction [[U8v4]]
156; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U16v4]]
157; CHECK: OpLabel
158; CHECK: [[R:%.*]] = OpUConvert [[U8v4]] [[A]]
159; CHECK: OpReturnValue [[R]]
160; CHECK-NEXT: OpFunctionEnd
161define <4 x i8> @i16toi8v4(<4 x i16> %a) {
162    %r = trunc <4 x i16> %a to <4 x i8>
163    ret <4 x i8> %r
164}
165
166
167; CHECK: [[SEXT8_32v4]] = OpFunction [[U32v4]]
168; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8v4]]
169; CHECK: OpLabel
170; CHECK: [[R:%.*]] = OpSConvert [[U32v4]] [[A]]
171; CHECK: OpReturnValue [[R]]
172; CHECK-NEXT: OpFunctionEnd
173define <4 x i32>  @s8tos32v4(<4 x i8> %a) {
174  %r = sext <4 x i8> %a to <4 x i32>
175  ret <4 x i32>  %r
176}
177
178; CHECK: [[SEXT8_16v4]] = OpFunction [[U16v4]]
179; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8v4]]
180; CHECK: OpLabel
181; CHECK: [[R:%.*]] = OpSConvert [[U16v4]] [[A]]
182; CHECK: OpReturnValue [[R]]
183; CHECK-NEXT: OpFunctionEnd
184define <4 x i16> @s8tos16v4(<4 x i8> %a) {
185  %r = sext <4 x i8> %a to <4 x i16>
186  ret <4 x i16> %r
187}
188
189; CHECK: [[SEXT16_32v4]] = OpFunction [[U32v4]]
190; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U16v4]]
191; CHECK: OpLabel
192; CHECK: [[R:%.*]] = OpSConvert [[U32v4]] [[A]]
193; CHECK: OpReturnValue [[R]]
194; CHECK-NEXT: OpFunctionEnd
195define <4 x i32>  @s16tos32v4(<4 x i16> %a) {
196  %r = sext <4 x i16> %a to <4 x i32>
197  ret <4 x i32>  %r
198}
199
200; CHECK: [[ZEXT8_32v4]] = OpFunction [[U32v4]]
201; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8v4]]
202; CHECK: OpLabel
203; CHECK: [[R:%.*]] = OpUConvert [[U32v4]] [[A]]
204; CHECK: OpReturnValue [[R]]
205; CHECK-NEXT: OpFunctionEnd
206define <4 x i32>  @u8tou32v4(<4 x i8> %a) {
207  %r = zext <4 x i8> %a to <4 x i32>
208  ret <4 x i32>  %r
209}
210
211; CHECK: [[ZEXT8_16v4]] = OpFunction [[U16v4]]
212; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8v4]]
213; CHECK: OpLabel
214; CHECK: [[R:%.*]] = OpUConvert [[U16v4]] [[A]]
215; CHECK: OpReturnValue [[R]]
216; CHECK-NEXT: OpFunctionEnd
217define <4 x i16> @u8tou16v4(<4 x i8> %a) {
218  %r = zext <4 x i8> %a to <4 x i16>
219  ret <4 x i16> %r
220}
221
222; CHECK: [[ZEXT16_32v4]] = OpFunction [[U32v4]]
223; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U16v4]]
224; CHECK: OpLabel
225; CHECK: [[R:%.*]] = OpUConvert [[U32v4]] [[A]]
226; CHECK: OpReturnValue [[R]]
227; CHECK-NEXT: OpFunctionEnd
228define <4 x i32>  @u16tou32v4(<4 x i16> %a) {
229  %r = zext <4 x i16> %a to <4 x i32>
230  ret <4 x i32>  %r
231}
232