Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.1/patches/2225421/?format=api
{ "id": 2225421, "url": "http://patchwork.ozlabs.org/api/1.1/patches/2225421/?format=api", "web_url": "http://patchwork.ozlabs.org/project/gcc/patch/aebjdP_EoLMddS4Q@cowardly-lion.the-meissners.org/", "project": { "id": 17, "url": "http://patchwork.ozlabs.org/api/1.1/projects/17/?format=api", "name": "GNU Compiler Collection", "link_name": "gcc", "list_id": "gcc-patches.gcc.gnu.org", "list_email": "gcc-patches@gcc.gnu.org", "web_url": null, "scm_url": null, "webscm_url": null }, "msgid": "<aebjdP_EoLMddS4Q@cowardly-lion.the-meissners.org>", "date": "2026-04-21T02:39:48", "name": "GCC 17.0 PowerPC, V6 [PATCH 4/5]: Make the MMA instructions support -mdense-math.", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "0b1d0c783d6b624aed0af1755bcd60c184dadc85", "submitter": { "id": 73991, "url": "http://patchwork.ozlabs.org/api/1.1/people/73991/?format=api", "name": "Michael Meissner", "email": "meissner@linux.ibm.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/gcc/patch/aebjdP_EoLMddS4Q@cowardly-lion.the-meissners.org/mbox/", "series": [ { "id": 500713, "url": "http://patchwork.ozlabs.org/api/1.1/series/500713/?format=api", "web_url": "http://patchwork.ozlabs.org/project/gcc/list/?series=500713", "date": "2026-04-21T02:39:48", "name": "GCC 17.0 PowerPC, V6 [PATCH 4/5]: Make the MMA instructions support -mdense-math.", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/500713/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2225421/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2225421/checks/", "tags": {}, "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=ibm.com header.i=@ibm.com header.a=rsa-sha256\n header.s=pp1 header.b=SWCwF05G;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=38.145.34.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=ibm.com header.i=@ibm.com header.a=rsa-sha256\n header.s=pp1 header.b=SWCwF05G", "sourceware.org;\n dmarc=none (p=none dis=none) header.from=linux.ibm.com", "sourceware.org; spf=pass smtp.mailfrom=linux.ibm.com", "server2.sourceware.org;\n arc=none smtp.remote-ip=148.163.156.1" ], "Received": [ "from vm01.sourceware.org (vm01.sourceware.org [38.145.34.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 4g06652QDMz1yGt\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 21 Apr 2026 12:40:29 +1000 (AEST)", "from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id AE01A4CD202B\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 21 Apr 2026 02:40:26 +0000 (GMT)", "from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com\n [148.163.156.1])\n by sourceware.org (Postfix) with ESMTPS id 5D18C4BA2E23\n for <gcc-patches@gcc.gnu.org>; Tue, 21 Apr 2026 02:39:55 +0000 (GMT)", "from pps.filterd (m0353729.ppops.net [127.0.0.1])\n by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n 63KJgpJS1684990; Tue, 21 Apr 2026 02:39:54 GMT", "from ppma23.wdc07v.mail.ibm.com\n (5d.69.3da9.ip4.static.sl-reverse.com [169.61.105.93])\n by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4dm2j6jc7j-1\n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);\n Tue, 21 Apr 2026 02:39:54 +0000 (GMT)", "from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1])\n by ppma23.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id\n 63L2KZo3001185;\n Tue, 21 Apr 2026 02:39:53 GMT", "from smtprelay04.dal12v.mail.ibm.com ([172.16.1.6])\n by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4dmnsgy0au-1\n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);\n Tue, 21 Apr 2026 02:39:53 +0000 (GMT)", "from smtpav05.dal12v.mail.ibm.com (smtpav05.dal12v.mail.ibm.com\n [10.241.53.104])\n by smtprelay04.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id\n 63L2do5E25952964\n (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK);\n Tue, 21 Apr 2026 02:39:50 GMT", "from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1])\n by IMSVA (Postfix) with ESMTP id 3B4A158070;\n Tue, 21 Apr 2026 02:39:50 +0000 (GMT)", "from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1])\n by IMSVA (Postfix) with ESMTP id 85E5558056;\n Tue, 21 Apr 2026 02:39:49 +0000 (GMT)", "from cowardly-lion.the-meissners.org (unknown [9.61.149.99])\n by smtpav05.dal12v.mail.ibm.com (Postfix) with ESMTPS;\n Tue, 21 Apr 2026 02:39:49 +0000 (GMT)" ], "DKIM-Filter": [ "OpenDKIM Filter v2.11.0 sourceware.org AE01A4CD202B", "OpenDKIM Filter v2.11.0 sourceware.org 5D18C4BA2E23" ], "DMARC-Filter": "OpenDMARC Filter v1.4.2 sourceware.org 5D18C4BA2E23", "ARC-Filter": "OpenARC Filter v1.0.0 sourceware.org 5D18C4BA2E23", "ARC-Seal": "i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1776739195; cv=none;\n b=HXBZalbRFxSq/NLn/HN7m/xA08K+rhXPKmC0J8dZnidgc0l0AT5EnRpHkiDxL421jyn8ZWG1xZCZ7+tYPbIf56uRL3i6E6h+1u4blAvaHIHuofDV67Hc3VNLJrOPGdI/R5kZag1eoNZXNFONVhsgqHNa8RJfuYuDOVrSx4Sk4TQ=", "ARC-Message-Signature": "i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1776739195; c=relaxed/simple;\n bh=/kOb7nuK3vhyHrNLjYEKbE7SjfKKP8Ea9DuUPvpn1Zc=;\n h=DKIM-Signature:Date:From:To:Subject:Message-ID:MIME-Version;\n b=FAlGFyCb1RsMDwnMxI0/n9CI1FdeC8Hze4Fnnmmqqv0VMbUHZIJsWTCLanYQlK1tnRFs3786GU2rWPofbjpE40oh6BUF+2PyErsOVPforZEY+6uuO65wo2nmAqwQGgulxaTEVwp1NtbLJ+dEXY4GpEo5yzLDF7gHEYCDzvbuSDM=", "ARC-Authentication-Results": "i=1; server2.sourceware.org", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=\n content-type:date:from:in-reply-to:message-id:mime-version\n :references:subject:to; s=pp1; bh=bZdg5RjY/Fuy3A625W5/LTn+kJfS1h\n QmFiw9Tf0nPWA=; b=SWCwF05G6qsq9jdL1k7yExRC5v4Qqx5pDEF13IMPoxsvdD\n mVItKuKLRabclyTdh79j/ZbhrdxuTXpOA8n2CHFlmXCzczQN+Uf0d0LCKxP26Txf\n JssZAJRyvNd2Pv6iLOaWSvQL28cDCdUy6b2VPJ01vtASHvkL9gTQRR0DNX6RJYHa\n 6LtqpwJnoPmNemt3yz8PR/M/63eqkRJ5K3LYWdt8me6orsERTIWwXuHvv5T8JBMn\n gasozJpv3cKNSAO/3RbTmmy8agSOsESR6a6bPkDI9vHpEsB5CYIIy3KA1HpZ2hre\n S3CtSo2kIWp291XXAK6wkni2z35txJQHW+IO7wug==", "Date": "Mon, 20 Apr 2026 22:39:48 -0400", "From": "Michael Meissner <meissner@linux.ibm.com>", "To": "Michael Meissner <meissner@linux.ibm.com>, gcc-patches@gcc.gnu.org,\n Segher Boessenkool <segher@kernel.crashing.org>,\n jeevitha <jeevitha@linux.ibm.com>,\n Surya Kumari Jangala <jskumari@linux.ibm.com>,\n Kishan Parmar <kishan@linux.ibm.com>,\n Avinash Jayakar <avinashd@linux.ibm.com>,\n Ayappan Perumal <ayappap2@in.ibm.com>,\n Juergen Christ <jchrist@linux.ibm.com>", "Subject": "GCC 17.0 PowerPC, V6 [PATCH 4/5]: Make the MMA instructions support\n -mdense-math.", "Message-ID": "<aebjdP_EoLMddS4Q@cowardly-lion.the-meissners.org>", "Mail-Followup-To": "Michael Meissner <meissner@linux.ibm.com>,\n gcc-patches@gcc.gnu.org,\n Segher Boessenkool <segher@kernel.crashing.org>,\n jeevitha <jeevitha@linux.ibm.com>,\n Surya Kumari Jangala <jskumari@linux.ibm.com>,\n Kishan Parmar <kishan@linux.ibm.com>,\n Avinash Jayakar <avinashd@linux.ibm.com>,\n Ayappan Perumal <ayappap2@in.ibm.com>,\n Juergen Christ <jchrist@linux.ibm.com>", "References": "<aebT1QQbPenBOFeH@cowardly-lion.the-meissners.org>\n <aebfyZbqzSA9YblH@cowardly-lion.the-meissners.org>", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=us-ascii", "Content-Disposition": "inline", "In-Reply-To": "<aebfyZbqzSA9YblH@cowardly-lion.the-meissners.org>", "X-TM-AS-GCONF": "00", "X-Proofpoint-Spam-Details-Enc": "AW1haW4tMjYwNDIxMDAyMSBTYWx0ZWRfX5/YJfQIZPqU3\n uAISl/nUbq05Gw6SYHZpm+CCzZmWZFK7zCeN2bARkTUgmLsS2Ynqtbu5uVxOcd+VT6t9EtiCxA7\n qB5N9C7lHx31DHUOsDg9zxWic6rHm99M2I6Wd4i66WR+ysy3t1VENvbHM+R+inFiOR3i/kCgHdv\n KuggEPixag6eK8ob3ftZQ9AyjjOqmYduyFs76LbGU8p5SRDltZiIK2XVK5C6Nsdm+YcUeJeu2ea\n jErzRJQxqIe7gigdYqQXp4MMCmKbhYlLKaZ407uvOj7YI/vJkljFbIWah85nAIKNWVhkwQjwj6Y\n VekV2dIErkfYsH1OudS9lnimoT5bFRRo4K6wvneqGHS9Wxps1uzH4Si2B2OG+bG8djINw7joS/M\n eCQ79XPKG9y+CDiAln+lg+tueA6NdPbW7EFblyQxfKWci+rthaS6q9a/2lcnBiXTtlThtOnyGyL\n 5oSAtGkcOFCQGcGu0/w==", "X-Proofpoint-GUID": "YoMRVI_ir_Wc8B_YZg0VjxQns2oaDPYT", "X-Authority-Analysis": "v=2.4 cv=SOJykuvH c=1 sm=1 tr=0 ts=69e6e37a cx=c_pps\n a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17\n a=kj9zAlcOel0A:10 a=A5OVakUREuEA:10 a=VkNPw1HP01LnGYTKEx00:22\n a=RnoormkPH1_aCDwRdu11:22 a=uAbxVGIbfxUO_5tXvNgY:22 a=mDV3o1hIAAAA:8\n a=VnNF1IyMAAAA:8 a=59v-qk_latqwm4fcdJIA:9 a=3ZKOabzyN94A:10 a=CjuIK1q_8ugA:10", "X-Proofpoint-ORIG-GUID": "YoMRVI_ir_Wc8B_YZg0VjxQns2oaDPYT", "X-Proofpoint-Virus-Version": "vendor=baseguard\n engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49\n definitions=2026-04-20_05,2026-04-20_02,2025-10-01_01", "X-Proofpoint-Spam-Details": "rule=outbound_notspam policy=outbound score=0\n malwarescore=0 spamscore=0 priorityscore=1501 lowpriorityscore=0\n clxscore=1015 phishscore=0 suspectscore=0 adultscore=0 impostorscore=0\n bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound\n adjust=0 reason=mlx scancount=1 engine=8.22.0-2604070000\n definitions=main-2604210021", "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" }, "content": "This patch completes support for the dense math registes with 512-bit types.\nThe MMA insns have been modfiied to use the 'wD' constraint and the\naccumulator_operand predicate.\n\nThe insn (mma_xxsetaccz) that clears accumulators has been changed to be a\nnormal unspec when -mdense-math. If -mno-dense-math is in effect, the insn\nremains an unspec_volatile due to register constraints and the need to issue a\nde-prime operation.\n\nI added a comment in front of each insn to say which instructions are generated\nby the insns.\n\nI set -mcpu=future to turn on -mdense-math.\n\nI added 2 tests to the testsuite for -mdense-math support.\n\nA future path will add support for 1,024-bit dense registers.\n\nNote, in the intro mail message, I said that this was V4 of the\npatches, but I missed I had submitted V5 on February 21st, 2026, so\nthis is now V6:\n\nThis is version 6 of the patches (which is the same as version 5).\nVersion 5 patches are at:\n\n * https://gcc.gnu.org/pipermail/gcc-patches/2026-February/708943.html\n * https://gcc.gnu.org/pipermail/gcc-patches/2026-February/708944.html\n * https://gcc.gnu.org/pipermail/gcc-patches/2026-February/708945.html\n * https://gcc.gnu.org/pipermail/gcc-patches/2026-February/708946.html\n * https://gcc.gnu.org/pipermail/gcc-patches/2026-February/708947.html\n * https://gcc.gnu.org/pipermail/gcc-patches/2026-February/708948.html\n\nThis patch needs the -mcpu=future patch posted on April 8th, 2026:\n\n * https://gcc.gnu.org/pipermail/gcc-patches/2026-April/712532.html\n\nI have built bootstrap little endian compilers on power10 systems, and\nbig endian compiler on power9 systems. There were no regression in the\ntests. Can I add the patches to the GCC trunk after the -mcpu=future\npatch is applied and GCC 17 has opened up?\n\ngcc/\n\n2026-04-20 Michael Meissner <meissner@linux.ibm.com>\n\n\t* config/rs6000/mma.md (UNSPEC_MMA_DMSETDMRZ): New unspec.\n\t(mma_xxsetaccz) Convert to being a define_expand that can handle both\n\tthe original MMA support without dense math registers, and support with\n\tdense math register support.\n\t(mma_xxsetaccz_nodm): Rename original mma_xxsetaccz, and restrict this\n\tto when we do not have dense math registers.\n\t(mma_xxsetaccz_dm): New insn for clearing dense math registers.\n\t(mma_<acc>): Add support for dense registers.\n\tDocument which instructions are generated by each insn.\n\t(mma_<vv>): Likewise.\n\t(mma_<avv>): Likewise.\n\t(mma_<pv>): Likewise.\n\t(mma_<apv>): Likewise.\n\t(mma_<vvi4i4i8>): Likewise.\n\t(mma_<avvi4i4i8>): Likewise.\n\t(mma_<vvi4i4i2>): Likewise.\n\t(mma_<avvi4i4i2): Likewise.\n\t(mma_<vvi4i4>): Likewise.\n\t(mma_<avvi4i4>): Likewise.\n\t(mma_<pvi4i2>): Likewise.\n\t(mma_<apvi4i2>): Likewise.\n\t(mma_<vvi4i4i4>): Likewise.\n\t(mma_<avvi4i4i4>): Likewise.\n\t* config/rs6000/rs6000-builtin.cc (rs6000_gimple_fold_mma_builtin): Do\n\tnot issue a xxmfacc instruction if we support dense math registers.\n\t* config/rs6000/rs6000-cpu.def (FUTURE_MASKS_SERVER): If -mcpu=future,\n\tturn on -mdense-math.\n\t(POWERPC_MASKS): Mark -mdense-math as being set by -mcpu=<xxx> options.\n\ngcc/testsuite/\n\n2026-04-16 Michael Meissner <meissner@linux.ibm.com>\n\n\t* gcc.target/powerpc/mma-dm-1.c: New test.\n\t* gcc.target/powerpc/mma-dm-1.c: Likewise.\n\t* lib/target-supports.exp\n\t(check_effective_target_powerpc_dense_math_ok): New powerpc target\n\tsupport.\n---\n gcc/config/rs6000/mma.md | 128 +++++++++++++++-----\n gcc/config/rs6000/rs6000-builtin.cc | 5 +-\n gcc/config/rs6000/rs6000-cpus.def | 2 +\n gcc/testsuite/gcc.target/powerpc/mma-dm-1.c | 67 ++++++++++\n gcc/testsuite/gcc.target/powerpc/mma-dm-2.c | 67 ++++++++++\n gcc/testsuite/lib/target-supports.exp | 19 +++\n 6 files changed, 258 insertions(+), 30 deletions(-)\n create mode 100644 gcc/testsuite/gcc.target/powerpc/mma-dm-1.c\n create mode 100644 gcc/testsuite/gcc.target/powerpc/mma-dm-2.c", "diff": "diff --git a/gcc/config/rs6000/mma.md b/gcc/config/rs6000/mma.md\nindex c1e16bf2957..4e7c8b251c9 100644\n--- a/gcc/config/rs6000/mma.md\n+++ b/gcc/config/rs6000/mma.md\n@@ -91,6 +91,7 @@ (define_c_enum \"unspec\"\n UNSPEC_MMA_XVI8GER4SPP\n UNSPEC_MMA_XXMFACC\n UNSPEC_MMA_XXMTACC\n+ UNSPEC_MMA_DMSETDMRZ\n ])\n \n (define_c_enum \"unspecv\"\n@@ -530,31 +531,68 @@ (define_insn_and_split \"*mma_disassemble_acc\"\n DONE;\n })\n \n-;; MMA instructions that do not use their accumulators as an input, still\n-;; must not allow their vector operands to overlap the registers used by\n-;; the accumulator. We enforce this by marking the output as early clobber.\n+;; If dense math registers are not available, MMA instructions that do\n+;; not use their accumulators that overlap with FPR registers as an\n+;; input, still must not allow their vector operands to overlap the\n+;; registers used by the accumulator. We enforce this by marking the\n+;; output as early clobber. The prime and de-prime instructions are\n+;; not needed on systems with dense math registers.\n \n (define_insn \"mma_<acc>\"\n [(set (match_operand:XO 0 \"fpr_reg_operand\" \"=&d\")\n \t(unspec:XO [(match_operand:XO 1 \"fpr_reg_operand\" \"0\")]\n \t\t MMA_ACC))]\n- \"TARGET_MMA\"\n+ \"TARGET_MMA_NO_DENSE_MATH\"\n \"<acc> %A0\"\n [(set_attr \"type\" \"mma\")])\n \n ;; We can't have integer constants in XOmode so we wrap this in an\n-;; UNSPEC_VOLATILE.\n+;; UNSPEC_VOLATILE. If we have dense math registers, we can just use a normal\n+;; UNSPEC instead of UNSPEC_VOLATILE.\n \n-(define_insn \"mma_xxsetaccz\"\n- [(set (match_operand:XO 0 \"fpr_reg_operand\" \"=d\")\n+(define_expand \"mma_xxsetaccz\"\n+ [(set (match_operand:XO 0 \"accumulator_operand\")\n \t(unspec_volatile:XO [(const_int 0)]\n \t\t\t UNSPECV_MMA_XXSETACCZ))]\n \"TARGET_MMA\"\n+{\n+ if (TARGET_DENSE_MATH)\n+ {\n+ emit_insn (gen_mma_xxsetaccz_dm (operands[0]));\n+ DONE;\n+ }\n+})\n+\n+;; Clear accumulator without dense math registers\n+(define_insn \"*mma_xxsetaccz_nodm\"\n+ [(set (match_operand:XO 0 \"fpr_reg_operand\" \"=d\")\n+\t(unspec_volatile:XO [(const_int 0)]\n+\t\t\t UNSPECV_MMA_XXSETACCZ))]\n+ \"TARGET_MMA_NO_DENSE_MATH\"\n \"xxsetaccz %A0\"\n [(set_attr \"type\" \"mma\")])\n \n+;; Clear accumulator when dense math registers are available.\n+(define_insn \"mma_xxsetaccz_dm\"\n+ [(set (match_operand:XO 0 \"accumulator_operand\" \"=wD\")\n+\t(unspec [(const_int 0)]\n+\t\tUNSPEC_MMA_DMSETDMRZ))]\n+ \"TARGET_DENSE_MATH\"\n+ \"dmsetdmrz %A0\"\n+ [(set_attr \"type\" \"mma\")])\n+\n+\f\n+;; MMA operations below. If dense math registers are available, these\n+;; operations will use the 8 accumultors which are separate registers.\n+;; If dense math registers are not available, these operations will use\n+;; accumulators that are overlaid on top of the FPR registers.\n+\n+;; Instructions:\n+;; xvi4ger8 xvi8ger4 xvi16ger2 xvi16ger2s xvf16ger2\n+;; xvbf16ger2 xvf32ger\n+\n (define_insn \"mma_<vv>\"\n- [(set (match_operand:XO 0 \"fpr_reg_operand\" \"=&d,&d\")\n+ [(set (match_operand:XO 0 \"accumulator_operand\" \"=&wD,&wD\")\n \t(unspec:XO [(match_operand:V16QI 1 \"vsx_register_operand\" \"v,?wa\")\n \t\t (match_operand:V16QI 2 \"vsx_register_operand\" \"v,?wa\")]\n \t\t MMA_VV))]\n@@ -562,9 +600,15 @@ (define_insn \"mma_<vv>\"\n \"<vv> %A0,%x1,%x2\"\n [(set_attr \"type\" \"mma\")])\n \n+;; Instructions:\n+;; xvi4ger8pp xvi8ger4pp xvi8ger4spp xvi16ger2pp xvi16ger2spp\n+;; xvf16ger2pp xvf16ger2pn xvf16ger2np xvf16ger2nn xvbf16ger2pp\n+;; xvbf16ger2pn xvbf16ger2np xvbf16ger2nn xvf32gerpp xvf32gerpn\n+;; xvf32gernp xvf32gernn\n+\n (define_insn \"mma_<avv>\"\n- [(set (match_operand:XO 0 \"fpr_reg_operand\" \"=&d,&d\")\n-\t(unspec:XO [(match_operand:XO 1 \"fpr_reg_operand\" \"0,0\")\n+ [(set (match_operand:XO 0 \"accumulator_operand\" \"=&wD,&wD\")\n+\t(unspec:XO [(match_operand:XO 1 \"accumulator_operand\" \"0,0\")\n \t\t (match_operand:V16QI 2 \"vsx_register_operand\" \"v,?wa\")\n \t\t (match_operand:V16QI 3 \"vsx_register_operand\" \"v,?wa\")]\n \t\t MMA_AVV))]\n@@ -572,8 +616,10 @@ (define_insn \"mma_<avv>\"\n \"<avv> %A0,%x2,%x3\"\n [(set_attr \"type\" \"mma\")])\n \n+;; Instruction: xvf64ger\n+\n (define_insn \"mma_<pv>\"\n- [(set (match_operand:XO 0 \"fpr_reg_operand\" \"=&d,&d\")\n+ [(set (match_operand:XO 0 \"accumulator_operand\" \"=&wD,&wD\")\n \t(unspec:XO [(match_operand:OO 1 \"vsx_register_operand\" \"v,?wa\")\n \t\t (match_operand:V16QI 2 \"vsx_register_operand\" \"v,?wa\")]\n \t\t MMA_PV))]\n@@ -581,9 +627,11 @@ (define_insn \"mma_<pv>\"\n \"<pv> %A0,%x1,%x2\"\n [(set_attr \"type\" \"mma\")])\n \n+;; Instructions: xvf64gerpp xvf64gerpn xvf64gernp xvf64gernn\n+\n (define_insn \"mma_<apv>\"\n- [(set (match_operand:XO 0 \"fpr_reg_operand\" \"=&d,&d\")\n-\t(unspec:XO [(match_operand:XO 1 \"fpr_reg_operand\" \"0,0\")\n+ [(set (match_operand:XO 0 \"accumulator_operand\" \"=&wD,&wD\")\n+\t(unspec:XO [(match_operand:XO 1 \"accumulator_operand\" \"0,0\")\n \t\t (match_operand:OO 2 \"vsx_register_operand\" \"v,?wa\")\n \t\t (match_operand:V16QI 3 \"vsx_register_operand\" \"v,?wa\")]\n \t\t MMA_APV))]\n@@ -591,8 +639,10 @@ (define_insn \"mma_<apv>\"\n \"<apv> %A0,%x2,%x3\"\n [(set_attr \"type\" \"mma\")])\n \n+;; Instruction: pmxvi4ger8\n+\n (define_insn \"mma_<vvi4i4i8>\"\n- [(set (match_operand:XO 0 \"fpr_reg_operand\" \"=&d,&d\")\n+ [(set (match_operand:XO 0 \"accumulator_operand\" \"=&wD,&wD\")\n \t(unspec:XO [(match_operand:V16QI 1 \"vsx_register_operand\" \"v,?wa\")\n \t\t (match_operand:V16QI 2 \"vsx_register_operand\" \"v,?wa\")\n \t\t (match_operand:SI 3 \"const_0_to_15_operand\" \"n,n\")\n@@ -604,9 +654,11 @@ (define_insn \"mma_<vvi4i4i8>\"\n [(set_attr \"type\" \"mma\")\n (set_attr \"prefixed\" \"yes\")])\n \n+;; Instruction: pmxvi4ger8pp\n+\n (define_insn \"mma_<avvi4i4i8>\"\n- [(set (match_operand:XO 0 \"fpr_reg_operand\" \"=&d,&d\")\n-\t(unspec:XO [(match_operand:XO 1 \"fpr_reg_operand\" \"0,0\")\n+ [(set (match_operand:XO 0 \"accumulator_operand\" \"=&wD,&wD\")\n+\t(unspec:XO [(match_operand:XO 1 \"accumulator_operand\" \"0,0\")\n \t\t (match_operand:V16QI 2 \"vsx_register_operand\" \"v,?wa\")\n \t\t (match_operand:V16QI 3 \"vsx_register_operand\" \"v,?wa\")\n \t\t (match_operand:SI 4 \"const_0_to_15_operand\" \"n,n\")\n@@ -618,8 +670,11 @@ (define_insn \"mma_<avvi4i4i8>\"\n [(set_attr \"type\" \"mma\")\n (set_attr \"prefixed\" \"yes\")])\n \n+;; Instructions:\n+;; pmxvi16ger2 pmxvi16ger2s pmxvf16ger2 pmxvbf16ger2\n+\n (define_insn \"mma_<vvi4i4i2>\"\n- [(set (match_operand:XO 0 \"fpr_reg_operand\" \"=&d,&d\")\n+ [(set (match_operand:XO 0 \"accumulator_operand\" \"=&wD,&wD\")\n \t(unspec:XO [(match_operand:V16QI 1 \"vsx_register_operand\" \"v,?wa\")\n \t\t (match_operand:V16QI 2 \"vsx_register_operand\" \"v,?wa\")\n \t\t (match_operand:SI 3 \"const_0_to_15_operand\" \"n,n\")\n@@ -631,9 +686,14 @@ (define_insn \"mma_<vvi4i4i2>\"\n [(set_attr \"type\" \"mma\")\n (set_attr \"prefixed\" \"yes\")])\n \n+;; Instructions:\n+;; pmxvi16ger2pp pmxvi16ger2spp pmxvf16ger2pp pmxvf16ger2pn\n+;; pmxvf16ger2np pmxvf16ger2nn pmxvbf16ger2pp pmxvbf16ger2pn\n+;; pmxvbf16ger2np pmxvbf16ger2nn\n+\n (define_insn \"mma_<avvi4i4i2>\"\n- [(set (match_operand:XO 0 \"fpr_reg_operand\" \"=&d,&d\")\n-\t(unspec:XO [(match_operand:XO 1 \"fpr_reg_operand\" \"0,0\")\n+ [(set (match_operand:XO 0 \"accumulator_operand\" \"=&wD,&wD\")\n+\t(unspec:XO [(match_operand:XO 1 \"accumulator_operand\" \"0,0\")\n \t\t (match_operand:V16QI 2 \"vsx_register_operand\" \"v,?wa\")\n \t\t (match_operand:V16QI 3 \"vsx_register_operand\" \"v,?wa\")\n \t\t (match_operand:SI 4 \"const_0_to_15_operand\" \"n,n\")\n@@ -645,8 +705,10 @@ (define_insn \"mma_<avvi4i4i2>\"\n [(set_attr \"type\" \"mma\")\n (set_attr \"prefixed\" \"yes\")])\n \n+;; Instruction: pmxvf32ger\n+\n (define_insn \"mma_<vvi4i4>\"\n- [(set (match_operand:XO 0 \"fpr_reg_operand\" \"=&d,&d\")\n+ [(set (match_operand:XO 0 \"accumulator_operand\" \"=&wD,&wD\")\n \t(unspec:XO [(match_operand:V16QI 1 \"vsx_register_operand\" \"v,?wa\")\n \t\t (match_operand:V16QI 2 \"vsx_register_operand\" \"v,?wa\")\n \t\t (match_operand:SI 3 \"const_0_to_15_operand\" \"n,n\")\n@@ -657,9 +719,11 @@ (define_insn \"mma_<vvi4i4>\"\n [(set_attr \"type\" \"mma\")\n (set_attr \"prefixed\" \"yes\")])\n \n+;; Instructions: pmxvf32gerpp pmxvf32gerpn pmxvf32gernp pmxvf32gernn\n+\n (define_insn \"mma_<avvi4i4>\"\n- [(set (match_operand:XO 0 \"fpr_reg_operand\" \"=&d,&d\")\n-\t(unspec:XO [(match_operand:XO 1 \"fpr_reg_operand\" \"0,0\")\n+ [(set (match_operand:XO 0 \"accumulator_operand\" \"=&wD,&wD\")\n+\t(unspec:XO [(match_operand:XO 1 \"accumulator_operand\" \"0,0\")\n \t\t (match_operand:V16QI 2 \"vsx_register_operand\" \"v,?wa\")\n \t\t (match_operand:V16QI 3 \"vsx_register_operand\" \"v,?wa\")\n \t\t (match_operand:SI 4 \"const_0_to_15_operand\" \"n,n\")\n@@ -670,8 +734,10 @@ (define_insn \"mma_<avvi4i4>\"\n [(set_attr \"type\" \"mma\")\n (set_attr \"prefixed\" \"yes\")])\n \n+;; Instruction: pmxvf64ger\n+\n (define_insn \"mma_<pvi4i2>\"\n- [(set (match_operand:XO 0 \"fpr_reg_operand\" \"=&d,&d\")\n+ [(set (match_operand:XO 0 \"accumulator_operand\" \"=&wD,&wD\")\n \t(unspec:XO [(match_operand:OO 1 \"vsx_register_operand\" \"v,?wa\")\n \t\t (match_operand:V16QI 2 \"vsx_register_operand\" \"v,?wa\")\n \t\t (match_operand:SI 3 \"const_0_to_15_operand\" \"n,n\")\n@@ -682,9 +748,11 @@ (define_insn \"mma_<pvi4i2>\"\n [(set_attr \"type\" \"mma\")\n (set_attr \"prefixed\" \"yes\")])\n \n+;; Instructions: pmxvf64gerpp pmxvf64gerpn pmxvf64gernp pmxvf64gernn\n+\n (define_insn \"mma_<apvi4i2>\"\n- [(set (match_operand:XO 0 \"fpr_reg_operand\" \"=&d,&d\")\n-\t(unspec:XO [(match_operand:XO 1 \"fpr_reg_operand\" \"0,0\")\n+ [(set (match_operand:XO 0 \"accumulator_operand\" \"=&wD,&wD\")\n+\t(unspec:XO [(match_operand:XO 1 \"accumulator_operand\" \"0,0\")\n \t\t (match_operand:OO 2 \"vsx_register_operand\" \"v,?wa\")\n \t\t (match_operand:V16QI 3 \"vsx_register_operand\" \"v,?wa\")\n \t\t (match_operand:SI 4 \"const_0_to_15_operand\" \"n,n\")\n@@ -695,8 +763,10 @@ (define_insn \"mma_<apvi4i2>\"\n [(set_attr \"type\" \"mma\")\n (set_attr \"prefixed\" \"yes\")])\n \n+;; Instruction: pmxvi8ger4\n+\n (define_insn \"mma_<vvi4i4i4>\"\n- [(set (match_operand:XO 0 \"fpr_reg_operand\" \"=&d,&d\")\n+ [(set (match_operand:XO 0 \"accumulator_operand\" \"=&wD,&wD\")\n \t(unspec:XO [(match_operand:V16QI 1 \"vsx_register_operand\" \"v,?wa\")\n \t\t (match_operand:V16QI 2 \"vsx_register_operand\" \"v,?wa\")\n \t\t (match_operand:SI 3 \"const_0_to_15_operand\" \"n,n\")\n@@ -708,9 +778,11 @@ (define_insn \"mma_<vvi4i4i4>\"\n [(set_attr \"type\" \"mma\")\n (set_attr \"prefixed\" \"yes\")])\n \n+;; Instructions: pmxvi8ger4pp pmxvi8ger4spp\n+\n (define_insn \"mma_<avvi4i4i4>\"\n- [(set (match_operand:XO 0 \"fpr_reg_operand\" \"=&d,&d\")\n-\t(unspec:XO [(match_operand:XO 1 \"fpr_reg_operand\" \"0,0\")\n+ [(set (match_operand:XO 0 \"accumulator_operand\" \"=&wD,&wD\")\n+\t(unspec:XO [(match_operand:XO 1 \"accumulator_operand\" \"0,0\")\n \t\t (match_operand:V16QI 2 \"vsx_register_operand\" \"v,?wa\")\n \t\t (match_operand:V16QI 3 \"vsx_register_operand\" \"v,?wa\")\n \t\t (match_operand:SI 4 \"const_0_to_15_operand\" \"n,n\")\ndiff --git a/gcc/config/rs6000/rs6000-builtin.cc b/gcc/config/rs6000/rs6000-builtin.cc\nindex 4d0e541351f..ee4210cc776 100644\n--- a/gcc/config/rs6000/rs6000-builtin.cc\n+++ b/gcc/config/rs6000/rs6000-builtin.cc\n@@ -1130,8 +1130,9 @@ rs6000_gimple_fold_mma_builtin (gimple_stmt_iterator *gsi,\n \t}\n \n /* If we're disassembling an accumulator into a different type, we need\n-\t to emit a xxmfacc instruction now, since we cannot do it later. */\n- if (fncode == RS6000_BIF_DISASSEMBLE_ACC)\n+\t to emit a xxmfacc instruction now, since we cannot do it later. If we\n+\t have dense math registers, we don't need to do this. */\n+ if (fncode == RS6000_BIF_DISASSEMBLE_ACC && !TARGET_DENSE_MATH)\n \t{\n \t new_decl = rs6000_builtin_decls[RS6000_BIF_XXMFACC_INTERNAL];\n \t new_call = gimple_build_call (new_decl, 1, src);\ndiff --git a/gcc/config/rs6000/rs6000-cpus.def b/gcc/config/rs6000/rs6000-cpus.def\nindex dc67e287672..3e51848481f 100644\n--- a/gcc/config/rs6000/rs6000-cpus.def\n+++ b/gcc/config/rs6000/rs6000-cpus.def\n@@ -91,6 +91,7 @@\n will be fixed in potential future machines. */\n #define FUTURE_MASKS_SERVER\t(POWER11_MASKS_SERVER\t\t\t\\\n \t\t\t\t | OPTION_MASK_BLOCK_OPS_VECTOR_PAIR\t\\\n+\t\t\t\t | OPTION_MASK_DENSE_MATH\t\t\\\n \t\t\t\t | OPTION_MASK_FUTURE)\n \n /* Flags that need to be turned off if -mno-vsx. */\n@@ -124,6 +125,7 @@\n \t\t\t\t | OPTION_MASK_BLOCK_OPS_VECTOR_PAIR\t\\\n \t\t\t\t | OPTION_MASK_CMPB\t\t\t\\\n \t\t\t\t | OPTION_MASK_CRYPTO\t\t\t\\\n+\t\t\t\t | OPTION_MASK_DENSE_MATH\t\t\\\n \t\t\t\t | OPTION_MASK_DFP\t\t\t\\\n \t\t\t\t | OPTION_MASK_DLMZB\t\t\t\\\n \t\t\t\t | OPTION_MASK_EFFICIENT_UNALIGNED_VSX\t\\\ndiff --git a/gcc/testsuite/gcc.target/powerpc/mma-dm-1.c b/gcc/testsuite/gcc.target/powerpc/mma-dm-1.c\nnew file mode 100644\nindex 00000000000..deea87a0aa3\n--- /dev/null\n+++ b/gcc/testsuite/gcc.target/powerpc/mma-dm-1.c\n@@ -0,0 +1,67 @@\n+/* { dg-do compile } */\n+/* { dg-require-effective-target powerpc_dense_math_ok } */\n+/* { dg-options \"-mdejagnu-cpu=future -O2\" } */\n+\n+/* Test basic dense math support for MMA. */\n+\n+void\n+move_simple (__vector_quad *a, __vector_quad *b)\n+{\n+ /* 2 lxvp, 2 stxvp. */\n+ __vector_quad c = *a;\n+ *b = c;\n+}\n+\n+void\n+move_constraint_d (__vector_quad *a, __vector_quad *b)\n+{\n+ /* 2 lxvp, 2 stxvp. */\n+ __vector_quad c = *a;\n+ __asm__ (\" # %x0 (d constraint)\" : \"+d\" (c));\n+ *b = c;\n+}\n+\n+void\n+move_constraint_wD (__vector_quad *a, __vector_quad *b)\n+{\n+ /* 2 lxvp, dmxxinstdmr512, dmxxextfdmr512, 2 stxvp. */\n+ __vector_quad c = *a;\n+ __asm__ (\" # %A0 (wD constraint)\" : \"+wD\" (c));\n+ *b = c;\n+}\n+\n+void\n+clear_simple (__vector_quad *a)\n+{\n+ /* dmsetdmrz, dmxxextfdmr512, 2 stxvp. */\n+ __builtin_mma_xxsetaccz (a);\n+}\n+\n+void\n+clear_constraint_d (__vector_quad *a)\n+{\n+ __vector_quad z;\n+\n+ /* dmsetdmrz, dmxxextfdmr512, 2 stxvp. */\n+ __builtin_mma_xxsetaccz (&z);\n+ __asm__ (\" # %x0 (d constraint)\" : \"+d\" (z));\n+ *a = z;\n+}\n+\n+void\n+clear_constraint_wD (__vector_quad *a)\n+{\n+ __vector_quad z;\n+\n+ /* dmsetdmrz, dmxxextfdmr512, 2 stxvp. */\n+ __builtin_mma_xxsetaccz (&z);\n+ __asm__ (\" # %A0 (d constraint)\" : \"+wD\" (z));\n+ *a = z;\n+}\n+\n+/* { dg-final { scan-assembler-times {\\mdmsetdmrz\\M} 3 } } */\n+/* { dg-final { scan-assembler-times {\\mdmxxextfdmr512\\M} 4 } } */\n+/* { dg-final { scan-assembler-times {\\mdmxxinstdmr512\\M} 1 } } */\n+/* { dg-final { scan-assembler-not {\\mxxmfacc\\M} } } */\n+/* { dg-final { scan-assembler-not {\\mxxmtacc\\M} } } */\n+/* { dg-final { scan-assembler-not {\\mxxsetaccz\\M} } } */\ndiff --git a/gcc/testsuite/gcc.target/powerpc/mma-dm-2.c b/gcc/testsuite/gcc.target/powerpc/mma-dm-2.c\nnew file mode 100644\nindex 00000000000..091b71c94f7\n--- /dev/null\n+++ b/gcc/testsuite/gcc.target/powerpc/mma-dm-2.c\n@@ -0,0 +1,67 @@\n+/* { dg-do compile } */\n+/* { dg-require-effective-target powerpc_dense_math_ok } */\n+/* { dg-options \"-mdejagnu-cpu=power10 -mno-dense-math -O2\" } */\n+\n+/* Test basic dense math support for MMA. */\n+\n+void\n+move_simple (__vector_quad *a, __vector_quad *b)\n+{\n+ /* 2 lxvp, xxmtacc, xxftacc 2 stxvp. */\n+ __vector_quad c = *a;\n+ *b = c;\n+}\n+\n+void\n+move_constraint_d (__vector_quad *a, __vector_quad *b)\n+{\n+ /* 2 lxvp, xxmtacc, xxftacc, 2 stxvp. */\n+ __vector_quad c = *a;\n+ __asm__ (\" # %x0 (d constraint)\" : \"+d\" (c));\n+ *b = c;\n+}\n+\n+void\n+move_constraint_wD (__vector_quad *a, __vector_quad *b)\n+{\n+ /* 2 lxvp, xxmtacc, xxftacc, 2 stxvp. */\n+ __vector_quad c = *a;\n+ __asm__ (\" # %A0 (wD constraint)\" : \"+wD\" (c));\n+ *b = c;\n+}\n+\n+void\n+clear_simple (__vector_quad *a)\n+{\n+ /* xxsetaccz, xxmfacc, 2 stxvp. */\n+ __builtin_mma_xxsetaccz (a);\n+}\n+\n+void\n+clear_constraint_d (__vector_quad *a)\n+{\n+ __vector_quad z;\n+\n+ /* xxsetaccz, xxmfacc, 2 stxvp. */\n+ __builtin_mma_xxsetaccz (&z);\n+ __asm__ (\" # %x0 (d constraint)\" : \"+d\" (z));\n+ *a = z;\n+}\n+\n+void\n+clear_constraint_wD (__vector_quad *a)\n+{\n+ __vector_quad z;\n+\n+ /* xxsetaccz, xxmfacc, 2 stxvp. */\n+ __builtin_mma_xxsetaccz (&z);\n+ __asm__ (\" # %A0 (d constraint)\" : \"+wD\" (z));\n+ *a = z;\n+}\n+\n+/* { dg-final { scan-assembler-not {\\mdmsetdmrz\\M} } } */\n+/* { dg-final { scan-assembler-not {\\mdmxxextfdmr512\\M} } } */\n+/* { dg-final { scan-assembler-not {\\mdmxxinstdmr512\\M} } } */\n+/* { dg-final { scan-assembler-times {\\mxxmfacc\\M} 6 } } */\n+/* { dg-final { scan-assembler-times {\\mxxmtacc\\M} 3 } } */\n+/* { dg-final { scan-assembler-times {\\mxxsetaccz\\M} 3 } } */\ndiff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp\nindex 64e7653e755..1b9e0bf8f49 100644\n--- a/gcc/testsuite/lib/target-supports.exp\n+++ b/gcc/testsuite/lib/target-supports.exp\n@@ -8029,6 +8029,25 @@ proc check_effective_target_power10_ok { } {\n }\n }\n \n+# Return 1 if this is a PowerPC target supporting -mcpu=future which enables\n+# the dense math operations.\n+proc check_effective_target_powerpc_dense_math_ok { } {\n+ if { ([istarget powerpc*-*-*]) } {\n+\treturn [check_no_compiler_messages powerpc_dense_math_ok object {\n+\t __vector_quad vq;\n+\t int main (void) {\n+\t\t/* Make sure we have dense math support. */\n+\t\t __vector_quad dmr;\n+\t\t __asm__ (\"dmsetaccz %A0\" : \"=wD\" (dmr));\n+\t\t vq = dmr;\n+\t\treturn 0;\n+\t }\n+\t} \"-mcpu=future\"]\n+ } else {\n+\treturn 0;\n+ }\n+}\n+\n # Return 1 if this is a PowerPC target supporting -mfloat128 via either\n # software emulation on power7/power8 systems or hardware support on power9.\n \n", "prefixes": [] }