1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -verify-machineinstrs -mattr=+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, <2 x i64> %x, <2 x i64> %y) { 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: local.get 0 309; CHECK-NEXT: local.get 1 310; CHECK-NEXT: i64x2.lt_s 311; CHECK-NEXT: v128.bitselect 312; CHECK-NEXT: # fallthrough-return 313 %c = icmp slt <2 x i64> %a, %b 314 %res = select <2 x i1> %c, <2 x i64> %x, <2 x i64> %y 315 ret <2 x i64> %res 316} 317 318define <2 x i64> @select_v2i64(i1 zeroext %c, <2 x i64> %x, <2 x i64> %y) { 319; CHECK-LABEL: select_v2i64: 320; CHECK: .functype select_v2i64 (i32, v128, v128) -> (v128) 321; CHECK-NEXT: # %bb.0: 322; CHECK-NEXT: local.get 1 323; CHECK-NEXT: local.get 2 324; CHECK-NEXT: local.get 0 325; CHECK-NEXT: v128.select 326; CHECK-NEXT: # fallthrough-return 327 %res = select i1 %c, <2 x i64> %x, <2 x i64> %y 328 ret <2 x i64> %res 329} 330 331define <2 x i64> @select_cmp_v2i64(i32 %i, <2 x i64> %x, <2 x i64> %y) { 332; CHECK-LABEL: select_cmp_v2i64: 333; CHECK: .functype select_cmp_v2i64 (i32, v128, v128) -> (v128) 334; CHECK-NEXT: # %bb.0: 335; CHECK-NEXT: local.get 1 336; CHECK-NEXT: local.get 2 337; CHECK-NEXT: local.get 0 338; CHECK-NEXT: i32.const 0 339; CHECK-NEXT: i32.lt_s 340; CHECK-NEXT: v128.select 341; CHECK-NEXT: # fallthrough-return 342 %c = icmp slt i32 %i, 0 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_ne_v2i64(i32 %i, <2 x i64> %x, <2 x i64> %y) { 348; CHECK-LABEL: select_ne_v2i64: 349; CHECK: .functype select_ne_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: v128.select 355; CHECK-NEXT: # fallthrough-return 356 %c = icmp ne i32 %i, 0 357 %res = select i1 %c, <2 x i64> %x, <2 x i64> %y 358 ret <2 x i64> %res 359} 360 361define <2 x i64> @select_eq_v2i64(i32 %i, <2 x i64> %x, <2 x i64> %y) { 362; CHECK-LABEL: select_eq_v2i64: 363; CHECK: .functype select_eq_v2i64 (i32, v128, v128) -> (v128) 364; CHECK-NEXT: # %bb.0: 365; CHECK-NEXT: local.get 2 366; CHECK-NEXT: local.get 1 367; CHECK-NEXT: local.get 0 368; CHECK-NEXT: v128.select 369; CHECK-NEXT: # fallthrough-return 370 %c = icmp eq i32 %i, 0 371 %res = select i1 %c, <2 x i64> %x, <2 x i64> %y 372 ret <2 x i64> %res 373} 374 375define <4 x float> @vselect_v4f32(<4 x i1> %c, <4 x float> %x, <4 x float> %y) { 376; CHECK-LABEL: vselect_v4f32: 377; CHECK: .functype vselect_v4f32 (v128, v128, v128) -> (v128) 378; CHECK-NEXT: # %bb.0: 379; CHECK-NEXT: local.get 1 380; CHECK-NEXT: local.get 2 381; CHECK-NEXT: local.get 0 382; CHECK-NEXT: i32.const 31 383; CHECK-NEXT: i32x4.shl 384; CHECK-NEXT: i32.const 31 385; CHECK-NEXT: i32x4.shr_s 386; CHECK-NEXT: v128.bitselect 387; CHECK-NEXT: # fallthrough-return 388 %res = select <4 x i1> %c, <4 x float> %x, <4 x float> %y 389 ret <4 x float> %res 390} 391 392define <4 x float> @vselect_cmp_v4f32(<4 x float> %a, <4 x float> %b, 393; CHECK-LABEL: vselect_cmp_v4f32: 394; CHECK: .functype vselect_cmp_v4f32 (v128, v128, v128, v128) -> (v128) 395; CHECK-NEXT: # %bb.0: 396; CHECK-NEXT: local.get 2 397; CHECK-NEXT: local.get 3 398; CHECK-NEXT: local.get 0 399; CHECK-NEXT: local.get 1 400; CHECK-NEXT: f32x4.lt 401; CHECK-NEXT: v128.bitselect 402; CHECK-NEXT: # fallthrough-return 403 <4 x float> %x, <4 x float> %y) { 404 %c = fcmp olt <4 x float> %a, %b 405 %res = select <4 x i1> %c, <4 x float> %x, <4 x float> %y 406 ret <4 x float> %res 407} 408 409define <4 x float> @select_v4f32(i1 zeroext %c, <4 x float> %x, <4 x float> %y) { 410; CHECK-LABEL: select_v4f32: 411; CHECK: .functype select_v4f32 (i32, v128, v128) -> (v128) 412; CHECK-NEXT: # %bb.0: 413; CHECK-NEXT: local.get 1 414; CHECK-NEXT: local.get 2 415; CHECK-NEXT: local.get 0 416; CHECK-NEXT: v128.select 417; CHECK-NEXT: # fallthrough-return 418 %res = select i1 %c, <4 x float> %x, <4 x float> %y 419 ret <4 x float> %res 420} 421 422define <4 x float> @select_cmp_v4f32(i32 %i, <4 x float> %x, <4 x float> %y) { 423; CHECK-LABEL: select_cmp_v4f32: 424; CHECK: .functype select_cmp_v4f32 (i32, v128, v128) -> (v128) 425; CHECK-NEXT: # %bb.0: 426; CHECK-NEXT: local.get 1 427; CHECK-NEXT: local.get 2 428; CHECK-NEXT: local.get 0 429; CHECK-NEXT: i32.const 0 430; CHECK-NEXT: i32.lt_s 431; CHECK-NEXT: v128.select 432; CHECK-NEXT: # fallthrough-return 433 %c = icmp slt i32 %i, 0 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_ne_v4f32(i32 %i, <4 x float> %x, <4 x float> %y) { 439; CHECK-LABEL: select_ne_v4f32: 440; CHECK: .functype select_ne_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: v128.select 446; CHECK-NEXT: # fallthrough-return 447 %c = icmp ne i32 %i, 0 448 %res = select i1 %c, <4 x float> %x, <4 x float> %y 449 ret <4 x float> %res 450} 451 452define <4 x float> @select_eq_v4f32(i32 %i, <4 x float> %x, <4 x float> %y) { 453; CHECK-LABEL: select_eq_v4f32: 454; CHECK: .functype select_eq_v4f32 (i32, v128, v128) -> (v128) 455; CHECK-NEXT: # %bb.0: 456; CHECK-NEXT: local.get 2 457; CHECK-NEXT: local.get 1 458; CHECK-NEXT: local.get 0 459; CHECK-NEXT: v128.select 460; CHECK-NEXT: # fallthrough-return 461 %c = icmp eq i32 %i, 0 462 %res = select i1 %c, <4 x float> %x, <4 x float> %y 463 ret <4 x float> %res 464} 465 466define <2 x double> @vselect_v2f64(<2 x i1> %c, <2 x double> %x, <2 x double> %y) { 467; CHECK-LABEL: vselect_v2f64: 468; CHECK: .functype vselect_v2f64 (v128, v128, v128) -> (v128) 469; CHECK-NEXT: # %bb.0: 470; CHECK-NEXT: local.get 1 471; CHECK-NEXT: local.get 2 472; CHECK-NEXT: local.get 0 473; CHECK-NEXT: i32.const 63 474; CHECK-NEXT: i64x2.shl 475; CHECK-NEXT: i32.const 63 476; CHECK-NEXT: i64x2.shr_s 477; CHECK-NEXT: v128.bitselect 478; CHECK-NEXT: # fallthrough-return 479 %res = select <2 x i1> %c, <2 x double> %x, <2 x double> %y 480 ret <2 x double> %res 481} 482 483define <2 x double> @vselect_cmp_v2f64(<2 x double> %a, <2 x double> %b, 484; CHECK-LABEL: vselect_cmp_v2f64: 485; CHECK: .functype vselect_cmp_v2f64 (v128, v128, v128, v128) -> (v128) 486; CHECK-NEXT: # %bb.0: 487; CHECK-NEXT: local.get 2 488; CHECK-NEXT: local.get 3 489; CHECK-NEXT: local.get 0 490; CHECK-NEXT: local.get 1 491; CHECK-NEXT: f64x2.lt 492; CHECK-NEXT: v128.bitselect 493; CHECK-NEXT: # fallthrough-return 494 <2 x double> %x, <2 x double> %y) { 495 %c = fcmp olt <2 x double> %a, %b 496 %res = select <2 x i1> %c, <2 x double> %x, <2 x double> %y 497 ret <2 x double> %res 498} 499 500define <2 x double> @select_v2f64(i1 zeroext %c, <2 x double> %x, <2 x double> %y) { 501; CHECK-LABEL: select_v2f64: 502; CHECK: .functype select_v2f64 (i32, v128, v128) -> (v128) 503; CHECK-NEXT: # %bb.0: 504; CHECK-NEXT: local.get 1 505; CHECK-NEXT: local.get 2 506; CHECK-NEXT: local.get 0 507; CHECK-NEXT: v128.select 508; CHECK-NEXT: # fallthrough-return 509 %res = select i1 %c, <2 x double> %x, <2 x double> %y 510 ret <2 x double> %res 511} 512 513define <2 x double> @select_cmp_v2f64(i32 %i, <2 x double> %x, <2 x double> %y) { 514; CHECK-LABEL: select_cmp_v2f64: 515; CHECK: .functype select_cmp_v2f64 (i32, v128, v128) -> (v128) 516; CHECK-NEXT: # %bb.0: 517; CHECK-NEXT: local.get 1 518; CHECK-NEXT: local.get 2 519; CHECK-NEXT: local.get 0 520; CHECK-NEXT: i32.const 0 521; CHECK-NEXT: i32.lt_s 522; CHECK-NEXT: v128.select 523; CHECK-NEXT: # fallthrough-return 524 %c = icmp slt i32 %i, 0 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_ne_v2f64(i32 %i, <2 x double> %x, <2 x double> %y) { 530; CHECK-LABEL: select_ne_v2f64: 531; CHECK: .functype select_ne_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: v128.select 537; CHECK-NEXT: # fallthrough-return 538 %c = icmp ne i32 %i, 0 539 %res = select i1 %c, <2 x double> %x, <2 x double> %y 540 ret <2 x double> %res 541} 542 543define <2 x double> @select_eq_v2f64(i32 %i, <2 x double> %x, <2 x double> %y) { 544; CHECK-LABEL: select_eq_v2f64: 545; CHECK: .functype select_eq_v2f64 (i32, v128, v128) -> (v128) 546; CHECK-NEXT: # %bb.0: 547; CHECK-NEXT: local.get 2 548; CHECK-NEXT: local.get 1 549; CHECK-NEXT: local.get 0 550; CHECK-NEXT: v128.select 551; CHECK-NEXT: # fallthrough-return 552 %c = icmp eq i32 %i, 0 553 %res = select i1 %c, <2 x double> %x, <2 x double> %y 554 ret <2 x double> %res 555} 556