This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Thumb32 assembler (19/69)


Convert the Maverick instructions to parse_operands.

	* config/tc-arm.c (parse_operands): Make second argument const.
	Add missing case for OP_(RMDX).
	(do_mav_binops, do_mav_triple, do_mav_quad): Take a pattern argument
	instead of N arm_reg_type arguments; use parse_operands.  All callers
	updated to match.
	(do_mav_dspsc_1, do_mav_dspsc_2): Use parse_operands.

===================================================================
Index: gas/config/tc-arm.c
--- gas/config/tc-arm.c	(revision 20)
+++ gas/config/tc-arm.c	(revision 21)
@@ -4364,7 +4364,7 @@
    structure.  Returns SUCCESS or FAIL depending on whether the
    specified grammar matched.  */
 static int
-parse_operands (char *str, char *pattern)
+parse_operands (char *str, const char *pattern)
 {
   int i;
 
@@ -4398,6 +4398,7 @@
 	case OP_(RMF):   po_reg_or_fail (REG_TYPE_MVF);     break;
 	case OP_(RMD):   po_reg_or_fail (REG_TYPE_MVD);     break;
 	case OP_(RMFX):  po_reg_or_fail (REG_TYPE_MVFX);    break;
+	case OP_(RMDX):  po_reg_or_fail (REG_TYPE_MVDX);    break;
 	case OP_(RMAX):  po_reg_or_fail (REG_TYPE_MVAX);    break;
 	case OP_(RMDS):  po_reg_or_fail (REG_TYPE_DSPSC);   break;
 	case OP_(RIWR):  po_reg_or_fail (REG_TYPE_MMXWR);   break;
@@ -8175,80 +8176,53 @@
 /* Insn like "foo X,Y".  */
 
 static void
-do_mav_binops (char * str,
-	       int mode,
-	       enum arm_reg_type reg0,
-	       enum arm_reg_type reg1)
+do_mav_binops (char *str, int mode, const char *pattern)
 {
-  int shift0, shift1;
+  int shift0 = (mode >> 0) & 0xff;
+  int shift1 = (mode >> 8) & 0xff;
 
-  shift0 = mode & 0xff;
-  shift1 = (mode >> 8) & 0xff;
+  if (parse_operands (str, pattern))
+    return;
 
-  reg_or_fail (&str, shift0, reg0);
-
-  comma_or_fail (&str);
-  reg_or_fail (&str, shift1, reg1);
-
-  end_of_line (str);
+  inst.instruction |= (inst.operands[0].reg << shift0);
+  inst.instruction |= (inst.operands[1].reg << shift1);
 }
 
 /* Isnsn like "foo X,Y,Z".  */
 
 static void
-do_mav_triple (char * str,
-	       int mode,
-	       enum arm_reg_type reg0,
-	       enum arm_reg_type reg1,
-	       enum arm_reg_type reg2)
+do_mav_triple (char *str, int mode, const char *pattern)
 {
-  int shift0, shift1, shift2;
+  int shift0 = (mode >>  0) & 0xff;
+  int shift1 = (mode >>  8) & 0xff;
+  int shift2 = (mode >> 16) & 0xff;
 
-  shift0 = mode & 0xff;
-  shift1 = (mode >> 8) & 0xff;
-  shift2 = (mode >> 16) & 0xff;
+  if (parse_operands (str, pattern))
+    return;
 
-  reg_or_fail (&str, shift0, reg0);
-
-  comma_or_fail (&str);
-  reg_or_fail (&str, shift1, reg1);
-
-  comma_or_fail (&str);
-  reg_or_fail (&str, shift2, reg2);
-
-  end_of_line (str);
+  inst.instruction |= (inst.operands[0].reg << shift0);
+  inst.instruction |= (inst.operands[1].reg << shift1);
+  inst.instruction |= (inst.operands[2].reg << shift2);
 }
 
 /* Insn like "foo W,X,Y,Z".
     where W=MVAX[0:3] and X,Y,Z=MVFX[0:15].  */
 
 static void
-do_mav_quad (char * str,
-	     int mode,
-	     enum arm_reg_type reg0,
-	     enum arm_reg_type reg1,
-	     enum arm_reg_type reg2,
-	     enum arm_reg_type reg3)
+do_mav_quad (char *str, int mode, const char *pattern)
 {
-  int shift0, shift1, shift2, shift3;
+  int shift0 = (mode >>  0) & 0xff;
+  int shift1 = (mode >>  8) & 0xff;
+  int shift2 = (mode >> 16) & 0xff;
+  int shift3 = (mode >> 24) & 0xff;
 
-  shift0= mode & 0xff;
-  shift1 = (mode >> 8) & 0xff;
-  shift2 = (mode >> 16) & 0xff;
-  shift3 = (mode >> 24) & 0xff;
+  if (parse_operands (str, pattern))
+    return;
 
-  reg_or_fail (&str, shift0, reg0);
-
-  comma_or_fail (&str);
-  reg_or_fail (&str, shift1, reg1);
-
-  comma_or_fail (&str);
-  reg_or_fail (&str, shift2, reg2);
-
-  comma_or_fail (&str);
-  reg_or_fail (&str, shift3, reg3);
-
-  end_of_line (str);
+  inst.instruction |= (inst.operands[0].reg << shift0);
+  inst.instruction |= (inst.operands[1].reg << shift1);
+  inst.instruction |= (inst.operands[2].reg << shift2);
+  inst.instruction |= (inst.operands[3].reg << shift3);
 }
 
 /* Wrapper functions.  */
@@ -8256,230 +8230,225 @@
 static void
 do_mav_binops_1a (char * str)
 {
-  do_mav_binops (str, MAV_MODE1, REG_TYPE_RN, REG_TYPE_MVF);
+  do_mav_binops (str, MAV_MODE1, OPERANDS2(RR,RMF));
 }
 
 static void
 do_mav_binops_1b (char * str)
 {
-  do_mav_binops (str, MAV_MODE1, REG_TYPE_RN, REG_TYPE_MVD);
+  do_mav_binops (str, MAV_MODE1, OPERANDS2(RR,RMD));
 }
 
 static void
 do_mav_binops_1c (char * str)
 {
-  do_mav_binops (str, MAV_MODE1, REG_TYPE_RN, REG_TYPE_MVDX);
+  do_mav_binops (str, MAV_MODE1, OPERANDS2(RR,RMDX));
 }
 
 static void
 do_mav_binops_1d (char * str)
 {
-  do_mav_binops (str, MAV_MODE1, REG_TYPE_MVF, REG_TYPE_MVF);
+  do_mav_binops (str, MAV_MODE1, OPERANDS2(RMF,RMF));
 }
 
 static void
 do_mav_binops_1e (char * str)
 {
-  do_mav_binops (str, MAV_MODE1, REG_TYPE_MVD, REG_TYPE_MVD);
+  do_mav_binops (str, MAV_MODE1, OPERANDS2(RMD,RMD));
 }
 
 static void
 do_mav_binops_1f (char * str)
 {
-  do_mav_binops (str, MAV_MODE1, REG_TYPE_MVD, REG_TYPE_MVF);
+  do_mav_binops (str, MAV_MODE1, OPERANDS2(RMD,RMF));
 }
 
 static void
 do_mav_binops_1g (char * str)
 {
-  do_mav_binops (str, MAV_MODE1, REG_TYPE_MVF, REG_TYPE_MVD);
+  do_mav_binops (str, MAV_MODE1, OPERANDS2(RMF,RMD));
 }
 
 static void
 do_mav_binops_1h (char * str)
 {
-  do_mav_binops (str, MAV_MODE1, REG_TYPE_MVF, REG_TYPE_MVFX);
+  do_mav_binops (str, MAV_MODE1, OPERANDS2(RMF,RMFX));
 }
 
 static void
 do_mav_binops_1i (char * str)
 {
-  do_mav_binops (str, MAV_MODE1, REG_TYPE_MVD, REG_TYPE_MVFX);
+  do_mav_binops (str, MAV_MODE1, OPERANDS2(RMD,RMFX));
 }
 
 static void
 do_mav_binops_1j (char * str)
 {
-  do_mav_binops (str, MAV_MODE1, REG_TYPE_MVF, REG_TYPE_MVDX);
+  do_mav_binops (str, MAV_MODE1, OPERANDS2(RMF,RMDX));
 }
 
 static void
 do_mav_binops_1k (char * str)
 {
-  do_mav_binops (str, MAV_MODE1, REG_TYPE_MVD, REG_TYPE_MVDX);
+  do_mav_binops (str, MAV_MODE1, OPERANDS2(RMD,RMDX));
 }
 
 static void
 do_mav_binops_1l (char * str)
 {
-  do_mav_binops (str, MAV_MODE1, REG_TYPE_MVFX, REG_TYPE_MVF);
+  do_mav_binops (str, MAV_MODE1, OPERANDS2(RMFX,RMF));
 }
 
 static void
 do_mav_binops_1m (char * str)
 {
-  do_mav_binops (str, MAV_MODE1, REG_TYPE_MVFX, REG_TYPE_MVD);
+  do_mav_binops (str, MAV_MODE1, OPERANDS2(RMFX,RMD));
 }
 
 static void
 do_mav_binops_1n (char * str)
 {
-  do_mav_binops (str, MAV_MODE1, REG_TYPE_MVFX, REG_TYPE_MVFX);
+  do_mav_binops (str, MAV_MODE1, OPERANDS2(RMFX,RMFX));
 }
 
 static void
 do_mav_binops_1o (char * str)
 {
-  do_mav_binops (str, MAV_MODE1, REG_TYPE_MVDX, REG_TYPE_MVDX);
+  do_mav_binops (str, MAV_MODE1, OPERANDS2(RMDX,RMDX));
 }
 
 static void
 do_mav_binops_2a (char * str)
 {
-  do_mav_binops (str, MAV_MODE2, REG_TYPE_MVF, REG_TYPE_RN);
+  do_mav_binops (str, MAV_MODE2, OPERANDS2(RMF,RR));
 }
 
 static void
 do_mav_binops_2b (char * str)
 {
-  do_mav_binops (str, MAV_MODE2, REG_TYPE_MVD, REG_TYPE_RN);
+  do_mav_binops (str, MAV_MODE2, OPERANDS2(RMD,RR));
 }
 
 static void
 do_mav_binops_2c (char * str)
 {
-  do_mav_binops (str, MAV_MODE2, REG_TYPE_MVDX, REG_TYPE_RN);
+  do_mav_binops (str, MAV_MODE2, OPERANDS2(RMDX,RR));
 }
 
 static void
 do_mav_binops_3a (char * str)
 {
-  do_mav_binops (str, MAV_MODE3, REG_TYPE_MVAX, REG_TYPE_MVFX);
+  do_mav_binops (str, MAV_MODE3, OPERANDS2(RMAX,RMFX));
 }
 
 static void
 do_mav_binops_3b (char * str)
 {
-  do_mav_binops (str, MAV_MODE3, REG_TYPE_MVFX, REG_TYPE_MVAX);
+  do_mav_binops (str, MAV_MODE3, OPERANDS2(RMFX,RMAX));
 }
 
 static void
 do_mav_binops_3c (char * str)
 {
-  do_mav_binops (str, MAV_MODE3, REG_TYPE_MVAX, REG_TYPE_MVDX);
+  do_mav_binops (str, MAV_MODE3, OPERANDS2(RMAX,RMDX));
 }
 
 static void
 do_mav_binops_3d (char * str)
 {
-  do_mav_binops (str, MAV_MODE3, REG_TYPE_MVDX, REG_TYPE_MVAX);
+  do_mav_binops (str, MAV_MODE3, OPERANDS2(RMDX,RMAX));
 }
 
 static void
 do_mav_triple_4a (char * str)
 {
-  do_mav_triple (str, MAV_MODE4, REG_TYPE_MVFX, REG_TYPE_MVFX, REG_TYPE_RN);
+  do_mav_triple (str, MAV_MODE4, OPERANDS3(RMFX,RMFX,RR));
 }
 
 static void
 do_mav_triple_4b (char * str)
 {
-  do_mav_triple (str, MAV_MODE4, REG_TYPE_MVDX, REG_TYPE_MVDX, REG_TYPE_RN);
+  do_mav_triple (str, MAV_MODE4, OPERANDS3(RMDX,RMDX,RR));
 }
 
 static void
 do_mav_triple_5a (char * str)
 {
-  do_mav_triple (str, MAV_MODE5, REG_TYPE_RN, REG_TYPE_MVF, REG_TYPE_MVF);
+  do_mav_triple (str, MAV_MODE5, OPERANDS3(RR,RMF,RMF));
 }
 
 static void
 do_mav_triple_5b (char * str)
 {
-  do_mav_triple (str, MAV_MODE5, REG_TYPE_RN, REG_TYPE_MVD, REG_TYPE_MVD);
+  do_mav_triple (str, MAV_MODE5, OPERANDS3(RR,RMD,RMD));
 }
 
 static void
 do_mav_triple_5c (char * str)
 {
-  do_mav_triple (str, MAV_MODE5, REG_TYPE_RN, REG_TYPE_MVFX, REG_TYPE_MVFX);
+  do_mav_triple (str, MAV_MODE5, OPERANDS3(RR,RMFX,RMFX));
 }
 
 static void
 do_mav_triple_5d (char * str)
 {
-  do_mav_triple (str, MAV_MODE5, REG_TYPE_RN, REG_TYPE_MVDX, REG_TYPE_MVDX);
+  do_mav_triple (str, MAV_MODE5, OPERANDS3(RR,RMDX,RMDX));
 }
 
 static void
 do_mav_triple_5e (char * str)
 {
-  do_mav_triple (str, MAV_MODE5, REG_TYPE_MVF, REG_TYPE_MVF, REG_TYPE_MVF);
+  do_mav_triple (str, MAV_MODE5, OPERANDS3(RMF,RMF,RMF));
 }
 
 static void
 do_mav_triple_5f (char * str)
 {
-  do_mav_triple (str, MAV_MODE5, REG_TYPE_MVD, REG_TYPE_MVD, REG_TYPE_MVD);
+  do_mav_triple (str, MAV_MODE5, OPERANDS3(RMD,RMD,RMD));
 }
 
 static void
 do_mav_triple_5g (char * str)
 {
-  do_mav_triple (str, MAV_MODE5, REG_TYPE_MVFX, REG_TYPE_MVFX, REG_TYPE_MVFX);
+  do_mav_triple (str, MAV_MODE5, OPERANDS3(RMFX,RMFX,RMFX));
 }
 
 static void
 do_mav_triple_5h (char * str)
 {
-  do_mav_triple (str, MAV_MODE5, REG_TYPE_MVDX, REG_TYPE_MVDX, REG_TYPE_MVDX);
+  do_mav_triple (str, MAV_MODE5, OPERANDS3(RMDX,RMDX,RMDX));
 }
 
-
 static void
 do_mav_quad_6a (char * str)
 {
-  do_mav_quad (str, MAV_MODE6, REG_TYPE_MVAX, REG_TYPE_MVFX, REG_TYPE_MVFX,
-	       REG_TYPE_MVFX);
+  do_mav_quad (str, MAV_MODE6, OPERANDS4(RMAX,RMFX,RMFX,RMFX));
 }
 
 static void
 do_mav_quad_6b (char * str)
 {
-  do_mav_quad (str, MAV_MODE6, REG_TYPE_MVAX, REG_TYPE_MVAX, REG_TYPE_MVFX,
-	       REG_TYPE_MVFX);
+  do_mav_quad (str, MAV_MODE6, OPERANDS4(RMAX,RMAX,RMFX,RMFX));
 }
 
 /* cfmvsc32<cond> DSPSC,MVDX[15:0].  */
 static void
 do_mav_dspsc_1 (char * str)
 {
-  reg_or_fail (&str, -1, REG_TYPE_DSPSC);
-  comma_or_fail (&str);
+  if (parse_operands (str, OPERANDS2(RMDS,RMDX)))
+    return;
 
-  reg_or_fail (&str, 12, REG_TYPE_MVDX);
-  end_of_line (str);
+  inst.instruction |= (inst.operands[1].reg << 12);
 }
 
 /* cfmv32sc<cond> MVDX[15:0],DSPSC.  */
 static void
 do_mav_dspsc_2 (char * str)
 {
-  reg_or_fail (&str, 12, REG_TYPE_MVDX);
-  comma_or_fail (&str);
+  if (parse_operands (str, OPERANDS2(RMDX,RMDS)))
+    return;
 
-  reg_or_fail (&str, -1, REG_TYPE_DSPSC);
-  end_of_line (str);
+  inst.instruction |= (inst.operands[0].reg << 12);
 }
 
 /* Maverick shift immediate instructions.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]