(insert_operand): Bring over possible change from branch.
authorDoug Evans <dje@google.com>
Wed, 11 Feb 1998 23:40:43 +0000 (23:40 +0000)
committerDoug Evans <dje@google.com>
Wed, 11 Feb 1998 23:40:43 +0000 (23:40 +0000)
gas/config/tc-dvp.c

index 6670b44d91252e3d1d949817d41e0d6eb5355213..53c847655c1bcceb57eb954ba3d29540b4e396ad 100644 (file)
@@ -40,8 +40,8 @@ static void insert_operand_final
 
 static int insert_file PARAMS ((const char *));
 
-static int cur_pke_insn_length PARAMS ((void));
-static void install_pke_length PARAMS ((char *, int));
+static int cur_vif_insn_length PARAMS ((void));
+static void install_vif_length PARAMS ((char *, int));
 
 const char comment_chars[] = ";";
 const char line_comment_chars[] = "#";
@@ -55,7 +55,7 @@ const char FLT_CHARS[] = "dD";
    be provided.  (e.g. mpg is followed by vu insns until a .EndMpg is
    seen).  */
 typedef enum {
-  ASM_INIT, ASM_MPG, ASM_DIRECT, ASM_UNPACK, ASM_GPUIF, ASM_VU
+  ASM_INIT, ASM_MPG, ASM_DIRECT, ASM_UNPACK, ASM_GIF, ASM_VU
 } asm_state;
 static asm_state cur_asm_state = ASM_INIT;
 
@@ -67,14 +67,14 @@ static char *cur_varlen_insn;
 /* The length value specified in the insn, or -1 if '*'.  */
 static int cur_varlen_value;
 
-/* Non-zero if packing pke instructions in dma tags.  */
-static int dma_pack_pke_p;
+/* Non-zero if packing vif instructions in dma tags.  */
+static int dma_pack_vif_p;
 
 /* Non-zero if dma insns are to be included in the output.
    This is the default, but writing "if (! no_dma)" is klunky.  */
 static int output_dma = 1;
-/* Non-zero if pke insns are to be included in the output.  */
-static int output_pke = 1;
+/* Non-zero if vif insns are to be included in the output.  */
+static int output_vif = 1;
 \f
 const char *md_shortopts = "";
 
@@ -82,8 +82,8 @@ struct option md_longopts[] =
 {
 #define OPTION_NO_DMA (OPTION_MD_BASE + 1)
   { "no-dma", no_argument, NULL, OPTION_NO_DMA },
-#define OPTION_NO_DMA_PKE (OPTION_NO_DMA + 1)
-  { "no-dma-pke", no_argument, NULL, OPTION_NO_DMA_PKE },
+#define OPTION_NO_DMA_VIF (OPTION_NO_DMA + 1)
+  { "no-dma-vif", no_argument, NULL, OPTION_NO_DMA_VIF },
 
   {NULL, no_argument, NULL, 0}
 };
@@ -99,9 +99,9 @@ md_parse_option (c, arg)
     case OPTION_NO_DMA :
       output_dma = 0;
       break;
-    case OPTION_NO_DMA_PKE :
+    case OPTION_NO_DMA_VIF :
       output_dma = 0;
-      output_pke = 0;
+      output_vif = 0;
       break;
     default :
       return 0;
@@ -116,7 +116,7 @@ md_show_usage (stream)
   fprintf (stream, "\
 DVP options:\n\
 -no-dma                        do not include DMA instructions in the output\n\
--no-dma-pke            do not include DMA or PKE instructions in the output\n\
+-no-dma-vif            do not include DMA or VIF instructions in the output\n\
 ");
 } 
 
@@ -127,9 +127,9 @@ static segT prev_seg;
 static void s_dmadata PARAMS ((int));
 static void s_dmadata_implied PARAMS ((int));
 static void s_enddmadata PARAMS ((int));
-static void s_dmapackpke PARAMS ((int));
+static void s_dmapackvif PARAMS ((int));
 static void s_enddirect PARAMS ((int));
-static void s_endgpuif PARAMS ((int));
+static void s_endgif PARAMS ((int));
 static void s_endmpg PARAMS ((int));
 static void s_endunpack PARAMS ((int));
 static void s_state PARAMS ((int));
@@ -138,15 +138,15 @@ static void s_state PARAMS ((int));
 const pseudo_typeS md_pseudo_table[] =
 {
     { "dmadata", s_dmadata, 0 },
-    { "dmapackpke", s_dmapackpke, 0 },
+    { "dmapackvif", s_dmapackvif, 0 },
     { "enddirect", s_enddirect, 0 },
     { "enddmadata", s_enddmadata, 0 },
-    { "endgpuif", s_endgpuif, 0 },
+    { "endgif", s_endgif, 0 },
     { "endmpg", s_endmpg, 0 },
     { "endunpack", s_endunpack, 0 },
-    /* .vu,.gpuif added to simplify debugging */
+    /* .vu,.gif added to simplify debugging */
     { "vu", s_state, ASM_VU },
-    { "gpuif", s_state, ASM_GPUIF },
+    { "gif", s_state, ASM_GIF },
     { NULL, NULL, 0 }
 };
 \f
@@ -169,7 +169,7 @@ md_begin ()
   dvp_opcode_init_tables (0);
 
   cur_asm_state = ASM_INIT;
-  dma_pack_pke_p = 0;
+  dma_pack_vif_p = 0;
 }
 \f
 /* We need to keep a list of fixups.  We can't simply generate them as
@@ -198,8 +198,8 @@ static void decode_fixup_reloc_type PARAMS ((int, dvp_cpu *,
                                             const dvp_operand **));
 
 static void assemble_dma PARAMS ((char *));
-static void assemble_gpuif PARAMS ((char *));
-static void assemble_pke PARAMS ((char *));
+static void assemble_gif PARAMS ((char *));
+static void assemble_vif PARAMS ((char *));
 static void assemble_vu PARAMS ((char *));
 static const dvp_opcode * assemble_vu_insn PARAMS ((dvp_cpu,
                                                    const dvp_opcode *,
@@ -225,10 +225,10 @@ md_assemble (str)
       if (strncasecmp (str, "dma", 3) == 0)
        assemble_dma (str);
       else
-       assemble_pke (str);
+       assemble_vif (str);
     }
-  else if (cur_asm_state == ASM_GPUIF)
-    assemble_gpuif (str);
+  else if (cur_asm_state == ASM_GIF)
+    assemble_gif (str);
   else if (cur_asm_state == ASM_VU
           || cur_asm_state == ASM_MPG)
     assemble_vu (str);
@@ -249,7 +249,7 @@ assemble_dma (str)
     const dvp_opcode *opcode;
 
     /*
-    Fill the first two words with PKE NOPs.
+    Fill the first two words with VIF NOPs.
     They may be over-written later if DmaPackPke is on.
     initialize the remainder with zeros.
     */
@@ -267,7 +267,7 @@ assemble_dma (str)
     len = 4;
     f = frag_more( len * 4);
 
-    /* Write out the PKE / DMA instructions. */
+    /* Write out the VIF / DMA instructions. */
     for( i = 0; i < len; ++i)
        md_number_to_chars( f + i * 4, insn_buf[i], 4);
 
@@ -291,8 +291,8 @@ assemble_dma (str)
 
        op_type = fixups[i].opindex;
        offset = fixups[i].offset;
-       reloc_type = encode_fixup_reloc_type (DVP_PKE, op_type);
-       operand = &pke_operands[op_type];
+       reloc_type = encode_fixup_reloc_type (DVP_VIF, op_type);
+       operand = &vif_operands[op_type];
        fix_new_exp (frag_now, f + offset - frag_now->fr_literal, 4,
                     &fixups[i].exp,
                     (operand->flags & DVP_OPERAND_RELATIVE_BRANCH) != 0,
@@ -301,10 +301,10 @@ assemble_dma (str)
     }
 }
 
-/* Subroutine of md_assemble to assemble PKE instructions.  */
+/* Subroutine of md_assemble to assemble VIF instructions.  */
 
 static void
-assemble_pke (str)
+assemble_vif (str)
      char *str;
 {
   /* Space for the instruction.
@@ -318,24 +318,24 @@ assemble_pke (str)
   int i;
   const dvp_opcode *opcode;
 
-  opcode = assemble_one_insn (DVP_PKE,
-                             pke_opcode_lookup_asm (str), pke_operands,
+  opcode = assemble_one_insn (DVP_VIF,
+                             vif_opcode_lookup_asm (str), vif_operands,
                              &str, insn_buf);
   if (opcode == NULL)
     return;
 
-  if (opcode->flags & PKE_OPCODE_LENVAR)
+  if (opcode->flags & VIF_OPCODE_LENVAR)
     len = 1; /* actual data follows later */
-  else if (opcode->flags & PKE_OPCODE_LEN2)
+  else if (opcode->flags & VIF_OPCODE_LEN2)
     len = 2;
-  else if (opcode->flags & PKE_OPCODE_LEN5)
+  else if (opcode->flags & VIF_OPCODE_LEN5)
     len = 5;
   else
     len = 1;
 
   /* We still have to switch modes (if mpg for example) so we can't exit
-     early if -no-pke.  */
-  if (output_pke)
+     early if -no-vif.  */
+  if (output_vif)
     {
       /* Reminder: it is important to fetch enough space in one call to
         `frag_more'.  We use (f - frag_now->fr_literal) to compute where
@@ -363,8 +363,8 @@ assemble_pke (str)
 
          op_type = fixups[i].opindex;
          offset = fixups[i].offset;
-         reloc_type = encode_fixup_reloc_type (DVP_PKE, op_type);
-         operand = &pke_operands[op_type];
+         reloc_type = encode_fixup_reloc_type (DVP_VIF, op_type);
+         operand = &vif_operands[op_type];
          fix_new_exp (frag_now, f + offset - frag_now->fr_literal, 4,
                       &fixups[i].exp,
                       (operand->flags & DVP_OPERAND_RELATIVE_BRANCH) != 0,
@@ -374,7 +374,7 @@ assemble_pke (str)
 
   /* Handle variable length insns.  */
 
-  if (opcode->flags & PKE_OPCODE_LENVAR)
+  if (opcode->flags & VIF_OPCODE_LENVAR)
     {
       /* Name of file to read data from.  */
       char *file;
@@ -383,14 +383,14 @@ assemble_pke (str)
 
       file = NULL;
       data_len = 0;
-      pke_get_var_data (&file, &data_len);
+      vif_get_var_data (&file, &data_len);
       if (file)
        {
          int byte_len = insert_file (file);
-         if (output_pke)
-           install_pke_length (f, byte_len);
+         if (output_vif)
+           install_vif_length (f, byte_len);
          /* Update $.MpgLoc.  */
-         pke_set_mpgloc (pke_get_mpgloc () + byte_len);
+         vif_set_mpgloc (vif_get_mpgloc () + byte_len);
        }
       else
        {
@@ -401,27 +401,27 @@ assemble_pke (str)
          cur_varlen_frag = frag_now;
          cur_varlen_insn = f;
          cur_varlen_value = data_len;
-         if (opcode->flags & PKE_OPCODE_MPG)
+         if (opcode->flags & VIF_OPCODE_MPG)
            cur_asm_state = ASM_MPG;
-         else if (opcode->flags & PKE_OPCODE_DIRECT)
+         else if (opcode->flags & VIF_OPCODE_DIRECT)
            cur_asm_state = ASM_DIRECT;
-         else if (opcode->flags & PKE_OPCODE_UNPACK)
+         else if (opcode->flags & VIF_OPCODE_UNPACK)
            cur_asm_state = ASM_UNPACK;
        }
     }
 }
 
-/* Subroutine of md_assemble to assemble GPUIF instructions.  */
+/* Subroutine of md_assemble to assemble GIF instructions.  */
 
 static void
-assemble_gpuif (str)
+assemble_gif (str)
      char *str;
 {
   DVP_INSN insn_buf[4];
   const dvp_opcode *opcode;
 
-  opcode = assemble_one_insn (DVP_GPUIF,
-                             gpuif_opcode_lookup_asm (str), gpuif_operands,
+  opcode = assemble_one_insn (DVP_GIF,
+                             gif_opcode_lookup_asm (str), gif_operands,
                              &str, insn_buf);
   if (opcode == NULL)
     return;
@@ -869,8 +869,8 @@ decode_fixup_reloc_type (fixup_reloc, cpuP, operandP)
     case DVP_VUUP : *operandP = &vu_operands[opnum]; break;
     case DVP_VULO : *operandP = &vu_operands[opnum]; break;
     case DVP_DMA : *operandP = &dma_operands[opnum]; break;
-    case DVP_PKE : *operandP = &pke_operands[opnum]; break;
-    case DVP_GPUIF : *operandP = &gpuif_operands[opnum]; break;
+    case DVP_VIF : *operandP = &vif_operands[opnum]; break;
+    case DVP_GIF : *operandP = &gif_operands[opnum]; break;
     default : as_fatal ("bad fixup encoding");
     }
 }
@@ -1233,11 +1233,11 @@ parse_dma_ptr_autocount( opcode, operand, mods, insn_buf, pstr, errmsg)
     return retval;
 }
 \f
-/* Return length in bytes of the variable length PKE insn
+/* Return length in bytes of the variable length VIF insn
    currently being assembled.  */
 
 static int
-cur_pke_insn_length ()
+cur_vif_insn_length ()
 {
   int byte_len;
   fragS *f;
@@ -1256,11 +1256,11 @@ cur_pke_insn_length ()
   return byte_len;
 }
 
-/* Install length LEN, in bytes, in the pke insn at BUF.
+/* Install length LEN, in bytes, in the vif insn at BUF.
    The bytes in BUF are in target order.  */
 
 static void
-install_pke_length (buf, len)
+install_vif_length (buf, len)
      char *buf;
      int len;
 {
@@ -1292,7 +1292,7 @@ install_pke_length (buf, len)
       /* FIXME */
     }
   else
-    as_fatal ("bad call to install_pke_length");
+    as_fatal ("bad call to install_vif_length");
 }
 
 /* Insert a file into the output.
@@ -1363,6 +1363,20 @@ insert_operand (cpu, opcode, operand, mods, insn_buf, val, errmsg)
     }
   else
     {
+#if 0 /* FIXME: revisit */
+      /* We currently assume a field does not cross a word boundary.  */
+      int shift = ((mods & DVP_MOD_THIS_WORD)
+                  ? (operand->shift & 31)
+                  : operand->shift);
+      DVP_INSN *p = insn_buf + (shift / 32);
+      if (operand->bits == 32)
+       *p = val;
+      else
+       {
+         shift = shift % 32;
+         *p |= ((long) val & ((1 << operand->bits) - 1)) << shift;
+       }
+#else
       /* We currently assume a field does not cross a word boundary.  */
       if (operand->bits == 32)
        insn_buf[ operand->word] = val;
@@ -1372,6 +1386,7 @@ insert_operand (cpu, opcode, operand, mods, insn_buf, val, errmsg)
          insn_buf[ operand->word] |= temp << operand->shift;
        }
     }
+#endif
 }
 
 /* Insert an operand's final value into an instruction.
@@ -1529,10 +1544,10 @@ s_enddmadata( ignore)
 }
 \f
 static void
-s_dmapackpke( ignore)
+s_dmapackvif( ignore)
     int ignore;
 {
-    /* Syntax: .dmapackpke 0|1 */
+    /* Syntax: .dmapackvif 0|1 */
     struct symbol *label;              /* Points to symbol */
     char *name;                                /* points to name of symbol */
 
@@ -1540,10 +1555,10 @@ s_dmapackpke( ignore)
     switch( *input_line_pointer++ )
     {
     case '0':
-       dma_pack_pke_p = 0;
+       dma_pack_vif_p = 0;
        break;
     case '1':
-       dma_pack_pke_p = 1;
+       dma_pack_vif_p = 1;
        break;
     default:
        as_bad( "illegal argument to `.DmaPackPke'");
@@ -1563,12 +1578,12 @@ s_enddirect (ignore)
       return;
     }
 
-  byte_len = cur_pke_insn_length ();
+  byte_len = cur_vif_insn_length ();
   if (cur_varlen_value != -1
       && cur_varlen_value * 16 != byte_len)
     as_warn ("length in `direct' instruction does not match length of data");
-  if (output_pke)
-    install_pke_length (cur_varlen_insn, byte_len);
+  if (output_vif)
+    install_vif_length (cur_varlen_insn, byte_len);
 
   cur_asm_state = ASM_INIT;
 
@@ -1590,12 +1605,12 @@ s_endmpg (ignore)
       return;
     }
 
-  byte_len = cur_pke_insn_length ();
+  byte_len = cur_vif_insn_length ();
   if (cur_varlen_value != -1
       && cur_varlen_value * 8 != byte_len)
     as_warn ("length in `mpg' instruction does not match length of data");
-  if (output_pke)
-    install_pke_length (cur_varlen_insn, byte_len);
+  if (output_vif)
+    install_vif_length (cur_varlen_insn, byte_len);
 
   cur_asm_state = ASM_INIT;
 
@@ -1605,7 +1620,7 @@ s_endmpg (ignore)
   cur_varlen_value = 0;
 
   /* Update $.MpgLoc.  */
-  pke_set_mpgloc (pke_get_mpgloc () + byte_len);
+  vif_set_mpgloc (vif_get_mpgloc () + byte_len);
 }
 
 static void
@@ -1620,13 +1635,13 @@ s_endunpack (ignore)
       return;
     }
 
-  byte_len = cur_pke_insn_length ();
+  byte_len = cur_vif_insn_length ();
 #if 0 /* unpack doesn't support prespecifying a length */
   if (cur_varlen_value * 16 != bytelen)
     as_warn ("length in `direct' instruction does not match length of data");
 #endif
-  if (output_pke)
-    install_pke_length (cur_varlen_insn, byte_len);
+  if (output_vif)
+    install_vif_length (cur_varlen_insn, byte_len);
 
   cur_asm_state = ASM_INIT;
 
@@ -1636,7 +1651,7 @@ s_endunpack (ignore)
   cur_varlen_value = 0;
 
   /* Update $.UnpackLoc.  */
-  pke_set_unpackloc (pke_get_unpackloc () + byte_len);
+  vif_set_unpackloc (vif_get_unpackloc () + byte_len);
 }
 
 static void
@@ -1647,7 +1662,7 @@ s_state (state)
 }
 
 static void
-s_endgpuif (ignore)
+s_endgif (ignore)
      int ignore;
 {
 }