This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

64-bit host failures, v850


Fixes
v850-elf  +FAIL: ld-v850/split-lo16
caused by assuming long was exactly 32 bits in order to sign extend by
shifting right.  Also corrects a few other thinkos I noticed.

	* v850-opc.c (extract_v8): Rearrange to make it obvious this
	is the inverse of corresponding insert function.
	(extract_d22, extract_u9, extract_r4): Likewise.
	(extract_d9): Correct sign extension.
	(extract_d16_15): Don't assume "long" is 32 bits, and don't
	rely on implementation defined behaviour for shift right of
	signed types.
	(extract_d16_16, extract_d17_16, extract_i9): Likewise.
	(extract_d23): Likewise, and correct mask.
	

Index: opcodes/v850-opc.c
===================================================================
RCS file: /cvs/src/src/opcodes/v850-opc.c,v
retrieving revision 1.13
diff -u -p -r1.13 v850-opc.c
--- opcodes/v850-opc.c	19 May 2011 11:10:59 -0000	1.13
+++ opcodes/v850-opc.c	26 Feb 2012 03:50:10 -0000
@@ -259,7 +259,7 @@ insert_v8 (unsigned long insn, long valu
 static unsigned long
 extract_v8 (unsigned long insn, int * invalid)
 {
-  unsigned long ret = (insn & 0x1f) | ((insn & 0x38000000) >> (27-5));
+  unsigned long ret = (insn & 0x1f) | ((insn >> (27-5)) & 0xe0);
 
   if (invalid != 0)
     *invalid = 0;
@@ -285,10 +285,9 @@ insert_d9 (unsigned long insn, long valu
 static unsigned long
 extract_d9 (unsigned long insn, int * invalid)
 {
-  unsigned long ret = ((insn & 0xf800) >> 7) | ((insn & 0x0070) >> 3);
+  signed long ret = ((insn >> 7) & 0x1f0) | ((insn >> 3) & 0x0e);
 
-  if ((insn & 0x8000) != 0)
-    ret -= 0x0200;
+  ret = (ret ^ 0x100) - 0x100;
 
   if (invalid != 0)
     *invalid = 0;
@@ -341,8 +340,9 @@ insert_d16_15 (unsigned long insn, long 
 static unsigned long
 extract_d16_15 (unsigned long insn, int * invalid)
 {
-  signed long ret = (insn & 0xfffe0000);
-  ret >>= 16;
+  signed long ret = (insn >> 16) & 0xfffe;
+
+  ret = (ret ^ 0x8000) - 0x8000;
 
   if (invalid != 0)
     *invalid = 0;
@@ -361,9 +361,9 @@ insert_d16_16 (unsigned long insn, signe
 static unsigned long
 extract_d16_16 (unsigned long insn, int * invalid)
 {
-  signed long ret = insn & 0xfffe0000;
-  ret >>= 16;
-  ret |= ((insn & 0x20) >> 5);
+  signed long ret = ((insn >> 16) & 0xfffe) | ((insn >> 5) & 1);
+
+  ret = (ret ^ 0x8000) - 0x8000;
 
   if (invalid != 0)
     *invalid = 0;
@@ -382,9 +382,9 @@ insert_d17_16 (unsigned long insn, long 
 static unsigned long
 extract_d17_16 (unsigned long insn, int * invalid)
 {
-  signed long ret = (insn >> 16) & 0xfffe;
-  ret |= (insn << (16 - 4)) & 0x10000;
-  ret = (ret << ((sizeof ret)*8 - 17)) >> ((sizeof ret)*8 - 17);
+  signed long ret = ((insn >> 16) & 0xfffe) | ((insn << (16 - 4)) & 0x10000);
+
+  ret = (ret ^ 0x10000) - 0x10000;
 
   if (invalid != 0)
     *invalid = 0;
@@ -410,9 +410,9 @@ insert_d22 (unsigned long insn, long val
 static unsigned long
 extract_d22 (unsigned long insn, int * invalid)
 {
-  signed long ret = ((insn & 0xfffe0000) >> 16) | ((insn & 0x3f) << 16);
+  signed long ret = ((insn >> 16) & 0xfffe) | ((insn << 16) & 0x3f0000);
 
-  ret = (ret << ((sizeof ret)*8 - 22)) >> ((sizeof ret)*8 - 22);
+  ret = (ret ^ 0x200000) - 0x200000;
 
   if (invalid != 0)
     *invalid = 0;
@@ -423,7 +423,7 @@ static unsigned long
 insert_d23 (unsigned long insn, long value, const char ** errmsg)
 {
   if (value > 0x3fffff || value < -0x400000)
-	* errmsg = out_of_range;
+    * errmsg = out_of_range;
 
   return insn | ((value & 0x7f) << 4) | ((value & 0x7fff80) << (16-7));
 }
@@ -431,9 +431,9 @@ insert_d23 (unsigned long insn, long val
 static unsigned long
 extract_d23 (unsigned long insn, int * invalid)
 {
-  signed long ret = ((insn >> 4) & 0x7f) | ((insn >> (16-7)) & 0x7fffff80);
+  signed long ret = ((insn >> 4) & 0x7f) | ((insn >> (16-7)) & 0x7fff80);
 
-  ret = ((ret << ((sizeof ret)*8 - 23)) >> ((sizeof ret)*8 - 23));
+  ret = (ret ^ 0x400000) - 0x400000;
 
   if (invalid != 0)
     *invalid = 0;
@@ -452,11 +452,9 @@ insert_i9 (unsigned long insn, signed lo
 static unsigned long
 extract_i9 (unsigned long insn, int * invalid)
 {
-  signed long ret = insn & 0x003c0000;
+  signed long ret = ((insn >> 13) & 0x1e0) | (insn & 0x1f);
 
-  ret <<= 10;
-  ret >>= 23;
-  ret |= (insn & 0x1f);
+  ret = (ret ^ 0x100) - 0x100;
 
   if (invalid != 0)
     *invalid = 0;
@@ -477,11 +475,7 @@ insert_u9 (unsigned long insn, long v, c
 static unsigned long
 extract_u9 (unsigned long insn, int * invalid)
 {
-  unsigned long ret = insn & 0x003c0000;
-
-  ret >>= 13;
-
-  ret |= (insn & 0x1f);
+  unsigned long ret = ((insn >> 13) & 0x1e0) | (insn & 0x1f);
 
   if (invalid != 0)
     *invalid = 0;
@@ -496,7 +490,7 @@ insert_spe (unsigned long insn, long v, 
   if (value != 3)
     * errmsg = _("invalid register for stack adjustment");
 
-  return insn & (~ 0x180000);
+  return insn & ~0x180000;
 }
 
 static unsigned long
@@ -524,9 +518,7 @@ insert_r4 (unsigned long insn, long v, c
 static unsigned long
 extract_r4 (unsigned long insn, int * invalid)
 {
-  unsigned long ret;
-  ret = (insn >> 17) & 0xf;
-  ret |= (insn >> (23-4)) & 0x10;
+  unsigned long ret = ((insn >> (23-4)) & 0x10) | ((insn >> 17) & 0x0f);
 
   if (invalid != 0)
     *invalid = 0;

-- 
Alan Modra
Australia Development Lab, IBM


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]