This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
Thumb32 assembler (19/69)
- From: Zack Weinberg <zack at codesourcery dot com>
- To: binutils <binutils at sourceware dot org>
- Date: Tue, 26 Apr 2005 02:54:19 -0700
- Subject: 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.