http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54445
--- Comment #2 from Uros Bizjak <ubizjak at gmail dot com> 2012-09-01 14:53:44 UTC --- This is due to the definition of x86_64_immediate_operand predicate, following part: case UNSPEC: switch (XINT (op1, 1)) { case UNSPEC_DTPOFF: case UNSPEC_NTPOFF: if (offset > 0 && trunc_int_for_mode (offset, SImode) == offset) return true; } I don't know why negative offsets are not allowed here.