blob: 7c86cf075348318e2304c3cc9413a75586f340f5 [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
; RUN: llc < %s -mtriple=avr -mcpu=atmega328 | FileCheck %s
; RUN: llc < %s -mtriple=avr -mcpu=attiny10 | FileCheck %s --check-prefix=TINY
declare void @foo()
declare void @bar(i8, i8, i8)
declare void @baz(i8, ...)
define void @spill_across_call(i8 %a, i8 %b, i8 %c) {
; CHECK-LABEL: spill_across_call:
; CHECK: ; %bb.0:
; CHECK-NEXT: push r15
; CHECK-NEXT: push r16
; CHECK-NEXT: push r17
; CHECK-NEXT: mov r17, r20
; CHECK-NEXT: mov r16, r22
; CHECK-NEXT: mov r15, r24
; CHECK-NEXT: call foo
; CHECK-NEXT: mov r24, r15
; CHECK-NEXT: mov r22, r16
; CHECK-NEXT: mov r20, r17
; CHECK-NEXT: call bar
; CHECK-NEXT: pop r17
; CHECK-NEXT: pop r16
; CHECK-NEXT: pop r15
; CHECK-NEXT: ret
;
; TINY-LABEL: spill_across_call:
; TINY: ; %bb.0:
; TINY-NEXT: push r18
; TINY-NEXT: push r19
; TINY-NEXT: push r28
; TINY-NEXT: push r29
; TINY-NEXT: in r28, 61
; TINY-NEXT: clr r29
; TINY-NEXT: subi r28, 1
; TINY-NEXT: sbci r29, 0
; TINY-NEXT: out 61, r28
; TINY-NEXT: in r16, 63
; TINY-NEXT: subi r28, 255
; TINY-NEXT: sbci r29, 255
; TINY-NEXT: st Y, r20 ; 1-byte Folded Spill
; TINY-NEXT: subi r28, 1
; TINY-NEXT: sbci r29, 0
; TINY-NEXT: out 63, r16
; TINY-NEXT: mov r19, r22
; TINY-NEXT: mov r18, r24
; TINY-NEXT: rcall foo
; TINY-NEXT: mov r24, r18
; TINY-NEXT: mov r22, r19
; TINY-NEXT: in r16, 63
; TINY-NEXT: subi r28, 255
; TINY-NEXT: sbci r29, 255
; TINY-NEXT: ld r20, Y ; 1-byte Folded Reload
; TINY-NEXT: subi r28, 1
; TINY-NEXT: sbci r29, 0
; TINY-NEXT: out 63, r16
; TINY-NEXT: rcall bar
; TINY-NEXT: subi r28, 255
; TINY-NEXT: sbci r29, 255
; TINY-NEXT: out 61, r28
; TINY-NEXT: pop r29
; TINY-NEXT: pop r28
; TINY-NEXT: pop r19
; TINY-NEXT: pop r18
; TINY-NEXT: ret
call void @foo()
call void @bar(i8 %a, i8 %b, i8 %c)
ret void
}
define void @stack_arg_no_fp(i8 %x) {
; CHECK-LABEL: stack_arg_no_fp:
; CHECK: ; %bb.0:
; CHECK-NEXT: in r30, 61
; CHECK-NEXT: in r31, 62
; CHECK-NEXT: subi r30, 1
; CHECK-NEXT: sbci r31, 0
; CHECK-NEXT: in r0, 63
; CHECK-NEXT: cli
; CHECK-NEXT: out 62, r31
; CHECK-NEXT: out 63, r0
; CHECK-NEXT: out 61, r30
; CHECK-NEXT: std Z+1, r24
; CHECK-NEXT: call baz
; CHECK-NEXT: in r30, 61
; CHECK-NEXT: in r31, 62
; CHECK-NEXT: adiw r30, 1
; CHECK-NEXT: in r0, 63
; CHECK-NEXT: cli
; CHECK-NEXT: out 62, r31
; CHECK-NEXT: out 63, r0
; CHECK-NEXT: out 61, r30
; CHECK-NEXT: ret
;
; TINY-LABEL: stack_arg_no_fp:
; TINY: ; %bb.0:
; TINY-NEXT: in r30, 61
; TINY-NEXT: clr r31
; TINY-NEXT: subi r30, 1
; TINY-NEXT: sbci r31, 0
; TINY-NEXT: out 61, r30
; TINY-NEXT: subi r30, 255
; TINY-NEXT: sbci r31, 255
; TINY-NEXT: st Z, r24
; TINY-NEXT: subi r30, 1
; TINY-NEXT: sbci r31, 0
; TINY-NEXT: rcall baz
; TINY-NEXT: in r30, 61
; TINY-NEXT: clr r31
; TINY-NEXT: subi r30, 255
; TINY-NEXT: sbci r31, 255
; TINY-NEXT: out 61, r30
; TINY-NEXT: ret
call void (i8, ...) @baz(i8 %x)
ret void
}