From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtpout140.security-mail.net (smtpout140.security-mail.net [85.31.212.143]) by sourceware.org (Postfix) with ESMTPS id 6941D3858423 for ; Mon, 17 Jul 2023 09:03:42 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 6941D3858423 Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=kalrayinc.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=kalrayinc.com Received: from localhost (localhost [127.0.0.1]) by fx403.security-mail.net (Postfix) with ESMTP id 6C04472F3AC for ; Mon, 17 Jul 2023 11:03:41 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kalrayinc.com; s=sec-sig-email; t=1689584621; bh=rJREp5J2THttIj8o86SMzwzJEhlnfQNQ29z/TLNAVu4=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=jPN95yHrcqQFpZxF6pafy3ikpC2GO5R9Wz9DGAoGWQpAKaKBppbXgcMg2sold/g5Z gDm6TGMQXX7bZOmB+xngZNxajIQ4WqQgSS7VjuEiGbHEgqbcx7A9UtxSpmSr331xeo mFYnF/lOBhwyTSANt84C8Sg8mKH72e6kLwyLpQMk= Received: from fx403 (localhost [127.0.0.1]) by fx403.security-mail.net (Postfix) with ESMTP id 26B3772F901 for ; Mon, 17 Jul 2023 11:03:41 +0200 (CEST) Received: from FRA01-PR2-obe.outbound.protection.outlook.com (mail-pr2fra01lp0107.outbound.protection.outlook.com [104.47.24.107]) by fx403.security-mail.net (Postfix) with ESMTPS id 4D8F372F900 for ; Mon, 17 Jul 2023 11:03:40 +0200 (CEST) Received: from MR2P264MB0113.FRAP264.PROD.OUTLOOK.COM (2603:10a6:500:11::21) by PAZP264MB3040.FRAP264.PROD.OUTLOOK.COM (2603:10a6:102:1e7::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6588.32; Mon, 17 Jul 2023 09:03:39 +0000 Received: from MR2P264MB0113.FRAP264.PROD.OUTLOOK.COM ([fe80::a854:17f0:8f2a:f6d9]) by MR2P264MB0113.FRAP264.PROD.OUTLOOK.COM ([fe80::a854:17f0:8f2a:f6d9%4]) with mapi id 15.20.6588.031; Mon, 17 Jul 2023 09:03:39 +0000 X-Virus-Scanned: E-securemail Secumail-id: <85d6.64b503ec.4bc20.0> ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=U2pDqQJtFE2xyJr6Pubz8+gc/horfQo0uoES5NOV21+wOFURS/aiccmgjKRb96RocGVA8wHOHW8ZlU49mO8dcJOFQoGI4Tp3zUNSD1QmJUs7wBZbxU4fjrgYwiY4QMYmjZ2O9pV/txFAYzXpaczVLWeTwx7VR91IXlxxMAqb91m0fb5TkRb/7yCEhJiLjmFKhpIRuzqYsIuW5QDAkO3w6cf1BegM4HCK7iR9Xn9fs9dI43KSuTc4mF6XMkCq7yQgollNqtdtPmhVqtWwSbLhlKOdux/XnLK9E1XrRQRLD5EBSrdjXUKkfmdV+P6QSIOX+uyrmu7tXRfR+h/GB9M3xw== 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=RXRRZt+zxGgq5qbmC8s4W/M3vKfZsoT0FDVk4ovXtyY=; b=OXrWdhIcFgKQJ0tsQluo8n9g1FayLjr18mXpbfBtvTUTVKP9OGuD+z2jfhX3m35neDo7y9COYSEqlBmUGRTDY6tbywh7YTceviuRmxjCBhNPJIC/f0YIAHEB9IxrpplQe/A9qF1xNgRqixRhR4BwJkic06u6nRX56m2hjPoFh1Fr1eCf3Fj6HVGJfTznvTUB2fguTVF5pyZafpQO/Uh2TK3w4XBFHLSuehBDPOE9vYNnAHqHCbrhsA4FEJHU/4PCUaULREL4d9XcSoMNIm3yI0B7QrSGwYeXRkVHADyQxkxV5BAkXzRkyMBV2rCAujZSaSPHe3kgtqJW7RaVNQUOPQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=kalrayinc.com; dmarc=pass action=none header.from=kalrayinc.com; dkim=pass header.d=kalrayinc.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kalrayinc.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=RXRRZt+zxGgq5qbmC8s4W/M3vKfZsoT0FDVk4ovXtyY=; b=Ht0SicYYa2b/yxtMDWwzR4TKYEIGDLRM+XZDCEQNb5o8g97kO+A8HkfzwmwjOLXqMIr8ZyZTy4W/GHCALCfI4tsRkj6B3i2XhLv7Fo3gPn6pCx9k18mrUkU6qre4WsEDUTwslzOBD6djNa9I/dMdDmlmDcfWnLMw5BOXLS32Id9RW6sMDVRIhEaDAwt8Q1h5mK13AdRABMb/3cD2LdkzbVBfwJ7mBNHU/PRdtoyG3cX1udA1s+q6ap7xWrB1iqPdE0vhaom+5iClPSsive7+TVx9cqwhd/iu+f2K30TIACCqNL0Pcop5Jfzvmktq5jk1Gu5EZNM2YE0OwbkZLBSb8g== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=kalrayinc.com; From: Sylvain Noiry To: gcc-patches@gcc.gnu.org Cc: Sylvain Noiry Subject: [PATCH 3/9] Native complex operations: Add gen_rtx_complex hook Date: Mon, 17 Jul 2023 11:02:44 +0200 Message-ID: <20230717090250.4645-4-snoiry@kalrayinc.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20230717090250.4645-1-snoiry@kalrayinc.com> References: <20230717090250.4645-1-snoiry@kalrayinc.com> X-ClientProxiedBy: LO2P265CA0309.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:a5::33) To MR2P264MB0113.FRAP264.PROD.OUTLOOK.COM (2603:10a6:500:11::21) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MR2P264MB0113:EE_|PAZP264MB3040:EE_ X-MS-Office365-Filtering-Correlation-Id: 8c28eac3-7b8e-4062-1af9-08db86a4b614 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: Y61IY3Vr+c93zVOkW2RxuUPQqWu2aVZiK7qJUu/UV4/QUahgPuYWQGvSQZS0LIjja/tzg7KSZEGU3EjstyRR6WiTwtZ4b9aJjUr/JS+o6Z4HOPyZDWiTfyzddWESdKLktpx0IzENL7EkSCyvyL48h6EyCls0yDWLjmy5RauYsRKV7JaOSxS6BioQC2QlWkqoe8ySIA6tzKt1haaF4HDiVVmBxKib1Bepci4un9iJXJdTMIpRX2gmrcPdhH4hDlY7Eib/dTAlFjwYe+2huQqzkfZUi1fsnuONuEqQiecGmgitgq3Us7kn1pQ2wzhO6+/gweVxmWE+P7nH1eL4U12XcJIygiDVjlBQn1dSLQQGyjj+zeYxHhHeDyF4dHg/PB2NLIXRhF00ajLS+c01fNblWuOQSS0CqTbbRpER2/kUch8dEx9ErjFqSy0AG7672kr/Dw7lurIEplCuDKOdLGSxV4wOQy+T4sDDlz274MK1Qp2+Y8rrUXSl9sx40JC6q9XbK0kR1CGaDvMteOohxvUe53zuHi7tXkFFfUL5fPjP/hibIN9lBzVwxv8SG/oW07I3 X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MR2P264MB0113.FRAP264.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230028)(4636009)(396003)(366004)(346002)(136003)(39850400004)(376002)(451199021)(478600001)(6486002)(6666004)(186003)(1076003)(6506007)(26005)(6512007)(107886003)(2906002)(41300700001)(316002)(6916009)(4326008)(66476007)(66946007)(66556008)(5660300002)(36756003)(8676002)(8936002)(38100700002)(86362001)(2616005)(83380400001);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: QuwSdbaGuOvU7Gi7Tg7KdJc9i0EJnAuxrTa4C5s9TeaaxZlLstCoQcyWq/8GRpltHbvdGOlmzeZDU0gmkYh4/ZKK4rLi8rEuyQ+mp1uZpHaMd9k+LK2YsYk/OHK5QopD/QjgcjbCmYEuei+QlHcKuPS/ZCQePJSwddN220tOakFzAgGeDVGmG3xP3CHS7E/rauJ1bjnVldmvPgAnQzja2ukFuqqrADpFMp/5D74ZkjmeCE9mbXNMAq6cVi+JL3PwO5DPFeMX9meYc8T0GR0riYhpgBhjQsn10faaRngXjmlepk0xLgBfeOr+URCBopBDXEIONSwAbIEvcJjgn+k8koYKsKahqC2xjpSPBIg1M5aeFGVsVy7P0odJnsZmJrX7uZ9RnRUSIbop6GxTua75lfrH+M5RMdrnmyAYZghuIXzWdoJfMHa6mWTRLAt1MXPOL2PCAaL5vrp+wdU9PbExNBUls9GrPWtXzIYIBHQMIzAUQNg14FsyM43kecsZXQDNixJRHWII5VBNXRSZQ7KOeKIpZQOpQGnNAV+mytWB6lyEy+YZyJ4ZTHId7Yq/V1PU8swsMfN/YexStU0+70najny9xdmPSlx5irin8cnpR/qNQvkxUw/JeHt8RyIL16bVXCa+UiNcYLZdt2llDih2kvY28uRG5vJtnvJXq3E8N/vJcldhcLSN1POSJ7yIhGHpLzaAz0ijn/N0Y39pe45elB7FCTBmKGW7nyzYF03eOdEXuSfOru36vPWZC+8jkQgbqHV7zBQyKPQxPYmjGJQFu1DxZk3x9lpQgVL2i4KWTJ9zpWtFb5ez5MmmJ7PGriSfiUIZjwnY3OUQQ/WJ1317/uPsgMGZGcJH+wQooj7cpkG6tMExq00q0ketHAtTo7d/791eEDF3NBNnIlXaIg5rxvBYMSRJE3nJKkMizXPhJCG9nU/Say8E81KANVoNqtAk DNjl3sdAhSLI70XRxNOfyNN8GWU6oc/qpKMYNc0RsLj9xz3t5UuX5RnStbab2uRm19+7zrFHorpYwEVDFh/EDdQT7zsQ9st9oAbykdkzgU01Wk1wdngFXLKMj4B3tAYcKwiW/iykOknYRP3HxHRVvnt9PtLi0Tr5+FvDaBwNTlu3vR156DFOWGfecfI/J8K/D83oxnC7ubPFxiPIyw8MHS12HwZOQByAZFlLZw7JteUKoRU11o1UCvJc1mKCjhpS+MKjUQpO4pjqwXqpsJX12K2NdiPHsL23GG1RIkaoHxxvGpiuTfmNlH98vURK1H9EtIViEtyxn0hRNKwCVwAguGGK8AbS+Kq2Ov6LRJOHaF7s3ksi4vYc1imtc3syzWvSYbeNvWCxhZ7M8bmwTL9K6VqsIvtBbZ4AVG57XNZf1csMtWY2VlCrTSXXr6jteCZ/k21nZ8TS7YpG74vVt2u2vJKQE27Za0x2wuW0Bd9UU894MxeaQDz5lDnyU6GZDBwW5jIH+GnfbdZYLq0ySjeyDrD/3ArGlOjviXvGtMjAnNbmpAHoPVxonI6KicJkDrqVAMKuAlpyiL0VNKaLkQihDEjnPiRxIz/ZT0f6tIFv/Wbg3rBVpEmw3PT92MjBEaj+ X-OriginatorOrg: kalrayinc.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8c28eac3-7b8e-4062-1af9-08db86a4b614 X-MS-Exchange-CrossTenant-AuthSource: MR2P264MB0113.FRAP264.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Jul 2023 09:03:39.1392 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 8931925d-7620-4a64-b7fe-20afd86363d3 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: mC5Ok6DbOwg556h48aBVcnLCtO8OAAxko2vApPPej0bk9X7YiexLmzONGxukv7vYu5tyKtFRKLdXOnb1d18BdQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAZP264MB3040 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-ALTERMIMEV2_out: done X-Spam-Status: No, score=-11.5 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_DNSWL_LOW,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE 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: Add a new target hook for complex element creation during the expand pass, called gen_rtx_complex. The default implementation calls gen_rtx_CONCAT like before. Then calls to gen_rtx_CONCAT for complex handling are replaced by calls to targetm.gen_rtx_complex. gcc/ChangeLog: * target.def: Add gen_rtx_complex target hook * targhooks.cc (default_gen_rtx_complex): New: Default implementation for gen_rtx_complex * targhooks.h: Add default_gen_rtx_complex * doc/tm.texi: Document TARGET_GEN_RTX_COMPLEX * doc/tm.texi.in: Add TARGET_GEN_RTX_COMPLEX * emit-rtl.cc (gen_reg_rtx): Replace call to gen_rtx_CONCAT by call to gen_rtx_complex (init_emit_once): Likewise * expmed.cc (flip_storage_order): Likewise * optabs.cc (expand_doubleword_mod): Likewise --- gcc/doc/tm.texi | 6 ++++++ gcc/doc/tm.texi.in | 2 ++ gcc/emit-rtl.cc | 26 +++++++++----------------- gcc/expmed.cc | 2 +- gcc/optabs.cc | 12 +++++++----- gcc/target.def | 10 ++++++++++ gcc/targhooks.cc | 27 +++++++++++++++++++++++++++ gcc/targhooks.h | 2 ++ 8 files changed, 64 insertions(+), 23 deletions(-) diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index 87997b76338..b73147aea9f 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -4605,6 +4605,12 @@ to return a nonzero value when it is required, the compiler will run out of spill registers and print a fatal error message. @end deftypefn +@deftypefn {Target Hook} rtx TARGET_GEN_RTX_COMPLEX (machine_mode @var{mode}, rtx @var{real_part}, rtx @var{imag_part}) +This hook should return an rtx representing a complex of mode @var{machine_mode} built from @var{real_part} and @var{imag_part}. + If both arguments are @code{NULL}, create them as registers. + The default is @code{gen_rtx_CONCAT}. +@end deftypefn + @deftypefn {Target Hook} rtx TARGET_READ_COMPLEX_PART (rtx @var{cplx}, complex_part_t @var{part}) This hook should return the rtx representing the specified @var{part} of the complex given by @var{cplx}. @var{part} can be the real part, the imaginary part, or both of them. diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in index efbf972e6a7..dd39e450903 100644 --- a/gcc/doc/tm.texi.in +++ b/gcc/doc/tm.texi.in @@ -3390,6 +3390,8 @@ stack. @hook TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P +@hook TARGET_GEN_RTX_COMPLEX + @hook TARGET_READ_COMPLEX_PART @hook TARGET_WRITE_COMPLEX_PART diff --git a/gcc/emit-rtl.cc b/gcc/emit-rtl.cc index f6276a2d0b6..22012bfea13 100644 --- a/gcc/emit-rtl.cc +++ b/gcc/emit-rtl.cc @@ -1190,19 +1190,7 @@ gen_reg_rtx (machine_mode mode) if (generating_concat_p && (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT || GET_MODE_CLASS (mode) == MODE_COMPLEX_INT)) - { - /* For complex modes, don't make a single pseudo. - Instead, make a CONCAT of two pseudos. - This allows noncontiguous allocation of the real and imaginary parts, - which makes much better code. Besides, allocating DCmode - pseudos overstrains reload on some machines like the 386. */ - rtx realpart, imagpart; - machine_mode partmode = GET_MODE_INNER (mode); - - realpart = gen_reg_rtx (partmode); - imagpart = gen_reg_rtx (partmode); - return gen_rtx_CONCAT (mode, realpart, imagpart); - } + return targetm.gen_rtx_complex (mode, NULL, NULL); /* Do not call gen_reg_rtx with uninitialized crtl. */ gcc_assert (crtl->emit.regno_pointer_align_length); @@ -6274,14 +6262,18 @@ init_emit_once (void) FOR_EACH_MODE_IN_CLASS (mode, MODE_COMPLEX_INT) { - rtx inner = const_tiny_rtx[0][(int)GET_MODE_INNER (mode)]; - const_tiny_rtx[0][(int) mode] = gen_rtx_CONCAT (mode, inner, inner); + machine_mode imode = GET_MODE_INNER (mode); + rtx inner = const_tiny_rtx[0][(int) imode]; + const_tiny_rtx[0][(int) mode] = + targetm.gen_rtx_complex (mode, inner, inner); } FOR_EACH_MODE_IN_CLASS (mode, MODE_COMPLEX_FLOAT) { - rtx inner = const_tiny_rtx[0][(int)GET_MODE_INNER (mode)]; - const_tiny_rtx[0][(int) mode] = gen_rtx_CONCAT (mode, inner, inner); + machine_mode imode = GET_MODE_INNER (mode); + rtx inner = const_tiny_rtx[0][(int) imode]; + const_tiny_rtx[0][(int) mode] = + targetm.gen_rtx_complex (mode, inner, inner); } FOR_EACH_MODE_IN_CLASS (mode, MODE_VECTOR_BOOL) diff --git a/gcc/expmed.cc b/gcc/expmed.cc index 2f787cc28f9..8a18161827b 100644 --- a/gcc/expmed.cc +++ b/gcc/expmed.cc @@ -400,7 +400,7 @@ flip_storage_order (machine_mode mode, rtx x) real = flip_storage_order (GET_MODE_INNER (mode), real); imag = flip_storage_order (GET_MODE_INNER (mode), imag); - return gen_rtx_CONCAT (mode, real, imag); + return targetm.gen_rtx_complex (mode, real, imag); } if (UNLIKELY (reverse_storage_order_supported < 0)) diff --git a/gcc/optabs.cc b/gcc/optabs.cc index 4e9f58f8060..18900e8113e 100644 --- a/gcc/optabs.cc +++ b/gcc/optabs.cc @@ -1001,16 +1001,18 @@ expand_doubleword_mod (machine_mode mode, rtx op0, rtx op1, bool unsignedp) machine_mode cmode = TYPE_MODE (ctype); rtx op00 = operand_subword_force (op0, 0, mode); rtx op01 = operand_subword_force (op0, 1, mode); - rtx cres = gen_rtx_CONCAT (cmode, gen_reg_rtx (word_mode), - gen_reg_rtx (word_mode)); + rtx cres = targetm.gen_rtx_complex (cmode, gen_reg_rtx (word_mode), + gen_reg_rtx (word_mode)); tree lhs = make_tree (ctype, cres); tree arg0 = make_tree (wtype, op00); tree arg1 = make_tree (wtype, op01); expand_addsub_overflow (UNKNOWN_LOCATION, PLUS_EXPR, lhs, arg0, arg1, true, true, true, false, NULL); - sum = expand_simple_binop (word_mode, PLUS, XEXP (cres, 0), - XEXP (cres, 1), NULL_RTX, 1, - OPTAB_DIRECT); + sum = + expand_simple_binop (word_mode, PLUS, + read_complex_part (cres, REAL_P), + read_complex_part (cres, IMAG_P), NULL_RTX, + 1, OPTAB_DIRECT); if (sum == NULL_RTX) return NULL_RTX; } diff --git a/gcc/target.def b/gcc/target.def index 9798c0f58e4..ee1dfdc7565 100644 --- a/gcc/target.def +++ b/gcc/target.def @@ -3306,6 +3306,16 @@ a pointer to int.", bool, (ao_ref *ref), default_ref_may_alias_errno) +/* Return the rtx representation of a complex with a specified mode. */ +DEFHOOK +(gen_rtx_complex, + "This hook should return an rtx representing a complex of mode @var{machine_mode} built from @var{real_part} and @var{imag_part}.\n\ + If both arguments are @code{NULL}, create them as registers.\n\ + The default is @code{gen_rtx_CONCAT}.", + rtx, + (machine_mode mode, rtx real_part, rtx imag_part), + default_gen_rtx_complex) + /* Returns the value corresponding to the specified part of a complex. */ DEFHOOK (read_complex_part, diff --git a/gcc/targhooks.cc b/gcc/targhooks.cc index d33fcbd9a13..4ea40c643a8 100644 --- a/gcc/targhooks.cc +++ b/gcc/targhooks.cc @@ -1532,6 +1532,33 @@ default_preferred_simd_mode (scalar_mode) return word_mode; } +/* By default, call gen_rtx_CONCAT. */ + +rtx +default_gen_rtx_complex (machine_mode mode, rtx real_part, rtx imag_part) +{ + /* For complex modes, don't make a single pseudo. + Instead, make a CONCAT of two pseudos. + This allows noncontiguous allocation of the real and imaginary parts, + which makes much better code. Besides, allocating DCmode + pseudos overstrains reload on some machines like the 386. */ + machine_mode imode = GET_MODE_INNER (mode); + + if (real_part == NULL) + real_part = gen_reg_rtx (imode); + else + gcc_assert ((GET_MODE (real_part) == imode) + || (GET_MODE (real_part) == E_VOIDmode)); + + if (imag_part == NULL) + imag_part = gen_reg_rtx (imode); + else + gcc_assert ((GET_MODE (imag_part) == imode) + || (GET_MODE (imag_part) == E_VOIDmode)); + + return gen_rtx_CONCAT (mode, real_part, imag_part); +} + /* By default, extract one of the components of the complex value CPLX. Extract the real part if part is REAL_P, and the imaginary part if it is IMAG_P. If part is BOTH_P, return cplx directly*/ diff --git a/gcc/targhooks.h b/gcc/targhooks.h index 805abd96938..811cd6165de 100644 --- a/gcc/targhooks.h +++ b/gcc/targhooks.h @@ -124,6 +124,8 @@ extern opt_machine_mode default_get_mask_mode (machine_mode); extern bool default_empty_mask_is_expensive (unsigned); extern vector_costs *default_vectorize_create_costs (vec_info *, bool); +extern rtx default_gen_rtx_complex (machine_mode mode, rtx real_part, + rtx imag_part); extern rtx default_read_complex_part (rtx cplx, complex_part_t part); extern void default_write_complex_part (rtx cplx, rtx val, complex_part_t part, -- 2.17.1