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 6 7target triple = "aarch64-unknown-linux-gnu" 8 9; 10; ANDV 11; 12 13define i8 @andv_v4i8(<4 x i8> %a) { 14; CHECK-LABEL: andv_v4i8: 15; CHECK: // %bb.0: 16; CHECK-NEXT: ptrue p0.h, vl4 17; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 18; CHECK-NEXT: andv h0, p0, z0.h 19; CHECK-NEXT: fmov w0, s0 20; CHECK-NEXT: ret 21; 22; NONEON-NOSVE-LABEL: andv_v4i8: 23; NONEON-NOSVE: // %bb.0: 24; NONEON-NOSVE-NEXT: sub sp, sp, #16 25; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 26; NONEON-NOSVE-NEXT: str d0, [sp, #8] 27; NONEON-NOSVE-NEXT: ldrh w8, [sp, #14] 28; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 29; NONEON-NOSVE-NEXT: ldrh w10, [sp, #10] 30; NONEON-NOSVE-NEXT: ldrh w11, [sp, #8] 31; NONEON-NOSVE-NEXT: and w8, w9, w8 32; NONEON-NOSVE-NEXT: and w10, w11, w10 33; NONEON-NOSVE-NEXT: and w0, w10, w8 34; NONEON-NOSVE-NEXT: add sp, sp, #16 35; NONEON-NOSVE-NEXT: ret 36 %res = call i8 @llvm.vector.reduce.and.v4i8(<4 x i8> %a) 37 ret i8 %res 38} 39 40define i8 @andv_v8i8(<8 x i8> %a) { 41; CHECK-LABEL: andv_v8i8: 42; CHECK: // %bb.0: 43; CHECK-NEXT: ptrue p0.b, vl8 44; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 45; CHECK-NEXT: andv b0, p0, z0.b 46; CHECK-NEXT: fmov w0, s0 47; CHECK-NEXT: ret 48; 49; NONEON-NOSVE-LABEL: andv_v8i8: 50; NONEON-NOSVE: // %bb.0: 51; NONEON-NOSVE-NEXT: sub sp, sp, #16 52; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 53; NONEON-NOSVE-NEXT: str d0, [sp, #8] 54; NONEON-NOSVE-NEXT: ldrb w8, [sp, #13] 55; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 56; NONEON-NOSVE-NEXT: ldrb w10, [sp, #11] 57; NONEON-NOSVE-NEXT: ldrb w11, [sp, #10] 58; NONEON-NOSVE-NEXT: ldrb w12, [sp, #9] 59; NONEON-NOSVE-NEXT: ldrb w13, [sp, #8] 60; NONEON-NOSVE-NEXT: ldrb w14, [sp, #14] 61; NONEON-NOSVE-NEXT: and w8, w9, w8 62; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 63; NONEON-NOSVE-NEXT: and w12, w13, w12 64; NONEON-NOSVE-NEXT: and w10, w11, w10 65; NONEON-NOSVE-NEXT: and w10, w12, w10 66; NONEON-NOSVE-NEXT: and w8, w8, w14 67; NONEON-NOSVE-NEXT: and w8, w10, w8 68; NONEON-NOSVE-NEXT: and w0, w8, w9 69; NONEON-NOSVE-NEXT: add sp, sp, #16 70; NONEON-NOSVE-NEXT: ret 71 %res = call i8 @llvm.vector.reduce.and.v8i8(<8 x i8> %a) 72 ret i8 %res 73} 74 75define i8 @andv_v16i8(<16 x i8> %a) { 76; CHECK-LABEL: andv_v16i8: 77; CHECK: // %bb.0: 78; CHECK-NEXT: ptrue p0.b, vl16 79; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 80; CHECK-NEXT: andv b0, p0, z0.b 81; CHECK-NEXT: fmov w0, s0 82; CHECK-NEXT: ret 83; 84; NONEON-NOSVE-LABEL: andv_v16i8: 85; NONEON-NOSVE: // %bb.0: 86; NONEON-NOSVE-NEXT: str q0, [sp, #-16]! 87; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 88; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5] 89; NONEON-NOSVE-NEXT: ldrb w10, [sp, #1] 90; NONEON-NOSVE-NEXT: ldrb w11, [sp] 91; NONEON-NOSVE-NEXT: ldrb w12, [sp, #4] 92; NONEON-NOSVE-NEXT: ldrb w13, [sp, #3] 93; NONEON-NOSVE-NEXT: ldrb w14, [sp, #2] 94; NONEON-NOSVE-NEXT: and w10, w11, w10 95; NONEON-NOSVE-NEXT: ldrb w8, [sp, #12] 96; NONEON-NOSVE-NEXT: ldrb w15, [sp, #8] 97; NONEON-NOSVE-NEXT: and w11, w14, w13 98; NONEON-NOSVE-NEXT: and w9, w12, w9 99; NONEON-NOSVE-NEXT: ldrb w16, [sp, #6] 100; NONEON-NOSVE-NEXT: ldrb w12, [sp, #7] 101; NONEON-NOSVE-NEXT: and w10, w10, w11 102; NONEON-NOSVE-NEXT: ldrb w13, [sp, #11] 103; NONEON-NOSVE-NEXT: ldrb w11, [sp, #13] 104; NONEON-NOSVE-NEXT: and w9, w9, w16 105; NONEON-NOSVE-NEXT: ldrb w14, [sp, #9] 106; NONEON-NOSVE-NEXT: and w12, w12, w15 107; NONEON-NOSVE-NEXT: ldrb w15, [sp, #14] 108; NONEON-NOSVE-NEXT: and w8, w13, w8 109; NONEON-NOSVE-NEXT: ldrb w16, [sp, #10] 110; NONEON-NOSVE-NEXT: ldrb w13, [sp, #15] 111; NONEON-NOSVE-NEXT: and w12, w12, w14 112; NONEON-NOSVE-NEXT: and w8, w8, w11 113; NONEON-NOSVE-NEXT: and w9, w10, w9 114; NONEON-NOSVE-NEXT: and w10, w12, w16 115; NONEON-NOSVE-NEXT: and w8, w8, w15 116; NONEON-NOSVE-NEXT: and w9, w9, w10 117; NONEON-NOSVE-NEXT: and w8, w8, w13 118; NONEON-NOSVE-NEXT: and w0, w9, w8 119; NONEON-NOSVE-NEXT: add sp, sp, #16 120; NONEON-NOSVE-NEXT: ret 121 %res = call i8 @llvm.vector.reduce.and.v16i8(<16 x i8> %a) 122 ret i8 %res 123} 124 125define i8 @andv_v32i8(ptr %a) { 126; CHECK-LABEL: andv_v32i8: 127; CHECK: // %bb.0: 128; CHECK-NEXT: ldp q1, q0, [x0] 129; CHECK-NEXT: ptrue p0.b, vl16 130; CHECK-NEXT: and z0.d, z1.d, z0.d 131; CHECK-NEXT: andv b0, p0, z0.b 132; CHECK-NEXT: fmov w0, s0 133; CHECK-NEXT: ret 134; 135; NONEON-NOSVE-LABEL: andv_v32i8: 136; NONEON-NOSVE: // %bb.0: 137; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 138; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-32]! 139; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 140; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 141; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1] 142; NONEON-NOSVE-NEXT: ldrb w10, [sp, #16] 143; NONEON-NOSVE-NEXT: ldrb w11, [sp] 144; NONEON-NOSVE-NEXT: ldrb w12, [sp, #18] 145; NONEON-NOSVE-NEXT: ldrb w13, [sp, #2] 146; NONEON-NOSVE-NEXT: and w8, w9, w8 147; NONEON-NOSVE-NEXT: ldrb w14, [sp, #19] 148; NONEON-NOSVE-NEXT: ldrb w15, [sp, #3] 149; NONEON-NOSVE-NEXT: and w9, w11, w10 150; NONEON-NOSVE-NEXT: and w10, w13, w12 151; NONEON-NOSVE-NEXT: ldrb w12, [sp, #21] 152; NONEON-NOSVE-NEXT: ldrb w13, [sp, #5] 153; NONEON-NOSVE-NEXT: and w11, w15, w14 154; NONEON-NOSVE-NEXT: and w8, w9, w8 155; NONEON-NOSVE-NEXT: ldrb w16, [sp, #20] 156; NONEON-NOSVE-NEXT: ldrb w17, [sp, #4] 157; NONEON-NOSVE-NEXT: and w9, w10, w11 158; NONEON-NOSVE-NEXT: and w10, w13, w12 159; NONEON-NOSVE-NEXT: ldrb w11, [sp, #22] 160; NONEON-NOSVE-NEXT: ldrb w12, [sp, #6] 161; NONEON-NOSVE-NEXT: and w14, w17, w16 162; NONEON-NOSVE-NEXT: ldrb w13, [sp, #23] 163; NONEON-NOSVE-NEXT: ldrb w15, [sp, #8] 164; NONEON-NOSVE-NEXT: and w10, w14, w10 165; NONEON-NOSVE-NEXT: ldrb w14, [sp, #7] 166; NONEON-NOSVE-NEXT: and w11, w12, w11 167; NONEON-NOSVE-NEXT: ldrb w12, [sp, #24] 168; NONEON-NOSVE-NEXT: and w8, w8, w9 169; NONEON-NOSVE-NEXT: and w9, w10, w11 170; NONEON-NOSVE-NEXT: and w10, w14, w13 171; NONEON-NOSVE-NEXT: ldrb w13, [sp, #9] 172; NONEON-NOSVE-NEXT: and w8, w8, w9 173; NONEON-NOSVE-NEXT: and w11, w15, w12 174; NONEON-NOSVE-NEXT: ldrb w12, [sp, #25] 175; NONEON-NOSVE-NEXT: ldrb w14, [sp, #26] 176; NONEON-NOSVE-NEXT: and w9, w10, w11 177; NONEON-NOSVE-NEXT: ldrb w11, [sp, #27] 178; NONEON-NOSVE-NEXT: ldrb w15, [sp, #10] 179; NONEON-NOSVE-NEXT: and w10, w13, w12 180; NONEON-NOSVE-NEXT: ldrb w12, [sp, #11] 181; NONEON-NOSVE-NEXT: ldrb w13, [sp, #12] 182; NONEON-NOSVE-NEXT: and w9, w9, w10 183; NONEON-NOSVE-NEXT: ldrb w10, [sp, #28] 184; NONEON-NOSVE-NEXT: ldrb w16, [sp, #14] 185; NONEON-NOSVE-NEXT: and w11, w12, w11 186; NONEON-NOSVE-NEXT: ldrb w12, [sp, #29] 187; NONEON-NOSVE-NEXT: ldrb w17, [sp, #15] 188; NONEON-NOSVE-NEXT: and w10, w13, w10 189; NONEON-NOSVE-NEXT: ldrb w13, [sp, #13] 190; NONEON-NOSVE-NEXT: and w14, w15, w14 191; NONEON-NOSVE-NEXT: and w10, w11, w10 192; NONEON-NOSVE-NEXT: ldrb w11, [sp, #30] 193; NONEON-NOSVE-NEXT: and w9, w9, w14 194; NONEON-NOSVE-NEXT: and w12, w13, w12 195; NONEON-NOSVE-NEXT: ldrb w13, [sp, #31] 196; NONEON-NOSVE-NEXT: and w8, w8, w9 197; NONEON-NOSVE-NEXT: and w10, w10, w12 198; NONEON-NOSVE-NEXT: and w11, w16, w11 199; NONEON-NOSVE-NEXT: and w10, w10, w11 200; NONEON-NOSVE-NEXT: and w11, w17, w13 201; NONEON-NOSVE-NEXT: and w9, w10, w11 202; NONEON-NOSVE-NEXT: and w0, w8, w9 203; NONEON-NOSVE-NEXT: add sp, sp, #32 204; NONEON-NOSVE-NEXT: ret 205 %op = load <32 x i8>, ptr %a 206 %res = call i8 @llvm.vector.reduce.and.v32i8(<32 x i8> %op) 207 ret i8 %res 208} 209 210define i16 @andv_v2i16(<2 x i16> %a) { 211; CHECK-LABEL: andv_v2i16: 212; CHECK: // %bb.0: 213; CHECK-NEXT: ptrue p0.s, vl2 214; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 215; CHECK-NEXT: andv s0, p0, z0.s 216; CHECK-NEXT: fmov w0, s0 217; CHECK-NEXT: ret 218; 219; NONEON-NOSVE-LABEL: andv_v2i16: 220; NONEON-NOSVE: // %bb.0: 221; NONEON-NOSVE-NEXT: sub sp, sp, #16 222; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 223; NONEON-NOSVE-NEXT: str d0, [sp, #8] 224; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #8] 225; NONEON-NOSVE-NEXT: and w0, w9, w8 226; NONEON-NOSVE-NEXT: add sp, sp, #16 227; NONEON-NOSVE-NEXT: ret 228 %res = call i16 @llvm.vector.reduce.and.v2i16(<2 x i16> %a) 229 ret i16 %res 230} 231 232define i16 @andv_v4i16(<4 x i16> %a) { 233; CHECK-LABEL: andv_v4i16: 234; CHECK: // %bb.0: 235; CHECK-NEXT: ptrue p0.h, vl4 236; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 237; CHECK-NEXT: andv h0, p0, z0.h 238; CHECK-NEXT: fmov w0, s0 239; CHECK-NEXT: ret 240; 241; NONEON-NOSVE-LABEL: andv_v4i16: 242; NONEON-NOSVE: // %bb.0: 243; NONEON-NOSVE-NEXT: sub sp, sp, #16 244; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 245; NONEON-NOSVE-NEXT: str d0, [sp, #8] 246; NONEON-NOSVE-NEXT: ldrh w8, [sp, #14] 247; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 248; NONEON-NOSVE-NEXT: ldrh w10, [sp, #10] 249; NONEON-NOSVE-NEXT: ldrh w11, [sp, #8] 250; NONEON-NOSVE-NEXT: and w8, w9, w8 251; NONEON-NOSVE-NEXT: and w10, w11, w10 252; NONEON-NOSVE-NEXT: and w0, w10, w8 253; NONEON-NOSVE-NEXT: add sp, sp, #16 254; NONEON-NOSVE-NEXT: ret 255 %res = call i16 @llvm.vector.reduce.and.v4i16(<4 x i16> %a) 256 ret i16 %res 257} 258 259define i16 @andv_v8i16(<8 x i16> %a) { 260; CHECK-LABEL: andv_v8i16: 261; CHECK: // %bb.0: 262; CHECK-NEXT: ptrue p0.h, vl8 263; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 264; CHECK-NEXT: andv h0, p0, z0.h 265; CHECK-NEXT: fmov w0, s0 266; CHECK-NEXT: ret 267; 268; NONEON-NOSVE-LABEL: andv_v8i16: 269; NONEON-NOSVE: // %bb.0: 270; NONEON-NOSVE-NEXT: str q0, [sp, #-16]! 271; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 272; NONEON-NOSVE-NEXT: ldrh w8, [sp, #10] 273; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 274; NONEON-NOSVE-NEXT: ldrh w10, [sp, #6] 275; NONEON-NOSVE-NEXT: ldrh w11, [sp, #4] 276; NONEON-NOSVE-NEXT: ldrh w12, [sp, #2] 277; NONEON-NOSVE-NEXT: ldrh w13, [sp] 278; NONEON-NOSVE-NEXT: and w8, w9, w8 279; NONEON-NOSVE-NEXT: ldrh w14, [sp, #12] 280; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 281; NONEON-NOSVE-NEXT: and w12, w13, w12 282; NONEON-NOSVE-NEXT: and w10, w11, w10 283; NONEON-NOSVE-NEXT: and w10, w12, w10 284; NONEON-NOSVE-NEXT: and w8, w8, w14 285; NONEON-NOSVE-NEXT: and w8, w10, w8 286; NONEON-NOSVE-NEXT: and w0, w8, w9 287; NONEON-NOSVE-NEXT: add sp, sp, #16 288; NONEON-NOSVE-NEXT: ret 289 %res = call i16 @llvm.vector.reduce.and.v8i16(<8 x i16> %a) 290 ret i16 %res 291} 292 293define i16 @andv_v16i16(ptr %a) { 294; CHECK-LABEL: andv_v16i16: 295; CHECK: // %bb.0: 296; CHECK-NEXT: ldp q1, q0, [x0] 297; CHECK-NEXT: ptrue p0.h, vl8 298; CHECK-NEXT: and z0.d, z1.d, z0.d 299; CHECK-NEXT: andv h0, p0, z0.h 300; CHECK-NEXT: fmov w0, s0 301; CHECK-NEXT: ret 302; 303; NONEON-NOSVE-LABEL: andv_v16i16: 304; NONEON-NOSVE: // %bb.0: 305; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 306; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-32]! 307; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 308; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 309; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2] 310; NONEON-NOSVE-NEXT: ldrh w10, [sp, #16] 311; NONEON-NOSVE-NEXT: ldrh w11, [sp] 312; NONEON-NOSVE-NEXT: ldrh w12, [sp, #20] 313; NONEON-NOSVE-NEXT: ldrh w13, [sp, #4] 314; NONEON-NOSVE-NEXT: and w8, w9, w8 315; NONEON-NOSVE-NEXT: ldrh w14, [sp, #22] 316; NONEON-NOSVE-NEXT: ldrh w15, [sp, #6] 317; NONEON-NOSVE-NEXT: and w9, w11, w10 318; NONEON-NOSVE-NEXT: and w12, w13, w12 319; NONEON-NOSVE-NEXT: ldrh w10, [sp, #26] 320; NONEON-NOSVE-NEXT: ldrh w11, [sp, #10] 321; NONEON-NOSVE-NEXT: and w13, w15, w14 322; NONEON-NOSVE-NEXT: and w8, w9, w8 323; NONEON-NOSVE-NEXT: ldrh w16, [sp, #24] 324; NONEON-NOSVE-NEXT: ldrh w17, [sp, #8] 325; NONEON-NOSVE-NEXT: and w9, w12, w13 326; NONEON-NOSVE-NEXT: and w10, w11, w10 327; NONEON-NOSVE-NEXT: ldrh w11, [sp, #28] 328; NONEON-NOSVE-NEXT: ldrh w15, [sp, #12] 329; NONEON-NOSVE-NEXT: and w14, w17, w16 330; NONEON-NOSVE-NEXT: ldrh w12, [sp, #30] 331; NONEON-NOSVE-NEXT: ldrh w13, [sp, #14] 332; NONEON-NOSVE-NEXT: and w10, w14, w10 333; NONEON-NOSVE-NEXT: and w11, w15, w11 334; NONEON-NOSVE-NEXT: and w8, w8, w9 335; NONEON-NOSVE-NEXT: and w9, w10, w11 336; NONEON-NOSVE-NEXT: and w8, w8, w9 337; NONEON-NOSVE-NEXT: and w9, w13, w12 338; NONEON-NOSVE-NEXT: and w0, w8, w9 339; NONEON-NOSVE-NEXT: add sp, sp, #32 340; NONEON-NOSVE-NEXT: ret 341 %op = load <16 x i16>, ptr %a 342 %res = call i16 @llvm.vector.reduce.and.v16i16(<16 x i16> %op) 343 ret i16 %res 344} 345 346define i32 @andv_v2i32(<2 x i32> %a) { 347; CHECK-LABEL: andv_v2i32: 348; CHECK: // %bb.0: 349; CHECK-NEXT: ptrue p0.s, vl2 350; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 351; CHECK-NEXT: andv s0, p0, z0.s 352; CHECK-NEXT: fmov w0, s0 353; CHECK-NEXT: ret 354; 355; NONEON-NOSVE-LABEL: andv_v2i32: 356; NONEON-NOSVE: // %bb.0: 357; NONEON-NOSVE-NEXT: sub sp, sp, #16 358; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 359; NONEON-NOSVE-NEXT: str d0, [sp, #8] 360; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #8] 361; NONEON-NOSVE-NEXT: and w0, w9, w8 362; NONEON-NOSVE-NEXT: add sp, sp, #16 363; NONEON-NOSVE-NEXT: ret 364 %res = call i32 @llvm.vector.reduce.and.v2i32(<2 x i32> %a) 365 ret i32 %res 366} 367 368define i32 @andv_v4i32(<4 x i32> %a) { 369; CHECK-LABEL: andv_v4i32: 370; CHECK: // %bb.0: 371; CHECK-NEXT: ptrue p0.s, vl4 372; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 373; CHECK-NEXT: andv s0, p0, z0.s 374; CHECK-NEXT: fmov w0, s0 375; CHECK-NEXT: ret 376; 377; NONEON-NOSVE-LABEL: andv_v4i32: 378; NONEON-NOSVE: // %bb.0: 379; NONEON-NOSVE-NEXT: str q0, [sp, #-16]! 380; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 381; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #8] 382; NONEON-NOSVE-NEXT: ldp w11, w10, [sp], #16 383; NONEON-NOSVE-NEXT: and w10, w11, w10 384; NONEON-NOSVE-NEXT: and w8, w9, w8 385; NONEON-NOSVE-NEXT: and w0, w10, w8 386; NONEON-NOSVE-NEXT: ret 387 %res = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> %a) 388 ret i32 %res 389} 390 391define i32 @andv_v8i32(ptr %a) { 392; CHECK-LABEL: andv_v8i32: 393; CHECK: // %bb.0: 394; CHECK-NEXT: ldp q1, q0, [x0] 395; CHECK-NEXT: ptrue p0.s, vl4 396; CHECK-NEXT: and z0.d, z1.d, z0.d 397; CHECK-NEXT: andv s0, p0, z0.s 398; CHECK-NEXT: fmov w0, s0 399; CHECK-NEXT: ret 400; 401; NONEON-NOSVE-LABEL: andv_v8i32: 402; NONEON-NOSVE: // %bb.0: 403; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 404; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-32]! 405; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 406; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #16] 407; NONEON-NOSVE-NEXT: ldp w11, w10, [sp] 408; NONEON-NOSVE-NEXT: ldp w12, w13, [sp, #24] 409; NONEON-NOSVE-NEXT: ldp w14, w15, [sp, #8] 410; NONEON-NOSVE-NEXT: and w8, w10, w8 411; NONEON-NOSVE-NEXT: and w9, w11, w9 412; NONEON-NOSVE-NEXT: and w8, w9, w8 413; NONEON-NOSVE-NEXT: and w10, w14, w12 414; NONEON-NOSVE-NEXT: and w11, w15, w13 415; NONEON-NOSVE-NEXT: and w9, w10, w11 416; NONEON-NOSVE-NEXT: and w0, w8, w9 417; NONEON-NOSVE-NEXT: add sp, sp, #32 418; NONEON-NOSVE-NEXT: ret 419 %op = load <8 x i32>, ptr %a 420 %res = call i32 @llvm.vector.reduce.and.v8i32(<8 x i32> %op) 421 ret i32 %res 422} 423 424define i64 @andv_v2i64(<2 x i64> %a) { 425; CHECK-LABEL: andv_v2i64: 426; CHECK: // %bb.0: 427; CHECK-NEXT: ptrue p0.d, vl2 428; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 429; CHECK-NEXT: andv d0, p0, z0.d 430; CHECK-NEXT: fmov x0, d0 431; CHECK-NEXT: ret 432; 433; NONEON-NOSVE-LABEL: andv_v2i64: 434; NONEON-NOSVE: // %bb.0: 435; NONEON-NOSVE-NEXT: str q0, [sp, #-16]! 436; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 437; NONEON-NOSVE-NEXT: ldp x9, x8, [sp], #16 438; NONEON-NOSVE-NEXT: and x0, x9, x8 439; NONEON-NOSVE-NEXT: ret 440 %res = call i64 @llvm.vector.reduce.and.v2i64(<2 x i64> %a) 441 ret i64 %res 442} 443 444define i64 @andv_v4i64(ptr %a) { 445; CHECK-LABEL: andv_v4i64: 446; CHECK: // %bb.0: 447; CHECK-NEXT: ldp q1, q0, [x0] 448; CHECK-NEXT: ptrue p0.d, vl2 449; CHECK-NEXT: and z0.d, z1.d, z0.d 450; CHECK-NEXT: andv d0, p0, z0.d 451; CHECK-NEXT: fmov x0, d0 452; CHECK-NEXT: ret 453; 454; NONEON-NOSVE-LABEL: andv_v4i64: 455; NONEON-NOSVE: // %bb.0: 456; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 457; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-32]! 458; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 459; NONEON-NOSVE-NEXT: ldp x9, x8, [sp, #16] 460; NONEON-NOSVE-NEXT: ldp x11, x10, [sp], #32 461; NONEON-NOSVE-NEXT: and x8, x10, x8 462; NONEON-NOSVE-NEXT: and x9, x11, x9 463; NONEON-NOSVE-NEXT: and x0, x9, x8 464; NONEON-NOSVE-NEXT: ret 465 %op = load <4 x i64>, ptr %a 466 %res = call i64 @llvm.vector.reduce.and.v4i64(<4 x i64> %op) 467 ret i64 %res 468} 469 470; 471; EORV 472; 473 474define i8 @eorv_v4i8(<4 x i8> %a) { 475; CHECK-LABEL: eorv_v4i8: 476; CHECK: // %bb.0: 477; CHECK-NEXT: ptrue p0.h, vl4 478; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 479; CHECK-NEXT: eorv h0, p0, z0.h 480; CHECK-NEXT: fmov w0, s0 481; CHECK-NEXT: ret 482; 483; NONEON-NOSVE-LABEL: eorv_v4i8: 484; NONEON-NOSVE: // %bb.0: 485; NONEON-NOSVE-NEXT: sub sp, sp, #16 486; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 487; NONEON-NOSVE-NEXT: str d0, [sp, #8] 488; NONEON-NOSVE-NEXT: ldrh w8, [sp, #14] 489; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 490; NONEON-NOSVE-NEXT: ldrh w10, [sp, #10] 491; NONEON-NOSVE-NEXT: ldrh w11, [sp, #8] 492; NONEON-NOSVE-NEXT: eor w8, w9, w8 493; NONEON-NOSVE-NEXT: eor w10, w11, w10 494; NONEON-NOSVE-NEXT: eor w0, w10, w8 495; NONEON-NOSVE-NEXT: add sp, sp, #16 496; NONEON-NOSVE-NEXT: ret 497 %res = call i8 @llvm.vector.reduce.xor.v4i8(<4 x i8> %a) 498 ret i8 %res 499} 500 501define i8 @eorv_v8i8(<8 x i8> %a) { 502; CHECK-LABEL: eorv_v8i8: 503; CHECK: // %bb.0: 504; CHECK-NEXT: ptrue p0.b, vl8 505; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 506; CHECK-NEXT: eorv b0, p0, z0.b 507; CHECK-NEXT: fmov w0, s0 508; CHECK-NEXT: ret 509; 510; NONEON-NOSVE-LABEL: eorv_v8i8: 511; NONEON-NOSVE: // %bb.0: 512; NONEON-NOSVE-NEXT: sub sp, sp, #16 513; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 514; NONEON-NOSVE-NEXT: str d0, [sp, #8] 515; NONEON-NOSVE-NEXT: ldrb w8, [sp, #13] 516; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 517; NONEON-NOSVE-NEXT: ldrb w10, [sp, #11] 518; NONEON-NOSVE-NEXT: ldrb w11, [sp, #10] 519; NONEON-NOSVE-NEXT: ldrb w12, [sp, #9] 520; NONEON-NOSVE-NEXT: ldrb w13, [sp, #8] 521; NONEON-NOSVE-NEXT: ldrb w14, [sp, #14] 522; NONEON-NOSVE-NEXT: eor w8, w9, w8 523; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 524; NONEON-NOSVE-NEXT: eor w12, w13, w12 525; NONEON-NOSVE-NEXT: eor w10, w11, w10 526; NONEON-NOSVE-NEXT: eor w10, w12, w10 527; NONEON-NOSVE-NEXT: eor w8, w8, w14 528; NONEON-NOSVE-NEXT: eor w8, w10, w8 529; NONEON-NOSVE-NEXT: eor w0, w8, w9 530; NONEON-NOSVE-NEXT: add sp, sp, #16 531; NONEON-NOSVE-NEXT: ret 532 %res = call i8 @llvm.vector.reduce.xor.v8i8(<8 x i8> %a) 533 ret i8 %res 534} 535 536define i8 @eorv_v16i8(<16 x i8> %a) { 537; CHECK-LABEL: eorv_v16i8: 538; CHECK: // %bb.0: 539; CHECK-NEXT: ptrue p0.b, vl16 540; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 541; CHECK-NEXT: eorv b0, p0, z0.b 542; CHECK-NEXT: fmov w0, s0 543; CHECK-NEXT: ret 544; 545; NONEON-NOSVE-LABEL: eorv_v16i8: 546; NONEON-NOSVE: // %bb.0: 547; NONEON-NOSVE-NEXT: str q0, [sp, #-16]! 548; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 549; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5] 550; NONEON-NOSVE-NEXT: ldrb w10, [sp, #1] 551; NONEON-NOSVE-NEXT: ldrb w11, [sp] 552; NONEON-NOSVE-NEXT: ldrb w12, [sp, #4] 553; NONEON-NOSVE-NEXT: ldrb w13, [sp, #3] 554; NONEON-NOSVE-NEXT: ldrb w14, [sp, #2] 555; NONEON-NOSVE-NEXT: eor w10, w11, w10 556; NONEON-NOSVE-NEXT: ldrb w8, [sp, #12] 557; NONEON-NOSVE-NEXT: ldrb w15, [sp, #8] 558; NONEON-NOSVE-NEXT: eor w11, w14, w13 559; NONEON-NOSVE-NEXT: eor w9, w12, w9 560; NONEON-NOSVE-NEXT: ldrb w16, [sp, #6] 561; NONEON-NOSVE-NEXT: ldrb w12, [sp, #7] 562; NONEON-NOSVE-NEXT: eor w10, w10, w11 563; NONEON-NOSVE-NEXT: ldrb w13, [sp, #11] 564; NONEON-NOSVE-NEXT: ldrb w11, [sp, #13] 565; NONEON-NOSVE-NEXT: eor w9, w9, w16 566; NONEON-NOSVE-NEXT: ldrb w14, [sp, #9] 567; NONEON-NOSVE-NEXT: eor w12, w12, w15 568; NONEON-NOSVE-NEXT: ldrb w15, [sp, #14] 569; NONEON-NOSVE-NEXT: eor w8, w13, w8 570; NONEON-NOSVE-NEXT: ldrb w16, [sp, #10] 571; NONEON-NOSVE-NEXT: ldrb w13, [sp, #15] 572; NONEON-NOSVE-NEXT: eor w12, w12, w14 573; NONEON-NOSVE-NEXT: eor w8, w8, w11 574; NONEON-NOSVE-NEXT: eor w9, w10, w9 575; NONEON-NOSVE-NEXT: eor w10, w12, w16 576; NONEON-NOSVE-NEXT: eor w8, w8, w15 577; NONEON-NOSVE-NEXT: eor w9, w9, w10 578; NONEON-NOSVE-NEXT: eor w8, w8, w13 579; NONEON-NOSVE-NEXT: eor w0, w9, w8 580; NONEON-NOSVE-NEXT: add sp, sp, #16 581; NONEON-NOSVE-NEXT: ret 582 %res = call i8 @llvm.vector.reduce.xor.v16i8(<16 x i8> %a) 583 ret i8 %res 584} 585 586define i8 @eorv_v32i8(ptr %a) { 587; CHECK-LABEL: eorv_v32i8: 588; CHECK: // %bb.0: 589; CHECK-NEXT: ldp q1, q0, [x0] 590; CHECK-NEXT: ptrue p0.b, vl16 591; CHECK-NEXT: eor z0.d, z1.d, z0.d 592; CHECK-NEXT: eorv b0, p0, z0.b 593; CHECK-NEXT: fmov w0, s0 594; CHECK-NEXT: ret 595; 596; NONEON-NOSVE-LABEL: eorv_v32i8: 597; NONEON-NOSVE: // %bb.0: 598; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 599; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-32]! 600; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 601; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 602; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1] 603; NONEON-NOSVE-NEXT: ldrb w10, [sp, #16] 604; NONEON-NOSVE-NEXT: ldrb w11, [sp] 605; NONEON-NOSVE-NEXT: ldrb w12, [sp, #18] 606; NONEON-NOSVE-NEXT: ldrb w13, [sp, #2] 607; NONEON-NOSVE-NEXT: eor w8, w9, w8 608; NONEON-NOSVE-NEXT: ldrb w14, [sp, #19] 609; NONEON-NOSVE-NEXT: ldrb w15, [sp, #3] 610; NONEON-NOSVE-NEXT: eor w9, w11, w10 611; NONEON-NOSVE-NEXT: eor w10, w13, w12 612; NONEON-NOSVE-NEXT: ldrb w12, [sp, #21] 613; NONEON-NOSVE-NEXT: ldrb w13, [sp, #5] 614; NONEON-NOSVE-NEXT: eor w11, w15, w14 615; NONEON-NOSVE-NEXT: eor w8, w9, w8 616; NONEON-NOSVE-NEXT: ldrb w16, [sp, #20] 617; NONEON-NOSVE-NEXT: ldrb w17, [sp, #4] 618; NONEON-NOSVE-NEXT: eor w9, w10, w11 619; NONEON-NOSVE-NEXT: eor w10, w13, w12 620; NONEON-NOSVE-NEXT: ldrb w11, [sp, #22] 621; NONEON-NOSVE-NEXT: ldrb w12, [sp, #6] 622; NONEON-NOSVE-NEXT: eor w14, w17, w16 623; NONEON-NOSVE-NEXT: ldrb w13, [sp, #23] 624; NONEON-NOSVE-NEXT: ldrb w15, [sp, #8] 625; NONEON-NOSVE-NEXT: eor w10, w14, w10 626; NONEON-NOSVE-NEXT: ldrb w14, [sp, #7] 627; NONEON-NOSVE-NEXT: eor w11, w12, w11 628; NONEON-NOSVE-NEXT: ldrb w12, [sp, #24] 629; NONEON-NOSVE-NEXT: eor w8, w8, w9 630; NONEON-NOSVE-NEXT: eor w9, w10, w11 631; NONEON-NOSVE-NEXT: eor w10, w14, w13 632; NONEON-NOSVE-NEXT: ldrb w13, [sp, #9] 633; NONEON-NOSVE-NEXT: eor w8, w8, w9 634; NONEON-NOSVE-NEXT: eor w11, w15, w12 635; NONEON-NOSVE-NEXT: ldrb w12, [sp, #25] 636; NONEON-NOSVE-NEXT: ldrb w14, [sp, #26] 637; NONEON-NOSVE-NEXT: eor w9, w10, w11 638; NONEON-NOSVE-NEXT: ldrb w11, [sp, #27] 639; NONEON-NOSVE-NEXT: ldrb w15, [sp, #10] 640; NONEON-NOSVE-NEXT: eor w10, w13, w12 641; NONEON-NOSVE-NEXT: ldrb w12, [sp, #11] 642; NONEON-NOSVE-NEXT: ldrb w13, [sp, #12] 643; NONEON-NOSVE-NEXT: eor w9, w9, w10 644; NONEON-NOSVE-NEXT: ldrb w10, [sp, #28] 645; NONEON-NOSVE-NEXT: ldrb w16, [sp, #14] 646; NONEON-NOSVE-NEXT: eor w11, w12, w11 647; NONEON-NOSVE-NEXT: ldrb w12, [sp, #29] 648; NONEON-NOSVE-NEXT: ldrb w17, [sp, #15] 649; NONEON-NOSVE-NEXT: eor w10, w13, w10 650; NONEON-NOSVE-NEXT: ldrb w13, [sp, #13] 651; NONEON-NOSVE-NEXT: eor w14, w15, w14 652; NONEON-NOSVE-NEXT: eor w10, w11, w10 653; NONEON-NOSVE-NEXT: ldrb w11, [sp, #30] 654; NONEON-NOSVE-NEXT: eor w9, w9, w14 655; NONEON-NOSVE-NEXT: eor w12, w13, w12 656; NONEON-NOSVE-NEXT: ldrb w13, [sp, #31] 657; NONEON-NOSVE-NEXT: eor w8, w8, w9 658; NONEON-NOSVE-NEXT: eor w10, w10, w12 659; NONEON-NOSVE-NEXT: eor w11, w16, w11 660; NONEON-NOSVE-NEXT: eor w10, w10, w11 661; NONEON-NOSVE-NEXT: eor w11, w17, w13 662; NONEON-NOSVE-NEXT: eor w9, w10, w11 663; NONEON-NOSVE-NEXT: eor w0, w8, w9 664; NONEON-NOSVE-NEXT: add sp, sp, #32 665; NONEON-NOSVE-NEXT: ret 666 %op = load <32 x i8>, ptr %a 667 %res = call i8 @llvm.vector.reduce.xor.v32i8(<32 x i8> %op) 668 ret i8 %res 669} 670 671define i16 @eorv_v2i16(<2 x i16> %a) { 672; CHECK-LABEL: eorv_v2i16: 673; CHECK: // %bb.0: 674; CHECK-NEXT: ptrue p0.s, vl2 675; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 676; CHECK-NEXT: eorv s0, p0, z0.s 677; CHECK-NEXT: fmov w0, s0 678; CHECK-NEXT: ret 679; 680; NONEON-NOSVE-LABEL: eorv_v2i16: 681; NONEON-NOSVE: // %bb.0: 682; NONEON-NOSVE-NEXT: sub sp, sp, #16 683; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 684; NONEON-NOSVE-NEXT: str d0, [sp, #8] 685; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #8] 686; NONEON-NOSVE-NEXT: eor w0, w9, w8 687; NONEON-NOSVE-NEXT: add sp, sp, #16 688; NONEON-NOSVE-NEXT: ret 689 %res = call i16 @llvm.vector.reduce.xor.v2i16(<2 x i16> %a) 690 ret i16 %res 691} 692 693define i16 @eorv_v4i16(<4 x i16> %a) { 694; CHECK-LABEL: eorv_v4i16: 695; CHECK: // %bb.0: 696; CHECK-NEXT: ptrue p0.h, vl4 697; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 698; CHECK-NEXT: eorv h0, p0, z0.h 699; CHECK-NEXT: fmov w0, s0 700; CHECK-NEXT: ret 701; 702; NONEON-NOSVE-LABEL: eorv_v4i16: 703; NONEON-NOSVE: // %bb.0: 704; NONEON-NOSVE-NEXT: sub sp, sp, #16 705; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 706; NONEON-NOSVE-NEXT: str d0, [sp, #8] 707; NONEON-NOSVE-NEXT: ldrh w8, [sp, #14] 708; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 709; NONEON-NOSVE-NEXT: ldrh w10, [sp, #10] 710; NONEON-NOSVE-NEXT: ldrh w11, [sp, #8] 711; NONEON-NOSVE-NEXT: eor w8, w9, w8 712; NONEON-NOSVE-NEXT: eor w10, w11, w10 713; NONEON-NOSVE-NEXT: eor w0, w10, w8 714; NONEON-NOSVE-NEXT: add sp, sp, #16 715; NONEON-NOSVE-NEXT: ret 716 %res = call i16 @llvm.vector.reduce.xor.v4i16(<4 x i16> %a) 717 ret i16 %res 718} 719 720define i16 @eorv_v8i16(<8 x i16> %a) { 721; CHECK-LABEL: eorv_v8i16: 722; CHECK: // %bb.0: 723; CHECK-NEXT: ptrue p0.h, vl8 724; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 725; CHECK-NEXT: eorv h0, p0, z0.h 726; CHECK-NEXT: fmov w0, s0 727; CHECK-NEXT: ret 728; 729; NONEON-NOSVE-LABEL: eorv_v8i16: 730; NONEON-NOSVE: // %bb.0: 731; NONEON-NOSVE-NEXT: str q0, [sp, #-16]! 732; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 733; NONEON-NOSVE-NEXT: ldrh w8, [sp, #10] 734; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 735; NONEON-NOSVE-NEXT: ldrh w10, [sp, #6] 736; NONEON-NOSVE-NEXT: ldrh w11, [sp, #4] 737; NONEON-NOSVE-NEXT: ldrh w12, [sp, #2] 738; NONEON-NOSVE-NEXT: ldrh w13, [sp] 739; NONEON-NOSVE-NEXT: eor w8, w9, w8 740; NONEON-NOSVE-NEXT: ldrh w14, [sp, #12] 741; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 742; NONEON-NOSVE-NEXT: eor w12, w13, w12 743; NONEON-NOSVE-NEXT: eor w10, w11, w10 744; NONEON-NOSVE-NEXT: eor w10, w12, w10 745; NONEON-NOSVE-NEXT: eor w8, w8, w14 746; NONEON-NOSVE-NEXT: eor w8, w10, w8 747; NONEON-NOSVE-NEXT: eor w0, w8, w9 748; NONEON-NOSVE-NEXT: add sp, sp, #16 749; NONEON-NOSVE-NEXT: ret 750 %res = call i16 @llvm.vector.reduce.xor.v8i16(<8 x i16> %a) 751 ret i16 %res 752} 753 754define i16 @eorv_v16i16(ptr %a) { 755; CHECK-LABEL: eorv_v16i16: 756; CHECK: // %bb.0: 757; CHECK-NEXT: ldp q1, q0, [x0] 758; CHECK-NEXT: ptrue p0.h, vl8 759; CHECK-NEXT: eor z0.d, z1.d, z0.d 760; CHECK-NEXT: eorv h0, p0, z0.h 761; CHECK-NEXT: fmov w0, s0 762; CHECK-NEXT: ret 763; 764; NONEON-NOSVE-LABEL: eorv_v16i16: 765; NONEON-NOSVE: // %bb.0: 766; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 767; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-32]! 768; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 769; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 770; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2] 771; NONEON-NOSVE-NEXT: ldrh w10, [sp, #16] 772; NONEON-NOSVE-NEXT: ldrh w11, [sp] 773; NONEON-NOSVE-NEXT: ldrh w12, [sp, #20] 774; NONEON-NOSVE-NEXT: ldrh w13, [sp, #4] 775; NONEON-NOSVE-NEXT: eor w8, w9, w8 776; NONEON-NOSVE-NEXT: ldrh w14, [sp, #22] 777; NONEON-NOSVE-NEXT: ldrh w15, [sp, #6] 778; NONEON-NOSVE-NEXT: eor w9, w11, w10 779; NONEON-NOSVE-NEXT: eor w12, w13, w12 780; NONEON-NOSVE-NEXT: ldrh w10, [sp, #26] 781; NONEON-NOSVE-NEXT: ldrh w11, [sp, #10] 782; NONEON-NOSVE-NEXT: eor w13, w15, w14 783; NONEON-NOSVE-NEXT: eor w8, w9, w8 784; NONEON-NOSVE-NEXT: ldrh w16, [sp, #24] 785; NONEON-NOSVE-NEXT: ldrh w17, [sp, #8] 786; NONEON-NOSVE-NEXT: eor w9, w12, w13 787; NONEON-NOSVE-NEXT: eor w10, w11, w10 788; NONEON-NOSVE-NEXT: ldrh w11, [sp, #28] 789; NONEON-NOSVE-NEXT: ldrh w15, [sp, #12] 790; NONEON-NOSVE-NEXT: eor w14, w17, w16 791; NONEON-NOSVE-NEXT: ldrh w12, [sp, #30] 792; NONEON-NOSVE-NEXT: ldrh w13, [sp, #14] 793; NONEON-NOSVE-NEXT: eor w10, w14, w10 794; NONEON-NOSVE-NEXT: eor w11, w15, w11 795; NONEON-NOSVE-NEXT: eor w8, w8, w9 796; NONEON-NOSVE-NEXT: eor w9, w10, w11 797; NONEON-NOSVE-NEXT: eor w8, w8, w9 798; NONEON-NOSVE-NEXT: eor w9, w13, w12 799; NONEON-NOSVE-NEXT: eor w0, w8, w9 800; NONEON-NOSVE-NEXT: add sp, sp, #32 801; NONEON-NOSVE-NEXT: ret 802 %op = load <16 x i16>, ptr %a 803 %res = call i16 @llvm.vector.reduce.xor.v16i16(<16 x i16> %op) 804 ret i16 %res 805} 806 807define i32 @eorv_v2i32(<2 x i32> %a) { 808; CHECK-LABEL: eorv_v2i32: 809; CHECK: // %bb.0: 810; CHECK-NEXT: ptrue p0.s, vl2 811; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 812; CHECK-NEXT: eorv s0, p0, z0.s 813; CHECK-NEXT: fmov w0, s0 814; CHECK-NEXT: ret 815; 816; NONEON-NOSVE-LABEL: eorv_v2i32: 817; NONEON-NOSVE: // %bb.0: 818; NONEON-NOSVE-NEXT: sub sp, sp, #16 819; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 820; NONEON-NOSVE-NEXT: str d0, [sp, #8] 821; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #8] 822; NONEON-NOSVE-NEXT: eor w0, w9, w8 823; NONEON-NOSVE-NEXT: add sp, sp, #16 824; NONEON-NOSVE-NEXT: ret 825 %res = call i32 @llvm.vector.reduce.xor.v2i32(<2 x i32> %a) 826 ret i32 %res 827} 828 829define i32 @eorv_v4i32(<4 x i32> %a) { 830; CHECK-LABEL: eorv_v4i32: 831; CHECK: // %bb.0: 832; CHECK-NEXT: ptrue p0.s, vl4 833; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 834; CHECK-NEXT: eorv s0, p0, z0.s 835; CHECK-NEXT: fmov w0, s0 836; CHECK-NEXT: ret 837; 838; NONEON-NOSVE-LABEL: eorv_v4i32: 839; NONEON-NOSVE: // %bb.0: 840; NONEON-NOSVE-NEXT: str q0, [sp, #-16]! 841; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 842; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #8] 843; NONEON-NOSVE-NEXT: ldp w11, w10, [sp], #16 844; NONEON-NOSVE-NEXT: eor w10, w11, w10 845; NONEON-NOSVE-NEXT: eor w8, w9, w8 846; NONEON-NOSVE-NEXT: eor w0, w10, w8 847; NONEON-NOSVE-NEXT: ret 848 %res = call i32 @llvm.vector.reduce.xor.v4i32(<4 x i32> %a) 849 ret i32 %res 850} 851 852define i32 @eorv_v8i32(ptr %a) { 853; CHECK-LABEL: eorv_v8i32: 854; CHECK: // %bb.0: 855; CHECK-NEXT: ldp q1, q0, [x0] 856; CHECK-NEXT: ptrue p0.s, vl4 857; CHECK-NEXT: eor z0.d, z1.d, z0.d 858; CHECK-NEXT: eorv s0, p0, z0.s 859; CHECK-NEXT: fmov w0, s0 860; CHECK-NEXT: ret 861; 862; NONEON-NOSVE-LABEL: eorv_v8i32: 863; NONEON-NOSVE: // %bb.0: 864; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 865; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-32]! 866; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 867; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #16] 868; NONEON-NOSVE-NEXT: ldp w11, w10, [sp] 869; NONEON-NOSVE-NEXT: ldp w12, w13, [sp, #24] 870; NONEON-NOSVE-NEXT: ldp w14, w15, [sp, #8] 871; NONEON-NOSVE-NEXT: eor w8, w10, w8 872; NONEON-NOSVE-NEXT: eor w9, w11, w9 873; NONEON-NOSVE-NEXT: eor w8, w9, w8 874; NONEON-NOSVE-NEXT: eor w10, w14, w12 875; NONEON-NOSVE-NEXT: eor w11, w15, w13 876; NONEON-NOSVE-NEXT: eor w9, w10, w11 877; NONEON-NOSVE-NEXT: eor w0, w8, w9 878; NONEON-NOSVE-NEXT: add sp, sp, #32 879; NONEON-NOSVE-NEXT: ret 880 %op = load <8 x i32>, ptr %a 881 %res = call i32 @llvm.vector.reduce.xor.v8i32(<8 x i32> %op) 882 ret i32 %res 883} 884 885define i64 @eorv_v2i64(<2 x i64> %a) { 886; CHECK-LABEL: eorv_v2i64: 887; CHECK: // %bb.0: 888; CHECK-NEXT: ptrue p0.d, vl2 889; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 890; CHECK-NEXT: eorv d0, p0, z0.d 891; CHECK-NEXT: fmov x0, d0 892; CHECK-NEXT: ret 893; 894; NONEON-NOSVE-LABEL: eorv_v2i64: 895; NONEON-NOSVE: // %bb.0: 896; NONEON-NOSVE-NEXT: str q0, [sp, #-16]! 897; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 898; NONEON-NOSVE-NEXT: ldp x9, x8, [sp], #16 899; NONEON-NOSVE-NEXT: eor x0, x9, x8 900; NONEON-NOSVE-NEXT: ret 901 %res = call i64 @llvm.vector.reduce.xor.v2i64(<2 x i64> %a) 902 ret i64 %res 903} 904 905define i64 @eorv_v4i64(ptr %a) { 906; CHECK-LABEL: eorv_v4i64: 907; CHECK: // %bb.0: 908; CHECK-NEXT: ldp q1, q0, [x0] 909; CHECK-NEXT: ptrue p0.d, vl2 910; CHECK-NEXT: eor z0.d, z1.d, z0.d 911; CHECK-NEXT: eorv d0, p0, z0.d 912; CHECK-NEXT: fmov x0, d0 913; CHECK-NEXT: ret 914; 915; NONEON-NOSVE-LABEL: eorv_v4i64: 916; NONEON-NOSVE: // %bb.0: 917; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 918; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-32]! 919; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 920; NONEON-NOSVE-NEXT: ldp x9, x8, [sp, #16] 921; NONEON-NOSVE-NEXT: ldp x11, x10, [sp], #32 922; NONEON-NOSVE-NEXT: eor x8, x10, x8 923; NONEON-NOSVE-NEXT: eor x9, x11, x9 924; NONEON-NOSVE-NEXT: eor x0, x9, x8 925; NONEON-NOSVE-NEXT: ret 926 %op = load <4 x i64>, ptr %a 927 %res = call i64 @llvm.vector.reduce.xor.v4i64(<4 x i64> %op) 928 ret i64 %res 929} 930 931; 932; ORV 933; 934 935define i8 @orv_v4i8(<4 x i8> %a) { 936; CHECK-LABEL: orv_v4i8: 937; CHECK: // %bb.0: 938; CHECK-NEXT: ptrue p0.h, vl4 939; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 940; CHECK-NEXT: orv h0, p0, z0.h 941; CHECK-NEXT: fmov w0, s0 942; CHECK-NEXT: ret 943; 944; NONEON-NOSVE-LABEL: orv_v4i8: 945; NONEON-NOSVE: // %bb.0: 946; NONEON-NOSVE-NEXT: sub sp, sp, #16 947; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 948; NONEON-NOSVE-NEXT: str d0, [sp, #8] 949; NONEON-NOSVE-NEXT: ldrh w8, [sp, #14] 950; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 951; NONEON-NOSVE-NEXT: ldrh w10, [sp, #10] 952; NONEON-NOSVE-NEXT: ldrh w11, [sp, #8] 953; NONEON-NOSVE-NEXT: orr w8, w9, w8 954; NONEON-NOSVE-NEXT: orr w10, w11, w10 955; NONEON-NOSVE-NEXT: orr w0, w10, w8 956; NONEON-NOSVE-NEXT: add sp, sp, #16 957; NONEON-NOSVE-NEXT: ret 958 %res = call i8 @llvm.vector.reduce.or.v4i8(<4 x i8> %a) 959 ret i8 %res 960} 961 962define i8 @orv_v8i8(<8 x i8> %a) { 963; CHECK-LABEL: orv_v8i8: 964; CHECK: // %bb.0: 965; CHECK-NEXT: ptrue p0.b, vl8 966; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 967; CHECK-NEXT: orv b0, p0, z0.b 968; CHECK-NEXT: fmov w0, s0 969; CHECK-NEXT: ret 970; 971; NONEON-NOSVE-LABEL: orv_v8i8: 972; NONEON-NOSVE: // %bb.0: 973; NONEON-NOSVE-NEXT: sub sp, sp, #16 974; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 975; NONEON-NOSVE-NEXT: str d0, [sp, #8] 976; NONEON-NOSVE-NEXT: ldrb w8, [sp, #13] 977; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 978; NONEON-NOSVE-NEXT: ldrb w10, [sp, #11] 979; NONEON-NOSVE-NEXT: ldrb w11, [sp, #10] 980; NONEON-NOSVE-NEXT: ldrb w12, [sp, #9] 981; NONEON-NOSVE-NEXT: ldrb w13, [sp, #8] 982; NONEON-NOSVE-NEXT: ldrb w14, [sp, #14] 983; NONEON-NOSVE-NEXT: orr w8, w9, w8 984; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 985; NONEON-NOSVE-NEXT: orr w12, w13, w12 986; NONEON-NOSVE-NEXT: orr w10, w11, w10 987; NONEON-NOSVE-NEXT: orr w10, w12, w10 988; NONEON-NOSVE-NEXT: orr w8, w8, w14 989; NONEON-NOSVE-NEXT: orr w8, w10, w8 990; NONEON-NOSVE-NEXT: orr w0, w8, w9 991; NONEON-NOSVE-NEXT: add sp, sp, #16 992; NONEON-NOSVE-NEXT: ret 993 %res = call i8 @llvm.vector.reduce.or.v8i8(<8 x i8> %a) 994 ret i8 %res 995} 996 997define i8 @orv_v16i8(<16 x i8> %a) { 998; CHECK-LABEL: orv_v16i8: 999; CHECK: // %bb.0: 1000; CHECK-NEXT: ptrue p0.b, vl16 1001; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1002; CHECK-NEXT: orv b0, p0, z0.b 1003; CHECK-NEXT: fmov w0, s0 1004; CHECK-NEXT: ret 1005; 1006; NONEON-NOSVE-LABEL: orv_v16i8: 1007; NONEON-NOSVE: // %bb.0: 1008; NONEON-NOSVE-NEXT: str q0, [sp, #-16]! 1009; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 1010; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5] 1011; NONEON-NOSVE-NEXT: ldrb w10, [sp, #1] 1012; NONEON-NOSVE-NEXT: ldrb w11, [sp] 1013; NONEON-NOSVE-NEXT: ldrb w12, [sp, #4] 1014; NONEON-NOSVE-NEXT: ldrb w13, [sp, #3] 1015; NONEON-NOSVE-NEXT: ldrb w14, [sp, #2] 1016; NONEON-NOSVE-NEXT: orr w10, w11, w10 1017; NONEON-NOSVE-NEXT: ldrb w8, [sp, #12] 1018; NONEON-NOSVE-NEXT: ldrb w15, [sp, #8] 1019; NONEON-NOSVE-NEXT: orr w11, w14, w13 1020; NONEON-NOSVE-NEXT: orr w9, w12, w9 1021; NONEON-NOSVE-NEXT: ldrb w16, [sp, #6] 1022; NONEON-NOSVE-NEXT: ldrb w12, [sp, #7] 1023; NONEON-NOSVE-NEXT: orr w10, w10, w11 1024; NONEON-NOSVE-NEXT: ldrb w13, [sp, #11] 1025; NONEON-NOSVE-NEXT: ldrb w11, [sp, #13] 1026; NONEON-NOSVE-NEXT: orr w9, w9, w16 1027; NONEON-NOSVE-NEXT: ldrb w14, [sp, #9] 1028; NONEON-NOSVE-NEXT: orr w12, w12, w15 1029; NONEON-NOSVE-NEXT: ldrb w15, [sp, #14] 1030; NONEON-NOSVE-NEXT: orr w8, w13, w8 1031; NONEON-NOSVE-NEXT: ldrb w16, [sp, #10] 1032; NONEON-NOSVE-NEXT: ldrb w13, [sp, #15] 1033; NONEON-NOSVE-NEXT: orr w12, w12, w14 1034; NONEON-NOSVE-NEXT: orr w8, w8, w11 1035; NONEON-NOSVE-NEXT: orr w9, w10, w9 1036; NONEON-NOSVE-NEXT: orr w10, w12, w16 1037; NONEON-NOSVE-NEXT: orr w8, w8, w15 1038; NONEON-NOSVE-NEXT: orr w9, w9, w10 1039; NONEON-NOSVE-NEXT: orr w8, w8, w13 1040; NONEON-NOSVE-NEXT: orr w0, w9, w8 1041; NONEON-NOSVE-NEXT: add sp, sp, #16 1042; NONEON-NOSVE-NEXT: ret 1043 %res = call i8 @llvm.vector.reduce.or.v16i8(<16 x i8> %a) 1044 ret i8 %res 1045} 1046 1047define i8 @orv_v32i8(ptr %a) { 1048; CHECK-LABEL: orv_v32i8: 1049; CHECK: // %bb.0: 1050; CHECK-NEXT: ldp q1, q0, [x0] 1051; CHECK-NEXT: ptrue p0.b, vl16 1052; CHECK-NEXT: orr z0.d, z1.d, z0.d 1053; CHECK-NEXT: orv b0, p0, z0.b 1054; CHECK-NEXT: fmov w0, s0 1055; CHECK-NEXT: ret 1056; 1057; NONEON-NOSVE-LABEL: orv_v32i8: 1058; NONEON-NOSVE: // %bb.0: 1059; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 1060; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-32]! 1061; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1062; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 1063; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1] 1064; NONEON-NOSVE-NEXT: ldrb w10, [sp, #16] 1065; NONEON-NOSVE-NEXT: ldrb w11, [sp] 1066; NONEON-NOSVE-NEXT: ldrb w12, [sp, #18] 1067; NONEON-NOSVE-NEXT: ldrb w13, [sp, #2] 1068; NONEON-NOSVE-NEXT: orr w8, w9, w8 1069; NONEON-NOSVE-NEXT: ldrb w14, [sp, #19] 1070; NONEON-NOSVE-NEXT: ldrb w15, [sp, #3] 1071; NONEON-NOSVE-NEXT: orr w9, w11, w10 1072; NONEON-NOSVE-NEXT: orr w10, w13, w12 1073; NONEON-NOSVE-NEXT: ldrb w12, [sp, #21] 1074; NONEON-NOSVE-NEXT: ldrb w13, [sp, #5] 1075; NONEON-NOSVE-NEXT: orr w11, w15, w14 1076; NONEON-NOSVE-NEXT: orr w8, w9, w8 1077; NONEON-NOSVE-NEXT: ldrb w16, [sp, #20] 1078; NONEON-NOSVE-NEXT: ldrb w17, [sp, #4] 1079; NONEON-NOSVE-NEXT: orr w9, w10, w11 1080; NONEON-NOSVE-NEXT: orr w10, w13, w12 1081; NONEON-NOSVE-NEXT: ldrb w11, [sp, #22] 1082; NONEON-NOSVE-NEXT: ldrb w12, [sp, #6] 1083; NONEON-NOSVE-NEXT: orr w14, w17, w16 1084; NONEON-NOSVE-NEXT: ldrb w13, [sp, #23] 1085; NONEON-NOSVE-NEXT: ldrb w15, [sp, #8] 1086; NONEON-NOSVE-NEXT: orr w10, w14, w10 1087; NONEON-NOSVE-NEXT: ldrb w14, [sp, #7] 1088; NONEON-NOSVE-NEXT: orr w11, w12, w11 1089; NONEON-NOSVE-NEXT: ldrb w12, [sp, #24] 1090; NONEON-NOSVE-NEXT: orr w8, w8, w9 1091; NONEON-NOSVE-NEXT: orr w9, w10, w11 1092; NONEON-NOSVE-NEXT: orr w10, w14, w13 1093; NONEON-NOSVE-NEXT: ldrb w13, [sp, #9] 1094; NONEON-NOSVE-NEXT: orr w8, w8, w9 1095; NONEON-NOSVE-NEXT: orr w11, w15, w12 1096; NONEON-NOSVE-NEXT: ldrb w12, [sp, #25] 1097; NONEON-NOSVE-NEXT: ldrb w14, [sp, #26] 1098; NONEON-NOSVE-NEXT: orr w9, w10, w11 1099; NONEON-NOSVE-NEXT: ldrb w11, [sp, #27] 1100; NONEON-NOSVE-NEXT: ldrb w15, [sp, #10] 1101; NONEON-NOSVE-NEXT: orr w10, w13, w12 1102; NONEON-NOSVE-NEXT: ldrb w12, [sp, #11] 1103; NONEON-NOSVE-NEXT: ldrb w13, [sp, #12] 1104; NONEON-NOSVE-NEXT: orr w9, w9, w10 1105; NONEON-NOSVE-NEXT: ldrb w10, [sp, #28] 1106; NONEON-NOSVE-NEXT: ldrb w16, [sp, #14] 1107; NONEON-NOSVE-NEXT: orr w11, w12, w11 1108; NONEON-NOSVE-NEXT: ldrb w12, [sp, #29] 1109; NONEON-NOSVE-NEXT: ldrb w17, [sp, #15] 1110; NONEON-NOSVE-NEXT: orr w10, w13, w10 1111; NONEON-NOSVE-NEXT: ldrb w13, [sp, #13] 1112; NONEON-NOSVE-NEXT: orr w14, w15, w14 1113; NONEON-NOSVE-NEXT: orr w10, w11, w10 1114; NONEON-NOSVE-NEXT: ldrb w11, [sp, #30] 1115; NONEON-NOSVE-NEXT: orr w9, w9, w14 1116; NONEON-NOSVE-NEXT: orr w12, w13, w12 1117; NONEON-NOSVE-NEXT: ldrb w13, [sp, #31] 1118; NONEON-NOSVE-NEXT: orr w8, w8, w9 1119; NONEON-NOSVE-NEXT: orr w10, w10, w12 1120; NONEON-NOSVE-NEXT: orr w11, w16, w11 1121; NONEON-NOSVE-NEXT: orr w10, w10, w11 1122; NONEON-NOSVE-NEXT: orr w11, w17, w13 1123; NONEON-NOSVE-NEXT: orr w9, w10, w11 1124; NONEON-NOSVE-NEXT: orr w0, w8, w9 1125; NONEON-NOSVE-NEXT: add sp, sp, #32 1126; NONEON-NOSVE-NEXT: ret 1127 %op = load <32 x i8>, ptr %a 1128 %res = call i8 @llvm.vector.reduce.or.v32i8(<32 x i8> %op) 1129 ret i8 %res 1130} 1131 1132define i16 @orv_v2i16(<2 x i16> %a) { 1133; CHECK-LABEL: orv_v2i16: 1134; CHECK: // %bb.0: 1135; CHECK-NEXT: ptrue p0.s, vl2 1136; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1137; CHECK-NEXT: orv s0, p0, z0.s 1138; CHECK-NEXT: fmov w0, s0 1139; CHECK-NEXT: ret 1140; 1141; NONEON-NOSVE-LABEL: orv_v2i16: 1142; NONEON-NOSVE: // %bb.0: 1143; NONEON-NOSVE-NEXT: sub sp, sp, #16 1144; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 1145; NONEON-NOSVE-NEXT: str d0, [sp, #8] 1146; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #8] 1147; NONEON-NOSVE-NEXT: orr w0, w9, w8 1148; NONEON-NOSVE-NEXT: add sp, sp, #16 1149; NONEON-NOSVE-NEXT: ret 1150 %res = call i16 @llvm.vector.reduce.or.v2i16(<2 x i16> %a) 1151 ret i16 %res 1152} 1153 1154define i16 @orv_v4i16(<4 x i16> %a) { 1155; CHECK-LABEL: orv_v4i16: 1156; CHECK: // %bb.0: 1157; CHECK-NEXT: ptrue p0.h, vl4 1158; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1159; CHECK-NEXT: orv h0, p0, z0.h 1160; CHECK-NEXT: fmov w0, s0 1161; CHECK-NEXT: ret 1162; 1163; NONEON-NOSVE-LABEL: orv_v4i16: 1164; NONEON-NOSVE: // %bb.0: 1165; NONEON-NOSVE-NEXT: sub sp, sp, #16 1166; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 1167; NONEON-NOSVE-NEXT: str d0, [sp, #8] 1168; NONEON-NOSVE-NEXT: ldrh w8, [sp, #14] 1169; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 1170; NONEON-NOSVE-NEXT: ldrh w10, [sp, #10] 1171; NONEON-NOSVE-NEXT: ldrh w11, [sp, #8] 1172; NONEON-NOSVE-NEXT: orr w8, w9, w8 1173; NONEON-NOSVE-NEXT: orr w10, w11, w10 1174; NONEON-NOSVE-NEXT: orr w0, w10, w8 1175; NONEON-NOSVE-NEXT: add sp, sp, #16 1176; NONEON-NOSVE-NEXT: ret 1177 %res = call i16 @llvm.vector.reduce.or.v4i16(<4 x i16> %a) 1178 ret i16 %res 1179} 1180 1181define i16 @orv_v8i16(<8 x i16> %a) { 1182; CHECK-LABEL: orv_v8i16: 1183; CHECK: // %bb.0: 1184; CHECK-NEXT: ptrue p0.h, vl8 1185; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1186; CHECK-NEXT: orv h0, p0, z0.h 1187; CHECK-NEXT: fmov w0, s0 1188; CHECK-NEXT: ret 1189; 1190; NONEON-NOSVE-LABEL: orv_v8i16: 1191; NONEON-NOSVE: // %bb.0: 1192; NONEON-NOSVE-NEXT: str q0, [sp, #-16]! 1193; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 1194; NONEON-NOSVE-NEXT: ldrh w8, [sp, #10] 1195; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 1196; NONEON-NOSVE-NEXT: ldrh w10, [sp, #6] 1197; NONEON-NOSVE-NEXT: ldrh w11, [sp, #4] 1198; NONEON-NOSVE-NEXT: ldrh w12, [sp, #2] 1199; NONEON-NOSVE-NEXT: ldrh w13, [sp] 1200; NONEON-NOSVE-NEXT: orr w8, w9, w8 1201; NONEON-NOSVE-NEXT: ldrh w14, [sp, #12] 1202; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 1203; NONEON-NOSVE-NEXT: orr w12, w13, w12 1204; NONEON-NOSVE-NEXT: orr w10, w11, w10 1205; NONEON-NOSVE-NEXT: orr w10, w12, w10 1206; NONEON-NOSVE-NEXT: orr w8, w8, w14 1207; NONEON-NOSVE-NEXT: orr w8, w10, w8 1208; NONEON-NOSVE-NEXT: orr w0, w8, w9 1209; NONEON-NOSVE-NEXT: add sp, sp, #16 1210; NONEON-NOSVE-NEXT: ret 1211 %res = call i16 @llvm.vector.reduce.or.v8i16(<8 x i16> %a) 1212 ret i16 %res 1213} 1214 1215define i16 @orv_v16i16(ptr %a) { 1216; CHECK-LABEL: orv_v16i16: 1217; CHECK: // %bb.0: 1218; CHECK-NEXT: ldp q1, q0, [x0] 1219; CHECK-NEXT: ptrue p0.h, vl8 1220; CHECK-NEXT: orr z0.d, z1.d, z0.d 1221; CHECK-NEXT: orv h0, p0, z0.h 1222; CHECK-NEXT: fmov w0, s0 1223; CHECK-NEXT: ret 1224; 1225; NONEON-NOSVE-LABEL: orv_v16i16: 1226; NONEON-NOSVE: // %bb.0: 1227; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 1228; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-32]! 1229; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1230; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 1231; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2] 1232; NONEON-NOSVE-NEXT: ldrh w10, [sp, #16] 1233; NONEON-NOSVE-NEXT: ldrh w11, [sp] 1234; NONEON-NOSVE-NEXT: ldrh w12, [sp, #20] 1235; NONEON-NOSVE-NEXT: ldrh w13, [sp, #4] 1236; NONEON-NOSVE-NEXT: orr w8, w9, w8 1237; NONEON-NOSVE-NEXT: ldrh w14, [sp, #22] 1238; NONEON-NOSVE-NEXT: ldrh w15, [sp, #6] 1239; NONEON-NOSVE-NEXT: orr w9, w11, w10 1240; NONEON-NOSVE-NEXT: orr w12, w13, w12 1241; NONEON-NOSVE-NEXT: ldrh w10, [sp, #26] 1242; NONEON-NOSVE-NEXT: ldrh w11, [sp, #10] 1243; NONEON-NOSVE-NEXT: orr w13, w15, w14 1244; NONEON-NOSVE-NEXT: orr w8, w9, w8 1245; NONEON-NOSVE-NEXT: ldrh w16, [sp, #24] 1246; NONEON-NOSVE-NEXT: ldrh w17, [sp, #8] 1247; NONEON-NOSVE-NEXT: orr w9, w12, w13 1248; NONEON-NOSVE-NEXT: orr w10, w11, w10 1249; NONEON-NOSVE-NEXT: ldrh w11, [sp, #28] 1250; NONEON-NOSVE-NEXT: ldrh w15, [sp, #12] 1251; NONEON-NOSVE-NEXT: orr w14, w17, w16 1252; NONEON-NOSVE-NEXT: ldrh w12, [sp, #30] 1253; NONEON-NOSVE-NEXT: ldrh w13, [sp, #14] 1254; NONEON-NOSVE-NEXT: orr w10, w14, w10 1255; NONEON-NOSVE-NEXT: orr w11, w15, w11 1256; NONEON-NOSVE-NEXT: orr w8, w8, w9 1257; NONEON-NOSVE-NEXT: orr w9, w10, w11 1258; NONEON-NOSVE-NEXT: orr w8, w8, w9 1259; NONEON-NOSVE-NEXT: orr w9, w13, w12 1260; NONEON-NOSVE-NEXT: orr w0, w8, w9 1261; NONEON-NOSVE-NEXT: add sp, sp, #32 1262; NONEON-NOSVE-NEXT: ret 1263 %op = load <16 x i16>, ptr %a 1264 %res = call i16 @llvm.vector.reduce.or.v16i16(<16 x i16> %op) 1265 ret i16 %res 1266} 1267 1268define i32 @orv_v2i32(<2 x i32> %a) { 1269; CHECK-LABEL: orv_v2i32: 1270; CHECK: // %bb.0: 1271; CHECK-NEXT: ptrue p0.s, vl2 1272; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1273; CHECK-NEXT: orv s0, p0, z0.s 1274; CHECK-NEXT: fmov w0, s0 1275; CHECK-NEXT: ret 1276; 1277; NONEON-NOSVE-LABEL: orv_v2i32: 1278; NONEON-NOSVE: // %bb.0: 1279; NONEON-NOSVE-NEXT: sub sp, sp, #16 1280; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 1281; NONEON-NOSVE-NEXT: str d0, [sp, #8] 1282; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #8] 1283; NONEON-NOSVE-NEXT: orr w0, w9, w8 1284; NONEON-NOSVE-NEXT: add sp, sp, #16 1285; NONEON-NOSVE-NEXT: ret 1286 %res = call i32 @llvm.vector.reduce.or.v2i32(<2 x i32> %a) 1287 ret i32 %res 1288} 1289 1290define i32 @orv_v4i32(<4 x i32> %a) { 1291; CHECK-LABEL: orv_v4i32: 1292; CHECK: // %bb.0: 1293; CHECK-NEXT: ptrue p0.s, vl4 1294; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1295; CHECK-NEXT: orv s0, p0, z0.s 1296; CHECK-NEXT: fmov w0, s0 1297; CHECK-NEXT: ret 1298; 1299; NONEON-NOSVE-LABEL: orv_v4i32: 1300; NONEON-NOSVE: // %bb.0: 1301; NONEON-NOSVE-NEXT: str q0, [sp, #-16]! 1302; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 1303; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #8] 1304; NONEON-NOSVE-NEXT: ldp w11, w10, [sp], #16 1305; NONEON-NOSVE-NEXT: orr w10, w11, w10 1306; NONEON-NOSVE-NEXT: orr w8, w9, w8 1307; NONEON-NOSVE-NEXT: orr w0, w10, w8 1308; NONEON-NOSVE-NEXT: ret 1309 %res = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %a) 1310 ret i32 %res 1311} 1312 1313define i32 @orv_v8i32(ptr %a) { 1314; CHECK-LABEL: orv_v8i32: 1315; CHECK: // %bb.0: 1316; CHECK-NEXT: ldp q1, q0, [x0] 1317; CHECK-NEXT: ptrue p0.s, vl4 1318; CHECK-NEXT: orr z0.d, z1.d, z0.d 1319; CHECK-NEXT: orv s0, p0, z0.s 1320; CHECK-NEXT: fmov w0, s0 1321; CHECK-NEXT: ret 1322; 1323; NONEON-NOSVE-LABEL: orv_v8i32: 1324; NONEON-NOSVE: // %bb.0: 1325; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 1326; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-32]! 1327; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1328; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #16] 1329; NONEON-NOSVE-NEXT: ldp w11, w10, [sp] 1330; NONEON-NOSVE-NEXT: ldp w12, w13, [sp, #24] 1331; NONEON-NOSVE-NEXT: ldp w14, w15, [sp, #8] 1332; NONEON-NOSVE-NEXT: orr w8, w10, w8 1333; NONEON-NOSVE-NEXT: orr w9, w11, w9 1334; NONEON-NOSVE-NEXT: orr w8, w9, w8 1335; NONEON-NOSVE-NEXT: orr w10, w14, w12 1336; NONEON-NOSVE-NEXT: orr w11, w15, w13 1337; NONEON-NOSVE-NEXT: orr w9, w10, w11 1338; NONEON-NOSVE-NEXT: orr w0, w8, w9 1339; NONEON-NOSVE-NEXT: add sp, sp, #32 1340; NONEON-NOSVE-NEXT: ret 1341 %op = load <8 x i32>, ptr %a 1342 %res = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %op) 1343 ret i32 %res 1344} 1345 1346define i64 @orv_v2i64(<2 x i64> %a) { 1347; CHECK-LABEL: orv_v2i64: 1348; CHECK: // %bb.0: 1349; CHECK-NEXT: ptrue p0.d, vl2 1350; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1351; CHECK-NEXT: orv d0, p0, z0.d 1352; CHECK-NEXT: fmov x0, d0 1353; CHECK-NEXT: ret 1354; 1355; NONEON-NOSVE-LABEL: orv_v2i64: 1356; NONEON-NOSVE: // %bb.0: 1357; NONEON-NOSVE-NEXT: str q0, [sp, #-16]! 1358; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 1359; NONEON-NOSVE-NEXT: ldp x9, x8, [sp], #16 1360; NONEON-NOSVE-NEXT: orr x0, x9, x8 1361; NONEON-NOSVE-NEXT: ret 1362 %res = call i64 @llvm.vector.reduce.or.v2i64(<2 x i64> %a) 1363 ret i64 %res 1364} 1365 1366define i64 @orv_v4i64(ptr %a) { 1367; CHECK-LABEL: orv_v4i64: 1368; CHECK: // %bb.0: 1369; CHECK-NEXT: ldp q1, q0, [x0] 1370; CHECK-NEXT: ptrue p0.d, vl2 1371; CHECK-NEXT: orr z0.d, z1.d, z0.d 1372; CHECK-NEXT: orv d0, p0, z0.d 1373; CHECK-NEXT: fmov x0, d0 1374; CHECK-NEXT: ret 1375; 1376; NONEON-NOSVE-LABEL: orv_v4i64: 1377; NONEON-NOSVE: // %bb.0: 1378; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 1379; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-32]! 1380; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1381; NONEON-NOSVE-NEXT: ldp x9, x8, [sp, #16] 1382; NONEON-NOSVE-NEXT: ldp x11, x10, [sp], #32 1383; NONEON-NOSVE-NEXT: orr x8, x10, x8 1384; NONEON-NOSVE-NEXT: orr x9, x11, x9 1385; NONEON-NOSVE-NEXT: orr x0, x9, x8 1386; NONEON-NOSVE-NEXT: ret 1387 %op = load <4 x i64>, ptr %a 1388 %res = call i64 @llvm.vector.reduce.or.v4i64(<4 x i64> %op) 1389 ret i64 %res 1390} 1391 1392declare i8 @llvm.vector.reduce.and.v4i8(<4 x i8>) 1393declare i8 @llvm.vector.reduce.and.v8i8(<8 x i8>) 1394declare i8 @llvm.vector.reduce.and.v16i8(<16 x i8>) 1395declare i8 @llvm.vector.reduce.and.v32i8(<32 x i8>) 1396 1397declare i16 @llvm.vector.reduce.and.v2i16(<2 x i16>) 1398declare i16 @llvm.vector.reduce.and.v4i16(<4 x i16>) 1399declare i16 @llvm.vector.reduce.and.v8i16(<8 x i16>) 1400declare i16 @llvm.vector.reduce.and.v16i16(<16 x i16>) 1401 1402declare i32 @llvm.vector.reduce.and.v2i32(<2 x i32>) 1403declare i32 @llvm.vector.reduce.and.v4i32(<4 x i32>) 1404declare i32 @llvm.vector.reduce.and.v8i32(<8 x i32>) 1405 1406declare i64 @llvm.vector.reduce.and.v2i64(<2 x i64>) 1407declare i64 @llvm.vector.reduce.and.v4i64(<4 x i64>) 1408 1409declare i8 @llvm.vector.reduce.or.v4i8(<4 x i8>) 1410declare i8 @llvm.vector.reduce.or.v8i8(<8 x i8>) 1411declare i8 @llvm.vector.reduce.or.v16i8(<16 x i8>) 1412declare i8 @llvm.vector.reduce.or.v32i8(<32 x i8>) 1413 1414declare i16 @llvm.vector.reduce.or.v2i16(<2 x i16>) 1415declare i16 @llvm.vector.reduce.or.v4i16(<4 x i16>) 1416declare i16 @llvm.vector.reduce.or.v8i16(<8 x i16>) 1417declare i16 @llvm.vector.reduce.or.v16i16(<16 x i16>) 1418 1419declare i32 @llvm.vector.reduce.or.v2i32(<2 x i32>) 1420declare i32 @llvm.vector.reduce.or.v4i32(<4 x i32>) 1421declare i32 @llvm.vector.reduce.or.v8i32(<8 x i32>) 1422 1423declare i64 @llvm.vector.reduce.or.v2i64(<2 x i64>) 1424declare i64 @llvm.vector.reduce.or.v4i64(<4 x i64>) 1425 1426declare i8 @llvm.vector.reduce.xor.v4i8(<4 x i8>) 1427declare i8 @llvm.vector.reduce.xor.v8i8(<8 x i8>) 1428declare i8 @llvm.vector.reduce.xor.v16i8(<16 x i8>) 1429declare i8 @llvm.vector.reduce.xor.v32i8(<32 x i8>) 1430 1431declare i16 @llvm.vector.reduce.xor.v2i16(<2 x i16>) 1432declare i16 @llvm.vector.reduce.xor.v4i16(<4 x i16>) 1433declare i16 @llvm.vector.reduce.xor.v8i16(<8 x i16>) 1434declare i16 @llvm.vector.reduce.xor.v16i16(<16 x i16>) 1435 1436declare i32 @llvm.vector.reduce.xor.v2i32(<2 x i32>) 1437declare i32 @llvm.vector.reduce.xor.v4i32(<4 x i32>) 1438declare i32 @llvm.vector.reduce.xor.v8i32(<8 x i32>) 1439 1440declare i64 @llvm.vector.reduce.xor.v2i64(<2 x i64>) 1441declare i64 @llvm.vector.reduce.xor.v4i64(<4 x i64>) 1442