You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
124 lines
5.1 KiB
124 lines
5.1 KiB
6 years ago
|
commit a47622ac1badbd906c7533ef6011b6bb021271ee
|
||
|
Author: Alan Modra <amodra@gmail.com>
|
||
|
Date: Sat Jun 7 12:09:04 2014 +0930
|
||
|
|
||
|
Allow both signed and unsigned fields in PowerPC cmpli insn
|
||
|
|
||
|
There are legitimate reasons to allow a signed value in a cmpli insn
|
||
|
field, for example to test for a "stw r1,lock@sdarel(r13)" instruction
|
||
|
in user code, a kernel might use
|
||
|
subis r3,r3,STW_R1_0R13@ha # subtract off high part
|
||
|
cmplwi r3,lock@sdarel # is low part accessing lock?
|
||
|
Since the lock@sdarel may take a range of -32768 to 32767,
|
||
|
the allowed range of cmpli immediate must be at least [-32768,65535].
|
||
|
|
||
|
bfd/
|
||
|
* elf32-ppc.c (ppc_elf_relocate_section): Treat field of cmpli
|
||
|
insn as a bitfield; Use complain_overflow_bitfield.
|
||
|
* elf64-ppc.c (ppc64_elf_relocate_section): Likewise.
|
||
|
opcodes/
|
||
|
* ppc-opc.c (UISIGNOPT): Define and use with cmpli.
|
||
|
gas/
|
||
|
* config/tc-ppc.c (ppc_insert_operand): Handle PPC_OPERAND_SIGNOPT
|
||
|
on unsigned fields. Comment on PPC_OPERAND_SIGNOPT signed fields
|
||
|
in 64-bit mode.
|
||
|
gold/
|
||
|
* powerpc.cc (relocate): Treat field of cmpli insn as a bitfield.
|
||
|
|
||
|
### a/bfd/ChangeLog
|
||
|
### b/bfd/ChangeLog
|
||
|
## -1,3 +1,9 @@
|
||
|
+2014-06-07 Alan Modra <amodra@gmail.com>
|
||
|
+
|
||
|
+ * elf32-ppc.c (ppc_elf_relocate_section): Treat field of cmpli
|
||
|
+ insn as a bitfield; Use complain_overflow_bitfield.
|
||
|
+ * elf64-ppc.c (ppc64_elf_relocate_section): Likewise.
|
||
|
+
|
||
|
2014-06-05 Joel Brobecker <brobecker@adacore.com>
|
||
|
|
||
|
* development.sh: New file.
|
||
|
--- a/bfd/elf32-ppc.c
|
||
|
+++ b/bfd/elf32-ppc.c
|
||
|
@@ -9147,10 +9147,11 @@ ppc_elf_relocate_section (bfd *output_bfd,
|
||
|
unsigned int insn;
|
||
|
|
||
|
insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
|
||
|
- if ((insn & (0x3f << 26)) == 28u << 26 /* andi */
|
||
|
- || (insn & (0x3f << 26)) == 24u << 26 /* ori */
|
||
|
- || (insn & (0x3f << 26)) == 26u << 26 /* xori */
|
||
|
- || (insn & (0x3f << 26)) == 10u << 26 /* cmpli */)
|
||
|
+ if ((insn & (0x3f << 26)) == 10u << 26 /* cmpli */)
|
||
|
+ complain = complain_overflow_bitfield;
|
||
|
+ else if ((insn & (0x3f << 26)) == 28u << 26 /* andi */
|
||
|
+ || (insn & (0x3f << 26)) == 24u << 26 /* ori */
|
||
|
+ || (insn & (0x3f << 26)) == 26u << 26 /* xori */)
|
||
|
complain = complain_overflow_unsigned;
|
||
|
}
|
||
|
if (howto->complain_on_overflow != complain)
|
||
|
--- a/bfd/elf64-ppc.c
|
||
|
+++ b/bfd/elf64-ppc.c
|
||
|
@@ -14648,14 +14648,15 @@ ppc64_elf_relocate_section (bfd *output_bfd,
|
||
|
enum complain_overflow complain = complain_overflow_signed;
|
||
|
|
||
|
insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
|
||
|
- if (howto->rightshift == 0
|
||
|
- ? ((insn & (0x3f << 26)) == 28u << 26 /* andi */
|
||
|
- || (insn & (0x3f << 26)) == 24u << 26 /* ori */
|
||
|
- || (insn & (0x3f << 26)) == 26u << 26 /* xori */
|
||
|
- || (insn & (0x3f << 26)) == 10u << 26 /* cmpli */)
|
||
|
- : ((insn & (0x3f << 26)) == 29u << 26 /* andis */
|
||
|
- || (insn & (0x3f << 26)) == 25u << 26 /* oris */
|
||
|
- || (insn & (0x3f << 26)) == 27u << 26 /* xoris */))
|
||
|
+ if ((insn & (0x3f << 26)) == 10u << 26 /* cmpli */)
|
||
|
+ complain = complain_overflow_bitfield;
|
||
|
+ else if (howto->rightshift == 0
|
||
|
+ ? ((insn & (0x3f << 26)) == 28u << 26 /* andi */
|
||
|
+ || (insn & (0x3f << 26)) == 24u << 26 /* ori */
|
||
|
+ || (insn & (0x3f << 26)) == 26u << 26 /* xori */)
|
||
|
+ : ((insn & (0x3f << 26)) == 29u << 26 /* andis */
|
||
|
+ || (insn & (0x3f << 26)) == 25u << 26 /* oris */
|
||
|
+ || (insn & (0x3f << 26)) == 27u << 26 /* xoris */))
|
||
|
complain = complain_overflow_unsigned;
|
||
|
if (howto->complain_on_overflow != complain)
|
||
|
{
|
||
|
### a/opcodes/ChangeLog
|
||
|
### b/opcodes/ChangeLog
|
||
|
## -1,3 +1,7 @@
|
||
|
+2014-06-07 Alan Modra <amodra@gmail.com>
|
||
|
+
|
||
|
+ * ppc-opc.c (UISIGNOPT): Define and use with cmpli.
|
||
|
+
|
||
|
2014-06-05 Joel Brobecker <brobecker@adacore.com>
|
||
|
|
||
|
* Makefile.am (CONFIG_STATUS_DEPENDENCIES): Add dependency on
|
||
|
--- a/opcodes/ppc-opc.c
|
||
|
+++ b/opcodes/ppc-opc.c
|
||
|
@@ -654,8 +654,11 @@ const struct powerpc_operand powerpc_operands[] =
|
||
|
#define UI TO + 1
|
||
|
{ 0xffff, 0, NULL, NULL, 0 },
|
||
|
|
||
|
+#define UISIGNOPT UI + 1
|
||
|
+ { 0xffff, 0, NULL, NULL, PPC_OPERAND_SIGNOPT },
|
||
|
+
|
||
|
/* The IMM field in an SE_IM5 instruction. */
|
||
|
-#define UI5 UI + 1
|
||
|
+#define UI5 UISIGNOPT + 1
|
||
|
{ 0x1f, 4, NULL, NULL, 0 },
|
||
|
|
||
|
/* The OIMM field in an SE_OIM5 instruction. */
|
||
|
@@ -3500,10 +3503,10 @@ const struct powerpc_opcode powerpc_opcodes[] = {
|
||
|
|
||
|
{"dozi", OP(9), OP_MASK, M601, PPCNONE, {RT, RA, SI}},
|
||
|
|
||
|
-{"cmplwi", OPL(10,0), OPL_MASK, PPCCOM, PPCNONE, {OBF, RA, UI}},
|
||
|
-{"cmpldi", OPL(10,1), OPL_MASK, PPC64, PPCNONE, {OBF, RA, UI}},
|
||
|
-{"cmpli", OP(10), OP_MASK, PPC, PPCNONE, {BF, L, RA, UI}},
|
||
|
-{"cmpli", OP(10), OP_MASK, PWRCOM, PPC, {BF, RA, UI}},
|
||
|
+{"cmplwi", OPL(10,0), OPL_MASK, PPCCOM, PPCNONE, {OBF, RA, UISIGNOPT}},
|
||
|
+{"cmpldi", OPL(10,1), OPL_MASK, PPC64, PPCNONE, {OBF, RA, UISIGNOPT}},
|
||
|
+{"cmpli", OP(10), OP_MASK, PPC, PPCNONE, {BF, L, RA, UISIGNOPT}},
|
||
|
+{"cmpli", OP(10), OP_MASK, PWRCOM, PPC, {BF, RA, UISIGNOPT}},
|
||
|
|
||
|
{"cmpwi", OPL(11,0), OPL_MASK, PPCCOM, PPCNONE, {OBF, RA, SI}},
|
||
|
{"cmpdi", OPL(11,1), OPL_MASK, PPC64, PPCNONE, {OBF, RA, SI}},
|