1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mattr=+sve -force-streaming-compatible < %s | FileCheck %s 3; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s 4; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE 5 6target triple = "aarch64-unknown-linux-gnu" 7 8define <4 x i8> @select_v4i8(<4 x i8> %op1, <4 x i8> %op2, <4 x i1> %mask) { 9; CHECK-LABEL: select_v4i8: 10; CHECK: // %bb.0: 11; CHECK-NEXT: // kill: def $d2 killed $d2 def $z2 12; CHECK-NEXT: ptrue p0.h 13; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 14; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 15; CHECK-NEXT: lsl z2.h, z2.h, #15 16; CHECK-NEXT: asr z2.h, z2.h, #15 17; CHECK-NEXT: and z2.h, z2.h, #0x1 18; CHECK-NEXT: cmpne p0.h, p0/z, z2.h, #0 19; CHECK-NEXT: sel z0.h, p0, z0.h, z1.h 20; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 21; CHECK-NEXT: ret 22; 23; NONEON-NOSVE-LABEL: select_v4i8: 24; NONEON-NOSVE: // %bb.0: 25; NONEON-NOSVE-NEXT: sub sp, sp, #32 26; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 27; NONEON-NOSVE-NEXT: stp d1, d2, [sp, #8] 28; NONEON-NOSVE-NEXT: ldrh w9, [sp, #22] 29; NONEON-NOSVE-NEXT: str d0, [sp] 30; NONEON-NOSVE-NEXT: ldrh w11, [sp, #20] 31; NONEON-NOSVE-NEXT: ldrh w12, [sp, #14] 32; NONEON-NOSVE-NEXT: ldrh w13, [sp, #6] 33; NONEON-NOSVE-NEXT: ldrh w10, [sp, #18] 34; NONEON-NOSVE-NEXT: sbfx w9, w9, #0, #1 35; NONEON-NOSVE-NEXT: sbfx w11, w11, #0, #1 36; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 37; NONEON-NOSVE-NEXT: sbfx w10, w10, #0, #1 38; NONEON-NOSVE-NEXT: tst w9, #0xffff 39; NONEON-NOSVE-NEXT: sbfx w8, w8, #0, #1 40; NONEON-NOSVE-NEXT: csel w9, w13, w12, ne 41; NONEON-NOSVE-NEXT: ldrh w12, [sp, #4] 42; NONEON-NOSVE-NEXT: tst w11, #0xffff 43; NONEON-NOSVE-NEXT: strh w9, [sp, #30] 44; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 45; NONEON-NOSVE-NEXT: ldrh w11, [sp, #2] 46; NONEON-NOSVE-NEXT: csel w9, w12, w9, ne 47; NONEON-NOSVE-NEXT: tst w10, #0xffff 48; NONEON-NOSVE-NEXT: ldrh w10, [sp] 49; NONEON-NOSVE-NEXT: strh w9, [sp, #28] 50; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 51; NONEON-NOSVE-NEXT: csel w9, w11, w9, ne 52; NONEON-NOSVE-NEXT: tst w8, #0xffff 53; NONEON-NOSVE-NEXT: strh w9, [sp, #26] 54; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 55; NONEON-NOSVE-NEXT: csel w8, w10, w9, ne 56; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 57; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 58; NONEON-NOSVE-NEXT: add sp, sp, #32 59; NONEON-NOSVE-NEXT: ret 60 %sel = select <4 x i1> %mask, <4 x i8> %op1, <4 x i8> %op2 61 ret <4 x i8> %sel 62} 63 64define <8 x i8> @select_v8i8(<8 x i8> %op1, <8 x i8> %op2, <8 x i1> %mask) { 65; CHECK-LABEL: select_v8i8: 66; CHECK: // %bb.0: 67; CHECK-NEXT: // kill: def $d2 killed $d2 def $z2 68; CHECK-NEXT: ptrue p0.b 69; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 70; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 71; CHECK-NEXT: lsl z2.b, z2.b, #7 72; CHECK-NEXT: asr z2.b, z2.b, #7 73; CHECK-NEXT: and z2.b, z2.b, #0x1 74; CHECK-NEXT: cmpne p0.b, p0/z, z2.b, #0 75; CHECK-NEXT: sel z0.b, p0, z0.b, z1.b 76; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 77; CHECK-NEXT: ret 78; 79; NONEON-NOSVE-LABEL: select_v8i8: 80; NONEON-NOSVE: // %bb.0: 81; NONEON-NOSVE-NEXT: sub sp, sp, #32 82; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 83; NONEON-NOSVE-NEXT: stp d1, d2, [sp, #8] 84; NONEON-NOSVE-NEXT: ldrb w13, [sp, #23] 85; NONEON-NOSVE-NEXT: str d0, [sp] 86; NONEON-NOSVE-NEXT: ldrb w15, [sp, #22] 87; NONEON-NOSVE-NEXT: ldrb w16, [sp, #15] 88; NONEON-NOSVE-NEXT: ldrb w17, [sp, #7] 89; NONEON-NOSVE-NEXT: ldrb w14, [sp, #21] 90; NONEON-NOSVE-NEXT: sbfx w13, w13, #0, #1 91; NONEON-NOSVE-NEXT: sbfx w15, w15, #0, #1 92; NONEON-NOSVE-NEXT: ldrb w12, [sp, #20] 93; NONEON-NOSVE-NEXT: sbfx w14, w14, #0, #1 94; NONEON-NOSVE-NEXT: ldrb w11, [sp, #19] 95; NONEON-NOSVE-NEXT: ldrb w10, [sp, #18] 96; NONEON-NOSVE-NEXT: tst w13, #0xff 97; NONEON-NOSVE-NEXT: sbfx w12, w12, #0, #1 98; NONEON-NOSVE-NEXT: ldrb w9, [sp, #17] 99; NONEON-NOSVE-NEXT: csel w13, w17, w16, ne 100; NONEON-NOSVE-NEXT: ldrb w16, [sp, #6] 101; NONEON-NOSVE-NEXT: tst w15, #0xff 102; NONEON-NOSVE-NEXT: strb w13, [sp, #31] 103; NONEON-NOSVE-NEXT: ldrb w13, [sp, #14] 104; NONEON-NOSVE-NEXT: ldrb w15, [sp, #5] 105; NONEON-NOSVE-NEXT: sbfx w11, w11, #0, #1 106; NONEON-NOSVE-NEXT: sbfx w10, w10, #0, #1 107; NONEON-NOSVE-NEXT: sbfx w9, w9, #0, #1 108; NONEON-NOSVE-NEXT: csel w13, w16, w13, ne 109; NONEON-NOSVE-NEXT: tst w14, #0xff 110; NONEON-NOSVE-NEXT: ldrb w14, [sp, #4] 111; NONEON-NOSVE-NEXT: strb w13, [sp, #30] 112; NONEON-NOSVE-NEXT: ldrb w13, [sp, #13] 113; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 114; NONEON-NOSVE-NEXT: csel w13, w15, w13, ne 115; NONEON-NOSVE-NEXT: tst w12, #0xff 116; NONEON-NOSVE-NEXT: sbfx w8, w8, #0, #1 117; NONEON-NOSVE-NEXT: strb w13, [sp, #29] 118; NONEON-NOSVE-NEXT: ldrb w13, [sp, #12] 119; NONEON-NOSVE-NEXT: csel w12, w14, w13, ne 120; NONEON-NOSVE-NEXT: ldrb w13, [sp, #3] 121; NONEON-NOSVE-NEXT: tst w11, #0xff 122; NONEON-NOSVE-NEXT: strb w12, [sp, #28] 123; NONEON-NOSVE-NEXT: ldrb w12, [sp, #11] 124; NONEON-NOSVE-NEXT: csel w11, w13, w12, ne 125; NONEON-NOSVE-NEXT: ldrb w12, [sp, #2] 126; NONEON-NOSVE-NEXT: tst w10, #0xff 127; NONEON-NOSVE-NEXT: strb w11, [sp, #27] 128; NONEON-NOSVE-NEXT: ldrb w11, [sp, #10] 129; NONEON-NOSVE-NEXT: csel w10, w12, w11, ne 130; NONEON-NOSVE-NEXT: ldrb w11, [sp, #1] 131; NONEON-NOSVE-NEXT: tst w9, #0xff 132; NONEON-NOSVE-NEXT: strb w10, [sp, #26] 133; NONEON-NOSVE-NEXT: ldrb w10, [sp, #9] 134; NONEON-NOSVE-NEXT: csel w9, w11, w10, ne 135; NONEON-NOSVE-NEXT: ldrb w10, [sp] 136; NONEON-NOSVE-NEXT: tst w8, #0xff 137; NONEON-NOSVE-NEXT: strb w9, [sp, #25] 138; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 139; NONEON-NOSVE-NEXT: csel w8, w10, w9, ne 140; NONEON-NOSVE-NEXT: strb w8, [sp, #24] 141; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 142; NONEON-NOSVE-NEXT: add sp, sp, #32 143; NONEON-NOSVE-NEXT: ret 144 %sel = select <8 x i1> %mask, <8 x i8> %op1, <8 x i8> %op2 145 ret <8 x i8> %sel 146} 147 148define <16 x i8> @select_v16i8(<16 x i8> %op1, <16 x i8> %op2, <16 x i1> %mask) { 149; CHECK-LABEL: select_v16i8: 150; CHECK: // %bb.0: 151; CHECK-NEXT: // kill: def $q2 killed $q2 def $z2 152; CHECK-NEXT: ptrue p0.b 153; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 154; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 155; CHECK-NEXT: lsl z2.b, z2.b, #7 156; CHECK-NEXT: asr z2.b, z2.b, #7 157; CHECK-NEXT: and z2.b, z2.b, #0x1 158; CHECK-NEXT: cmpne p0.b, p0/z, z2.b, #0 159; CHECK-NEXT: sel z0.b, p0, z0.b, z1.b 160; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 161; CHECK-NEXT: ret 162; 163; NONEON-NOSVE-LABEL: select_v16i8: 164; NONEON-NOSVE: // %bb.0: 165; NONEON-NOSVE-NEXT: sub sp, sp, #64 166; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 167; NONEON-NOSVE-NEXT: stp q1, q2, [sp, #16] 168; NONEON-NOSVE-NEXT: ldrb w2, [sp, #47] 169; NONEON-NOSVE-NEXT: str q0, [sp] 170; NONEON-NOSVE-NEXT: ldrb w4, [sp, #46] 171; NONEON-NOSVE-NEXT: ldrb w5, [sp, #31] 172; NONEON-NOSVE-NEXT: ldrb w6, [sp, #15] 173; NONEON-NOSVE-NEXT: ldrb w3, [sp, #45] 174; NONEON-NOSVE-NEXT: sbfx w2, w2, #0, #1 175; NONEON-NOSVE-NEXT: sbfx w4, w4, #0, #1 176; NONEON-NOSVE-NEXT: ldrb w1, [sp, #44] 177; NONEON-NOSVE-NEXT: sbfx w3, w3, #0, #1 178; NONEON-NOSVE-NEXT: ldrb w0, [sp, #43] 179; NONEON-NOSVE-NEXT: ldrb w18, [sp, #42] 180; NONEON-NOSVE-NEXT: tst w2, #0xff 181; NONEON-NOSVE-NEXT: sbfx w1, w1, #0, #1 182; NONEON-NOSVE-NEXT: ldrb w17, [sp, #41] 183; NONEON-NOSVE-NEXT: csel w2, w6, w5, ne 184; NONEON-NOSVE-NEXT: ldrb w5, [sp, #14] 185; NONEON-NOSVE-NEXT: tst w4, #0xff 186; NONEON-NOSVE-NEXT: strb w2, [sp, #63] 187; NONEON-NOSVE-NEXT: ldrb w2, [sp, #30] 188; NONEON-NOSVE-NEXT: ldrb w4, [sp, #13] 189; NONEON-NOSVE-NEXT: sbfx w0, w0, #0, #1 190; NONEON-NOSVE-NEXT: sbfx w18, w18, #0, #1 191; NONEON-NOSVE-NEXT: sbfx w17, w17, #0, #1 192; NONEON-NOSVE-NEXT: csel w2, w5, w2, ne 193; NONEON-NOSVE-NEXT: tst w3, #0xff 194; NONEON-NOSVE-NEXT: ldrb w3, [sp, #12] 195; NONEON-NOSVE-NEXT: strb w2, [sp, #62] 196; NONEON-NOSVE-NEXT: ldrb w2, [sp, #29] 197; NONEON-NOSVE-NEXT: ldrb w16, [sp, #40] 198; NONEON-NOSVE-NEXT: ldrb w15, [sp, #39] 199; NONEON-NOSVE-NEXT: ldrb w14, [sp, #38] 200; NONEON-NOSVE-NEXT: ldrb w13, [sp, #37] 201; NONEON-NOSVE-NEXT: csel w2, w4, w2, ne 202; NONEON-NOSVE-NEXT: tst w1, #0xff 203; NONEON-NOSVE-NEXT: sbfx w16, w16, #0, #1 204; NONEON-NOSVE-NEXT: strb w2, [sp, #61] 205; NONEON-NOSVE-NEXT: ldrb w2, [sp, #28] 206; NONEON-NOSVE-NEXT: sbfx w15, w15, #0, #1 207; NONEON-NOSVE-NEXT: sbfx w14, w14, #0, #1 208; NONEON-NOSVE-NEXT: sbfx w13, w13, #0, #1 209; NONEON-NOSVE-NEXT: ldrb w12, [sp, #36] 210; NONEON-NOSVE-NEXT: csel w1, w3, w2, ne 211; NONEON-NOSVE-NEXT: ldrb w2, [sp, #11] 212; NONEON-NOSVE-NEXT: tst w0, #0xff 213; NONEON-NOSVE-NEXT: strb w1, [sp, #60] 214; NONEON-NOSVE-NEXT: ldrb w1, [sp, #27] 215; NONEON-NOSVE-NEXT: sbfx w12, w12, #0, #1 216; NONEON-NOSVE-NEXT: ldrb w11, [sp, #35] 217; NONEON-NOSVE-NEXT: ldrb w10, [sp, #34] 218; NONEON-NOSVE-NEXT: ldrb w9, [sp, #33] 219; NONEON-NOSVE-NEXT: csel w0, w2, w1, ne 220; NONEON-NOSVE-NEXT: ldrb w1, [sp, #10] 221; NONEON-NOSVE-NEXT: tst w18, #0xff 222; NONEON-NOSVE-NEXT: strb w0, [sp, #59] 223; NONEON-NOSVE-NEXT: ldrb w0, [sp, #26] 224; NONEON-NOSVE-NEXT: sbfx w11, w11, #0, #1 225; NONEON-NOSVE-NEXT: sbfx w10, w10, #0, #1 226; NONEON-NOSVE-NEXT: sbfx w9, w9, #0, #1 227; NONEON-NOSVE-NEXT: ldrb w8, [sp, #32] 228; NONEON-NOSVE-NEXT: csel w18, w1, w0, ne 229; NONEON-NOSVE-NEXT: ldrb w0, [sp, #9] 230; NONEON-NOSVE-NEXT: tst w17, #0xff 231; NONEON-NOSVE-NEXT: strb w18, [sp, #58] 232; NONEON-NOSVE-NEXT: ldrb w18, [sp, #25] 233; NONEON-NOSVE-NEXT: sbfx w8, w8, #0, #1 234; NONEON-NOSVE-NEXT: csel w17, w0, w18, ne 235; NONEON-NOSVE-NEXT: ldrb w18, [sp, #8] 236; NONEON-NOSVE-NEXT: tst w16, #0xff 237; NONEON-NOSVE-NEXT: strb w17, [sp, #57] 238; NONEON-NOSVE-NEXT: ldrb w17, [sp, #24] 239; NONEON-NOSVE-NEXT: csel w16, w18, w17, ne 240; NONEON-NOSVE-NEXT: ldrb w17, [sp, #7] 241; NONEON-NOSVE-NEXT: tst w15, #0xff 242; NONEON-NOSVE-NEXT: strb w16, [sp, #56] 243; NONEON-NOSVE-NEXT: ldrb w16, [sp, #23] 244; NONEON-NOSVE-NEXT: csel w15, w17, w16, ne 245; NONEON-NOSVE-NEXT: ldrb w16, [sp, #6] 246; NONEON-NOSVE-NEXT: tst w14, #0xff 247; NONEON-NOSVE-NEXT: strb w15, [sp, #55] 248; NONEON-NOSVE-NEXT: ldrb w15, [sp, #22] 249; NONEON-NOSVE-NEXT: csel w14, w16, w15, ne 250; NONEON-NOSVE-NEXT: ldrb w15, [sp, #5] 251; NONEON-NOSVE-NEXT: tst w13, #0xff 252; NONEON-NOSVE-NEXT: strb w14, [sp, #54] 253; NONEON-NOSVE-NEXT: ldrb w14, [sp, #21] 254; NONEON-NOSVE-NEXT: csel w13, w15, w14, ne 255; NONEON-NOSVE-NEXT: ldrb w14, [sp, #4] 256; NONEON-NOSVE-NEXT: tst w12, #0xff 257; NONEON-NOSVE-NEXT: strb w13, [sp, #53] 258; NONEON-NOSVE-NEXT: ldrb w13, [sp, #20] 259; NONEON-NOSVE-NEXT: csel w12, w14, w13, ne 260; NONEON-NOSVE-NEXT: ldrb w13, [sp, #3] 261; NONEON-NOSVE-NEXT: tst w11, #0xff 262; NONEON-NOSVE-NEXT: strb w12, [sp, #52] 263; NONEON-NOSVE-NEXT: ldrb w12, [sp, #19] 264; NONEON-NOSVE-NEXT: csel w11, w13, w12, ne 265; NONEON-NOSVE-NEXT: ldrb w12, [sp, #2] 266; NONEON-NOSVE-NEXT: tst w10, #0xff 267; NONEON-NOSVE-NEXT: strb w11, [sp, #51] 268; NONEON-NOSVE-NEXT: ldrb w11, [sp, #18] 269; NONEON-NOSVE-NEXT: csel w10, w12, w11, ne 270; NONEON-NOSVE-NEXT: ldrb w11, [sp, #1] 271; NONEON-NOSVE-NEXT: tst w9, #0xff 272; NONEON-NOSVE-NEXT: strb w10, [sp, #50] 273; NONEON-NOSVE-NEXT: ldrb w10, [sp, #17] 274; NONEON-NOSVE-NEXT: csel w9, w11, w10, ne 275; NONEON-NOSVE-NEXT: ldrb w10, [sp] 276; NONEON-NOSVE-NEXT: tst w8, #0xff 277; NONEON-NOSVE-NEXT: strb w9, [sp, #49] 278; NONEON-NOSVE-NEXT: ldrb w9, [sp, #16] 279; NONEON-NOSVE-NEXT: csel w8, w10, w9, ne 280; NONEON-NOSVE-NEXT: strb w8, [sp, #48] 281; NONEON-NOSVE-NEXT: ldr q0, [sp, #48] 282; NONEON-NOSVE-NEXT: add sp, sp, #64 283; NONEON-NOSVE-NEXT: ret 284 %sel = select <16 x i1> %mask, <16 x i8> %op1, <16 x i8> %op2 285 ret <16 x i8> %sel 286} 287 288define void @select_v32i8(ptr %a, ptr %b) { 289; CHECK-LABEL: select_v32i8: 290; CHECK: // %bb.0: 291; CHECK-NEXT: ldp q0, q2, [x0] 292; CHECK-NEXT: ptrue p0.b, vl16 293; CHECK-NEXT: ldp q1, q3, [x1] 294; CHECK-NEXT: cmpeq p1.b, p0/z, z0.b, z1.b 295; CHECK-NEXT: cmpeq p0.b, p0/z, z2.b, z3.b 296; CHECK-NEXT: sel z0.b, p1, z0.b, z1.b 297; CHECK-NEXT: sel z1.b, p0, z2.b, z3.b 298; CHECK-NEXT: stp q0, q1, [x0] 299; CHECK-NEXT: ret 300; 301; NONEON-NOSVE-LABEL: select_v32i8: 302; NONEON-NOSVE: // %bb.0: 303; NONEON-NOSVE-NEXT: sub sp, sp, #208 304; NONEON-NOSVE-NEXT: stp x29, x30, [sp, #112] // 16-byte Folded Spill 305; NONEON-NOSVE-NEXT: stp x28, x27, [sp, #128] // 16-byte Folded Spill 306; NONEON-NOSVE-NEXT: stp x26, x25, [sp, #144] // 16-byte Folded Spill 307; NONEON-NOSVE-NEXT: stp x24, x23, [sp, #160] // 16-byte Folded Spill 308; NONEON-NOSVE-NEXT: stp x22, x21, [sp, #176] // 16-byte Folded Spill 309; NONEON-NOSVE-NEXT: stp x20, x19, [sp, #192] // 16-byte Folded Spill 310; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 208 311; NONEON-NOSVE-NEXT: .cfi_offset w19, -8 312; NONEON-NOSVE-NEXT: .cfi_offset w20, -16 313; NONEON-NOSVE-NEXT: .cfi_offset w21, -24 314; NONEON-NOSVE-NEXT: .cfi_offset w22, -32 315; NONEON-NOSVE-NEXT: .cfi_offset w23, -40 316; NONEON-NOSVE-NEXT: .cfi_offset w24, -48 317; NONEON-NOSVE-NEXT: .cfi_offset w25, -56 318; NONEON-NOSVE-NEXT: .cfi_offset w26, -64 319; NONEON-NOSVE-NEXT: .cfi_offset w27, -72 320; NONEON-NOSVE-NEXT: .cfi_offset w28, -80 321; NONEON-NOSVE-NEXT: .cfi_offset w30, -88 322; NONEON-NOSVE-NEXT: .cfi_offset w29, -96 323; NONEON-NOSVE-NEXT: ldp q0, q3, [x1] 324; NONEON-NOSVE-NEXT: ldp q1, q2, [x0] 325; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #16] 326; NONEON-NOSVE-NEXT: ldrb w8, [sp, #33] 327; NONEON-NOSVE-NEXT: ldrb w9, [sp, #17] 328; NONEON-NOSVE-NEXT: ldrb w10, [sp, #34] 329; NONEON-NOSVE-NEXT: ldrb w11, [sp, #18] 330; NONEON-NOSVE-NEXT: ldrb w12, [sp, #35] 331; NONEON-NOSVE-NEXT: ldrb w13, [sp, #19] 332; NONEON-NOSVE-NEXT: cmp w9, w8 333; NONEON-NOSVE-NEXT: ldrb w14, [sp, #36] 334; NONEON-NOSVE-NEXT: ldrb w16, [sp, #20] 335; NONEON-NOSVE-NEXT: csel w8, w9, w8, eq 336; NONEON-NOSVE-NEXT: cmp w11, w10 337; NONEON-NOSVE-NEXT: ldrb w18, [sp, #37] 338; NONEON-NOSVE-NEXT: csel w9, w11, w10, eq 339; NONEON-NOSVE-NEXT: cmp w13, w12 340; NONEON-NOSVE-NEXT: ldrb w1, [sp, #21] 341; NONEON-NOSVE-NEXT: str w8, [sp, #12] // 4-byte Folded Spill 342; NONEON-NOSVE-NEXT: csel w8, w13, w12, eq 343; NONEON-NOSVE-NEXT: cmp w16, w14 344; NONEON-NOSVE-NEXT: ldrb w13, [sp, #38] 345; NONEON-NOSVE-NEXT: ldrb w2, [sp, #22] 346; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #4] // 8-byte Folded Spill 347; NONEON-NOSVE-NEXT: csel w8, w16, w14, eq 348; NONEON-NOSVE-NEXT: cmp w1, w18 349; NONEON-NOSVE-NEXT: ldrb w14, [sp, #39] 350; NONEON-NOSVE-NEXT: ldrb w16, [sp, #23] 351; NONEON-NOSVE-NEXT: csel w12, w1, w18, eq 352; NONEON-NOSVE-NEXT: cmp w2, w13 353; NONEON-NOSVE-NEXT: ldrb w18, [sp, #40] 354; NONEON-NOSVE-NEXT: ldrb w1, [sp, #24] 355; NONEON-NOSVE-NEXT: csel w13, w2, w13, eq 356; NONEON-NOSVE-NEXT: cmp w16, w14 357; NONEON-NOSVE-NEXT: ldrb w2, [sp, #41] 358; NONEON-NOSVE-NEXT: ldrb w5, [sp, #25] 359; NONEON-NOSVE-NEXT: csel w14, w16, w14, eq 360; NONEON-NOSVE-NEXT: cmp w1, w18 361; NONEON-NOSVE-NEXT: ldrb w6, [sp, #26] 362; NONEON-NOSVE-NEXT: csel w16, w1, w18, eq 363; NONEON-NOSVE-NEXT: ldrb w1, [sp, #42] 364; NONEON-NOSVE-NEXT: cmp w5, w2 365; NONEON-NOSVE-NEXT: csel w18, w5, w2, eq 366; NONEON-NOSVE-NEXT: ldrb w2, [sp, #43] 367; NONEON-NOSVE-NEXT: ldrb w5, [sp, #27] 368; NONEON-NOSVE-NEXT: cmp w6, w1 369; NONEON-NOSVE-NEXT: ldrb w19, [sp, #28] 370; NONEON-NOSVE-NEXT: ldrb w29, [sp, #45] 371; NONEON-NOSVE-NEXT: csel w1, w6, w1, eq 372; NONEON-NOSVE-NEXT: ldrb w6, [sp, #44] 373; NONEON-NOSVE-NEXT: cmp w5, w2 374; NONEON-NOSVE-NEXT: ldrb w30, [sp, #29] 375; NONEON-NOSVE-NEXT: str w8, [sp] // 4-byte Folded Spill 376; NONEON-NOSVE-NEXT: csel w2, w5, w2, eq 377; NONEON-NOSVE-NEXT: ldrb w9, [sp, #46] 378; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30] 379; NONEON-NOSVE-NEXT: cmp w19, w6 380; NONEON-NOSVE-NEXT: stp q2, q3, [sp, #48] 381; NONEON-NOSVE-NEXT: ldrb w21, [sp, #47] 382; NONEON-NOSVE-NEXT: ldrb w10, [sp, #31] 383; NONEON-NOSVE-NEXT: csel w5, w19, w6, eq 384; NONEON-NOSVE-NEXT: cmp w30, w29 385; NONEON-NOSVE-NEXT: ldrb w22, [sp, #64] 386; NONEON-NOSVE-NEXT: ldrb w11, [sp, #48] 387; NONEON-NOSVE-NEXT: csel w6, w30, w29, eq 388; NONEON-NOSVE-NEXT: cmp w8, w9 389; NONEON-NOSVE-NEXT: ldrb w28, [sp, #65] 390; NONEON-NOSVE-NEXT: ldrb w29, [sp, #49] 391; NONEON-NOSVE-NEXT: csel w19, w8, w9, eq 392; NONEON-NOSVE-NEXT: cmp w10, w21 393; NONEON-NOSVE-NEXT: ldrb w27, [sp, #66] 394; NONEON-NOSVE-NEXT: ldrb w8, [sp, #50] 395; NONEON-NOSVE-NEXT: csel w21, w10, w21, eq 396; NONEON-NOSVE-NEXT: cmp w11, w22 397; NONEON-NOSVE-NEXT: ldrb w26, [sp, #67] 398; NONEON-NOSVE-NEXT: ldrb w9, [sp, #51] 399; NONEON-NOSVE-NEXT: csel w22, w11, w22, eq 400; NONEON-NOSVE-NEXT: cmp w29, w28 401; NONEON-NOSVE-NEXT: ldrb w25, [sp, #68] 402; NONEON-NOSVE-NEXT: ldrb w10, [sp, #52] 403; NONEON-NOSVE-NEXT: csel w11, w29, w28, eq 404; NONEON-NOSVE-NEXT: cmp w8, w27 405; NONEON-NOSVE-NEXT: ldrb w24, [sp, #69] 406; NONEON-NOSVE-NEXT: ldrb w28, [sp, #53] 407; NONEON-NOSVE-NEXT: csel w8, w8, w27, eq 408; NONEON-NOSVE-NEXT: cmp w9, w26 409; NONEON-NOSVE-NEXT: ldrb w23, [sp, #70] 410; NONEON-NOSVE-NEXT: ldrb w27, [sp, #54] 411; NONEON-NOSVE-NEXT: csel w9, w9, w26, eq 412; NONEON-NOSVE-NEXT: cmp w10, w25 413; NONEON-NOSVE-NEXT: ldrb w20, [sp, #71] 414; NONEON-NOSVE-NEXT: ldrb w26, [sp, #55] 415; NONEON-NOSVE-NEXT: csel w10, w10, w25, eq 416; NONEON-NOSVE-NEXT: cmp w28, w24 417; NONEON-NOSVE-NEXT: ldrb w7, [sp, #72] 418; NONEON-NOSVE-NEXT: ldrb w25, [sp, #56] 419; NONEON-NOSVE-NEXT: csel w24, w28, w24, eq 420; NONEON-NOSVE-NEXT: cmp w27, w23 421; NONEON-NOSVE-NEXT: ldrb w4, [sp, #73] 422; NONEON-NOSVE-NEXT: ldrb w28, [sp, #57] 423; NONEON-NOSVE-NEXT: csel w23, w27, w23, eq 424; NONEON-NOSVE-NEXT: cmp w26, w20 425; NONEON-NOSVE-NEXT: ldrb w3, [sp, #74] 426; NONEON-NOSVE-NEXT: ldrb w27, [sp, #58] 427; NONEON-NOSVE-NEXT: csel w20, w26, w20, eq 428; NONEON-NOSVE-NEXT: cmp w25, w7 429; NONEON-NOSVE-NEXT: ldrb w17, [sp, #75] 430; NONEON-NOSVE-NEXT: ldrb w26, [sp, #59] 431; NONEON-NOSVE-NEXT: csel w7, w25, w7, eq 432; NONEON-NOSVE-NEXT: cmp w28, w4 433; NONEON-NOSVE-NEXT: ldrb w15, [sp, #76] 434; NONEON-NOSVE-NEXT: ldrb w25, [sp, #60] 435; NONEON-NOSVE-NEXT: csel w4, w28, w4, eq 436; NONEON-NOSVE-NEXT: cmp w27, w3 437; NONEON-NOSVE-NEXT: csel w3, w27, w3, eq 438; NONEON-NOSVE-NEXT: cmp w26, w17 439; NONEON-NOSVE-NEXT: ldrb w28, [sp, #77] 440; NONEON-NOSVE-NEXT: ldrb w27, [sp, #61] 441; NONEON-NOSVE-NEXT: csel w17, w26, w17, eq 442; NONEON-NOSVE-NEXT: cmp w25, w15 443; NONEON-NOSVE-NEXT: ldrb w26, [sp, #78] 444; NONEON-NOSVE-NEXT: csel w15, w25, w15, eq 445; NONEON-NOSVE-NEXT: ldrb w25, [sp, #62] 446; NONEON-NOSVE-NEXT: cmp w27, w28 447; NONEON-NOSVE-NEXT: ldrb w29, [sp, #79] 448; NONEON-NOSVE-NEXT: ldrb w30, [sp, #63] 449; NONEON-NOSVE-NEXT: strb w9, [sp, #99] 450; NONEON-NOSVE-NEXT: csel w27, w27, w28, eq 451; NONEON-NOSVE-NEXT: cmp w25, w26 452; NONEON-NOSVE-NEXT: strb w8, [sp, #98] 453; NONEON-NOSVE-NEXT: csel w25, w25, w26, eq 454; NONEON-NOSVE-NEXT: cmp w30, w29 455; NONEON-NOSVE-NEXT: ldp w9, w8, [sp] // 8-byte Folded Reload 456; NONEON-NOSVE-NEXT: csel w26, w30, w29, eq 457; NONEON-NOSVE-NEXT: ldrb w28, [sp, #32] 458; NONEON-NOSVE-NEXT: ldrb w29, [sp, #16] 459; NONEON-NOSVE-NEXT: strb w26, [sp, #111] 460; NONEON-NOSVE-NEXT: strb w9, [sp, #84] 461; NONEON-NOSVE-NEXT: cmp w29, w28 462; NONEON-NOSVE-NEXT: strb w8, [sp, #83] 463; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #8] // 8-byte Folded Reload 464; NONEON-NOSVE-NEXT: strb w25, [sp, #110] 465; NONEON-NOSVE-NEXT: ldp x26, x25, [sp, #144] // 16-byte Folded Reload 466; NONEON-NOSVE-NEXT: strb w27, [sp, #109] 467; NONEON-NOSVE-NEXT: strb w8, [sp, #81] 468; NONEON-NOSVE-NEXT: csel w8, w29, w28, eq 469; NONEON-NOSVE-NEXT: strb w15, [sp, #108] 470; NONEON-NOSVE-NEXT: ldp x28, x27, [sp, #128] // 16-byte Folded Reload 471; NONEON-NOSVE-NEXT: strb w17, [sp, #107] 472; NONEON-NOSVE-NEXT: ldp x29, x30, [sp, #112] // 16-byte Folded Reload 473; NONEON-NOSVE-NEXT: strb w3, [sp, #106] 474; NONEON-NOSVE-NEXT: strb w4, [sp, #105] 475; NONEON-NOSVE-NEXT: strb w7, [sp, #104] 476; NONEON-NOSVE-NEXT: strb w20, [sp, #103] 477; NONEON-NOSVE-NEXT: strb w23, [sp, #102] 478; NONEON-NOSVE-NEXT: strb w24, [sp, #101] 479; NONEON-NOSVE-NEXT: ldp x24, x23, [sp, #160] // 16-byte Folded Reload 480; NONEON-NOSVE-NEXT: strb w10, [sp, #100] 481; NONEON-NOSVE-NEXT: strb w11, [sp, #97] 482; NONEON-NOSVE-NEXT: strb w22, [sp, #96] 483; NONEON-NOSVE-NEXT: strb w21, [sp, #95] 484; NONEON-NOSVE-NEXT: ldp x22, x21, [sp, #176] // 16-byte Folded Reload 485; NONEON-NOSVE-NEXT: strb w19, [sp, #94] 486; NONEON-NOSVE-NEXT: ldp x20, x19, [sp, #192] // 16-byte Folded Reload 487; NONEON-NOSVE-NEXT: strb w6, [sp, #93] 488; NONEON-NOSVE-NEXT: strb w5, [sp, #92] 489; NONEON-NOSVE-NEXT: strb w2, [sp, #91] 490; NONEON-NOSVE-NEXT: strb w1, [sp, #90] 491; NONEON-NOSVE-NEXT: strb w18, [sp, #89] 492; NONEON-NOSVE-NEXT: strb w16, [sp, #88] 493; NONEON-NOSVE-NEXT: strb w14, [sp, #87] 494; NONEON-NOSVE-NEXT: strb w13, [sp, #86] 495; NONEON-NOSVE-NEXT: strb w12, [sp, #85] 496; NONEON-NOSVE-NEXT: strb w9, [sp, #82] 497; NONEON-NOSVE-NEXT: strb w8, [sp, #80] 498; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #80] 499; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 500; NONEON-NOSVE-NEXT: add sp, sp, #208 501; NONEON-NOSVE-NEXT: ret 502 %op1 = load <32 x i8>, ptr %a 503 %op2 = load <32 x i8>, ptr %b 504 %mask = icmp eq <32 x i8> %op1, %op2 505 %sel = select <32 x i1> %mask, <32 x i8> %op1, <32 x i8> %op2 506 store <32 x i8> %sel, ptr %a 507 ret void 508} 509 510define <2 x i16> @select_v2i16(<2 x i16> %op1, <2 x i16> %op2, <2 x i1> %mask) { 511; CHECK-LABEL: select_v2i16: 512; CHECK: // %bb.0: 513; CHECK-NEXT: // kill: def $d2 killed $d2 def $z2 514; CHECK-NEXT: ptrue p0.s 515; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 516; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 517; CHECK-NEXT: lsl z2.s, z2.s, #31 518; CHECK-NEXT: asr z2.s, z2.s, #31 519; CHECK-NEXT: and z2.s, z2.s, #0x1 520; CHECK-NEXT: cmpne p0.s, p0/z, z2.s, #0 521; CHECK-NEXT: sel z0.s, p0, z0.s, z1.s 522; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 523; CHECK-NEXT: ret 524; 525; NONEON-NOSVE-LABEL: select_v2i16: 526; NONEON-NOSVE: // %bb.0: 527; NONEON-NOSVE-NEXT: sub sp, sp, #32 528; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 529; NONEON-NOSVE-NEXT: stp d1, d2, [sp, #8] 530; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #16] 531; NONEON-NOSVE-NEXT: str d0, [sp] 532; NONEON-NOSVE-NEXT: ldr w10, [sp, #12] 533; NONEON-NOSVE-NEXT: ldr w11, [sp, #4] 534; NONEON-NOSVE-NEXT: sbfx w8, w8, #0, #1 535; NONEON-NOSVE-NEXT: sbfx w9, w9, #0, #1 536; NONEON-NOSVE-NEXT: cmp w8, #0 537; NONEON-NOSVE-NEXT: csel w8, w11, w10, ne 538; NONEON-NOSVE-NEXT: ldr w10, [sp] 539; NONEON-NOSVE-NEXT: cmp w9, #0 540; NONEON-NOSVE-NEXT: str w8, [sp, #28] 541; NONEON-NOSVE-NEXT: ldr w8, [sp, #8] 542; NONEON-NOSVE-NEXT: csel w8, w10, w8, ne 543; NONEON-NOSVE-NEXT: str w8, [sp, #24] 544; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 545; NONEON-NOSVE-NEXT: add sp, sp, #32 546; NONEON-NOSVE-NEXT: ret 547 %sel = select <2 x i1> %mask, <2 x i16> %op1, <2 x i16> %op2 548 ret <2 x i16> %sel 549} 550 551define <4 x i16> @select_v4i16(<4 x i16> %op1, <4 x i16> %op2, <4 x i1> %mask) { 552; CHECK-LABEL: select_v4i16: 553; CHECK: // %bb.0: 554; CHECK-NEXT: // kill: def $d2 killed $d2 def $z2 555; CHECK-NEXT: ptrue p0.h 556; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 557; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 558; CHECK-NEXT: lsl z2.h, z2.h, #15 559; CHECK-NEXT: asr z2.h, z2.h, #15 560; CHECK-NEXT: and z2.h, z2.h, #0x1 561; CHECK-NEXT: cmpne p0.h, p0/z, z2.h, #0 562; CHECK-NEXT: sel z0.h, p0, z0.h, z1.h 563; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 564; CHECK-NEXT: ret 565; 566; NONEON-NOSVE-LABEL: select_v4i16: 567; NONEON-NOSVE: // %bb.0: 568; NONEON-NOSVE-NEXT: sub sp, sp, #32 569; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 570; NONEON-NOSVE-NEXT: stp d1, d2, [sp, #8] 571; NONEON-NOSVE-NEXT: ldrh w9, [sp, #22] 572; NONEON-NOSVE-NEXT: str d0, [sp] 573; NONEON-NOSVE-NEXT: ldrh w11, [sp, #20] 574; NONEON-NOSVE-NEXT: ldrh w12, [sp, #14] 575; NONEON-NOSVE-NEXT: ldrh w13, [sp, #6] 576; NONEON-NOSVE-NEXT: ldrh w10, [sp, #18] 577; NONEON-NOSVE-NEXT: sbfx w9, w9, #0, #1 578; NONEON-NOSVE-NEXT: sbfx w11, w11, #0, #1 579; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 580; NONEON-NOSVE-NEXT: sbfx w10, w10, #0, #1 581; NONEON-NOSVE-NEXT: tst w9, #0xffff 582; NONEON-NOSVE-NEXT: sbfx w8, w8, #0, #1 583; NONEON-NOSVE-NEXT: csel w9, w13, w12, ne 584; NONEON-NOSVE-NEXT: ldrh w12, [sp, #4] 585; NONEON-NOSVE-NEXT: tst w11, #0xffff 586; NONEON-NOSVE-NEXT: strh w9, [sp, #30] 587; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 588; NONEON-NOSVE-NEXT: ldrh w11, [sp, #2] 589; NONEON-NOSVE-NEXT: csel w9, w12, w9, ne 590; NONEON-NOSVE-NEXT: tst w10, #0xffff 591; NONEON-NOSVE-NEXT: ldrh w10, [sp] 592; NONEON-NOSVE-NEXT: strh w9, [sp, #28] 593; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 594; NONEON-NOSVE-NEXT: csel w9, w11, w9, ne 595; NONEON-NOSVE-NEXT: tst w8, #0xffff 596; NONEON-NOSVE-NEXT: strh w9, [sp, #26] 597; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 598; NONEON-NOSVE-NEXT: csel w8, w10, w9, ne 599; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 600; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 601; NONEON-NOSVE-NEXT: add sp, sp, #32 602; NONEON-NOSVE-NEXT: ret 603 %sel = select <4 x i1> %mask, <4 x i16> %op1, <4 x i16> %op2 604 ret <4 x i16> %sel 605} 606 607define <8 x i16> @select_v8i16(<8 x i16> %op1, <8 x i16> %op2, <8 x i1> %mask) { 608; CHECK-LABEL: select_v8i16: 609; CHECK: // %bb.0: 610; CHECK-NEXT: // kill: def $d2 killed $d2 def $z2 611; CHECK-NEXT: ptrue p0.h 612; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 613; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 614; CHECK-NEXT: uunpklo z2.h, z2.b 615; CHECK-NEXT: lsl z2.h, z2.h, #15 616; CHECK-NEXT: asr z2.h, z2.h, #15 617; CHECK-NEXT: and z2.h, z2.h, #0x1 618; CHECK-NEXT: cmpne p0.h, p0/z, z2.h, #0 619; CHECK-NEXT: sel z0.h, p0, z0.h, z1.h 620; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 621; CHECK-NEXT: ret 622; 623; NONEON-NOSVE-LABEL: select_v8i16: 624; NONEON-NOSVE: // %bb.0: 625; NONEON-NOSVE-NEXT: sub sp, sp, #64 626; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 627; NONEON-NOSVE-NEXT: str d2, [sp, #40] 628; NONEON-NOSVE-NEXT: ldrb w13, [sp, #47] 629; NONEON-NOSVE-NEXT: stp q0, q1, [sp] 630; NONEON-NOSVE-NEXT: ldrb w15, [sp, #46] 631; NONEON-NOSVE-NEXT: ldrh w16, [sp, #30] 632; NONEON-NOSVE-NEXT: ldrh w17, [sp, #14] 633; NONEON-NOSVE-NEXT: ldrb w14, [sp, #45] 634; NONEON-NOSVE-NEXT: sbfx w13, w13, #0, #1 635; NONEON-NOSVE-NEXT: sbfx w15, w15, #0, #1 636; NONEON-NOSVE-NEXT: ldrb w12, [sp, #44] 637; NONEON-NOSVE-NEXT: sbfx w14, w14, #0, #1 638; NONEON-NOSVE-NEXT: ldrb w11, [sp, #43] 639; NONEON-NOSVE-NEXT: ldrb w10, [sp, #42] 640; NONEON-NOSVE-NEXT: tst w13, #0xffff 641; NONEON-NOSVE-NEXT: sbfx w12, w12, #0, #1 642; NONEON-NOSVE-NEXT: ldrb w9, [sp, #41] 643; NONEON-NOSVE-NEXT: csel w13, w17, w16, ne 644; NONEON-NOSVE-NEXT: ldrh w16, [sp, #12] 645; NONEON-NOSVE-NEXT: tst w15, #0xffff 646; NONEON-NOSVE-NEXT: strh w13, [sp, #62] 647; NONEON-NOSVE-NEXT: ldrh w13, [sp, #28] 648; NONEON-NOSVE-NEXT: ldrh w15, [sp, #10] 649; NONEON-NOSVE-NEXT: sbfx w11, w11, #0, #1 650; NONEON-NOSVE-NEXT: sbfx w10, w10, #0, #1 651; NONEON-NOSVE-NEXT: sbfx w9, w9, #0, #1 652; NONEON-NOSVE-NEXT: csel w13, w16, w13, ne 653; NONEON-NOSVE-NEXT: tst w14, #0xffff 654; NONEON-NOSVE-NEXT: ldrh w14, [sp, #8] 655; NONEON-NOSVE-NEXT: strh w13, [sp, #60] 656; NONEON-NOSVE-NEXT: ldrh w13, [sp, #26] 657; NONEON-NOSVE-NEXT: ldrb w8, [sp, #40] 658; NONEON-NOSVE-NEXT: csel w13, w15, w13, ne 659; NONEON-NOSVE-NEXT: tst w12, #0xffff 660; NONEON-NOSVE-NEXT: sbfx w8, w8, #0, #1 661; NONEON-NOSVE-NEXT: strh w13, [sp, #58] 662; NONEON-NOSVE-NEXT: ldrh w13, [sp, #24] 663; NONEON-NOSVE-NEXT: csel w12, w14, w13, ne 664; NONEON-NOSVE-NEXT: ldrh w13, [sp, #6] 665; NONEON-NOSVE-NEXT: tst w11, #0xffff 666; NONEON-NOSVE-NEXT: strh w12, [sp, #56] 667; NONEON-NOSVE-NEXT: ldrh w12, [sp, #22] 668; NONEON-NOSVE-NEXT: csel w11, w13, w12, ne 669; NONEON-NOSVE-NEXT: ldrh w12, [sp, #4] 670; NONEON-NOSVE-NEXT: tst w10, #0xffff 671; NONEON-NOSVE-NEXT: strh w11, [sp, #54] 672; NONEON-NOSVE-NEXT: ldrh w11, [sp, #20] 673; NONEON-NOSVE-NEXT: csel w10, w12, w11, ne 674; NONEON-NOSVE-NEXT: ldrh w11, [sp, #2] 675; NONEON-NOSVE-NEXT: tst w9, #0xffff 676; NONEON-NOSVE-NEXT: strh w10, [sp, #52] 677; NONEON-NOSVE-NEXT: ldrh w10, [sp, #18] 678; NONEON-NOSVE-NEXT: csel w9, w11, w10, ne 679; NONEON-NOSVE-NEXT: ldrh w10, [sp] 680; NONEON-NOSVE-NEXT: tst w8, #0xffff 681; NONEON-NOSVE-NEXT: strh w9, [sp, #50] 682; NONEON-NOSVE-NEXT: ldrh w9, [sp, #16] 683; NONEON-NOSVE-NEXT: csel w8, w10, w9, ne 684; NONEON-NOSVE-NEXT: strh w8, [sp, #48] 685; NONEON-NOSVE-NEXT: ldr q0, [sp, #48] 686; NONEON-NOSVE-NEXT: add sp, sp, #64 687; NONEON-NOSVE-NEXT: ret 688 %sel = select <8 x i1> %mask, <8 x i16> %op1, <8 x i16> %op2 689 ret <8 x i16> %sel 690} 691 692define void @select_v16i16(ptr %a, ptr %b) { 693; CHECK-LABEL: select_v16i16: 694; CHECK: // %bb.0: 695; CHECK-NEXT: ldp q0, q2, [x0] 696; CHECK-NEXT: ptrue p0.h, vl8 697; CHECK-NEXT: ldp q1, q3, [x1] 698; CHECK-NEXT: cmpeq p1.h, p0/z, z0.h, z1.h 699; CHECK-NEXT: cmpeq p0.h, p0/z, z2.h, z3.h 700; CHECK-NEXT: sel z0.h, p1, z0.h, z1.h 701; CHECK-NEXT: sel z1.h, p0, z2.h, z3.h 702; CHECK-NEXT: stp q0, q1, [x0] 703; CHECK-NEXT: ret 704; 705; NONEON-NOSVE-LABEL: select_v16i16: 706; NONEON-NOSVE: // %bb.0: 707; NONEON-NOSVE-NEXT: sub sp, sp, #112 708; NONEON-NOSVE-NEXT: str x19, [sp, #96] // 8-byte Folded Spill 709; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 112 710; NONEON-NOSVE-NEXT: .cfi_offset w19, -16 711; NONEON-NOSVE-NEXT: ldp q0, q3, [x1] 712; NONEON-NOSVE-NEXT: ldp q1, q2, [x0] 713; NONEON-NOSVE-NEXT: stp q1, q0, [sp] 714; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 715; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2] 716; NONEON-NOSVE-NEXT: ldrh w12, [sp, #20] 717; NONEON-NOSVE-NEXT: ldrh w13, [sp, #4] 718; NONEON-NOSVE-NEXT: ldrh w14, [sp, #22] 719; NONEON-NOSVE-NEXT: ldrh w15, [sp, #6] 720; NONEON-NOSVE-NEXT: cmp w9, w8 721; NONEON-NOSVE-NEXT: ldrh w16, [sp, #24] 722; NONEON-NOSVE-NEXT: ldrh w17, [sp, #8] 723; NONEON-NOSVE-NEXT: csel w8, w9, w8, eq 724; NONEON-NOSVE-NEXT: cmp w13, w12 725; NONEON-NOSVE-NEXT: ldrh w1, [sp, #12] 726; NONEON-NOSVE-NEXT: csel w9, w13, w12, eq 727; NONEON-NOSVE-NEXT: cmp w15, w14 728; NONEON-NOSVE-NEXT: ldrh w12, [sp, #26] 729; NONEON-NOSVE-NEXT: ldrh w13, [sp, #10] 730; NONEON-NOSVE-NEXT: csel w14, w15, w14, eq 731; NONEON-NOSVE-NEXT: cmp w17, w16 732; NONEON-NOSVE-NEXT: csel w16, w17, w16, eq 733; NONEON-NOSVE-NEXT: ldrh w17, [sp, #28] 734; NONEON-NOSVE-NEXT: stp q2, q3, [sp, #32] 735; NONEON-NOSVE-NEXT: cmp w13, w12 736; NONEON-NOSVE-NEXT: ldrh w3, [sp, #30] 737; NONEON-NOSVE-NEXT: ldrh w4, [sp, #14] 738; NONEON-NOSVE-NEXT: csel w12, w13, w12, eq 739; NONEON-NOSVE-NEXT: cmp w1, w17 740; NONEON-NOSVE-NEXT: ldrh w5, [sp, #32] 741; NONEON-NOSVE-NEXT: csel w17, w1, w17, eq 742; NONEON-NOSVE-NEXT: ldrh w1, [sp, #48] 743; NONEON-NOSVE-NEXT: cmp w4, w3 744; NONEON-NOSVE-NEXT: ldrh w6, [sp, #50] 745; NONEON-NOSVE-NEXT: ldrh w7, [sp, #34] 746; NONEON-NOSVE-NEXT: ldrh w2, [sp, #52] 747; NONEON-NOSVE-NEXT: csel w3, w4, w3, eq 748; NONEON-NOSVE-NEXT: ldrh w4, [sp, #36] 749; NONEON-NOSVE-NEXT: cmp w5, w1 750; NONEON-NOSVE-NEXT: ldrh w13, [sp, #54] 751; NONEON-NOSVE-NEXT: ldrh w19, [sp, #38] 752; NONEON-NOSVE-NEXT: csel w1, w5, w1, eq 753; NONEON-NOSVE-NEXT: cmp w7, w6 754; NONEON-NOSVE-NEXT: ldrh w18, [sp, #56] 755; NONEON-NOSVE-NEXT: ldrh w5, [sp, #40] 756; NONEON-NOSVE-NEXT: csel w6, w7, w6, eq 757; NONEON-NOSVE-NEXT: cmp w4, w2 758; NONEON-NOSVE-NEXT: ldrh w15, [sp, #58] 759; NONEON-NOSVE-NEXT: ldrh w7, [sp, #42] 760; NONEON-NOSVE-NEXT: csel w2, w4, w2, eq 761; NONEON-NOSVE-NEXT: cmp w19, w13 762; NONEON-NOSVE-NEXT: ldrh w11, [sp, #60] 763; NONEON-NOSVE-NEXT: ldrh w4, [sp, #44] 764; NONEON-NOSVE-NEXT: csel w13, w19, w13, eq 765; NONEON-NOSVE-NEXT: cmp w5, w18 766; NONEON-NOSVE-NEXT: ldrh w10, [sp, #62] 767; NONEON-NOSVE-NEXT: ldrh w19, [sp, #46] 768; NONEON-NOSVE-NEXT: csel w18, w5, w18, eq 769; NONEON-NOSVE-NEXT: cmp w7, w15 770; NONEON-NOSVE-NEXT: ldrh w5, [sp] 771; NONEON-NOSVE-NEXT: csel w15, w7, w15, eq 772; NONEON-NOSVE-NEXT: cmp w4, w11 773; NONEON-NOSVE-NEXT: strh w8, [sp, #66] 774; NONEON-NOSVE-NEXT: csel w11, w4, w11, eq 775; NONEON-NOSVE-NEXT: ldrh w4, [sp, #16] 776; NONEON-NOSVE-NEXT: cmp w19, w10 777; NONEON-NOSVE-NEXT: csel w10, w19, w10, eq 778; NONEON-NOSVE-NEXT: strh w11, [sp, #92] 779; NONEON-NOSVE-NEXT: ldr x19, [sp, #96] // 8-byte Folded Reload 780; NONEON-NOSVE-NEXT: cmp w5, w4 781; NONEON-NOSVE-NEXT: strh w10, [sp, #94] 782; NONEON-NOSVE-NEXT: csel w8, w5, w4, eq 783; NONEON-NOSVE-NEXT: strh w15, [sp, #90] 784; NONEON-NOSVE-NEXT: strh w18, [sp, #88] 785; NONEON-NOSVE-NEXT: strh w13, [sp, #86] 786; NONEON-NOSVE-NEXT: strh w2, [sp, #84] 787; NONEON-NOSVE-NEXT: strh w6, [sp, #82] 788; NONEON-NOSVE-NEXT: strh w1, [sp, #80] 789; NONEON-NOSVE-NEXT: strh w3, [sp, #78] 790; NONEON-NOSVE-NEXT: strh w17, [sp, #76] 791; NONEON-NOSVE-NEXT: strh w12, [sp, #74] 792; NONEON-NOSVE-NEXT: strh w16, [sp, #72] 793; NONEON-NOSVE-NEXT: strh w14, [sp, #70] 794; NONEON-NOSVE-NEXT: strh w9, [sp, #68] 795; NONEON-NOSVE-NEXT: strh w8, [sp, #64] 796; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 797; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 798; NONEON-NOSVE-NEXT: add sp, sp, #112 799; NONEON-NOSVE-NEXT: ret 800 %op1 = load <16 x i16>, ptr %a 801 %op2 = load <16 x i16>, ptr %b 802 %mask = icmp eq <16 x i16> %op1, %op2 803 %sel = select <16 x i1> %mask, <16 x i16> %op1, <16 x i16> %op2 804 store <16 x i16> %sel, ptr %a 805 ret void 806} 807 808define <2 x i32> @select_v2i32(<2 x i32> %op1, <2 x i32> %op2, <2 x i1> %mask) { 809; CHECK-LABEL: select_v2i32: 810; CHECK: // %bb.0: 811; CHECK-NEXT: // kill: def $d2 killed $d2 def $z2 812; CHECK-NEXT: ptrue p0.s 813; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 814; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 815; CHECK-NEXT: lsl z2.s, z2.s, #31 816; CHECK-NEXT: asr z2.s, z2.s, #31 817; CHECK-NEXT: and z2.s, z2.s, #0x1 818; CHECK-NEXT: cmpne p0.s, p0/z, z2.s, #0 819; CHECK-NEXT: sel z0.s, p0, z0.s, z1.s 820; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 821; CHECK-NEXT: ret 822; 823; NONEON-NOSVE-LABEL: select_v2i32: 824; NONEON-NOSVE: // %bb.0: 825; NONEON-NOSVE-NEXT: sub sp, sp, #32 826; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 827; NONEON-NOSVE-NEXT: stp d1, d2, [sp, #8] 828; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #16] 829; NONEON-NOSVE-NEXT: str d0, [sp] 830; NONEON-NOSVE-NEXT: ldr w10, [sp, #12] 831; NONEON-NOSVE-NEXT: ldr w11, [sp, #4] 832; NONEON-NOSVE-NEXT: sbfx w8, w8, #0, #1 833; NONEON-NOSVE-NEXT: sbfx w9, w9, #0, #1 834; NONEON-NOSVE-NEXT: cmp w8, #0 835; NONEON-NOSVE-NEXT: csel w8, w11, w10, ne 836; NONEON-NOSVE-NEXT: ldr w10, [sp] 837; NONEON-NOSVE-NEXT: cmp w9, #0 838; NONEON-NOSVE-NEXT: str w8, [sp, #28] 839; NONEON-NOSVE-NEXT: ldr w8, [sp, #8] 840; NONEON-NOSVE-NEXT: csel w8, w10, w8, ne 841; NONEON-NOSVE-NEXT: str w8, [sp, #24] 842; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 843; NONEON-NOSVE-NEXT: add sp, sp, #32 844; NONEON-NOSVE-NEXT: ret 845 %sel = select <2 x i1> %mask, <2 x i32> %op1, <2 x i32> %op2 846 ret <2 x i32> %sel 847} 848 849define <4 x i32> @select_v4i32(<4 x i32> %op1, <4 x i32> %op2, <4 x i1> %mask) { 850; CHECK-LABEL: select_v4i32: 851; CHECK: // %bb.0: 852; CHECK-NEXT: // kill: def $d2 killed $d2 def $z2 853; CHECK-NEXT: ptrue p0.s 854; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 855; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 856; CHECK-NEXT: uunpklo z2.s, z2.h 857; CHECK-NEXT: lsl z2.s, z2.s, #31 858; CHECK-NEXT: asr z2.s, z2.s, #31 859; CHECK-NEXT: and z2.s, z2.s, #0x1 860; CHECK-NEXT: cmpne p0.s, p0/z, z2.s, #0 861; CHECK-NEXT: sel z0.s, p0, z0.s, z1.s 862; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 863; CHECK-NEXT: ret 864; 865; NONEON-NOSVE-LABEL: select_v4i32: 866; NONEON-NOSVE: // %bb.0: 867; NONEON-NOSVE-NEXT: sub sp, sp, #64 868; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 869; NONEON-NOSVE-NEXT: str d2, [sp, #40] 870; NONEON-NOSVE-NEXT: ldrh w9, [sp, #46] 871; NONEON-NOSVE-NEXT: stp q0, q1, [sp] 872; NONEON-NOSVE-NEXT: ldrh w11, [sp, #44] 873; NONEON-NOSVE-NEXT: ldr w12, [sp, #28] 874; NONEON-NOSVE-NEXT: ldr w13, [sp, #12] 875; NONEON-NOSVE-NEXT: ldrh w10, [sp, #42] 876; NONEON-NOSVE-NEXT: sbfx w9, w9, #0, #1 877; NONEON-NOSVE-NEXT: sbfx w11, w11, #0, #1 878; NONEON-NOSVE-NEXT: ldrh w8, [sp, #40] 879; NONEON-NOSVE-NEXT: sbfx w10, w10, #0, #1 880; NONEON-NOSVE-NEXT: cmp w9, #0 881; NONEON-NOSVE-NEXT: sbfx w8, w8, #0, #1 882; NONEON-NOSVE-NEXT: csel w9, w13, w12, ne 883; NONEON-NOSVE-NEXT: ldr w12, [sp, #8] 884; NONEON-NOSVE-NEXT: cmp w11, #0 885; NONEON-NOSVE-NEXT: str w9, [sp, #60] 886; NONEON-NOSVE-NEXT: ldr w9, [sp, #24] 887; NONEON-NOSVE-NEXT: ldr w11, [sp, #4] 888; NONEON-NOSVE-NEXT: csel w9, w12, w9, ne 889; NONEON-NOSVE-NEXT: cmp w10, #0 890; NONEON-NOSVE-NEXT: ldr w10, [sp] 891; NONEON-NOSVE-NEXT: str w9, [sp, #56] 892; NONEON-NOSVE-NEXT: ldr w9, [sp, #20] 893; NONEON-NOSVE-NEXT: csel w9, w11, w9, ne 894; NONEON-NOSVE-NEXT: cmp w8, #0 895; NONEON-NOSVE-NEXT: str w9, [sp, #52] 896; NONEON-NOSVE-NEXT: ldr w9, [sp, #16] 897; NONEON-NOSVE-NEXT: csel w8, w10, w9, ne 898; NONEON-NOSVE-NEXT: str w8, [sp, #48] 899; NONEON-NOSVE-NEXT: ldr q0, [sp, #48] 900; NONEON-NOSVE-NEXT: add sp, sp, #64 901; NONEON-NOSVE-NEXT: ret 902 %sel = select <4 x i1> %mask, <4 x i32> %op1, <4 x i32> %op2 903 ret <4 x i32> %sel 904} 905 906define void @select_v8i32(ptr %a, ptr %b) { 907; CHECK-LABEL: select_v8i32: 908; CHECK: // %bb.0: 909; CHECK-NEXT: ldp q0, q2, [x0] 910; CHECK-NEXT: ptrue p0.s, vl4 911; CHECK-NEXT: ldp q1, q3, [x1] 912; CHECK-NEXT: cmpeq p1.s, p0/z, z0.s, z1.s 913; CHECK-NEXT: cmpeq p0.s, p0/z, z2.s, z3.s 914; CHECK-NEXT: sel z0.s, p1, z0.s, z1.s 915; CHECK-NEXT: sel z1.s, p0, z2.s, z3.s 916; CHECK-NEXT: stp q0, q1, [x0] 917; CHECK-NEXT: ret 918; 919; NONEON-NOSVE-LABEL: select_v8i32: 920; NONEON-NOSVE: // %bb.0: 921; NONEON-NOSVE-NEXT: ldp q0, q3, [x1] 922; NONEON-NOSVE-NEXT: ldp q1, q2, [x0] 923; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-96]! 924; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 925; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #16] 926; NONEON-NOSVE-NEXT: ldp w10, w13, [sp, #4] 927; NONEON-NOSVE-NEXT: ldp w12, w11, [sp, #24] 928; NONEON-NOSVE-NEXT: stp q2, q3, [sp, #32] 929; NONEON-NOSVE-NEXT: ldr w14, [sp, #12] 930; NONEON-NOSVE-NEXT: cmp w10, w9 931; NONEON-NOSVE-NEXT: csel w9, w10, w9, eq 932; NONEON-NOSVE-NEXT: cmp w13, w12 933; NONEON-NOSVE-NEXT: ldp w15, w16, [sp, #48] 934; NONEON-NOSVE-NEXT: csel w12, w13, w12, eq 935; NONEON-NOSVE-NEXT: cmp w14, w11 936; NONEON-NOSVE-NEXT: ldp w10, w13, [sp, #32] 937; NONEON-NOSVE-NEXT: csel w11, w14, w11, eq 938; NONEON-NOSVE-NEXT: ldp w17, w14, [sp, #56] 939; NONEON-NOSVE-NEXT: ldp w18, w1, [sp, #40] 940; NONEON-NOSVE-NEXT: cmp w10, w15 941; NONEON-NOSVE-NEXT: stp w12, w11, [sp, #72] 942; NONEON-NOSVE-NEXT: csel w10, w10, w15, eq 943; NONEON-NOSVE-NEXT: cmp w13, w16 944; NONEON-NOSVE-NEXT: ldr w15, [sp] 945; NONEON-NOSVE-NEXT: csel w13, w13, w16, eq 946; NONEON-NOSVE-NEXT: cmp w18, w17 947; NONEON-NOSVE-NEXT: csel w16, w18, w17, eq 948; NONEON-NOSVE-NEXT: cmp w1, w14 949; NONEON-NOSVE-NEXT: stp w10, w13, [sp, #80] 950; NONEON-NOSVE-NEXT: csel w10, w1, w14, eq 951; NONEON-NOSVE-NEXT: cmp w15, w8 952; NONEON-NOSVE-NEXT: csel w8, w15, w8, eq 953; NONEON-NOSVE-NEXT: stp w16, w10, [sp, #88] 954; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #64] 955; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 956; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 957; NONEON-NOSVE-NEXT: add sp, sp, #96 958; NONEON-NOSVE-NEXT: ret 959 %op1 = load <8 x i32>, ptr %a 960 %op2 = load <8 x i32>, ptr %b 961 %mask = icmp eq <8 x i32> %op1, %op2 962 %sel = select <8 x i1> %mask, <8 x i32> %op1, <8 x i32> %op2 963 store <8 x i32> %sel, ptr %a 964 ret void 965} 966 967define <1 x i64> @select_v1i64(<1 x i64> %op1, <1 x i64> %op2, <1 x i1> %mask) { 968; CHECK-LABEL: select_v1i64: 969; CHECK: // %bb.0: 970; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0 971; CHECK-NEXT: and x8, x0, #0x1 972; CHECK-NEXT: ptrue p0.d 973; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 974; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 975; CHECK-NEXT: mov z2.d, x8 976; CHECK-NEXT: cmpne p0.d, p0/z, z2.d, #0 977; CHECK-NEXT: sel z0.d, p0, z0.d, z1.d 978; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 979; CHECK-NEXT: ret 980; 981; NONEON-NOSVE-LABEL: select_v1i64: 982; NONEON-NOSVE: // %bb.0: 983; NONEON-NOSVE-NEXT: sub sp, sp, #16 984; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 985; NONEON-NOSVE-NEXT: fmov x8, d1 986; NONEON-NOSVE-NEXT: fmov x9, d0 987; NONEON-NOSVE-NEXT: tst w0, #0x1 988; NONEON-NOSVE-NEXT: csel x8, x9, x8, ne 989; NONEON-NOSVE-NEXT: str x8, [sp, #8] 990; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 991; NONEON-NOSVE-NEXT: add sp, sp, #16 992; NONEON-NOSVE-NEXT: ret 993 %sel = select <1 x i1> %mask, <1 x i64> %op1, <1 x i64> %op2 994 ret <1 x i64> %sel 995} 996 997define <2 x i64> @select_v2i64(<2 x i64> %op1, <2 x i64> %op2, <2 x i1> %mask) { 998; CHECK-LABEL: select_v2i64: 999; CHECK: // %bb.0: 1000; CHECK-NEXT: // kill: def $d2 killed $d2 def $z2 1001; CHECK-NEXT: ptrue p0.d 1002; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1003; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 1004; CHECK-NEXT: uunpklo z2.d, z2.s 1005; CHECK-NEXT: lsl z2.d, z2.d, #63 1006; CHECK-NEXT: asr z2.d, z2.d, #63 1007; CHECK-NEXT: and z2.d, z2.d, #0x1 1008; CHECK-NEXT: cmpne p0.d, p0/z, z2.d, #0 1009; CHECK-NEXT: sel z0.d, p0, z0.d, z1.d 1010; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1011; CHECK-NEXT: ret 1012; 1013; NONEON-NOSVE-LABEL: select_v2i64: 1014; NONEON-NOSVE: // %bb.0: 1015; NONEON-NOSVE-NEXT: sub sp, sp, #64 1016; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 1017; NONEON-NOSVE-NEXT: str d2, [sp, #40] 1018; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #40] 1019; NONEON-NOSVE-NEXT: stp q0, q1, [sp] 1020; NONEON-NOSVE-NEXT: ldr x10, [sp, #24] 1021; NONEON-NOSVE-NEXT: ldr x11, [sp, #8] 1022; NONEON-NOSVE-NEXT: sbfx x8, x8, #0, #1 1023; NONEON-NOSVE-NEXT: sbfx x9, x9, #0, #1 1024; NONEON-NOSVE-NEXT: cmp x8, #0 1025; NONEON-NOSVE-NEXT: csel x8, x11, x10, ne 1026; NONEON-NOSVE-NEXT: ldr x10, [sp] 1027; NONEON-NOSVE-NEXT: cmp x9, #0 1028; NONEON-NOSVE-NEXT: str x8, [sp, #56] 1029; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 1030; NONEON-NOSVE-NEXT: csel x8, x10, x8, ne 1031; NONEON-NOSVE-NEXT: str x8, [sp, #48] 1032; NONEON-NOSVE-NEXT: ldr q0, [sp, #48] 1033; NONEON-NOSVE-NEXT: add sp, sp, #64 1034; NONEON-NOSVE-NEXT: ret 1035 %sel = select <2 x i1> %mask, <2 x i64> %op1, <2 x i64> %op2 1036 ret <2 x i64> %sel 1037} 1038 1039define void @select_v4i64(ptr %a, ptr %b) { 1040; CHECK-LABEL: select_v4i64: 1041; CHECK: // %bb.0: 1042; CHECK-NEXT: ldp q0, q2, [x0] 1043; CHECK-NEXT: ptrue p0.d, vl2 1044; CHECK-NEXT: ldp q1, q3, [x1] 1045; CHECK-NEXT: cmpeq p1.d, p0/z, z0.d, z1.d 1046; CHECK-NEXT: cmpeq p0.d, p0/z, z2.d, z3.d 1047; CHECK-NEXT: sel z0.d, p1, z0.d, z1.d 1048; CHECK-NEXT: sel z1.d, p0, z2.d, z3.d 1049; CHECK-NEXT: stp q0, q1, [x0] 1050; CHECK-NEXT: ret 1051; 1052; NONEON-NOSVE-LABEL: select_v4i64: 1053; NONEON-NOSVE: // %bb.0: 1054; NONEON-NOSVE-NEXT: ldp q0, q3, [x1] 1055; NONEON-NOSVE-NEXT: ldp q1, q2, [x0] 1056; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-96]! 1057; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 1058; NONEON-NOSVE-NEXT: stp q2, q3, [sp, #32] 1059; NONEON-NOSVE-NEXT: ldr x9, [sp, #8] 1060; NONEON-NOSVE-NEXT: ldp x8, x11, [sp, #24] 1061; NONEON-NOSVE-NEXT: ldr x13, [sp, #40] 1062; NONEON-NOSVE-NEXT: ldp x10, x12, [sp, #48] 1063; NONEON-NOSVE-NEXT: cmp x9, x8 1064; NONEON-NOSVE-NEXT: csel x8, x9, x8, eq 1065; NONEON-NOSVE-NEXT: cmp x11, x10 1066; NONEON-NOSVE-NEXT: csel x9, x11, x10, eq 1067; NONEON-NOSVE-NEXT: ldr x10, [sp, #16] 1068; NONEON-NOSVE-NEXT: ldr x11, [sp] 1069; NONEON-NOSVE-NEXT: cmp x13, x12 1070; NONEON-NOSVE-NEXT: csel x12, x13, x12, eq 1071; NONEON-NOSVE-NEXT: cmp x11, x10 1072; NONEON-NOSVE-NEXT: stp x9, x12, [sp, #80] 1073; NONEON-NOSVE-NEXT: csel x9, x11, x10, eq 1074; NONEON-NOSVE-NEXT: stp x9, x8, [sp, #64] 1075; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 1076; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1077; NONEON-NOSVE-NEXT: add sp, sp, #96 1078; NONEON-NOSVE-NEXT: ret 1079 %op1 = load <4 x i64>, ptr %a 1080 %op2 = load <4 x i64>, ptr %b 1081 %mask = icmp eq <4 x i64> %op1, %op2 1082 %sel = select <4 x i1> %mask, <4 x i64> %op1, <4 x i64> %op2 1083 store <4 x i64> %sel, ptr %a 1084 ret void 1085} 1086