mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			62 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| .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	
 |