[coldfire-gnu-discuss] GCC Clobbering Branch Predict Bit in CF3 Cores

Tom Evans tom_usenet
Mon May 19 00:01:34 PDT 2014


Is this mailing list still alive? The last archived post was in 2011. The last 
post was in Oct 2012, but it isn't in the archive (yet)??

Has this list been replaced by this "community"?

http://communities.mentor.com/mgcx/community/embedded_software/sourcery_codebench?view=discussions


I've searched for this apparent bug on gcc.gnu.org/bugzilla, but didn't find 
anything.

I'm using:

$ m68k-elf-gcc --version
m68k-elf-gcc.exe (Sourcery G++ Lite 4.3-208) 4.3.3
Copyright (C) 2008 Free Software Foundation, Inc.

The command line is:

m68k-elf-gcc -MD -MF adl3.d0 -gdwarf-2 -mcpu=5329 -Wall -std=c99 -g  -Os ...

Note the "-mcpu=5329" line.

A small snippet of source code:

#define cd_BUS_OFF 0x2000
#define cd_BUS_OFF 0x1000
#define cd_OVERRUN 0x0008

     else if (cc->status & cd_BUS_OFF) {
40109020:       202a 003c       movel %a2@(60),%d0
40109024:       0800 000d       btst #13,%d0
40109028:       6710            beqs 4010903a <comm_check_status+0x58>
(other code)
     } else if (cc->status & cd_BUS_RWARN) {
4010903a:       0800 000c       btst #12,%d0
4010903e:       6604            bnes 40109044 <comm_check_status+0x62>
     } else if (cc->status & cd_OVERRUN) {
40109040:       44c0            movew %d0,%ccr
40109042:       6a02            bpls 40109046 <comm_check_status+0x64>

Note the weird word-saving trick in the last compare? It copies the data to 
the CCR and then tests the "N" bit.

It only seems to do this trick for the "N" and "Z" bits (bits 2 and 3). it 
should be able to do it for "C" and "V" (0 and 1), but I haven't seen any code 
doing this. I've also seen code like:

4012193e:       44c2            movew %d2,%ccr
40121940:       57c0            seq %d0
40121942:       44c2            movew %d2,%ccr
40121944:       5bc1            smi %d1

What's the problem? Bit 7 of the CCR is:

     Branch prediction (Version 3 only). Alters the static
     prediction algorithm used by the branch acceleration
     logic in the instruction fetch pipeline on forward
     conditional branches. Refer to a V3 core or device
     user?s manual for further information on this bit.

So the use of the "movew %d0,%ccr" instruction is changing the CPU's branch 
prediction randomly. It shouldn't be doing that.

Tom



More information about the Coldfire-gnu-discuss mailing list