+2001-06-30 Zack Weinberg <zackw@stanford.edu>
+
+ * rtl.def (DEFINE_INSN, DEFINE_INSN_AND_SPLIT, DEFINE_PEEPHOLE):
+ Change output-template slot to format 'T'.
+ * rtl.h (XTMPL): New.
+ * read-rtl.c (read_escape): New function.
+ (read_quoted_string, read_braced_string): Use it.
+ (read_rtx): Set star_if_braced from the format string.
+ Use XTMPL where appropriate.
+ * genoutput.c (gen_insn, gen_peephole): Use XTMPL to get the
+ template string.
+
+ * rtl.c: Include errors.h for sake of rtl_check_failed* routines.
+ Document 'T' in rtx format strings.
+ * Makefile.in (rtl.o, $(HOST_PREFIX_1)rtl.o): Depend on errors.h.
+ * errors.c (internal_error): Add missing ": " at end of string.
+
+ * i860.md: Change triple backslashes to double backslashes at
+ ends of lines in output templates.
+
2001-06-29 Nick Clifton <nickc@cambridge.redhat.com>
* gcc.c (process_command): Append a DIR_SEPARATOR to a path
(delete_unreachable_blocks): Use find_unreachable_blocks.
* basic-block.h (find_unreachable_blocks): Declare.
- * dce.c (eliminate_dead_code): Fix formatting glitch.
+ * dce.c (eliminate_dead_code): Fix formatting glitch.
2001-06-18 Jason Merrill <jason_merrill@redhat.com>
-c $(srcdir)/toplev.c
main.o : main.c toplev.h
-rtl.o : rtl.c $(GCONFIG_H) $(SYSTEM_H) $(RTL_H) real.h $(GGC_H)
+rtl.o : rtl.c $(GCONFIG_H) $(SYSTEM_H) $(RTL_H) real.h $(GGC_H) errors.h
$(CC) -c $(ALL_CFLAGS) -DGENERATOR_FILE $(ALL_CPPFLAGS) $(INCLUDES) $< $(OUTPUT_OPTION)
print-rtl.o : print-rtl.c $(GCONFIG_H) $(SYSTEM_H) $(RTL_H) hard-reg-set.h \
# and HOST_PREFIX_1 is `foobar', just to ensure these rules don't conflict
# with the rules for rtl.o, etc.
$(HOST_PREFIX_1)rtl.o: $(srcdir)/rtl.c $(HCONFIG_H) $(SYSTEM_H) $(RTL_H) \
- $(GGC_H)
+ $(GGC_H) errors.h
rm -f $(HOST_PREFIX)rtl.c
sed -e 's/config[.]h/hconfig.h/' $(srcdir)/rtl.c > $(HOST_PREFIX)rtl.c
$(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(HOST_PREFIX)rtl.c
cc_status.flags |= CC_KNOW_HI_R31;
cc_status.flags &= ~CC_HI_R31_ADJ;
cc_status.mdep = CONST2_RTX (SFmode);
- return \"frcp.dd %2,%3\;fmul.dd %2,%3,%0\;fmov.dd %?f0,%4\;\\\
-orh 0x4000,%?r0,%?r31\;ixfr %?r31,%R4\;fsub.dd %4,%0,%0\;\\\
-fmul.dd %3,%0,%3\;fmul.dd %2,%3,%0\;fsub.dd %4,%0,%0\;\\\
-fmul.dd %3,%0,%3\;fmul.dd %2,%3,%0\;fsub.dd %4,%0,%0\;\\\
+ return \"frcp.dd %2,%3\;fmul.dd %2,%3,%0\;fmov.dd %?f0,%4\;\\
+orh 0x4000,%?r0,%?r31\;ixfr %?r31,%R4\;fsub.dd %4,%0,%0\;\\
+fmul.dd %3,%0,%3\;fmul.dd %2,%3,%0\;fsub.dd %4,%0,%0\;\\
+fmul.dd %3,%0,%3\;fmul.dd %2,%3,%0\;fsub.dd %4,%0,%0\;\\
fmul.dd %3,%1,%3\;fmul.dd %0,%3,%0\";
}
else
- return \"frcp.dd %2,%3\;fmul.dd %2,%3,%0\;fmov.dd %?f0,%4\;\\\
-ixfr %?r31,%R4\;fsub.dd %4,%0,%0\;\\\
-fmul.dd %3,%0,%3\;fmul.dd %2,%3,%0\;fsub.dd %4,%0,%0\;\\\
-fmul.dd %3,%0,%3\;fmul.dd %2,%3,%0\;fsub.dd %4,%0,%0\;\\\
+ return \"frcp.dd %2,%3\;fmul.dd %2,%3,%0\;fmov.dd %?f0,%4\;\\
+ixfr %?r31,%R4\;fsub.dd %4,%0,%0\;\\
+fmul.dd %3,%0,%3\;fmul.dd %2,%3,%0\;fsub.dd %4,%0,%0\;\\
+fmul.dd %3,%0,%3\;fmul.dd %2,%3,%0\;fsub.dd %4,%0,%0\;\\
fmul.dd %3,%1,%3\;fmul.dd %0,%3,%0\";
}")
cc_status.mdep = CONST2_RTX (SFmode);
output_asm_insn (\"orh 0x4000,%?r0,%?r31\", operands);
}
- return \"ixfr %?r31,%4\;frcp.ss %2,%0\;\\\
-fmul.ss %2,%0,%3\;fsub.ss %4,%3,%3\;fmul.ss %0,%3,%0\;\\\
-fmul.ss %2,%0,%3\;fsub.ss %4,%3,%3\;\\\
+ return \"ixfr %?r31,%4\;frcp.ss %2,%0\;\\
+fmul.ss %2,%0,%3\;fsub.ss %4,%3,%3\;fmul.ss %0,%3,%0\;\\
+fmul.ss %2,%0,%3\;fsub.ss %4,%3,%3\;\\
fmul.ss %1,%0,%4\;fmul.ss %3,%4,%0\";
}")
\f
format = va_arg (ap, const char *);
#endif
- fprintf (stderr, "%s: Internal error", progname);
+ fprintf (stderr, "%s: Internal error: ", progname);
vfprintf (stderr, format, ap);
va_end (ap);
fputc ('\n', stderr);
validate_insn_operands (d);
validate_insn_alternatives (d);
place_operands (d);
- process_template (d, XSTR (insn, 3));
+ process_template (d, XTMPL (insn, 3));
}
\f
/* Look at a define_peephole just read. Assign its code number.
validate_insn_alternatives (d);
place_operands (d);
- process_template (d, XSTR (peep, 2));
+ process_template (d, XTMPL (peep, 2));
}
\f
/* Process a define_expand just read. Assign its code number,
static char *read_string PARAMS ((struct obstack *, FILE *, int));
static char *read_quoted_string PARAMS ((struct obstack *, FILE *));
static char *read_braced_string PARAMS ((struct obstack *, FILE *));
+static void read_escape PARAMS ((struct obstack *, FILE *));
static unsigned def_hash PARAMS ((const void *));
static int def_name_eq_p PARAMS ((const void *, const void *));
static void read_constants PARAMS ((FILE *infile, char *tmp_char));
}
}
+/* Subroutine of the string readers. Handles backslash escapes.
+ Caller has read the backslash, but not placed it into the obstack. */
+static void
+read_escape (ob, infile)
+ struct obstack *ob;
+ FILE *infile;
+{
+ int c = getc (infile);
+ switch (c)
+ {
+ /* Backslash-newline is replaced by nothing, as in C. */
+ case '\n':
+ read_rtx_lineno++;
+ return;
+
+ /* \" \' \\ are replaced by the second character. */
+ case '\\':
+ case '"':
+ case '\'':
+ break;
+
+ /* Standard C string escapes:
+ \a \b \f \n \r \t \v
+ \[0-7] \x
+ all are passed through to the output string unmolested.
+ In normal use these wind up in a string constant processed
+ by the C compiler, which will translate them appropriately.
+ We do not bother checking that \[0-7] are followed by up to
+ two octal digits, or that \x is followed by N hex digits.
+ \? \u \U are left out because they are not in traditional C. */
+ case 'a': case 'b': case 'f': case 'n': case 'r': case 't': case 'v':
+ case '0': case '1': case '2': case '3': case '4': case '5': case '6':
+ case '7': case 'x':
+ obstack_1grow (ob, '\\');
+ break;
+
+ /* \; makes stuff for a C string constant containing
+ newline and tab. */
+ case ';':
+ obstack_grow (ob, "\\n\\t", 4);
+ return;
+
+ /* pass anything else through, but issue a warning. */
+ default:
+ fprintf (stderr, "%s:%d: warning: unrecognized escape \\%c\n",
+ read_rtx_filename, read_rtx_lineno, c);
+ obstack_1grow (ob, '\\');
+ break;
+ }
+
+ obstack_1grow (ob, c);
+}
+
+
/* Read a double-quoted string onto the obstack. Caller has scanned
the leading quote. */
static char *
read_rtx_lineno++;
else if (c == '\\')
{
- c = getc (infile); /* Read the string */
- /* \; makes stuff for a C string constant containing
- newline and tab. */
- if (c == ';')
- {
- obstack_grow (ob, "\\n\\t", 4);
- continue;
- }
- else if (c == '\n')
- /* \-newline: delete the backslash and update our idea of
- the line number. */
- read_rtx_lineno++;
- else if (c == '\\' || c == '"')
- ; /* \", \\ are a literal quote and backslash. */
- else
- /* Backslash escapes we do not recognize are left unmolested.
- They may be handled by the C compiler (e.g. \n, \t) */
- {
- ungetc (c, infile); /* put it back */
- c = '\\';
- }
+ read_escape (ob, infile);
+ continue;
}
else if (c == '"')
break;
brace_depth--;
else if (c == '\\')
{
- c = getc (infile); /* Read the string */
- /* \; makes stuff for a C string constant containing
- newline and tab. */
- if (c == ';')
- {
- obstack_grow (ob, "\\n\\t", 4);
- continue;
- }
- else if (c == '\n')
- /* \-newline: delete the backslash and update our idea of
- the line number. */
- read_rtx_lineno++;
- else if (c == '\\')
- ; /* \\ is a literal backslash */
- else
- /* Backslash escapes we do not recognize are left unmolested.
- They may be handled by the C compiler (e.g. \n, \t) */
- {
- ungetc (c, infile); /* put it back */
- c = '\\';
- }
+ read_escape (ob, infile);
+ continue;
}
obstack_1grow (ob, c);
break;
}
+ case 'T':
case 's':
{
char *stringbuf;
DEFINE_INSN_AND_SPLIT, or DEFINE_PEEPHOLE automatically
gets a star inserted as its first character, if it is
written with a brace block instead of a string constant. */
- int star_if_braced =
- ((i == 3 && (GET_CODE (return_rtx) == DEFINE_INSN
- || GET_CODE (return_rtx) == DEFINE_INSN_AND_SPLIT))
- || (i == 2 && GET_CODE (return_rtx) == DEFINE_PEEPHOLE));
+ int star_if_braced = (format_ptr[-1] == 'T');
stringbuf = read_string (&rtl_obstack, infile, star_if_braced);
stringbuf = (char *) obstack_finish (&rtl_obstack);
}
- XSTR (return_rtx, i) = stringbuf;
+ if (star_if_braced)
+ XTMPL (return_rtx, i) = stringbuf;
+ else
+ XSTR (return_rtx, i) = stringbuf;
}
break;
#include "rtl.h"
#include "real.h"
#include "ggc.h"
+#include "errors.h"
\f
/* Calculate the format for CONST_DOUBLE. This depends on the relative
prints the string
"S" like "s", but optional:
the containing rtx may end before this operand
+ "T" like "s", but treated specially by the RTL reader;
+ only found in machine description patterns.
"e" a pointer to an rtl expression
prints the expression
"E" a pointer to a vector that points to a number of rtl expressions
template to use.
4: optionally, a vector of attributes for this insn.
*/
-DEF_RTL_EXPR(DEFINE_INSN, "define_insn", "sEssV", 'x')
+DEF_RTL_EXPR(DEFINE_INSN, "define_insn", "sEsTV", 'x')
/* Definition of a peephole optimization.
1st operand: vector of insn patterns to match
3rd operand: template or C code to produce assembler output.
4: optionally, a vector of attributes for this insn.
*/
-DEF_RTL_EXPR(DEFINE_PEEPHOLE, "define_peephole", "EssV", 'x')
+DEF_RTL_EXPR(DEFINE_PEEPHOLE, "define_peephole", "EsTV", 'x')
/* Definition of a split operation.
1st operand: insn pattern to match
elements of `recog_operand' for use by the vector of insn-patterns.
(`operands' is an alias here for `recog_operand').
7: optionally, a vector of attributes for this insn. */
-DEF_RTL_EXPR(DEFINE_INSN_AND_SPLIT, "define_insn_and_split", "sEsssESV", 'x')
+DEF_RTL_EXPR(DEFINE_INSN_AND_SPLIT, "define_insn_and_split", "sEsTsESV", 'x')
/* Definition of an RTL peephole operation.
Follows the same arguments as define_split. */
#define XBITMAP(RTX, N) (RTL_CHECK1(RTX, N, 'b').rtbit)
#define XTREE(RTX, N) (RTL_CHECK1(RTX, N, 't').rttree)
#define XBBDEF(RTX, N) (RTL_CHECK1(RTX, N, 'B').bb)
+#define XTMPL(RTX, N) (RTL_CHECK1(RTX, N, 'T').rtstr)
#define XVECEXP(RTX, N, M) RTVEC_ELT (XVEC (RTX, N), M)
#define XVECLEN(RTX, N) GET_NUM_ELEM (XVEC (RTX, N))