We are using a bogoMIPS test similar to the Linux Kernel to verify that our processor is setup to run at the desired frequency (which is currently 600 MHz). During our initialization, before executing our bogoMIPS test, we write to the c1 Control Register in order to enable the C, I and M bits. We noticed that we had to do a dummy read of the c1 Control Register after setting the c1 Control Register in order to achieve the maximum bogoMIPS number. For example, below is the code that set the c1 Control Register. The line comments state which line we added to get the proper value from our bogo MIPS test. Why is this dummy read assembly instruction needed?
clear_ctl: .word 0x30003807
set_ctl: .word 0x00001807
/* program the C bit in the control register */
mrc p15, 0, r0, c1, c0, 0
ldr r1, clear_ctl
bic r0, r0, r1
ldr r1, set_ctl
orr r0, r0, r1
mcr p15, 0, r0, c1, c0, 0
mrc p15, 0, r0, c1, c0, 0 /* why do we have to execute a dummy read here? */
isb