From patchwork Fri Feb 3 07:32:13 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Beulich X-Patchwork-Id: 52352 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp694100wrn; Thu, 2 Feb 2023 23:32:46 -0800 (PST) X-Google-Smtp-Source: AK7set8cIKbUzxNfrIb6s5a1j6QFnLzQUbJqTqrJJeaimuacFdj5bZTfbmrB5XiCOfb1RWiUA+R0 X-Received: by 2002:a17:907:d38b:b0:879:767f:6e45 with SMTP id vh11-20020a170907d38b00b00879767f6e45mr9411761ejc.17.1675409565930; Thu, 02 Feb 2023 23:32:45 -0800 (PST) Received: from sourceware.org (ip-8-43-85-97.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id ss2-20020a170907c00200b00877db5bfb4csi2344038ejc.670.2023.02.02.23.32.45 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Feb 2023 23:32:45 -0800 (PST) Received-SPF: pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=hwGcCGtT; arc=fail (signature failed); spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 2B495385040F for ; Fri, 3 Feb 2023 07:32:28 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2B495385040F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1675409548; bh=966F406icbPpuC0LV2xCjfRnBzzfP8fTd+3eGt90uWg=; h=Date:Subject:To:Cc:References:In-Reply-To:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=hwGcCGtT3rdm3C4Q9Qieh9w3pF1ypTD9/FTHSFhytQuLfmUupsnJKmRX2Rsk8UwM8 yW+S5HUuPWH3Echh9LypIoMzmhmvbZ+7o7Qs7nRNs5FtO8aTcRmrM6hBLKxLNR3c7v uCWRkdI6zS9CiyTY0Vt1q0oED0SVVGYX4wYyWvQ8= X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05on2054.outbound.protection.outlook.com [40.107.20.54]) by sourceware.org (Postfix) with ESMTPS id 3CD74385B53D for ; Fri, 3 Feb 2023 07:32:18 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 3CD74385B53D ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=dMSW8DsdMCIlyqjM1eBRlUUOafYVvExZLaTNdekXD+WW2uYeoG/PHKRkPXBt+u4fG1VQKkWhNH+WMZjdi2Ws7t/yPmXK7EZX/FKXf5am8Cpj15Z20mbyc6q7+2RYitMHJeF+ul3pSJRwVJjkp2PxXGHVp4wxskEmOnDER8eL6v+/CZDoBdcZblVh1WeUNP6fv7fVX03lIGv0IUgYT+juvTpmcm5BJfWsjyvZTsrWYDsNSDfCOPkbT1Moldwi0bO644cMHIxWaxtK4e8OaUE1kbzl0euURTUXdYte95bxSiJO8MDOzz1tn5o3VCTJvPNQINyP1euUAa8eJOp0Iv6q6g== 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=966F406icbPpuC0LV2xCjfRnBzzfP8fTd+3eGt90uWg=; b=Vpg9SGewZ8C+1y/Vu+hQbmZmajUHY+hi3zAa4kcbzFkvcjRNZnap/jpPX7G0P2+l9JQzz7Xk52zDw5SJ6U6LCUJTiuAitSW9gJzFCYzlMa82N8eTRw0SwcBfKhgPNwwbKfYQFk/LI5KJmOASQXKKTeKdjVKc9Jo4CwnLl1wsWNcDpWsRK8ZLHdwUFSOD2/p5hnK5WsPNF498ZrENyQ+0ev3Y9RptJQi+FwjJF3H6/BvuY2RKOfL4xiuyiyBAcKX//az7jPaAE4fCEOoL4XirQoGni5qqvYX2quaRUPCKN+GcaKy6Tlt29g8bqjxNJkBRW0otsWfzTIohfgjR6zhJPw== 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 Received: from VE1PR04MB6560.eurprd04.prod.outlook.com (2603:10a6:803:122::25) by AS4PR04MB9715.eurprd04.prod.outlook.com (2603:10a6:20b:4f9::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6064.25; Fri, 3 Feb 2023 07:32:15 +0000 Received: from VE1PR04MB6560.eurprd04.prod.outlook.com ([fe80::e138:4fc3:705c:d178]) by VE1PR04MB6560.eurprd04.prod.outlook.com ([fe80::e138:4fc3:705c:d178%6]) with mapi id 15.20.6064.024; Fri, 3 Feb 2023 07:32:15 +0000 Message-ID: <06804163-be78-6130-b082-71661e50e876@suse.com> Date: Fri, 3 Feb 2023 08:32:13 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.6.1 Subject: [PATCH 1/3] x86: improve special casing of certain insns Content-Language: en-US To: Binutils Cc: "H.J. Lu" References: <1387362a-7920-de18-18e5-9fe42f923f0b@suse.com> In-Reply-To: <1387362a-7920-de18-18e5-9fe42f923f0b@suse.com> X-ClientProxiedBy: FR3P281CA0100.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:a1::18) To VE1PR04MB6560.eurprd04.prod.outlook.com (2603:10a6:803:122::25) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VE1PR04MB6560:EE_|AS4PR04MB9715:EE_ X-MS-Office365-Filtering-Correlation-Id: a2229746-f532-4502-84d8-08db05b8c569 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: xQuup6kSoiofLE7h1Jo63LyMwW01YYBM6RRFDE3vHYin1zxZ7DLX4/QC7tIchKVOYrrzZh0bagjnQ3ev81htHS1X2yKkcHWtl2ykWJkpdlNjpVy/2Sna8Pq7SP3tv1SQBDCgKX3pv3GZrbJxnW/w6+2iErHonauVEKcycTyTMIA8ykIKLDoKVeNb4++dXiCNeXUGXMuLXJadvK4cVUhr+napBJgFZeE8eMMRNqFCa85qUy0dZJKIqfJ2VvcHMiZGY3IakaVL3vUDHFFwtT/EQYG7At2mCnfFkUFJ5F4UxDDdWiwN+PZJofg60y8vkBJIlEKXCAXFmUwmrDtjxG5NkgvWEUhQ8qkRwX72vUtcauUML/GANxohEfwRVBmPccleyfdO4TCHg10IrEKEUDJKfby6HodVDZwrPcdCO8KdE550iguwbZnShYC+8S4FReGfgcMZt+l3hea9LC9XKPzsNtO5XRF7ZvmuE0+Y3xXhGnBm1m2vKti2yLdObb0NQ4L5uBRuNgMmrIIU1cZiYWLrtU+nPaCL2LWl4YMqU+lk2f5jUSoYW/HGcPWykDc8TKE7MCm9oyP1R4V8Nckqe40535pPYHooQN5rxakl61D2pKNcsoHOzazyAwJJNHUxFQwJiX/r3yjv7De4XRl2b1DP234jbZ9RCX6JSpy878iB9xC61YiQgSXfY3g1bI5PMJvH8x/mOzsjBWi3djuffShdB15wWcb2eW0UrGjjqv1jn4w= 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)(346002)(376002)(39860400002)(136003)(396003)(366004)(451199018)(478600001)(6486002)(83380400001)(31696002)(86362001)(38100700002)(36756003)(2616005)(6512007)(26005)(186003)(6506007)(31686004)(5660300002)(66556008)(316002)(4326008)(66946007)(8936002)(41300700001)(6916009)(66476007)(8676002)(2906002)(45980500001)(43740500002); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?s3m1oy3puwB2+2dI1vTOE3WfR2VH?= =?utf-8?q?4yuBLnc4gJnsnAL9CHuVFiZca1/l8cd9V4qjjNMjZikviOEfckzyFP2RQx1fpGkfx?= =?utf-8?q?dUyYGztz/vIuw7ybOzwT7ePsdgnpGFacXlrernYvc0WB8ZCbK6pgE/0To3lToP+66?= =?utf-8?q?3nqezPdSmLtsn8hlUjXBRLyiT7iOpNIC8gUmie2JykarHcdoY6OqV0T1Fivy8KLTU?= =?utf-8?q?vbl5BUI4RqKn5kPDMjZu3yoAmRpzajezAfsjGtIiZ69XHXyln3BQPMWhnGK7Ggccf?= =?utf-8?q?SkBJnFNnSwLtJUNwHUiUOKH1JXnaAnN+xNMFmpiPlN7tr4geoAlWZ7fbAcbR4q6fB?= =?utf-8?q?OwIGfIGLBuY2bobRglJyjtG6xna8fxXTQIhxH+/LmgyFLKnQbr4J8Y1sd/ZoENOKz?= =?utf-8?q?zIjfb7gOtsnSkpB096Evf9G6/1SmYP2e49Sb+rGb4TEXtHcap7CyT5SdsiwCZOHO2?= =?utf-8?q?rRrmOoBU4o8GGW4BH6G6uXdh9XmVODIZujUybYQ94rrfPyD7cuya0SWv2o22PxfnK?= =?utf-8?q?UgBG6SQhFdzICtZl8bEGP5MMynyHlZI2lDuHNROcW8gXogvrDoR6wsTEiQfVIPKP1?= =?utf-8?q?0uf4W/5H0Q3v5qla6cFg0ou0HY9hraVckjfKezhkMwB9p5sxItK80R/5uwRd/nJ4Z?= =?utf-8?q?RxDbE4T1UDn1OTjzCvNRCtP6wyNMqWwJtQ2Zx8CJzwCkuSp/I7zgxchNwk5ztQu0s?= =?utf-8?q?GWjgV5p0Dhe1lx3PUwkCZSQigyx846uzhdzthFcBuo9oMSNnllEGsDSgSwneIjzAP?= =?utf-8?q?KZd7GkXfwkhbla6WaySSus5FuVoLDLFmW+x6t5+g/IZPcg9br54diovgegeaseWGY?= =?utf-8?q?AgrWDHBqevbsfJZrNFDQH4Y/+3TXbXZjlY542DFMpNT8b8nvqAlYELSBRa/AHaCQR?= =?utf-8?q?RYaBf8UHqL//FDtpKlLbEUAE1b8/7aHBxGjZ1oo82VOhJeWQMLyJpBTWnUarYC5Qs?= =?utf-8?q?cpKQVyKmL+leQC8Y+yEqK8LkejSzfDZfogH9McV+FuAIUG3EQSxq0jXzvyvnOrPvZ?= =?utf-8?q?dUig5X+SgDSq1fpFg1bmQxsVtTjEPFhmtgkFPcDSVnjRGQ5B72lTDcbR7wuEUPxqV?= =?utf-8?q?4EQ9O7Z+pd3KI3IH8ufzsmBCMNe+fbG1shGAugfo0rwDJLjtgWeYPYh+v7skGcRmE?= =?utf-8?q?91DAFWXnrgSvDRB3VP2iYEAppNJSLkgKlEK3t0w6mlCCYUvn4xlMJwhpPKARNIUzE?= =?utf-8?q?RtvQBgDBuREzM5gTwwTbOubcw8xDNZHTx9omoF9E8SFIdn3F9Tp64ZvL9W8a0+KSj?= =?utf-8?q?WFTY7MnpKMZlzZUjewamwWwAohNLrKkkIlUgPogYVgVPE9X7+3sEPhI8H9zYkmPH7?= =?utf-8?q?zr0LwcZtDIlOum0oGn1NY0LnSlPWZtaqSblJazvYcc37pFZWle1d2GsK2Zd9o2GBk?= =?utf-8?q?iOBXMw2KDVh1HwPqPlhpIPSuVlYR1jKO9kX++/F0+ch1tf7Xjm+WPbbKwSTo8CFzM?= =?utf-8?q?ZFGvqecR8gBvfueSzYAJV4ew39dWrFjLwOA4TiFeXts0SfMOHxg3IDBMFkpCdimSo?= =?utf-8?q?/HWu7RTZZXZ0?= X-OriginatorOrg: suse.com X-MS-Exchange-CrossTenant-Network-Message-Id: a2229746-f532-4502-84d8-08db05b8c569 X-MS-Exchange-CrossTenant-AuthSource: VE1PR04MB6560.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Feb 2023 07:32:15.1423 (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: hftR/OFwbK7A8v1nIS3LFYkRQi4C9CcGn/c/7jGhQwYt85zHCLYw1B1/A+t9UwWuAPONTqWe0HW0Ef2UAG/iYw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS4PR04MB9715 X-Spam-Status: No, score=-3028.6 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 X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Jan Beulich via Binutils From: Jan Beulich Reply-To: Jan Beulich Errors-To: binutils-bounces+ouuuleilei=gmail.com@sourceware.org Sender: "Binutils" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1756794261074752389?= X-GMAIL-MSGID: =?utf-8?q?1756794261074752389?= Now that we have identifiers for the mnemonic strings we can avoid opcode based comparisons, for (in many cases) being more expensive and (in a few cases) being a little fragile and not self-documenting. Note that the MOV optimization can be engaged by the earlier LEA one, and hence LEA also needs checking for there. --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -3487,8 +3487,7 @@ want_disp32 (const insn_template *t) { return flag_code != CODE_64BIT || i.prefix[ADDR_PREFIX] - || (t->base_opcode == 0x8d - && t->opcode_modifier.opcodespace == SPACE_BASE + || (t->mnem_off == MN_lea && (!i.types[1].bitfield.qword || t->opcode_modifier.size == SIZE32)); } @@ -4096,8 +4095,7 @@ optimize_encoding (void) { unsigned int j; - if (i.tm.opcode_modifier.opcodespace == SPACE_BASE - && i.tm.base_opcode == 0x8d) + if (i.tm.mnem_off == MN_lea) { /* Optimize: -O: lea symbol, %rN -> mov $symbol, %rN @@ -4245,15 +4243,12 @@ optimize_encoding (void) } if (optimize_for_space - && i.tm.opcode_modifier.opcodespace == SPACE_BASE + && i.tm.mnem_off == MN_test && i.reg_operands == 1 && i.imm_operands == 1 && !i.types[1].bitfield.byte && i.op[0].imms->X_op == O_constant - && fits_in_imm7 (i.op[0].imms->X_add_number) - && (i.tm.base_opcode == 0xa8 - || (i.tm.base_opcode == 0xf6 - && i.tm.extension_opcode == 0x0))) + && fits_in_imm7 (i.op[0].imms->X_add_number)) { /* Optimize: -Os: test $imm7, %r64/%r32/%r16 -> test $imm7, %r8 @@ -4286,12 +4281,11 @@ optimize_encoding (void) && i.tm.extension_opcode == None && fits_in_unsigned_long (i.op[0].imms->X_add_number)) || (fits_in_imm31 (i.op[0].imms->X_add_number) - && ((i.tm.base_opcode == 0x24 - || i.tm.base_opcode == 0xa8) + && (i.tm.base_opcode == 0x24 || (i.tm.base_opcode == 0x80 && i.tm.extension_opcode == 0x4) - || ((i.tm.base_opcode == 0xf6 - || (i.tm.base_opcode | 1) == 0xc7) + || i.tm.mnem_off == MN_test + || ((i.tm.base_opcode | 1) == 0xc7 && i.tm.extension_opcode == 0x0))) || (fits_in_imm7 (i.op[0].imms->X_add_number) && i.tm.base_opcode == 0x83 @@ -4299,11 +4293,9 @@ optimize_encoding (void) || (i.types[0].bitfield.qword && ((i.reg_operands == 2 && i.op[0].regs == i.op[1].regs - && (i.tm.base_opcode == 0x30 - || i.tm.base_opcode == 0x28)) - || (i.reg_operands == 1 - && i.operands == 1 - && i.tm.base_opcode == 0x30))))) + && (i.tm.mnem_off == MN_xor + || i.tm.mnem_off == MN_sub)) + || i.tm.mnem_off == MN_clr)))) { /* Optimize: -O: andq $imm31, %r64 -> andl $imm31, %r32 @@ -4328,7 +4320,7 @@ optimize_encoding (void) } i.types[1].bitfield.dword = 1; i.types[1].bitfield.qword = 0; - if (i.tm.base_opcode == 0xb8 || (i.tm.base_opcode | 1) == 0xc7) + if (i.tm.mnem_off == MN_mov || i.tm.mnem_off == MN_lea) { /* Handle movq $imm31, %r64 -> movl $imm31, %r32 @@ -4351,11 +4343,9 @@ optimize_encoding (void) } else if (optimize > 1 && !optimize_for_space - && i.tm.opcode_modifier.opcodespace == SPACE_BASE && i.reg_operands == 2 && i.op[0].regs == i.op[1].regs - && ((i.tm.base_opcode & ~(Opcode_D | 1)) == 0x8 - || (i.tm.base_opcode & ~(Opcode_D | 1)) == 0x20) + && (i.tm.mnem_off == MN_and || i.tm.mnem_off == MN_or) && (flag_code != CODE_64BIT || !i.types[0].bitfield.dword)) { /* Optimize: -O2: @@ -4580,12 +4570,7 @@ load_insn_p (void) if (any_vex_p) { - /* vldmxcsr. */ - if (i.tm.base_opcode == 0xae - && i.tm.opcode_modifier.vex - && i.tm.opcode_modifier.opcodespace == SPACE_0F - && i.tm.opcode_modifier.opcodeprefix == PREFIX_NONE - && i.tm.extension_opcode == 2) + if (i.tm.mnem_off == MN_vldmxcsr) return 1; } else if (i.tm.opcode_modifier.opcodespace == SPACE_BASE) @@ -4699,9 +4684,7 @@ load_insn_p (void) || (base_opcode | 2) == 0x87)) return 1; - /* xadd. */ - if (i.tm.opcode_modifier.opcodespace == SPACE_0F - && base_opcode == 0xc1) + if (i.tm.mnem_off == MN_xadd) return 1; /* Check for load instruction. */ @@ -5361,12 +5344,8 @@ md_assemble (char *line) i.rex &= REX_OPCODE; } - /* Handle conversion of 'int $3' --> special int3 insn. XOP or FMA4 - instructions may define INT_OPCODE as well, so avoid this corner - case for those instructions that use MODRM. */ - if (i.tm.opcode_modifier.opcodespace == SPACE_BASE - && i.tm.base_opcode == INT_OPCODE - && !i.tm.opcode_modifier.modrm + /* Handle conversion of 'int $3' --> special int3 insn. */ + if (i.tm.mnem_off == MN_int && i.op[0].imms->X_add_number == 3) { i.tm.base_opcode = INT3_OPCODE; @@ -5476,10 +5455,7 @@ static INLINE bool q_suffix_allowed(cons || (t->opcode_modifier.opcodespace == SPACE_BASE && t->base_opcode == 0xdf && (t->extension_opcode & 1)) /* fild / fistp / fisttp */ - || (t->opcode_modifier.opcodespace == SPACE_0F - && t->base_opcode == 0xc7 - && t->opcode_modifier.opcodeprefix == PREFIX_NONE - && t->extension_opcode == 1) /* cmpxchg8b */; + || t->mnem_off == MN_cmpxchg8b; } static const char * @@ -7201,7 +7177,7 @@ check_string (void) static int process_suffix (void) { - bool is_crc32 = false, is_movx = false; + bool is_movx = false; /* If matched instruction specifies an explicit instruction mnemonic suffix, use it. */ @@ -7224,11 +7200,6 @@ process_suffix (void) && i.tm.base_opcode == 0x63 && i.tm.cpu_flags.bitfield.cpu64); - /* CRC32 */ - is_crc32 = (i.tm.base_opcode == 0xf0 - && i.tm.opcode_modifier.opcodespace == SPACE_0F38 - && i.tm.opcode_modifier.opcodeprefix == PREFIX_0XF2); - /* movsx/movzx want only their source operand considered here, for the ambiguity checking below. The suffix will be replaced afterwards to represent the destination (register). */ @@ -7236,7 +7207,7 @@ process_suffix (void) --i.operands; /* crc32 needs REX.W set regardless of suffix / source operand size. */ - if (is_crc32 && i.tm.operand_types[1].bitfield.qword) + if (i.tm.mnem_off == MN_crc32 && i.tm.operand_types[1].bitfield.qword) i.rex |= REX_W; /* If there's no instruction mnemonic suffix we try to invent one @@ -7247,7 +7218,7 @@ process_suffix (void) Destination register type is more significant than source register type. crc32 in SSE4.2 prefers source register type. */ - unsigned int op = is_crc32 ? 1 : i.operands; + unsigned int op = i.tm.mnem_off == MN_crc32 ? 1 : i.operands; while (op--) if (i.tm.operand_types[op].bitfield.instance == InstanceNone @@ -7571,8 +7542,7 @@ process_suffix (void) /* InOutPortReg */ || i.tm.operand_types[0].bitfield.instance == RegD || i.tm.operand_types[1].bitfield.instance == RegD - /* CRC32 */ - || is_crc32)))) + || i.tm.mnem_off == MN_crc32)))) i.tm.base_opcode |= 1; break; } @@ -7691,10 +7661,7 @@ check_byte_reg (void) continue; /* crc32 only wants its source operand checked here. */ - if (i.tm.base_opcode == 0xf0 - && i.tm.opcode_modifier.opcodespace == SPACE_0F38 - && i.tm.opcode_modifier.opcodeprefix == PREFIX_0XF2 - && op != 0) + if (i.tm.mnem_off == MN_crc32 && op != 0) continue; /* Any other register is bad. */ @@ -8160,9 +8127,7 @@ process_operands (void) } if ((i.seg[0] || i.prefix[SEG_PREFIX]) - && i.tm.base_opcode == 0x8d /* lea */ - && i.tm.opcode_modifier.opcodespace == SPACE_BASE - && !is_any_vex_encoding(&i.tm)) + && i.tm.mnem_off == MN_lea) { if (!quiet_warnings) as_warn (_("segment override on `%s' is ineffectual"), insn_name (&i.tm)); @@ -9089,7 +9054,7 @@ output_jump (void) break; case 2: - if (i.tm.base_opcode == 0xc7f8) + if (i.tm.mnem_off == MN_xbegin) fixP->fx_signed = 1; break; @@ -9601,10 +9566,8 @@ output_insn (void) x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X87; if ((i.xstate & xstate_mmx) - || (i.tm.opcode_modifier.opcodespace == SPACE_0F - && !is_any_vex_encoding (&i.tm) - && (i.tm.base_opcode == 0x77 /* emms */ - || i.tm.base_opcode == 0x0e /* femms */))) + || i.tm.mnem_off == MN_emms + || i.tm.mnem_off == MN_femms) x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_MMX; if (i.index_reg) @@ -9648,10 +9611,7 @@ output_insn (void) if (x86_feature_2_used || i.tm.cpu_flags.bitfield.cpucmov || i.tm.cpu_flags.bitfield.cpusyscall - || (i.tm.opcode_modifier.opcodespace == SPACE_0F - && i.tm.base_opcode == 0xc7 - && i.tm.opcode_modifier.opcodeprefix == PREFIX_NONE - && i.tm.extension_opcode == 1) /* cmpxchg8b */) + || i.tm.mnem_off == MN_cmpxchg8b) x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_BASELINE; if (i.tm.cpu_flags.bitfield.cpusse3 || i.tm.cpu_flags.bitfield.cpussse3 @@ -11503,12 +11463,9 @@ i386_index_check (const char *operand_st goto bad_address; /* bndmk, bndldx, bndstx and mandatory non-vector SIB have special restrictions. */ - if ((t->opcode_modifier.opcodeprefix == PREFIX_0XF3 - && t->opcode_modifier.opcodespace == SPACE_0F - && t->base_opcode == 0x1b) - || (t->opcode_modifier.opcodeprefix == PREFIX_NONE - && t->opcode_modifier.opcodespace == SPACE_0F - && (t->base_opcode & ~1) == 0x1a) + if (t->mnem_off == MN_bndmk + || t->mnem_off == MN_bndldx + || t->mnem_off == MN_bndstx || t->opcode_modifier.sib == SIBMEM) { /* They cannot use RIP-relative addressing. */ @@ -11519,9 +11476,7 @@ i386_index_check (const char *operand_st } /* bndldx and bndstx ignore their scale factor. */ - if (t->opcode_modifier.opcodeprefix == PREFIX_NONE - && t->opcode_modifier.opcodespace == SPACE_0F - && (t->base_opcode & ~1) == 0x1a + if ((t->mnem_off == MN_bndldx || t->mnem_off == MN_bndstx) && i.log2_scale_factor) as_warn (_("register scaling is being ignored here")); } From patchwork Fri Feb 3 07:32:33 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Beulich X-Patchwork-Id: 52353 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp694417wrn; Thu, 2 Feb 2023 23:33:33 -0800 (PST) X-Google-Smtp-Source: AK7set/PsGo7Ch5dCYYSgDlggQDnwkpFAtAwCJribXJi4OqYrNxa06vmf6+0E//yp3PhxyWXU/h9 X-Received: by 2002:a50:ee97:0:b0:49d:f4de:1988 with SMTP id f23-20020a50ee97000000b0049df4de1988mr8554922edr.42.1675409613609; Thu, 02 Feb 2023 23:33:33 -0800 (PST) Received: from sourceware.org (ip-8-43-85-97.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id n10-20020a056402514a00b0049e18d9674asi1773303edd.359.2023.02.02.23.33.33 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Feb 2023 23:33:33 -0800 (PST) Received-SPF: pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b="C7w11Ol/"; arc=fail (signature failed); spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 928573858431 for ; Fri, 3 Feb 2023 07:33:29 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 928573858431 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1675409609; bh=0Co3HZxqv4aW8dlDt4pZxnOmZmXt+8ZXQs4+zcD0Wno=; h=Date:Subject:To:Cc:References:In-Reply-To:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=C7w11Ol/p0wKv7otvyXKyw8PZcf/UOR+ADo41kMJlXJqat+gc4dNnVpbyaBkhceFK fMDht7cVHzmzO5wlVLLHZAiTMEU/Rml+eMcwwAm47wF/06ljPC6X40cb3SVAx7c5j1 RcRfBn3sG1cXCA6FsskYNRUOhFsVeQjxS9Q5qd+w= X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from EUR02-AM0-obe.outbound.protection.outlook.com (mail-am0eur02on2057.outbound.protection.outlook.com [40.107.247.57]) by sourceware.org (Postfix) with ESMTPS id 873F638582AB for ; Fri, 3 Feb 2023 07:32:37 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 873F638582AB ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=nEoY11WsiqmM373vLBIYfpo1gHvEDug1aRt2i+IQ3YyB1SsRqlZAvKAKy2OMHr2ESJKWHp3ezjfF6+JK0kSult2DZLxAGolFDPZQaOf4PfojKAm3AQl1I8z0MjNay/2bXwhdEyCOCYcJEZXuz7zs2b9PqkySR3uDhw8DDEeihJiBl0p3Kdm2wZCkC989yMQFUSQWm17pR7W+Yx20MEdk+FZ0uv9WrRVkQsGkmmO6haKRpp0UcMj2bUUoVD3eUOL/3GG7C6+hUG0PsqK9fzKwarojggUFmST8UZeM7o6V9iICYtUfD6fdwKF4sODr39vRPQJYHA59uXLM7FutlgUI0Q== 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=0Co3HZxqv4aW8dlDt4pZxnOmZmXt+8ZXQs4+zcD0Wno=; b=fvOdZx9p2MHlNJ4ERIiHABUJQtLZU1hKSaGqmWkQD5wpKQQpcHfALoFDcGMMNoL5+dZLtaAJfzFj3GZr9OrmUsEWpuPZMXIoALCwxc+HPrK/VhidCmvwoxwSoa10vNH4TUIyV7hda8YoKuUZLOc63DBiJvTVxWlobfIrFbbm4WL6+2lhK+Z46TVGmRbq9rtd1oIHQIUXk+EdI5EErmbe4c/X6WhiSI/5HudHBHOB0dU+W/4mZu177z6mQLGVWVj39ZVN96ZsVnkYlsTeO6RLtMuZUELKZKom/rgW8sLi4VeIrhGHBw1opZ74QbNpcvV2AJo68AXH0+f+xongrfExoQ== 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 Received: from VE1PR04MB6560.eurprd04.prod.outlook.com (2603:10a6:803:122::25) by AS4PR04MB9715.eurprd04.prod.outlook.com (2603:10a6:20b:4f9::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6064.25; Fri, 3 Feb 2023 07:32:35 +0000 Received: from VE1PR04MB6560.eurprd04.prod.outlook.com ([fe80::e138:4fc3:705c:d178]) by VE1PR04MB6560.eurprd04.prod.outlook.com ([fe80::e138:4fc3:705c:d178%6]) with mapi id 15.20.6064.024; Fri, 3 Feb 2023 07:32:35 +0000 Message-ID: <645a01e0-8acf-f55d-1f5a-c9e8bbb1d10f@suse.com> Date: Fri, 3 Feb 2023 08:32:33 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.6.1 Subject: [PATCH 2/3] x86: simplify a few expressions Content-Language: en-US To: Binutils Cc: "H.J. Lu" References: <1387362a-7920-de18-18e5-9fe42f923f0b@suse.com> In-Reply-To: <1387362a-7920-de18-18e5-9fe42f923f0b@suse.com> X-ClientProxiedBy: FR3P281CA0104.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:a1::20) To VE1PR04MB6560.eurprd04.prod.outlook.com (2603:10a6:803:122::25) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VE1PR04MB6560:EE_|AS4PR04MB9715:EE_ X-MS-Office365-Filtering-Correlation-Id: bc3ef4f2-d099-4830-5f3a-08db05b8d1a1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: wpQKWUVyQul8ErHvCm/SlsSbImWbWjbX9mn5DxYDC4IkxVsDUrcR1wUKOThhQKuXF2Ax2loY5kilDGMOrEL2oO950Ueb3fV/7tmefWBUut3SqiDTEQiW+gIUWCEPWQME+LoyscSSYpvqxzg44b2j2vTqD/UIn2rZO+Z08Eq3LJVhUshzwXRX+OSjMvmqd430lUQAImJ5U7SxWi0oCZA7k456LAupTGHbW6Mq0SET8+xaRZltdB0uYPyml9QjLQd6M9Yh1YclOUksPBwYSbSyhCHxN3uVQybpKyXDeHS6rMwxDgMPWbba1MREV7P/8xbavSGMyj8TLSCQjCG6LGKcqbx2WZ+8SbrrTzqV4YTViWvB2Fv7XUHijTGu+sd9Vv2RbXaLRD08pX3j0tgqxNEcD7/I7y0SwBL7KKU+2VqHRIEwMoxTYN5mUiAq1yrIxsd9PTgevEhK8ZvKIQZGr9sR1bGlyIAtYgtkN2s4eC+eSk/VUSe+b36uSKShXH9+OKiqm/REJCXsyHZRpWbReKP9/KYd3T48YfBUZUp0d1uUIjS6LE0+8adbhX0lkNKVXUjd1y712xZSBWRjyr+JVZCU7eLzuY6295zPvyTJK//opgJdDtA0lzIhiTiXhB9Cf9zxdiA0J1njWfymvNCFhie4kKlF7niUPltVcfnHDOo5QqaUTJBvlk+kJ3LGUSZZ9uvOP7HQTs8hYP7TsOmEeFckW5ag9ipB1ivKz90Ms3ZsSHo= 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)(346002)(376002)(39860400002)(136003)(396003)(366004)(451199018)(478600001)(6486002)(66574015)(31696002)(86362001)(38100700002)(36756003)(2616005)(6512007)(26005)(186003)(6506007)(31686004)(5660300002)(66556008)(316002)(4326008)(66946007)(8936002)(41300700001)(6916009)(66476007)(8676002)(2906002)(45980500001)(43740500002); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?ASp+a4h/MBChKKToJSGWdJrxZ2w8?= =?utf-8?q?r2zhS7KnP2MlAvdKYuADLovEKjyTduLhG0Ys4f49Np4jBUqcNmlKRCHmj7CBS2wJQ?= =?utf-8?q?lx3EcOayOk1EggR/Rh8m4rQJVHW055NZj9go/rDxYqV5JJoYmKwYK+2KdgkXxkBIR?= =?utf-8?q?++JhOUou5MdPdEnJNe68pEA3FNZSzzoauH2KkOjheSwB7x1aii9gOIpmTw9OiTP35?= =?utf-8?q?uMhz1hYHjGlunZe23/oGCuwlzZfYwpaHEtX1i7uvr3ijM2OZa7iZcXVDEgV2wxLrr?= =?utf-8?q?fdbAQoCpM2gYXl34lDiqZaJoOmcf9pGmTQoqXF0XmAIfM/GX1U443uE8PXw7kUGSP?= =?utf-8?q?JaecDX9Dy3RygDNTvOvr6pj0IeBLhkODjjIbpEwSGWSwWE925cYq9bPU+52rNpwh4?= =?utf-8?q?ILXl71vzr17lUcx4/KMlOKgVwXR20dE6W8x/hDzGpkTSmnHAakUUii+B47MegkFKS?= =?utf-8?q?AJVcKI3+lAScrft2Kexb7SckVt6L4qM5eD8XtgjSPw/XAtSbsN4H+LByn+OWcH+nT?= =?utf-8?q?vN+MQRN4gyp1LUsSohBS38eXxcZOCuktQqSy4X2hZryK20Tgc8wknLhXz5D0EB2XF?= =?utf-8?q?hjSZqEZUrpHnuJh9YRUGKfY+6m7inioC3ZH/PWfAhEbDHF8orPshwO2AZs51qq/aP?= =?utf-8?q?p8AbkED4wICWISG5eE5VVJoYKlbcUaABJW/Qa/4/S30AwGXfCWCOkXJ7X3a3uSGH2?= =?utf-8?q?YDJrbfMdnIhy3Mmf961+aSDpQKYi7WbDLfJWmK+eilUEYG4GNc8kgqwdrfOabuq5A?= =?utf-8?q?6Cq90jYgfGs+FF4ieMcGbGuufvx2crEOE9r2nAMsLvEwtB0mafErtcpwoIGD30+GM?= =?utf-8?q?NQ4ewaa1QyDoqTNMMOcP/6oqhvNW01iz5VX0k381XUIzTB87cqwhe+7zX58nMC5Vz?= =?utf-8?q?HRufK9drofWEQjEA5AyukTmGo0tWbI9WnEPQ6ylmxtgabiiyB+DNyqZgI3I4iNhIE?= =?utf-8?q?zyjFkaaNEQikvbt6P9bnOEhCZ1NYJdNmN2kMEte56IX6sWaoDxPqHbHievFNbb1Gb?= =?utf-8?q?1y3kLfNYAOCGRMq2290lgsAK5xuDYj2q5T03iuSipaKZRy+BWyBEw+Ev4QPv8D0Zc?= =?utf-8?q?3PpZt9Rq4k423EavmbDL8c1RQHeTYUI6mthtdEJNe2viXIjp+Kox+DYzaQt4yrxZg?= =?utf-8?q?GJpKNWROL5uF5jZNUtC2xG1D6MnTx7ya2sbZZvvAHDeV1app4xCfDq0mlaa8970qO?= =?utf-8?q?5t6XbRWy5cbHBrIA+T/ame4/RobdvBj8vVLG1iRoLsVeOixxZWV0VQZIm3O6Z9e5o?= =?utf-8?q?cY15G+nfpOv51XbJbuvxPWYUjJLlPpEg6Hdc5tq3lLqOC/0ri6ncRp2mxEp0R9kND?= =?utf-8?q?ZHiKaGPsxf8XcqZhYqmIGU/15h8vJsJCCzVJrLqta44rFA/5wP4v4RXOEwGRpnE9d?= =?utf-8?q?AHt2zMreeDdKn73zXmU9TTHF809/H0BbXY3CO37n4n6l3I9hUmY1UdavnlSHTomFQ?= =?utf-8?q?+xBZ0pEzXh5NLy0jb9n22Ej+D3NYbiz/XL+HWFnvngztBULE6GJagrNTHy1Hx9ZuY?= =?utf-8?q?4tAIFaCh0V0u?= X-OriginatorOrg: suse.com X-MS-Exchange-CrossTenant-Network-Message-Id: bc3ef4f2-d099-4830-5f3a-08db05b8d1a1 X-MS-Exchange-CrossTenant-AuthSource: VE1PR04MB6560.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Feb 2023 07:32:35.3754 (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: aopAVnJx1paeBjk60H7j2I76POAZ1/KgG/Mgeko6Cn4GOaP5wsLZsykjE3TiZ0c9iWnKNzv3HgeSFSctZdAtPA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS4PR04MB9715 X-Spam-Status: No, score=-3028.6 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 X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Jan Beulich via Binutils From: Jan Beulich Reply-To: Jan Beulich Errors-To: binutils-bounces+ouuuleilei=gmail.com@sourceware.org Sender: "Binutils" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1756794310830228855?= X-GMAIL-MSGID: =?utf-8?q?1756794310830228855?= Fold adjacent comparisons when, by ORing in a certain mask, the same effect can be achieved by a single one. In load_insn_p() this extends to further uses of an already available local variable. --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -4576,8 +4576,7 @@ load_insn_p (void) else if (i.tm.opcode_modifier.opcodespace == SPACE_BASE) { /* test, not, neg, mul, imul, div, idiv. */ - if ((i.tm.base_opcode == 0xf6 || i.tm.base_opcode == 0xf7) - && i.tm.extension_opcode != 1) + if (base_opcode == 0xf7 && i.tm.extension_opcode != 1) return 1; /* inc, dec. */ @@ -4589,13 +4588,12 @@ load_insn_p (void) return 1; /* rol, ror, rcl, rcr, shl/sal, shr, sar. */ - if ((base_opcode == 0xc1 - || (i.tm.base_opcode >= 0xd0 && i.tm.base_opcode <= 0xd3)) + if ((base_opcode == 0xc1 || (base_opcode | 2) == 0xd3) && i.tm.extension_opcode != 6) return 1; /* Check for x87 instructions. */ - if (base_opcode >= 0xd8 && base_opcode <= 0xdf) + if ((base_opcode | 6) == 0xdf) { /* Skip fst, fstp, fstenv, fstcw. */ if (i.tm.base_opcode == 0xd9 @@ -4638,7 +4636,7 @@ load_insn_p (void) { /* bt, bts, btr, btc. */ if (i.tm.base_opcode == 0xba - && (i.tm.extension_opcode >= 4 && i.tm.extension_opcode <= 7)) + && (i.tm.extension_opcode | 3) == 7) return 1; /* cmpxchg8b, cmpxchg16b, xrstors, vmptrld. */ @@ -4673,14 +4671,7 @@ load_insn_p (void) /* add, or, adc, sbb, and, sub, xor, cmp, test, xchg. */ if (i.tm.opcode_modifier.opcodespace == SPACE_BASE - && (base_opcode == 0x1 - || base_opcode == 0x9 - || base_opcode == 0x11 - || base_opcode == 0x19 - || base_opcode == 0x21 - || base_opcode == 0x29 - || base_opcode == 0x31 - || base_opcode == 0x39 + && ((base_opcode | 0x38) == 0x39 || (base_opcode | 2) == 0x87)) return 1; @@ -4708,8 +4699,7 @@ insert_lfence_after (void) chosen by the adversary using an LVI method, then this data-dependent behavior may leak some aspect of the secret. */ - if (((i.tm.base_opcode | 0x1) == 0xa7 - || (i.tm.base_opcode | 0x1) == 0xaf) + if (((i.tm.base_opcode | 0x9) == 0xaf) && i.prefix[REP_PREFIX]) { as_warn (_("`%s` changes flags which would affect control flow behavior"), @@ -4779,8 +4769,7 @@ insert_lfence_before (void) /* Output or/not/shl and lfence before near ret. */ if (lfence_before_ret != lfence_before_ret_none - && (i.tm.base_opcode == 0xc2 - || i.tm.base_opcode == 0xc3)) + && (i.tm.base_opcode | 1) == 0xc3) { if (last_insn.kind != last_insn_other && last_insn.seg == now_seg) From patchwork Fri Feb 3 07:33:44 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Beulich X-Patchwork-Id: 52354 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp694657wrn; Thu, 2 Feb 2023 23:34:09 -0800 (PST) X-Google-Smtp-Source: AK7set8ExIhWyIMdTW+roxPCtw6pZp4ylUoFd/1plbHsdY2uPlVNsFHOk/Zwh5CqNgX1aABA5yqL X-Received: by 2002:a17:906:2bdb:b0:878:a893:48db with SMTP id n27-20020a1709062bdb00b00878a89348dbmr8743495ejg.65.1675409649728; Thu, 02 Feb 2023 23:34:09 -0800 (PST) Received: from sourceware.org (ip-8-43-85-97.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id n12-20020aa7db4c000000b0047aaa487720si1798617edt.275.2023.02.02.23.34.09 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Feb 2023 23:34:09 -0800 (PST) Received-SPF: pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=ROuRmZqG; arc=fail (signature failed); spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 5D308385B509 for ; Fri, 3 Feb 2023 07:33:59 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 5D308385B509 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1675409639; bh=pnx9zAHQYFSdGEgeyg9GlsukYHFt0RA6b9vKcn9ddXo=; h=Date:Subject:To:Cc:References:In-Reply-To:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=ROuRmZqG0vK2TInSMRk9nWdtAvUqhpq7zGLXGvXfFa2PIRIMy9+TlFjBrO3auDZ02 9iI2JpbMyBEOo3kQwLynor4IdUhZUhFSqR0vrf7K3HekDy+EBMPdkyN6l2xxeVjJZa PCZLVvrMOam2YdijwPz+prw79wjtASdevwGfr2r0= X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from EUR04-VI1-obe.outbound.protection.outlook.com (mail-vi1eur04on2070.outbound.protection.outlook.com [40.107.8.70]) by sourceware.org (Postfix) with ESMTPS id D2820385800A for ; Fri, 3 Feb 2023 07:33:48 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org D2820385800A ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Vc8+tmgooeoVVDiztmy3ODwJVjNy30W4JbmPcXS0I/r8JEOBfouKT7xjAq0KDM2w9qKFv3YMeuSm0irWEefBdK2bn0jWqL8B5pmlQ1K0OLnnPVlxdvg6cVo1o/+9EtnO2Uhizn3NMZSNw0xYtBmUuTO0bU4mxfjia8jJVhPn95qmoVbEgzgeOEc7Rw3s7zlkmdIUbjPtbHBTgS1a/EQTW/sHszlGse+X9MllvGtf60HGjH2lJ9wdeQjVrfs1sGoaR1S9XiE0hb1MWeV8Y/55CNcextCfYMPoZJVBQ3E/PxJOifSVhDg0U/wkzZr6ZMXZpNFTgwJBbFKKUr+deORy0A== 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=pnx9zAHQYFSdGEgeyg9GlsukYHFt0RA6b9vKcn9ddXo=; b=LrtNi/WVK+d8sCnBEhypkq3CWUJOrYwc6nWQfmC9qyd+GmAYrjG7IQAt5d12szf/Hyz6kcsdmfgB9NqX1RRk/usqjYdNXUuj1VK4pQNIKJyU6uPRbihOtojDjeHPVK0WSiRlyYfScVwU917rxWJz8lDjCqwpO+5TPbJZtLBjmD+SdzSHU4P4o5s+K+bk/zTQcRatCx2NkDSTjPYYnLMWjzuaJ6zEIwII0e2QQEPhX0RQCJyJTVqBUt6v91Wx6TvnSOkeMYhPlxromHuSWczm7FqjlWB014qsWBRKzJ9aDe10oXDjqe+ByeVTbrZxrIphPQtLH5SG44RTZ8kFaabiIQ== 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 Received: from VE1PR04MB6560.eurprd04.prod.outlook.com (2603:10a6:803:122::25) by AS4PR04MB9715.eurprd04.prod.outlook.com (2603:10a6:20b:4f9::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6064.25; Fri, 3 Feb 2023 07:33:46 +0000 Received: from VE1PR04MB6560.eurprd04.prod.outlook.com ([fe80::e138:4fc3:705c:d178]) by VE1PR04MB6560.eurprd04.prod.outlook.com ([fe80::e138:4fc3:705c:d178%6]) with mapi id 15.20.6064.024; Fri, 3 Feb 2023 07:33:45 +0000 Message-ID: <8aa94a23-664f-f3ed-fa90-2e0cfa963bd0@suse.com> Date: Fri, 3 Feb 2023 08:33:44 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.6.1 Subject: [PATCH 3/3] x86: move (and rename) opcodespace attribute Content-Language: en-US To: Binutils Cc: "H.J. Lu" References: <1387362a-7920-de18-18e5-9fe42f923f0b@suse.com> In-Reply-To: <1387362a-7920-de18-18e5-9fe42f923f0b@suse.com> X-ClientProxiedBy: FR0P281CA0093.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:a9::7) To VE1PR04MB6560.eurprd04.prod.outlook.com (2603:10a6:803:122::25) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VE1PR04MB6560:EE_|AS4PR04MB9715:EE_ X-MS-Office365-Filtering-Correlation-Id: a00e1582-fdee-4604-d49f-08db05b8fb97 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: qGwIZm1lH+H5HAu75fwEhB/A/NOvYZASik4akficshg0+WKQxJzPB5nJzKWA0sLbomdTJgLqsl4BfGd96MRZF+Gl2GQTR65QdWUmOOmkpib3Zlkz2RCelZhVc9OutiTfY6MogB/C4QVV4Cd56bR/UDdc7eJsb1194sUpBmYuKOQAD3JLGvzAxOHX63bHqLqvMqsB94NABXapdVsuXnWpujNE58itPzVJ9+9TAwmLXdDiQ9zdQh/kDjtcJ5Im4nXSuDO01lGbu+yN0tubsKjhlMIOFP4cJqg03vQvQkam9MkalWIr/6WUFjamdOZOi+mGha+JLzdyjkSVcyfZt6dGhguPgHKmjstJktCs6YEpgnfdhwN+lPMEk60HUZHOvfU9wqZKbkHMoXQyDtiOLN4CTYZXE9eBInFcyaG6YA5L0DHmX+Cy9gFrjKYPS8BpOIns3GhVNfI1ZPkLmCh4MfcqvohMyE6jUgvMb4ETfLuvnVHk861QgD1c30fkr2CCy7gkfaoobZi064cNef9Ml3M0ImGATORcmgKwZ38H7oFRBX5lVjt6ggMDQw+z70eMzOtDZ2RikhaVPYLQWye+ppVAjulYf/5/hj2pYgVwTWags1cnVnUoZJu0rUqlRtvhEn4GjYYzS3OKshNJ8NoY8IxFp9aKRiRxN95MTKNQ/ogWyoZrBl3w7y4ZeQoNXWPJhS+SffQil6DweET5flq9IOVwldiF7a++jnWIoQVaNWwEdvQBTEqpXi5NoHLLwn4ZXRZf 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)(346002)(376002)(39860400002)(136003)(396003)(366004)(451199018)(478600001)(6486002)(83380400001)(66574015)(31696002)(86362001)(38100700002)(36756003)(2616005)(6512007)(26005)(186003)(6506007)(31686004)(30864003)(5660300002)(66556008)(316002)(4326008)(66946007)(8936002)(41300700001)(6916009)(66476007)(8676002)(2906002)(87944009)(45980500001)(43740500002); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?V6ljdyYmBmx0QbVV2ILtHeFd5NGy?= =?utf-8?q?jisNuV+LlAd04oFCBZ3dcJ8VIG55O6FxI1x0aidYwOJnAe+X5po4xLdXZup0C43UD?= =?utf-8?q?+y+q7k8XNkg2Q0B52z2AlGjMZjigi5XRTzd6LzoakK3HRDE6WdiEyRsL7VUBApnI/?= =?utf-8?q?eUDuDS4nvvvqflSlKtGPniPeUE2Wqy1+ZfPtbimejM9PtAkc0WFDp2qW0x+PJq9o1?= =?utf-8?q?tNohUvng9QCOJ8VUb8Lq/8O+UAJizH6463OguIyEknDGws0QQqKlj5izm/nweLqKP?= =?utf-8?q?+IUnW25zFS0HVpa2SgLnA58BmlbonmJsqIb4K27MaKvsUplmtEbtLBRFDPo/G9Xtn?= =?utf-8?q?8ZDZCsbGHOX5YxPw1yfFUBSp1QDfGm+213cDTQ81Rl2nemb1pDrUB4b2VBTm/sVaM?= =?utf-8?q?UuJ7wnHVUZzwQAz5rOCrGSYY5K1bjOAvfSZg5vd4BEf3jtpQS7HTbMuAb68sqnOaJ?= =?utf-8?q?wPwcWQPahJzoeXas0n3VrdZZ0Dm5++4ITzHO4RGjxlQR/lPOfOka40ucDjeeOA0Hw?= =?utf-8?q?wsDJcIOsQ7QOSK+vcFRy83Wh2U7dDX/EjVBk1Gj2wWf3E77a3+7gajJUDA2JUZ7Ym?= =?utf-8?q?WUsMUhh0O9qC9kp2ECtr9yn7gsgfT3H7Pktu+X7QEOp9I+70JgUX2S2kcF1Gl7H9N?= =?utf-8?q?ZfwUDJu+6v0mrcwPLdI00L5fSOjYoQBpZayXoflLrGnAa40oyR1F4fPBj+XO9LY8v?= =?utf-8?q?1kF4SxEdncsJ3n9H33GSsznOhWKYJ+w6mAXivAEkWInyH9I7qxRK9WFvo+OoJ8knh?= =?utf-8?q?/95gDk+Y10huHKvpCXN205SEnpRN+nkP7O9AnheNRnDbFonnZaFo1Fway+BQhiiUz?= =?utf-8?q?IY6NAmeDuPHRWXA6IfXsEN8CHTvDCBbArKrYY1t1MhDweo+R1AXDEfpSGIrTPS/ke?= =?utf-8?q?HulHry7lIwQwlsDotJOuJZ9lfIB+Vut6XnIzn3VBQSxxcnLqzQtB3PsG7FKFozA9U?= =?utf-8?q?2VXHQ2OTmYt36Ry54cqwQP0aq5MzPqgQuBQO8/RI4HiMr+ihYOAaVe6fJi/C8U4Ev?= =?utf-8?q?HDUTcTa3SHNCBI1yVvaidyHdxlOAg8pUx4gN+AiLiq2r81J3ULFTC15D3t7XV02Zm?= =?utf-8?q?VK7eSL2CryaGRWHgteEDenoaq/d2ewAIk535OwnXWLTV0+ek/UZiVydG4xN9xW6Ww?= =?utf-8?q?b9fBOHzYzh/JhZY+yn0EpEEi8jscUbEhVEB5qEBtIePvr0d41QAFzhxt4TeWZvYGs?= =?utf-8?q?yzB7D5ZfAr1bwN1UIJnJF7DHkIfSZ2p84taOLcBnrxuDjqEGSnCTFlwJtoQZJb2HN?= =?utf-8?q?J8s3ll3HxmG6GEun+IMNIfLUxDLfw8gWCCfSZah4a2+WnfWprSL4djDzZ0JpP62t+?= =?utf-8?q?lHSwM/n9CYWFpiwAAXJ/kn9bWl/6Pbtxp2720AjnE1ee0omQEC2jpe6Y0hmtlnQpB?= =?utf-8?q?rkupS65GflHiDYXlbsspZmPDTDnh+tcOdkEPSQTdrxYseVP2PKxkUzm2SMhyXqfik?= =?utf-8?q?DJ8h/h8oyOg9fLjMkpoFClJ5A4p3Q8uPVi1ly/4jBQlDVHk5oVXJj0uDKv1kNlfSh?= =?utf-8?q?NyFLGDFZut4X?= X-OriginatorOrg: suse.com X-MS-Exchange-CrossTenant-Network-Message-Id: a00e1582-fdee-4604-d49f-08db05b8fb97 X-MS-Exchange-CrossTenant-AuthSource: VE1PR04MB6560.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Feb 2023 07:33:45.8553 (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: OmaKCrGZXfaErdM+DONeYHH6iltn3oSU999ELtpGknmVDwqBAEmBWnt87jFCFb/jvcZKhv/uI/bZf0hVp3l1iQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS4PR04MB9715 X-Spam-Status: No, score=-3028.6 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 X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Jan Beulich via Binutils From: Jan Beulich Reply-To: Jan Beulich Errors-To: binutils-bounces+ouuuleilei=gmail.com@sourceware.org Sender: "Binutils" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1756794349200079093?= X-GMAIL-MSGID: =?utf-8?q?1756794349200079093?= This really isn't a "modifier" and rather ought to live next to the base opcode anyway. Use the bits we presently have available to fit in the field, renaming it to opcode_space. As an intended side effect this helps readability at the use sites, by shortening the references quite a bit. In generated code arrange for human readable output, by using the SPACE_* constants there rather than raw numbers. This may aid debugging down the road. --- I'd like to do the same to opcodeprefix, but that's going to be more intrusive, as we don't have spare bits left in a useful position (fitting the field right after mnem_off isn't a good idea imo). Hence I'm considering to do away with i386_opcode_modifier as a structure altogether, which would tidy use sites quite a bit (like is the case here). Plus it would shrink total struct size (when, at the same time, reducing mnem_off to a 16-bit bitfield) and hence overall table size. Thoughts anyone? --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -3203,8 +3203,8 @@ pte (insn_template *t) fprintf (stdout, " %d operands ", t->operands); if (opc_pfx[t->opcode_modifier.opcodeprefix]) fprintf (stdout, "pfx %x ", opc_pfx[t->opcode_modifier.opcodeprefix]); - if (opc_spc[t->opcode_modifier.opcodespace]) - fprintf (stdout, "space %s ", opc_spc[t->opcode_modifier.opcodespace]); + if (opc_spc[t->opcode_space]) + fprintf (stdout, "space %s ", opc_spc[t->opcode_space]); fprintf (stdout, "opcode %x ", t->base_opcode); if (t->extension_opcode != None) fprintf (stdout, "ext %x ", t->extension_opcode); @@ -3587,7 +3587,7 @@ build_vex_prefix (const insn_template *t && i.dir_encoding == dir_encoding_default && i.operands == i.reg_operands && operand_type_equal (&i.types[0], &i.types[i.operands - 1]) - && i.tm.opcode_modifier.opcodespace == SPACE_0F + && i.tm.opcode_space == SPACE_0F && (i.tm.opcode_modifier.load || i.tm.opcode_modifier.d) && i.rex == REX_B) { @@ -3633,7 +3633,7 @@ build_vex_prefix (const insn_template *t union i386_op temp_op; i386_operand_type temp_type; - gas_assert (i.tm.opcode_modifier.opcodespace == SPACE_0F); + gas_assert (i.tm.opcode_space == SPACE_0F); gas_assert (!i.tm.opcode_modifier.sae); gas_assert (operand_type_equal (&i.types[i.operands - 2], &i.types[i.operands - 3])); @@ -3686,7 +3686,7 @@ build_vex_prefix (const insn_template *t /* Use 2-byte VEX prefix if possible. */ if (w == 0 && i.vec_encoding != vex_encoding_vex3 - && i.tm.opcode_modifier.opcodespace == SPACE_0F + && i.tm.opcode_space == SPACE_0F && (i.rex & (REX_W | REX_X | REX_B)) == 0) { /* 2-byte VEX prefix. */ @@ -3707,7 +3707,7 @@ build_vex_prefix (const insn_template *t /* 3-byte VEX prefix. */ i.vex.length = 3; - switch (i.tm.opcode_modifier.opcodespace) + switch (i.tm.opcode_space) { case SPACE_0F: case SPACE_0F38: @@ -3725,7 +3725,7 @@ build_vex_prefix (const insn_template *t /* The high 3 bits of the second VEX byte are 1's compliment of RXB bits from REX. */ - i.vex.bytes[1] = (~i.rex & 0x7) << 5 | i.tm.opcode_modifier.opcodespace; + i.vex.bytes[1] = (~i.rex & 0x7) << 5 | i.tm.opcode_space; i.vex.bytes[2] = (w << 7 | register_specifier << 3 @@ -3860,9 +3860,9 @@ build_evex_prefix (void) /* The high 3 bits of the second EVEX byte are 1's compliment of RXB bits from REX. */ - gas_assert (i.tm.opcode_modifier.opcodespace >= SPACE_0F); - gas_assert (i.tm.opcode_modifier.opcodespace <= SPACE_EVEXMAP6); - i.vex.bytes[1] = (~i.rex & 0x7) << 5 | i.tm.opcode_modifier.opcodespace; + gas_assert (i.tm.opcode_space >= SPACE_0F); + gas_assert (i.tm.opcode_space <= SPACE_EVEXMAP6); + i.vex.bytes[1] = (~i.rex & 0x7) << 5 | i.tm.opcode_space; /* The fifth bit of the second EVEX byte is 1's compliment of the REX_R bit in VREX. */ @@ -4072,14 +4072,14 @@ encode_with_unaligned_vector_move (void) case 0x28: /* Load instructions. */ case 0x29: /* Store instructions. */ /* movaps/movapd/vmovaps/vmovapd. */ - if (i.tm.opcode_modifier.opcodespace == SPACE_0F + if (i.tm.opcode_space == SPACE_0F && i.tm.opcode_modifier.opcodeprefix <= PREFIX_0X66) i.tm.base_opcode = 0x10 | (i.tm.base_opcode & 1); break; case 0x6f: /* Load instructions. */ case 0x7f: /* Store instructions. */ /* movdqa/vmovdqa/vmovdqa64/vmovdqa32. */ - if (i.tm.opcode_modifier.opcodespace == SPACE_0F + if (i.tm.opcode_space == SPACE_0F && i.tm.opcode_modifier.opcodeprefix == PREFIX_0X66) i.tm.opcode_modifier.opcodeprefix = PREFIX_0XF3; break; @@ -4221,7 +4221,7 @@ optimize_encoding (void) { if (flag_code != CODE_32BIT) return; - i.tm.opcode_modifier.opcodespace = SPACE_0F; + i.tm.opcode_space = SPACE_0F; i.tm.base_opcode = 0xb7; } else @@ -4272,7 +4272,7 @@ optimize_encoding (void) } } else if (flag_code == CODE_64BIT - && i.tm.opcode_modifier.opcodespace == SPACE_BASE + && i.tm.opcode_space == SPACE_BASE && ((i.types[1].bitfield.qword && i.reg_operands == 1 && i.imm_operands == 1 @@ -4374,7 +4374,7 @@ optimize_encoding (void) || i.tm.cpu_flags.bitfield.cpuavx512vl || (i.tm.operand_types[2].bitfield.zmmword && i.types[2].bitfield.ymmword)))) - && i.tm.opcode_modifier.opcodespace == SPACE_0F + && i.tm.opcode_space == SPACE_0F && ((i.tm.base_opcode | 2) == 0x57 || i.tm.base_opcode == 0xdf || i.tm.base_opcode == 0xef @@ -4545,7 +4545,7 @@ load_insn_p (void) return 1; } - if (i.tm.opcode_modifier.opcodespace == SPACE_BASE) + if (i.tm.opcode_space == SPACE_BASE) { /* popf, popa. */ if (i.tm.base_opcode == 0x9d @@ -4573,7 +4573,7 @@ load_insn_p (void) if (i.tm.mnem_off == MN_vldmxcsr) return 1; } - else if (i.tm.opcode_modifier.opcodespace == SPACE_BASE) + else if (i.tm.opcode_space == SPACE_BASE) { /* test, not, neg, mul, imul, div, idiv. */ if (base_opcode == 0xf7 && i.tm.extension_opcode != 1) @@ -4632,7 +4632,7 @@ load_insn_p (void) return 1; } } - else if (i.tm.opcode_modifier.opcodespace == SPACE_0F) + else if (i.tm.opcode_space == SPACE_0F) { /* bt, bts, btr, btc. */ if (i.tm.base_opcode == 0xba @@ -4670,7 +4670,7 @@ load_insn_p (void) dest--; /* add, or, adc, sbb, and, sub, xor, cmp, test, xchg. */ - if (i.tm.opcode_modifier.opcodespace == SPACE_BASE + if (i.tm.opcode_space == SPACE_BASE && ((base_opcode | 0x38) == 0x39 || (base_opcode | 2) == 0x87)) return 1; @@ -4719,7 +4719,7 @@ insert_lfence_before (void) { char *p; - if (i.tm.opcode_modifier.opcodespace != SPACE_BASE) + if (i.tm.opcode_space != SPACE_BASE) return; if (i.tm.base_opcode == 0xff @@ -4841,9 +4841,9 @@ static INLINE bool may_need_pass2 (const return t->opcode_modifier.sse2avx /* Note that all SSE2AVX templates have at least one operand. */ ? t->operand_types[t->operands - 1].bitfield.class == RegSIMD - : (t->opcode_modifier.opcodespace == SPACE_0F + : (t->opcode_space == SPACE_0F && (t->base_opcode | 1) == 0xbf) - || (t->opcode_modifier.opcodespace == SPACE_BASE + || (t->opcode_space == SPACE_BASE && t->base_opcode == 0x63); } @@ -5116,8 +5116,8 @@ md_assemble (char *line) if (sse_check != check_none /* The opcode space check isn't strictly needed; it's there only to bypass the logic below when easily possible. */ - && t->opcode_modifier.opcodespace >= SPACE_0F - && t->opcode_modifier.opcodespace <= SPACE_0F3A + && t->opcode_space >= SPACE_0F + && t->opcode_space <= SPACE_0F3A && !i.tm.cpu_flags.bitfield.cpusse4a && !is_any_vex_encoding (t)) { @@ -5240,7 +5240,7 @@ md_assemble (char *line) instructions (base opcodes: 0x6c, 0x6e, 0xec, 0xee). */ if (i.input_output_operand && ((i.tm.base_opcode | 0x82) != 0xee - || i.tm.opcode_modifier.opcodespace != SPACE_BASE)) + || i.tm.opcode_space != SPACE_BASE)) { as_bad (_("input/output port address isn't allowed with `%s'"), insn_name (&i.tm)); @@ -5441,7 +5441,7 @@ md_assemble (char *line) static INLINE bool q_suffix_allowed(const insn_template *t) { return flag_code == CODE_64BIT - || (t->opcode_modifier.opcodespace == SPACE_BASE + || (t->opcode_space == SPACE_BASE && t->base_opcode == 0xdf && (t->extension_opcode & 1)) /* fild / fistp / fisttp */ || t->mnem_off == MN_cmpxchg8b; @@ -5678,7 +5678,7 @@ parse_insn (const char *line, char *mnem if (current_templates != NULL /* MOVS or CMPS */ && (current_templates->start->base_opcode | 2) == 0xa6 - && current_templates->start->opcode_modifier.opcodespace + && current_templates->start->opcode_space == SPACE_BASE && mnem_p[-2] == 's') { @@ -6853,14 +6853,14 @@ match_template (char mnem_suffix) zero-extend %eax to %rax. */ if (flag_code == CODE_64BIT && t->base_opcode == 0x90 - && t->opcode_modifier.opcodespace == SPACE_BASE + && t->opcode_space == SPACE_BASE && i.types[0].bitfield.instance == Accum && i.types[0].bitfield.dword && i.types[1].bitfield.instance == Accum) continue; if (t->base_opcode == MOV_AX_DISP32 - && t->opcode_modifier.opcodespace == SPACE_BASE + && t->opcode_space == SPACE_BASE && t->mnem_off != MN_movabs) { /* Force 0x8b encoding for "mov foo@GOT, %eax". */ @@ -6972,8 +6972,8 @@ match_template (char mnem_suffix) found_reverse_match = Opcode_VexW; goto check_operands_345; } - else if (t->opcode_modifier.opcodespace != SPACE_BASE - && (t->opcode_modifier.opcodespace != SPACE_0F + else if (t->opcode_space != SPACE_BASE + && (t->opcode_space != SPACE_0F /* MOV to/from CR/DR/TR, as an exception, follow the base opcode space encoding model. */ || (t->base_opcode | 7) != 0x27)) @@ -7183,9 +7183,9 @@ process_suffix (void) unsigned int numop = i.operands; /* MOVSX/MOVZX */ - is_movx = (i.tm.opcode_modifier.opcodespace == SPACE_0F + is_movx = (i.tm.opcode_space == SPACE_0F && (i.tm.base_opcode | 8) == 0xbe) - || (i.tm.opcode_modifier.opcodespace == SPACE_BASE + || (i.tm.opcode_space == SPACE_BASE && i.tm.base_opcode == 0x63 && i.tm.cpu_flags.bitfield.cpu64); @@ -7289,7 +7289,7 @@ process_suffix (void) && (i.tm.opcode_modifier.jump == JUMP_ABSOLUTE || i.tm.opcode_modifier.jump == JUMP_BYTE || i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT - || (i.tm.opcode_modifier.opcodespace == SPACE_0F + || (i.tm.opcode_space == SPACE_0F && i.tm.base_opcode == 0x01 /* [ls][gi]dt */ && i.tm.extension_opcode <= 3))) { @@ -7511,7 +7511,7 @@ process_suffix (void) need rex64. */ && ! (i.operands == 2 && i.tm.base_opcode == 0x90 - && i.tm.opcode_modifier.opcodespace == SPACE_BASE + && i.tm.opcode_space == SPACE_BASE && i.types[0].bitfield.instance == Accum && i.types[0].bitfield.qword && i.types[1].bitfield.instance == Accum)) @@ -8083,14 +8083,14 @@ process_operands (void) return 0; } if (i.op[0].regs->reg_num > 3 - && i.tm.opcode_modifier.opcodespace == SPACE_BASE ) + && i.tm.opcode_space == SPACE_BASE ) { i.tm.base_opcode ^= (POP_SEG_SHORT ^ POP_SEG386_SHORT) & 0xff; - i.tm.opcode_modifier.opcodespace = SPACE_0F; + i.tm.opcode_space = SPACE_0F; } i.tm.base_opcode |= (i.op[0].regs->reg_num << 3); } - else if (i.tm.opcode_modifier.opcodespace == SPACE_BASE + else if (i.tm.opcode_space == SPACE_BASE && (i.tm.base_opcode & ~3) == MOV_AX_DISP32) { default_seg = reg_ds; @@ -9325,7 +9325,7 @@ maybe_fused_with_jcc_p (enum mf_cmp_kind return 0; /* No opcodes outside of base encoding space. */ - if (i.tm.opcode_modifier.opcodespace != SPACE_BASE) + if (i.tm.opcode_space != SPACE_BASE) return 0; /* add, sub without add/sub m, imm. */ @@ -9449,7 +9449,7 @@ add_branch_padding_frag_p (enum align_br if (!align_branch_power || now_seg == absolute_section || !cpu_arch_flags.bitfield.cpui386 - || i.tm.opcode_modifier.opcodespace != SPACE_BASE) + || i.tm.opcode_space != SPACE_BASE) return 0; add_padding = 0; @@ -9611,7 +9611,7 @@ output_insn (void) /* LAHF-SAHF insns in 64-bit mode. */ || (flag_code == CODE_64BIT && (i.tm.base_opcode | 1) == 0x9f - && i.tm.opcode_modifier.opcodespace == SPACE_BASE)) + && i.tm.opcode_space == SPACE_BASE)) x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_V2; if (i.tm.cpu_flags.bitfield.cpuavx || i.tm.cpu_flags.bitfield.cpuavx2 @@ -9870,7 +9870,7 @@ output_insn (void) /* Now the opcode; be careful about word order here! */ j = i.opcode_length; if (!i.vex.length) - switch (i.tm.opcode_modifier.opcodespace) + switch (i.tm.opcode_space) { case SPACE_BASE: break; @@ -9895,11 +9895,11 @@ output_insn (void) { p = frag_more (j); if (!i.vex.length - && i.tm.opcode_modifier.opcodespace != SPACE_BASE) + && i.tm.opcode_space != SPACE_BASE) { *p++ = 0x0f; - if (i.tm.opcode_modifier.opcodespace != SPACE_0F) - *p++ = i.tm.opcode_modifier.opcodespace == SPACE_0F38 + if (i.tm.opcode_space != SPACE_0F) + *p++ = i.tm.opcode_space == SPACE_0F38 ? 0x38 : 0x3a; } @@ -9971,7 +9971,7 @@ output_insn (void) /* Count prefixes for extended opcode maps. */ if (!i.vex.length) - switch (i.tm.opcode_modifier.opcodespace) + switch (i.tm.opcode_space) { case SPACE_BASE: break; @@ -10209,7 +10209,7 @@ output_disp (fragS *insn_start_frag, off && i.rm.regmem == 5)) && (i.rm.mode == 2 || (i.rm.mode == 0 && i.rm.regmem == 5)) - && i.tm.opcode_modifier.opcodespace == SPACE_BASE + && i.tm.opcode_space == SPACE_BASE && ((i.operands == 1 && i.tm.base_opcode == 0xff && (i.rm.reg == 2 || i.rm.reg == 4)) --- a/opcodes/i386-gen.c +++ b/opcodes/i386-gen.c @@ -430,7 +430,6 @@ static bitfield opcode_modifiers[] = BITFIELD (Vex), BITFIELD (VexVVVV), BITFIELD (VexW), - BITFIELD (OpcodeSpace), BITFIELD (OpcodePrefix), BITFIELD (VexSources), BITFIELD (SIB), @@ -957,10 +956,24 @@ get_element_size (char **opnd, int linen static void process_i386_opcode_modifier (FILE *table, char *mod, unsigned int space, - unsigned int prefix, char **opnd, int lineno) + unsigned int prefix, const char *extension_opcode, + char **opnd, int lineno) { char *str, *next, *last; bitfield modifiers [ARRAY_SIZE (opcode_modifiers)]; + static const char *const spaces[] = { +#define SPACE(n) [SPACE_##n] = #n + SPACE(BASE), + SPACE(0F), + SPACE(0F38), + SPACE(0F3A), + SPACE(EVEXMAP5), + SPACE(EVEXMAP6), + SPACE(XOP08), + SPACE(XOP09), + SPACE(XOP0A), +#undef SPACE + }; active_isstring = 0; @@ -978,6 +991,34 @@ process_i386_opcode_modifier (FILE *tabl if (str) { int val = 1; + + if (strncmp(str, "OpcodeSpace", 11) == 0) + { + char *end; + + if (str[11] != '=') + fail ("%s:%d: Missing value for `OpcodeSpace'\n", + filename, lineno); + + val = strtol (str + 12, &end, 0); + if (*end) + fail ("%s:%d: Bogus value `%s' for `OpcodeSpace'\n", + filename, lineno, end); + + if (space) + { + if (val != space) + fail ("%s:%d: Conflicting opcode space specifications\n", + filename, lineno); + fprintf (stderr, + "%s:%d: Warning: redundant opcode space specification\n", + filename, lineno); + } + + space = val; + continue; + } + if (strcasecmp(str, "Broadcast") == 0) val = get_element_size (opnd, lineno) + BYTE_BROADCAST; else if (strcasecmp(str, "Disp8MemShift") == 0) @@ -1002,19 +1043,6 @@ process_i386_opcode_modifier (FILE *tabl } } - if (space) - { - if (!modifiers[OpcodeSpace].value) - modifiers[OpcodeSpace].value = space; - else if (modifiers[OpcodeSpace].value != space) - fail ("%s:%d: Conflicting opcode space specifications\n", - filename, lineno); - else - fprintf (stderr, - "%s:%d: Warning: redundant opcode space specification\n", - filename, lineno); - } - if (prefix) { if (!modifiers[OpcodePrefix].value) @@ -1038,6 +1066,13 @@ process_i386_opcode_modifier (FILE *tabl "%s: %d: W modifier without Word/Dword/Qword operand(s)\n", filename, lineno); } + + if (space >= ARRAY_SIZE (spaces) || !spaces[space]) + fail ("%s:%d: Unknown opcode space %u\n", filename, lineno, space); + + fprintf (table, " SPACE_%s, %s,\n", + spaces[space], extension_opcode ? extension_opcode : "None"); + output_opcode_modifier (table, modifiers, ARRAY_SIZE (modifiers)); } @@ -1257,13 +1292,12 @@ output_i386_opcode (FILE *table, const c filename, lineno, name, 2 * length, opcode); ident = mkident (name); - fprintf (table, " { MN_%s, 0x%0*llx%s, %lu, %s,\n", - ident, 2 * (int)length, opcode, end, i, - extension_opcode ? extension_opcode : "None"); + fprintf (table, " { MN_%s, 0x%0*llx%s, %u,", + ident, 2 * (int)length, opcode, end, i); free (ident); process_i386_opcode_modifier (table, opcode_modifier, space, prefix, - operand_types, lineno); + extension_opcode, operand_types, lineno); process_i386_cpu_flag (table, cpu_flags, NULL, ",", " ", lineno, CpuMax); --- a/opcodes/i386-opc.h +++ b/opcodes/i386-opc.h @@ -605,28 +605,6 @@ enum #define VEXW1 2 #define VEXWIG 3 VexW, - /* Opcode encoding space (values chosen to be usable directly in - VEX/XOP mmmmm and EVEX mm fields): - 0: Base opcode space. - 1: 0F opcode prefix / space. - 2: 0F38 opcode prefix / space. - 3: 0F3A opcode prefix / space. - 5: EVEXMAP5 opcode prefix / space. - 6: EVEXMAP6 opcode prefix / space. - 8: XOP 08 opcode space. - 9: XOP 09 opcode space. - A: XOP 0A opcode space. - */ -#define SPACE_BASE 0 -#define SPACE_0F 1 -#define SPACE_0F38 2 -#define SPACE_0F3A 3 -#define SPACE_EVEXMAP5 5 -#define SPACE_EVEXMAP6 6 -#define SPACE_XOP08 8 -#define SPACE_XOP09 9 -#define SPACE_XOP0A 0xA - OpcodeSpace, /* Opcode prefix (values chosen to be usable directly in VEX/XOP/EVEX pp fields): 0: None @@ -759,7 +737,6 @@ typedef struct i386_opcode_modifier unsigned int vex:2; unsigned int vexvvvv:2; unsigned int vexw:2; - unsigned int opcodespace:4; unsigned int opcodeprefix:2; unsigned int vexsources:2; unsigned int sib:3; @@ -942,8 +919,29 @@ typedef struct insn_template /* how many operands */ unsigned int operands:3; - /* spare bits */ - unsigned int :4; + /* opcode space */ + unsigned int opcode_space:4; + /* Opcode encoding space (values chosen to be usable directly in + VEX/XOP mmmmm and EVEX mm fields): + 0: Base opcode space. + 1: 0F opcode prefix / space. + 2: 0F38 opcode prefix / space. + 3: 0F3A opcode prefix / space. + 5: EVEXMAP5 opcode prefix / space. + 6: EVEXMAP6 opcode prefix / space. + 8: XOP 08 opcode space. + 9: XOP 09 opcode space. + A: XOP 0A opcode space. + */ +#define SPACE_BASE 0 +#define SPACE_0F 1 +#define SPACE_0F38 2 +#define SPACE_0F3A 3 +#define SPACE_EVEXMAP5 5 +#define SPACE_EVEXMAP6 6 +#define SPACE_XOP08 8 +#define SPACE_XOP09 9 +#define SPACE_XOP0A 0xA /* (Fake) base opcode value for pseudo prefixes. */ #define PSEUDO_PREFIX 0