1

I am trying to build a temperature control application for a 68000 processor. I am currently using GCC 8.2.0. I am compiling with the -msoft-float flag. However, the floating point library routines appear to be broken. Example:

'000174f4 <__ltdf2>:'
   '174f4:  4e56 0000       linkw %fp,#0'
   '174f8:  4878 0001       pea 1 <ADD>'
   '174fc:  2f2e 0014       movel %fp@(20),%sp@-'
   '17500:  2f2e 0010       movel %fp@(16),%sp@-'
   '17504:  2f2e 000c       movel %fp@(12),%sp@-'
   '17508:  2f2e 0008       movel %fp@(8),%sp@-'
   '1750c:  61ff            bsrs 1750d <__ltdf2+0x19>'
   '1750e:  ffff            .short 0xffff'
   '17510:  fd94            .short 0xfd94'
   '17512:  4e5e            unlk %fp'
   '17514:  4e75            rts'
   '17516:  4e71            nop'

Can someone explain why this code is generated or what is happening here? No way will a 68000 branch to an odd address.

UPDATE I've been digging into this, and the problem appears to be injected during linking. Dumping the code for this function from libgcc.a shows the following:

`00000000 <__ltdf2>:`
  ` 0:   4e56 0000           linkw %fp,#0`
  `4:   4878 0001            pea 1 <__ltdf2+0x1>`
  ` 8:   2f2e 0014           movel %fp@(20),%sp@-`
  ` c:   2f2e 0010           movel %fp@(16),%sp@-`
  `10:   2f2e 000c           movel %fp@(12),%sp@-`
  `14:   2f2e 0008           movel %fp@(8),%sp@-`
  `18:   61ff 0000 0000      bsrl 1a <__ltdf2+0x1a>`
  `1e:   4e5e                unlk %fp`
 ` 20:   4e75                      rts`

So the linker must be trying to fill in the branch offset and messing up. Since the source for this function is a string of macros, I'm not sure where it really wanted to branch to.

1 Answers1

4

On MC68020 and later, bra, bsr and bcc are followed by a 32bit displacement, if the 8bit displacement is 0xff. In your case this does not make sense, since 0xfffffd94 would fit into 16bit.

Make sure to compile (and that your softfloat-library is compiled) for 68000, if you don't have a 68020 or later.

chtz
  • 17,329
  • 4
  • 26
  • 56