From patchwork Fri Dec 31 11:46:45 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Koning X-Patchwork-Id: 77063 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 8632EB70A4 for ; Fri, 31 Dec 2010 22:46:56 +1100 (EST) Received: (qmail 22086 invoked by alias); 31 Dec 2010 11:46:55 -0000 Received: (qmail 22078 invoked by uid 22791); 31 Dec 2010 11:46:54 -0000 X-SWARE-Spam-Status: No, hits=-1.7 required=5.0 tests=AWL, BAYES_00, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from ausxipps301.us.dell.com (HELO ausxipps301.us.dell.com) (143.166.148.223) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 31 Dec 2010 11:46:49 +0000 X-Loopcount0: from 10.152.240.141 From: Paul Koning Subject: [PATCH] pdp11: fix bad code error for tablejump Date: Fri, 31 Dec 2010 06:46:45 -0500 Message-Id: <63AC620A-7B3B-48B6-8054-CE8FA45971BE@dell.com> To: gcc-patches Mime-Version: 1.0 (Apple Message framework v1082) X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org This patch cures a bad code error for the tablejump pattern (missing indirection). In the process I hookized PRINT_OPERAND. Tested by build, make check. Committed. paul ChangeLog: 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. #define PRINT_OPERAND_ADDRESS(FILE, ADDR) \ Index: config/pdp11/pdp11.md =================================================================== --- config/pdp11/pdp11.md (revision 168338) +++ config/pdp11/pdp11.md (working copy) @@ -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 Index: config/pdp11/pdp11.c =================================================================== --- config/pdp11/pdp11.c (revision 168338) +++ config/pdp11/pdp11.c (working copy) @@ -235,6 +235,12 @@ #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 @@ { 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: config/pdp11/pdp11.h =================================================================== --- config/pdp11/pdp11.h (revision 168333) +++ config/pdp11/pdp11.h (working copy) @@ -658,27 +658,6 @@ #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. */