From patchwork Wed Aug 17 19:31:16 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takayuki 'January June' Suwa X-Patchwork-Id: 56824 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 08D3D3858C56 for ; Wed, 17 Aug 2022 19:32:55 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 08D3D3858C56 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1660764775; bh=L9pSRE6LMsBMdVc268eM7oLAEToUX58GDS0BSOo3/tI=; h=Date:Subject:To:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=Y5bYA0uQAtkDGxZIh8iwJp+8KFn/XipuQ0yDotAp47AEb6AKhNm/2YOYVBytFZyIu JKDCYkhsADDs4bAN2pGt9tG6JvH4t9p63bVXSwo13V/enn95CjAeHNycixeNpiS6ML TEWVev1sQLCGMIbArsC5xsdZhdoJFaTfSPomuwNE= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from nh503.bullet.mail.kks.yahoo.co.jp (unknown [183.79.56.186]) by sourceware.org (Postfix) with SMTP id 2EA6B3858D1E for ; Wed, 17 Aug 2022 19:32:24 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 2EA6B3858D1E Received: from [183.79.100.139] by nh503.bullet.mail.kks.yahoo.co.jp with NNFMP; 17 Aug 2022 19:32:20 -0000 Received: from [183.79.101.121] by t502.bullet.mail.kks.yahoo.co.jp with NNFMP; 17 Aug 2022 19:32:20 -0000 Received: from [127.0.0.1] by omp508.mail.kks.yahoo.co.jp with NNFMP; 17 Aug 2022 19:32:20 -0000 X-Yahoo-Newman-Property: ymail-3 X-Yahoo-Newman-Id: 582295.20968.bm@omp508.mail.kks.yahoo.co.jp Received: (qmail 17564 invoked by alias); 17 Aug 2022 19:32:20 -0000 Received: from unknown (HELO ?192.168.2.3?) (175.177.45.169 with ) by smtp5009.mail.kks.ynwp.yahoo.co.jp with SMTP; 17 Aug 2022 19:32:20 -0000 X-YMail-JAS: gzzA2FMVM1mmJSJp6sPfGBWF5eYxB7rs1p1H3d0SchVwSzxY33OQ.IZgt3B.70g5NY.3wo8EHtg8e89LHLQjvFLmAbfMdoxYEpnbkAwklxovDF7988zVVkfUSSyZiSyTiggy1Rbm.Q-- X-Apparently-From: X-YMail-OSG: 6s6u6I4VM1lf711oeCEk68S6v7E2Q_AJjPuvpMutEfyrNLq JgObxWcw5Qy79T.ygvWaMdNMj.D3JhRWoZFA4t1wUhdks30SP09OaH2FDRol sbHoQssyiwqxN_0VzyuPKUdwLdeTvg3ul_XykF22uK11a9PSNmER0pVc3ObP JyHb.xPshmZXbsj7.K6edxm.h3Cnr9xHR4gF6q2t10rhNLC_tpJx23uxpick hSLxCswz8DKgNY4TiS5ftztNHNSTYsMsunTz8wzNNwodeGWjHvCrL3dUEUn4 FMNVFQvM8Q.ZaITC473vfJ71lQAegPwxLpnuEcIoSXxxudJ8N6WwEB3m7aD6 MTFJfIC103xpo1aPwRLsFV48PXn9wD5BAfkRnDyzhpvqEtpKhz2oDpgJig47 OM1tmxTVZFS8Z.VzKKUBa49oCnFyTDr_E5XLKpGSwr5IjinTMU6Rx4PM2HTx fagdCIqmno3G34LLxU.smYY1rejX8rMuLj7OZjAxrtUI5zqSulNAKl2IZ8zj KGBefCfWeNq8ClvgNsT6sGmFOrqntJ_RVYbjOyPO4278xs659R0MlvsGpw2l XBOt_ys_es4LOI.Q9LcZVvnGg.bwJ217zFaASq_VvrIu4Zz3eDjjltnFI_dc Uu094VKP.UDF9WbDfPTSbSOYA5DjHNYZe8D3YMb2WYArLeOTg3BpZ_X4nn32 3efJnaKblCaVwCqYLGL1Su3qYM6iEz3T7H8cB010LZV8EY9Z3AqqatM.Xf6A fdE0T.vLXZsuSvhh4KEd4TbW1Ldn8fmoMyFkDR7iKxeelqgNkXKrMukAtWQC dmBaAmR8LB4C8dJSengNO9TeQsbX1woBdrUqEDaHO9jRErd9CEpOZnmeRwSM .J_NwkeahdDf10Mo0xtphQD7TMuNWkD.FEKQIc7DlcnUkd_3lu1GqQw3Rvbg aWCwQNaBiLnBfV.M6EQ-- Message-ID: <70d62887-e221-786b-cf16-612be9f7c179@yahoo.co.jp> Date: Thu, 18 Aug 2022 04:31:16 +0900 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.1.2 Subject: [PATCH] xtensa: Optimize stack pointer updates in function pro/epilogue under certain conditions To: GCC Patches X-Spam-Status: No, score=-12.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, GIT_PATCH_0, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Takayuki 'January June' Suwa via Gcc-patches From: Takayuki 'January June' Suwa Reply-To: Takayuki 'January June' Suwa Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" This patch enforces the use of "addmi" machine instruction instead of addition/subtraction with two source registers for adjusting the stack pointer, if the adjustment fits into a signed 16-bit and is also a multiple of 256. /* example */ void test(void) { char buffer[4096]; __asm__(""::"m"(buffer)); } ;; before test: movi.n a9, 1 slli a9, a9, 12 sub sp, sp, a9 movi.n a9, 1 slli a9, a9, 12 add.n sp, sp, a9 addi sp, sp, 0 ret.n ;; after test: addmi sp, sp, -0x1000 addmi sp, sp, 0x1000 ret.n gcc/ChangeLog: * config/xtensa/xtensa.cc (xtensa_expand_prologue): Use an "addmi" machine instruction for updating the stack pointer rather than addition/subtraction via hard register A9, if the amount of change satisfies the literal value conditions of that instruction when the CALL0 ABI is used. (xtensa_expand_epilogue): Ditto. And also inhibit the stack pointer addition of constant zero. --- gcc/config/xtensa/xtensa.cc | 79 +++++++++++++++++++++++++------------ 1 file changed, 54 insertions(+), 25 deletions(-) diff --git a/gcc/config/xtensa/xtensa.cc b/gcc/config/xtensa/xtensa.cc index 6ac879c38fb..b673b6764da 100644 --- a/gcc/config/xtensa/xtensa.cc +++ b/gcc/config/xtensa/xtensa.cc @@ -3150,7 +3150,6 @@ xtensa_expand_prologue (void) rtx_insn *insn = NULL; rtx note_rtx; - total_size = compute_frame_size (get_frame_size ()); if (flag_stack_usage_info) @@ -3206,10 +3205,17 @@ xtensa_expand_prologue (void) } else { - rtx tmp_reg = gen_rtx_REG (Pmode, A9_REG); - emit_move_insn (tmp_reg, GEN_INT (total_size)); - insn = emit_insn (gen_subsi3 (stack_pointer_rtx, - stack_pointer_rtx, tmp_reg)); + if (xtensa_simm8x256 (-total_size)) + insn = emit_insn (gen_addsi3 (stack_pointer_rtx, + stack_pointer_rtx, + GEN_INT (-total_size))); + else + { + rtx tmp_reg = gen_rtx_REG (Pmode, A9_REG); + emit_move_insn (tmp_reg, GEN_INT (total_size)); + insn = emit_insn (gen_subsi3 (stack_pointer_rtx, + stack_pointer_rtx, tmp_reg)); + } RTX_FRAME_RELATED_P (insn) = 1; note_rtx = gen_rtx_SET (stack_pointer_rtx, plus_constant (Pmode, stack_pointer_rtx, @@ -3237,11 +3243,19 @@ xtensa_expand_prologue (void) if (total_size > 1024 || (!callee_save_size && total_size > 128)) { - rtx tmp_reg = gen_rtx_REG (Pmode, A9_REG); - emit_move_insn (tmp_reg, GEN_INT (total_size - - callee_save_size)); - insn = emit_insn (gen_subsi3 (stack_pointer_rtx, - stack_pointer_rtx, tmp_reg)); + if (xtensa_simm8x256 (callee_save_size - total_size)) + insn = emit_insn (gen_addsi3 (stack_pointer_rtx, + stack_pointer_rtx, + GEN_INT (callee_save_size - + total_size))); + else + { + rtx tmp_reg = gen_rtx_REG (Pmode, A9_REG); + emit_move_insn (tmp_reg, GEN_INT (total_size - + callee_save_size)); + insn = emit_insn (gen_subsi3 (stack_pointer_rtx, + stack_pointer_rtx, tmp_reg)); + } RTX_FRAME_RELATED_P (insn) = 1; note_rtx = gen_rtx_SET (stack_pointer_rtx, plus_constant (Pmode, stack_pointer_rtx, @@ -3315,12 +3329,21 @@ xtensa_expand_epilogue (bool sibcall_p) if (cfun->machine->current_frame_size > (frame_pointer_needed ? 127 : 1024)) { - rtx tmp_reg = gen_rtx_REG (Pmode, A9_REG); - emit_move_insn (tmp_reg, GEN_INT (cfun->machine->current_frame_size - - cfun->machine->callee_save_size)); - emit_insn (gen_addsi3 (stack_pointer_rtx, frame_pointer_needed ? - hard_frame_pointer_rtx : stack_pointer_rtx, - tmp_reg)); + if (xtensa_simm8x256 (cfun->machine->current_frame_size - + cfun->machine->callee_save_size)) + emit_insn (gen_addsi3 (stack_pointer_rtx, frame_pointer_needed ? + hard_frame_pointer_rtx : stack_pointer_rtx, + GEN_INT (cfun->machine->current_frame_size - + cfun->machine->callee_save_size))); + else + { + rtx tmp_reg = gen_rtx_REG (Pmode, A9_REG); + emit_move_insn (tmp_reg, GEN_INT (cfun->machine->current_frame_size - + cfun->machine->callee_save_size)); + emit_insn (gen_addsi3 (stack_pointer_rtx, frame_pointer_needed ? + hard_frame_pointer_rtx : stack_pointer_rtx, + tmp_reg)); + } offset = cfun->machine->callee_save_size - UNITS_PER_WORD; } else @@ -3360,18 +3383,24 @@ xtensa_expand_epilogue (bool sibcall_p) offset = cfun->machine->current_frame_size; else offset = cfun->machine->callee_save_size; - - emit_insn (gen_addsi3 (stack_pointer_rtx, - stack_pointer_rtx, - GEN_INT (offset))); + if (offset) + emit_insn (gen_addsi3 (stack_pointer_rtx, + stack_pointer_rtx, + GEN_INT (offset))); } else { - rtx tmp_reg = gen_rtx_REG (Pmode, A9_REG); - emit_move_insn (tmp_reg, - GEN_INT (cfun->machine->current_frame_size)); - emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, - tmp_reg)); + if (xtensa_simm8x256 (cfun->machine->current_frame_size)) + emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, + GEN_INT (cfun->machine->current_frame_size))); + else + { + rtx tmp_reg = gen_rtx_REG (Pmode, A9_REG); + emit_move_insn (tmp_reg, + GEN_INT (cfun->machine->current_frame_size)); + emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, + tmp_reg)); + } } }