625 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -verify-machineinstrs -mattr=+simd128 | FileCheck %s3 4; Test that vector selects of various varieties lower correctly.5 6target triple = "wasm32-unknown-unknown"7 8; ==============================================================================9; 16 x i810; ==============================================================================11define <16 x i8> @vselect_v16i8(<16 x i1> %c, <16 x i8> %x, <16 x i8> %y) {12; CHECK-LABEL: vselect_v16i8:13; CHECK: .functype vselect_v16i8 (v128, v128, v128) -> (v128)14; CHECK-NEXT: # %bb.0:15; CHECK-NEXT: local.get 116; CHECK-NEXT: local.get 217; CHECK-NEXT: local.get 018; CHECK-NEXT: i32.const 719; CHECK-NEXT: i8x16.shl20; CHECK-NEXT: i32.const 721; CHECK-NEXT: i8x16.shr_s22; CHECK-NEXT: v128.bitselect23; CHECK-NEXT: # fallthrough-return24 %res = select <16 x i1> %c, <16 x i8> %x, <16 x i8> %y25 ret <16 x i8> %res26}27 28define <16 x i8> @vselect_cmp_v16i8(<16 x i8> %a, <16 x i8> %b,29; CHECK-LABEL: vselect_cmp_v16i8:30; CHECK: .functype vselect_cmp_v16i8 (v128, v128, v128, v128) -> (v128)31; CHECK-NEXT: # %bb.0:32; CHECK-NEXT: local.get 233; CHECK-NEXT: local.get 334; CHECK-NEXT: local.get 035; CHECK-NEXT: local.get 136; CHECK-NEXT: i8x16.lt_s37; CHECK-NEXT: v128.bitselect38; CHECK-NEXT: # fallthrough-return39 <16 x i8> %x, <16 x i8> %y) {40 %c = icmp slt <16 x i8> %a, %b41 %res = select <16 x i1> %c, <16 x i8> %x, <16 x i8> %y42 ret <16 x i8> %res43}44 45define <16 x i8> @select_v16i8(i1 zeroext %c, <16 x i8> %x, <16 x i8> %y) {46; CHECK-LABEL: select_v16i8:47; CHECK: .functype select_v16i8 (i32, v128, v128) -> (v128)48; CHECK-NEXT: # %bb.0:49; CHECK-NEXT: local.get 150; CHECK-NEXT: local.get 251; CHECK-NEXT: local.get 052; CHECK-NEXT: v128.select53; CHECK-NEXT: # fallthrough-return54 %res = select i1 %c, <16 x i8> %x, <16 x i8> %y55 ret <16 x i8> %res56}57 58define <16 x i8> @select_cmp_v16i8(i32 %i, <16 x i8> %x, <16 x i8> %y) {59; CHECK-LABEL: select_cmp_v16i8:60; CHECK: .functype select_cmp_v16i8 (i32, v128, v128) -> (v128)61; CHECK-NEXT: # %bb.0:62; CHECK-NEXT: local.get 163; CHECK-NEXT: local.get 264; CHECK-NEXT: local.get 065; CHECK-NEXT: i32.const 066; CHECK-NEXT: i32.lt_s67; CHECK-NEXT: v128.select68; CHECK-NEXT: # fallthrough-return69 %c = icmp slt i32 %i, 070 %res = select i1 %c, <16 x i8> %x, <16 x i8> %y71 ret <16 x i8> %res72}73 74define <16 x i8> @select_ne_v16i8(i32 %i, <16 x i8> %x, <16 x i8> %y) {75; CHECK-LABEL: select_ne_v16i8:76; CHECK: .functype select_ne_v16i8 (i32, v128, v128) -> (v128)77; CHECK-NEXT: # %bb.0:78; CHECK-NEXT: local.get 179; CHECK-NEXT: local.get 280; CHECK-NEXT: local.get 081; CHECK-NEXT: v128.select82; CHECK-NEXT: # fallthrough-return83 %c = icmp ne i32 %i, 084 %res = select i1 %c, <16 x i8> %x, <16 x i8> %y85 ret <16 x i8> %res86}87 88define <16 x i8> @select_eq_v16i8(i32 %i, <16 x i8> %x, <16 x i8> %y) {89; CHECK-LABEL: select_eq_v16i8:90; CHECK: .functype select_eq_v16i8 (i32, v128, v128) -> (v128)91; CHECK-NEXT: # %bb.0:92; CHECK-NEXT: local.get 293; CHECK-NEXT: local.get 194; CHECK-NEXT: local.get 095; CHECK-NEXT: v128.select96; CHECK-NEXT: # fallthrough-return97 %c = icmp eq i32 %i, 098 %res = select i1 %c, <16 x i8> %x, <16 x i8> %y99 ret <16 x i8> %res100}101 102define <8 x i16> @vselect_v8i16(<8 x i1> %c, <8 x i16> %x, <8 x i16> %y) {103; CHECK-LABEL: vselect_v8i16:104; CHECK: .functype vselect_v8i16 (v128, v128, v128) -> (v128)105; CHECK-NEXT: # %bb.0:106; CHECK-NEXT: local.get 1107; CHECK-NEXT: local.get 2108; CHECK-NEXT: local.get 0109; CHECK-NEXT: i32.const 15110; CHECK-NEXT: i16x8.shl111; CHECK-NEXT: i32.const 15112; CHECK-NEXT: i16x8.shr_s113; CHECK-NEXT: v128.bitselect114; CHECK-NEXT: # fallthrough-return115 %res = select <8 x i1> %c, <8 x i16> %x, <8 x i16> %y116 ret <8 x i16> %res117}118 119define <8 x i16> @vselect_cmp_v8i16(<8 x i16> %a, <8 x i16> %b,120; CHECK-LABEL: vselect_cmp_v8i16:121; CHECK: .functype vselect_cmp_v8i16 (v128, v128, v128, v128) -> (v128)122; CHECK-NEXT: # %bb.0:123; CHECK-NEXT: local.get 2124; CHECK-NEXT: local.get 3125; CHECK-NEXT: local.get 0126; CHECK-NEXT: local.get 1127; CHECK-NEXT: i16x8.lt_s128; CHECK-NEXT: v128.bitselect129; CHECK-NEXT: # fallthrough-return130 <8 x i16> %x, <8 x i16> %y) {131 %c = icmp slt <8 x i16> %a, %b132 %res = select <8 x i1> %c, <8 x i16> %x, <8 x i16> %y133 ret <8 x i16> %res134}135 136define <8 x i16> @select_v8i16(i1 zeroext %c, <8 x i16> %x, <8 x i16> %y) {137; CHECK-LABEL: select_v8i16:138; CHECK: .functype select_v8i16 (i32, v128, v128) -> (v128)139; CHECK-NEXT: # %bb.0:140; CHECK-NEXT: local.get 1141; CHECK-NEXT: local.get 2142; CHECK-NEXT: local.get 0143; CHECK-NEXT: v128.select144; CHECK-NEXT: # fallthrough-return145 %res = select i1 %c, <8 x i16> %x, <8 x i16> %y146 ret <8 x i16> %res147}148 149define <8 x i16> @select_cmp_v8i16(i32 %i, <8 x i16> %x, <8 x i16> %y) {150; CHECK-LABEL: select_cmp_v8i16:151; CHECK: .functype select_cmp_v8i16 (i32, v128, v128) -> (v128)152; CHECK-NEXT: # %bb.0:153; CHECK-NEXT: local.get 1154; CHECK-NEXT: local.get 2155; CHECK-NEXT: local.get 0156; CHECK-NEXT: i32.const 0157; CHECK-NEXT: i32.lt_s158; CHECK-NEXT: v128.select159; CHECK-NEXT: # fallthrough-return160 %c = icmp slt i32 %i, 0161 %res = select i1 %c, <8 x i16> %x, <8 x i16> %y162 ret <8 x i16> %res163}164 165define <8 x i16> @select_ne_v8i16(i32 %i, <8 x i16> %x, <8 x i16> %y) {166; CHECK-LABEL: select_ne_v8i16:167; CHECK: .functype select_ne_v8i16 (i32, v128, v128) -> (v128)168; CHECK-NEXT: # %bb.0:169; CHECK-NEXT: local.get 1170; CHECK-NEXT: local.get 2171; CHECK-NEXT: local.get 0172; CHECK-NEXT: v128.select173; CHECK-NEXT: # fallthrough-return174 %c = icmp ne i32 %i, 0175 %res = select i1 %c, <8 x i16> %x, <8 x i16> %y176 ret <8 x i16> %res177}178 179define <8 x i16> @select_eq_v8i16(i32 %i, <8 x i16> %x, <8 x i16> %y) {180; CHECK-LABEL: select_eq_v8i16:181; CHECK: .functype select_eq_v8i16 (i32, v128, v128) -> (v128)182; CHECK-NEXT: # %bb.0:183; CHECK-NEXT: local.get 2184; CHECK-NEXT: local.get 1185; CHECK-NEXT: local.get 0186; CHECK-NEXT: v128.select187; CHECK-NEXT: # fallthrough-return188 %c = icmp eq i32 %i, 0189 %res = select i1 %c, <8 x i16> %x, <8 x i16> %y190 ret <8 x i16> %res191}192 193define <4 x i32> @vselect_v4i32(<4 x i1> %c, <4 x i32> %x, <4 x i32> %y) {194; CHECK-LABEL: vselect_v4i32:195; CHECK: .functype vselect_v4i32 (v128, v128, v128) -> (v128)196; CHECK-NEXT: # %bb.0:197; CHECK-NEXT: local.get 1198; CHECK-NEXT: local.get 2199; CHECK-NEXT: local.get 0200; CHECK-NEXT: i32.const 31201; CHECK-NEXT: i32x4.shl202; CHECK-NEXT: i32.const 31203; CHECK-NEXT: i32x4.shr_s204; CHECK-NEXT: v128.bitselect205; CHECK-NEXT: # fallthrough-return206 %res = select <4 x i1> %c, <4 x i32> %x, <4 x i32> %y207 ret <4 x i32> %res208}209 210define <4 x i32> @vselect_cmp_v4i32(<4 x i32> %a, <4 x i32> %b,211; CHECK-LABEL: vselect_cmp_v4i32:212; CHECK: .functype vselect_cmp_v4i32 (v128, v128, v128, v128) -> (v128)213; CHECK-NEXT: # %bb.0:214; CHECK-NEXT: local.get 2215; CHECK-NEXT: local.get 3216; CHECK-NEXT: local.get 0217; CHECK-NEXT: local.get 1218; CHECK-NEXT: i32x4.lt_s219; CHECK-NEXT: v128.bitselect220; CHECK-NEXT: # fallthrough-return221 <4 x i32> %x, <4 x i32> %y) {222 %c = icmp slt <4 x i32> %a, %b223 %res = select <4 x i1> %c, <4 x i32> %x, <4 x i32> %y224 ret <4 x i32> %res225}226 227define <4 x i32> @select_v4i32(i1 zeroext %c, <4 x i32> %x, <4 x i32> %y) {228; CHECK-LABEL: select_v4i32:229; CHECK: .functype select_v4i32 (i32, v128, v128) -> (v128)230; CHECK-NEXT: # %bb.0:231; CHECK-NEXT: local.get 1232; CHECK-NEXT: local.get 2233; CHECK-NEXT: local.get 0234; CHECK-NEXT: v128.select235; CHECK-NEXT: # fallthrough-return236 %res = select i1 %c, <4 x i32> %x, <4 x i32> %y237 ret <4 x i32> %res238}239 240define <4 x i32> @select_cmp_v4i32(i32 %i, <4 x i32> %x, <4 x i32> %y) {241; CHECK-LABEL: select_cmp_v4i32:242; CHECK: .functype select_cmp_v4i32 (i32, v128, v128) -> (v128)243; CHECK-NEXT: # %bb.0:244; CHECK-NEXT: local.get 1245; CHECK-NEXT: local.get 2246; CHECK-NEXT: local.get 0247; CHECK-NEXT: i32.const 0248; CHECK-NEXT: i32.lt_s249; CHECK-NEXT: v128.select250; CHECK-NEXT: # fallthrough-return251 %c = icmp slt i32 %i, 0252 %res = select i1 %c, <4 x i32> %x, <4 x i32> %y253 ret <4 x i32> %res254}255 256define <4 x i32> @select_ne_v4i32(i32 %i, <4 x i32> %x, <4 x i32> %y) {257; CHECK-LABEL: select_ne_v4i32:258; CHECK: .functype select_ne_v4i32 (i32, v128, v128) -> (v128)259; CHECK-NEXT: # %bb.0:260; CHECK-NEXT: local.get 1261; CHECK-NEXT: local.get 2262; CHECK-NEXT: local.get 0263; CHECK-NEXT: v128.select264; CHECK-NEXT: # fallthrough-return265 %c = icmp ne i32 %i, 0266 %res = select i1 %c, <4 x i32> %x, <4 x i32> %y267 ret <4 x i32> %res268}269 270define <4 x i32> @select_eq_v4i32(i32 %i, <4 x i32> %x, <4 x i32> %y) {271; CHECK-LABEL: select_eq_v4i32:272; CHECK: .functype select_eq_v4i32 (i32, v128, v128) -> (v128)273; CHECK-NEXT: # %bb.0:274; CHECK-NEXT: local.get 2275; CHECK-NEXT: local.get 1276; CHECK-NEXT: local.get 0277; CHECK-NEXT: v128.select278; CHECK-NEXT: # fallthrough-return279 %c = icmp eq i32 %i, 0280 %res = select i1 %c, <4 x i32> %x, <4 x i32> %y281 ret <4 x i32> %res282}283 284define <2 x i64> @vselect_v2i64(<2 x i1> %c, <2 x i64> %x, <2 x i64> %y) {285; CHECK-LABEL: vselect_v2i64:286; CHECK: .functype vselect_v2i64 (v128, v128, v128) -> (v128)287; CHECK-NEXT: # %bb.0:288; CHECK-NEXT: local.get 1289; CHECK-NEXT: local.get 2290; CHECK-NEXT: local.get 0291; CHECK-NEXT: i32.const 63292; CHECK-NEXT: i64x2.shl293; CHECK-NEXT: i32.const 63294; CHECK-NEXT: i64x2.shr_s295; CHECK-NEXT: v128.bitselect296; CHECK-NEXT: # fallthrough-return297 %res = select <2 x i1> %c, <2 x i64> %x, <2 x i64> %y298 ret <2 x i64> %res299}300 301define <2 x i64> @vselect_cmp_v2i64(<2 x i64> %a, <2 x i64> %b, <2 x i64> %x, <2 x i64> %y) {302; CHECK-LABEL: vselect_cmp_v2i64:303; CHECK: .functype vselect_cmp_v2i64 (v128, v128, v128, v128) -> (v128)304; CHECK-NEXT: # %bb.0:305; CHECK-NEXT: local.get 2306; CHECK-NEXT: local.get 3307; CHECK-NEXT: local.get 0308; CHECK-NEXT: local.get 1309; CHECK-NEXT: i64x2.lt_s310; CHECK-NEXT: v128.bitselect311; CHECK-NEXT: # fallthrough-return312 %c = icmp slt <2 x i64> %a, %b313 %res = select <2 x i1> %c, <2 x i64> %x, <2 x i64> %y314 ret <2 x i64> %res315}316 317define <2 x i64> @select_v2i64(i1 zeroext %c, <2 x i64> %x, <2 x i64> %y) {318; CHECK-LABEL: select_v2i64:319; CHECK: .functype select_v2i64 (i32, v128, v128) -> (v128)320; CHECK-NEXT: # %bb.0:321; CHECK-NEXT: local.get 1322; CHECK-NEXT: local.get 2323; CHECK-NEXT: local.get 0324; CHECK-NEXT: v128.select325; CHECK-NEXT: # fallthrough-return326 %res = select i1 %c, <2 x i64> %x, <2 x i64> %y327 ret <2 x i64> %res328}329 330define <2 x i64> @select_cmp_v2i64(i32 %i, <2 x i64> %x, <2 x i64> %y) {331; CHECK-LABEL: select_cmp_v2i64:332; CHECK: .functype select_cmp_v2i64 (i32, v128, v128) -> (v128)333; CHECK-NEXT: # %bb.0:334; CHECK-NEXT: local.get 1335; CHECK-NEXT: local.get 2336; CHECK-NEXT: local.get 0337; CHECK-NEXT: i32.const 0338; CHECK-NEXT: i32.lt_s339; CHECK-NEXT: v128.select340; CHECK-NEXT: # fallthrough-return341 %c = icmp slt i32 %i, 0342 %res = select i1 %c, <2 x i64> %x, <2 x i64> %y343 ret <2 x i64> %res344}345 346define <2 x i64> @select_ne_v2i64(i32 %i, <2 x i64> %x, <2 x i64> %y) {347; CHECK-LABEL: select_ne_v2i64:348; CHECK: .functype select_ne_v2i64 (i32, v128, v128) -> (v128)349; CHECK-NEXT: # %bb.0:350; CHECK-NEXT: local.get 1351; CHECK-NEXT: local.get 2352; CHECK-NEXT: local.get 0353; CHECK-NEXT: v128.select354; CHECK-NEXT: # fallthrough-return355 %c = icmp ne i32 %i, 0356 %res = select i1 %c, <2 x i64> %x, <2 x i64> %y357 ret <2 x i64> %res358}359 360define <2 x i64> @select_eq_v2i64(i32 %i, <2 x i64> %x, <2 x i64> %y) {361; CHECK-LABEL: select_eq_v2i64:362; CHECK: .functype select_eq_v2i64 (i32, v128, v128) -> (v128)363; CHECK-NEXT: # %bb.0:364; CHECK-NEXT: local.get 2365; CHECK-NEXT: local.get 1366; CHECK-NEXT: local.get 0367; CHECK-NEXT: v128.select368; CHECK-NEXT: # fallthrough-return369 %c = icmp eq i32 %i, 0370 %res = select i1 %c, <2 x i64> %x, <2 x i64> %y371 ret <2 x i64> %res372}373 374define <4 x float> @vselect_v4f32(<4 x i1> %c, <4 x float> %x, <4 x float> %y) {375; CHECK-LABEL: vselect_v4f32:376; CHECK: .functype vselect_v4f32 (v128, v128, v128) -> (v128)377; CHECK-NEXT: # %bb.0:378; CHECK-NEXT: local.get 1379; CHECK-NEXT: local.get 2380; CHECK-NEXT: local.get 0381; CHECK-NEXT: i32.const 31382; CHECK-NEXT: i32x4.shl383; CHECK-NEXT: i32.const 31384; CHECK-NEXT: i32x4.shr_s385; CHECK-NEXT: v128.bitselect386; CHECK-NEXT: # fallthrough-return387 %res = select <4 x i1> %c, <4 x float> %x, <4 x float> %y388 ret <4 x float> %res389}390 391define <4 x float> @vselect_cmp_v4f32(<4 x float> %a, <4 x float> %b,392; CHECK-LABEL: vselect_cmp_v4f32:393; CHECK: .functype vselect_cmp_v4f32 (v128, v128, v128, v128) -> (v128)394; CHECK-NEXT: # %bb.0:395; CHECK-NEXT: local.get 2396; CHECK-NEXT: local.get 3397; CHECK-NEXT: local.get 0398; CHECK-NEXT: local.get 1399; CHECK-NEXT: f32x4.lt400; CHECK-NEXT: v128.bitselect401; CHECK-NEXT: # fallthrough-return402 <4 x float> %x, <4 x float> %y) {403 %c = fcmp olt <4 x float> %a, %b404 %res = select <4 x i1> %c, <4 x float> %x, <4 x float> %y405 ret <4 x float> %res406}407 408define <4 x float> @select_v4f32(i1 zeroext %c, <4 x float> %x, <4 x float> %y) {409; CHECK-LABEL: select_v4f32:410; CHECK: .functype select_v4f32 (i32, v128, v128) -> (v128)411; CHECK-NEXT: # %bb.0:412; CHECK-NEXT: local.get 1413; CHECK-NEXT: local.get 2414; CHECK-NEXT: local.get 0415; CHECK-NEXT: v128.select416; CHECK-NEXT: # fallthrough-return417 %res = select i1 %c, <4 x float> %x, <4 x float> %y418 ret <4 x float> %res419}420 421define <4 x float> @select_cmp_v4f32(i32 %i, <4 x float> %x, <4 x float> %y) {422; CHECK-LABEL: select_cmp_v4f32:423; CHECK: .functype select_cmp_v4f32 (i32, v128, v128) -> (v128)424; CHECK-NEXT: # %bb.0:425; CHECK-NEXT: local.get 1426; CHECK-NEXT: local.get 2427; CHECK-NEXT: local.get 0428; CHECK-NEXT: i32.const 0429; CHECK-NEXT: i32.lt_s430; CHECK-NEXT: v128.select431; CHECK-NEXT: # fallthrough-return432 %c = icmp slt i32 %i, 0433 %res = select i1 %c, <4 x float> %x, <4 x float> %y434 ret <4 x float> %res435}436 437define <4 x float> @select_ne_v4f32(i32 %i, <4 x float> %x, <4 x float> %y) {438; CHECK-LABEL: select_ne_v4f32:439; CHECK: .functype select_ne_v4f32 (i32, v128, v128) -> (v128)440; CHECK-NEXT: # %bb.0:441; CHECK-NEXT: local.get 1442; CHECK-NEXT: local.get 2443; CHECK-NEXT: local.get 0444; CHECK-NEXT: v128.select445; CHECK-NEXT: # fallthrough-return446 %c = icmp ne i32 %i, 0447 %res = select i1 %c, <4 x float> %x, <4 x float> %y448 ret <4 x float> %res449}450 451define <4 x float> @select_eq_v4f32(i32 %i, <4 x float> %x, <4 x float> %y) {452; CHECK-LABEL: select_eq_v4f32:453; CHECK: .functype select_eq_v4f32 (i32, v128, v128) -> (v128)454; CHECK-NEXT: # %bb.0:455; CHECK-NEXT: local.get 2456; CHECK-NEXT: local.get 1457; CHECK-NEXT: local.get 0458; CHECK-NEXT: v128.select459; CHECK-NEXT: # fallthrough-return460 %c = icmp eq i32 %i, 0461 %res = select i1 %c, <4 x float> %x, <4 x float> %y462 ret <4 x float> %res463}464 465define <2 x double> @vselect_v2f64(<2 x i1> %c, <2 x double> %x, <2 x double> %y) {466; CHECK-LABEL: vselect_v2f64:467; CHECK: .functype vselect_v2f64 (v128, v128, v128) -> (v128)468; CHECK-NEXT: # %bb.0:469; CHECK-NEXT: local.get 1470; CHECK-NEXT: local.get 2471; CHECK-NEXT: local.get 0472; CHECK-NEXT: i32.const 63473; CHECK-NEXT: i64x2.shl474; CHECK-NEXT: i32.const 63475; CHECK-NEXT: i64x2.shr_s476; CHECK-NEXT: v128.bitselect477; CHECK-NEXT: # fallthrough-return478 %res = select <2 x i1> %c, <2 x double> %x, <2 x double> %y479 ret <2 x double> %res480}481 482define <2 x double> @vselect_cmp_v2f64(<2 x double> %a, <2 x double> %b,483; CHECK-LABEL: vselect_cmp_v2f64:484; CHECK: .functype vselect_cmp_v2f64 (v128, v128, v128, v128) -> (v128)485; CHECK-NEXT: # %bb.0:486; CHECK-NEXT: local.get 2487; CHECK-NEXT: local.get 3488; CHECK-NEXT: local.get 0489; CHECK-NEXT: local.get 1490; CHECK-NEXT: f64x2.lt491; CHECK-NEXT: v128.bitselect492; CHECK-NEXT: # fallthrough-return493 <2 x double> %x, <2 x double> %y) {494 %c = fcmp olt <2 x double> %a, %b495 %res = select <2 x i1> %c, <2 x double> %x, <2 x double> %y496 ret <2 x double> %res497}498 499define <2 x double> @select_v2f64(i1 zeroext %c, <2 x double> %x, <2 x double> %y) {500; CHECK-LABEL: select_v2f64:501; CHECK: .functype select_v2f64 (i32, v128, v128) -> (v128)502; CHECK-NEXT: # %bb.0:503; CHECK-NEXT: local.get 1504; CHECK-NEXT: local.get 2505; CHECK-NEXT: local.get 0506; CHECK-NEXT: v128.select507; CHECK-NEXT: # fallthrough-return508 %res = select i1 %c, <2 x double> %x, <2 x double> %y509 ret <2 x double> %res510}511 512define <2 x double> @select_cmp_v2f64(i32 %i, <2 x double> %x, <2 x double> %y) {513; CHECK-LABEL: select_cmp_v2f64:514; CHECK: .functype select_cmp_v2f64 (i32, v128, v128) -> (v128)515; CHECK-NEXT: # %bb.0:516; CHECK-NEXT: local.get 1517; CHECK-NEXT: local.get 2518; CHECK-NEXT: local.get 0519; CHECK-NEXT: i32.const 0520; CHECK-NEXT: i32.lt_s521; CHECK-NEXT: v128.select522; CHECK-NEXT: # fallthrough-return523 %c = icmp slt i32 %i, 0524 %res = select i1 %c, <2 x double> %x, <2 x double> %y525 ret <2 x double> %res526}527 528define <2 x double> @select_ne_v2f64(i32 %i, <2 x double> %x, <2 x double> %y) {529; CHECK-LABEL: select_ne_v2f64:530; CHECK: .functype select_ne_v2f64 (i32, v128, v128) -> (v128)531; CHECK-NEXT: # %bb.0:532; CHECK-NEXT: local.get 1533; CHECK-NEXT: local.get 2534; CHECK-NEXT: local.get 0535; CHECK-NEXT: v128.select536; CHECK-NEXT: # fallthrough-return537 %c = icmp ne i32 %i, 0538 %res = select i1 %c, <2 x double> %x, <2 x double> %y539 ret <2 x double> %res540}541 542define <2 x double> @select_eq_v2f64(i32 %i, <2 x double> %x, <2 x double> %y) {543; CHECK-LABEL: select_eq_v2f64:544; CHECK: .functype select_eq_v2f64 (i32, v128, v128) -> (v128)545; CHECK-NEXT: # %bb.0:546; CHECK-NEXT: local.get 2547; CHECK-NEXT: local.get 1548; CHECK-NEXT: local.get 0549; CHECK-NEXT: v128.select550; CHECK-NEXT: # fallthrough-return551 %c = icmp eq i32 %i, 0552 %res = select i1 %c, <2 x double> %x, <2 x double> %y553 ret <2 x double> %res554}555 556define <4 x i32> @select_splat_first_zero_and_icmp(<4 x i32> %x) {557; CHECK-LABEL: select_splat_first_zero_and_icmp:558; CHECK: .functype select_splat_first_zero_and_icmp (v128) -> (v128)559; CHECK-NEXT: # %bb.0:560; CHECK-NEXT: local.get 0561; CHECK-NEXT: v128.const 2139095040, 2139095040, 2139095040, 2139095040562; CHECK-NEXT: v128.and563; CHECK-NEXT: v128.const 0, 0, 0, 0564; CHECK-NEXT: i32x4.ne565; CHECK-NEXT: local.get 0566; CHECK-NEXT: v128.and567; CHECK-NEXT: # fallthrough-return568 %a = and <4 x i32> %x, splat (i32 2139095040)569 %c = icmp eq <4 x i32> %a, zeroinitializer570 %res = select <4 x i1> %c, <4 x i32> zeroinitializer, <4 x i32> %x571 ret <4 x i32> %res572}573 574define <4 x i32> @select_splat_second_zero_and_icmp(<4 x i32> %x) {575; CHECK-LABEL: select_splat_second_zero_and_icmp:576; CHECK: .functype select_splat_second_zero_and_icmp (v128) -> (v128)577; CHECK-NEXT: # %bb.0:578; CHECK-NEXT: local.get 0579; CHECK-NEXT: v128.const 2139095040, 2139095040, 2139095040, 2139095040580; CHECK-NEXT: v128.and581; CHECK-NEXT: v128.const 0, 0, 0, 0582; CHECK-NEXT: i32x4.eq583; CHECK-NEXT: local.get 0584; CHECK-NEXT: v128.and585; CHECK-NEXT: # fallthrough-return586 %a = and <4 x i32> %x, splat (i32 2139095040)587 %c = icmp eq <4 x i32> %a, zeroinitializer588 %res = select <4 x i1> %c, <4 x i32> %x, <4 x i32> zeroinitializer589 ret <4 x i32> %res590}591 592define <4 x i32> @select_splat_first_zero_cond_input(<4 x i1> %c, <4 x i32> %x) {593; CHECK-LABEL: select_splat_first_zero_cond_input:594; CHECK: .functype select_splat_first_zero_cond_input (v128, v128) -> (v128)595; CHECK-NEXT: # %bb.0:596; CHECK-NEXT: v128.const 0, 0, 0, 0597; CHECK-NEXT: local.get 1598; CHECK-NEXT: local.get 0599; CHECK-NEXT: i32.const 31600; CHECK-NEXT: i32x4.shl601; CHECK-NEXT: i32.const 31602; CHECK-NEXT: i32x4.shr_s603; CHECK-NEXT: v128.bitselect604; CHECK-NEXT: # fallthrough-return605 %res = select <4 x i1> %c, <4 x i32> zeroinitializer, <4 x i32> %x606 ret <4 x i32> %res607}608 609define <4 x i32> @select_splat_second_zero_cond_input(<4 x i1> %c, <4 x i32> %x) {610; CHECK-LABEL: select_splat_second_zero_cond_input:611; CHECK: .functype select_splat_second_zero_cond_input (v128, v128) -> (v128)612; CHECK-NEXT: # %bb.0:613; CHECK-NEXT: local.get 0614; CHECK-NEXT: i32.const 31615; CHECK-NEXT: i32x4.shl616; CHECK-NEXT: i32.const 31617; CHECK-NEXT: i32x4.shr_s618; CHECK-NEXT: local.get 1619; CHECK-NEXT: v128.and620; CHECK-NEXT: # fallthrough-return621 %res = select <4 x i1> %c, <4 x i32> %x, <4 x i32> zeroinitializer622 ret <4 x i32> %res623}624 625