--- tags: RISC-V --- # Assignment2: RISC-V Toolchain ## Question Selection I choose the ***Invert Binary Tree*** from [杜孟聰](https://hackmd.io/@MicahDoo/HJKfe5Izj). The reason for choosing this rpoblem is helping me to learn how to manipulate linked list in riscv assembly code. ## implementation ### C code The C code implementation is modified to fit in the emulator as follow: ```c= #include <stdio.h> #include "stdlib.h" #include "stdbool.h" typedef struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; } treeNode; void invert(treeNode *node) { if (node == NULL) return; treeNode *temp = node->left; node->left = node->right; node->right = temp; invert(node->left); invert(node->right); } int main() { treeNode a, b, c, d, e, f, g; a.val = 1; b.val = 2; c.val = 3; d.val = 4; e.val = 5; f.val = 6; g.val = 7; a.left = &b; a.right = &c; b.left = &d; b.right = &e; c.left = &f; c.right = &g; d.left = NULL; d.right = NULL; e.left = NULL; e.right = NULL; f.left = NULL; f.right = NULL; g.left = NULL; g.right = NULL; invert(&a); } ``` ### Modified Assembly code I trying to use another way to implement invert linked list, only the inverse and 2 later sections are changed(line 54 to line 79). ```clike= .data # 0x10000000 n: # 0x10000000 .word 1, 0x1000000c, 0x10000018 nl: # 0x1000000c .word 2, 0x10000024, 0x10000030 nr: # 0x10000018 .word 3, 0x1000003c, 0x10000048 nll: # 0x10000024 .word 4, 0, 0 nlr: # 0x10000030 .word 5, 0, 0 nrl: # 0x1000003c .word 6, 0, 0 nrr: # 0x10000048 .word 7, 0, 0 str1: .string "\nTree DFS: " space: .string " " .text main: # Load argument(s) from static data (pseudo instruction) # PRE-VALIDATION la a0, n # Preload node address # Equivalence: # auipc x10 0x10000 # lw x10 24 x10 # why 24? [12:0] 0x18 = 24 jal printResult # EXECUTION la a0, n mv s0, sp # use v0 to jump out the invert section addi s0, s0, 4 jal invert # VALIDATION la a0, n jal printResult exit: # Exit program li a7, 10 ecall invert: lw t0, 4(a0) # t0 <- a0.left lw t1, 8(a0) # t1 <- a0.right # swap sw t0, 8(a0) sw t1, 4(a0) beq zero, t1, gotoRigth mv a0, t1 # go to the left child addi sp, sp, -4 sw t0, 0(sp) j invert gotoRigth: # go to the right child beq zero, t0, backPreviousNode mv a0, t0 j invert backPreviousNode: # the current node does not have any child beq s0, sp, exitInvert lw a0, 0(sp) addi sp, sp, 4 j invert exitInvert: ret printResult: # PUSH addi sp, sp, -4 sw ra, 0, sp mv t0, a0 la a0, str1 li a7, 4 # print string ecall mv a0, t0 # mv a0, a0 jal traverse # POP lw ra, 0, sp addi sp, sp, 4 ret traverse: # PUSH addi sp, sp, -12 sw ra, 0, sp sw s0, 4, sp sw s1, 8, sp mv t0, a0 # supply lw a0, 0, a0 li a7, 1 # print integer ecall mv a0, t0 # restore lw s0, 4, a0 # s0 <- M[a0+4] = node->left lw s1, 8, a0 # s1 <- M[a0+8] = node->right # BRANCH # CHECK node->left == 0 beq s0, x0, left_traversed # no mv a0, s0 jal traverse # yes left_traversed: # CHECK node->right == 0 beq s1, x0, right_traversed # no mv a0, s1 jal traverse # yes right_traversed: # POP lw ra, 0, sp lw s0, 4, sp lw s1, 8, sp addi sp, sp, 12 ret # traverse ``` Following table shows the comparing of the origin assembly code and my modified code. | Execution Info | Original | modified | | -------- | -------- | -------- | | Cycles | 648 | 617 | | Instrs. retired | 428 | 407 | | CPI | 1.52 | 1.52 | ## Optimized by riscv-none-elf-gcc There are many types for optimizing the code. We will use the 4 types O0, O1, O2 and O3 to optimize the code in the followings. The disassebly code is too long, so we will focus section invert in the following discussion. ### -O0 #### Disassembly code ```clike= 00010184 <invert>: 10184: fd010113 addi sp,sp,-48 10188: 02112623 sw ra,44(sp) 1018c: 02812423 sw s0,40(sp) 10190: 03010413 addi s0,sp,48 10194: fca42e23 sw a0,-36(s0) 10198: fdc42783 lw a5,-36(s0) 1019c: 04078863 beqz a5,101ec <invert+0x68> 101a0: fdc42783 lw a5,-36(s0) 101a4: 0047a783 lw a5,4(a5) 101a8: fef42623 sw a5,-20(s0) 101ac: fdc42783 lw a5,-36(s0) 101b0: 0087a703 lw a4,8(a5) 101b4: fdc42783 lw a5,-36(s0) 101b8: 00e7a223 sw a4,4(a5) 101bc: fdc42783 lw a5,-36(s0) 101c0: fec42703 lw a4,-20(s0) 101c4: 00e7a423 sw a4,8(a5) 101c8: fdc42783 lw a5,-36(s0) 101cc: 0047a783 lw a5,4(a5) 101d0: 00078513 mv a0,a5 101d4: fb1ff0ef jal ra,10184 <invert> 101d8: fdc42783 lw a5,-36(s0) 101dc: 0087a783 lw a5,8(a5) 101e0: 00078513 mv a0,a5 101e4: fa1ff0ef jal ra,10184 <invert> 101e8: 0080006f j 101f0 <invert+0x6c> 101ec: 00000013 nop 101f0: 02c12083 lw ra,44(sp) 101f4: 02812403 lw s0,40(sp) 101f8: 03010113 addi sp,sp,48 101fc: 00008067 ret ``` #### Observation - LOC(Line of Code): 31 - Register Used: - sx register: s0 - tx register: None - ax register: a0, a4, a5 - other: ra, sp - Stack used(bytes): 48 #### read elf ```shell ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: RISC-V Version: 0x1 Entry point address: 0x100dc Start of program headers: 52 (bytes into file) Start of section headers: 6104 (bytes into file) Flags: 0x0 Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 3 Size of section headers: 40 (bytes) Number of section headers: 14 Section header string table index: 13 ``` #### Size ```shell text data bss dec hex filename 1676 1096 61 2833 b11 ./invert_O0.elf ``` ### -O1 #### Disassembly code ```clike= 00010184 <invert>: 10184: 04050063 beqz a0,101c4 <invert+0x40> 10188: ff010113 addi sp,sp,-16 1018c: 00112623 sw ra,12(sp) 10190: 00812423 sw s0,8(sp) 10194: 00050413 mv s0,a0 10198: 00452783 lw a5,4(a0) 1019c: 00852503 lw a0,8(a0) 101a0: 00a42223 sw a0,4(s0) 101a4: 00f42423 sw a5,8(s0) 101a8: fddff0ef jal ra,10184 <invert> 101ac: 00842503 lw a0,8(s0) 101b0: fd5ff0ef jal ra,10184 <invert> 101b4: 00c12083 lw ra,12(sp) 101b8: 00812403 lw s0,8(sp) 101bc: 01010113 addi sp,sp,16 101c0: 00008067 ret 101c4: 00008067 ret ``` #### Observation - LOC(Line of Code): 17 - Register Used: - sx register: s0 - tx register: None - ax register: a0, a5 - other: ra, sp - Stack used(bytes): 16 #### read elf ```shell ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: RISC-V Version: 0x1 Entry point address: 0x100dc Start of program headers: 52 (bytes into file) Start of section headers: 6032 (bytes into file) Flags: 0x0 Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 3 Size of section headers: 40 (bytes) Number of section headers: 14 Section header string table index: 13 ``` #### Size ```shell text data bss dec hex filename 1600 1096 61 2757 ac5 ./invert_O1.elf ``` ### -O2 #### Disassembly code ```clike= 000101f4 <invert>: 101f4: 1a050c63 beqz a0,103ac <invert+0x1b8> 101f8: fd010113 addi sp,sp,-48 101fc: 01512a23 sw s5,20(sp) 10200: 02112623 sw ra,44(sp) 10204: 02812423 sw s0,40(sp) 10208: 02912223 sw s1,36(sp) 1020c: 03212023 sw s2,32(sp) 10210: 01312e23 sw s3,28(sp) 10214: 01412c23 sw s4,24(sp) 10218: 01612823 sw s6,16(sp) 1021c: 01712623 sw s7,12(sp) 10220: 01812423 sw s8,8(sp) 10224: 00050a93 mv s5,a0 10228: 004aa783 lw a5,4(s5) 1022c: 008aab03 lw s6,8(s5) 10230: 00faa423 sw a5,8(s5) 10234: 016aa223 sw s6,4(s5) 10238: 160b0463 beqz s6,103a0 <invert+0x1ac> 1023c: 004b2783 lw a5,4(s6) 10240: 008b2b83 lw s7,8(s6) 10244: 00fb2423 sw a5,8(s6) 10248: 017b2223 sw s7,4(s6) 1024c: 140b8463 beqz s7,10394 <invert+0x1a0> 10250: 004ba783 lw a5,4(s7) 10254: 008bac03 lw s8,8(s7) 10258: 00fba423 sw a5,8(s7) 1025c: 018ba223 sw s8,4(s7) 10260: 120c0463 beqz s8,10388 <invert+0x194> 10264: 004c2783 lw a5,4(s8) 10268: 008c2403 lw s0,8(s8) 1026c: 00fc2423 sw a5,8(s8) 10270: 008c2223 sw s0,4(s8) 10274: 10040463 beqz s0,1037c <invert+0x188> 10278: 00442783 lw a5,4(s0) 1027c: 00842903 lw s2,8(s0) 10280: 00f42423 sw a5,8(s0) 10284: 01242223 sw s2,4(s0) 10288: 0e090463 beqz s2,10370 <invert+0x17c> 1028c: 00492783 lw a5,4(s2) 10290: 00892a03 lw s4,8(s2) 10294: 00f92423 sw a5,8(s2) 10298: 01492223 sw s4,4(s2) 1029c: 060a0263 beqz s4,10300 <invert+0x10c> 102a0: 004a2783 lw a5,4(s4) 102a4: 008a2483 lw s1,8(s4) 102a8: 00fa2423 sw a5,8(s4) 102ac: 009a2223 sw s1,4(s4) 102b0: 04048063 beqz s1,102f0 <invert+0xfc> 102b4: 0044a783 lw a5,4(s1) 102b8: 0084a983 lw s3,8(s1) 102bc: 00f4a423 sw a5,8(s1) 102c0: 0134a223 sw s3,4(s1) 102c4: 0a098063 beqz s3,10364 <invert+0x170> 102c8: 0089a503 lw a0,8(s3) 102cc: 0049a783 lw a5,4(s3) 102d0: 00a9a223 sw a0,4(s3) 102d4: 00f9a423 sw a5,8(s3) 102d8: f1dff0ef jal ra,101f4 <invert> 102dc: 0089a983 lw s3,8(s3) 102e0: fe0994e3 bnez s3,102c8 <invert+0xd4> 102e4: 0084a483 lw s1,8(s1) 102e8: fc0496e3 bnez s1,102b4 <invert+0xc0> 102ec: 008a2783 lw a5,8(s4) 102f0: 00078663 beqz a5,102fc <invert+0x108> 102f4: 00078a13 mv s4,a5 102f8: fa9ff06f j 102a0 <invert+0xac> 102fc: 00892783 lw a5,8(s2) 10300: 00078663 beqz a5,1030c <invert+0x118> 10304: 00078913 mv s2,a5 10308: f85ff06f j 1028c <invert+0x98> 1030c: 00842403 lw s0,8(s0) 10310: f60414e3 bnez s0,10278 <invert+0x84> 10314: 008c2c03 lw s8,8(s8) 10318: f40c16e3 bnez s8,10264 <invert+0x70> 1031c: 008bab83 lw s7,8(s7) 10320: f20b98e3 bnez s7,10250 <invert+0x5c> 10324: 008b2b03 lw s6,8(s6) 10328: f00b1ae3 bnez s6,1023c <invert+0x48> 1032c: 008aaa83 lw s5,8(s5) 10330: ee0a9ce3 bnez s5,10228 <invert+0x34> 10334: 02c12083 lw ra,44(sp) 10338: 02812403 lw s0,40(sp) 1033c: 02412483 lw s1,36(sp) 10340: 02012903 lw s2,32(sp) 10344: 01c12983 lw s3,28(sp) 10348: 01812a03 lw s4,24(sp) 1034c: 01412a83 lw s5,20(sp) 10350: 01012b03 lw s6,16(sp) 10354: 00c12b83 lw s7,12(sp) 10358: 00812c03 lw s8,8(sp) 1035c: 03010113 addi sp,sp,48 10360: 00008067 ret 10364: 00078493 mv s1,a5 10368: f40496e3 bnez s1,102b4 <invert+0xc0> 1036c: f81ff06f j 102ec <invert+0xf8> 10370: 00078413 mv s0,a5 10374: f00412e3 bnez s0,10278 <invert+0x84> 10378: f9dff06f j 10314 <invert+0x120> 1037c: 00078c13 mv s8,a5 10380: ee0c12e3 bnez s8,10264 <invert+0x70> 10384: f99ff06f j 1031c <invert+0x128> 10388: 00078b93 mv s7,a5 1038c: ec0b92e3 bnez s7,10250 <invert+0x5c> 10390: f95ff06f j 10324 <invert+0x130> 10394: 00078b13 mv s6,a5 10398: ea0b12e3 bnez s6,1023c <invert+0x48> 1039c: f91ff06f j 1032c <invert+0x138> 103a0: 00078a93 mv s5,a5 103a4: e80a92e3 bnez s5,10228 <invert+0x34> 103a8: f8dff06f j 10334 <invert+0x140> 103ac: 00008067 ret ``` #### Observation - LOC(Line of Code): 111 - Register Used: - sx register: s0, s1, s2, s3, s4, s5, s6, s7, s8 - tx register: None - ax register: a0, a5 - other: ra, sp, zero - Stack used(bytes): 48 #### read elf ```shell ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: RISC-V Version: 0x1 Entry point address: 0x1014c Start of program headers: 52 (bytes into file) Start of section headers: 6368 (bytes into file) Flags: 0x0 Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 3 Size of section headers: 40 (bytes) Number of section headers: 14 Section header string table index: 13 ``` #### Size ```shell text data bss dec hex filename 1920 1096 61 3077 c05 ./invert_O2.elf ``` ### -O3 #### Disassembly code ```clike= 0001027c <invert>: 1027c: 1a050c63 beqz a0,10434 <invert+0x1b8> 10280: fd010113 addi sp,sp,-48 10284: 01512a23 sw s5,20(sp) 10288: 02112623 sw ra,44(sp) 1028c: 02812423 sw s0,40(sp) 10290: 02912223 sw s1,36(sp) 10294: 03212023 sw s2,32(sp) 10298: 01312e23 sw s3,28(sp) 1029c: 01412c23 sw s4,24(sp) 102a0: 01612823 sw s6,16(sp) 102a4: 01712623 sw s7,12(sp) 102a8: 01812423 sw s8,8(sp) 102ac: 00050a93 mv s5,a0 102b0: 004aa783 lw a5,4(s5) 102b4: 008aab03 lw s6,8(s5) 102b8: 00faa423 sw a5,8(s5) 102bc: 016aa223 sw s6,4(s5) 102c0: 160b0463 beqz s6,10428 <invert+0x1ac> 102c4: 004b2783 lw a5,4(s6) 102c8: 008b2b83 lw s7,8(s6) 102cc: 00fb2423 sw a5,8(s6) 102d0: 017b2223 sw s7,4(s6) 102d4: 140b8463 beqz s7,1041c <invert+0x1a0> 102d8: 004ba783 lw a5,4(s7) 102dc: 008bac03 lw s8,8(s7) 102e0: 00fba423 sw a5,8(s7) 102e4: 018ba223 sw s8,4(s7) 102e8: 120c0463 beqz s8,10410 <invert+0x194> 102ec: 004c2783 lw a5,4(s8) 102f0: 008c2403 lw s0,8(s8) 102f4: 00fc2423 sw a5,8(s8) 102f8: 008c2223 sw s0,4(s8) 102fc: 10040463 beqz s0,10404 <invert+0x188> 10300: 00442783 lw a5,4(s0) 10304: 00842903 lw s2,8(s0) 10308: 00f42423 sw a5,8(s0) 1030c: 01242223 sw s2,4(s0) 10310: 0e090463 beqz s2,103f8 <invert+0x17c> 10314: 00492783 lw a5,4(s2) 10318: 00892a03 lw s4,8(s2) 1031c: 00f92423 sw a5,8(s2) 10320: 01492223 sw s4,4(s2) 10324: 060a0263 beqz s4,10388 <invert+0x10c> 10328: 004a2783 lw a5,4(s4) 1032c: 008a2483 lw s1,8(s4) 10330: 00fa2423 sw a5,8(s4) 10334: 009a2223 sw s1,4(s4) 10338: 04048063 beqz s1,10378 <invert+0xfc> 1033c: 0044a783 lw a5,4(s1) 10340: 0084a983 lw s3,8(s1) 10344: 00f4a423 sw a5,8(s1) 10348: 0134a223 sw s3,4(s1) 1034c: 0a098063 beqz s3,103ec <invert+0x170> 10350: 0089a503 lw a0,8(s3) 10354: 0049a783 lw a5,4(s3) 10358: 00a9a223 sw a0,4(s3) 1035c: 00f9a423 sw a5,8(s3) 10360: f1dff0ef jal ra,1027c <invert> 10364: 0089a983 lw s3,8(s3) 10368: fe0994e3 bnez s3,10350 <invert+0xd4> 1036c: 0084a483 lw s1,8(s1) 10370: fc0496e3 bnez s1,1033c <invert+0xc0> 10374: 008a2783 lw a5,8(s4) 10378: 00078663 beqz a5,10384 <invert+0x108> 1037c: 00078a13 mv s4,a5 10380: fa9ff06f j 10328 <invert+0xac> 10384: 00892783 lw a5,8(s2) 10388: 00078663 beqz a5,10394 <invert+0x118> 1038c: 00078913 mv s2,a5 10390: f85ff06f j 10314 <invert+0x98> 10394: 00842403 lw s0,8(s0) 10398: f60414e3 bnez s0,10300 <invert+0x84> 1039c: 008c2c03 lw s8,8(s8) 103a0: f40c16e3 bnez s8,102ec <invert+0x70> 103a4: 008bab83 lw s7,8(s7) 103a8: f20b98e3 bnez s7,102d8 <invert+0x5c> 103ac: 008b2b03 lw s6,8(s6) 103b0: f00b1ae3 bnez s6,102c4 <invert+0x48> 103b4: 008aaa83 lw s5,8(s5) 103b8: ee0a9ce3 bnez s5,102b0 <invert+0x34> 103bc: 02c12083 lw ra,44(sp) 103c0: 02812403 lw s0,40(sp) 103c4: 02412483 lw s1,36(sp) 103c8: 02012903 lw s2,32(sp) 103cc: 01c12983 lw s3,28(sp) 103d0: 01812a03 lw s4,24(sp) 103d4: 01412a83 lw s5,20(sp) 103d8: 01012b03 lw s6,16(sp) 103dc: 00c12b83 lw s7,12(sp) 103e0: 00812c03 lw s8,8(sp) 103e4: 03010113 addi sp,sp,48 103e8: 00008067 ret 103ec: 00078493 mv s1,a5 103f0: f40496e3 bnez s1,1033c <invert+0xc0> 103f4: f81ff06f j 10374 <invert+0xf8> 103f8: 00078413 mv s0,a5 103fc: f00412e3 bnez s0,10300 <invert+0x84> 10400: f9dff06f j 1039c <invert+0x120> 10404: 00078c13 mv s8,a5 10408: ee0c12e3 bnez s8,102ec <invert+0x70> 1040c: f99ff06f j 103a4 <invert+0x128> 10410: 00078b93 mv s7,a5 10414: ec0b92e3 bnez s7,102d8 <invert+0x5c> 10418: f95ff06f j 103ac <invert+0x130> 1041c: 00078b13 mv s6,a5 10420: ea0b12e3 bnez s6,102c4 <invert+0x48> 10424: f91ff06f j 103b4 <invert+0x138> 10428: 00078a93 mv s5,a5 1042c: e80a92e3 bnez s5,102b0 <invert+0x34> 10430: f8dff06f j 103bc <invert+0x140> 10434: 00008067 ret ``` #### Observation - LOC(Line of Code): 111 - Register Used: - sx register: s0, s1, s2, s3, s4, s5, s6, s7, s8 - tx register: None - ax register: a0, a5 - other: ra, sp, zero - Stack used(bytes): 48 #### read elf ```shell ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: RISC-V Version: 0x1 Entry point address: 0x101d4 Start of program headers: 52 (bytes into file) Start of section headers: 6504 (bytes into file) Flags: 0x0 Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 3 Size of section headers: 40 (bytes) Number of section headers: 14 Section header string table index: 13 ``` #### Size ```shell text data bss dec hex filename 2056 1096 61 3213 c8d ./invert_O3.elf ``` ### -Ofast #### Disassembly code ```clike= 0001027c <invert>: 1027c: 1a050c63 beqz a0,10434 <invert+0x1b8> 10280: fd010113 addi sp,sp,-48 10284: 01512a23 sw s5,20(sp) 10288: 02112623 sw ra,44(sp) 1028c: 02812423 sw s0,40(sp) 10290: 02912223 sw s1,36(sp) 10294: 03212023 sw s2,32(sp) 10298: 01312e23 sw s3,28(sp) 1029c: 01412c23 sw s4,24(sp) 102a0: 01612823 sw s6,16(sp) 102a4: 01712623 sw s7,12(sp) 102a8: 01812423 sw s8,8(sp) 102ac: 00050a93 mv s5,a0 102b0: 004aa783 lw a5,4(s5) 102b4: 008aab03 lw s6,8(s5) 102b8: 00faa423 sw a5,8(s5) 102bc: 016aa223 sw s6,4(s5) 102c0: 160b0463 beqz s6,10428 <invert+0x1ac> 102c4: 004b2783 lw a5,4(s6) 102c8: 008b2b83 lw s7,8(s6) 102cc: 00fb2423 sw a5,8(s6) 102d0: 017b2223 sw s7,4(s6) 102d4: 140b8463 beqz s7,1041c <invert+0x1a0> 102d8: 004ba783 lw a5,4(s7) 102dc: 008bac03 lw s8,8(s7) 102e0: 00fba423 sw a5,8(s7) 102e4: 018ba223 sw s8,4(s7) 102e8: 120c0463 beqz s8,10410 <invert+0x194> 102ec: 004c2783 lw a5,4(s8) 102f0: 008c2403 lw s0,8(s8) 102f4: 00fc2423 sw a5,8(s8) 102f8: 008c2223 sw s0,4(s8) 102fc: 10040463 beqz s0,10404 <invert+0x188> 10300: 00442783 lw a5,4(s0) 10304: 00842903 lw s2,8(s0) 10308: 00f42423 sw a5,8(s0) 1030c: 01242223 sw s2,4(s0) 10310: 0e090463 beqz s2,103f8 <invert+0x17c> 10314: 00492783 lw a5,4(s2) 10318: 00892a03 lw s4,8(s2) 1031c: 00f92423 sw a5,8(s2) 10320: 01492223 sw s4,4(s2) 10324: 060a0263 beqz s4,10388 <invert+0x10c> 10328: 004a2783 lw a5,4(s4) 1032c: 008a2483 lw s1,8(s4) 10330: 00fa2423 sw a5,8(s4) 10334: 009a2223 sw s1,4(s4) 10338: 04048063 beqz s1,10378 <invert+0xfc> 1033c: 0044a783 lw a5,4(s1) 10340: 0084a983 lw s3,8(s1) 10344: 00f4a423 sw a5,8(s1) 10348: 0134a223 sw s3,4(s1) 1034c: 0a098063 beqz s3,103ec <invert+0x170> 10350: 0089a503 lw a0,8(s3) 10354: 0049a783 lw a5,4(s3) 10358: 00a9a223 sw a0,4(s3) 1035c: 00f9a423 sw a5,8(s3) 10360: f1dff0ef jal ra,1027c <invert> 10364: 0089a983 lw s3,8(s3) 10368: fe0994e3 bnez s3,10350 <invert+0xd4> 1036c: 0084a483 lw s1,8(s1) 10370: fc0496e3 bnez s1,1033c <invert+0xc0> 10374: 008a2783 lw a5,8(s4) 10378: 00078663 beqz a5,10384 <invert+0x108> 1037c: 00078a13 mv s4,a5 10380: fa9ff06f j 10328 <invert+0xac> 10384: 00892783 lw a5,8(s2) 10388: 00078663 beqz a5,10394 <invert+0x118> 1038c: 00078913 mv s2,a5 10390: f85ff06f j 10314 <invert+0x98> 10394: 00842403 lw s0,8(s0) 10398: f60414e3 bnez s0,10300 <invert+0x84> 1039c: 008c2c03 lw s8,8(s8) 103a0: f40c16e3 bnez s8,102ec <invert+0x70> 103a4: 008bab83 lw s7,8(s7) 103a8: f20b98e3 bnez s7,102d8 <invert+0x5c> 103ac: 008b2b03 lw s6,8(s6) 103b0: f00b1ae3 bnez s6,102c4 <invert+0x48> 103b4: 008aaa83 lw s5,8(s5) 103b8: ee0a9ce3 bnez s5,102b0 <invert+0x34> 103bc: 02c12083 lw ra,44(sp) 103c0: 02812403 lw s0,40(sp) 103c4: 02412483 lw s1,36(sp) 103c8: 02012903 lw s2,32(sp) 103cc: 01c12983 lw s3,28(sp) 103d0: 01812a03 lw s4,24(sp) 103d4: 01412a83 lw s5,20(sp) 103d8: 01012b03 lw s6,16(sp) 103dc: 00c12b83 lw s7,12(sp) 103e0: 00812c03 lw s8,8(sp) 103e4: 03010113 addi sp,sp,48 103e8: 00008067 ret 103ec: 00078493 mv s1,a5 103f0: f40496e3 bnez s1,1033c <invert+0xc0> 103f4: f81ff06f j 10374 <invert+0xf8> 103f8: 00078413 mv s0,a5 103fc: f00412e3 bnez s0,10300 <invert+0x84> 10400: f9dff06f j 1039c <invert+0x120> 10404: 00078c13 mv s8,a5 10408: ee0c12e3 bnez s8,102ec <invert+0x70> 1040c: f99ff06f j 103a4 <invert+0x128> 10410: 00078b93 mv s7,a5 10414: ec0b92e3 bnez s7,102d8 <invert+0x5c> 10418: f95ff06f j 103ac <invert+0x130> 1041c: 00078b13 mv s6,a5 10420: ea0b12e3 bnez s6,102c4 <invert+0x48> 10424: f91ff06f j 103b4 <invert+0x138> 10428: 00078a93 mv s5,a5 1042c: e80a92e3 bnez s5,102b0 <invert+0x34> 10430: f8dff06f j 103bc <invert+0x140> 10434: 00008067 ret ``` #### Observation - LOC(Line of Code): 111 - Register Used: - sx register: s0, s1, s2, s3, s4, s5, s6, s7, s8 - tx register: None - ax register: a0, a5 - other: ra, sp, zero - Stack used(bytes): 48 #### read elf ```shell ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: RISC-V Version: 0x1 Entry point address: 0x101d4 Start of program headers: 52 (bytes into file) Start of section headers: 6504 (bytes into file) Flags: 0x0 Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 3 Size of section headers: 40 (bytes) Number of section headers: 14 Section header string table index: 13 ``` #### Size ```shell text data bss dec hex filename 2056 1096 61 3213 c8d ./invert_Ofast.elf ``` ### Summary | | -O0 | -O1 | -O2 | -O3 | -Ofast | | -------- | -------- | -------- | -------- | -------- | -------- | | Line of Code | 31 | 17 | 111 | 111 | 111 | | Registeer used | 6 | 5 | 14 | 14 | 14 | | Stack used (bytes) | 48 | 16 | 48 | 48 | 48 | | CSR cycle count | 516 | 317 | 277 | 314 | 310 |