[WebAssembly] Use the new offset syntax for memory operands in inline asm.
[oota-llvm.git] / test / CodeGen / WebAssembly / select.ll
1 ; RUN: llc < %s -asm-verbose=false | FileCheck %s
2 ; RUN: llc < %s -asm-verbose=false -fast-isel | FileCheck %s
3
4 ; Test that wasm select instruction is selected from LLVM select instruction.
5
6 target datalayout = "e-p:32:32-i64:64-n32:64-S128"
7 target triple = "wasm32-unknown-unknown"
8
9 ; CHECK-LABEL: select_i32_bool:
10 ; CHECK-NEXT: .param     i32, i32, i32{{$}}
11 ; CHECK-NEXT: .result    i32{{$}}
12 ; CHECK-NEXT: i32.select $push0=, $0, $1, $2{{$}}
13 ; CHECK-NEXT: return     $pop0{{$}}
14 define i32 @select_i32_bool(i1 zeroext %a, i32 %b, i32 %c) {
15   %cond = select i1 %a, i32 %b, i32 %c
16   ret i32 %cond
17 }
18
19 ; CHECK-LABEL: select_i32_eq:
20 ; CHECK-NEXT: .param     i32, i32, i32{{$}}
21 ; CHECK-NEXT: .result    i32{{$}}
22 ; CHECK-NEXT: i32.select $push0=, $0, $2, $1{{$}}
23 ; CHECK-NEXT: return     $pop0{{$}}
24 define i32 @select_i32_eq(i32 %a, i32 %b, i32 %c) {
25   %cmp = icmp eq i32 %a, 0
26   %cond = select i1 %cmp, i32 %b, i32 %c
27   ret i32 %cond
28 }
29
30 ; CHECK-LABEL: select_i32_ne:
31 ; CHECK-NEXT: .param     i32, i32, i32{{$}}
32 ; CHECK-NEXT: .result    i32{{$}}
33 ; CHECK-NEXT: i32.select $push0=, $0, $1, $2{{$}}
34 ; CHECK-NEXT: return     $pop0{{$}}
35 define i32 @select_i32_ne(i32 %a, i32 %b, i32 %c) {
36   %cmp = icmp ne i32 %a, 0
37   %cond = select i1 %cmp, i32 %b, i32 %c
38   ret i32 %cond
39 }
40
41 ; CHECK-LABEL: select_i64_bool:
42 ; CHECK-NEXT: .param     i32, i64, i64{{$}}
43 ; CHECK-NEXT: .result    i64{{$}}
44 ; CHECK-NEXT: i64.select $push0=, $0, $1, $2{{$}}
45 ; CHECK-NEXT: return     $pop0{{$}}
46 define i64 @select_i64_bool(i1 zeroext %a, i64 %b, i64 %c) {
47   %cond = select i1 %a, i64 %b, i64 %c
48   ret i64 %cond
49 }
50
51 ; CHECK-LABEL: select_i64_eq:
52 ; CHECK-NEXT: .param     i32, i64, i64{{$}}
53 ; CHECK-NEXT: .result    i64{{$}}
54 ; CHECK-NEXT: i64.select $push0=, $0, $2, $1{{$}}
55 ; CHECK-NEXT: return     $pop0{{$}}
56 define i64 @select_i64_eq(i32 %a, i64 %b, i64 %c) {
57   %cmp = icmp eq i32 %a, 0
58   %cond = select i1 %cmp, i64 %b, i64 %c
59   ret i64 %cond
60 }
61
62 ; CHECK-LABEL: select_i64_ne:
63 ; CHECK-NEXT: .param     i32, i64, i64{{$}}
64 ; CHECK-NEXT: .result    i64{{$}}
65 ; CHECK-NEXT: i64.select $push0=, $0, $1, $2{{$}}
66 ; CHECK-NEXT: return     $pop0{{$}}
67 define i64 @select_i64_ne(i32 %a, i64 %b, i64 %c) {
68   %cmp = icmp ne i32 %a, 0
69   %cond = select i1 %cmp, i64 %b, i64 %c
70   ret i64 %cond
71 }
72
73 ; CHECK-LABEL: select_f32_bool:
74 ; CHECK-NEXT: .param     i32, f32, f32{{$}}
75 ; CHECK-NEXT: .result    f32{{$}}
76 ; CHECK-NEXT: f32.select $push0=, $0, $1, $2{{$}}
77 ; CHECK-NEXT: return     $pop0{{$}}
78 define float @select_f32_bool(i1 zeroext %a, float %b, float %c) {
79   %cond = select i1 %a, float %b, float %c
80   ret float %cond
81 }
82
83 ; CHECK-LABEL: select_f32_eq:
84 ; CHECK-NEXT: .param     i32, f32, f32{{$}}
85 ; CHECK-NEXT: .result    f32{{$}}
86 ; CHECK-NEXT: f32.select $push0=, $0, $2, $1{{$}}
87 ; CHECK-NEXT: return     $pop0{{$}}
88 define float @select_f32_eq(i32 %a, float %b, float %c) {
89   %cmp = icmp eq i32 %a, 0
90   %cond = select i1 %cmp, float %b, float %c
91   ret float %cond
92 }
93
94 ; CHECK-LABEL: select_f32_ne:
95 ; CHECK-NEXT: .param     i32, f32, f32{{$}}
96 ; CHECK-NEXT: .result    f32{{$}}
97 ; CHECK-NEXT: f32.select $push0=, $0, $1, $2{{$}}
98 ; CHECK-NEXT: return     $pop0{{$}}
99 define float @select_f32_ne(i32 %a, float %b, float %c) {
100   %cmp = icmp ne i32 %a, 0
101   %cond = select i1 %cmp, float %b, float %c
102   ret float %cond
103 }
104
105 ; CHECK-LABEL: select_f64_bool:
106 ; CHECK-NEXT: .param     i32, f64, f64{{$}}
107 ; CHECK-NEXT: .result    f64{{$}}
108 ; CHECK-NEXT: f64.select $push0=, $0, $1, $2{{$}}
109 ; CHECK-NEXT: return     $pop0{{$}}
110 define double @select_f64_bool(i1 zeroext %a, double %b, double %c) {
111   %cond = select i1 %a, double %b, double %c
112   ret double %cond
113 }
114
115 ; CHECK-LABEL: select_f64_eq:
116 ; CHECK-NEXT: .param     i32, f64, f64{{$}}
117 ; CHECK-NEXT: .result    f64{{$}}
118 ; CHECK-NEXT: f64.select $push0=, $0, $2, $1{{$}}
119 ; CHECK-NEXT: return     $pop0{{$}}
120 define double @select_f64_eq(i32 %a, double %b, double %c) {
121   %cmp = icmp eq i32 %a, 0
122   %cond = select i1 %cmp, double %b, double %c
123   ret double %cond
124 }
125
126 ; CHECK-LABEL: select_f64_ne:
127 ; CHECK-NEXT: .param     i32, f64, f64{{$}}
128 ; CHECK-NEXT: .result    f64{{$}}
129 ; CHECK-NEXT: f64.select $push0=, $0, $1, $2{{$}}
130 ; CHECK-NEXT: return     $pop0{{$}}
131 define double @select_f64_ne(i32 %a, double %b, double %c) {
132   %cmp = icmp ne i32 %a, 0
133   %cond = select i1 %cmp, double %b, double %c
134   ret double %cond
135 }