[{"id":3685503,"web_url":"http://patchwork.ozlabs.org/comment/3685503/","msgid":"<CAMe9rOpAm6_O5efXK_TqFXnG=uQyFA6JvHNPjWrq4UkHm2KLBA@mail.gmail.com>","list_archive_url":null,"date":"2026-05-04T05:45:32","subject":"Re: [PATCH v3 2/3] i386: Add BMI2 MULX pattern for highpart-only\n multiplication","submitter":{"id":4387,"url":"http://patchwork.ozlabs.org/api/people/4387/","name":"H.J. Lu","email":"hjl.tools@gmail.com"},"content":"On Mon, May 4, 2026 at 7:58 AM <herumi@nifty.com> wrote:\n>\n> From: MITSUNARI Shigeo <herumi@nifty.com>\n>\n> Add a new instruction pattern that uses MULX to compute only the high\n> part of an unsigned multiplication on BMI2 targets.  Previously, when\n> only the high part was needed, GCC would emit MULQ followed by a MOV\n> to retrieve the result from RDX.  With this pattern, MULX writes the\n> high part directly to the destination register, saving one instruction.\n>\n> This benefits unsigned 32-bit integer division by constants that require\n> 33-bit magic multipliers (e.g., division by 7), reducing the sequence\n> from 4 instructions to 3 on BMI2 targets.\n>\n> Before:\n>     movabsq $2635249153617166336, %rcx\n>     movl    %edi, %eax\n>     mulq    %rcx\n>     movl    %edx, %eax\n>\n> After:\n>     movabsq $2635249153617166336, %rax\n>     movl    %edi, %edx\n>     mulx    %rax, %rdx, %rax\n>\n> gcc/ChangeLog:\n>\n>         * config/i386/i386.md (*bmi2_umul<mode>3_highpart): New pattern.\n\nNeed the ChangeLog entry for the test.\n\n> ---\n>  gcc/config/i386/i386.md                        | 15 +++++++++++++++\n>  .../gcc.target/i386/bmi2-mulx-highpart-1.c     | 18 ++++++++++++++++++\n>  2 files changed, 33 insertions(+)\n>  create mode 100644 gcc/testsuite/gcc.target/i386/bmi2-mulx-highpart-1.c\n>\n> diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md\n> index e514809453d..472f9d41332 100644\n> --- a/gcc/config/i386/i386.md\n> +++ b/gcc/config/i386/i386.md\n> @@ -11507,6 +11507,21 @@\n>               (set (match_dup 5)\n>                    (umul_highpart:DWIH (match_dup 2) (match_dup 3)))])])\n>\n> +;; BMI2 MULX highpart-only pattern.  Uses MULX to get only the high part,\n> +;; discarding the low part into a scratch register.  This avoids the\n> +;; mov from rdx after mulq when only the high part is needed.\n> +(define_insn \"*bmi2_umul<mode>3_highpart\"\n> +  [(set (match_operand:DWIH 0 \"register_operand\" \"=r\")\n> +       (umul_highpart:DWIH\n> +         (match_operand:DWIH 1 \"register_operand\" \"d\")\n> +         (match_operand:DWIH 2 \"nonimmediate_operand\" \"rm\")))\n> +   (clobber (match_scratch:DWIH 3 \"=r\"))]\n> +  \"TARGET_BMI2\"\n> +  \"mulx\\t{%2, %3, %0|%0, %3, %2}\"\n> +  [(set_attr \"type\" \"imulx\")\n> +   (set_attr \"prefix\" \"vex\")\n> +   (set_attr \"mode\" \"<MODE>\")])\n> +\n>  ;; Highpart multiplication patterns\n>  (define_insn \"<s>mul<mode>3_highpart\"\n>    [(set (match_operand:DWIH 0 \"register_operand\" \"=d\")\n> diff --git a/gcc/testsuite/gcc.target/i386/bmi2-mulx-highpart-1.c b/gcc/testsuite/gcc.target/i386/bmi2-mulx-highpart-1.c\n> new file mode 100644\n> index 00000000000..dd7b32aa0b0\n> --- /dev/null\n> +++ b/gcc/testsuite/gcc.target/i386/bmi2-mulx-highpart-1.c\n> @@ -0,0 +1,18 @@\n> +/* { dg-do compile { target { ! ia32 } } } */\n> +/* { dg-options \"-O2 -mbmi2\" } */\n> +/* { dg-final { check-function-bodies \"**\" \"\" \"\" { target *-*-linux* *-*-gnu* } } } */\n> +\n> +/*\n> +**div7:\n> +**     movabsq \\$2635249153617166336, %rax\n> +**     movl    %edi, %edx\n> +**     mulx    %rax, %rdx, %rax\n> +**     ret\n> +**...\n> +*/\n> +\n> +unsigned int\n> +div7 (unsigned int x)\n> +{\n> +  return x / 7;\n> +}\n> --\n> 2.43.0\n>","headers":{"Return-Path":"<gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org>","X-Original-To":["incoming@patchwork.ozlabs.org","gcc-patches@gcc.gnu.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","gcc-patches@gcc.gnu.org"],"Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=f7kFi910;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=2620:52:6:3111::32; helo=vm01.sourceware.org;\n envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org;\n receiver=patchwork.ozlabs.org)","sourceware.org;\n\tdkim=pass (2048-bit key,\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=f7kFi910","sourceware.org;\n dmarc=pass (p=none dis=none) header.from=gmail.com","sourceware.org; spf=pass smtp.mailfrom=gmail.com","server2.sourceware.org;\n arc=pass smtp.remote-ip=2607:f8b0:4864:20::530"],"Received":["from vm01.sourceware.org (vm01.sourceware.org\n [IPv6:2620:52:6:3111::32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g89cv5JfPz1yJ9\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 04 May 2026 15:46:39 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id E6D154BA7986\n\tfor <incoming@patchwork.ozlabs.org>; Mon,  4 May 2026 05:46:37 +0000 (GMT)","from mail-pg1-x530.google.com (mail-pg1-x530.google.com\n [IPv6:2607:f8b0:4864:20::530])\n by sourceware.org (Postfix) with ESMTPS id 2FA724B99F73\n for <gcc-patches@gcc.gnu.org>; Mon,  4 May 2026 05:46:10 +0000 (GMT)","by mail-pg1-x530.google.com with SMTP id\n 41be03b00d2f7-c7ffe8eeaf2so734052a12.0\n for <gcc-patches@gcc.gnu.org>; Sun, 03 May 2026 22:46:10 -0700 (PDT)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org E6D154BA7986","OpenDKIM Filter v2.11.0 sourceware.org 2FA724B99F73"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org 2FA724B99F73","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org 2FA724B99F73","ARC-Seal":["i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1777873570; cv=pass;\n b=UQ/HW5cuFrE7auRKy96U4PIl8u9vNMqevGKb5BYlAFwW5fDkOsSF1llPyOqJfZ4gk27D2YT3AI89AUlevO0q6OjzSyePw+htv1gpbzMTUUQwOQWgcVBG2cWfRxFXOX9qCyBOkCn3jDiSqJVh7vdXV2tCbHQlnZewKXE7wSwOLQI=","i=1; a=rsa-sha256; t=1777873569; cv=none;\n d=google.com; s=arc-20240605;\n b=CG0TWsSGrULSXvnmHaZiFgX7ScWYgfBEUnInzdtiJuEOey3Xb/6puxdF5dA5BsabDo\n fd/Jd8DSqsGwvrCFZNtH4jBWjxamjdBGgEiliFKpEd099Ana3v5tW1YFDYOSQ/EeqLhf\n cOnDSnFG0dOSTe4D+JQpaWpdIHQh/wUOu9GvtdLzIrsoS9Ca1zDZe3lVjcmquOZC+TR/\n hioqEnuXnjwQPdrXfZSYXPJ9lvoPioTFv9xk7FM3X5uT9DDhuh9wt0IG+LYoqbgbn1Xt\n Pzk2pRsA75QBCq9dsD8M1Qtvgz6WUJ/P5eMLLjmwYWbB7SBd2YujPmXtukaxWdGIY3Q/\n e3qA=="],"ARC-Message-Signature":["i=2; a=rsa-sha256; d=sourceware.org; s=key;\n t=1777873570; c=relaxed/simple;\n bh=nFNv9sGuWObw1ej/tdSL6RvdrzHjPTcBC3RhmOUmFyI=;\n h=DKIM-Signature:MIME-Version:From:Date:Message-ID:Subject:To;\n b=RyF6YGX9cGrKB2DSJFojt2owXQhIQZwSbH3XCcCefEjqFZoArQt1Ze5PaOO/NkPURKjchaHPhyNfvtxcp29k7H8Nn3BOXyvEsLMoHmntUSxpqeNdmk519sPkt5VpR/T4tdzchiKiPrO6I4HIp2cNIo6OIEf8NyuVHQM08are9Wc=","i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com;\n s=arc-20240605;\n h=content-transfer-encoding:cc:to:subject:message-id:date:from\n :in-reply-to:references:mime-version:dkim-signature;\n bh=BKRV411c6aICYkonXfsfNAzOrtwce38Jb2+oxO00llI=;\n fh=0iv4iZA3+g7dVzf5zgf2FQXCrAsNlpV6Q4MoJTRoQqQ=;\n b=J1VcY96mEq6S1IlX3J0gWD79/WSTbpJz/O/A2iEkQUcpg3LUkI/mayUdSXhAAHCM/T\n 04NIhidGIUerX5FMEQFONx57SR8lAR0IQZcVtHx1/pxdQAyte8WKkUfJ8poT+Qown9TZ\n opZjilOZKr2rbeBTNLBaXT7TQJyGbmKx10wJRSKUR7wd90ZttN4hf6UiIcIGvJJSqhOC\n WFO1XtIAeM+p7AdcS8FVhR3MMfaY4ekVwwRDN8IDEBJZBynMHSQxsmtzEnwYDsq+S7V4\n NiB4s/BFMuc5LlbsRoaHGX1iEHCQMoosuEyihcfRSevli2zYm/zEGnK7TEhTJCNn6QYz\n gUIg==; darn=gcc.gnu.org"],"ARC-Authentication-Results":["i=2; server2.sourceware.org","i=1; mx.google.com; arc=none"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20251104; t=1777873569; x=1778478369; darn=gcc.gnu.org;\n h=content-transfer-encoding:cc:to:subject:message-id:date:from\n :in-reply-to:references:mime-version:from:to:cc:subject:date\n :message-id:reply-to;\n bh=BKRV411c6aICYkonXfsfNAzOrtwce38Jb2+oxO00llI=;\n b=f7kFi910wgCxT7zFjyCMVudW4Ajsp2k2LqlZxBW6t9mQWUGmlEHLcEAN5Maw3ao7/t\n xEi66+DoukPsicAA8AiTfQFzp2vnUCEwj2G5ZQKO1HP/yRE7NIjVcz7/WJfUdoEE0gZ3\n +x7RaJ/IjHmCfs/lSy3zh5xQtS2DWYqZiTBdlAkfaPmMsQZ53vbb+Ey6FaUMj62fg+qk\n Jhk9otjlfzAFA4k0rRGeWvSlt1prvOO+QwLngBr1AVjQEhEKaJ8fwk3UGHFxhn8KQZhr\n wFh8U47X8XnXuVWykUi1VqtPN7pxte1BmWxcXbAP+DMBVEFhB5UOkGpxn+HUou0EMish\n al/A==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1777873569; x=1778478369;\n h=content-transfer-encoding:cc:to:subject:message-id:date:from\n :in-reply-to:references:mime-version:x-gm-gg:x-gm-message-state:from\n :to:cc:subject:date:message-id:reply-to;\n bh=BKRV411c6aICYkonXfsfNAzOrtwce38Jb2+oxO00llI=;\n b=NaHRpdPvtB2cCQSNnzMd3z0FySwiQtA+E9esEkvxgO+0udylpu23SijC4GpkUskIMR\n w2x3Remkvv6Y/OAdz9kPw6/SOC9Q+cdIE3rkmEurFY0X1fs3fXIwW0iGrZ3EFtxLjqmI\n eHN9F2E6qA3au6byvm54kVRdgZRndJdcKyJ6Ccw7RvRu3dR1RnjajVZBkLxnVMXWhyMY\n P/Y8jZR/jLhy/Rxw3dCVMfQm3ZhnFTypH0KkN2bdsdz8OeUGmgNm/QNoL/pmKVZXqVJ7\n U3Q2BmjkZoG9uc6BYePQvTysifMUxqvkq+eW2DKTJz579Y9mQ4yZLm0k304eMpP3vEkl\n edMw==","X-Gm-Message-State":"AOJu0YxYPLFZSwvruMGsjFt3wcqH8Wo014LdDp4bF+G5OqbRNFtdkPnj\n Vp7x1PGO8xm51NZj5Nw33ZSDZAlObuzFqwxiMVm4+Q8QfS5i+oOdlaqWOKnF4DPCdQoXIwdP87R\n MMw1bhaeygU2kI618I9lPrSXwUQF1gFtzOuWK1SLq5LHj","X-Gm-Gg":"AeBDieslRL2+PkZts/3DnfiyqJVIDgbbpWSpFUjrbmXH7BRpx9+grFjIt8+gbtCCIBc\n zJjPF4eIhQo7Kbrhz/LlpIlYWOI9Oz880OxXMJKXZ38/uBQn37zaeglDo57Rp6RP7ma1QQf7LTh\n h1Y4okSqilIeipMAXQx5HsdRBX4n9W6i+/uCHJMQoN6VwV9mEH4tQNPKlZn5aeIVBARfE6qXQkn\n e6izeT+Cjo9vfpxZ5jUxFI7pR7PKc5lmC6IQ8vaTLgCEstmu2Y9985B2jy3LEVGqBD7ajEG2/vk\n I3v7xODnF6SjMJrFbCI=","X-Received":"by 2002:a05:6300:218d:b0:3a1:2dbd:c33 with SMTP id\n adf61e73a8af0-3a7f1a9e6f0mr8267829637.21.1777873569019; Sun, 03 May 2026\n 22:46:09 -0700 (PDT)","MIME-Version":"1.0","References":"<20260503053451.48504-3-herumi@nifty.com>\n <20260503235736.389141-1-herumi@nifty.com>","In-Reply-To":"<20260503235736.389141-1-herumi@nifty.com>","From":"\"H.J. Lu\" <hjl.tools@gmail.com>","Date":"Mon, 4 May 2026 13:45:32 +0800","X-Gm-Features":"AVHnY4IClhYvh7z0E9YQYIjc0-NBKQi71lhMDqZqTs4kDVnV147lXYlw1UMBnyg","Message-ID":"\n <CAMe9rOpAm6_O5efXK_TqFXnG=uQyFA6JvHNPjWrq4UkHm2KLBA@mail.gmail.com>","Subject":"Re: [PATCH v3 2/3] i386: Add BMI2 MULX pattern for highpart-only\n multiplication","To":"herumi@nifty.com","Cc":"gcc-patches@gcc.gnu.org","Content-Type":"text/plain; charset=\"UTF-8\"","Content-Transfer-Encoding":"quoted-printable","X-BeenThere":"gcc-patches@gcc.gnu.org","X-Mailman-Version":"2.1.30","Precedence":"list","List-Id":"Gcc-patches mailing list <gcc-patches.gcc.gnu.org>","List-Unsubscribe":"<https://gcc.gnu.org/mailman/options/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe>","List-Archive":"<https://gcc.gnu.org/pipermail/gcc-patches/>","List-Post":"<mailto:gcc-patches@gcc.gnu.org>","List-Help":"<mailto:gcc-patches-request@gcc.gnu.org?subject=help>","List-Subscribe":"<https://gcc.gnu.org/mailman/listinfo/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe>","Errors-To":"gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org"}}]