* frv.opc (parse_uhi16): Fix handling of %hi operator on 64-bit
hosts. * cgen-asm.c (cgen_parse_signed_integer): Add code to handle the sign extension of negative values on a 64-bit host. * frv-asm.c: Regenerate. * gas/frv/immediates.s: New test file - checks assembly of constant values. * gas/frv/immediates.d: Expected disassmbly. * gas/frv/allinsn.exp: Run the new test.
This commit is contained in:
parent
370a075d48
commit
5011093dd0
@ -1,3 +1,8 @@
|
|||||||
|
2011-12-15 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
* frv.opc (parse_uhi16): Fix handling of %hi operator on 64-bit
|
||||||
|
hosts.
|
||||||
|
|
||||||
2011-10-26 Joern Rennecke <joern.rennecke@embecosm.com>
|
2011-10-26 Joern Rennecke <joern.rennecke@embecosm.com>
|
||||||
|
|
||||||
* epiphany.opc (parse_branch_addr): Fix type of valuep.
|
* epiphany.opc (parse_branch_addr): Fix type of valuep.
|
||||||
|
10
cpu/frv.opc
10
cpu/frv.opc
@ -1343,11 +1343,11 @@ parse_uhi16 (CGEN_CPU_DESC cd,
|
|||||||
if (errmsg == NULL
|
if (errmsg == NULL
|
||||||
&& result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
|
&& result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
|
||||||
{
|
{
|
||||||
/* If bfd_vma is wider than 32 bits, but we have a sign-
|
/* If value is wider than 32 bits then be
|
||||||
or zero-extension, truncate it. */
|
careful about how we extract bits 16-31. */
|
||||||
if (value >= - ((bfd_vma)1 << 31)
|
if (sizeof (value) > 4)
|
||||||
|| value <= ((bfd_vma)1 << 31) - (bfd_vma)1)
|
value &= (((bfd_vma)1 << 16) << 16) - 1;
|
||||||
value &= (((bfd_vma)1 << 16) << 16) - 1;
|
|
||||||
value >>= 16;
|
value >>= 16;
|
||||||
}
|
}
|
||||||
*valuep = value;
|
*valuep = value;
|
||||||
|
@ -3540,6 +3540,7 @@ s_arm_unwind_fnend (int ignored ATTRIBUTE_UNUSED)
|
|||||||
record_alignment (now_seg, 2);
|
record_alignment (now_seg, 2);
|
||||||
|
|
||||||
ptr = frag_more (8);
|
ptr = frag_more (8);
|
||||||
|
memset (ptr, 0, 8);
|
||||||
where = frag_now_fix () - 8;
|
where = frag_now_fix () - 8;
|
||||||
|
|
||||||
/* Self relative offset of the function start. */
|
/* Self relative offset of the function start. */
|
||||||
@ -19926,8 +19927,12 @@ create_unwind_entry (int have_data)
|
|||||||
size = unwind.opcode_count - 2;
|
size = unwind.opcode_count - 2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
/* An extra byte is required for the opcode count. */
|
{
|
||||||
size = unwind.opcode_count + 1;
|
gas_assert (unwind.personality_index == -1);
|
||||||
|
|
||||||
|
/* An extra byte is required for the opcode count. */
|
||||||
|
size = unwind.opcode_count + 1;
|
||||||
|
}
|
||||||
|
|
||||||
size = (size + 3) >> 2;
|
size = (size + 3) >> 2;
|
||||||
if (size > 0xff)
|
if (size > 0xff)
|
||||||
@ -19953,7 +19958,7 @@ create_unwind_entry (int have_data)
|
|||||||
ptr += 4;
|
ptr += 4;
|
||||||
|
|
||||||
/* Set the first byte to the number of additional words. */
|
/* Set the first byte to the number of additional words. */
|
||||||
data = size - 1;
|
data = size > 0 ? size - 1 : 0;
|
||||||
n = 3;
|
n = 3;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1,3 +1,10 @@
|
|||||||
|
2011-12-15 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
* gas/frv/immediates.s: New test file - checks assembly of
|
||||||
|
constant values.
|
||||||
|
* gas/frv/immediates.d: Expected disassembly.
|
||||||
|
* gas/frv/allinsn.exp: Run the new test.
|
||||||
|
|
||||||
2011-12-14 Stuart Henderson <shenders@gcc.gnu.org>
|
2011-12-14 Stuart Henderson <shenders@gcc.gnu.org>
|
||||||
|
|
||||||
* gas/bfin/move.d: Update SRCx field expectations.
|
* gas/bfin/move.d: Update SRCx field expectations.
|
||||||
|
@ -17,4 +17,6 @@ if [istarget frv*-*-*] {
|
|||||||
run_list_test "fr450-media-issue" "-mcpu=fr450"
|
run_list_test "fr450-media-issue" "-mcpu=fr450"
|
||||||
|
|
||||||
run_dump_test "fr550-pack1"
|
run_dump_test "fr550-pack1"
|
||||||
|
|
||||||
|
run_dump_test "immediates"
|
||||||
}
|
}
|
||||||
|
12
gas/testsuite/gas/frv/immediates.d
Normal file
12
gas/testsuite/gas/frv/immediates.d
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#as:
|
||||||
|
#objdump: -d
|
||||||
|
#name: Parsing immediate values
|
||||||
|
|
||||||
|
.*: +file format .*
|
||||||
|
|
||||||
|
Disassembly of section \.text:
|
||||||
|
|
||||||
|
00000000 <foo>:
|
||||||
|
0:[ ]+86 fc e0 00[ ]+setlos 0xff+e000,gr3
|
||||||
|
4:[ ]+08 f8 3f ff[ ]+sethi.p 0x3fff,gr4
|
||||||
|
|
9
gas/testsuite/gas/frv/immediates.s
Normal file
9
gas/testsuite/gas/frv/immediates.s
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
;; These instructions can be found in the FRV Linux kernel.
|
||||||
|
;; They used to fail to assemble on 64-bit host machines
|
||||||
|
;; because of sign-extension problems.
|
||||||
|
|
||||||
|
.text
|
||||||
|
.global foo
|
||||||
|
foo:
|
||||||
|
setlos #0xffffe000, gr3
|
||||||
|
sethi.p %hi(~(0x80000000 | 0x40000000)), gr4
|
@ -1,3 +1,9 @@
|
|||||||
|
2011-12-15 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
* cgen-asm.c (cgen_parse_signed_integer): Add code to handle the
|
||||||
|
sign extension of negative values on a 64-bit host.
|
||||||
|
* frv-asm.c: Regenerate.
|
||||||
|
|
||||||
2011-12-13 Alan Modra <amodra@gmail.com>
|
2011-12-13 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
* ppc-opc.c (ISA_V2): Define and use for relevant BO field tests.
|
* ppc-opc.c (ISA_V2): Define and use for relevant BO field tests.
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* CGEN generic assembler support code.
|
/* CGEN generic assembler support code.
|
||||||
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2007
|
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2007,
|
||||||
Free Software Foundation, Inc.
|
2011 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of libopcodes.
|
This file is part of libopcodes.
|
||||||
|
|
||||||
@ -268,7 +268,23 @@ cgen_parse_signed_integer (CGEN_CPU_DESC cd,
|
|||||||
&result, &value);
|
&result, &value);
|
||||||
/* FIXME: Examine `result'. */
|
/* FIXME: Examine `result'. */
|
||||||
if (!errmsg)
|
if (!errmsg)
|
||||||
*valuep = value;
|
{
|
||||||
|
/* Handle the case where a hex value is parsed on a 64-bit host.
|
||||||
|
A value like 0xffffe000 is clearly intended to be a negative
|
||||||
|
16-bit value, but on a 64-bit host it will be parsed by gas
|
||||||
|
as 0x00000000ffffe000.
|
||||||
|
|
||||||
|
The shifts below are designed not to produce compile time
|
||||||
|
warnings on a 32-bit host. */
|
||||||
|
if (sizeof (value) > 4
|
||||||
|
&& result == CGEN_PARSE_OPERAND_RESULT_NUMBER
|
||||||
|
&& value > 0
|
||||||
|
&& (value & 0x80000000)
|
||||||
|
&& ((value >> 31) == 1))
|
||||||
|
value |= -1 << 31;
|
||||||
|
|
||||||
|
*valuep = value;
|
||||||
|
}
|
||||||
return errmsg;
|
return errmsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -465,11 +465,11 @@ parse_uhi16 (CGEN_CPU_DESC cd,
|
|||||||
if (errmsg == NULL
|
if (errmsg == NULL
|
||||||
&& result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
|
&& result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
|
||||||
{
|
{
|
||||||
/* If bfd_vma is wider than 32 bits, but we have a sign-
|
/* If value is wider than 32 bits then be
|
||||||
or zero-extension, truncate it. */
|
careful about how we extract bits 16-31. */
|
||||||
if (value >= - ((bfd_vma)1 << 31)
|
if (sizeof (value) > 4)
|
||||||
|| value <= ((bfd_vma)1 << 31) - (bfd_vma)1)
|
value &= (((bfd_vma)1 << 16) << 16) - 1;
|
||||||
value &= (((bfd_vma)1 << 16) << 16) - 1;
|
|
||||||
value >>= 16;
|
value >>= 16;
|
||||||
}
|
}
|
||||||
*valuep = value;
|
*valuep = value;
|
||||||
|
Loading…
Reference in New Issue
Block a user