/* tc-z80.c -- Assemble code for the Zilog Z80, Z180, EZ80 and ASCII R800
- Copyright (C) 2005-2021 Free Software Foundation, Inc.
+ Copyright (C) 2005-2023 Free Software Foundation, Inc.
Contributed by Arnold Metselaar <arnold_m@operamail.com>
This file is part of GAS, the GNU Assembler.
}
void
-z80_md_end (void)
+z80_md_finish (void)
{
int mach_type;
}
input_line_pointer = (char*) s ;
expression (op);
+ resolve_register (op);
switch (op->X_op)
{
case O_absent:
if (val->X_op == O_constant)
{
int i;
- if (is_overflow (val->X_add_number, size*8))
+
+ /* PR 28791:
+ Check for overflow, but ignore values that were generated by bit
+ manipulation operators (eg ~0xe6 and -7). This does mean that
+ manipluated overlarge values will not be reported (eg ~0x1234),
+ but it does help to maintain compatibility with earlier versions
+ of the assembler. */
+ if (! val->X_extrabit
+ && is_overflow (val->X_add_number, size*8))
as_warn ( _("%d-bit overflow (%+ld)"), size*8, val->X_add_number);
for (i = 0; i < size; ++i)
p[i] = (char)(val->X_add_number >> (i*8));
static int
signed_overflow (signed long value, unsigned bitsize)
{
- signed long max = (signed long)(1UL << (bitsize-1));
- return value < -max || value >= max;
+ signed long max = (signed long) ((1UL << (bitsize - 1)) - 1);
+ return value < -max - 1 || value > max;
}
static int
unsigned_overflow (unsigned long value, unsigned bitsize)
{
- return (value >> bitsize) != 0;
+ return value >> (bitsize - 1) >> 1 != 0;
}
static int
if (fixp->fx_subsy != NULL)
{
- as_bad_where (fixp->fx_file, fixp->fx_line, _("expression too complex"));
+ as_bad_subtract (fixp);
return NULL;
}
#define EXP_MIN -0x10000
#define EXP_MAX 0x10000
static int
-str_to_broken_float (bool *signP, bfd_uint64_t *mantissaP, int *expP)
+str_to_broken_float (bool *signP, uint64_t *mantissaP, int *expP)
{
char *p;
bool sign;
- bfd_uint64_t mantissa = 0;
+ uint64_t mantissa = 0;
int exponent = 0;
int i;
static const char *
str_to_zeda32(char *litP, int *sizeP)
{
- bfd_uint64_t mantissa;
+ uint64_t mantissa;
bool sign;
int exponent;
unsigned i;
static const char *
str_to_float48(char *litP, int *sizeP)
{
- bfd_uint64_t mantissa;
+ uint64_t mantissa;
bool sign;
int exponent;
unsigned i;