pdp11.h (PRINT_OPERAND): Delete.
authorPaul Koning <ni1d@arrl.net>
Fri, 31 Dec 2010 11:43:48 +0000 (06:43 -0500)
committerPaul Koning <pkoning@gcc.gnu.org>
Fri, 31 Dec 2010 11:43:48 +0000 (06:43 -0500)
* config/pdp11/pdp11.h (PRINT_OPERAND): Delete.
* config/pdp11/pdp11.c (TARGET_PRINT_OPERAND,
TARGET_PRINT_OPERAND_PUNCT_VALID_P): Define
(pdp11_asm_print_operand, pdp11_asm_print_operand_punct_valid_p):
New function.
* config/pdp11/pdp11.md (tablejump): Fix generated assembly.

From-SVN: r168368

gcc/ChangeLog
gcc/config/pdp11/pdp11.c
gcc/config/pdp11/pdp11.h
gcc/config/pdp11/pdp11.md

index e88b8db4c6435ca3b35061c7ad379c1508d16a4b..6820d8d82b1276f996231663a7d03c4193fd01e3 100644 (file)
@@ -1,3 +1,12 @@
+2010-12-31  Paul Koning  <ni1d@arrl.net>
+
+       * config/pdp11/pdp11.h (PRINT_OPERAND): Delete.
+       * config/pdp11/pdp11.c (TARGET_PRINT_OPERAND,
+       TARGET_PRINT_OPERAND_PUNCT_VALID_P): Define
+       (pdp11_asm_print_operand, pdp11_asm_print_operand_punct_valid_p):
+       New function.
+       * config/pdp11/pdp11.md (tablejump): Fix generated assembly.
+
 2010-12-31  Joern Rennecke  <amylaar@spamcop.net>
 
        PR target/47111
index 3a7f9d638e748c12819f1d9e09d4bc263b871154..21f97d2127d770305ea4a4c5926a049ec45567e1 100644 (file)
@@ -235,6 +235,12 @@ static const struct default_options pdp11_option_optimization_table[] =
 
 #undef  TARGET_ASM_FUNCTION_SECTION
 #define TARGET_ASM_FUNCTION_SECTION pdp11_function_section
+
+#undef  TARGET_PRINT_OPERAND
+#define TARGET_PRINT_OPERAND pdp11_asm_print_operand
+
+#undef  TARGET_PRINT_OPERAND_PUNCT_VALID_P
+#define TARGET_PRINT_OPERAND_PUNCT_VALID_P pdp11_asm_print_operand_punct_valid_p
 \f
 /* Implement TARGET_HANDLE_OPTION.  */
 
@@ -721,13 +727,54 @@ pdp11_asm_output_var (FILE *file, const char *name, int size,
 {
   if (align > 8)
     fprintf (file, "\n\t.even\n");
-  fprintf (file, ".globl ");
-  assemble_name (file, name);
+  if (global)
+    {
+      fprintf (file, ".globl ");
+      assemble_name (file, name);
+    }
   fprintf (file, "\n");
   assemble_name (file, name);
   fprintf (file, ": .=.+ %#ho\n", (unsigned short)size);
 }
 
+static void
+pdp11_asm_print_operand (FILE *file, rtx x, int code)
+{
+  REAL_VALUE_TYPE r;
+  long sval[2];
+  if (code == '#')
+    fprintf (file, "#");
+  else if (code == '@')
+    {
+      if (TARGET_UNIX_ASM)
+       fprintf (file, "*");
+      else
+       fprintf (file, "@");
+    }
+  else if (GET_CODE (x) == REG)
+    fprintf (file, "%s", reg_names[REGNO (x)]);
+  else if (GET_CODE (x) == MEM)
+    output_address (XEXP (x, 0));
+  else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) != SImode)
+    {
+      REAL_VALUE_FROM_CONST_DOUBLE (r, x);
+      REAL_VALUE_TO_TARGET_DOUBLE (r, sval);
+      fprintf (file, "$%#lo", sval[0] >> 16);
+    }
+  else
+    {
+      putc ('$', file);
+      output_addr_const_pdp11 (file, x);
+    }
+}
+
+static bool
+pdp11_asm_print_operand_punct_valid_p (char c)
+{
+  return (c == '#' || c == '@');
+}
+
 void
 print_operand_address (FILE *file, register rtx addr)
 {
index 37e03483c120d8a55db5399faabaa2f6c0805c55..fc36f5b67f0c0f4e7773eca595c037a76bcd95c9 100644 (file)
@@ -658,27 +658,6 @@ extern struct rtx_def *cc0_reg_rtx;
 #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \
     pdp11_asm_output_var (FILE, NAME, SIZE, ALIGN, false)
 
-/* Print operand X (an rtx) in assembler syntax to file FILE.
-   CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
-   For `%' followed by punctuation, CODE is the punctuation and X is null.
-
-*/
-
-
-#define PRINT_OPERAND(FILE, X, CODE)  \
-{ if (CODE == '#') fprintf (FILE, "#");                                        \
-  else if (GET_CODE (X) == REG)                                                \
-    fprintf (FILE, "%s", reg_names[REGNO (X)]);                                \
-  else if (GET_CODE (X) == MEM)                                                \
-    output_address (XEXP (X, 0));                                      \
-  else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) != SImode)     \
-    { REAL_VALUE_TYPE r;                                               \
-      long sval[2];                                                    \
-      REAL_VALUE_FROM_CONST_DOUBLE (r, X);                             \
-      REAL_VALUE_TO_TARGET_DOUBLE (r, sval);                           \
-      fprintf (FILE, "$%#lo", sval[0] >> 16); }                                \
-  else { putc ('$', FILE); output_addr_const_pdp11 (FILE, X); }}
-\f
 /* Print a memory address as an operand to reference that memory location.  */
 
 #define PRINT_OPERAND_ADDRESS(FILE, ADDR)  \
index aa7512bc0632a9695c18b5fe2c088d5edbd1bb1c..1c6542685b742afb53546ec94e84e9a09515512e 100644 (file)
   [(set_attr "length" "4")])
 
 (define_insn "tablejump"
-  [(set (pc) (match_operand:HI 0 "general_operand" "rR,Q"))
+  [(set (pc) (match_operand:HI 0 "general_operand" "r,R,Q"))
    (use (label_ref (match_operand 1 "" "")))]
   ""
-  "jmp %0"
-  [(set_attr "length" "2,4")])
+  "@
+  jmp (%0)
+  jmp %@%0
+  jmp %@%0"
+  [(set_attr "length" "2,2,4")])
 
 ;; indirect jump - let's be conservative!
 ;; allow only register_operand, even though we could also