Fix "FAIL: VLE relocations 3"
authorAlan Modra <amodra@gmail.com>
Sun, 3 Dec 2017 11:21:45 +0000 (21:51 +1030)
committerAlan Modra <amodra@gmail.com>
Sun, 3 Dec 2017 11:24:47 +0000 (21:54 +1030)
Correct sign extension.

* ppc-opc.c (extract_li20): Rewrite.

opcodes/ChangeLog
opcodes/ppc-opc.c

index 746e368e91b3e20fb9b7636d304c00b1ed8feaaa..10d9e638e8a2510a848d986fe67cabba7d2ec55e 100644 (file)
@@ -1,3 +1,7 @@
+2017-12-03  Alan Modra  <amodra@gmail.com>
+
+       * ppc-opc.c (extract_li20): Rewrite.
+
 2017-12-01  Peter Bergner  <bergner@vnet.ibm.com>
 
        * opcodes/ppc-dis.c (disassemble_init_powerpc): Fix white space.
index 81335c6f22bb8d59fa81bf2b81c9767ddb447d1d..ad26c4f8063d740c8f70417d1892dc378785bda3 100644 (file)
@@ -571,13 +571,9 @@ extract_li20 (uint64_t insn,
              ppc_cpu_t dialect ATTRIBUTE_UNUSED,
              int *invalid ATTRIBUTE_UNUSED)
 {
-  int64_t ext = ((insn & 0x4000) == 0x4000) ? 0xfff00000 : 0x00000000;
-
-  return (ext
-         | (((insn >> 11) & 0xf) << 16)
-         | (((insn >> 17) & 0xf) << 12)
-         | (((insn >> 16) & 0x1) << 11)
-         | (insn & 0x7ff));
+  return ((((insn << 5) & 0xf0000)
+          | ((insn >> 5) & 0xf800)
+          | (insn & 0x7ff)) ^ 0x80000) - 0x80000;
 }
 
 /* The 2-bit L field in a SYNC or WC field in a WAIT instruction.