# Computer Organization Lab 6 Name: T.Venkat Kaushal Roll Number: CS22B058 --- ## Question 4 ```c= #include <stdio.h> int main() { // Initialize an array with 100 elements int arr[100]; // Fill the array with values from 1 to 100 for (int i = 0; i < 100; i++) { arr[i] = i + 1; } // Calculate the sum of all elements in the array int sum = 0; for (int i = 0; i < 100; i++) { sum += arr[i]; } // Return the sum (for completeness, although not required by the specifications) return sum; } ``` ## Question 13 To optimize the code we have unrolled the loop ```c= #include <stdio.h> #include <stdlib.h> #define SIZE 100 int main() { int arr[SIZE]; int sum = 0; int i; for (i = 0; i < SIZE; i++) { arr[i] = rand() % 100 + 1; } // assuming Size is multiple of 4 for (i = 0; i < SIZE - 4; i += 5) { sum += arr[i] + arr[i + 1] + arr[i + 2] + arr[i + 3] + arr[i + 4]; } return sum; } ``` ## Question 16 Older code ```assembly= .data .word 1, 3, 4, 2, 4 str1: .string "true" str2: .string "false" .text #initialized address addi x1 x0 0 lui x1 0x10000 addi x1 x1 0x000 #size: x2 addi x2 x0 5 #count: x3 addi x3 x0 0 #i : x4 addi x4 x4 0 for_loop_1: bge x4 x2 end_loop_1 # condition for loop lw x5 0(x1) #load word if_1: andi x6 x5 1 # x6 contains 0 or 1 addi x7 x0 1 # x7 = 1 bne x6 x7 end_if_1 # condition x6 == 1 addi x3 x3 1 # count++ if_2: addi x8 x0 3 bne x3 x8 end_if_2 addi x9 x0 1 addi x4 x4 1 addi x1 x1 4 j end_loop_1 end_if_1: addi x3 x0 0 # count = 0 j if_2 end_if_2: addi x9 x0 0 addi x4 x4 1 addi x1 x1 4 j for_loop_1 end_loop_1: add x0 x0 x0 beq x9 x7 print_true la a0 str2 li a7 4 ecall li a7 10 ecall print_true: la a0 str1 li a7 4 ecall li a7 10 ecall ``` New Code ```assembly= .data .word 1, 3, 5, 2, 4 str1: .string "true\n" str2: .string "false\n" .text .globl main main: lui x1, 0x10000 addi x2, x0, 5 addi x3, x0, 0 addi x4, x0, 0 li x7, 1 for_loop_1: bge x4, x2, end_loop_1 lw x5, 0(x1) andi x6, x5, 1 bne x6, x0, if_1 j if_2 if_1: addi x3, x3, 1 if_2: addi x4, x4, 1 addi x1, x1, 4 j for_loop_1 end_loop_1: beq x3, x7, print_true la a0, str2 li a7, 4 ecall li a7, 10 ecall print_true: la a0, str1 li a7, 4 ecall li a7, 10 ecall ``` Optimizations: 1. Removed redundant and unnecessary instructions, such as initializing x1 twice. 2. Simplified the loop structure and eliminated unnecessary labels and jumps 3. Improved register usage and reduced the number of instructions for better efficiency ## Question 15 Old test.c file before Optimizing | Optimization Level | Assembly File Size (Approximate)| Comments | | -------- | -------- | -------- | | O0 (No Optimization) | 131 KB | Contains more redundant code, less optimized | | O1 (Optimization Level 1) | 131KB |Basic optimizations, reduces code size and improves performance slightly | | O2 (Optimization Level 2) | 131KB | More aggressive optimizations, further reduces code size and improves performance | | O3 (Optimization Level 3) | 131KB | Highest level of optimization, significant reduction in code size and noticeable performance improvements | | Os (Optimize for Size) | 131KB |Focuses on reducing code size, may sacrifice some performance optimizations | | Ofast | 133KB | Enables aggressive optimizations, may not adhere strictly to standard compliance, potentially smaller code size |