---
# System prepended metadata

title: Assignment 2-2 Toolchain
tags: [Computer Architecture]

---


# Assignment 2-2 Toolchain
###### tags: `Computer Architecture`
contributed by <`joe-U16`>

## Power function

program contributed  by [<王傑世>](https://hackmd.io/@vvang/ryyDGoarw)

## (1) Rewrite into C implementations

Array： `2, 3, 7, 4, 1`
We sort the array from large to small with [Bubble sort](https://en.wikipedia.org/wiki/Bubble_sort). 
Then, we can get the array `7, 4, 3, 2, 1`.

```
void BBSort(int *arr, int size)
{
    for (int i = 0; i < size; ++i)
        for (int j = 0; j < size - i; ++j)
            if (arr[j] < arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
}

void _start()
{
    volatile char *tx = (volatile char *) 0x40002000;
    int arr[] = {2, 3, 7, 4, 1};
    int size = 5;
    BBSort(arr, size - 1);

    for (int i = 0; i < size; ++i) {

        *tx = (char) (arr[i] + '0');
    }
}
```

**After rewrite, we can see the result with both optimization flags.**

Optimization flags = `-O1`(optimized for size)

```
➜  rv32emu git:(master) ✗ ./emu-rv32i BubbleSort1
74321
>>> Execution time: 34275 ns
>>> Instruction count: 146 (IPS=4259664)
>>> Jumps: 27 (18.49%) - 7 forwards, 20 backwards
>>> Branching T=18 (52.94%) F=16 (47.06%)
```


optimization flags = `-O3`(optimized for speed)
```
➜  rv32emu git:(master) ✗ ./emu-rv32i BubbleSort
74321
>>> Execution time: 26537 ns
>>> Instruction count: 74 (IPS=2788559)
>>> Jumps: 4 (5.41%) - 3 forwards, 1 backwards
>>> Branching T=3 (30.00%) F=7 (70.00%)
```

**The execution time has the gap between flags `-O1` and `-O3`**

`-O3` has about half Intruction count and less Jumps.

## (2) Disassemble the ELF files generated by C compiler
- [ ] [objdump](http://man7.org/linux/man-pages/man1/objdump.1.html)
> `-d`:Display the assembler mnemonics for the machine instructions

Optimization flags = `-O1`(optimized for size)

```
➜  rv32emu git:(master) ✗ riscv-none-embed-objdump -d BubbleSort1

BubbleSort1:     file format elf32-littleriscv


Disassembly of section .text:

00010054 <BBSort>:
   10054:       04b05863                blez    a1,100a4 <BBSort+0x50>
   10058:       00058813                mv      a6,a1
   1005c:       00050893                mv      a7,a0
   10060:       00259613                slli    a2,a1,0x2
   10064:       00c50633                add     a2,a0,a2
   10068:       0300006f                j       10098 <BBSort+0x44>
   1006c:       00478793                addi    a5,a5,4
   10070:       00c78e63                beq     a5,a2,1008c <BBSort+0x38>
   10074:       0007a703                lw      a4,0(a5)
   10078:       0047a683                lw      a3,4(a5)
   1007c:       fed758e3                bge     a4,a3,1006c <BBSort+0x18>
   10080:       00d7a023                sw      a3,0(a5)
   10084:       00e7a223                sw      a4,4(a5)
   10088:       fe5ff06f                j       1006c <BBSort+0x18>
   1008c:       fff80813                addi    a6,a6,-1
   10090:       ffc60613                addi    a2,a2,-4
   10094:       00080863                beqz    a6,100a4 <BBSort+0x50>
   10098:       00088793                mv      a5,a7
   1009c:       fd004ce3                bgtz    a6,10074 <BBSort+0x20>
   100a0:       fedff06f                j       1008c <BBSort+0x38>
   100a4:       00008067                ret

000100a8 <_start>:
   100a8:       fd010113                addi    sp,sp,-48
   100ac:       02112623                sw      ra,44(sp)
   100b0:       000107b7                lui     a5,0x10
   100b4:       11c78793                addi    a5,a5,284 # 1011c <_start+0x74>
   100b8:       0007a583                lw      a1,0(a5)
   100bc:       0047a603                lw      a2,4(a5)
   100c0:       0087a683                lw      a3,8(a5)
   100c4:       00c7a703                lw      a4,12(a5)
   100c8:       0107a783                lw      a5,16(a5)
   100cc:       00b12623                sw      a1,12(sp)
   100d0:       00c12823                sw      a2,16(sp)
   100d4:       00d12a23                sw      a3,20(sp)
   100d8:       00e12c23                sw      a4,24(sp)
   100dc:       00f12e23                sw      a5,28(sp)
   100e0:       00400593                li      a1,4
   100e4:       00c10513                addi    a0,sp,12
   100e8:       f6dff0ef                jal     ra,10054 <BBSort>
   100ec:       00c10713                addi    a4,sp,12
   100f0:       02010613                addi    a2,sp,32
   100f4:       400026b7                lui     a3,0x40002
   100f8:       00072783                lw      a5,0(a4)
   100fc:       03078793                addi    a5,a5,48
   10100:       0ff7f793                andi    a5,a5,255
   10104:       00f68023                sb      a5,0(a3) # 40002000 <__global_pointer$+0x3fff06d0>
   10108:       00470713                addi    a4,a4,4
   1010c:       fec716e3                bne     a4,a2,100f8 <_start+0x50>
   10110:       02c12083                lw      ra,44(sp)
   10114:       03010113                addi    sp,sp,48
   10118:       00008067                ret
```



Optimization flags = `-O3`(optimized for speed)

```
➜  rv32emu git:(master) ✗ riscv-none-embed-objdump -d BubbleSort3

BubbleSort3:     file format elf32-littleriscv


Disassembly of section .text:

00010054 <BBSort>:
   10054:       02b05a63                blez    a1,10088 <BBSort+0x34>
   10058:       00259613                slli    a2,a1,0x2
   1005c:       00c50633                add     a2,a0,a2
   10060:       00050793                mv      a5,a0
   10064:       0007a703                lw      a4,0(a5)
   10068:       0047a683                lw      a3,4(a5)
   1006c:       00d75663                bge     a4,a3,10078 <BBSort+0x24>
   10070:       00d7a023                sw      a3,0(a5)
   10074:       00e7a223                sw      a4,4(a5)
   10078:       00478793                addi    a5,a5,4
   1007c:       fec794e3                bne     a5,a2,10064 <BBSort+0x10>
   10080:       ffc60613                addi    a2,a2,-4
   10084:       fcc51ee3                bne     a0,a2,10060 <BBSort+0xc>
   10088:       00008067                ret

0001008c <_start>:
   1008c:       000107b7                lui     a5,0x10
   10090:       1f878793                addi    a5,a5,504 # 101f8 <_start+0x16c>
   10094:       0007a703                lw      a4,0(a5)
   10098:       0047a683                lw      a3,4(a5)
   1009c:       0087a583                lw      a1,8(a5)
   100a0:       00c7a603                lw      a2,12(a5)
   100a4:       0107a783                lw      a5,16(a5)
   100a8:       fe010113                addi    sp,sp,-32
   100ac:       00e12623                sw      a4,12(sp)
   100b0:       00d12823                sw      a3,16(sp)
   100b4:       00b12a23                sw      a1,20(sp)
   100b8:       00c12c23                sw      a2,24(sp)
   100bc:       00f12e23                sw      a5,28(sp)
   100c0:       00d75663                bge     a4,a3,100cc <_start+0x40>
   100c4:       00d12623                sw      a3,12(sp)
   100c8:       00e12823                sw      a4,16(sp)
   100cc:       01012783                lw      a5,16(sp)
   100d0:       01412703                lw      a4,20(sp)
   100d4:       00e7dc63                bge     a5,a4,100ec <_start+0x60>
   100d8:       00078693                mv      a3,a5
   100dc:       00e12823                sw      a4,16(sp)
   100e0:       00f12a23                sw      a5,20(sp)
   100e4:       00070793                mv      a5,a4
   100e8:       00068713                mv      a4,a3
   100ec:       01812603                lw      a2,24(sp)
   100f0:       00c75c63                bge     a4,a2,10108 <_start+0x7c>
   100f4:       00070693                mv      a3,a4
   100f8:       00c12a23                sw      a2,20(sp)
   100fc:       00e12c23                sw      a4,24(sp)
   10100:       00060713                mv      a4,a2
   10104:       00068613                mv      a2,a3
   10108:       01c12683                lw      a3,28(sp)
   1010c:       0cd64e63                blt     a2,a3,101e8 <_start+0x15c>
   10110:       00c12683                lw      a3,12(sp)
   10114:       00f6dc63                bge     a3,a5,1012c <_start+0xa0>
   10118:       00078593                mv      a1,a5
   1011c:       00f12623                sw      a5,12(sp)
   10120:       00d12823                sw      a3,16(sp)
   10124:       00068793                mv      a5,a3
   10128:       00058693                mv      a3,a1
   1012c:       00e7dc63                bge     a5,a4,10144 <_start+0xb8>
   10130:       00078593                mv      a1,a5
   10134:       00e12823                sw      a4,16(sp)
   10138:       00f12a23                sw      a5,20(sp)
   1013c:       00070793                mv      a5,a4
   10140:       00058713                mv      a4,a1
   10144:       08c74a63                blt     a4,a2,101d8 <_start+0x14c>
   10148:       00f6dc63                bge     a3,a5,10160 <_start+0xd4>
   1014c:       00078613                mv      a2,a5
   10150:       00f12623                sw      a5,12(sp)
   10154:       00d12823                sw      a3,16(sp)
   10158:       00068793                mv      a5,a3
   1015c:       00060693                mv      a3,a2
   10160:       00e7d863                bge     a5,a4,10170 <_start+0xe4>
   10164:       00f12a23                sw      a5,20(sp)
   10168:       00e12823                sw      a4,16(sp)
   1016c:       00070793                mv      a5,a4
   10170:       00f6d663                bge     a3,a5,1017c <_start+0xf0>
   10174:       00f12623                sw      a5,12(sp)
   10178:       00d12823                sw      a3,16(sp)
   1017c:       00c12703                lw      a4,12(sp)
   10180:       400027b7                lui     a5,0x40002
   10184:       03070713                addi    a4,a4,48
   10188:       0ff77713                andi    a4,a4,255
   1018c:       00e78023                sb      a4,0(a5) # 40002000 <__global_pointer$+0x3fff05f4>
   10190:       01012703                lw      a4,16(sp)
   10194:       03070713                addi    a4,a4,48
   10198:       0ff77713                andi    a4,a4,255
   1019c:       00e78023                sb      a4,0(a5)
   101a0:       01412703                lw      a4,20(sp)
   101a4:       03070713                addi    a4,a4,48
   101a8:       0ff77713                andi    a4,a4,255
   101ac:       00e78023                sb      a4,0(a5)
   101b0:       01812703                lw      a4,24(sp)
   101b4:       03070713                addi    a4,a4,48
   101b8:       0ff77713                andi    a4,a4,255
   101bc:       00e78023                sb      a4,0(a5)
   101c0:       01c12703                lw      a4,28(sp)
   101c4:       03070713                addi    a4,a4,48
   101c8:       0ff77713                andi    a4,a4,255
   101cc:       00e78023                sb      a4,0(a5)
   101d0:       02010113                addi    sp,sp,32
   101d4:       00008067                ret
   101d8:       00e12c23                sw      a4,24(sp)
   101dc:       00c12a23                sw      a2,20(sp)
   101e0:       00060713                mv      a4,a2
   101e4:       f65ff06f                j       10148 <_start+0xbc>
   101e8:       00c12e23                sw      a2,28(sp)
   101ec:       00d12c23                sw      a3,24(sp)
   101f0:       00068613                mv      a2,a3
   101f4:       f1dff06f                j       10110 <_start+0x84>
```



- [ ] [readelf](http://man7.org/linux/man-pages/man1/readelf.1.html)

> `-h`:Display the ELF file header

Optimization flags = `-O1`(optimized for size)


```
➜  rv32emu git:(master) ✗ riscv-none-embed-readelf -h BubbleSort1 
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:               0x100a8
  Start of program headers:          52 (bytes into file)
  Start of section headers:          736 (bytes into file)
  Flags:                             0x0
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         1
  Size of section headers:           40 (bytes)
  Number of section headers:         7
  Section header string table index: 6
```

Optimization flags = `-O3`(optimized for speed)

```
➜  rv32emu git:(master) ✗ riscv-none-embed-readelf -h BubbleSort3 
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:               0x1008c
  Start of program headers:          52 (bytes into file)
  Start of section headers:          956 (bytes into file)
  Flags:                             0x0
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         1
  Size of section headers:           40 (bytes)
  Number of section headers:         7
  Section header string table index: 6
```

- [ ] [size](http://man7.org/linux/man-pages/man1/size.1.html)
>list the section sizes—and the total size—for each of the object or archive files objfile in its argument list.

`➜ riscv-none-embed-size`

flags = `-O1`
```
➜  rv32emu git:(master) ✗ riscv-none-embed-size BubbleSort1 
   text    data     bss     dec     hex filename
    220       0       0     220      dc BubbleSort1
```

flags = `-O3`
```
➜  rv32emu git:(master) ✗ riscv-none-embed-size BubbleSort3 
   text    data     bss     dec     hex filename
    440       0       0     440     1b8 BubbleSort3
```
