| ; 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 | |
| } |