1; RUN: llc %s -o - | FileCheck %s
2
3target triple = "spirv32-unknown-unknown"
4
5; CHECK-DAG: OpName [[TRUNC32_16:%.*]] "f32tof16"
6; CHECK-DAG: OpName [[EXT16_32:%.*]] "f16tof32"
7
8; CHECK-DAG: OpName [[TRUNC32_16v3:%.*]] "f32tof16v3"
9; CHECK-DAG: OpName [[EXT16_32v3:%.*]] "f16tof32v3"
10
11; CHECK-DAG: OpName [[F32toS32:%.*]] "f32tos32"
12; CHECK-DAG: OpName [[F32toS16:%.*]] "f32tos16"
13; CHECK-DAG: OpName [[F32toS8:%.*]] "f32tos8"
14; CHECK-DAG: OpName [[F16toS32:%.*]] "f16tos32"
15; CHECK-DAG: OpName [[F16toS16:%.*]] "f16tos16"
16; CHECK-DAG: OpName [[F16toS8:%.*]] "f16tos8"
17
18; CHECK-DAG: OpName [[F32toU32v2:%.*]] "f32tou32v2"
19; CHECK-DAG: OpName [[F32toU16v2:%.*]] "f32tou16v2"
20; CHECK-DAG: OpName [[F32toU8v2:%.*]] "f32tou8v2"
21; CHECK-DAG: OpName [[F16toU32v2:%.*]] "f16tou32v2"
22; CHECK-DAG: OpName [[F16toU16v2:%.*]] "f16tou16v2"
23; CHECK-DAG: OpName [[F16toU8v2:%.*]] "f16tou8v2"
24
25; CHECK-DAG: [[F32:%.*]] = OpTypeFloat 32
26; CHECK-DAG: [[F16:%.*]] = OpTypeFloat 16
27; CHECK-DAG: [[F32v2:%.*]] = OpTypeVector [[F32]] 2
28; CHECK-DAG: [[F16v2:%.*]] = OpTypeVector [[F16]] 2
29; CHECK-DAG: [[F32v3:%.*]] = OpTypeVector [[F32]] 3
30; CHECK-DAG: [[F16v3:%.*]] = OpTypeVector [[F16]] 3
31; CHECK-DAG: [[U32:%.*]] = OpTypeInt 32 0
32; CHECK-DAG: [[U16:%.*]] = OpTypeInt 16 0
33; CHECK-DAG: [[U8:%.*]] = OpTypeInt 8 0
34; CHECK-DAG: [[U32v2:%.*]] = OpTypeVector [[U32]] 2
35; CHECK-DAG: [[U16v2:%.*]] = OpTypeVector [[U16]] 2
36; CHECK-DAG: [[U8v2:%.*]] = OpTypeVector [[U8]] 2
37
38
39; CHECK: [[TRUNC32_16]] = OpFunction [[F16]]
40; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32]]
41; CHECK: OpLabel
42; CHECK: [[R:%.*]] = OpFConvert [[F16]] [[A]]
43; CHECK: OpReturnValue [[R]]
44; CHECK-NEXT: OpFunctionEnd
45define half @f32tof16(float %a) {
46    %r = fptrunc float %a to half
47    ret half %r
48}
49
50; CHECK: [[EXT16_32]] = OpFunction [[F32]]
51; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16]]
52; CHECK: OpLabel
53; CHECK: [[R:%.*]] = OpFConvert [[F32]] [[A]]
54; CHECK: OpReturnValue [[R]]
55; CHECK-NEXT: OpFunctionEnd
56define float @f16tof32(half %a) {
57  %r = fpext half %a to float
58  ret float %r
59}
60
61; CHECK: [[TRUNC32_16v3]] = OpFunction [[F16v3]]
62; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32v3]]
63; CHECK: OpLabel
64; CHECK: [[R:%.*]] = OpFConvert [[F16v3]] [[A]]
65; CHECK: OpReturnValue [[R]]
66; CHECK-NEXT: OpFunctionEnd
67define <3 x half> @f32tof16v3(<3 x float> %a) {
68    %r = fptrunc <3 x float> %a to <3 x half>
69    ret <3 x half> %r
70}
71
72; CHECK: [[EXT16_32v3]] = OpFunction [[F32v3]]
73; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16v3]]
74; CHECK: OpLabel
75; CHECK: [[R:%.*]] = OpFConvert [[F32v3]] [[A]]
76; CHECK: OpReturnValue [[R]]
77; CHECK-NEXT: OpFunctionEnd
78define <3 x float> @f16tof32v3(<3 x half> %a) {
79  %r = fpext <3 x half> %a to <3 x float>
80  ret <3 x float> %r
81}
82
83; CHECK: [[F32toS32]] = OpFunction [[U32]]
84; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32]]
85; CHECK: OpLabel
86; CHECK: [[R:%.*]] = OpConvertFToS [[U32]] [[A]]
87; CHECK: OpReturnValue [[R]]
88; CHECK-NEXT: OpFunctionEnd
89define i32 @f32tos32(float %a) {
90  %r = fptosi float %a to i32
91  ret i32 %r
92}
93
94; CHECK: [[F32toS16]] = OpFunction [[U16]]
95; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32]]
96; CHECK: OpLabel
97; CHECK: [[R:%.*]] = OpConvertFToS [[U16]] [[A]]
98; CHECK: OpReturnValue [[R]]
99; CHECK-NEXT: OpFunctionEnd
100define i16 @f32tos16(float %a) {
101  %r = fptosi float %a to i16
102  ret i16 %r
103}
104
105; CHECK: [[F32toS8]] = OpFunction [[U8]]
106; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32]]
107; CHECK: OpLabel
108; CHECK: [[R:%.*]] = OpConvertFToS [[U8]] [[A]]
109; CHECK: OpReturnValue [[R]]
110; CHECK-NEXT: OpFunctionEnd
111define i8 @f32tos8(float %a) {
112  %r = fptosi float %a to i8
113  ret i8 %r
114}
115
116; CHECK: [[F16toS32]] = OpFunction [[U32]]
117; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16]]
118; CHECK: OpLabel
119; CHECK: [[R:%.*]] = OpConvertFToS [[U32]] [[A]]
120; CHECK: OpReturnValue [[R]]
121; CHECK-NEXT: OpFunctionEnd
122define i32 @f16tos32(half %a) {
123  %r = fptosi half %a to i32
124  ret i32 %r
125}
126
127; CHECK: [[F16toS16]] = OpFunction [[U16]]
128; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16]]
129; CHECK: OpLabel
130; CHECK: [[R:%.*]] = OpConvertFToS [[U16]] [[A]]
131; CHECK: OpReturnValue [[R]]
132; CHECK-NEXT: OpFunctionEnd
133define i16 @f16tos16(half %a) {
134  %r = fptosi half %a to i16
135  ret i16 %r
136}
137
138; CHECK: [[F16toS8]] = OpFunction [[U8]]
139; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16]]
140; CHECK: OpLabel
141; CHECK: [[R:%.*]] = OpConvertFToS [[U8]] [[A]]
142; CHECK: OpReturnValue [[R]]
143; CHECK-NEXT: OpFunctionEnd
144define i8 @f16tos8(half %a) {
145  %r = fptosi half %a to i8
146  ret i8 %r
147}
148
149; CHECK: [[F32toU32v2]] = OpFunction [[U32v2]]
150; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32v2]]
151; CHECK: OpLabel
152; CHECK: [[R:%.*]] = OpConvertFToU [[U32v2]] [[A]]
153; CHECK: OpReturnValue [[R]]
154; CHECK-NEXT: OpFunctionEnd
155define <2 x i32> @f32tou32v2(<2 x float> %a) {
156  %r = fptoui <2 x float> %a to <2 x i32>
157  ret <2 x i32> %r
158}
159
160; CHECK: [[F32toU16v2]] = OpFunction [[U16v2]]
161; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32v2]]
162; CHECK: OpLabel
163; CHECK: [[R:%.*]] = OpConvertFToU [[U16v2]] [[A]]
164; CHECK: OpReturnValue [[R]]
165; CHECK-NEXT: OpFunctionEnd
166define <2 x i16> @f32tou16v2(<2 x float> %a) {
167  %r = fptoui <2 x float> %a to <2 x i16>
168  ret <2 x i16> %r
169}
170
171; CHECK: [[F32toU8v2]] = OpFunction [[U8v2]]
172; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32v2]]
173; CHECK: OpLabel
174; CHECK: [[R:%.*]] = OpConvertFToU [[U8v2]] [[A]]
175; CHECK: OpReturnValue [[R]]
176; CHECK-NEXT: OpFunctionEnd
177define <2 x i8> @f32tou8v2(<2 x float> %a) {
178  %r = fptoui <2 x float> %a to <2 x i8>
179  ret <2 x i8> %r
180}
181
182; CHECK: [[F16toU32v2]] = OpFunction [[U32v2]]
183; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16v2]]
184; CHECK: OpLabel
185; CHECK: [[R:%.*]] = OpConvertFToU [[U32v2]] [[A]]
186; CHECK: OpReturnValue [[R]]
187; CHECK-NEXT: OpFunctionEnd
188define <2 x i32> @f16tou32v2(<2 x half> %a) {
189  %r = fptoui <2 x half> %a to <2 x i32>
190  ret <2 x i32> %r
191}
192
193; CHECK: [[F16toU16v2]] = OpFunction [[U16v2]]
194; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16v2]]
195; CHECK: OpLabel
196; CHECK: [[R:%.*]] = OpConvertFToU [[U16v2]] [[A]]
197; CHECK: OpReturnValue [[R]]
198; CHECK-NEXT: OpFunctionEnd
199define <2 x i16> @f16tou16v2(<2 x half> %a) {
200  %r = fptoui <2 x half> %a to <2 x i16>
201  ret <2 x i16> %r
202}
203
204; CHECK: [[F16toU8v2]] = OpFunction [[U8v2]]
205; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16v2]]
206; CHECK: OpLabel
207; CHECK: [[R:%.*]] = OpConvertFToU [[U8v2]] [[A]]
208; CHECK: OpReturnValue [[R]]
209; CHECK-NEXT: OpFunctionEnd
210define <2 x i8> @f16tou8v2(<2 x half> %a) {
211  %r = fptoui <2 x half> %a to <2 x i8>
212  ret <2 x i8> %r
213}
214