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 i32> @test(ptr %arg1, ptr %arg2) { 9; CHECK-LABEL: test: 10; CHECK: // %bb.0: // %entry 11; CHECK-NEXT: ldp q0, q1, [x0, #32] 12; CHECK-NEXT: ldp q3, q4, [x0] 13; CHECK-NEXT: add z2.s, z0.s, z0.s 14; CHECK-NEXT: add z5.s, z1.s, z1.s 15; CHECK-NEXT: mov z0.s, z1.s[2] 16; CHECK-NEXT: add z1.s, z3.s, z3.s 17; CHECK-NEXT: add z3.s, z4.s, z4.s 18; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 19; CHECK-NEXT: stp q2, q5, [x0, #32] 20; CHECK-NEXT: stp q1, q3, [x0] 21; CHECK-NEXT: ret 22; 23; NONEON-NOSVE-LABEL: test: 24; NONEON-NOSVE: // %bb.0: // %entry 25; NONEON-NOSVE-NEXT: sub sp, sp, #144 26; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 144 27; NONEON-NOSVE-NEXT: ldp q1, q0, [x0, #32] 28; NONEON-NOSVE-NEXT: ldp q2, q3, [x0] 29; NONEON-NOSVE-NEXT: str q1, [sp, #64] 30; NONEON-NOSVE-NEXT: stp q0, q3, [sp, #32] 31; NONEON-NOSVE-NEXT: ldr w9, [sp, #60] 32; NONEON-NOSVE-NEXT: str q2, [sp, #16] 33; NONEON-NOSVE-NEXT: ldr w8, [sp, #40] 34; NONEON-NOSVE-NEXT: add w9, w9, w9 35; NONEON-NOSVE-NEXT: stp w8, w8, [sp, #8] 36; NONEON-NOSVE-NEXT: str w9, [sp, #124] 37; NONEON-NOSVE-NEXT: ldr w9, [sp, #56] 38; NONEON-NOSVE-NEXT: stp w8, w8, [sp] 39; NONEON-NOSVE-NEXT: add w8, w8, w8 40; NONEON-NOSVE-NEXT: add w9, w9, w9 41; NONEON-NOSVE-NEXT: ldr q0, [sp] 42; NONEON-NOSVE-NEXT: str w9, [sp, #120] 43; NONEON-NOSVE-NEXT: ldr w9, [sp, #52] 44; NONEON-NOSVE-NEXT: add w9, w9, w9 45; NONEON-NOSVE-NEXT: str w9, [sp, #116] 46; NONEON-NOSVE-NEXT: ldr w9, [sp, #48] 47; NONEON-NOSVE-NEXT: add w9, w9, w9 48; NONEON-NOSVE-NEXT: str w9, [sp, #112] 49; NONEON-NOSVE-NEXT: ldr w9, [sp, #28] 50; NONEON-NOSVE-NEXT: add w9, w9, w9 51; NONEON-NOSVE-NEXT: str w9, [sp, #92] 52; NONEON-NOSVE-NEXT: ldr w9, [sp, #24] 53; NONEON-NOSVE-NEXT: add w9, w9, w9 54; NONEON-NOSVE-NEXT: str w9, [sp, #88] 55; NONEON-NOSVE-NEXT: ldr w9, [sp, #20] 56; NONEON-NOSVE-NEXT: add w9, w9, w9 57; NONEON-NOSVE-NEXT: str w9, [sp, #84] 58; NONEON-NOSVE-NEXT: ldr w9, [sp, #16] 59; NONEON-NOSVE-NEXT: add w9, w9, w9 60; NONEON-NOSVE-NEXT: str w9, [sp, #80] 61; NONEON-NOSVE-NEXT: ldr w9, [sp, #44] 62; NONEON-NOSVE-NEXT: add w9, w9, w9 63; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #104] 64; NONEON-NOSVE-NEXT: ldr w8, [sp, #36] 65; NONEON-NOSVE-NEXT: add w8, w8, w8 66; NONEON-NOSVE-NEXT: str w8, [sp, #100] 67; NONEON-NOSVE-NEXT: ldr w8, [sp, #32] 68; NONEON-NOSVE-NEXT: add w8, w8, w8 69; NONEON-NOSVE-NEXT: str w8, [sp, #96] 70; NONEON-NOSVE-NEXT: ldr w8, [sp, #76] 71; NONEON-NOSVE-NEXT: ldp q4, q2, [sp, #80] 72; NONEON-NOSVE-NEXT: add w8, w8, w8 73; NONEON-NOSVE-NEXT: str w8, [sp, #140] 74; NONEON-NOSVE-NEXT: ldr w8, [sp, #72] 75; NONEON-NOSVE-NEXT: add w8, w8, w8 76; NONEON-NOSVE-NEXT: str w8, [sp, #136] 77; NONEON-NOSVE-NEXT: ldr w8, [sp, #68] 78; NONEON-NOSVE-NEXT: add w8, w8, w8 79; NONEON-NOSVE-NEXT: str w8, [sp, #132] 80; NONEON-NOSVE-NEXT: ldr w8, [sp, #64] 81; NONEON-NOSVE-NEXT: add w8, w8, w8 82; NONEON-NOSVE-NEXT: str w8, [sp, #128] 83; NONEON-NOSVE-NEXT: ldp q3, q1, [sp, #112] 84; NONEON-NOSVE-NEXT: stp q4, q3, [x0] 85; NONEON-NOSVE-NEXT: stp q1, q2, [x0, #32] 86; NONEON-NOSVE-NEXT: add sp, sp, #144 87; NONEON-NOSVE-NEXT: ret 88entry: 89 %0 = load <16 x i32>, ptr %arg1, align 256 90 %1 = load <16 x i32>, ptr %arg2, align 256 91 %shvec = shufflevector <16 x i32> %0, <16 x i32> %1, <4 x i32> <i32 14, i32 14, i32 14, i32 14> 92 %2 = add <16 x i32> %0, %0 93 store <16 x i32> %2, ptr %arg1, align 256 94 ret <4 x i32> %shvec 95} 96 97define <2 x i32> @test2(ptr %arg1, ptr %arg2) { 98; CHECK-LABEL: test2: 99; CHECK: // %bb.0: // %entry 100; CHECK-NEXT: ldp q1, q0, [x0, #32] 101; CHECK-NEXT: ldp q3, q4, [x0] 102; CHECK-NEXT: add z2.s, z0.s, z0.s 103; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 104; CHECK-NEXT: add z1.s, z1.s, z1.s 105; CHECK-NEXT: add z3.s, z3.s, z3.s 106; CHECK-NEXT: add z4.s, z4.s, z4.s 107; CHECK-NEXT: mov z0.s, s0 108; CHECK-NEXT: stp q1, q2, [x0, #32] 109; CHECK-NEXT: stp q3, q4, [x0] 110; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 111; CHECK-NEXT: ret 112; 113; NONEON-NOSVE-LABEL: test2: 114; NONEON-NOSVE: // %bb.0: // %entry 115; NONEON-NOSVE-NEXT: sub sp, sp, #144 116; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 144 117; NONEON-NOSVE-NEXT: ldp q1, q0, [x0, #32] 118; NONEON-NOSVE-NEXT: ldp q2, q3, [x0] 119; NONEON-NOSVE-NEXT: str q1, [sp, #64] 120; NONEON-NOSVE-NEXT: stp q0, q3, [sp, #32] 121; NONEON-NOSVE-NEXT: ldr d0, [sp, #40] 122; NONEON-NOSVE-NEXT: str q2, [sp, #16] 123; NONEON-NOSVE-NEXT: str d0, [sp] 124; NONEON-NOSVE-NEXT: ldr w8, [sp] 125; NONEON-NOSVE-NEXT: stp w8, w8, [sp, #8] 126; NONEON-NOSVE-NEXT: ldr w8, [sp, #60] 127; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 128; NONEON-NOSVE-NEXT: add w8, w8, w8 129; NONEON-NOSVE-NEXT: str w8, [sp, #124] 130; NONEON-NOSVE-NEXT: ldr w8, [sp, #56] 131; NONEON-NOSVE-NEXT: add w8, w8, w8 132; NONEON-NOSVE-NEXT: str w8, [sp, #120] 133; NONEON-NOSVE-NEXT: ldr w8, [sp, #52] 134; NONEON-NOSVE-NEXT: add w8, w8, w8 135; NONEON-NOSVE-NEXT: str w8, [sp, #116] 136; NONEON-NOSVE-NEXT: ldr w8, [sp, #48] 137; NONEON-NOSVE-NEXT: add w8, w8, w8 138; NONEON-NOSVE-NEXT: str w8, [sp, #112] 139; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 140; NONEON-NOSVE-NEXT: add w8, w8, w8 141; NONEON-NOSVE-NEXT: str w8, [sp, #92] 142; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 143; NONEON-NOSVE-NEXT: add w8, w8, w8 144; NONEON-NOSVE-NEXT: str w8, [sp, #88] 145; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 146; NONEON-NOSVE-NEXT: add w8, w8, w8 147; NONEON-NOSVE-NEXT: str w8, [sp, #84] 148; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 149; NONEON-NOSVE-NEXT: add w8, w8, w8 150; NONEON-NOSVE-NEXT: str w8, [sp, #80] 151; NONEON-NOSVE-NEXT: ldr w8, [sp, #44] 152; NONEON-NOSVE-NEXT: add w8, w8, w8 153; NONEON-NOSVE-NEXT: str w8, [sp, #108] 154; NONEON-NOSVE-NEXT: ldr w8, [sp, #40] 155; NONEON-NOSVE-NEXT: add w8, w8, w8 156; NONEON-NOSVE-NEXT: str w8, [sp, #104] 157; NONEON-NOSVE-NEXT: ldr w8, [sp, #36] 158; NONEON-NOSVE-NEXT: add w8, w8, w8 159; NONEON-NOSVE-NEXT: str w8, [sp, #100] 160; NONEON-NOSVE-NEXT: ldr w8, [sp, #32] 161; NONEON-NOSVE-NEXT: add w8, w8, w8 162; NONEON-NOSVE-NEXT: str w8, [sp, #96] 163; NONEON-NOSVE-NEXT: ldr w8, [sp, #76] 164; NONEON-NOSVE-NEXT: ldp q4, q2, [sp, #80] 165; NONEON-NOSVE-NEXT: add w8, w8, w8 166; NONEON-NOSVE-NEXT: str w8, [sp, #140] 167; NONEON-NOSVE-NEXT: ldr w8, [sp, #72] 168; NONEON-NOSVE-NEXT: add w8, w8, w8 169; NONEON-NOSVE-NEXT: str w8, [sp, #136] 170; NONEON-NOSVE-NEXT: ldr w8, [sp, #68] 171; NONEON-NOSVE-NEXT: add w8, w8, w8 172; NONEON-NOSVE-NEXT: str w8, [sp, #132] 173; NONEON-NOSVE-NEXT: ldr w8, [sp, #64] 174; NONEON-NOSVE-NEXT: add w8, w8, w8 175; NONEON-NOSVE-NEXT: str w8, [sp, #128] 176; NONEON-NOSVE-NEXT: ldp q3, q1, [sp, #112] 177; NONEON-NOSVE-NEXT: stp q4, q3, [x0] 178; NONEON-NOSVE-NEXT: stp q1, q2, [x0, #32] 179; NONEON-NOSVE-NEXT: add sp, sp, #144 180; NONEON-NOSVE-NEXT: ret 181entry: 182 %0 = load <16 x i32>, ptr %arg1, align 256 183 %1 = load <16 x i32>, ptr %arg2, align 256 184 %shvec = shufflevector <16 x i32> %0, <16 x i32> %1, <2 x i32> <i32 14, i32 14> 185 %2 = add <16 x i32> %0, %0 186 store <16 x i32> %2, ptr %arg1, align 256 187 ret <2 x i32> %shvec 188} 189