Home | History | Annotate | Download | only in WebAssembly
      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
      3 
      4 ; Test that wasm select instruction is selected from LLVM select instruction.
      5 
      6 target datalayout = "e-m: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=, $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
     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=, $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
     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=, $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
     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=, $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
     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=, $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
     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=, $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
     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=, $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
     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=, $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
     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=, $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
    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=, $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
    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=, $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
    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=, $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
    134   ret double %cond
    135 }
    136