Patch: fix 64 bit cmpb behavior for hppa

Jerry Quinn jquinn@nortelnetworks.com
Fri Sep 24 13:57:00 GMT 1999


Made a couple of mistakes in the cmpb patch.  This lets 32 bit cmpb and cmpib
work correctly.

Jerry

Changelog entry:

Fri Sep 24 16:51:04 EDT 1999

    * include/opcode/hppa.h (pa_opcodes): Fix cmpb and cmpib entries.
    * gas/config/tc-hppa.c (pa_ip):  Change error message.
      (pa_ip,pa_parse_cmpb_64_cmpltr,pa_parse_cmpib_64_cmpltr)  Fix '?N' and
      '?Q' args to allow falling through.

*** orig/include/opcode/hppa.h	Fri Sep 24 16:03:43 1999
--- gas-src/include/opcode/hppa.h	Fri Sep 24 16:45:25 1999
***************
*** 271,286 ****
  { "ret",	0xe840d000, 0xfffffffd, "n", pa20, FLAG_STRICT},
   
  { "cmpib", 	0xec000000, 0xfc000000, "?Qn5,b,w", pa20, FLAG_STRICT},
! { "cmpib", 	0x84000000, 0xf4000000, "?rn5,b,w", pa10, FLAG_STRICT},
! 
  { "comib", 	0x84000000, 0xfc000000, "?nn5,b,w", pa10, 0}, /* comib{tf}*/
  /* This entry is for the disassembler only.  It will never be used by
     assembler.  */
  { "comib", 	0x8c000000, 0xfc000000, "?nn5,b,w", pa10, 0}, /* comib{tf}*/
! 
! { "cmpb",	0x9c000000, 0xdc000000, "?Rnx,b,w", pa20, FLAG_STRICT},
! { "cmpb",	0x80000000, 0xf4000000, "?rnx,b,w", pa10, FLAG_STRICT},
! 
  { "comb",	0x80000000, 0xfc000000, "?nnx,b,w", pa10, 0}, /* comb{tf} */
  /* This entry is for the disassembler only.  It will never be used by
     assembler.  */
--- 270,282 ----
  { "ret",	0xe840d000, 0xfffffffd, "n", pa20, FLAG_STRICT},
   
  { "cmpib", 	0xec000000, 0xfc000000, "?Qn5,b,w", pa20, FLAG_STRICT},
! { "cmpib", 	0x84000000, 0xf4000000, "?nn5,b,w", pa10, FLAG_STRICT},
  { "comib", 	0x84000000, 0xfc000000, "?nn5,b,w", pa10, 0}, /* comib{tf}*/
  /* This entry is for the disassembler only.  It will never be used by
     assembler.  */
  { "comib", 	0x8c000000, 0xfc000000, "?nn5,b,w", pa10, 0}, /* comib{tf}*/
! { "cmpb",	0x9c000000, 0xdc000000, "?Nnx,b,w", pa20, FLAG_STRICT},
! { "cmpb",	0x80000000, 0xf4000000, "?nnx,b,w", pa10, FLAG_STRICT},
  { "comb",	0x80000000, 0xfc000000, "?nnx,b,w", pa10, 0}, /* comb{tf} */
  /* This entry is for the disassembler only.  It will never be used by
     assembler.  */
*** orig/gas/config/tc-hppa.c	Fri Sep 24 16:09:59 1999
--- gas-src/gas/config/tc-hppa.c	Fri Sep 24 16:48:49 1999
***************
*** 2312,2318 ****
  		    cmpltr = pa_parse_nonneg_add_cmpltr (&s, 1);
  		    if (cmpltr < 0)
  		      {
! 			as_bad (_("Invalid Compare/Subtract Condition: %c"), *s);
  			cmpltr = 0;
  		      }
  		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
--- 2312,2318 ----
  		    cmpltr = pa_parse_nonneg_add_cmpltr (&s, 1);
  		    if (cmpltr < 0)
  		      {
! 			as_bad (_("Invalid Add and Branch Condition: %c"), *s);
  			cmpltr = 0;
  		      }
  		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
***************
*** 2508,2523 ****
  		  /* Handle a 64 bit compare and branch condition.  */
  		  case 'N':
  		    cmpltr = pa_parse_cmpb_64_cmpltr (&s);
! 		    if (cmpltr < 0)
! 		      {
! 			as_bad (_("Invalid 64 Bit Compare and Branch Condition."));
! 			cmpltr = 0;
! 		      }
! 		    else
  		      {
  			/* Negated condition requires an opcode change. */
  			opcode |= (cmpltr & 8) << 26;
  		      }
  	    
  		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr & 7, 13);
  
--- 2508,2521 ----
  		  /* Handle a 64 bit compare and branch condition.  */
  		  case 'N':
  		    cmpltr = pa_parse_cmpb_64_cmpltr (&s);
! 		    if (cmpltr >= 0)
  		      {
  			/* Negated condition requires an opcode change. */
  			opcode |= (cmpltr & 8) << 26;
  		      }
+ 		    else
+ 		      /* Not a 64 bit cond.  Give 32 bit a chance. */
+ 		      break;
  	    
  		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr & 7, 13);
  
***************
*** 2525,2534 ****
  		  case 'Q':
  		    cmpltr = pa_parse_cmpib_64_cmpltr (&s);
  		    if (cmpltr < 0)
! 		      {
! 			as_bad (_("Invalid 64 Bit Compare Immediate Branch Condition."));
! 			cmpltr = 0;
! 		      }
  
  		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
  
--- 2523,2530 ----
  		  case 'Q':
  		    cmpltr = pa_parse_cmpib_64_cmpltr (&s);
  		    if (cmpltr < 0)
! 		      /* Not a 64 bit cond.  Give 32 bit a chance. */
! 		      break;
  
  		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
  
***************
*** 5288,5296 ****
    char *name = *s + 1;
    char c;
    char *save_s = *s;
-   int nullify = 0;
  
!   cmpltr = 0;
    if (**s == ',')
      {
        *s += 1;
--- 5284,5291 ----
    char *name = *s + 1;
    char c;
    char *save_s = *s;
  
!   cmpltr = -1;
    if (**s == ',')
      {
        *s += 1;
***************
*** 5363,5375 ****
  	{
  	  cmpltr = 15;
  	}
-       /* If we have something like addb,n then there is no condition
-          completer.  */
-       else if (strcasecmp (name, "n") == 0)
- 	{
- 	  cmpltr = 0;
- 	  nullify = 1;
- 	}
        else
  	{
  	  cmpltr = -1;
--- 5358,5363 ----
***************
*** 5377,5386 ****
        **s = c;
      }
  
-   /* Reset pointers if this was really a ,n for a branch instruction.  */
-   if (nullify)
-     *s = save_s;
- 
  
    return cmpltr;
  }
--- 5365,5370 ----
***************
*** 5396,5404 ****
    char *name = *s + 1;
    char c;
    char *save_s = *s;
-   int nullify = 0;
  
!   cmpltr = 0;
    if (**s == ',')
      {
        *s += 1;
--- 5380,5387 ----
    char *name = *s + 1;
    char c;
    char *save_s = *s;
  
!   cmpltr = -1;
    if (**s == ',')
      {
        *s += 1;
***************
*** 5439,5461 ****
  	{
  	  cmpltr = 7;
  	}
-       /* If we have something like addb,n then there is no condition
-          completer.  */
-       else if (strcasecmp (name, "n") == 0)
- 	{
- 	  cmpltr = 0;
- 	  nullify = 1;
- 	}
        else
  	{
  	  cmpltr = -1;
  	}
        **s = c;
      }
- 
-   /* Reset pointers if this was really a ,n for a branch instruction.  */
-   if (nullify)
-     *s = save_s;
  
  
    return cmpltr;
--- 5422,5433 ----



More information about the Binutils mailing list