190 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=aarch64-windows -verify-machineinstrs | FileCheck %s --check-prefixes=DAGISEL3; RUN: llc < %s -mtriple=aarch64-windows -verify-machineinstrs -O0 -fast-isel | FileCheck %s --check-prefixes=O0,FASTISEL4; RUN: llc < %s -mtriple=aarch64-windows -verify-machineinstrs -O0 -global-isel | FileCheck %s --check-prefixes=O0,GISEL5 6define void @float_va_fn(float %a, i32 %b, ...) nounwind {7; DAGISEL-LABEL: float_va_fn:8; DAGISEL: // %bb.0: // %entry9; DAGISEL-NEXT: str x30, [sp, #-64]! // 8-byte Folded Spill10; DAGISEL-NEXT: fmov s0, w011; DAGISEL-NEXT: add x8, sp, #1612; DAGISEL-NEXT: add x0, sp, #1613; DAGISEL-NEXT: stp x2, x3, [sp, #16]14; DAGISEL-NEXT: stp x4, x5, [sp, #32]15; DAGISEL-NEXT: stp x6, x7, [sp, #48]16; DAGISEL-NEXT: str x8, [sp, #8]17; DAGISEL-NEXT: bl f_va_list18; DAGISEL-NEXT: ldr x30, [sp], #64 // 8-byte Folded Reload19; DAGISEL-NEXT: ret20;21; O0-LABEL: float_va_fn:22; O0: // %bb.0: // %entry23; O0-NEXT: sub sp, sp, #8024; O0-NEXT: str x30, [sp, #16] // 8-byte Spill25; O0-NEXT: str x7, [sp, #72]26; O0-NEXT: str x6, [sp, #64]27; O0-NEXT: str x5, [sp, #56]28; O0-NEXT: str x4, [sp, #48]29; O0-NEXT: str x3, [sp, #40]30; O0-NEXT: str x2, [sp, #32]31; O0-NEXT: fmov s0, w032; O0-NEXT: add x8, sp, #3233; O0-NEXT: str x8, [sp, #8]34; O0-NEXT: ldr x0, [sp, #8]35; O0-NEXT: bl f_va_list36; O0-NEXT: ldr x30, [sp, #16] // 8-byte Reload37; O0-NEXT: add sp, sp, #8038; O0-NEXT: ret39entry:40 %ap = alloca ptr, align 841 call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %ap)42 call void @llvm.va_start(ptr nonnull %ap)43 %0 = load ptr, ptr %ap, align 844 call void @f_va_list(float %a, ptr %0)45 call void @llvm.va_end(ptr nonnull %ap)46 call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %ap)47 ret void48}49 50declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture)51declare void @llvm.va_start(ptr)52declare void @f_va_list(float, ptr)53declare void @llvm.va_end(ptr)54declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture)55 56define void @double_va_fn(double %a, i32 %b, ...) nounwind {57; DAGISEL-LABEL: double_va_fn:58; DAGISEL: // %bb.0: // %entry59; DAGISEL-NEXT: str x30, [sp, #-64]! // 8-byte Folded Spill60; DAGISEL-NEXT: fmov d0, x061; DAGISEL-NEXT: add x8, sp, #1662; DAGISEL-NEXT: add x0, sp, #1663; DAGISEL-NEXT: stp x2, x3, [sp, #16]64; DAGISEL-NEXT: stp x4, x5, [sp, #32]65; DAGISEL-NEXT: stp x6, x7, [sp, #48]66; DAGISEL-NEXT: str x8, [sp, #8]67; DAGISEL-NEXT: bl d_va_list68; DAGISEL-NEXT: ldr x30, [sp], #64 // 8-byte Folded Reload69; DAGISEL-NEXT: ret70;71; O0-LABEL: double_va_fn:72; O0: // %bb.0: // %entry73; O0-NEXT: sub sp, sp, #8074; O0-NEXT: str x30, [sp, #16] // 8-byte Spill75; O0-NEXT: str x7, [sp, #72]76; O0-NEXT: str x6, [sp, #64]77; O0-NEXT: str x5, [sp, #56]78; O0-NEXT: str x4, [sp, #48]79; O0-NEXT: str x3, [sp, #40]80; O0-NEXT: str x2, [sp, #32]81; O0-NEXT: fmov d0, x082; O0-NEXT: add x8, sp, #3283; O0-NEXT: str x8, [sp, #8]84; O0-NEXT: ldr x0, [sp, #8]85; O0-NEXT: bl d_va_list86; O0-NEXT: ldr x30, [sp, #16] // 8-byte Reload87; O0-NEXT: add sp, sp, #8088; O0-NEXT: ret89entry:90 %ap = alloca ptr, align 891 call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %ap)92 call void @llvm.va_start(ptr nonnull %ap)93 %0 = load ptr, ptr %ap, align 894 call void @d_va_list(double %a, ptr %0)95 call void @llvm.va_end(ptr nonnull %ap)96 call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %ap)97 ret void98}99 100declare void @d_va_list(double, ptr)101 102define void @call_f_va() nounwind {103; DAGISEL-LABEL: call_f_va:104; DAGISEL: // %bb.0: // %entry105; DAGISEL-NEXT: mov w0, #1065353216 // =0x3f800000106; DAGISEL-NEXT: mov w1, #2 // =0x2107; DAGISEL-NEXT: mov x2, #4613937818241073152 // =0x4008000000000000108; DAGISEL-NEXT: mov w3, #4 // =0x4109; DAGISEL-NEXT: b other_f_va_fn110;111; FASTISEL-LABEL: call_f_va:112; FASTISEL: // %bb.0: // %entry113; FASTISEL-NEXT: mov w0, #1065353216 // =0x3f800000114; FASTISEL-NEXT: mov w1, #2 // =0x2115; FASTISEL-NEXT: mov x2, #4613937818241073152 // =0x4008000000000000116; FASTISEL-NEXT: mov w3, #4 // =0x4117; FASTISEL-NEXT: b other_f_va_fn118;119; GISEL-LABEL: call_f_va:120; GISEL: // %bb.0: // %entry121; GISEL-NEXT: fmov s0, #1.00000000122; GISEL-NEXT: fmov w0, s0123; GISEL-NEXT: mov w1, #2 // =0x2124; GISEL-NEXT: fmov d0, #3.00000000125; GISEL-NEXT: fmov x2, d0126; GISEL-NEXT: mov w3, #4 // =0x4127; GISEL-NEXT: b other_f_va_fn128entry:129 tail call void (float, i32, ...) @other_f_va_fn(float 1.000000e+00, i32 2, double 3.000000e+00, i32 4)130 ret void131}132 133declare void @other_f_va_fn(float, i32, ...)134 135define void @call_d_va() nounwind {136; DAGISEL-LABEL: call_d_va:137; DAGISEL: // %bb.0: // %entry138; DAGISEL-NEXT: mov x0, #4607182418800017408 // =0x3ff0000000000000139; DAGISEL-NEXT: mov w1, #2 // =0x2140; DAGISEL-NEXT: mov x2, #4613937818241073152 // =0x4008000000000000141; DAGISEL-NEXT: mov w3, #4 // =0x4142; DAGISEL-NEXT: b other_d_va_fn143;144; FASTISEL-LABEL: call_d_va:145; FASTISEL: // %bb.0: // %entry146; FASTISEL-NEXT: mov x0, #4607182418800017408 // =0x3ff0000000000000147; FASTISEL-NEXT: mov w1, #2 // =0x2148; FASTISEL-NEXT: mov x2, #4613937818241073152 // =0x4008000000000000149; FASTISEL-NEXT: mov w3, #4 // =0x4150; FASTISEL-NEXT: b other_d_va_fn151;152; GISEL-LABEL: call_d_va:153; GISEL: // %bb.0: // %entry154; GISEL-NEXT: fmov d0, #1.00000000155; GISEL-NEXT: fmov x0, d0156; GISEL-NEXT: mov w1, #2 // =0x2157; GISEL-NEXT: fmov d0, #3.00000000158; GISEL-NEXT: fmov x2, d0159; GISEL-NEXT: mov w3, #4 // =0x4160; GISEL-NEXT: b other_d_va_fn161entry:162 tail call void (double, i32, ...) @other_d_va_fn(double 1.000000e+00, i32 2, double 3.000000e+00, i32 4)163 ret void164}165 166declare void @other_d_va_fn(double, i32, ...)167 168define void @call_d_non_va() nounwind {169; DAGISEL-LABEL: call_d_non_va:170; DAGISEL: // %bb.0: // %entry171; DAGISEL-NEXT: fmov d0, #1.00000000172; DAGISEL-NEXT: fmov d1, #3.00000000173; DAGISEL-NEXT: mov w0, #2 // =0x2174; DAGISEL-NEXT: mov w1, #4 // =0x4175; DAGISEL-NEXT: b other_d_non_va_fn176;177; O0-LABEL: call_d_non_va:178; O0: // %bb.0: // %entry179; O0-NEXT: fmov d0, #1.00000000180; O0-NEXT: mov w0, #2 // =0x2181; O0-NEXT: fmov d1, #3.00000000182; O0-NEXT: mov w1, #4 // =0x4183; O0-NEXT: b other_d_non_va_fn184entry:185 tail call void (double, i32, double, i32) @other_d_non_va_fn(double 1.000000e+00, i32 2, double 3.000000e+00, i32 4)186 ret void187}188 189declare void @other_d_non_va_fn(double, i32, double, i32)190