# Assignment2: RISC-V Toolchain
contributed by < `guaneec` >
###### tags: `arch2020`
Chosen programs:
1. [Format printer by 魏晉成](https://github.com/ParkerMactavish/NCKU_CA_109/blob/master/HW1/formatPrinter.s)
2. [MergeSort by 林柏維](https://github.com/waynelinbo/Computer_Architecture_Lab1_MergeSort)
## Format printer
### C
#### [printf.h](https://github.com/guaneec/arch2020/blob/master/a2/printf.h)
#### [printf.c](https://github.com/guaneec/arch2020/blob/master/a2/printf.c)
`putchar` has been rewritten with memory writes.
### Disassembly
:::spoiler
```
printf: file format elf32-littleriscv
Disassembly of section .text:
00010054 <putchar>:
10054: 0ff57713 andi a4,a0,255
10058: 400027b7 lui a5,0x40002
1005c: 00e78023 sb a4,0(a5) # 40002000 <__global_pointer$+0x3fff04d4>
10060: 00070513 mv a0,a4
10064: 00008067 ret
00010068 <self_printf>:
10068: f9010113 addi sp,sp,-112
1006c: 06f12223 sw a5,100(sp)
10070: 05410793 addi a5,sp,84
10074: 04812623 sw s0,76(sp)
10078: 04912423 sw s1,72(sp)
1007c: 05212223 sw s2,68(sp)
10080: 05312023 sw s3,64(sp)
10084: 03412e23 sw s4,60(sp)
10088: 03512c23 sw s5,56(sp)
1008c: 07012423 sw a6,104(sp)
10090: 07112623 sw a7,108(sp)
10094: 04b12a23 sw a1,84(sp)
10098: 04c12c23 sw a2,88(sp)
1009c: 04d12e23 sw a3,92(sp)
100a0: 06e12023 sw a4,96(sp)
100a4: 00f12623 sw a5,12(sp)
100a8: 02500393 li t2,37
100ac: 400028b7 lui a7,0x40002
100b0: 06300413 li s0,99
100b4: 01010813 addi a6,sp,16
100b8: 00900e93 li t4,9
100bc: 02000f13 li t5,32
100c0: 07300a93 li s5,115
100c4: 07800a13 li s4,120
100c8: 06f00993 li s3,111
100cc: 05800913 li s2,88
100d0: 06200493 li s1,98
100d4: 00054783 lbu a5,0(a0)
100d8: 00078c63 beqz a5,100f0 <self_printf+0x88>
100dc: 02778a63 beq a5,t2,10110 <self_printf+0xa8>
100e0: 00150513 addi a0,a0,1
100e4: 00f88023 sb a5,0(a7) # 40002000 <__global_pointer$+0x3fff04d4>
100e8: 00054783 lbu a5,0(a0)
100ec: fe0798e3 bnez a5,100dc <self_printf+0x74>
100f0: 04c12403 lw s0,76(sp)
100f4: 04812483 lw s1,72(sp)
100f8: 04412903 lw s2,68(sp)
100fc: 04012983 lw s3,64(sp)
10100: 03c12a03 lw s4,60(sp)
10104: 03812a83 lw s5,56(sp)
10108: 07010113 addi sp,sp,112
1010c: 00008067 ret
10110: 00154783 lbu a5,1(a0)
10114: 00250513 addi a0,a0,2
10118: 10878063 beq a5,s0,10218 <self_printf+0x1b0>
1011c: 00f46c63 bltu s0,a5,10134 <self_printf+0xcc>
10120: 0b278a63 beq a5,s2,101d4 <self_printf+0x16c>
10124: 0a978263 beq a5,s1,101c8 <self_printf+0x160>
10128: fa779ee3 bne a5,t2,100e4 <self_printf+0x7c>
1012c: 00788023 sb t2,0(a7)
10130: fa5ff06f j 100d4 <self_printf+0x6c>
10134: 0b578c63 beq a5,s5,101ec <self_printf+0x184>
10138: 09478063 beq a5,s4,101b8 <self_printf+0x150>
1013c: fb3794e3 bne a5,s3,100e4 <self_printf+0x7c>
10140: 00700e13 li t3,7
10144: 00300313 li t1,3
10148: 00c12783 lw a5,12(sp)
1014c: 02700293 li t0,39
10150: 00478713 addi a4,a5,4
10154: 00e12623 sw a4,12(sp)
10158: 0007a683 lw a3,0(a5)
1015c: 000f8463 beqz t6,10164 <self_printf+0xfc>
10160: 00700293 li t0,7
10164: 00000713 li a4,0
10168: 0080006f j 10170 <self_printf+0x108>
1016c: 07e70c63 beq a4,t5,101e4 <self_printf+0x17c>
10170: 00de7633 and a2,t3,a3
10174: 00170713 addi a4,a4,1
10178: 00e805b3 add a1,a6,a4
1017c: 0ff67793 andi a5,a2,255
10180: 4066d6b3 sra a3,a3,t1
10184: 00ced463 bge t4,a2,1018c <self_printf+0x124>
10188: 00f287b3 add a5,t0,a5
1018c: 03078793 addi a5,a5,48
10190: 0ff7f793 andi a5,a5,255
10194: fef58fa3 sb a5,-1(a1)
10198: fc069ae3 bnez a3,1016c <self_printf+0x104>
1019c: 00e80733 add a4,a6,a4
101a0: 0080006f j 101a8 <self_printf+0x140>
101a4: fff74783 lbu a5,-1(a4)
101a8: 00f88023 sb a5,0(a7)
101ac: fff70713 addi a4,a4,-1
101b0: fee81ae3 bne a6,a4,101a4 <self_printf+0x13c>
101b4: f21ff06f j 100d4 <self_printf+0x6c>
101b8: 00f00e13 li t3,15
101bc: 00000f93 li t6,0
101c0: 00400313 li t1,4
101c4: f85ff06f j 10148 <self_printf+0xe0>
101c8: 00100e13 li t3,1
101cc: 00100313 li t1,1
101d0: f79ff06f j 10148 <self_printf+0xe0>
101d4: 00f00e13 li t3,15
101d8: 00100f93 li t6,1
101dc: 00400313 li t1,4
101e0: f69ff06f j 10148 <self_printf+0xe0>
101e4: 02f14783 lbu a5,47(sp)
101e8: fb5ff06f j 1019c <self_printf+0x134>
101ec: 00c12783 lw a5,12(sp)
101f0: 0007a703 lw a4,0(a5)
101f4: 00478793 addi a5,a5,4
101f8: 00f12623 sw a5,12(sp)
101fc: 00074783 lbu a5,0(a4)
10200: ec078ae3 beqz a5,100d4 <self_printf+0x6c>
10204: 00f88023 sb a5,0(a7)
10208: 00170713 addi a4,a4,1
1020c: 00074783 lbu a5,0(a4)
10210: fe079ae3 bnez a5,10204 <self_printf+0x19c>
10214: ec1ff06f j 100d4 <self_printf+0x6c>
10218: 00c12783 lw a5,12(sp)
1021c: 0007c703 lbu a4,0(a5)
10220: 00478793 addi a5,a5,4
10224: 00f12623 sw a5,12(sp)
10228: 00e88023 sb a4,0(a7)
1022c: ea9ff06f j 100d4 <self_printf+0x6c>
00010230 <_start>:
10230: 3b14f7b7 lui a5,0x3b14f
10234: fe010113 addi sp,sp,-32
10238: 50f78793 addi a5,a5,1295 # 3b14f50f <__global_pointer$+0x3b13d9e3>
1023c: 00f12423 sw a5,8(sp)
10240: 0000d8b7 lui a7,0xd
10244: 00679837 lui a6,0x679
10248: 00102737 lui a4,0x102
1024c: 0029d7b7 lui a5,0x29d
10250: def88893 addi a7,a7,-529 # cdef <putchar-0x3265>
10254: 9ab80813 addi a6,a6,-1621 # 6789ab <__global_pointer$+0x666e7f>
10258: 34570713 addi a4,a4,837 # 102345 <__global_pointer$+0xf0819>
1025c: bb878793 addi a5,a5,-1096 # 29cbb8 <__global_pointer$+0x28b08c>
10260: 00010537 lui a0,0x10
10264: 000105b7 lui a1,0x10
10268: 00f12223 sw a5,4(sp)
1026c: 2a850513 addi a0,a0,680 # 102a8 <_start+0x78>
10270: 01112023 sw a7,0(sp)
10274: 00080793 mv a5,a6
10278: 00070693 mv a3,a4
1027c: 06300613 li a2,99
10280: 29c58593 addi a1,a1,668 # 1029c <_start+0x6c>
10284: 00112e23 sw ra,28(sp)
10288: de1ff0ef jal ra,10068 <self_printf>
1028c: 01c12083 lw ra,28(sp)
10290: 00000513 li a0,0
10294: 02010113 addi sp,sp,32
10298: 00008067 ret
```
:::
### Runtime stats
Compiled
```
$ ~/rv32emu/emu-rv32i printf
StringInArg
normalString
CharInArg: c
PercentSign: %
Not supporting: eerd
Hex0: 102345 102345
Hex1: 6789ab 6789AB
Hex2: cdef CDEF
Oct: 12345670
Bin: 111011000101001111010100001111
>>> Execution time: 1780778 ns
>>> Instruction count: 1935 (IPS=1086603)
>>> Jumps: 375 (19.38%) - 112 forwards, 263 backwards
>>> Branching T=338 (57.88%) F=246 (42.12%)
```
The stats T and F the number of true and false branches taken. With this info, a simple branch predictor can be implemented by taking the more frequent option by default.
## MergeSort
### C
[mergesort.c](https://github.com/guaneec/arch2020/blob/master/a2/mergesort.c)
printf.h is included to output results.
I compiled with the O2 flag, since with the O3 flag, the compiler optimizes the array intialization into a `memset` call, which requires the stdlib.
### Disassembly
:::spoiler
```
mergesort: file format elf32-littleriscv
Disassembly of section .text:
00010054 <putchar>:```
10054: 0ff57713 andi a4,a0,255
10058: 400027b7 lui a5,0x40002
1005c: 00e78023 sb a4,0(a5) # 40002000 <__global_pointer$+0x3fff02f0>
10060: 00070513 mv a0,a4
10064: 00008067 ret
00010068 <self_printf>:
10068: f9010113 addi sp,sp,-112
1006c: 06f12223 sw a5,100(sp)
10070: 05410793 addi a5,sp,84
10074: 04812623 sw s0,76(sp)
10078: 04912423 sw s1,72(sp)
1007c: 05212223 sw s2,68(sp)
10080: 05312023 sw s3,64(sp)
10084: 03412e23 sw s4,60(sp)
10088: 03512c23 sw s5,56(sp)
1008c: 07012423 sw a6,104(sp)
10090: 07112623 sw a7,108(sp)
10094: 04b12a23 sw a1,84(sp)
10098: 04c12c23 sw a2,88(sp)
1009c: 04d12e23 sw a3,92(sp)
100a0: 06e12023 sw a4,96(sp)
100a4: 00f12623 sw a5,12(sp)
100a8: 02500393 li t2,37
100ac: 400028b7 lui a7,0x40002
100b0: 06300413 li s0,99
100b4: 01010813 addi a6,sp,16
100b8: 00900e93 li t4,9
100bc: 02000f13 li t5,32
100c0: 07300a93 li s5,115
100c4: 07800a13 li s4,120
100c8: 06f00993 li s3,111
100cc: 05800913 li s2,88
100d0: 06200493 li s1,98
100d4: 00054783 lbu a5,0(a0)
100d8: 00078c63 beqz a5,100f0 <self_printf+0x88>
100dc: 02778a63 beq a5,t2,10110 <self_printf+0xa8>
100e0: 00150513 addi a0,a0,1
100e4: 00f88023 sb a5,0(a7) # 40002000 <__global_pointer$+0x3fff02f0>
100e8: 00054783 lbu a5,0(a0)
100ec: fe0798e3 bnez a5,100dc <self_printf+0x74>
100f0: 04c12403 lw s0,76(sp)
100f4: 04812483 lw s1,72(sp)
100f8: 04412903 lw s2,68(sp)
100fc: 04012983 lw s3,64(sp)
10100: 03c12a03 lw s4,60(sp)
10104: 03812a83 lw s5,56(sp)
10108: 07010113 addi sp,sp,112
1010c: 00008067 ret
10110: 00154783 lbu a5,1(a0)
10114: 00250513 addi a0,a0,2
10118: 10878063 beq a5,s0,10218 <self_printf+0x1b0>
1011c: 00f46c63 bltu s0,a5,10134 <self_printf+0xcc>
10120: 0b278a63 beq a5,s2,101d4 <self_printf+0x16c>
10124: 0a978263 beq a5,s1,101c8 <self_printf+0x160>
10128: fa779ee3 bne a5,t2,100e4 <self_printf+0x7c>
1012c: 00788023 sb t2,0(a7)
10130: fa5ff06f j 100d4 <self_printf+0x6c>
10134: 0b578c63 beq a5,s5,101ec <self_printf+0x184>
10138: 09478063 beq a5,s4,101b8 <self_printf+0x150>
1013c: fb3794e3 bne a5,s3,100e4 <self_printf+0x7c>
10140: 00700e13 li t3,7
10144: 00300313 li t1,3
10148: 00c12783 lw a5,12(sp)
1014c: 02700293 li t0,39
10150: 00478713 addi a4,a5,4
10154: 00e12623 sw a4,12(sp)
10158: 0007a683 lw a3,0(a5)
1015c: 000f8463 beqz t6,10164 <self_printf+0xfc>
10160: 00700293 li t0,7
10164: 00000713 li a4,0
10168: 0080006f j 10170 <self_printf+0x108>
1016c: 07e70c63 beq a4,t5,101e4 <self_printf+0x17c>
10170: 00de7633 and a2,t3,a3
10174: 00170713 addi a4,a4,1
10178: 00e805b3 add a1,a6,a4
1017c: 0ff67793 andi a5,a2,255
10180: 4066d6b3 sra a3,a3,t1
10184: 00ced463 bge t4,a2,1018c <self_printf+0x124>
10188: 00f287b3 add a5,t0,a5
1018c: 03078793 addi a5,a5,48
10190: 0ff7f793 andi a5,a5,255
10194: fef58fa3 sb a5,-1(a1)
10198: fc069ae3 bnez a3,1016c <self_printf+0x104>
1019c: 00e80733 add a4,a6,a4
101a0: 0080006f j 101a8 <self_printf+0x140>
101a4: fff74783 lbu a5,-1(a4)
101a8: 00f88023 sb a5,0(a7)
101ac: fff70713 addi a4,a4,-1
101b0: fee81ae3 bne a6,a4,101a4 <self_printf+0x13c>
101b4: f21ff06f j 100d4 <self_printf+0x6c>
101b8: 00f00e13 li t3,15
101bc: 00000f93 li t6,0
101c0: 00400313 li t1,4
101c4: f85ff06f j 10148 <self_printf+0xe0>
101c8: 00100e13 li t3,1
101cc: 00100313 li t1,1
101d0: f79ff06f j 10148 <self_printf+0xe0>
101d4: 00f00e13 li t3,15
101d8: 00100f93 li t6,1
101dc: 00400313 li t1,4
101e0: f69ff06f j 10148 <self_printf+0xe0>
101e4: 02f14783 lbu a5,47(sp)
101e8: fb5ff06f j 1019c <self_printf+0x134>
101ec: 00c12783 lw a5,12(sp)
101f0: 0007a703 lw a4,0(a5)
101f4: 00478793 addi a5,a5,4
101f8: 00f12623 sw a5,12(sp)
101fc: 00074783 lbu a5,0(a4)
10200: ec078ae3 beqz a5,100d4 <self_printf+0x6c>
10204: 00f88023 sb a5,0(a7)
10208: 00170713 addi a4,a4,1
1020c: 00074783 lbu a5,0(a4)
10210: fe079ae3 bnez a5,10204 <self_printf+0x19c>
10214: ec1ff06f j 100d4 <self_printf+0x6c>
10218: 00c12783 lw a5,12(sp)
1021c: 0007c703 lbu a4,0(a5)
10220: 00478793 addi a5,a5,4
10224: 00f12623 sw a5,12(sp)
10228: 00e88023 sb a4,0(a7)
1022c: ea9ff06f j 100d4 <self_printf+0x6c>
00010230 <merge>:
10230: 40b686b3 sub a3,a3,a1
10234: 00168e93 addi t4,a3,1
10238: 002e9793 slli a5,t4,0x2
1023c: ff010113 addi sp,sp,-16
10240: 00f78793 addi a5,a5,15
10244: 00812623 sw s0,12(sp)
10248: ff07f793 andi a5,a5,-16
1024c: 01010413 addi s0,sp,16
10250: 40f10133 sub sp,sp,a5
10254: 00010e13 mv t3,sp
10258: 03d05a63 blez t4,1028c <merge+0x5c>
1025c: 00b688b3 add a7,a3,a1
10260: 00289813 slli a6,a7,0x2
10264: 00259793 slli a5,a1,0x2
10268: 00450893 addi a7,a0,4
1026c: 00f507b3 add a5,a0,a5
10270: 000e0713 mv a4,t3
10274: 011808b3 add a7,a6,a7
10278: 0007a803 lw a6,0(a5)
1027c: 00470713 addi a4,a4,4
10280: 00478793 addi a5,a5,4
10284: ff072e23 sw a6,-4(a4)
10288: ff1798e3 bne a5,a7,10278 <merge+0x48>
1028c: 40b60633 sub a2,a2,a1
10290: 00160813 addi a6,a2,1
10294: 08064663 bltz a2,10320 <merge+0xf0>
10298: 0d06c463 blt a3,a6,10360 <merge+0x130>
1029c: 00259313 slli t1,a1,0x2
102a0: 00650333 add t1,a0,t1
102a4: 00000893 li a7,0
102a8: 00289713 slli a4,a7,0x2
102ac: 00281793 slli a5,a6,0x2
102b0: 00ee0733 add a4,t3,a4
102b4: 00fe07b3 add a5,t3,a5
102b8: 00072703 lw a4,0(a4)
102bc: 0007a783 lw a5,0(a5)
102c0: 00158593 addi a1,a1,1
102c4: 04e7c863 blt a5,a4,10314 <merge+0xe4>
102c8: 00e32023 sw a4,0(t1)
102cc: 00188893 addi a7,a7,1
102d0: 05164863 blt a2,a7,10320 <merge+0xf0>
102d4: 00430313 addi t1,t1,4
102d8: fd06d8e3 bge a3,a6,102a8 <merge+0x78>
102dc: 00289793 slli a5,a7,0x2
102e0: 00259593 slli a1,a1,0x2
102e4: 00fe0e33 add t3,t3,a5
102e8: 00b505b3 add a1,a0,a1
102ec: 000e2783 lw a5,0(t3)
102f0: 00188893 addi a7,a7,1
102f4: 004e0e13 addi t3,t3,4
102f8: 00f5a023 sw a5,0(a1)
102fc: 00458593 addi a1,a1,4
10300: ff1656e3 bge a2,a7,102ec <merge+0xbc>
10304: ff040113 addi sp,s0,-16
10308: 00c12403 lw s0,12(sp)
1030c: 01010113 addi sp,sp,16
10310: 00008067 ret
10314: 00f32023 sw a5,0(t1)
10318: 00180813 addi a6,a6,1
1031c: fb165ce3 bge a2,a7,102d4 <merge+0xa4>
10320: ff06c2e3 blt a3,a6,10304 <merge+0xd4>
10324: 00281813 slli a6,a6,0x2
10328: 00259593 slli a1,a1,0x2
1032c: 002e9e93 slli t4,t4,0x2
10330: 010e0833 add a6,t3,a6
10334: 00b505b3 add a1,a0,a1
10338: 01de0e33 add t3,t3,t4
1033c: 00082783 lw a5,0(a6)
10340: 00458593 addi a1,a1,4
10344: 00480813 addi a6,a6,4
10348: fef5ae23 sw a5,-4(a1)
1034c: ffc818e3 bne a6,t3,1033c <merge+0x10c>
10350: ff040113 addi sp,s0,-16
10354: 00c12403 lw s0,12(sp)
10358: 01010113 addi sp,sp,16
1035c: 00008067 ret
10360: 00000893 li a7,0
10364: f79ff06f j 102dc <merge+0xac>
00010368 <mergesort>:
10368: 00c5c463 blt a1,a2,10370 <mergesort+0x8>
1036c: 00008067 ret
10370: 0040006f j 10374 <mergesort.part.0>
00010374 <mergesort.part.0>:
10374: fe010113 addi sp,sp,-32
10378: 00c587b3 add a5,a1,a2
1037c: 00812c23 sw s0,24(sp)
10380: 01f7d413 srli s0,a5,0x1f
10384: 00f40433 add s0,s0,a5
10388: 40145413 srai s0,s0,0x1
1038c: 00912a23 sw s1,20(sp)
10390: 00060493 mv s1,a2
10394: 00040613 mv a2,s0
10398: 00112e23 sw ra,28(sp)
1039c: 01212823 sw s2,16(sp)
103a0: 01312623 sw s3,12(sp)
103a4: 00050913 mv s2,a0
103a8: 00058993 mv s3,a1
103ac: fbdff0ef jal ra,10368 <mergesort>
103b0: 00048613 mv a2,s1
103b4: 00140593 addi a1,s0,1
103b8: 00090513 mv a0,s2
103bc: fadff0ef jal ra,10368 <mergesort>
103c0: 00040613 mv a2,s0
103c4: 01812403 lw s0,24(sp)
103c8: 01c12083 lw ra,28(sp)
103cc: 00048693 mv a3,s1
103d0: 00098593 mv a1,s3
103d4: 01412483 lw s1,20(sp)
103d8: 00c12983 lw s3,12(sp)
103dc: 00090513 mv a0,s2
103e0: 01012903 lw s2,16(sp)
103e4: 02010113 addi sp,sp,32
103e8: e49ff06f j 10230 <merge>
000103ec <_start>:
103ec: 000107b7 lui a5,0x10
103f0: 4d478793 addi a5,a5,1236 # 104d4 <_start+0xe8>
103f4: 0007a303 lw t1,0(a5)
103f8: 0047a883 lw a7,4(a5)
103fc: 0087a803 lw a6,8(a5)
10400: 00c7a583 lw a1,12(a5)
10404: 0107a603 lw a2,16(a5)
10408: 0147a683 lw a3,20(a5)
1040c: 0187a703 lw a4,24(a5)
10410: 01c7a783 lw a5,28(a5)
10414: 00010537 lui a0,0x10
10418: fc010113 addi sp,sp,-64
1041c: 4f450513 addi a0,a0,1268 # 104f4 <_start+0x108>
10420: 02812c23 sw s0,56(sp)
10424: 02912a23 sw s1,52(sp)
10428: 03212823 sw s2,48(sp)
1042c: 03312623 sw s3,44(sp)
10430: 02112e23 sw ra,60(sp)
10434: 00612023 sw t1,0(sp)
10438: 01112223 sw a7,4(sp)
1043c: 01012423 sw a6,8(sp)
10440: 00b12623 sw a1,12(sp)
10444: 00c12823 sw a2,16(sp)
10448: 00d12a23 sw a3,20(sp)
1044c: 00e12c23 sw a4,24(sp)
10450: 00f12e23 sw a5,28(sp)
10454: 00010413 mv s0,sp
10458: c11ff0ef jal ra,10068 <self_printf>
1045c: 02010913 addi s2,sp,32
10460: 00010493 mv s1,sp
10464: 000109b7 lui s3,0x10
10468: 0004a583 lw a1,0(s1)
1046c: 50498513 addi a0,s3,1284 # 10504 <_start+0x118>
10470: 00448493 addi s1,s1,4
10474: bf5ff0ef jal ra,10068 <self_printf>
10478: ff2498e3 bne s1,s2,10468 <_start+0x7c>
1047c: 000104b7 lui s1,0x10
10480: 50c48513 addi a0,s1,1292 # 1050c <_start+0x120>
10484: be5ff0ef jal ra,10068 <self_printf>
10488: 00700613 li a2,7
1048c: 00000593 li a1,0
10490: 00010513 mv a0,sp
10494: ee1ff0ef jal ra,10374 <mergesort.part.0>
10498: 00042583 lw a1,0(s0)
1049c: 50498513 addi a0,s3,1284
104a0: 00440413 addi s0,s0,4
104a4: bc5ff0ef jal ra,10068 <self_printf>
104a8: ff2418e3 bne s0,s2,10498 <_start+0xac>
104ac: 50c48513 addi a0,s1,1292
104b0: bb9ff0ef jal ra,10068 <self_printf>
104b4: 03c12083 lw ra,60(sp)
104b8: 03812403 lw s0,56(sp)
104bc: 03412483 lw s1,52(sp)
104c0: 03012903 lw s2,48(sp)
104c4: 02c12983 lw s3,44(sp)
104c8: 00000513 li a0,0
104cc: 04010113 addi sp,sp,64
104d0: 00008067 ret
```
:::
### Runtime stats
```
$ ~/rv32emu/emu-rv32i mergesort
Before Sort : 7 , 4 , a , 1 , 3 , 2 , 0 , 9 ,
0 , 1 , 2 , 3 , 4 , 7 , 9 , a ,
>>> Execution time: 826314 ns
>>> Instruction count: 2598 (IPS=3144083)
>>> Jumps: 337 (12.97%) - 168 forwards, 169 backwards
>>> Branching T=191 (43.41%) F=249 (56.59%)
```