arm-elf-as truncates branch offsets w/o warning

Nick Clifton nickc@cygnus.com
Fri Mar 17 10:36:00 GMT 2000


Hi Alan,

: > +       /* Sign-extend a 24-bit number.  */
: > + #define SEXT24(x)	((((x) & 0xffffff) ^ (~ 0x7fffff)) + 0x800000)
: > + 
: 
: Hi Nick,
:    That looks wrong.  Don't you mean
: 
: #define SEXT24(x)	((((x) & 0xffffff) ^ 0x800000) - 0x800000)
:                                                      ^
: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>^

No, the plus and the inversion are right.

Here are a couple of examples:

   x: 0xf7f00000     x:  0xf7700000
   &  0x00ffffff     &   0x00ffffff
   -------------     --------------
      0x00f00000         0x00700000
   ^  0xff800000     ^   0xff800000
   -------------     --------------
      0xff700000         0xfff00000
   +  0x00800000     +   0x00800000
   -------------     --------------
      0xfff00000         0x00700000

This method works regardless of the size of the host's word, (well
assuming that it is at least 32 bits anyway).

Cheers
	Nick


More information about the Binutils mailing list