else if (((ep->X_add_number &~ (offsetT) 0x7fffffff) == 0 || ((ep->X_add_number &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff)) && (! dbl || ! ep->X_unsigned || sizeof (ep->X_add_number) > 4 || (ep->X_add_number & 0x80000000) == 0))
else if ((((ep->X_add_number &~ (offsetT) 0x7fffffff) == 0 || ((ep->X_add_number &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff)) && (! dbl || ! ep->X_unsigned || sizeof (ep->X_add_number) > 4 || (ep->X_add_number & 0x80000000) == 0)) || (mips_isa < 3 && (ep->X_add_number &~ 0xffffffff) == 0))
load_register (counter, reg, ep, dbl)     int *counter;     int reg;     expressionS *ep;     int dbl;{  int shift, freg;  expressionS hi32, lo32, tmp;  if (ep->X_op != O_big)    {      assert (ep->X_op == O_constant);      if (ep->X_add_number < 0x8000	  && (ep->X_add_number >= 0	      || (ep->X_add_number >= -0x8000		  && (! dbl		      || ! ep->X_unsigned		      || sizeof (ep->X_add_number) > 4))))	{	  /* We can handle 16 bit signed values with an addiu to	     $zero.  No need to ever use daddiu here, since $zero and	     the result are always correct in 32 bit mode.  */	  macro_build ((char *) NULL, counter, ep, "addiu", "t,r,j", reg, 0,		       (int) BFD_RELOC_LO16);	  return;	}      else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)	{	  /* We can handle 16 bit unsigned values with an ori to             $zero.  */	  macro_build ((char *) NULL, counter, ep, "ori", "t,r,i", reg, 0,		       (int) BFD_RELOC_LO16);	  return;	}      else if (((ep->X_add_number &~ (offsetT) 0x7fffffff) == 0		|| ((ep->X_add_number &~ (offsetT) 0x7fffffff)		    == ~ (offsetT) 0x7fffffff))	       && (! dbl		   || ! ep->X_unsigned		   || sizeof (ep->X_add_number) > 4		   || (ep->X_add_number & 0x80000000) == 0))	{	  /* 32 bit values require an lui.  */	  macro_build ((char *) NULL, counter, ep, "lui", "t,u", reg,		       (int) BFD_RELOC_HI16);	  if ((ep->X_add_number & 0xffff) != 0)	    macro_build ((char *) NULL, counter, ep, "ori", "t,r,i", reg, reg,			 (int) BFD_RELOC_LO16);	  return;	}      else	{	  /* 32 bit value with high bit set being loaded into a 64 bit             register.  We can't use lui, because that would             incorrectly set the 32 high bits.  */	  generic_bignum[3] = 0;	  generic_bignum[2] = 0;	  generic_bignum[1] = (ep->X_add_number >> 16) & 0xffff;	  generic_bignum[0] = ep->X_add_number & 0xffff;	  tmp.X_op = O_big;	  tmp.X_add_number = 4;	  ep = &tmp;	}    }  /* The value is larger than 32 bits.  */  if (mips_isa < 3)    {      as_bad ("Number larger than 32 bits");      macro_build ((char *) NULL, counter, ep, "addiu", "t,r,j", reg, 0,		   (int) BFD_RELOC_LO16);      return;    }  if (ep->X_op != O_big)    {      hi32 = *ep;      shift = 32;      hi32.X_add_number >>= shift;      hi32.X_add_number &= 0xffffffff;      if ((hi32.X_add_number & 0x80000000) != 0)	hi32.X_add_number |= ~ (offsetT) 0xffffffff;      lo32 = *ep;      lo32.X_add_number &= 0xffffffff;    }  else    {      assert (ep->X_add_number > 2);      if (ep->X_add_number == 3)	generic_bignum[3] = 0;      else if (ep->X_add_number > 4)	as_bad ("Number larger than 64 bits");      lo32.X_op = O_constant;      lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);      hi32.X_op = O_constant;      hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);    }  if (hi32.X_add_number == 0)    freg = 0;  else    {      load_register (counter, reg, &hi32, 0);      freg = reg;    }  if ((lo32.X_add_number & 0xffff0000) == 0)    {      if (freg != 0)	{	  macro_build ((char *) NULL, counter, NULL, "dsll32", "d,w,<", reg,		       freg, 0);	  freg = reg;	}    }  else    {      expressionS mid16;      if (freg != 0)	{	  macro_build ((char *) NULL, counter, NULL, "dsll", "d,w,<", reg,		       freg, 16);	  freg = reg;	}      mid16 = lo32;      mid16.X_add_number >>= 16;      macro_build ((char *) NULL, counter, &mid16, "ori", "t,r,i", reg,		   freg, (int) BFD_RELOC_LO16);      macro_build ((char *) NULL, counter, NULL, "dsll", "d,w,<", reg,		   reg, 16);      freg = reg;    }  if ((lo32.X_add_number & 0xffff) != 0)    macro_build ((char *) NULL, counter, &lo32, "ori", "t,r,i", reg, freg,		 (int) BFD_RELOC_LO16);}