brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.8 KiB · 60a45f7 Raw
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