1; RUN: llc < %s -march=avr | FileCheck %s
2
3define avr_intrcc void @interrupt_handler() {
4; CHECK-LABEL: interrupt_handler:
5; CHECK: sei
6; CHECK-NEXT: push r0
7; CHECK-NEXT: push r1
8; CHECK-NEXT: in r0, 63
9; CHECK-NEXT: push r0
10; CHECK: clr r0
11; CHECK-NEXT: clr r1
12; CHECK: pop r0
13; CHECK-NEXT: out 63, r0
14; CHECK-NEXT: pop r1
15; CHECK-NEXT: pop r0
16; CHECK-NEXT: reti
17  ret void
18}
19
20define void @interrupt_handler_via_ir_attribute() #0 {
21; CHECK-LABEL: interrupt_handler_via_ir_attribute:
22; CHECK: sei
23; CHECK-NEXT: push r0
24; CHECK-NEXT: push r1
25; CHECK-NEXT: in r0, 63
26; CHECK-NEXT: push r0
27; CHECK: clr r0
28; CHECK-NEXT: clr r1
29; CHECK: pop r0
30; CHECK-NEXT: out 63, r0
31; CHECK-NEXT: pop r1
32; CHECK-NEXT: pop r0
33; CHECK-NEXT: reti
34  ret void
35}
36
37define avr_signalcc void @signal_handler() {
38; CHECK-LABEL: signal_handler:
39; CHECK-NOT: sei
40; CHECK: push r0
41; CHECK-NEXT: push r1
42; CHECK-NEXT: in r0, 63
43; CHECK-NEXT: push r0
44; CHECK: clr r0
45; CHECK-NEXT: clr r1
46; CHECK: pop r0
47; CHECK-NEXT: out 63, r0
48; CHECK-NEXT: pop r1
49; CHECK-NEXT: pop r0
50; CHECK-NEXT: reti
51  ret void
52}
53
54define void @signal_handler_via_attribute() #1 {
55; CHECK-LABEL: signal_handler_via_attribute:
56; CHECK-NOT: sei
57; CHECK: push r0
58; CHECK-NEXT: push r1
59; CHECK-NEXT: in r0, 63
60; CHECK-NEXT: push r0
61; CHECK: clr r0
62; CHECK-NEXT: clr r1
63; CHECK: pop r0
64; CHECK-NEXT: out 63, r0
65; CHECK-NEXT: pop r1
66; CHECK-NEXT: pop r0
67; CHECK-NEXT: reti
68  ret void
69}
70
71define avr_intrcc void @interrupt_alloca() {
72; CHECK-LABEL: interrupt_alloca:
73; CHECK: sei
74; CHECK-NEXT: push r0
75; CHECK-NEXT: push r1
76; CHECK-NEXT: in r0, 63
77; CHECK-NEXT: push r0
78; CHECK: clr r0
79; CHECK-NEXT: clr r1
80; CHECK: push r28
81; CHECK-NEXT: push r29
82; CHECK-NEXT: in r28, 61
83; CHECK-NEXT: in r29, 62
84; CHECK-NEXT: sbiw r28, 1
85; CHECK-NEXT: in r0, 63
86; CHECK-NEXT: cli
87; CHECK-NEXT: out 62, r29
88; CHECK-NEXT: out 63, r0
89; CHECK-NEXT: out 61, r28
90; CHECK: adiw r28, 1
91; CHECK-NEXT: in r0, 63
92; CHECK-NEXT: cli
93; CHECK-NEXT: out 62, r29
94; CHECK-NEXT: out 63, r0
95; CHECK-NEXT: out 61, r28
96; CHECK-NEXT: pop r29
97; CHECK-NEXT: pop r28
98; CHECK: pop r0
99; CHECK-NEXT: out 63, r0
100; CHECK-NEXT: pop r1
101; CHECK-NEXT: pop r0
102; CHECK-NEXT: reti
103  alloca i8
104  ret void
105}
106
107attributes #0 = { "interrupt" }
108attributes #1 = { "signal" }
109