1; RUN: llc < %s -mtriple=aarch64-linux -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK,DAGISEL 2; RUN: llc < %s -mtriple=aarch64-linux -verify-machineinstrs -O0 -fast-isel | FileCheck %s --check-prefixes=CHECK,O0 3; RUN: llc < %s -mtriple=aarch64-linux -verify-machineinstrs -O0 -global-isel | FileCheck %s --check-prefixes=CHECK,O0 4 5define win64cc void @float_va_fn(float %a, i32 %b, ...) nounwind { 6entry: 7; CHECK-LABEL: float_va_fn: 8; O0: str x7, [sp, #72] 9; O0: str x6, [sp, #64] 10; O0: str x5, [sp, #56] 11; O0: str x4, [sp, #48] 12; O0: str x3, [sp, #40] 13; O0: str x2, [sp, #32] 14; CHECK: fmov s0, w0 15; O0: add x8, sp, #32 16; O0: str x8, [sp, #8] 17; O0: ldr x0, [sp, #8] 18; DAGISEL: add x0, sp, #32 19; DAGISEL: stp x2, x3, [sp, #32] 20; DAGISEL: stp x4, x5, [sp, #48] 21; DAGISEL: stp x6, x7, [sp, #64] 22; CHECK: bl f_va_list 23 %ap = alloca i8*, align 8 24 %0 = bitcast i8** %ap to i8* 25 call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %0) 26 call void @llvm.va_start(i8* nonnull %0) 27 %1 = load i8*, i8** %ap, align 8 28 call void @f_va_list(float %a, i8* %1) 29 call void @llvm.va_end(i8* nonnull %0) 30 call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %0) 31 ret void 32} 33 34declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) 35declare void @llvm.va_start(i8*) 36declare void @f_va_list(float, i8*) 37declare void @llvm.va_end(i8*) 38declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) 39 40define win64cc void @double_va_fn(double %a, i32 %b, ...) nounwind { 41entry: 42; CHECK-LABEL: double_va_fn: 43; O0: str x7, [sp, #72] 44; O0: str x6, [sp, #64] 45; O0: str x5, [sp, #56] 46; O0: str x4, [sp, #48] 47; O0: str x3, [sp, #40] 48; O0: str x2, [sp, #32] 49; CHECK: fmov d0, x0 50; O0: add x8, sp, #32 51; O0: str x8, [sp, #8] 52; O0: ldr x0, [sp, #8] 53; DAGISEL: add x0, sp, #32 54; DAGISEL: stp x2, x3, [sp, #32] 55; DAGISEL: stp x4, x5, [sp, #48] 56; DAGISEL: stp x6, x7, [sp, #64] 57; CHECK: bl d_va_list 58 %ap = alloca i8*, align 8 59 %0 = bitcast i8** %ap to i8* 60 call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %0) 61 call void @llvm.va_start(i8* nonnull %0) 62 %1 = load i8*, i8** %ap, align 8 63 call void @d_va_list(double %a, i8* %1) 64 call void @llvm.va_end(i8* nonnull %0) 65 call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %0) 66 ret void 67} 68 69declare void @d_va_list(double, i8*) 70 71define void @call_f_va() nounwind { 72entry: 73; CHECK-LABEL: call_f_va: 74; DAGISEL: mov w0, #1065353216 75; FASTISEL: mov w0, #1065353216 76; GISEL: fmov s0, #1.00000000 77; GISEL: fmov w0, s0 78; CHECK: mov w1, #2 79; DAGISEL: mov x2, #4613937818241073152 80; FASTISEL: mov x2, #4613937818241073152 81; GISEL: fmov d0, #3.00000000 82; GISEL: fmov x2, d0 83; CHECK: mov w3, #4 84; CHECK: bl other_f_va_fn 85 tail call win64cc void (float, i32, ...) @other_f_va_fn(float 1.000000e+00, i32 2, double 3.000000e+00, i32 4) 86 ret void 87} 88 89declare win64cc void @other_f_va_fn(float, i32, ...) 90 91define void @call_d_va() nounwind { 92entry: 93; CHECK-LABEL: call_d_va: 94; DAGISEL: mov x0, #4607182418800017408 95; FASTISEL: mov x0, #4607182418800017408 96; GISEL: fmov d0, #1.00000000 97; GISEL: fmov x0, d0 98; CHECK: mov w1, #2 99; DAGISEL: mov x2, #4613937818241073152 100; FASTISEL: mov x2, #4613937818241073152 101; GISEL: fmov d0, #3.00000000 102; CHECK: mov w3, #4 103; CHECK: bl other_d_va_fn 104 tail call win64cc void (double, i32, ...) @other_d_va_fn(double 1.000000e+00, i32 2, double 3.000000e+00, i32 4) 105 ret void 106} 107 108declare win64cc void @other_d_va_fn(double, i32, ...) 109 110define void @call_d_non_va() nounwind { 111entry: 112; CHECK-LABEL: call_d_non_va: 113; CHECK-DAG: fmov d0, #1.00000000 114; CHECK-DAG: fmov d1, #3.00000000 115; CHECK-DAG: mov w0, #2 116; CHECK-DAG: mov w1, #4 117; CHECK: bl other_d_non_va_fn 118 tail call win64cc void (double, i32, double, i32) @other_d_non_va_fn(double 1.000000e+00, i32 2, double 3.000000e+00, i32 4) 119 ret void 120} 121 122declare win64cc void @other_d_non_va_fn(double, i32, double, i32) 123