This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH 2/4] split up epiphany's md_assemble ()
- From: tbsaunde+binutils at tbsaunde dot org
- To: binutils at sourceware dot org
- Cc: Trevor Saunders <tbsaunde+binutils at tbsaunde dot org>
- Date: Sat, 5 Mar 2016 22:10:16 -0500
- Subject: [PATCH 2/4] split up epiphany's md_assemble ()
- Authentication-results: sourceware.org; auth=none
- References: <1457233818-6697-1-git-send-email-tbsaunde+binutils at tbsaunde dot org>
From: Trevor Saunders <tbsaunde+binutils@tbsaunde.org>
gas/ChangeLog:
2016-03-05 Trevor Saunders <tbsaunde+binutils@tbsaunde.org>
* gas/config/tc-epiphany.c (md_assemble): Adjust.
(epiphany_assemble): New function.
---
gas/config/tc-epiphany.c | 132 +++++++++++++++++++++++++----------------------
1 file changed, 71 insertions(+), 61 deletions(-)
diff --git a/gas/config/tc-epiphany.c b/gas/config/tc-epiphany.c
index a3bd4b3..89b61fa 100644
--- a/gas/config/tc-epiphany.c
+++ b/gas/config/tc-epiphany.c
@@ -405,72 +405,17 @@ parse_reglist (const char * s, int * mask)
}
-void
-md_assemble (char *str)
-{
+/* Assemble an instruction, push and pop pseudo instructions should have
+ already been expanded. */
+
+static void
+epiphany_assemble (const char *str)
+ {
epiphany_insn insn;
char *errmsg = 0;
- const char * pperr = 0;
- int regmask=0, push=0, pop=0;
memset (&insn, 0, sizeof (insn));
- /* Special-case push/pop instruction macros. */
- if (0 == strncmp (str, "push {", 6))
- {
- char * s = str + 6;
- push = 1;
- pperr = parse_reglist (s, ®mask);
- }
- else if (0 == strncmp (str, "pop {", 5))
- {
- char * s = str + 5;
- pop = 1;
- pperr = parse_reglist (s, ®mask);
- }
-
- if (pperr)
- {
- as_bad ("%s", pperr);
- return;
- }
-
- if (push && regmask)
- {
- char buff[20];
- int i,p ATTRIBUTE_UNUSED;
-
- md_assemble ("mov r15,4");
- md_assemble ("sub sp,sp,r15");
-
- for (i = 0, p = 1; i <= 15; ++i, regmask >>= 1)
- {
- if (regmask == 1)
- sprintf (buff, "str r%d,[sp]", i); /* Last one. */
- else if (regmask & 1)
- sprintf (buff, "str r%d,[sp],-r15", i);
- else
- continue;
- md_assemble (buff);
- }
- return;
- }
- else if (pop && regmask)
- {
- char buff[20];
- int i,p;
-
- md_assemble ("mov r15,4");
-
- for (i = 15, p = 1 << 15; i >= 0; --i, p >>= 1)
- if (regmask & p)
- {
- sprintf (buff, "ldr r%d,[sp],+r15", i);
- md_assemble (buff);
- }
- return;
- }
-
/* Initialize GAS's cgen interface for a new instruction. */
gas_cgen_init_parse ();
@@ -596,6 +541,71 @@ md_assemble (char *str)
}
}
+void
+md_assemble (char *str)
+{
+ const char * pperr = 0;
+ int regmask=0, push=0, pop=0;
+
+ /* Special-case push/pop instruction macros. */
+ if (0 == strncmp (str, "push {", 6))
+ {
+ char * s = str + 6;
+ push = 1;
+ pperr = parse_reglist (s, ®mask);
+ }
+ else if (0 == strncmp (str, "pop {", 5))
+ {
+ char * s = str + 5;
+ pop = 1;
+ pperr = parse_reglist (s, ®mask);
+ }
+
+ if (pperr)
+ {
+ as_bad ("%s", pperr);
+ return;
+ }
+
+ if (push && regmask)
+ {
+ char buff[20];
+ int i,p ATTRIBUTE_UNUSED;
+
+ epiphany_assemble ("mov r15,4");
+ epiphany_assemble ("sub sp,sp,r15");
+
+ for (i = 0, p = 1; i <= 15; ++i, regmask >>= 1)
+ {
+ if (regmask == 1)
+ sprintf (buff, "str r%d,[sp]", i); /* Last one. */
+ else if (regmask & 1)
+ sprintf (buff, "str r%d,[sp],-r15", i);
+ else
+ continue;
+ epiphany_assemble (buff);
+ }
+ return;
+ }
+ else if (pop && regmask)
+ {
+ char buff[20];
+ int i,p;
+
+ epiphany_assemble ("mov r15,4");
+
+ for (i = 15, p = 1 << 15; i >= 0; --i, p >>= 1)
+ if (regmask & p)
+ {
+ sprintf (buff, "ldr r%d,[sp],+r15", i);
+ epiphany_assemble (buff);
+ }
+ return;
+ }
+
+ epiphany_assemble (str);
+}
+
/* The syntax in the manual says constants begin with '#'.
We just ignore it. */
--
2.1.4