blob: 26dc8b74e77c898efd18e35939c1ca4de37c8ef5 [file] [log] [blame]
Karl Schimpfc0fdc272014-09-02 10:47:28 -07001; Tests if we can read cast operations.
2
Karl Schimpf2a5324a2014-09-25 09:37:49 -07003; RUN: %p2i -i %s --insts --no-local-syms | FileCheck %s
Karl Schimpfc0fdc272014-09-02 10:47:28 -07004
5; TODO(kschimpf) Find way to test pointer conversions (since they in general
6; get removed by pnacl-freeze).
7
8define i32 @TruncI64(i64 %v) {
9 %v1 = trunc i64 %v to i1
10 %v8 = trunc i64 %v to i8
11 %v16 = trunc i64 %v to i16
12 %v32 = trunc i64 %v to i32
13 ret i32 %v32
14}
15
16; CHECK: define i32 @TruncI64(i64 %__0) {
17; CHECK-NEXT: __0:
18; CHECK-NEXT: %__1 = trunc i64 %__0 to i1
19; CHECK-NEXT: %__2 = trunc i64 %__0 to i8
20; CHECK-NEXT: %__3 = trunc i64 %__0 to i16
21; CHECK-NEXT: %__4 = trunc i64 %__0 to i32
22; CHECK-NEXT: ret i32 %__4
23; CHECK-NEXT: }
24
25define void @TruncI32(i32 %v) {
26 %v1 = trunc i32 %v to i1
27 %v8 = trunc i32 %v to i8
28 %v16 = trunc i32 %v to i16
29 ret void
30}
31
32; CHECK-NEXT: define void @TruncI32(i32 %__0) {
33; CHECK-NEXT: __0:
34; CHECK-NEXT: %__1 = trunc i32 %__0 to i1
35; CHECK-NEXT: %__2 = trunc i32 %__0 to i8
36; CHECK-NEXT: %__3 = trunc i32 %__0 to i16
37; CHECK-NEXT: ret void
38; CHECK-NEXT: }
39
40define void @TruncI16(i32 %p) {
41 %v = trunc i32 %p to i16
42 %v1 = trunc i16 %v to i1
43 %v8 = trunc i16 %v to i8
44 ret void
45}
46
47; CHECK-NEXT: define void @TruncI16(i32 %__0) {
48; CHECK-NEXT: __0:
49; CHECK-NEXT: %__1 = trunc i32 %__0 to i16
50; CHECK-NEXT: %__2 = trunc i16 %__1 to i1
51; CHECK-NEXT: %__3 = trunc i16 %__1 to i8
52; CHECK-NEXT: ret void
53; CHECK-NEXT: }
54
55define void @TruncI8(i32 %p) {
56 %v = trunc i32 %p to i8
57 %v1 = trunc i8 %v to i1
58 ret void
59}
60
61; CHECK-NEXT: define void @TruncI8(i32 %__0) {
62; CHECK-NEXT: __0:
63; CHECK-NEXT: %__1 = trunc i32 %__0 to i8
64; CHECK-NEXT: %__2 = trunc i8 %__1 to i1
65; CHECK-NEXT: ret void
66; CHECK-NEXT: }
67
68define i64 @ZextI1(i32 %p) {
69 %v = trunc i32 %p to i1
70 %v8 = zext i1 %v to i8
71 %v16 = zext i1 %v to i16
72 %v32 = zext i1 %v to i32
73 %v64 = zext i1 %v to i64
74 ret i64 %v64
75}
76
77; CHECK-NEXT: define i64 @ZextI1(i32 %__0) {
78; CHECK-NEXT: __0:
79; CHECK-NEXT: %__1 = trunc i32 %__0 to i1
80; CHECK-NEXT: %__2 = zext i1 %__1 to i8
81; CHECK-NEXT: %__3 = zext i1 %__1 to i16
82; CHECK-NEXT: %__4 = zext i1 %__1 to i32
83; CHECK-NEXT: %__5 = zext i1 %__1 to i64
84; CHECK-NEXT: ret i64 %__5
85; CHECK-NEXT: }
86
87define i32 @ZextI8(i32 %p) {
88 %v = trunc i32 %p to i8
89 %v16 = zext i8 %v to i16
90 %v32 = zext i8 %v to i32
91 %v64 = zext i8 %v to i64
92 ret i32 %v32
93}
94
95; CHECK-NEXT: define i32 @ZextI8(i32 %__0) {
96; CHECK-NEXT: __0:
97; CHECK-NEXT: %__1 = trunc i32 %__0 to i8
98; CHECK-NEXT: %__2 = zext i8 %__1 to i16
99; CHECK-NEXT: %__3 = zext i8 %__1 to i32
100; CHECK-NEXT: %__4 = zext i8 %__1 to i64
101; CHECK-NEXT: ret i32 %__3
102; CHECK-NEXT: }
103
104define i64 @ZextI16(i32 %p) {
105 %v = trunc i32 %p to i16
106 %v32 = zext i16 %v to i32
107 %v64 = zext i16 %v to i64
108 ret i64 %v64
109}
110
111; CHECK-NEXT: define i64 @ZextI16(i32 %__0) {
112; CHECK-NEXT: __0:
113; CHECK-NEXT: %__1 = trunc i32 %__0 to i16
114; CHECK-NEXT: %__2 = zext i16 %__1 to i32
115; CHECK-NEXT: %__3 = zext i16 %__1 to i64
116; CHECK-NEXT: ret i64 %__3
117; CHECK-NEXT: }
118
119define i64 @Zexti32(i32 %v) {
120 %v64 = zext i32 %v to i64
121 ret i64 %v64
122}
123
124; CHECK-NEXT: define i64 @Zexti32(i32 %__0) {
125; CHECK-NEXT: __0:
126; CHECK-NEXT: %__1 = zext i32 %__0 to i64
127; CHECK-NEXT: ret i64 %__1
128; CHECK-NEXT: }
129
130define i32 @SextI1(i32 %p) {
131 %v = trunc i32 %p to i1
132 %v8 = sext i1 %v to i8
133 %v16 = sext i1 %v to i16
134 %v32 = sext i1 %v to i32
135 %v64 = sext i1 %v to i64
136 ret i32 %v32
137}
138
139; CHECK-NEXT: define i32 @SextI1(i32 %__0) {
140; CHECK-NEXT: __0:
141; CHECK-NEXT: %__1 = trunc i32 %__0 to i1
142; CHECK-NEXT: %__2 = sext i1 %__1 to i8
143; CHECK-NEXT: %__3 = sext i1 %__1 to i16
144; CHECK-NEXT: %__4 = sext i1 %__1 to i32
145; CHECK-NEXT: %__5 = sext i1 %__1 to i64
146; CHECK-NEXT: ret i32 %__4
147; CHECK-NEXT: }
148
149define i64 @SextI8(i32 %p) {
150 %v = trunc i32 %p to i8
151 %v16 = sext i8 %v to i16
152 %v32 = sext i8 %v to i32
153 %v64 = sext i8 %v to i64
154 ret i64 %v64
155}
156
157; CHECK-NEXT: define i64 @SextI8(i32 %__0) {
158; CHECK-NEXT: __0:
159; CHECK-NEXT: %__1 = trunc i32 %__0 to i8
160; CHECK-NEXT: %__2 = sext i8 %__1 to i16
161; CHECK-NEXT: %__3 = sext i8 %__1 to i32
162; CHECK-NEXT: %__4 = sext i8 %__1 to i64
163; CHECK-NEXT: ret i64 %__4
164; CHECK-NEXT: }
165
166define i32 @SextI16(i32 %p) {
167 %v = trunc i32 %p to i16
168 %v32 = sext i16 %v to i32
169 %v64 = sext i16 %v to i64
170 ret i32 %v32
171}
172
173; CHECK-NEXT: define i32 @SextI16(i32 %__0) {
174; CHECK-NEXT: __0:
175; CHECK-NEXT: %__1 = trunc i32 %__0 to i16
176; CHECK-NEXT: %__2 = sext i16 %__1 to i32
177; CHECK-NEXT: %__3 = sext i16 %__1 to i64
178; CHECK-NEXT: ret i32 %__2
179; CHECK-NEXT: }
180
181define i64 @Sexti32(i32 %v) {
182 %v64 = sext i32 %v to i64
183 ret i64 %v64
184}
185
186; CHECK-NEXT: define i64 @Sexti32(i32 %__0) {
187; CHECK-NEXT: __0:
188; CHECK-NEXT: %__1 = sext i32 %__0 to i64
189; CHECK-NEXT: ret i64 %__1
190; CHECK-NEXT: }
191
192define float @Fptrunc(double %v) {
193 %vfloat = fptrunc double %v to float
194 ret float %vfloat
195}
196
197; CHECK-NEXT: define float @Fptrunc(double %__0) {
198; CHECK-NEXT: __0:
199; CHECK-NEXT: %__1 = fptrunc double %__0 to float
200; CHECK-NEXT: ret float %__1
201; CHECK-NEXT: }
202
203define double @Fpext(float %v) {
204 %vdouble = fpext float %v to double
205 ret double %vdouble
206}
207
208; CHECK-NEXT: define double @Fpext(float %__0) {
209; CHECK-NEXT: __0:
210; CHECK-NEXT: %__1 = fpext float %__0 to double
211; CHECK-NEXT: ret double %__1
212; CHECK-NEXT: }
213
214define i32 @FptouiFloat(float %v) {
215 %v1 = fptoui float %v to i1
216 %v8 = fptoui float %v to i8
217 %v16 = fptoui float %v to i16
218 %v32 = fptoui float %v to i32
219 %v64 = fptoui float %v to i64
220 ret i32 %v32
221}
222
223; CHECK-NEXT: define i32 @FptouiFloat(float %__0) {
224; CHECK-NEXT: __0:
225; CHECK-NEXT: %__1 = fptoui float %__0 to i1
226; CHECK-NEXT: %__2 = fptoui float %__0 to i8
227; CHECK-NEXT: %__3 = fptoui float %__0 to i16
228; CHECK-NEXT: %__4 = fptoui float %__0 to i32
229; CHECK-NEXT: %__5 = fptoui float %__0 to i64
230; CHECK-NEXT: ret i32 %__4
231; CHECK-NEXT: }
232
233define i32 @FptouiDouble(double %v) {
234 %v1 = fptoui double %v to i1
235 %v8 = fptoui double %v to i8
236 %v16 = fptoui double %v to i16
237 %v32 = fptoui double %v to i32
238 %v64 = fptoui double %v to i64
239 ret i32 %v32
240}
241
242; CHECK-NEXT: define i32 @FptouiDouble(double %__0) {
243; CHECK-NEXT: __0:
244; CHECK-NEXT: %__1 = fptoui double %__0 to i1
245; CHECK-NEXT: %__2 = fptoui double %__0 to i8
246; CHECK-NEXT: %__3 = fptoui double %__0 to i16
247; CHECK-NEXT: %__4 = fptoui double %__0 to i32
248; CHECK-NEXT: %__5 = fptoui double %__0 to i64
249; CHECK-NEXT: ret i32 %__4
250; CHECK-NEXT: }
251
252define i32 @FptosiFloat(float %v) {
253 %v1 = fptosi float %v to i1
254 %v8 = fptosi float %v to i8
255 %v16 = fptosi float %v to i16
256 %v32 = fptosi float %v to i32
257 %v64 = fptosi float %v to i64
258 ret i32 %v32
259}
260
261; CHECK-NEXT: define i32 @FptosiFloat(float %__0) {
262; CHECK-NEXT: __0:
263; CHECK-NEXT: %__1 = fptosi float %__0 to i1
264; CHECK-NEXT: %__2 = fptosi float %__0 to i8
265; CHECK-NEXT: %__3 = fptosi float %__0 to i16
266; CHECK-NEXT: %__4 = fptosi float %__0 to i32
267; CHECK-NEXT: %__5 = fptosi float %__0 to i64
268; CHECK-NEXT: ret i32 %__4
269; CHECK-NEXT: }
270
271define i32 @FptosiDouble(double %v) {
272 %v1 = fptosi double %v to i1
273 %v8 = fptosi double %v to i8
274 %v16 = fptosi double %v to i16
275 %v32 = fptosi double %v to i32
276 %v64 = fptosi double %v to i64
277 ret i32 %v32
278}
279
280; CHECK-NEXT: define i32 @FptosiDouble(double %__0) {
281; CHECK-NEXT: __0:
282; CHECK-NEXT: %__1 = fptosi double %__0 to i1
283; CHECK-NEXT: %__2 = fptosi double %__0 to i8
284; CHECK-NEXT: %__3 = fptosi double %__0 to i16
285; CHECK-NEXT: %__4 = fptosi double %__0 to i32
286; CHECK-NEXT: %__5 = fptosi double %__0 to i64
287; CHECK-NEXT: ret i32 %__4
288; CHECK-NEXT: }
289
290define float @UitofpI1(i32 %p) {
291 %v = trunc i32 %p to i1
292 %vfloat = uitofp i1 %v to float
293 %vdouble = uitofp i1 %v to double
294 ret float %vfloat
295}
296
297; CHECK-NEXT: define float @UitofpI1(i32 %__0) {
298; CHECK-NEXT: __0:
299; CHECK-NEXT: %__1 = trunc i32 %__0 to i1
300; CHECK-NEXT: %__2 = uitofp i1 %__1 to float
301; CHECK-NEXT: %__3 = uitofp i1 %__1 to double
302; CHECK-NEXT: ret float %__2
303; CHECK-NEXT: }
304
305define float @UitofpI8(i32 %p) {
306 %v = trunc i32 %p to i8
307 %vfloat = uitofp i8 %v to float
308 %vdouble = uitofp i8 %v to double
309 ret float %vfloat
310}
311
312; CHECK-NEXT: define float @UitofpI8(i32 %__0) {
313; CHECK-NEXT: __0:
314; CHECK-NEXT: %__1 = trunc i32 %__0 to i8
315; CHECK-NEXT: %__2 = uitofp i8 %__1 to float
316; CHECK-NEXT: %__3 = uitofp i8 %__1 to double
317; CHECK-NEXT: ret float %__2
318; CHECK-NEXT: }
319
320define float @UitofpI16(i32 %p) {
321 %v = trunc i32 %p to i16
322 %vfloat = uitofp i16 %v to float
323 %vdouble = uitofp i16 %v to double
324 ret float %vfloat
325}
326
327; CHECK-NEXT: define float @UitofpI16(i32 %__0) {
328; CHECK-NEXT: __0:
329; CHECK-NEXT: %__1 = trunc i32 %__0 to i16
330; CHECK-NEXT: %__2 = uitofp i16 %__1 to float
331; CHECK-NEXT: %__3 = uitofp i16 %__1 to double
332; CHECK-NEXT: ret float %__2
333; CHECK-NEXT: }
334
335define float @UitofpI32(i32 %v) {
336 %vfloat = uitofp i32 %v to float
337 %vdouble = uitofp i32 %v to double
338 ret float %vfloat
339}
340
341; CHECK-NEXT: define float @UitofpI32(i32 %__0) {
342; CHECK-NEXT: __0:
343; CHECK-NEXT: %__1 = uitofp i32 %__0 to float
344; CHECK-NEXT: %__2 = uitofp i32 %__0 to double
345; CHECK-NEXT: ret float %__1
346; CHECK-NEXT: }
347
348define float @UitofpI64(i64 %v) {
349 %vfloat = uitofp i64 %v to float
350 %vdouble = uitofp i64 %v to double
351 ret float %vfloat
352}
353
354; CHECK-NEXT: define float @UitofpI64(i64 %__0) {
355; CHECK-NEXT: __0:
356; CHECK-NEXT: %__1 = uitofp i64 %__0 to float
357; CHECK-NEXT: %__2 = uitofp i64 %__0 to double
358; CHECK-NEXT: ret float %__1
359; CHECK-NEXT: }
360
361define float @SitofpI1(i32 %p) {
362 %v = trunc i32 %p to i1
363 %vfloat = sitofp i1 %v to float
364 %vdouble = sitofp i1 %v to double
365 ret float %vfloat
366}
367
368; CHECK-NEXT: define float @SitofpI1(i32 %__0) {
369; CHECK-NEXT: __0:
370; CHECK-NEXT: %__1 = trunc i32 %__0 to i1
371; CHECK-NEXT: %__2 = sitofp i1 %__1 to float
372; CHECK-NEXT: %__3 = sitofp i1 %__1 to double
373; CHECK-NEXT: ret float %__2
374; CHECK-NEXT: }
375
376define float @SitofpI8(i32 %p) {
377 %v = trunc i32 %p to i8
378 %vfloat = sitofp i8 %v to float
379 %vdouble = sitofp i8 %v to double
380 ret float %vfloat
381}
382
383; CHECK-NEXT: define float @SitofpI8(i32 %__0) {
384; CHECK-NEXT: __0:
385; CHECK-NEXT: %__1 = trunc i32 %__0 to i8
386; CHECK-NEXT: %__2 = sitofp i8 %__1 to float
387; CHECK-NEXT: %__3 = sitofp i8 %__1 to double
388; CHECK-NEXT: ret float %__2
389; CHECK-NEXT: }
390
391define float @SitofpI16(i32 %p) {
392 %v = trunc i32 %p to i16
393 %vfloat = sitofp i16 %v to float
394 %vdouble = sitofp i16 %v to double
395 ret float %vfloat
396}
397
398; CHECK-NEXT: define float @SitofpI16(i32 %__0) {
399; CHECK-NEXT: __0:
400; CHECK-NEXT: %__1 = trunc i32 %__0 to i16
401; CHECK-NEXT: %__2 = sitofp i16 %__1 to float
402; CHECK-NEXT: %__3 = sitofp i16 %__1 to double
403; CHECK-NEXT: ret float %__2
404; CHECK-NEXT: }
405
406define float @SitofpI32(i32 %v) {
407 %vfloat = sitofp i32 %v to float
408 %vdouble = sitofp i32 %v to double
409 ret float %vfloat
410}
411
412; CHECK-NEXT: define float @SitofpI32(i32 %__0) {
413; CHECK-NEXT: __0:
414; CHECK-NEXT: %__1 = sitofp i32 %__0 to float
415; CHECK-NEXT: %__2 = sitofp i32 %__0 to double
416; CHECK-NEXT: ret float %__1
417; CHECK-NEXT: }
418
419define float @SitofpI64(i64 %v) {
420 %vfloat = sitofp i64 %v to float
421 %vdouble = sitofp i64 %v to double
422 ret float %vfloat
423}
424
425; CHECK-NEXT: define float @SitofpI64(i64 %__0) {
426; CHECK-NEXT: __0:
427; CHECK-NEXT: %__1 = sitofp i64 %__0 to float
428; CHECK-NEXT: %__2 = sitofp i64 %__0 to double
429; CHECK-NEXT: ret float %__1
430; CHECK-NEXT: }
431
432define float @BitcastI32(i32 %v) {
433 %vfloat = bitcast i32 %v to float
434 ret float %vfloat
435}
436
437; CHECK-NEXT: define float @BitcastI32(i32 %__0) {
438; CHECK-NEXT: __0:
439; CHECK-NEXT: %__1 = bitcast i32 %__0 to float
440; CHECK-NEXT: ret float %__1
441; CHECK-NEXT: }
442
443define double @BitcastI64(i64 %v) {
444 %vdouble = bitcast i64 %v to double
445 ret double %vdouble
446}
447
448; CHECK-NEXT: define double @BitcastI64(i64 %__0) {
449; CHECK-NEXT: __0:
450; CHECK-NEXT: %__1 = bitcast i64 %__0 to double
451; CHECK-NEXT: ret double %__1
452; CHECK-NEXT: }
453
454define i32 @BitcastFloat(float %v) {
455 %vi32 = bitcast float %v to i32
456 ret i32 %vi32
457}
458
459; CHECK-NEXT: define i32 @BitcastFloat(float %__0) {
460; CHECK-NEXT: __0:
461; CHECK-NEXT: %__1 = bitcast float %__0 to i32
462; CHECK-NEXT: ret i32 %__1
463; CHECK-NEXT: }
464
465define i64 @BitcastDouble(double %v) {
466 %vi64 = bitcast double %v to i64
467 ret i64 %vi64
468}
469
470; CHECK-NEXT: define i64 @BitcastDouble(double %__0) {
471; CHECK-NEXT: __0:
472; CHECK-NEXT: %__1 = bitcast double %__0 to i64
473; CHECK-NEXT: ret i64 %__1
474; CHECK-NEXT: }
475
476define void @BitcastV4xFloat(<4 x float> %v) {
477 %v4xi32 = bitcast <4 x float> %v to <4 x i32>
478 %v8xi16 = bitcast <4 x float> %v to <8 x i16>
479 %v16xi8 = bitcast <4 x float> %v to <16 x i8>
480 ret void
481}
482
483; CHECK-NEXT: define void @BitcastV4xFloat(<4 x float> %__0) {
484; CHECK-NEXT: __0:
485; CHECK-NEXT: %__1 = bitcast <4 x float> %__0 to <4 x i32>
486; CHECK-NEXT: %__2 = bitcast <4 x float> %__0 to <8 x i16>
487; CHECK-NEXT: %__3 = bitcast <4 x float> %__0 to <16 x i8>
488; CHECK-NEXT: ret void
489; CHECK-NEXT: }
490
491define void @BitcastV4xi32(<4 x i32> %v) {
492 %v4xfloat = bitcast <4 x i32> %v to <4 x float>
493 %v8xi16 = bitcast <4 x i32> %v to <8 x i16>
494 %v16xi8 = bitcast <4 x i32> %v to <16 x i8>
495 ret void
496}
497
498; CHECK-NEXT: define void @BitcastV4xi32(<4 x i32> %__0) {
499; CHECK-NEXT: __0:
500; CHECK-NEXT: %__1 = bitcast <4 x i32> %__0 to <4 x float>
501; CHECK-NEXT: %__2 = bitcast <4 x i32> %__0 to <8 x i16>
502; CHECK-NEXT: %__3 = bitcast <4 x i32> %__0 to <16 x i8>
503; CHECK-NEXT: ret void
504; CHECK-NEXT: }
505
506define void @BitcastV8xi16(<8 x i16> %v) {
507 %v4xfloat = bitcast <8 x i16> %v to <4 x float>
508 %v4xi32 = bitcast <8 x i16> %v to <4 x i32>
509 %v16xi8 = bitcast <8 x i16> %v to <16 x i8>
510 ret void
511}
512
513; CHECK-NEXT: define void @BitcastV8xi16(<8 x i16> %__0) {
514; CHECK-NEXT: __0:
515; CHECK-NEXT: %__1 = bitcast <8 x i16> %__0 to <4 x float>
516; CHECK-NEXT: %__2 = bitcast <8 x i16> %__0 to <4 x i32>
517; CHECK-NEXT: %__3 = bitcast <8 x i16> %__0 to <16 x i8>
518; CHECK-NEXT: ret void
519; CHECK-NEXT: }
520
521define void @BitcastV16xi8(<16 x i8> %v) {
522 %v4xfloat = bitcast <16 x i8> %v to <4 x float>
523 %v4xi32 = bitcast <16 x i8> %v to <4 x i32>
524 %v8xi16 = bitcast <16 x i8> %v to <8 x i16>
525 ret void
526}
527
528; CHECK-NEXT: define void @BitcastV16xi8(<16 x i8> %__0) {
529; CHECK-NEXT: __0:
530; CHECK-NEXT: %__1 = bitcast <16 x i8> %__0 to <4 x float>
531; CHECK-NEXT: %__2 = bitcast <16 x i8> %__0 to <4 x i32>
532; CHECK-NEXT: %__3 = bitcast <16 x i8> %__0 to <8 x i16>
533; CHECK-NEXT: ret void
534; CHECK-NEXT: }