terminated, not nested. Output `|' and `}' characters if they
don't appear inside assembly dialect selection.
* config/i386/i386.md (rep_movdi_rex64, rep_movsi, rep_movsi_rex64,
rep_movqi, rep_movqi_rex64, rep_stosdi_rex64, rep_stossi,
rep_stossi_rex64, rep_stosqi, rep_stosqi_rex64, strsetsi_1,
strsetsi_rex_1): Add {} braces.
* testsuite/gcc.dg/
20011009-1.c: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@46227
138bc75d-0d04-0410-961f-
82ee72b054a4
+2001-10-12 Jakub Jelinek <jakub@redhat.com>
+
+ * final.c (output_asm_insn): Make sure assembly dialects are
+ terminated, not nested. Output `|' and `}' characters if they
+ don't appear inside assembly dialect selection.
+ * config/i386/i386.md (rep_movdi_rex64, rep_movsi, rep_movsi_rex64,
+ rep_movqi, rep_movqi_rex64, rep_stosdi_rex64, rep_stossi,
+ rep_stossi_rex64, rep_stosqi, rep_stosqi_rex64, strsetsi_1,
+ strsetsi_rex_1): Add {} braces.
+
2001-10-11 Zack Weinberg <zack@codesourcery.com>
* toplev.c (compile_file): Ignore return value from yyparse.
(use (match_dup 5))
(use (reg:SI 19))]
"TARGET_64BIT"
- "rep\;movsq|rep movsq"
+ "{rep\;movsq|rep movsq}"
[(set_attr "type" "str")
(set_attr "prefix_rep" "1")
(set_attr "memory" "both")
(use (match_dup 5))
(use (reg:SI 19))]
"!TARGET_64BIT"
- "rep\;movsl|rep movsd"
+ "{rep\;movsl|rep movsd}"
[(set_attr "type" "str")
(set_attr "prefix_rep" "1")
(set_attr "memory" "both")
(use (match_dup 5))
(use (reg:SI 19))]
"TARGET_64BIT"
- "rep\;movsl|rep movsd"
+ "{rep\;movsl|rep movsd}"
[(set_attr "type" "str")
(set_attr "prefix_rep" "1")
(set_attr "memory" "both")
(use (match_dup 5))
(use (reg:SI 19))]
"!TARGET_64BIT"
- "rep\;movsb|rep movsb"
+ "{rep\;movsb|rep movsb}"
[(set_attr "type" "str")
(set_attr "prefix_rep" "1")
(set_attr "memory" "both")
(use (match_dup 5))
(use (reg:SI 19))]
"TARGET_64BIT"
- "rep\;movsb|rep movsb"
+ "{rep\;movsb|rep movsb}"
[(set_attr "type" "str")
(set_attr "prefix_rep" "1")
(set_attr "memory" "both")
(const_int 4)))
(use (reg:SI 19))]
"!TARGET_64BIT && (TARGET_SINGLE_STRINGOP || optimize_size)"
- "stosl|stosd"
+ "{stosl|stosd}"
[(set_attr "type" "str")
(set_attr "memory" "store")
(set_attr "mode" "SI")])
(const_int 4)))
(use (reg:SI 19))]
"TARGET_64BIT && (TARGET_SINGLE_STRINGOP || optimize_size)"
- "stosl|stosd"
+ "{stosl|stosd}"
[(set_attr "type" "str")
(set_attr "memory" "store")
(set_attr "mode" "SI")])
(use (match_dup 4))
(use (reg:SI 19))]
"TARGET_64BIT"
- "rep\;stosq|rep stosq"
+ "{rep\;stosq|rep stosq}"
[(set_attr "type" "str")
(set_attr "prefix_rep" "1")
(set_attr "memory" "store")
(use (match_dup 4))
(use (reg:SI 19))]
"!TARGET_64BIT"
- "rep\;stosl|rep stosd"
+ "{rep\;stosl|rep stosd}"
[(set_attr "type" "str")
(set_attr "prefix_rep" "1")
(set_attr "memory" "store")
(use (match_dup 4))
(use (reg:SI 19))]
"TARGET_64BIT"
- "rep\;stosl|rep stosd"
+ "{rep\;stosl|rep stosd}"
[(set_attr "type" "str")
(set_attr "prefix_rep" "1")
(set_attr "memory" "store")
(use (match_dup 4))
(use (reg:SI 19))]
"!TARGET_64BIT"
- "rep\;stosb|rep stosb"
+ "{rep\;stosb|rep stosb}"
[(set_attr "type" "str")
(set_attr "prefix_rep" "1")
(set_attr "memory" "store")
(use (match_dup 4))
(use (reg:DI 19))]
"TARGET_64BIT"
- "rep\;stosb|rep stosb"
+ "{rep\;stosb|rep stosb}"
[(set_attr "type" "str")
(set_attr "prefix_rep" "1")
(set_attr "memory" "store")
{
const char *p;
int c;
+#ifdef ASSEMBLER_DIALECT
+ int dialect = 0;
+#endif
/* An insn may return a null string template
in a case where no assembler code is needed. */
{
int i;
+ if (dialect)
+ output_operand_lossage ("nested assembly dialect alternatives");
+ else
+ dialect = 1;
+
/* If we want the first dialect, do nothing. Otherwise, skip
DIALECT_NUMBER of strings ending with '|'. */
for (i = 0; i < dialect_number; i++)
if (*p == '|')
p++;
}
+
+ if (*p == '\0')
+ output_operand_lossage ("unterminated assembly dialect alternative");
}
break;
case '|':
- /* Skip to close brace. */
- while (*p && *p++ != '}')
- ;
+ if (dialect)
+ {
+ /* Skip to close brace. */
+ do
+ {
+ if (*p == '\0')
+ {
+ output_operand_lossage ("unterminated assembly dialect alternative");
+ break;
+ }
+ }
+ while (*p++ != '}');
+ dialect = 0;
+ }
+ else
+ putc (c, asm_out_file);
break;
case '}':
+ if (! dialect)
+ putc (c, asm_out_file);
+ dialect = 0;
break;
#endif
+2001-10-12 Jakub Jelinek <jakub@redhat.com>
+
+ * testsuite/gcc.dg/20011009-1.c: New test.
+
2001-10-12 Nathan Sidwell <nathan@codesourcery.com>
PR g++/4476
--- /dev/null
+/* { dg-do run { target i?86-*-* } } */
+/* { dg-options "-O2" } */
+
+extern void abort (void);
+extern void exit (int);
+
+int main ()
+{
+ int x;
+
+ asm ("movl $26, %0 # 26 |-> reg \n\t"
+ "movl $28, %0" : "=r" (x));
+ if (x != 28)
+ abort ();
+ exit (0);
+}