From patchwork Thu May 31 14:02:11 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Greta Yorsh X-Patchwork-Id: 162166 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 7DEBDB6FA7 for ; Fri, 1 Jun 2012 00:03:16 +1000 (EST) Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=gcc.gnu.org; s=default; x=1339077797; h=Comment: DomainKey-Signature:Received:Received:Received:Received:Received: From:To:References:In-Reply-To:Subject:Date:Message-ID: MIME-Version:Content-Type:Mailing-List:Precedence:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:Sender: Delivered-To; bh=ur70gETpYE/6rsdq8BtrwHns3w4=; b=s93NHsEEy0rmcaj a4wdTOs09KW4z9g4hrUaYFJiHrbHpxwvnOd7V9o/A/aHUCkcTmHEQl02bMABK0qZ q5MplY76Is7Pk4jV0Jr2OK4WSVSfpiAS582cu/qCIi080QYpRvoGNBCVNj9bdwpd cQKsW3fgIuh7AQ66pOSi6Tt7dL2c= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=gcc.gnu.org; h=Received:Received:X-SWARE-Spam-Status:X-Spam-Check-By:Received:Received:Received:From:To:References:In-Reply-To:Subject:Date:Message-ID:MIME-Version:X-MC-Unique:Content-Type:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=IUuJrDk8WzESToi5aqUZtuN2U9l4uO5jha9SEupPny8ixno5Hr9GJeSXUoAXqd obZd2owCubRTDsTcjR2gJWbJzf0o+QQjPtY5c+3ag4oBoF57p6fmMhEAmN9Pt/96 rX8HiyRLBY/OAj8yeS/0BV1i3GiMKOuz9X1N/PgwOF+eQ=; Received: (qmail 7537 invoked by alias); 31 May 2012 14:03:13 -0000 Received: (qmail 7524 invoked by uid 22791); 31 May 2012 14:03:11 -0000 X-SWARE-Spam-Status: No, hits=-2.8 required=5.0 tests=AWL, BAYES_00, KHOP_RCVD_UNTRUST, KHOP_THREADED, MSGID_MULTIPLE_AT, RCVD_IN_DNSWL_LOW, RCVD_IN_HOSTKARMA_NO X-Spam-Check-By: sourceware.org Received: from service87.mimecast.com (HELO service87.mimecast.com) (91.220.42.44) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 31 May 2012 14:02:58 +0000 Received: from cam-owa2.Emea.Arm.com (fw-tnat.cambridge.arm.com [217.140.96.21]) by service87.mimecast.com; Thu, 31 May 2012 15:02:12 +0100 Received: from E103079 ([10.1.255.212]) by cam-owa2.Emea.Arm.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 31 May 2012 15:02:14 +0100 From: "Greta Yorsh" To: "GCC Patches" References: <000001cd3f33$5b5c25a0$121470e0$@Yorsh@arm.com> In-Reply-To: <000001cd3f33$5b5c25a0$121470e0$@Yorsh@arm.com> Subject: [Patch, ARM][6/8] Epilogue in RTL: simple return Date: Thu, 31 May 2012 15:02:11 +0100 Message-ID: <001601cd3f35$f9a10b70$ece32250$@Yorsh@arm.com> MIME-Version: 1.0 X-MC-Unique: 112053115021268901 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 Add a new parameter to the function output_return_instruction to handle simple cases of return when no epilogue needs to be printed out. ChangeLog: gcc 2012-05-31 Ian Bolton Sameera Deshpande Greta Yorsh * config/arm/arm-protos.h (output_return_instruction): New parameter. * config/arm/arm.c (output_return_instruction): New parameter. * config/arm/arm.md (arm_simple_return): New pattern. (arm_return, cond_return, cond_return_inverted): Add new arguments. * config/arm/thumb2.md (thumb2_return): Update condition and code. diff --git a/gcc/config/arm/arm-protos.h b/gcc/config/arm/arm-protos.h index f61feef..01cd794 100644 --- a/gcc/config/arm/arm-protos.h +++ b/gcc/config/arm/arm-protos.h @@ -148,7 +148,7 @@ extern int arm_address_offset_is_imm (rtx); extern const char *output_add_immediate (rtx *); extern const char *arithmetic_instr (rtx, int); extern void output_ascii_pseudo_op (FILE *, const unsigned char *, int); -extern const char *output_return_instruction (rtx, int, int); +extern const char *output_return_instruction (rtx, int, int, int); extern void arm_poke_function_name (FILE *, const char *); extern void arm_final_prescan_insn (rtx); extern int arm_debugger_arg_offset (int, rtx); diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index c8642e2..e7a74e0 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -15592,9 +15592,11 @@ arm_get_vfp_saved_size (void) /* Generate a function exit sequence. If REALLY_RETURN is false, then do - everything bar the final return instruction. */ + everything bar the final return instruction. If simple_return is true, + then do not output epilogue, because it has already been emitted in RTL. */ const char * -output_return_instruction (rtx operand, int really_return, int reverse) +output_return_instruction (rtx operand, int really_return, int reverse, + int simple_return) { char conditional[10]; char instr[100]; @@ -15637,7 +15639,7 @@ output_return_instruction (rtx operand, int really_return, int reverse) offsets = arm_get_frame_offsets (); live_regs_mask = offsets->saved_regs_mask; - if (live_regs_mask) + if (!simple_return && live_regs_mask) { const char * return_reg; @@ -15765,7 +15767,7 @@ output_return_instruction (rtx operand, int really_return, int reverse) { /* The return has already been handled by loading the LR into the PC. */ - really_return = 0; + return ""; } } diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md index d1c1894..867dcbe 100644 --- a/gcc/config/arm/arm.md +++ b/gcc/config/arm/arm.md @@ -8597,7 +8597,7 @@ arm_ccfsm_state += 2; return \"\"; } - return output_return_instruction (const_true_rtx, TRUE, FALSE); + return output_return_instruction (const_true_rtx, TRUE, FALSE, FALSE); }" [(set_attr "type" "load1") (set_attr "length" "12") @@ -8618,7 +8618,7 @@ arm_ccfsm_state += 2; return \"\"; } - return output_return_instruction (operands[0], TRUE, FALSE); + return output_return_instruction (operands[0], TRUE, FALSE, FALSE); }" [(set_attr "conds" "use") (set_attr "length" "12") @@ -8639,13 +8639,30 @@ arm_ccfsm_state += 2; return \"\"; } - return output_return_instruction (operands[0], TRUE, TRUE); + return output_return_instruction (operands[0], TRUE, TRUE, FALSE); }" [(set_attr "conds" "use") (set_attr "length" "12") (set_attr "type" "load1")] ) +(define_insn "*arm_simple_return" + [(simple_return)] + "TARGET_ARM" + "* + { + if (arm_ccfsm_state == 2) + { + arm_ccfsm_state += 2; + return \"\"; + } + return output_return_instruction (const_true_rtx, TRUE, FALSE, TRUE); + }" + [(set_attr "type" "branch") + (set_attr "length" "4") + (set_attr "predicable" "yes")] +) + ;; Generate a sequence of instructions to determine if the processor is ;; in 26-bit or 32-bit mode, and return the appropriate return address ;; mask. diff --git a/gcc/config/arm/thumb2.md b/gcc/config/arm/thumb2.md index 39a2138..b7a8423 100644 --- a/gcc/config/arm/thumb2.md +++ b/gcc/config/arm/thumb2.md @@ -635,17 +635,12 @@ (set_attr "length" "20")] ) -;; Note: this is not predicable, to avoid issues with linker-generated -;; interworking stubs. (define_insn "*thumb2_return" - [(return)] - "TARGET_THUMB2 && USE_RETURN_INSN (FALSE)" - "* - { - return output_return_instruction (const_true_rtx, TRUE, FALSE); - }" - [(set_attr "type" "load1") - (set_attr "length" "12")] + [(simple_return)] + "TARGET_THUMB2" + "* return output_return_instruction (const_true_rtx, TRUE, FALSE, TRUE);" + [(set_attr "type" "branch") + (set_attr "length" "4")] ) (define_insn_and_split "thumb2_eh_return"