1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4 2; RUN: llc < %s | FileCheck %s 3; RUN: llc -aarch64-sve-vector-bits-min=256 < %s | FileCheck %s 4; RUN: llc -aarch64-sve-vector-bits-min=512 < %s | FileCheck %s 5 6target triple = "aarch64-unknown-linux-gnu" 7 8declare void @foo_v32i8(<32 x i8>) 9define void @test_v32i8(<32 x i8> %unused, <32 x i8> %a) #0 { 10; CHECK-LABEL: test_v32i8: 11; CHECK: // %bb.0: 12; CHECK-NEXT: mov v1.16b, v3.16b 13; CHECK-NEXT: mov v0.16b, v2.16b 14; CHECK-NEXT: b foo_v32i8 15 tail call void @foo_v32i8(<32 x i8> %a) 16 ret void 17} 18 19declare void @foo_v16i16(<16 x i16>) 20define void @test_v16i16(<16 x i16> %unused, <16 x i16> %a) #0 { 21; CHECK-LABEL: test_v16i16: 22; CHECK: // %bb.0: 23; CHECK-NEXT: mov v1.16b, v3.16b 24; CHECK-NEXT: mov v0.16b, v2.16b 25; CHECK-NEXT: b foo_v16i16 26 tail call void @foo_v16i16(<16 x i16> %a) 27 ret void 28} 29 30declare void @foo_v8i32(<8 x i32>) 31define void @test_v8i32(<8 x i32> %unused, <8 x i32> %a) #0 { 32; CHECK-LABEL: test_v8i32: 33; CHECK: // %bb.0: 34; CHECK-NEXT: mov v1.16b, v3.16b 35; CHECK-NEXT: mov v0.16b, v2.16b 36; CHECK-NEXT: b foo_v8i32 37 tail call void @foo_v8i32(<8 x i32> %a) 38 ret void 39} 40 41declare void @foo_v4i64(<4 x i64>) 42define void @test_v4i64(<4 x i64> %unused, <4 x i64> %a) #0 { 43; CHECK-LABEL: test_v4i64: 44; CHECK: // %bb.0: 45; CHECK-NEXT: mov v1.16b, v3.16b 46; CHECK-NEXT: mov v0.16b, v2.16b 47; CHECK-NEXT: b foo_v4i64 48 tail call void @foo_v4i64(<4 x i64> %a) 49 ret void 50} 51 52declare void @foo_v16f16(<16 x half>) 53define void @test_v16f16(<16 x half> %unused, <16 x half> %a) #0 { 54; CHECK-LABEL: test_v16f16: 55; CHECK: // %bb.0: 56; CHECK-NEXT: mov v1.16b, v3.16b 57; CHECK-NEXT: mov v0.16b, v2.16b 58; CHECK-NEXT: b foo_v16f16 59 tail call void @foo_v16f16(<16 x half> %a) 60 ret void 61} 62 63declare void @foo_v8f32(<8 x float>) 64define void @test_v8f32(<8 x float> %unused, <8 x float> %a) #0 { 65; CHECK-LABEL: test_v8f32: 66; CHECK: // %bb.0: 67; CHECK-NEXT: mov v1.16b, v3.16b 68; CHECK-NEXT: mov v0.16b, v2.16b 69; CHECK-NEXT: b foo_v8f32 70 tail call void @foo_v8f32(<8 x float> %a) 71 ret void 72} 73 74declare void @foo_v4f64(<4 x double>) 75define void @test_v4f64(<4 x double> %unused, <4 x double> %a) #0 { 76; CHECK-LABEL: test_v4f64: 77; CHECK: // %bb.0: 78; CHECK-NEXT: mov v1.16b, v3.16b 79; CHECK-NEXT: mov v0.16b, v2.16b 80; CHECK-NEXT: b foo_v4f64 81 tail call void @foo_v4f64(<4 x double> %a) 82 ret void 83} 84 85declare void @foo_v16bf16(<16 x bfloat>) 86define void @test_v16bf16(<16 x bfloat> %unused, <16 x bfloat> %a) #0 { 87; CHECK-LABEL: test_v16bf16: 88; CHECK: // %bb.0: 89; CHECK-NEXT: mov v1.16b, v3.16b 90; CHECK-NEXT: mov v0.16b, v2.16b 91; CHECK-NEXT: b foo_v16bf16 92 tail call void @foo_v16bf16(<16 x bfloat> %a) 93 ret void 94} 95 96declare void @foo_v3i64(<3 x i64>) 97define void @test_v3i64(<3 x i64> %unused, <3 x i64> %a) #0 { 98; CHECK-LABEL: test_v3i64: 99; CHECK: // %bb.0: 100; CHECK-NEXT: fmov d2, d5 101; CHECK-NEXT: fmov d1, d4 102; CHECK-NEXT: fmov d0, d3 103; CHECK-NEXT: b foo_v3i64 104 tail call void @foo_v3i64(<3 x i64> %a) 105 ret void 106} 107 108declare void @foo_v5i64(<5 x i64>) 109define void @test_v5i64(<5 x i64> %unused, <5 x i64> %a) #0 { 110; CHECK-LABEL: test_v5i64: 111; CHECK: // %bb.0: 112; CHECK-NEXT: fmov d1, d6 113; CHECK-NEXT: fmov d0, d5 114; CHECK-NEXT: fmov d2, d7 115; CHECK-NEXT: ldp d3, d4, [sp] 116; CHECK-NEXT: b foo_v5i64 117 tail call void @foo_v5i64(<5 x i64> %a) 118 ret void 119} 120 121declare void @foo_v1i16(<1 x i16>) 122define void @test_v1i16(<1 x i16> %unused, <1 x i16> %a) #0 { 123; CHECK-LABEL: test_v1i16: 124; CHECK: // %bb.0: 125; CHECK-NEXT: fmov d0, d1 126; CHECK-NEXT: b foo_v1i16 127 tail call void @foo_v1i16(<1 x i16> %a) 128 ret void 129} 130 131declare void @foo_v9i16(<9 x i16>) 132define void @test_v9i16(<9 x i16> %unused, <9 x i16> %a) #0 { 133; CHECK-LABEL: test_v9i16: 134; CHECK: // %bb.0: 135; CHECK-NEXT: ldr w0, [sp, #8] 136; CHECK-NEXT: ldr w1, [sp, #16] 137; CHECK-NEXT: ldr w2, [sp, #24] 138; CHECK-NEXT: ldr w3, [sp, #32] 139; CHECK-NEXT: ldr w4, [sp, #40] 140; CHECK-NEXT: ldr w5, [sp, #48] 141; CHECK-NEXT: ldr w6, [sp, #56] 142; CHECK-NEXT: ldr w7, [sp, #64] 143; CHECK-NEXT: ldr w8, [sp, #72] 144; CHECK-NEXT: str w8, [sp] 145; CHECK-NEXT: b foo_v9i16 146 tail call void @foo_v9i16(<9 x i16> %a) 147 ret void 148} 149 150declare void @foo_v16i1(<16 x i1>) 151define void @test_v16i1(<16 x i1> %unused, <16 x i1> %a) #0 { 152; CHECK-LABEL: test_v16i1: 153; CHECK: // %bb.0: 154; CHECK-NEXT: mov v0.16b, v1.16b 155; CHECK-NEXT: b foo_v16i1 156 tail call void @foo_v16i1(<16 x i1> %a) 157 ret void 158} 159 160; UTC_ARGS: --disable 161; The output from this test is large and generally not useful, what matters is 162; no vector registers are used. 163declare void @foo_v32i1(<32 x i1>) 164define void @test_v32i1(<32 x i1> %unused, <32 x i1> %a) #0 { 165; CHECK-LABEL: test_v32i1: 166; CHECK: // %bb.0: 167; CHECK-NOT: [q,v,z][0-9]+ 168; CHECK: b foo_v32i1 169 tail call void @foo_v32i1(<32 x i1> %a) 170 ret void 171} 172; UTC_ARGS: --enable 173 174declare void @foo_v1i128(<1 x i128>) 175define void @test_v1i128(<1 x i128> %unused, <1 x i128> %a) #0 { 176; CHECK-LABEL: test_v1i128: 177; CHECK: // %bb.0: 178; CHECK-NEXT: mov x1, x3 179; CHECK-NEXT: mov x0, x2 180; CHECK-NEXT: b foo_v1i128 181 tail call void @foo_v1i128(<1 x i128> %a) 182 ret void 183} 184 185declare void @foo_v2i128(<2 x i128>) 186define void @test_v2i128(<2 x i128> %unused, <2 x i128> %a) #0 { 187; CHECK-LABEL: test_v2i128: 188; CHECK: // %bb.0: 189; CHECK-NEXT: mov x3, x7 190; CHECK-NEXT: mov x2, x6 191; CHECK-NEXT: mov x0, x4 192; CHECK-NEXT: mov x1, x5 193; CHECK-NEXT: b foo_v2i128 194 tail call void @foo_v2i128(<2 x i128> %a) 195 ret void 196} 197 198declare void @foo_v1i256(<1 x i256>) 199define void @test_v1i256(<1 x i256> %unused, <1 x i256> %a) #0 { 200; CHECK-LABEL: test_v1i256: 201; CHECK: // %bb.0: 202; CHECK-NEXT: mov x3, x7 203; CHECK-NEXT: mov x2, x6 204; CHECK-NEXT: mov x0, x4 205; CHECK-NEXT: mov x1, x5 206; CHECK-NEXT: b foo_v1i256 207 tail call void @foo_v1i256(<1 x i256> %a) 208 ret void 209} 210 211declare void @foo_v2i256(<2 x i256>) 212define void @test_v2i256(<2 x i256> %unused, <2 x i256> %a) #0 { 213; CHECK-LABEL: test_v2i256: 214; CHECK: // %bb.0: 215; CHECK-NEXT: ldp x0, x1, [sp] 216; CHECK-NEXT: ldp x2, x3, [sp, #16] 217; CHECK-NEXT: ldp x4, x5, [sp, #32] 218; CHECK-NEXT: ldp x6, x7, [sp, #48] 219; CHECK-NEXT: b foo_v2i256 220 tail call void @foo_v2i256(<2 x i256> %a) 221 ret void 222} 223 224declare void @foo_v1f128(<1 x fp128>) 225define void @test_v1f128(<1 x fp128> %unused, <1 x fp128> %a) #0 { 226; CHECK-LABEL: test_v1f128: 227; CHECK: // %bb.0: 228; CHECK-NEXT: mov v0.16b, v1.16b 229; CHECK-NEXT: b foo_v1f128 230 tail call void @foo_v1f128(<1 x fp128> %a) 231 ret void 232} 233 234declare void @foo_v2f128(<2 x fp128>) 235define void @test_v2f128(<2 x fp128> %unused, <2 x fp128> %a) #0 { 236; CHECK-LABEL: test_v2f128: 237; CHECK: // %bb.0: 238; CHECK-NEXT: mov v1.16b, v3.16b 239; CHECK-NEXT: mov v0.16b, v2.16b 240; CHECK-NEXT: b foo_v2f128 241 tail call void @foo_v2f128(<2 x fp128> %a) 242 ret void 243} 244 245attributes #0 = { "target-features"="+sve,+bf16" nounwind } 246