From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: 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 Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=yahoo.co.jp Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=yahoo.co.jp 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 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1672919876; s=yj20110701; d=yahoo.co.jp; h=Message-ID:Date:MIME-Version:To:Cc:From:Subject:Content-Type:Content-Transfer-Encoding:References; bh=KK1T7bjtpiT3nuL3PS3mp8sIjTKpcUKBTEhwMHByzJ8=; b=refFOkvEQ+Y3uQvrNeSyqgrPeiOwr2DIa8riVsaYtwc1TqPojUoRKz4tL3w3UuUR wowJ4mMbGW4PbM1bLt7lORux+AMHolGkBZGaCIcpZ70TVdbhTlqVrcY4Z7YotXBcahz 3BHhxCPz7vGU4O4jxspgVfoQ+vwOrotR67uS2k4Q= DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=yj20110701; d=yahoo.co.jp; h=Message-ID:Date:MIME-Version:Cc:From:Content-Type:Content-Transfer-Encoding:References; b=JOGsaUj3lTXBd1ZO5icpI84cGJLqGOao+Cv9meLGVR++w9slGyUmxPQ1BePfT0wN hXoTu9MyxuOv8pzEsife7EnvhaE3RzCIeutKlF7v9geFPSX+C1P+VDiFVrhypq96N2V F3aFb4gyBivSww8J1XZwJWHs87SvrY8U3V1Zmu1s=; 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 From: Takayuki 'January June' Suwa Subject: [PATCH] xtensa: Optimize stack frame adjustment more Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit 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 List-Id: 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)); } -- 2.30.2