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