From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR03-AM7-obe.outbound.protection.outlook.com (mail-am7eur03on2053.outbound.protection.outlook.com [40.107.105.53]) by sourceware.org (Postfix) with ESMTPS id AD0A13858428 for ; Mon, 13 Nov 2023 11:47:44 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org AD0A13858428 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 AD0A13858428 Authentication-Results: server2.sourceware.org; arc=pass smtp.remote-ip=40.107.105.53 ARC-Seal: i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1699876067; cv=pass; b=MpklS0q4acEu+9rT9OYcnFA40IR8oTD+VrdrjRGRXrbc7jBN6kY+Stn+xin2tLu+UiIiF+uB7nh9ecjM5TVwojGs+YySvggwdnf1AZ9LtN2eOB0FgShtH/MsjMvSdPvt/1ACMUi/0/zn6jTeBiPDlblAu76Mm573QdWiDUpMYPw= ARC-Message-Signature: i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1699876067; c=relaxed/simple; bh=p9aGnFhwHJoImHtFHcR4FeWGPiO8X3MPiZrfkXLXr7g=; h=DKIM-Signature:DKIM-Signature:From:To:Subject:Date:Message-ID: MIME-Version; b=PYnAfUo+pZPGYBx4iz5c/qyFqEjBdnOT3UJQvNNFGxSYAy04Jzq3TcBBswUDFZ4ZcBvixyk7OXvBY/QW479x9EApbpi9U0Mnw85hfi+RaSv35rGaDh7zSj7GGDc/fVjQHyjvFPedSbC+29bJtJGZFQCpKqBmmEVJCby+IjUybgs= ARC-Authentication-Results: i=3; server2.sourceware.org ARC-Seal: i=2; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=pass; b=oSxxpIuGwRufyvIYAiDOQctWlKCvDKqNkfe5o0r48nMKpi2gziJJF15FPM74FAfrP9S0t3gMLJ2Lf/+QY0HbIkd6TT88S4Hd5CzXBoQYaemUrk0cvsRWlK3uGjboAesLcS1bekTm5D7zIvoTd9PMZ3xv5jSatqOU8xLsZQF/HpX5G83qCdc8X1L1bCGJCMfsM6XuB8jnevPR4U7DSL9fY90t+oxdEuIKu7IwR5EeGckRFscSObZpjovqN2RTGde+qHtYa7EusZLclFBqV2KrVhtVXVH7ES3EVcNz5PMggscnywHW7jt6L42dXdh49FDwpWKMzNocQLdxb1LwHv8LNw== 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=cmWKLqlReG9HpFge7xCM4Kb0f0PrwTmtXuN218AB9tU=; b=RpHTs0v0//5XulcEkRvPCl7hxumsK3TtS8rH3CzuvLRk7DOCk65UbmnFqQUmNB5fYCwSg10Nh9hQQBz9gedz4ECtUImMvyQCsW5LjYMVCtTcHM7H2uJA7ycU/I/vAn+10vpA5A+JXQJujB2beQpmMPsUwJoGf9IJZBasLBOq91ZwJw+cfZg45NfuZ7BAXgSYObjuRBMejrckNlR47f8kBI3qGk+mbjqQqz/wm/BIrXW9XyKcu7pmA/jq2K3GeD6Anx8184QpYDUqyYW6CU8FE5u2eF3e+KQQ53P9Hv1F8yno1nMckVke/rkVLdrF36Vi5GoaCZcJPlxpN6JJ838lzw== 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] 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=cmWKLqlReG9HpFge7xCM4Kb0f0PrwTmtXuN218AB9tU=; b=finzK41NR1L1t9QVuFHh+ZafY5OPiofMvbSPDjXtbANGittf0JocFqwf9AknEvDfFmwKbxdfcEwgMV4ZQ0wAUjLlOaRHuRy2IYJPjB+U7YqU+0yEdc4MfhA4QIvwQiSBfQF/1E5D1ZuYN29Yisx3M4l7y5LeiTTsnOcCqDiu2TA= Received: from DB8PR06CA0049.eurprd06.prod.outlook.com (2603:10a6:10:120::23) by DU0PR08MB7764.eurprd08.prod.outlook.com (2603:10a6:10:3b8::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6977.28; Mon, 13 Nov 2023 11:47:38 +0000 Received: from DB5PEPF00014B9C.eurprd02.prod.outlook.com (2603:10a6:10:120:cafe::f5) by DB8PR06CA0049.outlook.office365.com (2603:10a6:10:120::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6977.29 via Frontend Transport; Mon, 13 Nov 2023 11:47:38 +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 DB5PEPF00014B9C.mail.protection.outlook.com (10.167.8.170) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7002.14 via Frontend Transport; Mon, 13 Nov 2023 11:47:38 +0000 Received: ("Tessian outbound 26ee1d40577c:v228"); Mon, 13 Nov 2023 11:47:38 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 57e77a979ec70727 X-CR-MTA-TID: 64aa7808 Received: from 28bce5847b94.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 3F238EB8-7748-4627-9568-F81EF4313BBB.1; Mon, 13 Nov 2023 11:47:31 +0000 Received: from EUR05-DB8-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 28bce5847b94.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Mon, 13 Nov 2023 11:47:31 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=bV0jo/cT01atDZ560GTaQGYUMZm9fK6+ezwKHstSHvbLnhkEQ9L56UzZV0bI+NraiKPPM1qNV7j3x+g4n8LuwCRqTWRjZQ81sN6oXeiyfAZxl+AriCUg+qjAqVgzdyyeVCMZLkJKs1ZJIdh1wcSrR6Qok7JAQvsj1zYPSB9T322cMDou3JMuUPwMPVSMoXLMhPZRVd5Vudx2k0JdZCqkhSmSduU6ZQQ4N4TvoKfweujlGWbEtCd4lpvPQWyjbXylLdIp+AdijtRTWvTScfUDXAaSTrGc+8YbOs13zCQws98LXknAQfm4aF9lpe9Ioje/whcHKFXSJ+ivLSzajZkbWg== 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=cmWKLqlReG9HpFge7xCM4Kb0f0PrwTmtXuN218AB9tU=; b=I5xvy6e7Fd0pXrp2gGjGYno+qUNS+9ECEjhiRI/wJAA92I1KANGD9537r1TBxwthcm/I/sgpmCGy8xcilBSIRn+eoirXBobIAlKW5uXFxo/6fhJrLXU8yjAyhYjS5qkaxnM1XasC6SGvPJF9tUZRpo4hWVMC6FXqtlfv151uc+y3Yxn7SQ7HtJ+t4RhpWOPqGPNHyxuMQtEPjzILpFfgiU0wyt9Wvxy4RZBgN5BeHIxi2czRjQeFwQKFqYJsPtf+dhChaUse6kyYXoL9gUBJ16LeUTp/kkP+s+P6exm7c99DuiKJhEs/0HyITwG8ja1zdLJ9FQvunPAVrgsxlJNoyQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 40.67.248.234) smtp.rcpttodomain=gcc.gnu.org smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=none (message not signed); arc=none (0) 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=cmWKLqlReG9HpFge7xCM4Kb0f0PrwTmtXuN218AB9tU=; b=finzK41NR1L1t9QVuFHh+ZafY5OPiofMvbSPDjXtbANGittf0JocFqwf9AknEvDfFmwKbxdfcEwgMV4ZQ0wAUjLlOaRHuRy2IYJPjB+U7YqU+0yEdc4MfhA4QIvwQiSBfQF/1E5D1ZuYN29Yisx3M4l7y5LeiTTsnOcCqDiu2TA= Received: from AM6PR04CA0072.eurprd04.prod.outlook.com (2603:10a6:20b:f0::49) by AS8PR08MB5927.eurprd08.prod.outlook.com (2603:10a6:20b:292::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6977.29; Mon, 13 Nov 2023 11:47:27 +0000 Received: from AMS1EPF00000044.eurprd04.prod.outlook.com (2603:10a6:20b:f0:cafe::80) by AM6PR04CA0072.outlook.office365.com (2603:10a6:20b:f0::49) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6977.29 via Frontend Transport; Mon, 13 Nov 2023 11:47:27 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 40.67.248.234) smtp.mailfrom=arm.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 40.67.248.234 as permitted sender) receiver=protection.outlook.com; client-ip=40.67.248.234; helo=nebula.arm.com; pr=C Received: from nebula.arm.com (40.67.248.234) by AMS1EPF00000044.mail.protection.outlook.com (10.167.16.41) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.7002.14 via Frontend Transport; Mon, 13 Nov 2023 11:47:27 +0000 Received: from AZ-NEU-EX04.Arm.com (10.251.24.32) by AZ-NEU-EX04.Arm.com (10.251.24.32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Mon, 13 Nov 2023 11:47:22 +0000 Received: from e125768.cambridge.arm.com (10.2.78.50) by mail.arm.com (10.251.24.32) with Microsoft SMTP Server id 15.1.2507.32 via Frontend Transport; Mon, 13 Nov 2023 11:47:22 +0000 From: Victor Do Nascimento To: CC: , , , Victor Do Nascimento Subject: [PATCH] libatomic: Add rcpc3 128-bit atomic operations for AArch64 Date: Mon, 13 Nov 2023 11:47:13 +0000 Message-ID: <20231113114719.73509-1-victor.donascimento@arm.com> X-Mailer: git-send-email 2.42.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-EOPAttributedMessage: 1 X-MS-TrafficTypeDiagnostic: AMS1EPF00000044:EE_|AS8PR08MB5927:EE_|DB5PEPF00014B9C:EE_|DU0PR08MB7764:EE_ X-MS-Office365-Filtering-Correlation-Id: 6d677a89-f46a-442e-4ec7-08dbe43e55fc 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: 3W4Fnpqhdx6ivYMbCs7LTp3dhQkMaImCCb4TFQI5W7oVy4Z2d2cSZRdy1zrk4jbuhU3L+wa3FYRZJ4Y+9gyBE7IsasHQkwzE3/B1L89Zb8+gqNYe15M/doVDQli2ZCB/+b7wojSh+jGUhIiajHgHTIVPvEuVxVlmKOQORhyca49f/amZciHLubk2ju0hQ07N8qru8hoGu7OzaEBfoGaaQDnYJB6wFnjcTmNhUXpfbHLeQdA7pLJCgqycLjH4RYM92vYOJy6g1rNcTvzTTxLQAiwmuj0FGyWDA+9yQ5HnXxXc4flCOqRF+/IBlOJkkQyuaoMcjWqgkLwVxcrITJiLEhJwub3yDArCxCPko2TMI1p8XM2ep6DYd+kmjDep3TPSWFv0KimtY4Sfla7qHsdwhMeiSVJcIf9MuvOMagPTyuprwpVLASfqWJc80Nr87m1aQGt8fvIzuUnhy8xhDnAFdapiCDKFnrYerPxDYNPhzFwydNP1UqVSZaEDR3aIYHdcqtZMNKlH7QCr22+d65SmDtYwh2eidBS1QC2QpKpejgFtP/eUSI8JI7UBZ1EsiQ6VlTjcgXoOrrTNnIN8DuEi3nhjP8cbZNc7c5CoycUR2qC6wsZ90qfqKjQSZJlcoSR/+7oebeuSbgVu2tDrfRoP4my0giobbZRbGcllAk1QvYEa2Mge3ceWlb+b9Jk/b0dLRc9II99qAz2a4oUOaXzXLD+9y7Fp9xhc6GZ+ngf5/kWcXsZsPTHQ+O8v5VyIcTHm8JydT/+yIdjOVxYd8oYAMeR6GMvLHeomNOhiuNEbsXY= X-Forefront-Antispam-Report-Untrusted: CIP:40.67.248.234;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:nebula.arm.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230031)(4636009)(396003)(346002)(376002)(136003)(39860400002)(230173577357003)(230922051799003)(230273577357003)(64100799003)(186009)(1800799009)(82310400011)(451199024)(40470700004)(36840700001)(46966006)(2906002)(40460700003)(30864003)(356005)(81166007)(4326008)(8936002)(8676002)(5660300002)(82740400003)(83380400001)(41300700001)(86362001)(966005)(478600001)(7696005)(6666004)(36860700001)(36756003)(336012)(26005)(426003)(47076005)(1076003)(2616005)(316002)(40480700001)(6916009)(70206006)(70586007)(54906003)(36900700001);DIR:OUT;SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR08MB5927 X-MS-Exchange-Transport-CrossTenantHeadersStripped: DB5PEPF00014B9C.eurprd02.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: f8eab2f8-4082-4f6e-51e6-08dbe43e4f9a X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: DdNstyinQsO7FTTDigGQrsF2TllHJVuMggJf7eLVWrpf+Z3z4jiq9vRyyExLBv2w96hv2uVanH8iXDoI7B/jQgMCccMvSZyDtgy+JFTVcJ2dIxs6YbWsxTDrQYGr7pcMoxbQx/W3rs9kV8yQtFZHXMxKoTJwf5lLT4qd2+i0fXMLIgraCjw2/BjGl2RybATCWZT/FLIEX36LBNDVlO3/bSPsx6/2byjLPsAJ315WMNIISwj9bfQc1P8ex3UTDiaBqgY10ywqXPJ0Cs8mDQ9g3h7wKemU5y+kVQ1P6cXf3k7CuzRkAdUd7bn3H0pDbMOYeIppDfI32cqE7q2042jb02d3FoJ/HA1zTOvaMItI0i89c7/Z1sxz0MZgcAn9kaeZsQAgVdJucHpm3OF/5buUJvQY96x8/WY4xJqysY7fJRZ6VJwZnADMNTBJib9xTVgB6Bh4ggxRX00OiAiEmo+VHbOZFLMPN/O6Ir1e+SoqzPUeVqXJGJDMbj0jAt4OCKbqN7bLj/NvkAfAJG65n/3p3H0qY8UEf6Z7iUct03DPKl+Mnv3aiF9xrgYShCxkztW5zEryBic4LS9+iiQlq/SiZoqRqih11wJhn7DUSWYPlECegYjGhExEBCZr6ojG/VlfsBogXwMbhn4YdRs1CQHLNkXhTJ7lrdkTQBkTqlEmdK1oB82I7kaxymtn5sE/oqUTTEvwa17YGSbEJScbWmRrgSItkhwOJ3qrAcD+R+Cg61AfefQPhqbLnd5V5Bu+cWjh3RO6g+O4+Npqw7fk5PyDvQ== 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)(4636009)(136003)(396003)(376002)(346002)(39860400002)(230273577357003)(230173577357003)(230922051799003)(82310400011)(451199024)(64100799003)(186009)(1800799009)(46966006)(36840700001)(40470700004)(40460700003)(4326008)(8676002)(8936002)(1076003)(26005)(2906002)(36860700001)(5660300002)(2616005)(86362001)(82740400003)(30864003)(7696005)(426003)(336012)(47076005)(966005)(6666004)(81166007)(36756003)(478600001)(41300700001)(83380400001)(40480700001)(316002)(6916009)(70586007)(70206006)(54906003);DIR:OUT;SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Nov 2023 11:47:38.4761 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6d677a89-f46a-442e-4ec7-08dbe43e55fc 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: DB5PEPF00014B9C.eurprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB7764 X-Spam-Status: No, score=-12.2 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,FORGED_SPF_HELO,GIT_PATCH_0,KAM_DMARC_NONE,KAM_NUMSUBJECT,KAM_SHORT,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,SPF_NONE,TXREP,T_SCC_BODY_TEXT_LINE,UNPARSEABLE_RELAY 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: Continuing on from previously-proposed Libatomic enablement work [1], the introduction of the optional RCPC3 architectural extension for Armv8.2-A upwards provides additional support for the release consistency model, introducing both the Load-Acquire RCpc Pair Ordered, and Store-Release Pair Ordered operations in the form of LDIAPP and STILP. These operations single-copy atomic on cores which also implement LSE2 and, as such, support for these operations is added to Libatomic and employed accordingly when the LSE2 and RCPC3 features are detected in a given core at runtime. The possibility that a core implements (beyond LSE & LSE2) both the LSE128 and RCPC3 features has also required that support for up to 4 ifuncs (up from 3 before) be added, so that the lse128+rcpc option is available for selection at runtime. [1] https://gcc.gnu.org/pipermail/gcc-patches/2023-November/636287.html libatomic/ChangeLog: * libatomic_i.h (GEN_SELECTOR): define for IFUNC_NCOND(N) == 4. * configure.ac: Add call to LIBAT_TEST_FEAT_LRCPC3() test. * configure: Regenerate. * config/linux/aarch64/host-config.h (HAS_LRCPC3): New. (has_rcpc3): Likewise. * config/linux/aarch64/atomic_16.S (libat_load_16): Add LRCPC3 variant. (libat_store_16): Likewise. * acinclude.m4 (LIBAT_TEST_FEAT_LRCPC3): New. (HAVE_FEAT_LRCPC3): Likewise (ARCH_AARCH64_HAVE_LRCPC3): Likewise. * Makefile.am (AM_CPPFLAGS): Conditionally append -DHAVE_FEAT_LRCPC3 flag. --- libatomic/Makefile.am | 6 +- libatomic/Makefile.in | 22 +++-- libatomic/acinclude.m4 | 19 ++++ libatomic/auto-config.h.in | 3 + libatomic/config/linux/aarch64/atomic_16.S | 94 +++++++++++++++++++- libatomic/config/linux/aarch64/host-config.h | 26 +++++- libatomic/configure | 59 +++++++++++- libatomic/configure.ac | 1 + libatomic/libatomic_i.h | 18 ++++ 9 files changed, 230 insertions(+), 18 deletions(-) diff --git a/libatomic/Makefile.am b/libatomic/Makefile.am index 24e843db67d..dee38e46af9 100644 --- a/libatomic/Makefile.am +++ b/libatomic/Makefile.am @@ -130,8 +130,12 @@ libatomic_la_LIBADD = $(foreach s,$(SIZES),$(addsuffix _$(s)_.lo,$(SIZEOBJS))) ## On a target-specific basis, include alternates to be selected by IFUNC. if HAVE_IFUNC if ARCH_AARCH64_LINUX +AM_CPPFLAGS = if ARCH_AARCH64_HAVE_LSE128 -AM_CPPFLAGS = -DHAVE_FEAT_LSE128 +AM_CPPFLAGS += -DHAVE_FEAT_LSE128 +endif +if ARCH_AARCH64_HAVE_LRCPC3 +AM_CPPFLAGS += -DHAVE_FEAT_LRCPC3 endif IFUNC_OPTIONS = -march=armv8-a+lse libatomic_la_LIBADD += $(foreach s,$(SIZES),$(addsuffix _$(s)_1_.lo,$(SIZEOBJS))) diff --git a/libatomic/Makefile.in b/libatomic/Makefile.in index cd48fa21334..8e87d12907a 100644 --- a/libatomic/Makefile.in +++ b/libatomic/Makefile.in @@ -89,15 +89,17 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ -@ARCH_AARCH64_LINUX_TRUE@@HAVE_IFUNC_TRUE@am__append_1 = $(foreach s,$(SIZES),$(addsuffix _$(s)_1_.lo,$(SIZEOBJS))) -@ARCH_AARCH64_LINUX_TRUE@@HAVE_IFUNC_TRUE@am__append_2 = atomic_16.S -@ARCH_ARM_LINUX_TRUE@@HAVE_IFUNC_TRUE@am__append_3 = $(foreach \ +@ARCH_AARCH64_HAVE_LSE128_TRUE@@ARCH_AARCH64_LINUX_TRUE@@HAVE_IFUNC_TRUE@am__append_1 = -DHAVE_FEAT_LSE128 +@ARCH_AARCH64_HAVE_LRCPC3_TRUE@@ARCH_AARCH64_LINUX_TRUE@@HAVE_IFUNC_TRUE@am__append_2 = -DHAVE_FEAT_LRCPC3 +@ARCH_AARCH64_LINUX_TRUE@@HAVE_IFUNC_TRUE@am__append_3 = $(foreach s,$(SIZES),$(addsuffix _$(s)_1_.lo,$(SIZEOBJS))) +@ARCH_AARCH64_LINUX_TRUE@@HAVE_IFUNC_TRUE@am__append_4 = atomic_16.S +@ARCH_ARM_LINUX_TRUE@@HAVE_IFUNC_TRUE@am__append_5 = $(foreach \ @ARCH_ARM_LINUX_TRUE@@HAVE_IFUNC_TRUE@ s,$(SIZES),$(addsuffix \ @ARCH_ARM_LINUX_TRUE@@HAVE_IFUNC_TRUE@ _$(s)_1_.lo,$(SIZEOBJS))) \ @ARCH_ARM_LINUX_TRUE@@HAVE_IFUNC_TRUE@ $(addsuffix \ @ARCH_ARM_LINUX_TRUE@@HAVE_IFUNC_TRUE@ _8_2_.lo,$(SIZEOBJS)) -@ARCH_I386_TRUE@@HAVE_IFUNC_TRUE@am__append_4 = $(addsuffix _8_1_.lo,$(SIZEOBJS)) -@ARCH_X86_64_TRUE@@HAVE_IFUNC_TRUE@am__append_5 = $(addsuffix _16_1_.lo,$(SIZEOBJS)) \ +@ARCH_I386_TRUE@@HAVE_IFUNC_TRUE@am__append_6 = $(addsuffix _8_1_.lo,$(SIZEOBJS)) +@ARCH_X86_64_TRUE@@HAVE_IFUNC_TRUE@am__append_7 = $(addsuffix _16_1_.lo,$(SIZEOBJS)) \ @ARCH_X86_64_TRUE@@HAVE_IFUNC_TRUE@ $(addsuffix _16_2_.lo,$(SIZEOBJS)) subdir = . @@ -424,7 +426,7 @@ libatomic_la_LDFLAGS = $(libatomic_version_info) $(libatomic_version_script) \ $(lt_host_flags) $(libatomic_darwin_rpath) libatomic_la_SOURCES = gload.c gstore.c gcas.c gexch.c glfree.c lock.c \ - init.c fenv.c fence.c flag.c $(am__append_2) + init.c fenv.c fence.c flag.c $(am__append_4) SIZEOBJS = load store cas exch fadd fsub fand fior fxor fnand tas EXTRA_libatomic_la_SOURCES = $(addsuffix _n.c,$(SIZEOBJS)) libatomic_la_DEPENDENCIES = $(libatomic_la_LIBADD) $(libatomic_version_dep) @@ -450,9 +452,11 @@ all_c_files := $(foreach dir,$(search_path),$(wildcard $(dir)/*.c)) # Then sort through them to find the one we want, and select the first. M_SRC = $(firstword $(filter %/$(M_FILE), $(all_c_files))) libatomic_la_LIBADD = $(foreach s,$(SIZES),$(addsuffix \ - _$(s)_.lo,$(SIZEOBJS))) $(am__append_1) $(am__append_3) \ - $(am__append_4) $(am__append_5) -@ARCH_AARCH64_HAVE_LSE128_TRUE@@ARCH_AARCH64_LINUX_TRUE@@HAVE_IFUNC_TRUE@AM_CPPFLAGS = -DHAVE_FEAT_LSE128 + _$(s)_.lo,$(SIZEOBJS))) $(am__append_3) $(am__append_5) \ + $(am__append_6) $(am__append_7) +@ARCH_AARCH64_LINUX_TRUE@@HAVE_IFUNC_TRUE@AM_CPPFLAGS = \ +@ARCH_AARCH64_LINUX_TRUE@@HAVE_IFUNC_TRUE@ $(am__append_1) \ +@ARCH_AARCH64_LINUX_TRUE@@HAVE_IFUNC_TRUE@ $(am__append_2) @ARCH_AARCH64_LINUX_TRUE@@HAVE_IFUNC_TRUE@IFUNC_OPTIONS = -march=armv8-a+lse @ARCH_ARM_LINUX_TRUE@@HAVE_IFUNC_TRUE@IFUNC_OPTIONS = -march=armv7-a+fp -DHAVE_KERNEL64 @ARCH_I386_TRUE@@HAVE_IFUNC_TRUE@IFUNC_OPTIONS = -march=i586 diff --git a/libatomic/acinclude.m4 b/libatomic/acinclude.m4 index 4197db8f404..ba8671ebb8e 100644 --- a/libatomic/acinclude.m4 +++ b/libatomic/acinclude.m4 @@ -102,6 +102,25 @@ AC_DEFUN([LIBAT_TEST_FEAT_LSE128],[ AM_CONDITIONAL([ARCH_AARCH64_HAVE_LSE128], [test x$libat_cv_have_feat_lse128 = xyes]) ]) +dnl +dnl Test if the host assembler supports armv8.2-a RCPC3 isns. +dnl +AC_DEFUN([LIBAT_TEST_FEAT_LRCPC3],[ + AC_CACHE_CHECK([for armv8.2-a LRCPC3 insn support], + [libat_cv_have_feat_lrcpc3],[ + AC_LANG_CONFTEST([AC_LANG_PROGRAM([],[asm(".arch armv8.2-a+rcpc3")])]) + if AC_TRY_EVAL(ac_link); then + eval libat_cv_have_feat_lrcpc3=yes + else + eval libat_cv_have_feat_lrcpc3=no + fi + rm -f conftest* + ]) + LIBAT_DEFINE_YESNO([HAVE_FEAT_LRCPC3], [$libat_cv_have_feat_lrcpc3], + [Have LRCPC3 support for 16 byte integers.]) + AM_CONDITIONAL([ARCH_AARCH64_HAVE_LRCPC3], [test x$libat_cv_have_feat_lrcpc3 = xyes]) +]) + dnl dnl Test if we have __atomic_load and __atomic_store for mode $1, size $2 dnl diff --git a/libatomic/auto-config.h.in b/libatomic/auto-config.h.in index 7c78933b07d..26d56e7da67 100644 --- a/libatomic/auto-config.h.in +++ b/libatomic/auto-config.h.in @@ -105,6 +105,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H +/* Have LRCPC3 support for 16 byte integers. */ +#undef HAVE_FEAT_LRCPC3 + /* Have LSE128 support for 16 byte integers. */ #undef HAVE_FEAT_LSE128 diff --git a/libatomic/config/linux/aarch64/atomic_16.S b/libatomic/config/linux/aarch64/atomic_16.S index 44a773031f8..31608663c6a 100644 --- a/libatomic/config/linux/aarch64/atomic_16.S +++ b/libatomic/config/linux/aarch64/atomic_16.S @@ -38,7 +38,13 @@ The libat__16_i2 entry points are used when LSE2 is available. */ #if HAVE_FEAT_LSE128 +# if HAVE_FEAT_LRCPC3 + .arch armv8-a+lse128+rcpc3 +# else .arch armv8-a+lse128 +# endif +#elif HAVE_FEAT_LRCPC3 + .arch armv8-a+lse+rcpc3 #else .arch armv8-a+lse #endif @@ -70,8 +76,10 @@ name##feat: \ .set alias##from, alias##to; #define CORE -#define LSE128 _i1 -#define LSE2 _i2 +#define LSE128_LRCPC3 _i1 +#define LSE128 _i2 +#define LRCPC3 _i3 +#define LSE2 _i4 #define res0 x0 #define res1 x1 @@ -124,6 +132,29 @@ ENTRY (libat_load_16, CORE) END (libat_load_16, CORE) +#if HAVE_FEAT_LRCPC3 +ENTRY (libat_load_16, LRCPC3) + cbnz w1, 1f + + /* RELAXED. */ + ldp res0, res1, [x0] + ret +1: + cmp w1, SEQ_CST + b.eq 2f + + /* ACQUIRE/CONSUME (Load-AcquirePC semantics). */ + ldiapp res0, res1, [x0] + ret + + /* SEQ_CST. */ +2: ldar tmp0, [x0] /* Block reordering with Store-Release instr. */ + ldiapp res0, res1, [x0] + ret +END (libat_load_16, LRCPC3) +#endif + + ENTRY (libat_load_16, LSE2) cbnz w1, 1f @@ -164,6 +195,21 @@ ENTRY (libat_store_16, CORE) END (libat_store_16, CORE) +#if HAVE_FEAT_LRCPC3 +ENTRY (libat_store_16, LRCPC3) + cbnz w4, 1f + + /* RELAXED. */ + stp in0, in1, [x0] + ret + + /* RELEASE/SEQ_CST. */ +1: stilp in0, in1, [x0] + ret +END (libat_store_16, LRCPC3) +#endif + + ENTRY (libat_store_16, LSE2) cbnz w4, 1f @@ -702,6 +748,27 @@ ENTRY (libat_test_and_set_16, CORE) END (libat_test_and_set_16, CORE) +/* Alias all LSE128_LRCPC3 ifuncs to their specific implementations, + that is, map it to LSE128, LRCPC or CORE as appropriate. */ + +ALIAS (libat_exchange_16, LSE128_LRCPC3, LSE128) +ALIAS (libat_fetch_or_16, LSE128_LRCPC3, LSE128) +ALIAS (libat_fetch_and_16, LSE128_LRCPC3, LSE128) +ALIAS (libat_or_fetch_16, LSE128_LRCPC3, LSE128) +ALIAS (libat_and_fetch_16, LSE128_LRCPC3, LSE128) +ALIAS (libat_load_16, LSE128_LRCPC3, LRCPC3) +ALIAS (libat_store_16, LSE128_LRCPC3, LRCPC3) +ALIAS (libat_compare_exchange_16, LSE128_LRCPC3, LSE2) +ALIAS (libat_fetch_add_16, LSE128_LRCPC3, LSE2) +ALIAS (libat_add_fetch_16, LSE128_LRCPC3, LSE2) +ALIAS (libat_fetch_sub_16, LSE128_LRCPC3, LSE2) +ALIAS (libat_sub_fetch_16, LSE128_LRCPC3, LSE2) +ALIAS (libat_fetch_xor_16, LSE128_LRCPC3, LSE2) +ALIAS (libat_xor_fetch_16, LSE128_LRCPC3, LSE2) +ALIAS (libat_fetch_nand_16, LSE128_LRCPC3, LSE2) +ALIAS (libat_nand_fetch_16, LSE128_LRCPC3, LSE2) +ALIAS (libat_test_and_set_16, LSE128_LRCPC3, LSE2) + /* Alias entry points which are the same in LSE2 and LSE128. */ #if !HAVE_FEAT_LSE128 @@ -724,6 +791,29 @@ ALIAS (libat_fetch_nand_16, LSE128, LSE2) ALIAS (libat_nand_fetch_16, LSE128, LSE2) ALIAS (libat_test_and_set_16, LSE128, LSE2) + +/* Alias entry points which are the same in LRCPC3 and LSE2. */ + +#if !HAVE_FEAT_LRCPC3 +ALIAS (libat_load_16, LRCPC3, LSE2) +ALIAS (libat_store_16, LRCPC3, LSE2) +#endif +ALIAS (libat_exchange_16, LRCPC3, LSE2) +ALIAS (libat_fetch_or_16, LRCPC3, LSE2) +ALIAS (libat_fetch_and_16, LRCPC3, LSE2) +ALIAS (libat_or_fetch_16, LRCPC3, LSE2) +ALIAS (libat_and_fetch_16, LRCPC3, LSE2) +ALIAS (libat_compare_exchange_16, LRCPC3, LSE2) +ALIAS (libat_fetch_add_16, LRCPC3, LSE2) +ALIAS (libat_add_fetch_16, LRCPC3, LSE2) +ALIAS (libat_fetch_sub_16, LRCPC3, LSE2) +ALIAS (libat_sub_fetch_16, LRCPC3, LSE2) +ALIAS (libat_fetch_xor_16, LRCPC3, LSE2) +ALIAS (libat_xor_fetch_16, LRCPC3, LSE2) +ALIAS (libat_fetch_nand_16, LRCPC3, LSE2) +ALIAS (libat_nand_fetch_16, LRCPC3, LSE2) +ALIAS (libat_test_and_set_16, LRCPC3, LSE2) + /* Alias entry points which are the same in baseline and LSE2. */ ALIAS (libat_exchange_16, LSE2, CORE) diff --git a/libatomic/config/linux/aarch64/host-config.h b/libatomic/config/linux/aarch64/host-config.h index d873e91b1c9..445003217bf 100644 --- a/libatomic/config/linux/aarch64/host-config.h +++ b/libatomic/config/linux/aarch64/host-config.h @@ -26,11 +26,13 @@ #ifdef HWCAP_USCAT # if N == 16 -# define IFUNC_COND_1 (has_lse128 (hwcap)) -# define IFUNC_COND_2 (has_lse2 (hwcap)) -# define IFUNC_NCOND(N) 2 +# define IFUNC_COND_1 (has_lse128 (hwcap) && has_rcpc3 (hwcap)) +# define IFUNC_COND_2 (has_lse128 (hwcap)) +# define IFUNC_COND_3 (has_rcpc3 (hwcap)) +# define IFUNC_COND_4 (has_lse2 (hwcap)) +# define IFUNC_NCOND(N) 4 # else -# define IFUNC_COND_1 (hwcap & HWCAP_ATOMICS) +# define IFUNC_COND_1 (hwcap & HWCAP_ATOMICS) # define IFUNC_NCOND(N) 1 # endif #else @@ -81,6 +83,14 @@ has_lse2 (unsigned long hwcap) (val & 0xf00000) >= 0x300000; \ }) +/* LRCPC atomic support encoded in ID_AA64ISAR1_EL1.Atomic, + bits[23:20]. The expected value is 0b0011. Check that. */ +#define HAS_LRCPC3() ({ \ + unsigned long val; \ + asm volatile ("mrs %0, ID_AA64ISAR1_EL1" : "=r" (val)); \ + (val & 0xf00000) >= 0x300000; \ + }) + static inline bool has_lse128 (unsigned long hwcap) { @@ -88,6 +98,14 @@ has_lse128 (unsigned long hwcap) return true; return false; } + +static inline bool +has_rcpc3 (unsigned long hwcap) +{ + if (has_lse2 (hwcap) && HAS_LRCPC3 ()) + return true; + return false; +} #endif #include_next diff --git a/libatomic/configure b/libatomic/configure index ee3bbb97d69..248ac215dac 100755 --- a/libatomic/configure +++ b/libatomic/configure @@ -657,6 +657,8 @@ LIBAT_BUILD_VERSIONED_SHLIB_TRUE OPT_LDFLAGS SECTION_LDFLAGS SYSROOT_CFLAGS_FOR_TARGET +ARCH_AARCH64_HAVE_LRCPC3_FALSE +ARCH_AARCH64_HAVE_LRCPC3_TRUE ARCH_AARCH64_HAVE_LSE128_FALSE ARCH_AARCH64_HAVE_LSE128_TRUE enable_aarch64_lse @@ -11458,7 +11460,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11461 "configure" +#line 11463 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -11564,7 +11566,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11567 "configure" +#line 11569 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -11977,6 +11979,55 @@ else fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for armv8.2-a LRCPC3 insn support" >&5 +$as_echo_n "checking for armv8.2-a LRCPC3 insn support... " >&6; } +if ${libat_cv_have_feat_lrcpc3+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +asm(".arch armv8.2-a+rcpc3") + ; + return 0; +} +_ACEOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + eval libat_cv_have_feat_lrcpc3=yes + else + eval libat_cv_have_feat_lrcpc3=no + fi + rm -f conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libat_cv_have_feat_lrcpc3" >&5 +$as_echo "$libat_cv_have_feat_lrcpc3" >&6; } + + yesno=`echo $libat_cv_have_feat_lrcpc3 | tr 'yesno' '1 0 '` + +cat >>confdefs.h <<_ACEOF +#define HAVE_FEAT_LRCPC3 $yesno +_ACEOF + + + if test x$libat_cv_have_feat_lrcpc3 = xyes; then + ARCH_AARCH64_HAVE_LRCPC3_TRUE= + ARCH_AARCH64_HAVE_LRCPC3_FALSE='#' +else + ARCH_AARCH64_HAVE_LRCPC3_TRUE='#' + ARCH_AARCH64_HAVE_LRCPC3_FALSE= +fi + + ;; esac @@ -16044,6 +16095,10 @@ if test -z "${ARCH_AARCH64_HAVE_LSE128_TRUE}" && test -z "${ARCH_AARCH64_HAVE_LS as_fn_error $? "conditional \"ARCH_AARCH64_HAVE_LSE128\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${ARCH_AARCH64_HAVE_LRCPC3_TRUE}" && test -z "${ARCH_AARCH64_HAVE_LRCPC3_FALSE}"; then + as_fn_error $? "conditional \"ARCH_AARCH64_HAVE_LRCPC3\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi if test -z "${LIBAT_BUILD_VERSIONED_SHLIB_TRUE}" && test -z "${LIBAT_BUILD_VERSIONED_SHLIB_FALSE}"; then as_fn_error $? "conditional \"LIBAT_BUILD_VERSIONED_SHLIB\" was never defined. diff --git a/libatomic/configure.ac b/libatomic/configure.ac index b2fe68d7d0f..77cec927f86 100644 --- a/libatomic/configure.ac +++ b/libatomic/configure.ac @@ -170,6 +170,7 @@ case "$target" in *aarch64*) ACX_PROG_CC_WARNING_OPTS([-march=armv8-a+lse],[enable_aarch64_lse]) LIBAT_TEST_FEAT_LSE128() + LIBAT_TEST_FEAT_LRCPC3() ;; esac diff --git a/libatomic/libatomic_i.h b/libatomic/libatomic_i.h index 1b474e79bf0..605ddba81e3 100644 --- a/libatomic/libatomic_i.h +++ b/libatomic/libatomic_i.h @@ -275,6 +275,24 @@ bool libat_is_lock_free (size_t, void *) MAN(is_lock_free); return C3(libat_,X,_i3); \ return C2(libat_,X); \ } +# elif IFUNC_NCOND(N) == 4 +# define GEN_SELECTOR(X) \ + extern typeof(C2(libat_,X)) C3(libat_,X,_i1) HIDDEN; \ + extern typeof(C2(libat_,X)) C3(libat_,X,_i2) HIDDEN; \ + extern typeof(C2(libat_,X)) C3(libat_,X,_i3) HIDDEN; \ + extern typeof(C2(libat_,X)) C3(libat_,X,_i4) HIDDEN; \ + static typeof(C2(libat_,X)) * C2(select_,X) (IFUNC_RESOLVER_ARGS) \ + { \ + if (IFUNC_COND_1) \ + return C3(libat_,X,_i1); \ + if (IFUNC_COND_2) \ + return C3(libat_,X,_i2); \ + if (IFUNC_COND_3) \ + return C3(libat_,X,_i3); \ + if (IFUNC_COND_4) \ + return C3(libat_,X,_i4); \ + return C2(libat_,X); \ + } # else # error "Unsupported number of ifunc alternatives." # endif -- 2.42.0