else if (x & ABSMOV) {  do_a_fix_imm (output - frag_now->fr_literal + immat, operand + i, 1); }
build_bytes (this_try, operand)     struct h8_opcode *this_try;     struct h8_op *operand;{  unsigned int i;  char *output = frag_more (this_try->length);  op_type *nibble_ptr = this_try->data.nib;  op_type c;  unsigned int nibble_count = 0;  int absat;  int immat;  int nib;  char asnibbles[30];  char *p = asnibbles;  if (!(this_try->inbase || Hmode))    {      as_warn ("Opcode `%s' only available in this mode on H8/300-H",	       this_try->name);    }  while (*nibble_ptr != E)    {      int d;      c = *nibble_ptr++;      d = (c & DST) != 0;      if (c < 16)	{	  nib = c;	}      else	{	  if (c & (REG | IND | INC | DEC))	    {	      nib = operand[d].reg;	    }	  else if ((c & DISPREG) == (DISPREG))	    {	      nib = dispreg;	    }	  else if (c & ABSMOV)	    {	      operand[d].mode &= ~ABS;	      operand[d].mode |= ABSMOV;	      immat = nibble_count / 2;	      nib = 0;	    }	  else if (c &  ABS )	    {	      operand[d].mode = c;	      absat = nibble_count / 2;	      nib = 0;	    }	  else if (c & (IMM | PCREL | ABS | ABSJMP | DISP))	    {	      operand[d].mode = c;	      immat = nibble_count / 2;	      nib = 0;	    }	  else if (c & IGNORE)	    {	      nib = 0;	    }	  else if (c & DBIT)	    {	      switch (operand[0].exp.X_add_number)		{		case 1:		  nib = c;		  break;		case 2:		  nib = 0x8 | c;		  break;		default:		  as_bad ("Need #1 or #2 here");		}	    }	  else if (c & KBIT)	    {	      switch (operand[0].exp.X_add_number)		{		case 1:		  nib = 0;		  break;		case 2:		  nib = 8;		  break;		case 4:		  if (!Hmode)		    as_warn ("#4 only valid in h8/300 mode.");		  nib = 9;		  break;		default:		  as_bad ("Need #1 or #2 here");		  break;		}	      /* stop it making a fix */	      operand[0].mode = 0;	    }	  if (c & B31)	    {	      nib |= 0x8;	    }	}      nibble_count++;      *p++ = nib;    }  for (i = 0; i < this_try->length; i++)    {      output[i] = (asnibbles[i * 2] << 4) | asnibbles[i * 2 + 1];    }  /* output any fixes */  for (i = 0; i < 2; i++)    {      int x = operand[i].mode;      if (x & (IMM | DISP))	{	  do_a_fix_imm (output - frag_now->fr_literal + immat, operand + i, 0);	}      else if (x & ABS)	{	  do_a_fix_imm (output - frag_now->fr_literal + absat, operand + i, 0);	}      else if (x & PCREL)	{	  int size16 = x & L_16;	  int where = size16 ? 2 : 1;	  int size = size16 ? 2 : 1;	  int type = size16 ? R_PCRWORD : R_PCRBYTE;	  check_operand (operand + i, size16 ? 0x7fff : 0x7f, "@");	  if (operand[i].exp.X_add_number & 1)	    {	      as_warn ("branch operand has odd offset (%lx)\n",		       (unsigned long) operand->exp.X_add_number);	    }	  operand[i].exp.X_add_number =	    (char) (operand[i].exp.X_add_number - 1);	  fix_new_exp (frag_now,		       output - frag_now->fr_literal + where,		       size,		       &operand[i].exp,		       1,		       type);	}      else if (x & MEMIND)	{	  check_operand (operand + i, 0xff, "@@");	  fix_new_exp (frag_now,		       output - frag_now->fr_literal + 1,		       1,		       &operand[i].exp,		       0,		       R_RELBYTE);	}      else if (x & ABSMOV)	{	  /* This mov is either absolute long or thru a memory loc */	  do_a_fix_imm (output - frag_now->fr_literal + immat, operand + i, 1);	}      else if (x & ABSJMP)	{	  /* This jmp may be a jump or a branch */	  check_operand (operand + i, Hmode ? 0xffffff : 0xffff, "@");	  if (operand[i].exp.X_add_number & 1)	    {	      as_warn ("branch operand has odd offset (%lx)\n",		       (unsigned long) operand->exp.X_add_number);	    }	  if (!Hmode)	    operand[i].exp.X_add_number = (short) operand[i].exp.X_add_number;	  fix_new_exp (frag_now,		       output - frag_now->fr_literal,		       4,		       &operand[i].exp,		       0,		       R_JMPL1);	}    }}