{"id":808686,"url":"http://patchwork.ozlabs.org/api/1.2/patches/808686/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/patch/20170901133347.GA1605@arm.com/","project":{"id":17,"url":"http://patchwork.ozlabs.org/api/1.2/projects/17/?format=json","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,"list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20170901133347.GA1605@arm.com>","list_archive_url":null,"date":"2017-09-01T13:33:49","name":"[ARM] Dot Product NEON patterns [Patch (2/8)]","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"8b9e0d1a68bed69ecab2e940346d48c379887dc6","submitter":{"id":69689,"url":"http://patchwork.ozlabs.org/api/1.2/people/69689/?format=json","name":"Tamar Christina","email":"Tamar.Christina@arm.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/gcc/patch/20170901133347.GA1605@arm.com/mbox/","series":[{"id":1030,"url":"http://patchwork.ozlabs.org/api/1.2/series/1030/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/list/?series=1030","date":"2017-09-01T13:33:49","name":"[ARM] Dot Product NEON patterns [Patch (2/8)]","version":1,"mbox":"http://patchwork.ozlabs.org/series/1030/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/808686/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/808686/checks/","tags":{},"related":[],"headers":{"Return-Path":"<gcc-patches-return-461295-incoming=patchwork.ozlabs.org@gcc.gnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":["patchwork-incoming@bilbo.ozlabs.org","mailing list gcc-patches@gcc.gnu.org"],"Authentication-Results":["ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org\n\t(client-ip=209.132.180.131; helo=sourceware.org;\n\tenvelope-from=gcc-patches-return-461295-incoming=patchwork.ozlabs.org@gcc.gnu.org;\n\treceiver=<UNKNOWN>)","ozlabs.org; dkim=pass (1024-bit key;\n\tunprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org\n\theader.b=\"FQdoyqQc\"; dkim-atps=neutral","sourceware.org; auth=none","spf=none (sender IP is )\n\tsmtp.mailfrom=Tamar.Christina@arm.com; "],"Received":["from sourceware.org (server1.sourceware.org [209.132.180.131])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256\n\tbits)) (No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xkKvx51DGz9t2d\n\tfor <incoming@patchwork.ozlabs.org>;\n\tFri,  1 Sep 2017 23:34:05 +1000 (AEST)","(qmail 39033 invoked by alias); 1 Sep 2017 13:33:58 -0000","(qmail 39003 invoked by uid 89); 1 Sep 2017 13:33:56 -0000","from mail-eopbgr20080.outbound.protection.outlook.com (HELO\n\tEUR02-VE1-obe.outbound.protection.outlook.com) (40.107.2.80)\n\tby sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with\n\tESMTP; Fri, 01 Sep 2017 13:33:51 +0000","from arm.com (217.140.96.140) by\n\tDB6PR0802MB2309.eurprd08.prod.outlook.com\n\t(2603:10a6:4:86::13) with Microsoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id\n\t15.20.13.10; Fri, 1 Sep 2017 13:33:46 +0000"],"DomainKey-Signature":"a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id\n\t:list-unsubscribe:list-archive:list-post:list-help:sender:date\n\t:from:to:cc:subject:message-id:mime-version:content-type; q=dns;\n\ts=default; b=Y8fCJc5YjQw/TR6y5kOc38SZdCrNtOjg53iYODnOSv53zSvJdU\n\tXhi9juEyXt5sVhIUACjfE68r4OwmNxcugrQIRoolUmRPgATOI9HPy7EDmpo0KH9r\n\tKO1YWmNt1XcdK1Yf5AiPQBMtJTKNHvvrGspArP08llwMw8d0MK5mJbNeY=","DKIM-Signature":"v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id\n\t:list-unsubscribe:list-archive:list-post:list-help:sender:date\n\t:from:to:cc:subject:message-id:mime-version:content-type; s=\n\tdefault; bh=DYCGpTlS/IykIw0MdTU0I813R6E=; b=FQdoyqQcIR4eh0h3VeiD\n\tr2/3pp1e0rHARX/4ySIUyS5O77XsIm3IUXh920sa+0h7zntSqNOUGx4ve1DMNM3Q\n\tIKhziSW4PbfuVY3ffThLp84kdZnGSUcV5dB03//lQxWCMMyEZk2p3alG3jam1N/0\n\tjZe45jl+IaEWenlCRAgKtm0=","Mailing-List":"contact gcc-patches-help@gcc.gnu.org; run by ezmlm","Precedence":"bulk","List-Id":"<gcc-patches.gcc.gnu.org>","List-Unsubscribe":"<mailto:gcc-patches-unsubscribe-incoming=patchwork.ozlabs.org@gcc.gnu.org>","List-Archive":"<http://gcc.gnu.org/ml/gcc-patches/>","List-Post":"<mailto:gcc-patches@gcc.gnu.org>","List-Help":"<mailto:gcc-patches-help@gcc.gnu.org>","Sender":"gcc-patches-owner@gcc.gnu.org","X-Virus-Found":"No","X-Spam-SWARE-Status":"No, score=-24.8 required=5.0 tests=AWL, BAYES_00,\n\tGIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3,\n\tKAM_ASCII_DIVIDERS, KAM_LOTSOFHASH, RCVD_IN_DNSWL_NONE,\n\tSPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 spammy=sup,\n\t30446, 7646","X-HELO":"EUR02-VE1-obe.outbound.protection.outlook.com","Date":"Fri, 1 Sep 2017 14:33:49 +0100","From":"Tamar Christina <tamar.christina@arm.com>","To":"gcc-patches@gcc.gnu.org","Cc":"nd@arm.com, Ramana.Radhakrishnan@arm.com, Richard.Earnshaw@arm.com,\n\tnickc@redhat.com, Kyrylo.Tkachov@arm.com","Subject":"[PATCH][GCC][ARM] Dot Product NEON patterns [Patch (2/8)]","Message-ID":"<20170901133347.GA1605@arm.com>","MIME-Version":"1.0","Content-Type":"multipart/mixed; boundary=\"PNTmBPCT7hxwcZjr\"","Content-Disposition":"inline","User-Agent":"Mutt/1.5.24 (2015-08-30)","X-ClientProxiedBy":"AM4PR0202CA0015.eurprd02.prod.outlook.com\n\t(2603:10a6:200:89::25) To\n\tDB6PR0802MB2309.eurprd08.prod.outlook.com\n\t(2603:10a6:4:86::13)","X-MS-PublicTrafficType":"Email","X-MS-Office365-Filtering-Correlation-Id":"8530d263-a3be-46eb-12b0-08d4f13e12dd","X-MS-Office365-Filtering-HT":"Tenant","X-Microsoft-Antispam":"UriScan:; BCL:0; PCL:0;\n\tRULEID:(300000500095)(300135000095)(300000501095)(300135300095)(300000502095)(300135100095)(22001)(2017030254152)(48565401081)(300000503095)(300135400095)(49563074)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);\n\tSRVR:DB6PR0802MB2309; ","X-Microsoft-Exchange-Diagnostics":["1; DB6PR0802MB2309;\n\t3:re3eniva9kSOTyBQNz/szYQV0s5mGWUHU/JD0QgOwh+0/3O0YRxjCye7UqOl1lG4EJZqkdmZZVZHt4wvt8hbWRX/d9KBE7LWUSLuuO7nZ+bE3+vpTPTZw5Xcxg71ZfX+4xyitlFry6DXJRgXIhUNyvzHpUhXsqwEFujzVA7uQ4xuX73m1/pn2Ny/PykisNhbCInalRW+HbLZWmZDlqQIdP2Nzv7wUNKW/0fwcsXg4AOeHtzeILEzNO577fzguM8Y;\n\t25:NVtzy/neB4v+YXOBFeF/9g0W+Jetvu5Z31yYMFFNLR8ioSI6BXynVerDyquumH10GCYZ9AOmid+3lsizBN15xlra7OL0lEWNYKB/khD0/c/gFOUwaqO75o37MAgVWdeRfjmkJN8EvZ4FMYPTtZBJ3NKJo9tGcPqQhf6wyPpaHvMIIJu9D6S/mI1f6oJIZAqQrLwvbZ8b+uXrNMu8inFY1T2Dyn/U7AIoYLF5pOYXSCHME5N7a5QueiQdsXL/PoDI6ZQzUsSPrVX/nlV80MxMXiHryHKTxhm4UIqKWfu7plM40z2p4q30Warajy06SsOjwOccLjdvjscinnO05cOCDg==;\n\t31:jpEeNtARbDYpa0JS8/qxaQDuV+MHd+rH4fTX2NASPVKDvAnaHrXm6G8J98HnT4+AJDEBHSB5eU0bljrBmjEZpInGAkJaJqFh+AjZGq042IxtmrFQFaS3t37VuwZUvs1S2o5zCIEqcB5JzYZUQF3L1fWN3mLDzhLjuEORr5M8ErUi9t7/374FkcR0rviS/Z5vSbdsINKayyNscxkQhx/E3X6N2Ct8dUXC9xkWTQT/NCw=","1; DB6PR0802MB2309;\n\t20:jTLVRUCK9hjW50zPAis7uU6iPVOqaiMPu4GoEzRCqkqAWu+T7QZlq5ISTrG+uUyHaNcf6XqvuHYW1YECT+qFMH29J/Wl5CP8hHOwnXjvDmIOBfLOJ0jj5lfl36ohYXTQYGsxdm+iIdn83bZ2gETVZ/6thjqEtm9jTpW2k0A4UkA=;\n\t4:zSZaggEB2PXKTKKaRFwgaApvg23UUu4aeG0anPzKKmNxdnOR6mHtS9Y9HYZxKmLJDIS4wRVGqRPuHY27Cow0+DGswctGXGh5z8rDBvreRrNUe1Ftg0IzUEiQ6qkBiMv2y5nMdQhgCQfL1ePcezGPXkNzVjs+7zjsPkaQhadjA/MMwFcW0PTvYt88YGOTh3/rY1Jifm23lMQiW6XU85WmMrgJSxvBlOqll++xaSgYPgvBNpt3O3fLyrzdZ29usY0pXuHZfTi8fsXnWhBany2IBOpZwYhUxiO4Ai1Al6UNJAk=","1; DB6PR0802MB2309;\n\t23:PyUkdZgouchOJ/L9sXcSjnBGIgTpk/Y/5MqDMX7E7Vd1+1wXusry3kdxRowIqdBqh5VxIeZEU4UO70dgIN51mtdPZVL1G23kZr2/Y97UR+B6+rRnscSJjWLW68ISnYBc4liMqZn/2WHWgojw2xIhxerPHdI5hFeHvgRZyEXA+4L6iry1pw4vvbsghAE/jDUNXrTnNUg/IOGG5b5/dFfX0XXJRhhp3vfiQDbdwhVkU7b+qYzltZIJAgfhHQWYCUKXKvfgZNrCMHHePVpmTqzxKogV4JEkS9pqp5FPSNBiJ1IoRdfwfwq4K+fjMEBYssaYT0Ad/NxYH+mEcBtk/9Zy+Dv5c+dxy7SD2+OJZg5A6qpOiS1CN/hmKuIdvWnoxgTqY9SuGuBJudhmZK89pzmUqrT9aK1kZmDvdGQ4ou1twKC11prOPiNR9QxFsLhYvLyKyyRInmHoWf0AJl/uUmGGQUUw59k0XyhteAU9rK+5pPIdFqfi6I+6/J244wAqauI99X+vP/onRNasghB70iS0rkUSD+v5cOb430t3l7M5oKf8MwfJbQkVJLSKDlkaKGavrlkpiFhjBrGGj0bRRvRdAxR+n5zdmdFiuS0FgZA7tUGoigzcIivqUfOgfQE3kig2ljQ/0B8SwZd7OdaFyx2t9kGL8eB0aRWKr4oAQ+rhtqo4t4sGx6hRNn3ALrwbhYenBh5q3ir01EvcvgXSwyqCfsdUO8BFdnQTxg2VJ/ExxMtOR2pQ66RzvR6+RJb0zF+HSl9dH1xVhAcg1KlW6W1xAzunUx1YSJawGXrvmbZkQsd4YIPQhip2Z7lHasFqf1btci++DWVIDxdl1rbUa+l0jdftrArjEKUs9fMrhblxATaxUaM26JZaUGQXNd7wx92E9tjRi7SDYg2UBlowWOcNanXesV9EwhRv9h/JQwU9+1//4g8EGLtMMNTJslQtPpKsq5Hix9en2ndwXfsAABKaRVSFO+fDdQOMafWWYR2SbxIE1fbjkKQCnrlluPmowaRItfDciAEUbTsQEn/ocPu1MQH2Z7Dtiw6DYK+Ut8h3KMR/if0UfiHYO7cWUGe7vYApXJFy2M1GEvL1iptJbNNrvf7ze8tMignS/gE35s6rUdCsZwn6pwR2qrzQjBXUGyfFN9DcvtFI9R4ih2BUG6SV5rUqhWMXHE0ffiUcYbqs9w7bOOK2fmg+oru9HBI7a3bOmMVY1Nb8K/rdPMYv4eUsvSHRgxsLjxapXGXfsVugVv2KCIGfp2v4R5QbjgQ5L59D5lwH/BLlKVXfuMyfNd7Pe/IHsninslmkzxEMSGnv22Y=","1; DB6PR0802MB2309;\n\t6:I3kswnTKfDwt//fmYTQjhBDnEn43CMzoGrPG1wdErKppvu1qASUH8+tqggb1GA+6yI9jz57C++rXhWe8SnrJwFEOgya/PsuW2toFAfr9yI3XzgVdCwMtTpRVua/5bm4pB1SmxtOFaHqrZCNUQifYAl03Y2Qsi3MGUAQEfMT+mHeWtriUFmAfyjaBg4WdXJ49E6tC/O9+6mzEOxABWoKRR3ZiodlV7Ob+GlaOyvZ8PH4jrJfLoLP35Xpt4LvfbYdzH/SajFrnMPCn8tFl7itpfdx5U71Iv9ZlFIJkfNhhjK7yVilbebV0YH5SoFmfo7/hHFqdmrItKu6WtduSJUWKxg==;\n\t5:zqYTAe1vO/2G5cD8gen7bFZXczfeTzqjkNtohCzVP7/H7KWT2HsGkCZlsJ9TsY8QS7+kOd1kgbm0lr1ZgPxjZ8PMcljqrY0gLB9TK0Zjdn1KFnzq7Bh4Z5GuUbCv8K5IEhM3+QEOXSlr/5ZPQjfmMQ==;\n\t24:K7RxNLoE5iidihYWGJdY0ujNHkdg0Q5Q4amkHSqLN7WrOqzI6VFwntbPP/BVg/dBAFzh2ON7+dPz/ACV+OfEiy34iHYo7oD0iO6wgGjJlNw=;\n\t7:/fN5Jouuin1y3jbc0rzwYFpGFjfhayDC9634EUqQQGGTagayEXAOr/jb8kG3RZmb4GracQyk1JEuFpQyfUF4j6eunKy8F2gULzj1biEoU+MqB6jRw5qSrNl9+r/DXeXB64k2Hgl5TRGuF6vRILD3kZMY9wX+R3shw9GDt/XgtxPI+6j/hzMjFu6+vxU4yB56vy02Qod69kOt2zWh6oAhXbEStpKJL+dTUZ/wS6hYxdE="],"X-MS-TrafficTypeDiagnostic":"DB6PR0802MB2309:","X-LD-Processed":"f34e5979-57d9-4aaa-ad4d-b122a662184d,ExtAddr","NoDisclaimer":"True","X-Exchange-Antispam-Report-Test":"UriScan:(180628864354917);","X-Microsoft-Antispam-PRVS":"<DB6PR0802MB2309365454BABF530BB9E381FF920@DB6PR0802MB2309.eurprd08.prod.outlook.com>","X-Exchange-Antispam-Report-CFA-Test":"BCL:0; PCL:0;\n\tRULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(102415395)(6040450)(601004)(2401047)(5005006)(8121501046)(93006095)(93001095)(3002001)(100000703101)(100105400095)(10201501046)(6055026)(6041248)(20161123564025)(20161123555025)(20161123560025)(20161123558100)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123562025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);\n\tSRVR:DB6PR0802MB2309; BCL:0; PCL:0;\n\tRULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);\n\tSRVR:DB6PR0802MB2309; ","X-Forefront-PRVS":"0417A3FFD2","X-Forefront-Antispam-Report":"SFV:NSPM;\n\tSFS:(10009020)(4630300001)(7370300001)(6009001)(39860400002)(377424004)(189002)(53754006)(199003)(2476003)(5890100001)(3846002)(6116002)(1076002)(25786009)(54356999)(568964002)(5660300001)(72206003)(33656002)(7350300001)(50986999)(86362001)(4001350100001)(101416001)(6916009)(110136004)(478600001)(97736004)(189998001)(106356001)(105586002)(4326008)(2351001)(2361001)(8676002)(36756003)(55016002)(42186005)(7736002)(81166006)(81156014)(4610100001)(305945005)(21086003)(5000100001)(68736007)(66066001)(84326002)(83506001)(2906002)(53936002)(18370500001)(2700100001);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:DB6PR0802MB2309; H:arm.com;\n\tFPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; ","Received-SPF":"None (protection.outlook.com: arm.com does not designate\n\tpermitted sender hosts)","SpamDiagnosticOutput":"1:99","SpamDiagnosticMetadata":"NSPM","X-OriginatorOrg":"arm.com","X-MS-Exchange-CrossTenant-OriginalArrivalTime":"01 Sep 2017 13:33:46.8764\n\t(UTC)","X-MS-Exchange-CrossTenant-FromEntityHeader":"Hosted","X-MS-Exchange-Transport-CrossTenantHeadersStamped":"DB6PR0802MB2309","X-IsSubscribed":"yes"},"content":"Hi All,\n\nThis patch adds the instructions for Dot Product to ARM along\nwith the intrinsics and vectorizer pattern.\n\nArmv8.2-a dot product supports 8-bit element values both\nsigned and unsigned.\n\nDot product is available from Armv8.2-a and onwards.\n\nRegtested and bootstrapped on arm-none-eabi and no issues.\n\nOk for trunk?\n\ngcc/\n2017-09-01  Tamar Christina  <tamar.christina@arm.com>\n\n\t* config/arm/arm-builtins.c (arm_unsigned_uternop_qualifiers): New.\n\t(UTERNOP_QUALIFIERS, arm_umac_lane_qualifiers, UMAC_LANE_QUALIFIERS): New.\n\t* config/arm/arm_neon_builtins.def (sdot, udot, sdot_lane, udot_lane): new.\n\t* config/arm/iterators.md (DOTPROD, DOT_MODE, dot_mode): New.\n\t(UNSPEC_DOT_S, UNSPEC_DOT_U, opsuffix): New.\n\t* config/arm/neon.md (neon_<sup>dot<dot_mode>): New.\n\t(neon_<sup>dot_lane<dot_mode>, <sup>dot_prod<dot_mode>): New.\n\t* config/arm/types.md (neon_dot, neon_dot_q): New.\n\t* config/arm/unspecs.md (UNSPEC_DOT_S, UNSPEC_DOT_U): New.\n\n--","diff":"diff --git a/gcc/config/arm/arm-builtins.c b/gcc/config/arm/arm-builtins.c\nindex 7504ed581c63a657a0dff48442633704bd252b2e..467596c1dbefe62cc92a0ffb8a03ecaf950f3701 100644\n--- a/gcc/config/arm/arm-builtins.c\n+++ b/gcc/config/arm/arm-builtins.c\n@@ -105,6 +105,13 @@ arm_ternop_qualifiers[SIMD_MAX_BUILTIN_ARGS]\n   = { qualifier_none, qualifier_none, qualifier_none, qualifier_none };\n #define TERNOP_QUALIFIERS (arm_ternop_qualifiers)\n \n+/* unsigned T (unsigned T, unsigned T, unsigned T).  */\n+static enum arm_type_qualifiers\n+arm_unsigned_uternop_qualifiers[SIMD_MAX_BUILTIN_ARGS]\n+  = { qualifier_unsigned, qualifier_unsigned, qualifier_unsigned,\n+      qualifier_unsigned };\n+#define UTERNOP_QUALIFIERS (arm_unsigned_uternop_qualifiers)\n+\n /* T (T, immediate).  */\n static enum arm_type_qualifiers\n arm_binop_imm_qualifiers[SIMD_MAX_BUILTIN_ARGS]\n@@ -131,6 +138,13 @@ arm_mac_lane_qualifiers[SIMD_MAX_BUILTIN_ARGS]\n       qualifier_none, qualifier_lane_index };\n #define MAC_LANE_QUALIFIERS (arm_mac_lane_qualifiers)\n \n+/* unsigned T (unsigned T, unsigned T, unsigend T, lane index).  */\n+static enum arm_type_qualifiers\n+arm_umac_lane_qualifiers[SIMD_MAX_BUILTIN_ARGS]\n+  = { qualifier_unsigned, qualifier_unsigned, qualifier_unsigned,\n+      qualifier_unsigned, qualifier_lane_index };\n+#define UMAC_LANE_QUALIFIERS (arm_umac_lane_qualifiers)\n+\n /* T (T, T, immediate).  */\n static enum arm_type_qualifiers\n arm_ternop_imm_qualifiers[SIMD_MAX_BUILTIN_ARGS]\ndiff --git a/gcc/config/arm/arm_neon_builtins.def b/gcc/config/arm/arm_neon_builtins.def\nindex 07f0368343a0c940c1cc1848d31f28a47a587b6f..982eec810dafb5ec955273099853f8842020d104 100644\n--- a/gcc/config/arm/arm_neon_builtins.def\n+++ b/gcc/config/arm/arm_neon_builtins.def\n@@ -331,3 +331,7 @@ VAR11 (STORE1, vst4,\n \tv8qi, v4hi, v4hf, v2si, v2sf, di, v16qi, v8hi, v8hf, v4si, v4sf)\n VAR9 (STORE1LANE, vst4_lane,\n \tv8qi, v4hi, v4hf, v2si, v2sf, v8hi, v8hf, v4si, v4sf)\n+VAR2 (TERNOP, sdot, v8qi, v16qi)\n+VAR2 (UTERNOP, udot, v8qi, v16qi)\n+VAR2 (MAC_LANE, sdot_lane, v8qi, v16qi)\n+VAR2 (UMAC_LANE, udot_lane, v8qi, v16qi)\ndiff --git a/gcc/config/arm/iterators.md b/gcc/config/arm/iterators.md\nindex 7acbaf1bb40a4f270e75968804546508f7839e49..139e09fd929e17216ad9383505f1453a73d071fb 100644\n--- a/gcc/config/arm/iterators.md\n+++ b/gcc/config/arm/iterators.md\n@@ -410,6 +410,8 @@\n \n (define_int_iterator VFM_LANE_AS [UNSPEC_VFMA_LANE UNSPEC_VFMS_LANE])\n \n+(define_int_iterator DOTPROD [UNSPEC_DOT_S UNSPEC_DOT_U])\n+\n ;;----------------------------------------------------------------------------\n ;; Mode attributes\n ;;----------------------------------------------------------------------------\n@@ -720,6 +722,10 @@\n \n (define_mode_attr pf [(V8QI \"p\") (V16QI \"p\") (V2SF \"f\") (V4SF \"f\")])\n \n+;; Mapping attribute for Dot Product input modes based on result mode.\n+(define_mode_attr DOT_MODE [(V2SI \"V8QI\") (V4SI \"V16QI\")])\n+(define_mode_attr dot_mode [(V2SI \"v8qi\") (V4SI \"v16qi\")])\n+\n ;;----------------------------------------------------------------------------\n ;; Code attributes\n ;;----------------------------------------------------------------------------\n@@ -816,6 +822,7 @@\n   (UNSPEC_VSRA_S_N \"s\") (UNSPEC_VSRA_U_N \"u\")\n   (UNSPEC_VRSRA_S_N \"s\") (UNSPEC_VRSRA_U_N \"u\")\n   (UNSPEC_VCVTH_S \"s\") (UNSPEC_VCVTH_U \"u\")\n+  (UNSPEC_DOT_S \"s\") (UNSPEC_DOT_U \"u\")\n ])\n \n (define_int_attr vcvth_op\n@@ -1003,3 +1010,6 @@\n \n (define_int_attr mrrc [(VUNSPEC_MRRC \"mrrc\") (VUNSPEC_MRRC2 \"mrrc2\")])\n (define_int_attr MRRC [(VUNSPEC_MRRC \"MRRC\") (VUNSPEC_MRRC2 \"MRRC2\")])\n+\n+(define_int_attr opsuffix [(UNSPEC_DOT_S \"s8\")\n+\t\t\t   (UNSPEC_DOT_U \"u8\")])\ndiff --git a/gcc/config/arm/neon.md b/gcc/config/arm/neon.md\nindex 45b3bd18052dd4a33e4b9c10f3ca2ea7e2eed5ce..4c919f53757ada3ca40609b8244ed3b403be3329 100644\n--- a/gcc/config/arm/neon.md\n+++ b/gcc/config/arm/neon.md\n@@ -3044,6 +3044,71 @@\n   DONE;\n })\n \n+;; These instructions map to the __builtins for the Dot Product operations.\n+(define_insn \"neon_<sup>dot<dot_mode>\"\n+  [(set (match_operand:VCVTI 0 \"register_operand\" \"=w\")\n+\t(unspec:VCVTI [(match_operand:VCVTI 1 \"register_operand\" \"0\")\n+\t\t       (match_operand:<DOT_MODE> 2 \"register_operand\" \"w\")\n+\t\t       (match_operand:<DOT_MODE> 3 \"register_operand\" \"w\")]\n+\t\tDOTPROD))]\n+  \"TARGET_DOTPROD\"\n+  \"v<sup>dot.<opsuffix>\\\\t%<V_reg>0, %<V_reg>2, %<V_reg>3\"\n+  [(set_attr \"type\" \"neon_dot\")]\n+)\n+\n+;; These instructions map to the __builtins for the Dot Product\n+;; indexed operations.\n+(define_insn \"neon_<sup>dot_lane<dot_mode>\"\n+  [(set (match_operand:VCVTI 0 \"register_operand\" \"=w\")\n+\t(unspec:VCVTI [(match_operand:VCVTI 1 \"register_operand\" \"0\")\n+\t\t       (match_operand:<DOT_MODE> 2 \"register_operand\" \"w\")\n+\t\t       (match_operand:V8QI 3 \"register_operand\" \"t\")\n+\t\t       (match_operand:SI 4 \"immediate_operand\" \"i\")]\n+\t\tDOTPROD))]\n+  \"TARGET_DOTPROD\"\n+  {\n+    operands[4]\n+      = GEN_INT (NEON_ENDIAN_LANE_N (V8QImode, INTVAL (operands[4])));\n+    return \"v<sup>dot.<opsuffix>\\\\t%<V_reg>0, %<V_reg>2, %P3[%c4]\";\n+  }\n+  [(set_attr \"type\" \"neon_dot\")]\n+)\n+\n+;; These expands map to the Dot Product optab the vectorizer checks for.\n+;; The auto-vectorizer expects a dot product builtin that also does an\n+;; accumulation into the provided register.\n+;; Given the following pattern\n+;;\n+;; for (i=0; i<len; i++) {\n+;;     c = a[i] * b[i];\n+;;     r += c;\n+;; }\n+;; return result;\n+;;\n+;; This can be auto-vectorized to\n+;; r  = a[0]*b[0] + a[1]*b[1] + a[2]*b[2] + a[3]*b[3];\n+;;\n+;; given enough iterations.  However the vectorizer can keep unrolling the loop\n+;; r += a[4]*b[4] + a[5]*b[5] + a[6]*b[6] + a[7]*b[7];\n+;; r += a[8]*b[8] + a[9]*b[9] + a[10]*b[10] + a[11]*b[11];\n+;; ...\n+;;\n+;; and so the vectorizer provides r, in which the result has to be accumulated.\n+(define_expand \"<sup>dot_prod<dot_mode>\"\n+  [(set (match_operand:VCVTI 0 \"register_operand\")\n+\t(unspec:VCVTI [(match_operand:<DOT_MODE> 1 \"register_operand\")\n+\t\t       (match_operand:<DOT_MODE> 2 \"register_operand\")\n+\t\t       (match_operand:VCVTI 3 \"register_operand\")]\n+\t\tDOTPROD))]\n+  \"TARGET_DOTPROD\"\n+{\n+  emit_insn (\n+    gen_neon_<sup>dot<dot_mode> (operands[3], operands[3], operands[1],\n+\t\t\t\t operands[2]));\n+  emit_insn (gen_rtx_SET (operands[0], operands[3]));\n+  DONE;\n+})\n+\n (define_expand \"neon_copysignf<mode>\"\n   [(match_operand:VCVTF 0 \"register_operand\")\n    (match_operand:VCVTF 1 \"register_operand\")\ndiff --git a/gcc/config/arm/types.md b/gcc/config/arm/types.md\nindex 253f4968d12a09fe69f3a0d82f896115b0a92c47..27398dffd9e71ee851d5d2ed5759d7c8a85df320 100644\n--- a/gcc/config/arm/types.md\n+++ b/gcc/config/arm/types.md\n@@ -316,6 +316,8 @@\n ; neon_cls_q\n ; neon_cnt\n ; neon_cnt_q\n+; neon_dot\n+; neon_dot_q\n ; neon_ext\n ; neon_ext_q\n ; neon_rbit\n@@ -764,6 +766,8 @@\n \\\n   neon_abs,\\\n   neon_abs_q,\\\n+  neon_dot,\\\n+  neon_dot_q,\\\n   neon_neg,\\\n   neon_neg_q,\\\n   neon_qneg,\\\n@@ -1110,8 +1114,8 @@\n           neon_sub, neon_sub_q, neon_sub_widen, neon_sub_long, neon_qsub,\\\n           neon_qsub_q, neon_sub_halve, neon_sub_halve_q,\\\n           neon_sub_halve_narrow_q,\\\n-          neon_abs, neon_abs_q, neon_neg, neon_neg_q, neon_qneg,\\\n-          neon_qneg_q, neon_qabs, neon_qabs_q, neon_abd, neon_abd_q,\\\n+\t  neon_abs, neon_abs_q, neon_dot, neon_dot_q, neon_neg, neon_neg_q,\\\n+\t  neon_qneg, neon_qneg_q, neon_qabs, neon_qabs_q, neon_abd, neon_abd_q,\\\n           neon_abd_long, neon_minmax, neon_minmax_q, neon_compare,\\\n           neon_compare_q, neon_compare_zero, neon_compare_zero_q,\\\n           neon_arith_acc, neon_arith_acc_q, neon_reduc_add,\\\ndiff --git a/gcc/config/arm/unspecs.md b/gcc/config/arm/unspecs.md\nindex 99cfa41b08dad24a85e78f069331e83c03c8bce1..c474f4bb5db995b60f464f098e478f0398ce15f9 100644\n--- a/gcc/config/arm/unspecs.md\n+++ b/gcc/config/arm/unspecs.md\n@@ -410,4 +410,6 @@\n   UNSPEC_VRNDN\n   UNSPEC_VRNDP\n   UNSPEC_VRNDX\n+  UNSPEC_DOT_S\n+  UNSPEC_DOT_U\n ])\n\n","prefixes":["ARM"]}