From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR01-DB5-obe.outbound.protection.outlook.com (mail-db5eur01on2081.outbound.protection.outlook.com [40.107.15.81]) by sourceware.org (Postfix) with ESMTPS id 5B48C3858C54 for ; Fri, 10 Mar 2023 10:19:26 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 5B48C3858C54 Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=YP/FxP42qYWKELpoJkZTKcmMHmermZXgz2NJVLWb4GoL2mETYeNXBlBKC+t/F5KuUHyk2kvIrSXRGznw8vOtj6rYgIutk/NxrcmEzYVnYktG2Yk9CCOmIErHBwJE1B/hbg1Vzpm9iOcjra6bakpwr+qOWE3r8Q1WOGvCop4qJpBdOx/Vch1GIExXay/+q3MMMjn45/Bq4sLdMaXSfLkxLYrsy1sdD4NIjPx4nvhDFCoEBUjKfWbXM43RBydAGSKEXVCrbgK3OqO72opzYT/1RyiflQuD+PhAlZ2DswhIM/sGNBCD6iLVWo8O1rpmyoCAOe96r4tmVY0XITj6MzmlYg== 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=nW0zQycjUJHiOCSnuHTmVyo5aIfpVOH0I683+zeM+sU=; b=G5n67cl8gBJr6M2BeguUZ1R4X9GWZ030nqIBGfdW3t6VI9A5Lx80foUchp3KNLGqvCouuvPJTRkA8klvml8oLZAezelDU/gjpGG8Kw1qQYWfS0SiLqGYUmS2zfRLEtuenuS+++DoIl5b/a9Zh1+o79pZwkaSiL87rCs3q2zIENxhNIVseBHbZ3FNo7wa0vqq3p08szMYeegdxuugqfnwmnPEU9eV0DHAK2YaGS61CmnqXqQU4+U1oret3jrxxsq+rEX1RMU4aTICIL9lMPxgxJWNC+3J8tuwDIT32ektoug+KJDYdXbOwhZM2LobsZfSmPppbYggQAy7U2eM0lZUGA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=suse.com; dmarc=pass action=none header.from=suse.com; dkim=pass header.d=suse.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=nW0zQycjUJHiOCSnuHTmVyo5aIfpVOH0I683+zeM+sU=; b=Bk45oZVtZ1DHzeE+riBl6fS9QTP6IVb7nEKBKPlzFvkxAB3KspEckJJ/BbE7/MMT00B0THaQREN/w11t9r0JoR1NUfNDOOdJb3eZD9Ky22vTDzNu2mxOI1a6KYIv9r0A3A1zaGM7h5Oaz9shwGWHvYcvEOoch9aRHgtpG4DkRc7ZGeSTLG5pVZSnPUbrRWdIAkpK+oR3l0uCiYF56ZEApqEIhSsMPZoT76hBc7EbcMEFk70RGmh3KqgENFMgvuuwoIo9FOvtFgBilpGrt/BeThYanfXcbIR++P+wR6sIGDg6OLpWRd129H9RVYwxKb1R6YESd9EOL/N1HpXIiV/xQw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=suse.com; Received: from VE1PR04MB6560.eurprd04.prod.outlook.com (2603:10a6:803:122::25) by DB9PR04MB9819.eurprd04.prod.outlook.com (2603:10a6:10:4c0::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6178.19; Fri, 10 Mar 2023 10:19:24 +0000 Received: from VE1PR04MB6560.eurprd04.prod.outlook.com ([fe80::154e:166d:ec25:531b]) by VE1PR04MB6560.eurprd04.prod.outlook.com ([fe80::154e:166d:ec25:531b%5]) with mapi id 15.20.6178.019; Fri, 10 Mar 2023 10:19:24 +0000 Message-ID: <97d9240d-2d1a-d7a4-35e4-7cec1f418f38@suse.com> Date: Fri, 10 Mar 2023 11:19:22 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.8.0 Subject: [PATCH v2 01/14] x86: introduce .insn directive Content-Language: en-US To: Binutils Cc: "H.J. Lu" , "Jiang, Haochen" References: From: Jan Beulich In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-ClientProxiedBy: FR2P281CA0032.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:14::19) To VE1PR04MB6560.eurprd04.prod.outlook.com (2603:10a6:803:122::25) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VE1PR04MB6560:EE_|DB9PR04MB9819:EE_ X-MS-Office365-Filtering-Correlation-Id: 29e55422-554d-42ee-5419-08db2150ec08 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: cMGf8YWa9txLXh0qaZld22nwv3NaeKi3oJTZzPRb6GDmsXnqZy1tiryFzR8xkXudqvWm4P3ZgRMFRkfIrwh9fA4NOSeLEfya0flB4E3lk1CpSnlYKoI8jkzQnKuH0Ty269S/oTdEtb72AzSvyI0g1PRd84jsiTnU2xKrbZPPwhkHQMH0Ru75YYreI51UR28n0S/3HOH2LXhGG3PVWxF8CGUI65H2+3XzMCE6ftrRAFQH5FMgUEKPPHFZ+MszeHAR2KGYWj+7ngylrKrkGarBqZFqb3p5pZdgUTlCq8vBBPKfHvO4SM9fb7oPGurauFeG3Br6klNtWTAw9rA/bT6MnevMeA9AVbioSLNex4RtCwcbtOLf75dVzP7BLQZ0WChVIReWvdmfUcFPhp5gcAcX9AoVYy660Rj2RsRK7/PaeROEOzDaYBdvepd2lGAfim36XZMVXNuiYRvVoz7uFoMxqZzWBqtt6W2fjCSoeGdUxrXeleHy+Z/d33hIPq65i32P7LPCibobD5FqNnEvyp4nK2/MD/iEgrI7zAjUmeX1i5mbKWDSJ+UIviSbRCLZJlFZSAe3/0/dWhZizGZkMtvHLHa0FsNQFAG7ioz1cYCCUL1lcuahq7qj1L52qAxL6PzVEWCdO1G4YrXhHK+XHUsSIxyfWahq3LCWBb5114rc0v33PaBnEkqgpcY7i4/khUHKrPB3P0QYNGb9sdySHPhX5z3bbTndeO5LZdIskv7W+pocuzJXQAH1lrKFBB+M+H/I X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VE1PR04MB6560.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230025)(396003)(39860400002)(136003)(346002)(376002)(366004)(451199018)(36756003)(5660300002)(83380400001)(26005)(186003)(6486002)(6506007)(6512007)(2616005)(66946007)(478600001)(316002)(4326008)(6916009)(8676002)(66556008)(8936002)(41300700001)(31696002)(86362001)(66476007)(54906003)(38100700002)(2906002)(66899018)(31686004)(142923001)(45980500001)(43740500002);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?ci9NZDNmNENuNTB5TUdtZlFwK0xOYnFuTVo1MGVHWlpvSTZld2xzL0g0L0R5?= =?utf-8?B?K1J2dEw2UGc2VWRUR3pZRnU3TXYvMGUvYTBsUkJwbk1ZRTdseDZZUmNYdEV6?= =?utf-8?B?dG8wWjI0US9VVUphM25RTGF6R0JnVk5sZW5XVGI0UHV5NXVycmNxNUxrVW9I?= =?utf-8?B?Z0FZdStQbjRURVJJWXRSYmZ5WGFZMnhVN21Va3kxMWlpd0txWUxxcFVuR3c1?= =?utf-8?B?WG9DTmc4RVp1aEQwSlVYM0VLWTRtS0l5TlJiOFdydjM3NERMYkh4WGd2cGVQ?= =?utf-8?B?azhLb3NhMkFKTDZMSkp2aktUclRiQUxsNERHNXBjL3Q2a2hFSGJBcVZnSHlY?= =?utf-8?B?UTlpWGw5SmFDMmRZd0dyaUFCTGRVNzViUnE1R3ZOWFVvZXNIZHpMeEVYNk9m?= =?utf-8?B?WTFPSE0xYzY4ZzdRWENycDZsU24wQUo5U2VndWNBejNtRE9iVTQ0VzJiZ3Jz?= =?utf-8?B?eS9PMjk0TUsvUlJZUE1LM1ZMUnI5a1pOR3dZVzRQTFoxOUdZRUVVS3dkd0ZY?= =?utf-8?B?M1YyTkpIQS9XMloxVS9wWFdBUVVIb0lLZm4wdkN5dnRkd2pmc0o5NWp1YU5T?= =?utf-8?B?TUJGN21UaW5oanh1TSs1cVplM3hUWTV1cWViMVYxVTlxUnJUMDRjRFJHd21G?= =?utf-8?B?Z05KbGVyMC9EYzlSZ0VZRkV0azAzWEhVM01aUUdscHI4ZU9FaTdCSFlWc1M2?= =?utf-8?B?OWtyRXcySW9pV3JzUjg5ZjIzdlNrVnV5VzVlQ1FYNUlkUjVkRXMyK1ZsMmlt?= =?utf-8?B?OElLN1l1MHExeWZXc0lBSmZIMVluU0tPb293N3ZnV2l6dmJQc1dtVEZhdE5k?= =?utf-8?B?ZDhNb2NpaXlWQjNvOFdIZWc0ZUk2VmErdEV2QXE1Y0FCZzBVMjRnSDN2RktZ?= =?utf-8?B?Rm85M2pvMk9GVjhKbjNxSCtmRXRiZ3ZSaGpRbUJCT3BMNEJSMUhmTUxoa01Z?= =?utf-8?B?a2ZJQXdhUEduQ3VYckpKYWRMMnFOUTdJM0hpekpkei9PR1ZuMk02clpPTEx1?= =?utf-8?B?NlpQRjk3WHBNcHQyZGhOd0tJR2Rrb21HY284ZmhRdlpYY3FoSEVUVm9EeHJR?= =?utf-8?B?bTJqeVdGbVo3WDJUWWdvMHFNd0VVK1U5Vy9zekFaRXRBVVhvKzFEQlhuNHFI?= =?utf-8?B?a1l0M3I4K1JKL3RHS2t4U0RKeUo1TVZ0eUhUMWl5dno2dFBwcHo0Qlo0RTN5?= =?utf-8?B?ZUczbFY0M1NuSUdCMTE2d3daTFlTVlp2S0tLU1NoajBVdkpZTE13R2dRalVI?= =?utf-8?B?K2NzNmZYdFJYOXVraEFDdTdXdU9GMHBKeTdTVXNVWlp3RFZQVEZSR0tsMlhU?= =?utf-8?B?RlgvaDlnRTYzbUl6TVptSHVTU3I5aHVBamkraVk3MUZGWDAvdDNpbmt4dHdm?= =?utf-8?B?MS9qV2dSTURleUUvY2lMeEhRS0ZRa3hicDVkSWdOL2poWDh3YjNwOThnU09N?= =?utf-8?B?UXNyZmRFaHJCcmVHbktiTEhCZXNPaHgySU8yc1ZCTU4xSWJvQ0V5NW1rNjRM?= =?utf-8?B?SWtjbm5JcCt6U0p0dXFZbzBuYTAyMnEyYXlFZ05UTnRVcmhVbWdYS0U1cG1m?= =?utf-8?B?bVVJMW9XVWMvMTdJM3NtZU5ZaEwzaGVLUklINmlrUG1zMitzSDNkVXJkWHZv?= =?utf-8?B?NTF1TmRGSUlzSXYrbktxNmsrZ25qbVBIc2ozODFHK3pPUFlFME0vUHBzd3Bs?= =?utf-8?B?b1R4UERGQzBPSWtDMGZpaEtUdkZ1dDY3Z2VyMUFaajJZb0FoNjZpSEpOMUJT?= =?utf-8?B?MVNRRlB1cHhnT3BqMEF4R2s0TkZVdlRnaW5idWlGRUphUUNFVG9EUnZaKzlT?= =?utf-8?B?SERhaXF6U1o5OTg3WmxDMGM3NkZXbnRITEg5R0d3bHpyUFZVaHdvdWh3eWU3?= =?utf-8?B?ZDB2Y21URjQvRjBqWkp2VkZSYkpmZmQ0WEExeVRhcllSSm42K25US3RLeHN5?= =?utf-8?B?b3QrcXg0Z0Y3SUtHanBzTHIrVUFFa2x5TzU0MllMTEtkM202djhQTWtPdEwr?= =?utf-8?B?QzNYZnVnSlpLU0xRTGF3TTUxalI3d09zWDY2VE1TSWNFVUlVU3ZVckk3YnpD?= =?utf-8?B?K0sreS9QYUlSMk5pVGtETE9Ra1hSRjR4VGRjQ2R6Y29uS2tzUU1ybHMxTDQy?= =?utf-8?Q?zfUroxaRbx4vdwNY6jfSZQddq?= X-OriginatorOrg: suse.com X-MS-Exchange-CrossTenant-Network-Message-Id: 29e55422-554d-42ee-5419-08db2150ec08 X-MS-Exchange-CrossTenant-AuthSource: VE1PR04MB6560.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Mar 2023 10:19:24.5532 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f7a17af6-1c5c-4a36-aa8b-f5be247aa4ba X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: S6MzYSLGfjAULor6kMezOch7t3Dv5VZwcL6QeZzRu0F1ozET0dg5wJZqo6wehWCtPcmq6s9+1Dx5tw3cObcw4g== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB9PR04MB9819 X-Spam-Status: No, score=-3028.2 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,SPF_PASS,TXREP 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: For starters this deals with only very basic constructs. --- Subsequently a dot_insn() predicate will be introduced. If deemed better than parse_insn()'s new parameter, its introduction could be pulled ahead into here, and the predicate then be used there instead. --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -137,6 +137,7 @@ typedef struct arch_entry; static void update_code_flag (int, int); +static void s_insn (int); static void set_code_flag (int); static void set_16bit_gcc_code_flag (int); static void set_intel_syntax (int); @@ -159,7 +160,7 @@ static int i386_intel_operand (char *, i static int i386_intel_simplify (expressionS *); static int i386_intel_parse_name (const char *, expressionS *); static const reg_entry *parse_register (char *, char **); -static const char *parse_insn (const char *, char *); +static const char *parse_insn (const char *, char *, bool); static char *parse_operands (char *, const char *); static void swap_operands (void); static void swap_2_operands (unsigned int, unsigned int); @@ -1198,6 +1199,7 @@ const pseudo_typeS md_pseudo_table[] = {"bfloat16", float_cons, 'b'}, {"value", cons, 2}, {"slong", signed_cons, 4}, + {"insn", s_insn, 0}, {"noopt", s_ignore, 0}, {"optim", s_ignore, 0}, {"code16gcc", set_16bit_gcc_code_flag, CODE_16BIT}, @@ -4856,6 +4858,20 @@ insert_lfence_before (void) } } +/* Shared helper for md_assemble() and s_insn(). */ +static void init_globals (void) +{ + unsigned int j; + + memset (&i, '\0', sizeof (i)); + i.rounding.type = rc_none; + for (j = 0; j < MAX_OPERANDS; j++) + i.reloc[j] = NO_RELOC; + memset (disp_expressions, '\0', sizeof (disp_expressions)); + memset (im_expressions, '\0', sizeof (im_expressions)); + save_stack_p = save_stack; +} + /* Helper for md_assemble() to decide whether to prepare for a possible 2nd parsing pass. Instead of introducing a rarely use new insn attribute this utilizes a common pattern between affected templates. It is deemed @@ -4888,19 +4904,13 @@ md_assemble (char *line) /* Initialize globals. */ current_templates = NULL; retry: - memset (&i, '\0', sizeof (i)); - i.rounding.type = rc_none; - for (j = 0; j < MAX_OPERANDS; j++) - i.reloc[j] = NO_RELOC; - memset (disp_expressions, '\0', sizeof (disp_expressions)); - memset (im_expressions, '\0', sizeof (im_expressions)); - save_stack_p = save_stack; + init_globals (); /* First parse an instruction mnemonic & call i386_operand for the operands. We assume that the scrubber has arranged it so that line[0] is the valid start of a (possibly prefixed) mnemonic. */ - end = parse_insn (line, mnemonic); + end = parse_insn (line, mnemonic, false); if (end == NULL) { if (pass1_mnem != NULL) @@ -5439,7 +5449,7 @@ static INLINE bool q_suffix_allowed(cons } static const char * -parse_insn (const char *line, char *mnemonic) +parse_insn (const char *line, char *mnemonic, bool prefix_only) { const char *l = line, *token_start = l; char *mnem_p; @@ -5469,6 +5479,8 @@ parse_insn (const char *line, char *mnem || (*l != PREFIX_SEPARATOR && *l != ','))) { + if (prefix_only) + break; as_bad (_("invalid character %s in mnemonic"), output_invalid (*l)); return NULL; @@ -5590,6 +5602,9 @@ parse_insn (const char *line, char *mnem break; } + if (prefix_only) + return token_start; + if (!current_templates) { /* Deprecated functionality (new code should use pseudo-prefixes instead): @@ -10705,6 +10720,136 @@ signed_cons (int size) cons_sign = -1; } +static void +s_insn (int dummy ATTRIBUTE_UNUSED) +{ + char mnemonic[MAX_MNEM_SIZE], *line = input_line_pointer; + char *saved_ilp = find_end_of_line (line, false), saved_char; + const char *end; + unsigned int j; + valueT val; + bool vex = false, xop = false, evex = false; + static const templates tt = { &i.tm, &i.tm + 1 }; + + init_globals (); + + saved_char = *saved_ilp; + *saved_ilp = 0; + + end = parse_insn (line, mnemonic, true); + if (end == NULL) + { + bad: + *saved_ilp = saved_char; + ignore_rest_of_line (); + return; + } + line += end - line; + + current_templates = &tt; + i.tm.mnem_off = MN__insn; + + if (startswith (line, "VEX") + && (line[3] == '.' || is_space_char (line[3]))) + { + vex = true; + line += 3; + } + else if (startswith (line, "XOP") && ISDIGIT (line[3])) + { + char *e; + unsigned long n = strtoul (line + 3, &e, 16); + + if (e == line + 5 && n >= 0x08 && n <= 0x1f + && (*e == '.' || is_space_char (*e))) + { + xop = true; + line = e; + } + } + else if (startswith (line, "EVEX") + && (line[4] == '.' || is_space_char (line[4]))) + { + evex = true; + line += 4; + } + + if (vex || xop + ? i.vec_encoding == vex_encoding_evex + : evex + ? i.vec_encoding == vex_encoding_vex + || i.vec_encoding == vex_encoding_vex3 + : i.vec_encoding != vex_encoding_default) + { + as_bad (_("pseudo-prefix conflicts with encoding specifier")); + goto bad; + } + + if (line > end && *line == '.') + { + } + + input_line_pointer = line; + val = get_absolute_expression (); + line = input_line_pointer; + + for (j = 1; j < sizeof(val); ++j) + if (!(val >> (j * 8))) + break; + + /* Trim off a prefix if present. */ + if (j > 1 && !vex && !xop && !evex) + { + uint8_t byte = val >> ((j - 1) * 8); + + switch (byte) + { + case DATA_PREFIX_OPCODE: + case REPE_PREFIX_OPCODE: + case REPNE_PREFIX_OPCODE: + if (!add_prefix (byte)) + goto bad; + val &= ((uint64_t)1 << (--j * 8)) - 1; + break; + } + } + + /* Trim off encoding space. */ + if (j > 1 && !i.tm.opcode_space && (val >> ((j - 1) * 8)) == 0x0f) + { + uint8_t byte = val >> ((--j - 1) * 8); + + i.tm.opcode_space = SPACE_0F; + switch (byte & -(j > 1)) + { + case 0x38: + i.tm.opcode_space = SPACE_0F38; + --j; + break; + case 0x3a: + i.tm.opcode_space = SPACE_0F3A; + --j; + break; + } + val &= ((uint64_t)1 << (j * 8)) - 1; + } + + if (j > 2) + { + as_bad (_("opcode residual (%#"PRIx64") too wide"), val); + goto bad; + } + i.opcode_length = j; + i.tm.base_opcode = val; + + output_insn (); + + *saved_ilp = saved_char; + input_line_pointer = line; + + demand_empty_rest_of_line (); +} + #ifdef TE_PE static void pe_directive_secrel (int dummy ATTRIBUTE_UNUSED) --- a/gas/testsuite/gas/i386/i386.exp +++ b/gas/testsuite/gas/i386/i386.exp @@ -68,6 +68,7 @@ if [gas_32_check] then { run_dump_test "intelok" run_dump_test "prefix" run_list_test "prefix32" "-al" + run_dump_test "insn-32" run_dump_test "lea" run_dump_test "lea16" run_dump_test "amd" @@ -873,6 +874,7 @@ if [gas_64_check] then { run_dump_test "x86-64-sysenter-mixed" run_dump_test "x86-64-sysenter-amd" run_list_test "x86-64-sysenter-amd" "-mamd64" + run_dump_test "insn-64" run_dump_test "noreg64" run_list_test "noreg64" run_dump_test "noreg64-data16" --- /dev/null +++ b/gas/testsuite/gas/i386/insn-32.d @@ -0,0 +1,14 @@ +#objdump: -dw +#name: .insn (32-bit code) + +.*: +file format .* + +Disassembly of section .text: + +0+ : +[ ]*[a-f0-9]+: 90[ ]+nop +[ ]*[a-f0-9]+: f3 90[ ]+pause +[ ]*[a-f0-9]+: f3 90[ ]+pause +[ ]*[a-f0-9]+: d9 ee[ ]+fldz +[ ]*[a-f0-9]+: f3 0f 01 e8[ ]+setssbsy +#pass --- /dev/null +++ b/gas/testsuite/gas/i386/insn-32.s @@ -0,0 +1,14 @@ + .text +insn: + # nop + .insn 0x90 + + # pause + .insn 0xf390 + .insn repe 0x90 + + # fldz + .insn 0xd9ee + + # setssbsy + .insn 0xf30f01e8 --- /dev/null +++ b/gas/testsuite/gas/i386/insn-64.d @@ -0,0 +1,14 @@ +#objdump: -dw +#name: .insn (64-bit code) + +.*: +file format .* + +Disassembly of section .text: + +0+ : +[ ]*[a-f0-9]+: 90[ ]+nop +[ ]*[a-f0-9]+: f3 90[ ]+pause +[ ]*[a-f0-9]+: f3 90[ ]+pause +[ ]*[a-f0-9]+: d9 ee[ ]+fldz +[ ]*[a-f0-9]+: f3 0f 01 e8[ ]+setssbsy +#pass --- /dev/null +++ b/gas/testsuite/gas/i386/insn-64.s @@ -0,0 +1,14 @@ + .text +insn: + # nop + .insn 0x90 + + # pause + .insn 0xf390 + .insn repe 0x90 + + # fldz + .insn 0xd9ee + + # setssbsy + .insn 0xf30f01e8 --- a/opcodes/i386-gen.c +++ b/opcodes/i386-gen.c @@ -1814,6 +1814,9 @@ process_i386_opcodes (FILE *table) l = l1; } + fprintf (table, " \"\\0\"\".insn\"\n"); + fprintf (fp, "#define MN__insn %#x\n", offs + 1); + fprintf (table, ";\n"); fclose (fp); --- a/opcodes/i386-mnem.h +++ b/opcodes/i386-mnem.h @@ -2339,3 +2339,4 @@ extern const char i386_mnemonics[]; #define MN__rex_ 0x469c #define MN__evex_ 0x46a2 #define MN__vex_ 0x46a9 +#define MN__insn 0x46af --- a/opcodes/i386-tbl.h +++ b/opcodes/i386-tbl.h @@ -60199,6 +60199,7 @@ const char i386_mnemonics[] = "\0""{rex}" "\0""{evex}" "\0""{vex}" + "\0"".insn" ; /* i386 register table. */