1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298
| # ======================================== # RV32I Complete Test Suite (No Pseudo Instructions) # Testing all RV32I instructions without misaligned access # ========================================
.text .globl _start
_start: # ======================================== # 1. Test ADDI - Add Immediate # ======================================== addi x1, x0, 100 # x1 = 0 + 100 = 100 (0x64) addi x2, x0, 200 # x2 = 0 + 200 = 200 (0xC8) addi x3, x1, 50 # x3 = 100 + 50 = 150 (0x96) addi x4, x0, -10 # x4 = 0 + (-10) = -10 (0xFFFFFFF6)
# ======================================== # 2. Test ADD - Add Register # ======================================== add x5, x1, x2 # x5 = 100 + 200 = 300 (0x12C) add x6, x3, x4 # x6 = 150 + (-10) = 140 (0x8C)
# ======================================== # 3. Test SUB - Subtract # ======================================== sub x7, x2, x1 # x7 = 200 - 100 = 100 (0x64) sub x8, x1, x2 # x8 = 100 - 200 = -100 (0xFFFFFF9C)
# ======================================== # 4. Test SLTI - Set Less Than Immediate (Signed) # ======================================== slti x9, x1, 101 # x9 = (100 < 101) = 1 slti x10, x1, 99 # x10 = (100 < 99) = 0 slti x11, x4, 0 # x11 = (-10 < 0) = 1
# ======================================== # 5. Test SLTIU - Set Less Than Immediate (Unsigned) # ======================================== sltiu x12, x1, 101 # x12 = (100 < 101) = 1 sltiu x13, x4, 10 # x13 = (0xFFFFFFF6 < 10) = 0 (unsigned compare)
# ======================================== # 6. Test SLT - Set Less Than (Signed) # ======================================== slt x14, x1, x2 # x14 = (100 < 200) = 1 slt x15, x2, x1 # x15 = (200 < 100) = 0 slt x16, x4, x1 # x16 = (-10 < 100) = 1
# ======================================== # 7. Test SLTU - Set Less Than (Unsigned) # ======================================== sltu x17, x1, x2 # x17 = (100 < 200) = 1 sltu x18, x4, x1 # x18 = (0xFFFFFFF6 < 100) = 0 (unsigned)
# ======================================== # 8. Test Logical Operations - ANDI, ORI, XORI # ======================================== addi x19, x0, 255 # x19 = 255 (0xFF) andi x20, x19, 15 # x20 = 255 & 15 = 15 (0x0F) ori x21, x20, 240 # x21 = 15 | 240 = 255 (0xFF) xori x22, x21, 170 # x22 = 255 ^ 170 = 85 (0x55)
# ======================================== # 9. Test Logical Operations - AND, OR, XOR # ======================================== addi x23, x0, 60 # x23 = 60 (0x3C = 0b00111100) addi x24, x0, 51 # x24 = 51 (0x33 = 0b00110011) and x25, x23, x24 # x25 = 60 & 51 = 48 (0x30) or x26, x23, x24 # x26 = 60 | 51 = 63 (0x3F) xor x27, x23, x24 # x27 = 60 ^ 51 = 15 (0x0F)
# ======================================== # 10. Test Shift Operations - SLLI, SRLI, SRAI # ======================================== addi x28, x0, 8 # x28 = 8 (0x08) slli x29, x28, 2 # x29 = 8 << 2 = 32 (0x20) srli x30, x29, 1 # x30 = 32 >> 1 = 16 (0x10) addi x31, x0, -8 # x31 = -8 (0xFFFFFFF8) srai x1, x31, 1 # x1 = -8 >> 1 = -4 (0xFFFFFFFC, arithmetic shift)
# ======================================== # 11. Test Shift Operations - SLL, SRL, SRA # ======================================== addi x2, x0, 16 # x2 = 16 addi x3, x0, 2 # x3 = 2 (shift amount) sll x4, x2, x3 # x4 = 16 << 2 = 64 (0x40) srl x5, x4, x3 # x5 = 64 >> 2 = 16 (0x10) addi x6, x0, -16 # x6 = -16 (0xFFFFFFF0) sra x7, x6, x3 # x7 = -16 >> 2 = -4 (0xFFFFFFFC)
# ======================================== # 12. Test LUI - Load Upper Immediate # ======================================== lui x8, 0x12345 # x8 = 0x12345000 lui x9, 0xFFFFF # x9 = 0xFFFFF000
# ======================================== # 13. Test AUIPC - Add Upper Immediate to PC # ======================================== auipc x10, 0 # x10 = current PC + 0 auipc x11, 1 # x11 = current PC + 0x1000
# ======================================== # 14. Test Memory Operations - Store and Load # Setup memory base address # ======================================== lui x12, 0x10000 # x12 = 0x10000000 (memory base)
# Store values lui x15, 0xABCDE # x15 = 0xABCDE000 addi x15, x15, 0x789 # x15 = 0xABCDE789 sw x15, 8(x12) # Store word: mem[0x10000008] = 0xABCDE789
# Load values
lw x26, 8(x12) # x26 = 0xABCDE789
# ======================================== # 15. Test Branch Instructions - BEQ # ======================================== addi x27, x0, 10 # x27 = 10 addi x28, x0, 10 # x28 = 10 beq x27, x28, branch_eq_taken # Should branch (10 == 10) addi x29, x0, 99 # x29 = 99 (SHOULD NOT EXECUTE)
branch_eq_taken: addi x29, x0, 1 # x29 = 1 (branch taken marker)
addi x27, x0, 10 # x27 = 10 addi x28, x0, 20 # x28 = 20 beq x27, x28, branch_eq_not_taken # Should not branch addi x30, x0, 1 # x30 = 1 (not taken marker)
branch_eq_not_taken:
# ======================================== # 16. Test Branch Instructions - BNE # ======================================== addi x1, x0, 5 # x1 = 5 addi x2, x0, 10 # x2 = 10 bne x1, x2, branch_ne_taken # Should branch (5 != 10) addi x3, x0, 99 # x3 = 99 (SHOULD NOT EXECUTE)
branch_ne_taken: addi x3, x0, 1 # x3 = 1 (branch taken marker)
# ======================================== # 17. Test Branch Instructions - BLT (Signed) # ======================================== addi x4, x0, 5 # x4 = 5 addi x5, x0, 10 # x5 = 10 blt x4, x5, branch_lt_taken # Should branch (5 < 10) addi x6, x0, 99 # x6 = 99 (SHOULD NOT EXECUTE)
branch_lt_taken: addi x6, x0, 1 # x6 = 1 (branch taken marker)
addi x7, x0, -5 # x7 = -5 addi x8, x0, 3 # x8 = 3 blt x7, x8, branch_lt_neg_taken # Should branch (-5 < 3) addi x9, x0, 99 # x9 = 99 (SHOULD NOT EXECUTE)
branch_lt_neg_taken: addi x9, x0, 1 # x9 = 1 (branch taken marker)
# ======================================== # 18. Test Branch Instructions - BGE (Signed) # ======================================== addi x10, x0, 10 # x10 = 10 addi x11, x0, 5 # x11 = 5 bge x10, x11, branch_ge_taken # Should branch (10 >= 5) addi x12, x0, 99 # x12 = 99 (SHOULD NOT EXECUTE)
branch_ge_taken: addi x12, x0, 1 # x12 = 1 (branch taken marker)
# ======================================== # 19. Test Branch Instructions - BLTU (Unsigned) # ======================================== addi x13, x0, 5 # x13 = 5 addi x14, x0, 10 # x14 = 10 bltu x13, x14, branch_ltu_taken # Should branch (5 < 10 unsigned) addi x15, x0, 99 # x15 = 99 (SHOULD NOT EXECUTE)
branch_ltu_taken: addi x15, x0, 1 # x15 = 1 (branch taken marker)
# ======================================== # 20. Test Branch Instructions - BGEU (Unsigned) # ======================================== addi x16, x0, 10 # x16 = 10 addi x17, x0, 5 # x17 = 5 bgeu x16, x17, branch_geu_taken # Should branch (10 >= 5 unsigned) addi x18, x0, 99 # x18 = 99 (SHOULD NOT EXECUTE)
branch_geu_taken: addi x18, x0, 1 # x18 = 1 (branch taken marker)
# ======================================== # 21. Test JAL - Jump and Link # ======================================== jal x19, jal_target # x19 = return address, jump to jal_target addi x20, x0, 99 # x20 = 99 (SHOULD NOT EXECUTE)
jal_target: addi x20, x0, 1 # x20 = 1 (jump successful)
# ======================================== # 22. Test JALR - Jump and Link Register # ======================================== auipc x21, 0 # x21 = current PC addi x21, x21, 16 # x21 = PC + 16 (target address) jalr x22, x21, 0 # x22 = return address, jump to x21 addi x23, x0, 99 # x23 = 99 (SHOULD NOT EXECUTE)
jalr_target: addi x23, x0, 1 # x23 = 1 (jump successful)
# ======================================== # 23. Test Complex Data Dependencies # ======================================== addi x24, x0, 1 # x24 = 1 addi x24, x24, 2 # x24 = 3 addi x24, x24, 3 # x24 = 6 addi x24, x24, 4 # x24 = 10
# ======================================== # 24. Test Edge Cases # ======================================== # Maximum positive immediate addi x25, x0, 2047 # x25 = 2047 (0x7FF, max 12-bit signed)
# Maximum negative immediate addi x26, x0, -2048 # x26 = -2048 (0xFFFFF800)
# Overflow test lui x27, 0x7FFFF # x27 = 0x7FFFF000 addi x27, x27, 0x7FF # x27 = 0x7FFFF7FF (near max positive) addi x28, x0, 1 # x28 = 1 add x29, x27, x28 # x29 = overflow result
# Zero register test addi x0, x0, 100 # x0 should remain 0 add x30, x0, x0 # x30 = 0
# ======================================== # 25. Final Test - Load/Store with Computed Address # ======================================== lui x31, 0x10000 # x31 = 0x10000000 addi x1, x0, 100 # x1 = 100 (offset) add x2, x31, x1 # x2 = 0x10000000 + 100 addi x3, x0, 0x55A # x3 = 0x55AA sw x3, 0(x2) # Store at computed address lw x4, 0(x2) # x4 = 0x55AA (load back)
# ======================================== # End of Test - Infinite Loop # ======================================== end_loop: beq x0, x0, end_loop # Infinite loop
# ======================================== # Expected Register Values After Test: # ======================================== # x0 = 0x00000000 (always zero) # x1 = 100 (0x64) # x2 = 0x10000064 # x3 = 0x000055AA # x4 = 0x000055AA # x5 = 16 (0x10) # x6 = -16 (0xFFFFFFF0) # x7 = -4 (0xFFFFFFFC) # x8 = 0x12345000 # x9 = 0xFFFFF000 # x10 = PC value at AUIPC # x11 = PC value + 0x1000 # x12 = 0x10000000 # x13 = 127 (0x7F) # x14 = 0x1234 # x15 = 1 (branch marker) # x16 = 10 # x17 = 5 # x18 = 1 (branch marker) # x19 = return address from JAL # x20 = 1 # x21 = target address # x22 = return address from JALR # x23 = 1 # x24 = 10 # x25 = 2047 (0x7FF) # x26 = -2048 (0xFFFFF800) # x27 = 0x7FFFF7FF # x28 = 1 # x29 = 0x7FFFF800 (overflow wrapped) # x30 = 0 # x31 = 0x10000000
|