From fa9d2bd6b819ce143c149cee83456fa9dfe729b4 Mon Sep 17 00:00:00 2001 From: "Maciej W. Rozycki" Date: Thu, 20 Sep 2018 15:49:01 +0100 Subject: [PATCH] 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. --- gas/ChangeLog | 5 +++++ gas/config/tc-s12z.c | 24 +++++++++++++----------- 2 files changed, 18 insertions(+), 11 deletions(-) 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; -- 2.30.2