From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 96917 invoked by alias); 10 Feb 2020 11:37:51 -0000 Mailing-List: contact binutils-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sourceware.org Received: (qmail 96795 invoked by uid 89); 10 Feb 2020 11:37:49 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-20.0 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_LOTSOFHASH,LIKELY_SPAM_BODY,MSGID_FROM_MTA_HEADER,RCVD_IN_DNSWL_NONE,SCC_10_SHORT_WORD_LINES,SCC_20_SHORT_WORD_LINES,SCC_35_SHORT_WORD_LINES,SCC_5_SHORT_WORD_LINES,SPF_HELO_PASS,SPF_PASS,UNPARSEABLE_RELAY autolearn=ham version=3.3.1 spammy=matthew, H*MI:prod, fe000000, fe80 X-HELO: EUR03-AM5-obe.outbound.protection.outlook.com Received: from mail-eopbgr30042.outbound.protection.outlook.com (HELO EUR03-AM5-obe.outbound.protection.outlook.com) (40.107.3.42) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 10 Feb 2020 11:37:37 +0000 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=xBajNiR+d66Ig6JElSqPIsAKXYZqr241LLqAp3nj5Yo=; b=2bippE86CIPRjhYSBO74+mqH7dXazHlTBGkS3ncLv91sILZ3DU+7EaeTWMQ/SowSeGpSlO3POqIpgUNJlaAHTJQpLGftA9ZVbG4jdOpFRQAanjP5lcR0lfBoOSmonTKG6t/TIpR/B1c2fx47hhhp9XTIRAXclzT4yse7A3zCxl0= Received: from VI1PR0802CA0014.eurprd08.prod.outlook.com (2603:10a6:800:aa::24) by DBBPR08MB4234.eurprd08.prod.outlook.com (2603:10a6:10:c1::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2707.24; Mon, 10 Feb 2020 11:37:29 +0000 Received: from DB5EUR03FT010.eop-EUR03.prod.protection.outlook.com (2a01:111:f400:7e0a::203) by VI1PR0802CA0014.outlook.office365.com (2603:10a6:800:aa::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2707.21 via Frontend Transport; Mon, 10 Feb 2020 11:37:28 +0000 Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; sourceware.org; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;sourceware.org; dmarc=bestguesspass 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; Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by DB5EUR03FT010.mail.protection.outlook.com (10.152.20.96) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2665.18 via Frontend Transport; Mon, 10 Feb 2020 11:37:26 +0000 Received: ("Tessian outbound 1f9bda537fdc:v42"); Mon, 10 Feb 2020 11:37:26 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 287b74322d761bf4 X-CR-MTA-TID: 64aa7808 Received: from e6c925635c85.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id D6DE4BA8-CFA0-4925-9E97-EDB605FBA6D8.1; Mon, 10 Feb 2020 11:37:21 +0000 Received: from EUR04-VI1-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id e6c925635c85.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Mon, 10 Feb 2020 11:37:21 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=l59mdL2j+sRiDN4qu86XpfJnFRktOBy6ICr+GBbjk+tOYGDimUYTm4XD4IGXbkCRGaNo7+3Qsa2CArwLAnTOHl3A49T1hlsTKcy3EtbZKZ0j8rYZ+DzY2TblWXQC575K29JkAsIkgXAqx7QOTjwPWZYPuh8QRQzI2Ry5hQF7jCUlk9heVBO9e1ldV+cWibO5IxlUFYkyq3p2Y3L97mjoB9RYEmOsNXYI9IqNx/+/isGNKl/fZybWtfp+bpVR4s3ngacMuwhjIqYYWmxz2wn7EvSMBpIv+OlefNoXzRGjYs9/c2g7Xg2pkvezTZ9gNmWjdEa4JYYxYUnp2Kh7LvNK+g== 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-SenderADCheck; bh=xBajNiR+d66Ig6JElSqPIsAKXYZqr241LLqAp3nj5Yo=; b=MgobeF6xiSkHeOjXlzBCKSZHac4owZeR70TO/BI7vEc9eNZVdNWhXX3WSh46NES1BKPdmvnLaBe8RiahStcW0UH7p7VKXvPQ2jObgGzRUQ/AAtOawFipcfFmil48i7yn4sG5cRMkGrMCJccPaMgQu2Z5MUudDqgOkazK8j67ee831tWinCiywFEL0GCM7P+pic2sz8TzUw9YALyUWTSPJT+7O//rvtiRpgXlr9LjJ9yCdtXGsYJjBb5BmOGWz5/84i4jFqjuyfvEir07w8AbtlVQKDvr46FgWxe63hrevnMEPXDbWWdp7WPrWGeQf02+0nByseKn7YxPd40w8jPx/g== 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=xBajNiR+d66Ig6JElSqPIsAKXYZqr241LLqAp3nj5Yo=; b=2bippE86CIPRjhYSBO74+mqH7dXazHlTBGkS3ncLv91sILZ3DU+7EaeTWMQ/SowSeGpSlO3POqIpgUNJlaAHTJQpLGftA9ZVbG4jdOpFRQAanjP5lcR0lfBoOSmonTKG6t/TIpR/B1c2fx47hhhp9XTIRAXclzT4yse7A3zCxl0= Authentication-Results-Original: spf=none (sender IP is ) smtp.mailfrom=Matthew.Malcomson@arm.com; Received: from AM6PR08MB4326.eurprd08.prod.outlook.com (20.179.6.11) by AM6PR08MB4311.eurprd08.prod.outlook.com (20.179.4.204) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2707.23; Mon, 10 Feb 2020 11:37:18 +0000 Received: from AM6PR08MB4326.eurprd08.prod.outlook.com ([fe80::c08d:e5d6:6518:d4bb]) by AM6PR08MB4326.eurprd08.prod.outlook.com ([fe80::c08d:e5d6:6518:d4bb%5]) with mapi id 15.20.2707.030; Mon, 10 Feb 2020 11:37:18 +0000 Content-Type: multipart/mixed; boundary="===============7521995002192562515==" From: Matthew Malcomson Date: Mon, 10 Feb 2020 11:37:00 -0000 To: binutils@sourceware.org Cc: Richard.Earnshaw@arm.com, nickc@redhat.com, nd@arm.com, ramana.radhakrishnan@arm.com Subject: [Patch 1/2] [binutils][arm] arm support for ARMv8.m Custom Datapath Extension In-Reply-To: <158133346517.10770.13178331135147729297.scripted-patch-series@arm.com> References: <158133346517.10770.13178331135147729297.scripted-patch-series@arm.com> Message-ID: MIME-Version: 1.0 Received: from e120487-lin.cambridge.arm.com (217.140.106.52) by LO2P123CA0013.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:a6::25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2707.21 via Frontend Transport; Mon, 10 Feb 2020 11:37:17 +0000 X-MS-Exchange-Transport-Forked: True x-checkrecipientrouted: true X-MS-Oob-TLC-OOBClassifiers: OLM:2043;OLM:2043; X-Forefront-Antispam-Report-Untrusted: SFV:NSPM;SFS:(10009020)(4636009)(396003)(39860400002)(376002)(346002)(136003)(366004)(189003)(199004)(6512007)(9686003)(86362001)(44832011)(66946007)(33656002)(2906002)(52536014)(316002)(26005)(6666004)(4326008)(8936002)(966005)(52116002)(235185007)(30864003)(6916009)(478600001)(66616009)(66476007)(956004)(186003)(8676002)(16526019)(5660300002)(81166006)(66556008)(6486002)(81156014)(559001)(579004)(473944003)(357404004);DIR:OUT;SFP:1101;SCL:1;SRVR:AM6PR08MB4311;H:AM6PR08MB4326.eurprd08.prod.outlook.com;FPR:;SPF:None;LANG:en;PTR:InfoNoRecords;MX:1;A:1; Received-SPF: None (protection.outlook.com: arm.com does not designate permitted sender hosts) X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: wL7rhjk8mcMJyDkQgBtAlOzH2E7UtWrltKAil7Zpuih3lNJTy9rFbS4w2XadxI8NWX96PGzijYmOEeKC+9lZC34nZ3zKJZD6SwSp8A1R7I+1pv1BKu6G6+mij0zVEu2650lK9xJ+vV+BcVtJtC4F1qPRpHGo5q20uf9N/JX3ufjH1ftCQXbpPZMBQWW7jPI3U2h6ZGUTbHdjEv/7Q4kBMw9HpsrKLNUFjc8E4Fuomby0+SaHbykGoaUkJ8BROTKNmxFoVDBKmGEz9vO0FfTqzWtj7Wip7NmznkK9K9ILwBdkYJf01gReqBohKc+t9dq0ySpi23wkluLDJXkTl3RWHKPkr5Le+U1cyJG7voDiGNoqAj5d7/1b/gXiJeKuyxNzgha7lL2L1gfIZuYTBYcT+Nnw5Ig+ZCRQz4myBLNx3qpR92imtcc5wEaLN5g4zqM+5n+jl07+AuxN9aUcleW0xzdanPj4FekmijxZZ+tYwlH32lR8MDwUUBsy5p1CIvozR2GSlUaEMekqWCAx1KCWcTEJDx/eATatAWqyk0FaWnpQF5Xak2KHw58z1wPlqVrMvUxyW7+yj9ff+UrahdbcJA== X-MS-Exchange-AntiSpam-MessageData: BNQpdST5PK45UlCKr4Z2N+1ZV+JhicTwlvKPP6bmO0EfMe4PKq84UXG4jV99oXulyi0Cx9h0c7/53YNFuh2FcguHRWTeSlhURdv2UKLsrGA52z/zLrA0G2KUqy4lZmqXqqGtUaz46PtNKvTgLGJQjQ== Original-Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Matthew.Malcomson@arm.com; Return-Path: Matthew.Malcomson@arm.com X-MS-Exchange-Transport-CrossTenantHeadersStripped: DB5EUR03FT010.eop-EUR03.prod.protection.outlook.com X-MS-Office365-Filtering-Correlation-Id-Prvs: 90725e82-068c-4b9c-babe-08d7ae1d9535 X-IsSubscribed: yes X-SW-Source: 2020-02/txt/msg00135.txt.bz2 --===============7521995002192562515== Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-length: 68477 This patch is part of a series that adds support for the Armv8.m ARMv8.m Custom Datapath Extension to binutils. This patch introduces the Custom Instructions Class 1/2/3 (Single/ Dual, Accumulator/Non-accumulator varianats) to the arm backend. The following Custom Instructions are added: cx1, cx1a, cx1d, cx1da, cx2, cx2a, cx2d, cx2da, cx3, cx3a, cx3d, cx3da. Specification can be found at https://developer.arm.com/docs/ddi0607/latest This patch distinguishes between enabling CDE for different coprocessor numbers by defining multiple architecture flags. This means that the parsing of the architecture extension flags is kept entirely in the existing code path. We introduce a new IT block state to indicate the behaviour of these instructions. This new state allows being used in an IT block or outside an IT block, but does not allow the instruction to be used inside a VPT block. We need this since the CX*A instruction versions can be used in IT blocks, but they aren't to have the conditional suffixes on them. Hence we need to mark an instruction as allowed in either position. We also need a new flag to objdump, in order to determine whether to disassemble an instruction as CDE related or not. Successfully regression tested on arm-none-eabi, and arm-wince-pe. gas/ChangeLog: 2020-02-10 Stam Markianos-Wright Matthew Malcomson * config/tc-arm.c (arm_ext_cde*): New feature sets for each CDE coprocessor that can be enabled. (enum pred_instruction_type): New pred type. (BAD_NO_VPT): New error message. (BAD_CDE): New error message. (BAD_CDE_COPROC): New error message. (enum operand_parse_code): Add new immediate operands. (parse_operands): Account for new immediate operands. (check_cde_operand): New. (cde_coproc_enabled): New. (cde_coproc_pos): New. (cde_handle_coproc): New. (cxn_handle_predication): New. (do_custom_instruction_1): New. (do_custom_instruction_2): New. (do_custom_instruction_3): New. (do_cx1): New. (do_cx1a): New. (do_cx1d): New. (do_cx1da): New. (do_cx2): New. (do_cx2a): New. (do_cx2d): New. (do_cx2da): New. (do_cx3): New. (do_cx3a): New. (do_cx3d): New. (do_cx3da): New. (handle_pred_state): Define new IT block behaviour. (insns): Add newn CX*{,d}{,a} instructions. (CDE_EXTENSIONS,armv8m_main_ext_table,armv8_1m_main_ext_table): Define new cdecp extension strings. * doc/c-arm.texi: Document new cdecp extension arguments. * testsuite/gas/arm/cde-scalar.d: New test. * testsuite/gas/arm/cde-scalar.s: New test. * testsuite/gas/arm/cde-warnings.d: New test. * testsuite/gas/arm/cde-warnings.l: New test. * testsuite/gas/arm/cde-warnings.s: New test. * testsuite/gas/arm/cde.d: New test. * testsuite/gas/arm/cde.s: New test. include/ChangeLog: 2020-02-10 Stam Markianos-Wright Matthew Malcomson * opcode/arm.h (ARM_EXT2_CDE): New extension macro. (ARM_EXT2_CDE0): New extension macro. (ARM_EXT2_CDE1): New extension macro. (ARM_EXT2_CDE2): New extension macro. (ARM_EXT2_CDE3): New extension macro. (ARM_EXT2_CDE4): New extension macro. (ARM_EXT2_CDE5): New extension macro. (ARM_EXT2_CDE6): New extension macro. (ARM_EXT2_CDE7): New extension macro. opcodes/ChangeLog: 2020-02-10 Stam Markianos-Wright Matthew Malcomson * arm-dis.c (struct cdeopcode32): New. (CDE_OPCODE): New macro. (cde_opcodes): New disassembly table. (regnames): New option to table. (cde_coprocs): New global variable. (print_insn_cde): New (print_insn_thumb32): Use print_insn_cde. (parse_arm_disassembler_options): Parse coprocN args. ############### Attachment also inlined for ease of reply ############### diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index 16cbac4279ef96d0edff57f83cb20935ae5196eb..b6a1867d28bfefdfd8035a7f48e287b8cb58ba4e 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -282,6 +282,24 @@ static const arm_feature_set arm_ext_i8mm = ARM_FEATURE_CORE_HIGH (ARM_EXT2_I8MM); static const arm_feature_set arm_ext_crc = ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC); +static const arm_feature_set arm_ext_cde = + ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE); +static const arm_feature_set arm_ext_cde0 = + ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE0); +static const arm_feature_set arm_ext_cde1 = + ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE1); +static const arm_feature_set arm_ext_cde2 = + ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE2); +static const arm_feature_set arm_ext_cde3 = + ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE3); +static const arm_feature_set arm_ext_cde4 = + ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE4); +static const arm_feature_set arm_ext_cde5 = + ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE5); +static const arm_feature_set arm_ext_cde6 = + ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE6); +static const arm_feature_set arm_ext_cde7 = + ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE7); static const arm_feature_set arm_arch_any = ARM_ANY; static const arm_feature_set fpu_any = FPU_ANY; @@ -482,7 +500,9 @@ enum pred_instruction_type VPT_INSN, /* The VPT/VPST insn has been parsed. */ MVE_OUTSIDE_PRED_INSN , /* Instruction to indicate a MVE instruction without a predication code. */ - MVE_UNPREDICABLE_INSN /* MVE instruction that is non-predicable. */ + MVE_UNPREDICABLE_INSN, /* MVE instruction that is non-predicable. */ + NEUTRAL_IT_NO_VPT_INSN, /* Instruction that can be either inside or outside + an IT block, but must not be in a VPT block. */ }; /* The maximum number of operands we need. */ @@ -882,6 +902,7 @@ struct asm_opcode #define BAD_ADDR_MODE _("instruction does not accept this addressing mode") #define BAD_BRANCH _("branch must be last instruction in IT block") #define BAD_BRANCH_OFF _("branch out of range or not a multiple of 2") +#define BAD_NO_VPT _("instruction not allowed in VPT block") #define BAD_NOT_IT _("instruction not allowed in IT block") #define BAD_NOT_VPT _("instruction missing MVE vector predication code") #define BAD_FPU _("selected FPU does not support instruction") @@ -899,6 +920,8 @@ struct asm_opcode #define BAD_RANGE _("branch out of range") #define BAD_FP16 _("selected processor does not support fp16 instruction") #define BAD_BF16 _("selected processor does not support bf16 instruction") +#define BAD_CDE _("selected processor does not support cde instruction") +#define BAD_CDE_COPROC _("coprocessor for insn is not enabled for cde") #define UNPRED_REG(R) _("using " R " results in unpredictable behaviour") #define THUMB1_RELOC_ONLY _("relocation valid in thumb1 code only") #define MVE_NOT_IT _("Warning: instruction is UNPREDICTABLE in an IT " \ @@ -7138,7 +7161,8 @@ enum operand_parse_code OP_I64, /* 1 .. 64 */ OP_I64z, /* 0 .. 64 */ OP_I255, /* 0 .. 255 */ - + OP_I511, /* 0 .. 511 */ + OP_I8191, /* 0 .. 8191 */ OP_I4b, /* immediate, prefix optional, 1 .. 4 */ OP_I7b, /* 0 .. 7 */ OP_I15b, /* 0 .. 15 */ @@ -7653,7 +7677,8 @@ parse_operands (char *str, const unsigned int *pattern, bfd_boolean thumb) case OP_I64: po_imm_or_fail ( 1, 64, FALSE); break; case OP_I64z: po_imm_or_fail ( 0, 64, FALSE); break; case OP_I255: po_imm_or_fail ( 0, 255, FALSE); break; - + case OP_I511: po_imm_or_fail ( 0, 511, FALSE); break; + case OP_I8191: po_imm_or_fail ( 0, 8191, FALSE); break; case OP_I4b: po_imm_or_fail ( 1, 4, TRUE); break; case OP_oI7b: case OP_I7b: po_imm_or_fail ( 0, 7, TRUE); break; @@ -21572,6 +21597,249 @@ do_vummla (void) } +static void +check_cde_operand (size_t index, int is_dual) +{ + unsigned Rx = inst.operands[index].reg; + bfd_boolean isvec = inst.operands[index].isvec; + if (is_dual == 0 && thumb_mode) + constraint ( + !((Rx <= 14 && Rx != 13) || (Rx == REG_PC && isvec)), + _("Register must be r0-r14 except r13, or APSR_nzcv.")); + else + constraint ( !((Rx <= 10 && Rx % 2 == 0 )), + _("Register must be an even register between r0-r10.")); +} + +static bfd_boolean +cde_coproc_enabled (unsigned coproc) +{ + switch (coproc) + { + case 0: return mark_feature_used (&arm_ext_cde0); + case 1: return mark_feature_used (&arm_ext_cde1); + case 2: return mark_feature_used (&arm_ext_cde2); + case 3: return mark_feature_used (&arm_ext_cde3); + case 4: return mark_feature_used (&arm_ext_cde4); + case 5: return mark_feature_used (&arm_ext_cde5); + case 6: return mark_feature_used (&arm_ext_cde6); + case 7: return mark_feature_used (&arm_ext_cde7); + default: return FALSE; + } +} + +#define cde_coproc_pos 8 +static void +cde_handle_coproc (void) +{ + unsigned coproc = inst.operands[0].reg; + constraint (coproc > 7, _("CDE Coprocessor must be in range 0-7")); + constraint (!(cde_coproc_enabled (coproc)), BAD_CDE_COPROC); + inst.instruction |= coproc << cde_coproc_pos; +} +#undef cde_coproc_pos + +static void +cxn_handle_predication (bfd_boolean is_accum) +{ + /* This function essentially checks for a suffix, not whether the instruction + is inside an IT block or not. + The CX* instructions should never have a conditional suffix -- this is not + mentioned in the syntax. */ + if (conditional_insn ()) + inst.error = BAD_SYNTAX; + /* Here we ensure that if the current element */ + else if (is_accum) + set_pred_insn_type (NEUTRAL_IT_NO_VPT_INSN); + else + set_pred_insn_type (OUTSIDE_PRED_INSN); +} + +static void +do_custom_instruction_1 (int is_dual, bfd_boolean is_accum) +{ + + constraint (!mark_feature_used (&arm_ext_cde), _(BAD_CDE)); + + unsigned imm, Rd; + + Rd = inst.operands[1].reg; + check_cde_operand (1, is_dual); + + if (is_dual == 1) + { + constraint (inst.operands[2].reg != Rd + 1, + _("cx1d requires consecutive destination registers.")); + imm = inst.operands[3].imm; + } + else if (is_dual == 0) + imm = inst.operands[2].imm; + else + abort (); + + inst.instruction |= Rd << 12; + inst.instruction |= (imm & 0x1F80) << 9; + inst.instruction |= (imm & 0x0040) << 1; + inst.instruction |= (imm & 0x003f); + + cde_handle_coproc (); + cxn_handle_predication (is_accum); +} + +static void +do_custom_instruction_2 (int is_dual, bfd_boolean is_accum) +{ + + constraint (!mark_feature_used (&arm_ext_cde), _(BAD_CDE)); + + unsigned imm, Rd, Rn; + + Rd = inst.operands[1].reg; + + if (is_dual == 1) + { + constraint (inst.operands[2].reg != Rd + 1, + _("cx2d requires consecutive destination registers.")); + imm = inst.operands[4].imm; + Rn = inst.operands[3].reg; + } + else if (is_dual == 0) + { + imm = inst.operands[3].imm; + Rn = inst.operands[2].reg; + } + else + abort (); + + check_cde_operand (2 + is_dual, /* is_dual = */0); + check_cde_operand (1, is_dual); + + inst.instruction |= Rd << 12; + inst.instruction |= Rn << 16; + + inst.instruction |= (imm & 0x0380) << 13; + inst.instruction |= (imm & 0x0040) << 1; + inst.instruction |= (imm & 0x003f); + + cde_handle_coproc (); + cxn_handle_predication (is_accum); +} + +static void +do_custom_instruction_3 (int is_dual, bfd_boolean is_accum) +{ + + constraint (!mark_feature_used (&arm_ext_cde), _(BAD_CDE)); + + unsigned imm, Rd, Rn, Rm; + + Rd = inst.operands[1].reg; + + if (is_dual == 1) + { + constraint (inst.operands[2].reg != Rd + 1, + _("cx3d requires consecutive destination registers.")); + imm = inst.operands[5].imm; + Rn = inst.operands[3].reg; + Rm = inst.operands[4].reg; + } + else if (is_dual == 0) + { + imm = inst.operands[4].imm; + Rn = inst.operands[2].reg; + Rm = inst.operands[3].reg; + } + else + abort (); + + check_cde_operand (1, is_dual); + check_cde_operand (2 + is_dual, /* is_dual = */0); + check_cde_operand (3 + is_dual, /* is_dual = */0); + + inst.instruction |= Rd; + inst.instruction |= Rn << 16; + inst.instruction |= Rm << 12; + + inst.instruction |= (imm & 0x0038) << 17; + inst.instruction |= (imm & 0x0004) << 5; + inst.instruction |= (imm & 0x0003) << 4; + + cde_handle_coproc (); + cxn_handle_predication (is_accum); +} + +static void +do_cx1 (void) +{ + return do_custom_instruction_1 (0, 0); +} + +static void +do_cx1a (void) +{ + return do_custom_instruction_1 (0, 1); +} + +static void +do_cx1d (void) +{ + return do_custom_instruction_1 (1, 0); +} + +static void +do_cx1da (void) +{ + return do_custom_instruction_1 (1, 1); +} + +static void +do_cx2 (void) +{ + return do_custom_instruction_2 (0, 0); +} + +static void +do_cx2a (void) +{ + return do_custom_instruction_2 (0, 1); +} + +static void +do_cx2d (void) +{ + return do_custom_instruction_2 (1, 0); +} + +static void +do_cx2da (void) +{ + return do_custom_instruction_2 (1, 1); +} + +static void +do_cx3 (void) +{ + return do_custom_instruction_3 (0, 0); +} + +static void +do_cx3a (void) +{ + return do_custom_instruction_3 (0, 1); +} + +static void +do_cx3d (void) +{ + return do_custom_instruction_3 (1, 0); +} + +static void +do_cx3da (void) +{ + return do_custom_instruction_3 (1, 1); +} + /* Crypto v1 instructions. */ static void do_crypto_2op_1 (unsigned elttype, int op) @@ -22474,6 +22742,7 @@ handle_pred_state (void) gas_assert (0); case IF_INSIDE_IT_LAST_INSN: case NEUTRAL_IT_INSN: + case NEUTRAL_IT_NO_VPT_INSN: break; case VPT_INSN: @@ -22537,6 +22806,13 @@ handle_pred_state (void) close_automatic_it_block (); break; + case NEUTRAL_IT_NO_VPT_INSN: + if (now_pred.type == VECTOR_PRED) + { + inst.error = BAD_NO_VPT; + break; + } + /* Fallthrough. */ case NEUTRAL_IT_INSN: now_pred.block_length++; now_pred.insn_cond = TRUE; @@ -22720,6 +22996,13 @@ handle_pred_state (void) } break; + case NEUTRAL_IT_NO_VPT_INSN: + if (now_pred.type == VECTOR_PRED) + { + inst.error = BAD_NO_VPT; + break; + } + /* Fallthrough. */ case NEUTRAL_IT_INSN: /* The BKPT instruction is unconditional even in a IT or VPT block. */ @@ -26097,6 +26380,24 @@ static const struct asm_opcode insns[] = TUF ("vusmmla", ca00c40, fca00c40, 3, (RNQ, RNQ, RNQ), vsmmla, vsmmla), TUF ("vusdot", c800d00, fc800d00, 3, (RNDQ, RNDQ, RNDQ_RNSC), vusdot, vusdot), TUF ("vsudot", c800d10, fc800d10, 3, (RNDQ, RNDQ, RNSC), vsudot, vsudot), + +#undef ARM_VARIANT +#undef THUMB_VARIANT +#define THUMB_VARIANT &arm_ext_cde + ToC ("cx1", ee000000, 3, (RCP, APSR_RR, I8191), cx1), + ToC ("cx1a", fe000000, 3, (RCP, APSR_RR, I8191), cx1a), + ToC ("cx1d", ee000040, 4, (RCP, RR, APSR_RR, I8191), cx1d), + ToC ("cx1da", fe000040, 4, (RCP, RR, APSR_RR, I8191), cx1da), + + ToC ("cx2", ee400000, 4, (RCP, APSR_RR, APSR_RR, I511), cx2), + ToC ("cx2a", fe400000, 4, (RCP, APSR_RR, APSR_RR, I511), cx2a), + ToC ("cx2d", ee400040, 5, (RCP, RR, APSR_RR, APSR_RR, I511), cx2d), + ToC ("cx2da", fe400040, 5, (RCP, RR, APSR_RR, APSR_RR, I511), cx2da), + + ToC ("cx3", ee800000, 5, (RCP, APSR_RR, APSR_RR, APSR_RR, I63), cx3), + ToC ("cx3a", fe800000, 5, (RCP, APSR_RR, APSR_RR, APSR_RR, I63), cx3a), + ToC ("cx3d", ee800040, 6, (RCP, RR, APSR_RR, APSR_RR, APSR_RR, I63), cx3d), + ToC ("cx3da", fe800040, 6, (RCP, RR, APSR_RR, APSR_RR, APSR_RR, I63), cx3da), }; #undef ARM_VARIANT #undef THUMB_VARIANT @@ -31278,12 +31579,23 @@ static const struct arm_ext_table armv86a_ext_table[] = { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE } }; +#define CDE_EXTENSIONS \ + ARM_ADD ("cdecp0", ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE | ARM_EXT2_CDE0)), \ + ARM_ADD ("cdecp1", ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE | ARM_EXT2_CDE1)), \ + ARM_ADD ("cdecp2", ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE | ARM_EXT2_CDE2)), \ + ARM_ADD ("cdecp3", ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE | ARM_EXT2_CDE3)), \ + ARM_ADD ("cdecp4", ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE | ARM_EXT2_CDE4)), \ + ARM_ADD ("cdecp5", ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE | ARM_EXT2_CDE5)), \ + ARM_ADD ("cdecp6", ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE | ARM_EXT2_CDE6)), \ + ARM_ADD ("cdecp7", ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE | ARM_EXT2_CDE7)) + static const struct arm_ext_table armv8m_main_ext_table[] = { ARM_EXT ("dsp", ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP | ARM_EXT_V6_DSP), ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP | ARM_EXT_V6_DSP)), ARM_EXT ("fp", FPU_ARCH_VFP_V5_SP_D16, ALL_FP), ARM_ADD ("fp.dp", FPU_ARCH_VFP_V5D16), + CDE_EXTENSIONS, { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE } }; @@ -31303,9 +31615,12 @@ static const struct arm_ext_table armv8_1m_main_ext_table[] = ARM_ADD ("mve.fp", ARM_FEATURE (0, ARM_EXT2_FP16_INST | ARM_EXT2_MVE | ARM_EXT2_MVE_FP, FPU_VFP_V5_SP_D16 | FPU_VFP_EXT_FP16 | FPU_VFP_EXT_FMA)), + CDE_EXTENSIONS, { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE } }; +#undef CDE_EXTENSIONS + static const struct arm_ext_table armv8r_ext_table[] = { ARM_ADD ("crc", ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC)), diff --git a/gas/doc/c-arm.texi b/gas/doc/c-arm.texi index e19d2a83aad437c9d4779a9dc16513554c904567..91803605775418bcc795e163f42b0beaec880967 100644 --- a/gas/doc/c-arm.texi +++ b/gas/doc/c-arm.texi @@ -359,6 +359,14 @@ For @code{armv8-m.main}: @code{+fp}: Enables single-precision only VFPv5 instructions with 16 double-word registers. @code{+fp.dp}: Enables VFPv5 instructions with 16 double-word registers. +@code{+cdecp0} (CDE extensions for v8-m architecture with coprocessor 0), +@code{+cdecp1} (CDE extensions for v8-m architecture with coprocessor 1), +@code{+cdecp2} (CDE extensions for v8-m architecture with coprocessor 2), +@code{+cdecp3} (CDE extensions for v8-m architecture with coprocessor 3), +@code{+cdecp4} (CDE extensions for v8-m architecture with coprocessor 4), +@code{+cdecp5} (CDE extensions for v8-m architecture with coprocessor 5), +@code{+cdecp6} (CDE extensions for v8-m architecture with coprocessor 6), +@code{+cdecp7} (CDE extensions for v8-m architecture with coprocessor 7), @code{+nofp}: Disables all FPU instructions. @code{+nodsp}: Disables DSP Extension. diff --git a/gas/testsuite/gas/arm/cde-scalar.d b/gas/testsuite/gas/arm/cde-scalar.d new file mode 100644 index 0000000000000000000000000000000000000000..36260128f4189746e621419f7b495479013d2a2e --- /dev/null +++ b/gas/testsuite/gas/arm/cde-scalar.d @@ -0,0 +1,117 @@ +#name: Custom Datapath Extension Scalar bits (CDE) +#source: cde-scalar.s +#as: -mno-warn-deprecated -march=armv8-m.main+cdecp0+cdecp7 -I$srcdir/$subdir +#as: -mno-warn-deprecated -march=armv8-m.main+cdecp0+cdecp1+cdecp2+cdecp3+cdecp4+cdecp5+cdecp6+cdecp7 -I$srcdir/$subdir +#objdump: -M force-thumb -dr --show-raw-insn -marmv8-m.main -M coproc0=cde -M coproc7=cde +#... +00000000 <\.text>: + *[0-9a-f]+: ee00 0000 cx1 p0, r0, #0 + *[0-9a-f]+: ee3f 0000 cx1 p0, r0, #8064 + *[0-9a-f]+: ee00 0080 cx1 p0, r0, #64 + *[0-9a-f]+: ee00 003f cx1 p0, r0, #63 + *[0-9a-f]+: ee00 0700 cx1 p7, r0, #0 + *[0-9a-f]+: ee00 f000 cx1 p0, APSR_nzcv, #0 + *[0-9a-f]+: ee00 9000 cx1 p0, r9, #0 + *[0-9a-f]+: fe00 0000 cx1a p0, r0, #0 + *[0-9a-f]+: fe3f 0000 cx1a p0, r0, #8064 + *[0-9a-f]+: fe00 0080 cx1a p0, r0, #64 + *[0-9a-f]+: fe00 003f cx1a p0, r0, #63 + *[0-9a-f]+: fe00 0700 cx1a p7, r0, #0 + *[0-9a-f]+: fe00 f000 cx1a p0, APSR_nzcv, #0 + *[0-9a-f]+: fe00 9000 cx1a p0, r9, #0 + *[0-9a-f]+: bf18 it ne + *[0-9a-f]+: fe00 0000 cx1a p0, r0, #0 + *[0-9a-f]+: ee00 0040 cx1d p0, r0, r1, #0 + *[0-9a-f]+: ee3f 0040 cx1d p0, r0, r1, #8064 + *[0-9a-f]+: ee00 00c0 cx1d p0, r0, r1, #64 + *[0-9a-f]+: ee00 007f cx1d p0, r0, r1, #63 + *[0-9a-f]+: ee00 0740 cx1d p7, r0, r1, #0 + *[0-9a-f]+: ee00 a040 cx1d p0, sl, fp, #0 + *[0-9a-f]+: fe00 0040 cx1da p0, r0, r1, #0 + *[0-9a-f]+: fe3f 0040 cx1da p0, r0, r1, #8064 + *[0-9a-f]+: fe00 00c0 cx1da p0, r0, r1, #64 + *[0-9a-f]+: fe00 007f cx1da p0, r0, r1, #63 + *[0-9a-f]+: fe00 0740 cx1da p7, r0, r1, #0 + *[0-9a-f]+: fe00 a040 cx1da p0, sl, fp, #0 + *[0-9a-f]+: bf18 it ne + *[0-9a-f]+: fe00 0040 cx1da p0, r0, r1, #0 + *[0-9a-f]+: ee40 0000 cx2 p0, r0, r0, #0 + *[0-9a-f]+: ee70 0000 cx2 p0, r0, r0, #384 + *[0-9a-f]+: ee40 0080 cx2 p0, r0, r0, #64 + *[0-9a-f]+: ee40 003f cx2 p0, r0, r0, #63 + *[0-9a-f]+: ee40 0700 cx2 p7, r0, r0, #0 + *[0-9a-f]+: ee40 f000 cx2 p0, APSR_nzcv, r0, #0 + *[0-9a-f]+: ee40 9000 cx2 p0, r9, r0, #0 + *[0-9a-f]+: ee4f 0000 cx2 p0, r0, APSR_nzcv, #0 + *[0-9a-f]+: ee49 0000 cx2 p0, r0, r9, #0 + *[0-9a-f]+: fe40 0000 cx2a p0, r0, r0, #0 + *[0-9a-f]+: fe70 0000 cx2a p0, r0, r0, #384 + *[0-9a-f]+: fe40 0080 cx2a p0, r0, r0, #64 + *[0-9a-f]+: fe40 003f cx2a p0, r0, r0, #63 + *[0-9a-f]+: fe40 0700 cx2a p7, r0, r0, #0 + *[0-9a-f]+: fe40 f000 cx2a p0, APSR_nzcv, r0, #0 + *[0-9a-f]+: fe40 9000 cx2a p0, r9, r0, #0 + *[0-9a-f]+: fe4f 0000 cx2a p0, r0, APSR_nzcv, #0 + *[0-9a-f]+: fe49 0000 cx2a p0, r0, r9, #0 + *[0-9a-f]+: bf18 it ne + *[0-9a-f]+: fe40 0000 cx2a p0, r0, r0, #0 + *[0-9a-f]+: ee40 0040 cx2d p0, r0, r1, r0, #0 + *[0-9a-f]+: ee70 0040 cx2d p0, r0, r1, r0, #384 + *[0-9a-f]+: ee40 00c0 cx2d p0, r0, r1, r0, #64 + *[0-9a-f]+: ee40 007f cx2d p0, r0, r1, r0, #63 + *[0-9a-f]+: ee40 0740 cx2d p7, r0, r1, r0, #0 + *[0-9a-f]+: ee40 a040 cx2d p0, sl, fp, r0, #0 + *[0-9a-f]+: ee4f 0040 cx2d p0, r0, r1, APSR_nzcv, #0 + *[0-9a-f]+: ee49 0040 cx2d p0, r0, r1, r9, #0 + *[0-9a-f]+: fe40 0040 cx2da p0, r0, r1, r0, #0 + *[0-9a-f]+: fe70 0040 cx2da p0, r0, r1, r0, #384 + *[0-9a-f]+: fe40 00c0 cx2da p0, r0, r1, r0, #64 + *[0-9a-f]+: fe40 007f cx2da p0, r0, r1, r0, #63 + *[0-9a-f]+: fe40 0740 cx2da p7, r0, r1, r0, #0 + *[0-9a-f]+: fe40 a040 cx2da p0, sl, fp, r0, #0 + *[0-9a-f]+: fe4f 0040 cx2da p0, r0, r1, APSR_nzcv, #0 + *[0-9a-f]+: fe49 0040 cx2da p0, r0, r1, r9, #0 + *[0-9a-f]+: ee80 0000 cx3 p0, r0, r0, r0, #0 + *[0-9a-f]+: eef0 0000 cx3 p0, r0, r0, r0, #56 + *[0-9a-f]+: ee80 0080 cx3 p0, r0, r0, r0, #4 + *[0-9a-f]+: ee80 0030 cx3 p0, r0, r0, r0, #3 + *[0-9a-f]+: ee80 0700 cx3 p7, r0, r0, r0, #0 + *[0-9a-f]+: ee80 000f cx3 p0, APSR_nzcv, r0, r0, #0 + *[0-9a-f]+: ee80 0009 cx3 p0, r9, r0, r0, #0 + *[0-9a-f]+: ee8f 0000 cx3 p0, r0, APSR_nzcv, r0, #0 + *[0-9a-f]+: ee89 0000 cx3 p0, r0, r9, r0, #0 + *[0-9a-f]+: ee80 f000 cx3 p0, r0, r0, APSR_nzcv, #0 + *[0-9a-f]+: ee80 9000 cx3 p0, r0, r0, r9, #0 + *[0-9a-f]+: fe80 0000 cx3a p0, r0, r0, r0, #0 + *[0-9a-f]+: fef0 0000 cx3a p0, r0, r0, r0, #56 + *[0-9a-f]+: fe80 0080 cx3a p0, r0, r0, r0, #4 + *[0-9a-f]+: fe80 0030 cx3a p0, r0, r0, r0, #3 + *[0-9a-f]+: fe80 0700 cx3a p7, r0, r0, r0, #0 + *[0-9a-f]+: fe80 000f cx3a p0, APSR_nzcv, r0, r0, #0 + *[0-9a-f]+: fe80 0009 cx3a p0, r9, r0, r0, #0 + *[0-9a-f]+: fe8f 0000 cx3a p0, r0, APSR_nzcv, r0, #0 + *[0-9a-f]+: fe89 0000 cx3a p0, r0, r9, r0, #0 + *[0-9a-f]+: fe80 f000 cx3a p0, r0, r0, APSR_nzcv, #0 + *[0-9a-f]+: fe80 9000 cx3a p0, r0, r0, r9, #0 + *[0-9a-f]+: bf18 it ne + *[0-9a-f]+: fe80 0000 cx3a p0, r0, r0, r0, #0 + *[0-9a-f]+: ee80 0040 cx3d p0, r0, r1, r0, r0, #0 + *[0-9a-f]+: eef0 0040 cx3d p0, r0, r1, r0, r0, #56 + *[0-9a-f]+: ee80 00c0 cx3d p0, r0, r1, r0, r0, #4 + *[0-9a-f]+: ee80 0070 cx3d p0, r0, r1, r0, r0, #3 + *[0-9a-f]+: ee80 0740 cx3d p7, r0, r1, r0, r0, #0 + *[0-9a-f]+: ee80 004a cx3d p0, sl, fp, r0, r0, #0 + *[0-9a-f]+: ee8f 0040 cx3d p0, r0, r1, APSR_nzcv, r0, #0 + *[0-9a-f]+: ee89 0040 cx3d p0, r0, r1, r9, r0, #0 + *[0-9a-f]+: ee80 f040 cx3d p0, r0, r1, r0, APSR_nzcv, #0 + *[0-9a-f]+: ee80 9040 cx3d p0, r0, r1, r0, r9, #0 + *[0-9a-f]+: fe80 0040 cx3da p0, r0, r1, r0, r0, #0 + *[0-9a-f]+: fef0 0040 cx3da p0, r0, r1, r0, r0, #56 + *[0-9a-f]+: fe80 00c0 cx3da p0, r0, r1, r0, r0, #4 + *[0-9a-f]+: fe80 0070 cx3da p0, r0, r1, r0, r0, #3 + *[0-9a-f]+: fe80 0740 cx3da p7, r0, r1, r0, r0, #0 + *[0-9a-f]+: fe80 004a cx3da p0, sl, fp, r0, r0, #0 + *[0-9a-f]+: fe8f 0040 cx3da p0, r0, r1, APSR_nzcv, r0, #0 + *[0-9a-f]+: fe89 0040 cx3da p0, r0, r1, r9, r0, #0 + *[0-9a-f]+: fe80 f040 cx3da p0, r0, r1, r0, APSR_nzcv, #0 + *[0-9a-f]+: fe80 9040 cx3da p0, r0, r1, r0, r9, #0 diff --git a/gas/testsuite/gas/arm/cde-scalar.s b/gas/testsuite/gas/arm/cde-scalar.s new file mode 100644 index 0000000000000000000000000000000000000000..ac188a3aa03f9239262b1958417df45d0b635939 --- /dev/null +++ b/gas/testsuite/gas/arm/cde-scalar.s @@ -0,0 +1,206 @@ +.syntax unified +# Extra tests everywhere: +# Ensure that setting the register to something in r[1-12] works. + +# cx1{a} Has arguments in the following form +# 111a111000iiiiiidddd0pppi0iiiiii +# +# Variants to test: +# - Base (everything we can set to zero) +# - immediates that set each set of `i` to ones in turn. +# (imm = op1:op2:op3 , which is each group of `i` from left to write +# concatenated) +# - Each register 9 (0b1001), APSR_nzcv, or all zeros +# - Coprocessor num set to 7 +# - Everything again with the `a` version (to double check parsing). +# - Accumulator versions without optional argument (to check parsing) +# +# IT blocks: +# Non-accumulator versions are UNPREDICTABLE in IT blocks. +# Accumulator versions are allowed in IT blocks. + +# cx1{a} extra tests. +# Arm conditional +cx1 p0, r0, #0 +cx1 p0, r0, #8064 +cx1 p0, r0, #64 +cx1 p0, r0, #63 +cx1 p7, r0, #0 +cx1 p0, APSR_nzcv, #0 +cx1 p0, r9, #0 +cx1a p0, r0, #0 +cx1a p0, r0, #8064 +cx1a p0, r0, #64 +cx1a p0, r0, #63 +cx1a p7, r0, #0 +cx1a p0, APSR_nzcv, #0 +cx1a p0, r9, #0 + +it ne +cx1a p0, r0, #0 + +# cx1d{a} encoding of following form: +# 111a111000iiiiiidddd0pppi1iiiiii +# +# Variants to test: +# - Base (everything we can set to zero) +# - immediates that set each set of `i` to ones in turn. +# (imm = op1:op2:op3 , which is each group of `i` from left to write +# concatenated) +# - Destination register 10 (0b1010) or all zeros +# - Coprocessor num set to 7 +# - Everything again with the `a` version (to double check parsing). +# - Accumulator versions without optional argument (to check parsing) +cx1d p0, r0, r1, #0 +cx1d p0, r0, r1, #8064 +cx1d p0, r0, r1, #64 +cx1d p0, r0, r1, #63 +cx1d p7, r0, r1, #0 +cx1d p0, r10, r11, #0 +cx1da p0, r0, r1, #0 +cx1da p0, r0, r1, #8064 +cx1da p0, r0, r1, #64 +cx1da p0, r0, r1, #63 +cx1da p7, r0, r1, #0 +cx1da p0, r10, r11, #0 + +it ne +cx1da p0, r0, r1, #0 + + +# cx2{a} Has arguments of the following form: +# 111a111001iinnnndddd0pppi0iiiiii +# +# Variants to test: +# - Base (everything we can set to zero) +# - immediates that set each set of `i` to ones in turn. +# (imm = op1:op2:op3 , which is each group of `i` from left to write +# concatenated) +# - Each register 9 (0b1001), APSR_nzcv, or all zeros +# - Coprocessor num set to 7 +# - Everything again with the `a` version (to double check parsing). +# - Accumulator versions without optional argument (to check parsing) +cx2 p0, r0, r0, #0 +cx2 p0, r0, r0, #384 +cx2 p0, r0, r0, #64 +cx2 p0, r0, r0, #63 +cx2 p7, r0, r0, #0 +cx2 p0, APSR_nzcv, r0, #0 +cx2 p0, r9, r0, #0 +cx2 p0, r0, APSR_nzcv, #0 +cx2 p0, r0, r9, #0 +cx2a p0, r0, r0, #0 +cx2a p0, r0, r0, #384 +cx2a p0, r0, r0, #64 +cx2a p0, r0, r0, #63 +cx2a p7, r0, r0, #0 +cx2a p0, APSR_nzcv, r0, #0 +cx2a p0, r9, r0, #0 +cx2a p0, r0, APSR_nzcv, #0 +cx2a p0, r0, r9, #0 + +it ne +cx2a p0, r0, r0, #0 + +# cx2d{a} encoding has following form: +# 111a111001iinnnndddd0pppi1iiiiii +# +# - Base (everything we can set to zero) +# - immediates that set each set of `i` to ones in turn. +# (imm = op1:op2:op3 , which is each group of `i` from left to write +# concatenated) +# - Destination register 10 (0b1010) or all zeros +# - Coprocessor num set to 7 +# - Everything again with the `a` version (to double check parsing). +# - Accumulator versions without optional argument (to check parsing) +cx2d p0, r0, r1, r0, #0 +cx2d p0, r0, r1, r0, #384 +cx2d p0, r0, r1, r0, #64 +cx2d p0, r0, r1, r0, #63 +cx2d p7, r0, r1, r0, #0 +cx2d p0, r10, r11, r0, #0 +cx2d p0, r0, r1, APSR_nzcv, #0 +cx2d p0, r0, r1, r9, #0 +cx2da p0, r0, r1, r0, #0 +cx2da p0, r0, r1, r0, #384 +cx2da p0, r0, r1, r0, #64 +cx2da p0, r0, r1, r0, #63 +cx2da p7, r0, r1, r0, #0 +cx2da p0, r10, r11, r0, #0 +cx2da p0, r0, r1, APSR_nzcv, #0 +cx2da p0, r0, r1, r9, #0 + +# cx3{a} Has arguments in the following form: +# 111a11101iiinnnnmmmm0pppi0iidddd +# +# Variants to test: +# - immediates that set each set of `i` to ones in turn. +# (imm = op1:op2:op3 , which is each group of `i` from left to write +# - Base (everything we can set to zero) +# - immediates that set each set of `i` to ones in turn. +# (imm = op1:op2:op3 , which is each group of `i` from left to write +# concatenated) +# - Each register 9 (0b1001), APSR_nzcv, or all zeros +# - Coprocessor num set to 7 +# - Everything again with the `a` version (to double check parsing). +# - Accumulator versions without optional argument (to check parsing) +cx3 p0, r0, r0, r0, #0 +cx3 p0, r0, r0, r0, #56 +cx3 p0, r0, r0, r0, #4 +cx3 p0, r0, r0, r0, #3 +cx3 p7, r0, r0, r0, #0 +cx3 p0, APSR_nzcv, r0, r0, #0 +cx3 p0, r9, r0, r0, #0 +cx3 p0, r0, APSR_nzcv, r0, #0 +cx3 p0, r0, r9, r0, #0 +cx3 p0, r0, r0, APSR_nzcv, #0 +cx3 p0, r0, r0, r9, #0 +cx3a p0, r0, r0, r0, #0 +cx3a p0, r0, r0, r0, #56 +cx3a p0, r0, r0, r0, #4 +cx3a p0, r0, r0, r0, #3 +cx3a p7, r0, r0, r0, #0 +cx3a p0, APSR_nzcv, r0, r0, #0 +cx3a p0, r9, r0, r0, #0 +cx3a p0, r0, APSR_nzcv, r0, #0 +cx3a p0, r0, r9, r0, #0 +cx3a p0, r0, r0, APSR_nzcv, #0 +cx3a p0, r0, r0, r9, #0 + +it ne +cx3a p0, r0, r0, r0, #0 + +# cx3d{a} encoding has following form: +# 111a11101iiinnnnmmmm0pppi1iidddd +# +# Variants to test: +# - Toggle 'a' +# - immediates that set each set of `i` to ones in turn. +# (imm = op1:op2:op3 , which is each group of `i` from left to write +# concatenated) +# - Destination register 10 (0b1010) or all zeros +# - Source register 9 (0b1001), APSR_nzcv, or all zeros + +# No longer allows APSR_nzcv in destination register +cx3d p0, r0, r1, r0, r0, #0 +cx3d p0, r0, r1, r0, r0, #56 +cx3d p0, r0, r1, r0, r0, #4 +cx3d p0, r0, r1, r0, r0, #3 +cx3d p7, r0, r1, r0, r0, #0 +cx3d p0, r10, r11, r0, r0, #0 +cx3d p0, r0, r1, APSR_nzcv, r0, #0 +cx3d p0, r0, r1, r9, r0, #0 +cx3d p0, r0, r1, r0, APSR_nzcv, #0 +cx3d p0, r0, r1, r0, r9, #0 +cx3da p0, r0, r1, r0, r0, #0 +cx3da p0, r0, r1, r0, r0, #56 +cx3da p0, r0, r1, r0, r0, #4 +cx3da p0, r0, r1, r0, r0, #3 +cx3da p7, r0, r1, r0, r0, #0 +cx3da p0, r10, r11, r0, r0, #0 +cx3da p0, r0, r1, APSR_nzcv, r0, #0 +cx3da p0, r0, r1, r9, r0, #0 +cx3da p0, r0, r1, r0, APSR_nzcv, #0 +cx3da p0, r0, r1, r0, r9, #0 + + diff --git a/gas/testsuite/gas/arm/cde-warnings.d b/gas/testsuite/gas/arm/cde-warnings.d new file mode 100644 index 0000000000000000000000000000000000000000..1421b998d1cd54b8776651919307f273033fe6a2 --- /dev/null +++ b/gas/testsuite/gas/arm/cde-warnings.d @@ -0,0 +1,5 @@ +#name: Custom Datapath Extension (CDE) Warnings +#source: cde-warnings.s +#as: -mno-warn-deprecated -march=armv8.1-m.main+cdecp0+mve -I$srcdir/$subdir +#as: -mno-warn-deprecated -march=armv8.1-m.main+cdecp0+cdecp2+cdecp3+cdecp4+cdecp5+cdecp6+cdecp7+mve -I$srcdir/$subdir +#error_output: cde-warnings.l diff --git a/gas/testsuite/gas/arm/cde-warnings.l b/gas/testsuite/gas/arm/cde-warnings.l new file mode 100644 index 0000000000000000000000000000000000000000..abbd10aed4af14b96f3dc38a166cbe3ce34bd724 --- /dev/null +++ b/gas/testsuite/gas/arm/cde-warnings.l @@ -0,0 +1,175 @@ +[^ :]+: Assembler messages: +[^ :]+:[0-9]+: Error: immediate value out of range -- `cx1 p0,r0,#8192' +[^ :]+:[0-9]+: Error: immediate value out of range -- `cx1a p0,r0,#8192' +[^ :]+:[0-9]+: Error: immediate value out of range -- `cx1 p0,r0,#-1' +[^ :]+:[0-9]+: Error: immediate value out of range -- `cx1a p0,r0,#-1' +[^ :]+:[0-9]+: Error: CDE Coprocessor must be in range 0-7 -- `cx1 p8,r0,#0' +[^ :]+:[0-9]+: Error: CDE Coprocessor must be in range 0-7 -- `cx1a p8,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx1 p0,r16,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx1a p0,r16,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx1 p0,r13,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx1a p0,r13,#0' +[^ :]+:[0-9]+: Error: instruction not allowed in IT block -- `cx1 p0,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx1ne p0,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx1ane p0,r0,#0' +[^ :]+:[0-9]+: Error: coprocessor for insn is not enabled for cde -- `cx1 p1,r0,#0' +[^ :]+:[0-9]+: Error: coprocessor for insn is not enabled for cde -- `cx1a p1,r0,#0' +[^ :]+:[0-9]+: Error: constant expression required -- `cx1 p0,r0,r0,#0' +[^ :]+:[0-9]+: Error: constant expression required -- `cx1a p0,r0,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx1 p0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx1a p0,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx1 p0,r15,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx1a p0,r15,#0' +[^ :]+:[0-9]+: Error: immediate value out of range -- `cx1d p0,r0,r1,#8192' +[^ :]+:[0-9]+: Error: immediate value out of range -- `cx1da p0,r0,r1,#8192' +[^ :]+:[0-9]+: Error: immediate value out of range -- `cx1d p0,r0,r1,#-1' +[^ :]+:[0-9]+: Error: immediate value out of range -- `cx1da p0,r0,r1,#-1' +[^ :]+:[0-9]+: Error: CDE Coprocessor must be in range 0-7 -- `cx1d p8,r0,r1,#0' +[^ :]+:[0-9]+: Error: CDE Coprocessor must be in range 0-7 -- `cx1da p8,r0,r1,#0' +[^ :]+:[0-9]+: Error: ARM register expected -- `cx1d p0,r16,r17,#0' +[^ :]+:[0-9]+: Error: ARM register expected -- `cx1da p0,r16,r17,#0' +[^ :]+:[0-9]+: Error: ARM register expected -- `cx1d p0,APSR_nzcv,r15,#0' +[^ :]+:[0-9]+: Error: ARM register expected -- `cx1da p0,APSR_nzcv,r15,#0' +[^ :]+:[0-9]+: Error: Register must be an even register between r0-r10\. -- `cx1d p0,r9,r10,#0' +[^ :]+:[0-9]+: Error: Register must be an even register between r0-r10\. -- `cx1da p0,r9,r10,#0' +[^ :]+:[0-9]+: Error: Register must be an even register between r0-r10\. -- `cx1d p0,r13,r14,#0' +[^ :]+:[0-9]+: Error: Register must be an even register between r0-r10\. -- `cx1da p0,r13,r14,#0' +[^ :]+:[0-9]+: Error: instruction not allowed in IT block -- `cx1d p0,r0,r1,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx1dne p0,r0,r1,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx1dane p0,r0,r1,#0' +[^ :]+:[0-9]+: Error: coprocessor for insn is not enabled for cde -- `cx1d p1,r0,r1,#0' +[^ :]+:[0-9]+: Error: coprocessor for insn is not enabled for cde -- `cx1da p1,r0,r1,#0' +[^ :]+:[0-9]+: Error: cx1d requires consecutive destination registers\. -- `cx1d p0,r0,r2,#0' +[^ :]+:[0-9]+: Error: cx1d requires consecutive destination registers\. -- `cx1da p0,r0,r2,#0' +[^ :]+:[0-9]+: Error: constant expression required -- `cx1d p0,r0,r1,r0,#0' +[^ :]+:[0-9]+: Error: constant expression required -- `cx1da p0,r0,r1,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx1d p0,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx1da p0,r0,#0' +[^ :]+:[0-9]+: Error: immediate value out of range -- `cx2 p0,r0,r0,#512' +[^ :]+:[0-9]+: Error: immediate value out of range -- `cx2a p0,r0,r0,#512' +[^ :]+:[0-9]+: Error: immediate value out of range -- `cx2 p0,r0,r0,#-1' +[^ :]+:[0-9]+: Error: immediate value out of range -- `cx2a p0,r0,r0,#-1' +[^ :]+:[0-9]+: Error: CDE Coprocessor must be in range 0-7 -- `cx2 p8,r0,r0,#0' +[^ :]+:[0-9]+: Error: CDE Coprocessor must be in range 0-7 -- `cx2a p8,r0,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx2 p0,r16,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx2a p0,r16,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx2 p0,r0,r16,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx2a p0,r0,r16,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx2 p0,r13,r0,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx2a p0,r13,r0,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx2 p0,r0,r13,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx2a p0,r0,r13,#0' +[^ :]+:[0-9]+: Error: instruction not allowed in IT block -- `cx2 p0,r0,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx2ne p0,r0,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx2ane p0,r0,r0,#0' +[^ :]+:[0-9]+: Error: coprocessor for insn is not enabled for cde -- `cx2 p1,r0,r0,#0' +[^ :]+:[0-9]+: Error: coprocessor for insn is not enabled for cde -- `cx2a p1,r0,r0,#0' +[^ :]+:[0-9]+: Error: constant expression required -- `cx2 p0,r0,r0,r0,#0' +[^ :]+:[0-9]+: Error: constant expression required -- `cx2a p0,r0,r0,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx2 p0,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx2a p0,r0,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx2 p0,r0,r15,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx2a p0,r0,r15,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx2 p0,r15,r0,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx2a p0,r15,r0,#0' +[^ :]+:[0-9]+: Error: immediate value out of range -- `cx2d p0,r0,r1,r0,#512' +[^ :]+:[0-9]+: Error: immediate value out of range -- `cx2da p0,r0,r1,r0,#512' +[^ :]+:[0-9]+: Error: immediate value out of range -- `cx2d p0,r0,r1,r0,#-1' +[^ :]+:[0-9]+: Error: immediate value out of range -- `cx2da p0,r0,r1,r0,#-1' +[^ :]+:[0-9]+: Error: CDE Coprocessor must be in range 0-7 -- `cx2d p8,r0,r1,r0,#0' +[^ :]+:[0-9]+: Error: CDE Coprocessor must be in range 0-7 -- `cx2da p8,r0,r1,r0,#0' +[^ :]+:[0-9]+: Error: ARM register expected -- `cx2d p0,r16,r17,r0,#0' +[^ :]+:[0-9]+: Error: ARM register expected -- `cx2da p0,r16,r17,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx2d p0,r0,r1,r16,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx2da p0,r0,r1,r16,#0' +[^ :]+:[0-9]+: Error: ARM register expected -- `cx2d p0,APSR_nzcv,r15,r0,#0' +[^ :]+:[0-9]+: Error: ARM register expected -- `cx2da p0,APSR_nzcv,r15,r0,#0' +[^ :]+:[0-9]+: Error: Register must be an even register between r0-r10\. -- `cx2d p0,r9,r10,r0,#0' +[^ :]+:[0-9]+: Error: Register must be an even register between r0-r10\. -- `cx2da p0,r9,r10,r0,#0' +[^ :]+:[0-9]+: Error: Register must be an even register between r0-r10\. -- `cx2d p0,r12,r13,r0,#0' +[^ :]+:[0-9]+: Error: Register must be an even register between r0-r10\. -- `cx2da p0,r12,r13,r0,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx2d p0,r0,r1,r13,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx2da p0,r0,r1,r13,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx2d p0,r0,r1,r15,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx2da p0,r0,r1,r15,#0' +[^ :]+:[0-9]+: Error: instruction not allowed in IT block -- `cx2d p0,r0,r1,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx2dne p0,r0,r1,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx2dane p0,r0,r1,r0,#0' +[^ :]+:[0-9]+: Error: coprocessor for insn is not enabled for cde -- `cx2d p1,r0,r1,r0,#0' +[^ :]+:[0-9]+: Error: coprocessor for insn is not enabled for cde -- `cx2da p1,r0,r1,r0,#0' +[^ :]+:[0-9]+: Error: cx2d requires consecutive destination registers\. -- `cx2d p0,r0,r2,r0,#0' +[^ :]+:[0-9]+: Error: cx2d requires consecutive destination registers\. -- `cx2da p0,r0,r2,r0,#0' +[^ :]+:[0-9]+: Error: constant expression required -- `cx2d p0,r0,r1,r0,r0,#0' +[^ :]+:[0-9]+: Error: constant expression required -- `cx2da p0,r0,r1,r0,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx2d p0,r0,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx2da p0,r0,r0,#0' +[^ :]+:[0-9]+: Error: immediate value out of range -- `cx3 p0,r0,r0,r0,#64' +[^ :]+:[0-9]+: Error: immediate value out of range -- `cx3a p0,r0,r0,r0,#64' +[^ :]+:[0-9]+: Error: immediate value out of range -- `cx3 p0,r0,r0,r0,#-1' +[^ :]+:[0-9]+: Error: immediate value out of range -- `cx3a p0,r0,r0,r0,#-1' +[^ :]+:[0-9]+: Error: CDE Coprocessor must be in range 0-7 -- `cx3 p8,r0,r0,r0,#0' +[^ :]+:[0-9]+: Error: CDE Coprocessor must be in range 0-7 -- `cx3a p8,r0,r0,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx3 p0,r16,r0,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx3a p0,r16,r0,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx3 p0,r0,r16,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx3a p0,r0,r16,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx3 p0,r0,r0,r16,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx3a p0,r0,r0,r16,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx3 p0,r13,r0,r0,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx3a p0,r13,r0,r0,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx3 p0,r0,r13,r0,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx3a p0,r0,r13,r0,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx3 p0,r0,r0,r13,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx3a p0,r0,r0,r13,#0' +[^ :]+:[0-9]+: Error: instruction not allowed in IT block -- `cx3 p0,r0,r0,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx3ne p0,r0,r0,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx3ane p0,r0,r0,r0,#0' +[^ :]+:[0-9]+: Error: coprocessor for insn is not enabled for cde -- `cx3 p1,r0,r0,r0,#0' +[^ :]+:[0-9]+: Error: coprocessor for insn is not enabled for cde -- `cx3a p1,r0,r0,r0,#0' +[^ :]+:[0-9]+: Error: constant expression required -- `cx3 p0,r0,r0,r0,r0,#0' +[^ :]+:[0-9]+: Error: constant expression required -- `cx3a p0,r0,r0,r0,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx3 p0,r0,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx3a p0,r0,r0,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx3 p0,r15,r0,r0,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx3a p0,r15,r0,r0,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx3 p0,r0,r15,r0,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx3a p0,r0,r15,r0,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx3 p0,r0,r0,r15,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx3a p0,r0,r0,r15,#0' +[^ :]+:[0-9]+: Error: immediate value out of range -- `cx3d p0,r0,r1,r0,r0,#64' +[^ :]+:[0-9]+: Error: immediate value out of range -- `cx3da p0,r0,r1,r0,r0,#64' +[^ :]+:[0-9]+: Error: immediate value out of range -- `cx3d p0,r0,r1,r0,r0,#-1' +[^ :]+:[0-9]+: Error: immediate value out of range -- `cx3da p0,r0,r1,r0,r0,#-1' +[^ :]+:[0-9]+: Error: CDE Coprocessor must be in range 0-7 -- `cx3d p8,r0,r1,r0,r0,#0' +[^ :]+:[0-9]+: Error: CDE Coprocessor must be in range 0-7 -- `cx3da p8,r0,r1,r0,r0,#0' +[^ :]+:[0-9]+: Error: ARM register expected -- `cx3d p0,r16,r17,r0,r0,#0' +[^ :]+:[0-9]+: Error: ARM register expected -- `cx3da p0,r16,r17,r0,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx3d p0,r0,r1,r16,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx3da p0,r0,r1,r16,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx3d p0,r0,r1,r0,r16,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx3da p0,r0,r1,r0,r16,#0' +[^ :]+:[0-9]+: Error: ARM register expected -- `cx3d p0,APSR_nzcv,r15,r0,r0,#0' +[^ :]+:[0-9]+: Error: ARM register expected -- `cx3da p0,APSR_nzcv,r15,r0,r0,#0' +[^ :]+:[0-9]+: Error: Register must be an even register between r0-r10\. -- `cx3d p0,r9,r10,r0,r0,#0' +[^ :]+:[0-9]+: Error: Register must be an even register between r0-r10\. -- `cx3da p0,r9,r10,r0,r0,#0' +[^ :]+:[0-9]+: Error: Register must be an even register between r0-r10\. -- `cx3d p0,r12,r13,r0,r0,#0' +[^ :]+:[0-9]+: Error: Register must be an even register between r0-r10\. -- `cx3da p0,r12,r13,r0,r0,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx3d p0,r0,r1,r13,r0,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx3da p0,r0,r1,r13,r0,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx3d p0,r0,r1,r0,r13,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx3da p0,r0,r1,r0,r13,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx3d p0,r0,r1,r15,r0,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx3da p0,r0,r1,r15,r0,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx3d p0,r0,r1,r0,r15,#0' +[^ :]+:[0-9]+: Error: Register must be r0-r14 except r13, or APSR_nzcv\. -- `cx3da p0,r0,r1,r0,r15,#0' +[^ :]+:[0-9]+: Error: instruction not allowed in IT block -- `cx3d p0,r0,r1,r0,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx3dne p0,r0,r1,r0,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx3dane p0,r0,r1,r0,r0,#0' +[^ :]+:[0-9]+: Error: coprocessor for insn is not enabled for cde -- `cx3d p1,r0,r1,r0,r0,#0' +[^ :]+:[0-9]+: Error: coprocessor for insn is not enabled for cde -- `cx3da p1,r0,r1,r0,r0,#0' +[^ :]+:[0-9]+: Error: cx3d requires consecutive destination registers\. -- `cx3d p0,r0,r2,r0,r0,#0' +[^ :]+:[0-9]+: Error: cx3d requires consecutive destination registers\. -- `cx3da p0,r0,r2,r0,r0,#0' +[^ :]+:[0-9]+: Error: constant expression required -- `cx3d p0,r0,r1,r0,r0,r0,#0' +[^ :]+:[0-9]+: Error: constant expression required -- `cx3da p0,r0,r1,r0,r0,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx3d p0,r0,r0,r0,#0' +[^ :]+:[0-9]+: Error: syntax error -- `cx3da p0,r0,r0,r0,#0' diff --git a/gas/testsuite/gas/arm/cde-warnings.s b/gas/testsuite/gas/arm/cde-warnings.s new file mode 100644 index 0000000000000000000000000000000000000000..8e5759a64e44980481330cdc043c40d2d6bacbc6 --- /dev/null +++ b/gas/testsuite/gas/arm/cde-warnings.s @@ -0,0 +1,335 @@ +.syntax unified +# cx1{a} +# Immediate out of range. +# Each register out of range. +# r13 => constrained unpredictable +# itblock => constrained unpredictable +# Error given when using coprocessor number not enabled on command line. +# Too many arguments +# Too little arguments +# r15 instead of APSR_nzcv + +cx1 p0, r0, #8192 +cx1a p0, r0, #8192 +cx1 p0, r0, #-1 +cx1a p0, r0, #-1 + +cx1 p8, r0, #0 +cx1a p8, r0, #0 + +cx1 p0, r16, #0 +cx1a p0, r16, #0 + +cx1 p0, r13, #0 +cx1a p0, r13, #0 + +ittt ne +cx1 p0, r0, #0 +cx1ne p0, r0, #0 +cx1ane p0, r0, #0 + +cx1 p1, r0, #0 +cx1a p1, r0, #0 + +cx1 p0, r0, r0, #0 +cx1a p0, r0, r0, #0 + +cx1 p0, #0 +cx1a p0, #0 + +cx1 p0, r15, #0 +cx1a p0, r15, #0 + +# cx1d{a} +# Immediate out of range. +# Each register out of range. +# APSR_nzcv disallowed as destination register. +# rd => constrained unpredictable +# r< N > 10 > => constrained unpredictable +# IT block => constrained unpredictable +# +# Error given when using coprocessor number not enabled on command line. +# Disallow non-incrementing values in destination. +# Too many arguments +# Too little arguments + +cx1d p0, r0, r1, #8192 +cx1da p0, r0, r1, #8192 +cx1d p0, r0, r1, #-1 +cx1da p0, r0, r1, #-1 + +cx1d p8, r0, r1, #0 +cx1da p8, r0, r1, #0 + +cx1d p0, r16, r17, #0 +cx1da p0, r16, r17, #0 + +cx1d p0, APSR_nzcv, r15, #0 +cx1da p0, APSR_nzcv, r15, #0 + +cx1d p0, r9, r10, #0 +cx1da p0, r9, r10, #0 + +cx1d p0, r13, r14, #0 +cx1da p0, r13, r14, #0 + +ittt ne +cx1d p0, r0, r1, #0 +cx1dne p0, r0, r1, #0 +cx1dane p0, r0, r1, #0 + +cx1d p1, r0, r1, #0 +cx1da p1, r0, r1, #0 + +cx1d p0, r0, r2, #0 +cx1da p0, r0, r2, #0 + +cx1d p0, r0, r1, r0, #0 +cx1da p0, r0, r1, r0, #0 + +cx1d p0, r0, #0 +cx1da p0, r0, #0 + +# cx2{a} +# Immediate out of range. +# Each register out of range. +# rd13 => constrained unpredictable +# rn13 => constrained unpredictable +# IT block => constrained unpredictable +# +# Error given when using coprocessor number not enabled on command line. +# Too many arguments +# Too little arguments. +# r15 instead of APSR_nzcv + +cx2 p0, r0, r0, #512 +cx2a p0, r0, r0, #512 +cx2 p0, r0, r0, #-1 +cx2a p0, r0, r0, #-1 + +cx2 p8, r0, r0, #0 +cx2a p8, r0, r0, #0 + +cx2 p0, r16, r0, #0 +cx2a p0, r16, r0, #0 + +cx2 p0, r0, r16, #0 +cx2a p0, r0, r16, #0 + +cx2 p0, r13, r0, #0 +cx2a p0, r13, r0, #0 + +cx2 p0, r0, r13, #0 +cx2a p0, r0, r13, #0 + +ittt ne +cx2 p0, r0, r0, #0 +cx2ne p0, r0, r0, #0 +cx2ane p0, r0, r0, #0 + +cx2 p1, r0, r0, #0 +cx2a p1, r0, r0, #0 + +cx2 p0, r0, r0, r0, #0 +cx2a p0, r0, r0, r0, #0 + +cx2 p0, r0, #0 +cx2a p0, r0, #0 + +cx2 p0, r0, r15, #0 +cx2a p0, r0, r15, #0 + +cx2 p0, r15, r0, #0 +cx2a p0, r15, r0, #0 + +# cx2d{a} +# Immediate out of range. +# Each register out of range. +# APSR_nzcv disallowed as destination register. +# rd => constrained unpredictable +# rd< N > 10 > => constrained unpredictable +# rn13 => constrained unpredictable +# IT block => constrained unpredictable +# +# Error given when using coprocessor number not enabled on command line. +# Disallow non-incrementing values in destination. +# Too many arguments +# Too little arguments +cx2d p0, r0, r1, r0, #512 +cx2da p0, r0, r1, r0, #512 +cx2d p0, r0, r1, r0, #-1 +cx2da p0, r0, r1, r0, #-1 + +cx2d p8, r0, r1, r0, #0 +cx2da p8, r0, r1, r0, #0 + +cx2d p0, r16, r17, r0, #0 +cx2da p0, r16, r17, r0, #0 + +cx2d p0, r0, r1, r16, #0 +cx2da p0, r0, r1, r16, #0 + +cx2d p0, APSR_nzcv, r15, r0, #0 +cx2da p0, APSR_nzcv, r15, r0, #0 + +cx2d p0, r9, r10, r0, #0 +cx2da p0, r9, r10, r0, #0 + +cx2d p0, r12, r13, r0, #0 +cx2da p0, r12, r13, r0, #0 + +cx2d p0, r0, r1, r13, #0 +cx2da p0, r0, r1, r13, #0 + +cx2d p0, r0, r1, r15, #0 +cx2da p0, r0, r1, r15, #0 + +ittt ne +cx2d p0, r0, r1, r0, #0 +cx2dne p0, r0, r1, r0, #0 +cx2dane p0, r0, r1, r0, #0 + +cx2d p1, r0, r1, r0, #0 +cx2da p1, r0, r1, r0, #0 + +cx2d p0, r0, r2, r0, #0 +cx2da p0, r0, r2, r0, #0 + +cx2d p0, r0, r1, r0, r0, #0 +cx2da p0, r0, r1, r0, r0, #0 + +cx2d p0, r0, r0, #0 +cx2da p0, r0, r0, #0 + +# cx2{a} +# Immediate out of range. +# Each register out of range. +# rd13 => constrained unpredictable +# rn13 => constrained unpredictable +# rm13 => constrained unpredictable +# IT block => constrained unpredictable +# +# Error given when using coprocessor number not enabled on command line. +# Too many arguments +# Too little arguments. +# r15 instead of APSR_nzcv + +cx3 p0, r0, r0, r0, #64 +cx3a p0, r0, r0, r0, #64 +cx3 p0, r0, r0, r0, #-1 +cx3a p0, r0, r0, r0, #-1 + +cx3 p8, r0, r0, r0, #0 +cx3a p8, r0, r0, r0, #0 + +cx3 p0, r16, r0, r0, #0 +cx3a p0, r16, r0, r0, #0 + +cx3 p0, r0, r16, r0, #0 +cx3a p0, r0, r16, r0, #0 + +cx3 p0, r0, r0, r16, #0 +cx3a p0, r0, r0, r16, #0 + +cx3 p0, r13, r0, r0, #0 +cx3a p0, r13, r0, r0, #0 + +cx3 p0, r0, r13, r0, #0 +cx3a p0, r0, r13, r0, #0 + +cx3 p0, r0, r0, r13, #0 +cx3a p0, r0, r0, r13, #0 + +ittt ne +cx3 p0, r0, r0, r0, #0 +cx3ne p0, r0, r0, r0, #0 +cx3ane p0, r0, r0, r0, #0 + +cx3 p1, r0, r0, r0, #0 +cx3a p1, r0, r0, r0, #0 + +cx3 p0, r0, r0, r0, r0, #0 +cx3a p0, r0, r0, r0, r0, #0 + +cx3 p0, r0, r0, #0 +cx3a p0, r0, r0, #0 + +cx3 p0, r15, r0, r0, #0 +cx3a p0, r15, r0, r0, #0 + +cx3 p0, r0, r15, r0, #0 +cx3a p0, r0, r15, r0, #0 + +cx3 p0, r0, r0, r15, #0 +cx3a p0, r0, r0, r15, #0 + +# cx3d{a} +# Immediate out of range. +# Each register out of range. +# APSR_nzcv disallowed as destination register. +# rd => constrained unpredictable +# rd< N > 10 > => constrained unpredictable +# rn13 => constrained unpredictable +# rm13 => constrained unpredictable +# rn15 disallowed (pattern matches APSR_nzcv) +# rm15 disallowed (pattern matches APSR_nzcv) +# IT block => constrained unpredictable +# +# Error given when using coprocessor number not enabled on command line. +# Disallow non-incrementing values in destination. +# Too many arguments +# Too little arguments +cx3d p0, r0, r1, r0, r0, #64 +cx3da p0, r0, r1, r0, r0, #64 +cx3d p0, r0, r1, r0, r0, #-1 +cx3da p0, r0, r1, r0, r0, #-1 + +cx3d p8, r0, r1, r0, r0, #0 +cx3da p8, r0, r1, r0, r0, #0 + +cx3d p0, r16, r17, r0, r0, #0 +cx3da p0, r16, r17, r0, r0, #0 + +cx3d p0, r0, r1, r16, r0, #0 +cx3da p0, r0, r1, r16, r0, #0 + +cx3d p0, r0, r1, r0, r16, #0 +cx3da p0, r0, r1, r0, r16, #0 + +cx3d p0, APSR_nzcv, r15, r0, r0, #0 +cx3da p0, APSR_nzcv, r15, r0, r0, #0 + +cx3d p0, r9, r10, r0, r0, #0 +cx3da p0, r9, r10, r0, r0, #0 + +cx3d p0, r12, r13, r0, r0, #0 +cx3da p0, r12, r13, r0, r0, #0 + +cx3d p0, r0, r1, r13, r0, #0 +cx3da p0, r0, r1, r13, r0, #0 + +cx3d p0, r0, r1, r0, r13, #0 +cx3da p0, r0, r1, r0, r13, #0 + +cx3d p0, r0, r1, r15, r0, #0 +cx3da p0, r0, r1, r15, r0, #0 + +cx3d p0, r0, r1, r0, r15, #0 +cx3da p0, r0, r1, r0, r15, #0 + +ittt ne +cx3d p0, r0, r1, r0, r0, #0 +cx3dne p0, r0, r1, r0, r0, #0 +cx3dane p0, r0, r1, r0, r0, #0 + +cx3d p1, r0, r1, r0, r0, #0 +cx3da p1, r0, r1, r0, r0, #0 + +cx3d p0, r0, r2, r0, r0, #0 +cx3da p0, r0, r2, r0, r0, #0 + +cx3d p0, r0, r1, r0, r0, r0, #0 +cx3da p0, r0, r1, r0, r0, r0, #0 + +cx3d p0, r0, r0, r0, #0 +cx3da p0, r0, r0, r0, #0 diff --git a/gas/testsuite/gas/arm/cde.d b/gas/testsuite/gas/arm/cde.d new file mode 100644 index 0000000000000000000000000000000000000000..34de201513b1f89b29397d0663b184ca7d1cdf16 --- /dev/null +++ b/gas/testsuite/gas/arm/cde.d @@ -0,0 +1,119 @@ +#name: Custom Datapath Extension (CDE) +#source: cde.s +#as: -mno-warn-deprecated -march=armv8.1-m.main+cdecp0+cdecp7+mve.fp -I$srcdir/$subdir +#as: -mno-warn-deprecated -march=armv8.1-m.main+cdecp0+cdecp7+mve -I$srcdir/$subdir +#as: -mno-warn-deprecated -march=armv8.1-m.main+cdecp0+cdecp1+cdecp2+cdecp3+cdecp4+cdecp5+cdecp6+cdecp7+mve.fp -I$srcdir/$subdir +#as: -mno-warn-deprecated -march=armv8.1-m.main+cdecp0+cdecp1+cdecp2+cdecp3+cdecp4+cdecp5+cdecp6+cdecp7+mve -I$srcdir/$subdir +#objdump: -M force-thumb -dr --show-raw-insn -marmv8.1-m.main -M coproc0=cde -M coproc7=cde +#... +00000000 <\.text>: + *[0-9a-f]+: ee00 0000 cx1 p0, r0, #0 + *[0-9a-f]+: ee3f 0000 cx1 p0, r0, #8064 + *[0-9a-f]+: ee00 0080 cx1 p0, r0, #64 + *[0-9a-f]+: ee00 003f cx1 p0, r0, #63 + *[0-9a-f]+: ee00 0700 cx1 p7, r0, #0 + *[0-9a-f]+: ee00 f000 cx1 p0, APSR_nzcv, #0 + *[0-9a-f]+: ee00 9000 cx1 p0, r9, #0 + *[0-9a-f]+: fe00 0000 cx1a p0, r0, #0 + *[0-9a-f]+: fe3f 0000 cx1a p0, r0, #8064 + *[0-9a-f]+: fe00 0080 cx1a p0, r0, #64 + *[0-9a-f]+: fe00 003f cx1a p0, r0, #63 + *[0-9a-f]+: fe00 0700 cx1a p7, r0, #0 + *[0-9a-f]+: fe00 f000 cx1a p0, APSR_nzcv, #0 + *[0-9a-f]+: fe00 9000 cx1a p0, r9, #0 + *[0-9a-f]+: bf18 it ne + *[0-9a-f]+: fe00 0000 cx1a p0, r0, #0 + *[0-9a-f]+: ee00 0040 cx1d p0, r0, r1, #0 + *[0-9a-f]+: ee3f 0040 cx1d p0, r0, r1, #8064 + *[0-9a-f]+: ee00 00c0 cx1d p0, r0, r1, #64 + *[0-9a-f]+: ee00 007f cx1d p0, r0, r1, #63 + *[0-9a-f]+: ee00 0740 cx1d p7, r0, r1, #0 + *[0-9a-f]+: ee00 a040 cx1d p0, sl, fp, #0 + *[0-9a-f]+: fe00 0040 cx1da p0, r0, r1, #0 + *[0-9a-f]+: fe3f 0040 cx1da p0, r0, r1, #8064 + *[0-9a-f]+: fe00 00c0 cx1da p0, r0, r1, #64 + *[0-9a-f]+: fe00 007f cx1da p0, r0, r1, #63 + *[0-9a-f]+: fe00 0740 cx1da p7, r0, r1, #0 + *[0-9a-f]+: fe00 a040 cx1da p0, sl, fp, #0 + *[0-9a-f]+: bf18 it ne + *[0-9a-f]+: fe00 0040 cx1da p0, r0, r1, #0 + *[0-9a-f]+: ee40 0000 cx2 p0, r0, r0, #0 + *[0-9a-f]+: ee70 0000 cx2 p0, r0, r0, #384 + *[0-9a-f]+: ee40 0080 cx2 p0, r0, r0, #64 + *[0-9a-f]+: ee40 003f cx2 p0, r0, r0, #63 + *[0-9a-f]+: ee40 0700 cx2 p7, r0, r0, #0 + *[0-9a-f]+: ee40 f000 cx2 p0, APSR_nzcv, r0, #0 + *[0-9a-f]+: ee40 9000 cx2 p0, r9, r0, #0 + *[0-9a-f]+: ee4f 0000 cx2 p0, r0, APSR_nzcv, #0 + *[0-9a-f]+: ee49 0000 cx2 p0, r0, r9, #0 + *[0-9a-f]+: fe40 0000 cx2a p0, r0, r0, #0 + *[0-9a-f]+: fe70 0000 cx2a p0, r0, r0, #384 + *[0-9a-f]+: fe40 0080 cx2a p0, r0, r0, #64 + *[0-9a-f]+: fe40 003f cx2a p0, r0, r0, #63 + *[0-9a-f]+: fe40 0700 cx2a p7, r0, r0, #0 + *[0-9a-f]+: fe40 f000 cx2a p0, APSR_nzcv, r0, #0 + *[0-9a-f]+: fe40 9000 cx2a p0, r9, r0, #0 + *[0-9a-f]+: fe4f 0000 cx2a p0, r0, APSR_nzcv, #0 + *[0-9a-f]+: fe49 0000 cx2a p0, r0, r9, #0 + *[0-9a-f]+: bf18 it ne + *[0-9a-f]+: fe40 0000 cx2a p0, r0, r0, #0 + *[0-9a-f]+: ee40 0040 cx2d p0, r0, r1, r0, #0 + *[0-9a-f]+: ee70 0040 cx2d p0, r0, r1, r0, #384 + *[0-9a-f]+: ee40 00c0 cx2d p0, r0, r1, r0, #64 + *[0-9a-f]+: ee40 007f cx2d p0, r0, r1, r0, #63 + *[0-9a-f]+: ee40 0740 cx2d p7, r0, r1, r0, #0 + *[0-9a-f]+: ee40 a040 cx2d p0, sl, fp, r0, #0 + *[0-9a-f]+: ee4f 0040 cx2d p0, r0, r1, APSR_nzcv, #0 + *[0-9a-f]+: ee49 0040 cx2d p0, r0, r1, r9, #0 + *[0-9a-f]+: fe40 0040 cx2da p0, r0, r1, r0, #0 + *[0-9a-f]+: fe70 0040 cx2da p0, r0, r1, r0, #384 + *[0-9a-f]+: fe40 00c0 cx2da p0, r0, r1, r0, #64 + *[0-9a-f]+: fe40 007f cx2da p0, r0, r1, r0, #63 + *[0-9a-f]+: fe40 0740 cx2da p7, r0, r1, r0, #0 + *[0-9a-f]+: fe40 a040 cx2da p0, sl, fp, r0, #0 + *[0-9a-f]+: fe4f 0040 cx2da p0, r0, r1, APSR_nzcv, #0 + *[0-9a-f]+: fe49 0040 cx2da p0, r0, r1, r9, #0 + *[0-9a-f]+: ee80 0000 cx3 p0, r0, r0, r0, #0 + *[0-9a-f]+: eef0 0000 cx3 p0, r0, r0, r0, #56 + *[0-9a-f]+: ee80 0080 cx3 p0, r0, r0, r0, #4 + *[0-9a-f]+: ee80 0030 cx3 p0, r0, r0, r0, #3 + *[0-9a-f]+: ee80 0700 cx3 p7, r0, r0, r0, #0 + *[0-9a-f]+: ee80 000f cx3 p0, APSR_nzcv, r0, r0, #0 + *[0-9a-f]+: ee80 0009 cx3 p0, r9, r0, r0, #0 + *[0-9a-f]+: ee8f 0000 cx3 p0, r0, APSR_nzcv, r0, #0 + *[0-9a-f]+: ee89 0000 cx3 p0, r0, r9, r0, #0 + *[0-9a-f]+: ee80 f000 cx3 p0, r0, r0, APSR_nzcv, #0 + *[0-9a-f]+: ee80 9000 cx3 p0, r0, r0, r9, #0 + *[0-9a-f]+: fe80 0000 cx3a p0, r0, r0, r0, #0 + *[0-9a-f]+: fef0 0000 cx3a p0, r0, r0, r0, #56 + *[0-9a-f]+: fe80 0080 cx3a p0, r0, r0, r0, #4 + *[0-9a-f]+: fe80 0030 cx3a p0, r0, r0, r0, #3 + *[0-9a-f]+: fe80 0700 cx3a p7, r0, r0, r0, #0 + *[0-9a-f]+: fe80 000f cx3a p0, APSR_nzcv, r0, r0, #0 + *[0-9a-f]+: fe80 0009 cx3a p0, r9, r0, r0, #0 + *[0-9a-f]+: fe8f 0000 cx3a p0, r0, APSR_nzcv, r0, #0 + *[0-9a-f]+: fe89 0000 cx3a p0, r0, r9, r0, #0 + *[0-9a-f]+: fe80 f000 cx3a p0, r0, r0, APSR_nzcv, #0 + *[0-9a-f]+: fe80 9000 cx3a p0, r0, r0, r9, #0 + *[0-9a-f]+: bf18 it ne + *[0-9a-f]+: fe80 0000 cx3a p0, r0, r0, r0, #0 + *[0-9a-f]+: ee80 0040 cx3d p0, r0, r1, r0, r0, #0 + *[0-9a-f]+: eef0 0040 cx3d p0, r0, r1, r0, r0, #56 + *[0-9a-f]+: ee80 00c0 cx3d p0, r0, r1, r0, r0, #4 + *[0-9a-f]+: ee80 0070 cx3d p0, r0, r1, r0, r0, #3 + *[0-9a-f]+: ee80 0740 cx3d p7, r0, r1, r0, r0, #0 + *[0-9a-f]+: ee80 004a cx3d p0, sl, fp, r0, r0, #0 + *[0-9a-f]+: ee8f 0040 cx3d p0, r0, r1, APSR_nzcv, r0, #0 + *[0-9a-f]+: ee89 0040 cx3d p0, r0, r1, r9, r0, #0 + *[0-9a-f]+: ee80 f040 cx3d p0, r0, r1, r0, APSR_nzcv, #0 + *[0-9a-f]+: ee80 9040 cx3d p0, r0, r1, r0, r9, #0 + *[0-9a-f]+: fe80 0040 cx3da p0, r0, r1, r0, r0, #0 + *[0-9a-f]+: fef0 0040 cx3da p0, r0, r1, r0, r0, #56 + *[0-9a-f]+: fe80 00c0 cx3da p0, r0, r1, r0, r0, #4 + *[0-9a-f]+: fe80 0070 cx3da p0, r0, r1, r0, r0, #3 + *[0-9a-f]+: fe80 0740 cx3da p7, r0, r1, r0, r0, #0 + *[0-9a-f]+: fe80 004a cx3da p0, sl, fp, r0, r0, #0 + *[0-9a-f]+: fe8f 0040 cx3da p0, r0, r1, APSR_nzcv, r0, #0 + *[0-9a-f]+: fe89 0040 cx3da p0, r0, r1, r9, r0, #0 + *[0-9a-f]+: fe80 f040 cx3da p0, r0, r1, r0, APSR_nzcv, #0 + *[0-9a-f]+: fe80 9040 cx3da p0, r0, r1, r0, r9, #0 diff --git a/gas/testsuite/gas/arm/cde.s b/gas/testsuite/gas/arm/cde.s new file mode 100644 index 0000000000000000000000000000000000000000..1ee18704941aca9069777511c0feaf2004b592b7 --- /dev/null +++ b/gas/testsuite/gas/arm/cde.s @@ -0,0 +1,3 @@ +.syntax unified + +.include "cde-scalar.s" diff --git a/include/opcode/arm.h b/include/opcode/arm.h index 6d8c3d00861f2430d2c8478c71f165dc4e625665..979bd20885812504869d39ce374db38fbce429ba 100644 --- a/include/opcode/arm.h +++ b/include/opcode/arm.h @@ -79,6 +79,15 @@ #define ARM_EXT2_CRC 0x00080000 /* ARMv8 CRC32 */ #define ARM_EXT2_MVE 0x00100000 /* MVE Integer extension. */ #define ARM_EXT2_MVE_FP 0x00200000 /* MVE Floating Point extension. */ +#define ARM_EXT2_CDE 0x00400000 /* Custom Datapath Extension. */ +#define ARM_EXT2_CDE0 0x00800000 /* Using CDE coproc 0. */ +#define ARM_EXT2_CDE1 0x01000000 /* Using CDE coproc 1. */ +#define ARM_EXT2_CDE2 0x02000000 /* Using CDE coproc 2. */ +#define ARM_EXT2_CDE3 0x04000000 /* Using CDE coproc 3. */ +#define ARM_EXT2_CDE4 0x08000000 /* Using CDE coproc 4. */ +#define ARM_EXT2_CDE5 0x10000000 /* Using CDE coproc 5. */ +#define ARM_EXT2_CDE6 0x20000000 /* Using CDE coproc 6. */ +#define ARM_EXT2_CDE7 0x40000000 /* Using CDE coproc 7. */ /* Co-processor space extensions. */ #define ARM_CEXT_XSCALE 0x00000001 /* Allow MIA etc. */ diff --git a/opcodes/arm-dis.c b/opcodes/arm-dis.c index be2a93253bb5673579780f2053161e281e64cb04..2a29887f1695435d45c1d7bb4a917212588d4315 100644 --- a/opcodes/arm-dis.c +++ b/opcodes/arm-dis.c @@ -355,6 +355,16 @@ struct opcode32 const char * assembler; /* How to disassemble this insn. */ }; +struct cdeopcode32 +{ + arm_feature_set arch; /* Architecture defining this insn. */ + uint8_t coproc_shift; /* coproc is this far into op. */ + uint16_t coproc_mask; /* Length of coproc field in op. */ + unsigned long value; /* If arch is 0 then value is a sentinel. */ + unsigned long mask; /* Recognise insn if (op & mask) == value. */ + const char * assembler; /* How to disassemble this insn. */ +}; + /* MVE opcodes. */ struct mopcode32 @@ -460,6 +470,54 @@ enum opcode_sentinel_enum /* Common coprocessor opcodes shared between Arm and Thumb-2. */ +/* print_insn_cde recognizes the following format control codes: + + %% % + + %a print 'a' iff bit 28 is 1 + %p print bits 8-10 as coprocessor + %d print as decimal + %r print as an ARM register + %n print as an ARM register but r15 is APSR_nzcv + %T print as an ARM register + 1 + %R as %r but r13 is UNPREDICTABLE + %S as %r but rX where X > 10 is UNPREDICTABLE + %j print immediate taken from bits (16..21,7,0..5) + %k print immediate taken from bits (20..21,7,0..5). + %l print immediate taken from bits (20..22,7,4..5). */ + +/* At the moment there is only one valid position for the coprocessor number, + and hence that's encoded in the macro below. */ +#define CDE_OPCODE(ARCH, VALUE, MASK, ASM) \ + { ARCH, 8, 7, VALUE, MASK, ASM } +static const struct cdeopcode32 cde_opcodes[] = +{ + /* Custom Datapath Extension instructions. */ + CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE), + 0xee000000, 0xefc00840, + "cx1%a\t%p, %12-15n, #%0-5,7,16-21d"), + CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE), + 0xee000040, 0xefc00840, + "cx1d%a\t%p, %12-15S, %12-15T, #%0-5,7,16-21d"), + + CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE), + 0xee400000, 0xefc00840, + "cx2%a\t%p, %12-15n, %16-19n, #%0-5,7,20-21d"), + CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE), + 0xee400040, 0xefc00840, + "cx2d%a\t%p, %12-15S, %12-15T, %16-19n, #%0-5,7,20-21d"), + + CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE), + 0xee800000, 0xef800840, + "cx3%a\t%p, %0-3n, %16-19n, %12-15n, #%4-5,7,20-22d"), + CDE_OPCODE (ARM_FEATURE_CORE_HIGH (ARM_EXT2_CDE), + 0xee800040, 0xef800840, + "cx3d%a\t%p, %0-3S, %0-3T, %16-19n, %12-15n, #%4-5,7,20-22d"), + + CDE_OPCODE (ARM_FEATURE_CORE_LOW (0), 0, 0, 0) + +}; + static const struct sopcode32 coprocessor_opcodes[] = { /* XScale instructions. */ @@ -5115,7 +5173,8 @@ static const arm_regname regnames[] = { "reg-names-atpcs", N_("Select register names used in the ATPCS"), { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "IP", "SP", "LR", "PC" }}, { "reg-names-special-atpcs", N_("Select special register names used in the ATPCS"), - { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "WR", "v5", "SB", "SL", "FP", "IP", "SP", "LR", "PC" }} + { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "WR", "v5", "SB", "SL", "FP", "IP", "SP", "LR", "PC" }}, + { "coproc=(cde|generic)", N_("Enable CDE extensions for coprocessor N space"), { NULL } } }; static const char *const iwmmxt_wwnames[] = @@ -5195,6 +5254,7 @@ static unsigned int regname_selected = 1; #define arm_regnames regnames[regname_selected].reg_names static bfd_boolean force_thumb = FALSE; +static uint16_t cde_coprocs = 0; /* Current IT instruction state. This contains the same state as the IT bits in the CPSR. */ @@ -8786,6 +8846,121 @@ print_arm_address (bfd_vma pc, struct disassemble_info *info, long given) return (signed long) offset; } + +/* Print one cde instruction on INFO->STREAM. + Return TRUE if the instuction matched, FALSE if this is not a + recognised cde instruction. */ +static bfd_boolean +print_insn_cde (struct disassemble_info *info, long given, bfd_boolean thumb) +{ + const struct cdeopcode32 *insn; + void *stream = info->stream; + fprintf_ftype func = info->fprintf_func; + + if (thumb) + { + /* Manually extract the coprocessor code from a known point. + This position is the same across all CDE instructions. */ + for (insn = cde_opcodes; insn->assembler; insn++) + { + uint16_t coproc = (given >> insn->coproc_shift) & insn->coproc_mask; + uint16_t coproc_mask = 1 << coproc; + if (! (coproc_mask & cde_coprocs)) + continue; + + if ((given & insn->mask) == insn->value) + { + bfd_boolean is_unpredictable = FALSE; + const char *c; + + for (c = insn->assembler; *c; c++) + { + if (*c == '%') + { + switch (*++c) + { + case '%': + func (stream, "%%"); + break; + + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + { + int width; + unsigned long value; + + c = arm_decode_bitfield (c, given, &value, &width); + + switch (*c) + { + case 'S': + if (value > 10) + is_unpredictable = TRUE; + /* Fall through. */ + case 'R': + if (value == 13) + is_unpredictable = TRUE; + /* Fall through. */ + case 'r': + func (stream, "%s", arm_regnames[value]); + break; + + case 'n': + if (value == 15) + func (stream, "%s", "APSR_nzcv"); + else + func (stream, "%s", arm_regnames[value]); + break; + + case 'T': + func (stream, "%s", arm_regnames[value + 1]); + break; + + case 'd': + func (stream, "%ld", value); + break; + + default: + abort (); + } + } + break; + + case 'p': + { + uint8_t proc_number = (given >> 8) & 0x7; + func (stream, "p%u", proc_number); + break; + } + + case 'a': + { + uint8_t a_offset = 28; + if (given & (1 << a_offset)) + func (stream, "a"); + break; + } + default: + abort (); + } + } + else + func (stream, "%c", *c); + } + + if (is_unpredictable) + func (stream, UNPREDICTABLE_INSTRUCTION); + + return TRUE; + } + } + return FALSE; + } + else + return FALSE; +} + + /* Print one neon instruction on INFO->STREAM. Return TRUE if the instuction matched, FALSE if this is not a recognised neon instruction. */ @@ -10587,6 +10762,9 @@ print_insn_thumb32 (bfd_vma pc, struct disassemble_info *info, long given) if (is_mve && print_insn_mve (info, given)) return; + if (print_insn_cde (info, given, TRUE)) + return; + if (print_insn_generic_coprocessor (pc, info, given, TRUE)) return; @@ -11356,6 +11534,36 @@ parse_arm_disassembler_options (const char *options) force_thumb = 1; else if (CONST_STRNEQ (opt, "no-force-thumb")) force_thumb = 0; + else if (CONST_STRNEQ (opt, "coproc")) + { + const char *procptr = opt + sizeof ("coproc") - 1; + char *endptr; + uint8_t coproc_number = strtol (procptr, &endptr, 10); + if (endptr != procptr + 1 || coproc_number > 7) + { + opcodes_error_handler (_("cde coprocessor not between 0-7: %s"), + opt); + continue; + } + if (*endptr != '=') + { + opcodes_error_handler (_("coproc must have an argument: %s"), + opt); + continue; + } + endptr += 1; + if (CONST_STRNEQ (endptr, "generic")) + cde_coprocs &= ~(1 << coproc_number); + else if (CONST_STRNEQ (endptr, "cde") + || CONST_STRNEQ (endptr, "CDE")) + cde_coprocs |= (1 << coproc_number); + else + { + opcodes_error_handler ( + _("coprocN argument takes options \"generic\"," + " \"cde\", or \"CDE\": %s"), opt); + } + } else /* xgettext: c-format */ opcodes_error_handler (_("unrecognised disassembler option: %s"), opt); --===============7521995002192562515== Content-Type: application/gzip Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="cde0.patch.gz" Content-length: 15787 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 --===============7521995002192562515==--