* config/tc-mips.c (macro_build): Remove place and counter arguments.
authorRichard Sandiford <rdsandiford@googlemail.com>
Fri, 23 Jan 2004 13:02:28 +0000 (13:02 +0000)
committerRichard Sandiford <rdsandiford@googlemail.com>
Fri, 23 Jan 2004 13:02:28 +0000 (13:02 +0000)
(mips_build_lui, macro_build_ldst_constoffset): Likewise.
(mips16_macro_build, macro_build_jalr): Remove counter argument.
(set_at, load_register, load_address, move_register): Likewise.
(load_got_offset, add_got_offset): Likewise.
Update all calls and tidy accordingly.

gas/ChangeLog
gas/config/tc-mips.c

index 1c0b33ea1f0be630e4ed84833ff93edeeb4edc30..987aa69a9c5ab407499e66bf27ab884c266606c2 100644 (file)
@@ -1,3 +1,12 @@
+2004-01-23  Richard Sandiford  <rsandifo@redhat.com>
+
+       * config/tc-mips.c (macro_build): Remove place and counter arguments.
+       (mips_build_lui, macro_build_ldst_constoffset): Likewise.
+       (mips16_macro_build, macro_build_jalr): Remove counter argument.
+       (set_at, load_register, load_address, move_register): Likewise.
+       (load_got_offset, add_got_offset): Likewise.
+       Update all calls and tidy accordingly.
+
 2004-01-23  Richard Sandiford  <rsandifo@redhat.com>
 
        * config/tc-mips.c (RELAX_ENCODE): Remove WARN argument.
index 7ac580b2258725f62286cd05d47c15a6ff57efe4..e965adf90e915c9ad8011a6ed06aeb76128abb88 100644 (file)
@@ -850,8 +850,8 @@ static void append_insn
   (struct mips_cl_insn *ip, expressionS *p, bfd_reloc_code_real_type *r);
 static void mips_no_prev_insn (int);
 static void mips16_macro_build
-  (int *, expressionS *, const char *, const char *, va_list);
-static void load_register (int *, int, expressionS *, int);
+  (expressionS *, const char *, const char *, va_list);
+static void load_register (int, expressionS *, int);
 static void macro_start (void);
 static void macro_end (void);
 static void macro (struct mips_cl_insn * ip);
@@ -2959,8 +2959,7 @@ macro_end (void)
    string, and corresponding arguments.  */
 
 static void
-macro_build (char *place ATTRIBUTE_UNUSED, int *counter,
-            expressionS *ep, const char *name, const char *fmt, ...)
+macro_build (expressionS *ep, const char *name, const char *fmt, ...)
 {
   struct mips_cl_insn insn;
   bfd_reloc_code_real_type r[3];
@@ -2970,7 +2969,7 @@ macro_build (char *place ATTRIBUTE_UNUSED, int *counter,
 
   if (mips_opts.mips16)
     {
-      mips16_macro_build (counter, ep, name, fmt, args);
+      mips16_macro_build (ep, name, fmt, args);
       va_end (args);
       return;
     }
@@ -3188,8 +3187,7 @@ macro_build (char *place ATTRIBUTE_UNUSED, int *counter,
 }
 
 static void
-mips16_macro_build (int *counter ATTRIBUTE_UNUSED,
-                   expressionS *ep, const char *name, const char *fmt,
+mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
                    va_list args)
 {
   struct mips_cl_insn insn;
@@ -3314,7 +3312,7 @@ mips16_macro_build (int *counter ATTRIBUTE_UNUSED,
  * function.  This occurs in NewABI PIC code.
  */
 static void
-macro_build_jalr (int icnt, expressionS *ep)
+macro_build_jalr (expressionS *ep)
 {
   char *f = NULL;
 
@@ -3323,7 +3321,7 @@ macro_build_jalr (int icnt, expressionS *ep)
       frag_grow (8);
       f = frag_more (0);
     }
-  macro_build (NULL, &icnt, NULL, "jalr", "d,s", RA, PIC_CALL_REG);
+  macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
   if (HAVE_NEWABI)
     fix_new_exp (frag_now, f - frag_now->fr_literal,
                 4, ep, FALSE, BFD_RELOC_MIPS_JALR);
@@ -3333,8 +3331,7 @@ macro_build_jalr (int icnt, expressionS *ep)
  * Generate a "lui" instruction.
  */
 static void
-macro_build_lui (char *place ATTRIBUTE_UNUSED, int *counter ATTRIBUTE_UNUSED,
-                expressionS *ep, int regnum)
+macro_build_lui (expressionS *ep, int regnum)
 {
   expressionS high_expr;
   struct mips_cl_insn insn;
@@ -3383,8 +3380,8 @@ macro_build_lui (char *place ATTRIBUTE_UNUSED, int *counter ATTRIBUTE_UNUSED,
    offset off of a base register (breg) into/from a target register (treg),
    using AT if necessary.  */
 static void
-macro_build_ldst_constoffset (char *place, int *counter, expressionS *ep,
-                             const char *op, int treg, int breg, int dbl)
+macro_build_ldst_constoffset (expressionS *ep, const char *op,
+                             int treg, int breg, int dbl)
 {
   assert (ep->X_op == O_constant);
 
@@ -3406,8 +3403,7 @@ macro_build_ldst_constoffset (char *place, int *counter, expressionS *ep,
   if (IS_SEXT_16BIT_NUM(ep->X_add_number))
     {
       /* Signed 16-bit offset will fit in the op.  Easy!  */
-      macro_build (place, counter, ep, op, "t,o(b)", treg, BFD_RELOC_LO16,
-                  breg);
+      macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
     }
   else
     {
@@ -3416,15 +3412,9 @@ macro_build_ldst_constoffset (char *place, int *counter, expressionS *ep,
           addu     $tempreg,$tempreg,$breg
            <op>     $treg,const_lo($tempreg)   (BFD_RELOC_LO16)
          to handle the complete offset.  */
-      macro_build_lui (place, counter, ep, AT);
-      if (place != NULL)
-       place += 4;
-      macro_build (place, counter, NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT,
-                  breg);
-      if (place != NULL)
-       place += 4;
-      macro_build (place, counter, ep, op, "t,o(b)", treg, BFD_RELOC_LO16,
-                  AT);
+      macro_build_lui (ep, AT);
+      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
+      macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
 
       if (mips_opts.noat)
        as_warn (_("Macro used $at after \".set noat\""));
@@ -3436,18 +3426,17 @@ macro_build_ldst_constoffset (char *place, int *counter, expressionS *ep,
  * if reg is less than the immediate expression.
  */
 static void
-set_at (int *counter, int reg, int unsignedp)
+set_at (int reg, int unsignedp)
 {
   if (imm_expr.X_op == O_constant
       && imm_expr.X_add_number >= -0x8000
       && imm_expr.X_add_number < 0x8000)
-    macro_build (NULL, counter, &imm_expr, unsignedp ? "sltiu" : "slti",
-                "t,r,j", AT, reg, BFD_RELOC_LO16);
+    macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
+                AT, reg, BFD_RELOC_LO16);
   else
     {
-      load_register (counter, AT, &imm_expr, HAVE_64BIT_GPRS);
-      macro_build (NULL, counter, NULL, unsignedp ? "sltu" : "slt",
-                  "d,v,t", AT, reg, AT);
+      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
+      macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
     }
 }
 
@@ -3553,7 +3542,7 @@ check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
  *  an absolute expression value into a register.
  */
 static void
-load_register (int *counter, int reg, expressionS *ep, int dbl)
+load_register (int reg, expressionS *ep, int dbl)
 {
   int freg;
   expressionS hi32, lo32;
@@ -3578,25 +3567,22 @@ load_register (int *counter, int reg, expressionS *ep, int dbl)
          /* 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 (NULL, counter, ep, "addiu", "t,r,j", reg, 0,
-                      BFD_RELOC_LO16);
+         macro_build (ep, "addiu", "t,r,j", reg, 0, 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 (NULL, counter, ep, "ori", "t,r,i", reg, 0,
-                      BFD_RELOC_LO16);
+         macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
          return;
        }
       else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
        {
          /* 32 bit values require an lui.  */
-         macro_build (NULL, counter, ep, "lui", "t,u", reg, BFD_RELOC_HI16);
+         macro_build (ep, "lui", "t,u", reg, BFD_RELOC_HI16);
          if ((ep->X_add_number & 0xffff) != 0)
-           macro_build (NULL, counter, ep, "ori", "t,r,i", reg, reg,
-                        BFD_RELOC_LO16);
+           macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
          return;
        }
     }
@@ -3607,8 +3593,7 @@ load_register (int *counter, int reg, expressionS *ep, int dbl)
     {
       as_bad (_("Number (0x%lx) larger than 32 bits"),
              (unsigned long) ep->X_add_number);
-      macro_build (NULL, counter, ep, "addiu", "t,r,j", reg, 0,
-                  BFD_RELOC_LO16);
+      macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
       return;
     }
 
@@ -3645,17 +3630,14 @@ load_register (int *counter, int reg, expressionS *ep, int dbl)
        {
          if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
            {
-             macro_build (NULL, counter, &lo32, "addiu", "t,r,j", reg, 0,
-                          BFD_RELOC_LO16);
+             macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
              return;
            }
          if (lo32.X_add_number & 0x80000000)
            {
-             macro_build (NULL, counter, &lo32, "lui", "t,u", reg,
-                          BFD_RELOC_HI16);
+             macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
              if (lo32.X_add_number & 0xffff)
-               macro_build (NULL, counter, &lo32, "ori", "t,r,i", reg, reg,
-                            BFD_RELOC_LO16);
+               macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
              return;
            }
        }
@@ -3689,12 +3671,9 @@ load_register (int *counter, int reg, expressionS *ep, int dbl)
                                    | (lo32.X_add_number >> shift));
              else
                tmp.X_add_number = hi32.X_add_number >> (shift - 32);
-             macro_build (NULL, counter, &tmp, "ori", "t,r,i", reg, 0,
-                          BFD_RELOC_LO16);
-             macro_build (NULL, counter, NULL,
-                          (shift >= 32) ? "dsll32" : "dsll",
-                          "d,w,<", reg, reg,
-                          (shift >= 32) ? shift - 32 : shift);
+             macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
+             macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", "d,w,<",
+                          reg, reg, (shift >= 32) ? shift - 32 : shift);
              return;
            }
          ++shift;
@@ -3741,20 +3720,15 @@ load_register (int *counter, int reg, expressionS *ep, int dbl)
                  ones.  */
              tmp.X_op = O_constant;
              tmp.X_add_number = (offsetT) -1;
-             macro_build (NULL, counter, &tmp, "addiu", "t,r,j", reg, 0,
-                          BFD_RELOC_LO16);
+             macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
              if (bit != 0)
                {
                  bit += shift;
-                 macro_build (NULL, counter, NULL,
-                              (bit >= 32) ? "dsll32" : "dsll",
-                              "d,w,<", reg, reg,
-                              (bit >= 32) ? bit - 32 : bit);
+                 macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", "d,w,<",
+                              reg, reg, (bit >= 32) ? bit - 32 : bit);
                }
-             macro_build (NULL, counter, NULL,
-                          (shift >= 32) ? "dsrl32" : "dsrl",
-                          "d,w,<", reg, reg,
-                          (shift >= 32) ? shift - 32 : shift);
+             macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", "d,w,<",
+                          reg, reg, (shift >= 32) ? shift - 32 : shift);
              return;
            }
        }
@@ -3763,14 +3737,14 @@ load_register (int *counter, int reg, expressionS *ep, int dbl)
          generally get better code when we load a sign extended value.  */
       if ((hi32.X_add_number & 0x80000000) != 0)
        hi32.X_add_number |= ~(offsetT) 0xffffffff;
-      load_register (counter, reg, &hi32, 0);
+      load_register (reg, &hi32, 0);
       freg = reg;
     }
   if ((lo32.X_add_number & 0xffff0000) == 0)
     {
       if (freg != 0)
        {
-         macro_build (NULL, counter, NULL, "dsll32", "d,w,<", reg, freg, 0);
+         macro_build (NULL, "dsll32", "d,w,<", reg, freg, 0);
          freg = reg;
        }
     }
@@ -3780,36 +3754,31 @@ load_register (int *counter, int reg, expressionS *ep, int dbl)
 
       if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
        {
-         macro_build (NULL, counter, &lo32, "lui", "t,u", reg,
-                      BFD_RELOC_HI16);
-         macro_build (NULL, counter, NULL, "dsrl32", "d,w,<", reg, reg, 0);
+         macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
+         macro_build (NULL, "dsrl32", "d,w,<", reg, reg, 0);
          return;
        }
 
       if (freg != 0)
        {
-         macro_build (NULL, counter, NULL, "dsll", "d,w,<", reg, freg, 16);
+         macro_build (NULL, "dsll", "d,w,<", reg, freg, 16);
          freg = reg;
        }
       mid16 = lo32;
       mid16.X_add_number >>= 16;
-      macro_build (NULL, counter, &mid16, "ori", "t,r,i", reg, freg,
-                  BFD_RELOC_LO16);
-      macro_build (NULL, counter, NULL, "dsll", "d,w,<", reg, reg, 16);
+      macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
+      macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
       freg = reg;
     }
   if ((lo32.X_add_number & 0xffff) != 0)
-    macro_build (NULL, counter, &lo32, "ori", "t,r,i", reg, freg,
-                BFD_RELOC_LO16);
+    macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
 }
 
 /* Load an address into a register.  */
 
 static void
-load_address (int *counter, int reg, expressionS *ep, int *used_at)
+load_address (int reg, expressionS *ep, int *used_at)
 {
-  char *p = NULL;
-
   if (ep->X_op != O_constant
       && ep->X_op != O_symbol)
     {
@@ -3819,7 +3788,7 @@ load_address (int *counter, int reg, expressionS *ep, int *used_at)
 
   if (ep->X_op == O_constant)
     {
-      load_register (counter, reg, ep, HAVE_64BIT_ADDRESSES);
+      load_register (reg, ep, HAVE_64BIT_ADDRESSES);
       return;
     }
 
@@ -3856,30 +3825,24 @@ load_address (int *counter, int reg, expressionS *ep, int *used_at)
 
          if (*used_at == 0 && ! mips_opts.noat)
            {
-             macro_build (p, counter, ep, "lui", "t,u",
-                          reg, BFD_RELOC_MIPS_HIGHEST);
-             macro_build (p, counter, ep, "lui", "t,u",
-                          AT, BFD_RELOC_HI16_S);
-             macro_build (p, counter, ep, "daddiu", "t,r,j",
-                          reg, reg, BFD_RELOC_MIPS_HIGHER);
-             macro_build (p, counter, ep, "daddiu", "t,r,j",
-                          AT, AT, BFD_RELOC_LO16);
-             macro_build (p, counter, NULL, "dsll32", "d,w,<", reg, reg, 0);
-             macro_build (p, counter, NULL, "daddu", "d,v,t", reg, reg, AT);
+             macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
+             macro_build (ep, "lui", "t,u", AT, BFD_RELOC_HI16_S);
+             macro_build (ep, "daddiu", "t,r,j", reg, reg,
+                          BFD_RELOC_MIPS_HIGHER);
+             macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
+             macro_build (NULL, "dsll32", "d,w,<", reg, reg, 0);
+             macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
              *used_at = 1;
            }
          else
            {
-             macro_build (p, counter, ep, "lui", "t,u",
-                          reg, BFD_RELOC_MIPS_HIGHEST);
-             macro_build (p, counter, ep, "daddiu", "t,r,j",
-                          reg, reg, BFD_RELOC_MIPS_HIGHER);
-             macro_build (p, counter, NULL, "dsll", "d,w,<", reg, reg, 16);
-             macro_build (p, counter, ep, "daddiu", "t,r,j",
-                          reg, reg, BFD_RELOC_HI16_S);
-             macro_build (p, counter, NULL, "dsll", "d,w,<", reg, reg, 16);
-             macro_build (p, counter, ep, "daddiu", "t,r,j",
-                          reg, reg, BFD_RELOC_LO16);
+             macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
+             macro_build (ep, "daddiu", "t,r,j", reg, reg,
+                          BFD_RELOC_MIPS_HIGHER);
+             macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
+             macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
+             macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
+             macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
            }
        }
       else
@@ -3888,13 +3851,13 @@ load_address (int *counter, int reg, expressionS *ep, int *used_at)
              && ! nopic_need_relax (ep->X_add_symbol, 1))
            {
              relax_start (ep->X_add_symbol);
-             macro_build (NULL, counter, ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
+             macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
                           mips_gp_register, BFD_RELOC_GPREL16);
              relax_switch ();
            }
-         macro_build_lui (p, counter, ep, reg);
-         macro_build (p, counter, ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
-                      BFD_RELOC_LO16);
+         macro_build_lui (ep, reg);
+         macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
+                      reg, reg, BFD_RELOC_LO16);
          if (mips_relax.sequence)
            relax_end ();
        }
@@ -3922,17 +3885,17 @@ load_address (int *counter, int reg, expressionS *ep, int *used_at)
              ex.X_add_number = ep->X_add_number;
              ep->X_add_number = 0;
              relax_start (ep->X_add_symbol);
-             macro_build (NULL, counter, ep, ADDRESS_LOAD_INSN, "t,o(b)",
-                          reg, BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
+             macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
+                          BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
              if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
                as_bad (_("PIC code offset overflow (max 16 signed bits)"));
              ex.X_op = O_constant;
-             macro_build (NULL, counter, &ex, ADDRESS_ADDI_INSN, "t,r,j",
+             macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
                           reg, reg, BFD_RELOC_LO16);
              ep->X_add_number = ex.X_add_number;
              relax_switch ();
            }
-         macro_build (p, counter, ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
+         macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
                       BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
          if (mips_relax.sequence)
            relax_end ();
@@ -3941,13 +3904,12 @@ load_address (int *counter, int reg, expressionS *ep, int *used_at)
        {
          ex.X_add_number = ep->X_add_number;
          ep->X_add_number = 0;
-         macro_build (NULL, counter, ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
-                      BFD_RELOC_MIPS_GOT16,
-                      mips_gp_register);
-         macro_build (NULL, counter, NULL, "nop", "");
+         macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
+                      BFD_RELOC_MIPS_GOT16, mips_gp_register);
+         macro_build (NULL, "nop", "");
          relax_start (ep->X_add_symbol);
          relax_switch ();
-         macro_build (p, counter, ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
+         macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
                       BFD_RELOC_LO16);
          relax_end ();
 
@@ -3956,7 +3918,7 @@ load_address (int *counter, int reg, expressionS *ep, int *used_at)
              if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
                as_bad (_("PIC code offset overflow (max 16 signed bits)"));
              ex.X_op = O_constant;
-             macro_build (NULL, counter, &ex, ADDRESS_ADDI_INSN, "t,r,j",
+             macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
                           reg, reg, BFD_RELOC_LO16);
            }
        }
@@ -3986,27 +3948,26 @@ load_address (int *counter, int reg, expressionS *ep, int *used_at)
          ex.X_add_number = ep->X_add_number;
          ep->X_add_number = 0;
          relax_start (ep->X_add_symbol);
-         macro_build (NULL, counter, ep, "lui", "t,u", reg,
-                      BFD_RELOC_MIPS_GOT_HI16);
-         macro_build (NULL, counter, NULL, ADDRESS_ADD_INSN, "d,v,t", reg,
-                      reg, mips_gp_register);
-         macro_build (NULL, counter, ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
-                      BFD_RELOC_MIPS_GOT_LO16, reg);
+         macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
+         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
+                      reg, reg, mips_gp_register);
+         macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
+                      reg, BFD_RELOC_MIPS_GOT_LO16, reg);
          if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
            as_bad (_("PIC code offset overflow (max 16 signed bits)"));
          else if (ex.X_add_number)
            {
              ex.X_op = O_constant;
-             macro_build (NULL, counter, &ex, ADDRESS_ADDI_INSN, "t,r,j",
-                          reg, reg, BFD_RELOC_LO16);
+             macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
+                          BFD_RELOC_LO16);
            }
 
          ep->X_add_number = ex.X_add_number;
          relax_switch ();
-         macro_build (p, counter, ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
+         macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
                       BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
-         macro_build (p + 4, counter, ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
-                      reg, BFD_RELOC_MIPS_GOT_OFST);
+         macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
+                      BFD_RELOC_MIPS_GOT_OFST);
          relax_end ();
        }
       else
@@ -4014,12 +3975,11 @@ load_address (int *counter, int reg, expressionS *ep, int *used_at)
          ex.X_add_number = ep->X_add_number;
          ep->X_add_number = 0;
          relax_start (ep->X_add_symbol);
-         macro_build (NULL, counter, ep, "lui", "t,u", reg,
-                      BFD_RELOC_MIPS_GOT_HI16);
-         macro_build (NULL, counter, NULL, ADDRESS_ADD_INSN, "d,v,t", reg,
-                      reg, mips_gp_register);
-         macro_build (NULL, counter, ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
-                      BFD_RELOC_MIPS_GOT_LO16, reg);
+         macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
+         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
+                      reg, reg, mips_gp_register);
+         macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
+                      reg, BFD_RELOC_MIPS_GOT_LO16, reg);
          relax_switch ();
          if (reg_needs_delay (mips_gp_register))
            {
@@ -4027,12 +3987,12 @@ load_address (int *counter, int reg, expressionS *ep, int *used_at)
                 check is required because the lui which starts the main
                 instruction stream does not refer to $gp, and so will not
                 insert the nop which may be required.  */
-             macro_build (p, counter, NULL, "nop", "");
+             macro_build (NULL, "nop", "");
            }
-         macro_build (p, counter, ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
+         macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
                       BFD_RELOC_MIPS_GOT16, mips_gp_register);
-         macro_build (p, counter, NULL, "nop", "");
-         macro_build (p, counter, ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
+         macro_build (NULL, "nop", "");
+         macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
                       BFD_RELOC_LO16);
          relax_end ();
 
@@ -4041,8 +4001,8 @@ load_address (int *counter, int reg, expressionS *ep, int *used_at)
              if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
                as_bad (_("PIC code offset overflow (max 16 signed bits)"));
              ex.X_op = O_constant;
-             macro_build (NULL, counter, &ex, ADDRESS_ADDI_INSN, "t,r,j",
-                          reg, reg, BFD_RELOC_LO16);
+             macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
+                          BFD_RELOC_LO16);
            }
        }
     }
@@ -4051,8 +4011,8 @@ load_address (int *counter, int reg, expressionS *ep, int *used_at)
       /* We always do
           addiu        $reg,$gp,<sym>          (BFD_RELOC_GPREL16)
        */
-      macro_build (NULL, counter, ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
-                  mips_gp_register, BFD_RELOC_GPREL16);
+      macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
+                  reg, mips_gp_register, BFD_RELOC_GPREL16);
     }
   else
     abort ();
@@ -4061,10 +4021,10 @@ load_address (int *counter, int reg, expressionS *ep, int *used_at)
 /* Move the contents of register SOURCE into register DEST.  */
 
 static void
-move_register (int *counter, int dest, int source)
+move_register (int dest, int source)
 {
-  macro_build (NULL, counter, NULL, HAVE_32BIT_GPRS ? "addu" : "daddu",
-              "d,v,t", dest, source, 0);
+  macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
+              dest, source, 0);
 }
 
 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
@@ -4081,7 +4041,7 @@ move_register (int *counter, int dest, int source)
    emits the second.  */
 
 static void
-load_got_offset (int *counter, int dest, expressionS *local)
+load_got_offset (int dest, expressionS *local)
 {
   expressionS global;
 
@@ -4089,16 +4049,16 @@ load_got_offset (int *counter, int dest, expressionS *local)
   global.X_add_number = 0;
 
   relax_start (local->X_add_symbol);
-  macro_build (NULL, counter, &global, ADDRESS_LOAD_INSN, "t,o(b)",
-              dest, BFD_RELOC_MIPS_GOT16, mips_gp_register);
+  macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
+              BFD_RELOC_MIPS_GOT16, mips_gp_register);
   relax_switch ();
-  macro_build (NULL, counter, local, ADDRESS_LOAD_INSN, "t,o(b)",
-              dest, BFD_RELOC_MIPS_GOT16, mips_gp_register);
+  macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
+              BFD_RELOC_MIPS_GOT16, mips_gp_register);
   relax_end ();
 }
 
 static void
-add_got_offset (int *counter, int dest, expressionS *local)
+add_got_offset (int dest, expressionS *local)
 {
   expressionS global;
 
@@ -4108,11 +4068,10 @@ add_got_offset (int *counter, int dest, expressionS *local)
   global.X_add_number = local->X_add_number;
 
   relax_start (local->X_add_symbol);
-  macro_build (NULL, counter, &global, ADDRESS_ADDI_INSN, "t,r,j",
+  macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
               dest, dest, BFD_RELOC_LO16);
   relax_switch ();
-  macro_build (NULL, counter, local, ADDRESS_ADDI_INSN, "t,r,j",
-              dest, dest, BFD_RELOC_LO16);
+  macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
   relax_end ();
 }
 
@@ -4140,7 +4099,6 @@ macro (struct mips_cl_insn *ip)
   register int treg, sreg, dreg, breg;
   int tempreg;
   int mask;
-  int icnt = 0;
   int used_at = 0;
   expressionS expr1;
   const char *s;
@@ -4152,8 +4110,8 @@ macro (struct mips_cl_insn *ip)
   int lr = 0;
   int imm = 0;
   int call = 0;
-  offsetT maxnum;
   int off;
+  offsetT maxnum;
   bfd_reloc_code_real_type r;
   int hold_mips_optimize;
 
@@ -4184,13 +4142,12 @@ macro (struct mips_cl_insn *ip)
       mips_any_noreorder = 1;
 
       expr1.X_add_number = 8;
-      macro_build (NULL, &icnt, &expr1, "bgez", "s,p", sreg);
+      macro_build (&expr1, "bgez", "s,p", sreg);
       if (dreg == sreg)
-       macro_build (NULL, &icnt, NULL, "nop", "", 0);
+       macro_build (NULL, "nop", "", 0);
       else
-       move_register (&icnt, dreg, sreg);
-      macro_build (NULL, &icnt, NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0,
-                  sreg);
+       move_register (dreg, sreg);
+      macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
 
       --mips_opts.noreorder;
       return;
@@ -4217,12 +4174,11 @@ macro (struct mips_cl_insn *ip)
          && imm_expr.X_add_number >= -0x8000
          && imm_expr.X_add_number < 0x8000)
        {
-         macro_build (NULL, &icnt, &imm_expr, s, "t,r,j", treg, sreg,
-                      BFD_RELOC_LO16);
+         macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
          return;
        }
-      load_register (&icnt, AT, &imm_expr, dbl);
-      macro_build (NULL, &icnt, NULL, s2, "d,v,t", treg, sreg, AT);
+      load_register (AT, &imm_expr, dbl);
+      macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
       break;
 
     case M_AND_I:
@@ -4246,19 +4202,18 @@ macro (struct mips_cl_insn *ip)
          && imm_expr.X_add_number < 0x10000)
        {
          if (mask != M_NOR_I)
-           macro_build (NULL, &icnt, &imm_expr, s, "t,r,i", treg, sreg,
-                        BFD_RELOC_LO16);
+           macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
          else
            {
-             macro_build (NULL, &icnt, &imm_expr, "ori", "t,r,i", treg, sreg,
-                          BFD_RELOC_LO16);
-             macro_build (NULL, &icnt, NULL, "nor", "d,v,t", treg, treg, 0);
+             macro_build (&imm_expr, "ori", "t,r,i",
+                          treg, sreg, BFD_RELOC_LO16);
+             macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
            }
          return;
        }
 
-      load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
-      macro_build (NULL, &icnt, NULL, s2, "d,v,t", treg, sreg, AT);
+      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
+      macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
       break;
 
     case M_BEQ_I:
@@ -4277,11 +4232,11 @@ macro (struct mips_cl_insn *ip)
     beq_i:
       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
        {
-         macro_build (NULL, &icnt, &offset_expr, s, "s,t,p", sreg, 0);
+         macro_build (&offset_expr, s, "s,t,p", sreg, 0);
          return;
        }
-      load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
-      macro_build (NULL, &icnt, &offset_expr, s, "s,t,p", sreg, AT);
+      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
+      macro_build (&offset_expr, s, "s,t,p", sreg, AT);
       break;
 
     case M_BGEL:
@@ -4289,19 +4244,16 @@ macro (struct mips_cl_insn *ip)
     case M_BGE:
       if (treg == 0)
        {
-         macro_build (NULL, &icnt, &offset_expr, likely ? "bgezl" : "bgez",
-                      "s,p", sreg);
+         macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
          return;
        }
       if (sreg == 0)
        {
-         macro_build (NULL, &icnt, &offset_expr, likely ? "blezl" : "blez",
-                      "s,p", treg);
+         macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", treg);
          return;
        }
-      macro_build (NULL, &icnt, NULL, "slt", "d,v,t", AT, sreg, treg);
-      macro_build (NULL, &icnt, &offset_expr, likely ? "beql" : "beq",
-                  "s,t,p", AT, 0);
+      macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
+      macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
       break;
 
     case M_BGTL_I:
@@ -4323,9 +4275,9 @@ macro (struct mips_cl_insn *ip)
        do_false:
          /* result is always false */
          if (! likely)
-           macro_build (NULL, &icnt, NULL, "nop", "", 0);
+           macro_build (NULL, "nop", "", 0);
          else
-           macro_build (NULL, &icnt, &offset_expr, "bnel", "s,t,p", 0, 0);
+           macro_build (&offset_expr, "bnel", "s,t,p", 0, 0);
          return;
        }
       if (imm_expr.X_op != O_constant)
@@ -4338,14 +4290,12 @@ macro (struct mips_cl_insn *ip)
        likely = 1;
       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
        {
-         macro_build (NULL, &icnt, &offset_expr, likely ? "bgezl" : "bgez",
-                      "s,p", sreg);
+         macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
          return;
        }
       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
        {
-         macro_build (NULL, &icnt, &offset_expr, likely ? "bgtzl" : "bgtz",
-                      "s,p", sreg);
+         macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
          return;
        }
       maxnum = 0x7fffffff;
@@ -4364,12 +4314,11 @@ macro (struct mips_cl_insn *ip)
        do_true:
          /* result is always true */
          as_warn (_("Branch %s is always true"), ip->insn_mo->name);
-         macro_build (NULL, &icnt, &offset_expr, "b", "p");
+         macro_build (&offset_expr, "b", "p");
          return;
        }
-      set_at (&icnt, sreg, 0);
-      macro_build (NULL, &icnt, &offset_expr, likely ? "beql" : "beq",
-                  "s,t,p", AT, 0);
+      set_at (sreg, 0);
+      macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
       break;
 
     case M_BGEUL:
@@ -4379,13 +4328,12 @@ macro (struct mips_cl_insn *ip)
        goto do_true;
       if (sreg == 0)
        {
-         macro_build (NULL, &icnt, &offset_expr, likely ? "beql" : "beq",
+         macro_build (&offset_expr, likely ? "beql" : "beq",
                       "s,t,p", 0, treg);
          return;
        }
-      macro_build (NULL, &icnt, NULL, "sltu", "d,v,t", AT, sreg, treg);
-      macro_build (NULL, &icnt, &offset_expr, likely ? "beql" : "beq",
-                  "s,t,p", AT, 0);
+      macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
+      macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
       break;
 
     case M_BGTUL_I:
@@ -4408,13 +4356,12 @@ macro (struct mips_cl_insn *ip)
        goto do_true;
       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
        {
-         macro_build (NULL, &icnt, &offset_expr, likely ? "bnel" : "bne",
+         macro_build (&offset_expr, likely ? "bnel" : "bne",
                       "s,t,p", sreg, 0);
          return;
        }
-      set_at (&icnt, sreg, 1);
-      macro_build (NULL, &icnt, &offset_expr, likely ? "beql" : "beq",
-                  "s,t,p", AT, 0);
+      set_at (sreg, 1);
+      macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
       break;
 
     case M_BGTL:
@@ -4422,19 +4369,16 @@ macro (struct mips_cl_insn *ip)
     case M_BGT:
       if (treg == 0)
        {
-         macro_build (NULL, &icnt, &offset_expr, likely ? "bgtzl" : "bgtz",
-                      "s,p", sreg);
+         macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
          return;
        }
       if (sreg == 0)
        {
-         macro_build (NULL, &icnt, &offset_expr, likely ? "bltzl" : "bltz",
-                      "s,p", treg);
+         macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", treg);
          return;
        }
-      macro_build (NULL, &icnt, NULL, "slt", "d,v,t", AT, treg, sreg);
-      macro_build (NULL, &icnt, &offset_expr, likely ? "bnel" : "bne",
-                  "s,t,p", AT, 0);
+      macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
+      macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
       break;
 
     case M_BGTUL:
@@ -4442,15 +4386,14 @@ macro (struct mips_cl_insn *ip)
     case M_BGTU:
       if (treg == 0)
        {
-         macro_build (NULL, &icnt, &offset_expr, likely ? "bnel" : "bne",
+         macro_build (&offset_expr, likely ? "bnel" : "bne",
                       "s,t,p", sreg, 0);
          return;
        }
       if (sreg == 0)
        goto do_false;
-      macro_build (NULL, &icnt, NULL, "sltu", "d,v,t", AT, treg, sreg);
-      macro_build (NULL, &icnt, &offset_expr, likely ? "bnel" : "bne",
-                  "s,t,p", AT, 0);
+      macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
+      macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
       break;
 
     case M_BLEL:
@@ -4458,19 +4401,16 @@ macro (struct mips_cl_insn *ip)
     case M_BLE:
       if (treg == 0)
        {
-         macro_build (NULL, &icnt, &offset_expr, likely ? "blezl" : "blez",
-                      "s,p", sreg);
+         macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
          return;
        }
       if (sreg == 0)
        {
-         macro_build (NULL, &icnt, &offset_expr, likely ? "bgezl" : "bgez",
-                      "s,p", treg);
+         macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", treg);
          return;
        }
-      macro_build (NULL, &icnt, NULL, "slt", "d,v,t", AT, treg, sreg);
-      macro_build (NULL, &icnt, &offset_expr, likely ? "beql" : "beq",
-                  "s,t,p", AT, 0);
+      macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
+      macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
       break;
 
     case M_BLEL_I:
@@ -4498,19 +4438,16 @@ macro (struct mips_cl_insn *ip)
        likely = 1;
       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
        {
-         macro_build (NULL, &icnt, &offset_expr, likely ? "bltzl" : "bltz",
-                      "s,p", sreg);
+         macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
          return;
        }
       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
        {
-         macro_build (NULL, &icnt, &offset_expr, likely ? "blezl" : "blez",
-                      "s,p", sreg);
+         macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
          return;
        }
-      set_at (&icnt, sreg, 0);
-      macro_build (NULL, &icnt, &offset_expr, likely ? "bnel" : "bne",
-                  "s,t,p", AT, 0);
+      set_at (sreg, 0);
+      macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
       break;
 
     case M_BLEUL:
@@ -4518,15 +4455,14 @@ macro (struct mips_cl_insn *ip)
     case M_BLEU:
       if (treg == 0)
        {
-         macro_build (NULL, &icnt, &offset_expr, likely ? "beql" : "beq",
+         macro_build (&offset_expr, likely ? "beql" : "beq",
                       "s,t,p", sreg, 0);
          return;
        }
       if (sreg == 0)
        goto do_true;
-      macro_build (NULL, &icnt, NULL, "sltu", "d,v,t", AT, treg, sreg);
-      macro_build (NULL, &icnt, &offset_expr, likely ? "beql" : "beq",
-                  "s,t,p", AT, 0);
+      macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
+      macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
       break;
 
     case M_BLEUL_I:
@@ -4549,13 +4485,12 @@ macro (struct mips_cl_insn *ip)
        goto do_false;
       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
        {
-         macro_build (NULL, &icnt, &offset_expr, likely ? "beql" : "beq",
+         macro_build (&offset_expr, likely ? "beql" : "beq",
                       "s,t,p", sreg, 0);
          return;
        }
-      set_at (&icnt, sreg, 1);
-      macro_build (NULL, &icnt, &offset_expr, likely ? "bnel" : "bne",
-                  "s,t,p", AT, 0);
+      set_at (sreg, 1);
+      macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
       break;
 
     case M_BLTL:
@@ -4563,19 +4498,16 @@ macro (struct mips_cl_insn *ip)
     case M_BLT:
       if (treg == 0)
        {
-         macro_build (NULL, &icnt, &offset_expr, likely ? "bltzl" : "bltz",
-                      "s,p", sreg);
+         macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
          return;
        }
       if (sreg == 0)
        {
-         macro_build (NULL, &icnt, &offset_expr, likely ? "bgtzl" : "bgtz",
-                      "s,p", treg);
+         macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", treg);
          return;
        }
-      macro_build (NULL, &icnt, NULL, "slt", "d,v,t", AT, sreg, treg);
-      macro_build (NULL, &icnt, &offset_expr, likely ? "bnel" : "bne",
-                  "s,t,p", AT, 0);
+      macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
+      macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
       break;
 
     case M_BLTUL:
@@ -4585,13 +4517,12 @@ macro (struct mips_cl_insn *ip)
        goto do_false;
       if (sreg == 0)
        {
-         macro_build (NULL, &icnt, &offset_expr, likely ? "bnel" : "bne",
+         macro_build (&offset_expr, likely ? "bnel" : "bne",
                       "s,t,p", 0, treg);
          return;
        }
-      macro_build (NULL, &icnt, NULL, "sltu", "d,v,t", AT, sreg, treg);
-      macro_build (NULL, &icnt, &offset_expr, likely ? "bnel" : "bne",
-                  "s,t,p", AT, 0);
+      macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
+      macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
       break;
 
     case M_DEXT:
@@ -4638,8 +4569,7 @@ macro (struct mips_cl_insn *ip)
            s = "dextm";
            fmt = "t,r,+A,+G";
          }
-       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s,
-                    fmt, treg, sreg, pos, size - 1);
+       macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos, size - 1);
       }
       return;
 
@@ -4687,8 +4617,8 @@ macro (struct mips_cl_insn *ip)
            s = "dinsm";
            fmt = "t,r,+A,+F";
          }
-       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s,
-                    fmt, treg, sreg, pos, pos + size - 1);
+       macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos,
+                    pos + size - 1);
       }
       return;
 
@@ -4706,9 +4636,9 @@ macro (struct mips_cl_insn *ip)
        {
          as_warn (_("Divide by zero."));
          if (mips_trap)
-           macro_build (NULL, &icnt, NULL, "teq", "s,t,q", 0, 0, 7);
+           macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
          else
-           macro_build (NULL, &icnt, NULL, "break", "c", 7);
+           macro_build (NULL, "break", "c", 7);
          return;
        }
 
@@ -4717,39 +4647,35 @@ macro (struct mips_cl_insn *ip)
       mips_any_noreorder = 1;
       if (mips_trap)
        {
-         macro_build (NULL, &icnt, NULL, "teq", "s,t,q", treg, 0, 7);
-         macro_build (NULL, &icnt, NULL, dbl ? "ddiv" : "div", "z,s,t",
-                      sreg, treg);
+         macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
+         macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
        }
       else
        {
          expr1.X_add_number = 8;
-         macro_build (NULL, &icnt, &expr1, "bne", "s,t,p", treg, 0);
-         macro_build (NULL, &icnt, NULL, dbl ? "ddiv" : "div", "z,s,t",
-                      sreg, treg);
-         macro_build (NULL, &icnt, NULL, "break", "c", 7);
+         macro_build (&expr1, "bne", "s,t,p", treg, 0);
+         macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
+         macro_build (NULL, "break", "c", 7);
        }
       expr1.X_add_number = -1;
-      macro_build (NULL, &icnt, &expr1, dbl ? "daddiu" : "addiu", "t,r,j",
-                  AT, 0, BFD_RELOC_LO16);
+      macro_build (&expr1, dbl ? "daddiu" : "addiu", "t,r,j", AT, 0,
+                  BFD_RELOC_LO16);
       expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
-      macro_build (NULL, &icnt, &expr1, "bne", "s,t,p", treg, AT);
+      macro_build (&expr1, "bne", "s,t,p", treg, AT);
       if (dbl)
        {
          expr1.X_add_number = 1;
-         macro_build (NULL, &icnt, &expr1, "daddiu", "t,r,j", AT, 0,
-                      BFD_RELOC_LO16);
-         macro_build (NULL, &icnt, NULL, "dsll32", "d,w,<", AT, AT, 31);
+         macro_build (&expr1, "daddiu", "t,r,j", AT, 0, BFD_RELOC_LO16);
+         macro_build (NULL, "dsll32", "d,w,<", AT, AT, 31);
        }
       else
        {
          expr1.X_add_number = 0x80000000;
-         macro_build (NULL, &icnt, &expr1, "lui", "t,u", AT,
-                      BFD_RELOC_HI16);
+         macro_build (&expr1, "lui", "t,u", AT, BFD_RELOC_HI16);
        }
       if (mips_trap)
        {
-         macro_build (NULL, &icnt, NULL, "teq", "s,t,q", sreg, AT, 6);
+         macro_build (NULL, "teq", "s,t,q", sreg, AT, 6);
          /* We want to close the noreorder block as soon as possible, so
             that later insns are available for delay slot filling.  */
          --mips_opts.noreorder;
@@ -4757,16 +4683,16 @@ macro (struct mips_cl_insn *ip)
       else
        {
          expr1.X_add_number = 8;
-         macro_build (NULL, &icnt, &expr1, "bne", "s,t,p", sreg, AT);
-         macro_build (NULL, &icnt, NULL, "nop", "", 0);
+         macro_build (&expr1, "bne", "s,t,p", sreg, AT);
+         macro_build (NULL, "nop", "", 0);
 
          /* We want to close the noreorder block as soon as possible, so
             that later insns are available for delay slot filling.  */
          --mips_opts.noreorder;
 
-         macro_build (NULL, &icnt, NULL, "break", "c", 6);
+         macro_build (NULL, "break", "c", 6);
        }
-      macro_build (NULL, &icnt, NULL, s, "d", dreg);
+      macro_build (NULL, s, "d", dreg);
       break;
 
     case M_DIV_3I:
@@ -4809,17 +4735,17 @@ macro (struct mips_cl_insn *ip)
        {
          as_warn (_("Divide by zero."));
          if (mips_trap)
-           macro_build (NULL, &icnt, NULL, "teq", "s,t,q", 0, 0, 7);
+           macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
          else
-           macro_build (NULL, &icnt, NULL, "break", "c", 7);
+           macro_build (NULL, "break", "c", 7);
          return;
        }
       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
        {
          if (strcmp (s2, "mflo") == 0)
-           move_register (&icnt, dreg, sreg);
+           move_register (dreg, sreg);
          else
-           move_register (&icnt, dreg, 0);
+           move_register (dreg, 0);
          return;
        }
       if (imm_expr.X_op == O_constant
@@ -4828,17 +4754,16 @@ macro (struct mips_cl_insn *ip)
        {
          if (strcmp (s2, "mflo") == 0)
            {
-             macro_build (NULL, &icnt, NULL, dbl ? "dneg" : "neg", "d,w",
-                          dreg, sreg);
+             macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
            }
          else
-           move_register (&icnt, dreg, 0);
+           move_register (dreg, 0);
          return;
        }
 
-      load_register (&icnt, AT, &imm_expr, dbl);
-      macro_build (NULL, &icnt, NULL, s, "z,s,t", sreg, AT);
-      macro_build (NULL, &icnt, NULL, s2, "d", dreg);
+      load_register (AT, &imm_expr, dbl);
+      macro_build (NULL, s, "z,s,t", sreg, AT);
+      macro_build (NULL, s2, "d", dreg);
       break;
 
     case M_DIVU_3:
@@ -4862,8 +4787,8 @@ macro (struct mips_cl_insn *ip)
       mips_any_noreorder = 1;
       if (mips_trap)
        {
-         macro_build (NULL, &icnt, NULL, "teq", "s,t,q", treg, 0, 7);
-         macro_build (NULL, &icnt, NULL, s, "z,s,t", sreg, treg);
+         macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
+         macro_build (NULL, s, "z,s,t", sreg, treg);
          /* We want to close the noreorder block as soon as possible, so
             that later insns are available for delay slot filling.  */
          --mips_opts.noreorder;
@@ -4871,15 +4796,15 @@ macro (struct mips_cl_insn *ip)
       else
        {
          expr1.X_add_number = 8;
-         macro_build (NULL, &icnt, &expr1, "bne", "s,t,p", treg, 0);
-         macro_build (NULL, &icnt, NULL, s, "z,s,t", sreg, treg);
+         macro_build (&expr1, "bne", "s,t,p", treg, 0);
+         macro_build (NULL, s, "z,s,t", sreg, treg);
 
          /* We want to close the noreorder block as soon as possible, so
             that later insns are available for delay slot filling.  */
          --mips_opts.noreorder;
-         macro_build (NULL, &icnt, NULL, "break", "c", 7);
+         macro_build (NULL, "break", "c", 7);
        }
-      macro_build (NULL, &icnt, NULL, s2, "d", dreg);
+      macro_build (NULL, s2, "d", dreg);
       return;
 
     case M_DLCA_AB:
@@ -4904,7 +4829,7 @@ macro (struct mips_cl_insn *ip)
          && offset_expr.X_add_number >= -0x8000
          && offset_expr.X_add_number < 0x8000)
        {
-         macro_build (NULL, &icnt, &offset_expr,
+         macro_build (&offset_expr,
                       (dbl || HAVE_64BIT_ADDRESSES) ? "daddiu" : "addiu",
                       "t,r,j", treg, sreg, BFD_RELOC_LO16);
          return;
@@ -4946,18 +4871,18 @@ macro (struct mips_cl_insn *ip)
            {
              tempreg = treg;
              used_at = 0;
-             macro_build (NULL, &icnt, &offset_expr, "lui", "t,u", tempreg,
-                          BFD_RELOC_PCREL_HI16_S);
+             macro_build (&offset_expr, "lui", "t,u",
+                          tempreg, BFD_RELOC_PCREL_HI16_S);
            }
          else
            {
-             macro_build (NULL, &icnt, &offset_expr, "lui", "t,u", tempreg,
-                          BFD_RELOC_PCREL_HI16_S);
-             macro_build (NULL, &icnt, NULL,
+             macro_build (&offset_expr, "lui", "t,u",
+                          tempreg, BFD_RELOC_PCREL_HI16_S);
+             macro_build (NULL,
                           (dbl || HAVE_64BIT_ADDRESSES) ? "daddu" : "addu",
                           "d,v,t", tempreg, tempreg, breg);
            }
-         macro_build (NULL, &icnt, &offset_expr,
+         macro_build (&offset_expr,
                       (dbl || HAVE_64BIT_ADDRESSES) ? "daddiu" : "addiu",
                       "t,r,j", treg, tempreg, BFD_RELOC_PCREL_LO16);
          if (! used_at)
@@ -4973,7 +4898,7 @@ macro (struct mips_cl_insn *ip)
        }
 
       if (offset_expr.X_op == O_constant)
-       load_register (&icnt, tempreg, &offset_expr,
+       load_register (tempreg, &offset_expr,
                       ((mips_pic == EMBEDDED_PIC || mips_pic == NO_PIC)
                        ? (dbl || HAVE_64BIT_ADDRESSES)
                        : HAVE_64BIT_ADDRESSES));
@@ -5004,7 +4929,6 @@ macro (struct mips_cl_insn *ip)
              dsll      $tempreg,16
              daddiu    $tempreg,<sym>          (BFD_RELOC_LO16)
          */
-         char *p = NULL;
          if (HAVE_64BIT_ADDRESSES)
            {
              /* We don't do GP optimization for now because RELAX_ENCODE can't
@@ -5012,33 +4936,29 @@ macro (struct mips_cl_insn *ip)
 
              if (used_at == 0 && ! mips_opts.noat)
                {
-                 macro_build (p, &icnt, &offset_expr, "lui", "t,u",
+                 macro_build (&offset_expr, "lui", "t,u",
                               tempreg, BFD_RELOC_MIPS_HIGHEST);
-                 macro_build (p, &icnt, &offset_expr, "lui", "t,u",
+                 macro_build (&offset_expr, "lui", "t,u",
                               AT, BFD_RELOC_HI16_S);
-                 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
+                 macro_build (&offset_expr, "daddiu", "t,r,j",
                               tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
-                 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
+                 macro_build (&offset_expr, "daddiu", "t,r,j",
                               AT, AT, BFD_RELOC_LO16);
-                 macro_build (p, &icnt, NULL, "dsll32", "d,w,<",
-                              tempreg, tempreg, 0);
-                 macro_build (p, &icnt, NULL, "daddu", "d,v,t",
-                              tempreg, tempreg, AT);
+                 macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
+                 macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
                  used_at = 1;
                }
              else
                {
-                 macro_build (p, &icnt, &offset_expr, "lui", "t,u",
+                 macro_build (&offset_expr, "lui", "t,u",
                               tempreg, BFD_RELOC_MIPS_HIGHEST);
-                 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
+                 macro_build (&offset_expr, "daddiu", "t,r,j",
                               tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
-                 macro_build (p, &icnt, NULL, "dsll", "d,w,<",
-                              tempreg, tempreg, 16);
-                 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
+                 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
+                 macro_build (&offset_expr, "daddiu", "t,r,j",
                               tempreg, tempreg, BFD_RELOC_HI16_S);
-                 macro_build (p, &icnt, NULL, "dsll", "d,w,<",
-                              tempreg, tempreg, 16);
-                 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
+                 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
+                 macro_build (&offset_expr, "daddiu", "t,r,j",
                               tempreg, tempreg, BFD_RELOC_LO16);
                }
            }
@@ -5048,14 +4968,13 @@ macro (struct mips_cl_insn *ip)
                  && ! nopic_need_relax (offset_expr.X_add_symbol, 1))
                {
                  relax_start (offset_expr.X_add_symbol);
-                 macro_build (NULL, &icnt, &offset_expr, ADDRESS_ADDI_INSN,
-                              "t,r,j", tempreg, mips_gp_register,
-                              BFD_RELOC_GPREL16);
+                 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
+                              tempreg, mips_gp_register, BFD_RELOC_GPREL16);
                  relax_switch ();
                }
-             macro_build_lui (p, &icnt, &offset_expr, tempreg);
-             macro_build (p, &icnt, &offset_expr, ADDRESS_ADDI_INSN,
-                          "t,r,j", tempreg, tempreg, BFD_RELOC_LO16);
+             macro_build_lui (&offset_expr, tempreg);
+             macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
+                          tempreg, tempreg, BFD_RELOC_LO16);
              if (mips_relax.sequence)
                relax_end ();
            }
@@ -5096,28 +5015,25 @@ macro (struct mips_cl_insn *ip)
 
          if (offset_expr.X_add_number == 0)
            {
-             char *p = NULL;
-
              if (breg == 0 && (call || tempreg == PIC_CALL_REG))
                lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
 
              relax_start (offset_expr.X_add_symbol);
-             macro_build (NULL, &icnt, &offset_expr, ADDRESS_LOAD_INSN,
-                          "t,o(b)", tempreg, lw_reloc_type, mips_gp_register);
+             macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
+                          lw_reloc_type, mips_gp_register);
              if (breg != 0)
                {
                  /* We're going to put in an addu instruction using
                     tempreg, so we may as well insert the nop right
                     now.  */
-                 macro_build (NULL, &icnt, NULL, "nop", "");
+                 macro_build (NULL, "nop", "");
                }
              relax_switch ();
-             macro_build (NULL, &icnt, &offset_expr, ADDRESS_LOAD_INSN,
-                          "t,o(b)", tempreg, BFD_RELOC_MIPS_GOT16,
-                          mips_gp_register);
-             macro_build (p, &icnt, NULL, "nop", "");
-             macro_build (p, &icnt, &offset_expr, ADDRESS_ADDI_INSN,
-                          "t,r,j", tempreg, tempreg, BFD_RELOC_LO16);
+             macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
+                          tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
+             macro_build (NULL, "nop", "");
+             macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
+                          tempreg, tempreg, BFD_RELOC_LO16);
              relax_end ();
              /* FIXME: If breg == 0, and the next instruction uses
                 $tempreg, then if this variant case is used an extra
@@ -5126,18 +5042,16 @@ macro (struct mips_cl_insn *ip)
          else if (offset_expr.X_add_number >= -0x8000
                   && offset_expr.X_add_number < 0x8000)
            {
-             load_got_offset (&icnt, tempreg, &offset_expr);
-             macro_build (NULL, &icnt, NULL, "nop", "");
-             add_got_offset (&icnt, tempreg, &offset_expr);
+             load_got_offset (tempreg, &offset_expr);
+             macro_build (NULL, "nop", "");
+             add_got_offset (tempreg, &offset_expr);
            }
          else
            {
-             int off1;
-
              expr1.X_add_number = offset_expr.X_add_number;
              offset_expr.X_add_number =
                ((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
-             load_got_offset (&icnt, tempreg, &offset_expr);
+             load_got_offset (tempreg, &offset_expr);
              /* If we are going to add in a base register, and the
                 target register and the base register are the same,
                 then we are using AT as a temporary register.  Since
@@ -5145,35 +5059,31 @@ macro (struct mips_cl_insn *ip)
                 current AT (from the global offset table) and the
                 register into the register now, and pretend we were
                 not using a base register.  */
-             if (breg != treg)
-               off1 = 0;
-             else
+             if (breg == treg)
                {
-                 macro_build (NULL, &icnt, NULL, "nop", "");
-                 macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
+                 macro_build (NULL, "nop", "");
+                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
                               treg, AT, breg);
                  breg = 0;
                  tempreg = treg;
-                 off1 = -8;
                }
 
              /* Set mips_optimize around the lui instruction to avoid
                 inserting an unnecessary nop after the lw.  */
              hold_mips_optimize = mips_optimize;
              mips_optimize = 2;
-             macro_build_lui (NULL, &icnt, &expr1, AT);
+             macro_build_lui (&expr1, AT);
              mips_optimize = hold_mips_optimize;
 
-             add_got_offset (&icnt, AT, &offset_expr);
-             macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
+             add_got_offset (AT, &offset_expr);
+             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
                           tempreg, tempreg, AT);
              used_at = 1;
            }
        }
       else if (mips_pic == SVR4_PIC && ! mips_big_got && HAVE_NEWABI)
        {
-         char *p = NULL;
-         int adj = 0;
+         int add_breg_early = 0;
 
          /* If this is a reference to an external, and there is no
             constant, or local symbol (*), with or without a
@@ -5204,15 +5114,14 @@ macro (struct mips_cl_insn *ip)
              offset_expr.X_add_number = 0;
 
              relax_start (offset_expr.X_add_symbol);
-             macro_build (NULL, &icnt, &offset_expr, ADDRESS_LOAD_INSN,
-                          "t,o(b)", tempreg, BFD_RELOC_MIPS_GOT_DISP,
-                          mips_gp_register);
+             macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
+                          BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
 
              if (expr1.X_add_number >= -0x8000
                  && expr1.X_add_number < 0x8000)
                {
-                 macro_build (NULL, &icnt, &expr1, ADDRESS_ADDI_INSN,
-                              "t,r,j", tempreg, tempreg, BFD_RELOC_LO16);
+                 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
+                              tempreg, tempreg, BFD_RELOC_LO16);
                }
              else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
                {
@@ -5230,16 +5139,16 @@ macro (struct mips_cl_insn *ip)
                  else
                    {
                      assert (tempreg == AT);
-                     macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN,
-                                  "d,v,t", treg, AT, breg);
+                     macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
+                                  treg, AT, breg);
                      dreg = treg;
-                     adj = 4;
+                     add_breg_early = 1;
                    }
 
-                 macro_build_lui (NULL, &icnt, &expr1, AT);
-                 macro_build (NULL, &icnt, &expr1, ADDRESS_ADDI_INSN,
-                              "t,r,j", AT, AT, BFD_RELOC_LO16);
-                 macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
+                 macro_build_lui (&expr1, AT);
+                 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
+                              AT, AT, BFD_RELOC_LO16);
+                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
                               dreg, dreg, AT);
 
                  used_at = 1;
@@ -5250,12 +5159,11 @@ macro (struct mips_cl_insn *ip)
              relax_switch ();
              offset_expr.X_add_number = expr1.X_add_number;
 
-             macro_build (p, &icnt, &offset_expr, ADDRESS_LOAD_INSN,
-                          "t,o(b)", tempreg, BFD_RELOC_MIPS_GOT_DISP,
-                          mips_gp_register);
-             if (adj)
+             macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
+                          BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
+             if (add_breg_early)
                {
-                 macro_build (p + 4, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
+                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
                               treg, tempreg, breg);
                  breg = 0;
                  tempreg = treg;
@@ -5265,26 +5173,22 @@ macro (struct mips_cl_insn *ip)
          else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
            {
              relax_start (offset_expr.X_add_symbol);
-             macro_build (NULL, &icnt, &offset_expr, ADDRESS_LOAD_INSN,
-                          "t,o(b)", tempreg, BFD_RELOC_MIPS_CALL16,
-                          mips_gp_register);
+             macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
+                          BFD_RELOC_MIPS_CALL16, mips_gp_register);
              relax_switch ();
-             macro_build (NULL, &icnt, &offset_expr, ADDRESS_LOAD_INSN,
-                          "t,o(b)", tempreg, BFD_RELOC_MIPS_GOT_DISP,
-                          mips_gp_register);
+             macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
+                          BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
              relax_end ();
            }
          else
            {
-             macro_build (NULL, &icnt, &offset_expr, ADDRESS_LOAD_INSN,
-                          "t,o(b)", tempreg, BFD_RELOC_MIPS_GOT_DISP,
-                          mips_gp_register);
+             macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
+                          BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
            }
        }
       else if (mips_pic == SVR4_PIC && ! HAVE_NEWABI)
        {
-         int gpdel;
-         char *p = NULL;
+         int gpdelay;
          int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
          int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
          int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
@@ -5333,47 +5237,38 @@ macro (struct mips_cl_insn *ip)
          expr1.X_add_number = offset_expr.X_add_number;
          offset_expr.X_add_number = 0;
          relax_start (offset_expr.X_add_symbol);
-         if (reg_needs_delay (mips_gp_register))
-           gpdel = 4;
-         else
-           gpdel = 0;
+         gpdelay = reg_needs_delay (mips_gp_register);
          if (expr1.X_add_number == 0 && breg == 0
              && (call || tempreg == PIC_CALL_REG))
            {
              lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
              lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
            }
-         macro_build (NULL, &icnt, &offset_expr, "lui", "t,u",
-                      tempreg, lui_reloc_type);
-         macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
+         macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
+         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
                       tempreg, tempreg, mips_gp_register);
-         macro_build (NULL, &icnt, &offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
+         macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
                       tempreg, lw_reloc_type, tempreg);
          if (expr1.X_add_number == 0)
            {
-             int off;
-
-             if (breg == 0)
-               off = 0;
-             else
+             if (breg != 0)
                {
                  /* We're going to put in an addu instruction using
                     tempreg, so we may as well insert the nop right
                     now.  */
-                 macro_build (NULL, &icnt, NULL, "nop", "");
-                 off = 4;
+                 macro_build (NULL, "nop", "");
                }
            }
          else if (expr1.X_add_number >= -0x8000
                   && expr1.X_add_number < 0x8000)
            {
-             macro_build (NULL, &icnt, NULL, "nop", "");
-             macro_build (NULL, &icnt, &expr1, ADDRESS_ADDI_INSN, "t,r,j",
+             macro_build (NULL, "nop", "");
+             macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
                           tempreg, tempreg, BFD_RELOC_LO16);
            }
          else
            {
-             int adj, dreg;
+             int dreg;
 
              /* If we are going to add in a base register, and the
                 target register and the base register are the same,
@@ -5383,31 +5278,26 @@ macro (struct mips_cl_insn *ip)
                 register into the register now, and pretend we were
                 not using a base register.  */
              if (breg != treg)
-               {
-                 adj = 0;
-                 dreg = tempreg;
-               }
+               dreg = tempreg;
              else
                {
                  assert (tempreg == AT);
-                 macro_build (NULL, &icnt, NULL, "nop", "");
-                 macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
+                 macro_build (NULL, "nop", "");
+                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
                               treg, AT, breg);
                  dreg = treg;
-                 adj = 8;
                }
 
              /* Set mips_optimize around the lui instruction to avoid
                 inserting an unnecessary nop after the lw.  */
              hold_mips_optimize = mips_optimize;
              mips_optimize = 2;
-             macro_build_lui (NULL, &icnt, &expr1, AT);
+             macro_build_lui (&expr1, AT);
              mips_optimize = hold_mips_optimize;
 
-             macro_build (NULL, &icnt, &expr1, ADDRESS_ADDI_INSN, "t,r,j",
+             macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
                           AT, AT, BFD_RELOC_LO16);
-             macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
-                          dreg, dreg, AT);
+             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
 
              used_at = 1;
            }
@@ -5415,21 +5305,21 @@ macro (struct mips_cl_insn *ip)
            ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
          relax_switch ();
 
-         if (gpdel > 0)
+         if (gpdelay)
            {
              /* This is needed because this instruction uses $gp, but
                 the first instruction on the main stream does not.  */
-             macro_build (p, &icnt, NULL, "nop", "");
+             macro_build (NULL, "nop", "");
            }
 
-         macro_build (p, &icnt, &offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
-                      tempreg, local_reloc_type, mips_gp_register);
+         macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
+                      local_reloc_type, mips_gp_register);
          if (expr1.X_add_number >= -0x8000
              && expr1.X_add_number < 0x8000)
            {
-             macro_build (p, &icnt, NULL, "nop", "");
-             macro_build (p, &icnt, &offset_expr, ADDRESS_ADDI_INSN,
-                          "t,r,j", tempreg, tempreg, BFD_RELOC_LO16);
+             macro_build (NULL, "nop", "");
+             macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
+                          tempreg, tempreg, BFD_RELOC_LO16);
              /* FIXME: If add_number is 0, and there was no base
                 register, the external symbol case ended with a load,
                 so if the symbol turns out to not be external, and
@@ -5443,8 +5333,8 @@ macro (struct mips_cl_insn *ip)
                  /* We must add in the base register now, as in the
                     external symbol case.  */
                  assert (tempreg == AT);
-                 macro_build (p, &icnt, NULL, "nop", "");
-                 macro_build (p, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
+                 macro_build (NULL, "nop", "");
+                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
                               treg, AT, breg);
                  tempreg = treg;
                  /* We set breg to 0 because we have arranged to add
@@ -5452,20 +5342,19 @@ macro (struct mips_cl_insn *ip)
                  breg = 0;
                }
 
-             macro_build_lui (p, &icnt, &expr1, AT);
-             macro_build (p, &icnt, &offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
+             macro_build_lui (&expr1, AT);
+             macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
                           AT, AT, BFD_RELOC_LO16);
-             macro_build (p, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
+             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
                           tempreg, tempreg, AT);
            }
          relax_end ();
        }
       else if (mips_pic == SVR4_PIC && HAVE_NEWABI)
        {
-         char *p = NULL;
          int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
          int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
-         int adj = 0;
+         int add_breg_early = 0;
 
          /* This is the large GOT case.  If this is a reference to an
             external symbol, and there is no constant, we want
@@ -5509,19 +5398,18 @@ macro (struct mips_cl_insn *ip)
              lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
              lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
            }
-         macro_build (NULL, &icnt, &offset_expr, "lui", "t,u",
-                      tempreg, lui_reloc_type);
-         macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
+         macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
+         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
                       tempreg, tempreg, mips_gp_register);
-         macro_build (NULL, &icnt, &offset_expr, ADDRESS_LOAD_INSN,
-                      "t,o(b)", tempreg, lw_reloc_type, tempreg);
+         macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
+                      tempreg, lw_reloc_type, tempreg);
 
          if (expr1.X_add_number == 0)
            ;
          else if (expr1.X_add_number >= -0x8000
                   && expr1.X_add_number < 0x8000)
            {
-             macro_build (NULL, &icnt, &expr1, ADDRESS_ADDI_INSN, "t,r,j",
+             macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
                           tempreg, tempreg, BFD_RELOC_LO16);
            }
          else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
@@ -5540,19 +5428,18 @@ macro (struct mips_cl_insn *ip)
              else
                {
                  assert (tempreg == AT);
-                 macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
+                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
                               treg, AT, breg);
                  dreg = treg;
-                 adj = 4;
+                 add_breg_early = 1;
                }
 
              /* Set mips_optimize around the lui instruction to avoid
                 inserting an unnecessary nop after the lw.  */
-             macro_build_lui (NULL, &icnt, &expr1, AT);
-             macro_build (NULL, &icnt, &expr1, ADDRESS_ADDI_INSN,
-                          "t,r,j", AT, AT, BFD_RELOC_LO16);
-             macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
-                          dreg, dreg, AT);
+             macro_build_lui (&expr1, AT);
+             macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
+                          AT, AT, BFD_RELOC_LO16);
+             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
 
              used_at = 1;
            }
@@ -5561,13 +5448,13 @@ macro (struct mips_cl_insn *ip)
 
          relax_switch ();
          offset_expr.X_add_number = expr1.X_add_number;
-         macro_build (p, &icnt, &offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
-                      tempreg, BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
-         macro_build (p + 4, &icnt, &offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
-                      tempreg, tempreg, BFD_RELOC_MIPS_GOT_OFST);
-         if (adj)
+         macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
+                      BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
+         macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
+                      tempreg, BFD_RELOC_MIPS_GOT_OFST);
+         if (add_breg_early)
            {
-             macro_build (p + 8, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
+             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
                           treg, tempreg, breg);
              breg = 0;
              tempreg = treg;
@@ -5579,8 +5466,8 @@ macro (struct mips_cl_insn *ip)
          /* We use
               addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
             */
-         macro_build (NULL, &icnt, &offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
-                      tempreg, mips_gp_register, BFD_RELOC_GPREL16);
+         macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
+                      mips_gp_register, BFD_RELOC_GPREL16);
        }
       else
        abort ();
@@ -5594,7 +5481,7 @@ macro (struct mips_cl_insn *ip)
          else
            s = ADDRESS_ADD_INSN;
 
-         macro_build (NULL, &icnt, NULL, s, "d,v,t", treg, tempreg, breg);
+         macro_build (NULL, s, "d,v,t", treg, tempreg, breg);
        }
 
       if (! used_at)
@@ -5607,9 +5494,9 @@ macro (struct mips_cl_insn *ip)
         requires an absolute address.  We convert it to a b
         instruction.  */
       if (mips_pic == NO_PIC)
-       macro_build (NULL, &icnt, &offset_expr, "j", "a");
+       macro_build (&offset_expr, "j", "a");
       else
-       macro_build (NULL, &icnt, &offset_expr, "b", "p");
+       macro_build (&offset_expr, "b", "p");
       return;
 
       /* The jal instructions must be handled as macros because when
@@ -5621,13 +5508,13 @@ macro (struct mips_cl_insn *ip)
     case M_JAL_2:
       if (mips_pic == NO_PIC
          || mips_pic == EMBEDDED_PIC)
-       macro_build (NULL, &icnt, NULL, "jalr", "d,s", dreg, sreg);
+       macro_build (NULL, "jalr", "d,s", dreg, sreg);
       else if (mips_pic == SVR4_PIC)
        {
          if (sreg != PIC_CALL_REG)
            as_warn (_("MIPS PIC call to register other than $25"));
 
-         macro_build (NULL, &icnt, NULL, "jalr", "d,s", dreg, sreg);
+         macro_build (NULL, "jalr", "d,s", dreg, sreg);
          if (! HAVE_NEWABI)
            {
              if (mips_cprestore_offset < 0)
@@ -5647,8 +5534,7 @@ macro (struct mips_cl_insn *ip)
                      mips_cprestore_valid = 1;
                    }
                  expr1.X_add_number = mips_cprestore_offset;
-                 macro_build_ldst_constoffset (NULL, &icnt, &expr1,
-                                               ADDRESS_LOAD_INSN,
+                 macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
                                                mips_gp_register,
                                                mips_frame_reg,
                                                HAVE_64BIT_ADDRESSES);
@@ -5662,11 +5548,9 @@ macro (struct mips_cl_insn *ip)
 
     case M_JAL_A:
       if (mips_pic == NO_PIC)
-       macro_build (NULL, &icnt, &offset_expr, "jal", "a");
+       macro_build (&offset_expr, "jal", "a");
       else if (mips_pic == SVR4_PIC)
        {
-         char *p = NULL;
-
          /* If this is a reference to an external symbol, and we are
             using a small GOT, we want
               lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_CALL16)
@@ -5700,80 +5584,73 @@ macro (struct mips_cl_insn *ip)
              if (! mips_big_got)
                {
                  relax_start (offset_expr.X_add_symbol);
-                 macro_build (NULL, &icnt, &offset_expr, ADDRESS_LOAD_INSN,
-                              "t,o(b)", PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
+                 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
+                              PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
                               mips_gp_register);
                  relax_switch ();
-                 macro_build (NULL, &icnt, &offset_expr, ADDRESS_LOAD_INSN,
-                              "t,o(b)", PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
+                 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
+                              PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
                               mips_gp_register);
                  relax_end ();
                }
              else
                {
                  relax_start (offset_expr.X_add_symbol);
-                 macro_build (NULL, &icnt, &offset_expr, "lui", "t,u",
-                              PIC_CALL_REG, BFD_RELOC_MIPS_CALL_HI16);
-                 macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
-                              PIC_CALL_REG, PIC_CALL_REG, mips_gp_register);
-                 macro_build (NULL, &icnt, &offset_expr, ADDRESS_LOAD_INSN,
-                              "t,o(b)", PIC_CALL_REG,
-                              BFD_RELOC_MIPS_CALL_LO16, PIC_CALL_REG);
+                 macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
+                              BFD_RELOC_MIPS_CALL_HI16);
+                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
+                              PIC_CALL_REG, mips_gp_register);
+                 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
+                              PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
+                              PIC_CALL_REG);
                  relax_switch ();
-                 macro_build (p, &icnt, &offset_expr, ADDRESS_LOAD_INSN,
-                              "t,o(b)", PIC_CALL_REG,
-                              BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
-                 macro_build (p + 4, &icnt, &offset_expr, ADDRESS_ADDI_INSN,
-                              "t,r,j", PIC_CALL_REG, PIC_CALL_REG,
+                 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
+                              PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
+                              mips_gp_register);
+                 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
+                              PIC_CALL_REG, PIC_CALL_REG,
                               BFD_RELOC_MIPS_GOT_OFST);
                  relax_end ();
                }
 
-             macro_build_jalr (icnt, &offset_expr);
+             macro_build_jalr (&offset_expr);
            }
          else
            {
              relax_start (offset_expr.X_add_symbol);
              if (! mips_big_got)
                {
-                 macro_build (NULL, &icnt, &offset_expr, ADDRESS_LOAD_INSN,
-                              "t,o(b)", PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
+                 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
+                              PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
                               mips_gp_register);
-                 macro_build (NULL, &icnt, NULL, "nop", "");
+                 macro_build (NULL, "nop", "");
                  relax_switch ();
                }
              else
                {
-                 int gpdel;
-
-                 if (reg_needs_delay (mips_gp_register))
-                   gpdel = 4;
-                 else
-                   gpdel = 0;
-                 macro_build (NULL, &icnt, &offset_expr, "lui", "t,u",
-                              PIC_CALL_REG, BFD_RELOC_MIPS_CALL_HI16);
-                 macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
-                              PIC_CALL_REG, PIC_CALL_REG, mips_gp_register);
-                 macro_build (NULL, &icnt, &offset_expr, ADDRESS_LOAD_INSN,
-                              "t,o(b)", PIC_CALL_REG,
-                              BFD_RELOC_MIPS_CALL_LO16, PIC_CALL_REG);
-                 macro_build (NULL, &icnt, NULL, "nop", "");
+                 int gpdelay;
+
+                 gpdelay = reg_needs_delay (mips_gp_register);
+                 macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
+                              BFD_RELOC_MIPS_CALL_HI16);
+                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
+                              PIC_CALL_REG, mips_gp_register);
+                 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
+                              PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
+                              PIC_CALL_REG);
+                 macro_build (NULL, "nop", "");
                  relax_switch ();
-                 if (gpdel > 0)
-                   {
-                     macro_build (p, &icnt, NULL, "nop", "");
-                     p += 4;
-                   }
+                 if (gpdelay)
+                   macro_build (NULL, "nop", "");
                }
-             macro_build (p, &icnt, &offset_expr, ADDRESS_LOAD_INSN,
-                          "t,o(b)", PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
+             macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
+                          PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
                           mips_gp_register);
-             macro_build (p, &icnt, NULL, "nop", "");
-             macro_build (p, &icnt, &offset_expr, ADDRESS_ADDI_INSN,
-                          "t,r,j", PIC_CALL_REG, PIC_CALL_REG,
-                          BFD_RELOC_LO16);
+             macro_build (NULL, "nop", "");
+             macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
+                          PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
              relax_end ();
-             macro_build_jalr (icnt, &offset_expr);
+             macro_build_jalr (&offset_expr);
 
              if (mips_cprestore_offset < 0)
                as_warn (_("No .cprestore pseudo-op used in PIC code"));
@@ -5792,10 +5669,9 @@ macro (struct mips_cl_insn *ip)
                      mips_cprestore_valid = 1;
                    }
                  if (mips_opts.noreorder)
-                   macro_build (NULL, &icnt, NULL, "nop", "");
+                   macro_build (NULL, "nop", "");
                  expr1.X_add_number = mips_cprestore_offset;
-                 macro_build_ldst_constoffset (NULL, &icnt, &expr1,
-                                               ADDRESS_LOAD_INSN,
+                 macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
                                                mips_gp_register,
                                                mips_frame_reg,
                                                HAVE_64BIT_ADDRESSES);
@@ -5804,7 +5680,7 @@ macro (struct mips_cl_insn *ip)
        }
       else if (mips_pic == EMBEDDED_PIC)
        {
-         macro_build (NULL, &icnt, &offset_expr, "bal", "p");
+         macro_build (&offset_expr, "bal", "p");
          /* The linker may expand the call to a longer sequence which
             uses $at, so we must break rather than return.  */
          break;
@@ -6030,15 +5906,15 @@ macro (struct mips_cl_insn *ip)
              nice to emit:
                 <op>    $treg,<sym>($breg)      (BFD_RELOC_PCREL_LO16)
              instead, but that seems quite difficult.  */
-          macro_build (NULL, &icnt, &offset_expr, "lui", "t,u", tempreg,
+          macro_build (&offset_expr, "lui", "t,u", tempreg,
                       BFD_RELOC_PCREL_HI16_S);
-          macro_build (NULL, &icnt, NULL,
-                       ((bfd_arch_bits_per_address (stdoutput) == 32
-                         || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
-                        ? "addu" : "daddu"),
-                       "d,v,t", tempreg, tempreg, breg);
-          macro_build (NULL, &icnt, &offset_expr, s, fmt, treg,
-                       BFD_RELOC_PCREL_LO16, tempreg);
+          macro_build (NULL,
+                      ((bfd_arch_bits_per_address (stdoutput) == 32
+                        || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
+                       ? "addu" : "daddu"),
+                      "d,v,t", tempreg, tempreg, breg);
+          macro_build (&offset_expr, s, fmt, treg,
+                      BFD_RELOC_PCREL_LO16, tempreg);
           if (! used_at)
             return;
           break;
@@ -6056,8 +5932,6 @@ macro (struct mips_cl_insn *ip)
       if (mips_pic == NO_PIC
          || offset_expr.X_op == O_constant)
        {
-         char *p = NULL;
-
          /* If this is a reference to a GP relative symbol, and there
             is no base register, we want
               <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
@@ -6143,46 +6017,39 @@ macro (struct mips_cl_insn *ip)
                  && offset_expr.X_op == O_constant
                  && ! IS_SEXT_32BIT_NUM (offset_expr.X_add_number + 0x8000)))
            {
-             p = NULL;
-
              /* We don't do GP optimization for now because RELAX_ENCODE can't
                 hold the data for such large chunks.  */
 
              if (used_at == 0 && ! mips_opts.noat)
                {
-                 macro_build (p, &icnt, &offset_expr, "lui", "t,u",
-                              tempreg, BFD_RELOC_MIPS_HIGHEST);
-                 macro_build (p, &icnt, &offset_expr, "lui", "t,u",
-                              AT, BFD_RELOC_HI16_S);
-                 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
-                              tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
+                 macro_build (&offset_expr, "lui", "t,u", tempreg,
+                              BFD_RELOC_MIPS_HIGHEST);
+                 macro_build (&offset_expr, "lui", "t,u", AT,
+                              BFD_RELOC_HI16_S);
+                 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
+                              tempreg, BFD_RELOC_MIPS_HIGHER);
                  if (breg != 0)
-                   macro_build (p, &icnt, NULL, "daddu", "d,v,t",
-                                AT, AT, breg);
-                 macro_build (p, &icnt, NULL, "dsll32", "d,w,<",
-                              tempreg, tempreg, 0);
-                 macro_build (p, &icnt, NULL, "daddu", "d,v,t",
-                              tempreg, tempreg, AT);
-                 macro_build (p, &icnt, &offset_expr, s, fmt, treg,
-                              BFD_RELOC_LO16, tempreg);
+                   macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
+                 macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
+                 macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
+                 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
+                              tempreg);
                  used_at = 1;
                }
              else
                {
-                 macro_build (p, &icnt, &offset_expr, "lui", "t,u",
-                              tempreg, BFD_RELOC_MIPS_HIGHEST);
-                 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
-                              tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
-                 macro_build (p, &icnt, NULL, "dsll", "d,w,<",
-                              tempreg, tempreg, 16);
-                 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
-                              tempreg, tempreg, BFD_RELOC_HI16_S);
-                 macro_build (p, &icnt, NULL, "dsll", "d,w,<",
-                              tempreg, tempreg, 16);
+                 macro_build (&offset_expr, "lui", "t,u", tempreg,
+                              BFD_RELOC_MIPS_HIGHEST);
+                 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
+                              tempreg, BFD_RELOC_MIPS_HIGHER);
+                 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
+                 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
+                              tempreg, BFD_RELOC_HI16_S);
+                 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
                  if (breg != 0)
-                   macro_build (p, &icnt, NULL, "daddu", "d,v,t",
+                   macro_build (NULL, "daddu", "d,v,t",
                                 tempreg, tempreg, breg);
-                 macro_build (p, &icnt, &offset_expr, s, fmt, treg,
+                 macro_build (&offset_expr, s, fmt, treg,
                               BFD_RELOC_LO16, tempreg);
                }
 
@@ -6195,41 +6062,37 @@ macro (struct mips_cl_insn *ip)
 
          if (breg == 0)
            {
-             if ((valueT) offset_expr.X_add_number > MAX_GPREL_OFFSET
-                 || nopic_need_relax (offset_expr.X_add_symbol, 1))
-               p = NULL;
-             else
+             if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
+                 && ! nopic_need_relax (offset_expr.X_add_symbol, 1))
                {
                  relax_start (offset_expr.X_add_symbol);
-                 macro_build (NULL, &icnt, &offset_expr, s, fmt, treg,
-                              BFD_RELOC_GPREL16, mips_gp_register);
+                 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
+                              mips_gp_register);
                  relax_switch ();
                  used_at = 0;
                }
-             macro_build_lui (p, &icnt, &offset_expr, tempreg);
-             macro_build (p, &icnt, &offset_expr, s, fmt, treg,
+             macro_build_lui (&offset_expr, tempreg);
+             macro_build (&offset_expr, s, fmt, treg,
                           BFD_RELOC_LO16, tempreg);
              if (mips_relax.sequence)
                relax_end ();
            }
          else
            {
-             if ((valueT) offset_expr.X_add_number > MAX_GPREL_OFFSET
-                 || nopic_need_relax (offset_expr.X_add_symbol, 1))
-               p = NULL;
-             else
+             if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
+                 && ! nopic_need_relax (offset_expr.X_add_symbol, 1))
                {
                  relax_start (offset_expr.X_add_symbol);
-                 macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
+                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
                               tempreg, breg, mips_gp_register);
-                 macro_build (NULL, &icnt, &offset_expr, s, fmt, treg,
+                 macro_build (&offset_expr, s, fmt, treg,
                               BFD_RELOC_GPREL16, tempreg);
                  relax_switch ();
                }
-             macro_build_lui (p, &icnt, &offset_expr, tempreg);
-             macro_build (p, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
+             macro_build_lui (&offset_expr, tempreg);
+             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
                           tempreg, tempreg, breg);
-             macro_build (p, &icnt, &offset_expr, s, fmt, treg,
+             macro_build (&offset_expr, s, fmt, treg,
                           BFD_RELOC_LO16, tempreg);
              if (mips_relax.sequence)
                relax_end ();
@@ -6237,7 +6100,6 @@ macro (struct mips_cl_insn *ip)
        }
       else if (mips_pic == SVR4_PIC && ! mips_big_got)
        {
-         char *p = NULL;
          int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
 
          /* If this is a reference to an external symbol, we want
@@ -6263,13 +6125,12 @@ macro (struct mips_cl_insn *ip)
          assert (offset_expr.X_op == O_symbol);
          if (HAVE_NEWABI)
            {
-             macro_build (NULL, &icnt, &offset_expr, ADDRESS_LOAD_INSN,
-                          "t,o(b)", tempreg, BFD_RELOC_MIPS_GOT_PAGE,
-                          mips_gp_register);
+             macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
+                          BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
              if (breg != 0)
-               macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
+               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
                             tempreg, tempreg, breg);
-             macro_build (NULL, &icnt, &offset_expr, s, fmt, treg,
+             macro_build (&offset_expr, s, fmt, treg,
                           BFD_RELOC_MIPS_GOT_OFST, tempreg);
 
              if (! used_at)
@@ -6282,24 +6143,22 @@ macro (struct mips_cl_insn *ip)
          if (expr1.X_add_number < -0x8000
              || expr1.X_add_number >= 0x8000)
            as_bad (_("PIC code offset overflow (max 16 signed bits)"));
-         macro_build (NULL, &icnt, &offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
-                      tempreg, lw_reloc_type, mips_gp_register);
-         macro_build (NULL, &icnt, NULL, "nop", "");
+         macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
+                      lw_reloc_type, mips_gp_register);
+         macro_build (NULL, "nop", "");
          relax_start (offset_expr.X_add_symbol);
          relax_switch ();
-         macro_build (p, &icnt, &offset_expr, ADDRESS_ADDI_INSN,
-                      "t,r,j", tempreg, tempreg, BFD_RELOC_LO16);
+         macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
+                      tempreg, BFD_RELOC_LO16);
          relax_end ();
          if (breg != 0)
-           macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
+           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
                         tempreg, tempreg, breg);
-         macro_build (NULL, &icnt, &expr1, s, fmt, treg, BFD_RELOC_LO16,
-                      tempreg);
+         macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
        }
       else if (mips_pic == SVR4_PIC && ! HAVE_NEWABI)
        {
-         int gpdel;
-         char *p = NULL;
+         int gpdelay;
 
          /* If this is a reference to an external symbol, we want
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
@@ -6323,38 +6182,31 @@ macro (struct mips_cl_insn *ip)
          if (expr1.X_add_number < -0x8000
              || expr1.X_add_number >= 0x8000)
            as_bad (_("PIC code offset overflow (max 16 signed bits)"));
-         if (reg_needs_delay (mips_gp_register))
-           gpdel = 4;
-         else
-           gpdel = 0;
+         gpdelay = reg_needs_delay (mips_gp_register);
          relax_start (offset_expr.X_add_symbol);
-         macro_build (NULL, &icnt, &offset_expr, "lui", "t,u", tempreg,
+         macro_build (&offset_expr, "lui", "t,u", tempreg,
                       BFD_RELOC_MIPS_GOT_HI16);
-         macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
-                      tempreg, tempreg, mips_gp_register);
-         macro_build (NULL, &icnt, &offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
-                      tempreg, BFD_RELOC_MIPS_GOT_LO16, tempreg);
+         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
+                      mips_gp_register);
+         macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
+                      BFD_RELOC_MIPS_GOT_LO16, tempreg);
          relax_switch ();
-         if (gpdel > 0)
-           macro_build (p, &icnt, NULL, "nop", "");
-         macro_build (p, &icnt, &offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
-                      tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
-         macro_build (p, &icnt, NULL, "nop", "");
-         macro_build (p, &icnt, &offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
-                      tempreg, tempreg, BFD_RELOC_LO16);
+         if (gpdelay)
+           macro_build (NULL, "nop", "");
+         macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
+                      BFD_RELOC_MIPS_GOT16, mips_gp_register);
+         macro_build (NULL, "nop", "");
+         macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
+                      tempreg, BFD_RELOC_LO16);
          relax_end ();
 
          if (breg != 0)
-           macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
+           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
                         tempreg, tempreg, breg);
-         macro_build (NULL, &icnt, &expr1, s, fmt, treg, BFD_RELOC_LO16,
-                      tempreg);
+         macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
        }
       else if (mips_pic == SVR4_PIC && HAVE_NEWABI)
        {
-         char *p = NULL;
-         int bregsz = breg != 0 ? 4 : 0;
-
          /* If this is a reference to an external symbol, we want
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
               add      $tempreg,$tempreg,$gp
@@ -6370,26 +6222,25 @@ macro (struct mips_cl_insn *ip)
              || expr1.X_add_number >= 0x8000)
            as_bad (_("PIC code offset overflow (max 16 signed bits)"));
          relax_start (offset_expr.X_add_symbol);
-         macro_build (NULL, &icnt, &offset_expr, "lui", "t,u", tempreg,
+         macro_build (&offset_expr, "lui", "t,u", tempreg,
                       BFD_RELOC_MIPS_GOT_HI16);
-         macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
-                      tempreg, tempreg, mips_gp_register);
-         macro_build (NULL, &icnt, &offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
-                      tempreg, BFD_RELOC_MIPS_GOT_LO16, tempreg);
+         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
+                      mips_gp_register);
+         macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
+                      BFD_RELOC_MIPS_GOT_LO16, tempreg);
          if (breg != 0)
-           macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
+           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
                         tempreg, tempreg, breg);
-         macro_build (NULL, &icnt, &expr1, s, fmt, treg, BFD_RELOC_LO16,
-                      tempreg);
+         macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
 
          relax_switch ();
          offset_expr.X_add_number = expr1.X_add_number;
-         macro_build (p, &icnt, &offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
-                      tempreg, BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
+         macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
+                      BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
          if (breg != 0)
-           macro_build (p + 4, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
+           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
                         tempreg, tempreg, breg);
-         macro_build (p + 4 + bregsz, &icnt, &offset_expr, s, fmt, treg,
+         macro_build (&offset_expr, s, fmt, treg,
                       BFD_RELOC_MIPS_GOT_OFST, tempreg);
          relax_end ();
        }
@@ -6404,15 +6255,15 @@ macro (struct mips_cl_insn *ip)
          assert (offset_expr.X_op == O_symbol);
          if (breg == 0)
            {
-             macro_build (NULL, &icnt, &offset_expr, s, fmt, treg,
-                          BFD_RELOC_GPREL16, mips_gp_register);
+             macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
+                          mips_gp_register);
              used_at = 0;
            }
          else
            {
-             macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
+             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
                           tempreg, breg, mips_gp_register);
-             macro_build (NULL, &icnt, &offset_expr, s, fmt, treg,
+             macro_build (&offset_expr, s, fmt, treg,
                           BFD_RELOC_GPREL16, tempreg);
            }
        }
@@ -6426,18 +6277,18 @@ macro (struct mips_cl_insn *ip)
 
     case M_LI:
     case M_LI_S:
-      load_register (&icnt, treg, &imm_expr, 0);
+      load_register (treg, &imm_expr, 0);
       return;
 
     case M_DLI:
-      load_register (&icnt, treg, &imm_expr, 1);
+      load_register (treg, &imm_expr, 1);
       return;
 
     case M_LI_SS:
       if (imm_expr.X_op == O_constant)
        {
-         load_register (&icnt, AT, &imm_expr, 0);
-         macro_build (NULL, &icnt, NULL, "mtc1", "t,G", AT, treg);
+         load_register (AT, &imm_expr, 0);
+         macro_build (NULL, "mtc1", "t,G", AT, treg);
          break;
        }
       else
@@ -6447,7 +6298,7 @@ macro (struct mips_cl_insn *ip)
                                           (offset_expr.X_add_symbol)),
                             ".lit4") == 0
                  && offset_expr.X_add_number == 0);
-         macro_build (NULL, &icnt, &offset_expr, "lwc1", "T,o(b)", treg,
+         macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
                       BFD_RELOC_MIPS_LITERAL, mips_gp_register);
          return;
        }
@@ -6460,7 +6311,7 @@ macro (struct mips_cl_insn *ip)
       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
        {
          if (HAVE_64BIT_GPRS)
-           load_register (&icnt, treg, &imm_expr, 1);
+           load_register (treg, &imm_expr, 1);
          else
            {
              int hreg, lreg;
@@ -6477,15 +6328,15 @@ macro (struct mips_cl_insn *ip)
                }
 
              if (hreg <= 31)
-               load_register (&icnt, hreg, &imm_expr, 0);
+               load_register (hreg, &imm_expr, 0);
              if (lreg <= 31)
                {
                  if (offset_expr.X_op == O_absent)
-                   move_register (&icnt, lreg, 0);
+                   move_register (lreg, 0);
                  else
                    {
                      assert (offset_expr.X_op == O_constant);
-                     load_register (&icnt, lreg, &offset_expr, 0);
+                     load_register (lreg, &offset_expr, 0);
                    }
                }
            }
@@ -6496,19 +6347,19 @@ macro (struct mips_cl_insn *ip)
         upper 16 bits of the address.  */
       if (mips_pic == NO_PIC)
        {
-         macro_build_lui (NULL, &icnt, &offset_expr, AT);
+         macro_build_lui (&offset_expr, AT);
        }
       else if (mips_pic == SVR4_PIC)
        {
-         macro_build (NULL, &icnt, &offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
-                      AT, BFD_RELOC_MIPS_GOT16, mips_gp_register);
+         macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
+                      BFD_RELOC_MIPS_GOT16, mips_gp_register);
        }
       else if (mips_pic == EMBEDDED_PIC)
        {
          /* For embedded PIC we pick up the entire address off $gp in
             a single instruction.  */
-         macro_build (NULL, &icnt, &offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
-                      AT, mips_gp_register, BFD_RELOC_GPREL16);
+         macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", AT,
+                      mips_gp_register, BFD_RELOC_GPREL16);
          offset_expr.X_op = O_constant;
          offset_expr.X_add_number = 0;
        }
@@ -6517,18 +6368,16 @@ macro (struct mips_cl_insn *ip)
 
       /* Now we load the register(s).  */
       if (HAVE_64BIT_GPRS)
-       macro_build (NULL, &icnt, &offset_expr, "ld", "t,o(b)", treg,
-                    BFD_RELOC_LO16, AT);
+       macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
       else
        {
-         macro_build (NULL, &icnt, &offset_expr, "lw", "t,o(b)", treg,
-                      BFD_RELOC_LO16, AT);
+         macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
          if (treg != RA)
            {
              /* FIXME: How in the world do we deal with the possible
                 overflow here?  */
              offset_expr.X_add_number += 4;
-             macro_build (NULL, &icnt, &offset_expr, "lw", "t,o(b)",
+             macro_build (&offset_expr, "lw", "t,o(b)",
                           treg + 1, BFD_RELOC_LO16, AT);
            }
        }
@@ -6542,22 +6391,22 @@ macro (struct mips_cl_insn *ip)
          OFFSET_EXPR.  */
       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
        {
-         load_register (&icnt, AT, &imm_expr, HAVE_64BIT_FPRS);
+         load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
          if (HAVE_64BIT_FPRS)
            {
              assert (HAVE_64BIT_GPRS);
-             macro_build (NULL, &icnt, NULL, "dmtc1", "t,S", AT, treg);
+             macro_build (NULL, "dmtc1", "t,S", AT, treg);
            }
          else
            {
-             macro_build (NULL, &icnt, NULL, "mtc1", "t,G", AT, treg + 1);
+             macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
              if (offset_expr.X_op == O_absent)
-               macro_build (NULL, &icnt, NULL, "mtc1", "t,G", 0, treg);
+               macro_build (NULL, "mtc1", "t,G", 0, treg);
              else
                {
                  assert (offset_expr.X_op == O_constant);
-                 load_register (&icnt, AT, &offset_expr, 0);
-                 macro_build (NULL, &icnt, NULL, "mtc1", "t,G", AT, treg);
+                 load_register (AT, &offset_expr, 0);
+                 macro_build (NULL, "mtc1", "t,G", AT, treg);
                }
            }
          break;
@@ -6570,7 +6419,7 @@ macro (struct mips_cl_insn *ip)
        {
          if (mips_opts.isa != ISA_MIPS1)
            {
-             macro_build (NULL, &icnt, &offset_expr, "ldc1", "T,o(b)", treg,
+             macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
                           BFD_RELOC_MIPS_LITERAL, mips_gp_register);
              return;
            }
@@ -6582,19 +6431,18 @@ macro (struct mips_cl_insn *ip)
        {
          assert (strcmp (s, RDATA_SECTION_NAME) == 0);
          if (mips_pic == SVR4_PIC)
-           macro_build (NULL, &icnt, &offset_expr, ADDRESS_LOAD_INSN,
-                        "t,o(b)", AT, BFD_RELOC_MIPS_GOT16,
-                        mips_gp_register);
+           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
+                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
          else
            {
              /* FIXME: This won't work for a 64 bit address.  */
-             macro_build_lui (NULL, &icnt, &offset_expr, AT);
+             macro_build_lui (&offset_expr, AT);
            }
 
          if (mips_opts.isa != ISA_MIPS1)
            {
-             macro_build (NULL, &icnt, &offset_expr, "ldc1", "T,o(b)", treg,
-                          BFD_RELOC_LO16, AT);
+             macro_build (&offset_expr, "ldc1", "T,o(b)",
+                          treg, BFD_RELOC_LO16, AT);
              break;
            }
          breg = AT;
@@ -6613,12 +6461,12 @@ macro (struct mips_cl_insn *ip)
       r = BFD_RELOC_LO16;
     dob:
       assert (mips_opts.isa == ISA_MIPS1);
-      macro_build (NULL, &icnt, &offset_expr, "lwc1", "T,o(b)",
+      macro_build (&offset_expr, "lwc1", "T,o(b)",
                   target_big_endian ? treg + 1 : treg, r, breg);
       /* FIXME: A possible overflow which I don't know how to deal
         with.  */
       offset_expr.X_add_number += 4;
-      macro_build (NULL, &icnt, &offset_expr, "lwc1", "T,o(b)",
+      macro_build (&offset_expr, "lwc1", "T,o(b)",
                   target_big_endian ? treg : treg + 1, r, breg);
 
       if (breg != AT)
@@ -6717,8 +6565,6 @@ macro (struct mips_cl_insn *ip)
       if (mips_pic == NO_PIC
          || offset_expr.X_op == O_constant)
        {
-         char *p = NULL;
-
          /* If this is a reference to a GP relative symbol, we want
               <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
               <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
@@ -6735,33 +6581,25 @@ macro (struct mips_cl_insn *ip)
             the last case.  */
          if ((valueT) offset_expr.X_add_number > MAX_GPREL_OFFSET
              || nopic_need_relax (offset_expr.X_add_symbol, 1))
-           {
-             p = NULL;
-             used_at = 1;
-           }
+           used_at = 1;
          else
            {
-             int off;
-
              relax_start (offset_expr.X_add_symbol);
              if (breg == 0)
                {
                  tempreg = mips_gp_register;
-                 off = 0;
                  used_at = 0;
                }
              else
                {
-                 macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
+                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
                               AT, breg, mips_gp_register);
                  tempreg = AT;
-                 off = 4;
                  used_at = 1;
                }
 
              /* Itbl support may require additional care here.  */
-             macro_build (NULL, &icnt, &offset_expr, s, fmt,
-                          coproc ? treg + 1 : treg,
+             macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
                           BFD_RELOC_GPREL16, tempreg);
              offset_expr.X_add_number += 4;
 
@@ -6770,8 +6608,7 @@ macro (struct mips_cl_insn *ip)
              hold_mips_optimize = mips_optimize;
              mips_optimize = 2;
              /* Itbl support may require additional care here.  */
-             macro_build (NULL, &icnt, &offset_expr, s, fmt,
-                          coproc ? treg : treg + 1,
+             macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
                           BFD_RELOC_GPREL16, tempreg);
              mips_optimize = hold_mips_optimize;
 
@@ -6798,27 +6635,22 @@ macro (struct mips_cl_insn *ip)
                  offset_expr.X_op = O_constant;
                }
            }
-         macro_build_lui (p, &icnt, &offset_expr, AT);
+         macro_build_lui (&offset_expr, AT);
          if (breg != 0)
-           macro_build (p, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
-                          AT, breg, AT);
+           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
          /* Itbl support may require additional care here.  */
-         macro_build (p, &icnt, &offset_expr, s, fmt,
-                      coproc ? treg + 1 : treg,
+         macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
                       BFD_RELOC_LO16, AT);
          /* FIXME: How do we handle overflow here?  */
          offset_expr.X_add_number += 4;
          /* Itbl support may require additional care here.  */
-         macro_build (p, &icnt, &offset_expr, s, fmt,
-                      coproc ? treg : treg + 1,
+         macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
                       BFD_RELOC_LO16, AT);
          if (mips_relax.sequence)
            relax_end ();
        }
       else if (mips_pic == SVR4_PIC && ! mips_big_got)
        {
-         int off;
-
          /* If this is a reference to an external symbol, we want
               lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
               nop
@@ -6837,15 +6669,10 @@ macro (struct mips_cl_insn *ip)
          if (expr1.X_add_number < -0x8000
              || expr1.X_add_number >= 0x8000 - 4)
            as_bad (_("PIC code offset overflow (max 16 signed bits)"));
-         if (breg == 0)
-           off = 0;
-         else
-           off = 4;
-         load_got_offset (&icnt, AT, &offset_expr);
-         macro_build (NULL, &icnt, NULL, "nop", "");
+         load_got_offset (AT, &offset_expr);
+         macro_build (NULL, "nop", "");
          if (breg != 0)
-           macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
-                        AT, breg, AT);
+           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
 
          /* Set mips_optimize to 2 to avoid inserting an undesired
              nop.  */
@@ -6854,25 +6681,24 @@ macro (struct mips_cl_insn *ip)
 
          /* Itbl support may require additional care here.  */
          relax_start (offset_expr.X_add_symbol);
-         macro_build (NULL, &icnt, &expr1, s, fmt,
-                      coproc ? treg + 1 : treg, BFD_RELOC_LO16, AT);
+         macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
+                      BFD_RELOC_LO16, AT);
          expr1.X_add_number += 4;
-         macro_build (NULL, &icnt, &expr1, s, fmt,
-                      coproc ? treg : treg + 1, BFD_RELOC_LO16, AT);
+         macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
+                      BFD_RELOC_LO16, AT);
          relax_switch ();
-         macro_build (NULL, &icnt, &offset_expr, s, fmt,
-                      coproc ? treg + 1 : treg, BFD_RELOC_LO16, AT);
+         macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
+                      BFD_RELOC_LO16, AT);
          offset_expr.X_add_number += 4;
-         macro_build (NULL, &icnt, &offset_expr, s, fmt,
-                      coproc ? treg : treg + 1, BFD_RELOC_LO16, AT);
+         macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
+                      BFD_RELOC_LO16, AT);
          relax_end ();
 
          mips_optimize = hold_mips_optimize;
        }
       else if (mips_pic == SVR4_PIC)
        {
-         int gpdel, off;
-         char *p = NULL;
+         int gpdelay;
 
          /* If this is a reference to an external symbol, we want
               lui      $at,<sym>               (BFD_RELOC_MIPS_GOT_HI16)
@@ -6895,27 +6721,19 @@ macro (struct mips_cl_insn *ip)
          if (expr1.X_add_number < -0x8000
              || expr1.X_add_number >= 0x8000 - 4)
            as_bad (_("PIC code offset overflow (max 16 signed bits)"));
-         if (reg_needs_delay (mips_gp_register))
-           gpdel = 4;
-         else
-           gpdel = 0;
-         if (breg == 0)
-           off = 0;
-         else
-           off = 4;
+         gpdelay = reg_needs_delay (mips_gp_register);
          relax_start (offset_expr.X_add_symbol);
-         macro_build (NULL, &icnt, &offset_expr, "lui", "t,u", AT,
-                      BFD_RELOC_MIPS_GOT_HI16);
-         macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
+         macro_build (&offset_expr, "lui", "t,u",
+                      AT, BFD_RELOC_MIPS_GOT_HI16);
+         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
                       AT, AT, mips_gp_register);
-         macro_build (NULL, &icnt, &offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
+         macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
                       AT, BFD_RELOC_MIPS_GOT_LO16, AT);
-         macro_build (NULL, &icnt, NULL, "nop", "");
+         macro_build (NULL, "nop", "");
          if (breg != 0)
-           macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
-                        AT, breg, AT);
+           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
          /* Itbl support may require additional care here.  */
-         macro_build (NULL, &icnt, &expr1, s, fmt, coproc ? treg + 1 : treg,
+         macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
                       BFD_RELOC_LO16, AT);
          expr1.X_add_number += 4;
 
@@ -6924,24 +6742,23 @@ macro (struct mips_cl_insn *ip)
          hold_mips_optimize = mips_optimize;
          mips_optimize = 2;
          /* Itbl support may require additional care here.  */
-         macro_build (NULL, &icnt, &expr1, s, fmt, coproc ? treg : treg + 1,
+         macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
                       BFD_RELOC_LO16, AT);
          mips_optimize = hold_mips_optimize;
          expr1.X_add_number -= 4;
 
          relax_switch ();
          offset_expr.X_add_number = expr1.X_add_number;
-         if (gpdel > 0)
-           macro_build (p, &icnt, NULL, "nop", "");
-         macro_build (p, &icnt, &offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
-                      AT, BFD_RELOC_MIPS_GOT16, mips_gp_register);
-         macro_build (p, &icnt, NULL, "nop", "");
+         if (gpdelay)
+           macro_build (NULL, "nop", "");
+         macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
+                      BFD_RELOC_MIPS_GOT16, mips_gp_register);
+         macro_build (NULL, "nop", "");
          if (breg != 0)
-           macro_build (p, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
-                        AT, breg, AT);
+           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
          /* Itbl support may require additional care here.  */
-         macro_build (p, &icnt, &offset_expr, s, fmt,
-                      coproc ? treg + 1 : treg, BFD_RELOC_LO16, AT);
+         macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
+                      BFD_RELOC_LO16, AT);
          offset_expr.X_add_number += 4;
 
          /* Set mips_optimize to 2 to avoid inserting an undesired
@@ -6949,8 +6766,8 @@ macro (struct mips_cl_insn *ip)
          hold_mips_optimize = mips_optimize;
          mips_optimize = 2;
          /* Itbl support may require additional care here.  */
-         macro_build (p, &icnt, &offset_expr, s, fmt,
-                      coproc ? treg : treg + 1, BFD_RELOC_LO16, AT);
+         macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
+                      BFD_RELOC_LO16, AT);
          mips_optimize = hold_mips_optimize;
          relax_end ();
        }
@@ -6971,20 +6788,18 @@ macro (struct mips_cl_insn *ip)
            }
          else
            {
-             macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
+             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
                           AT, breg, mips_gp_register);
              tempreg = AT;
              used_at = 1;
            }
 
          /* Itbl support may require additional care here.  */
-         macro_build (NULL, &icnt, &offset_expr, s, fmt,
-                      coproc ? treg + 1 : treg,
+         macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
                       BFD_RELOC_GPREL16, tempreg);
          offset_expr.X_add_number += 4;
          /* Itbl support may require additional care here.  */
-         macro_build (NULL, &icnt, &offset_expr, s, fmt,
-                      coproc ? treg : treg + 1,
+         macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
                       BFD_RELOC_GPREL16, tempreg);
        }
       else
@@ -7002,11 +6817,9 @@ macro (struct mips_cl_insn *ip)
       s = "sw";
     sd_ob:
       assert (HAVE_32BIT_ADDRESSES);
-      macro_build (NULL, &icnt, &offset_expr, s, "t,o(b)", treg,
-                  BFD_RELOC_LO16, breg);
+      macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
       offset_expr.X_add_number += 4;
-      macro_build (NULL, &icnt, &offset_expr, s, "t,o(b)", treg + 1,
-                  BFD_RELOC_LO16, breg);
+      macro_build (&offset_expr, s, "t,o(b)", treg + 1, BFD_RELOC_LO16, breg);
       return;
 
    /* New code added to support COPZ instructions.
@@ -7040,11 +6853,11 @@ macro (struct mips_cl_insn *ip)
     copz:
       /* For now we just do C (same as Cz).  The parameter will be
          stored in insn_opcode by mips_ip.  */
-      macro_build (NULL, &icnt, NULL, s, "C", ip->insn_opcode);
+      macro_build (NULL, s, "C", ip->insn_opcode);
       return;
 
     case M_MOVE:
-      move_register (&icnt, dreg, sreg);
+      move_register (dreg, sreg);
       return;
 
 #ifdef LOSING_COMPILER
@@ -7063,7 +6876,7 @@ macro (struct mips_cl_insn *ip)
          s = ip->insn_mo->name;
          s2 = "cop3";
          coproc = ITBL_DECODE_PNUM (immed_expr);;
-         macro_build (NULL, &icnt, &immed_expr, s, "C");
+         macro_build (&immed_expr, s, "C");
          return;
        }
       macro2 (ip);
@@ -7079,7 +6892,6 @@ macro2 (struct mips_cl_insn *ip)
   register int treg, sreg, dreg, breg;
   int tempreg;
   int mask;
-  int icnt = 0;
   int used_at;
   expressionS expr1;
   const char *s;
@@ -7093,7 +6905,6 @@ macro2 (struct mips_cl_insn *ip)
   int off;
   offsetT maxnum;
   bfd_reloc_code_real_type r;
-  char *p;
 
   treg = (ip->insn_opcode >> 16) & 0x1f;
   dreg = (ip->insn_opcode >> 11) & 0x1f;
@@ -7112,9 +6923,8 @@ macro2 (struct mips_cl_insn *ip)
     case M_DMUL:
       dbl = 1;
     case M_MUL:
-      macro_build (NULL, &icnt, NULL, dbl ? "dmultu" : "multu", "s,t",
-                  sreg, treg);
-      macro_build (NULL, &icnt, NULL, "mflo", "d", dreg);
+      macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
+      macro_build (NULL, "mflo", "d", dreg);
       return;
 
     case M_DMUL_I:
@@ -7123,10 +6933,9 @@ macro2 (struct mips_cl_insn *ip)
       /* The MIPS assembler some times generates shifts and adds.  I'm
         not trying to be that fancy. GCC should do this for us
         anyway.  */
-      load_register (&icnt, AT, &imm_expr, dbl);
-      macro_build (NULL, &icnt, NULL, dbl ? "dmult" : "mult", "s,t",
-                  sreg, AT);
-      macro_build (NULL, &icnt, NULL, "mflo", "d", dreg);
+      load_register (AT, &imm_expr, dbl);
+      macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
+      macro_build (NULL, "mflo", "d", dreg);
       break;
 
     case M_DMULO_I:
@@ -7143,24 +6952,22 @@ macro2 (struct mips_cl_insn *ip)
       ++mips_opts.noreorder;
       mips_any_noreorder = 1;
       if (imm)
-       load_register (&icnt, AT, &imm_expr, dbl);
-      macro_build (NULL, &icnt, NULL, dbl ? "dmult" : "mult", "s,t",
-                  sreg, imm ? AT : treg);
-      macro_build (NULL, &icnt, NULL, "mflo", "d", dreg);
-      macro_build (NULL, &icnt, NULL, dbl ? "dsra32" : "sra", "d,w,<",
-                  dreg, dreg, RA);
-      macro_build (NULL, &icnt, NULL, "mfhi", "d", AT);
+       load_register (AT, &imm_expr, dbl);
+      macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
+      macro_build (NULL, "mflo", "d", dreg);
+      macro_build (NULL, dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
+      macro_build (NULL, "mfhi", "d", AT);
       if (mips_trap)
-       macro_build (NULL, &icnt, NULL, "tne", "s,t,q", dreg, AT, 6);
+       macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
       else
        {
          expr1.X_add_number = 8;
-         macro_build (NULL, &icnt, &expr1, "beq", "s,t,p", dreg, AT);
-         macro_build (NULL, &icnt, NULL, "nop", "", 0);
-         macro_build (NULL, &icnt, NULL, "break", "c", 6);
+         macro_build (&expr1, "beq", "s,t,p", dreg, AT);
+         macro_build (NULL, "nop", "", 0);
+         macro_build (NULL, "break", "c", 6);
        }
       --mips_opts.noreorder;
-      macro_build (NULL, &icnt, NULL, "mflo", "d", dreg);
+      macro_build (NULL, "mflo", "d", dreg);
       break;
 
     case M_DMULOU_I:
@@ -7177,19 +6984,19 @@ macro2 (struct mips_cl_insn *ip)
       ++mips_opts.noreorder;
       mips_any_noreorder = 1;
       if (imm)
-       load_register (&icnt, AT, &imm_expr, dbl);
-      macro_build (NULL, &icnt, NULL, dbl ? "dmultu" : "multu", "s,t",
+       load_register (AT, &imm_expr, dbl);
+      macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
                   sreg, imm ? AT : treg);
-      macro_build (NULL, &icnt, NULL, "mfhi", "d", AT);
-      macro_build (NULL, &icnt, NULL, "mflo", "d", dreg);
+      macro_build (NULL, "mfhi", "d", AT);
+      macro_build (NULL, "mflo", "d", dreg);
       if (mips_trap)
-       macro_build (NULL, &icnt, NULL, "tne", "s,t,q", AT, 0, 6);
+       macro_build (NULL, "tne", "s,t,q", AT, 0, 6);
       else
        {
          expr1.X_add_number = 8;
-         macro_build (NULL, &icnt, &expr1, "beq", "s,t,p", AT, 0);
-         macro_build (NULL, &icnt, NULL, "nop", "", 0);
-         macro_build (NULL, &icnt, NULL, "break", "c", 6);
+         macro_build (&expr1, "beq", "s,t,p", AT, 0);
+         macro_build (NULL, "nop", "", 0);
+         macro_build (NULL, "break", "c", 6);
        }
       --mips_opts.noreorder;
       break;
@@ -7207,17 +7014,16 @@ macro2 (struct mips_cl_insn *ip)
              tempreg = dreg;
              used_at = 0;
            }
-         macro_build (NULL, &icnt, NULL, "dnegu", "d,w", tempreg, treg);
-         macro_build (NULL, &icnt, NULL, "drorv", "d,t,s", dreg, sreg,
-                      tempreg);
+         macro_build (NULL, "dnegu", "d,w", tempreg, treg);
+         macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
          if (used_at)
            break;
          return;
        }
-      macro_build (NULL, &icnt, NULL, "dsubu", "d,v,t", AT, 0, treg);
-      macro_build (NULL, &icnt, NULL, "dsrlv", "d,t,s", AT, sreg, AT);
-      macro_build (NULL, &icnt, NULL, "dsllv", "d,t,s", dreg, sreg, treg);
-      macro_build (NULL, &icnt, NULL, "or", "d,v,t", dreg, dreg, AT);
+      macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
+      macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
+      macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
+      macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
       break;
 
     case M_ROL:
@@ -7233,17 +7039,16 @@ macro2 (struct mips_cl_insn *ip)
              tempreg = dreg;
              used_at = 0;
            }
-         macro_build (NULL, &icnt, NULL, "negu", "d,w", tempreg, treg);
-         macro_build (NULL, &icnt, NULL, "rorv", "d,t,s", dreg, sreg,
-                      tempreg);
+         macro_build (NULL, "negu", "d,w", tempreg, treg);
+         macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
          if (used_at)
            break;
          return;
        }
-      macro_build (NULL, &icnt, NULL, "subu", "d,v,t", AT, 0, treg);
-      macro_build (NULL, &icnt, NULL, "srlv", "d,t,s", AT, sreg, AT);
-      macro_build (NULL, &icnt, NULL, "sllv", "d,t,s", dreg, sreg, treg);
-      macro_build (NULL, &icnt, NULL, "or", "d,v,t", dreg, dreg, AT);
+      macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
+      macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
+      macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
+      macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
       break;
 
     case M_DROL_I:
@@ -7258,25 +7063,22 @@ macro2 (struct mips_cl_insn *ip)
          {
            rot = (64 - rot) & 0x3f;
            if (rot >= 32)
-             macro_build (NULL, &icnt, NULL, "dror32", "d,w,<",
-                          dreg, sreg, rot - 32);
+             macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
            else
-             macro_build (NULL, &icnt, NULL, "dror", "d,w,<",
-                          dreg, sreg, rot);
+             macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
            return;
          }
        if (rot == 0)
          {
-           macro_build (NULL, &icnt, NULL, "dsrl", "d,w,<", dreg, sreg, 0);
+           macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
            return;
          }
        l = (rot < 0x20) ? "dsll" : "dsll32";
        r = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
        rot &= 0x1f;
-       macro_build (NULL, &icnt, NULL, l, "d,w,<", AT, sreg, rot);
-       macro_build (NULL, &icnt, NULL, r, "d,w,<", dreg, sreg,
-                    (0x20 - rot) & 0x1f);
-       macro_build (NULL, &icnt, NULL, "or", "d,v,t", dreg, dreg, AT);
+       macro_build (NULL, l, "d,w,<", AT, sreg, rot);
+       macro_build (NULL, r, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
+       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
       }
       break;
 
@@ -7289,44 +7091,42 @@ macro2 (struct mips_cl_insn *ip)
        rot = imm_expr.X_add_number & 0x1f;
        if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
          {
-           macro_build (NULL, &icnt, NULL, "ror", "d,w,<", dreg, sreg,
-                        (32 - rot) & 0x1f);
+           macro_build (NULL, "ror", "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
            return;
          }
        if (rot == 0)
          {
-           macro_build (NULL, &icnt, NULL, "srl", "d,w,<", dreg, sreg, 0);
+           macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
            return;
          }
-       macro_build (NULL, &icnt, NULL, "sll", "d,w,<", AT, sreg, rot);
-       macro_build (NULL, &icnt, NULL, "srl", "d,w,<", dreg, sreg,
-                    (0x20 - rot) & 0x1f);
-       macro_build (NULL, &icnt, NULL, "or", "d,v,t", dreg, dreg, AT);
+       macro_build (NULL, "sll", "d,w,<", AT, sreg, rot);
+       macro_build (NULL, "srl", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
+       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
       }
       break;
 
     case M_DROR:
       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
        {
-         macro_build (NULL, &icnt, NULL, "drorv", "d,t,s", dreg, sreg, treg);
+         macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
          return;
        }
-      macro_build (NULL, &icnt, NULL, "dsubu", "d,v,t", AT, 0, treg);
-      macro_build (NULL, &icnt, NULL, "dsllv", "d,t,s", AT, sreg, AT);
-      macro_build (NULL, &icnt, NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
-      macro_build (NULL, &icnt, NULL, "or", "d,v,t", dreg, dreg, AT);
+      macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
+      macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
+      macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
+      macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
       break;
 
     case M_ROR:
       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
        {
-         macro_build (NULL, &icnt, NULL, "rorv", "d,t,s", dreg, sreg, treg);
+         macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
          return;
        }
-      macro_build (NULL, &icnt, NULL, "subu", "d,v,t", AT, 0, treg);
-      macro_build (NULL, &icnt, NULL, "sllv", "d,t,s", AT, sreg, AT);
-      macro_build (NULL, &icnt, NULL, "srlv", "d,t,s", dreg, sreg, treg);
-      macro_build (NULL, &icnt, NULL, "or", "d,v,t", dreg, dreg, AT);
+      macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
+      macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
+      macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
+      macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
       break;
 
     case M_DROR_I:
@@ -7340,25 +7140,22 @@ macro2 (struct mips_cl_insn *ip)
        if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
          {
            if (rot >= 32)
-             macro_build (NULL, &icnt, NULL, "dror32", "d,w,<",
-                          dreg, sreg, rot - 32);
+             macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
            else
-             macro_build (NULL, &icnt, NULL, "dror", "d,w,<",
-                          dreg, sreg, rot);
+             macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
            return;
          }
        if (rot == 0)
          {
-           macro_build (NULL, &icnt, NULL, "dsrl", "d,w,<", dreg, sreg, 0);
+           macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
            return;
          }
        r = (rot < 0x20) ? "dsrl" : "dsrl32";
        l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
        rot &= 0x1f;
-       macro_build (NULL, &icnt, NULL, r, "d,w,<", AT, sreg, rot);
-       macro_build (NULL, &icnt, NULL, l, "d,w,<", dreg, sreg,
-                    (0x20 - rot) & 0x1f);
-       macro_build (NULL, &icnt, NULL, "or", "d,v,t", dreg, dreg, AT);
+       macro_build (NULL, r, "d,w,<", AT, sreg, rot);
+       macro_build (NULL, l, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
+       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
       }
       break;
 
@@ -7371,18 +7168,17 @@ macro2 (struct mips_cl_insn *ip)
        rot = imm_expr.X_add_number & 0x1f;
        if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
          {
-           macro_build (NULL, &icnt, NULL, "ror", "d,w,<", dreg, sreg, rot);
+           macro_build (NULL, "ror", "d,w,<", dreg, sreg, rot);
            return;
          }
        if (rot == 0)
          {
-           macro_build (NULL, &icnt, NULL, "srl", "d,w,<", dreg, sreg, 0);
+           macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
            return;
          }
-       macro_build (NULL, &icnt, NULL, "srl", "d,w,<", AT, sreg, rot);
-       macro_build (NULL, &icnt, NULL, "sll", "d,w,<", dreg, sreg,
-                    (0x20 - rot) & 0x1f);
-       macro_build (NULL, &icnt, NULL, "or", "d,v,t", dreg, dreg, AT);
+       macro_build (NULL, "srl", "d,w,<", AT, sreg, rot);
+       macro_build (NULL, "sll", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
+       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
       }
       break;
 
@@ -7395,50 +7191,43 @@ macro2 (struct mips_cl_insn *ip)
       assert (mips_opts.isa == ISA_MIPS1);
       /* Even on a big endian machine $fn comes before $fn+1.  We have
         to adjust when storing to memory.  */
-      macro_build (NULL, &icnt, &offset_expr, "swc1", "T,o(b)",
-                  target_big_endian ? treg + 1 : treg,
-                  BFD_RELOC_LO16, breg);
+      macro_build (&offset_expr, "swc1", "T,o(b)",
+                  target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
       offset_expr.X_add_number += 4;
-      macro_build (NULL, &icnt, &offset_expr, "swc1", "T,o(b)",
-                  target_big_endian ? treg : treg + 1,
-                  BFD_RELOC_LO16, breg);
+      macro_build (&offset_expr, "swc1", "T,o(b)",
+                  target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
       return;
 
     case M_SEQ:
       if (sreg == 0)
-       macro_build (NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg, treg,
-                    BFD_RELOC_LO16);
+       macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
       else if (treg == 0)
-       macro_build (NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg, sreg,
-                    BFD_RELOC_LO16);
+       macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
       else
        {
-         macro_build (NULL, &icnt, NULL, "xor", "d,v,t", dreg, sreg, treg);
-         macro_build (NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg, dreg,
-                      BFD_RELOC_LO16);
+         macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
+         macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
        }
       return;
 
     case M_SEQ_I:
       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
        {
-         macro_build (NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg, sreg,
-                      BFD_RELOC_LO16);
+         macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
          return;
        }
       if (sreg == 0)
        {
          as_warn (_("Instruction %s: result is always false"),
                   ip->insn_mo->name);
-         move_register (&icnt, dreg, 0);
+         move_register (dreg, 0);
          return;
        }
       if (imm_expr.X_op == O_constant
          && imm_expr.X_add_number >= 0
          && imm_expr.X_add_number < 0x10000)
        {
-         macro_build (NULL, &icnt, &imm_expr, "xori", "t,r,i", dreg, sreg,
-                      BFD_RELOC_LO16);
+         macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
          used_at = 0;
        }
       else if (imm_expr.X_op == O_constant
@@ -7446,19 +7235,17 @@ macro2 (struct mips_cl_insn *ip)
               && imm_expr.X_add_number < 0)
        {
          imm_expr.X_add_number = -imm_expr.X_add_number;
-         macro_build (NULL, &icnt, &imm_expr,
-                      HAVE_32BIT_GPRS ? "addiu" : "daddiu",
+         macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
                       "t,r,j", dreg, sreg, BFD_RELOC_LO16);
          used_at = 0;
        }
       else
        {
-         load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
-         macro_build (NULL, &icnt, NULL, "xor", "d,v,t", dreg, sreg, AT);
+         load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
+         macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
          used_at = 1;
        }
-      macro_build (NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg, dreg,
-                  BFD_RELOC_LO16);
+      macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
       if (used_at)
        break;
       return;
@@ -7469,9 +7256,8 @@ macro2 (struct mips_cl_insn *ip)
     case M_SGEU:
       s = "sltu";
     sge:
-      macro_build (NULL, &icnt, NULL, s, "d,v,t", dreg, sreg, treg);
-      macro_build (NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
-                  BFD_RELOC_LO16);
+      macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
+      macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
       return;
 
     case M_SGE_I:              /* sreg >= I <==> not (sreg < I) */
@@ -7480,20 +7266,18 @@ macro2 (struct mips_cl_insn *ip)
          && imm_expr.X_add_number >= -0x8000
          && imm_expr.X_add_number < 0x8000)
        {
-         macro_build (NULL, &icnt, &imm_expr,
-                      mask == M_SGE_I ? "slti" : "sltiu",
-                      "t,r,j", dreg, sreg, BFD_RELOC_LO16);
+         macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
+                      dreg, sreg, BFD_RELOC_LO16);
          used_at = 0;
        }
       else
        {
-         load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
-         macro_build (NULL, &icnt, NULL, mask == M_SGE_I ? "slt" : "sltu",
-                      "d,v,t", dreg, sreg, AT);
+         load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
+         macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
+                      dreg, sreg, AT);
          used_at = 1;
        }
-      macro_build (NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
-                  BFD_RELOC_LO16);
+      macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
       if (used_at)
        break;
       return;
@@ -7504,7 +7288,7 @@ macro2 (struct mips_cl_insn *ip)
     case M_SGTU:
       s = "sltu";
     sgt:
-      macro_build (NULL, &icnt, NULL, s, "d,v,t", dreg, treg, sreg);
+      macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
       return;
 
     case M_SGT_I:              /* sreg > I  <==>  I < sreg */
@@ -7513,8 +7297,8 @@ macro2 (struct mips_cl_insn *ip)
     case M_SGTU_I:
       s = "sltu";
     sgti:
-      load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
-      macro_build (NULL, &icnt, NULL, s, "d,v,t", dreg, AT, sreg);
+      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
+      macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
       break;
 
     case M_SLE:        /* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
@@ -7523,9 +7307,8 @@ macro2 (struct mips_cl_insn *ip)
     case M_SLEU:
       s = "sltu";
     sle:
-      macro_build (NULL, &icnt, NULL, s, "d,v,t", dreg, treg, sreg);
-      macro_build (NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
-                  BFD_RELOC_LO16);
+      macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
+      macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
       return;
 
     case M_SLE_I:      /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
@@ -7534,10 +7317,9 @@ macro2 (struct mips_cl_insn *ip)
     case M_SLEU_I:
       s = "sltu";
     slei:
-      load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
-      macro_build (NULL, &icnt, NULL, s, "d,v,t", dreg, AT, sreg);
-      macro_build (NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
-                  BFD_RELOC_LO16);
+      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
+      macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
+      macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
       break;
 
     case M_SLT_I:
@@ -7545,12 +7327,11 @@ macro2 (struct mips_cl_insn *ip)
          && imm_expr.X_add_number >= -0x8000
          && imm_expr.X_add_number < 0x8000)
        {
-         macro_build (NULL, &icnt, &imm_expr, "slti", "t,r,j", dreg, sreg,
-                      BFD_RELOC_LO16);
+         macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
          return;
        }
-      load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
-      macro_build (NULL, &icnt, NULL, "slt", "d,v,t", dreg, sreg, AT);
+      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
+      macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
       break;
 
     case M_SLTU_I:
@@ -7558,47 +7339,45 @@ macro2 (struct mips_cl_insn *ip)
          && imm_expr.X_add_number >= -0x8000
          && imm_expr.X_add_number < 0x8000)
        {
-         macro_build (NULL, &icnt, &imm_expr, "sltiu", "t,r,j", dreg, sreg,
+         macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
                       BFD_RELOC_LO16);
          return;
        }
-      load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
-      macro_build (NULL, &icnt, NULL, "sltu", "d,v,t", dreg, sreg, AT);
+      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
+      macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
       break;
 
     case M_SNE:
       if (sreg == 0)
-       macro_build (NULL, &icnt, NULL, "sltu","d,v,t", dreg, 0, treg);
+       macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
       else if (treg == 0)
-       macro_build (NULL, &icnt, NULL, "sltu", "d,v,t", dreg, 0, sreg);
+       macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
       else
        {
-         macro_build (NULL, &icnt, NULL, "xor", "d,v,t", dreg, sreg, treg);
-         macro_build (NULL, &icnt, NULL, "sltu", "d,v,t", dreg, 0, dreg);
+         macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
+         macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
        }
       return;
 
     case M_SNE_I:
       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
        {
-         macro_build (NULL, &icnt, NULL, "sltu", "d,v,t", dreg, 0, sreg);
+         macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
          return;
        }
       if (sreg == 0)
        {
          as_warn (_("Instruction %s: result is always true"),
                   ip->insn_mo->name);
-         macro_build (NULL, &icnt, &expr1,
-                      HAVE_32BIT_GPRS ? "addiu" : "daddiu",
-                      "t,r,j", dreg, 0, BFD_RELOC_LO16);
+         macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
+                      dreg, 0, BFD_RELOC_LO16);
          return;
        }
       if (imm_expr.X_op == O_constant
          && imm_expr.X_add_number >= 0
          && imm_expr.X_add_number < 0x10000)
        {
-         macro_build (NULL, &icnt, &imm_expr, "xori", "t,r,i", dreg, sreg,
-                      BFD_RELOC_LO16);
+         macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
          used_at = 0;
        }
       else if (imm_expr.X_op == O_constant
@@ -7606,18 +7385,17 @@ macro2 (struct mips_cl_insn *ip)
               && imm_expr.X_add_number < 0)
        {
          imm_expr.X_add_number = -imm_expr.X_add_number;
-         macro_build (NULL, &icnt, &imm_expr,
-                      HAVE_32BIT_GPRS ? "addiu" : "daddiu",
+         macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
                       "t,r,j", dreg, sreg, BFD_RELOC_LO16);
          used_at = 0;
        }
       else
        {
-         load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
-         macro_build (NULL, &icnt, NULL, "xor", "d,v,t", dreg, sreg, AT);
+         load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
+         macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
          used_at = 1;
        }
-      macro_build (NULL, &icnt, NULL, "sltu", "d,v,t", dreg, 0, dreg);
+      macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
       if (used_at)
        break;
       return;
@@ -7630,13 +7408,12 @@ macro2 (struct mips_cl_insn *ip)
          && imm_expr.X_add_number <= 0x8000)
        {
          imm_expr.X_add_number = -imm_expr.X_add_number;
-         macro_build (NULL, &icnt, &imm_expr, dbl ? "daddi" : "addi",
-                      "t,r,j", dreg, sreg, BFD_RELOC_LO16);
+         macro_build (&imm_expr, dbl ? "daddi" : "addi", "t,r,j",
+                      dreg, sreg, BFD_RELOC_LO16);
          return;
        }
-      load_register (&icnt, AT, &imm_expr, dbl);
-      macro_build (NULL, &icnt, NULL, dbl ? "dsub" : "sub", "d,v,t",
-                  dreg, sreg, AT);
+      load_register (AT, &imm_expr, dbl);
+      macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
       break;
 
     case M_DSUBU_I:
@@ -7647,13 +7424,12 @@ macro2 (struct mips_cl_insn *ip)
          && imm_expr.X_add_number <= 0x8000)
        {
          imm_expr.X_add_number = -imm_expr.X_add_number;
-         macro_build (NULL, &icnt, &imm_expr, dbl ? "daddiu" : "addiu",
-                      "t,r,j", dreg, sreg, BFD_RELOC_LO16);
+         macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "t,r,j",
+                      dreg, sreg, BFD_RELOC_LO16);
          return;
        }
-      load_register (&icnt, AT, &imm_expr, dbl);
-      macro_build (NULL, &icnt, NULL, dbl ? "dsubu" : "subu", "d,v,t",
-                  dreg, sreg, AT);
+      load_register (AT, &imm_expr, dbl);
+      macro_build (NULL, dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
       break;
 
     case M_TEQ_I:
@@ -7674,8 +7450,8 @@ macro2 (struct mips_cl_insn *ip)
     case M_TNE_I:
       s = "tne";
     trap:
-      load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
-      macro_build (NULL, &icnt, NULL, s, "s,t", sreg, AT);
+      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
+      macro_build (NULL, s, "s,t", sreg, AT);
       break;
 
     case M_TRUNCWS:
@@ -7691,22 +7467,19 @@ macro2 (struct mips_cl_insn *ip)
       mips_emit_delays (TRUE);
       ++mips_opts.noreorder;
       mips_any_noreorder = 1;
-      macro_build (NULL, &icnt, NULL, "cfc1", "t,G", treg, RA);
-      macro_build (NULL, &icnt, NULL, "cfc1", "t,G", treg, RA);
-      macro_build (NULL, &icnt, NULL, "nop", "");
+      macro_build (NULL, "cfc1", "t,G", treg, RA);
+      macro_build (NULL, "cfc1", "t,G", treg, RA);
+      macro_build (NULL, "nop", "");
       expr1.X_add_number = 3;
-      macro_build (NULL, &icnt, &expr1, "ori", "t,r,i", AT, treg,
-                  BFD_RELOC_LO16);
+      macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
       expr1.X_add_number = 2;
-      macro_build (NULL, &icnt, &expr1, "xori", "t,r,i", AT, AT,
-                  BFD_RELOC_LO16);
-      macro_build (NULL, &icnt, NULL, "ctc1", "t,G", AT, RA);
-      macro_build (NULL, &icnt, NULL, "nop", "");
-      macro_build (NULL, &icnt, NULL,
-                  mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s",
-                  "D,S", dreg, sreg);
-      macro_build (NULL, &icnt, NULL, "ctc1", "t,G", treg, RA);
-      macro_build (NULL, &icnt, NULL, "nop", "");
+      macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
+      macro_build (NULL, "ctc1", "t,G", AT, RA);
+      macro_build (NULL, "nop", "");
+      macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
+                  dreg, sreg);
+      macro_build (NULL, "ctc1", "t,G", treg, RA);
+      macro_build (NULL, "nop", "");
       --mips_opts.noreorder;
       break;
 
@@ -7720,16 +7493,14 @@ macro2 (struct mips_cl_insn *ip)
        as_bad (_("operand overflow"));
       if (! target_big_endian)
        ++offset_expr.X_add_number;
-      macro_build (NULL, &icnt, &offset_expr, s, "t,o(b)", AT,
-                  BFD_RELOC_LO16, breg);
+      macro_build (&offset_expr, s, "t,o(b)", AT, BFD_RELOC_LO16, breg);
       if (! target_big_endian)
        --offset_expr.X_add_number;
       else
        ++offset_expr.X_add_number;
-      macro_build (NULL, &icnt, &offset_expr, "lbu", "t,o(b)", treg,
-                  BFD_RELOC_LO16, breg);
-      macro_build (NULL, &icnt, NULL, "sll", "d,w,<", AT, AT, 8);
-      macro_build (NULL, &icnt, NULL, "or", "d,v,t", treg, treg, AT);
+      macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg);
+      macro_build (NULL, "sll", "d,w,<", AT, AT, 8);
+      macro_build (NULL, "or", "d,v,t", treg, treg, AT);
       break;
 
     case M_ULD:
@@ -7750,22 +7521,20 @@ macro2 (struct mips_cl_insn *ip)
        tempreg = AT;
       if (! target_big_endian)
        offset_expr.X_add_number += off;
-      macro_build (NULL, &icnt, &offset_expr, s, "t,o(b)", tempreg,
-                  BFD_RELOC_LO16, breg);
+      macro_build (&offset_expr, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
       if (! target_big_endian)
        offset_expr.X_add_number -= off;
       else
        offset_expr.X_add_number += off;
-      macro_build (NULL, &icnt, &offset_expr, s2, "t,o(b)", tempreg,
-                  BFD_RELOC_LO16, breg);
+      macro_build (&offset_expr, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
 
       /* If necessary, move the result in tempreg the final destination.  */
       if (treg == tempreg)
         return;
       /* Protect second load's delay slot.  */
       if (!gpr_interlocks)
-       macro_build (NULL, &icnt, NULL, "nop", "");
-      move_register (&icnt, treg, tempreg);
+       macro_build (NULL, "nop", "");
+      move_register (treg, tempreg);
       break;
 
     case M_ULD_A:
@@ -7779,44 +7548,38 @@ macro2 (struct mips_cl_insn *ip)
       off = 3;
     ulwa:
       used_at = 1;
-      load_address (&icnt, AT, &offset_expr, &used_at);
+      load_address (AT, &offset_expr, &used_at);
       if (breg != 0)
-       macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
-                    AT, AT, breg);
+       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
       if (! target_big_endian)
        expr1.X_add_number = off;
       else
        expr1.X_add_number = 0;
-      macro_build (NULL, &icnt, &expr1, s, "t,o(b)", treg,
-                  BFD_RELOC_LO16, AT);
+      macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
       if (! target_big_endian)
        expr1.X_add_number = 0;
       else
        expr1.X_add_number = off;
-      macro_build (NULL, &icnt, &expr1, s2, "t,o(b)", treg,
-                  BFD_RELOC_LO16, AT);
+      macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
       break;
 
     case M_ULH_A:
     case M_ULHU_A:
       used_at = 1;
-      load_address (&icnt, AT, &offset_expr, &used_at);
+      load_address (AT, &offset_expr, &used_at);
       if (breg != 0)
-       macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
-                    AT, AT, breg);
+       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
       if (target_big_endian)
        expr1.X_add_number = 0;
-      macro_build (NULL, &icnt, &expr1,
-                  mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
+      macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
                   treg, BFD_RELOC_LO16, AT);
       if (target_big_endian)
        expr1.X_add_number = 1;
       else
        expr1.X_add_number = 0;
-      macro_build (NULL, &icnt, &expr1, "lbu", "t,o(b)",
-                  AT, BFD_RELOC_LO16, AT);
-      macro_build (NULL, &icnt, NULL, "sll", "d,w,<", treg, treg, 8);
-      macro_build (NULL, &icnt, NULL, "or", "d,v,t", treg, treg, AT);
+      macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
+      macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
+      macro_build (NULL, "or", "d,v,t", treg, treg, AT);
       break;
 
     case M_USH:
@@ -7824,15 +7587,13 @@ macro2 (struct mips_cl_insn *ip)
        as_bad (_("operand overflow"));
       if (target_big_endian)
        ++offset_expr.X_add_number;
-      macro_build (NULL, &icnt, &offset_expr, "sb", "t,o(b)", treg,
-                  BFD_RELOC_LO16, breg);
-      macro_build (NULL, &icnt, NULL, "srl", "d,w,<", AT, treg, 8);
+      macro_build (&offset_expr, "sb", "t,o(b)", treg, BFD_RELOC_LO16, breg);
+      macro_build (NULL, "srl", "d,w,<", AT, treg, 8);
       if (target_big_endian)
        --offset_expr.X_add_number;
       else
        ++offset_expr.X_add_number;
-      macro_build (NULL, &icnt, &offset_expr, "sb", "t,o(b)", AT,
-                  BFD_RELOC_LO16, breg);
+      macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
       break;
 
     case M_USD:
@@ -7849,14 +7610,12 @@ macro2 (struct mips_cl_insn *ip)
        as_bad (_("operand overflow"));
       if (! target_big_endian)
        offset_expr.X_add_number += off;
-      macro_build (NULL, &icnt, &offset_expr, s, "t,o(b)", treg,
-                  BFD_RELOC_LO16, breg);
+      macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
       if (! target_big_endian)
        offset_expr.X_add_number -= off;
       else
        offset_expr.X_add_number += off;
-      macro_build (NULL, &icnt, &offset_expr, s2, "t,o(b)", treg,
-                  BFD_RELOC_LO16, breg);
+      macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg);
       return;
 
     case M_USD_A:
@@ -7870,49 +7629,42 @@ macro2 (struct mips_cl_insn *ip)
       off = 3;
     uswa:
       used_at = 1;
-      load_address (&icnt, AT, &offset_expr, &used_at);
+      load_address (AT, &offset_expr, &used_at);
       if (breg != 0)
-       macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
-                    AT, AT, breg);
+       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
       if (! target_big_endian)
        expr1.X_add_number = off;
       else
        expr1.X_add_number = 0;
-      macro_build (NULL, &icnt, &expr1, s, "t,o(b)", treg,
-                  BFD_RELOC_LO16, AT);
+      macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
       if (! target_big_endian)
        expr1.X_add_number = 0;
       else
        expr1.X_add_number = off;
-      macro_build (NULL, &icnt, &expr1, s2, "t,o(b)", treg,
-                  BFD_RELOC_LO16, AT);
+      macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
       break;
 
     case M_USH_A:
       used_at = 1;
-      load_address (&icnt, AT, &offset_expr, &used_at);
+      load_address (AT, &offset_expr, &used_at);
       if (breg != 0)
-       macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
-                    AT, AT, breg);
+       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
       if (! target_big_endian)
        expr1.X_add_number = 0;
-      macro_build (NULL, &icnt, &expr1, "sb", "t,o(b)", treg,
-                  BFD_RELOC_LO16, AT);
-      macro_build (NULL, &icnt, NULL, "srl", "d,w,<", treg, treg, 8);
+      macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
+      macro_build (NULL, "srl", "d,w,<", treg, treg, 8);
       if (! target_big_endian)
        expr1.X_add_number = 1;
       else
        expr1.X_add_number = 0;
-      macro_build (NULL, &icnt, &expr1, "sb", "t,o(b)", treg,
-                  BFD_RELOC_LO16, AT);
+      macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
       if (! target_big_endian)
        expr1.X_add_number = 0;
       else
        expr1.X_add_number = 1;
-      macro_build (NULL, &icnt, &expr1, "lbu", "t,o(b)", AT,
-                  BFD_RELOC_LO16, AT);
-      macro_build (NULL, &icnt, NULL, "sll", "d,w,<", treg, treg, 8);
-      macro_build (NULL, &icnt, NULL, "or", "d,v,t", treg, treg, AT);
+      macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
+      macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
+      macro_build (NULL, "or", "d,v,t", treg, treg, AT);
       break;
 
     default:
@@ -7932,7 +7684,6 @@ mips16_macro (struct mips_cl_insn *ip)
 {
   int mask;
   int xreg, yreg, zreg, tmp;
-  int icnt;
   expressionS expr1;
   int dbl;
   const char *s, *s2, *s3;
@@ -7943,8 +7694,6 @@ mips16_macro (struct mips_cl_insn *ip)
   yreg = (ip->insn_opcode >> MIPS16OP_SH_RY) & MIPS16OP_MASK_RY;
   zreg = (ip->insn_opcode >> MIPS16OP_SH_RZ) & MIPS16OP_MASK_RZ;
 
-  icnt = 0;
-
   expr1.X_op = O_constant;
   expr1.X_op_symbol = NULL;
   expr1.X_add_symbol = NULL;
@@ -7970,18 +7719,17 @@ mips16_macro (struct mips_cl_insn *ip)
       mips_emit_delays (TRUE);
       ++mips_opts.noreorder;
       mips_any_noreorder = 1;
-      macro_build (NULL, &icnt, NULL, dbl ? "ddiv" : "div", "0,x,y",
-                  xreg, yreg);
+      macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
       expr1.X_add_number = 2;
-      macro_build (NULL, &icnt, &expr1, "bnez", "x,p", yreg);
-      macro_build (NULL, &icnt, NULL, "break", "6", 7);
+      macro_build (&expr1, "bnez", "x,p", yreg);
+      macro_build (NULL, "break", "6", 7);
 
       /* FIXME: The normal code checks for of -1 / -0x80000000 here,
          since that causes an overflow.  We should do that as well,
          but I don't see how to do the comparisons without a temporary
          register.  */
       --mips_opts.noreorder;
-      macro_build (NULL, &icnt, NULL, s, "x", zreg);
+      macro_build (NULL, s, "x", zreg);
       break;
 
     case M_DIVU_3:
@@ -8003,20 +7751,19 @@ mips16_macro (struct mips_cl_insn *ip)
       mips_emit_delays (TRUE);
       ++mips_opts.noreorder;
       mips_any_noreorder = 1;
-      macro_build (NULL, &icnt, NULL, s, "0,x,y", xreg, yreg);
+      macro_build (NULL, s, "0,x,y", xreg, yreg);
       expr1.X_add_number = 2;
-      macro_build (NULL, &icnt, &expr1, "bnez", "x,p", yreg);
-      macro_build (NULL, &icnt, NULL, "break", "6", 7);
+      macro_build (&expr1, "bnez", "x,p", yreg);
+      macro_build (NULL, "break", "6", 7);
       --mips_opts.noreorder;
-      macro_build (NULL, &icnt, NULL, s2, "x", zreg);
+      macro_build (NULL, s2, "x", zreg);
       break;
 
     case M_DMUL:
       dbl = 1;
     case M_MUL:
-      macro_build (NULL, &icnt, NULL, dbl ? "dmultu" : "multu", "x,y",
-                  xreg, yreg);
-      macro_build (NULL, &icnt, NULL, "mflo", "x", zreg);
+      macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
+      macro_build (NULL, "mflo", "x", zreg);
       return;
 
     case M_DSUBU_I:
@@ -8027,22 +7774,21 @@ mips16_macro (struct mips_cl_insn *ip)
       if (imm_expr.X_op != O_constant)
        as_bad (_("Unsupported large constant"));
       imm_expr.X_add_number = -imm_expr.X_add_number;
-      macro_build (NULL, &icnt, &imm_expr, dbl ? "daddiu" : "addiu", "y,x,4",
-                  yreg, xreg);
+      macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
       break;
 
     case M_SUBU_I_2:
       if (imm_expr.X_op != O_constant)
        as_bad (_("Unsupported large constant"));
       imm_expr.X_add_number = -imm_expr.X_add_number;
-      macro_build (NULL, &icnt, &imm_expr, "addiu", "x,k", xreg);
+      macro_build (&imm_expr, "addiu", "x,k", xreg);
       break;
 
     case M_DSUBU_I_2:
       if (imm_expr.X_op != O_constant)
        as_bad (_("Unsupported large constant"));
       imm_expr.X_add_number = -imm_expr.X_add_number;
-      macro_build (NULL, &icnt, &imm_expr, "daddiu", "y,j", yreg);
+      macro_build (&imm_expr, "daddiu", "y,j", yreg);
       break;
 
     case M_BEQ:
@@ -8091,8 +7837,8 @@ mips16_macro (struct mips_cl_insn *ip)
       yreg = tmp;
 
     do_branch:
-      macro_build (NULL, &icnt, NULL, s, "x,y", xreg, yreg);
-      macro_build (NULL, &icnt, &offset_expr, s2, "p");
+      macro_build (NULL, s, "x,y", xreg, yreg);
+      macro_build (&offset_expr, s2, "p");
       break;
 
     case M_BEQ_I:
@@ -8151,18 +7897,18 @@ mips16_macro (struct mips_cl_insn *ip)
       ++imm_expr.X_add_number;
 
     do_branch_i:
-      macro_build (NULL, &icnt, &imm_expr, s, s3, xreg);
-      macro_build (NULL, &icnt, &offset_expr, s2, "p");
+      macro_build (&imm_expr, s, s3, xreg);
+      macro_build (&offset_expr, s2, "p");
       break;
 
     case M_ABS:
       expr1.X_add_number = 0;
-      macro_build (NULL, &icnt, &expr1, "slti", "x,8", yreg);
+      macro_build (&expr1, "slti", "x,8", yreg);
       if (xreg != yreg)
-       move_register (&icnt, xreg, yreg);
+       move_register (xreg, yreg);
       expr1.X_add_number = 2;
-      macro_build (NULL, &icnt, &expr1, "bteqz", "p");
-      macro_build (NULL, &icnt, NULL, "neg", "x,w", xreg, xreg);
+      macro_build (&expr1, "bteqz", "p");
+      macro_build (NULL, "neg", "x,w", xreg, xreg);
     }
 }
 
@@ -12279,7 +12025,6 @@ static void
 s_cpload (int ignore ATTRIBUTE_UNUSED)
 {
   expressionS ex;
-  int icnt = 0;
 
   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
      .cpload is ignored.  */
@@ -12302,11 +12047,10 @@ s_cpload (int ignore ATTRIBUTE_UNUSED)
   symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
 
   macro_start ();
-  macro_build_lui (NULL, &icnt, &ex, mips_gp_register);
-  macro_build (NULL, &icnt, &ex, "addiu", "t,r,j", mips_gp_register,
+  macro_build_lui (&ex, mips_gp_register);
+  macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
               mips_gp_register, BFD_RELOC_LO16);
-
-  macro_build (NULL, &icnt, NULL, "addu", "d,v,t", mips_gp_register,
+  macro_build (NULL, "addu", "d,v,t", mips_gp_register,
               mips_gp_register, tc_get_register (0));
   macro_end ();
 
@@ -12334,7 +12078,6 @@ s_cpsetup (int ignore ATTRIBUTE_UNUSED)
   expressionS ex_off;
   expressionS ex_sym;
   int reg1;
-  int icnt = 0;
   char *f;
 
   /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
@@ -12384,33 +12127,32 @@ s_cpsetup (int ignore ATTRIBUTE_UNUSED)
       ex_off.X_op_symbol = NULL;
       ex_off.X_add_number = mips_cpreturn_offset;
 
-      macro_build (NULL, &icnt, &ex_off, "sd", "t,o(b)", mips_gp_register,
+      macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
                   BFD_RELOC_LO16, SP);
     }
   else
-    macro_build (NULL, &icnt, NULL, "daddu", "d,v,t", mips_cpreturn_register,
+    macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
                 mips_gp_register, 0);
 
   /* Ensure there's room for the next two instructions, so that `f'
      doesn't end up with an address in the wrong frag.  */
   frag_grow (8);
   f = frag_more (0);
-  macro_build (NULL, &icnt, &ex_sym, "lui", "t,u", mips_gp_register,
-              BFD_RELOC_GPREL16);
+  macro_build (&ex_sym, "lui", "t,u", mips_gp_register, BFD_RELOC_GPREL16);
   fix_new (frag_now, f - frag_now->fr_literal,
           8, NULL, 0, 0, BFD_RELOC_MIPS_SUB);
   fix_new (frag_now, f - frag_now->fr_literal,
           4, NULL, 0, 0, BFD_RELOC_HI16_S);
 
   f = frag_more (0);
-  macro_build (NULL, &icnt, &ex_sym, "addiu", "t,r,j", mips_gp_register,
+  macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
               mips_gp_register, BFD_RELOC_GPREL16);
   fix_new (frag_now, f - frag_now->fr_literal,
           8, NULL, 0, 0, BFD_RELOC_MIPS_SUB);
   fix_new (frag_now, f - frag_now->fr_literal,
           4, NULL, 0, 0, BFD_RELOC_LO16);
 
-  macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
+  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
               mips_gp_register, reg1);
   macro_end ();
 
@@ -12440,7 +12182,6 @@ static void
 s_cprestore (int ignore ATTRIBUTE_UNUSED)
 {
   expressionS ex;
-  int icnt = 0;
 
   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
      .cprestore is ignored.  */
@@ -12459,8 +12200,8 @@ s_cprestore (int ignore ATTRIBUTE_UNUSED)
   ex.X_add_number = mips_cprestore_offset;
 
   macro_start ();
-  macro_build_ldst_constoffset (NULL, &icnt, &ex, ADDRESS_STORE_INSN,
-                               mips_gp_register, SP, HAVE_64BIT_ADDRESSES);
+  macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
+                               SP, HAVE_64BIT_ADDRESSES);
   macro_end ();
 
   demand_empty_rest_of_line ();
@@ -12477,7 +12218,6 @@ static void
 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
 {
   expressionS ex;
-  int icnt = 0;
 
   /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
      We also need NewABI support.  */
@@ -12495,11 +12235,10 @@ s_cpreturn (int ignore ATTRIBUTE_UNUSED)
       ex.X_op_symbol = NULL;
       ex.X_add_number = mips_cpreturn_offset;
 
-      macro_build (NULL, &icnt, &ex, "ld", "t,o(b)", mips_gp_register,
-                  BFD_RELOC_LO16, SP);
+      macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
     }
   else
-    macro_build (NULL, &icnt, NULL, "daddu", "d,v,t", mips_gp_register,
+    macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
                 mips_cpreturn_register, 0);
   macro_end ();
 
@@ -12613,7 +12352,6 @@ s_gpdword (int ignore ATTRIBUTE_UNUSED)
 static void
 s_cpadd (int ignore ATTRIBUTE_UNUSED)
 {
-  int icnt = 0;
   int reg;
 
   /* This is ignored when not generating SVR4 PIC code.  */
@@ -12626,8 +12364,7 @@ s_cpadd (int ignore ATTRIBUTE_UNUSED)
   /* Add $gp to the register named as an argument.  */
   macro_start ();
   reg = tc_get_register (0);
-  macro_build (NULL, &icnt, NULL, ADDRESS_ADD_INSN, "d,v,t",
-              reg, reg, mips_gp_register);
+  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
   macro_end ();
 
   demand_empty_rest_of_line ();