* 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.
This commit is contained in:
Alan Modra 2012-02-27 06:37:40 +00:00
parent cdb062354e
commit 1f42f8b31d
7 changed files with 54 additions and 34 deletions

View File

@ -1,3 +1,10 @@
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

View File

@ -1,5 +1,5 @@
/* 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.
@ -24,6 +24,7 @@
MA 02110-1301, USA. */
#include "as.h"
#include "bfd_stdint.h"
#include "safe-ctype.h"
#include "dwarf2dbg.h"
#include "opcode/crx.h"
@ -1173,9 +1174,7 @@ getreg_image (reg r)
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':
@ -1326,17 +1325,14 @@ get_number_of_operands (void)
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)
@ -1360,7 +1356,12 @@ check_range (long *num, int bits, int unsigned flags, int update)
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;
}
@ -1382,13 +1383,14 @@ check_range (long *num, int bits, int unsigned flags, int update)
{
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)
@ -1405,7 +1407,7 @@ check_range (long *num, int bits, int unsigned flags, int 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)
@ -1418,17 +1420,19 @@ check_range (long *num, int bits, int unsigned flags, int 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;

View File

@ -1,3 +1,7 @@
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,

View File

@ -1,5 +1,5 @@
/* 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.
@ -384,7 +384,7 @@ extern const int crx_num_traps;
#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. */

View File

@ -1,3 +1,8 @@
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.

View File

@ -1,5 +1,5 @@
/* 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.
@ -548,7 +548,7 @@ print_arg (argument *a, bfd_vma memaddr, struct disassemble_info *info)
func (stream, "%s", string);
}
else
func (stream, "$0x%lx", a->constant);
func (stream, "$0x%lx", a->constant & 0xffffffff);
}
else
{
@ -557,12 +557,12 @@ print_arg (argument *a, bfd_vma memaddr, struct disassemble_info *info)
}
}
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:
@ -570,7 +570,7 @@ print_arg (argument *a, bfd_vma memaddr, struct disassemble_info *info)
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, "+");

View File

@ -1,5 +1,5 @@
/* 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.
@ -701,7 +701,7 @@ The value in entry <N> is mapped to the value <N>
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
};