| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | |
| ; RUN: llc -mcpu=atmega328p -O0 < %s -mtriple=avr | FileCheck --check-prefix=CHECK-MEGA %s | |
| ; RUN: llc -mattr=avrtiny -O0 < %s -mtriple=avr | FileCheck %s | |
| define i16 @reg_copy16(i16, i16 %a) { | |
| ; CHECK-MEGA-LABEL: reg_copy16: | |
| ; CHECK-MEGA: ; %bb.0: | |
| ; CHECK-MEGA-NEXT: movw r24, r22 | |
| ; CHECK-MEGA-NEXT: ret | |
| ; | |
| ; CHECK-LABEL: reg_copy16: | |
| ; CHECK: ; %bb.0: | |
| ; CHECK-NEXT: mov r24, r22 | |
| ; CHECK-NEXT: mov r25, r23 | |
| ; CHECK-NEXT: ret | |
| ret i16 %a | |
| } | |
| define i8 @return_zero() { | |
| ; CHECK-MEGA-LABEL: return_zero: | |
| ; CHECK-MEGA: ; %bb.0: | |
| ; CHECK-MEGA-NEXT: mov r24, r1 | |
| ; CHECK-MEGA-NEXT: ret | |
| ; | |
| ; CHECK-LABEL: return_zero: | |
| ; CHECK: ; %bb.0: | |
| ; CHECK-NEXT: mov r24, r17 | |
| ; CHECK-NEXT: ret | |
| ret i8 0 | |
| } | |
| define i8 @atomic_load8(ptr %foo) { | |
| ; CHECK-MEGA-LABEL: atomic_load8: | |
| ; CHECK-MEGA: ; %bb.0: | |
| ; CHECK-MEGA-NEXT: movw r26, r24 | |
| ; CHECK-MEGA-NEXT: in r0, 63 | |
| ; CHECK-MEGA-NEXT: cli | |
| ; CHECK-MEGA-NEXT: ld r24, X | |
| ; CHECK-MEGA-NEXT: out 63, r0 | |
| ; CHECK-MEGA-NEXT: ret | |
| ; | |
| ; CHECK-LABEL: atomic_load8: | |
| ; CHECK: ; %bb.0: | |
| ; CHECK-NEXT: mov r26, r24 | |
| ; CHECK-NEXT: mov r27, r25 | |
| ; CHECK-NEXT: in r16, 63 | |
| ; CHECK-NEXT: cli | |
| ; CHECK-NEXT: ld r24, X | |
| ; CHECK-NEXT: out 63, r16 | |
| ; CHECK-NEXT: ret | |
| %val = load atomic i8, ptr %foo unordered, align 1 | |
| ret i8 %val | |
| } | |
| define avr_signalcc void @signal_handler_with_asm() { | |
| ; CHECK-MEGA-LABEL: signal_handler_with_asm: | |
| ; CHECK-MEGA: ; %bb.0: | |
| ; CHECK-MEGA-NEXT: push r0 | |
| ; CHECK-MEGA-NEXT: in r0, 63 | |
| ; CHECK-MEGA-NEXT: push r0 | |
| ; CHECK-MEGA-NEXT: push r1 | |
| ; CHECK-MEGA-NEXT: clr r1 | |
| ; CHECK-MEGA-NEXT: push r24 | |
| ; CHECK-MEGA-NEXT: ldi r24, 3 | |
| ; CHECK-MEGA-NEXT: ;APP | |
| ; CHECK-MEGA-NEXT: mov r24, r24 | |
| ; CHECK-MEGA-NEXT: ;NO_APP | |
| ; CHECK-MEGA-NEXT: pop r24 | |
| ; CHECK-MEGA-NEXT: pop r1 | |
| ; CHECK-MEGA-NEXT: pop r0 | |
| ; CHECK-MEGA-NEXT: out 63, r0 | |
| ; CHECK-MEGA-NEXT: pop r0 | |
| ; CHECK-MEGA-NEXT: reti | |
| ; | |
| ; CHECK-LABEL: signal_handler_with_asm: | |
| ; CHECK: ; %bb.0: | |
| ; CHECK-NEXT: push r16 | |
| ; CHECK-NEXT: in r16, 63 | |
| ; CHECK-NEXT: push r16 | |
| ; CHECK-NEXT: push r17 | |
| ; CHECK-NEXT: clr r17 | |
| ; CHECK-NEXT: push r24 | |
| ; CHECK-NEXT: ldi r24, 3 | |
| ; CHECK-NEXT: ;APP | |
| ; CHECK-NEXT: mov r24, r24 | |
| ; CHECK-NEXT: ;NO_APP | |
| ; CHECK-NEXT: pop r24 | |
| ; CHECK-NEXT: pop r17 | |
| ; CHECK-NEXT: pop r16 | |
| ; CHECK-NEXT: out 63, r16 | |
| ; CHECK-NEXT: pop r16 | |
| ; CHECK-NEXT: reti | |
| call i8 asm sideeffect "mov $0, $1", "=r,r"(i8 3) nounwind | |
| ret void | |
| } | |
| declare void @foo() | |
| define avr_signalcc void @signal_handler_with_call() { | |
| ; CHECK-MEGA-LABEL: signal_handler_with_call: | |
| ; CHECK-MEGA: ; %bb.0: | |
| ; CHECK-MEGA-NEXT: push r0 | |
| ; CHECK-MEGA-NEXT: in r0, 63 | |
| ; CHECK-MEGA-NEXT: push r0 | |
| ; CHECK-MEGA-NEXT: push r1 | |
| ; CHECK-MEGA-NEXT: clr r1 | |
| ; CHECK-MEGA-NEXT: push r18 | |
| ; CHECK-MEGA-NEXT: push r19 | |
| ; CHECK-MEGA-NEXT: push r20 | |
| ; CHECK-MEGA-NEXT: push r21 | |
| ; CHECK-MEGA-NEXT: push r22 | |
| ; CHECK-MEGA-NEXT: push r23 | |
| ; CHECK-MEGA-NEXT: push r24 | |
| ; CHECK-MEGA-NEXT: push r25 | |
| ; CHECK-MEGA-NEXT: push r26 | |
| ; CHECK-MEGA-NEXT: push r27 | |
| ; CHECK-MEGA-NEXT: push r30 | |
| ; CHECK-MEGA-NEXT: push r31 | |
| ; CHECK-MEGA-NEXT: call foo | |
| ; CHECK-MEGA-NEXT: pop r31 | |
| ; CHECK-MEGA-NEXT: pop r30 | |
| ; CHECK-MEGA-NEXT: pop r27 | |
| ; CHECK-MEGA-NEXT: pop r26 | |
| ; CHECK-MEGA-NEXT: pop r25 | |
| ; CHECK-MEGA-NEXT: pop r24 | |
| ; CHECK-MEGA-NEXT: pop r23 | |
| ; CHECK-MEGA-NEXT: pop r22 | |
| ; CHECK-MEGA-NEXT: pop r21 | |
| ; CHECK-MEGA-NEXT: pop r20 | |
| ; CHECK-MEGA-NEXT: pop r19 | |
| ; CHECK-MEGA-NEXT: pop r18 | |
| ; CHECK-MEGA-NEXT: pop r1 | |
| ; CHECK-MEGA-NEXT: pop r0 | |
| ; CHECK-MEGA-NEXT: out 63, r0 | |
| ; CHECK-MEGA-NEXT: pop r0 | |
| ; CHECK-MEGA-NEXT: reti | |
| ; | |
| ; CHECK-LABEL: signal_handler_with_call: | |
| ; CHECK: ; %bb.0: | |
| ; CHECK-NEXT: push r16 | |
| ; CHECK-NEXT: in r16, 63 | |
| ; CHECK-NEXT: push r16 | |
| ; CHECK-NEXT: push r17 | |
| ; CHECK-NEXT: clr r17 | |
| ; CHECK-NEXT: push r20 | |
| ; CHECK-NEXT: push r21 | |
| ; CHECK-NEXT: push r22 | |
| ; CHECK-NEXT: push r23 | |
| ; CHECK-NEXT: push r24 | |
| ; CHECK-NEXT: push r25 | |
| ; CHECK-NEXT: push r26 | |
| ; CHECK-NEXT: push r27 | |
| ; CHECK-NEXT: push r30 | |
| ; CHECK-NEXT: push r31 | |
| ; CHECK-NEXT: rcall foo | |
| ; CHECK-NEXT: pop r31 | |
| ; CHECK-NEXT: pop r30 | |
| ; CHECK-NEXT: pop r27 | |
| ; CHECK-NEXT: pop r26 | |
| ; CHECK-NEXT: pop r25 | |
| ; CHECK-NEXT: pop r24 | |
| ; CHECK-NEXT: pop r23 | |
| ; CHECK-NEXT: pop r22 | |
| ; CHECK-NEXT: pop r21 | |
| ; CHECK-NEXT: pop r20 | |
| ; CHECK-NEXT: pop r17 | |
| ; CHECK-NEXT: pop r16 | |
| ; CHECK-NEXT: out 63, r16 | |
| ; CHECK-NEXT: pop r16 | |
| ; CHECK-NEXT: reti | |
| call void @foo() | |
| ret void | |
| } |