1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16" 4*9880d681SAndroid Build Coastguard Workertarget triple = "msp430---elf" 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.va_start(i8*) nounwind 7*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.va_end(i8*) nounwind 8*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.va_copy(i8*, i8*) nounwind 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Workerdefine void @va_start(i16 %a, ...) nounwind { 11*9880d681SAndroid Build Coastguard Workerentry: 12*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: va_start: 13*9880d681SAndroid Build Coastguard Worker; CHECK: sub.w #2, r1 14*9880d681SAndroid Build Coastguard Worker %vl = alloca i8*, align 2 15*9880d681SAndroid Build Coastguard Worker %vl1 = bitcast i8** %vl to i8* 16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov.w r1, [[REG:r[0-9]+]] 17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add.w #6, [[REG]] 18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov.w [[REG]], 0(r1) 19*9880d681SAndroid Build Coastguard Worker call void @llvm.va_start(i8* %vl1) 20*9880d681SAndroid Build Coastguard Worker call void @llvm.va_end(i8* %vl1) 21*9880d681SAndroid Build Coastguard Worker ret void 22*9880d681SAndroid Build Coastguard Worker} 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerdefine i16 @va_arg(i8* %vl) nounwind { 25*9880d681SAndroid Build Coastguard Workerentry: 26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: va_arg: 27*9880d681SAndroid Build Coastguard Worker %vl.addr = alloca i8*, align 2 28*9880d681SAndroid Build Coastguard Worker; CHECK: mov.w r15, 0(r1) 29*9880d681SAndroid Build Coastguard Worker store i8* %vl, i8** %vl.addr, align 2 30*9880d681SAndroid Build Coastguard Worker; CHECK: mov.w r15, [[REG:r[0-9]+]] 31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add.w #2, [[REG]] 32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov.w [[REG]], 0(r1) 33*9880d681SAndroid Build Coastguard Worker %0 = va_arg i8** %vl.addr, i16 34*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov.w 0(r15), r15 35*9880d681SAndroid Build Coastguard Worker ret i16 %0 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerdefine void @va_copy(i8* %vl) nounwind { 39*9880d681SAndroid Build Coastguard Workerentry: 40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: va_copy: 41*9880d681SAndroid Build Coastguard Worker %vl.addr = alloca i8*, align 2 42*9880d681SAndroid Build Coastguard Worker %vl2 = alloca i8*, align 2 43*9880d681SAndroid Build Coastguard Worker; CHECK: mov.w r15, 2(r1) 44*9880d681SAndroid Build Coastguard Worker store i8* %vl, i8** %vl.addr, align 2 45*9880d681SAndroid Build Coastguard Worker %0 = bitcast i8** %vl2 to i8* 46*9880d681SAndroid Build Coastguard Worker %1 = bitcast i8** %vl.addr to i8* 47*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov.w r15, 0(r1) 48*9880d681SAndroid Build Coastguard Worker call void @llvm.va_copy(i8* %0, i8* %1) 49*9880d681SAndroid Build Coastguard Worker ret void 50*9880d681SAndroid Build Coastguard Worker} 51