Add -mgnu-asm; change -mdec-asm to generate DEC assembler
authorPaul Koning <ni1d@arrl.net>
Sun, 1 Jul 2018 19:19:39 +0000 (15:19 -0400)
committerPaul Koning <pkoning@gcc.gnu.org>
Sun, 1 Jul 2018 19:19:39 +0000 (15:19 -0400)
        compatible output.

* common/config/pdp11/pdp11-common.c (pdp11_handle_option): Handle
-munit-asm, -mgnu-asm, -mdec-asm.
* config/pdp11/pdp11-protos.h (pdp11_gen_int_label): New.
(pdp11_output_labelref): New.
(pdp11_output_def): New.
(pdp11_output_addr_vec_elt): New.
* config/pdp11/pdp11.c: Use tab between opcode and operands.  Use
%# and %@ format codes.
(pdp11_option_override): New.
(TARGET_ASM_FILE_START_FILE_DIRECTIVE): Define.
(pdp11_output_ident): New.
(pdp11_asm_named_section): New.
(pdp11_asm_init_sections): New.
(pdp11_file_start): New.
(pdp11_file_end): New.
(output_ascii): Use .ascii/.asciz for -mdec-asm.
(pdp11_asm_print_operand): Update %# and %$ for -mdec-asm.  Add
%o, like %c but octal.
(pdp11_option_override): New.
* config/pdp11/pdp11.h (TEXT_SECTION_ASM_OP): Update for
-mdec-asm.
(DATA_SECTION_ASM_OP): Ditto.
(READONLY_DATA_SECTION_ASM_OP): New.
(IS_ASM_LOGICAL_LINE_SEPARATOR): New.
(ASM_GENERATE_INTERNAL_LABEL): Use new function.
(ASM_OUTPUT_LABELREF): Ditto.
(ASM_OUTPUT_DEF): Ditto.
(ASM_OUTPUT_EXTERNAL): New.
(ASM_OUTPUT_SOURCE_FILENAME): New.
(ASM_OUTPUT_ADDR_VEC_ELT): Use new function.
(ASM_OUTPUT_SKIP): Update for -mdec-asm.
* config/pdp11/pdp11.md: Use tab between opcode and operands.  Use
%# and %@ format codes.
* config/pdp11/pdp11.opt (mgnu-asm): New.
(mdec-asm): Conflicts with -mgnu-asm and -munix-asm.
(munix-asm): Conflicts with -mdec-asm and -mgnu-asm.
* doc/invoke.txt (PDP-11 Options): Add -mgnu-asm.

From-SVN: r262289

gcc/ChangeLog
gcc/common/config/pdp11/pdp11-common.c
gcc/config/pdp11/pdp11-protos.h
gcc/config/pdp11/pdp11.c
gcc/config/pdp11/pdp11.h
gcc/config/pdp11/pdp11.md
gcc/config/pdp11/pdp11.opt
gcc/doc/invoke.texi

index 49febc1..26dfb85 100644 (file)
@@ -1,3 +1,43 @@
+2018-07-01  Paul Koning  <ni1d@arrl.net>
+
+       * common/config/pdp11/pdp11-common.c (pdp11_handle_option): Handle
+       -munit-asm, -mgnu-asm, -mdec-asm.
+       * config/pdp11/pdp11-protos.h (pdp11_gen_int_label): New.
+       (pdp11_output_labelref): New.
+       (pdp11_output_def): New.
+       (pdp11_output_addr_vec_elt): New.
+       * config/pdp11/pdp11.c: Use tab between opcode and operands.  Use
+       %# and %@ format codes.
+       (pdp11_option_override): New.
+       (TARGET_ASM_FILE_START_FILE_DIRECTIVE): Define.
+       (pdp11_output_ident): New.
+       (pdp11_asm_named_section): New.
+       (pdp11_asm_init_sections): New.
+       (pdp11_file_start): New.
+       (pdp11_file_end): New.
+       (output_ascii): Use .ascii/.asciz for -mdec-asm.
+       (pdp11_asm_print_operand): Update %# and %$ for -mdec-asm.  Add
+       %o, like %c but octal.
+       (pdp11_option_override): New.
+       * config/pdp11/pdp11.h (TEXT_SECTION_ASM_OP): Update for
+       -mdec-asm.
+       (DATA_SECTION_ASM_OP): Ditto.
+       (READONLY_DATA_SECTION_ASM_OP): New.
+       (IS_ASM_LOGICAL_LINE_SEPARATOR): New.
+       (ASM_GENERATE_INTERNAL_LABEL): Use new function.
+       (ASM_OUTPUT_LABELREF): Ditto.
+       (ASM_OUTPUT_DEF): Ditto.
+       (ASM_OUTPUT_EXTERNAL): New.
+       (ASM_OUTPUT_SOURCE_FILENAME): New.
+       (ASM_OUTPUT_ADDR_VEC_ELT): Use new function.
+       (ASM_OUTPUT_SKIP): Update for -mdec-asm.
+       * config/pdp11/pdp11.md: Use tab between opcode and operands.  Use
+       %# and %@ format codes.
+       * config/pdp11/pdp11.opt (mgnu-asm): New.
+       (mdec-asm): Conflicts with -mgnu-asm and -munix-asm.
+       (munix-asm): Conflicts with -mdec-asm and -mgnu-asm.
+       * doc/invoke.txt (PDP-11 Options): Add -mgnu-asm.
+
 2018-07-01  Aldy Hernandez  <aldyh@redhat.com>
 
        * tree-ssa-threadupdate.c (mark_threaded_blocks): Avoid
index 9feb4fd..a6fdbc3 100644 (file)
@@ -59,7 +59,16 @@ pdp11_handle_option (struct gcc_options *opts,
       opts->x_target_flags &= ~MASK_40;
       opts->x_target_flags |= MASK_45;
       return true;
-      
+
+    case OPT_munix_asm:
+    case OPT_mgnu_asm:
+      targetm_common.have_named_sections = false;
+      return true;
+
+    case OPT_mdec_asm:
+      targetm_common.have_named_sections = true;
+      return true;
+
     default:
       return true;
     }
index 754a29d..0ce72fd 100644 (file)
@@ -51,3 +51,7 @@ extern void pdp11_asm_output_var (FILE *, const char *, int, int, bool);
 extern void pdp11_expand_prologue (void);
 extern void pdp11_expand_epilogue (void);
 extern poly_int64 pdp11_push_rounding (poly_int64);
+extern void pdp11_gen_int_label (char *, const char *, int);
+extern void pdp11_output_labelref (FILE *, const char *);
+extern void pdp11_output_def (FILE *, const char *, const char *);
+extern void pdp11_output_addr_vec_elt (FILE *, int);
index 142a565..bb29ce9 100644 (file)
@@ -212,7 +212,7 @@ static bool pdp11_scalar_mode_supported_p (scalar_mode);
 #undef  TARGET_PREFERRED_OUTPUT_RELOAD_CLASS
 #define TARGET_PREFERRED_OUTPUT_RELOAD_CLASS pdp11_preferred_output_reload_class
 
-#undef TARGET_LRA_P
+#undef  TARGET_LRA_P
 #define TARGET_LRA_P hook_bool_void_false
 
 #undef  TARGET_LEGITIMATE_ADDRESS_P
@@ -221,9 +221,30 @@ static bool pdp11_scalar_mode_supported_p (scalar_mode);
 #undef  TARGET_CONDITIONAL_REGISTER_USAGE
 #define TARGET_CONDITIONAL_REGISTER_USAGE pdp11_conditional_register_usage
 
+#undef  TARGET_OPTION_OVERRIDE
+#define TARGET_OPTION_OVERRIDE pdp11_option_override
+
+#undef  TARGET_ASM_FILE_START_FILE_DIRECTIVE
+#define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
+
+#undef  TARGET_ASM_OUTPUT_IDENT
+#define TARGET_ASM_OUTPUT_IDENT pdp11_output_ident
+
 #undef  TARGET_ASM_FUNCTION_SECTION
 #define TARGET_ASM_FUNCTION_SECTION pdp11_function_section
 
+#undef  TARGET_ASM_NAMED_SECTION
+#define        TARGET_ASM_NAMED_SECTION pdp11_asm_named_section
+
+#undef  TARGET_ASM_INIT_SECTIONS
+#define TARGET_ASM_INIT_SECTIONS pdp11_asm_init_sections
+
+#undef  TARGET_ASM_FILE_START
+#define TARGET_ASM_FILE_START pdp11_file_start
+
+#undef  TARGET_ASM_FILE_END
+#define TARGET_ASM_FILE_END pdp11_file_end
+
 #undef  TARGET_PRINT_OPERAND
 #define TARGET_PRINT_OPERAND pdp11_asm_print_operand
 
@@ -238,6 +259,7 @@ static bool pdp11_scalar_mode_supported_p (scalar_mode);
 
 #undef  TARGET_HARD_REGNO_NREGS
 #define TARGET_HARD_REGNO_NREGS pdp11_hard_regno_nregs
+
 #undef  TARGET_HARD_REGNO_MODE_OK
 #define TARGET_HARD_REGNO_MODE_OK pdp11_hard_regno_mode_ok
 
@@ -477,9 +499,9 @@ static const char *
 singlemove_string (rtx *operands)
 {
   if (operands[1] != const0_rtx)
-    return "mov %1,%0";
+    return "mov\t%1,%0";
 
-  return "clr %0";
+  return "clr\t%0";
 }
 
 \f
@@ -664,12 +686,12 @@ output_move_multiple (rtx *operands)
   if (action[0] == dec_before)
     {
       operands[0] = XEXP (operands[0], 0);
-      output_asm_insn ("sub $4,%0", operands);
+      output_asm_insn ("sub\t%#4,%0", operands);
     }
   if (action[1] == dec_before)
     {
       operands[1] = XEXP (operands[1], 0);
-      output_asm_insn ("sub $4,%1", operands);
+      output_asm_insn ("sub\t%#4,%1", operands);
     }
 
   /* Do the words.  */
@@ -680,46 +702,86 @@ output_move_multiple (rtx *operands)
   if (action[0] == inc_after)
     {
       operands[0] = XEXP (operands[0], 0);
-      output_asm_insn ("add $4,%0", operands);
+      output_asm_insn ("add\t%#4,%0", operands);
     }
   if (action[1] == inc_after)
     {
       operands[1] = XEXP (operands[1], 0);
-      output_asm_insn ("add $4,%1", operands);
+      output_asm_insn ("add\t%#4,%1", operands);
     }
 
   return "";
 }
 \f
+/* Build an internal label.  */
+void
+pdp11_gen_int_label (char *label, const char *prefix, int num)
+{
+  if (TARGET_DEC_ASM)
+    /* +1 because GCC numbers labels starting at zero.  */
+    sprintf (label, "*%lu$", num + 1);
+  else
+    sprintf (label, "*%s_%lu", prefix, num);
+}
+  
 /* Output an ascii string.  */
 void
 output_ascii (FILE *file, const char *p, int size)
 {
-  int i;
-
-  /* This used to output .byte "string", which doesn't work with the UNIX
-     assembler and I think not with DEC ones either.  */
-  fprintf (file, "\t.byte ");
-
-  for (i = 0; i < size; i++)
+  int i, c;
+  const char *pseudo = "\t.ascii\t";
+  bool delim = false;
+  
+  if (TARGET_DEC_ASM)
+    {
+      if (p[size - 1] == '\0')
+       {
+         pseudo = "\t.asciz\t";
+         size--;
+       }
+      fputs (pseudo, file);
+      for (i = 0; i < size; i++)
+       {
+         c = *p++ & 0xff;
+         if (c < 32 || c == '"' || c > 126)
+           {
+             if (delim)
+               putc ('"', file);
+             fprintf (file, "<%o%>", c);
+             delim = false;
+           }
+         else
+           {
+             if (!delim)
+               putc ('"', file);
+             delim = true;
+             putc (c, file);
+           }
+       }
+      if (delim)
+       putc ('"', file);
+      putc ('\n', file);
+    }
+  else
     {
-      register int c = p[i];
-      if (c < 0)
-       c += 256;
-      fprintf (file, "%#o", c);
-      if (i < size - 1)
-       putc (',', file);
+      fprintf (file, "\t.byte ");
+
+      for (i = 0; i < size; i++)
+       {
+         fprintf (file, "%#o", *p++ & 0xff);
+         if (i < size - 1)
+           putc (',', file);
+       }
+      putc ('\n', file);
     }
-  putc ('\n', file);
 }
 
-
 void
 pdp11_asm_output_var (FILE *file, const char *name, int size,
                      int align, bool global)
 {
   if (align > 8)
-    fprintf (file, "\n\t.even\n");
+    fprintf (file, "\t.even\n");
   if (global)
     {
       fprintf (file, ".globl ");
@@ -727,16 +789,28 @@ pdp11_asm_output_var (FILE *file, const char *name, int size,
     }
   fprintf (file, "\n");
   assemble_name (file, name);
-  fprintf (file, ": .=.+ %#ho\n", (unsigned short)size);
+  fputs (":", file);
+  ASM_OUTPUT_SKIP (file, size);
 }
 
+/* Special format operators handled here:
+   # -- output the correct immediate operand marker for the assembler
+        dialect.
+   @ -- output the correct indirect marker for the assembler dialect.
+   o -- emit a constant value as a number (not an immediate operand)
+        in octal.  */
 static void
 pdp11_asm_print_operand (FILE *file, rtx x, int code)
 {
   long sval[2];
  
   if (code == '#')
-    fprintf (file, "#");
+    {
+      if (TARGET_DEC_ASM)
+       putc ('#', file);
+      else
+       putc ('$', file);
+    }
   else if (code == '@')
     {
       if (TARGET_UNIX_ASM)
@@ -751,11 +825,20 @@ pdp11_asm_print_operand (FILE *file, rtx x, int code)
   else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) != SImode)
     {
       REAL_VALUE_TO_TARGET_DOUBLE (*CONST_DOUBLE_REAL_VALUE (x), sval);
-      fprintf (file, "$%#lo", sval[0] >> 16);
+      if (TARGET_DEC_ASM)
+       fprintf (file, "#%lo", (sval[0] >> 16) & 0xffff);
+      else
+       fprintf (file, "$%#lo", (sval[0] >> 16) & 0xffff);
     }
   else
     {
-      putc ('$', file);
+      if (code != 'o')
+       {
+         if (TARGET_DEC_ASM)
+           putc ('#', file);
+         else
+           putc ('$', file);
+       }
       output_addr_const_pdp11 (file, x);
     }
 }
@@ -851,7 +934,9 @@ print_operand_address (FILE *file, register rtx addr)
       if (!again && GET_CODE (addr) == CONST_INT)
        {
          /* Absolute (integer number) address.  */
-         if (!TARGET_UNIX_ASM)
+         if (TARGET_DEC_ASM)
+           fprintf (file, "@#");
+         else if (!TARGET_UNIX_ASM)
            fprintf (file, "@$");
        }
       output_addr_const_pdp11 (file, addr);
@@ -1088,13 +1173,13 @@ output_jump (rtx *operands, int ccnz, int length)
   switch (length)
     {
     case 2:
-      sprintf (buf, "%s %%l1", pos);
+      sprintf (buf, "%s\t%%l1", pos);
       return buf;
     case 6:
       tmpop[0] = gen_label_rtx ();
-      sprintf (buf, "%s %%l0", neg);
+      sprintf (buf, "%s\t%%l0", neg);
       output_asm_insn (buf, tmpop);
-      output_asm_insn ("jmp %l1", operands);
+      output_asm_insn ("jmp\t%l1", operands);
       output_asm_label (tmpop[0]);
       fputs (":\n", asm_out_file);
       return "";
@@ -1290,7 +1375,7 @@ output_block_move(rtx *operands)
            register int i;
            
            for (i = 1; i <= INTVAL (operands[2]); i++)
-               output_asm_insn("movb (%1)+, (%0)+", operands);
+               output_asm_insn("movb\t(%1)+,(%0)+", operands);
 
            return "";
        }
@@ -1301,9 +1386,9 @@ output_block_move(rtx *operands)
            register int i;
            
            for (i = 1; i <= INTVAL (operands[2]) / 2; i++)
-               output_asm_insn ("mov (%1)+, (%0)+", operands);
+               output_asm_insn ("mov\t(%1)+,(%0)+", operands);
            if (INTVAL (operands[2]) & 1)
-             output_asm_insn ("movb (%1), (%0)", operands);
+             output_asm_insn ("movb\t(%1),(%0)", operands);
            
            return "";
        }
@@ -1335,7 +1420,7 @@ output_block_move(rtx *operands)
       
       /* Loop count is byte count scaled by unroll.  */
       operands[2] = GEN_INT (INTVAL (operands[2]) >> unroll);
-      output_asm_insn ("mov %2, %4", operands);
+      output_asm_insn ("mov\t%2,%4", operands);
     }
     else
     {
@@ -1348,12 +1433,12 @@ output_block_move(rtx *operands)
        if (TARGET_40_PLUS && INTVAL (operands[3]) > 1)
          {
            unroll = 1;
-           output_asm_insn ("asr %4", operands);
+           output_asm_insn ("asr\t%4", operands);
          }
        else
          {
            unroll = 0;
-           output_asm_insn ("tst %4", operands);
+           output_asm_insn ("tst\t%4", operands);
          }
        sprintf (buf, "beq movestrhi%d", count + 1);
        output_asm_insn (buf, NULL);
@@ -1367,35 +1452,35 @@ output_block_move(rtx *operands)
     switch (unroll)
     {
       case 0:
-       output_asm_insn ("movb (%1)+, (%0)+", operands);
+       output_asm_insn ("movb\t(%1)+,(%0)+", operands);
        break;
        
       case 1:
-       output_asm_insn ("mov (%1)+, (%0)+", operands);
+       output_asm_insn ("mov\t(%1)+,(%0)+", operands);
        break;
        
       case 2:
-       output_asm_insn ("mov (%1)+, (%0)+", operands);
-       output_asm_insn ("mov (%1)+, (%0)+", operands);
+       output_asm_insn ("mov\t(%1)+,(%0)+", operands);
+       output_asm_insn ("mov\t(%1)+,(%0)+", operands);
        break;
        
       default:
-       output_asm_insn ("mov (%1)+, (%0)+", operands);
-       output_asm_insn ("mov (%1)+, (%0)+", operands);
-       output_asm_insn ("mov (%1)+, (%0)+", operands);
-       output_asm_insn ("mov (%1)+, (%0)+", operands);
+       output_asm_insn ("mov\t(%1)+,(%0)+", operands);
+       output_asm_insn ("mov\t(%1)+,(%0)+", operands);
+       output_asm_insn ("mov\t(%1)+,(%0)+", operands);
+       output_asm_insn ("mov\t(%1)+,(%0)+", operands);
        break;
     }
 
     /* Output the decrement and test.  */
     if (TARGET_40_PLUS)
       {
-       sprintf (buf, "sob %%4, movestrhi%d", count);
+       sprintf (buf, "sob\t%%4, movestrhi%d", count);
        output_asm_insn (buf, operands);
       }
     else
       {
-       output_asm_insn ("dec %4", operands);
+       output_asm_insn ("dec\t%4", operands);
        sprintf (buf, "bgt movestrhi%d", count);
        output_asm_insn (buf, NULL);
       }
@@ -1403,7 +1488,7 @@ output_block_move(rtx *operands)
 
     /* If constant odd byte count, move the last byte.  */
     if (lastbyte)
-      output_asm_insn ("movb (%1), (%0)", operands);
+      output_asm_insn ("movb\t(%1),(%0)", operands);
     else if (!CONSTANT_P (operands[2]))
       {
        /* Output the destination label for the zero byte count check.  */
@@ -1416,7 +1501,7 @@ output_block_move(rtx *operands)
          {
            sprintf (buf, "bcc movestrhi%d", count);
            output_asm_insn (buf, NULL);
-           output_asm_insn ("movb (%1), (%0)", operands);
+           output_asm_insn ("movb\t(%1),(%0)", operands);
            sprintf (buf, "\nmovestrhi%d:", count);
            output_asm_insn (buf, NULL);
            count++;
@@ -1764,12 +1849,13 @@ output_addr_const_pdp11 (FILE *file, rtx x)
          i = -i;
          fprintf (file, "-");
        }
-      fprintf (file, "%#o", i & 0xffff);
+      if (TARGET_DEC_ASM)
+       fprintf (file, "%o", i & 0xffff);
+      else
+       fprintf (file, "%#o", i & 0xffff);
       break;
 
     case CONST:
-      /* This used to output parentheses around the expression,
-        but that does not work on the 386 (either ATT or BSD assembler).  */
       output_addr_const_pdp11 (file, XEXP (x, 0));
       break;
 
@@ -1778,7 +1864,10 @@ output_addr_const_pdp11 (FILE *file, rtx x)
        {
          /* We can use %o if the number is one word and positive.  */
          gcc_assert (!CONST_DOUBLE_HIGH (x));
-         fprintf (file, "%#ho", (unsigned short) CONST_DOUBLE_LOW (x));
+         if (TARGET_DEC_ASM)
+           fprintf (file, "%ho", CONST_DOUBLE_LOW (x) & 0xffff);
+         else
+           fprintf (file, "%#ho", CONST_DOUBLE_LOW (x) & 0xffff);
        }
       else
        /* We can't handle floating point constants;
@@ -1888,8 +1977,8 @@ bool
 pdp11_expand_shift (rtx *operands, rtx (*shift_sc) (rtx, rtx, rtx),
                    rtx (*shift_base) (rtx, rtx, rtx))
 {
-  rtx dest, n, r, test;
-  rtx_code_label *lb, *lb2;
+  rtx r, test;
+  rtx_code_label *lb;
   
   if (CONSTANT_P (operands[2]) && pdp11_small_shift (INTVAL (operands[2])))
     emit_insn ((*shift_sc) (operands[0], operands[1], operands[2]));
@@ -1956,14 +2045,14 @@ pdp11_assemble_shift (rtx *operands, machine_mode m, int code)
       switch (m)
        {
        case E_QImode:
-         output_asm_insn ("rorb %0", operands);
+         output_asm_insn ("rorb\t%0", operands);
          break;
        case E_HImode:
-         output_asm_insn ("ror %0", operands);
+         output_asm_insn ("ror\t%0", operands);
          break;
        case E_SImode:
-         output_asm_insn ("ror %0", exops[0]);
-         output_asm_insn ("ror %0", exops[1]);
+         output_asm_insn ("ror\t%0", exops[0]);
+         output_asm_insn ("ror\t%0", exops[1]);
          break;
        default:
          gcc_unreachable ();
@@ -1979,14 +2068,14 @@ pdp11_assemble_shift (rtx *operands, machine_mode m, int code)
          switch (m)
            {
            case E_QImode:
-             output_asm_insn ("asrb %0", operands);
+             output_asm_insn ("asrb\t%0", operands);
              break;
            case E_HImode:
-             output_asm_insn ("asr %0", operands);
+             output_asm_insn ("asr\t%0", operands);
              break;
            case E_SImode:
-             output_asm_insn ("asr %0", exops[0]);
-             output_asm_insn ("ror %0", exops[1]);
+             output_asm_insn ("asr\t%0", exops[0]);
+             output_asm_insn ("ror\t%0", exops[1]);
              break;
            default:
              gcc_unreachable ();
@@ -1996,14 +2085,14 @@ pdp11_assemble_shift (rtx *operands, machine_mode m, int code)
          switch (m)
            {
            case E_QImode:
-             output_asm_insn ("aslb %0", operands);
+             output_asm_insn ("aslb\t%0", operands);
              break;
            case E_HImode:
-             output_asm_insn ("asl %0", operands);
+             output_asm_insn ("asl\t%0", operands);
              break;
            case E_SImode:
-             output_asm_insn ("asl %0", exops[1]);
-             output_asm_insn ("rol %0", exops[0]);
+             output_asm_insn ("asl\t%0", exops[1]);
+             output_asm_insn ("rol\t%0", exops[0]);
              break;
            default:
              gcc_unreachable ();
@@ -2014,8 +2103,8 @@ pdp11_assemble_shift (rtx *operands, machine_mode m, int code)
   if (!small)
     {
       /* Loop case, emit the count-down and branch if not done.  */
-      output_asm_insn ("dec %2", operands);
-      output_asm_insn ("bne %l0", lb);
+      output_asm_insn ("dec\t%2", operands);
+      output_asm_insn ("bne\t%l0", lb);
     }
   return "";
 }
@@ -2159,6 +2248,114 @@ pdp11_function_section (tree decl ATTRIBUTE_UNUSED,
   return NULL;
 }
 
+/* Support #ident for DEC assembler, but don't process the
+   auto-generated ident string that names the compiler (since its
+   syntax is not correct for DEC .ident).  */
+static void pdp11_output_ident (const char *ident)
+{
+  if (TARGET_DEC_ASM)
+    {
+      if (strncmp (ident, "GCC:", 4) != 0)
+       fprintf (asm_out_file, "\t.ident\t\"%s\"\n", ident);
+    }
+  
+}
+
+/* This emits a (user) label, which gets a "_" prefix except for DEC
+   assembler output.  */
+void
+pdp11_output_labelref (FILE *file, const char *name)
+{
+  if (!TARGET_DEC_ASM)
+    fputs (USER_LABEL_PREFIX, file);
+  fputs (name, file);
+}
+
+/* This equates name with value.  */
+void
+pdp11_output_def (FILE *file, const char *label1, const char *label2)
+{
+  if (TARGET_DEC_ASM)
+    {
+      assemble_name (file, label1);
+      putc ('=', file);
+      assemble_name (file, label2);
+    }
+  else
+    {
+      fputs (".set", file);
+      assemble_name (file, label1);
+      putc (',', file);
+      assemble_name (file, label2);
+    } 
+  putc ('\n', file);
+}
+
+void
+pdp11_output_addr_vec_elt (FILE *file, int value)
+{
+  char buf[256];
+
+  pdp11_gen_int_label (buf, "L", value);
+  if (!TARGET_UNIX_ASM)
+    fprintf (file, "\t.word");
+  fprintf (file, "\t%s\n", buf + 1);
+}
+
+/* This overrides some target hooks that are initializer elements so
+   they can't be variables in the #define.  */
+static void
+pdp11_option_override (void)
+{
+  if (TARGET_DEC_ASM)
+    {
+      targetm.asm_out.open_paren  = "<";
+      targetm.asm_out.close_paren = ">";
+    }
+}
+
+static void
+pdp11_asm_named_section (const char *name, unsigned int flags,
+                        tree decl ATTRIBUTE_UNUSED)
+{
+  const char *rwro = (flags & SECTION_WRITE) ? "rw" : "ro";
+  const char *insdat = (flags & SECTION_CODE) ? "i" : "d";
+  
+  gcc_assert (TARGET_DEC_ASM);
+  fprintf (asm_out_file, "\t.psect\t%s,con,%s,%s\n", name, insdat, rwro);
+}
+
+static void
+pdp11_asm_init_sections (void)
+{
+  if (TARGET_DEC_ASM)
+    {
+      bss_section = data_section;
+    }
+  else if (TARGET_GNU_ASM)
+    {
+      bss_section = get_unnamed_section (SECTION_WRITE | SECTION_BSS,
+                                        output_section_asm_op,
+                                        ".bss");
+    }
+}
+  
+static void
+pdp11_file_start (void)
+{
+  default_file_start ();
+  
+  if (TARGET_DEC_ASM)
+    fprintf (asm_out_file, "\t.enabl\tlsb,reg\n\n");
+}
+
+static void
+pdp11_file_end (void)
+{
+  if (TARGET_DEC_ASM)
+    fprintf (asm_out_file, "\t.end\n");
+}
+
 /* Implement TARGET_LEGITIMATE_CONSTANT_P.  */
 
 static bool
index 67386ca..ff2f9a2 100644 (file)
@@ -45,6 +45,10 @@ along with GCC; see the file COPYING3.  If not see
 
 #define TARGET_UNIX_ASM_DEFAULT        0
 
+/* "Dialect" just distinguishes between standard DEC mnemonics, which
+   are also used by the GNU assembler, vs. Unix mnemonics and float
+   register names.  So it is tied to the -munit-asm option, and treats
+   -mgnu-asm and -mdec-asm as equivalent (both are dialect zero).  */
 #define ASSEMBLER_DIALECT      (TARGET_UNIX_ASM ? 1 : 0)
 
 \f
@@ -489,11 +493,19 @@ extern int may_call_alloca;
 
 /* Output before read-only data.  */
 
-#define TEXT_SECTION_ASM_OP "\t.text\n"
+#define TEXT_SECTION_ASM_OP \
+  ((TARGET_DEC_ASM) ? "\t.psect\tcode,i,ro,con" : "\t.text")
 
 /* Output before writable data.  */
 
-#define DATA_SECTION_ASM_OP "\t.data\n"
+#define DATA_SECTION_ASM_OP \
+  ((TARGET_DEC_ASM) ? "\t.psect\tdata,d,rw,con" : "\t.data")
+
+/* Output before read-only data.  Same as read-write data for non-DEC
+   assemblers because they don't know about .rodata.  */
+
+#define READONLY_DATA_SECTION_ASM_OP \
+  ((TARGET_DEC_ASM) ? "\t.psect\trodata,d,ro,con" : "\t.data")
 
 /* How to refer to registers in assembler output.
    This sequence is indexed by compiler's hard-register-number (see above).  */
@@ -504,38 +516,59 @@ extern int may_call_alloca;
  "cc", "fcc" }
 
 /* Globalizing directive for a label.  */
-#define GLOBAL_ASM_OP "\t.globl "
+#define GLOBAL_ASM_OP "\t.globl\t"
 
-/* The prefix to add to user-visible assembler symbols.  */
+/* The prefix to add to user-visible assembler symbols.  For the DEC
+   assembler case, this is not used.  */
 
 #define USER_LABEL_PREFIX "_"
 
+/* Line separators.  */
+
+#define IS_ASM_LOGICAL_LINE_SEPARATOR(C, STR) \
+  ((C) == '\n' || (!TARGET_DEC_ASM && (C) == ';'))
+
 /* This is how to store into the string LABEL
    the symbol_ref name of an internal numbered label where
    PREFIX is the class of label and NUM is the number within the class.
    This is suitable for output with `assemble_name'.  */
 
-#define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM)  \
-  sprintf (LABEL, "*%s_%lu", PREFIX, (unsigned long)(NUM))
+#define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \
+  pdp11_gen_int_label ((LABEL), (PREFIX), (NUM))
+
+/* Emit a string.  */
 
 #define ASM_OUTPUT_ASCII(FILE, P, SIZE)  \
   output_ascii (FILE, P, SIZE)
 
-/* This is how to output an element of a case-vector that is absolute.  */
+/* Print a label reference, with _ prefix if not DEC.  */
 
-#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE)  \
-  fprintf (FILE, "\t%sL_%d\n", TARGET_UNIX_ASM ? "" : ".word ", VALUE)
+#define ASM_OUTPUT_LABELREF(STREAM, NAME) \
+  pdp11_output_labelref ((STREAM), (NAME))
+
+/* Equate a symbol to an expression.  */
+
+#define ASM_OUTPUT_DEF(STREAM, NAME, VALUE) \
+  pdp11_output_def (STREAM, NAME, VALUE)
 
-/* This is how to output an element of a case-vector that is relative.
-   Don't define this if it is not supported.  */
+/* Mark a reference to an external symbol.  Needed for DEC assembler.  */
 
-/* #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL) */
+#define ASM_OUTPUT_EXTERNAL(STREAM, DECL, NAME) \
+  if (TARGET_DEC_ASM) \
+    fprintf ((STREAM), "\t.globl\t%s\n", (NAME))
+
+#define ASM_OUTPUT_SOURCE_FILENAME(STREAM, NAME) \
+  if (TARGET_DEC_ASM) \
+    fprintf ((STREAM), ".title\t%s\n", (NAME))
+
+/* This is how to output an element of a case-vector that is absolute.  */
+
+#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE)  \
+  pdp11_output_addr_vec_elt (FILE, VALUE)
 
 /* This is how to output an assembler line
    that says to advance the location counter
    to a multiple of 2**LOG bytes. 
-
-   who needs this????
 */
 
 #define ASM_OUTPUT_ALIGN(FILE,LOG)     \
@@ -551,35 +584,34 @@ extern int may_call_alloca;
     }
 
 #define ASM_OUTPUT_SKIP(FILE,SIZE)  \
-  fprintf (FILE, "\t.=.+ %#ho\n", (unsigned short)(SIZE))
+  if (TARGET_DEC_ASM) \
+    fprintf (FILE, "\t.blkb\t%ho\n", (SIZE) & 0xffff); \
+  else                                                 \
+    fprintf (FILE, "\t.=.+ %#ho\n", (SIZE) & 0xffff);
 
 /* This says how to output an assembler line
    to define a global common symbol.  */
 
 #define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN)  \
-    pdp11_asm_output_var (FILE, NAME, SIZE, ALIGN, true)
+  pdp11_asm_output_var (FILE, NAME, SIZE, ALIGN, true)
 
 
 /* This says how to output an assembler line
    to define a local common symbol.  */
 
 #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \
-    pdp11_asm_output_var (FILE, NAME, SIZE, ALIGN, false)
+  pdp11_asm_output_var (FILE, NAME, SIZE, ALIGN, false)
 
 /* Print a memory address as an operand to reference that memory location.  */
 
 #define PRINT_OPERAND_ADDRESS(FILE, ADDR)  \
- print_operand_address (FILE, ADDR)
 print_operand_address (FILE, ADDR)
 
-#define ASM_OUTPUT_REG_PUSH(FILE,REGNO)                        \
-(                                                      \
-  fprintf (FILE, "\tmov %s, -(sp)\n", reg_names[REGNO])        \
-)
+#define ASM_OUTPUT_REG_PUSH(FILE,REGNO)        \
+  fprintf (FILE, "\tmov\t%s,-(sp)\n", reg_names[REGNO])
 
-#define ASM_OUTPUT_REG_POP(FILE,REGNO)                                 \
-(                                                              \
-  fprintf (FILE, "\tmov (sp)+, %s\n", reg_names[REGNO])        \
-)
+#define ASM_OUTPUT_REG_POP(FILE,REGNO) \
+  fprintf (FILE, "\tmov\t(sp)+,%s\n", reg_names[REGNO])
 
 #define TRAMPOLINE_SIZE 8
 #define TRAMPOLINE_ALIGNMENT 16
@@ -588,6 +620,7 @@ extern int may_call_alloca;
 
 #define COMPARE_FLAG_MODE HImode
 
+/* May be overridden by command option processing.  */
 #define TARGET_HAVE_NAMED_SECTIONS false
 
 /* pdp11-unknown-aout target has no support of C99 runtime */
index 6592a2c..ba85d7d 100644 (file)
   "*
 {
   if (which_alternative == 0 || which_alternative == 2)
-    return \"{tstd|tstf} %0\";
+    return \"{tstd|tstf}\t%0\";
   else
-    return \"{cmpd|cmpf} %0, %1\";
+    return \"{cmpd|cmpf}\t%0,%1\";
 }"
   [(set_attr "length" "2,2,4,4")
    (set_attr "type" "fp")]) 
                    (match_operand:PDPint 1 "general_operand" "N,rR,Qi,N,rR,Qi")))]
   ""
   "@
-   tst<PDPint:isfx> %0
-   cmp<PDPint:isfx> %0,%1
-   cmp<PDPint:isfx> %0,%1
-   tst<PDPint:isfx> %0
-   cmp<PDPint:isfx> %0,%1
-   cmp<PDPint:isfx> %0,%1"
+   tst<PDPint:isfx>\t%0
+   cmp<PDPint:isfx>\t%0,%1
+   cmp<PDPint:isfx>\t%0,%1
+   tst<PDPint:isfx>\t%0
+   cmp<PDPint:isfx>\t%0,%1
+   cmp<PDPint:isfx>\t%0,%1"
   [(set_attr "length" "2,2,4,4,4,6")])
 
 ;; sob instruction - FIXME: this doesn't do anything, need to use doloop_end.
   "*
 {
  if (get_attr_length (insn) == 2)
-    return \"sob %0, %l1\";
+    return \"sob\t%0,%l1\";
 
  /* emulate sob */
  operands[2] = gen_label_rtx ();
- output_asm_insn (\"dec %0\", operands);
- output_asm_insn (\"beq %l2\", operands);
- output_asm_insn (\"jmp %l1\", operands);
+ output_asm_insn (\"dec\t%0\", operands);
+ output_asm_insn (\"beq\t%l2\", operands);
+ output_asm_insn (\"jmp\t%l1\", operands);
  
  output_asm_label (operands[2]);
  fputs (\":\\n\", asm_out_file);
   "*
 {
   if (operands[1] == const0_rtx)
-    return \"clr<PDPint:isfx> %0\";
+    return \"clr<PDPint:isfx>\t%0\";
 
-  return \"mov<PDPint:isfx> %1, %0\";
+  return \"mov<PDPint:isfx>\t%1,%0\";
 }"
   [(set_attr "length" "2,4,4,6")])
 
   "TARGET_FPU"
   "*
   gcc_assert (which_alternative < 2);
-  return \"std %1, %0\";
+  return \"std\t%1,%0\";
   "
   "&& reload_completed"
   [(parallel [(set (match_dup 0)
    (clobber (reg:CC FCC_REGNUM))]
   "TARGET_FPU && reload_completed"
   "@
-  ldd %1, %0
-  ldd %1, %0
-  clrd %0"
+  ldd\t%1,%0
+  ldd\t%1,%0
+  clrd\t%0"
   [(set_attr "length" "2,4,2")])
 
 ;; SFmode is easier because that uses convert load/store, which
    (clobber (reg:CC FCC_REGNUM))]
   "TARGET_FPU && reload_completed"
   "@
-  {ldcfd|movof} %1, %0
-  {stcdf|movfo} %1, %0
-  {ldcfd|movof} %1, %0
-  {stcdf|movfo} %1, %0
-  clrf %0"
+  {ldcfd|movof}\t%1,%0
+  {stcdf|movfo}\t%1,%0
+  {ldcfd|movof}\t%1,%0
+  {stcdf|movfo}\t%1,%0
+  clrf\t%0"
   [(set_attr "length" "2,2,4,4,2")])
 
 ;; maybe fiddle a bit with move_ratio, then 
        (float_truncate:SF (match_operand:DF 1 "register_operand" "a,a")))
    (clobber (reg:CC FCC_REGNUM))]
   "TARGET_FPU && reload_completed"
-   "{stcdf|movfo} %1, %0"
+   "{stcdf|movfo}\t%1,%0"
   [(set_attr "length" "2,4")])
 
 \f
                   (zero_extend:HI (match_operand:QI 1 "general_operand" "0,0")))
              (clobber (reg:CC CC_REGNUM))])]
   "reload_completed"
-  "bic $0177400, %0"
+  "bic\t%#0177400,%0"
   [(set_attr "length" "4,6")])
                         
 (define_expand "zero_extendhisi2"
        (float_extend:DF (match_operand:SF 1 "float_operand" "R,Q")))
    (clobber (reg:CC FCC_REGNUM))]
   "TARGET_FPU && reload_completed"
-  "{ldcfd|movof} %1, %0"
+  "{ldcfd|movof}\t%1,%0"
   [(set_attr "length" "2,4")])
 
 ;; movb sign extends if destination is a register
        (sign_extend:HI (match_operand:QI 1 "general_operand" "rR,Q")))
    (clobber (reg:CC CC_REGNUM))]
   "reload_completed"
-  "movb %1, %0"
+  "movb\t%1,%0"
   [(set_attr "length" "2,4")])
 
 (define_insn_and_split "extendhisi2"
       latehalf[0] = operands[0];
       operands[0] = adjust_address(operands[0], HImode, 2);
   
-      output_asm_insn(\"mov %1, %0\", operands);
-      output_asm_insn(\"sxt %0\", latehalf);
+      output_asm_insn(\"mov\t%1,%0\", operands);
+      output_asm_insn(\"sxt\t%0\", latehalf);
 
       return \"\";
 
     case 1:
 
       /* - auto-decrement - right direction ;-) */
-      output_asm_insn(\"mov %1, %0\", operands);
-      output_asm_insn(\"sxt %0\", operands);
+      output_asm_insn(\"mov\t%1,%0\", operands);
+      output_asm_insn(\"sxt\t%0\", operands);
 
       return \"\";
 
       latehalf[0] = operands[0];
       operands[0] = gen_rtx_REG (HImode, REGNO (operands[0]) + 1);
 
-      output_asm_insn(\"mov %1, %0\", operands);
-      output_asm_insn(\"sxt %0\", latehalf);
+      output_asm_insn(\"mov\t%1,%0\", operands);
+      output_asm_insn(\"sxt\t%0\", latehalf);
 
       return \"\";
 
  
        latehalf[0] = NULL; 
        latehalf[1] = gen_rtx_REG (HImode, REGNO (operands[1]) + 1);
-       output_asm_insn(\"mov %1, -(sp)\", latehalf);
-       output_asm_insn(\"mov %1, -(sp)\", operands);
+       output_asm_insn(\"mov\t%1,-(sp)\", latehalf);
+       output_asm_insn(\"mov\t%1,-(sp)\", operands);
        
        output_asm_insn(\"setl\", operands);
-       output_asm_insn(\"{ldcld|movif} (sp)+, %0\", operands);
+       output_asm_insn(\"{ldcld|movif}\t(sp)+,%0\", operands);
        output_asm_insn(\"seti\", operands);
        return \"\";
      }
      else 
-       return \"setl\;{ldcld|movif} %1, %0\;seti\";
+       return \"setl\;{ldcld|movif}\t%1,%0\;seti\";
   "
   [(set_attr "length" "10,6,8")])
 
        (float:DF (match_operand:HI 1 "general_operand" "rR,Qi")))
    (clobber (reg:CC FCC_REGNUM))]
   "TARGET_FPU && reload_completed"
-  "{ldcid|movif} %1, %0"
+  "{ldcid|movif}\t%1,%0"
   [(set_attr "length" "2,4")])
        
 ;; cut float to int
   "* if (which_alternative ==0)
      {
        output_asm_insn(\"setl\", operands);
-       output_asm_insn(\"{stcdl|movfi} %1, -(sp)\", operands);
+       output_asm_insn(\"{stcdl|movfi}\t%1,-(sp)\", operands);
        output_asm_insn(\"seti\", operands);
-       output_asm_insn(\"mov (sp)+, %0\", operands);
+       output_asm_insn(\"mov\t(sp)+,%0\", operands);
        operands[0] = gen_rtx_REG (HImode, REGNO (operands[0]) + 1);
-       output_asm_insn(\"mov (sp)+, %0\", operands);
+       output_asm_insn(\"mov\t(sp)+,%0\", operands);
        return \"\";
      }
      else 
-       return \"setl\;{stcdl|movfi} %1, %0\;seti\";
+       return \"setl\;{stcdl|movfi}\t%1,%0\;seti\";
   "
   [(set_attr "length" "10,6,8")])
 
    (clobber (reg:CC CC_REGNUM))
    (clobber (reg:CC FCC_REGNUM))]
   "TARGET_FPU && reload_completed"
-  "{stcdi|movfi} %1, %0"
+  "{stcdi|movfi}\t%1,%0"
   [(set_attr "length" "2,4")])
 
 \f
              (match_operand:DF 2 "general_operand" "fR,QF")))
    (clobber (reg:CC FCC_REGNUM))]
   "TARGET_FPU && reload_completed"
-  "{addd|addf} %2, %0"
+  "{addd|addf}\t%2,%0"
   [(set_attr "length" "2,4")])
 
 (define_insn_and_split "adddi3"
   pdp11_expand_operands (inops, exops, 2, NULL, either);
   
   if (!CONSTANT_P (exops[0][1]) || INTVAL (exops[0][1]) != 0)
-    output_asm_insn (\"add %1, %0\", exops[0]);
+    output_asm_insn (\"add\t%1,%0\", exops[0]);
   if (!CONSTANT_P (exops[1][1]) || INTVAL (exops[1][1]) != 0)
   {
-    output_asm_insn (\"add %1, %0\", exops[1]);
-    output_asm_insn (\"adc %0\", exops[0]);
+    output_asm_insn (\"add\t%1,%0\", exops[1]);
+    output_asm_insn (\"adc\t%0\", exops[0]);
   }
   if (!CONSTANT_P (exops[2][1]) || INTVAL (exops[2][1]) != 0)
   {
-    output_asm_insn (\"add %1, %0\", exops[2]);
-    output_asm_insn (\"adc %0\", exops[1]);
-    output_asm_insn (\"adc %0\", exops[0]);
+    output_asm_insn (\"add\t%1,%0\", exops[2]);
+    output_asm_insn (\"adc\t%0\", exops[1]);
+    output_asm_insn (\"adc\t%0\", exops[0]);
   }
   if (!CONSTANT_P (exops[3][1]) || INTVAL (exops[3][1]) != 0)
   {
-    output_asm_insn (\"add %1, %0\", exops[3]);
-    output_asm_insn (\"adc %0\", exops[2]);
-    output_asm_insn (\"adc %0\", exops[1]);
-    output_asm_insn (\"adc %0\", exops[0]);
+    output_asm_insn (\"add\t%1,%0\", exops[3]);
+    output_asm_insn (\"adc\t%0\", exops[2]);
+    output_asm_insn (\"adc\t%0\", exops[1]);
+    output_asm_insn (\"adc\t%0\", exops[0]);
   }
 
   return \"\";
   pdp11_expand_operands (inops, exops, 2, NULL, either);
   
   if (!CONSTANT_P (exops[0][1]) || INTVAL (exops[0][1]) != 0)
-    output_asm_insn (\"add %1, %0\", exops[0]);
+    output_asm_insn (\"add\t%1,%0\", exops[0]);
   if (!CONSTANT_P (exops[1][1]) || INTVAL (exops[1][1]) != 0)
   {
-    output_asm_insn (\"add %1, %0\", exops[1]);
-    output_asm_insn (\"adc %0\", exops[0]);
+    output_asm_insn (\"add\t%1,%0\", exops[1]);
+    output_asm_insn (\"adc\t%0\", exops[0]);
   }
 
   return \"\";
   if (GET_CODE (operands[2]) == CONST_INT)
     {
       if (INTVAL(operands[2]) == 1)
-       return \"inc %0\";
+       return \"inc\t%0\";
       else if (INTVAL(operands[2]) == -1)
-        return \"dec %0\";
+        return \"dec\t%0\";
     }
 
-  return \"add %2, %0\";
+  return \"add\t%2,%0\";
 }"
   [(set_attr "length" "2,4,4,6")])
 
                  (match_operand:DF 2 "general_operand" "fR,QF")))
    (clobber (reg:CC FCC_REGNUM))]
   "TARGET_FPU && reload_completed"
-  "{subd|subf} %2, %0"
+  "{subd|subf}\t%2,%0"
   [(set_attr "length" "2,4")])
 
 (define_insn_and_split "subdi3"
   pdp11_expand_operands (inops, exops, 2, NULL, either);
   
   if (!CONSTANT_P (exops[0][1]) || INTVAL (exops[0][1]) != 0)
-    output_asm_insn (\"sub %1, %0\", exops[0]);
+    output_asm_insn (\"sub\t%1,%0\", exops[0]);
   if (!CONSTANT_P (exops[1][1]) || INTVAL (exops[1][1]) != 0)
   {
-    output_asm_insn (\"sub %1, %0\", exops[1]);
-    output_asm_insn (\"sbc %0\", exops[0]);
+    output_asm_insn (\"sub\t%1,%0\", exops[1]);
+    output_asm_insn (\"sbc\t%0\", exops[0]);
   }
   if (!CONSTANT_P (exops[2][1]) || INTVAL (exops[2][1]) != 0)
   {
-    output_asm_insn (\"sub %1, %0\", exops[2]);
-    output_asm_insn (\"sbc %0\", exops[1]);
-    output_asm_insn (\"sbc %0\", exops[0]);
+    output_asm_insn (\"sub\t%1,%0\", exops[2]);
+    output_asm_insn (\"sbc\t%0\", exops[1]);
+    output_asm_insn (\"sbc\t%0\", exops[0]);
   }
   if (!CONSTANT_P (exops[3][1]) || INTVAL (exops[3][1]) != 0)
   {
-    output_asm_insn (\"sub %1, %0\", exops[3]);
-    output_asm_insn (\"sbc %0\", exops[2]);
-    output_asm_insn (\"sbc %0\", exops[1]);
-    output_asm_insn (\"sbc %0\", exops[0]);
+    output_asm_insn (\"sub\t%1,%0\", exops[3]);
+    output_asm_insn (\"sbc\t%0\", exops[2]);
+    output_asm_insn (\"sbc\t%0\", exops[1]);
+    output_asm_insn (\"sbc\t%0\", exops[0]);
   }
 
   return \"\";
   pdp11_expand_operands (inops, exops, 2, NULL, either);
   
   if (!CONSTANT_P (exops[0][1]) || INTVAL (exops[0][1]) != 0)
-    output_asm_insn (\"sub %1, %0\", exops[0]);
+    output_asm_insn (\"sub\t%1,%0\", exops[0]);
   if (!CONSTANT_P (exops[1][1]) || INTVAL (exops[1][1]) != 0)
   {
-    output_asm_insn (\"sub %1, %0\", exops[1]);
-    output_asm_insn (\"sbc %0\", exops[0]);
+    output_asm_insn (\"sub\t%1,%0\", exops[1]);
+    output_asm_insn (\"sbc\t%0\", exops[0]);
   }
 
   return \"\";
   if (GET_CODE (operands[2]) == CONST_INT)
     {
       if (INTVAL(operands[2]) == 1)
-       return \"dec %0\";
+       return \"dec\t%0\";
       else if (INTVAL(operands[2]) == -1)
-        return \"inc %0\";
+        return \"inc\t%0\";
     }
 
-  return \"sub %2, %0\";
+  return \"sub\t%2,%0\";
 }"
   [(set_attr "length" "2,4,4,6")])
 
                          (match_operand:PDPint 2 "general_operand" "0,0,0,0")))
    (clobber (reg:CC CC_REGNUM))]
   "reload_completed"
-  "bic<PDPint:isfx> %1, %0"
+  "bic<PDPint:isfx>\t%1,%0"
   [(set_attr "length" "2,4,4,6")])
 
 ;;- Bit set (inclusive or) instructions
             (match_operand:PDPint 2 "general_operand" "rR,Qi,rR,Qi")))
    (clobber (reg:CC CC_REGNUM))]
   "reload_completed"
-  "bis<PDPint:isfx> %2, %0"
+  "bis<PDPint:isfx>\t%2,%0"
   [(set_attr "length" "2,4,4,6")])
 
 ;;- xor instructions
             (match_operand:HI 2 "register_operand" "r,r")))
    (clobber (reg:CC CC_REGNUM))]
   "TARGET_40_PLUS && reload_completed"
-  "xor %2, %0"
+  "xor\t%2,%0"
   [(set_attr "length" "2,4")])
 
 ;;- one complement instructions
        (not:PDPint (match_operand:PDPint 1 "general_operand" "0,0")))
    (clobber (reg:CC CC_REGNUM))]
   "reload_completed"
-  "com<PDPint:isfx> %0"
+  "com<PDPint:isfx>\t%0"
   [(set_attr "length" "2,4")])
 
 ;;- arithmetic shift instructions
        (ashift:HI (match_operand:HI 1 "general_operand" "0,0")
                       (match_operand:HI 2 "general_operand" "rR,Q")))]
   "TARGET_40_PLUS"
-  "ash %2, %0"
+  "ash\t%2,%0"
   [(set_attr "length" "2,4")])
 
 (define_insn "aslsi_op"
        (ashift:SI (match_operand:SI 1 "general_operand" "0,0")
                   (match_operand:HI 2 "general_operand" "rR,Q")))]
   "TARGET_40_PLUS"
-  "ashc %2, %0"
+  "ashc\t%2,%0"
   [(set_attr "length" "2,4")])
 
 ;; Now the expanders that produce the insns defined above. 
        (abs:DF (match_operand:DF 1 "general_operand" "0,0")))
    (clobber (reg:CC FCC_REGNUM))]
   "TARGET_FPU && reload_completed"
-  "{absd|absf} %0"
+  "{absd|absf}\t%0"
   [(set_attr "length" "2,4")])
 
 ;; negate insns
        (neg:DF (match_operand:DF 1 "general_operand" "0,0")))
    (clobber (reg:CC FCC_REGNUM))]
   "TARGET_FPU && reload_completed"
-  "{negd|negf} %0"
+  "{negd|negf}\t%0"
   [(set_attr "length" "2,4")])
 
 (define_insn_and_split "negdi2"
   
   pdp11_expand_operands (operands, exops, 1, NULL, either);
 
-  output_asm_insn (\"com %0\", exops[3]);
-  output_asm_insn (\"com %0\", exops[2]);
-  output_asm_insn (\"com %0\", exops[1]);
-  output_asm_insn (\"com %0\", exops[0]);
-  output_asm_insn (\"add $1, %0\", exops[3]);
-  output_asm_insn (\"adc %0\", exops[2]);
-  output_asm_insn (\"adc %0\", exops[1]);
-  output_asm_insn (\"adc %0\", exops[0]);
+  output_asm_insn (\"com\t%0\", exops[3]);
+  output_asm_insn (\"com\t%0\", exops[2]);
+  output_asm_insn (\"com\t%0\", exops[1]);
+  output_asm_insn (\"com\t%0\", exops[0]);
+  output_asm_insn (\"add\t%#1,%0\", exops[3]);
+  output_asm_insn (\"adc\t%0\", exops[2]);
+  output_asm_insn (\"adc\t%0\", exops[1]);
+  output_asm_insn (\"adc\t%0\", exops[0]);
 
   return \"\";
 }
   
   pdp11_expand_operands (operands, exops, 1, NULL, either);
 
-  output_asm_insn (\"com %0\", exops[1]);
-  output_asm_insn (\"com %0\", exops[0]);
-  output_asm_insn (\"add $1, %0\", exops[1]);
-  output_asm_insn (\"adc %0\", exops[0]);
+  output_asm_insn (\"com\t%0\", exops[1]);
+  output_asm_insn (\"com\t%0\", exops[0]);
+  output_asm_insn (\"add\t%#1,%0\", exops[1]);
+  output_asm_insn (\"adc\t%0\", exops[0]);
 
   return \"\";
 }
        (neg:PDPint (match_operand:PDPint 1 "general_operand" "0,0")))
    (clobber (reg:CC CC_REGNUM))]
   ""
-  "neg<PDPint:isfx> %0"
+  "neg<PDPint:isfx>\t%0"
   [(set_attr "length" "2,4")])
 
 
   "*
 {
   if (get_attr_length (insn) == 2)
-    return \"br %l0\";
-  return \"jmp %l0\";
+    return \"br\t%l0\";
+  return \"jmp\t%l0\";
 }"
   [(set (attr "length") (if_then_else (ior (lt (minus (match_dup 0)
                                                      (pc))
    (use (label_ref (match_operand 1 "" "")))]
   ""
   "@
-  jmp (%0)
-  jmp %@%0
-  jmp %@%0"
+  jmp\t(%0)
+  jmp\t%@%0
+  jmp\t%@%0"
   [(set_attr "length" "2,2,4")])
 
 ;; indirect jump.  TODO: this needs a constraint that allows memory
         (match_operand:HI 1 "general_operand" "g,g"))]
   ;;- Don't use operand 1 for most machines.
   ""
-  "jsr pc, %0"
+  "jsr pc,%0"
   [(set_attr "length" "2,4")])
 
 ;;- jump to subroutine
              (match_operand:HI 2 "general_operand" "g,g")))]
   ;;- Don't use operand 2 for most machines.
   ""
-  "jsr pc, %1"
+  "jsr pc,%1"
   [(set_attr "length" "2,4")])
 
 (define_expand "untyped_call"
              (match_operand:DF 2 "float_operand" "fR,QF")))
    (clobber (reg:CC FCC_REGNUM))]
   "TARGET_FPU && reload_completed"
-  "{muld|mulf} %2, %0"
+  "{muld|mulf}\t%2,%0"
   [(set_attr "length" "2,4")])
 
 ;; 16 bit result multiply.  This uses odd numbered registers.
              (match_operand:HI 2 "general_operand" "rR,Qi")))
    (clobber (reg:CC CC_REGNUM))]
   "TARGET_40_PLUS && reload_completed"
-  "mul %2, %0"
+  "mul\t%2,%0"
   [(set_attr "length" "2,4")])
 
 ;; 32 bit result from 16 bit operands
              (sign_extend:SI (match_operand:HI 2 "general_operand" "rR,Qi"))))
    (clobber (reg:CC CC_REGNUM))]
   "TARGET_40_PLUS && reload_completed"
-  "mul %2, %0"
+  "mul\t%2,%0"
   [(set_attr "length" "2,4")])
 
 ;;- divide
             (match_operand:DF 2 "general_operand" "fR,QF")))
    (clobber (reg:CC FCC_REGNUM))]
   "TARGET_FPU && reload_completed"
-  "{divd|divf} %2, %0"
+  "{divd|divf}\t%2,%0"
   [(set_attr "length" "2,4")])
 
 (define_expand "divmodhi4"
        (mod:HI (match_dup 1) (match_dup 2)))
    (clobber (reg:CC CC_REGNUM))]
   "TARGET_40_PLUS"
-   "div %2,%0"
+   "div\t%2,%0"
   [(set_attr "length" "2,4")])
index feebcc6..26a91a0 100644 (file)
@@ -35,9 +35,13 @@ Target Report Mask(AC0)
 Return floating-point results in ac0 (fr0 in Unix assembler syntax).
 
 mdec-asm
-Target RejectNegative Report InverseMask(UNIX_ASM)
+Target RejectNegative Report Mask(DEC_ASM) Negative(mgnu-asm)
 Use the DEC assembler syntax.
 
+mgnu-asm
+Target RejectNegative Report Mask(GNU_ASM) Negative(munix-asm)
+Use the GNU assembler syntax.
+
 mfloat32
 Target Report Mask(FLOAT32)
 Use 32 bit float.
@@ -67,5 +71,5 @@ Target Report Mask(SPLIT)
 Target has split I&D.
 
 munix-asm
-Target RejectNegative Report Mask(UNIX_ASM)
+Target RejectNegative Report Mask(UNIX_ASM) Negative(mdec-asm)
 Use UNIX assembler syntax.
index 0180bec..56cd122 100644 (file)
@@ -972,7 +972,7 @@ Objective-C and Objective-C++ Dialects}.
 @gccoptlist{-mfpu  -msoft-float  -mac0  -mno-ac0  -m40  -m45  -m10 @gol
 -mint32  -mno-int16 -mint16  -mno-int32 @gol
 -mfloat32  -mno-float64 -mfloat64  -mno-float32 @gol
--msplit -munix-asm  -mdec-asm}
+-msplit -munix-asm  -mdec-asm -mgnu-asm}
 
 @emph{picoChip Options}
 @gccoptlist{-mae=@var{ae_type}  -mvliw-lookahead=@var{N} @gol
@@ -22080,7 +22080,11 @@ Use Unix assembler syntax.
 
 @item -mdec-asm
 @opindex mdec-asm
-Use DEC assembler syntax.  This is the default.
+Use DEC assembler syntax.
+
+@item -mgnu-asm
+@opindex mgnu-asm
+Use GNU assembler syntax.  This is the default.
 @end table
 
 @node picoChip Options