60 lines · plain
1; RUN: llc -mattr=sram,movw,addsubiw < %s -mtriple=avr | FileCheck %s2 3declare void @llvm.va_start(ptr)4declare i16 @vsprintf(ptr nocapture, ptr nocapture, ptr)5declare void @llvm.va_end(ptr)6 7define i16 @varargs1(ptr nocapture %x, ...) {8; CHECK-LABEL: varargs1:9; CHECK: movw r20, r2810; CHECK: subi r20, 21511; CHECK: sbci r21, 25512; CHECK: movw r24, r2813; CHECK: adiw r24, 314; CHECK: ldd r22, Y+3915; CHECK: ldd r23, Y+4016; CHECK: call17 %buffer = alloca [32 x i8]18 %ap = alloca ptr19 %ap1 = bitcast ptr %ap to ptr20 call void @llvm.va_start(ptr %ap1)21 %arraydecay = getelementptr inbounds [32 x i8], ptr %buffer, i16 0, i16 022 %1 = load ptr, ptr %ap23 %call = call i16 @vsprintf(ptr %arraydecay, ptr %x, ptr %1)24 call void @llvm.va_end(ptr %ap1)25 ret i16 026}27 28define i16 @varargs2(ptr nocapture %x, ...) {29; CHECK-LABEL: varargs2:30; CHECK: ldd r24, [[REG:X|Y|Z]]+{{[0-9]+}}31; CHECK: ldd r25, [[REG]]+{{[0-9]+}}32 %ap = alloca ptr33 %ap1 = bitcast ptr %ap to ptr34 call void @llvm.va_start(ptr %ap1)35 %1 = va_arg ptr %ap, i1636 call void @llvm.va_end(ptr %ap1)37 ret i16 %138}39 40declare void @var1223(i16, ...)41define void @varargcall() {42; CHECK-LABEL: varargcall:43; CHECK: ldi [[REG1:r[0-9]+]], 19144; CHECK: ldi [[REG2:r[0-9]+]], 22345; CHECK: std Z+6, [[REG2]]46; CHECK: std Z+5, [[REG1]]47; CHECK: ldi [[REG1:r[0-9]+]], 18948; CHECK: ldi [[REG2:r[0-9]+]], 20549; CHECK: std Z+4, [[REG2]]50; CHECK: std Z+3, [[REG1]]51; CHECK: ldi [[REG1:r[0-9]+]], 20552; CHECK: ldi [[REG2:r[0-9]+]], 17153; CHECK: std Z+2, [[REG2]]54; CHECK: std Z+1, [[REG1]]55; CHECK: call56; CHECK: adiw r30, 657 tail call void (i16, ...) @var1223(i16 -21555, i16 -12867, i16 -8257)58 ret void59}60