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