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]

[committed] Really fix PR gas/11395


The attached change fixes the handling of the doubleword carry bit (d)
in add and sub instructions without a condition.  By default, the d bit
should be zero unless a doubleword completer is specified.

Tested on hppa-unknown-linux-gnu.  Committed to trunk.

Dave
-- 
J. David Anglin                                  dave.anglin@nrc-cnrc.gc.ca
National Research Council of Canada              (613) 990-0752 (FAX: 952-6602)


2010-12-26  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>

	PR gas/11395
	* config/tc-hppa.c (pa_ip): Set doubleword carry/borrow bit when a
	doubleword completer or doubleword condition is found in an add/sub
	instruction.  Reject match for 'A'/'S' only if there is no condition
	and d bit is not set.

	* gas/hppa/basic/add2.s: Add test for a simple doubleword carry
	instruction.
	* gas/hppa/basic/sub2.s: Add tests for simple word and doubleword
	borrow instructions.
	* gas/hppa/basic/basic.exp: Update regexps for above.

	* opcode/hppa.h: Clear "d" bit in "add" and "sub" patterns.

Index: gas/config/tc-hppa.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-hppa.c,v
retrieving revision 1.149
diff -u -3 -p -r1.149 tc-hppa.c
--- gas/config/tc-hppa.c	28 Jun 2010 14:06:57 -0000	1.149
+++ gas/config/tc-hppa.c	27 Dec 2010 01:05:38 -0000
@@ -3758,6 +3758,8 @@ pa_ip (char *str)
 		  else
 		    break;
 
+		  /* Set doubleword carry bit.  */
+		  opcode |= 0x20;
 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
 
 		/* Handle 32 bit carry for ADD.  */
@@ -3826,6 +3828,8 @@ pa_ip (char *str)
 		  else
 		    break;
 
+		  /* Set doubleword borrow bit.  */
+		  opcode |= 0x20;
 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
 
 		/* Handle 32 bit borrow for SUB.  */
@@ -3970,11 +3974,13 @@ pa_ip (char *str)
 		  /* Handle an add condition.  */
 		  case 'A':
 		    /* PR gas/11395
-		       If we are looking for 64-bit add conditions and we
-		       do not have the ",*" prefix, then we have no match.  */
-		    if (*s != ',')
+		       If we don't have a ",*" condition or "dc" completer,
+		       then we have a doubleword carry match failure.  */
+		    if (*s != ',' && !(opcode & 0x20))
 		      break;
+		    opcode |= 0x20;
 		    /* Fall through.  */
+
 		  case 'a':
 		    cmpltr = 0;
 		    flag = 0;
@@ -4142,6 +4148,14 @@ pa_ip (char *str)
 
 		  /* Handle a compare/subtract condition.  */
 		  case 'S':
+		    /* PR gas/11395
+		       If we don't have a ",*" condition or "dc" completer,
+		       then we have a doubleword carry match failure.  */
+		    if (*s != ',' && !(opcode & 0x20))
+		      break;
+		    opcode |= 0x20;
+		    /* Fall through.  */
+
 		  case 's':
 		    cmpltr = 0;
 		    flag = 0;
Index: gas/testsuite/gas/hppa/basic/add2.s
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/hppa/basic/add2.s,v
retrieving revision 1.3
diff -u -3 -p -r1.3 add2.s
--- gas/testsuite/gas/hppa/basic/add2.s	16 Apr 2010 11:20:40 -0000	1.3
+++ gas/testsuite/gas/hppa/basic/add2.s	27 Dec 2010 01:05:38 -0000
@@ -92,5 +92,6 @@
 	add,tsv,dc,*ev  %r4,%r5,%r6
 
 	;; PR gas/11395: Check for the correct assembly
-	;; of an unconditional 32-bit add instruction.
+	;; of unconditional 32-bit and 64-bit add instructions.
 	add %r1,%r1,%r1
+	add,dc %r1,%r1,%r1
Index: gas/testsuite/gas/hppa/basic/basic.exp
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/hppa/basic/basic.exp,v
retrieving revision 1.14
diff -u -3 -p -r1.14 basic.exp
--- gas/testsuite/gas/hppa/basic/basic.exp	16 Apr 2010 11:20:41 -0000	1.14
+++ gas/testsuite/gas/hppa/basic/basic.exp	27 Dec 2010 01:05:38 -0000
@@ -675,6 +675,7 @@ proc do_add2 {} {
 	    -re "^ +\[0-9\]+ 0138 08A4DF26\[^\n\]*\n"	{ set x [expr $x+1] }
 	    -re "^ +\[0-9\]+ 013c 08A4FF26\[^\n\]*\n"	{ set x [expr $x+1] }
 	    -re "^ +\[0-9\]+ 0140 08210601\[^\n\]*\n"	{ set x [expr $x+1] }
+	    -re "^ +\[0-9\]+ 0144 08210721\[^\n\]*\n"	{ set x [expr $x+1] }
 	    -re "\[^\n\]*\n"				{ }
 	    timeout				{ perror "timeout\n"; break }
 	    eof					{ break }
@@ -686,7 +687,7 @@ proc do_add2 {} {
     gas_finish
 
     # Did we find what we were looking for?  If not, flunk it.
-    if [expr $x==81] then { pass $testname } else { fail $testname }
+    if [expr $x==82] then { pass $testname } else { fail $testname }
 }
 
 proc do_sh1add {} {
@@ -1582,6 +1583,8 @@ proc do_sub2 {} {
 	    -re "^ +\[0-9\]+ 0174 08A4BCE6\[^\n\]*\n"	{ set x [expr $x+1] }
 	    -re "^ +\[0-9\]+ 0178 08A4DCE6\[^\n\]*\n"	{ set x [expr $x+1] }
 	    -re "^ +\[0-9\]+ 017c 08A4FCE6\[^\n\]*\n"	{ set x [expr $x+1] }
+	    -re "^ +\[0-9\]+ 0180 08210401\[^\n\]*\n"	{ set x [expr $x+1] }
+	    -re "^ +\[0-9\]+ 0184 08210521\[^\n\]*\n"	{ set x [expr $x+1] }
 	    -re "\[^\n\]*\n"				{ }
 	    timeout				{ perror "timeout\n"; break }
 	    eof					{ break }
@@ -1593,7 +1596,7 @@ proc do_sub2 {} {
     gas_finish
 
     # Did we find what we were looking for?  If not, flunk it.
-    if [expr $x==96] then { pass $testname } else { fail $testname }
+    if [expr $x==98] then { pass $testname } else { fail $testname }
 }
 
 proc do_ds {} {
Index: gas/testsuite/gas/hppa/basic/sub2.s
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/hppa/basic/sub2.s,v
retrieving revision 1.2
diff -u -3 -p -r1.2 sub2.s
--- gas/testsuite/gas/hppa/basic/sub2.s	30 Aug 1999 18:20:18 -0000	1.2
+++ gas/testsuite/gas/hppa/basic/sub2.s	27 Dec 2010 01:05:38 -0000
@@ -107,3 +107,9 @@
 	sub,tsv,tc,*>> %r4,%r5,%r6
 	sub,tsv,tc,*nsv %r4,%r5,%r6
 	sub,tsv,tc,*ev %r4,%r5,%r6
+
+        ;; PR gas/11395: Check for the correct assembly
+        ;; of unconditional 32-bit and 64-bit sub instructions.
+        sub %r1,%r1,%r1
+        sub,db %r1,%r1,%r1
+
Index: include/opcode/hppa.h
===================================================================
RCS file: /cvs/src/src/include/opcode/hppa.h,v
retrieving revision 1.67
diff -u -3 -p -r1.67 hppa.h
--- include/opcode/hppa.h	15 Apr 2010 10:26:09 -0000	1.67
+++ include/opcode/hppa.h	27 Dec 2010 01:05:39 -0000
@@ -634,20 +634,20 @@ static const struct pa_opcode pa_opcodes
 { "addio",	0xb4000800, 0xfc000800, "?ai,b,x", pa10, 0},
 { "addit",	0xb0000000, 0xfc000800, "?ai,b,x", pa10, 0},
 { "addito",	0xb0000800, 0xfc000800, "?ai,b,x", pa10, 0},
-{ "add",	0x08000720, 0xfc0007e0, "cY?Ax,b,t", pa20, FLAG_STRICT},
+{ "add",	0x08000700, 0xfc0007e0, "cY?Ax,b,t", pa20, FLAG_STRICT},
 { "add",	0x08000700, 0xfc0007e0, "cy?ax,b,t", pa10, FLAG_STRICT},
-{ "add",	0x08000220, 0xfc0003e0, "ca?Ax,b,t", pa20, FLAG_STRICT},
+{ "add",	0x08000200, 0xfc0003e0, "ca?Ax,b,t", pa20, FLAG_STRICT},
 { "add",	0x08000200, 0xfc0003e0, "ca?ax,b,t", pa10, FLAG_STRICT},
 { "add",	0x08000600, 0xfc000fe0, "?ax,b,t", pa10, 0},
 { "addl",	0x08000a00, 0xfc000fe0, "?ax,b,t", pa10, 0},
 { "addo",	0x08000e00, 0xfc000fe0, "?ax,b,t", pa10, 0},
 { "addc",	0x08000700, 0xfc000fe0, "?ax,b,t", pa10, 0},
 { "addco",	0x08000f00, 0xfc000fe0, "?ax,b,t", pa10, 0},
-{ "sub",	0x080004e0, 0xfc0007e0, "ct?Sx,b,t", pa20, FLAG_STRICT},
+{ "sub",	0x080004c0, 0xfc0007e0, "ct?Sx,b,t", pa20, FLAG_STRICT},
 { "sub",	0x080004c0, 0xfc0007e0, "ct?sx,b,t", pa10, FLAG_STRICT},
-{ "sub",	0x08000520, 0xfc0007e0, "cB?Sx,b,t", pa20, FLAG_STRICT},
+{ "sub",	0x08000500, 0xfc0007e0, "cB?Sx,b,t", pa20, FLAG_STRICT},
 { "sub",	0x08000500, 0xfc0007e0, "cb?sx,b,t", pa10, FLAG_STRICT},
-{ "sub",	0x08000420, 0xfc0007e0, "cv?Sx,b,t", pa20, FLAG_STRICT},
+{ "sub",	0x08000400, 0xfc0007e0, "cv?Sx,b,t", pa20, FLAG_STRICT},
 { "sub",	0x08000400, 0xfc0007e0, "cv?sx,b,t", pa10, FLAG_STRICT},
 { "sub",	0x08000400, 0xfc000fe0, "?sx,b,t", pa10, 0},
 { "subo",	0x08000c00, 0xfc000fe0, "?sx,b,t", pa10, 0},


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