---
# System prepended metadata

title: Lab5_CS22B047

---

# Lab 5
Name:    Tilak Reddy
Roll No.: CS22B047    

---
## Question 1
_without loop unrolling (IPC=0.701)_
```assembly=
.data 
    array: .word 0,0,0,0,0,0,0,0,0,0,0,0
    s: .word 3
.text
    la x4 array    #array address
    lw x5 s     #x5 = s
    li x6 11 #x6  = i
    loop: 
        slli x7 x6 2    
        add x7 x4 x7    
        lw x8 0(x7)     #x8 = s[i]
        add x8 x8 x5    #x8 = x8 + 3
        sw x8 0(x7)    #s[i] = s[i] + 3
        addi x6 x6 -1    #i = i-1 
        bge x6 x0 loop

#IPC  = 0.701
```
_with loop unrolling (IPC=0.726)_
```assembly=
.data 
    array: .word 0,0,0,0,0,0,0,0,0,0,0,0
    s: .word 3
.text
    la x4 array    #array address
    lw x5 s     #x5 = s
    li x6 11 #x6  = i
    loop: 
        slli x7 x6 2    
        add x7 x4 x7    
        lw x8 0(x7)     #x8 = s[i]
        add x8 x8 x5    #x8 = x8 + 3
        sw x8 0(x7)    #s[i] = s[i] + 3

        lw x8 -4(x7)     #x8 = s[i]
        add x8 x8 x5    #x8 = x8 + 3
        sw x8 -4(x7)    #s[i] = s[i] + 3
           
        lw x8 -8(x7)     #x8 = s[i]
        add x8 x8 x5    #x8 = x8 + 3
        sw x8 -8(x7)    #s[i] = s[i] + 3

        lw x8 -12(x7)     #x8 = s[i]
        add x8 x8 x5    #x8 = x8 + 3
        sw x8 -12(x7)    #s[i] = s[i] + 3
        addi x6 x6 -4    #i = i-1 
        
        bge x6 x0 loop
        
#ipc = 0.726
```

---
## Question 2
_In the context of assembly language, a linked list refers to a data structure where each element in the list contains a value and address to the next element in the sequence. In RISC-V assembly, this can be implemented by using la and sw instructions link nodes together._
```assembly=
.data
    node1: .word 1,0
    node2: .word 2,0
    node3: .word 3,0
    node4: .word 4,0
    node5: .word 5,0
    node6: .word 6,0
    node7: .word 7,0
    node8: .word 8,0
    node9: .word 9,0
    node10: .word 10,0

.text
    #initializing linked list
    la t0 node1
    la t1 node2
    sw t1 4(t0)
    la t0 node2
    la t1 node3
    sw t1 4(t0)
    la t0 node3
    la t1 node4
    sw t1 4(t0)
    la t0 node4
    la t1 node5
    sw t1 4(t0)
    la t0 node5
    la t1 node6
    sw t1 4(t0)
    la t0 node6
    la t1 node7
    sw t1 4(t0)
    la t0 node7
    la t1 node8
    sw t1 4(t0)
    la t0 node8
    la t1 node9
    sw t1 4(t0)
    la t0 node9
    la t1 node10
    sw t1 4(t0)
    
    #reversing linked llist
    la t0 node1    #current
    lw t3 4(t0)    # next
    la t2 node1    #prev
    li t1 9
    rev_loop:
        lw t3 4(t0) #next = current->next
        sw t2 4(t0) #current->next = prev
        mv t2 t0    #prev = current
        mv t0 t3    #current = next
        addi t1 t1 -1
        bge t1 x0 rev_loop
  
```


---
## Question 3

_Linked list initialization using new_node function_
```assembly=
.data
    node: .word 0,0
.text
    la t0 node
    li t1 0 #iterator
    li t2 1 #new node will have t2 as data
    jal x1 new_node
    li t2 2
    jal x1 new_node
    li t2 3
    jal x1 new_node 
    li t2 4
    jal x1 new_node
    li t2 5
    jal x1 new_node
    li t2 6
    jal x1 new_node  
    li t2 7
    jal x1 new_node  
    li t2 8
    jal x1 new_node  
    li t2 9
    jal x1 new_node 
    li t2 10
    jal x1 new_node  
    #exit
    li a7 10
    ecall
    
    new_node:
        slli t3 t1 2
        add t3 t3 t0
        sw t2 0(t3)    #new_node->data = t2
        addi t4 t3 8 #t4 = address of next node
        sw t4 4(t3)     #new_node->next = t4
        addi t1 t1 2    #incrementing iterator
        jr ra
```

---