summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpkoning <pkoning@138bc75d-0d04-0410-961f-82ee72b054a4>2010-12-31 11:43:48 +0000
committerpkoning <pkoning@138bc75d-0d04-0410-961f-82ee72b054a4>2010-12-31 11:43:48 +0000
commitb9b85badc0ce2a7f43bf43d785e64cfa45466454 (patch)
treedf55d90642b79c23565d792b83509236e9b9f15d
parent3498c2ca119e0a723e628b2421c0bda312f8ed66 (diff)
downloadgcc-b9b85badc0ce2a7f43bf43d785e64cfa45466454.tar.gz
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@168368 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/config/pdp11/pdp11.c51
-rw-r--r--gcc/config/pdp11/pdp11.h21
-rw-r--r--gcc/config/pdp11/pdp11.md9
4 files changed, 64 insertions, 26 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e88b8db4c64..6820d8d82b1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/config/pdp11/pdp11.c b/gcc/config/pdp11/pdp11.c
index 3a7f9d638e7..21f97d2127d 100644
--- a/gcc/config/pdp11/pdp11.c
+++ b/gcc/config/pdp11/pdp11.c
@@ -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
/* 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)
{
diff --git a/gcc/config/pdp11/pdp11.h b/gcc/config/pdp11/pdp11.h
index 37e03483c12..fc36f5b67f0 100644
--- a/gcc/config/pdp11/pdp11.h
+++ b/gcc/config/pdp11/pdp11.h
@@ -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); }}
-
/* Print a memory address as an operand to reference that memory location. */
#define PRINT_OPERAND_ADDRESS(FILE, ADDR) \
diff --git a/gcc/config/pdp11/pdp11.md b/gcc/config/pdp11/pdp11.md
index aa7512bc063..1c6542685b7 100644
--- a/gcc/config/pdp11/pdp11.md
+++ b/gcc/config/pdp11/pdp11.md
@@ -1212,11 +1212,14 @@
[(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