1 ; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -disable-wasm-explicit-locals | FileCheck %s
2 ; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -disable-wasm-explicit-locals -fast-isel -fast-isel-abort=1 | FileCheck %s
4 ; Test that wasm select instruction is selected from LLVM select instruction.
6 target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
7 target triple = "wasm32-unknown-unknown"
9 ; CHECK-LABEL: select_i32_bool:
10 ; CHECK-NEXT: .param i32, i32, i32{{$}}
11 ; CHECK-NEXT: .result i32{{$}}
12 ; CHECK-NEXT: i32.select $push0=, $1, $2, $0{{$}}
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
19 ; CHECK-LABEL: select_i32_eq:
20 ; CHECK-NEXT: .param i32, i32, i32{{$}}
21 ; CHECK-NEXT: .result i32{{$}}
22 ; CHECK-NEXT: i32.select $push0=, $2, $1, $0{{$}}
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
30 ; CHECK-LABEL: select_i32_ne:
31 ; CHECK-NEXT: .param i32, i32, i32{{$}}
32 ; CHECK-NEXT: .result i32{{$}}
33 ; CHECK-NEXT: i32.select $push0=, $1, $2, $0{{$}}
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
41 ; CHECK-LABEL: select_i64_bool:
42 ; CHECK-NEXT: .param i32, i64, i64{{$}}
43 ; CHECK-NEXT: .result i64{{$}}
44 ; CHECK-NEXT: i64.select $push0=, $1, $2, $0{{$}}
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
51 ; CHECK-LABEL: select_i64_eq:
52 ; CHECK-NEXT: .param i32, i64, i64{{$}}
53 ; CHECK-NEXT: .result i64{{$}}
54 ; CHECK-NEXT: i64.select $push0=, $2, $1, $0{{$}}
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
62 ; CHECK-LABEL: select_i64_ne:
63 ; CHECK-NEXT: .param i32, i64, i64{{$}}
64 ; CHECK-NEXT: .result i64{{$}}
65 ; CHECK-NEXT: i64.select $push0=, $1, $2, $0{{$}}
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
73 ; CHECK-LABEL: select_f32_bool:
74 ; CHECK-NEXT: .param i32, f32, f32{{$}}
75 ; CHECK-NEXT: .result f32{{$}}
76 ; CHECK-NEXT: f32.select $push0=, $1, $2, $0{{$}}
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
83 ; CHECK-LABEL: select_f32_eq:
84 ; CHECK-NEXT: .param i32, f32, f32{{$}}
85 ; CHECK-NEXT: .result f32{{$}}
86 ; CHECK-NEXT: f32.select $push0=, $2, $1, $0{{$}}
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
94 ; CHECK-LABEL: select_f32_ne:
95 ; CHECK-NEXT: .param i32, f32, f32{{$}}
96 ; CHECK-NEXT: .result f32{{$}}
97 ; CHECK-NEXT: f32.select $push0=, $1, $2, $0{{$}}
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
105 ; CHECK-LABEL: select_f64_bool:
106 ; CHECK-NEXT: .param i32, f64, f64{{$}}
107 ; CHECK-NEXT: .result f64{{$}}
108 ; CHECK-NEXT: f64.select $push0=, $1, $2, $0{{$}}
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
115 ; CHECK-LABEL: select_f64_eq:
116 ; CHECK-NEXT: .param i32, f64, f64{{$}}
117 ; CHECK-NEXT: .result f64{{$}}
118 ; CHECK-NEXT: f64.select $push0=, $2, $1, $0{{$}}
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
126 ; CHECK-LABEL: select_f64_ne:
127 ; CHECK-NEXT: .param i32, f64, f64{{$}}
128 ; CHECK-NEXT: .result f64{{$}}
129 ; CHECK-NEXT: f64.select $push0=, $1, $2, $0{{$}}
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