# Lab 5 Name: Bilwani K Roll no.: CS22B013 --- ## Question 1 **Code after enrolling the Loop by factor four** ```assembly= .data .word 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0x10 0x11 0x12 base: .word 0x10000000 .text addi x10,x0 3 addi x11,x0 10 lw x12, base loop: lw x17, 0(x12) add x17, x17, x10 sw x17, 0(x12) lw x17, 4(x12) add x17, x17, x10 sw x17, 4(x12) lw x17, 8(x12) add x17, x17, x10 sw x17, 8(x12) lw x17, 12(x12) add x17, x17, x10 sw x17, 12(x12) addi x12, x12, 16 addi x11, x11, -16 bge x11, x16, loop ``` IPC before the optimisation is - 0.661 IPC after the optimisation is - 0.731 It increased because for each iteration of original lopp or before unrolling it has one instructions of lw, add, sw, bge. but for the unrolled loop that is after it has 4 lw, add, sw, bge. This reduces the number of loop control instructions and loop overhead, allowing the CPU to execute more instructions in parallel and leading to higher IPC. ## Question 2 In the context of RISC-V assembly language, the term "linked list" refers to a data structure implemented using memory pointers in the RISC-V architecture. A linked list consists of a sequence of nodes, where each node contains both data and a reference (or pointer) to the next node in the sequence. In RISC-V assembly language, implementing a linked list typically involves manipulating memory addresses and using load and store instructions to access data elements within the nodes. This includes allocating memory for new nodes, updating pointers to maintain the list structure, traversing the list, and performing various operations such as insertion, deletion, and searching. **Initialize a linked list with 10 elements, and reverse the Linked list** ```assembly= .data node1: .word 1, 0 # value, pointer to next node 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 # Link the nodes la x10, node1 la x11, node2 la x12, node3 la x13, node4 la x14, node5 la x15, node6 la x16, node7 la x17, node8 la x18, node9 la x19, node10 sw x11, 4(t0) sw x12, 4(t1) sw x13, 4(t2) sw x14, 4(t3) sw x15, 4(t4) sw x16, 4(t5) sw x17, 4(t6) sw x18, 4(t7) sw x19, 4(t8) sw x0, 4(t9) # Link node10 to NULL (0) # Reverse the linked list la x10, node1 li x11, 0 la x12, node1 reverse_loop: lw x13, 4(x12) sw x11, 4(x12) mv x11, x12 mv x12, x13 bnez x12, reverse_loop la x10, node1 sw x11, 4(x10) ``` ## Question 3 ```assembly= .data node1: .word 1, 0 node2: .word 2, 0 node3: .word 3, 0 new_node: .word 0, 0 .text allocate_node: la x10, new_node lw x11, 0(x10) lw x12, 4(x10) li x13, 8 li a0, 9 li a1, 0 li a2, 0 ecall li x14, -1 bne a0, x14, allocate_successful allocate_successful: sw a0, 0(x10) sw zero, 4(x10) jr ra exit_program: li a0, 0 li a7, 93 ecall .text main: la x10, node1 la x11, node2 la x12, node3 sw x11, 4(x10) sw x12, 4(x11) sw zero, 4(x12) jal allocate_node j exit_program ```