140 lines · plain
1; RUN: llc -mtriple=avr < %s | FileCheck %s2 3; CHECK-LABEL: ret_void_args_i64_i64_i324define void @ret_void_args_i64_i64_i32(i64 %a, i64 %b, i32 %c) {5 ; We're goign to clobber PTRREG Y6 ; CHECK: push r287 ; CHECK-NEXT: push r298 9 ; Load the stack pointer into Y.10 ; CHECK-NEXT: in r28, 6111 ; CHECK-NEXT: in r29, 6212 13 ; Load the top two bytes from the 32-bit int.14 ; CHECK-NEXT: ldd r24, Y+715 ; CHECK-NEXT: ldd r25, Y+816 ; Store the top two bytes of the 32-bit int to memory.17 ; CHECK-NEXT: sts 7, r2518 ; CHECK-NEXT: sts 6, r2419 20 ; Load the bottom two bytes from the 32-bit int.21 ; CHECK-NEXT: ldd r24, Y+522 ; CHECK-NEXT: ldd r25, Y+623 ; Store the bottom two bytes of the 32-bit int to memory.24 ; CHECK-NEXT: sts 5, r2525 ; CHECK-NEXT: sts 4, r2426 27 ; Restore PTRREG Y28 ; CHECK-NEXT: pop r2929 ; CHECK-NEXT: pop r2830 store volatile i32 %c, ptr inttoptr (i64 4 to ptr)31 ret void32}33 34; NOTE: All arguments are passed via the stack for varargs functions.35; NOTE: Both %a & %b occupy a 1-byte stack slot.36define i8 @foo0(i8 %a, i8 %b, ...) {37; CHECK-LABEL: foo0:38; CHECK: ; %bb.0:39; CHECK-NEXT: push r2840; CHECK-NEXT: push r2941; CHECK-NEXT: in r28, 6142; CHECK-NEXT: in r29, 6243; CHECK-NEXT: ldd r25, Y+644; CHECK-NEXT: ldd r24, Y+545; CHECK-NEXT: sub r24, r2546; CHECK-NEXT: pop r2947; CHECK-NEXT: pop r2848; CHECK-NEXT: ret49 %c = sub i8 %a, %b50 ret i8 %c51}52 53; NOTE: All arguments are passed via the stack since the argument %a is too large.54define i8 @foo1([19 x i8] %a, i8 %b) {55; CHECK-LABEL: foo1:56; CHECK: ; %bb.0:57; CHECK-NEXT: push r2858; CHECK-NEXT: push r2959; CHECK-NEXT: in r28, 6160; CHECK-NEXT: in r29, 6261; CHECK-NEXT: ldd r25, Y+2462; CHECK-NEXT: ldd r24, Y+563; CHECK-NEXT: sub r24, r2564; CHECK-NEXT: pop r2965; CHECK-NEXT: pop r2866; CHECK-NEXT: ret67 %c = extractvalue [19 x i8] %a, 068 %d = sub i8 %c, %b69 ret i8 %d70}71 72; NOTE: The argument %b is passed via the stack, since the argument %a costs73; NOTE: total 18 registers though it is a 17-byte array.74define i8 @foo2([17 x i8] %a, i8 %b) {75; CHECK-LABEL: foo2:76; CHECK: ; %bb.0:77; CHECK-NEXT: push r2878; CHECK-NEXT: push r2979; CHECK-NEXT: in r28, 6180; CHECK-NEXT: in r29, 6281; CHECK-NEXT: mov r24, r882; CHECK-NEXT: ldd r25, Y+583; CHECK-NEXT: sub r24, r2584; CHECK-NEXT: pop r2985; CHECK-NEXT: pop r2886; CHECK-NEXT: ret87 %c = extractvalue [17 x i8] %a, 088 %d = sub i8 %c, %b89 ret i8 %d90}91 92; NOTE: Though %a costs 16 registers and 2 registers are vacant, the 4-byte93; NOTE: %b has to be dropped to the stack.94; NOTE: total 18 registers.95define i32 @foo3([4 x i32] %a, i32 %b) {96; CHECK-LABEL: foo3:97; CHECK: ; %bb.0:98; CHECK-NEXT: push r2899; CHECK-NEXT: push r29100; CHECK-NEXT: in r28, 61101; CHECK-NEXT: in r29, 62102; CHECK-NEXT: ldd r22, Y+5103; CHECK-NEXT: ldd r23, Y+6104; CHECK-NEXT: ldd r24, Y+7105; CHECK-NEXT: ldd r25, Y+8106; CHECK-NEXT: sub r22, r10107; CHECK-NEXT: sbc r23, r11108; CHECK-NEXT: sbc r24, r12109; CHECK-NEXT: sbc r25, r13110; CHECK-NEXT: pop r29111; CHECK-NEXT: pop r28112; CHECK-NEXT: ret113 %c = extractvalue [4 x i32] %a, 0114 %d = sub nsw i32 %b, %c115 ret i32 %d116}117 118; NOTE: Both %1 and %2 are passed via stack, and each has a 1-byte slot.119define i8 @foo4([17 x i8] %0, i8 %1, i8 %2) {120; CHECK-LABEL: foo4:121; CHECK: ; %bb.0:122; CHECK-NEXT: push r8123; CHECK-NEXT: push r28124; CHECK-NEXT: push r29125; CHECK-NEXT: in r28, 61126; CHECK-NEXT: in r29, 62127; CHECK-NEXT: ldd r24, Y+6128; CHECK-NEXT: sub r8, r24129; CHECK-NEXT: ldd r24, Y+7130; CHECK-NEXT: add r24, r8131; CHECK-NEXT: pop r29132; CHECK-NEXT: pop r28133; CHECK-NEXT: pop r8134; CHECK-NEXT: ret135 %4 = extractvalue [17 x i8] %0, 0136 %5 = sub i8 %4, %1137 %6 = add i8 %5, %2138 ret i8 %6139}140