---
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 |