mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-29 12:13:33 +08:00
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:
parent
16de26a611
commit
fa9d2bd6b8
@ -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
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user