385 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=aarch64-unknown-linux-gnu -O0 -global-isel=0 -o - < %s | FileCheck %s --check-prefixes=CHECK,CHECK-SD3; RUN: llc -mtriple=aarch64-unknown-linux-gnu -O0 -global-isel=1 -global-isel-abort=1 -o - < %s | FileCheck %s --check-prefixes=CHECK,CHECK-GI4 5target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32"6 7%struct.__va_list = type { ptr, ptr, ptr, i32, i32 }8 9declare void @llvm.va_start(ptr) nounwind10declare void @llvm.va_end(ptr) nounwind11declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture)12declare void @llvm.va_start.p0(ptr)13declare void @llvm.va_end.p0(ptr)14declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture)15 16define i64 @vararg(...) #0 {17; CHECK-SD-LABEL: vararg:18; CHECK-SD: // %bb.0: // %entry19; CHECK-SD-NEXT: sub sp, sp, #22420; CHECK-SD-NEXT: .cfi_def_cfa_offset 22421; CHECK-SD-NEXT: stp x29, x30, [sp, #208] // 16-byte Folded Spill22; CHECK-SD-NEXT: add x29, sp, #20823; CHECK-SD-NEXT: .cfi_def_cfa w29, 1624; CHECK-SD-NEXT: .cfi_offset w30, -825; CHECK-SD-NEXT: .cfi_offset w29, -1626; CHECK-SD-NEXT: str q7, [sp, #112]27; CHECK-SD-NEXT: str q6, [sp, #96]28; CHECK-SD-NEXT: str q5, [sp, #80]29; CHECK-SD-NEXT: str q4, [sp, #64]30; CHECK-SD-NEXT: str q3, [sp, #48]31; CHECK-SD-NEXT: str q2, [sp, #32]32; CHECK-SD-NEXT: str q1, [sp, #16]33; CHECK-SD-NEXT: str q0, [sp]34; CHECK-SD-NEXT: stur x7, [x29, #-16]35; CHECK-SD-NEXT: stur x6, [x29, #-24]36; CHECK-SD-NEXT: stur x5, [x29, #-32]37; CHECK-SD-NEXT: stur x4, [x29, #-40]38; CHECK-SD-NEXT: stur x3, [x29, #-48]39; CHECK-SD-NEXT: stur x2, [x29, #-56]40; CHECK-SD-NEXT: stur x1, [x29, #-64]41; CHECK-SD-NEXT: stur x0, [x29, #-72]42; CHECK-SD-NEXT: mov w8, #-128 // =0xffffff8043; CHECK-SD-NEXT: str w8, [x29, #20]44; CHECK-SD-NEXT: mov w8, #-64 // =0xffffffc045; CHECK-SD-NEXT: str w8, [x29, #16]46; CHECK-SD-NEXT: add x8, x29, #1647; CHECK-SD-NEXT: stur x8, [x29, #-8]48; CHECK-SD-NEXT: mov x8, sp49; CHECK-SD-NEXT: add x8, x8, #12850; CHECK-SD-NEXT: str x8, [x29, #8]51; CHECK-SD-NEXT: sub x8, x29, #7252; CHECK-SD-NEXT: add x8, x8, #6453; CHECK-SD-NEXT: str x8, [x29]54; CHECK-SD-NEXT: mov w8, #1 // =0x155; CHECK-SD-NEXT: mov w0, w856; CHECK-SD-NEXT: .cfi_def_cfa wsp, 22457; CHECK-SD-NEXT: ldp x29, x30, [sp, #208] // 16-byte Folded Reload58; CHECK-SD-NEXT: add sp, sp, #22459; CHECK-SD-NEXT: .cfi_def_cfa_offset 060; CHECK-SD-NEXT: .cfi_restore w3061; CHECK-SD-NEXT: .cfi_restore w2962; CHECK-SD-NEXT: ret63;64; CHECK-GI-LABEL: vararg:65; CHECK-GI: // %bb.0: // %entry66; CHECK-GI-NEXT: sub sp, sp, #22467; CHECK-GI-NEXT: .cfi_def_cfa_offset 22468; CHECK-GI-NEXT: stp x29, x30, [sp, #208] // 16-byte Folded Spill69; CHECK-GI-NEXT: add x29, sp, #20870; CHECK-GI-NEXT: .cfi_def_cfa w29, 1671; CHECK-GI-NEXT: .cfi_offset w30, -872; CHECK-GI-NEXT: .cfi_offset w29, -1673; CHECK-GI-NEXT: stur x0, [x29, #-64]74; CHECK-GI-NEXT: stur x1, [x29, #-56]75; CHECK-GI-NEXT: stur x2, [x29, #-48]76; CHECK-GI-NEXT: stur x3, [x29, #-40]77; CHECK-GI-NEXT: stur x4, [x29, #-32]78; CHECK-GI-NEXT: stur x5, [x29, #-24]79; CHECK-GI-NEXT: stur x6, [x29, #-16]80; CHECK-GI-NEXT: stur x7, [x29, #-8]81; CHECK-GI-NEXT: str q0, [sp, #16]82; CHECK-GI-NEXT: str q1, [sp, #32]83; CHECK-GI-NEXT: str q2, [sp, #48]84; CHECK-GI-NEXT: str q3, [sp, #64]85; CHECK-GI-NEXT: str q4, [sp, #80]86; CHECK-GI-NEXT: str q5, [sp, #96]87; CHECK-GI-NEXT: str q6, [sp, #112]88; CHECK-GI-NEXT: str q7, [sp, #128]89; CHECK-GI-NEXT: add x9, sp, #890; CHECK-GI-NEXT: add x8, x29, #1691; CHECK-GI-NEXT: str x8, [x9]92; CHECK-GI-NEXT: add x8, x29, #093; CHECK-GI-NEXT: str x8, [x9, #8]94; CHECK-GI-NEXT: add x8, sp, #14495; CHECK-GI-NEXT: str x8, [x9, #16]96; CHECK-GI-NEXT: mov w8, #-64 // =0xffffffc097; CHECK-GI-NEXT: str w8, [x9, #24]98; CHECK-GI-NEXT: mov w8, #-128 // =0xffffff8099; CHECK-GI-NEXT: str w8, [x9, #28]100; CHECK-GI-NEXT: mov w8, #1 // =0x1101; CHECK-GI-NEXT: mov w0, w8102; CHECK-GI-NEXT: .cfi_def_cfa wsp, 224103; CHECK-GI-NEXT: ldp x29, x30, [sp, #208] // 16-byte Folded Reload104; CHECK-GI-NEXT: add sp, sp, #224105; CHECK-GI-NEXT: .cfi_def_cfa_offset 0106; CHECK-GI-NEXT: .cfi_restore w30107; CHECK-GI-NEXT: .cfi_restore w29108; CHECK-GI-NEXT: ret109entry:110 %g = alloca ptr, align 4111 call void @llvm.va_start(ptr %g)112 ret i64 1113}114 115define i64 @vararg_many_gpr(i64 %a1, i64 %a2, i64 %a3, i64 %a4, i64 %a5, i64 %a6, i64 %a7, ...) #0 {116; CHECK-SD-LABEL: vararg_many_gpr:117; CHECK-SD: // %bb.0: // %entry118; CHECK-SD-NEXT: sub sp, sp, #160119; CHECK-SD-NEXT: .cfi_def_cfa_offset 160120; CHECK-SD-NEXT: stp x29, x30, [sp, #144] // 16-byte Folded Spill121; CHECK-SD-NEXT: add x29, sp, #144122; CHECK-SD-NEXT: .cfi_def_cfa w29, 16123; CHECK-SD-NEXT: .cfi_offset w30, -8124; CHECK-SD-NEXT: .cfi_offset w29, -16125; CHECK-SD-NEXT: str q7, [sp, #112]126; CHECK-SD-NEXT: str q6, [sp, #96]127; CHECK-SD-NEXT: str q5, [sp, #80]128; CHECK-SD-NEXT: str q4, [sp, #64]129; CHECK-SD-NEXT: str q3, [sp, #48]130; CHECK-SD-NEXT: str q2, [sp, #32]131; CHECK-SD-NEXT: str q1, [sp, #16]132; CHECK-SD-NEXT: str q0, [sp]133; CHECK-SD-NEXT: stur x7, [x29, #-16]134; CHECK-SD-NEXT: mov w8, #-128 // =0xffffff80135; CHECK-SD-NEXT: str w8, [x29, #20]136; CHECK-SD-NEXT: mov w8, #-8 // =0xfffffff8137; CHECK-SD-NEXT: str w8, [x29, #16]138; CHECK-SD-NEXT: add x8, x29, #16139; CHECK-SD-NEXT: stur x8, [x29, #-8]140; CHECK-SD-NEXT: mov x8, sp141; CHECK-SD-NEXT: add x8, x8, #128142; CHECK-SD-NEXT: str x8, [x29, #8]143; CHECK-SD-NEXT: sub x8, x29, #16144; CHECK-SD-NEXT: add x8, x8, #8145; CHECK-SD-NEXT: str x8, [x29]146; CHECK-SD-NEXT: mov w8, #1 // =0x1147; CHECK-SD-NEXT: mov w0, w8148; CHECK-SD-NEXT: .cfi_def_cfa wsp, 160149; CHECK-SD-NEXT: ldp x29, x30, [sp, #144] // 16-byte Folded Reload150; CHECK-SD-NEXT: add sp, sp, #160151; CHECK-SD-NEXT: .cfi_def_cfa_offset 0152; CHECK-SD-NEXT: .cfi_restore w30153; CHECK-SD-NEXT: .cfi_restore w29154; CHECK-SD-NEXT: ret155;156; CHECK-GI-LABEL: vararg_many_gpr:157; CHECK-GI: // %bb.0: // %entry158; CHECK-GI-NEXT: sub sp, sp, #176159; CHECK-GI-NEXT: .cfi_def_cfa_offset 176160; CHECK-GI-NEXT: stp x29, x30, [sp, #160] // 16-byte Folded Spill161; CHECK-GI-NEXT: add x29, sp, #160162; CHECK-GI-NEXT: .cfi_def_cfa w29, 16163; CHECK-GI-NEXT: .cfi_offset w30, -8164; CHECK-GI-NEXT: .cfi_offset w29, -16165; CHECK-GI-NEXT: stur x7, [x29, #-8]166; CHECK-GI-NEXT: str q0, [sp, #16]167; CHECK-GI-NEXT: str q1, [sp, #32]168; CHECK-GI-NEXT: str q2, [sp, #48]169; CHECK-GI-NEXT: str q3, [sp, #64]170; CHECK-GI-NEXT: str q4, [sp, #80]171; CHECK-GI-NEXT: str q5, [sp, #96]172; CHECK-GI-NEXT: str q6, [sp, #112]173; CHECK-GI-NEXT: str q7, [sp, #128]174; CHECK-GI-NEXT: add x9, sp, #8175; CHECK-GI-NEXT: add x8, x29, #16176; CHECK-GI-NEXT: str x8, [x9]177; CHECK-GI-NEXT: add x8, x29, #0178; CHECK-GI-NEXT: str x8, [x9, #8]179; CHECK-GI-NEXT: add x8, sp, #144180; CHECK-GI-NEXT: str x8, [x9, #16]181; CHECK-GI-NEXT: mov w8, #-8 // =0xfffffff8182; CHECK-GI-NEXT: str w8, [x9, #24]183; CHECK-GI-NEXT: mov w8, #-128 // =0xffffff80184; CHECK-GI-NEXT: str w8, [x9, #28]185; CHECK-GI-NEXT: mov w8, #1 // =0x1186; CHECK-GI-NEXT: mov w0, w8187; CHECK-GI-NEXT: .cfi_def_cfa wsp, 176188; CHECK-GI-NEXT: ldp x29, x30, [sp, #160] // 16-byte Folded Reload189; CHECK-GI-NEXT: add sp, sp, #176190; CHECK-GI-NEXT: .cfi_def_cfa_offset 0191; CHECK-GI-NEXT: .cfi_restore w30192; CHECK-GI-NEXT: .cfi_restore w29193; CHECK-GI-NEXT: ret194entry:195 %g = alloca ptr, align 4196 call void @llvm.va_start(ptr %g)197 ret i64 1198}199 200define i64 @vararg_many_float(float %a1, float %a2, float %a3, float %a4, float %a5, float %a6, float %a7, ...) #0 {201; CHECK-SD-LABEL: vararg_many_float:202; CHECK-SD: // %bb.0: // %entry203; CHECK-SD-NEXT: sub sp, sp, #112204; CHECK-SD-NEXT: .cfi_def_cfa_offset 112205; CHECK-SD-NEXT: stp x29, x30, [sp, #96] // 16-byte Folded Spill206; CHECK-SD-NEXT: add x29, sp, #96207; CHECK-SD-NEXT: .cfi_def_cfa w29, 16208; CHECK-SD-NEXT: .cfi_offset w30, -8209; CHECK-SD-NEXT: .cfi_offset w29, -16210; CHECK-SD-NEXT: str q7, [sp]211; CHECK-SD-NEXT: str x7, [sp, #80]212; CHECK-SD-NEXT: str x6, [sp, #72]213; CHECK-SD-NEXT: str x5, [sp, #64]214; CHECK-SD-NEXT: str x4, [sp, #56]215; CHECK-SD-NEXT: str x3, [sp, #48]216; CHECK-SD-NEXT: str x2, [sp, #40]217; CHECK-SD-NEXT: str x1, [sp, #32]218; CHECK-SD-NEXT: str x0, [sp, #24]219; CHECK-SD-NEXT: mov w8, #-16 // =0xfffffff0220; CHECK-SD-NEXT: str w8, [x29, #20]221; CHECK-SD-NEXT: mov w8, #-64 // =0xffffffc0222; CHECK-SD-NEXT: str w8, [x29, #16]223; CHECK-SD-NEXT: add x8, x29, #16224; CHECK-SD-NEXT: stur x8, [x29, #-8]225; CHECK-SD-NEXT: mov x8, sp226; CHECK-SD-NEXT: add x8, x8, #16227; CHECK-SD-NEXT: str x8, [x29, #8]228; CHECK-SD-NEXT: add x8, sp, #24229; CHECK-SD-NEXT: add x8, x8, #64230; CHECK-SD-NEXT: str x8, [x29]231; CHECK-SD-NEXT: mov w8, #1 // =0x1232; CHECK-SD-NEXT: mov w0, w8233; CHECK-SD-NEXT: .cfi_def_cfa wsp, 112234; CHECK-SD-NEXT: ldp x29, x30, [sp, #96] // 16-byte Folded Reload235; CHECK-SD-NEXT: add sp, sp, #112236; CHECK-SD-NEXT: .cfi_def_cfa_offset 0237; CHECK-SD-NEXT: .cfi_restore w30238; CHECK-SD-NEXT: .cfi_restore w29239; CHECK-SD-NEXT: ret240;241; CHECK-GI-LABEL: vararg_many_float:242; CHECK-GI: // %bb.0: // %entry243; CHECK-GI-NEXT: sub sp, sp, #112244; CHECK-GI-NEXT: .cfi_def_cfa_offset 112245; CHECK-GI-NEXT: stp x29, x30, [sp, #96] // 16-byte Folded Spill246; CHECK-GI-NEXT: add x29, sp, #96247; CHECK-GI-NEXT: .cfi_def_cfa w29, 16248; CHECK-GI-NEXT: .cfi_offset w30, -8249; CHECK-GI-NEXT: .cfi_offset w29, -16250; CHECK-GI-NEXT: str x0, [sp, #32]251; CHECK-GI-NEXT: str x1, [sp, #40]252; CHECK-GI-NEXT: str x2, [sp, #48]253; CHECK-GI-NEXT: str x3, [sp, #56]254; CHECK-GI-NEXT: str x4, [sp, #64]255; CHECK-GI-NEXT: str x5, [sp, #72]256; CHECK-GI-NEXT: str x6, [sp, #80]257; CHECK-GI-NEXT: str x7, [sp, #88]258; CHECK-GI-NEXT: str q7, [sp, #16]259; CHECK-GI-NEXT: add x9, sp, #8260; CHECK-GI-NEXT: add x8, x29, #16261; CHECK-GI-NEXT: str x8, [x9]262; CHECK-GI-NEXT: add x8, sp, #96263; CHECK-GI-NEXT: str x8, [x9, #8]264; CHECK-GI-NEXT: add x8, sp, #32265; CHECK-GI-NEXT: str x8, [x9, #16]266; CHECK-GI-NEXT: mov w8, #-64 // =0xffffffc0267; CHECK-GI-NEXT: str w8, [x9, #24]268; CHECK-GI-NEXT: mov w8, #-16 // =0xfffffff0269; CHECK-GI-NEXT: str w8, [x9, #28]270; CHECK-GI-NEXT: mov w8, #1 // =0x1271; CHECK-GI-NEXT: mov w0, w8272; CHECK-GI-NEXT: .cfi_def_cfa wsp, 112273; CHECK-GI-NEXT: ldp x29, x30, [sp, #96] // 16-byte Folded Reload274; CHECK-GI-NEXT: add sp, sp, #112275; CHECK-GI-NEXT: .cfi_def_cfa_offset 0276; CHECK-GI-NEXT: .cfi_restore w30277; CHECK-GI-NEXT: .cfi_restore w29278; CHECK-GI-NEXT: ret279entry:280 %g = alloca ptr, align 4281 call void @llvm.va_start(ptr %g)282 ret i64 1283}284 285define i64 @gpr1_fpr1(i32 %i, float %f, ...) #0 {286; CHECK-SD-LABEL: gpr1_fpr1:287; CHECK-SD: // %bb.0: // %entry288; CHECK-SD-NEXT: sub sp, sp, #192289; CHECK-SD-NEXT: .cfi_def_cfa_offset 192290; CHECK-SD-NEXT: stp x29, x30, [sp, #176] // 16-byte Folded Spill291; CHECK-SD-NEXT: add x29, sp, #176292; CHECK-SD-NEXT: .cfi_def_cfa w29, 16293; CHECK-SD-NEXT: .cfi_offset w30, -8294; CHECK-SD-NEXT: .cfi_offset w29, -16295; CHECK-SD-NEXT: str q7, [sp, #96]296; CHECK-SD-NEXT: str q6, [sp, #80]297; CHECK-SD-NEXT: str q5, [sp, #64]298; CHECK-SD-NEXT: str q4, [sp, #48]299; CHECK-SD-NEXT: str q3, [sp, #32]300; CHECK-SD-NEXT: str q2, [sp, #16]301; CHECK-SD-NEXT: str q1, [sp]302; CHECK-SD-NEXT: stur x7, [x29, #-16]303; CHECK-SD-NEXT: stur x6, [x29, #-24]304; CHECK-SD-NEXT: stur x5, [x29, #-32]305; CHECK-SD-NEXT: stur x4, [x29, #-40]306; CHECK-SD-NEXT: stur x3, [x29, #-48]307; CHECK-SD-NEXT: stur x2, [x29, #-56]308; CHECK-SD-NEXT: stur x1, [x29, #-64]309; CHECK-SD-NEXT: mov w8, #-112 // =0xffffff90310; CHECK-SD-NEXT: str w8, [x29, #20]311; CHECK-SD-NEXT: mov w8, #-56 // =0xffffffc8312; CHECK-SD-NEXT: str w8, [x29, #16]313; CHECK-SD-NEXT: add x8, x29, #16314; CHECK-SD-NEXT: stur x8, [x29, #-8]315; CHECK-SD-NEXT: mov x8, sp316; CHECK-SD-NEXT: add x8, x8, #112317; CHECK-SD-NEXT: str x8, [x29, #8]318; CHECK-SD-NEXT: sub x8, x29, #64319; CHECK-SD-NEXT: add x8, x8, #56320; CHECK-SD-NEXT: str x8, [x29]321; CHECK-SD-NEXT: mov w8, #1 // =0x1322; CHECK-SD-NEXT: mov w0, w8323; CHECK-SD-NEXT: .cfi_def_cfa wsp, 192324; CHECK-SD-NEXT: ldp x29, x30, [sp, #176] // 16-byte Folded Reload325; CHECK-SD-NEXT: add sp, sp, #192326; CHECK-SD-NEXT: .cfi_def_cfa_offset 0327; CHECK-SD-NEXT: .cfi_restore w30328; CHECK-SD-NEXT: .cfi_restore w29329; CHECK-SD-NEXT: ret330;331; CHECK-GI-LABEL: gpr1_fpr1:332; CHECK-GI: // %bb.0: // %entry333; CHECK-GI-NEXT: sub sp, sp, #208334; CHECK-GI-NEXT: .cfi_def_cfa_offset 208335; CHECK-GI-NEXT: stp x29, x30, [sp, #192] // 16-byte Folded Spill336; CHECK-GI-NEXT: add x29, sp, #192337; CHECK-GI-NEXT: .cfi_def_cfa w29, 16338; CHECK-GI-NEXT: .cfi_offset w30, -8339; CHECK-GI-NEXT: .cfi_offset w29, -16340; CHECK-GI-NEXT: stur x1, [x29, #-56]341; CHECK-GI-NEXT: stur x2, [x29, #-48]342; CHECK-GI-NEXT: stur x3, [x29, #-40]343; CHECK-GI-NEXT: stur x4, [x29, #-32]344; CHECK-GI-NEXT: stur x5, [x29, #-24]345; CHECK-GI-NEXT: stur x6, [x29, #-16]346; CHECK-GI-NEXT: stur x7, [x29, #-8]347; CHECK-GI-NEXT: str q1, [sp, #16]348; CHECK-GI-NEXT: str q2, [sp, #32]349; CHECK-GI-NEXT: str q3, [sp, #48]350; CHECK-GI-NEXT: str q4, [sp, #64]351; CHECK-GI-NEXT: str q5, [sp, #80]352; CHECK-GI-NEXT: str q6, [sp, #96]353; CHECK-GI-NEXT: str q7, [sp, #112]354; CHECK-GI-NEXT: add x9, sp, #8355; CHECK-GI-NEXT: add x8, x29, #16356; CHECK-GI-NEXT: str x8, [x9]357; CHECK-GI-NEXT: add x8, x29, #0358; CHECK-GI-NEXT: str x8, [x9, #8]359; CHECK-GI-NEXT: add x8, sp, #128360; CHECK-GI-NEXT: str x8, [x9, #16]361; CHECK-GI-NEXT: mov w8, #-56 // =0xffffffc8362; CHECK-GI-NEXT: str w8, [x9, #24]363; CHECK-GI-NEXT: mov w8, #-112 // =0xffffff90364; CHECK-GI-NEXT: str w8, [x9, #28]365; CHECK-GI-NEXT: mov w8, #1 // =0x1366; CHECK-GI-NEXT: mov w0, w8367; CHECK-GI-NEXT: .cfi_def_cfa wsp, 208368; CHECK-GI-NEXT: ldp x29, x30, [sp, #192] // 16-byte Folded Reload369; CHECK-GI-NEXT: add sp, sp, #208370; CHECK-GI-NEXT: .cfi_def_cfa_offset 0371; CHECK-GI-NEXT: .cfi_restore w30372; CHECK-GI-NEXT: .cfi_restore w29373; CHECK-GI-NEXT: ret374entry:375 %g = alloca ptr, align 4376 call void @llvm.va_start(ptr %g)377 ret i64 1378}379 380; To make the outputs more readable381attributes #0 = { uwtable "frame-pointer"="all" }382 383;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:384; CHECK: {{.*}}385