> This is a detail of the x86-64 architecture.
> An immediate in an arithmetic instruction must
> fit in a signed 32-bit int, and this one does not.
> You've written an impossible instruction, and the
> linker is telling you in own cryptic way.
> The assemblers do not know such details, never have.
> 
> You need to MOVQ that constant into a register
> and then use the register as the argument to ADDQ.

yup.  that's the problem.  i had forgotten this rule because
i changed from one 64-bit constant to another.  the tricky
bit about the first constant was that it was a sign-extended
32-bit constant, and the linker knew this little nugget.
so imagine my surprise when changing

#define KZERO           (0xfffffffff0000000ull)

to

#define KZERO           (0xffffff0000000000ull)

resulted in linker errors.

it all makes sense now.  (even if it is repulsive.)

- erik

Reply via email to