.section .text .global simple_csrbr_test .type simple_csrbr_test, @function simple_csrbr_test: # step 1 enable the performance counters # by default the hardware enables all performance counters # however we will eventually want to manually enable incase # some other code disables them # br count is counter 5 # br mp count is counter 4 li t0, 0x30 csrrc x0, 0x320, t0 # clear bits 4 and 5 of inhibit register. # step 2 read performance counters into general purpose registers csrrw t2, 0xB05, x0 # t2 = BR COUNT (perf count 5) csrrw t3, 0xB04, x0 # t3 = BRMP COUNT (perf count 4) # step 3 simple loop to show the counters are updated. li t0, 0 # this is the loop counter li t1, 100 # this is the loop end condition # for(t1 = 0; t1 < t0; t1++); loop: addi t0, t0, 1 blt t0, t1, loop loop_done: # step 2 read performance counters into general purpose registers csrrw t4, 0xB05, x0 # t4 = BR COUNT (perf count 5) csrrw t5, 0xB04, x0 # t5 = BRMP COUNT (perf count 4) sub t2, t4, t2 # this is the number of branch instructions committed. sub t3, t5, t3 # this is the number of branch mispredictions committed. # now check if the branch count equals 100 and if the branch bne t4, t2, fail li t5, 3 bne t3, t5, fail pass: li a0, 0 done: li t0, 0x30 csrrs x0, 0x320, t0 # set bits 4 and 5 ret fail: li a0, -1 j done .data sample_data: .int 0