* config/tc-crx.c: Include bfd_stdint.h.
(getconstant): Remove irrelevant comment. Don't fail due to
sign-extension of int mask.
(check_range): Rewrite using unsigned arithmetic throughout.
opcodes/
* crx-dis.c (print_arg): Mask constant to 32 bits.
* crx-opc.c (cst4_map): Use int array.
include/opcode/
* crx.h (cst4_map): Update declaration.
+2012-02-27 Alan Modra <amodra@gmail.com>
+
+ * config/tc-crx.c: Include bfd_stdint.h.
+ (getconstant): Remove irrelevant comment. Don't fail due to
+ sign-extension of int mask.
+ (check_range): Rewrite using unsigned arithmetic throughout.
+
2012-02-25 Walter Lee <walt@tilera.com>
* tc-tilepro.c (emit_tilepro_instruction): Check if symbol is
/* tc-crx.c -- Assembler code for the CRX CPU core.
- Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010
+ Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012
Free Software Foundation, Inc.
Contributed by Tomer Levi, NSC, Israel.
MA 02110-1301, USA. */
#include "as.h"
+#include "bfd_stdint.h"
#include "safe-ctype.h"
#include "dwarf2dbg.h"
#include "opcode/crx.h"
static long
getconstant (long x, int nbits)
{
- /* The following expression avoids overflow if
- 'nbits' is the number of bits in 'bfd_vma'. */
- return (x & ((((1 << (nbits - 1)) - 1) << 1) | 1));
+ return x & ((((1U << (nbits - 1)) - 1) << 1) | 1);
}
/* Print a constant value to 'output_opcode':
static op_err
check_range (long *num, int bits, int unsigned flags, int update)
{
- long min, max;
+ uint32_t max;
int retval = OP_LEGAL;
int bin;
- long upper_64kb = 0xFFFF0000;
- long value = *num;
+ uint32_t upper_64kb = 0xffff0000;
+ uint32_t value = *num;
- /* For hosts witah longs bigger than 32-bits make sure that the top
- bits of a 32-bit negative value read in by the parser are set,
- so that the correct comparisons are made. */
- if (value & 0x80000000)
- value |= (-1L << 31);
+ /* Trim all values to 32 bits. uint32_t can be more than 32 bits. */
+ value &= 0xffffffff;
/* Verify operand value is even. */
if (flags & OP_EVEN)
if (flags & OP_SHIFT)
{
+ /* All OP_SHIFT args are also OP_SIGNED, so we want to keep the
+ sign. However, right shift of a signed type with a negative
+ value is implementation defined. See ISO C 6.5.7. So we use
+ an unsigned type and sign extend afterwards. */
value >>= 1;
+ value = ((value ^ 0x40000000) - 0x40000000) & 0xffffffff;
if (update)
*num = value;
}
{
int is_dispu4 = 0;
- int mul = (instruction->flags & DISPUB4) ? 1
- : (instruction->flags & DISPUW4) ? 2
- : (instruction->flags & DISPUD4) ? 4 : 0;
+ uint32_t mul = (instruction->flags & DISPUB4 ? 1
+ : instruction->flags & DISPUW4 ? 2
+ : instruction->flags & DISPUD4 ? 4
+ : 0);
for (bin = 0; bin < cst4_maps; bin++)
{
- if (value == (mul * bin))
+ if (value == mul * bin)
{
is_dispu4 = 1;
if (update)
for (bin = 0; bin < cst4_maps; bin++)
{
- if (value == cst4_map[bin])
+ if (value == ((uint32_t) cst4_map[bin] & 0xffffffff))
{
is_cst4 = 1;
if (update)
}
else if (flags & OP_SIGNED)
{
- max = (1 << (bits - 1)) - 1;
- min = - (1 << (bits - 1));
- if ((value > max) || (value < min))
+ max = 1;
+ max = max << (bits - 1);
+ value += max;
+ max = ((max - 1) << 1) | 1;
+ if (value > max)
retval = OP_OUT_OF_RANGE;
}
else if (flags & OP_UNSIGNED)
{
- max = ((((1 << (bits - 1)) - 1) << 1) | 1);
- min = 0;
- if (((unsigned long) value > (unsigned long) max)
- || ((unsigned long) value < (unsigned long) min))
+ max = 1;
+ max = max << (bits - 1);
+ max = ((max - 1) << 1) | 1;
+ if (value > max)
retval = OP_OUT_OF_RANGE;
}
return retval;
+2012-02-27 Alan Modra <amodra@gmail.com>
+
+ * crx.h (cst4_map): Update declaration.
+
2012-02-25 Walter Lee <walt@tilera.com>
* tilegx.h (tilegx_mnemonic): Add TILEGX_OPC_LD4S_TLS,
/* crx.h -- Header file for CRX opcode and register tables.
- Copyright 2004, 2010 Free Software Foundation, Inc.
+ Copyright 2004, 2010, 2012 Free Software Foundation, Inc.
Contributed by Tomer Levi, NSC, Israel.
Originally written for GAS 2.12 by Tomer Levi, NSC, Israel.
Updates, BFDizing, GNUifying and ELF support by Tomer Levi.
#define NUMTRAPS crx_num_traps
/* cst4 operand mapping. */
-extern const long cst4_map[];
+extern const int cst4_map[];
extern const int cst4_maps;
/* Table of instructions with no operands. */
+2012-02-27 Alan Modra <amodra@gmail.com>
+
+ * crx-dis.c (print_arg): Mask constant to 32 bits.
+ * crx-opc.c (cst4_map): Use int array.
+
2012-02-27 Alan Modra <amodra@gmail.com>
* arc-dis.c (BITS): Don't use shifts to mask off bits.
/* Disassembler code for CRX.
- Copyright 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+ Copyright 2004, 2005, 2006, 2007, 2012 Free Software Foundation, Inc.
Contributed by Tomer Levi, NSC, Israel.
Written by Tomer Levi.
func (stream, "%s", string);
}
else
- func (stream, "$0x%lx", a->constant);
+ func (stream, "$0x%lx", a->constant & 0xffffffff);
}
else
{
}
}
else
- func (stream, "$0x%lx", a->constant);
+ func (stream, "$0x%lx", a->constant & 0xffffffff);
break;
case arg_idxr:
- func (stream, "0x%lx(%s,%s,%d)", a->constant, getregname (a->r),
- getregname (a->i_r), powerof2 (a->scale));
+ func (stream, "0x%lx(%s,%s,%d)", a->constant & 0xffffffff,
+ getregname (a->r), getregname (a->i_r), powerof2 (a->scale));
break;
case arg_rbase:
break;
case arg_cr:
- func (stream, "0x%lx(%s)", a->constant, getregname (a->r));
+ func (stream, "0x%lx(%s)", a->constant & 0xffffffff, getregname (a->r));
if (IS_INSN_TYPE (LD_STOR_INS_INC))
func (stream, "+");
/* crx-opc.c -- Table of opcodes for the CRX processor.
- Copyright 2004, 2005, 2007 Free Software Foundation, Inc.
+ Copyright 2004, 2005, 2007, 2012 Free Software Foundation, Inc.
Contributed by Tomer Levi NSC, Israel.
Originally written for GAS 2.12 by Tomer Levi.
Example (for N=5):
cst4_map[5]=-4 -->> 5 */
-const long cst4_map[] =
+const int cst4_map[] =
{
0, 1, 2, 3, 4, -4, -1, 7, 8, 16, 32, 20, 12, 48
};