1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -verify-machineinstrs -mattr=+unimplemented-simd128 | FileCheck %s 3 4; Test that vector selects of various varieties lower correctly. 5 6target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" 7target triple = "wasm32-unknown-unknown" 8 9; ============================================================================== 10; 16 x i8 11; ============================================================================== 12define <16 x i8> @vselect_v16i8(<16 x i1> %c, <16 x i8> %x, <16 x i8> %y) { 13; CHECK-LABEL: vselect_v16i8: 14; CHECK: .functype vselect_v16i8 (v128, v128, v128) -> (v128) 15; CHECK-NEXT: # %bb.0: 16; CHECK-NEXT: local.get 1 17; CHECK-NEXT: local.get 2 18; CHECK-NEXT: local.get 0 19; CHECK-NEXT: i32.const 7 20; CHECK-NEXT: i8x16.shl 21; CHECK-NEXT: i32.const 7 22; CHECK-NEXT: i8x16.shr_s 23; CHECK-NEXT: v128.bitselect 24; CHECK-NEXT: # fallthrough-return 25 %res = select <16 x i1> %c, <16 x i8> %x, <16 x i8> %y 26 ret <16 x i8> %res 27} 28 29define <16 x i8> @vselect_cmp_v16i8(<16 x i8> %a, <16 x i8> %b, 30; CHECK-LABEL: vselect_cmp_v16i8: 31; CHECK: .functype vselect_cmp_v16i8 (v128, v128, v128, v128) -> (v128) 32; CHECK-NEXT: # %bb.0: 33; CHECK-NEXT: local.get 2 34; CHECK-NEXT: local.get 3 35; CHECK-NEXT: local.get 0 36; CHECK-NEXT: local.get 1 37; CHECK-NEXT: i8x16.lt_s 38; CHECK-NEXT: v128.bitselect 39; CHECK-NEXT: # fallthrough-return 40 <16 x i8> %x, <16 x i8> %y) { 41 %c = icmp slt <16 x i8> %a, %b 42 %res = select <16 x i1> %c, <16 x i8> %x, <16 x i8> %y 43 ret <16 x i8> %res 44} 45 46define <16 x i8> @select_v16i8(i1 zeroext %c, <16 x i8> %x, <16 x i8> %y) { 47; CHECK-LABEL: select_v16i8: 48; CHECK: .functype select_v16i8 (i32, v128, v128) -> (v128) 49; CHECK-NEXT: # %bb.0: 50; CHECK-NEXT: local.get 1 51; CHECK-NEXT: local.get 2 52; CHECK-NEXT: local.get 0 53; CHECK-NEXT: v128.select 54; CHECK-NEXT: # fallthrough-return 55 %res = select i1 %c, <16 x i8> %x, <16 x i8> %y 56 ret <16 x i8> %res 57} 58 59define <16 x i8> @select_cmp_v16i8(i32 %i, <16 x i8> %x, <16 x i8> %y) { 60; CHECK-LABEL: select_cmp_v16i8: 61; CHECK: .functype select_cmp_v16i8 (i32, v128, v128) -> (v128) 62; CHECK-NEXT: # %bb.0: 63; CHECK-NEXT: local.get 1 64; CHECK-NEXT: local.get 2 65; CHECK-NEXT: local.get 0 66; CHECK-NEXT: i32.const 0 67; CHECK-NEXT: i32.lt_s 68; CHECK-NEXT: v128.select 69; CHECK-NEXT: # fallthrough-return 70 %c = icmp slt i32 %i, 0 71 %res = select i1 %c, <16 x i8> %x, <16 x i8> %y 72 ret <16 x i8> %res 73} 74 75define <16 x i8> @select_ne_v16i8(i32 %i, <16 x i8> %x, <16 x i8> %y) { 76; CHECK-LABEL: select_ne_v16i8: 77; CHECK: .functype select_ne_v16i8 (i32, v128, v128) -> (v128) 78; CHECK-NEXT: # %bb.0: 79; CHECK-NEXT: local.get 1 80; CHECK-NEXT: local.get 2 81; CHECK-NEXT: local.get 0 82; CHECK-NEXT: v128.select 83; CHECK-NEXT: # fallthrough-return 84 %c = icmp ne i32 %i, 0 85 %res = select i1 %c, <16 x i8> %x, <16 x i8> %y 86 ret <16 x i8> %res 87} 88 89define <16 x i8> @select_eq_v16i8(i32 %i, <16 x i8> %x, <16 x i8> %y) { 90; CHECK-LABEL: select_eq_v16i8: 91; CHECK: .functype select_eq_v16i8 (i32, v128, v128) -> (v128) 92; CHECK-NEXT: # %bb.0: 93; CHECK-NEXT: local.get 2 94; CHECK-NEXT: local.get 1 95; CHECK-NEXT: local.get 0 96; CHECK-NEXT: v128.select 97; CHECK-NEXT: # fallthrough-return 98 %c = icmp eq i32 %i, 0 99 %res = select i1 %c, <16 x i8> %x, <16 x i8> %y 100 ret <16 x i8> %res 101} 102 103define <8 x i16> @vselect_v8i16(<8 x i1> %c, <8 x i16> %x, <8 x i16> %y) { 104; CHECK-LABEL: vselect_v8i16: 105; CHECK: .functype vselect_v8i16 (v128, v128, v128) -> (v128) 106; CHECK-NEXT: # %bb.0: 107; CHECK-NEXT: local.get 1 108; CHECK-NEXT: local.get 2 109; CHECK-NEXT: local.get 0 110; CHECK-NEXT: i32.const 15 111; CHECK-NEXT: i16x8.shl 112; CHECK-NEXT: i32.const 15 113; CHECK-NEXT: i16x8.shr_s 114; CHECK-NEXT: v128.bitselect 115; CHECK-NEXT: # fallthrough-return 116 %res = select <8 x i1> %c, <8 x i16> %x, <8 x i16> %y 117 ret <8 x i16> %res 118} 119 120define <8 x i16> @vselect_cmp_v8i16(<8 x i16> %a, <8 x i16> %b, 121; CHECK-LABEL: vselect_cmp_v8i16: 122; CHECK: .functype vselect_cmp_v8i16 (v128, v128, v128, v128) -> (v128) 123; CHECK-NEXT: # %bb.0: 124; CHECK-NEXT: local.get 2 125; CHECK-NEXT: local.get 3 126; CHECK-NEXT: local.get 0 127; CHECK-NEXT: local.get 1 128; CHECK-NEXT: i16x8.lt_s 129; CHECK-NEXT: v128.bitselect 130; CHECK-NEXT: # fallthrough-return 131 <8 x i16> %x, <8 x i16> %y) { 132 %c = icmp slt <8 x i16> %a, %b 133 %res = select <8 x i1> %c, <8 x i16> %x, <8 x i16> %y 134 ret <8 x i16> %res 135} 136 137define <8 x i16> @select_v8i16(i1 zeroext %c, <8 x i16> %x, <8 x i16> %y) { 138; CHECK-LABEL: select_v8i16: 139; CHECK: .functype select_v8i16 (i32, v128, v128) -> (v128) 140; CHECK-NEXT: # %bb.0: 141; CHECK-NEXT: local.get 1 142; CHECK-NEXT: local.get 2 143; CHECK-NEXT: local.get 0 144; CHECK-NEXT: v128.select 145; CHECK-NEXT: # fallthrough-return 146 %res = select i1 %c, <8 x i16> %x, <8 x i16> %y 147 ret <8 x i16> %res 148} 149 150define <8 x i16> @select_cmp_v8i16(i32 %i, <8 x i16> %x, <8 x i16> %y) { 151; CHECK-LABEL: select_cmp_v8i16: 152; CHECK: .functype select_cmp_v8i16 (i32, v128, v128) -> (v128) 153; CHECK-NEXT: # %bb.0: 154; CHECK-NEXT: local.get 1 155; CHECK-NEXT: local.get 2 156; CHECK-NEXT: local.get 0 157; CHECK-NEXT: i32.const 0 158; CHECK-NEXT: i32.lt_s 159; CHECK-NEXT: v128.select 160; CHECK-NEXT: # fallthrough-return 161 %c = icmp slt i32 %i, 0 162 %res = select i1 %c, <8 x i16> %x, <8 x i16> %y 163 ret <8 x i16> %res 164} 165 166define <8 x i16> @select_ne_v8i16(i32 %i, <8 x i16> %x, <8 x i16> %y) { 167; CHECK-LABEL: select_ne_v8i16: 168; CHECK: .functype select_ne_v8i16 (i32, v128, v128) -> (v128) 169; CHECK-NEXT: # %bb.0: 170; CHECK-NEXT: local.get 1 171; CHECK-NEXT: local.get 2 172; CHECK-NEXT: local.get 0 173; CHECK-NEXT: v128.select 174; CHECK-NEXT: # fallthrough-return 175 %c = icmp ne i32 %i, 0 176 %res = select i1 %c, <8 x i16> %x, <8 x i16> %y 177 ret <8 x i16> %res 178} 179 180define <8 x i16> @select_eq_v8i16(i32 %i, <8 x i16> %x, <8 x i16> %y) { 181; CHECK-LABEL: select_eq_v8i16: 182; CHECK: .functype select_eq_v8i16 (i32, v128, v128) -> (v128) 183; CHECK-NEXT: # %bb.0: 184; CHECK-NEXT: local.get 2 185; CHECK-NEXT: local.get 1 186; CHECK-NEXT: local.get 0 187; CHECK-NEXT: v128.select 188; CHECK-NEXT: # fallthrough-return 189 %c = icmp eq i32 %i, 0 190 %res = select i1 %c, <8 x i16> %x, <8 x i16> %y 191 ret <8 x i16> %res 192} 193 194define <4 x i32> @vselect_v4i32(<4 x i1> %c, <4 x i32> %x, <4 x i32> %y) { 195; CHECK-LABEL: vselect_v4i32: 196; CHECK: .functype vselect_v4i32 (v128, v128, v128) -> (v128) 197; CHECK-NEXT: # %bb.0: 198; CHECK-NEXT: local.get 1 199; CHECK-NEXT: local.get 2 200; CHECK-NEXT: local.get 0 201; CHECK-NEXT: i32.const 31 202; CHECK-NEXT: i32x4.shl 203; CHECK-NEXT: i32.const 31 204; CHECK-NEXT: i32x4.shr_s 205; CHECK-NEXT: v128.bitselect 206; CHECK-NEXT: # fallthrough-return 207 %res = select <4 x i1> %c, <4 x i32> %x, <4 x i32> %y 208 ret <4 x i32> %res 209} 210 211define <4 x i32> @vselect_cmp_v4i32(<4 x i32> %a, <4 x i32> %b, 212; CHECK-LABEL: vselect_cmp_v4i32: 213; CHECK: .functype vselect_cmp_v4i32 (v128, v128, v128, v128) -> (v128) 214; CHECK-NEXT: # %bb.0: 215; CHECK-NEXT: local.get 2 216; CHECK-NEXT: local.get 3 217; CHECK-NEXT: local.get 0 218; CHECK-NEXT: local.get 1 219; CHECK-NEXT: i32x4.lt_s 220; CHECK-NEXT: v128.bitselect 221; CHECK-NEXT: # fallthrough-return 222 <4 x i32> %x, <4 x i32> %y) { 223 %c = icmp slt <4 x i32> %a, %b 224 %res = select <4 x i1> %c, <4 x i32> %x, <4 x i32> %y 225 ret <4 x i32> %res 226} 227 228define <4 x i32> @select_v4i32(i1 zeroext %c, <4 x i32> %x, <4 x i32> %y) { 229; CHECK-LABEL: select_v4i32: 230; CHECK: .functype select_v4i32 (i32, v128, v128) -> (v128) 231; CHECK-NEXT: # %bb.0: 232; CHECK-NEXT: local.get 1 233; CHECK-NEXT: local.get 2 234; CHECK-NEXT: local.get 0 235; CHECK-NEXT: v128.select 236; CHECK-NEXT: # fallthrough-return 237 %res = select i1 %c, <4 x i32> %x, <4 x i32> %y 238 ret <4 x i32> %res 239} 240 241define <4 x i32> @select_cmp_v4i32(i32 %i, <4 x i32> %x, <4 x i32> %y) { 242; CHECK-LABEL: select_cmp_v4i32: 243; CHECK: .functype select_cmp_v4i32 (i32, v128, v128) -> (v128) 244; CHECK-NEXT: # %bb.0: 245; CHECK-NEXT: local.get 1 246; CHECK-NEXT: local.get 2 247; CHECK-NEXT: local.get 0 248; CHECK-NEXT: i32.const 0 249; CHECK-NEXT: i32.lt_s 250; CHECK-NEXT: v128.select 251; CHECK-NEXT: # fallthrough-return 252 %c = icmp slt i32 %i, 0 253 %res = select i1 %c, <4 x i32> %x, <4 x i32> %y 254 ret <4 x i32> %res 255} 256 257define <4 x i32> @select_ne_v4i32(i32 %i, <4 x i32> %x, <4 x i32> %y) { 258; CHECK-LABEL: select_ne_v4i32: 259; CHECK: .functype select_ne_v4i32 (i32, v128, v128) -> (v128) 260; CHECK-NEXT: # %bb.0: 261; CHECK-NEXT: local.get 1 262; CHECK-NEXT: local.get 2 263; CHECK-NEXT: local.get 0 264; CHECK-NEXT: v128.select 265; CHECK-NEXT: # fallthrough-return 266 %c = icmp ne i32 %i, 0 267 %res = select i1 %c, <4 x i32> %x, <4 x i32> %y 268 ret <4 x i32> %res 269} 270 271define <4 x i32> @select_eq_v4i32(i32 %i, <4 x i32> %x, <4 x i32> %y) { 272; CHECK-LABEL: select_eq_v4i32: 273; CHECK: .functype select_eq_v4i32 (i32, v128, v128) -> (v128) 274; CHECK-NEXT: # %bb.0: 275; CHECK-NEXT: local.get 2 276; CHECK-NEXT: local.get 1 277; CHECK-NEXT: local.get 0 278; CHECK-NEXT: v128.select 279; CHECK-NEXT: # fallthrough-return 280 %c = icmp eq i32 %i, 0 281 %res = select i1 %c, <4 x i32> %x, <4 x i32> %y 282 ret <4 x i32> %res 283} 284 285define <2 x i64> @vselect_v2i64(<2 x i1> %c, <2 x i64> %x, <2 x i64> %y) { 286; CHECK-LABEL: vselect_v2i64: 287; CHECK: .functype vselect_v2i64 (v128, v128, v128) -> (v128) 288; CHECK-NEXT: # %bb.0: 289; CHECK-NEXT: local.get 1 290; CHECK-NEXT: local.get 2 291; CHECK-NEXT: local.get 0 292; CHECK-NEXT: i32.const 63 293; CHECK-NEXT: i64x2.shl 294; CHECK-NEXT: i32.const 63 295; CHECK-NEXT: i64x2.shr_s 296; CHECK-NEXT: v128.bitselect 297; CHECK-NEXT: # fallthrough-return 298 %res = select <2 x i1> %c, <2 x i64> %x, <2 x i64> %y 299 ret <2 x i64> %res 300} 301 302define <2 x i64> @vselect_cmp_v2i64(<2 x i64> %a, <2 x i64> %b, 303; CHECK-LABEL: vselect_cmp_v2i64: 304; CHECK: .functype vselect_cmp_v2i64 (v128, v128, v128, v128) -> (v128) 305; CHECK-NEXT: # %bb.0: 306; CHECK-NEXT: local.get 2 307; CHECK-NEXT: local.get 3 308; CHECK-NEXT: i64.const -1 309; CHECK-NEXT: i64.const 0 310; CHECK-NEXT: local.get 0 311; CHECK-NEXT: i64x2.extract_lane 0 312; CHECK-NEXT: local.get 1 313; CHECK-NEXT: i64x2.extract_lane 0 314; CHECK-NEXT: i64.lt_s 315; CHECK-NEXT: i64.select 316; CHECK-NEXT: i64x2.splat 317; CHECK-NEXT: i64.const -1 318; CHECK-NEXT: i64.const 0 319; CHECK-NEXT: local.get 0 320; CHECK-NEXT: i64x2.extract_lane 1 321; CHECK-NEXT: local.get 1 322; CHECK-NEXT: i64x2.extract_lane 1 323; CHECK-NEXT: i64.lt_s 324; CHECK-NEXT: i64.select 325; CHECK-NEXT: i64x2.replace_lane 1 326; CHECK-NEXT: v128.bitselect 327; CHECK-NEXT: # fallthrough-return 328 <2 x i64> %x, <2 x i64> %y) { 329 %c = icmp slt <2 x i64> %a, %b 330 %res = select <2 x i1> %c, <2 x i64> %x, <2 x i64> %y 331 ret <2 x i64> %res 332} 333 334define <2 x i64> @select_v2i64(i1 zeroext %c, <2 x i64> %x, <2 x i64> %y) { 335; CHECK-LABEL: select_v2i64: 336; CHECK: .functype select_v2i64 (i32, v128, v128) -> (v128) 337; CHECK-NEXT: # %bb.0: 338; CHECK-NEXT: local.get 1 339; CHECK-NEXT: local.get 2 340; CHECK-NEXT: local.get 0 341; CHECK-NEXT: v128.select 342; CHECK-NEXT: # fallthrough-return 343 %res = select i1 %c, <2 x i64> %x, <2 x i64> %y 344 ret <2 x i64> %res 345} 346 347define <2 x i64> @select_cmp_v2i64(i32 %i, <2 x i64> %x, <2 x i64> %y) { 348; CHECK-LABEL: select_cmp_v2i64: 349; CHECK: .functype select_cmp_v2i64 (i32, v128, v128) -> (v128) 350; CHECK-NEXT: # %bb.0: 351; CHECK-NEXT: local.get 1 352; CHECK-NEXT: local.get 2 353; CHECK-NEXT: local.get 0 354; CHECK-NEXT: i32.const 0 355; CHECK-NEXT: i32.lt_s 356; CHECK-NEXT: v128.select 357; CHECK-NEXT: # fallthrough-return 358 %c = icmp slt i32 %i, 0 359 %res = select i1 %c, <2 x i64> %x, <2 x i64> %y 360 ret <2 x i64> %res 361} 362 363define <2 x i64> @select_ne_v2i64(i32 %i, <2 x i64> %x, <2 x i64> %y) { 364; CHECK-LABEL: select_ne_v2i64: 365; CHECK: .functype select_ne_v2i64 (i32, v128, v128) -> (v128) 366; CHECK-NEXT: # %bb.0: 367; CHECK-NEXT: local.get 1 368; CHECK-NEXT: local.get 2 369; CHECK-NEXT: local.get 0 370; CHECK-NEXT: v128.select 371; CHECK-NEXT: # fallthrough-return 372 %c = icmp ne i32 %i, 0 373 %res = select i1 %c, <2 x i64> %x, <2 x i64> %y 374 ret <2 x i64> %res 375} 376 377define <2 x i64> @select_eq_v2i64(i32 %i, <2 x i64> %x, <2 x i64> %y) { 378; CHECK-LABEL: select_eq_v2i64: 379; CHECK: .functype select_eq_v2i64 (i32, v128, v128) -> (v128) 380; CHECK-NEXT: # %bb.0: 381; CHECK-NEXT: local.get 2 382; CHECK-NEXT: local.get 1 383; CHECK-NEXT: local.get 0 384; CHECK-NEXT: v128.select 385; CHECK-NEXT: # fallthrough-return 386 %c = icmp eq i32 %i, 0 387 %res = select i1 %c, <2 x i64> %x, <2 x i64> %y 388 ret <2 x i64> %res 389} 390 391define <4 x float> @vselect_v4f32(<4 x i1> %c, <4 x float> %x, <4 x float> %y) { 392; CHECK-LABEL: vselect_v4f32: 393; CHECK: .functype vselect_v4f32 (v128, v128, v128) -> (v128) 394; CHECK-NEXT: # %bb.0: 395; CHECK-NEXT: local.get 1 396; CHECK-NEXT: local.get 2 397; CHECK-NEXT: local.get 0 398; CHECK-NEXT: i32.const 31 399; CHECK-NEXT: i32x4.shl 400; CHECK-NEXT: i32.const 31 401; CHECK-NEXT: i32x4.shr_s 402; CHECK-NEXT: v128.bitselect 403; CHECK-NEXT: # fallthrough-return 404 %res = select <4 x i1> %c, <4 x float> %x, <4 x float> %y 405 ret <4 x float> %res 406} 407 408define <4 x float> @vselect_cmp_v4f32(<4 x float> %a, <4 x float> %b, 409; CHECK-LABEL: vselect_cmp_v4f32: 410; CHECK: .functype vselect_cmp_v4f32 (v128, v128, v128, v128) -> (v128) 411; CHECK-NEXT: # %bb.0: 412; CHECK-NEXT: local.get 2 413; CHECK-NEXT: local.get 3 414; CHECK-NEXT: local.get 0 415; CHECK-NEXT: local.get 1 416; CHECK-NEXT: f32x4.lt 417; CHECK-NEXT: v128.bitselect 418; CHECK-NEXT: # fallthrough-return 419 <4 x float> %x, <4 x float> %y) { 420 %c = fcmp olt <4 x float> %a, %b 421 %res = select <4 x i1> %c, <4 x float> %x, <4 x float> %y 422 ret <4 x float> %res 423} 424 425define <4 x float> @select_v4f32(i1 zeroext %c, <4 x float> %x, <4 x float> %y) { 426; CHECK-LABEL: select_v4f32: 427; CHECK: .functype select_v4f32 (i32, v128, v128) -> (v128) 428; CHECK-NEXT: # %bb.0: 429; CHECK-NEXT: local.get 1 430; CHECK-NEXT: local.get 2 431; CHECK-NEXT: local.get 0 432; CHECK-NEXT: v128.select 433; CHECK-NEXT: # fallthrough-return 434 %res = select i1 %c, <4 x float> %x, <4 x float> %y 435 ret <4 x float> %res 436} 437 438define <4 x float> @select_cmp_v4f32(i32 %i, <4 x float> %x, <4 x float> %y) { 439; CHECK-LABEL: select_cmp_v4f32: 440; CHECK: .functype select_cmp_v4f32 (i32, v128, v128) -> (v128) 441; CHECK-NEXT: # %bb.0: 442; CHECK-NEXT: local.get 1 443; CHECK-NEXT: local.get 2 444; CHECK-NEXT: local.get 0 445; CHECK-NEXT: i32.const 0 446; CHECK-NEXT: i32.lt_s 447; CHECK-NEXT: v128.select 448; CHECK-NEXT: # fallthrough-return 449 %c = icmp slt i32 %i, 0 450 %res = select i1 %c, <4 x float> %x, <4 x float> %y 451 ret <4 x float> %res 452} 453 454define <4 x float> @select_ne_v4f32(i32 %i, <4 x float> %x, <4 x float> %y) { 455; CHECK-LABEL: select_ne_v4f32: 456; CHECK: .functype select_ne_v4f32 (i32, v128, v128) -> (v128) 457; CHECK-NEXT: # %bb.0: 458; CHECK-NEXT: local.get 1 459; CHECK-NEXT: local.get 2 460; CHECK-NEXT: local.get 0 461; CHECK-NEXT: v128.select 462; CHECK-NEXT: # fallthrough-return 463 %c = icmp ne i32 %i, 0 464 %res = select i1 %c, <4 x float> %x, <4 x float> %y 465 ret <4 x float> %res 466} 467 468define <4 x float> @select_eq_v4f32(i32 %i, <4 x float> %x, <4 x float> %y) { 469; CHECK-LABEL: select_eq_v4f32: 470; CHECK: .functype select_eq_v4f32 (i32, v128, v128) -> (v128) 471; CHECK-NEXT: # %bb.0: 472; CHECK-NEXT: local.get 2 473; CHECK-NEXT: local.get 1 474; CHECK-NEXT: local.get 0 475; CHECK-NEXT: v128.select 476; CHECK-NEXT: # fallthrough-return 477 %c = icmp eq i32 %i, 0 478 %res = select i1 %c, <4 x float> %x, <4 x float> %y 479 ret <4 x float> %res 480} 481 482define <2 x double> @vselect_v2f64(<2 x i1> %c, <2 x double> %x, <2 x double> %y) { 483; CHECK-LABEL: vselect_v2f64: 484; CHECK: .functype vselect_v2f64 (v128, v128, v128) -> (v128) 485; CHECK-NEXT: # %bb.0: 486; CHECK-NEXT: local.get 1 487; CHECK-NEXT: local.get 2 488; CHECK-NEXT: local.get 0 489; CHECK-NEXT: i32.const 63 490; CHECK-NEXT: i64x2.shl 491; CHECK-NEXT: i32.const 63 492; CHECK-NEXT: i64x2.shr_s 493; CHECK-NEXT: v128.bitselect 494; CHECK-NEXT: # fallthrough-return 495 %res = select <2 x i1> %c, <2 x double> %x, <2 x double> %y 496 ret <2 x double> %res 497} 498 499define <2 x double> @vselect_cmp_v2f64(<2 x double> %a, <2 x double> %b, 500; CHECK-LABEL: vselect_cmp_v2f64: 501; CHECK: .functype vselect_cmp_v2f64 (v128, v128, v128, v128) -> (v128) 502; CHECK-NEXT: # %bb.0: 503; CHECK-NEXT: local.get 2 504; CHECK-NEXT: local.get 3 505; CHECK-NEXT: local.get 0 506; CHECK-NEXT: local.get 1 507; CHECK-NEXT: f64x2.lt 508; CHECK-NEXT: v128.bitselect 509; CHECK-NEXT: # fallthrough-return 510 <2 x double> %x, <2 x double> %y) { 511 %c = fcmp olt <2 x double> %a, %b 512 %res = select <2 x i1> %c, <2 x double> %x, <2 x double> %y 513 ret <2 x double> %res 514} 515 516define <2 x double> @select_v2f64(i1 zeroext %c, <2 x double> %x, <2 x double> %y) { 517; CHECK-LABEL: select_v2f64: 518; CHECK: .functype select_v2f64 (i32, v128, v128) -> (v128) 519; CHECK-NEXT: # %bb.0: 520; CHECK-NEXT: local.get 1 521; CHECK-NEXT: local.get 2 522; CHECK-NEXT: local.get 0 523; CHECK-NEXT: v128.select 524; CHECK-NEXT: # fallthrough-return 525 %res = select i1 %c, <2 x double> %x, <2 x double> %y 526 ret <2 x double> %res 527} 528 529define <2 x double> @select_cmp_v2f64(i32 %i, <2 x double> %x, <2 x double> %y) { 530; CHECK-LABEL: select_cmp_v2f64: 531; CHECK: .functype select_cmp_v2f64 (i32, v128, v128) -> (v128) 532; CHECK-NEXT: # %bb.0: 533; CHECK-NEXT: local.get 1 534; CHECK-NEXT: local.get 2 535; CHECK-NEXT: local.get 0 536; CHECK-NEXT: i32.const 0 537; CHECK-NEXT: i32.lt_s 538; CHECK-NEXT: v128.select 539; CHECK-NEXT: # fallthrough-return 540 %c = icmp slt i32 %i, 0 541 %res = select i1 %c, <2 x double> %x, <2 x double> %y 542 ret <2 x double> %res 543} 544 545define <2 x double> @select_ne_v2f64(i32 %i, <2 x double> %x, <2 x double> %y) { 546; CHECK-LABEL: select_ne_v2f64: 547; CHECK: .functype select_ne_v2f64 (i32, v128, v128) -> (v128) 548; CHECK-NEXT: # %bb.0: 549; CHECK-NEXT: local.get 1 550; CHECK-NEXT: local.get 2 551; CHECK-NEXT: local.get 0 552; CHECK-NEXT: v128.select 553; CHECK-NEXT: # fallthrough-return 554 %c = icmp ne i32 %i, 0 555 %res = select i1 %c, <2 x double> %x, <2 x double> %y 556 ret <2 x double> %res 557} 558 559define <2 x double> @select_eq_v2f64(i32 %i, <2 x double> %x, <2 x double> %y) { 560; CHECK-LABEL: select_eq_v2f64: 561; CHECK: .functype select_eq_v2f64 (i32, v128, v128) -> (v128) 562; CHECK-NEXT: # %bb.0: 563; CHECK-NEXT: local.get 2 564; CHECK-NEXT: local.get 1 565; CHECK-NEXT: local.get 0 566; CHECK-NEXT: v128.select 567; CHECK-NEXT: # fallthrough-return 568 %c = icmp eq i32 %i, 0 569 %res = select i1 %c, <2 x double> %x, <2 x double> %y 570 ret <2 x double> %res 571} 572