[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / AMDGPU / llvm.amdgcn.exp.ll
blobcdfe9b460a01689b8e85beea0255b71a0f634d0b
1 ; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -strict-whitespace -check-prefix=GCN %s
2 ; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -strict-whitespace -check-prefix=GCN %s
4 declare void @llvm.amdgcn.exp.f32(i32, i32, float, float, float, float, i1, i1) #1
5 declare void @llvm.amdgcn.exp.i32(i32, i32, i32, i32, i32, i32, i1, i1) #1
7 ; GCN-LABEL: {{^}}test_export_zeroes_f32:
8 ; GCN: exp mrt0 off, off, off, off{{$}}
9 ; GCN: exp mrt0 off, off, off, off done{{$}}
10 define amdgpu_kernel void @test_export_zeroes_f32() #0 {
12   call void @llvm.amdgcn.exp.f32(i32 0, i32 0, float 0.0, float 0.0, float 0.0, float 0.0, i1 false, i1 false)
13   call void @llvm.amdgcn.exp.f32(i32 0, i32 0, float 0.0, float 0.0, float 0.0, float 0.0, i1 true, i1 false)
14   ret void
17 ; FIXME: Should not set up registers for the unused source registers.
19 ; GCN-LABEL: {{^}}test_export_en_src0_f32:
20 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
21 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
22 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
23 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
24 ; GCN: exp mrt0 [[SRC0]], off, off, off done{{$}}
25 define amdgpu_kernel void @test_export_en_src0_f32() #0 {
26   call void @llvm.amdgcn.exp.f32(i32 0, i32 1, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
27   ret void
30 ; GCN-LABEL: {{^}}test_export_en_src1_f32:
31 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
32 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
33 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
34 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
35 ; GCN: exp mrt0 off, [[SRC1]], off, off done{{$}}
36 define amdgpu_kernel void @test_export_en_src1_f32() #0 {
37   call void @llvm.amdgcn.exp.f32(i32 0, i32 2, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
38   ret void
41 ; GCN-LABEL: {{^}}test_export_en_src2_f32:
42 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
43 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
44 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
45 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
46 ; GCN: exp mrt0 off, off, [[SRC2]], off done{{$}}
47 define amdgpu_kernel void @test_export_en_src2_f32() #0 {
48   call void @llvm.amdgcn.exp.f32(i32 0, i32 4, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
49   ret void
52 ; GCN-LABEL: {{^}}test_export_en_src3_f32:
53 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
54 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
55 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
56 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
57 ; GCN: exp mrt0 off, off, off, [[SRC3]] done{{$}}
58 define amdgpu_kernel void @test_export_en_src3_f32() #0 {
59   call void @llvm.amdgcn.exp.f32(i32 0, i32 8, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
60   ret void
63 ; GCN-LABEL: {{^}}test_export_en_src0_src1_f32:
64 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
65 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
66 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
67 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
68 ; GCN: exp mrt0 [[SRC0]], [[SRC1]], off, off done{{$}}
69 define amdgpu_kernel void @test_export_en_src0_src1_f32() #0 {
70   call void @llvm.amdgcn.exp.f32(i32 0, i32 3, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
71   ret void
74 ; GCN-LABEL: {{^}}test_export_en_src0_src2_f32:
75 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
76 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
77 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
78 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
79 ; GCN: exp mrt0 [[SRC0]], off, [[SRC2]], off done{{$}}
80 define amdgpu_kernel void @test_export_en_src0_src2_f32() #0 {
81   call void @llvm.amdgcn.exp.f32(i32 0, i32 5, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
82   ret void
85 ; GCN-LABEL: {{^}}test_export_en_src0_src3_f32:
86 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
87 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
88 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
89 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
90 ; GCN: exp mrt0 [[SRC0]], off, off, [[SRC3]]{{$}}
91 ; GCN: exp mrt0 [[SRC0]], off, off, [[SRC3]] done{{$}}
92 define amdgpu_kernel void @test_export_en_src0_src3_f32() #0 {
93   call void @llvm.amdgcn.exp.f32(i32 0, i32 9, float 1.0, float 2.0, float 0.5, float 4.0, i1 false, i1 false)
94   call void @llvm.amdgcn.exp.f32(i32 0, i32 9, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
95   ret void
98 ; GCN-LABEL: {{^}}test_export_en_src0_src1_src2_src3_f32:
99 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
100 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
101 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
102 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
103 ; GCN: exp mrt0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
104 ; GCN: exp mrt0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
105 define amdgpu_kernel void @test_export_en_src0_src1_src2_src3_f32() #0 {
106   call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 false, i1 false)
107   call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
108   ret void
111 ; GCN-LABEL: {{^}}test_export_mrt7_f32:
112 ; GCN-DAG: v_mov_b32_e32 [[VHALF:v[0-9]+]], 0.5
113 ; GCN: exp mrt7 [[VHALF]], [[VHALF]], [[VHALF]], [[VHALF]]{{$}}
114 ; GCN: exp mrt7 [[VHALF]], [[VHALF]], [[VHALF]], [[VHALF]] done{{$}}
115 define amdgpu_kernel void @test_export_mrt7_f32() #0 {
116   call void @llvm.amdgcn.exp.f32(i32 7, i32 15, float 0.5, float 0.5, float 0.5, float 0.5, i1 false, i1 false)
117   call void @llvm.amdgcn.exp.f32(i32 7, i32 15, float 0.5, float 0.5, float 0.5, float 0.5, i1 true, i1 false)
118   ret void
121 ; GCN-LABEL: {{^}}test_export_z_f32:
122 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
123 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
124 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
125 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
126 ; GCN: exp mrtz [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
127 ; GCN: exp mrtz [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
128 define amdgpu_kernel void @test_export_z_f32() #0 {
129   call void @llvm.amdgcn.exp.f32(i32 8, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 false, i1 false)
130   call void @llvm.amdgcn.exp.f32(i32 8, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
131   ret void
134 ; GCN-LABEL: {{^}}test_export_null_f32:
135 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
136 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
137 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
138 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
139 ; GCN: exp null [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
140 ; GCN: exp null [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
141 define amdgpu_kernel void @test_export_null_f32() #0 {
142   call void @llvm.amdgcn.exp.f32(i32 9, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 false, i1 false)
143   call void @llvm.amdgcn.exp.f32(i32 9, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
144   ret void
147 ; GCN-LABEL: {{^}}test_export_reserved10_f32:
148 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
149 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
150 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
151 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
152 ; GCN: exp invalid_target_10 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
153 ; GCN: exp invalid_target_10 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
154 define amdgpu_kernel void @test_export_reserved10_f32() #0 {
155   call void @llvm.amdgcn.exp.f32(i32 10, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 false, i1 false)
156   call void @llvm.amdgcn.exp.f32(i32 10, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
157   ret void
160 ; GCN-LABEL: {{^}}test_export_reserved11_f32:
161 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
162 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
163 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
164 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
165 ; GCN: exp invalid_target_11 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
166 ; GCN: exp invalid_target_11 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
167 define amdgpu_kernel void @test_export_reserved11_f32() #0 {
168   call void @llvm.amdgcn.exp.f32(i32 11, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 false, i1 false)
169   call void @llvm.amdgcn.exp.f32(i32 11, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
170   ret void
173 ; GCN-LABEL: {{^}}test_export_pos0_f32:
174 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
175 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
176 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
177 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
178 ; GCN: exp pos0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
179 ; GCN: exp pos0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
180 define amdgpu_kernel void @test_export_pos0_f32() #0 {
181   call void @llvm.amdgcn.exp.f32(i32 12, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 false, i1 false)
182   call void @llvm.amdgcn.exp.f32(i32 12, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
183   ret void
186 ; GCN-LABEL: {{^}}test_export_pos3_f32:
187 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
188 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
189 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
190 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
191 ; GCN: exp pos3 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
192 ; GCN: exp pos3 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
193 define amdgpu_kernel void @test_export_pos3_f32() #0 {
194   call void @llvm.amdgcn.exp.f32(i32 15, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 false, i1 false)
195   call void @llvm.amdgcn.exp.f32(i32 15, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
196   ret void
199 ; GCN-LABEL: {{^}}test_export_param0_f32:
200 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
201 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
202 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
203 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
204 ; GCN: exp param0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
205 ; GCN: exp param0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
206 define amdgpu_kernel void @test_export_param0_f32() #0 {
207   call void @llvm.amdgcn.exp.f32(i32 32, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 false, i1 false)
208   call void @llvm.amdgcn.exp.f32(i32 32, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
209   ret void
212 ; GCN-LABEL: {{^}}test_export_param31_f32:
213 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
214 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
215 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
216 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
217 ; GCN: exp param31 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
218 ; GCN: exp param31 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
219 define amdgpu_kernel void @test_export_param31_f32() #0 {
220   call void @llvm.amdgcn.exp.f32(i32 63, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 false, i1 false)
221   call void @llvm.amdgcn.exp.f32(i32 63, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
222   ret void
225 ; GCN-LABEL: {{^}}test_export_vm_f32:
226 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
227 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
228 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
229 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
230 ; GCN: exp mrt0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] vm{{$}}
231 ; GCN: exp mrt0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done vm{{$}}
232 define amdgpu_kernel void @test_export_vm_f32() #0 {
233   call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 false, i1 true)
234   call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 true)
235   ret void
252 ; GCN-LABEL: {{^}}test_export_zeroes_i32:
253 ; GCN: exp mrt0 off, off, off, off{{$}}
254 ; GCN: exp mrt0 off, off, off, off done{{$}}
255 define amdgpu_kernel void @test_export_zeroes_i32() #0 {
257   call void @llvm.amdgcn.exp.i32(i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i1 false, i1 false)
258   call void @llvm.amdgcn.exp.i32(i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i1 true, i1 false)
259   ret void
262 ; FIXME: Should not set up registers for the unused source registers.
264 ; GCN-LABEL: {{^}}test_export_en_src0_i32:
265 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
266 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
267 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
268 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
269 ; GCN: exp mrt0 [[SRC0]], off, off, off done{{$}}
270 define amdgpu_kernel void @test_export_en_src0_i32() #0 {
271   call void @llvm.amdgcn.exp.i32(i32 0, i32 1, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
272   ret void
275 ; GCN-LABEL: {{^}}test_export_en_src1_i32:
276 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
277 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
278 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
279 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
280 ; GCN: exp mrt0 off, [[SRC1]], off, off done{{$}}
281 define amdgpu_kernel void @test_export_en_src1_i32() #0 {
282   call void @llvm.amdgcn.exp.i32(i32 0, i32 2, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
283   ret void
286 ; GCN-LABEL: {{^}}test_export_en_src2_i32:
287 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
288 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
289 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
290 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
291 ; GCN: exp mrt0 off, off, [[SRC2]], off done{{$}}
292 define amdgpu_kernel void @test_export_en_src2_i32() #0 {
293   call void @llvm.amdgcn.exp.i32(i32 0, i32 4, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
294   ret void
297 ; GCN-LABEL: {{^}}test_export_en_src3_i32:
298 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
299 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
300 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
301 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
302 ; GCN: exp mrt0 off, off, off, [[SRC3]] done{{$}}
303 define amdgpu_kernel void @test_export_en_src3_i32() #0 {
304   call void @llvm.amdgcn.exp.i32(i32 0, i32 8, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
305   ret void
308 ; GCN-LABEL: {{^}}test_export_en_src0_src1_i32:
309 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
310 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
311 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
312 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
313 ; GCN: exp mrt0 [[SRC0]], [[SRC1]], off, off done{{$}}
314 define amdgpu_kernel void @test_export_en_src0_src1_i32() #0 {
315   call void @llvm.amdgcn.exp.i32(i32 0, i32 3, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
316   ret void
319 ; GCN-LABEL: {{^}}test_export_en_src0_src2_i32:
320 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
321 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
322 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
323 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
324 ; GCN: exp mrt0 [[SRC0]], off, [[SRC2]], off done{{$}}
325 define amdgpu_kernel void @test_export_en_src0_src2_i32() #0 {
326   call void @llvm.amdgcn.exp.i32(i32 0, i32 5, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
327   ret void
330 ; GCN-LABEL: {{^}}test_export_en_src0_src3_i32:
331 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
332 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
333 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
334 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
335 ; GCN: exp mrt0 [[SRC0]], off, off, [[SRC3]]{{$}}
336 ; GCN: exp mrt0 [[SRC0]], off, off, [[SRC3]] done{{$}}
337 define amdgpu_kernel void @test_export_en_src0_src3_i32() #0 {
338   call void @llvm.amdgcn.exp.i32(i32 0, i32 9, i32 1, i32 2, i32 5, i32 4, i1 false, i1 false)
339   call void @llvm.amdgcn.exp.i32(i32 0, i32 9, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
340   ret void
343 ; GCN-LABEL: {{^}}test_export_en_src0_src1_src2_src3_i32:
344 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
345 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
346 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
347 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
348 ; GCN: exp mrt0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
349 ; GCN: exp mrt0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
350 define amdgpu_kernel void @test_export_en_src0_src1_src2_src3_i32() #0 {
351   call void @llvm.amdgcn.exp.i32(i32 0, i32 15, i32 1, i32 2, i32 5, i32 4, i1 false, i1 false)
352   call void @llvm.amdgcn.exp.i32(i32 0, i32 15, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
353   ret void
356 ; GCN-LABEL: {{^}}test_export_mrt7_i32:
357 ; GCN-DAG: v_mov_b32_e32 [[VHALF:v[0-9]+]], 5
358 ; GCN: exp mrt7 [[VHALF]], [[VHALF]], [[VHALF]], [[VHALF]]{{$}}
359 ; GCN: exp mrt7 [[VHALF]], [[VHALF]], [[VHALF]], [[VHALF]] done{{$}}
360 define amdgpu_kernel void @test_export_mrt7_i32() #0 {
361   call void @llvm.amdgcn.exp.i32(i32 7, i32 15, i32 5, i32 5, i32 5, i32 5, i1 false, i1 false)
362   call void @llvm.amdgcn.exp.i32(i32 7, i32 15, i32 5, i32 5, i32 5, i32 5, i1 true, i1 false)
363   ret void
366 ; GCN-LABEL: {{^}}test_export_z_i32:
367 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
368 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
369 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
370 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
371 ; GCN: exp mrtz [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
372 ; GCN: exp mrtz [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
373 define amdgpu_kernel void @test_export_z_i32() #0 {
374   call void @llvm.amdgcn.exp.i32(i32 8, i32 15, i32 1, i32 2, i32 5, i32 4, i1 false, i1 false)
375   call void @llvm.amdgcn.exp.i32(i32 8, i32 15, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
376   ret void
379 ; GCN-LABEL: {{^}}test_export_null_i32:
380 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
381 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
382 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
383 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
384 ; GCN: exp null [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
385 ; GCN: exp null [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
386 define amdgpu_kernel void @test_export_null_i32() #0 {
387   call void @llvm.amdgcn.exp.i32(i32 9, i32 15, i32 1, i32 2, i32 5, i32 4, i1 false, i1 false)
388   call void @llvm.amdgcn.exp.i32(i32 9, i32 15, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
389   ret void
392 ; GCN-LABEL: {{^}}test_export_reserved10_i32:
393 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
394 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
395 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
396 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
397 ; GCN: exp invalid_target_10 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
398 ; GCN: exp invalid_target_10 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
399 define amdgpu_kernel void @test_export_reserved10_i32() #0 {
400   call void @llvm.amdgcn.exp.i32(i32 10, i32 15, i32 1, i32 2, i32 5, i32 4, i1 false, i1 false)
401   call void @llvm.amdgcn.exp.i32(i32 10, i32 15, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
402   ret void
405 ; GCN-LABEL: {{^}}test_export_reserved11_i32:
406 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
407 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
408 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
409 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
410 ; GCN: exp invalid_target_11 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
411 ; GCN: exp invalid_target_11 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
412 define amdgpu_kernel void @test_export_reserved11_i32() #0 {
413   call void @llvm.amdgcn.exp.i32(i32 11, i32 15, i32 1, i32 2, i32 5, i32 4, i1 false, i1 false)
414   call void @llvm.amdgcn.exp.i32(i32 11, i32 15, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
415   ret void
418 ; GCN-LABEL: {{^}}test_export_pos0_i32:
419 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
420 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
421 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
422 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
423 ; GCN: exp pos0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
424 ; GCN: exp pos0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
425 define amdgpu_kernel void @test_export_pos0_i32() #0 {
426   call void @llvm.amdgcn.exp.i32(i32 12, i32 15, i32 1, i32 2, i32 5, i32 4, i1 false, i1 false)
427   call void @llvm.amdgcn.exp.i32(i32 12, i32 15, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
428   ret void
431 ; GCN-LABEL: {{^}}test_export_pos3_i32:
432 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
433 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
434 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
435 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
436 ; GCN: exp pos3 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
437 ; GCN: exp pos3 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
438 define amdgpu_kernel void @test_export_pos3_i32() #0 {
439   call void @llvm.amdgcn.exp.i32(i32 15, i32 15, i32 1, i32 2, i32 5, i32 4, i1 false, i1 false)
440   call void @llvm.amdgcn.exp.i32(i32 15, i32 15, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
441   ret void
444 ; GCN-LABEL: {{^}}test_export_param0_i32:
445 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
446 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
447 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
448 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
449 ; GCN: exp param0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
450 ; GCN: exp param0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
451 define amdgpu_kernel void @test_export_param0_i32() #0 {
452   call void @llvm.amdgcn.exp.i32(i32 32, i32 15, i32 1, i32 2, i32 5, i32 4, i1 false, i1 false)
453   call void @llvm.amdgcn.exp.i32(i32 32, i32 15, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
454   ret void
457 ; GCN-LABEL: {{^}}test_export_param31_i32:
458 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
459 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
460 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
461 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
462 ; GCN: exp param31 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
463 ; GCN: exp param31 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
464 define amdgpu_kernel void @test_export_param31_i32() #0 {
465   call void @llvm.amdgcn.exp.i32(i32 63, i32 15, i32 1, i32 2, i32 5, i32 4, i1 false, i1 false)
466   call void @llvm.amdgcn.exp.i32(i32 63, i32 15, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
467   ret void
470 ; GCN-LABEL: {{^}}test_export_vm_i32:
471 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
472 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
473 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
474 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
475 ; GCN: exp mrt0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] vm{{$}}
476 ; GCN: exp mrt0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done vm{{$}}
477 define amdgpu_kernel void @test_export_vm_i32() #0 {
478   call void @llvm.amdgcn.exp.i32(i32 0, i32 15, i32 1, i32 2, i32 5, i32 4, i1 false, i1 true)
479   call void @llvm.amdgcn.exp.i32(i32 0, i32 15, i32 1, i32 2, i32 5, i32 4, i1 true, i1 true)
480   ret void
483 ; GCN-LABEL: {{^}}test_if_export_f32:
484 ; GCN: s_cbranch_execz
485 ; GCN: exp
486 define amdgpu_ps void @test_if_export_f32(i32 %flag, float %x, float %y, float %z, float %w) #0 {
487   %cc = icmp eq i32 %flag, 0
488   br i1 %cc, label %end, label %exp
490 exp:
491   call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float %x, float %y, float %z, float %w, i1 false, i1 false)
492   br label %end
494 end:
495   ret void
498 ; GCN-LABEL: {{^}}test_if_export_vm_f32:
499 ; GCN: s_cbranch_execz
500 ; GCN: exp
501 define amdgpu_ps void @test_if_export_vm_f32(i32 %flag, float %x, float %y, float %z, float %w) #0 {
502   %cc = icmp eq i32 %flag, 0
503   br i1 %cc, label %end, label %exp
505 exp:
506   call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float %x, float %y, float %z, float %w, i1 false, i1 true)
507   br label %end
509 end:
510   ret void
513 ; GCN-LABEL: {{^}}test_if_export_done_f32:
514 ; GCN: s_cbranch_execz
515 ; GCN: exp
516 define amdgpu_ps void @test_if_export_done_f32(i32 %flag, float %x, float %y, float %z, float %w) #0 {
517   %cc = icmp eq i32 %flag, 0
518   br i1 %cc, label %end, label %exp
520 exp:
521   call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float %x, float %y, float %z, float %w, i1 true, i1 false)
522   br label %end
524 end:
525   ret void
528 ; GCN-LABEL: {{^}}test_if_export_vm_done_f32:
529 ; GCN: s_cbranch_execz
530 ; GCN: exp
531 define amdgpu_ps void @test_if_export_vm_done_f32(i32 %flag, float %x, float %y, float %z, float %w) #0 {
532   %cc = icmp eq i32 %flag, 0
533   br i1 %cc, label %end, label %exp
535 exp:
536   call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float %x, float %y, float %z, float %w, i1 true, i1 true)
537   br label %end
539 end:
540   ret void
543 attributes #0 = { nounwind }
544 attributes #1 = { nounwind inaccessiblememonly }