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