brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.7 KiB · 3d783d1 Raw
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