I have a tight loop listed as follow. thumb-2.
PC=0x700abdfe DISASS="MRRC p15,#0,r0,r1,c14"
PC=0x700abe02 DISASS="SUBS r0,r0,r2"
PC=0x700abe04 DISASS="SBC r1,r1,r3"
PC=0x700abe08 DISASS="SUBS r0,r0,r4"
PC=0x700abe0a DISASS="SBCS r1,r1,r5"
PC=0x700abe0c DISASS="BCC {pc}-0xe ; 0x700abdfe"
The target address,0x700abdfe, is not 4 byte aligned, the performance hit is huge.
How to force the branch target to be 4 byte aligned? Any compiler options to do that? I am using arm A15.
I don't think the issue is that the MRRC instruction is not 4-byte (word) aligned, as this is very common, but rather that it straddles a cache line boundary.
You can use scatterloading to place this code in a suitably aligned execution region, but the finest granularity you would have is by function. If this code is in the middle of a function, it may not be feasible to control alignment.
You could inject a NOP instructions with the compiler intrinsic __nop() (#include <arm_acle.h>) before the MRRC instruction, though you would need to re-check after each rebuild if it was necessary.
Sorry, I can't think of a better solution.
Thank you very much Ronan for getting back to me on this!
Also, we are using a dual core A15 model pre-silicon. The question is why when this happens (slowness of the tight loop), the timer register slows down too? Ultimately, this function is waiting for a certain amount of timer increments to pass. If there is efficiency lost in few cpu cycles, it seems like it should be a don’t care? We’re looping around a *lot* of times just waiting for the timer to expire.
What we’d really be asking is “does this alignment inefficiency cause the ARM fast model to take inordinate amounts of time to simulate?"
Hello again, from a simple test I cannot replicate such behavior.
It is probably best to raise an official support case from the support menu above. You may need to share the code as well as the system you are running to help investigate thoroughly.
Okay, I will open an official case. Thank you very much Ronan!
Isn't this one official? I opened this case through the menu -> ...