|| (GET_CODE (X) == PLUS \
&& GET_CODE (XEXP (X, 0)) == REG \
&& REG_OK_FOR_BASE_P (XEXP (X, 0)) \
- && CONSTANT_ADDRESS_P (XEXP (X, 1))))
+ && CONSTANT_ADDRESS_P (XEXP (X, 1)) \
+ && (GET_CODE (X) != CONST_INT || NS32K_DISPLACEMENT_P (INTVAL (X)))))
+
+/* 1 if integer I will fit in a 4 byte displacement field.
+ Strictly speaking, we can't be sure that a symbol will fit this range.
+ But, in practice, it always will. */
+
+#define NS32K_DISPLACEMENT(i) \
+ (((i) <= 16777215 && (i) >= -16777216) \
+ || ((TARGET_32532 || TARGET_32332) \
+ && (i) <= 536870913 && (i) >= -536870912))
/* Check for frame pointer or stack pointer. */
#define MEM_REG(X) \
if (which_alternative == 1)
{
int i = INTVAL (operands[2]);
- if ( i < 0x40000000 && i >= -0x40000000 )
- return \"addr %c2(%1),%0\";
+ if (NS32K_DISPLACEMENT_P (i))
+ return \"addr %c2(%1),%0\";
else
- return \"movd %1,%0\;addd %2,%0\";
+ return \"movd %1,%0\;addd %2,%0\";
}
if (GET_CODE (operands[2]) == CONST_INT)
{