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