172 lines · plain
1; RUN: llc -mtriple=avr < %s | FileCheck %s2 3; CHECK-LABEL: ret_void_args_i84define void @ret_void_args_i8(i8 %a) {5 ; CHECK: sts 4, r246 store volatile i8 %a, ptr inttoptr (i64 4 to ptr)7 ret void8}9 10; CHECK-LABEL: ret_void_args_i8_i3211define void @ret_void_args_i8_i32(i8 %a, i32 %b) {12 ; CHECK: sts 4, r2413 store volatile i8 %a, ptr inttoptr (i64 4 to ptr)14 15 ; CHECK-NEXT: sts 8, r2316 ; CHECK-NEXT: sts 7, r2217 ; CHECK-NEXT: sts 6, r2118 ; CHECK-NEXT: sts 5, r2019 store volatile i32 %b, ptr inttoptr (i64 5 to ptr)20 ret void21}22 23; CHECK-LABEL: ret_void_args_i8_i8_i8_i824define void @ret_void_args_i8_i8_i8_i8(i8 %a, i8 %b, i8 %c, i8 %d) {25 ; CHECK: sts 4, r2426 store volatile i8 %a, ptr inttoptr (i64 4 to ptr)27 ; CHECK-NEXT: sts 5, r2228 store volatile i8 %b, ptr inttoptr (i64 5 to ptr)29 ; CHECK-NEXT: sts 6, r2030 store volatile i8 %c, ptr inttoptr (i64 6 to ptr)31 ; CHECK-NEXT: sts 7, r1832 store volatile i8 %d, ptr inttoptr (i64 7 to ptr)33 ret void34}35 36; CHECK-LABEL: ret_void_args_i32_16_i837define void @ret_void_args_i32_16_i8(i32 %a, i16 %b, i8 %c) {38 ; CHECK: sts 7, r2539 ; CHECK-NEXT: sts 6, r2440 ; CHECK-NEXT: sts 5, r2341 ; CHECK-NEXT: sts 4, r2242 store volatile i32 %a, ptr inttoptr (i64 4 to ptr)43 44 ; CHECK-NEXT: sts 5, r2145 ; CHECK-NEXT: sts 4, r2046 store volatile i16 %b, ptr inttoptr (i64 4 to ptr)47 48 ; CHECK-NEXT: sts 4, r1849 store volatile i8 %c, ptr inttoptr (i64 4 to ptr)50 ret void51}52 53; CHECK-LABEL: ret_void_args_i6454define void @ret_void_args_i64(i64 %a) {55 ; CHECK: sts 11, r2556 ; CHECK-NEXT: sts 10, r2457 ; CHECK-NEXT: sts 9, r2358 ; CHECK-NEXT: sts 8, r2259 ; CHECK-NEXT: sts 7, r2160 ; CHECK-NEXT: sts 6, r2061 ; CHECK-NEXT: sts 5, r1962 ; CHECK-NEXT: sts 4, r1863 store volatile i64 %a, ptr inttoptr (i64 4 to ptr)64 ret void65}66 67; CHECK-LABEL: ret_void_args_i64_i6468define void @ret_void_args_i64_i64(i64 %a, i64 %b) {69 ; CHECK-DAG: sts 11, r2570 ; CHECK-DAG: sts 10, r2471 ; CHECK-DAG: sts 9, r2372 ; CHECK-DAG: sts 8, r2273 ; CHECK-DAG: sts 7, r2174 ; CHECK-DAG: sts 6, r2075 ; CHECK-DAG: sts 5, r1976 ; CHECK-DAG: sts 4, r1877 store volatile i64 %a, ptr inttoptr (i64 4 to ptr)78 79 ; CHECK-DAG: sts 11, r1780 ; CHECK-DAG: sts 10, r1681 ; CHECK-DAG: sts 9, r1582 ; CHECK-DAG: sts 8, r1483 ; CHECK-DAG: sts 7, r1384 ; CHECK-DAG: sts 6, r1285 ; CHECK-DAG: sts 5, r1186 ; CHECK-DAG: sts 4, r1087 store volatile i64 %b, ptr inttoptr (i64 4 to ptr)88 ret void89}90 91; This is exactly enough to hit the limit of what can be passed92; completely in registers.93; CHECK-LABEL: ret_void_args_i64_i64_i1694define void @ret_void_args_i64_i64_i16(i64 %a, i64 %b, i16 %c) {95 ; CHECK: sts 5, r996 ; CHECK-NEXT: sts 4, r897 store volatile i16 %c, ptr inttoptr (i64 4 to ptr)98 ret void99}100 101; NOTE: Both %a (i8) and %b (i8) cost two registers.102define i8 @foo0(i8 %a, i8 %b) {103; CHECK-LABEL: foo0:104; CHECK: ; %bb.0:105; CHECK-NEXT: sub r24, r22106; CHECK-NEXT: ret107 %c = sub i8 %a, %b108 ret i8 %c109}110 111; NOTE: Both %a (i16) and %b (i16) cost two registers.112define i16 @foo1(i16 %a, i16 %b) {113; CHECK-LABEL: foo1:114; CHECK: ; %bb.0:115; CHECK-NEXT: sub r24, r22116; CHECK-NEXT: sbc r25, r23117; CHECK-NEXT: ret118 %c = sub i16 %a, %b119 ret i16 %c120}121 122; NOTE: Both %a (i32) and %b (i32) cost four registers.123define i32 @foo2(i32 %a, i32 %b) {124; CHECK-LABEL: foo2:125; CHECK: ; %bb.0:126; CHECK-NEXT: sub r22, r18127; CHECK-NEXT: sbc r23, r19128; CHECK-NEXT: sbc r24, r20129; CHECK-NEXT: sbc r25, r21130; CHECK-NEXT: ret131 %c = sub i32 %a, %b132 ret i32 %c133}134 135; NOTE: Each argument costs four registers, and total 16 registers are used.136define i32 @foo3(i32 %a, i32 %b, i32 %c, i32 %d) {137; CHECK-LABEL: foo3:138; CHECK: ; %bb.0:139; CHECK-NEXT: sub r22, r10140; CHECK-NEXT: sbc r23, r11141; CHECK-NEXT: sbc r24, r12142; CHECK-NEXT: sbc r25, r13143; CHECK-NEXT: ret144 %e = sub nsw i32 %a, %d145 ret i32 %e146}147 148; NOTE: Each argument (except %e) cost four registers, and total 16 registers149; NOTE: are used. Though there are still 2 registers are vacant, the %e has150; NOTE: to be dropped to the stack.151define i32 @foo4(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) {152; CHECK-LABEL: foo4:153; CHECK: ; %bb.0:154; CHECK-NEXT: push r28155; CHECK-NEXT: push r29156; CHECK-NEXT: in r28, 61157; CHECK-NEXT: in r29, 62158; CHECK-NEXT: ldd r18, Y+5159; CHECK-NEXT: ldd r19, Y+6160; CHECK-NEXT: ldd r20, Y+7161; CHECK-NEXT: ldd r21, Y+8162; CHECK-NEXT: sub r22, r18163; CHECK-NEXT: sbc r23, r19164; CHECK-NEXT: sbc r24, r20165; CHECK-NEXT: sbc r25, r21166; CHECK-NEXT: pop r29167; CHECK-NEXT: pop r28168; CHECK-NEXT: ret169 %f = sub nsw i32 %a, %e170 ret i32 %f171}172