* ppc-opc.c (extract_vlesi): Properly sign extend.
authorAlan Modra <amodra@gmail.com>
Thu, 9 May 2013 04:32:55 +0000 (04:32 +0000)
committerAlan Modra <amodra@gmail.com>
Thu, 9 May 2013 04:32:55 +0000 (04:32 +0000)
(extract_vlensi): Likewise.  Comment reason for setting invalid.

opcodes/ChangeLog
opcodes/ppc-opc.c

index 88f9294fe2f9f0235db5dd061be73f75414fa055..e918abca27440832883cfc2607f3e4cde79670af 100644 (file)
@@ -1,3 +1,8 @@
+2013-05-09  Alan Modra  <amodra@gmail.com>
+
+       * ppc-opc.c (extract_vlesi): Properly sign extend.
+       (extract_vlensi): Likewise.  Comment reason for setting invalid.
+
 2013-05-02  Nick Clifton  <nickc@redhat.com>
 
        * msp430-dis.c: Add support for MSP430X instructions.
index 80dfa246159515667e277c95f64242b219632912..62edf026899b9b5f311b8d6f8987ff380d231e0b 100644 (file)
@@ -2022,11 +2022,8 @@ extract_vlesi (unsigned long insn,
              ppc_cpu_t dialect ATTRIBUTE_UNUSED,
              int *invalid ATTRIBUTE_UNUSED)
 {
-  /* RWRW Because I don't know how to make int be 16 and long be 32 */
-  /* I can't rely on casting an int to long to get sign extension. */
   long value = ((insn >> 10) & 0xf800) | (insn & 0x7ff);
-  if (value & 0x8000)
-    value |= 0xffff0000;
+  value = (value ^ 0x8000) - 0x8000;
   return value;
 }
 
@@ -2045,8 +2042,8 @@ extract_vlensi (unsigned long insn,
              int *invalid ATTRIBUTE_UNUSED)
 {
   long value = ((insn >> 10) & 0xf800) | (insn & 0x7ff);
-  if (value & 0x8000)
-    value |= 0xffff0000;
+  value = (value ^ 0x8000) - 0x8000;
+  /* Don't use for disassembly.  */
   *invalid = 1;
   return -value;
 }