PR gas/11867

* expr.c (operand <'-' and '~'>): Widen bignums.
	(operand <'!'>): Correct bignum result and convert to O_constant.
	* read.c (emit_expr): Don't assert on .byte bignum.  Don't display
	bignum truncated warning for sign extended bignums.
This commit is contained in:
Alan Modra
2010-08-02 13:19:44 +00:00
parent 5f1ab67afc
commit 93d90f466b
3 changed files with 42 additions and 10 deletions

View File

@@ -1056,6 +1056,15 @@ operand (expressionS *expressionP, enum expr_mode mode)
{
for (i = 0; i < expressionP->X_add_number; ++i)
generic_bignum[i] = ~generic_bignum[i];
/* Extend the bignum to at least the size of .octa. */
if (expressionP->X_add_number < SIZE_OF_LARGE_NUMBER)
{
expressionP->X_add_number = SIZE_OF_LARGE_NUMBER;
for (; i < expressionP->X_add_number; ++i)
generic_bignum[i] = ~(LITTLENUM_TYPE) 0;
}
if (c == '-')
for (i = 0; i < expressionP->X_add_number; ++i)
{
@@ -1066,14 +1075,12 @@ operand (expressionS *expressionP, enum expr_mode mode)
}
else if (c == '!')
{
int nonzero = 0;
for (i = 0; i < expressionP->X_add_number; ++i)
{
if (generic_bignum[i])
nonzero = 1;
generic_bignum[i] = 0;
}
generic_bignum[0] = nonzero;
if (generic_bignum[i] != 0)
break;
expressionP->X_add_number = i >= expressionP->X_add_number;
expressionP->X_op = O_constant;
expressionP->X_unsigned = 1;
}
}
else if (expressionP->X_op != O_illegal