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 + + * 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 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