160 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=arm64ec-pc-windows-msvc -arm64ec-generate-thunks=false < %s | FileCheck %s3; RUN: llc -mtriple=arm64ec-pc-windows-msvc -arm64ec-generate-thunks=false < %s -global-isel=1 -global-isel-abort=0 | FileCheck %s4 5define void @varargs_callee(double %x, ...) nounwind {6; CHECK-LABEL: varargs_callee:7; CHECK: // %bb.0:8; CHECK-NEXT: sub sp, sp, #489; CHECK-NEXT: stp x1, x2, [x4, #-24]!10; CHECK-NEXT: str x3, [x4, #16]11; CHECK-NEXT: str x4, [sp, #8]12; CHECK-NEXT: add sp, sp, #4813; CHECK-NEXT: ret14 %list = alloca ptr, align 815 call void @llvm.va_start(ptr nonnull %list)16 ret void17}18 19define void @varargs_callee_manyargs(i64, i64, i64, i64, i64, ...) nounwind {20; CHECK-LABEL: varargs_callee_manyargs:21; CHECK: // %bb.0:22; CHECK-NEXT: sub sp, sp, #1623; CHECK-NEXT: add x8, x4, #824; CHECK-NEXT: str x8, [sp, #8]25; CHECK-NEXT: add sp, sp, #1626; CHECK-NEXT: ret27 %list = alloca ptr, align 828 call void @llvm.va_start(ptr nonnull %list)29 ret void30}31 32define void @varargs_caller() nounwind {33; CHECK-LABEL: varargs_caller:34; CHECK: // %bb.0:35; CHECK-NEXT: sub sp, sp, #4836; CHECK-NEXT: mov x4, sp37; CHECK-NEXT: add x8, sp, #1638; CHECK-NEXT: mov x9, #4617315517961601024 // =0x401400000000000039; CHECK-NEXT: mov x0, #4607182418800017408 // =0x3ff000000000000040; CHECK-NEXT: mov w1, #2 // =0x241; CHECK-NEXT: mov x2, #4613937818241073152 // =0x400800000000000042; CHECK-NEXT: mov w3, #4 // =0x443; CHECK-NEXT: mov w5, #16 // =0x1044; CHECK-NEXT: stp xzr, x30, [sp, #24] // 8-byte Folded Spill45; CHECK-NEXT: stp x9, x8, [sp]46; CHECK-NEXT: str xzr, [sp, #16]47; CHECK-NEXT: .weak_anti_dep varargs_callee48; CHECK-NEXT: varargs_callee = "#varargs_callee"49; CHECK-NEXT: .weak_anti_dep "#varargs_callee"50; CHECK-NEXT: "#varargs_callee" = varargs_callee51; CHECK-NEXT: bl "#varargs_callee"52; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Reload53; CHECK-NEXT: add sp, sp, #4854; CHECK-NEXT: ret55 call void (double, ...) @varargs_callee(double 1.0, i32 2, double 3.0, i32 4, double 5.0, <2 x double> <double 0.0, double 0.0>)56 ret void57}58 59define <2 x double> @varargs_many_argscallee(double %a, double %b, double %c,60; CHECK-LABEL: varargs_many_argscallee:61; CHECK: // %bb.0:62; CHECK-NEXT: ldr x8, [x4]63; CHECK-NEXT: ldr q0, [x3]64; CHECK-NEXT: ldr q1, [x8]65; CHECK-NEXT: fadd v0.2d, v0.2d, v1.2d66; CHECK-NEXT: ret67 <2 x double> %d, <2 x double> %e, ...) nounwind {68 %rval = fadd <2 x double> %d, %e69 ret <2 x double> %rval70}71 72define void @varargs_many_argscalleer() nounwind {73; CHECK-LABEL: varargs_many_argscalleer:74; CHECK: // %bb.0:75; CHECK-NEXT: sub sp, sp, #6476; CHECK-NEXT: movi v0.2d, #000000000000000077; CHECK-NEXT: mov x8, #4618441417868443648 // =0x401800000000000078; CHECK-NEXT: add x9, sp, #1679; CHECK-NEXT: add x3, sp, #3280; CHECK-NEXT: mov x0, #4607182418800017408 // =0x3ff000000000000081; CHECK-NEXT: mov x1, #4611686018427387904 // =0x400000000000000082; CHECK-NEXT: mov x2, #4613937818241073152 // =0x400800000000000083; CHECK-NEXT: mov x4, sp84; CHECK-NEXT: mov w5, #16 // =0x1085; CHECK-NEXT: str x30, [sp, #48] // 8-byte Spill86; CHECK-NEXT: stp x9, x8, [sp]87; CHECK-NEXT: stp q0, q0, [sp, #16]88; CHECK-NEXT: .weak_anti_dep varargs_many_argscallee89; CHECK-NEXT: varargs_many_argscallee = "#varargs_many_argscallee"90; CHECK-NEXT: .weak_anti_dep "#varargs_many_argscallee"91; CHECK-NEXT: "#varargs_many_argscallee" = varargs_many_argscallee92; CHECK-NEXT: bl "#varargs_many_argscallee"93; CHECK-NEXT: ldr x30, [sp, #48] // 8-byte Reload94; CHECK-NEXT: add sp, sp, #6495; CHECK-NEXT: ret96 call <2 x double> (double, double, double, <2 x double>, <2 x double>, ...)97 @varargs_many_argscallee(double 1., double 2., double 3.,98 <2 x double> zeroinitializer,99 <2 x double> zeroinitializer, double 6.)100 ret void101}102 103define void @varargs_caller_tail() nounwind {104; CHECK-LABEL: varargs_caller_tail:105; CHECK: // %bb.0:106; CHECK-NEXT: sub sp, sp, #48107; CHECK-NEXT: mov x4, sp108; CHECK-NEXT: add x8, sp, #16109; CHECK-NEXT: mov x9, #4617315517961601024 // =0x4014000000000000110; CHECK-NEXT: mov x0, #4607182418800017408 // =0x3ff0000000000000111; CHECK-NEXT: mov w1, #2 // =0x2112; CHECK-NEXT: mov x2, #4613937818241073152 // =0x4008000000000000113; CHECK-NEXT: mov w3, #4 // =0x4114; CHECK-NEXT: mov w5, #16 // =0x10115; CHECK-NEXT: stp xzr, x30, [sp, #24] // 8-byte Folded Spill116; CHECK-NEXT: stp x9, x8, [sp]117; CHECK-NEXT: str xzr, [sp, #16]118; CHECK-NEXT: .weak_anti_dep varargs_callee119; CHECK-NEXT: varargs_callee = "#varargs_callee"120; CHECK-NEXT: .weak_anti_dep "#varargs_callee"121; CHECK-NEXT: "#varargs_callee" = varargs_callee122; CHECK-NEXT: bl "#varargs_callee"123; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Reload124; CHECK-NEXT: add x4, sp, #48125; CHECK-NEXT: mov x0, #4607182418800017408 // =0x3ff0000000000000126; CHECK-NEXT: mov w1, #4 // =0x4127; CHECK-NEXT: mov w2, #3 // =0x3128; CHECK-NEXT: mov w3, #2 // =0x2129; CHECK-NEXT: mov x5, xzr130; CHECK-NEXT: add sp, sp, #48131; CHECK-NEXT: .weak_anti_dep varargs_callee132; CHECK-NEXT: varargs_callee = "#varargs_callee"133; CHECK-NEXT: .weak_anti_dep "#varargs_callee"134; CHECK-NEXT: "#varargs_callee" = varargs_callee135; CHECK-NEXT: b "#varargs_callee"136 call void (double, ...) @varargs_callee(double 1.0, i32 2, double 3.0, i32 4, double 5.0, <2 x double> <double 0.0, double 0.0>)137 tail call void (double, ...) @varargs_callee(double 1.0, i32 4, i32 3, i32 2)138 ret void139}140 141; Check we spill/restore x4 and x5, and don't dereference x4.142define void @varargs_thunk(ptr noundef %0, ...) "thunk" {143; CHECK-LABEL: varargs_thunk:144; CHECK: // %bb.0:145; CHECK-NEXT: ldr x11, [x0]146; CHECK-NEXT: mov x9, x5147; CHECK-NEXT: mov x10, x4148; CHECK-NEXT: //APP149; CHECK-NEXT: //NO_APP150; CHECK-NEXT: ldr x11, [x11]151; CHECK-NEXT: mov x4, x10152; CHECK-NEXT: mov x5, x9153; CHECK-NEXT: br x11154 call void asm "","~{x4},~{x5}"()155 %vtable = load ptr, ptr %0, align 8156 %vtablefn = load ptr, ptr %vtable, align 8157 musttail call void (ptr, ...) %vtablefn(ptr noundef %0, ...)158 ret void159}160