From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR04-DB3-obe.outbound.protection.outlook.com (mail-eopbgr60079.outbound.protection.outlook.com [40.107.6.79]) by sourceware.org (Postfix) with ESMTPS id 6C83D385E007 for ; Tue, 5 Jul 2022 06:45:34 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 6C83D385E007 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Qk400ligtXcO4ie2wsDRtfnAfTbBwvzuiYIyDascLMYl4LiMCNgPiNn65AvMCIIuN3RtACTh9ge7zTlxZBs02vI3y3OvDu5yWqZxKsyIWOgi3r3s80U0Q4xY5AS0J95r6psl/w4vK/G3z12BpzKXoRkVuM5EZvyJaI7dsAippMmsjI5B6M24zH9SdaT5xtFWo3GUfIrVoUsBiSxQdQxfaaG2x64yWHt84HfaSi5kygRXhj63mZwyOKJy3+/pVNreXAKkHn4bC7mIr6sxcv47DsphDbVL5qVidnJd25GLCNyh/uZVUHXkR+hJT/uV63bt+eZ86XdV9M6IRtmkXzpyIw== 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=Q2rCmL2yn/hThmljDTIS77t9PUzsmtnL/45h2K1KnQI=; b=MuKM5FTtD2ZHOIR5WtKWnXkSBk1j5/MD1pLbCV+LrBOpH0RVaokaTNE4du5DnK0NBU5DCEePbmYwVZBJTiW2rfz32R0Mbj/NJJ4YC89xP589ilpM6rcDUKpOu9jpCUu/gKADnUTpXTS/KLyHQaBv0/BlB9gDLDfq2kSzGiwhrngn1HmRWQzxJMU0SUctLMiaC2Ln/3SD4j2Ib6cRxmhiwBVkwTMfsEaSGrxnnYKPepSzAZQeFAGDDhhpep8tAIXtiYkig51mbsq0vbl/dnOMdhOS0EXz5aKuQ+Kja75gyZtaodWB6nHhxvhWUu13hIqe1JKkpCGYFqWBTCG7/mgirA== 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 AS8PR04MB8231.eurprd04.prod.outlook.com (2603:10a6:20b:3ff::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5395.20; Tue, 5 Jul 2022 06:45:31 +0000 Received: from VE1PR04MB6560.eurprd04.prod.outlook.com ([fe80::dfa:a64a:432f:e26b]) by VE1PR04MB6560.eurprd04.prod.outlook.com ([fe80::dfa:a64a:432f:e26b%7]) with mapi id 15.20.5395.021; Tue, 5 Jul 2022 06:45:31 +0000 Message-ID: Date: Tue, 5 Jul 2022 08:45:30 +0200 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.11.0 Subject: [PATCH v2 4/4] x86: introduce a state stack for .arch Content-Language: en-US To: Binutils References: From: Jan Beulich In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-ClientProxiedBy: FR3P281CA0085.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:1f::22) To VE1PR04MB6560.eurprd04.prod.outlook.com (2603:10a6:803:122::25) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 4ff82bec-bffe-45e4-be0a-08da5e51f440 X-MS-TrafficTypeDiagnostic: AS8PR04MB8231:EE_ X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 05T0c5FRqNJR7eyFehy0bM9Id2sVPBSky2WkMsr34hg5WfBV/8kcBiqyLmtrHTQ8rjJd7mKOFZI9qVjSAR889zPiVdhQg1PUzSJ3nZPTHrHGjhB9b57HyerCknmDqmXlETGLm6vaL0c8r2FVMND314LMC8gYz2yV1ksrNiwefjRzSdGQpbiNB9VmPgLb3BPdByMeO1C8O16DZgk1hrr/Ly7W0f9r5rTJTv1ADUS7K+XYaAC6nR3Qzr1UZGlq+Wralcg+ptrM4jp28ovpSEtc4iByxtMcykE2yNjl/b6OvF0LiHnGCPyDcmBg6HbuOWVs652H90ss4o2jWamZ5OVULiLWmAoEi8IFBaCIqQ+1zEKDMb7wRfMMpPARmu0Bs0bzSGe70z05oeLuBT9ykSU8BDfDPcEgQcCYq8oCe7mGaD2+rjx5oV9l89dApHbtWnBml9i+3n72luNxnCS5qyQsReq9ZsAczb6wmIhRVSU/lazimwoJIIHcaWcmyyBhLLZhUbHPSFkSoXRW/83GbpTUTMPxb7scYUxz91HFpj+3nf5PxT8AOjbBVbI1tupKEljJw0yoiDp3Pjuz5UI2DlSxnHiRHzHBKQrB8j4GnXfeksjTrO0/MG4wJI6YfYKDfZmg+E94yJw9/wQOY2JreKX6aNgOqBVxw7ADpdeqYDUVgzOsibcl8eRKJsd7erWYiG6uzWUVJC61OfCU/L8Ky4NJwhN4YO2eZKoi4BZWkRhcY58GocuxY5rI292uj1vUUSR2EjJY2M6Ppkgzcfew5itIO56TwcJhqpNt+B9Sduvcht55PJnVdBvolYLgS56L7ruIxo0kI6MlUFaFaCNQYs/D2Q5nb7j+Pgtplx58ighjLar8rPldulj+B0Q4z9VZEDQC 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:(13230016)(39860400002)(396003)(136003)(376002)(346002)(366004)(2616005)(186003)(6916009)(36756003)(8676002)(31686004)(38100700002)(66946007)(83380400001)(66476007)(316002)(4326008)(66556008)(31696002)(6506007)(6512007)(6486002)(8936002)(478600001)(5660300002)(2906002)(26005)(41300700001)(86362001)(142923001)(43740500002)(45980500001); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?RnpRcXoxcU9meVNEUG9aeGlvQmp4VTdyQWFKVEhZSnMvRk42c3Fpb1NIRXdz?= =?utf-8?B?V1lDME5ScGlYYUJVVjV5cWk2MjQ0TUhsZnpCNjRzYytueGVTRHJLVHQ4QmJ5?= =?utf-8?B?MXRHNHdWVWpKMHhtb2F5akY3cE4yc245c2R1WTJVbjBuODNCWk9hZktMQ2h6?= =?utf-8?B?c3pCQlpSSTdTWmFac3JUNHZWT1VMbldjWks0OC9Eb3hqUEo2SkZSU3BkVFZK?= =?utf-8?B?dk8zK21pK0c1ZTl1d1BCTjVNUk9YNTMxY3hGQ2Y4M2hQUm5lUDMrVWZyQjNq?= =?utf-8?B?RkJNd3pzNFVYUXhHRmZkdFUxVjJKQXJqY0F5SzdZbUlmdVdoNHAycFkrY0Rj?= =?utf-8?B?UUthNlNZcS82U3RSL2o2NUdGUnJwa1RVUlpaazVaMnFvSG9YdHhVZ2ZqWWJa?= =?utf-8?B?UGFkODRFNUcrZ1EydmZyT1JvMS9wdms5eGozRDdtOTVLeGIxeEVRVm5RK0ho?= =?utf-8?B?NEl6eDJsWVNhTWt0L044ZjFkaUpQSzdZQlZ2dEFPTThsOERpRjZLajU0bUtK?= =?utf-8?B?Y1pKdDZaQ2RseGZqZmw1RGYwZVd0MDV6dFRvL2o3Wi81WmwvUVYvUjVGYm9h?= =?utf-8?B?YTBRU1oyQVRlMTBuKzJLd3N5UUJBUHpwd2V1OGhUeHppR3FTaXNnRHNkbmJi?= =?utf-8?B?T1RGbzV2Q1lyRGgwazY1a25zTTN4MSt3Q3h0bHdDNGlsTWR6UUhpMXY2ZWVz?= =?utf-8?B?eE1jUTg2K0s5Q0IxYjB3ZWllMDhpbHg2a0FjTUR1RFRkUXZHM2JOZnN0YjRR?= =?utf-8?B?L3lqR25WRngrdGU3UG15ZmRFM3NMYmJBM1JXOE5ZaktWRmo1a3JJY3BGMGJV?= =?utf-8?B?eFJ6ZzdBcUFsV1RBSzA3SVM1NWo2bUlJc3NkTE1DeGZ1ZDJjNWZ5RWZIMG5J?= =?utf-8?B?TGZTMTBvMmRxdnBXYlNjTFZOVCtFV0Z5REJJczFQK1FKZ1EwZ0Zod3N0MHI4?= =?utf-8?B?QkVMMEphN2Q1TnpzWk9nUEMxeEE5ckRrbUh4Z2tDZm5HQ0huRGxsbWYwMGZi?= =?utf-8?B?R0h5TjNOaHYwZFRNR08rVGRiOVI2YWhyNkd4NFErK1JJM3UzRDZwRCtHam43?= =?utf-8?B?UkxXTzlXRzc1ZnJacEpodDhhMFJ4TWVoY3ZlTVNDTUpOS0xBemduSWNDamJZ?= =?utf-8?B?NGxSallUOTRuMkNITFdmdCtPd2xtUVFlMlFtMnhuZjRFMUFITSt0ZkJ0L21Z?= =?utf-8?B?aHFEQTdibjFrdEIwRUJybWpyZjdyNkFEbGdUT1NCdWcrVmFYdVBGRFA1bTBI?= =?utf-8?B?bEtUR2RmK2RnWE9xdjlHMHNmazNYYk16eWlHUmwyd29ScFliWUlkRzlhMTJu?= =?utf-8?B?SXN6SkZCYWFZMkxTKzY0QmtidExIUDg3djRQajVSYXB1Rkxxc0pXWWFXVHdy?= =?utf-8?B?VU1qZ0FFcWRLYlNNeW9RTWNtK0lOVWd4WnBtSk4xcFllWktpcTh1OFZ2MGpD?= =?utf-8?B?c2VuaDdzaTB4RWk1S25kQzd2ODZ5Ym5iR21QOUkyUzd6dU9sdjVnbmUzQXhx?= =?utf-8?B?aG5XOFdycWd1VFUrZ1l0VnNvYU1OMUdkRVJRZnRPWmp3UnlOblNTd2dtcXFH?= =?utf-8?B?dzFrU1JlcWZJR3VZYzczdUc5ZktyODd0UHpIYzlOdDhSeFdyY0hkR2hEYmVP?= =?utf-8?B?YUhUakluZkszSksxNE14L1FiaVg1aU1JUTc3WlZNWUNHdnY5RHlEcW1hWFdS?= =?utf-8?B?NU1BQXo3SitNUVVxSXpoWEVmVk9rbnFKb0lwYVc5SGxjMHZtSDd1TGR5dFRx?= =?utf-8?B?eXV2NHFURVY1YnhJbmpMN2tyUENVVE56b2xDbmQyNlIzVUMxVDNGaGRsa2pZ?= =?utf-8?B?eGZ4N2ZUR3Q4WUJHbmRQSEN3ZDkyUFIwc0s3SyszVTlYSUpUeVNVemdjcVpr?= =?utf-8?B?QkpWbVRxZDBjeHRJbzgyT2cvZ2ZkMHJoeXVhU0loZURWdUN0VmdwdlEzTlZW?= =?utf-8?B?bEEyUmtLdE1DcEpUTk9jZ29YenRNM253UFRtMVhEd0xmS1g0MjVBRGxCMmF2?= =?utf-8?B?Y2dReGhBTGpUcUx4MnMwOEdIL0pORkI1OU5uRWhmVVQ4QXh2TXFFWStlNGFn?= =?utf-8?B?aENqWFIvNlBlOWVQWUE0UWQ4M0ovR3padzBvUUEwRHo2RGxPMUFiWWtjR3ds?= =?utf-8?Q?ieHgJ98w67EFASqZ20r5K/yGV?= X-OriginatorOrg: suse.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4ff82bec-bffe-45e4-be0a-08da5e51f440 X-MS-Exchange-CrossTenant-AuthSource: VE1PR04MB6560.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Jul 2022 06:45:31.0841 (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: 4kCiMgNjbpgiSU6eMLrYGjFG72pprHkyObXuXBv3czX+jivZbCkuTwFsISdUMqaXHUQuMYozIS8DNJQ7fVCxDw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR04MB8231 X-Spam-Status: No, score=-3030.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, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org 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-List-Received-Date: Tue, 05 Jul 2022 06:45:36 -0000 When using just slightly non-trivial combinations of .arch, it can be quite useful to be able to go back to prior state without needing to re-invoke perhaps many earlier directives and without needing to invoke perhaps many "negative" ones. Like some other architectures allow saving (pushing) and restoring (popping) present/prior state. For now require the same .code to be in effect for ".arch pop" that was in effect for the corresponding ".arch push". Also change the global "no_cond_jump_promotion" to be bool, to match the new struct field. --- v2: Use free() (hesitantly). --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -788,7 +788,7 @@ i386_cpu_flags cpu_arch_isa_flags; /* If set, conditional jumps are not automatically promoted to handle larger than a byte offset. */ -static unsigned int no_cond_jump_promotion = 0; +static bool no_cond_jump_promotion = false; /* Encode SSE instructions with VEX prefix. */ static unsigned int sse2avx; @@ -2660,6 +2660,20 @@ extend_cpu_sub_arch_name (const char *na static void set_cpu_arch (int dummy ATTRIBUTE_UNUSED) { + typedef struct arch_stack_entry + { + const struct arch_stack_entry *prev; + const char *name; + char *sub_name; + i386_cpu_flags flags; + i386_cpu_flags isa_flags; + enum processor_type isa; + enum flag_code flag_code; + char stackop_size; + bool no_cond_jump_promotion; + } arch_stack_entry; + static const arch_stack_entry *arch_stack_top; + SKIP_WHITESPACE (); if (!is_end_of_line[(unsigned char) *input_line_pointer]) @@ -2703,6 +2717,67 @@ set_cpu_arch (int dummy ATTRIBUTE_UNUSED j = ARRAY_SIZE (cpu_arch) + 1; } } + else if (strcmp (string, "push") == 0) + { + arch_stack_entry *top = XNEW (arch_stack_entry); + + top->name = cpu_arch_name; + if (cpu_sub_arch_name) + top->sub_name = xstrdup (cpu_sub_arch_name); + else + top->sub_name = NULL; + top->flags = cpu_arch_flags; + top->isa = cpu_arch_isa; + top->isa_flags = cpu_arch_isa_flags; + top->flag_code = flag_code; + top->stackop_size = stackop_size; + top->no_cond_jump_promotion = no_cond_jump_promotion; + + top->prev = arch_stack_top; + arch_stack_top = top; + + (void) restore_line_pointer (e); + demand_empty_rest_of_line (); + return; + } + else if (strcmp (string, "pop") == 0) + { + const arch_stack_entry *top = arch_stack_top; + + if (!top) + as_bad (_(".arch stack is empty")); + else if (top->flag_code != flag_code + || top->stackop_size != stackop_size) + { + static const unsigned int bits[] = { + [CODE_16BIT] = 16, + [CODE_32BIT] = 32, + [CODE_64BIT] = 64, + }; + + as_bad (_("this `.arch pop' requires `.code%u%s' to be in effect"), + bits[top->flag_code], + top->stackop_size == LONG_MNEM_SUFFIX ? "gcc" : ""); + } + else + { + arch_stack_top = top->prev; + + cpu_arch_name = top->name; + free (cpu_sub_arch_name); + cpu_sub_arch_name = top->sub_name; + cpu_arch_flags = top->flags; + cpu_arch_isa = top->isa; + cpu_arch_isa_flags = top->isa_flags; + no_cond_jump_promotion = top->no_cond_jump_promotion; + + XDELETE (top); + } + + (void) restore_line_pointer (e); + demand_empty_rest_of_line (); + return; + } for (; j < ARRAY_SIZE (cpu_arch); j++) { @@ -13662,6 +13737,10 @@ show_arch (FILE *stream, int ext, int ch { p = output_message (stream, p, message, start, &left, STRING_COMMA_LEN ("default")); + p = output_message (stream, p, message, start, &left, + STRING_COMMA_LEN ("push")); + p = output_message (stream, p, message, start, &left, + STRING_COMMA_LEN ("pop")); } for (j = 0; j < ARRAY_SIZE (cpu_arch); j++) --- a/gas/doc/c-i386.texi +++ b/gas/doc/c-i386.texi @@ -1504,7 +1504,7 @@ directive enables a warning when gas det supported on the CPU specified. The choices for @var{cpu_type} are: @multitable @columnfractions .20 .20 .20 .20 -@item @samp{default} +@item @samp{default} @tab @samp{push} @tab @samp{pop} @item @samp{i8086} @tab @samp{i186} @tab @samp{i286} @tab @samp{i386} @item @samp{i486} @tab @samp{i586} @tab @samp{i686} @tab @samp{pentium} @item @samp{pentiumpro} @tab @samp{pentiumii} @tab @samp{pentiumiii} @tab @samp{pentium4} --- /dev/null +++ b/gas/testsuite/gas/i386/arch-stk.l @@ -0,0 +1,43 @@ +.*: Assembler messages: +.*:3: Error:.*`cmovl'.* +.*:10: Error:.*`cmovg'.* +.*:17: Error:.*`cmovz'.* +.*:21: Error:.*`\.arch pop'.*`\.code32'.* +.*:28: Error:.*`\.arch pop'.*`\.code16gcc'.* +.*:32: Error:.*\.arch.*empty.* +GAS LISTING .* + + +[ ]*[0-9]*[ ]+\.text +[ ]*[0-9]*[ ]+start: +[ ]*[0-9]*[ ]+cmovl %eax, %ecx +[ ]*[0-9]*[ ]* +[ ]*[0-9]*[ ]+\.arch push +[ ]*[0-9]*[ ]+\.arch default +[ ]*[0-9]*[ ]+\?\?\?\? 0F4DC8[ ]+cmovnl %eax, %ecx +[ ]*[0-9]*[ ]* +[ ]*[0-9]*[ ]+\.arch pop +[ ]*[0-9]*[ ]+cmovg %eax, %ecx +[ ]*[0-9]*[ ]* +[ ]*[0-9]*[ ]+\.arch push +[ ]*[0-9]*[ ]+\.arch \.cmov +[ ]*[0-9]*[ ]+\?\?\?\? 0F4EC8[ ]+cmovng %eax, %ecx +[ ]*[0-9]*[ ]* +[ ]*[0-9]*[ ]+\.arch pop +[ ]*[0-9]*[ ]+cmovz %eax, %ecx +[ ]*[0-9]*[ ]* +[ ]*[0-9]*[ ]+\.arch push +[ ]*[0-9]*[ ]+\.code16 +[ ]*[0-9]*[ ]+\.arch pop +[ ]*[0-9]*[ ]+\.code32 +[ ]*[0-9]*[ ]+\.arch pop +[ ]*[0-9]*[ ]* +[ ]*[0-9]*[ ]+\.code16gcc +[ ]*[0-9]*[ ]+\.arch push +[ ]*[0-9]*[ ]+\.code32 +[ ]*[0-9]*[ ]+\.arch pop +[ ]*[0-9]*[ ]+\.code16gcc +[ ]*[0-9]*[ ]+\.arch pop +[ ]*[0-9]*[ ]* +[ ]*[0-9]*[ ]+\.arch pop +#pass --- /dev/null +++ b/gas/testsuite/gas/i386/arch-stk.s @@ -0,0 +1,34 @@ + .text +start: + cmovl %eax, %ecx + + .arch push + .arch default + cmovnl %eax, %ecx + + .arch pop + cmovg %eax, %ecx + + .arch push + .arch .cmov + cmovng %eax, %ecx + + .arch pop + cmovz %eax, %ecx + + .arch push + .code16 + .arch pop + .code32 + .arch pop + + .code16gcc + .arch push + .code32 + .arch pop + .code16gcc + .arch pop + + .arch pop + + .end --- a/gas/testsuite/gas/i386/i386.exp +++ b/gas/testsuite/gas/i386/i386.exp @@ -206,6 +206,7 @@ if [gas_32_check] then { run_dump_test "arch-13" run_dump_test "arch-14" run_list_test "arch-dflt" "-march=generic32 -al" + run_list_test "arch-stk" "-march=generic32 -al" run_dump_test "8087" run_dump_test "287" run_dump_test "387"