174 lines
4.6 KiB
LLVM
174 lines
4.6 KiB
LLVM
; 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(i8* %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, i8* %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
|
|
}
|