From: Maciej W. Rozycki Date: Thu, 20 Sep 2018 14:49:01 +0000 (+0100) Subject: S12Z/GAS: Correct a signed vs unsigned comparison error with GCC 4.1 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=fa9d2bd6b819ce143c149cee83456fa9dfe729b4;p=binutils-gdb.git 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. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index 91af84b826d..637fc65648d 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2018-09-20 Maciej W. Rozycki + + * config/tc-s12z.c (lex_opr): Use an auxiliary unsigned variable + in encoding a constant operand. + 2018-09-20 Maciej W. Rozycki * config/tc-ppc.c (ppc_dwsect): Use `valueT' rather than diff --git a/gas/config/tc-s12z.c b/gas/config/tc-s12z.c index 736f062b80e..d3b2ea4c4af 100644 --- a/gas/config/tc-s12z.c +++ b/gas/config/tc-s12z.c @@ -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;