1; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers | FileCheck %s --check-prefixes CHECK,SLOW 2; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -fast-isel -fast-isel-abort=1 | FileCheck %s 3 4; Test that wasm select instruction is selected from LLVM select instruction. 5 6target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" 7target 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=, $1, $2, $0{{$}} 13; CHECK-NEXT: return $pop0{{$}} 14define 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_bool_nozext: 20; CHECK-NEXT: .param i32, i32, i32{{$}} 21; CHECK-NEXT: .result i32{{$}} 22; SLOW-NEXT: i32.select $push0=, $1, $2, $0{{$}} 23; SLOW-NEXT: return $pop0{{$}} 24define i32 @select_i32_bool_nozext(i1 %a, i32 %b, i32 %c) { 25 %cond = select i1 %a, i32 %b, i32 %c 26 ret i32 %cond 27} 28 29; CHECK-LABEL: select_i32_eq: 30; CHECK-NEXT: .param i32, i32, i32{{$}} 31; CHECK-NEXT: .result i32{{$}} 32; CHECK-NEXT: i32.select $push0=, $2, $1, $0{{$}} 33; CHECK-NEXT: return $pop0{{$}} 34define i32 @select_i32_eq(i32 %a, i32 %b, i32 %c) { 35 %cmp = icmp eq i32 %a, 0 36 %cond = select i1 %cmp, i32 %b, i32 %c 37 ret i32 %cond 38} 39 40; CHECK-LABEL: select_i32_ne: 41; CHECK-NEXT: .param i32, i32, i32{{$}} 42; CHECK-NEXT: .result i32{{$}} 43; CHECK-NEXT: i32.select $push0=, $1, $2, $0{{$}} 44; CHECK-NEXT: return $pop0{{$}} 45define i32 @select_i32_ne(i32 %a, i32 %b, i32 %c) { 46 %cmp = icmp ne i32 %a, 0 47 %cond = select i1 %cmp, i32 %b, i32 %c 48 ret i32 %cond 49} 50 51; CHECK-LABEL: select_i64_bool: 52; CHECK-NEXT: .param i32, i64, i64{{$}} 53; CHECK-NEXT: .result i64{{$}} 54; CHECK-NEXT: i64.select $push0=, $1, $2, $0{{$}} 55; CHECK-NEXT: return $pop0{{$}} 56define i64 @select_i64_bool(i1 zeroext %a, i64 %b, i64 %c) { 57 %cond = select i1 %a, i64 %b, i64 %c 58 ret i64 %cond 59} 60 61; CHECK-LABEL: select_i64_bool_nozext: 62; CHECK-NEXT: .param i32, i64, i64{{$}} 63; CHECK-NEXT: .result i64{{$}} 64; SLOW-NEXT: i64.select $push0=, $1, $2, $0{{$}} 65; SLOW-NEXT: return $pop0{{$}} 66define i64 @select_i64_bool_nozext(i1 %a, i64 %b, i64 %c) { 67 %cond = select i1 %a, i64 %b, i64 %c 68 ret i64 %cond 69} 70 71; CHECK-LABEL: select_i64_eq: 72; CHECK-NEXT: .param i32, i64, i64{{$}} 73; CHECK-NEXT: .result i64{{$}} 74; CHECK-NEXT: i64.select $push0=, $2, $1, $0{{$}} 75; CHECK-NEXT: return $pop0{{$}} 76define i64 @select_i64_eq(i32 %a, i64 %b, i64 %c) { 77 %cmp = icmp eq i32 %a, 0 78 %cond = select i1 %cmp, i64 %b, i64 %c 79 ret i64 %cond 80} 81 82; CHECK-LABEL: select_i64_ne: 83; CHECK-NEXT: .param i32, i64, i64{{$}} 84; CHECK-NEXT: .result i64{{$}} 85; CHECK-NEXT: i64.select $push0=, $1, $2, $0{{$}} 86; CHECK-NEXT: return $pop0{{$}} 87define i64 @select_i64_ne(i32 %a, i64 %b, i64 %c) { 88 %cmp = icmp ne i32 %a, 0 89 %cond = select i1 %cmp, i64 %b, i64 %c 90 ret i64 %cond 91} 92 93; CHECK-LABEL: select_f32_bool: 94; CHECK-NEXT: .param i32, f32, f32{{$}} 95; CHECK-NEXT: .result f32{{$}} 96; CHECK-NEXT: f32.select $push0=, $1, $2, $0{{$}} 97; CHECK-NEXT: return $pop0{{$}} 98define float @select_f32_bool(i1 zeroext %a, float %b, float %c) { 99 %cond = select i1 %a, float %b, float %c 100 ret float %cond 101} 102 103; CHECK-LABEL: select_f32_bool_nozext: 104; CHECK-NEXT: .param i32, f32, f32{{$}} 105; CHECK-NEXT: .result f32{{$}} 106; SLOW-NEXT: f32.select $push0=, $1, $2, $0{{$}} 107; SLOW-NEXT: return $pop0{{$}} 108define float @select_f32_bool_nozext(i1 %a, float %b, float %c) { 109 %cond = select i1 %a, float %b, float %c 110 ret float %cond 111} 112 113; CHECK-LABEL: select_f32_eq: 114; CHECK-NEXT: .param i32, f32, f32{{$}} 115; CHECK-NEXT: .result f32{{$}} 116; CHECK-NEXT: f32.select $push0=, $2, $1, $0{{$}} 117; CHECK-NEXT: return $pop0{{$}} 118define float @select_f32_eq(i32 %a, float %b, float %c) { 119 %cmp = icmp eq i32 %a, 0 120 %cond = select i1 %cmp, float %b, float %c 121 ret float %cond 122} 123 124; CHECK-LABEL: select_f32_ne: 125; CHECK-NEXT: .param i32, f32, f32{{$}} 126; CHECK-NEXT: .result f32{{$}} 127; CHECK-NEXT: f32.select $push0=, $1, $2, $0{{$}} 128; CHECK-NEXT: return $pop0{{$}} 129define float @select_f32_ne(i32 %a, float %b, float %c) { 130 %cmp = icmp ne i32 %a, 0 131 %cond = select i1 %cmp, float %b, float %c 132 ret float %cond 133} 134 135; CHECK-LABEL: select_f64_bool: 136; CHECK-NEXT: .param i32, f64, f64{{$}} 137; CHECK-NEXT: .result f64{{$}} 138; CHECK-NEXT: f64.select $push0=, $1, $2, $0{{$}} 139; CHECK-NEXT: return $pop0{{$}} 140define double @select_f64_bool(i1 zeroext %a, double %b, double %c) { 141 %cond = select i1 %a, double %b, double %c 142 ret double %cond 143} 144 145; CHECK-LABEL: select_f64_bool_nozext: 146; CHECK-NEXT: .param i32, f64, f64{{$}} 147; CHECK-NEXT: .result f64{{$}} 148; SLOW-NEXT: f64.select $push0=, $1, $2, $0{{$}} 149; SLOW-NEXT: return $pop0{{$}} 150define double @select_f64_bool_nozext(i1 %a, double %b, double %c) { 151 %cond = select i1 %a, double %b, double %c 152 ret double %cond 153} 154 155; CHECK-LABEL: select_f64_eq: 156; CHECK-NEXT: .param i32, f64, f64{{$}} 157; CHECK-NEXT: .result f64{{$}} 158; CHECK-NEXT: f64.select $push0=, $2, $1, $0{{$}} 159; CHECK-NEXT: return $pop0{{$}} 160define double @select_f64_eq(i32 %a, double %b, double %c) { 161 %cmp = icmp eq i32 %a, 0 162 %cond = select i1 %cmp, double %b, double %c 163 ret double %cond 164} 165 166; CHECK-LABEL: select_f64_ne: 167; CHECK-NEXT: .param i32, f64, f64{{$}} 168; CHECK-NEXT: .result f64{{$}} 169; CHECK-NEXT: f64.select $push0=, $1, $2, $0{{$}} 170; CHECK-NEXT: return $pop0{{$}} 171define double @select_f64_ne(i32 %a, double %b, double %c) { 172 %cmp = icmp ne i32 %a, 0 173 %cond = select i1 %cmp, double %b, double %c 174 ret double %cond 175} 176