1; RUN: llc -mattr=avr6,sram < %s -march=avr | FileCheck %s 2 3;TODO: test returning byval structs 4; TODO: test naked functions 5 6define void @return_void() { 7; CHECK: return_void:{{[a-zA-Z0-9 #@]*}} 8; CHECK-NEXT: {{.*}}: 9; CHECK-NEXT: ret 10 ret void 11} 12 13define i8 @return8_imm() { 14; CHECK-LABEL: return8_imm: 15; CHECK: ldi r24, 5 16 ret i8 5 17} 18 19define i8 @return8_arg(i8 %x) { 20; CHECK: return8_arg:{{[a-zA-Z0-9 #@]*}} 21; CHECK-NEXT: {{.*}}: 22; CHECK-NEXT: ret 23 ret i8 %x 24} 25 26define i8 @return8_arg2(i8 %x, i8 %y, i8 %z) { 27; CHECK-LABEL: return8_arg2: 28; CHECK: mov r24, r20 29 ret i8 %z 30} 31 32define i16 @return16_imm() { 33; CHECK-LABEL: return16_imm: 34; CHECK: ldi r24, 57 35; CHECK: ldi r25, 48 36 ret i16 12345 37} 38 39define i16 @return16_arg(i16 %x) { 40; CHECK: return16_arg:{{[a-zA-Z0-9 #@]*}} 41; CHECK-NEXT: {{.*}}: 42; CHECK-NEXT: ret 43 ret i16 %x 44} 45 46define i16 @return16_arg2(i16 %x, i16 %y, i16 %z) { 47; CHECK-LABEL: return16_arg2: 48; CHECK: movw r24, r20 49 ret i16 %z 50} 51 52define i32 @return32_imm() { 53; CHECK-LABEL: return32_imm: 54; CHECK: ldi r22, 21 55; CHECK: ldi r23, 205 56; CHECK: ldi r24, 91 57; CHECK: ldi r25, 7 58 ret i32 123456789 59} 60 61define i32 @return32_arg(i32 %x) { 62; CHECK: return32_arg:{{[a-zA-Z0-9 #@]*}} 63; CHECK-NEXT: {{.*}}: 64; CHECK-NEXT: ret 65 ret i32 %x 66} 67 68define i32 @return32_arg2(i32 %x, i32 %y, i32 %z) { 69; CHECK-LABEL: return32_arg2: 70; CHECK: movw r22, r14 71; CHECK: movw r24, r16 72 ret i32 %z 73} 74 75define i64 @return64_imm() { 76; CHECK-LABEL: return64_imm: 77; CHECK: ldi r18, 204 78; CHECK: ldi r19, 204 79; CHECK: ldi r20, 104 80; CHECK: ldi r21, 37 81; CHECK: ldi r22, 25 82; CHECK: ldi r23, 22 83; CHECK: ldi r24, 236 84; CHECK: ldi r25, 190 85 ret i64 13757395258967641292 86} 87 88define i64 @return64_arg(i64 %x) { 89; CHECK: return64_arg:{{[a-zA-Z0-9 #@]*}} 90; CHECK-NEXT: {{.*}}: 91; CHECK-NEXT: ret 92 ret i64 %x 93} 94 95define i64 @return64_arg2(i64 %x, i64 %y, i64 %z) { 96; CHECK-LABEL: return64_arg2: 97; CHECK: push r28 98; CHECK: push r29 99; CHECK: ldd r18, Y+3 100; CHECK: ldd r19, Y+4 101; CHECK: ldd r20, Y+5 102; CHECK: ldd r21, Y+6 103; CHECK: ldd r22, Y+7 104; CHECK: ldd r23, Y+8 105; CHECK: ldd r24, Y+9 106; CHECK: ldd r25, Y+10 107; CHECK: pop r29 108; CHECK: pop r28 109 ret i64 %z 110} 111 112define i32 @return64_trunc(i32 %a, i32 %b, i32 %c, i64 %d) { 113; CHECK-LABEL: return64_trunc: 114; CHECK: push r28 115; CHECK: push r29 116; CHECK: ldd r22, Y+3 117; CHECK: ldd r23, Y+4 118; CHECK: ldd r24, Y+5 119; CHECK: ldd r25, Y+6 120; CHECK: pop r29 121; CHECK: pop r28 122 %result = trunc i64 %d to i32 123 ret i32 %result 124} 125 126define i32 @naked(i32 %x) naked { 127; CHECK-LABEL: naked: 128; CHECK-NOT: ret 129 ret i32 %x 130} 131 132define avr_intrcc void @interrupt_handler() { 133; CHECK-LABEL: interrupt_handler: 134; CHECK: reti 135 ret void 136} 137 138define avr_signalcc void @signal_handler() { 139; CHECK-LABEL: signal_handler: 140; CHECK: reti 141 ret void 142} 143