From patchwork Thu Jan 5 08:40:51 2023 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: 39489 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp262276wrt; Thu, 5 Jan 2023 03:58:53 -0800 (PST) X-Google-Smtp-Source: AMrXdXtAa6ZkSdVPkooTg3puQo+qnb9522tBUoAia48vAHBSK4Q52YjE6TbHuPoqMLSjn1bBDGEq X-Received: by 2002:a17:907:7e9f:b0:7c1:7d81:d2a8 with SMTP id qb31-20020a1709077e9f00b007c17d81d2a8mr52574821ejc.3.1672919933878; Thu, 05 Jan 2023 03:58:53 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672919933; cv=none; d=google.com; s=arc-20160816; b=U8B/8DVpWUOU290ugublHrP/lg/C3sVa5ABiV1eZg4noyc8cLkqOAD2z8sAS4rh4kK Wbzdsd85MmhPWGemsi8dcgmM/DW2/noUckq5d72ydLUMV0ThN47TmgQI9STEdfXcLlBm pdLFbkIXcXhBEj6GgU/IgmYDwpOMCxTMoCqDydpjGZiL1t1rpnqDDct66gjnD62Dry9l 9MfEdQxOxKJFORSV7DDXOS0NXIT5HavUyL0tvEJAiBEBOMAe4JQRUhZA4Vb938bJp7Oz r4GyjX3lWfhG0M/1LJKgWQ/rDHgslU9FDl57+vjtxZ7IQ42AN85ePhSOBCAzz/ELoked PH6g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:from:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:references :content-transfer-encoding:subject:cc:to:user-agent:mime-version :date:message-id:dmarc-filter:delivered-to:dkim-signature :dkim-filter; bh=KK1T7bjtpiT3nuL3PS3mp8sIjTKpcUKBTEhwMHByzJ8=; b=vCgYnO05IvIxen6DkJpCOkY/gfM6+VMi7xhdzCkRpD3q597wUZc9XWP0FKrDkRKcJ4 34+x+CWV4WXZas+Cstq2+1sqPv9aKhkpi0f7kQoHZ7urZCo/siG4Oxs4Iv+GwBRsUMoR Wa+xpAtqjRCjQYzXy/8Yao60xsn1+fN7Nrw9vKCxTmwhkQS8bRStFx5lxP08qUXsZBvT 820vBcANcDHKmx8Ddv8WF0zxLpBTOOFtvHcB3WONWzisM4mZq2Avv89o7TXwE7RTatB0 nq/2WzRF1Of8y09gAHnZfqLBNE5q7brm/UR0v1CITmHIDw4UHnxlBzYatAtHkoJvD85D qosw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b="l/l0O45r"; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id wt13-20020a170906ee8d00b0084cd1f106bcsi7575452ejb.467.2023.01.05.03.58.53 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 05 Jan 2023 03:58:53 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b="l/l0O45r"; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id B45D8385840D for ; Thu, 5 Jan 2023 11:58:48 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B45D8385840D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1672919928; bh=KK1T7bjtpiT3nuL3PS3mp8sIjTKpcUKBTEhwMHByzJ8=; h=Date:To:Cc:Subject:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=l/l0O45rZs5ynlE6SAk3PUuYZDGt56kRLFLiT1ll1eoaVXf1w3c1DchXCHf2U8DMG em6oPFpA8hnRj8vjhuecFbg+47FLDIkgA8tK8KD55JXC+s6fRVl/jXZgwbhL+F/QcF Px4t6j8STcRdYSUlAHMONxpUfDd+RBG987YzbTxE= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from sonicconh5001-vm1.mail.kks.yahoo.co.jp (sonicconh5001-vm1.mail.kks.yahoo.co.jp [114.110.61.12]) by sourceware.org (Postfix) with ESMTPS id B09183858D35 for ; Thu, 5 Jan 2023 11:58:01 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org B09183858D35 X-YMail-OSG: rwiIaXcVM1lwR79nbsHiB08fUZTCFRLrZpGpyNUuo0CK.6ZQUQ5rbajFdIQHItv UGhwkpPVJL.FlBhjzZFcprexratrj.IujgrxtrfU9eG037vcXInA_99B.baeYOLAyVKiKw9vY0Lr cDki7f7uYapMfbvG2E2ToNPDNa5ahZWnKa81fxmQ97GcqwtdKCpAaiOxGnLJQCtXYWT_zbBoTjDx LjGKn6.yVVbsjnVOFI_U0z4wNmxKVG7HNd_lotx3XiQvCA8vRBYXChsPmWDgC..4Ti2uNrMjEppn l2iLwPu3tDeUqHJdDqhaCYniBeWz6bFySCAO30He0tMbth3g.Tzu3TFmzeg6xXRR5wLSshb360CH Qn3OfKQsnIpbrrsQjEA.vvCwdwFMw3W81wYDL1OoXAacCO0J6VLojCPTpLOrjKaRDcoxJpziJOIn PvUgSptKxwC5kyO9KpxdaGNHOdxzhoQQgf05mv04L1QrQ1sQ7PKccdn.Q_p6Y6x0xBJvC5MmvBjw iLQDceNA2sotISKdjDuamaxispE1zpAQkHc_VTw4.8JX3PUiWXwf4yuXP37NuYGerIxkQMF6KllK g4eu1yjngmDsptjdHcWD2rumP2sknptiZpw8_cme.KzUQ7qxWbKvQwR7QIrQIY.2640kfS9e5CKC IpXO7eUR.lFlAM__OGUUrGgtPGOBmnd9XO9g34xVXHUQGmm94MDPHUWTQAAcKpz4IIlQ2Se0Jupn FaqOPE.Lj3b2f19hM19D2FA.195QwExmRFUgR9SSFxgVhSnF109fOlyAF_YsVAl98h4cTwMOkaM1 jijmWjeWKdtd0U599ReMyQ25XL39eUYIgaSNd5Y0yUpfaClPAB6jft3WOYbKoMGs7iwW9mzzhqZW aczk6HG2ZErcXDtkQ2cyw6gjProwM9qpmf2KJrvl8gGu55bP9NvXuVLg_QLYniS3tkZfP0V0StFz 8OIKZ0U4- Received: from sonicgw.mail.yahoo.co.jp by sonicconh5001.mail.kks.yahoo.co.jp with HTTP; Thu, 5 Jan 2023 11:57:56 +0000 Received: by smtphe5008.mail.kks.ynwp.yahoo.co.jp (YJ Hermes SMTP Server) with ESMTPA ID c2b1cf9368da2c75462301518f31082a; Thu, 05 Jan 2023 20:57:54 +0900 (JST) Message-ID: <04a89dbf-c2a3-5dcb-8949-77569a1ad169@yahoo.co.jp> Date: Thu, 5 Jan 2023 17:40:51 +0900 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.6.1 To: GCC Patches Cc: Max Filippov Subject: [PATCH] xtensa: Optimize stack frame adjustment more References: <04a89dbf-c2a3-5dcb-8949-77569a1ad169.ref@yahoo.co.jp> X-Spam-Status: No, score=-11.6 required=5.0 tests=BAYES_00, DATE_IN_PAST_03_06, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP 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+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754183692645908863?= X-GMAIL-MSGID: =?utf-8?q?1754183692645908863?= This patch introduces a convenient helper function for integer immediate addition with scratch register as needed, that splits and emits either up to two ADDI/ADDMI machine instructions or an addition by register following an immediate integer load (which may later be transformed by constantsynth). By using the helper function, it makes stack frame adjustment logic simplified and instruction count less in some cases. gcc/ChangeLog: * config/xtensa/xtensa.cc (xtensa_split_imm_two_addends, xtensa_emit_add_imm): New helper functions. (xtensa_emit_adjust_stack_ptr, xtensa_set_return_address, xtensa_output_mi_thunk): Change to use the helper function. --- gcc/config/xtensa/xtensa.cc | 139 +++++++++++++++++++++++------------- 1 file changed, 88 insertions(+), 51 deletions(-) diff --git a/gcc/config/xtensa/xtensa.cc b/gcc/config/xtensa/xtensa.cc index ae44199bc98..3b8a7bcda37 100644 --- a/gcc/config/xtensa/xtensa.cc +++ b/gcc/config/xtensa/xtensa.cc @@ -2518,6 +2518,82 @@ xtensa_split_DI_reg_imm (rtx *operands) } +/* Try to split an integer value into what are suitable for two consecutive + immediate addition instructions, ADDI or ADDMI. */ + +static bool +xtensa_split_imm_two_addends (HOST_WIDE_INT imm, HOST_WIDE_INT v[2]) +{ + HOST_WIDE_INT v0, v1; + + if (imm < -32768) + v0 = -32768, v1 = imm + 32768; + else if (imm > 32512) + v0 = 32512, v1 = imm - 32512; + else if (TARGET_DENSITY && optimize_size && xtensa_simm12b (imm)) + /* A pair of MOVI(.N) and ADD.N is one or two bytes less than two + immediate additions if TARGET_DENSITY. */ + return false; + else + v0 = (imm + 128) & ~255L, v1 = imm - v0; + + if (xtensa_simm8 (v1) || xtensa_simm8x256 (v1)) + { + v[0] = v0, v[1] = v1; + return true; + } + + return false; +} + + +/* Helper function for integer immediate addition with scratch register + as needed, that splits and emits either up to two ADDI/ADDMI machine + instructions or an addition by register following an immediate integer + load (which may later be transformed by constantsynth). + + If 'scratch' is NULL_RTX but still needed, a new pseudo-register will + be allocated. Thus, after the reload/LRA pass, the specified scratch + register must be a hard one. */ + +static void +xtensa_emit_add_imm (rtx dst, rtx src, HOST_WIDE_INT imm, rtx scratch, + bool need_note) +{ + HOST_WIDE_INT v[2]; + rtx_insn *insn0, *insn1; + + if (imm == 0) + return; + + if (xtensa_simm8 (imm) || xtensa_simm8x256 (imm)) + insn0 = emit_insn (gen_addsi3 (dst, src, GEN_INT (imm))); + else if (xtensa_split_imm_two_addends (imm, v)) + { + insn0 = emit_insn (gen_addsi3 (dst, src, GEN_INT (v[0]))); + insn1 = emit_insn (gen_addsi3 (dst, dst, GEN_INT (v[1]))); + if (need_note) + RTX_FRAME_RELATED_P (insn1) = 1; + } + else + { + if (scratch) + emit_move_insn (scratch, GEN_INT (imm)); + else + scratch = force_reg (SImode, GEN_INT (imm)); + insn0 = emit_insn (gen_addsi3 (dst, src, scratch)); + } + + if (need_note) + { + rtx note_rtx = gen_rtx_SET (dst, plus_constant (Pmode, src, imm)); + + RTX_FRAME_RELATED_P (insn0) = 1; + add_reg_note (insn0, REG_FRAME_RELATED_EXPR, note_rtx); + } +} + + /* Implement TARGET_CANNOT_FORCE_CONST_MEM. */ static bool @@ -3245,41 +3321,14 @@ xtensa_initial_elimination_offset (int from, int to ATTRIBUTE_UNUSED) static void xtensa_emit_adjust_stack_ptr (HOST_WIDE_INT offset, int flags) { - rtx_insn *insn; - rtx ptr = (flags & ADJUST_SP_FRAME_PTR) ? hard_frame_pointer_rtx - : stack_pointer_rtx; - if (cfun->machine->inhibit_logues_a1_adjusts) return; - if (xtensa_simm8 (offset) - || xtensa_simm8x256 (offset)) - insn = emit_insn (gen_addsi3 (stack_pointer_rtx, ptr, GEN_INT (offset))); - else - { - rtx tmp_reg = gen_rtx_REG (Pmode, A9_REG); - - if (offset < 0) - { - emit_move_insn (tmp_reg, GEN_INT (-offset)); - insn = emit_insn (gen_subsi3 (stack_pointer_rtx, ptr, tmp_reg)); - } - else - { - emit_move_insn (tmp_reg, GEN_INT (offset)); - insn = emit_insn (gen_addsi3 (stack_pointer_rtx, ptr, tmp_reg)); - } - } - - if (flags & ADJUST_SP_NEED_NOTE) - { - rtx note_rtx = gen_rtx_SET (stack_pointer_rtx, - plus_constant (Pmode, stack_pointer_rtx, - offset)); - - RTX_FRAME_RELATED_P (insn) = 1; - add_reg_note (insn, REG_FRAME_RELATED_EXPR, note_rtx); - } + xtensa_emit_add_imm (stack_pointer_rtx, + (flags & ADJUST_SP_FRAME_PTR) + ? hard_frame_pointer_rtx : stack_pointer_rtx, + offset, gen_rtx_REG (Pmode, A9_REG), + (flags & ADJUST_SP_NEED_NOTE)); } /* minimum frame = reg save area (4 words) plus static chain (1 word) @@ -3307,8 +3356,9 @@ xtensa_expand_prologue (void) /* Use a8 as a temporary since a0-a7 may be live. */ rtx tmp_reg = gen_rtx_REG (Pmode, A8_REG); emit_insn (gen_entry (GEN_INT (MIN_FRAME_SIZE))); - emit_move_insn (tmp_reg, GEN_INT (total_size - MIN_FRAME_SIZE)); - emit_insn (gen_subsi3 (tmp_reg, stack_pointer_rtx, tmp_reg)); + xtensa_emit_add_imm (tmp_reg, stack_pointer_rtx, + MIN_FRAME_SIZE - total_size, + tmp_reg, false); insn = emit_insn (gen_movsi (stack_pointer_rtx, tmp_reg)); } } @@ -3540,8 +3590,8 @@ xtensa_set_return_address (rtx address, rtx scratch) if (total_size > 1024) { - emit_move_insn (scratch, GEN_INT (total_size - UNITS_PER_WORD)); - emit_insn (gen_addsi3 (scratch, frame, scratch)); + xtensa_emit_add_imm (scratch, frame, total_size - UNITS_PER_WORD, + scratch, false); a0_addr = scratch; } @@ -5101,15 +5151,7 @@ xtensa_output_mi_thunk (FILE *file, tree thunk ATTRIBUTE_UNUSED, this_rtx = gen_rtx_REG (Pmode, A0_REG + this_reg_no); if (delta) - { - if (xtensa_simm8 (delta)) - emit_insn (gen_addsi3 (this_rtx, this_rtx, GEN_INT (delta))); - else - { - emit_move_insn (temp0, GEN_INT (delta)); - emit_insn (gen_addsi3 (this_rtx, this_rtx, temp0)); - } - } + xtensa_emit_add_imm (this_rtx, this_rtx, delta, temp0, false); if (vcall_offset) { @@ -5119,13 +5161,8 @@ xtensa_output_mi_thunk (FILE *file, tree thunk ATTRIBUTE_UNUSED, emit_move_insn (temp0, gen_rtx_MEM (Pmode, this_rtx)); if (xtensa_uimm8x4 (vcall_offset)) addr = plus_constant (Pmode, temp0, vcall_offset); - else if (xtensa_simm8 (vcall_offset)) - emit_insn (gen_addsi3 (temp1, temp0, GEN_INT (vcall_offset))); else - { - emit_move_insn (temp1, GEN_INT (vcall_offset)); - emit_insn (gen_addsi3 (temp1, temp0, temp1)); - } + xtensa_emit_add_imm (temp1, temp0, vcall_offset, temp1, false); emit_move_insn (temp1, gen_rtx_MEM (Pmode, addr)); emit_insn (gen_add2_insn (this_rtx, temp1)); }