> 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
