Patch: add prefix to condition args in opcodes

Jerry Quinn jquinn@nortelnetworks.com
Fri Jul 9 13:53:00 GMT 1999


OK, here's a patch to prefix all the condition arg characters with '?'.  It
may look a bit large, but all I've done is regroup all the cases for
conditions inside the '?' case and do a bit of renaming.  It passes the test
suite and appears to work fine.

Because all the conditions are in a prefix, I just added extra codes to deal
with various 64 bit conditions.  You'll see that there are some stubs for
different new conditions that aren't filled in yet.

The end effect of this is to free up 11 characters and keep 13 more codes by
my count out of the main list.

Let me know what you think.  If this is OK, I suggest we prefix the float args 
next.

Jerry

-- 
Jerry Quinn                             Tel: (514) 761-8737
jquinn@nortelnetworks.com               Fax: (514) 761-8505
Speech Recognition Research


Changelog entry:

Fri Jul  9 15:48:47 EDT 1999  Jerry Quinn <jquinn@nortelnetworks.com>

    * config/tc-hppa.c (fp_operand_format): Change order of xW formats to
    match bit ordering in instructions.
    (pa_parse_fp_format): Handle xW formats.
    (pa_ip): Change condition args to have '?' prefix.
    * include/opcode/hppa.h (pa_opcodes): Change condition args to use '?'
    prefix.
    * opcodes/hppa-dis.c (print_insn_hppa): Change condition args to use '?'
    prefix.
    (compare_cond_64_names, add_cond_64_names, logical_cond_64_names,
    unit_cond_64_names, shift_cond_64_names): New.


*** gas-src/gas/config/tc-hppa.c	Fri Jul  9 15:16:01 1999
--- orig/gas/config/tc-hppa.c	Wed Jul  7 17:31:52 1999
***************
*** 162,170 ****
     SGL and DBL).  */
  typedef enum
    {
!     SGL, DBL, ILLEGAL_FMT,  QUAD, 
!     W,   DW,  ILLEGAL_FIX,  QW, 
!     UW,  UDW, ILLEGAL_UFIX, UQW
    }
  fp_operand_format;
  
--- 162,168 ----
     SGL and DBL).  */
  typedef enum
    {
!     SGL, DBL, ILLEGAL_FMT, QUAD, W, UW, DW, UDW, QW, UQW
    }
  fp_operand_format;
  
***************
*** 1448,1454 ****
    const char *args;
    int match = FALSE;
    int comma = 0;
-   int cond_64 = 0;		/* 1 if processing a 64 bit condition */
    int cmpltr, nullif, flag, cond, num;
    unsigned long opcode;
    struct pa_opcode *insn;
--- 1446,1451 ----
***************
*** 1717,2201 ****
  		INSERT_FIELD_AND_CONTINUE (opcode, a, 13);
  	      }
  
  
! 	    /* Handle all conditions.  */
  	    case '?':
! 	      {
! 		args++;
! 		switch (*args)
! 		  {
! 		
! 		    /* Handle FP compare conditions.  */
! 		  case 'f':	/* float */
! 		    cond = pa_parse_fp_cmp_cond (&s);
! 		    INSERT_FIELD_AND_CONTINUE (opcode, cond, 0);
! 
! 		    /* Handle an add condition.  */
! 		  case 'A':	/* 64 bit add */
! 		    if (*s == ',' && *(s + 1) == '*')
! 		      {
! 			cond_64 = 1;
! 			s += 2;	/* Eat up the ,* */
! 		      }
! 		    else break;
! 		  case 'a':	/* add */
! 		    cmpltr = 0;
! 		    flag = 0;
! 		    if (*s == ',' || cond_64)
! 		      {
! 			if (!cond_64) s++;
! 			name = s;
! 			while (*s != ',' && *s != ' ' && *s != '\t')
! 			  s += 1;
! 			c = *s;
! 			*s = 0x00;
! 			if (strcmp (name, "=") == 0)
! 			  cmpltr = 1;
! 			else if (strcmp (name, "<") == 0)
! 			  cmpltr = 2;
! 			else if (strcmp (name, "<=") == 0)
! 			  cmpltr = 3;
! 			else if (strcasecmp (name, "nuv") == 0)
! 			  cmpltr = 4;
! 			else if (strcasecmp (name, "znv") == 0)
! 			  cmpltr = 5;
! 			else if (strcasecmp (name, "sv") == 0)
! 			  cmpltr = 6;
! 			else if (strcasecmp (name, "od") == 0)
! 			  cmpltr = 7;
! 			else if (strcasecmp (name, "tr") == 0)
! 			  {
! 			    cmpltr = 0;
! 			    flag = 1;
! 			  }
! 			else if (strcmp (name, "<>") == 0)
! 			  {
! 			    cmpltr = 1;
! 			    flag = 1;
! 			  }
! 			else if (strcmp (name, ">=") == 0)
! 			  {
! 			    cmpltr = 2;
! 			    flag = 1;
! 			  }
! 			else if (strcmp (name, ">") == 0)
! 			  {
! 			    cmpltr = 3;
! 			    flag = 1;
! 			  }
! 			else if (strcasecmp (name, "uv") == 0)
! 			  {
! 			    cmpltr = 4;
! 			    flag = 1;
! 			  }
! 			else if (strcasecmp (name, "vnz") == 0)
! 			  {
! 			    cmpltr = 5;
! 			    flag = 1;
! 			  }
! 			else if (strcasecmp (name, "nsv") == 0)
! 			  {
! 			    cmpltr = 6;
! 			    flag = 1;
! 			  }
! 			else if (strcasecmp (name, "ev") == 0)
! 			  {
! 			    cmpltr = 7;
! 			    flag = 1;
! 			  }
! 			else
! 			  as_bad (_("Invalid Add Condition: %s"), name);
! 			*s = c;
! 		      }
! 	    	  opcode |= cmpltr << 13;
! 	    	  INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
! 
! 
! 		  /* Handle non-negated add condition.  */
! 		  case 'd':	/* nonneg add w/ nullify */
! 		    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);
! 
! 		  case 'D':	/* neg add w/ nullify */
! 		  case 'w':	/* wide nonneg add */
! 		  case 'W':	/* wide neg add */
! 		    abort();
! 
! 		    /* Handle a negated or non-negated add condition.  */
! 		  case '@':	/* add w/ nullify */
! 		    save_s = s;
! 		    cmpltr = pa_parse_nonneg_add_cmpltr (&s, 1);
! 		    if (cmpltr < 0)
! 		      {
! 			s = save_s;
! 			cmpltr = pa_parse_neg_add_cmpltr (&s, 1);
! 			if (cmpltr < 0)
! 			  {
! 			    as_bad (_("Invalid Compare/Subtract Condition"));
! 			    cmpltr = 0;
! 			  }
! 			else
! 			  {
! 			    /* Negated condition requires an opcode change.  */
! 			    opcode |= 1 << 27;
! 			  }
! 		      }
! 	    	  INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
! 
! 
! 		    /* Handle bvb and bb conditions.  */
! 		  case 'B':	/* 64 bit bb */
! 		    if (*s == ',' && *(s + 1) == '*')
! 		      {
! 			cond_64 = 1;
! 			s += 2;	/* Eat up the ,* */
! 		      }
! 		    else break;
! 		  case 'b':	/* bb, bvb */
! 		    cmpltr = 0;
! 		    if (*s == ',')
! 		      {
! 			s++;
! 			if (strncmp (s, "<", 1) == 0)
! 			  {
! 			    cmpltr = 0;
! 			    s++;
! 			  }
! 			else if (strncmp (s, ">=", 2) == 0)
! 			  {
! 			    cmpltr = 1;
! 			    s += 2;
! 			  }
! 			else
! 			  as_bad (_("Invalid Bit Branch Condition: %c"), *s);
! 		      }
! 		      INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 15);
! 
! 
! 		    /* Handle a compare/subtract condition.  */
! 		  case 'S':	/* 64 bit cmp/sub */
! 		    if (*s == ',' && *(s + 1) == '*')
! 		      {
! 			cond_64 = 1;
! 			s += 2;	/* Eat up the ,* */
! 		      }
! 		    else break;
! 		  case 's':	/* cmp/sub */
! 		    cmpltr = 0;
! 		    flag = 0;
! 		    if (*s == ',' || cond_64)
! 		      {
! 			if (!cond_64) s++;
! 			name = s;
! 			while (*s != ',' && *s != ' ' && *s != '\t')
! 			  s += 1;
! 			c = *s;
! 			*s = 0x00;
! 			if (strcmp (name, "=") == 0)
! 			  cmpltr = 1;
! 			else if (strcmp (name, "<") == 0)
! 			  cmpltr = 2;
! 			else if (strcmp (name, "<=") == 0)
! 			  cmpltr = 3;
! 			else if (strcasecmp (name, "<<") == 0)
! 			  cmpltr = 4;
! 			else if (strcasecmp (name, "<<=") == 0)
! 			  cmpltr = 5;
! 			else if (strcasecmp (name, "sv") == 0)
! 			  cmpltr = 6;
! 			else if (strcasecmp (name, "od") == 0)
! 			  cmpltr = 7;
! 			else if (strcasecmp (name, "tr") == 0)
! 			  {
! 			    cmpltr = 0;
! 			    flag = 1;
! 			  }
! 			else if (strcmp (name, "<>") == 0)
! 			  {
! 			    cmpltr = 1;
! 			    flag = 1;
! 			  }
! 			else if (strcmp (name, ">=") == 0)
! 			  {
! 			    cmpltr = 2;
! 			    flag = 1;
! 			  }
! 			else if (strcmp (name, ">") == 0)
! 			  {
! 			    cmpltr = 3;
! 			    flag = 1;
! 			  }
! 			else if (strcasecmp (name, ">>=") == 0)
! 			  {
! 			    cmpltr = 4;
! 			    flag = 1;
! 			  }
! 			else if (strcasecmp (name, ">>") == 0)
! 			  {
! 			    cmpltr = 5;
! 			    flag = 1;
! 			  }
! 			else if (strcasecmp (name, "nsv") == 0)
! 			  {
! 			    cmpltr = 6;
! 			    flag = 1;
! 			  }
! 			else if (strcasecmp (name, "ev") == 0)
! 			  {
! 			    cmpltr = 7;
! 			    flag = 1;
! 			  }
! 			else
! 			  as_bad (_("Invalid Add Condition: %s"), name);
! 			*s = c;
! 		      }
! 		  opcode |= cmpltr << 13;
! 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
  
! 		  /* Handle a non-negated compare/stubtract condition.  */
! 		  case 't':	/* nonneg cmp */
! 		    cmpltr = pa_parse_nonneg_cmpsub_cmpltr (&s, 1);
! 		    if (cmpltr < 0)
! 		      {
! 			as_bad (_("Invalid Compare/Subtract Condition: %c"), *s);
! 			cmpltr = 0;
! 		      }
! 		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
  
! 		  case 'T':	/* neg cmp */
! 		  case 'r':	/* 64 bit nonneg cmpb */
! 		  case 'R':	/* 64 bit neg cmpb */
! 		  case 'Q':	/* 64 bit cmpib */
! 		    abort();
! 
! 		  /* Handle a negated or non-negated compare/subtract condition.  */
! 		  case 'n':	/* cmp w/ nullify */
! 		    save_s = s;
! 		    cmpltr = pa_parse_nonneg_cmpsub_cmpltr (&s, 1);
! 		    if (cmpltr < 0)
! 		      {
! 			s = save_s;
! 			cmpltr = pa_parse_neg_cmpsub_cmpltr (&s, 1);
! 			if (cmpltr < 0)
! 			  {
! 			    as_bad (_("Invalid Compare/Subtract Condition."));
! 			    cmpltr = 0;
! 			  }
! 			else
! 			  {
! 			    /* Negated condition requires an opcode change.  */
! 			    opcode |= 1 << 27;
! 			  }
! 		      }
! 	    
! 		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
  
  
! 		    /* Handle a logical instruction condition.  */
! 		  case 'L':	/* 64 bit logical */
! 		    if (*s == ',' && *(s + 1) == '*')
! 		      {
! 			cond_64 = 1;
! 			s += 2;	/* Eat up the ,* */
! 		      }
! 		    else break;
! 		  case 'l':	/* 32 bit logical */
! 		    cmpltr = 0;
! 		    flag = 0;
! 		    if (*s == ',' || cond_64)
! 		      {
! 			if (!cond_64) s++;
! 			name = s;
! 			while (*s != ',' && *s != ' ' && *s != '\t')
! 			  s += 1;
! 			c = *s;
! 			*s = 0x00;
! 	    
! 	    
! 			if (strcmp (name, "=") == 0)
! 			  cmpltr = 1;
! 			else if (strcmp (name, "<") == 0)
! 			  cmpltr = 2;
! 			else if (strcmp (name, "<=") == 0)
! 			  cmpltr = 3;
! 			else if (strcasecmp (name, "od") == 0)
! 			  cmpltr = 7;
! 			else if (strcasecmp (name, "tr") == 0)
! 			  {
! 			    cmpltr = 0;
! 			    flag = 1;
! 			  }
! 			else if (strcmp (name, "<>") == 0)
! 			  {
! 			    cmpltr = 1;
! 			    flag = 1;
! 			  }
! 			else if (strcmp (name, ">=") == 0)
! 			  {
! 			    cmpltr = 2;
! 			    flag = 1;
! 			  }
! 			else if (strcmp (name, ">") == 0)
! 			  {
! 			    cmpltr = 3;
! 			    flag = 1;
! 			  }
! 			else if (strcasecmp (name, "ev") == 0)
! 			  {
! 			    cmpltr = 7;
! 			    flag = 1;
! 			  }
! 			else
! 			  as_bad (_("Invalid Logical Instruction Condition."));
! 			*s = c;
! 		      }
! 		    opcode |= cmpltr << 13;
! 		    INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
  
  
! 		    /* Handle a shift/extract/deposit condition.  */
! 		  case 'X':	/* 64 bit shift/extract/deposit */
! 		    if (*s == ',' && *(s + 1) == '*')
! 		      {
! 			cond_64 = 1;
! 			s += 2;	/* Eat up the ,* */
! 		      }
! 		    else break;
! 		  case 'x':	/* shift/extract/deposit */
! 		  case 'y':	/* shift/extract/deposit w/ nullify */
! 		    cmpltr = 0;
! 		    if (*s == ',')
! 		      {
! 			save_s = s++;
  
  
! 			name = s;
! 			while (*s != ',' && *s != ' ' && *s != '\t')
! 			  s += 1;
! 			c = *s;
! 			*s = 0x00;
! 			if (strcmp (name, "=") == 0)
! 			  cmpltr = 1;
! 			else if (strcmp (name, "<") == 0)
! 			  cmpltr = 2;
! 			else if (strcasecmp (name, "od") == 0)
! 			  cmpltr = 3;
! 			else if (strcasecmp (name, "tr") == 0)
! 			  cmpltr = 4;
! 			else if (strcmp (name, "<>") == 0)
! 			  cmpltr = 5;
! 			else if (strcmp (name, ">=") == 0)
! 			  cmpltr = 6;
! 			else if (strcasecmp (name, "ev") == 0)
! 			  cmpltr = 7;
! 			/* Handle movb,n.  Put things back the way they were.
! 			   This includes moving s back to where it started.  */
! 			else if (strcasecmp (name, "n") == 0 && *args == 'y')
! 			  {
! 			    *s = c;
! 			    s = save_s;
! 			    continue;
! 			  }
! 			else
! 			  as_bad (_("Invalid Shift/Extract/Deposit Condition."));
! 			*s = c;
! 		      }
! 		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
  
  
- 		    /* Handle a unit instruction condition.  */
- 		  case 'U':	/* 64 bit unit */
- 		    if (*s == ',' && *(s + 1) == '*')
- 		      {
- 			cond_64 = 1;
- 			s += 2;	/* Eat up the ,* */
- 		      }
- 		    else break;
- 		  case 'u':	/* unit */
- 		    cmpltr = 0;
- 		    flag = 0;
- 		    if (*s == ',' || cond_64)
- 		      {
- 			if (!cond_64) s++;
- 	    
- 	    
- 			if (strncasecmp (s, "sbz", 3) == 0)
- 			  {
- 			    cmpltr = 2;
- 			    s += 3;
- 			  }
- 			else if (strncasecmp (s, "shz", 3) == 0)
- 			  {
- 			    cmpltr = 3;
- 			    s += 3;
- 			  }
- 			else if (strncasecmp (s, "sdc", 3) == 0)
- 			  {
- 			    cmpltr = 4;
- 			    s += 3;
- 			  }
- 			else if (strncasecmp (s, "sbc", 3) == 0)
- 			  {
- 			    cmpltr = 6;
- 			    s += 3;
- 			  }
- 			else if (strncasecmp (s, "shc", 3) == 0)
- 			  {
- 			    cmpltr = 7;
- 			    s += 3;
- 			  }
- 			else if (strncasecmp (s, "tr", 2) == 0)
- 			  {
- 			    cmpltr = 0;
- 			    flag = 1;
- 			    s += 2;
- 			  }
- 			else if (strncasecmp (s, "nbz", 3) == 0)
- 			  {
- 			    cmpltr = 2;
- 			    flag = 1;
- 			    s += 3;
- 			  }
- 			else if (strncasecmp (s, "nhz", 3) == 0)
- 			  {
- 			    cmpltr = 3;
- 			    flag = 1;
- 			    s += 3;
- 			  }
- 			else if (strncasecmp (s, "ndc", 3) == 0)
- 			  {
- 			    cmpltr = 4;
- 			    flag = 1;
- 			    s += 3;
- 			  }
- 			else if (strncasecmp (s, "nbc", 3) == 0)
- 			  {
- 			    cmpltr = 6;
- 			    flag = 1;
- 			    s += 3;
- 			  }
- 			else if (strncasecmp (s, "nhc", 3) == 0)
- 			  {
- 			    cmpltr = 7;
- 			    flag = 1;
- 			    s += 3;
- 			  }
- 			else
- 			  as_bad (_("Invalid Unit Instruction Condition."));
- 		      }
- 		    opcode |= cmpltr << 13;
- 		    INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
  
! 		  default:
! 		    abort();
! 		  }
! 	      }
  
  
  	    /* Handle a system control completer.  */
  	    case 'Z':
--- 1714,2120 ----
  		INSERT_FIELD_AND_CONTINUE (opcode, a, 13);
  	      }
  
+ 	    /* Handle a non-negated compare/stubtract condition.  */
+ 	    case '<':
+ 	      cmpltr = pa_parse_nonneg_cmpsub_cmpltr (&s, 1);
+ 	      if (cmpltr < 0)
+ 		{
+ 		  as_bad (_("Invalid Compare/Subtract Condition: %c"), *s);
+ 		  cmpltr = 0;
+ 		}
+ 	      INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
  
! 	    /* Handle a negated or non-negated compare/subtract condition.  */
  	    case '?':
! 	      save_s = s;
! 	      cmpltr = pa_parse_nonneg_cmpsub_cmpltr (&s, 1);
! 	      if (cmpltr < 0)
! 		{
! 		  s = save_s;
! 		  cmpltr = pa_parse_neg_cmpsub_cmpltr (&s, 1);
! 		  if (cmpltr < 0)
! 		    {
! 		      as_bad (_("Invalid Compare/Subtract Condition."));
! 		      cmpltr = 0;
! 		    }
! 		  else
! 		    {
! 		      /* Negated condition requires an opcode change.  */
! 		      opcode |= 1 << 27;
! 		    }
! 		}
! 	
! 	      INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
  
! 	    /* Handle non-negated add condition.  */
! 	    case '!':
! 	      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);
  
! 	    /* Handle a negated or non-negated add condition.  */
! 	    case '@':
! 	      save_s = s;
! 	      cmpltr = pa_parse_nonneg_add_cmpltr (&s, 1);
! 	      if (cmpltr < 0)
! 		{
! 		  s = save_s;
! 		  cmpltr = pa_parse_neg_add_cmpltr (&s, 1);
! 		  if (cmpltr < 0)
! 		    {
! 		      as_bad (_("Invalid Compare/Subtract Condition"));
! 		      cmpltr = 0;
! 		    }
! 		  else
! 		    {
! 		      /* Negated condition requires an opcode change.  */
! 		      opcode |= 1 << 27;
! 		    }
! 		}
! 	      INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
  
+ 	    /* Handle a compare/subtract condition.  */
+ 	    case 'a':
+ 	      cmpltr = 0;
+ 	      flag = 0;
+ 	      if (*s == ',')
+ 		{
+ 		  s++;
+ 		  name = s;
+ 		  while (*s != ',' && *s != ' ' && *s != '\t')
+ 		    s += 1;
+ 		  c = *s;
+ 		  *s = 0x00;
+ 		  if (strcmp (name, "=") == 0)
+ 		    cmpltr = 1;
+ 		  else if (strcmp (name, "<") == 0)
+ 		    cmpltr = 2;
+ 		  else if (strcmp (name, "<=") == 0)
+ 		    cmpltr = 3;
+ 		  else if (strcasecmp (name, "<<") == 0)
+ 		    cmpltr = 4;
+ 		  else if (strcasecmp (name, "<<=") == 0)
+ 		    cmpltr = 5;
+ 		  else if (strcasecmp (name, "sv") == 0)
+ 		    cmpltr = 6;
+ 		  else if (strcasecmp (name, "od") == 0)
+ 		    cmpltr = 7;
+ 		  else if (strcasecmp (name, "tr") == 0)
+ 		    {
+ 		      cmpltr = 0;
+ 		      flag = 1;
+ 		    }
+ 		  else if (strcmp (name, "<>") == 0)
+ 		    {
+ 		      cmpltr = 1;
+ 		      flag = 1;
+ 		    }
+ 		  else if (strcmp (name, ">=") == 0)
+ 		    {
+ 		      cmpltr = 2;
+ 		      flag = 1;
+ 		    }
+ 		  else if (strcmp (name, ">") == 0)
+ 		    {
+ 		      cmpltr = 3;
+ 		      flag = 1;
+ 		    }
+ 		  else if (strcasecmp (name, ">>=") == 0)
+ 		    {
+ 		      cmpltr = 4;
+ 		      flag = 1;
+ 		    }
+ 		  else if (strcasecmp (name, ">>") == 0)
+ 		    {
+ 		      cmpltr = 5;
+ 		      flag = 1;
+ 		    }
+ 		  else if (strcasecmp (name, "nsv") == 0)
+ 		    {
+ 		      cmpltr = 6;
+ 		      flag = 1;
+ 		    }
+ 		  else if (strcasecmp (name, "ev") == 0)
+ 		    {
+ 		      cmpltr = 7;
+ 		      flag = 1;
+ 		    }
+ 		  else
+ 		    as_bad (_("Invalid Add Condition: %s"), name);
+ 		  *s = c;
+ 		}
+ 	      opcode |= cmpltr << 13;
+ 	      INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
  
! 	    /* Handle a non-negated add condition.  */
! 	    case 'd':
! 	      cmpltr = 0;
! 	      flag = 0;
! 	      if (*s == ',')
! 		{
! 		  s++;
! 		  name = s;
! 		  while (*s != ',' && *s != ' ' && *s != '\t')
! 		    s += 1;
! 		  c = *s;
! 		  *s = 0x00;
! 		  if (strcmp (name, "=") == 0)
! 		    cmpltr = 1;
! 		  else if (strcmp (name, "<") == 0)
! 		    cmpltr = 2;
! 		  else if (strcmp (name, "<=") == 0)
! 		    cmpltr = 3;
! 		  else if (strcasecmp (name, "nuv") == 0)
! 		    cmpltr = 4;
! 		  else if (strcasecmp (name, "znv") == 0)
! 		    cmpltr = 5;
! 		  else if (strcasecmp (name, "sv") == 0)
! 		    cmpltr = 6;
! 		  else if (strcasecmp (name, "od") == 0)
! 		    cmpltr = 7;
! 		  else if (strcasecmp (name, "tr") == 0)
! 		    {
! 		      cmpltr = 0;
! 		      flag = 1;
! 		    }
! 		  else if (strcmp (name, "<>") == 0)
! 		    {
! 		      cmpltr = 1;
! 		      flag = 1;
! 		    }
! 		  else if (strcmp (name, ">=") == 0)
! 		    {
! 		      cmpltr = 2;
! 		      flag = 1;
! 		    }
! 		  else if (strcmp (name, ">") == 0)
! 		    {
! 		      cmpltr = 3;
! 		      flag = 1;
! 		    }
! 		  else if (strcasecmp (name, "uv") == 0)
! 		    {
! 		      cmpltr = 4;
! 		      flag = 1;
! 		    }
! 		  else if (strcasecmp (name, "vnz") == 0)
! 		    {
! 		      cmpltr = 5;
! 		      flag = 1;
! 		    }
! 		  else if (strcasecmp (name, "nsv") == 0)
! 		    {
! 		      cmpltr = 6;
! 		      flag = 1;
! 		    }
! 		  else if (strcasecmp (name, "ev") == 0)
! 		    {
! 		      cmpltr = 7;
! 		      flag = 1;
! 		    }
! 		  else
! 		    as_bad (_("Invalid Add Condition: %s"), name);
! 		  *s = c;
! 		}
! 	      opcode |= cmpltr << 13;
! 	      INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
  
+ 	    /* HANDLE a logical instruction condition.  */
+ 	    case '&':
+ 	      cmpltr = 0;
+ 	      flag = 0;
+ 	      if (*s == ',')
+ 		{
+ 		  s++;
+ 		  name = s;
+ 		  while (*s != ',' && *s != ' ' && *s != '\t')
+ 		    s += 1;
+ 		  c = *s;
+ 		  *s = 0x00;
+ 
+ 
+ 		  if (strcmp (name, "=") == 0)
+ 		    cmpltr = 1;
+ 		  else if (strcmp (name, "<") == 0)
+ 		    cmpltr = 2;
+ 		  else if (strcmp (name, "<=") == 0)
+ 		    cmpltr = 3;
+ 		  else if (strcasecmp (name, "od") == 0)
+ 		    cmpltr = 7;
+ 		  else if (strcasecmp (name, "tr") == 0)
+ 		    {
+ 		      cmpltr = 0;
+ 		      flag = 1;
+ 		    }
+ 		  else if (strcmp (name, "<>") == 0)
+ 		    {
+ 		      cmpltr = 1;
+ 		      flag = 1;
+ 		    }
+ 		  else if (strcmp (name, ">=") == 0)
+ 		    {
+ 		      cmpltr = 2;
+ 		      flag = 1;
+ 		    }
+ 		  else if (strcmp (name, ">") == 0)
+ 		    {
+ 		      cmpltr = 3;
+ 		      flag = 1;
+ 		    }
+ 		  else if (strcasecmp (name, "ev") == 0)
+ 		    {
+ 		      cmpltr = 7;
+ 		      flag = 1;
+ 		    }
+ 		  else
+ 		    as_bad (_("Invalid Logical Instruction Condition."));
+ 		  *s = c;
+ 		}
+ 	      opcode |= cmpltr << 13;
+ 	      INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
  
! 	    /* Handle a unit instruction condition.  */
! 	    case 'U':
! 	      cmpltr = 0;
! 	      flag = 0;
! 	      if (*s == ',')
! 		{
! 		  s++;
  
  
! 		  if (strncasecmp (s, "sbz", 3) == 0)
! 		    {
! 		      cmpltr = 2;
! 		      s += 3;
! 		    }
! 		  else if (strncasecmp (s, "shz", 3) == 0)
! 		    {
! 		      cmpltr = 3;
! 		      s += 3;
! 		    }
! 		  else if (strncasecmp (s, "sdc", 3) == 0)
! 		    {
! 		      cmpltr = 4;
! 		      s += 3;
! 		    }
! 		  else if (strncasecmp (s, "sbc", 3) == 0)
! 		    {
! 		      cmpltr = 6;
! 		      s += 3;
! 		    }
! 		  else if (strncasecmp (s, "shc", 3) == 0)
! 		    {
! 		      cmpltr = 7;
! 		      s += 3;
! 		    }
! 		  else if (strncasecmp (s, "tr", 2) == 0)
! 		    {
! 		      cmpltr = 0;
! 		      flag = 1;
! 		      s += 2;
! 		    }
! 		  else if (strncasecmp (s, "nbz", 3) == 0)
! 		    {
! 		      cmpltr = 2;
! 		      flag = 1;
! 		      s += 3;
! 		    }
! 		  else if (strncasecmp (s, "nhz", 3) == 0)
! 		    {
! 		      cmpltr = 3;
! 		      flag = 1;
! 		      s += 3;
! 		    }
! 		  else if (strncasecmp (s, "ndc", 3) == 0)
! 		    {
! 		      cmpltr = 4;
! 		      flag = 1;
! 		      s += 3;
! 		    }
! 		  else if (strncasecmp (s, "nbc", 3) == 0)
! 		    {
! 		      cmpltr = 6;
! 		      flag = 1;
! 		      s += 3;
! 		    }
! 		  else if (strncasecmp (s, "nhc", 3) == 0)
! 		    {
! 		      cmpltr = 7;
! 		      flag = 1;
! 		      s += 3;
! 		    }
! 		  else
! 		    as_bad (_("Invalid Logical Instruction Condition."));
! 		}
! 	      opcode |= cmpltr << 13;
! 	      INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
  
+ 	    /* Handle a shift/extract/deposit condition.  */
+ 	    case '|':
+ 	    case '>':
+ 	      cmpltr = 0;
+ 	      if (*s == ',')
+ 		{
+ 		  save_s = s++;
  
  
! 		  name = s;
! 		  while (*s != ',' && *s != ' ' && *s != '\t')
! 		    s += 1;
! 		  c = *s;
! 		  *s = 0x00;
! 		  if (strcmp (name, "=") == 0)
! 		    cmpltr = 1;
! 		  else if (strcmp (name, "<") == 0)
! 		    cmpltr = 2;
! 		  else if (strcasecmp (name, "od") == 0)
! 		    cmpltr = 3;
! 		  else if (strcasecmp (name, "tr") == 0)
! 		    cmpltr = 4;
! 		  else if (strcmp (name, "<>") == 0)
! 		    cmpltr = 5;
! 		  else if (strcmp (name, ">=") == 0)
! 		    cmpltr = 6;
! 		  else if (strcasecmp (name, "ev") == 0)
! 		    cmpltr = 7;
! 		  /* Handle movb,n.  Put things back the way they were.
! 		     This includes moving s back to where it started.  */
! 		  else if (strcasecmp (name, "n") == 0 && *args == '|')
! 		    {
! 		      *s = c;
! 		      s = save_s;
! 		      continue;
! 		    }
! 		  else
! 		    as_bad (_("Invalid Shift/Extract/Deposit Condition."));
! 		  *s = c;
! 		}
! 	      INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
  
+ 	    /* Handle bvb and bb conditions.  */
+ 	    case '~':
+ 	      cmpltr = 0;
+ 	      if (*s == ',')
+ 		{
+ 		  s++;
+ 		  if (strncmp (s, "<", 1) == 0)
+ 		    {
+ 		      cmpltr = 0;
+ 		      s++;
+ 		    }
+ 		  else if (strncmp (s, ">=", 2) == 0)
+ 		    {
+ 		      cmpltr = 1;
+ 		      s += 2;
+ 		    }
+ 		  else
+ 		    as_bad (_("Invalid Bit Branch Condition: %c"), *s);
+ 		}
+ 	      INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 15);
  
  	    /* Handle a system control completer.  */
  	    case 'Z':
***************
*** 3652,3687 ****
  	{
  	  format = QUAD;
  	  *s += 5;
- 	}
-       else if (strncasecmp (*s, "w", 1) == 0)
- 	{
- 	  format = W;
- 	  *s += 2;
- 	}
-       else if (strncasecmp (*s, "dw", 2) == 0)
- 	{
- 	  format = DW;
- 	  *s += 3;
- 	}
-       else if (strncasecmp (*s, "qw", 2) == 0)
- 	{
- 	  format = QW;
- 	  *s += 3;
- 	}
-       else if (strncasecmp (*s, "uw", 2) == 0)
- 	{
- 	  format = UW;
- 	  *s += 3;
- 	}
-       else if (strncasecmp (*s, "udw", 3) == 0)
- 	{
- 	  format = UDW;
- 	  *s += 4;
- 	}
-       else if (strncasecmp (*s, "uqw", 3) == 0)
- 	{
- 	  format = UQW;
- 	  *s += 4;
  	}
        else
  	{
--- 3571,3576 ----
*** gas-src/include/opcode/hppa.h	Fri Jul  9 15:42:12 1999
--- orig/include/opcode/hppa.h	Wed Jul  7 17:32:08 1999
***************
*** 57,65 ****
     particular opcode in order for an instruction to be an instance
     of that opcode.
  
!    The args component is a string containing one character for each operand of
!    the instruction.  Characters used as a prefix allow any second character to 
!    be used without conflicting with the main operand characters.
  
     Bit positions in this description follow HP usage of lsb = 31,
     "at" is lsb of field.
--- 57,64 ----
     particular opcode in order for an instruction to be an instance
     of that opcode.
  
!    The args component is a string containing one character
!    for each operand of the instruction.
  
     Bit positions in this description follow HP usage of lsb = 31,
     "at" is lsb of field.
***************
*** 70,78 ****
  
     In the args field, the following characters are unused:
  
! 	' !"#$%&   *+- ./          :;< > @'
! 	'            M       U     [\]  '
! 	'a  d                      {|}~'
  
     Here are all the characters:
  
--- 69,77 ----
  
     In the args field, the following characters are unused:
  
! 	'  "#$%    *+- ./          :;    '
! 	'                          [\]  '
! 	'                          { } '
  
     Here are all the characters:
  
***************
*** 91,96 ****
--- 90,102 ----
     c    indexed load completer.
     C    short load and store completer.
     Y	Store Bytes Short completer
+    <    non-negated compare/subtract conditions.
+    a	compare/subtract conditions
+    d    non-negated add conditions
+    &    logical instruction conditions
+    U    unit instruction conditions
+    >    shift/extract/deposit conditions.
+    ~    bvb,bb conditions
     V    5 bit immediate value at 31
     i    11 bit immediate value at 31
     j    14 bit immediate value at 31
***************
*** 101,134 ****
     W    17 bit branch displacement (PC relative)
     z    17 bit branch displacement (just a number, not an address)
  
- Condition operands all have '?' as the prefix:
- 
-    ?f   Floating point compare conditions (encoded as 5 bits at 31)
- 
-    ?a	add conditions
-    ?A	64 bit add conditions
-    ?d	non-negated add conditions
-    ?@   add conditions followed by nullify
- 
-    ?s   compare/subtract conditions
-    ?S   64 bit compare/subtract conditions
-    ?t   non-negated compare/subtract conditions
-    ?n   compare/subtract conditions followed by nullify
- 
-    ?l   logical conditions
-    ?L   64 bit logical conditions
- 
-    ?b   branch on bit conditions
-    ?B   64 bit branch on bit conditions
- 
-    ?x   shift/extract/deposit conditions
-    ?X   64 bit shift/extract/deposit conditions
-    ?y   shift/extract/deposit conditions followed by nullify for conditional
-         branches
- 
-    ?u   unit conditions
-    ?U   64 bit unit conditions
- 
  Also these:
  
     p    5 bit shift count at 26 (to support the SHD instruction) encoded as
--- 107,112 ----
***************
*** 155,160 ****
--- 133,142 ----
     I    Source Floating Point Operand Format Completer encoded 1 bits at 20
  	(for 0xe format FP instructions)
     G    Destination Floating Point Operand Format Completer encoded 2 bits at 18
+    M    Floating-Point Compare Conditions (encoded as 5 bits at 31)
+    ?    non-negated/negated compare/subtract conditions.
+    @    non-negated/negated add conditions.
+    !    non-negated add conditions.
  
     s    2 bit space specifier at 17.
     b    register field at 10.
***************
*** 166,171 ****
--- 148,154 ----
     Q	5 bit immediate value at 10 (a bit position specified in
  	the bb instruction. It's the same as r above, except the
          value is in a different location)
+    |	shift/extract/deposit conditions when used in a conditional branch
  
  And these (PJH) for PA-89 F.P. registers and instructions:
  
***************
*** 180,186 ****
     8    5 bit register field at 20 (used in 'fmpyadd' and 'fmpysub')
     9    5 bit register field at 25 (used in 'fmpyadd' and 'fmpysub')
     H    Floating Point Operand Format at 26 for 'fmpyadd' and 'fmpysub'
!         (very similar to 'F') */
  
  
  /* List of characters not to put a space after.  Note that
--- 163,170 ----
     8    5 bit register field at 20 (used in 'fmpyadd' and 'fmpysub')
     9    5 bit register field at 25 (used in 'fmpyadd' and 'fmpysub')
     H    Floating Point Operand Format at 26 for 'fmpyadd' and 'fmpysub'
!         (very similar to 'F')
! */
  
  
  /* List of characters not to put a space after.  Note that
***************
*** 203,224 ****
  
  { "b",		0xe8000000, 0xffe0e000, "nW", pa10}, /* bl foo,r0 */
  { "ldi",	0x34000000, 0xffe0c000, "j,x", pa10},	/* ldo val(r0),r */
! { "comib", 	0x84000000, 0xfc000000, "?nn5,b,w", pa10}, /* comib{tf}*/
  /* This entry is for the disassembler only.  It will never be used by
     assembler.  */
! { "comib", 	0x8c000000, 0xfc000000, "?nn5,b,w", pa10}, /* comib{tf}*/
! { "comb",	0x80000000, 0xfc000000, "?nnx,b,w", pa10}, /* comb{tf} */
  /* This entry is for the disassembler only.  It will never be used by
     assembler.  */
! { "comb",	0x88000000, 0xfc000000, "?nnx,b,w", pa10}, /* comb{tf} */
! { "addb",	0xa0000000, 0xfc000000, "?@nx,b,w", pa10}, /* addb{tf} */
  /* This entry is for the disassembler only.  It will never be used by
     assembler.  */
! { "addb",	0xa8000000, 0xfc000000, "?@nx,b,w", pa10},
! { "addib",	0xa4000000, 0xfc000000, "?@n5,b,w", pa10}, /* addib{tf}*/
  /* This entry is for the disassembler only.  It will never be used by
     assembler.  */
! { "addib",	0xac000000, 0xfc000000, "?@n5,b,w", pa10}, /* addib{tf}*/
  { "nop",        0x08000240, 0xffffffff, "", pa10},      /* or 0,0,0 */
  { "copy",       0x08000240, 0xffe0ffe0, "x,t", pa10},   /* or r,0,t */
  { "mtsar",      0x01601840, 0xffe0ffff, "x", pa10}, /* mtctl r,cr11 */
--- 187,208 ----
  
  { "b",		0xe8000000, 0xffe0e000, "nW", pa10}, /* bl foo,r0 */
  { "ldi",	0x34000000, 0xffe0c000, "j,x", pa10},	/* ldo val(r0),r */
! { "comib", 	0x84000000, 0xfc000000, "?n5,b,w", pa10}, /* comib{tf}*/
  /* This entry is for the disassembler only.  It will never be used by
     assembler.  */
! { "comib", 	0x8c000000, 0xfc000000, "?n5,b,w", pa10}, /* comib{tf}*/
! { "comb",	0x80000000, 0xfc000000, "?nx,b,w", pa10}, /* comb{tf} */
  /* This entry is for the disassembler only.  It will never be used by
     assembler.  */
! { "comb",	0x88000000, 0xfc000000, "?nx,b,w", pa10}, /* comb{tf} */
! { "addb",	0xa0000000, 0xfc000000, "@nx,b,w", pa10}, /* addb{tf} */
  /* This entry is for the disassembler only.  It will never be used by
     assembler.  */
! { "addb",	0xa8000000, 0xfc000000, "@nx,b,w", pa10},
! { "addib",	0xa4000000, 0xfc000000, "@n5,b,w", pa10}, /* addib{tf}*/
  /* This entry is for the disassembler only.  It will never be used by
     assembler.  */
! { "addib",	0xac000000, 0xfc000000, "@n5,b,w", pa10}, /* addib{tf}*/
  { "nop",        0x08000240, 0xffffffff, "", pa10},      /* or 0,0,0 */
  { "copy",       0x08000240, 0xffe0ffe0, "x,t", pa10},   /* or r,0,t */
  { "mtsar",      0x01601840, 0xffe0ffff, "x", pa10}, /* mtctl r,cr11 */
***************
*** 281,366 ****
  { "bv",		0xe800c000, 0xfc00fffd, "n(b)", pa10},
  { "be",		0xe0000000, 0xfc000000, "nz(S,b)", pa10},
  { "ble",	0xe4000000, 0xfc000000, "nz(S,b)", pa10},
! { "movb",	0xc8000000, 0xfc000000, "?ynx,b,w", pa10},
! { "movib",	0xcc000000, 0xfc000000, "?yn5,b,w", pa10},
! { "combt",	0x80000000, 0xfc000000, "?tnx,b,w", pa10},
! { "combf",	0x88000000, 0xfc000000, "?tnx,b,w", pa10},
! { "comibt",	0x84000000, 0xfc000000, "?tn5,b,w", pa10},
! { "comibf",	0x8c000000, 0xfc000000, "?tn5,b,w", pa10},
! { "addbt",	0xa0000000, 0xfc000000, "?dnx,b,w", pa10},
! { "addbf",	0xa8000000, 0xfc000000, "?dnx,b,w", pa10},
! { "addibt",	0xa4000000, 0xfc000000, "?dn5,b,w", pa10},
! { "addibf",	0xac000000, 0xfc000000, "?dn5,b,w", pa10},
! { "bb",		0xc4004000, 0xfc004000, "?bnx,Q,w", pa10}, 
! { "bvb",	0xc0004000, 0xffe04000, "?bnx,w", pa10},
  { "clrbts",	0xe8004005, 0xffffffff, "", pa20},
  
  /* Computation Instructions */
  
! { "cmpclr",     0x080008a0, 0xfc000fe0, "?Sx,b,t", pa20},
! { "cmpclr",     0x08000880, 0xfc000fe0, "?sx,b,t", pa20},
! { "comclr",     0x08000880, 0xfc000fe0, "?sx,b,t", pa10},
! { "or",         0x08000260, 0xfc000fe0, "?Lx,b,t", pa20},
! { "or",         0x08000240, 0xfc000fe0, "?lx,b,t", pa10},
! { "xor",        0x080002a0, 0xfc000fe0, "?Lx,b,t", pa20},
! { "xor",        0x08000280, 0xfc000fe0, "?lx,b,t", pa10},
! { "and",        0x08000220, 0xfc000fe0, "?Lx,b,t", pa20},
! { "and",        0x08000200, 0xfc000fe0, "?lx,b,t", pa10},
! { "andcm",      0x08000020, 0xfc000fe0, "?Lx,b,t", pa20},
! { "andcm",      0x08000000, 0xfc000fe0, "?lx,b,t", pa10},
! { "uxor",       0x08000380, 0xfc000fe0, "?ux,b,t", pa10},
! { "uaddcm",     0x08000980, 0xfc000fe0, "?ux,b,t", pa10},
! { "uaddcmt",    0x080009c0, 0xfc000fe0, "?ux,b,t", pa10},
! { "dcor",       0x08000b80, 0xfc1f0fe0, "?ub,t",   pa10},
! { "idcor",      0x08000bc0, 0xfc1f0fe0, "?ub,t",   pa10},
! { "addi",       0xb4000000, 0xfc000800, "?ai,b,x", pa10},
! { "addio",      0xb4000800, 0xfc000800, "?ai,b,x", pa10},
! { "addit",      0xb0000000, 0xfc000800, "?ai,b,x", pa10},
! { "addito",     0xb0000800, 0xfc000800, "?ai,b,x", pa10},
! { "add",        0x08000620, 0xfc000fe0, "?Ax,b,t", pa20},
! { "add",        0x08000600, 0xfc000fe0, "?ax,b,t", pa10},
! { "addl",       0x08000a00, 0xfc000fe0, "?ax,b,t", pa10},
! { "addo",       0x08000e00, 0xfc000fe0, "?ax,b,t", pa10},
! { "addc",       0x08000700, 0xfc000fe0, "?ax,b,t", pa10},
! { "addco",      0x08000f00, 0xfc000fe0, "?ax,b,t", pa10},
! { "sub",        0x08000400, 0xfc000fe0, "?sx,b,t", pa10},
! { "subo",       0x08000c00, 0xfc000fe0, "?sx,b,t", pa10},
! { "subb",       0x08000500, 0xfc000fe0, "?sx,b,t", pa10},
! { "subbo",      0x08000d00, 0xfc000fe0, "?sx,b,t", pa10},
! { "subt",       0x080004c0, 0xfc000fe0, "?sx,b,t", pa10},
! { "subto",      0x08000cc0, 0xfc000fe0, "?sx,b,t", pa10},
! { "ds",         0x08000440, 0xfc000fe0, "?sx,b,t", pa10},
! { "subi",       0x94000000, 0xfc000800, "?si,b,x", pa10},
! { "subio",      0x94000800, 0xfc000800, "?si,b,x", pa10},
! { "cmpiclr",    0x90000800, 0xfc000800, "?Si,b,x", pa20},
! { "cmpiclr",    0x90000000, 0xfc000800, "?si,b,x", pa20},
! { "comiclr",    0x90000000, 0xfc000800, "?si,b,x", pa10},
! { "sh1add",     0x08000640, 0xfc000fe0, "?ax,b,t", pa10},
! { "sh1addl",    0x08000a40, 0xfc000fe0, "?ax,b,t", pa10},
! { "sh1addo",    0x08000e40, 0xfc000fe0, "?ax,b,t", pa10},
! { "sh2add",     0x08000680, 0xfc000fe0, "?ax,b,t", pa10},
! { "sh2addl",    0x08000a80, 0xfc000fe0, "?ax,b,t", pa10},
! { "sh2addo",    0x08000e80, 0xfc000fe0, "?ax,b,t", pa10},
! { "sh3add",     0x080006c0, 0xfc000fe0, "?ax,b,t", pa10},
! { "sh3addl",    0x08000ac0, 0xfc000fe0, "?ax,b,t", pa10},
! { "sh3addo",    0x08000ec0, 0xfc000fe0, "?ax,b,t", pa10},
  
  /* Extract and Deposit Instructions */
  
! { "vshd",       0xd0000000, 0xfc001fe0, "?xx,b,t", pa10},
! { "shd",        0xd0000800, 0xfc001c00, "?xx,b,p,t", pa10},
! { "vextru",     0xd0001000, 0xfc001fe0, "?xb,T,x", pa10},
! { "vextrs",     0xd0001400, 0xfc001fe0, "?xb,T,x", pa10},
! { "extru",      0xd0001800, 0xfc001c00, "?xb,P,T,x", pa10},
! { "extrs",      0xd0001c00, 0xfc001c00, "?xb,P,T,x", pa10},
! { "zvdep",      0xd4000000, 0xfc001fe0, "?xx,T,b", pa10},
! { "vdep",       0xd4000400, 0xfc001fe0, "?xx,T,b", pa10},
! { "zdep",       0xd4000800, 0xfc001c00, "?xx,p,T,b", pa10},
! { "dep",        0xd4000c00, 0xfc001c00, "?xx,p,T,b", pa10},
! { "zvdepi",     0xd4001000, 0xfc001fe0, "?x5,T,b", pa10},
! { "vdepi",      0xd4001400, 0xfc001fe0, "?x5,T,b", pa10},
! { "zdepi",      0xd4001800, 0xfc001c00, "?x5,p,T,b", pa10},
! { "depi",       0xd4001c00, 0xfc001c00, "?x5,p,T,b", pa10},
  
  /* System Control Instructions */
  
--- 265,341 ----
  { "bv",		0xe800c000, 0xfc00fffd, "n(b)", pa10},
  { "be",		0xe0000000, 0xfc000000, "nz(S,b)", pa10},
  { "ble",	0xe4000000, 0xfc000000, "nz(S,b)", pa10},
! { "movb",	0xc8000000, 0xfc000000, "|nx,b,w", pa10},
! { "movib",	0xcc000000, 0xfc000000, "|n5,b,w", pa10},
! { "combt",	0x80000000, 0xfc000000, "<nx,b,w", pa10},
! { "combf",	0x88000000, 0xfc000000, "<nx,b,w", pa10},
! { "comibt",	0x84000000, 0xfc000000, "<n5,b,w", pa10},
! { "comibf",	0x8c000000, 0xfc000000, "<n5,b,w", pa10},
! { "addbt",	0xa0000000, 0xfc000000, "!nx,b,w", pa10},
! { "addbf",	0xa8000000, 0xfc000000, "!nx,b,w", pa10},
! { "addibt",	0xa4000000, 0xfc000000, "!n5,b,w", pa10},
! { "addibf",	0xac000000, 0xfc000000, "!n5,b,w", pa10},
! { "bb",		0xc4004000, 0xfc004000, "~nx,Q,w", pa10}, 
! { "bvb",	0xc0004000, 0xffe04000, "~nx,w", pa10},
  { "clrbts",	0xe8004005, 0xffffffff, "", pa20},
  
  /* Computation Instructions */
  
! { "comclr",     0x08000880, 0xfc000fe0, "ax,b,t", pa10},
! { "or",         0x08000240, 0xfc000fe0, "&x,b,t", pa10},
! { "xor",        0x08000280, 0xfc000fe0, "&x,b,t", pa10},
! { "and",        0x08000200, 0xfc000fe0, "&x,b,t", pa10},
! { "andcm",      0x08000000, 0xfc000fe0, "&x,b,t", pa10},
! { "uxor",       0x08000380, 0xfc000fe0, "Ux,b,t", pa10},
! { "uaddcm",     0x08000980, 0xfc000fe0, "Ux,b,t", pa10},
! { "uaddcmt",    0x080009c0, 0xfc000fe0, "Ux,b,t", pa10},
! { "dcor",       0x08000b80, 0xfc1f0fe0, "Ub,t",   pa10},
! { "idcor",      0x08000bc0, 0xfc1f0fe0, "Ub,t",   pa10},
! { "addi",       0xb4000000, 0xfc000800, "di,b,x", pa10},
! { "addio",      0xb4000800, 0xfc000800, "di,b,x", pa10},
! { "addit",      0xb0000000, 0xfc000800, "di,b,x", pa10},
! { "addito",     0xb0000800, 0xfc000800, "di,b,x", pa10},
! { "add",        0x08000600, 0xfc000fe0, "dx,b,t", pa10},
! { "addl",       0x08000a00, 0xfc000fe0, "dx,b,t", pa10},
! { "addo",       0x08000e00, 0xfc000fe0, "dx,b,t", pa10},
! { "addc",       0x08000700, 0xfc000fe0, "dx,b,t", pa10},
! { "addco",      0x08000f00, 0xfc000fe0, "dx,b,t", pa10},
! { "sub",        0x08000400, 0xfc000fe0, "ax,b,t", pa10},
! { "subo",       0x08000c00, 0xfc000fe0, "ax,b,t", pa10},
! { "subb",       0x08000500, 0xfc000fe0, "ax,b,t", pa10},
! { "subbo",      0x08000d00, 0xfc000fe0, "ax,b,t", pa10},
! { "subt",       0x080004c0, 0xfc000fe0, "ax,b,t", pa10},
! { "subto",      0x08000cc0, 0xfc000fe0, "ax,b,t", pa10},
! { "ds",         0x08000440, 0xfc000fe0, "ax,b,t", pa10},
! { "subi",       0x94000000, 0xfc000800, "ai,b,x", pa10},
! { "subio",      0x94000800, 0xfc000800, "ai,b,x", pa10},
! { "comiclr",    0x90000000, 0xfc000800, "ai,b,x", pa10},
! { "sh1add",     0x08000640, 0xfc000fe0, "dx,b,t", pa10},
! { "sh1addl",    0x08000a40, 0xfc000fe0, "dx,b,t", pa10},
! { "sh1addo",    0x08000e40, 0xfc000fe0, "dx,b,t", pa10},
! { "sh2add",     0x08000680, 0xfc000fe0, "dx,b,t", pa10},
! { "sh2addl",    0x08000a80, 0xfc000fe0, "dx,b,t", pa10},
! { "sh2addo",    0x08000e80, 0xfc000fe0, "dx,b,t", pa10},
! { "sh3add",     0x080006c0, 0xfc000fe0, "dx,b,t", pa10},
! { "sh3addl",    0x08000ac0, 0xfc000fe0, "dx,b,t", pa10},
! { "sh3addo",    0x08000ec0, 0xfc000fe0, "dx,b,t", pa10},
  
  /* Extract and Deposit Instructions */
  
! { "vshd",       0xd0000000, 0xfc001fe0, ">x,b,t", pa10},
! { "shd",        0xd0000800, 0xfc001c00, ">x,b,p,t", pa10},
! { "vextru",     0xd0001000, 0xfc001fe0, ">b,T,x", pa10},
! { "vextrs",     0xd0001400, 0xfc001fe0, ">b,T,x", pa10},
! { "extru",      0xd0001800, 0xfc001c00, ">b,P,T,x", pa10},
! { "extrs",      0xd0001c00, 0xfc001c00, ">b,P,T,x", pa10},
! { "zvdep",      0xd4000000, 0xfc001fe0, ">x,T,b", pa10},
! { "vdep",       0xd4000400, 0xfc001fe0, ">x,T,b", pa10},
! { "zdep",       0xd4000800, 0xfc001c00, ">x,p,T,b", pa10},
! { "dep",        0xd4000c00, 0xfc001c00, ">x,p,T,b", pa10},
! { "zvdepi",     0xd4001000, 0xfc001fe0, ">5,T,b", pa10},
! { "vdepi",      0xd4001400, 0xfc001fe0, ">5,T,b", pa10},
! { "zdepi",      0xd4001800, 0xfc001c00, ">5,p,T,b", pa10},
! { "depi",       0xd4001c00, 0xfc001c00, ">5,p,T,b", pa10},
  
  /* System Control Instructions */
  
*** gas-src/opcodes/hppa-dis.c	Fri Jul  9 15:17:37 1999
--- orig/opcodes/hppa-dis.c	Wed Jul  7 17:32:17 1999
***************
*** 67,109 ****
  };
  
  static const char compare_cond_names[][5] = {
!   "", ",=", ",<", ",<=", ",<<", ",<<=", ",sv", ",od",
!   ",tr", ",<>", ",>=", ",>", ",>>=", ",>>", ",nsv", ",ev"
! };
! static const char compare_cond_64_names[][6] = {
!   ",*", ",*=", ",*<", ",*<=", ",*<<", ",*<<=", ",*sv", ",*od", 
!   ",*tr", ",*<>", ",*>=", ",*>", ",*>>=", ",*>>", ",*nsv", ",*ev"
  };
  static const char add_cond_names[][5] = {
!   "", ",=", ",<", ",<=", ",nuv", ",znv", ",sv", ",od",
!   ",tr", ",<>", ",>=", ",>", ",uv", ",vnz", ",nsv", ",ev"
! };
! static const char add_cond_64_names[][6] = {
!   ",*", ",*=", ",*<", ",*<=", ",*nuv", ",*znv", ",*sv", ",*od",
!   ",*tr", ",*<>", ",*>=", ",*>", ",*uv", ",*vnz", ",*nsv", ",*ev"
  };
  static const char *const logical_cond_names[] = {
    "", ",=", ",<", ",<=", 0, 0, 0, ",od",
!   ",tr", ",<>", ",>=", ",>", 0, 0, 0, ",ev"
! };
! static const char *const logical_cond_64_names[] = {
!   ",*", ",*=", ",*<", ",*<=", 0, 0, 0, ",*od",
!   ",*tr", ",*<>", ",*>=", ",*>", 0, 0, 0, ",*ev"
! };
  static const char *const unit_cond_names[] = {
    "", 0, ",sbz", ",shz", ",sdc", 0, ",sbc", ",shc",
    ",tr", 0, ",nbz", ",nhz", ",ndc", 0, ",nbc", ",nhc"
  };
- static const char *const unit_cond_64_names[] = {
-   ",*", ",*swz", ",*sbz", ",*shz", ",*sdc", ",*swc", ",*sbc", ",*shc",
-   ",*tr", ",*nwz", ",*nbz", ",*nhz", ",*ndc", ",*nwc", ",*nbc", ",*nhc"
- };
  static const char shift_cond_names[][4] = {
    "", ",=", ",<", ",od", ",tr", ",<>", ",>=", ",ev"
  };
- static const char shift_cond_64_names[][5] = {
-   ",*", ",*=", ",*<", ",*od", ",*tr", ",*<>", ",*>=", ",*ev"
- };
  static const char index_compl_names[][4] = {"", ",m", ",s", ",sm"};
  static const char short_ldst_compl_names[][4] = {"", ",ma", "", ",mb"};
  static const char *const short_bytes_compl_names[] = {
--- 67,91 ----
  };
  
  static const char compare_cond_names[][5] = {
!   "", ",=", ",<", ",<=", ",<<", ",<<=", ",sv",
!   ",od", ",tr", ",<>", ",>=", ",>", ",>>=",
!   ",>>", ",nsv", ",ev"
  };
  static const char add_cond_names[][5] = {
!   "", ",=", ",<", ",<=", ",nuv", ",znv", ",sv",
!   ",od", ",tr", ",<>", ",>=", ",>", ",uv",
!   ",vnz", ",nsv", ",ev"
  };
  static const char *const logical_cond_names[] = {
    "", ",=", ",<", ",<=", 0, 0, 0, ",od",
!   ",tr", ",<>", ",>=", ",>", 0, 0, 0, ",ev"};
  static const char *const unit_cond_names[] = {
    "", 0, ",sbz", ",shz", ",sdc", 0, ",sbc", ",shc",
    ",tr", 0, ",nbz", ",nhz", ",ndc", 0, ",nbc", ",nhc"
  };
  static const char shift_cond_names[][4] = {
    "", ",=", ",<", ",od", ",tr", ",<>", ",>=", ",ev"
  };
  static const char index_compl_names[][4] = {"", ",m", ",s", ",sm"};
  static const char short_ldst_compl_names[][4] = {"", ",ma", "", ",mb"};
  static const char *const short_bytes_compl_names[] = {
***************
*** 323,329 ****
  	  
  	  (*info->fprintf_func) (info->stream, "%s", opcode->name);
  
! 	  if (!strchr ("*cfCY<?!@-+&U>~nHNZFIMadu|", opcode->args[0]))
  	    (*info->fprintf_func) (info->stream, " ");
  	  for (s = opcode->args; *s != '\0'; ++s)
  	    {
--- 305,311 ----
  	  
  	  (*info->fprintf_func) (info->stream, "%s", opcode->name);
  
! 	  if (!strchr ("cfCY<?!@-+&U>~nHNZFIMadu|", opcode->args[0]))
  	    (*info->fprintf_func) (info->stream, " ");
  	  for (s = opcode->args; *s != '\0'; ++s)
  	    {
***************
*** 424,503 ****
  		  (*info->fprintf_func) (info->stream, "%s ",
  				    short_bytes_compl_names[GET_COMPL (insn)]);
  		  break;
! 
! 		  /* Handle conditions */
  		case '?':
! 		  {
! 		    s++;
! 		    switch (*s)
! 		      {
! 			/* these four conditions are for the set of instructions
! 			   which distinguish true/false conditions by opcode rather
! 			   than by the 'f' bit (sigh): comb, comib, addb, addib */
! 		      case 't':
! 			fputs_filtered (compare_cond_names[GET_FIELD (insn, 16, 18)],
! 					info);
! 			break;
! 		      case 'n':
! 			fputs_filtered (compare_cond_names[GET_FIELD (insn, 16, 18)
! 							  + GET_FIELD (insn, 4, 4) * 8], info);
! 			break;
! 		      case '@':
! 			fputs_filtered (add_cond_names[GET_FIELD (insn, 16, 18)
! 						      + GET_FIELD (insn, 4, 4) * 8], info);
! 			break;
! 		      case 's':
! 			(*info->fprintf_func) (info->stream, "%s ",
! 					       compare_cond_names[GET_COND (insn)]);
! 			break;
! 		      case 'S':
! 			(*info->fprintf_func) (info->stream, "%s ",
! 					       compare_cond_64_names[GET_COND (insn)]);
! 			break;
! 		      case 'a':
! 			(*info->fprintf_func) (info->stream, "%s ",
! 					       add_cond_names[GET_COND (insn)]);
! 			break;
! 		      case 'A':
! 			(*info->fprintf_func) (info->stream, "%s ",
! 					       add_cond_64_names[GET_COND (insn)]);
! 			break;
! 		      case 'd':
! 			(*info->fprintf_func) (info->stream, "%s",
! 					       add_cond_names[GET_FIELD (insn, 16, 18)]);
! 			break;
! 
! 		      case 'l':
! 			(*info->fprintf_func) (info->stream, "%s ",
! 					       logical_cond_names[GET_COND (insn)]);
! 			break;
! 		      case 'L':
! 			(*info->fprintf_func) (info->stream, "%s ",
! 					       logical_cond_64_names[GET_COND (insn)]);
! 			break;
! 		      case 'u':
! 			(*info->fprintf_func) (info->stream, "%s ",
! 					       unit_cond_names[GET_COND (insn)]);
! 			break;
! 		      case 'U':
! 			(*info->fprintf_func) (info->stream, "%s ",
! 					       unit_cond_64_names[GET_COND (insn)]);
! 			break;
! 		      case 'y':
! 		      case 'x':
! 		      case 'b':
! 			(*info->fprintf_func)
! 			  (info->stream, "%s",
! 			   shift_cond_names[GET_FIELD (insn, 16, 18)]);
! 
! 			/* If the next character in args is 'n', it will handle
! 			   putting out the space.  */
! 			if (s[1] != 'n')
! 			  (*info->fprintf_func) (info->stream, " ");
! 			break;
! 		      }
! 		    break;
! 		  }
  		case 'V':
  		  fput_const (extract_5_store (insn), info);
  		  break;
--- 406,459 ----
  		  (*info->fprintf_func) (info->stream, "%s ",
  				    short_bytes_compl_names[GET_COMPL (insn)]);
  		  break;
! 		/* these four conditions are for the set of instructions
! 		   which distinguish true/false conditions by opcode rather
! 		   than by the 'f' bit (sigh): comb, comib, addb, addib */
! 		case '<':
! 		  fputs_filtered (compare_cond_names[GET_FIELD (insn, 16, 18)],
! 				  info);
! 		  break;
  		case '?':
! 		  fputs_filtered (compare_cond_names[GET_FIELD (insn, 16, 18)
! 				  + GET_FIELD (insn, 4, 4) * 8], info);
! 		  break;
! 		case '@':
! 		  fputs_filtered (add_cond_names[GET_FIELD (insn, 16, 18)
! 				  + GET_FIELD (insn, 4, 4) * 8], info);
! 		  break;
! 		case 'a':
! 		  (*info->fprintf_func) (info->stream, "%s ",
! 					 compare_cond_names[GET_COND (insn)]);
! 		  break;
! 		case 'd':
! 		  (*info->fprintf_func) (info->stream, "%s ",
! 					 add_cond_names[GET_COND (insn)]);
! 		  break;
! 		case '!':
! 		  (*info->fprintf_func) (info->stream, "%s",
! 				    add_cond_names[GET_FIELD (insn, 16, 18)]);
! 		  break;
! 
! 		case '&':
! 		  (*info->fprintf_func) (info->stream, "%s ",
! 				    logical_cond_names[GET_COND (insn)]);
! 		  break;
! 		case 'U':
! 		  (*info->fprintf_func) (info->stream, "%s ",
! 				    unit_cond_names[GET_COND (insn)]);
! 		  break;
! 		case '|':
! 		case '>':
! 		case '~':
! 		  (*info->fprintf_func)
! 		    (info->stream, "%s",
! 		     shift_cond_names[GET_FIELD (insn, 16, 18)]);
! 
! 		  /* If the next character in args is 'n', it will handle
! 		     putting out the space.  */
! 		  if (s[1] != 'n')
! 		    (*info->fprintf_func) (info->stream, " ");
! 		  break;
  		case 'V':
  		  fput_const (extract_5_store (insn), info);
  		  break;



More information about the Binutils mailing list