1*38c902bcSThomas Lively; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -wasm-enable-unimplemented-simd -mattr=+simd128,+sign-ext | FileCheck %s 2*38c902bcSThomas Lively 3*38c902bcSThomas Lively; Test that vector selects of various varieties lower correctly to bitselects. 4*38c902bcSThomas Lively 5*38c902bcSThomas Livelytarget datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" 6*38c902bcSThomas Livelytarget triple = "wasm32-unknown-unknown" 7*38c902bcSThomas Lively 8*38c902bcSThomas Lively; ============================================================================== 9*38c902bcSThomas Lively; 16 x i8 10*38c902bcSThomas Lively; ============================================================================== 11*38c902bcSThomas Lively; CHECK-LABEL: vselect_v16i8: 12*38c902bcSThomas Lively; CHECK-NEXT: .param v128, v128, v128{{$}} 13*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}} 14*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 7{{$}} 15*38c902bcSThomas Lively; CHECK-NEXT: i8x16.shl $push[[L1:[0-9]+]]=, $0, $pop[[L0]]{{$}} 16*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L2:[0-9]+]]=, 7{{$}} 17*38c902bcSThomas Lively; CHECK-NEXT: i8x16.shr_s $push[[L3:[0-9]+]]=, $pop[[L1]], $pop[[L2]]{{$}} 18*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}} 19*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}} 20*38c902bcSThomas Livelydefine <16 x i8> @vselect_v16i8(<16 x i1> %c, <16 x i8> %x, <16 x i8> %y) { 21*38c902bcSThomas Lively %res = select <16 x i1> %c, <16 x i8> %x, <16 x i8> %y 22*38c902bcSThomas Lively ret <16 x i8> %res 23*38c902bcSThomas Lively} 24*38c902bcSThomas Lively 25*38c902bcSThomas Lively; CHECK-LABEL: select_v16i8: 26*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}} 27*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}} 28*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, -1{{$}} 29*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L1:[0-9]+]]=, 0{{$}} 30*38c902bcSThomas Lively; CHECK-NEXT: i32.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}} 31*38c902bcSThomas Lively; CHECK-NEXT: i8x16.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}} 32*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}} 33*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}} 34*38c902bcSThomas Livelydefine <16 x i8> @select_v16i8(i1 %c, <16 x i8> %x, <16 x i8> %y) { 35*38c902bcSThomas Lively %res = select i1 %c, <16 x i8> %x, <16 x i8> %y 36*38c902bcSThomas Lively ret <16 x i8> %res 37*38c902bcSThomas Lively} 38*38c902bcSThomas Lively 39*38c902bcSThomas Lively; CHECK-LABEL: select_cmp_v16i8: 40*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}} 41*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}} 42*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 31 43*38c902bcSThomas Lively; CHECK-NEXT: i32.shr_s $push[[L1:[0-9]+]]=, $0, $pop[[L0]]{{$}} 44*38c902bcSThomas Lively; CHECK-NEXT: i8x16.splat $push[[L2:[0-9]+]]=, $pop[[L1]]{{$}} 45*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L2]]{{$}} 46*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}} 47*38c902bcSThomas Livelydefine <16 x i8> @select_cmp_v16i8(i32 %i, <16 x i8> %x, <16 x i8> %y) { 48*38c902bcSThomas Lively %c = icmp slt i32 %i, 0 49*38c902bcSThomas Lively %res = select i1 %c, <16 x i8> %x, <16 x i8> %y 50*38c902bcSThomas Lively ret <16 x i8> %res 51*38c902bcSThomas Lively} 52*38c902bcSThomas Lively 53*38c902bcSThomas Lively; CHECK-LABEL: select_ne_v16i8: 54*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}} 55*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}} 56*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, -1{{$}} 57*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L1:[0-9]+]]=, 0{{$}} 58*38c902bcSThomas Lively; CHECK-NEXT: i32.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}} 59*38c902bcSThomas Lively; CHECK-NEXT: i8x16.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}} 60*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}} 61*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}} 62*38c902bcSThomas Livelydefine <16 x i8> @select_ne_v16i8(i32 %i, <16 x i8> %x, <16 x i8> %y) { 63*38c902bcSThomas Lively %c = icmp ne i32 %i, 0 64*38c902bcSThomas Lively %res = select i1 %c, <16 x i8> %x, <16 x i8> %y 65*38c902bcSThomas Lively ret <16 x i8> %res 66*38c902bcSThomas Lively} 67*38c902bcSThomas Lively 68*38c902bcSThomas Lively; CHECK-LABEL: select_eq_v16i8: 69*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}} 70*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}} 71*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 0{{$}} 72*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L1:[0-9]+]]=, -1{{$}} 73*38c902bcSThomas Lively; CHECK-NEXT: i32.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}} 74*38c902bcSThomas Lively; CHECK-NEXT: i8x16.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}} 75*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}} 76*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}} 77*38c902bcSThomas Livelydefine <16 x i8> @select_eq_v16i8(i32 %i, <16 x i8> %x, <16 x i8> %y) { 78*38c902bcSThomas Lively %c = icmp eq i32 %i, 0 79*38c902bcSThomas Lively %res = select i1 %c, <16 x i8> %x, <16 x i8> %y 80*38c902bcSThomas Lively ret <16 x i8> %res 81*38c902bcSThomas Lively} 82*38c902bcSThomas Lively 83*38c902bcSThomas Lively; ============================================================================== 84*38c902bcSThomas Lively; 8 x i16 85*38c902bcSThomas Lively; ============================================================================== 86*38c902bcSThomas Lively; CHECK-LABEL: vselect_v8i16: 87*38c902bcSThomas Lively; CHECK-NEXT: .param v128, v128, v128{{$}} 88*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}} 89*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 15{{$}} 90*38c902bcSThomas Lively; CHECK-NEXT: i16x8.shl $push[[L1:[0-9]+]]=, $0, $pop[[L0]]{{$}} 91*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L2:[0-9]+]]=, 15{{$}} 92*38c902bcSThomas Lively; CHECK-NEXT: i16x8.shr_s $push[[L3:[0-9]+]]=, $pop[[L1]], $pop[[L2]]{{$}} 93*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}} 94*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}} 95*38c902bcSThomas Livelydefine <8 x i16> @vselect_v8i16(<8 x i1> %c, <8 x i16> %x, <8 x i16> %y) { 96*38c902bcSThomas Lively %res = select <8 x i1> %c, <8 x i16> %x, <8 x i16> %y 97*38c902bcSThomas Lively ret <8 x i16> %res 98*38c902bcSThomas Lively} 99*38c902bcSThomas Lively 100*38c902bcSThomas Lively; CHECK-LABEL: select_v8i16: 101*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}} 102*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}} 103*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, -1{{$}} 104*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L1:[0-9]+]]=, 0{{$}} 105*38c902bcSThomas Lively; CHECK-NEXT: i32.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}} 106*38c902bcSThomas Lively; CHECK-NEXT: i16x8.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}} 107*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}} 108*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}} 109*38c902bcSThomas Livelydefine <8 x i16> @select_v8i16(i1 %c, <8 x i16> %x, <8 x i16> %y) { 110*38c902bcSThomas Lively %res = select i1 %c, <8 x i16> %x, <8 x i16> %y 111*38c902bcSThomas Lively ret <8 x i16> %res 112*38c902bcSThomas Lively} 113*38c902bcSThomas Lively 114*38c902bcSThomas Lively; CHECK-LABEL: select_cmp_v8i16: 115*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}} 116*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}} 117*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 31{{$}} 118*38c902bcSThomas Lively; CHECK-NEXT: i32.shr_s $push[[L1:[0-9]+]]=, $0, $pop[[L0]]{{$}} 119*38c902bcSThomas Lively; CHECK-NEXT: i16x8.splat $push[[L2:[0-9]+]]=, $pop[[L1]]{{$}} 120*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L2]]{{$}} 121*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}} 122*38c902bcSThomas Livelydefine <8 x i16> @select_cmp_v8i16(i32 %i, <8 x i16> %x, <8 x i16> %y) { 123*38c902bcSThomas Lively %c = icmp slt i32 %i, 0 124*38c902bcSThomas Lively %res = select i1 %c, <8 x i16> %x, <8 x i16> %y 125*38c902bcSThomas Lively ret <8 x i16> %res 126*38c902bcSThomas Lively} 127*38c902bcSThomas Lively 128*38c902bcSThomas Lively; CHECK-LABEL: select_ne_v8i16: 129*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}} 130*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}} 131*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, -1{{$}} 132*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L1:[0-9]+]]=, 0{{$}} 133*38c902bcSThomas Lively; CHECK-NEXT: i32.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}} 134*38c902bcSThomas Lively; CHECK-NEXT: i16x8.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}} 135*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}} 136*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}} 137*38c902bcSThomas Livelydefine <8 x i16> @select_ne_v8i16(i32 %i, <8 x i16> %x, <8 x i16> %y) { 138*38c902bcSThomas Lively %c = icmp ne i32 %i, 0 139*38c902bcSThomas Lively %res = select i1 %c, <8 x i16> %x, <8 x i16> %y 140*38c902bcSThomas Lively ret <8 x i16> %res 141*38c902bcSThomas Lively} 142*38c902bcSThomas Lively 143*38c902bcSThomas Lively; CHECK-LABEL: select_eq_v8i16: 144*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}} 145*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}} 146*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 0{{$}} 147*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L1:[0-9]+]]=, -1{{$}} 148*38c902bcSThomas Lively; CHECK-NEXT: i32.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}} 149*38c902bcSThomas Lively; CHECK-NEXT: i16x8.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}} 150*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}} 151*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}} 152*38c902bcSThomas Livelydefine <8 x i16> @select_eq_v8i16(i32 %i, <8 x i16> %x, <8 x i16> %y) { 153*38c902bcSThomas Lively %c = icmp eq i32 %i, 0 154*38c902bcSThomas Lively %res = select i1 %c, <8 x i16> %x, <8 x i16> %y 155*38c902bcSThomas Lively ret <8 x i16> %res 156*38c902bcSThomas Lively} 157*38c902bcSThomas Lively 158*38c902bcSThomas Lively; ============================================================================== 159*38c902bcSThomas Lively; 4 x i32 160*38c902bcSThomas Lively; ============================================================================== 161*38c902bcSThomas Lively; CHECK-LABEL: vselect_v4i32: 162*38c902bcSThomas Lively; CHECK-NEXT: .param v128, v128, v128{{$}} 163*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}} 164*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 31{{$}} 165*38c902bcSThomas Lively; CHECK-NEXT: i32x4.shl $push[[L1:[0-9]+]]=, $0, $pop[[L0]]{{$}} 166*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L2:[0-9]+]]=, 31{{$}} 167*38c902bcSThomas Lively; CHECK-NEXT: i32x4.shr_s $push[[L3:[0-9]+]]=, $pop[[L1]], $pop[[L2]]{{$}} 168*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}} 169*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}} 170*38c902bcSThomas Livelydefine <4 x i32> @vselect_v4i32(<4 x i1> %c, <4 x i32> %x, <4 x i32> %y) { 171*38c902bcSThomas Lively %res = select <4 x i1> %c, <4 x i32> %x, <4 x i32> %y 172*38c902bcSThomas Lively ret <4 x i32> %res 173*38c902bcSThomas Lively} 174*38c902bcSThomas Lively 175*38c902bcSThomas Lively 176*38c902bcSThomas Lively; CHECK-LABEL: select_v4i32: 177*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}} 178*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}} 179*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, -1{{$}} 180*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L1:[0-9]+]]=, 0{{$}} 181*38c902bcSThomas Lively; CHECK-NEXT: i32.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}} 182*38c902bcSThomas Lively; CHECK-NEXT: i32x4.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}} 183*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}} 184*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}} 185*38c902bcSThomas Livelydefine <4 x i32> @select_v4i32(i1 %c, <4 x i32> %x, <4 x i32> %y) { 186*38c902bcSThomas Lively %res = select i1 %c, <4 x i32> %x, <4 x i32> %y 187*38c902bcSThomas Lively ret <4 x i32> %res 188*38c902bcSThomas Lively} 189*38c902bcSThomas Lively 190*38c902bcSThomas Lively; CHECK-LABEL: select_cmp_v4i32: 191*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}} 192*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}} 193*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 31{{$}} 194*38c902bcSThomas Lively; CHECK-NEXT: i32.shr_s $push[[L1:[0-9]+]]=, $0, $pop[[L0]]{{$}} 195*38c902bcSThomas Lively; CHECK-NEXT: i32x4.splat $push[[L2:[0-9]+]]=, $pop[[L1]]{{$}} 196*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L2]]{{$}} 197*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}} 198*38c902bcSThomas Livelydefine <4 x i32> @select_cmp_v4i32(i32 %i, <4 x i32> %x, <4 x i32> %y) { 199*38c902bcSThomas Lively %c = icmp slt i32 %i, 0 200*38c902bcSThomas Lively %res = select i1 %c, <4 x i32> %x, <4 x i32> %y 201*38c902bcSThomas Lively ret <4 x i32> %res 202*38c902bcSThomas Lively} 203*38c902bcSThomas Lively 204*38c902bcSThomas Lively; CHECK-LABEL: select_ne_v4i32: 205*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}} 206*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}} 207*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, -1{{$}} 208*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L1:[0-9]+]]=, 0{{$}} 209*38c902bcSThomas Lively; CHECK-NEXT: i32.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}} 210*38c902bcSThomas Lively; CHECK-NEXT: i32x4.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}} 211*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}} 212*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}} 213*38c902bcSThomas Livelydefine <4 x i32> @select_ne_v4i32(i32 %i, <4 x i32> %x, <4 x i32> %y) { 214*38c902bcSThomas Lively %c = icmp ne i32 %i, 0 215*38c902bcSThomas Lively %res = select i1 %c, <4 x i32> %x, <4 x i32> %y 216*38c902bcSThomas Lively ret <4 x i32> %res 217*38c902bcSThomas Lively} 218*38c902bcSThomas Lively 219*38c902bcSThomas Lively; CHECK-LABEL: select_eq_v4i32: 220*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}} 221*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}} 222*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 0{{$}} 223*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L1:[0-9]+]]=, -1{{$}} 224*38c902bcSThomas Lively; CHECK-NEXT: i32.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}} 225*38c902bcSThomas Lively; CHECK-NEXT: i32x4.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}} 226*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}} 227*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}} 228*38c902bcSThomas Livelydefine <4 x i32> @select_eq_v4i32(i32 %i, <4 x i32> %x, <4 x i32> %y) { 229*38c902bcSThomas Lively %c = icmp eq i32 %i, 0 230*38c902bcSThomas Lively %res = select i1 %c, <4 x i32> %x, <4 x i32> %y 231*38c902bcSThomas Lively ret <4 x i32> %res 232*38c902bcSThomas Lively} 233*38c902bcSThomas Lively 234*38c902bcSThomas Lively; ============================================================================== 235*38c902bcSThomas Lively; 2 x i64 236*38c902bcSThomas Lively; ============================================================================== 237*38c902bcSThomas Lively; CHECK-LABEL: vselect_v2i64: 238*38c902bcSThomas Lively; CHECK-NEXT: .param v128, v128, v128{{$}} 239*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}} 240*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 63{{$}} 241*38c902bcSThomas Lively; CHECK-NEXT: i64x2.shl $push[[L1:[0-9]+]]=, $0, $pop[[L0]]{{$}} 242*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L2:[0-9]+]]=, 63{{$}} 243*38c902bcSThomas Lively; CHECK-NEXT: i64x2.shr_s $push[[L3:[0-9]+]]=, $pop[[L1]], $pop[[L2]]{{$}} 244*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}} 245*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}} 246*38c902bcSThomas Livelydefine <2 x i64> @vselect_v2i64(<2 x i1> %c, <2 x i64> %x, <2 x i64> %y) { 247*38c902bcSThomas Lively %res = select <2 x i1> %c, <2 x i64> %x, <2 x i64> %y 248*38c902bcSThomas Lively ret <2 x i64> %res 249*38c902bcSThomas Lively} 250*38c902bcSThomas Lively 251*38c902bcSThomas Lively; CHECK-LABEL: select_v2i64: 252*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}} 253*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}} 254*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L0:[0-9]+]]=, -1{{$}} 255*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L1:[0-9]+]]=, 0{{$}} 256*38c902bcSThomas Lively; CHECK-NEXT: i64.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}} 257*38c902bcSThomas Lively; CHECK-NEXT: i64x2.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}} 258*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}} 259*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}} 260*38c902bcSThomas Livelydefine <2 x i64> @select_v2i64(i1 %c, <2 x i64> %x, <2 x i64> %y) { 261*38c902bcSThomas Lively %res = select i1 %c, <2 x i64> %x, <2 x i64> %y 262*38c902bcSThomas Lively ret <2 x i64> %res 263*38c902bcSThomas Lively} 264*38c902bcSThomas Lively 265*38c902bcSThomas Lively; CHECK-LABEL: select_cmp_v2i64: 266*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}} 267*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}} 268*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L0:[0-9]+]]=, -1{{$}} 269*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L1:[0-9]+]]=, 0{{$}} 270*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L2:[0-9]+]]=, 0{{$}} 271*38c902bcSThomas Lively; CHECK-NEXT: i32.lt_s $push[[L3:[0-9]+]]=, $0, $pop[[L2]]{{$}} 272*38c902bcSThomas Lively; CHECK-NEXT: i64.select $push[[L4:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $pop[[L3]]{{$}} 273*38c902bcSThomas Lively; CHECK-NEXT: i64x2.splat $push[[L5:[0-9]+]]=, $pop[[L4]]{{$}} 274*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L5]]{{$}} 275*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}} 276*38c902bcSThomas Livelydefine <2 x i64> @select_cmp_v2i64(i32 %i, <2 x i64> %x, <2 x i64> %y) { 277*38c902bcSThomas Lively %c = icmp slt i32 %i, 0 278*38c902bcSThomas Lively %res = select i1 %c, <2 x i64> %x, <2 x i64> %y 279*38c902bcSThomas Lively ret <2 x i64> %res 280*38c902bcSThomas Lively} 281*38c902bcSThomas Lively 282*38c902bcSThomas Lively; CHECK-LABEL: select_ne_v2i64: 283*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}} 284*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}} 285*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L0:[0-9]+]]=, -1{{$}} 286*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L1:[0-9]+]]=, 0{{$}} 287*38c902bcSThomas Lively; CHECK-NEXT: i64.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}} 288*38c902bcSThomas Lively; CHECK-NEXT: i64x2.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}} 289*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}} 290*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}} 291*38c902bcSThomas Livelydefine <2 x i64> @select_ne_v2i64(i32 %i, <2 x i64> %x, <2 x i64> %y) { 292*38c902bcSThomas Lively %c = icmp ne i32 %i, 0 293*38c902bcSThomas Lively %res = select i1 %c, <2 x i64> %x, <2 x i64> %y 294*38c902bcSThomas Lively ret <2 x i64> %res 295*38c902bcSThomas Lively} 296*38c902bcSThomas Lively 297*38c902bcSThomas Lively; CHECK-LABEL: select_eq_v2i64: 298*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}} 299*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}} 300*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L0:[0-9]+]]=, 0{{$}} 301*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L1:[0-9]+]]=, -1{{$}} 302*38c902bcSThomas Lively; CHECK-NEXT: i64.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}} 303*38c902bcSThomas Lively; CHECK-NEXT: i64x2.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}} 304*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}} 305*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}} 306*38c902bcSThomas Livelydefine <2 x i64> @select_eq_v2i64(i32 %i, <2 x i64> %x, <2 x i64> %y) { 307*38c902bcSThomas Lively %c = icmp eq i32 %i, 0 308*38c902bcSThomas Lively %res = select i1 %c, <2 x i64> %x, <2 x i64> %y 309*38c902bcSThomas Lively ret <2 x i64> %res 310*38c902bcSThomas Lively} 311*38c902bcSThomas Lively 312*38c902bcSThomas Lively; ============================================================================== 313*38c902bcSThomas Lively; 4 x float 314*38c902bcSThomas Lively; ============================================================================== 315*38c902bcSThomas Lively; CHECK-LABEL: vselect_v4f32: 316*38c902bcSThomas Lively; CHECK-NEXT: .param v128, v128, v128{{$}} 317*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}} 318*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 31{{$}} 319*38c902bcSThomas Lively; CHECK-NEXT: i32x4.shl $push[[L1:[0-9]+]]=, $0, $pop[[L0]]{{$}} 320*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L2:[0-9]+]]=, 31{{$}} 321*38c902bcSThomas Lively; CHECK-NEXT: i32x4.shr_s $push[[L3:[0-9]+]]=, $pop[[L1]], $pop[[L2]]{{$}} 322*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}} 323*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}} 324*38c902bcSThomas Livelydefine <4 x float> @vselect_v4f32(<4 x i1> %c, <4 x float> %x, <4 x float> %y) { 325*38c902bcSThomas Lively %res = select <4 x i1> %c, <4 x float> %x, <4 x float> %y 326*38c902bcSThomas Lively ret <4 x float> %res 327*38c902bcSThomas Lively} 328*38c902bcSThomas Lively 329*38c902bcSThomas Lively; CHECK-LABEL: select_v4f32: 330*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}} 331*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}} 332*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, -1{{$}} 333*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L1:[0-9]+]]=, 0{{$}} 334*38c902bcSThomas Lively; CHECK-NEXT: i32.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}} 335*38c902bcSThomas Lively; CHECK-NEXT: i32x4.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}} 336*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}} 337*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}} 338*38c902bcSThomas Livelydefine <4 x float> @select_v4f32(i1 %c, <4 x float> %x, <4 x float> %y) { 339*38c902bcSThomas Lively %res = select i1 %c, <4 x float> %x, <4 x float> %y 340*38c902bcSThomas Lively ret <4 x float> %res 341*38c902bcSThomas Lively} 342*38c902bcSThomas Lively 343*38c902bcSThomas Lively; CHECK-LABEL: select_cmp_v4f32: 344*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}} 345*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}} 346*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 31{{$}} 347*38c902bcSThomas Lively; CHECK-NEXT: i32.shr_s $push[[L1:[0-9]+]]=, $0, $pop[[L0]]{{$}} 348*38c902bcSThomas Lively; CHECK-NEXT: i32x4.splat $push[[L2:[0-9]+]]=, $pop[[L1]]{{$}} 349*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L2]]{{$}} 350*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}} 351*38c902bcSThomas Livelydefine <4 x float> @select_cmp_v4f32(i32 %i, <4 x float> %x, <4 x float> %y) { 352*38c902bcSThomas Lively %c = icmp slt i32 %i, 0 353*38c902bcSThomas Lively %res = select i1 %c, <4 x float> %x, <4 x float> %y 354*38c902bcSThomas Lively ret <4 x float> %res 355*38c902bcSThomas Lively} 356*38c902bcSThomas Lively 357*38c902bcSThomas Lively; CHECK-LABEL: select_ne_v4f32: 358*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}} 359*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}} 360*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, -1{{$}} 361*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L1:[0-9]+]]=, 0{{$}} 362*38c902bcSThomas Lively; CHECK-NEXT: i32.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}} 363*38c902bcSThomas Lively; CHECK-NEXT: i32x4.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}} 364*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}} 365*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}} 366*38c902bcSThomas Livelydefine <4 x float> @select_ne_v4f32(i32 %i, <4 x float> %x, <4 x float> %y) { 367*38c902bcSThomas Lively %c = icmp ne i32 %i, 0 368*38c902bcSThomas Lively %res = select i1 %c, <4 x float> %x, <4 x float> %y 369*38c902bcSThomas Lively ret <4 x float> %res 370*38c902bcSThomas Lively} 371*38c902bcSThomas Lively 372*38c902bcSThomas Lively; CHECK-LABEL: select_eq_v4f32: 373*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}} 374*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}} 375*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 0{{$}} 376*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L1:[0-9]+]]=, -1{{$}} 377*38c902bcSThomas Lively; CHECK-NEXT: i32.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}} 378*38c902bcSThomas Lively; CHECK-NEXT: i32x4.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}} 379*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}} 380*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}} 381*38c902bcSThomas Livelydefine <4 x float> @select_eq_v4f32(i32 %i, <4 x float> %x, <4 x float> %y) { 382*38c902bcSThomas Lively %c = icmp eq i32 %i, 0 383*38c902bcSThomas Lively %res = select i1 %c, <4 x float> %x, <4 x float> %y 384*38c902bcSThomas Lively ret <4 x float> %res 385*38c902bcSThomas Lively} 386*38c902bcSThomas Lively 387*38c902bcSThomas Lively; ============================================================================== 388*38c902bcSThomas Lively; 2 x double 389*38c902bcSThomas Lively; ============================================================================== 390*38c902bcSThomas Lively; CHECK-LABEL: vselect_v2f64: 391*38c902bcSThomas Lively; CHECK-NEXT: .param v128, v128, v128{{$}} 392*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}} 393*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 63{{$}} 394*38c902bcSThomas Lively; CHECK-NEXT: i64x2.shl $push[[L1:[0-9]+]]=, $0, $pop[[L0]]{{$}} 395*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L2:[0-9]+]]=, 63{{$}} 396*38c902bcSThomas Lively; CHECK-NEXT: i64x2.shr_s $push[[L3:[0-9]+]]=, $pop[[L1]], $pop[[L2]]{{$}} 397*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}} 398*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}} 399*38c902bcSThomas Livelydefine <2 x double> @vselect_v2f64(<2 x i1> %c, <2 x double> %x, <2 x double> %y) { 400*38c902bcSThomas Lively %res = select <2 x i1> %c, <2 x double> %x, <2 x double> %y 401*38c902bcSThomas Lively ret <2 x double> %res 402*38c902bcSThomas Lively} 403*38c902bcSThomas Lively 404*38c902bcSThomas Lively; CHECK-LABEL: select_v2f64: 405*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}} 406*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}} 407*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L0:[0-9]+]]=, -1{{$}} 408*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L1:[0-9]+]]=, 0{{$}} 409*38c902bcSThomas Lively; CHECK-NEXT: i64.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}} 410*38c902bcSThomas Lively; CHECK-NEXT: i64x2.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}} 411*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}} 412*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}} 413*38c902bcSThomas Livelydefine <2 x double> @select_v2f64(i1 %c, <2 x double> %x, <2 x double> %y) { 414*38c902bcSThomas Lively %res = select i1 %c, <2 x double> %x, <2 x double> %y 415*38c902bcSThomas Lively ret <2 x double> %res 416*38c902bcSThomas Lively} 417*38c902bcSThomas Lively 418*38c902bcSThomas Lively; CHECK-LABEL: select_cmp_v2f64: 419*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}} 420*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}} 421*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L0:[0-9]+]]=, -1{{$}} 422*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L1:[0-9]+]]=, 0{{$}} 423*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L2:[0-9]+]]=, 0{{$}} 424*38c902bcSThomas Lively; CHECK-NEXT: i32.lt_s $push[[L3:[0-9]+]]=, $0, $pop[[L2]]{{$}} 425*38c902bcSThomas Lively; CHECK-NEXT: i64.select $push[[L4:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $pop[[L3]]{{$}} 426*38c902bcSThomas Lively; CHECK-NEXT: i64x2.splat $push[[L5:[0-9]+]]=, $pop[[L4]]{{$}} 427*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L5]]{{$}} 428*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}} 429*38c902bcSThomas Livelydefine <2 x double> @select_cmp_v2f64(i32 %i, <2 x double> %x, <2 x double> %y) { 430*38c902bcSThomas Lively %c = icmp slt i32 %i, 0 431*38c902bcSThomas Lively %res = select i1 %c, <2 x double> %x, <2 x double> %y 432*38c902bcSThomas Lively ret <2 x double> %res 433*38c902bcSThomas Lively} 434*38c902bcSThomas Lively 435*38c902bcSThomas Lively; CHECK-LABEL: select_ne_v2f64: 436*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}} 437*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}} 438*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L0:[0-9]+]]=, -1{{$}} 439*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L1:[0-9]+]]=, 0{{$}} 440*38c902bcSThomas Lively; CHECK-NEXT: i64.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}} 441*38c902bcSThomas Lively; CHECK-NEXT: i64x2.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}} 442*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}} 443*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}} 444*38c902bcSThomas Livelydefine <2 x double> @select_ne_v2f64(i32 %i, <2 x double> %x, <2 x double> %y) { 445*38c902bcSThomas Lively %c = icmp ne i32 %i, 0 446*38c902bcSThomas Lively %res = select i1 %c, <2 x double> %x, <2 x double> %y 447*38c902bcSThomas Lively ret <2 x double> %res 448*38c902bcSThomas Lively} 449*38c902bcSThomas Lively 450*38c902bcSThomas Lively; CHECK-LABEL: select_eq_v2f64: 451*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}} 452*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}} 453*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L0:[0-9]+]]=, 0{{$}} 454*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L1:[0-9]+]]=, -1{{$}} 455*38c902bcSThomas Lively; CHECK-NEXT: i64.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}} 456*38c902bcSThomas Lively; CHECK-NEXT: i64x2.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}} 457*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}} 458*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}} 459*38c902bcSThomas Livelydefine <2 x double> @select_eq_v2f64(i32 %i, <2 x double> %x, <2 x double> %y) { 460*38c902bcSThomas Lively %c = icmp eq i32 %i, 0 461*38c902bcSThomas Lively %res = select i1 %c, <2 x double> %x, <2 x double> %y 462*38c902bcSThomas Lively ret <2 x double> %res 463*38c902bcSThomas Lively} 464