Mercurial > pub > dyncall > dyncall
changeset 647:9d630465f6f4
- RISC-V64 asm examples
author | Tassilo Philipp |
---|---|
date | Tue, 20 Feb 2024 15:56:25 +0100 |
parents | 57faec8b7600 |
children | a54e1f04588f |
files | doc/disas_examples/riscv64.rvg.disas |
diffstat | 1 files changed, 2563 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/disas_examples/riscv64.rvg.disas Tue Feb 20 15:56:25 2024 +0100 @@ -0,0 +1,2563 @@ +; #include <stdlib.h> +; +; void leaf_call(int b, int c, int d, int e, int f, int g, int h) +; { +; } +; +; void nonleaf_call(int a, int b, int c, int d, int e, int f, int g, int h) +; { +; /* use some local data */ +; *(char*)alloca(220) = 'L'; +; leaf_call(b, c, d, e, f, g, h); +; } +; +; int main() +; { +; nonleaf_call(0, 1, 2, 3, 4, 5, 6, 7); +; return 0; +; } + + + +; output from freebsd-14.0-riscv64 w/ clang 17.0.6 (w/ flags to simplify: -fno-stack-protector -fno-pic) + +0000000000000000 <leaf_call>: + 0: 79 71 addi sp, sp, -48 + 2: 06 f4 sd ra, 40(sp) + 4: 22 f0 sd s0, 32(sp) + 6: 00 18 addi s0, sp, 48 + 8: 23 26 a4 fe sw a0, -20(s0) + c: 23 24 b4 fe sw a1, -24(s0) + 10: 23 22 c4 fe sw a2, -28(s0) + 14: 23 20 d4 fe sw a3, -32(s0) + 18: 23 2e e4 fc sw a4, -36(s0) + 1c: 23 2c f4 fc sw a5, -40(s0) + 20: 23 2a 04 fd sw a6, -44(s0) + 24: a2 70 ld ra, 40(sp) + 26: 02 74 ld s0, 32(sp) + 28: 45 61 addi sp, sp, 48 + 2a: 82 80 ret + +000000000000002c <nonleaf_call>: + 2c: 6d 71 addi sp, sp, -272 + 2e: 06 e6 sd ra, 264(sp) + 30: 22 e2 sd s0, 256(sp) + 32: 00 0a addi s0, sp, 272 + 34: 23 26 a4 fe sw a0, -20(s0) + 38: 23 24 b4 fe sw a1, -24(s0) + 3c: 23 22 c4 fe sw a2, -28(s0) + 40: 23 20 d4 fe sw a3, -32(s0) + 44: 23 2e e4 fc sw a4, -36(s0) + 48: 23 2c f4 fc sw a5, -40(s0) + 4c: 23 2a 04 fd sw a6, -44(s0) + 50: 23 28 14 fd sw a7, -48(s0) + 54: 13 05 c0 04 li a0, 76 + 58: 23 08 a4 ee sb a0, -272(s0) + 5c: 03 25 84 fe lw a0, -24(s0) + 60: 83 25 44 fe lw a1, -28(s0) + 64: 03 26 04 fe lw a2, -32(s0) + 68: 83 26 c4 fd lw a3, -36(s0) + 6c: 03 27 84 fd lw a4, -40(s0) + 70: 83 27 44 fd lw a5, -44(s0) + 74: 03 28 04 fd lw a6, -48(s0) + 78: 97 00 00 00 auipc ra, 0 + 7c: e7 80 00 00 jalr ra + 80: b2 60 ld ra, 264(sp) + 82: 12 64 ld s0, 256(sp) + 84: 51 61 addi sp, sp, 272 + 86: 82 80 ret + +0000000000000088 <main>: + 88: 01 11 addi sp, sp, -32 + 8a: 06 ec sd ra, 24(sp) + 8c: 22 e8 sd s0, 16(sp) + 8e: 00 10 addi s0, sp, 32 + 90: 01 45 li a0, 0 + 92: 23 30 a4 fe sd a0, -32(s0) + 96: 23 26 a4 fe sw a0, -20(s0) + 9a: 85 45 li a1, 1 + 9c: 09 46 li a2, 2 + 9e: 8d 46 li a3, 3 + a0: 11 47 li a4, 4 + a2: 95 47 li a5, 5 + a4: 19 48 li a6, 6 + a6: 9d 48 li a7, 7 + a8: 97 00 00 00 auipc ra, 0 + ac: e7 80 00 00 jalr ra + b0: 03 35 04 fe ld a0, -32(s0) + b4: e2 60 ld ra, 24(sp) + b6: 42 64 ld s0, 16(sp) + b8: 05 61 addi sp, sp, 32 + ba: 82 80 ret + + + +; output from debian-trixie_20240211-riscv64 w/ gcc 13.2.0 (w/ flags to simplify: -fno-stack-protector -fno-pic) + +0000000000000628 <leaf_call>: + 628: 7179 addi sp,sp,-48 + 62a: f422 sd s0,40(sp) + 62c: 1800 addi s0,sp,48 + 62e: 832a mv t1,a0 + 630: 88ae mv a7,a1 + 632: 8532 mv a0,a2 + 634: 85b6 mv a1,a3 + 636: 863a mv a2,a4 + 638: 86be mv a3,a5 + 63a: 8742 mv a4,a6 + 63c: 879a mv a5,t1 + 63e: fef42623 sw a5,-20(s0) + 642: 87c6 mv a5,a7 + 644: fef42423 sw a5,-24(s0) + 648: 87aa mv a5,a0 + 64a: fef42223 sw a5,-28(s0) + 64e: 87ae mv a5,a1 + 650: fef42023 sw a5,-32(s0) + 654: 87b2 mv a5,a2 + 656: fcf42e23 sw a5,-36(s0) + 65a: 87b6 mv a5,a3 + 65c: fcf42c23 sw a5,-40(s0) + 660: 87ba mv a5,a4 + 662: fcf42a23 sw a5,-44(s0) + 666: 0001 nop + 668: 7422 ld s0,40(sp) + 66a: 6145 addi sp,sp,48 + 66c: 8082 ret + +000000000000066e <nonleaf_call>: + 66e: 7179 addi sp,sp,-48 + 670: f406 sd ra,40(sp) + 672: f022 sd s0,32(sp) + 674: 1800 addi s0,sp,48 + 676: 8eaa mv t4,a0 + 678: 8e2e mv t3,a1 + 67a: 8332 mv t1,a2 + 67c: 8536 mv a0,a3 + 67e: 85ba mv a1,a4 + 680: 863e mv a2,a5 + 682: 86c2 mv a3,a6 + 684: 8746 mv a4,a7 + 686: 87f6 mv a5,t4 + 688: fef42623 sw a5,-20(s0) + 68c: 87f2 mv a5,t3 + 68e: fef42423 sw a5,-24(s0) + 692: 879a mv a5,t1 + 694: fef42223 sw a5,-28(s0) + 698: 87aa mv a5,a0 + 69a: fef42023 sw a5,-32(s0) + 69e: 87ae mv a5,a1 + 6a0: fcf42e23 sw a5,-36(s0) + 6a4: 87b2 mv a5,a2 + 6a6: fcf42c23 sw a5,-40(s0) + 6aa: 87b6 mv a5,a3 + 6ac: fcf42a23 sw a5,-44(s0) + 6b0: 87ba mv a5,a4 + 6b2: fcf42823 sw a5,-48(s0) + 6b6: 7115 addi sp,sp,-224 + 6b8: 878a mv a5,sp + 6ba: 07bd addi a5,a5,15 + 6bc: 8391 srli a5,a5,0x4 + 6be: 0792 slli a5,a5,0x4 + 6c0: 873e mv a4,a5 + 6c2: 04c00793 li a5,76 + 6c6: 00f70023 sb a5,0(a4) + 6ca: fd042803 lw a6,-48(s0) + 6ce: fd442783 lw a5,-44(s0) + 6d2: fd842703 lw a4,-40(s0) + 6d6: fdc42683 lw a3,-36(s0) + 6da: fe042603 lw a2,-32(s0) + 6de: fe442583 lw a1,-28(s0) + 6e2: fe842503 lw a0,-24(s0) + 6e6: f43ff0ef jal 628 <leaf_call> + 6ea: 0001 nop + 6ec: fd040113 addi sp,s0,-48 + 6f0: 70a2 ld ra,40(sp) + 6f2: 7402 ld s0,32(sp) + 6f4: 6145 addi sp,sp,48 + 6f6: 8082 ret + +00000000000006f8 <main>: + 6f8: 1141 addi sp,sp,-16 + 6fa: e406 sd ra,8(sp) + 6fc: e022 sd s0,0(sp) + 6fe: 0800 addi s0,sp,16 + 700: 489d li a7,7 + 702: 4819 li a6,6 + 704: 4795 li a5,5 + 706: 4711 li a4,4 + 708: 468d li a3,3 + 70a: 4609 li a2,2 + 70c: 4585 li a1,1 + 70e: 4501 li a0,0 + 710: f5fff0ef jal 66e <nonleaf_call> + 714: 4781 li a5,0 + 716: 853e mv a0,a5 + 718: 60a2 ld ra,8(sp) + 71a: 6402 ld s0,0(sp) + 71c: 0141 addi sp,sp,16 + 71e: 8082 ret + + + + +; ---------- same with more args so stack is also used ----------> + +; #include <stdlib.h> +; +; void leaf_call(int b, int c, int d, int e, int f, int g, int h, int i, int j) +; { +; } +; +; void nonleaf_call(int a, int b, int c, int d, int e, int f, int g, int h, int i, int j) +; { +; /* use some local data */ +; *(char*)alloca(220) = 'L'; +; leaf_call(b, c, d, e, f, g, h, i, j); +; } +; +; int main() +; { +; nonleaf_call(0, 1, 2, 3, 4, 5, 6, 7, 8, 9); +; return 0; +; } + + + +; output from freebsd-14.0-riscv64 w/ clang 17.0.6 (w/ flags to simplify: -fno-stack-protector -fno-pic) + +0000000000000000 <leaf_call>: + 0: 39 71 addi sp, sp, -64 + 2: 06 fc sd ra, 56(sp) + 4: 22 f8 sd s0, 48(sp) + 6: 80 00 addi s0, sp, 64 + 8: aa 82 mv t0, a0 + a: 08 60 ld a0, 0(s0) + c: 23 26 54 fe sw t0, -20(s0) + 10: 23 24 b4 fe sw a1, -24(s0) + 14: 23 22 c4 fe sw a2, -28(s0) + 18: 23 20 d4 fe sw a3, -32(s0) + 1c: 23 2e e4 fc sw a4, -36(s0) + 20: 23 2c f4 fc sw a5, -40(s0) + 24: 23 2a 04 fd sw a6, -44(s0) + 28: 23 28 14 fd sw a7, -48(s0) + 2c: 23 26 a4 fc sw a0, -52(s0) + 30: e2 70 ld ra, 56(sp) + 32: 42 74 ld s0, 48(sp) + 34: 21 61 addi sp, sp, 64 + 36: 82 80 ret + +0000000000000038 <nonleaf_call>: + 38: 69 71 addi sp, sp, -304 + 3a: 06 f6 sd ra, 296(sp) + 3c: 22 f2 sd s0, 288(sp) + 3e: 00 1a addi s0, sp, 304 + 40: ae 82 mv t0, a1 + 42: 2a 83 mv t1, a0 + 44: 08 64 ld a0, 8(s0) + 46: 0c 60 ld a1, 0(s0) + 48: 23 26 64 fe sw t1, -20(s0) + 4c: 23 24 54 fe sw t0, -24(s0) + 50: 23 22 c4 fe sw a2, -28(s0) + 54: 23 20 d4 fe sw a3, -32(s0) + 58: 23 2e e4 fc sw a4, -36(s0) + 5c: 23 2c f4 fc sw a5, -40(s0) + 60: 23 2a 04 fd sw a6, -44(s0) + 64: 23 28 14 fd sw a7, -48(s0) + 68: 23 26 b4 fc sw a1, -52(s0) + 6c: 23 24 a4 fc sw a0, -56(s0) + 70: 13 05 c0 04 li a0, 76 + 74: 23 00 a4 ee sb a0, -288(s0) + 78: 03 25 84 fe lw a0, -24(s0) + 7c: 83 25 44 fe lw a1, -28(s0) + 80: 03 26 04 fe lw a2, -32(s0) + 84: 83 26 c4 fd lw a3, -36(s0) + 88: 03 27 84 fd lw a4, -40(s0) + 8c: 83 27 44 fd lw a5, -44(s0) + 90: 03 28 04 fd lw a6, -48(s0) + 94: 83 28 c4 fc lw a7, -52(s0) + 98: 83 22 84 fc lw t0, -56(s0) + 9c: 0a 83 mv t1, sp + 9e: 23 30 53 00 sd t0, 0(t1) + a2: 97 00 00 00 auipc ra, 0 + a6: e7 80 00 00 jalr ra + aa: b2 70 ld ra, 296(sp) + ac: 12 74 ld s0, 288(sp) + ae: 55 61 addi sp, sp, 304 + b0: 82 80 ret + +00000000000000b2 <main>: + b2: 79 71 addi sp, sp, -48 + b4: 06 f4 sd ra, 40(sp) + b6: 22 f0 sd s0, 32(sp) + b8: 00 18 addi s0, sp, 48 + ba: 01 45 li a0, 0 + bc: 23 30 a4 fe sd a0, -32(s0) + c0: 23 26 a4 fe sw a0, -20(s0) + c4: 0a 86 mv a2, sp + c6: a5 45 li a1, 9 + c8: 0c e6 sd a1, 8(a2) + ca: a1 45 li a1, 8 + cc: 0c e2 sd a1, 0(a2) + ce: 85 45 li a1, 1 + d0: 09 46 li a2, 2 + d2: 8d 46 li a3, 3 + d4: 11 47 li a4, 4 + d6: 95 47 li a5, 5 + d8: 19 48 li a6, 6 + da: 9d 48 li a7, 7 + dc: 97 00 00 00 auipc ra, 0 + e0: e7 80 00 00 jalr ra + e4: 03 35 04 fe ld a0, -32(s0) + e8: a2 70 ld ra, 40(sp) + ea: 02 74 ld s0, 32(sp) + ec: 45 61 addi sp, sp, 48 + ee: 82 80 ret + + + +; output from debian-trixie_20240211-riscv64 w/ gcc 13.2.0 (w/ flags to simplify: -fno-stack-protector -fno-pic) + +0000000000000628 <leaf_call>: + 628: 7179 addi sp,sp,-48 + 62a: f422 sd s0,40(sp) + 62c: 1800 addi s0,sp,48 + 62e: 8eaa mv t4,a0 + 630: 8e2e mv t3,a1 + 632: 8332 mv t1,a2 + 634: 8536 mv a0,a3 + 636: 85ba mv a1,a4 + 638: 863e mv a2,a5 + 63a: 86c2 mv a3,a6 + 63c: 8746 mv a4,a7 + 63e: 87f6 mv a5,t4 + 640: fef42623 sw a5,-20(s0) + 644: 87f2 mv a5,t3 + 646: fef42423 sw a5,-24(s0) + 64a: 879a mv a5,t1 + 64c: fef42223 sw a5,-28(s0) + 650: 87aa mv a5,a0 + 652: fef42023 sw a5,-32(s0) + 656: 87ae mv a5,a1 + 658: fcf42e23 sw a5,-36(s0) + 65c: 87b2 mv a5,a2 + 65e: fcf42c23 sw a5,-40(s0) + 662: 87b6 mv a5,a3 + 664: fcf42a23 sw a5,-44(s0) + 668: 87ba mv a5,a4 + 66a: fcf42823 sw a5,-48(s0) + 66e: 0001 nop + 670: 7422 ld s0,40(sp) + 672: 6145 addi sp,sp,48 + 674: 8082 ret + +0000000000000676 <nonleaf_call>: + 676: 7139 addi sp,sp,-64 + 678: fc06 sd ra,56(sp) + 67a: f822 sd s0,48(sp) + 67c: 0080 addi s0,sp,64 + 67e: 8eaa mv t4,a0 + 680: 8e2e mv t3,a1 + 682: 8332 mv t1,a2 + 684: 8536 mv a0,a3 + 686: 85ba mv a1,a4 + 688: 863e mv a2,a5 + 68a: 86c2 mv a3,a6 + 68c: 8746 mv a4,a7 + 68e: 87f6 mv a5,t4 + 690: fef42623 sw a5,-20(s0) + 694: 87f2 mv a5,t3 + 696: fef42423 sw a5,-24(s0) + 69a: 879a mv a5,t1 + 69c: fef42223 sw a5,-28(s0) + 6a0: 87aa mv a5,a0 + 6a2: fef42023 sw a5,-32(s0) + 6a6: 87ae mv a5,a1 + 6a8: fcf42e23 sw a5,-36(s0) + 6ac: 87b2 mv a5,a2 + 6ae: fcf42c23 sw a5,-40(s0) + 6b2: 87b6 mv a5,a3 + 6b4: fcf42a23 sw a5,-44(s0) + 6b8: 87ba mv a5,a4 + 6ba: fcf42823 sw a5,-48(s0) + 6be: 7115 addi sp,sp,-224 + 6c0: 081c addi a5,sp,16 + 6c2: 07bd addi a5,a5,15 + 6c4: 8391 srli a5,a5,0x4 + 6c6: 0792 slli a5,a5,0x4 + 6c8: 873e mv a4,a5 + 6ca: 04c00793 li a5,76 + 6ce: 00f70023 sb a5,0(a4) + 6d2: 00042883 lw a7,0(s0) + 6d6: fd042803 lw a6,-48(s0) + 6da: fd442303 lw t1,-44(s0) + 6de: fd842703 lw a4,-40(s0) + 6e2: fdc42683 lw a3,-36(s0) + 6e6: fe042603 lw a2,-32(s0) + 6ea: fe442583 lw a1,-28(s0) + 6ee: fe842503 lw a0,-24(s0) + 6f2: 441c lw a5,8(s0) + 6f4: e03e sd a5,0(sp) + 6f6: 879a mv a5,t1 + 6f8: f31ff0ef jal 628 <leaf_call> + 6fc: 0001 nop + 6fe: fc040113 addi sp,s0,-64 + 702: 70e2 ld ra,56(sp) + 704: 7442 ld s0,48(sp) + 706: 6121 addi sp,sp,64 + 708: 8082 ret + +000000000000070a <main>: + 70a: 1101 addi sp,sp,-32 + 70c: ec06 sd ra,24(sp) + 70e: e822 sd s0,16(sp) + 710: 1000 addi s0,sp,32 + 712: 47a5 li a5,9 + 714: e43e sd a5,8(sp) + 716: 47a1 li a5,8 + 718: e03e sd a5,0(sp) + 71a: 489d li a7,7 + 71c: 4819 li a6,6 + 71e: 4795 li a5,5 + 720: 4711 li a4,4 + 722: 468d li a3,3 + 724: 4609 li a2,2 + 726: 4585 li a1,1 + 728: 4501 li a0,0 + 72a: f4dff0ef jal 676 <nonleaf_call> + 72e: 4781 li a5,0 + 730: 853e mv a0,a5 + 732: 60e2 ld ra,24(sp) + 734: 6442 ld s0,16(sp) + 736: 6105 addi sp,sp,32 + 738: 8082 ret + + + +; ---------- for spilling ----------> + +; #include <stdlib.h> +; #include <stdarg.h> +; +; void leaf_call(int b, int c, int d, int e, int f, int g, int h, int i, int j) +; { +; } +; +; void nonleaf_call(int a, ...) +; { +; int b,c,d,e,f,g,h,i,j; +; va_list ap; +; va_start(ap, a); +; b = va_arg(ap, int); +; c = va_arg(ap, int); +; d = va_arg(ap, int); +; e = va_arg(ap, int); +; f = va_arg(ap, int); +; g = va_arg(ap, int); +; h = va_arg(ap, int); +; i = va_arg(ap, int); +; j = va_arg(ap, int); +; +; /* use some local data */ +; *(char*)alloca(220) = 'L'; +; leaf_call(b, c, d, e, f, g, h, i, j); +; } +; +; int main() +; { +; nonleaf_call(0, 1, 2, 3, 4, 5, 6, 7, 8, 9); +; return 0; +; } + + + +; output from freebsd-14.0-riscv64 w/ clang 17.0.6 (w/ flags to simplify: -fno-stack-protector -fno-pic) + +0000000000000000 <leaf_call>: + 0: 39 71 addi sp, sp, -64 + 2: 06 fc sd ra, 56(sp) + 4: 22 f8 sd s0, 48(sp) + 6: 80 00 addi s0, sp, 64 + 8: aa 82 mv t0, a0 + a: 08 60 ld a0, 0(s0) + c: 23 26 54 fe sw t0, -20(s0) + 10: 23 24 b4 fe sw a1, -24(s0) + 14: 23 22 c4 fe sw a2, -28(s0) + 18: 23 20 d4 fe sw a3, -32(s0) + 1c: 23 2e e4 fc sw a4, -36(s0) + 20: 23 2c f4 fc sw a5, -40(s0) + 24: 23 2a 04 fd sw a6, -44(s0) + 28: 23 28 14 fd sw a7, -48(s0) + 2c: 23 26 a4 fc sw a0, -52(s0) + 30: e2 70 ld ra, 56(sp) + 32: 42 74 ld s0, 48(sp) + 34: 21 61 addi sp, sp, 64 + 36: 82 80 ret + +0000000000000038 <nonleaf_call>: + 38: 49 71 addi sp, sp, -368 + 3a: 06 f6 sd ra, 296(sp) + 3c: 22 f2 sd s0, 288(sp) + 3e: 00 1a addi s0, sp, 304 + 40: 23 3c 14 03 sd a7, 56(s0) + 44: 23 38 04 03 sd a6, 48(s0) + 48: 1c f4 sd a5, 40(s0) + 4a: 18 f0 sd a4, 32(s0) + 4c: 14 ec sd a3, 24(s0) + 4e: 10 e8 sd a2, 16(s0) + 50: 0c e4 sd a1, 8(s0) + 52: 23 26 a4 fe sw a0, -20(s0) + 56: 13 05 84 00 addi a0, s0, 8 + 5a: 23 30 a4 fc sd a0, -64(s0) + 5e: 03 35 04 fc ld a0, -64(s0) + 62: 93 05 85 00 addi a1, a0, 8 + 66: 23 30 b4 fc sd a1, -64(s0) + 6a: 08 41 lw a0, 0(a0) + 6c: 23 24 a4 fe sw a0, -24(s0) + 70: 03 35 04 fc ld a0, -64(s0) + 74: 93 05 85 00 addi a1, a0, 8 + 78: 23 30 b4 fc sd a1, -64(s0) + 7c: 08 41 lw a0, 0(a0) + 7e: 23 22 a4 fe sw a0, -28(s0) + 82: 03 35 04 fc ld a0, -64(s0) + 86: 93 05 85 00 addi a1, a0, 8 + 8a: 23 30 b4 fc sd a1, -64(s0) + 8e: 08 41 lw a0, 0(a0) + 90: 23 20 a4 fe sw a0, -32(s0) + 94: 03 35 04 fc ld a0, -64(s0) + 98: 93 05 85 00 addi a1, a0, 8 + 9c: 23 30 b4 fc sd a1, -64(s0) + a0: 08 41 lw a0, 0(a0) + a2: 23 2e a4 fc sw a0, -36(s0) + a6: 03 35 04 fc ld a0, -64(s0) + aa: 93 05 85 00 addi a1, a0, 8 + ae: 23 30 b4 fc sd a1, -64(s0) + b2: 08 41 lw a0, 0(a0) + b4: 23 2c a4 fc sw a0, -40(s0) + b8: 03 35 04 fc ld a0, -64(s0) + bc: 93 05 85 00 addi a1, a0, 8 + c0: 23 30 b4 fc sd a1, -64(s0) + c4: 08 41 lw a0, 0(a0) + c6: 23 2a a4 fc sw a0, -44(s0) + ca: 03 35 04 fc ld a0, -64(s0) + ce: 93 05 85 00 addi a1, a0, 8 + d2: 23 30 b4 fc sd a1, -64(s0) + d6: 08 41 lw a0, 0(a0) + d8: 23 28 a4 fc sw a0, -48(s0) + dc: 03 35 04 fc ld a0, -64(s0) + e0: 93 05 85 00 addi a1, a0, 8 + e4: 23 30 b4 fc sd a1, -64(s0) + e8: 08 41 lw a0, 0(a0) + ea: 23 26 a4 fc sw a0, -52(s0) + ee: 03 35 04 fc ld a0, -64(s0) + f2: 93 05 85 00 addi a1, a0, 8 + f6: 23 30 b4 fc sd a1, -64(s0) + fa: 08 41 lw a0, 0(a0) + fc: 23 24 a4 fc sw a0, -56(s0) + 100: 13 05 c0 04 li a0, 76 + 104: 23 00 a4 ee sb a0, -288(s0) + 108: 03 25 84 fe lw a0, -24(s0) + 10c: 83 25 44 fe lw a1, -28(s0) + 110: 03 26 04 fe lw a2, -32(s0) + 114: 83 26 c4 fd lw a3, -36(s0) + 118: 03 27 84 fd lw a4, -40(s0) + 11c: 83 27 44 fd lw a5, -44(s0) + 120: 03 28 04 fd lw a6, -48(s0) + 124: 83 28 c4 fc lw a7, -52(s0) + 128: 83 22 84 fc lw t0, -56(s0) + 12c: 0a 83 mv t1, sp + 12e: 23 30 53 00 sd t0, 0(t1) + 132: 97 00 00 00 auipc ra, 0 + 136: e7 80 00 00 jalr ra + 13a: b2 70 ld ra, 296(sp) + 13c: 12 74 ld s0, 288(sp) + 13e: 75 61 addi sp, sp, 368 + 140: 82 80 ret + +0000000000000142 <main>: + 142: 79 71 addi sp, sp, -48 + 144: 06 f4 sd ra, 40(sp) + 146: 22 f0 sd s0, 32(sp) + 148: 00 18 addi s0, sp, 48 + 14a: 01 45 li a0, 0 + 14c: 23 30 a4 fe sd a0, -32(s0) + 150: 23 26 a4 fe sw a0, -20(s0) + 154: 0a 86 mv a2, sp + 156: a5 45 li a1, 9 + 158: 0c e6 sd a1, 8(a2) + 15a: a1 45 li a1, 8 + 15c: 0c e2 sd a1, 0(a2) + 15e: 85 45 li a1, 1 + 160: 09 46 li a2, 2 + 162: 8d 46 li a3, 3 + 164: 11 47 li a4, 4 + 166: 95 47 li a5, 5 + 168: 19 48 li a6, 6 + 16a: 9d 48 li a7, 7 + 16c: 97 00 00 00 auipc ra, 0 + 170: e7 80 00 00 jalr ra + 174: 03 35 04 fe ld a0, -32(s0) + 178: a2 70 ld ra, 40(sp) + 17a: 02 74 ld s0, 32(sp) + 17c: 45 61 addi sp, sp, 48 + 17e: 82 80 ret + + + +; output from debian-trixie_20240211-riscv64 w/ gcc 13.2.0 (w/ flags to simplify: -fno-stack-protector -fno-pic) + +0000000000000628 <leaf_call>: + 628: 7179 addi sp,sp,-48 + 62a: f422 sd s0,40(sp) + 62c: 1800 addi s0,sp,48 + 62e: 8eaa mv t4,a0 + 630: 8e2e mv t3,a1 + 632: 8332 mv t1,a2 + 634: 8536 mv a0,a3 + 636: 85ba mv a1,a4 + 638: 863e mv a2,a5 + 63a: 86c2 mv a3,a6 + 63c: 8746 mv a4,a7 + 63e: 87f6 mv a5,t4 + 640: fef42623 sw a5,-20(s0) + 644: 87f2 mv a5,t3 + 646: fef42423 sw a5,-24(s0) + 64a: 879a mv a5,t1 + 64c: fef42223 sw a5,-28(s0) + 650: 87aa mv a5,a0 + 652: fef42023 sw a5,-32(s0) + 656: 87ae mv a5,a1 + 658: fcf42e23 sw a5,-36(s0) + 65c: 87b2 mv a5,a2 + 65e: fcf42c23 sw a5,-40(s0) + 662: 87b6 mv a5,a3 + 664: fcf42a23 sw a5,-44(s0) + 668: 87ba mv a5,a4 + 66a: fcf42823 sw a5,-48(s0) + 66e: 0001 nop + 670: 7422 ld s0,40(sp) + 672: 6145 addi sp,sp,48 + 674: 8082 ret + +0000000000000676 <nonleaf_call>: + 676: 7135 addi sp,sp,-160 + 678: ec86 sd ra,88(sp) + 67a: e8a2 sd s0,80(sp) + 67c: 1080 addi s0,sp,96 + 67e: e40c sd a1,8(s0) + 680: e810 sd a2,16(s0) + 682: ec14 sd a3,24(s0) + 684: f018 sd a4,32(s0) + 686: f41c sd a5,40(s0) + 688: 03043823 sd a6,48(s0) + 68c: 03143c23 sd a7,56(s0) + 690: 87aa mv a5,a0 + 692: faf42e23 sw a5,-68(s0) + 696: 04040793 addi a5,s0,64 + 69a: faf43823 sd a5,-80(s0) + 69e: fb043783 ld a5,-80(s0) + 6a2: fc878793 addi a5,a5,-56 + 6a6: fcf43023 sd a5,-64(s0) + 6aa: fc043783 ld a5,-64(s0) + 6ae: 00878713 addi a4,a5,8 + 6b2: fce43023 sd a4,-64(s0) + 6b6: 439c lw a5,0(a5) + 6b8: fef42623 sw a5,-20(s0) + 6bc: fc043783 ld a5,-64(s0) + 6c0: 00878713 addi a4,a5,8 + 6c4: fce43023 sd a4,-64(s0) + 6c8: 439c lw a5,0(a5) + 6ca: fef42423 sw a5,-24(s0) + 6ce: fc043783 ld a5,-64(s0) + 6d2: 00878713 addi a4,a5,8 + 6d6: fce43023 sd a4,-64(s0) + 6da: 439c lw a5,0(a5) + 6dc: fef42223 sw a5,-28(s0) + 6e0: fc043783 ld a5,-64(s0) + 6e4: 00878713 addi a4,a5,8 + 6e8: fce43023 sd a4,-64(s0) + 6ec: 439c lw a5,0(a5) + 6ee: fef42023 sw a5,-32(s0) + 6f2: fc043783 ld a5,-64(s0) + 6f6: 00878713 addi a4,a5,8 + 6fa: fce43023 sd a4,-64(s0) + 6fe: 439c lw a5,0(a5) + 700: fcf42e23 sw a5,-36(s0) + 704: fc043783 ld a5,-64(s0) + 708: 00878713 addi a4,a5,8 + 70c: fce43023 sd a4,-64(s0) + 710: 439c lw a5,0(a5) + 712: fcf42c23 sw a5,-40(s0) + 716: fc043783 ld a5,-64(s0) + 71a: 00878713 addi a4,a5,8 + 71e: fce43023 sd a4,-64(s0) + 722: 439c lw a5,0(a5) + 724: fcf42a23 sw a5,-44(s0) + 728: fc043783 ld a5,-64(s0) + 72c: 00878713 addi a4,a5,8 + 730: fce43023 sd a4,-64(s0) + 734: 439c lw a5,0(a5) + 736: fcf42823 sw a5,-48(s0) + 73a: fc043783 ld a5,-64(s0) + 73e: 00878713 addi a4,a5,8 + 742: fce43023 sd a4,-64(s0) + 746: 439c lw a5,0(a5) + 748: fcf42623 sw a5,-52(s0) + 74c: 7115 addi sp,sp,-224 + 74e: 081c addi a5,sp,16 + 750: 07bd addi a5,a5,15 + 752: 8391 srli a5,a5,0x4 + 754: 0792 slli a5,a5,0x4 + 756: 873e mv a4,a5 + 758: 04c00793 li a5,76 + 75c: 00f70023 sb a5,0(a4) + 760: fd042883 lw a7,-48(s0) + 764: fd442803 lw a6,-44(s0) + 768: fd842303 lw t1,-40(s0) + 76c: fdc42703 lw a4,-36(s0) + 770: fe042683 lw a3,-32(s0) + 774: fe442603 lw a2,-28(s0) + 778: fe842583 lw a1,-24(s0) + 77c: fec42503 lw a0,-20(s0) + 780: fcc42783 lw a5,-52(s0) + 784: e03e sd a5,0(sp) + 786: 879a mv a5,t1 + 788: ea1ff0ef jal 628 <leaf_call> + 78c: 0001 nop + 78e: fa040113 addi sp,s0,-96 + 792: 60e6 ld ra,88(sp) + 794: 6446 ld s0,80(sp) + 796: 610d addi sp,sp,160 + 798: 8082 ret + +000000000000079a <main>: + 79a: 1101 addi sp,sp,-32 + 79c: ec06 sd ra,24(sp) + 79e: e822 sd s0,16(sp) + 7a0: 1000 addi s0,sp,32 + 7a2: 47a5 li a5,9 + 7a4: e43e sd a5,8(sp) + 7a6: 47a1 li a5,8 + 7a8: e03e sd a5,0(sp) + 7aa: 489d li a7,7 + 7ac: 4819 li a6,6 + 7ae: 4795 li a5,5 + 7b0: 4711 li a4,4 + 7b2: 468d li a3,3 + 7b4: 4609 li a2,2 + 7b6: 4585 li a1,1 + 7b8: 4501 li a0,0 + 7ba: ebdff0ef jal 676 <nonleaf_call> + 7be: 4781 li a5,0 + 7c0: 853e mv a0,a5 + 7c2: 60e2 ld ra,24(sp) + 7c4: 6442 ld s0,16(sp) + 7c6: 6105 addi sp,sp,32 + 7c8: 8082 ret + + + +; ---------- for spilling with a float ----------> + +; #include <stdlib.h> +; #include <stdarg.h> +; +; void leaf_call(int b, int c, int d, int e, float f, int g, int h, int i, int j) +; { +; } +; +; void nonleaf_call(int a, ...) +; { +; int b,c,d,e,g,h,i,j; +; float f; +; va_list ap; +; va_start(ap, a); +; b = va_arg(ap, int); +; c = va_arg(ap, int); +; d = va_arg(ap, int); +; e = va_arg(ap, int); +; f = va_arg(ap, float); +; g = va_arg(ap, int); +; h = va_arg(ap, int); +; i = va_arg(ap, int); +; j = va_arg(ap, int); +; +; /* use some local data */ +; *(char*)alloca(220) = 'L'; +; leaf_call(b, c, d, e, f, g, h, i, j); +; } +; +; int main() +; { +; nonleaf_call(0, 1, 2, 3, 4, 5.f, 6, 7, 8, 9); +; return 0; +; } + + + +; output from freebsd-14.0-riscv64 w/ clang 17.0.6 (w/ flags to simplify: -fno-stack-protector -fno-pic) + +0000000000000000 <leaf_call>: + 0: 39 71 addi sp, sp, -64 + 2: 06 fc sd ra, 56(sp) + 4: 22 f8 sd s0, 48(sp) + 6: 80 00 addi s0, sp, 64 + 8: 23 26 a4 fe sw a0, -20(s0) + c: 23 24 b4 fe sw a1, -24(s0) + 10: 23 22 c4 fe sw a2, -28(s0) + 14: 23 20 d4 fe sw a3, -32(s0) + 18: 27 2e a4 fc fsw fa0, -36(s0) + 1c: 23 2c e4 fc sw a4, -40(s0) + 20: 23 2a f4 fc sw a5, -44(s0) + 24: 23 28 04 fd sw a6, -48(s0) + 28: 23 26 14 fd sw a7, -52(s0) + 2c: e2 70 ld ra, 56(sp) + 2e: 42 74 ld s0, 48(sp) + 30: 21 61 addi sp, sp, 64 + 32: 82 80 ret + +0000000000000034 <nonleaf_call>: + 34: 0d 71 addi sp, sp, -352 + 36: 06 ee sd ra, 280(sp) + 38: 22 ea sd s0, 272(sp) + 3a: 00 12 addi s0, sp, 288 + 3c: 23 3c 14 03 sd a7, 56(s0) + 40: 23 38 04 03 sd a6, 48(s0) + 44: 1c f4 sd a5, 40(s0) + 46: 18 f0 sd a4, 32(s0) + 48: 14 ec sd a3, 24(s0) + 4a: 10 e8 sd a2, 16(s0) + 4c: 0c e4 sd a1, 8(s0) + 4e: 23 26 a4 fe sw a0, -20(s0) + 52: 13 05 84 00 addi a0, s0, 8 + 56: 23 30 a4 fc sd a0, -64(s0) + 5a: 03 35 04 fc ld a0, -64(s0) + 5e: 93 05 85 00 addi a1, a0, 8 + 62: 23 30 b4 fc sd a1, -64(s0) + 66: 08 41 lw a0, 0(a0) + 68: 23 24 a4 fe sw a0, -24(s0) + 6c: 03 35 04 fc ld a0, -64(s0) + 70: 93 05 85 00 addi a1, a0, 8 + 74: 23 30 b4 fc sd a1, -64(s0) + 78: 08 41 lw a0, 0(a0) + 7a: 23 22 a4 fe sw a0, -28(s0) + 7e: 03 35 04 fc ld a0, -64(s0) + 82: 93 05 85 00 addi a1, a0, 8 + 86: 23 30 b4 fc sd a1, -64(s0) + 8a: 08 41 lw a0, 0(a0) + 8c: 23 20 a4 fe sw a0, -32(s0) + 90: 03 35 04 fc ld a0, -64(s0) + 94: 93 05 85 00 addi a1, a0, 8 + 98: 23 30 b4 fc sd a1, -64(s0) + 9c: 08 41 lw a0, 0(a0) + 9e: 23 2e a4 fc sw a0, -36(s0) + a2: 03 35 04 fc ld a0, -64(s0) + a6: 93 05 85 00 addi a1, a0, 8 + aa: 23 30 b4 fc sd a1, -64(s0) + ae: 87 27 05 00 flw fa5, 0(a0) + b2: 27 24 f4 fc fsw fa5, -56(s0) + b6: 03 35 04 fc ld a0, -64(s0) + ba: 93 05 85 00 addi a1, a0, 8 + be: 23 30 b4 fc sd a1, -64(s0) + c2: 08 41 lw a0, 0(a0) + c4: 23 2c a4 fc sw a0, -40(s0) + c8: 03 35 04 fc ld a0, -64(s0) + cc: 93 05 85 00 addi a1, a0, 8 + d0: 23 30 b4 fc sd a1, -64(s0) + d4: 08 41 lw a0, 0(a0) + d6: 23 2a a4 fc sw a0, -44(s0) + da: 03 35 04 fc ld a0, -64(s0) + de: 93 05 85 00 addi a1, a0, 8 + e2: 23 30 b4 fc sd a1, -64(s0) + e6: 08 41 lw a0, 0(a0) + e8: 23 28 a4 fc sw a0, -48(s0) + ec: 03 35 04 fc ld a0, -64(s0) + f0: 93 05 85 00 addi a1, a0, 8 + f4: 23 30 b4 fc sd a1, -64(s0) + f8: 08 41 lw a0, 0(a0) + fa: 23 26 a4 fc sw a0, -52(s0) + fe: 13 05 c0 04 li a0, 76 + 102: 23 00 a4 ee sb a0, -288(s0) + 106: 03 25 84 fe lw a0, -24(s0) + 10a: 83 25 44 fe lw a1, -28(s0) + 10e: 03 26 04 fe lw a2, -32(s0) + 112: 83 26 c4 fd lw a3, -36(s0) + 116: 07 25 84 fc flw fa0, -56(s0) + 11a: 03 27 84 fd lw a4, -40(s0) + 11e: 83 27 44 fd lw a5, -44(s0) + 122: 03 28 04 fd lw a6, -48(s0) + 126: 83 28 c4 fc lw a7, -52(s0) + 12a: 97 00 00 00 auipc ra, 0 + 12e: e7 80 00 00 jalr ra + 132: f2 60 ld ra, 280(sp) + 134: 52 64 ld s0, 272(sp) + 136: 35 61 addi sp, sp, 352 + 138: 82 80 ret + +000000000000013a <main>: + 13a: 79 71 addi sp, sp, -48 + 13c: 06 f4 sd ra, 40(sp) + 13e: 22 f0 sd s0, 32(sp) + 140: 00 18 addi s0, sp, 48 + 142: 01 45 li a0, 0 + 144: 23 30 a4 fe sd a0, -32(s0) + 148: 23 26 a4 fe sw a0, -20(s0) + 14c: 0a 86 mv a2, sp + 14e: a5 45 li a1, 9 + 150: 0c e6 sd a1, 8(a2) + 152: a1 45 li a1, 8 + 154: 0c e2 sd a1, 0(a2) + 156: b7 55 00 01 lui a1, 4101 + 15a: 93 97 65 02 slli a5, a1, 38 + 15e: 85 45 li a1, 1 + 160: 09 46 li a2, 2 + 162: 8d 46 li a3, 3 + 164: 11 47 li a4, 4 + 166: 19 48 li a6, 6 + 168: 9d 48 li a7, 7 + 16a: 97 00 00 00 auipc ra, 0 + 16e: e7 80 00 00 jalr ra + 172: 03 35 04 fe ld a0, -32(s0) + 176: a2 70 ld ra, 40(sp) + 178: 02 74 ld s0, 32(sp) + 17a: 45 61 addi sp, sp, 48 + 17c: 82 80 ret + + + +; output from debian-trixie_20240211-riscv64 w/ gcc 13.2.0 (w/ flags to simplify: -fno-stack-protector) + +0000000000000628 <leaf_call>: + 628: 7139 addi sp,sp,-64 + 62a: fc22 sd s0,56(sp) + 62c: 0080 addi s0,sp,64 + 62e: 8eaa mv t4,a0 + 630: 8e2e mv t3,a1 + 632: 8332 mv t1,a2 + 634: 8536 mv a0,a3 + 636: fca42e27 fsw fa0,-36(s0) + 63a: 85ba mv a1,a4 + 63c: 863e mv a2,a5 + 63e: 86c2 mv a3,a6 + 640: 8746 mv a4,a7 + 642: 87f6 mv a5,t4 + 644: fef42623 sw a5,-20(s0) + 648: 87f2 mv a5,t3 + 64a: fef42423 sw a5,-24(s0) + 64e: 879a mv a5,t1 + 650: fef42223 sw a5,-28(s0) + 654: 87aa mv a5,a0 + 656: fef42023 sw a5,-32(s0) + 65a: 87ae mv a5,a1 + 65c: fcf42c23 sw a5,-40(s0) + 660: 87b2 mv a5,a2 + 662: fcf42a23 sw a5,-44(s0) + 666: 87b6 mv a5,a3 + 668: fcf42823 sw a5,-48(s0) + 66c: 87ba mv a5,a4 + 66e: fcf42623 sw a5,-52(s0) + 672: 0001 nop + 674: 7462 ld s0,56(sp) + 676: 6121 addi sp,sp,64 + 678: 8082 ret + +000000000000067a <nonleaf_call>: + 67a: 7119 addi sp,sp,-128 + 67c: fc22 sd s0,56(sp) + 67e: 0080 addi s0,sp,64 + 680: e40c sd a1,8(s0) + 682: e810 sd a2,16(s0) + 684: ec14 sd a3,24(s0) + 686: f018 sd a4,32(s0) + 688: f41c sd a5,40(s0) + 68a: 03043823 sd a6,48(s0) + 68e: 03143c23 sd a7,56(s0) + 692: 87aa mv a5,a0 + 694: fcf42623 sw a5,-52(s0) + 698: 04040793 addi a5,s0,64 + 69c: fcf43023 sd a5,-64(s0) + 6a0: fc043783 ld a5,-64(s0) + 6a4: fc878793 addi a5,a5,-56 + 6a8: fcf43c23 sd a5,-40(s0) + 6ac: fd843783 ld a5,-40(s0) + 6b0: 00878713 addi a4,a5,8 + 6b4: fce43c23 sd a4,-40(s0) + 6b8: 439c lw a5,0(a5) + 6ba: fef42623 sw a5,-20(s0) + 6be: fd843783 ld a5,-40(s0) + 6c2: 00878713 addi a4,a5,8 + 6c6: fce43c23 sd a4,-40(s0) + 6ca: 439c lw a5,0(a5) + 6cc: fef42423 sw a5,-24(s0) + 6d0: fd843783 ld a5,-40(s0) + 6d4: 00878713 addi a4,a5,8 + 6d8: fce43c23 sd a4,-40(s0) + 6dc: 439c lw a5,0(a5) + 6de: fef42223 sw a5,-28(s0) + 6e2: fd843783 ld a5,-40(s0) + 6e6: 00878713 addi a4,a5,8 + 6ea: fce43c23 sd a4,-40(s0) + 6ee: 439c lw a5,0(a5) + 6f0: fef42023 sw a5,-32(s0) + 6f4: 9002 ebreak + +00000000000006f6 <main>: + 6f6: 1101 addi sp,sp,-32 + 6f8: ec06 sd ra,24(sp) + 6fa: e822 sd s0,16(sp) + 6fc: 1000 addi s0,sp,32 + 6fe: 00000797 auipc a5,0x0 + 702: 04278793 addi a5,a5,66 # 740 <_IO_stdin_used+0x8> + 706: 239c fld fa5,0(a5) + 708: 47a5 li a5,9 + 70a: e43e sd a5,8(sp) + 70c: 47a1 li a5,8 + 70e: e03e sd a5,0(sp) + 710: 489d li a7,7 + 712: 4819 li a6,6 + 714: e20787d3 fmv.x.d a5,fa5 + 718: 4711 li a4,4 + 71a: 468d li a3,3 + 71c: 4609 li a2,2 + 71e: 4585 li a1,1 + 720: 4501 li a0,0 + 722: f59ff0ef jal 67a <nonleaf_call> + 726: 4781 li a5,0 + 728: 853e mv a0,a5 + 72a: 60e2 ld ra,24(sp) + 72c: 6442 ld s0,16(sp) + 72e: 6105 addi sp,sp,32 + 730: 8082 ret + + + +; ---------- structs by value ----------> +; +; struct A { int i, j; long long l; }; +; +; void leaf_call(int b, int c, int d, int e, struct A f, int g, int h) +; { +; } +; +; void nonleaf_call(int a, int b, int c, int d, int e, struct A f, int g, int h) +; { +; /* use some local data */ +; char l[100] ={ 'L'}; +; leaf_call(b, c, d, e, f, g, h); +; } +; +; int main() +; { +; nonleaf_call(0, 1, 2, 3, 4, (struct A){5, 6, 7ll}, 8, 9); +; return 0; +; } + + + +; output from freebsd-14.0-riscv64 w/ clang 17.0.6 (w/ flags to simplify: -fno-stack-protector -fno-pic) + +0000000000000000 <leaf_call>: + 0: 39 71 addi sp, sp, -64 + 2: 06 fc sd ra, 56(sp) + 4: 22 f8 sd s0, 48(sp) + 6: 80 00 addi s0, sp, 64 + 8: 23 34 f4 fe sd a5, -24(s0) + c: 23 30 e4 fe sd a4, -32(s0) + 10: 23 2e a4 fc sw a0, -36(s0) + 14: 23 2c b4 fc sw a1, -40(s0) + 18: 23 2a c4 fc sw a2, -44(s0) + 1c: 23 28 d4 fc sw a3, -48(s0) + 20: 23 26 04 fd sw a6, -52(s0) + 24: 23 24 14 fd sw a7, -56(s0) + 28: e2 70 ld ra, 56(sp) + 2a: 42 74 ld s0, 48(sp) + 2c: 21 61 addi sp, sp, 64 + 2e: 82 80 ret + +0000000000000030 <nonleaf_call>: + 30: 35 71 addi sp, sp, -160 + 32: 06 ed sd ra, 152(sp) + 34: 22 e9 sd s0, 144(sp) + 36: 00 11 addi s0, sp, 160 + 38: c2 82 mv t0, a6 + 3a: 3e 88 mv a6, a5 + 3c: aa 87 mv a5, a0 + 3e: 08 60 ld a0, 0(s0) + 40: 23 34 54 fe sd t0, -24(s0) + 44: 23 30 04 ff sd a6, -32(s0) + 48: 23 2e f4 fc sw a5, -36(s0) + 4c: 23 2c b4 fc sw a1, -40(s0) + 50: 23 2a c4 fc sw a2, -44(s0) + 54: 23 28 d4 fc sw a3, -48(s0) + 58: 23 26 e4 fc sw a4, -52(s0) + 5c: 23 24 14 fd sw a7, -56(s0) + 60: 23 22 a4 fc sw a0, -60(s0) + 64: 13 05 04 f6 addi a0, s0, -160 + 68: 81 45 li a1, 0 + 6a: 13 06 40 06 li a2, 100 + 6e: 97 00 00 00 auipc ra, 0 + 72: e7 80 00 00 jalr ra + 76: 13 05 c0 04 li a0, 76 + 7a: 23 00 a4 f6 sb a0, -160(s0) + 7e: 03 25 84 fd lw a0, -40(s0) + 82: 83 25 44 fd lw a1, -44(s0) + 86: 03 26 04 fd lw a2, -48(s0) + 8a: 83 26 c4 fc lw a3, -52(s0) + 8e: 03 28 84 fc lw a6, -56(s0) + 92: 83 28 44 fc lw a7, -60(s0) + 96: 83 37 84 fe ld a5, -24(s0) + 9a: 03 37 04 fe ld a4, -32(s0) + 9e: 97 00 00 00 auipc ra, 0 + a2: e7 80 00 00 jalr ra + a6: ea 60 ld ra, 152(sp) + a8: 4a 64 ld s0, 144(sp) + aa: 0d 61 addi sp, sp, 160 + ac: 82 80 ret + +00000000000000ae <main>: + ae: 39 71 addi sp, sp, -64 + b0: 06 fc sd ra, 56(sp) + b2: 22 f8 sd s0, 48(sp) + b4: 80 00 addi s0, sp, 64 + b6: 01 45 li a0, 0 + b8: 23 38 a4 fc sd a0, -48(s0) + bc: 23 26 a4 fe sw a0, -20(s0) + c0: 95 45 li a1, 5 + c2: 23 2c b4 fc sw a1, -40(s0) + c6: 99 45 li a1, 6 + c8: 23 2e b4 fc sw a1, -36(s0) + cc: 9d 45 li a1, 7 + ce: 23 30 b4 fe sd a1, -32(s0) + d2: 03 38 04 fe ld a6, -32(s0) + d6: 83 37 84 fd ld a5, -40(s0) + da: 0a 86 mv a2, sp + dc: a5 45 li a1, 9 + de: 0c e2 sd a1, 0(a2) + e0: 85 45 li a1, 1 + e2: 09 46 li a2, 2 + e4: 8d 46 li a3, 3 + e6: 11 47 li a4, 4 + e8: a1 48 li a7, 8 + ea: 97 00 00 00 auipc ra, 0 + ee: e7 80 00 00 jalr ra + f2: 03 35 04 fd ld a0, -48(s0) + f6: e2 70 ld ra, 56(sp) + f8: 42 74 ld s0, 48(sp) + fa: 21 61 addi sp, sp, 64 + fc: 82 80 ret + + + +; output from debian-trixie_20240211-riscv64 w/ gcc 13.2.0 (w/ flags to simplify: -fno-stack-protector -fno-pic) + +0000000000000628 <leaf_call>: + 628: 7139 addi sp,sp,-64 + 62a: fc22 sd s0,56(sp) + 62c: 0080 addi s0,sp,64 + 62e: 832a mv t1,a0 + 630: 852e mv a0,a1 + 632: 85b2 mv a1,a2 + 634: 8636 mv a2,a3 + 636: fce43823 sd a4,-48(s0) + 63a: fcf43c23 sd a5,-40(s0) + 63e: 86c2 mv a3,a6 + 640: 8746 mv a4,a7 + 642: 879a mv a5,t1 + 644: fef42623 sw a5,-20(s0) + 648: 87aa mv a5,a0 + 64a: fef42423 sw a5,-24(s0) + 64e: 87ae mv a5,a1 + 650: fef42223 sw a5,-28(s0) + 654: 87b2 mv a5,a2 + 656: fef42023 sw a5,-32(s0) + 65a: 87b6 mv a5,a3 + 65c: fcf42623 sw a5,-52(s0) + 660: 87ba mv a5,a4 + 662: fcf42423 sw a5,-56(s0) + 666: 0001 nop + 668: 7462 ld s0,56(sp) + 66a: 6121 addi sp,sp,64 + 66c: 8082 ret + +000000000000066e <nonleaf_call>: + 66e: 7171 addi sp,sp,-176 + 670: f506 sd ra,168(sp) + 672: f122 sd s0,160(sp) + 674: 1900 addi s0,sp,176 + 676: 832a mv t1,a0 + 678: 852e mv a0,a1 + 67a: 85b2 mv a1,a2 + 67c: 8636 mv a2,a3 + 67e: 86ba mv a3,a4 + 680: f4f43c23 sd a5,-168(s0) + 684: f7043023 sd a6,-160(s0) + 688: 8746 mv a4,a7 + 68a: 879a mv a5,t1 + 68c: f6f42e23 sw a5,-132(s0) + 690: 87aa mv a5,a0 + 692: f6f42c23 sw a5,-136(s0) + 696: 87ae mv a5,a1 + 698: f6f42a23 sw a5,-140(s0) + 69c: 87b2 mv a5,a2 + 69e: f6f42823 sw a5,-144(s0) + 6a2: 87b6 mv a5,a3 + 6a4: f6f42623 sw a5,-148(s0) + 6a8: 87ba mv a5,a4 + 6aa: f6f42423 sw a5,-152(s0) + 6ae: 04c00793 li a5,76 + 6b2: f8f43423 sd a5,-120(s0) + 6b6: f8043823 sd zero,-112(s0) + 6ba: f8043c23 sd zero,-104(s0) + 6be: fa043023 sd zero,-96(s0) + 6c2: fa043423 sd zero,-88(s0) + 6c6: fa043823 sd zero,-80(s0) + 6ca: fa043c23 sd zero,-72(s0) + 6ce: fc043023 sd zero,-64(s0) + 6d2: fc043423 sd zero,-56(s0) + 6d6: fc043823 sd zero,-48(s0) + 6da: fc043c23 sd zero,-40(s0) + 6de: fe043023 sd zero,-32(s0) + 6e2: fe042423 sw zero,-24(s0) + 6e6: 4018 lw a4,0(s0) + 6e8: f6842783 lw a5,-152(s0) + 6ec: f6c42683 lw a3,-148(s0) + 6f0: f7042603 lw a2,-144(s0) + 6f4: f7442583 lw a1,-140(s0) + 6f8: f7842503 lw a0,-136(s0) + 6fc: 88ba mv a7,a4 + 6fe: 883e mv a6,a5 + 700: f5843703 ld a4,-168(s0) + 704: f6043783 ld a5,-160(s0) + 708: f21ff0ef jal 628 <leaf_call> + 70c: 0001 nop + 70e: 70aa ld ra,168(sp) + 710: 740a ld s0,160(sp) + 712: 614d addi sp,sp,176 + 714: 8082 ret + +0000000000000716 <main>: + 716: 7179 addi sp,sp,-48 + 718: f406 sd ra,40(sp) + 71a: f022 sd s0,32(sp) + 71c: 1800 addi s0,sp,48 + 71e: 4795 li a5,5 + 720: fef42023 sw a5,-32(s0) + 724: 4799 li a5,6 + 726: fef42223 sw a5,-28(s0) + 72a: 479d li a5,7 + 72c: fef43423 sd a5,-24(s0) + 730: 47a5 li a5,9 + 732: e03e sd a5,0(sp) + 734: 48a1 li a7,8 + 736: fe043783 ld a5,-32(s0) + 73a: fe843803 ld a6,-24(s0) + 73e: 4711 li a4,4 + 740: 468d li a3,3 + 742: 4609 li a2,2 + 744: 4585 li a1,1 + 746: 4501 li a0,0 + 748: f27ff0ef jal 66e <nonleaf_call> + 74c: 4781 li a5,0 + 74e: 853e mv a0,a5 + 750: 70a2 ld ra,40(sp) + 752: 7402 ld s0,32(sp) + 754: 6145 addi sp,sp,48 + 756: 8082 ret + + + +; ---------- structs by value, complex example (multiple structs) ----------> +; +; struct A { int i, j; float f; }; +; struct B { double d; long long l; }; +; +; void leaf_call(int b, struct A c, struct B d, int e, int f, struct A g, struct B h, int i, int j) +; { +; } +; +; void nonleaf_call(int a, int b, struct A c, struct B d, int e, int f, struct A g, struct B h, int i, int j) +; { +; /* use some local data */ +; char l[100] ={ 'L'}; +; leaf_call(b, c, d, e, f, g, h, i, j); +; } +; +; int main() +; { +; nonleaf_call(0, 1, (struct A){2, 3, 4.f}, (struct B){5., 6ll}, 7, 8, (struct A){9, 10, 11.f}, (struct B){12., 13ll}, 14, 15); +; return 0; +; } + + + +; output from freebsd-14.0-riscv64 w/ clang 17.0.6 (w/ flags to simplify: -fno-stack-protector -fno-pic) + +0000000000000000 <leaf_call>: + 0: 75 71 addi sp, sp, -144 + 2: 06 e5 sd ra, 136(sp) + 4: 22 e1 sd s0, 128(sp) + 6: 00 09 addi s0, sp, 144 + 8: c6 82 mv t0, a7 + a: c2 88 mv a7, a6 + c: 36 83 mv t1, a3 + e: 32 8e mv t3, a2 + 10: ae 83 mv t2, a1 + 12: 2a 86 mv a2, a0 + 14: 03 38 84 00 ld a6, 8(s0) + 18: 14 60 ld a3, 0(s0) + 1a: 08 6c ld a0, 24(s0) + 1c: 0c 68 ld a1, 16(s0) + 1e: 23 3c c4 fd sd t3, -40(s0) + 22: 23 38 74 fc sd t2, -48(s0) + 26: 83 23 84 fd lw t2, -40(s0) + 2a: 23 24 74 fe sw t2, -24(s0) + 2e: 83 33 04 fd ld t2, -48(s0) + 32: 23 30 74 fe sd t2, -32(s0) + 36: 27 30 a4 fc fsd fa0, -64(s0) + 3a: 23 34 64 fc sd t1, -56(s0) + 3e: 23 34 54 fa sd t0, -88(s0) + 42: 23 30 14 fb sd a7, -96(s0) + 46: 83 28 84 fa lw a7, -88(s0) + 4a: 23 2c 14 fb sw a7, -72(s0) + 4e: 83 38 04 fa ld a7, -96(s0) + 52: 23 38 14 fb sd a7, -80(s0) + 56: 23 3c 04 f9 sd a6, -104(s0) + 5a: 23 38 d4 f8 sd a3, -112(s0) + 5e: 23 26 c4 f8 sw a2, -116(s0) + 62: 23 24 e4 f8 sw a4, -120(s0) + 66: 23 22 f4 f8 sw a5, -124(s0) + 6a: 23 20 b4 f8 sw a1, -128(s0) + 6e: 23 2e a4 f6 sw a0, -132(s0) + 72: aa 60 ld ra, 136(sp) + 74: 0a 64 ld s0, 128(sp) + 76: 49 61 addi sp, sp, 144 + 78: 82 80 ret + +000000000000007a <nonleaf_call>: + 7a: 69 71 addi sp, sp, -304 + 7c: 06 f6 sd ra, 296(sp) + 7e: 22 f2 sd s0, 288(sp) + 80: 00 1a addi s0, sp, 304 + 82: c6 82 mv t0, a7 + 84: ba 83 mv t2, a4 + 86: b6 8e mv t4, a3 + 88: 32 8e mv t3, a2 + 8a: 2e 86 mv a2, a1 + 8c: aa 86 mv a3, a0 + 8e: 83 38 04 01 ld a7, 16(s0) + 92: 18 64 ld a4, 8(s0) + 94: 03 33 04 00 ld t1, 0(s0) + 98: 08 70 ld a0, 32(s0) + 9a: 0c 6c ld a1, 24(s0) + 9c: 23 3c d4 fd sd t4, -40(s0) + a0: 23 38 c4 fd sd t3, -48(s0) + a4: 03 2e 84 fd lw t3, -40(s0) + a8: 23 24 c4 ff sw t3, -24(s0) + ac: 03 3e 04 fd ld t3, -48(s0) + b0: 23 30 c4 ff sd t3, -32(s0) + b4: 27 30 a4 fc fsd fa0, -64(s0) + b8: 23 34 74 fc sd t2, -56(s0) + bc: 23 34 64 fa sd t1, -88(s0) + c0: 23 30 54 fa sd t0, -96(s0) + c4: 83 22 84 fa lw t0, -88(s0) + c8: 23 2c 54 fa sw t0, -72(s0) + cc: 83 32 04 fa ld t0, -96(s0) + d0: 23 38 54 fa sd t0, -80(s0) + d4: 23 3c 14 f9 sd a7, -104(s0) + d8: 23 38 e4 f8 sd a4, -112(s0) + dc: 23 26 d4 f8 sw a3, -116(s0) + e0: 23 24 c4 f8 sw a2, -120(s0) + e4: 23 22 f4 f8 sw a5, -124(s0) + e8: 23 20 04 f9 sw a6, -128(s0) + ec: 23 2e b4 f6 sw a1, -132(s0) + f0: 23 2c a4 f6 sw a0, -136(s0) + f4: 13 05 44 f1 addi a0, s0, -236 + f8: 81 45 li a1, 0 + fa: 13 06 40 06 li a2, 100 + fe: 97 00 00 00 auipc ra, 0 + 102: e7 80 00 00 jalr ra + 106: 13 05 c0 04 li a0, 76 + 10a: 23 0a a4 f0 sb a0, -236(s0) + 10e: 03 25 84 f8 lw a0, -120(s0) + 112: 03 27 44 f8 lw a4, -124(s0) + 116: 83 27 04 f8 lw a5, -128(s0) + 11a: 03 2e c4 f7 lw t3, -132(s0) + 11e: 83 2e 84 f7 lw t4, -136(s0) + 122: 83 25 84 fe lw a1, -24(s0) + 126: 23 24 b4 f0 sw a1, -248(s0) + 12a: 83 35 04 fe ld a1, -32(s0) + 12e: 23 30 b4 f0 sd a1, -256(s0) + 132: 03 36 84 f0 ld a2, -248(s0) + 136: 83 35 04 f0 ld a1, -256(s0) + 13a: 07 35 04 fc fld fa0, -64(s0) + 13e: 83 36 84 fc ld a3, -56(s0) + 142: 03 28 84 fb lw a6, -72(s0) + 146: 23 2c 04 ef sw a6, -264(s0) + 14a: 03 38 04 fb ld a6, -80(s0) + 14e: 23 38 04 ef sd a6, -272(s0) + 152: 83 38 84 ef ld a7, -264(s0) + 156: 03 38 04 ef ld a6, -272(s0) + 15a: 83 32 04 f9 ld t0, -112(s0) + 15e: 83 33 84 f9 ld t2, -104(s0) + 162: 0a 83 mv t1, sp + 164: 23 3c d3 01 sd t4, 24(t1) + 168: 23 38 c3 01 sd t3, 16(t1) + 16c: 23 34 73 00 sd t2, 8(t1) + 170: 23 30 53 00 sd t0, 0(t1) + 174: 97 00 00 00 auipc ra, 0 + 178: e7 80 00 00 jalr ra + 17c: b2 70 ld ra, 296(sp) + 17e: 12 74 ld s0, 288(sp) + 180: 55 61 addi sp, sp, 304 + 182: 82 80 ret + +0000000000000184 <main>: + 184: 35 71 addi sp, sp, -160 + 186: 06 ed sd ra, 152(sp) + 188: 22 e9 sd s0, 144(sp) + 18a: 00 11 addi s0, sp, 160 + 18c: 01 45 li a0, 0 + 18e: 23 34 a4 f8 sd a0, -120(s0) + 192: 23 26 a4 fe sw a0, -20(s0) + 196: 89 45 li a1, 2 + 198: 23 20 b4 fe sw a1, -32(s0) + 19c: 8d 45 li a1, 3 + 19e: 23 22 b4 fe sw a1, -28(s0) + 1a2: b7 05 80 40 lui a1, 264192 + 1a6: 23 24 b4 fe sw a1, -24(s0) + 1aa: b7 55 00 01 lui a1, 4101 + 1ae: 9a 15 slli a1, a1, 38 + 1b0: 23 38 b4 fc sd a1, -48(s0) + 1b4: 99 45 li a1, 6 + 1b6: 23 3c b4 fc sd a1, -40(s0) + 1ba: a5 45 li a1, 9 + 1bc: 23 22 b4 fc sw a1, -60(s0) + 1c0: a9 45 li a1, 10 + 1c2: 23 24 b4 fc sw a1, -56(s0) + 1c6: b7 05 30 41 lui a1, 267008 + 1ca: 23 26 b4 fc sw a1, -52(s0) + 1ce: b7 55 80 00 lui a1, 2053 + 1d2: 9e 15 slli a1, a1, 39 + 1d4: 23 38 b4 fa sd a1, -80(s0) + 1d8: b5 45 li a1, 13 + 1da: 23 3c b4 fa sd a1, -72(s0) + 1de: 83 25 84 fe lw a1, -24(s0) + 1e2: 23 24 b4 fa sw a1, -88(s0) + 1e6: 83 65 44 fe lwu a1, -28(s0) + 1ea: 82 15 slli a1, a1, 32 + 1ec: 03 66 04 fe lwu a2, -32(s0) + 1f0: d1 8d or a1, a1, a2 + 1f2: 23 30 b4 fa sd a1, -96(s0) + 1f6: 83 36 84 fa ld a3, -88(s0) + 1fa: 03 36 04 fa ld a2, -96(s0) + 1fe: 07 35 04 fd fld fa0, -48(s0) + 202: 03 37 84 fd ld a4, -40(s0) + 206: 83 25 c4 fc lw a1, -52(s0) + 20a: 23 2c b4 f8 sw a1, -104(s0) + 20e: 83 65 84 fc lwu a1, -56(s0) + 212: 82 15 slli a1, a1, 32 + 214: 83 67 44 fc lwu a5, -60(s0) + 218: dd 8d or a1, a1, a5 + 21a: 23 38 b4 f8 sd a1, -112(s0) + 21e: 83 38 04 f9 ld a7, -112(s0) + 222: 83 35 84 f9 ld a1, -104(s0) + 226: 03 38 04 fb ld a6, -80(s0) + 22a: 83 32 84 fb ld t0, -72(s0) + 22e: 8a 87 mv a5, sp + 230: 3d 43 li t1, 15 + 232: 23 b0 67 02 sd t1, 32(a5) + 236: 39 43 li t1, 14 + 238: 23 bc 67 00 sd t1, 24(a5) + 23c: 23 b8 57 00 sd t0, 16(a5) + 240: 23 b4 07 01 sd a6, 8(a5) + 244: 8c e3 sd a1, 0(a5) + 246: 85 45 li a1, 1 + 248: 9d 47 li a5, 7 + 24a: 21 48 li a6, 8 + 24c: 97 00 00 00 auipc ra, 0 + 250: e7 80 00 00 jalr ra + 254: 03 35 84 f8 ld a0, -120(s0) + 258: ea 60 ld ra, 152(sp) + 25a: 4a 64 ld s0, 144(sp) + 25c: 0d 61 addi sp, sp, 160 + 25e: 82 80 ret + + + +; output from debian-trixie_20240211-riscv64 w/ gcc 13.2.0 (w/ flags to simplify: -fno-stack-protector) + +0000000000000628 <leaf_call>: + 628: 715d addi sp,sp,-80 + 62a: e4a2 sd s0,72(sp) + 62c: 0880 addi s0,sp,80 + 62e: fcb43c23 sd a1,-40(s0) + 632: fec43023 sd a2,-32(s0) + 636: 22a507d3 fmv.d fa5,fa0 + 63a: 863a mv a2,a4 + 63c: 873e mv a4,a5 + 63e: fb043823 sd a6,-80(s0) + 642: fb143c23 sd a7,-72(s0) + 646: 87aa mv a5,a0 + 648: fef42623 sw a5,-20(s0) + 64c: fcf43427 fsd fa5,-56(s0) + 650: fcd43823 sd a3,-48(s0) + 654: 87b2 mv a5,a2 + 656: fef42423 sw a5,-24(s0) + 65a: 87ba mv a5,a4 + 65c: fcf42223 sw a5,-60(s0) + 660: 0001 nop + 662: 6426 ld s0,72(sp) + 664: 6161 addi sp,sp,80 + 666: 8082 ret + +0000000000000668 <nonleaf_call>: + 668: 7115 addi sp,sp,-224 + 66a: e586 sd ra,200(sp) + 66c: e1a2 sd s0,192(sp) + 66e: 0980 addi s0,sp,208 + 670: f6c43423 sd a2,-152(s0) + 674: f6d43823 sd a3,-144(s0) + 678: 22a507d3 fmv.d fa5,fa0 + 67c: 863e mv a2,a5 + 67e: 86c2 mv a3,a6 + 680: 01143423 sd a7,8(s0) + 684: 87aa mv a5,a0 + 686: f6f42e23 sw a5,-132(s0) + 68a: 87ae mv a5,a1 + 68c: f6f42c23 sw a5,-136(s0) + 690: f4f43c27 fsd fa5,-168(s0) + 694: f6e43023 sd a4,-160(s0) + 698: 87b2 mv a5,a2 + 69a: f4f42a23 sw a5,-172(s0) + 69e: 87b6 mv a5,a3 + 6a0: f4f42823 sw a5,-176(s0) + 6a4: 04c00793 li a5,76 + 6a8: f8f43423 sd a5,-120(s0) + 6ac: f8043823 sd zero,-112(s0) + 6b0: f8043c23 sd zero,-104(s0) + 6b4: fa043023 sd zero,-96(s0) + 6b8: fa043423 sd zero,-88(s0) + 6bc: fa043823 sd zero,-80(s0) + 6c0: fa043c23 sd zero,-72(s0) + 6c4: fc043023 sd zero,-64(s0) + 6c8: fc043423 sd zero,-56(s0) + 6cc: fc043823 sd zero,-48(s0) + 6d0: fc043c23 sd zero,-40(s0) + 6d4: fe043023 sd zero,-32(s0) + 6d8: fe042423 sw zero,-24(s0) + 6dc: f5042603 lw a2,-176(s0) + 6e0: f5442703 lw a4,-172(s0) + 6e4: f5843787 fld fa5,-168(s0) + 6e8: f6043683 ld a3,-160(s0) + 6ec: f7842503 lw a0,-136(s0) + 6f0: 581c lw a5,48(s0) + 6f2: ec3e sd a5,24(sp) + 6f4: 541c lw a5,40(s0) + 6f6: e83e sd a5,16(sp) + 6f8: 6c1c ld a5,24(s0) + 6fa: e03e sd a5,0(sp) + 6fc: 701c ld a5,32(s0) + 6fe: e43e sd a5,8(sp) + 700: 00843803 ld a6,8(s0) + 704: 01043883 ld a7,16(s0) + 708: 87b2 mv a5,a2 + 70a: 22f78553 fmv.d fa0,fa5 + 70e: f6843583 ld a1,-152(s0) + 712: f7043603 ld a2,-144(s0) + 716: f13ff0ef jal 628 <leaf_call> + 71a: 0001 nop + 71c: 60ae ld ra,200(sp) + 71e: 640e ld s0,192(sp) + 720: 612d addi sp,sp,224 + 722: 8082 ret + +0000000000000724 <main>: + 724: 7119 addi sp,sp,-128 + 726: fc86 sd ra,120(sp) + 728: f8a2 sd s0,112(sp) + 72a: 0100 addi s0,sp,128 + 72c: 4789 li a5,2 + 72e: fef42023 sw a5,-32(s0) + 732: 478d li a5,3 + 734: fef42223 sw a5,-28(s0) + 738: 00000797 auipc a5,0x0 + 73c: 0a878793 addi a5,a5,168 # 7e0 <_IO_stdin_used+0x8> + 740: 0007a787 flw fa5,0(a5) + 744: fef42427 fsw fa5,-24(s0) + 748: 00000797 auipc a5,0x0 + 74c: 0a078793 addi a5,a5,160 # 7e8 <_IO_stdin_used+0x10> + 750: 239c fld fa5,0(a5) + 752: fcf43827 fsd fa5,-48(s0) + 756: 4799 li a5,6 + 758: fcf43c23 sd a5,-40(s0) + 75c: 47a5 li a5,9 + 75e: fcf42023 sw a5,-64(s0) + 762: 47a9 li a5,10 + 764: fcf42223 sw a5,-60(s0) + 768: 00000797 auipc a5,0x0 + 76c: 08878793 addi a5,a5,136 # 7f0 <_IO_stdin_used+0x18> + 770: 0007a787 flw fa5,0(a5) + 774: fcf42427 fsw fa5,-56(s0) + 778: 00000797 auipc a5,0x0 + 77c: 08078793 addi a5,a5,128 # 7f8 <_IO_stdin_used+0x20> + 780: 239c fld fa5,0(a5) + 782: faf43827 fsd fa5,-80(s0) + 786: 47b5 li a5,13 + 788: faf43c23 sd a5,-72(s0) + 78c: fd043787 fld fa5,-48(s0) + 790: fd843703 ld a4,-40(s0) + 794: 47bd li a5,15 + 796: f03e sd a5,32(sp) + 798: 47b9 li a5,14 + 79a: ec3e sd a5,24(sp) + 79c: fb043783 ld a5,-80(s0) + 7a0: e43e sd a5,8(sp) + 7a2: fb843783 ld a5,-72(s0) + 7a6: e83e sd a5,16(sp) + 7a8: fc842783 lw a5,-56(s0) + 7ac: c03e sw a5,0(sp) + 7ae: fc043883 ld a7,-64(s0) + 7b2: 4821 li a6,8 + 7b4: 479d li a5,7 + 7b6: 22f78553 fmv.d fa0,fa5 + 7ba: fe043603 ld a2,-32(s0) + 7be: fe843683 ld a3,-24(s0) + 7c2: 4585 li a1,1 + 7c4: 4501 li a0,0 + 7c6: ea3ff0ef jal 668 <nonleaf_call> + 7ca: 4781 li a5,0 + 7cc: 853e mv a0,a5 + 7ce: 70e6 ld ra,120(sp) + 7d0: 7446 ld s0,112(sp) + 7d2: 6109 addi sp,sp,128 + 7d4: 8082 ret + + + +; ---------- returning long long ----------> +; +; long long f() +; { +; return 7171LL; +; } +; +; int main() +; { +; return (int)f(); +; } + + + +; output from freebsd-14.0-riscv64 w/ clang 17.0.6 (w/ flags to simplify: -fno-stack-protector -fno-pic) + +0000000000000000 <f>: + 0: 41 11 addi sp, sp, -16 + 2: 06 e4 sd ra, 8(sp) + 4: 22 e0 sd s0, 0(sp) + 6: 00 08 addi s0, sp, 16 + 8: 09 65 lui a0, 2 + a: 1b 05 35 c0 addiw a0, a0, -1021 + e: a2 60 ld ra, 8(sp) + 10: 02 64 ld s0, 0(sp) + 12: 41 01 addi sp, sp, 16 + 14: 82 80 ret + +0000000000000016 <main>: + 16: 01 11 addi sp, sp, -32 + 18: 06 ec sd ra, 24(sp) + 1a: 22 e8 sd s0, 16(sp) + 1c: 00 10 addi s0, sp, 32 + 1e: 01 45 li a0, 0 + 20: 23 26 a4 fe sw a0, -20(s0) + 24: 97 00 00 00 auipc ra, 0 + 28: e7 80 00 00 jalr ra + 2c: 01 25 sext.w a0, a0 + 2e: e2 60 ld ra, 24(sp) + 30: 42 64 ld s0, 16(sp) + 32: 05 61 addi sp, sp, 32 + 34: 82 80 ret + + + +; output from debian-trixie_20240211-riscv64 w/ gcc 13.2.0 (w/ flags to simplify: -fno-stack-protector -fno-pic) + +0000000000000628 <f>: + 628: 1141 addi sp,sp,-16 + 62a: e422 sd s0,8(sp) + 62c: 0800 addi s0,sp,16 + 62e: 6789 lui a5,0x2 + 630: c0378793 addi a5,a5,-1021 # 1c03 <__FRAME_END__+0x150f> + 634: 853e mv a0,a5 + 636: 6422 ld s0,8(sp) + 638: 0141 addi sp,sp,16 + 63a: 8082 ret + +000000000000063c <main>: + 63c: 1141 addi sp,sp,-16 + 63e: e406 sd ra,8(sp) + 640: e022 sd s0,0(sp) + 642: 0800 addi s0,sp,16 + 644: fe5ff0ef jal 628 <f> + 648: 87aa mv a5,a0 + 64a: 2781 sext.w a5,a5 + 64c: 853e mv a0,a5 + 64e: 60a2 ld ra,8(sp) + 650: 6402 ld s0,0(sp) + 652: 0141 addi sp,sp,16 + 654: 8082 ret + + + +; ---------- passing structs with only fp parts ----------> +; +; struct A { float a; }; +; struct B { float a, b; }; +; struct C { float a, b, c; }; +; struct D { double a; }; +; struct E { double a, b; }; +; struct F { double a, b, c; }; +; +; void leaf_call(struct A a, struct B b, struct C c, struct D d, struct E e, struct F f) +; { +; } +; +; int main() +; { +; leaf_call((struct A){1.f}, (struct B){2.f,3.f}, (struct C){4.f,5.f,6.f}, (struct D){1.}, (struct E){2.,3.}, (struct F){4.,5.,6.}); +; return 0; +; } + + + +; output from freebsd-14.0-riscv64 w/ clang 17.0.6 (w/ flags to simplify: -fno-stack-protector -fno-pic) + +0000000000000000 <leaf_call>: + 0: 1d 71 addi sp, sp, -96 + 2: 86 ec sd ra, 88(sp) + 4: a2 e8 sd s0, 80(sp) + 6: 80 10 addi s0, sp, 96 + 8: 27 26 a4 fe fsw fa0, -20(s0) + c: 27 22 b4 fe fsw fa1, -28(s0) + 10: 27 24 c4 fe fsw fa2, -24(s0) + 14: 23 38 b4 fc sd a1, -48(s0) + 18: 23 34 a4 fc sd a0, -56(s0) + 1c: 03 25 04 fd lw a0, -48(s0) + 20: 23 20 a4 fe sw a0, -32(s0) + 24: 03 35 84 fc ld a0, -56(s0) + 28: 23 3c a4 fc sd a0, -40(s0) + 2c: 27 30 d4 fc fsd fa3, -64(s0) + 30: 27 38 e4 fa fsd fa4, -80(s0) + 34: 27 3c f4 fa fsd fa5, -72(s0) + 38: 23 34 c4 fa sd a2, -88(s0) + 3c: e6 60 ld ra, 88(sp) + 3e: 46 64 ld s0, 80(sp) + 40: 25 61 addi sp, sp, 96 + 42: 82 80 ret + +0000000000000044 <main>: + 44: 75 71 addi sp, sp, -144 + 46: 06 e5 sd ra, 136(sp) + 48: 22 e1 sd s0, 128(sp) + 4a: 00 09 addi s0, sp, 144 + 4c: 01 45 li a0, 0 + 4e: 23 38 a4 f6 sd a0, -144(s0) + 52: 23 26 a4 fe sw a0, -20(s0) + 56: 37 05 80 3f lui a0, 260096 + 5a: 23 24 a4 fe sw a0, -24(s0) + 5e: 37 05 00 40 lui a0, 262144 + 62: 23 20 a4 fe sw a0, -32(s0) + 66: 37 05 40 40 lui a0, 263168 + 6a: 23 22 a4 fe sw a0, -28(s0) + 6e: 37 05 80 40 lui a0, 264192 + 72: 23 2a a4 fc sw a0, -44(s0) + 76: 37 05 a0 40 lui a0, 264704 + 7a: 23 2c a4 fc sw a0, -40(s0) + 7e: 37 05 c0 40 lui a0, 265216 + 82: 23 2e a4 fc sw a0, -36(s0) + 86: 13 05 f0 3f li a0, 1023 + 8a: 52 15 slli a0, a0, 52 + 8c: 23 34 a4 fc sd a0, -56(s0) + 90: 05 45 li a0, 1 + 92: 7a 15 slli a0, a0, 62 + 94: 23 3c a4 fa sd a0, -72(s0) + 98: 37 15 80 00 lui a0, 2049 + 9c: 1e 15 slli a0, a0, 39 + 9e: 23 30 a4 fc sd a0, -64(s0) + a2: 13 05 10 40 li a0, 1025 + a6: 52 15 slli a0, a0, 52 + a8: 23 30 a4 fa sd a0, -96(s0) + ac: 37 55 00 01 lui a0, 4101 + b0: 1a 15 slli a0, a0, 38 + b2: 23 34 a4 fa sd a0, -88(s0) + b6: 37 35 80 00 lui a0, 2051 + ba: 1e 15 slli a0, a0, 39 + bc: 23 38 a4 fa sd a0, -80(s0) + c0: 07 25 84 fe flw fa0, -24(s0) + c4: 87 25 04 fe flw fa1, -32(s0) + c8: 07 26 44 fe flw fa2, -28(s0) + cc: 03 25 c4 fd lw a0, -36(s0) + d0: 23 2c a4 f8 sw a0, -104(s0) + d4: 03 65 84 fd lwu a0, -40(s0) + d8: 02 15 slli a0, a0, 32 + da: 83 65 44 fd lwu a1, -44(s0) + de: 4d 8d or a0, a0, a1 + e0: 23 38 a4 f8 sd a0, -112(s0) + e4: 83 35 84 f9 ld a1, -104(s0) + e8: 03 35 04 f9 ld a0, -112(s0) + ec: 87 36 84 fc fld fa3, -56(s0) + f0: 07 37 84 fb fld fa4, -72(s0) + f4: 87 37 04 fc fld fa5, -64(s0) + f8: 03 36 04 fb ld a2, -80(s0) + fc: 23 34 c4 f8 sd a2, -120(s0) + 100: 03 36 84 fa ld a2, -88(s0) + 104: 23 30 c4 f8 sd a2, -128(s0) + 108: 03 36 04 fa ld a2, -96(s0) + 10c: 23 3c c4 f6 sd a2, -136(s0) + 110: 13 06 84 f7 addi a2, s0, -136 + 114: 97 00 00 00 auipc ra, 0 + 118: e7 80 00 00 jalr ra + 11c: 03 35 04 f7 ld a0, -144(s0) + 120: aa 60 ld ra, 136(sp) + 122: 0a 64 ld s0, 128(sp) + 124: 49 61 addi sp, sp, 144 + 126: 82 80 ret + + + +; output from debian-trixie_20240211-riscv64 w/ gcc 13.2.0 (w/ flags to simplify: -fno-stack-protector) + +0000000000000628 <leaf_call>: + 628: 715d addi sp,sp,-80 + 62a: e4a2 sd s0,72(sp) + 62c: 0880 addi s0,sp,80 + 62e: fea42427 fsw fa0,-24(s0) + 632: fca43823 sd a0,-48(s0) + 636: fcb43c23 sd a1,-40(s0) + 63a: fcd43427 fsd fa3,-56(s0) + 63e: feb42027 fsw fa1,-32(s0) + 642: fec42227 fsw fa2,-28(s0) + 646: fae43c27 fsd fa4,-72(s0) + 64a: fcf43027 fsd fa5,-64(s0) + 64e: 0001 nop + 650: 6426 ld s0,72(sp) + 652: 6161 addi sp,sp,80 + 654: 8082 ret + +0000000000000656 <main>: + 656: 7159 addi sp,sp,-112 + 658: f486 sd ra,104(sp) + 65a: f0a2 sd s0,96(sp) + 65c: 1880 addi s0,sp,112 + 65e: 00000797 auipc a5,0x0 + 662: 0fa78793 addi a5,a5,250 # 758 <_IO_stdin_used+0x8> + 666: 0007a507 flw fa0,0(a5) + 66a: 00000797 auipc a5,0x0 + 66e: 0f278793 addi a5,a5,242 # 75c <_IO_stdin_used+0xc> + 672: 0007a787 flw fa5,0(a5) + 676: fef42427 fsw fa5,-24(s0) + 67a: 00000797 auipc a5,0x0 + 67e: 0e678793 addi a5,a5,230 # 760 <_IO_stdin_used+0x10> + 682: 0007a787 flw fa5,0(a5) + 686: fef42627 fsw fa5,-20(s0) + 68a: 00000797 auipc a5,0x0 + 68e: 0da78793 addi a5,a5,218 # 764 <_IO_stdin_used+0x14> + 692: 0007a787 flw fa5,0(a5) + 696: fcf42c27 fsw fa5,-40(s0) + 69a: 00000797 auipc a5,0x0 + 69e: 0ce78793 addi a5,a5,206 # 768 <_IO_stdin_used+0x18> + 6a2: 0007a787 flw fa5,0(a5) + 6a6: fcf42e27 fsw fa5,-36(s0) + 6aa: 00000797 auipc a5,0x0 + 6ae: 0c278793 addi a5,a5,194 # 76c <_IO_stdin_used+0x1c> + 6b2: 0007a787 flw fa5,0(a5) + 6b6: fef42027 fsw fa5,-32(s0) + 6ba: 00000797 auipc a5,0x0 + 6be: 0b678793 addi a5,a5,182 # 770 <_IO_stdin_used+0x20> + 6c2: 2394 fld fa3,0(a5) + 6c4: 00000797 auipc a5,0x0 + 6c8: 0b478793 addi a5,a5,180 # 778 <_IO_stdin_used+0x28> + 6cc: 239c fld fa5,0(a5) + 6ce: fcf43427 fsd fa5,-56(s0) + 6d2: 00000797 auipc a5,0x0 + 6d6: 0ae78793 addi a5,a5,174 # 780 <_IO_stdin_used+0x30> + 6da: 239c fld fa5,0(a5) + 6dc: fcf43827 fsd fa5,-48(s0) + 6e0: 00000797 auipc a5,0x0 + 6e4: 0a878793 addi a5,a5,168 # 788 <_IO_stdin_used+0x38> + 6e8: 239c fld fa5,0(a5) + 6ea: faf43827 fsd fa5,-80(s0) + 6ee: 00000797 auipc a5,0x0 + 6f2: 0a278793 addi a5,a5,162 # 790 <_IO_stdin_used+0x40> + 6f6: 239c fld fa5,0(a5) + 6f8: faf43c27 fsd fa5,-72(s0) + 6fc: 00000797 auipc a5,0x0 + 700: 09c78793 addi a5,a5,156 # 798 <_IO_stdin_used+0x48> + 704: 239c fld fa5,0(a5) + 706: fcf43027 fsd fa5,-64(s0) + 70a: fb043783 ld a5,-80(s0) + 70e: f8f43823 sd a5,-112(s0) + 712: fb843783 ld a5,-72(s0) + 716: f8f43c23 sd a5,-104(s0) + 71a: fc043783 ld a5,-64(s0) + 71e: faf43023 sd a5,-96(s0) + 722: f9040793 addi a5,s0,-112 + 726: fc843707 fld fa4,-56(s0) + 72a: fd043787 fld fa5,-48(s0) + 72e: fe842587 flw fa1,-24(s0) + 732: fec42607 flw fa2,-20(s0) + 736: 863e mv a2,a5 + 738: fd843503 ld a0,-40(s0) + 73c: fe043583 ld a1,-32(s0) + 740: ee9ff0ef jal 628 <leaf_call> + 744: 4781 li a5,0 + 746: 853e mv a0,a5 + 748: 70a6 ld ra,104(sp) + 74a: 7406 ld s0,96(sp) + 74c: 6165 addi sp,sp,112 + 74e: 8082 ret + + + +; ---------- returning structs by value ----------> +; +; struct Small { char x; }; +; struct Big { long long i,j,k,l; long m; }; /* bigger than 16b */ +; +; struct Small f0() +; { +; struct Small s = { 132 }; +; return s; +; } +; +; struct Big f1() +; { +; struct Big b = { 7171LL, 99LL, -99LL, -3102LL, 32 }; +; return b; +; } +; +; int main() +; { +; struct Small s = f0(); +; struct Big b = f1(); +; return b.j + b.k + b.m + s.x; +; } + + + +; output from freebsd-14.0-riscv64 w/ clang 17.0.6 (w/ flags to simplify: -fno-stack-protector -fno-pic) + +0000000000000000 <f0>: + 0: 01 11 addi sp, sp, -32 + 2: 06 ec sd ra, 24(sp) + 4: 22 e8 sd s0, 16(sp) + 6: 00 10 addi s0, sp, 32 + 8: 13 05 40 08 li a0, 132 + c: a3 07 a4 fe sb a0, -17(s0) + 10: 03 45 f4 fe lbu a0, -17(s0) + 14: e2 60 ld ra, 24(sp) + 16: 42 64 ld s0, 16(sp) + 18: 05 61 addi sp, sp, 32 + 1a: 82 80 ret + +000000000000001c <f1>: + 1c: 01 11 addi sp, sp, -32 + 1e: 06 ec sd ra, 24(sp) + 20: 22 e8 sd s0, 16(sp) + 22: 00 10 addi s0, sp, 32 + 24: aa 85 mv a1, a0 + 26: 23 34 b4 fe sd a1, -24(s0) + 2a: 01 45 li a0, 0 + 2c: 88 f1 sd a0, 32(a1) + 2e: 88 ed sd a0, 24(a1) + 30: 88 e9 sd a0, 16(a1) + 32: 88 e5 sd a0, 8(a1) + 34: 88 e1 sd a0, 0(a1) + 36: 09 65 lui a0, 2 + 38: 1b 05 35 c0 addiw a0, a0, -1021 + 3c: 88 e1 sd a0, 0(a1) + 3e: 13 05 30 06 li a0, 99 + 42: 88 e5 sd a0, 8(a1) + 44: 13 05 d0 f9 li a0, -99 + 48: 88 e9 sd a0, 16(a1) + 4a: 7d 75 lui a0, 1048575 + 4c: 1b 05 25 3e addiw a0, a0, 994 + 50: 88 ed sd a0, 24(a1) + 52: 13 05 00 02 li a0, 32 + 56: 88 f1 sd a0, 32(a1) + 58: e2 60 ld ra, 24(sp) + 5a: 42 64 ld s0, 16(sp) + 5c: 05 61 addi sp, sp, 32 + 5e: 82 80 ret + +0000000000000060 <main>: + 60: 39 71 addi sp, sp, -64 + 62: 06 fc sd ra, 56(sp) + 64: 22 f8 sd s0, 48(sp) + 66: 80 00 addi s0, sp, 64 + 68: 01 45 li a0, 0 + 6a: 23 26 a4 fe sw a0, -20(s0) + 6e: 97 00 00 00 auipc ra, 0 + 72: e7 80 00 00 jalr ra + 76: a3 05 a4 fe sb a0, -21(s0) + 7a: 13 05 04 fc addi a0, s0, -64 + 7e: 97 00 00 00 auipc ra, 0 + 82: e7 80 00 00 jalr ra + 86: 03 35 84 fc ld a0, -56(s0) + 8a: 83 35 04 fd ld a1, -48(s0) + 8e: 2d 9d addw a0, a0, a1 + 90: 83 35 04 fe ld a1, -32(s0) + 94: 2d 9d addw a0, a0, a1 + 96: 83 45 b4 fe lbu a1, -21(s0) + 9a: 2d 9d addw a0, a0, a1 + 9c: e2 70 ld ra, 56(sp) + 9e: 42 74 ld s0, 48(sp) + a0: 21 61 addi sp, sp, 64 + a2: 82 80 ret + + + +; output from debian-trixie_20240211-riscv64 w/ gcc 13.2.0 (w/ flags to simplify: -fno-stack-protector) + +0000000000000628 <f0>: + 628: 1101 addi sp,sp,-32 + 62a: ec22 sd s0,24(sp) + 62c: 1000 addi s0,sp,32 + 62e: f8400793 li a5,-124 + 632: fef40423 sb a5,-24(s0) + 636: fe844783 lbu a5,-24(s0) + 63a: 853e mv a0,a5 + 63c: 6462 ld s0,24(sp) + 63e: 6105 addi sp,sp,32 + 640: 8082 ret + +0000000000000642 <f1>: + 642: 715d addi sp,sp,-80 + 644: e4a2 sd s0,72(sp) + 646: 0880 addi s0,sp,80 + 648: faa43c23 sd a0,-72(s0) + 64c: 00000797 auipc a5,0x0 + 650: 0ac78793 addi a5,a5,172 # 6f8 <_IO_stdin_used+0x8> + 654: 638c ld a1,0(a5) + 656: 6790 ld a2,8(a5) + 658: 6b94 ld a3,16(a5) + 65a: 6f98 ld a4,24(a5) + 65c: 739c ld a5,32(a5) + 65e: fcb43423 sd a1,-56(s0) + 662: fcc43823 sd a2,-48(s0) + 666: fcd43c23 sd a3,-40(s0) + 66a: fee43023 sd a4,-32(s0) + 66e: fef43423 sd a5,-24(s0) + 672: fb843783 ld a5,-72(s0) + 676: fc843503 ld a0,-56(s0) + 67a: fd043583 ld a1,-48(s0) + 67e: fd843603 ld a2,-40(s0) + 682: fe043683 ld a3,-32(s0) + 686: fe843703 ld a4,-24(s0) + 68a: e388 sd a0,0(a5) + 68c: e78c sd a1,8(a5) + 68e: eb90 sd a2,16(a5) + 690: ef94 sd a3,24(a5) + 692: f398 sd a4,32(a5) + 694: fb843503 ld a0,-72(s0) + 698: 6426 ld s0,72(sp) + 69a: 6161 addi sp,sp,80 + 69c: 8082 ret + +000000000000069e <main>: + 69e: 7139 addi sp,sp,-64 + 6a0: fc06 sd ra,56(sp) + 6a2: f822 sd s0,48(sp) + 6a4: 0080 addi s0,sp,64 + 6a6: f83ff0ef jal 628 <f0> + 6aa: 87aa mv a5,a0 + 6ac: fef40423 sb a5,-24(s0) + 6b0: fc040793 addi a5,s0,-64 + 6b4: 853e mv a0,a5 + 6b6: f8dff0ef jal 642 <f1> + 6ba: fc843783 ld a5,-56(s0) + 6be: 0007871b sext.w a4,a5 + 6c2: fd043783 ld a5,-48(s0) + 6c6: 2781 sext.w a5,a5 + 6c8: 9fb9 addw a5,a5,a4 + 6ca: 0007871b sext.w a4,a5 + 6ce: fe043783 ld a5,-32(s0) + 6d2: 2781 sext.w a5,a5 + 6d4: 9fb9 addw a5,a5,a4 + 6d6: 0007871b sext.w a4,a5 + 6da: fe844783 lbu a5,-24(s0) + 6de: 2781 sext.w a5,a5 + 6e0: 9fb9 addw a5,a5,a4 + 6e2: 2781 sext.w a5,a5 + 6e4: 2781 sext.w a5,a5 + 6e6: 853e mv a0,a5 + 6e8: 70e2 ld ra,56(sp) + 6ea: 7442 ld s0,48(sp) + 6ec: 6121 addi sp,sp,64 + 6ee: 8082 ret + + + +; ---------- single-field structs by values (and small array fields) ----------> +; +; struct C { char c; }; +; struct S { short s; }; +; struct I { int i; }; +; struct F { float f; }; +; struct D { double d; }; +; +; struct C2 { char c[2]; }; +; struct C3 { char c[3]; }; +; +; void leaf_call(struct C2 a, struct C b, struct S c, struct I d, struct F e, struct D f, struct C3 g) +; { +; } +; +; int main() +; { +; leaf_call((struct C2){{0,1}}, (struct C){2}, (struct S){3}, (struct I){4}, (struct F){5.f}, (struct D){6.}, (struct C3){{7,8,9}}); +; return 0; +; } + + + +; output from freebsd-14.0-riscv64 w/ clang 17.0.6 (w/ flags to simplify: -fno-stack-protector -fno-pic) + +0000000000000000 <leaf_call>: + 0: 5d 71 addi sp, sp, -80 + 2: 86 e4 sd ra, 72(sp) + 4: a2 e0 sd s0, 64(sp) + 6: 80 08 addi s0, sp, 80 + 8: 23 30 a4 fe sd a0, -32(s0) + c: 03 15 04 fe lh a0, -32(s0) + 10: 23 17 a4 fe sh a0, -18(s0) + 14: a3 0f b4 fc sb a1, -33(s0) + 18: 23 1e c4 fc sh a2, -36(s0) + 1c: 23 2c d4 fc sw a3, -40(s0) + 20: 27 2a a4 fc fsw fa0, -44(s0) + 24: 27 34 b4 fc fsd fa1, -56(s0) + 28: 23 3c e4 fa sd a4, -72(s0) + 2c: 03 45 a4 fb lbu a0, -70(s0) + 30: 23 03 a4 fc sb a0, -58(s0) + 34: 03 15 84 fb lh a0, -72(s0) + 38: 23 12 a4 fc sh a0, -60(s0) + 3c: a6 60 ld ra, 72(sp) + 3e: 06 64 ld s0, 64(sp) + 40: 61 61 addi sp, sp, 80 + 42: 82 80 ret + +0000000000000044 <main>: + 44: 5d 71 addi sp, sp, -80 + 46: 86 e4 sd ra, 72(sp) + 48: a2 e0 sd s0, 64(sp) + 4a: 80 08 addi s0, sp, 80 + 4c: 01 45 li a0, 0 + 4e: 23 38 a4 fa sd a0, -80(s0) + 52: 23 26 a4 fe sw a0, -20(s0) + 56: 23 05 a4 fe sb a0, -22(s0) + 5a: 05 45 li a0, 1 + 5c: a3 05 a4 fe sb a0, -21(s0) + 60: 09 45 li a0, 2 + 62: a3 04 a4 fe sb a0, -23(s0) + 66: 0d 45 li a0, 3 + 68: 23 13 a4 fe sh a0, -26(s0) + 6c: 11 45 li a0, 4 + 6e: 23 20 a4 fe sw a0, -32(s0) + 72: 37 05 a0 40 lui a0, 264704 + 76: 23 2e a4 fc sw a0, -36(s0) + 7a: 37 35 80 00 lui a0, 2051 + 7e: 1e 15 slli a0, a0, 39 + 80: 23 38 a4 fc sd a0, -48(s0) + 84: 1d 45 li a0, 7 + 86: a3 06 a4 fc sb a0, -51(s0) + 8a: 21 45 li a0, 8 + 8c: 23 07 a4 fc sb a0, -50(s0) + 90: 25 45 li a0, 9 + 92: a3 07 a4 fc sb a0, -49(s0) + 96: 03 45 b4 fe lbu a0, -21(s0) + 9a: 1b 15 85 00 slliw a0, a0, 8 + 9e: 83 45 a4 fe lbu a1, -22(s0) + a2: 4d 8d or a0, a0, a1 + a4: 23 10 a4 fc sh a0, -64(s0) + a8: 03 35 04 fc ld a0, -64(s0) + ac: 83 45 94 fe lbu a1, -23(s0) + b0: 03 56 64 fe lhu a2, -26(s0) + b4: 83 66 04 fe lwu a3, -32(s0) + b8: 07 25 c4 fd flw fa0, -36(s0) + bc: 87 35 04 fd fld fa1, -48(s0) + c0: 03 47 f4 fc lbu a4, -49(s0) + c4: 23 0d e4 fa sb a4, -70(s0) + c8: 03 47 e4 fc lbu a4, -50(s0) + cc: 1b 17 87 00 slliw a4, a4, 8 + d0: 83 47 d4 fc lbu a5, -51(s0) + d4: 5d 8f or a4, a4, a5 + d6: 23 1c e4 fa sh a4, -72(s0) + da: 03 37 84 fb ld a4, -72(s0) + de: 97 00 00 00 auipc ra, 0 + e2: e7 80 00 00 jalr ra + e6: 03 35 04 fb ld a0, -80(s0) + ea: a6 60 ld ra, 72(sp) + ec: 06 64 ld s0, 64(sp) + ee: 61 61 addi sp, sp, 80 + f0: 82 80 ret + + + +; output from debian-trixie_20240211-riscv64 w/ gcc 13.2.0 (w/ flags to simplify: -fno-stack-protector) + +0000000000000628 <leaf_call>: + 628: 715d addi sp,sp,-80 + 62a: e4a2 sd s0,72(sp) + 62c: 0880 addi s0,sp,80 + 62e: fea41423 sh a0,-24(s0) + 632: feb40023 sb a1,-32(s0) + 636: fcc41c23 sh a2,-40(s0) + 63a: fcd42823 sw a3,-48(s0) + 63e: fca42427 fsw fa0,-56(s0) + 642: fcb43027 fsd fa1,-64(s0) + 646: fae43c23 sd a4,-72(s0) + 64a: 0001 nop + 64c: 6426 ld s0,72(sp) + 64e: 6161 addi sp,sp,80 + 650: 8082 ret + +0000000000000652 <main>: + 652: 1101 addi sp,sp,-32 + 654: ec06 sd ra,24(sp) + 656: e822 sd s0,16(sp) + 658: 1000 addi s0,sp,32 + 65a: fe040423 sb zero,-24(s0) + 65e: 4785 li a5,1 + 660: fef404a3 sb a5,-23(s0) + 664: 4589 li a1,2 + 666: 460d li a2,3 + 668: 4691 li a3,4 + 66a: 00000797 auipc a5,0x0 + 66e: 05678793 addi a5,a5,86 # 6c0 <_IO_stdin_used+0x8> + 672: 0007a787 flw fa5,0(a5) + 676: 00000797 auipc a5,0x0 + 67a: 05278793 addi a5,a5,82 # 6c8 <_IO_stdin_used+0x10> + 67e: 2398 fld fa4,0(a5) + 680: 479d li a5,7 + 682: fef40023 sb a5,-32(s0) + 686: 47a1 li a5,8 + 688: fef400a3 sb a5,-31(s0) + 68c: 47a5 li a5,9 + 68e: fef40123 sb a5,-30(s0) + 692: fe043703 ld a4,-32(s0) + 696: 22e705d3 fmv.d fa1,fa4 + 69a: 20f78553 fmv.s fa0,fa5 + 69e: fe843503 ld a0,-24(s0) + 6a2: f87ff0ef jal 628 <leaf_call> + 6a6: 4781 li a5,0 + 6a8: 853e mv a0,a5 + 6aa: 60e2 ld ra,24(sp) + 6ac: 6442 ld s0,16(sp) + 6ae: 6105 addi sp,sp,32 + 6b0: 8082 ret + + + +; ---------- C++ trivial and non-trivial aggrs passed to C funcs ----------> +; +; struct Trivial { int a; }; +; struct NonTrivial { int a; NonTrivial() : a(0) {} NonTrivial(const NonTrivial& rhs) : a(rhs.a) { } }; +; +; extern "C" { +; +; void f1(struct Trivial s) { } +; void f2(struct NonTrivial s) { } +; +; void f() +; { +; struct Trivial t; +; struct NonTrivial n; +; int a=1; +; a += 123; +; f1(t); +; a -= 123; +; f2(n); +; a -= 12; +; } +; } + + + +; output from freebsd-14.0-riscv64 w/ clang 17.0.6 (w/ flags to simplify: -fno-stack-protector -fno-pic) + +0000000000000000 <f1>: + 0: 01 11 addi sp, sp, -32 + 2: 06 ec sd ra, 24(sp) + 4: 22 e8 sd s0, 16(sp) + 6: 00 10 addi s0, sp, 32 + 8: 23 26 a4 fe sw a0, -20(s0) + c: e2 60 ld ra, 24(sp) + e: 42 64 ld s0, 16(sp) + 10: 05 61 addi sp, sp, 32 + 12: 82 80 ret + +0000000000000014 <f2>: + 14: 01 11 addi sp, sp, -32 + 16: 06 ec sd ra, 24(sp) + 18: 22 e8 sd s0, 16(sp) + 1a: 00 10 addi s0, sp, 32 + 1c: 23 34 a4 fe sd a0, -24(s0) + 20: e2 60 ld ra, 24(sp) + 22: 42 64 ld s0, 16(sp) + 24: 05 61 addi sp, sp, 32 + 26: 82 80 ret + +0000000000000028 <f>: + 28: 39 71 addi sp, sp, -64 + 2a: 06 fc sd ra, 56(sp) + 2c: 22 f8 sd s0, 48(sp) + 2e: 80 00 addi s0, sp, 64 + 30: 13 05 84 fe addi a0, s0, -24 + 34: 23 34 a4 fc sd a0, -56(s0) + 38: 97 00 00 00 auipc ra, 0 + 3c: e7 80 00 00 jalr ra + 40: 05 45 li a0, 1 + 42: 23 22 a4 fe sw a0, -28(s0) + 46: 03 25 44 fe lw a0, -28(s0) + 4a: 1b 05 b5 07 addiw a0, a0, 123 + 4e: 23 22 a4 fe sw a0, -28(s0) + 52: 03 25 c4 fe lw a0, -20(s0) + 56: 23 20 a4 fe sw a0, -32(s0) + 5a: 03 65 04 fe lwu a0, -32(s0) + 5e: 97 00 00 00 auipc ra, 0 + 62: e7 80 00 00 jalr ra + 66: 83 35 84 fc ld a1, -56(s0) + 6a: 03 25 44 fe lw a0, -28(s0) + 6e: 1b 05 55 f8 addiw a0, a0, -123 + 72: 23 22 a4 fe sw a0, -28(s0) + 76: 13 05 c4 fd addi a0, s0, -36 + 7a: 23 38 a4 fc sd a0, -48(s0) + 7e: 97 00 00 00 auipc ra, 0 + 82: e7 80 00 00 jalr ra + 86: 03 35 04 fd ld a0, -48(s0) + 8a: 97 00 00 00 auipc ra, 0 + 8e: e7 80 00 00 jalr ra + 92: 03 25 44 fe lw a0, -28(s0) + 96: 51 35 addiw a0, a0, -12 + 98: 23 22 a4 fe sw a0, -28(s0) + 9c: e2 70 ld ra, 56(sp) + 9e: 42 74 ld s0, 48(sp) + a0: 21 61 addi sp, sp, 64 + a2: 82 80 ret + + ; ... snip, removed code of ctor and copy ctor ... + + + +; output from debian-trixie_20240211-riscv64 w/ gcc 13.2.0 (w/ flags to simplify: -fno-stack-protector) + +0000000000000000 <f1>: + 0: 1101 addi sp,sp,-32 + 2: ec22 sd s0,24(sp) + 4: 1000 addi s0,sp,32 + 6: fea42423 sw a0,-24(s0) + a: 0001 nop + c: 6462 ld s0,24(sp) + e: 6105 addi sp,sp,32 + 10: 8082 ret + +0000000000000012 <f2>: + 12: 1101 addi sp,sp,-32 + 14: ec22 sd s0,24(sp) + 16: 1000 addi s0,sp,32 + 18: fea43423 sd a0,-24(s0) + 1c: 0001 nop + 1e: 6462 ld s0,24(sp) + 20: 6105 addi sp,sp,32 + 22: 8082 ret + +0000000000000024 <f>: + 24: 7179 addi sp,sp,-48 + 26: f406 sd ra,40(sp) + 28: f022 sd s0,32(sp) + 2a: 1800 addi s0,sp,48 + 2c: fd840793 addi a5,s0,-40 + 30: 853e mv a0,a5 + 32: 00000097 auipc ra,0x0 + 36: 000080e7 jalr ra # 32 <f+0xe> + 3a: 4785 li a5,1 + 3c: fef42623 sw a5,-20(s0) + 40: fec42783 lw a5,-20(s0) + 44: 07b7879b addiw a5,a5,123 + 48: fef42623 sw a5,-20(s0) + 4c: fe042783 lw a5,-32(s0) + 50: 853e mv a0,a5 + 52: 00000097 auipc ra,0x0 + 56: 000080e7 jalr ra # 52 <f+0x2e> + 5a: fec42783 lw a5,-20(s0) + 5e: f857879b addiw a5,a5,-123 + 62: fef42623 sw a5,-20(s0) + 66: fd840713 addi a4,s0,-40 + 6a: fe840793 addi a5,s0,-24 + 6e: 85ba mv a1,a4 + 70: 853e mv a0,a5 + 72: 00000097 auipc ra,0x0 + 76: 000080e7 jalr ra # 72 <f+0x4e> + 7a: fe840793 addi a5,s0,-24 + 7e: 853e mv a0,a5 + 80: 00000097 auipc ra,0x0 + 84: 000080e7 jalr ra # 80 <f+0x5c> + 88: fec42783 lw a5,-20(s0) + 8c: 37d1 addiw a5,a5,-12 + 8e: fef42623 sw a5,-20(s0) + 92: 0001 nop + 94: 70a2 ld ra,40(sp) + 96: 7402 ld s0,32(sp) + 98: 6145 addi sp,sp,48 + 9a: 8082 ret + + ; ... snip, removed code of ctor and copy ctor ... + + + +; ---------- C++ trivial and non-trivial aggrs as return values ----------> +; + struct Trivial { int a; }; + struct NonTrivial { int a; NonTrivial() : a(0) {} NonTrivial(const NonTrivial& rhs) : a(rhs.a) { } }; + + extern "C" { + struct Trivial f1() { return Trivial(); } + } + + struct NonTrivial f2() { return NonTrivial(); } + + extern "C" { + void f() + { + int a=1; + a += 123; + struct Trivial t = f1(); + a -= 123; + struct NonTrivial n = f2(); + a -= 12; + } + } + + + +; output from freebsd-14.0-riscv64 w/ clang 17.0.6 (w/ flags to simplify: -fno-stack-protector -fno-pic) + +0000000000000000 <f1>: + 0: 01 11 addi sp, sp, -32 + 2: 06 ec sd ra, 24(sp) + 4: 22 e8 sd s0, 16(sp) + 6: 00 10 addi s0, sp, 32 + 8: 01 45 li a0, 0 + a: 23 26 a4 fe sw a0, -20(s0) + e: 03 65 c4 fe lwu a0, -20(s0) + 12: e2 60 ld ra, 24(sp) + 14: 42 64 ld s0, 16(sp) + 16: 05 61 addi sp, sp, 32 + 18: 82 80 ret + +000000000000001a <_Z2f2v>: + 1a: 01 11 addi sp, sp, -32 + 1c: 06 ec sd ra, 24(sp) + 1e: 22 e8 sd s0, 16(sp) + 20: 00 10 addi s0, sp, 32 + 22: 23 34 a4 fe sd a0, -24(s0) + 26: 97 00 00 00 auipc ra, 0 + 2a: e7 80 00 00 jalr ra + 2e: e2 60 ld ra, 24(sp) + 30: 42 64 ld s0, 16(sp) + 32: 05 61 addi sp, sp, 32 + 34: 82 80 ret + +0000000000000036 <f>: + 36: 01 11 addi sp, sp, -32 + 38: 06 ec sd ra, 24(sp) + 3a: 22 e8 sd s0, 16(sp) + 3c: 00 10 addi s0, sp, 32 + 3e: 05 45 li a0, 1 + 40: 23 26 a4 fe sw a0, -20(s0) + 44: 03 25 c4 fe lw a0, -20(s0) + 48: 1b 05 b5 07 addiw a0, a0, 123 + 4c: 23 26 a4 fe sw a0, -20(s0) + 50: 97 00 00 00 auipc ra, 0 + 54: e7 80 00 00 jalr ra + 58: 23 24 a4 fe sw a0, -24(s0) + 5c: 03 25 c4 fe lw a0, -20(s0) + 60: 1b 05 55 f8 addiw a0, a0, -123 + 64: 23 26 a4 fe sw a0, -20(s0) + 68: 13 05 44 fe addi a0, s0, -28 + 6c: 97 00 00 00 auipc ra, 0 + 70: e7 80 00 00 jalr ra + 74: 03 25 c4 fe lw a0, -20(s0) + 78: 51 35 addiw a0, a0, -12 + 7a: 23 26 a4 fe sw a0, -20(s0) + 7e: e2 60 ld ra, 24(sp) + 80: 42 64 ld s0, 16(sp) + 82: 05 61 addi sp, sp, 32 + 84: 82 80 ret + + ; ... snip, removed code of ctor ... + + + +; output from debian-trixie_20240211-riscv64 w/ gcc 13.2.0 (w/ flags to simplify: -fno-stack-protector) + + +0000000000000000 <f1>: + 0: 1141 addi sp,sp,-16 + 2: e422 sd s0,8(sp) + 4: 0800 addi s0,sp,16 + 6: 4781 li a5,0 + 8: 853e mv a0,a5 + a: 6422 ld s0,8(sp) + c: 0141 addi sp,sp,16 + e: 8082 ret + +0000000000000010 <_Z2f2v>: + 10: 1101 addi sp,sp,-32 + 12: ec06 sd ra,24(sp) + 14: e822 sd s0,16(sp) + 16: 1000 addi s0,sp,32 + 18: fea43423 sd a0,-24(s0) + 1c: fe843503 ld a0,-24(s0) + 20: 00000097 auipc ra,0x0 + 24: 000080e7 jalr ra # 20 <_Z2f2v+0x10> + 28: fe843503 ld a0,-24(s0) + 2c: 60e2 ld ra,24(sp) + 2e: 6442 ld s0,16(sp) + 30: 6105 addi sp,sp,32 + 32: 8082 ret + +0000000000000034 <f>: + 34: 1101 addi sp,sp,-32 + 36: ec06 sd ra,24(sp) + 38: e822 sd s0,16(sp) + 3a: 1000 addi s0,sp,32 + 3c: 4785 li a5,1 + 3e: fef42623 sw a5,-20(s0) + 42: fec42783 lw a5,-20(s0) + 46: 07b7879b addiw a5,a5,123 + 4a: fef42623 sw a5,-20(s0) + 4e: 00000097 auipc ra,0x0 + 52: 000080e7 jalr ra # 4e <f+0x1a> + 56: 87aa mv a5,a0 + 58: fef42423 sw a5,-24(s0) + 5c: fec42783 lw a5,-20(s0) + 60: f857879b addiw a5,a5,-123 + 64: fef42623 sw a5,-20(s0) + 68: fe040793 addi a5,s0,-32 + 6c: 853e mv a0,a5 + 6e: 00000097 auipc ra,0x0 + 72: 000080e7 jalr ra # 6e <f+0x3a> + 76: fec42783 lw a5,-20(s0) + 7a: 37d1 addiw a5,a5,-12 + 7c: fef42623 sw a5,-20(s0) + 80: 0001 nop + 82: 60e2 ld ra,24(sp) + 84: 6442 ld s0,16(sp) + 86: 6105 addi sp,sp,32 + 88: 8082 ret + + ; ... snip, removed code of ctor ... + + + +; vim: ft=asm68k +