S12Z/GAS: Correct a signed vs unsigned comparison error with GCC 4.1

Fix a build error:

cc1: warnings being treated as errors
.../gas/config/tc-s12z.c: In function 'lex_opr':
.../gas/config/tc-s12z.c:617: warning: comparison between signed and unsigned
.../gas/config/tc-s12z.c:624: warning: comparison between signed and unsigned
make[4]: *** [config/tc-s12z.o] Error 1

observed with GCC 4.1.2 with the `s12z-elf' target.

Here we have a constant assembly instruction operand, whose value is
within the 24-bit unsigned range, to be placed in a machine instruction
such as to use the least space-consuming encoding.  So the sign of that
value does not matter, because signed values are out of range and are
not supposed to appear here, and we only have this warning here because
the `X_add_number' member of `struct expressionS' is of the `offsetT'
type, which is signed.

Use an auxiliary variable of an unsigned data type then, observing that
both `offsetT' and `valueT' have the same width, as they correspond to
`bfd_signed_vma' and `bfd_vma' respectively.

	gas/
	* config/tc-s12z.c (lex_opr): Use an auxiliary unsigned variable
	in encoding a constant operand.
This commit is contained in:
Maciej W. Rozycki 2018-09-20 15:49:01 +01:00
parent 16de26a611
commit fa9d2bd6b8
2 changed files with 18 additions and 11 deletions

View File

@ -1,3 +1,8 @@
2018-09-20 Maciej W. Rozycki <macro@linux-mips.org>
* config/tc-s12z.c (lex_opr): Use an auxiliary unsigned variable
in encoding a constant operand.
2018-09-20 Maciej W. Rozycki <macro@linux-mips.org>
* config/tc-ppc.c (ppc_dwsect): Use `valueT' rather than

View File

@ -614,31 +614,33 @@ lex_opr (uint8_t *buffer, int *n_bytes, expressionS *exp)
buffer[3] = 0;
if (exp->X_op == O_constant)
{
if (exp->X_add_number < (0x1U << 14))
valueT value = exp->X_add_number;
if (value < (0x1U << 14))
{
*xb = 0x00;
*n_bytes = 2;
*xb |= exp->X_add_number >> 8;
buffer[1] = exp->X_add_number;
*xb |= value >> 8;
buffer[1] = value;
}
else if (exp->X_add_number < (0x1U << 19))
else if (value < (0x1U << 19))
{
*xb = 0xf8;
if (exp->X_add_number & (0x1U << 17))
if (value & (0x1U << 17))
*xb |= 0x04;
if (exp->X_add_number & (0x1U << 16))
if (value & (0x1U << 16))
*xb |= 0x01;
*n_bytes = 3;
buffer[1] = exp->X_add_number >> 8;
buffer[2] = exp->X_add_number;
buffer[1] = value >> 8;
buffer[2] = value;
}
else
{
*xb = 0xfa;
*n_bytes = 4;
buffer[1] = exp->X_add_number >> 16;
buffer[2] = exp->X_add_number >> 8;
buffer[3] = exp->X_add_number;
buffer[1] = value >> 16;
buffer[2] = value >> 8;
buffer[3] = value;
}
}
return 1;