From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR04-DB3-obe.outbound.protection.outlook.com (mail-db3eur04on2045.outbound.protection.outlook.com [40.107.6.45]) by sourceware.org (Postfix) with ESMTPS id 785063858291 for ; Sun, 25 Feb 2024 09:01:54 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 785063858291 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=arm.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 785063858291 Authentication-Results: server2.sourceware.org; arc=pass smtp.remote-ip=40.107.6.45 ARC-Seal: i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1708851722; cv=pass; b=vN1YUnfEhk0f2RFH3c5Gy9V/jfTzdo9+Gsg8+X4dqs9B1fg9hRbewc96KAr+w4Fob9juVlstLQaIdeHuJXTY906Fm4MLuSronnTw5b9/cK7sbkgdHN9ubr07qmkG150/7SO+iVU1K6gsp6Q/2u1mdHbV5I40MpGIssb18MvQ2Ws= ARC-Message-Signature: i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1708851722; c=relaxed/simple; bh=fJOzxatQYuAvNjJPBi6TxsbSVXQz9/6ZqdG0LcSm33U=; h=DKIM-Signature:DKIM-Signature:From:To:Subject:Date:Message-ID: MIME-Version; b=ZoGxpndlCZzxnszUa2JASV3FXXclUg4w8UjTeTvvf7GNMkQBKOZfsMzSrez471UrM7scEMMayZi+E7JN1/S14E3VUMzgcinF4gfSvMe8G1Y7jTBfBiqiku5eYRp0QNVKVvt4VFUOOnDf5zdC/Kq5paap9F41GNgf/zyi4SmThzE= ARC-Authentication-Results: i=3; server2.sourceware.org ARC-Seal: i=2; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=pass; b=cY28VIBqb59L5lkxrqTX/ApLpsEklcOfdsBX2LonMRNIr5f3MeCZJn6sUWPTqxPhqK7sFqPjFosiX+e4XINKZfQh5y2+guNTMqVGFL3mcylFuE9ic9VyNCkb0TwOq8JPY9kVWFxC8+1JdyiqORi4zP7vfmSTUng+9e4DSjCc6AN1IvsJ3NC3QOjsMkIYqeYh84DUr5tNvRkQc//OpkoAzeFzK6JB8eVEun4Zqd4N0ahsmR6l7U1eV4wIM+LLyX022axrfYB5QUKU8b0Sd2ZOCDA42tRVVuIrwjilcAeZ/LyYykIhHLilld9UK8sxGMSPlkOSHf1+QNCF2f2vhOiHZg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=oRnGaz3JGTo4vI7uHpZIP8uOsYf/kXzn0I5qH0C2VuU=; b=br1qLld7ivIlag0bYkWxviEsvO34vUhotncPHo/Bl18qdTSUuhTqC8db2qG0Vjz7yHIMwp4b1t4pBEBkZqvpwsnQYrk/XQbA3pxwrrxyvmJDnDgZ2lceoouZkCfETpp3J5HbXAsQJIWbx9jdoQ8N0FlHHSSus+zH4d1kpsLCWvCzQ3fCLH3UkSQpwsYcr+BcsWX5MoHbAaFSU4gQVqWh9Sl/7QoZC3W9+0pMth/p6FWrL4pp3EgxmfQQZG86vr+StU/7dY22S24PLMxioU2gU/3WziHu0fTYElEsw9f+rq2Z04nr5hE7zCvXlVaYDoq8ozpceY7RDoMY6GfqdmkhIg== ARC-Authentication-Results: i=2; mx.microsoft.com 1; spf=pass (sender ip is 63.35.35.123) smtp.rcpttodomain=gcc.gnu.org smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com; arc=pass (0 oda=1 ltdi=1 spf=[1,1,smtp.mailfrom=arm.com] dkim=[1,1,header.d=arm.com] dmarc=[1,1,header.from=arm.com]) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=oRnGaz3JGTo4vI7uHpZIP8uOsYf/kXzn0I5qH0C2VuU=; b=aKgTV/nISesc0MTMZ46nzZR4BiN6rVVi76Ekl4RjUw24xa0eTpxlt/5tKvkRWh9UklUMBHrHKQBaNcRXlFeUbM2GDztrfMjaZ8dHBaDra/rG0E0dbT85THwaQenQrUufJ6OmtITX4zxeBzT84FcK4V7JVKE8z0GMCykfBKygBFk= Received: from DU2P251CA0008.EURP251.PROD.OUTLOOK.COM (2603:10a6:10:230::10) by AS8PR08MB8922.eurprd08.prod.outlook.com (2603:10a6:20b:5b4::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7316.33; Sun, 25 Feb 2024 09:01:50 +0000 Received: from DU6PEPF0000A7E3.eurprd02.prod.outlook.com (2603:10a6:10:230:cafe::84) by DU2P251CA0008.outlook.office365.com (2603:10a6:10:230::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7292.49 via Frontend Transport; Sun, 25 Feb 2024 09:01:50 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com; pr=C Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by DU6PEPF0000A7E3.mail.protection.outlook.com (10.167.8.41) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7292.25 via Frontend Transport; Sun, 25 Feb 2024 09:01:50 +0000 Received: ("Tessian outbound a6e56d06a0e4:v228"); Sun, 25 Feb 2024 09:01:49 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 473e1c8a1efe4779 X-CR-MTA-TID: 64aa7808 Received: from ab6d2c3ea1fb.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 9DA8E411-861D-4F76-854D-A61C4DCE9DAE.1; Sun, 25 Feb 2024 09:01:43 +0000 Received: from EUR03-DBA-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id ab6d2c3ea1fb.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Sun, 25 Feb 2024 09:01:43 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=iShgviz++xeN/6c36ChRunbShZRIWMvZXKrsgHyd9as3rvhU9gTkd23bxit21MIaIQSqcrbaI4Tkf2tba8hITuA1SHCdz+Pf4iXaiACK+W/iQP2xNXT/gacrROd4VOdRAdqVdSf2KTlHbB3xNeyvImG77AXdr62kb9TW3ZLM+Lw7v0AzjdhPgc2zlxhN9gc2BxqRRNHfG9K8LXHmsdG8FHNFxW5lpXQli2KR0lRp9GAWWmQPRc77dCCi4jClyyx/t/f4dAgybqyxsBKJ856/SjDvgDaznb45I3fLR37ypr3gdQSF1V4JuxjTVbu0sS0VUmglB9INB2qUkLOiD/ywcw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=oRnGaz3JGTo4vI7uHpZIP8uOsYf/kXzn0I5qH0C2VuU=; b=Ha4uUA5TrGQdxPChiIATzs00hwV99wl1tL7FY8fhXX45xMnhCbUoKGw6UcF+H2Owtcx4OHmTdM7KserKb6QkU5JyJXTRhm3Olx/AgFIoyTmX251hJb3UEXNIulmo/ozGpI00bK3Zz534MyRbHNjgtvJ9lZV87sS/mykUvnSowsEehUzbQF+LX8KIbXWhgpQcj83GvZuBbjqtAteL3NDwKGKPoWnoySb1e6Fx5eLogNsnUtugV+1GgI+Ivp9V5EjzeF2iRCf/2wFA9WM/ociuvZLzh0WR0HYctcmjDdvOvoWiZk0BDDuf70XNNhgFXZlNX8n0K7dxkV9p3cPG+orYwA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=oRnGaz3JGTo4vI7uHpZIP8uOsYf/kXzn0I5qH0C2VuU=; b=aKgTV/nISesc0MTMZ46nzZR4BiN6rVVi76Ekl4RjUw24xa0eTpxlt/5tKvkRWh9UklUMBHrHKQBaNcRXlFeUbM2GDztrfMjaZ8dHBaDra/rG0E0dbT85THwaQenQrUufJ6OmtITX4zxeBzT84FcK4V7JVKE8z0GMCykfBKygBFk= Received: from VI1PR08MB5325.eurprd08.prod.outlook.com (2603:10a6:803:13e::17) by GVXPR08MB10406.eurprd08.prod.outlook.com (2603:10a6:150:15a::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7316.31; Sun, 25 Feb 2024 09:01:37 +0000 Received: from VI1PR08MB5325.eurprd08.prod.outlook.com ([fe80::810c:8495:3f0a:ef8]) by VI1PR08MB5325.eurprd08.prod.outlook.com ([fe80::810c:8495:3f0a:ef8%7]) with mapi id 15.20.7316.032; Sun, 25 Feb 2024 09:01:37 +0000 From: Tamar Christina To: "pan2.li@intel.com" , "gcc-patches@gcc.gnu.org" CC: "juzhe.zhong@rivai.ai" , "yanzhang.wang@intel.com" , "kito.cheng@gmail.com" , "richard.guenther@gmail.com" , "richard.sandiford@arm.com2" , "jeffreyalaw@gmail.com" Subject: RE: [PATCH v2] Draft|Internal-fn: Introduce internal fn saturation US_PLUS Thread-Topic: [PATCH v2] Draft|Internal-fn: Introduce internal fn saturation US_PLUS Thread-Index: AQHaZxJ7y4BlybYK0EeJoFCxSVqTfLEav4yQ Date: Sun, 25 Feb 2024 09:01:37 +0000 Message-ID: References: <20240217103029.3120318-1-pan2.li@intel.com> <20240224111229.1536064-1-pan2.li@intel.com> In-Reply-To: <20240224111229.1536064-1-pan2.li@intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; x-ms-traffictypediagnostic: VI1PR08MB5325:EE_|GVXPR08MB10406:EE_|DU6PEPF0000A7E3:EE_|AS8PR08MB8922:EE_ X-MS-Office365-Filtering-Correlation-Id: 88e5c232-0414-4697-251b-08dc35e06786 x-checkrecipientrouted: true nodisclaimer: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: iKqTDQi0anLyXFdKk2c5qouqNtWg4mshbhmXXErQtxEMo9C28tpBf6wi9Uez0LltquH4Lll1XMsJKbw8o8lVVZUTsBC6goKPl0ps4ZVjapswo63Xe7ZPLiBnrB+VFhBaG3uN7kWBWjdGAJDvFhCmROGdAAOBejh/t3QwozsODiGLoRe0IvZbMVdZlj+6P+5Eib6BLKydP2S9X9is8x3yp8XPZzNNLI9noe97/a304Q+2EiQ85DTSOq1JhLfltkgYsMXnyGtGY0WCo8qubw0DeDUTizFAjwEwWyFbjh2GNHUL4DX2AqQI7KxOeUe5yNm+/R7DXRRz1OSDzvs46tDVZzgclsGrl/OaEa8L8OA0AGnDxVlbxHOyfG2RsgCrGa9esEvuBl9DgJWQ3M0B8XNYQDzJYHLRKdgD2OoTtFnJGuOePxpSRf06D7MfOi8knpPGxFLMqnOWyOjmQlsX86DZ0L1Rb/R6A001iERY+fG2NP9z4xX5mObO8nYsa/UF4pf/mJiU0kf2XAJchJbHFZALWl/5hmHkRyDAvqJ/XmWg/pn9XNLF3gqoZIoBRnDACDWw7GSSq6GbNCfBaCxHTFhu5eA3ZtgF4g7wr9r5z0E4dUGxfiDiwNk+CHtNQ/KwvEcl X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VI1PR08MB5325.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(230273577357003)(38070700009);DIR:OUT;SFP:1101; Content-Type: multipart/mixed; boundary="_002_VI1PR08MB53258DDFDC4E814EEECDD3CCFF5B2VI1PR08MB5325eurp_" MIME-Version: 1.0 X-MS-Exchange-Transport-CrossTenantHeadersStamped: GVXPR08MB10406 Original-Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: DU6PEPF0000A7E3.eurprd02.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 6aafeb81-8fd8-4c16-5c9e-08dc35e05fc2 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 5UI/0bJ9iHu65btIHj4rTfmCsh7Z2V6NQ2rR3J1GXahXFbut5wPLn2Z4z4StWC/yPfQ3x6HP4PAwQoomvE/QSMmIajmgb3gXWkr3qEHkM/oXIioSDaLi2Dr9NJT6S7VUkLYLy7PwKsiUWG+hVGozM+j06Mm/yape9AcKtgr9q+vRClTJwzF9CG7YoZ38h2WjKqF3cx8iY6t30kKQr7v97cZARmy7mzdnc/O5gSR0qbaoE1rOh2xW478KrZEmconPnpijvVTGSceSI30Wme4/uORhtjtANUmlik/JECPhQTfzO4F11hBXRFTJx5Z4vBO8Qo8X2nt+bMkwXOr76xMUIZurS6onjcg1yD0k2dv9wRXqYP0ujuzGgYzDD6jlEKP5tUd5ILHgBMFOSgrTCmdBWGMZQaOVS+lfJbeJ2prjhcXtnYQMHINhV5T6O18Jr1F17hiaLllje/apReeA2RowlVBpvW8swiadtbxmY/4p6o7s/4silqPGXDec1VZH4eLZv/WVkxWgFRc2/FS50dJnSW/kv+jNHC44Vj06vWziscUouI2zLXKVUYuzjJnDB7e74+Jpk6d8VZU4fsx1RV6B84RgA8AgQrBeJZi2h7RB6soOUQhkrkG4yNr9WgmCxbJhvoQs2DI1tdYEbwCFwLeaWN5+lf4LxwQiqUS6GZzUIoM= X-Forefront-Antispam-Report: CIP:63.35.35.123;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:64aa7808-outbound-1.mta.getcheckrecipient.com;PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com;CAT:NONE;SFS:(13230031)(230273577357003)(36860700004)(46966006);DIR:OUT;SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Feb 2024 09:01:50.0871 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 88e5c232-0414-4697-251b-08dc35e06786 X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d;Ip=[63.35.35.123];Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-AuthSource: DU6PEPF0000A7E3.eurprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR08MB8922 X-Spam-Status: No, score=-10.6 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,FORGED_SPF_HELO,GIT_PATCH_0,KAM_DMARC_NONE,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,SPF_NONE,TXREP,T_SCC_BODY_TEXT_LINE,UNPARSEABLE_RELAY,URIBL_BLACK 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: --_002_VI1PR08MB53258DDFDC4E814EEECDD3CCFF5B2VI1PR08MB5325eurp_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hi Pan, > From: Pan Li >=20 > Hi Richard & Tamar, >=20 > Try the DEF_INTERNAL_INT_EXT_FN as your suggestion. By mapping > us_plus$a3 to the RTL representation (us_plus:m x y) in optabs.def. > And then expand_US_PLUS in internal-fn.cc. Not very sure if my > understanding is correct for DEF_INTERNAL_INT_EXT_FN. >=20 > I am not sure if we still need DEF_INTERNAL_SIGNED_OPTAB_FN here, given > the RTL representation has (ss_plus:m x y) and (us_plus:m x y) already. >=20 I think a couple of things are being confused here. So lets break it down: The reason for DEF_INTERNAL_SIGNED_OPTAB_FN is because in GIMPLE we only want one internal function for both signed and unsigned SAT_ADD. with this definition we don't need SAT_UADD and SAT_SADD but instead we will only have SAT_ADD, which will expand to us_plus or ss_plus. Now the downside of this is that this is a direct internal optab. This mea= ns that for the representation to be used the target *must* have the optab implemented. This is a bit annoying because it doesn't allow us to generi= cally assume that all targets use SAT_ADD for saturating add and thus only have t= o write optimization for this representation. This is why Richi said we may need to use a new tree_code because we can override tree code expansions. However the same can be done with the _EXT_= FN internal functions. So what I meant was that we want to have a combination of the two. i.e. a DEF_INTERNAL_SIGNED_OPTAB_EXT_FN. If Richi agrees, the below is what I meant. It creates the infrastructure f= or this and for now only allows a default fallback for unsigned saturating add and = makes it easier for us to add the rest later Also, unless I'm wrong (and Richi can correct me here), us_plus and ss_plus= are the RTL expression, but the optab for saturation are ssadd and usadd. So you d= on't need to make new us_plus and ss_plus ones. diff --git a/gcc/internal-fn.cc b/gcc/internal-fn.cc index a07f25f3aee..aaf9f8991b3 100644 --- a/gcc/internal-fn.cc +++ b/gcc/internal-fn.cc @@ -4103,6 +4103,17 @@ direct_internal_fn_supported_p (internal_fn fn, tree= _pair types, return direct_##TYPE##_optab_supported_p (which_optab, types, \ opt_type); \ } +#define DEF_INTERNAL_SIGNED_OPTAB_EXT_FN(CODE, FLAGS, SELECTOR, SIGNED_OPT= AB, \ + UNSIGNED_OPTAB, TYPE) \ + case IFN_##CODE: \ + { \ + optab which_optab =3D (TYPE_UNSIGNED (types.SELECTOR) \ + ? UNSIGNED_OPTAB ## _optab \ + : SIGNED_OPTAB ## _optab); \ + return direct_##TYPE##_optab_supported_p (which_optab, types, \ + opt_type) \ + || internal_##CODE##_fn_supported_p (types.SELECTOR, opt_type); \ + } #include "internal-fn.def" =20 case IFN_LAST: @@ -4303,6 +4314,8 @@ set_edom_supported_p (void) optab which_optab =3D direct_internal_fn_optab (fn, types); \ expand_##TYPE##_optab_fn (fn, stmt, which_optab); \ } +#define DEF_INTERNAL_SIGNED_OPTAB_EXT_FN(CODE, FLAGS, SELECTOR, SIGNED_OPT= AB, \ + UNSIGNED_OPTAB, TYPE) #include "internal-fn.def" =20 /* Routines to expand each internal function, indexed by function number. @@ -5177,3 +5190,45 @@ expand_POPCOUNT (internal_fn fn, gcall *stmt) emit_move_insn (plhs, cmp); } } + +void +expand_SAT_ADD (internal_fn fn, gcall *stmt) +{ + /* Check if the target supports the expansion through an IFN. */ + tree_pair types =3D direct_internal_fn_types (fn, stmt); + optab which_optab =3D direct_internal_fn_optab (fn, types); + if (direct_binary_optab_supported_p (which_optab, types, + insn_optimization_type ())) + { + expand_binary_optab_fn (fn, stmt, which_optab); + return; + } + + /* Target does not support the optab, but we can de-compose it. */ + /* + ... decompose to a canonical representation ... + if (TYPE_UNSIGNED (types.SELECTOR)) + { + ... + decompose back to (X + Y) | - ((X + Y) < X) + } + else + { + ... + } + */ +} + +bool internal_SAT_ADD_fn_supported_p (tree type, optimization_type /* opty= pe */) +{ + /* For now, don't support decomposing vector ops. */ + if (VECTOR_TYPE_P (type)) + return false; + + /* Signed saturating arithmetic is harder to do since we'll so for now + lets ignore. */ + if (!TYPE_UNSIGNED (type)) + return false; + + return TREE_CODE (type) =3D=3D INTEGER_TYPE; +} \ No newline at end of file diff --git a/gcc/internal-fn.def b/gcc/internal-fn.def index c14d30365c1..5a2491228d5 100644 --- a/gcc/internal-fn.def +++ b/gcc/internal-fn.def @@ -92,6 +92,10 @@ along with GCC; see the file COPYING3. If not see unsigned inputs respectively, both without the trailing "_optab". SELECTOR says which type in the tree_pair determines the signedness. =20 + DEF_INTERNAL_SIGNED_OPTAB_EXT_FN is like DEF_INTERNAL_SIGNED_OPTAB_FN, = except + that it has expand_##NAME defined in internal-fn.cc to override the + DEF_INTERNAL_SIGNED_OPTAB_FN expansion behavior. + DEF_INTERNAL_FLT_FN is like DEF_INTERNAL_OPTAB_FN, but in addition, the function implements the computational part of a built-in math function BUILT_IN_{F,,L}. Unlike some built-in functions, @@ -153,6 +157,13 @@ along with GCC; see the file COPYING3. If not see DEF_INTERNAL_FN (NAME, FLAGS | ECF_LEAF, NULL) #endif =20 +#ifndef DEF_INTERNAL_SIGNED_OPTAB_EXT_FN +#define DEF_INTERNAL_SIGNED_OPTAB_EXT_FN(NAME, FLAGS, SELECTOR, SIGNED_OPT= AB, \ + UNSIGNED_OPTAB, TYPE) \ + DEF_INTERNAL_SIGNED_OPTAB_FN (NAME, FLAGS, SELECTOR, SIGNED_OPTAB, \ + UNSIGNED_OPTAB, TYPE) +#endif + #ifndef DEF_INTERNAL_FLT_FN #define DEF_INTERNAL_FLT_FN(NAME, FLAGS, OPTAB, TYPE) \ DEF_INTERNAL_OPTAB_FN (NAME, FLAGS, OPTAB, TYPE) @@ -274,6 +285,8 @@ DEF_INTERNAL_SIGNED_OPTAB_FN (MULHS, ECF_CONST | ECF_NO= THROW, first, smulhs, umulhs, binary) DEF_INTERNAL_SIGNED_OPTAB_FN (MULHRS, ECF_CONST | ECF_NOTHROW, first, smulhrs, umulhrs, binary) +DEF_INTERNAL_SIGNED_OPTAB_EXT_FN (SAT_ADD, ECF_CONST | ECF_NOTHROW, first, + ssadd, usadd, binary) =20 DEF_INTERNAL_COND_FN (ADD, ECF_CONST, add, binary) DEF_INTERNAL_COND_FN (SUB, ECF_CONST, sub, binary) @@ -593,5 +606,6 @@ DEF_INTERNAL_FN (BITINTTOFLOAT, ECF_PURE | ECF_LEAF, ".= R . ") #undef DEF_INTERNAL_FLT_FN #undef DEF_INTERNAL_FLT_FLOATN_FN #undef DEF_INTERNAL_SIGNED_OPTAB_FN +#undef DEF_INTERNAL_SIGNED_OPTAB_EXT_FN #undef DEF_INTERNAL_OPTAB_FN #undef DEF_INTERNAL_FN diff --git a/gcc/internal-fn.h b/gcc/internal-fn.h index bccee1c3e09..dbdb1e6bad2 100644 --- a/gcc/internal-fn.h +++ b/gcc/internal-fn.h @@ -263,6 +263,8 @@ extern void expand_DIVMODBITINT (internal_fn, gcall *); extern void expand_FLOATTOBITINT (internal_fn, gcall *); extern void expand_BITINTTOFLOAT (internal_fn, gcall *); extern void expand_POPCOUNT (internal_fn, gcall *); +extern void expand_SAT_ADD (internal_fn, gcall *); +extern bool internal_SAT_ADD_fn_supported_p (tree, optimization_type); =20 extern bool vectorized_internal_fn_supported_p (internal_fn, tree); > Note this patch is a draft for validation, no test are invovled here. >=20 > gcc/ChangeLog: >=20 > * builtins.def (BUILT_IN_US_PLUS): Add builtin def. > (BUILT_IN_US_PLUSIMAX): Ditto. > (BUILT_IN_US_PLUSL): Ditto. > (BUILT_IN_US_PLUSLL): Ditto. > (BUILT_IN_US_PLUSG): Ditto. > * config/riscv/riscv-protos.h (riscv_expand_us_plus): Add new > func decl for expanding us_plus. > * config/riscv/riscv.cc (riscv_expand_us_plus): Add new func > impl for expanding us_plus. > * config/riscv/riscv.md (us_plus3): Add new pattern impl > us_plus3. > * internal-fn.cc (expand_US_PLUS): Add new func impl to expand > US_PLUS. > * internal-fn.def (US_PLUS): Add new INT_EXT_FN. > * internal-fn.h (expand_US_PLUS): Add new func decl. > * match.pd: Add new simplify pattern for us_plus. > * optabs.def (OPTAB_NL): Add new OPTAB_NL to US_PLUS rtl. >=20 > Signed-off-by: Pan Li > --- > gcc/builtins.def | 7 +++++ > gcc/config/riscv/riscv-protos.h | 1 + > gcc/config/riscv/riscv.cc | 46 +++++++++++++++++++++++++++++++++ > gcc/config/riscv/riscv.md | 11 ++++++++ > gcc/internal-fn.cc | 26 +++++++++++++++++++ > gcc/internal-fn.def | 3 +++ > gcc/internal-fn.h | 1 + > gcc/match.pd | 17 ++++++++++++ > gcc/optabs.def | 2 ++ > 9 files changed, 114 insertions(+) >=20 > diff --git a/gcc/builtins.def b/gcc/builtins.def > index f6f3e104f6a..0777b912cfa 100644 > --- a/gcc/builtins.def > +++ b/gcc/builtins.def > @@ -1055,6 +1055,13 @@ DEF_GCC_BUILTIN (BUILT_IN_POPCOUNTIMAX, > "popcountimax", BT_FN_INT_UINTMAX > DEF_GCC_BUILTIN (BUILT_IN_POPCOUNTL, "popcountl", BT_FN_INT_ULONG= , > ATTR_CONST_NOTHROW_LEAF_LIST) > DEF_GCC_BUILTIN (BUILT_IN_POPCOUNTLL, "popcountll", > BT_FN_INT_ULONGLONG, ATTR_CONST_NOTHROW_LEAF_LIST) > DEF_GCC_BUILTIN (BUILT_IN_POPCOUNTG, "popcountg", BT_FN_INT_VAR, > ATTR_CONST_NOTHROW_TYPEGENERIC_LEAF) > + > +DEF_GCC_BUILTIN (BUILT_IN_US_PLUS, "us_plus", BT_FN_INT_UINT, > ATTR_CONST_NOTHROW_LEAF_LIST) > +DEF_GCC_BUILTIN (BUILT_IN_US_PLUSIMAX, "us_plusimax", > BT_FN_INT_UINTMAX, ATTR_CONST_NOTHROW_LEAF_LIST) > +DEF_GCC_BUILTIN (BUILT_IN_US_PLUSL, "us_plusl", BT_FN_INT_ULONG, > ATTR_CONST_NOTHROW_LEAF_LIST) > +DEF_GCC_BUILTIN (BUILT_IN_US_PLUSLL, "us_plusll", > BT_FN_INT_ULONGLONG, ATTR_CONST_NOTHROW_LEAF_LIST) > +DEF_GCC_BUILTIN (BUILT_IN_US_PLUSG, "us_plusg", BT_FN_INT_VAR, > ATTR_CONST_NOTHROW_TYPEGENERIC_LEAF) > + > DEF_EXT_LIB_BUILTIN (BUILT_IN_POSIX_MEMALIGN, "posix_memalign", > BT_FN_INT_PTRPTR_SIZE_SIZE, ATTR_NOTHROW_NONNULL_LEAF) > DEF_GCC_BUILTIN (BUILT_IN_PREFETCH, "prefetch", > BT_FN_VOID_CONST_PTR_VAR, ATTR_NOVOPS_LEAF_LIST) > DEF_LIB_BUILTIN (BUILT_IN_REALLOC, "realloc", BT_FN_PTR_PTR_SIZE, > ATTR_ALLOC_WARN_UNUSED_RESULT_SIZE_2_NOTHROW_LEAF_LIST) > diff --git a/gcc/config/riscv/riscv-protos.h b/gcc/config/riscv/riscv-pro= tos.h > index 80efdf2b7e5..ba6086f1f25 100644 > --- a/gcc/config/riscv/riscv-protos.h > +++ b/gcc/config/riscv/riscv-protos.h > @@ -132,6 +132,7 @@ extern void riscv_asm_output_external (FILE *, const = tree, > const char *); > extern bool > riscv_zcmp_valid_stack_adj_bytes_p (HOST_WIDE_INT, int); > extern void riscv_legitimize_poly_move (machine_mode, rtx, rtx, rtx); > +extern void riscv_expand_us_plus (rtx, rtx, rtx); >=20 > #ifdef RTX_CODE > extern void riscv_expand_int_scc (rtx, enum rtx_code, rtx, rtx, bool *in= vert_ptr =3D > 0); > diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc > index 4100abc9dd1..23f08974f07 100644 > --- a/gcc/config/riscv/riscv.cc > +++ b/gcc/config/riscv/riscv.cc > @@ -10657,6 +10657,52 @@ riscv_vector_mode_supported_any_target_p > (machine_mode) > return true; > } >=20 > +/* Emit insn for the saturation addu, aka (x + y) | - ((x + y) < x). */ > +void > +riscv_expand_us_plus (rtx dest, rtx x, rtx y) > +{ > + machine_mode mode =3D GET_MODE (dest); > + rtx pmode_sum =3D gen_reg_rtx (Pmode); > + rtx pmode_lt =3D gen_reg_rtx (Pmode); > + rtx pmode_x =3D gen_lowpart (Pmode, x); > + rtx pmode_y =3D gen_lowpart (Pmode, y); > + rtx pmode_dest =3D gen_reg_rtx (Pmode); > + > + /* Step-1: sum =3D x + y */ > + if (mode =3D=3D SImode && mode !=3D Pmode) > + { /* Take addw to avoid the sum truncate. */ > + rtx simode_sum =3D gen_reg_rtx (SImode); > + riscv_emit_binary (PLUS, simode_sum, x, y); > + emit_move_insn (pmode_sum, gen_lowpart (Pmode, simode_sum)); > + } > + else > + riscv_emit_binary (PLUS, pmode_sum, pmode_x, pmode_y); > + > + /* Step-1.1: truncate sum for HI and QI as we have no insn for add QI/= HI. */ > + if (mode =3D=3D HImode || mode =3D=3D QImode) > + { > + int mode_bits =3D GET_MODE_BITSIZE (mode).to_constant (); > + int shift_bits =3D GET_MODE_BITSIZE (Pmode) - mode_bits; > + > + gcc_assert (shift_bits > 0); > + > + riscv_emit_binary (ASHIFT, pmode_sum, pmode_sum, GEN_INT (shift_bi= ts)); > + riscv_emit_binary (LSHIFTRT, pmode_sum, pmode_sum, GEN_INT > (shift_bits)); > + } > + > + /* Step-2: lt =3D sum < x */ > + riscv_emit_binary (LTU, pmode_lt, pmode_sum, pmode_x); > + > + /* Step-3: lt =3D -lt */ > + riscv_emit_unary (NEG, pmode_lt, pmode_lt); > + > + /* Step-4: pmode_dest =3D sum | lt */ > + riscv_emit_binary (IOR, pmode_dest, pmode_lt, pmode_sum); > + > + /* Step-5: dest =3D pmode_dest */ > + emit_move_insn (dest, gen_lowpart (mode, pmode_dest)); > +} > + > /* Initialize the GCC target structure. */ > #undef TARGET_ASM_ALIGNED_HI_OP > #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t" > diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md > index 3f7a023d941..eaa9867023c 100644 > --- a/gcc/config/riscv/riscv.md > +++ b/gcc/config/riscv/riscv.md > @@ -3841,6 +3841,17 @@ (define_insn "*large_load_address" > [(set_attr "type" "load") > (set (attr "length") (const_int 8))]) >=20 > +(define_expand "us_plus3" > + [(match_operand:ANYI 0 "register_operand") > + (match_operand:ANYI 1 "register_operand") > + (match_operand:ANYI 2 "register_operand")] > + "" > + { > + riscv_expand_us_plus (operands[0], operands[1], operands[2]); > + DONE; > + } > +) > + > (include "bitmanip.md") > (include "crypto.md") > (include "sync.md") > diff --git a/gcc/internal-fn.cc b/gcc/internal-fn.cc > index a07f25f3aee..a7341a57ffa 100644 > --- a/gcc/internal-fn.cc > +++ b/gcc/internal-fn.cc > @@ -5177,3 +5177,29 @@ expand_POPCOUNT (internal_fn fn, gcall *stmt) > emit_move_insn (plhs, cmp); > } > } > + > +void > +expand_US_PLUS (internal_fn fn, gcall *stmt) > +{ > + tree lhs =3D gimple_call_lhs (stmt); > + tree rhs_0 =3D gimple_call_arg (stmt, 0); > + tree rhs_1 =3D gimple_call_arg (stmt, 1); > + > + do_pending_stack_adjust (); > + > + rtx target =3D expand_expr (lhs, NULL_RTX, VOIDmode, EXPAND_WRITE); > + rtx op_0 =3D expand_normal (rhs_0); > + rtx op_1 =3D expand_normal (rhs_1); > + > + class expand_operand ops[3]; > + > + create_output_operand (&ops[0], target, TYPE_MODE (TREE_TYPE (lhs))); > + create_output_operand (&ops[1], op_0, TYPE_MODE (TREE_TYPE (rhs_0))); > + create_output_operand (&ops[2], op_1, TYPE_MODE (TREE_TYPE (rhs_1))); > + > + insn_code code =3D optab_handler (us_plus_optab, TYPE_MODE (TREE_TYPE > (rhs_0))); > + expand_insn (code, 3, ops); > + > + if (!rtx_equal_p (target, ops[0].value)) > + emit_move_insn (target, ops[0].value); > +} This can be simplified by calling expand_binary_optab_fn instead. See my te= mplate > diff --git a/gcc/internal-fn.def b/gcc/internal-fn.def > index c14d30365c1..b1d7b5a0307 100644 > --- a/gcc/internal-fn.def > +++ b/gcc/internal-fn.def > @@ -447,6 +447,9 @@ DEF_INTERNAL_INT_FN (FFS, ECF_CONST | > ECF_NOTHROW, ffs, unary) > DEF_INTERNAL_INT_FN (PARITY, ECF_CONST | ECF_NOTHROW, parity, unary) > DEF_INTERNAL_INT_EXT_FN (POPCOUNT, ECF_CONST | ECF_NOTHROW, > popcount, unary) >=20 > +/* Binary integer ops. */ > +DEF_INTERNAL_INT_EXT_FN (US_PLUS, ECF_CONST | ECF_NOTHROW, us_plus, > binary) > + > DEF_INTERNAL_FN (GOMP_TARGET_REV, ECF_NOVOPS | ECF_LEAF | > ECF_NOTHROW, NULL) > DEF_INTERNAL_FN (GOMP_USE_SIMT, ECF_NOVOPS | ECF_LEAF | > ECF_NOTHROW, NULL) > DEF_INTERNAL_FN (GOMP_SIMT_ENTER, ECF_LEAF | ECF_NOTHROW, NULL) > diff --git a/gcc/internal-fn.h b/gcc/internal-fn.h > index bccee1c3e09..46e404b4a49 100644 > --- a/gcc/internal-fn.h > +++ b/gcc/internal-fn.h > @@ -263,6 +263,7 @@ extern void expand_DIVMODBITINT (internal_fn, gcall *= ); > extern void expand_FLOATTOBITINT (internal_fn, gcall *); > extern void expand_BITINTTOFLOAT (internal_fn, gcall *); > extern void expand_POPCOUNT (internal_fn, gcall *); > +extern void expand_US_PLUS (internal_fn, gcall *); >=20 > extern bool vectorized_internal_fn_supported_p (internal_fn, tree); >=20 > diff --git a/gcc/match.pd b/gcc/match.pd > index c5b6540f939..f45fd58ad23 100644 > --- a/gcc/match.pd > +++ b/gcc/match.pd > @@ -10265,3 +10265,20 @@ and, > } > (if (full_perm_p) > (vec_perm (op@3 @0 @1) @3 @2)))))) > + > +#if GIMPLE > + > +/* Unsigned saturation add, aka: > + SAT_ADDU =3D (X + Y) | - ((X + Y) < X) or > + SAT_ADDU =3D (X + Y) | - ((X + Y) < Y). */ > +(simplify > + (bit_ior:c (plus:c@2 @0 @1) (negate (convert (lt @2 @0)))) > + (if (optimize > + && INTEGRAL_TYPE_P (type) > + && TYPE_UNSIGNED (TREE_TYPE (@0)) > + && types_match (type, TREE_TYPE (@0)) > + && types_match (type, TREE_TYPE (@1)) > + && direct_internal_fn_supported_p (IFN_US_PLUS, type, > OPTIMIZE_FOR_BOTH)) > + (IFN_US_PLUS @0 @1))) > + > +#endif With the version above you can drop the #if GIMPLE and the=20 > + && direct_internal_fn_supported_p (IFN_US_PLUS, type, Check. Thanks, Tamar > diff --git a/gcc/optabs.def b/gcc/optabs.def > index ad14f9328b9..5855c4e0834 100644 > --- a/gcc/optabs.def > +++ b/gcc/optabs.def > @@ -179,6 +179,8 @@ OPTAB_NL(clrsb_optab, "clrsb$a2", CLRSB, "clrsb", '2'= , > gen_int_libfunc) > OPTAB_NL(popcount_optab, "popcount$a2", POPCOUNT, "popcount", '2', > gen_int_libfunc) > OPTAB_NL(parity_optab, "parity$a2", PARITY, "parity", '2', gen_int_libfu= nc) >=20 > +OPTAB_NL(us_plus_optab, "us_plus$a3", US_PLUS, "us_plus", '3', > gen_int_libfunc) > + > /* Comparison libcalls for integers MUST come in pairs, signed/unsigned.= */ > OPTAB_NL(cmp_optab, NULL, UNKNOWN, "cmp", '2', gen_int_fp_fixed_libfunc) > OPTAB_NL(ucmp_optab, NULL, UNKNOWN, "ucmp", '2', gen_int_libfunc) > -- > 2.34.1 --_002_VI1PR08MB53258DDFDC4E814EEECDD3CCFF5B2VI1PR08MB5325eurp_ Content-Type: application/octet-stream; name="sat-template.diff" Content-Description: sat-template.diff Content-Disposition: attachment; filename="sat-template.diff"; size=5240; creation-date="Sun, 25 Feb 2024 08:45:15 GMT"; modification-date="Sun, 25 Feb 2024 09:01:37 GMT" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2djYy9pbnRlcm5hbC1mbi5jYyBiL2djYy9pbnRlcm5hbC1mbi5jYw0KaW5k ZXggYTA3ZjI1ZjNhZWUuLmFhZjlmODk5MWIzIDEwMDY0NA0KLS0tIGEvZ2NjL2ludGVybmFsLWZu LmNjDQorKysgYi9nY2MvaW50ZXJuYWwtZm4uY2MNCkBAIC00MTAzLDYgKzQxMDMsMTcgQEAgZGly ZWN0X2ludGVybmFsX2ZuX3N1cHBvcnRlZF9wIChpbnRlcm5hbF9mbiBmbiwgdHJlZV9wYWlyIHR5 cGVzLA0KIAlyZXR1cm4gZGlyZWN0XyMjVFlQRSMjX29wdGFiX3N1cHBvcnRlZF9wICh3aGljaF9v cHRhYiwgdHlwZXMsCVwNCiAJCQkJCQkgIG9wdF90eXBlKTsJCVwNCiAgICAgICB9DQorI2RlZmlu ZSBERUZfSU5URVJOQUxfU0lHTkVEX09QVEFCX0VYVF9GTihDT0RFLCBGTEFHUywgU0VMRUNUT1Is IFNJR05FRF9PUFRBQiwgXA0KKwkJCQkJIFVOU0lHTkVEX09QVEFCLCBUWVBFKQkJXA0KKyAgICBj YXNlIElGTl8jI0NPREU6CQkJCQkJCVwNCisgICAgICB7CQkJCQkJCQkJXA0KKwlvcHRhYiB3aGlj aF9vcHRhYiA9IChUWVBFX1VOU0lHTkVEICh0eXBlcy5TRUxFQ1RPUikJCVwNCisJCQkgICAgID8g VU5TSUdORURfT1BUQUIgIyMgX29wdGFiCQkJXA0KKwkJCSAgICAgOiBTSUdORURfT1BUQUIgIyMg X29wdGFiKTsJCQlcDQorCXJldHVybiBkaXJlY3RfIyNUWVBFIyNfb3B0YWJfc3VwcG9ydGVkX3Ag KHdoaWNoX29wdGFiLCB0eXBlcywJXA0KKwkJCQkJCSAgb3B0X3R5cGUpCQlcDQorCSAgICAgICB8 fCBpbnRlcm5hbF8jI0NPREUjI19mbl9zdXBwb3J0ZWRfcCAodHlwZXMuU0VMRUNUT1IsIG9wdF90 eXBlKTsgXA0KKyAgICAgIH0NCiAjaW5jbHVkZSAiaW50ZXJuYWwtZm4uZGVmIg0KIA0KICAgICBj YXNlIElGTl9MQVNUOg0KQEAgLTQzMDMsNiArNDMxNCw4IEBAIHNldF9lZG9tX3N1cHBvcnRlZF9w ICh2b2lkKQ0KICAgICBvcHRhYiB3aGljaF9vcHRhYiA9IGRpcmVjdF9pbnRlcm5hbF9mbl9vcHRh YiAoZm4sIHR5cGVzKTsJCVwNCiAgICAgZXhwYW5kXyMjVFlQRSMjX29wdGFiX2ZuIChmbiwgc3Rt dCwgd2hpY2hfb3B0YWIpOwkJCVwNCiAgIH0NCisjZGVmaW5lIERFRl9JTlRFUk5BTF9TSUdORURf T1BUQUJfRVhUX0ZOKENPREUsIEZMQUdTLCBTRUxFQ1RPUiwgU0lHTkVEX09QVEFCLCBcDQorCQkJ CQkgVU5TSUdORURfT1BUQUIsIFRZUEUpDQogI2luY2x1ZGUgImludGVybmFsLWZuLmRlZiINCiAN CiAvKiBSb3V0aW5lcyB0byBleHBhbmQgZWFjaCBpbnRlcm5hbCBmdW5jdGlvbiwgaW5kZXhlZCBi eSBmdW5jdGlvbiBudW1iZXIuDQpAQCAtNTE3NywzICs1MTkwLDQ1IEBAIGV4cGFuZF9QT1BDT1VO VCAoaW50ZXJuYWxfZm4gZm4sIGdjYWxsICpzdG10KQ0KICAgICAgIGVtaXRfbW92ZV9pbnNuIChw bGhzLCBjbXApOw0KICAgICB9DQogfQ0KKw0KK3ZvaWQNCitleHBhbmRfU0FUX0FERCAoaW50ZXJu YWxfZm4gZm4sIGdjYWxsICpzdG10KQ0KK3sNCisgIC8qIENoZWNrIGlmIHRoZSB0YXJnZXQgc3Vw cG9ydHMgdGhlIGV4cGFuc2lvbiB0aHJvdWdoIGFuIElGTi4gICovDQorICB0cmVlX3BhaXIgdHlw ZXMgPSBkaXJlY3RfaW50ZXJuYWxfZm5fdHlwZXMgKGZuLCBzdG10KTsNCisgIG9wdGFiIHdoaWNo X29wdGFiID0gZGlyZWN0X2ludGVybmFsX2ZuX29wdGFiIChmbiwgdHlwZXMpOw0KKyAgaWYgKGRp cmVjdF9iaW5hcnlfb3B0YWJfc3VwcG9ydGVkX3AgKHdoaWNoX29wdGFiLCB0eXBlcywNCisJCQkJ ICAgICAgIGluc25fb3B0aW1pemF0aW9uX3R5cGUgKCkpKQ0KKyAgICB7DQorICAgICAgZXhwYW5k X2JpbmFyeV9vcHRhYl9mbiAoZm4sIHN0bXQsIHdoaWNoX29wdGFiKTsNCisgICAgICByZXR1cm47 DQorICAgIH0NCisNCisgIC8qIFRhcmdldCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcHRhYiwgYnV0 IHdlIGNhbiBkZS1jb21wb3NlIGl0LiAgKi8NCisgIC8qDQorICAuLi4gZGVjb21wb3NlIHRvIGEg Y2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIC4uLg0KKyAgaWYgKFRZUEVfVU5TSUdORUQgKHR5cGVz LlNFTEVDVE9SKSkNCisgICAgew0KKyAgICAgIC4uLg0KKyAgICAgIGRlY29tcG9zZSBiYWNrIHRv IChYICsgWSkgfCAtICgoWCArIFkpIDwgWCkNCisgICAgfQ0KKyAgZWxzZQ0KKyAgICB7DQorICAg ICAgLi4uDQorICAgIH0NCisgICovDQorfQ0KKw0KK2Jvb2wgaW50ZXJuYWxfU0FUX0FERF9mbl9z dXBwb3J0ZWRfcCAodHJlZSB0eXBlLCBvcHRpbWl6YXRpb25fdHlwZSAvKiBvcHR5cGUgKi8pDQor ew0KKyAgLyogRm9yIG5vdywgZG9uJ3Qgc3VwcG9ydCBkZWNvbXBvc2luZyB2ZWN0b3Igb3BzLiAg Ki8NCisgIGlmIChWRUNUT1JfVFlQRV9QICh0eXBlKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKw0K KyAgLyogU2lnbmVkIHNhdHVyYXRpbmcgYXJpdGhtZXRpYyBpcyBoYXJkZXIgdG8gZG8gc2luY2Ug d2UnbGwgc28gZm9yIG5vdw0KKyAgICAgbGV0cyBpZ25vcmUuICAqLw0KKyAgaWYgKCFUWVBFX1VO U0lHTkVEICh0eXBlKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKw0KKyAgcmV0dXJuIFRSRUVfQ09E RSAodHlwZSkgPT0gSU5URUdFUl9UWVBFOw0KK30NClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmls ZQ0KZGlmZiAtLWdpdCBhL2djYy9pbnRlcm5hbC1mbi5kZWYgYi9nY2MvaW50ZXJuYWwtZm4uZGVm DQppbmRleCBjMTRkMzAzNjVjMS4uNWEyNDkxMjI4ZDUgMTAwNjQ0DQotLS0gYS9nY2MvaW50ZXJu YWwtZm4uZGVmDQorKysgYi9nY2MvaW50ZXJuYWwtZm4uZGVmDQpAQCAtOTIsNiArOTIsMTAgQEAg YWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUNCiAgICB1 bnNpZ25lZCBpbnB1dHMgcmVzcGVjdGl2ZWx5LCBib3RoIHdpdGhvdXQgdGhlIHRyYWlsaW5nICJf b3B0YWIiLg0KICAgIFNFTEVDVE9SIHNheXMgd2hpY2ggdHlwZSBpbiB0aGUgdHJlZV9wYWlyIGRl dGVybWluZXMgdGhlIHNpZ25lZG5lc3MuDQogDQorICAgREVGX0lOVEVSTkFMX1NJR05FRF9PUFRB Ql9FWFRfRk4gaXMgbGlrZSBERUZfSU5URVJOQUxfU0lHTkVEX09QVEFCX0ZOLCBleGNlcHQNCisg ICB0aGF0IGl0IGhhcyBleHBhbmRfIyNOQU1FIGRlZmluZWQgaW4gaW50ZXJuYWwtZm4uY2MgdG8g b3ZlcnJpZGUgdGhlDQorICAgREVGX0lOVEVSTkFMX1NJR05FRF9PUFRBQl9GTiBleHBhbnNpb24g YmVoYXZpb3IuDQorDQogICAgREVGX0lOVEVSTkFMX0ZMVF9GTiBpcyBsaWtlIERFRl9JTlRFUk5B TF9PUFRBQl9GTiwgYnV0IGluIGFkZGl0aW9uLA0KICAgIHRoZSBmdW5jdGlvbiBpbXBsZW1lbnRz IHRoZSBjb21wdXRhdGlvbmFsIHBhcnQgb2YgYSBidWlsdC1pbiBtYXRoDQogICAgZnVuY3Rpb24g QlVJTFRfSU5fPE5BTUU+e0YsLEx9LiAgVW5saWtlIHNvbWUgYnVpbHQtaW4gZnVuY3Rpb25zLA0K QEAgLTE1Myw2ICsxNTcsMTMgQEAgYWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5H My4gIElmIG5vdCBzZWUNCiAgIERFRl9JTlRFUk5BTF9GTiAoTkFNRSwgRkxBR1MgfCBFQ0ZfTEVB RiwgTlVMTCkNCiAjZW5kaWYNCiANCisjaWZuZGVmIERFRl9JTlRFUk5BTF9TSUdORURfT1BUQUJf RVhUX0ZODQorI2RlZmluZSBERUZfSU5URVJOQUxfU0lHTkVEX09QVEFCX0VYVF9GTihOQU1FLCBG TEFHUywgU0VMRUNUT1IsIFNJR05FRF9PUFRBQiwgXA0KKwkJCQkgICAgIFVOU0lHTkVEX09QVEFC LCBUWVBFKSBcDQorICBERUZfSU5URVJOQUxfU0lHTkVEX09QVEFCX0ZOIChOQU1FLCBGTEFHUywg U0VMRUNUT1IsIFNJR05FRF9PUFRBQiwgXA0KKwkJCQlVTlNJR05FRF9PUFRBQiwgVFlQRSkNCisj ZW5kaWYNCisNCiAjaWZuZGVmIERFRl9JTlRFUk5BTF9GTFRfRk4NCiAjZGVmaW5lIERFRl9JTlRF Uk5BTF9GTFRfRk4oTkFNRSwgRkxBR1MsIE9QVEFCLCBUWVBFKSBcDQogICBERUZfSU5URVJOQUxf T1BUQUJfRk4gKE5BTUUsIEZMQUdTLCBPUFRBQiwgVFlQRSkNCkBAIC0yNzQsNiArMjg1LDggQEAg REVGX0lOVEVSTkFMX1NJR05FRF9PUFRBQl9GTiAoTVVMSFMsIEVDRl9DT05TVCB8IEVDRl9OT1RI Uk9XLCBmaXJzdCwNCiAJCQkgICAgICBzbXVsaHMsIHVtdWxocywgYmluYXJ5KQ0KIERFRl9JTlRF Uk5BTF9TSUdORURfT1BUQUJfRk4gKE1VTEhSUywgRUNGX0NPTlNUIHwgRUNGX05PVEhST1csIGZp cnN0LA0KIAkJCSAgICAgIHNtdWxocnMsIHVtdWxocnMsIGJpbmFyeSkNCitERUZfSU5URVJOQUxf U0lHTkVEX09QVEFCX0VYVF9GTiAoU0FUX0FERCwgRUNGX0NPTlNUIHwgRUNGX05PVEhST1csIGZp cnN0LA0KKwkJCQkgIHNzYWRkLCB1c2FkZCwgYmluYXJ5KQ0KIA0KIERFRl9JTlRFUk5BTF9DT05E X0ZOIChBREQsIEVDRl9DT05TVCwgYWRkLCBiaW5hcnkpDQogREVGX0lOVEVSTkFMX0NPTkRfRk4g KFNVQiwgRUNGX0NPTlNULCBzdWIsIGJpbmFyeSkNCkBAIC01OTMsNSArNjA2LDYgQEAgREVGX0lO VEVSTkFMX0ZOIChCSVRJTlRUT0ZMT0FULCBFQ0ZfUFVSRSB8IEVDRl9MRUFGLCAiLiBSIC4gIikN CiAjdW5kZWYgREVGX0lOVEVSTkFMX0ZMVF9GTg0KICN1bmRlZiBERUZfSU5URVJOQUxfRkxUX0ZM T0FUTl9GTg0KICN1bmRlZiBERUZfSU5URVJOQUxfU0lHTkVEX09QVEFCX0ZODQorI3VuZGVmIERF Rl9JTlRFUk5BTF9TSUdORURfT1BUQUJfRVhUX0ZODQogI3VuZGVmIERFRl9JTlRFUk5BTF9PUFRB Ql9GTg0KICN1bmRlZiBERUZfSU5URVJOQUxfRk4NCmRpZmYgLS1naXQgYS9nY2MvaW50ZXJuYWwt Zm4uaCBiL2djYy9pbnRlcm5hbC1mbi5oDQppbmRleCBiY2NlZTFjM2UwOS4uZGJkYjFlNmJhZDIg MTAwNjQ0DQotLS0gYS9nY2MvaW50ZXJuYWwtZm4uaA0KKysrIGIvZ2NjL2ludGVybmFsLWZuLmgN CkBAIC0yNjMsNiArMjYzLDggQEAgZXh0ZXJuIHZvaWQgZXhwYW5kX0RJVk1PREJJVElOVCAoaW50 ZXJuYWxfZm4sIGdjYWxsICopOw0KIGV4dGVybiB2b2lkIGV4cGFuZF9GTE9BVFRPQklUSU5UIChp bnRlcm5hbF9mbiwgZ2NhbGwgKik7DQogZXh0ZXJuIHZvaWQgZXhwYW5kX0JJVElOVFRPRkxPQVQg KGludGVybmFsX2ZuLCBnY2FsbCAqKTsNCiBleHRlcm4gdm9pZCBleHBhbmRfUE9QQ09VTlQgKGlu dGVybmFsX2ZuLCBnY2FsbCAqKTsNCitleHRlcm4gdm9pZCBleHBhbmRfU0FUX0FERCAoaW50ZXJu YWxfZm4sIGdjYWxsICopOw0KK2V4dGVybiBib29sIGludGVybmFsX1NBVF9BRERfZm5fc3VwcG9y dGVkX3AgKHRyZWUsIG9wdGltaXphdGlvbl90eXBlKTsNCiANCiBleHRlcm4gYm9vbCB2ZWN0b3Jp emVkX2ludGVybmFsX2ZuX3N1cHBvcnRlZF9wIChpbnRlcm5hbF9mbiwgdHJlZSk7DQogDQo= --_002_VI1PR08MB53258DDFDC4E814EEECDD3CCFF5B2VI1PR08MB5325eurp_--