Message ID | 20231219121218.974012-1-lili.cui@intel.com |
---|---|
Headers |
Return-Path: <binutils-bounces+ouuuleilei=gmail.com@sourceware.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:24d3:b0:fb:cd0c:d3e with SMTP id r19csp1890454dyi; Tue, 19 Dec 2023 04:12:37 -0800 (PST) X-Google-Smtp-Source: AGHT+IF+TwEqDcLRgXmlfFMwM4YTXw+UgHbfMaZ+BM31aEAI7IJhoyXKXk8ZWQ31nBSTWP9pOmJt X-Received: by 2002:ac8:57c3:0:b0:425:4043:8d3c with SMTP id w3-20020ac857c3000000b0042540438d3cmr17120504qta.87.1702987956826; Tue, 19 Dec 2023 04:12:36 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1702987956; cv=pass; d=google.com; s=arc-20160816; b=VBhSWBoENxIGqQpMz8j8eVqHJJMvld0YB79cUhLHyFeuMMXOlIV7nP6Khp8a0lpbTL /HMfwKgMfHR2nxI7EyUrAI3Ow5CQukPRMGVi08Y1seKwSTbTAUFsliDStcj27pDBVF1D ouNP8Zfx+8u0a70a+JPtftV0Abz6Febw/QK1YzefyBCvAajpUm3jWrWJsZRlPepFhiwu n4OJ7s0YQz6ae16Gov4ntlyUyEjhPBiNIkgFl2KvQ8nXKwCwqitoNsqUdAQoJspAXrxi 1+DMmURW0sondfdOH9Vq+W9oH5PP0wmX8nKO7l3sc7U1C5TyogOnkQ+5hWsfK3mIrwoe TKhA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:message-id:date:subject:cc:to:from:dkim-signature :arc-filter:dmarc-filter:delivered-to; bh=HIyWvZbwtTCjX2vBVQEoiGbTFxwdOjkrCNY9YkP6xHY=; fh=FtUhYuQVHpmgNVnBO8Ns+o7k2Cbhq17uEhR8APdj3nE=; b=An9T4itDxpaDH5aSvsfM/jus5Mgtqe4uqcnky9gP/O5lKRDu27BMB/etXRsrDIPyPB 68rRN6nvvKa58pNoqcA7IyClKj35FpjGj8ckiMcKj0HM3ecuMc9yteoF8Hj4825O3/eP Ey3bD7WpZztD+5XIpHP8OGqAqJjgy+asL5PRPFGu88hXEa1vmr0m1aIiWoncTlso93OO NY1ToO91I04+dpkts7/m2rl3ySZQDaO7hksbRVhsdwH/V8D+qbcPeatQuhbGQtwiBlQN VlEXwLEpka7RTGpMRcvXiLv17NrPTWvezg+V+DR/LCp6LieINmFff4yGTIJGnVaIxDU7 jOVA== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=hTptsC+f; arc=pass (i=1); spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from server2.sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id jr9-20020a05622a800900b0042588d183b4si23820326qtb.753.2023.12.19.04.12.36 for <ouuuleilei@gmail.com> (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Dec 2023 04:12:36 -0800 (PST) Received-SPF: pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=hTptsC+f; arc=pass (i=1); spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 83C3A385DC1A for <ouuuleilei@gmail.com>; Tue, 19 Dec 2023 12:12:36 +0000 (GMT) X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.100]) by sourceware.org (Postfix) with ESMTPS id BACB73858417 for <binutils@sourceware.org>; Tue, 19 Dec 2023 12:12:26 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org BACB73858417 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=intel.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org BACB73858417 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=134.134.136.100 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1702987948; cv=none; b=bt7rK5/EnSExRWoat9/Easqi0os1VPX480TUBn1NX+W+F2dy+wnXlBcHgzB6N73Ggf+HMnMcsCfuCkeFt6FNkWbdFTn4wZzw6x4DhNfa1INKqTF6+JrcV9vLzmnym82wht9aGPC3lGFLJ5qMIuQfBnu+T6Z2Un34YXqFyiPufSs= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1702987948; c=relaxed/simple; bh=zgI5hqWBmHg8oRRibE2bN3CyOO3V9i8vfMQ5dwPpQuQ=; h=DKIM-Signature:From:To:Subject:Date:Message-Id:MIME-Version; b=fw3epHQuphKyqpMjS5rTkjVrzmD10vZ6EYL1yWuiPHIpcIlcCO3+iZzoUVatnso+8wVyF9Aa4mwZ3RP/Cj7raEQO1o8DP4SyKGVD5rZk3H/qPtWdQWYVnyIKkMp1eDnlUXTN0k3akAoFTQVkK+VpRinDM2MM0gJbz8FCOxCCqfo= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1702987946; x=1734523946; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=zgI5hqWBmHg8oRRibE2bN3CyOO3V9i8vfMQ5dwPpQuQ=; b=hTptsC+fXIw+1sOn9XXcG20hYC0sGFRlzWbrYvdk1h6SYUKaadM5Dks5 6g8tmleLJFsKAVBIyUyjjmDQkUQp3+Y/z6n4JgnTJhYt3aywZlFMJiIYZ P66JZPht+2VGiEQwWk66BOF1yJRmG8+gKSah9968pn/Ysa29Ghq6Aa5x0 8h1F7BAZDZJaHMX7BDoOVDPZM5FnPRepUBh/rpQ3g4c0i8lBMxorXGglg rjRQ4cyouZMsI7wnD2Lu1VrwYr9sINtOSUsi616Gwn/ipvkZ1JcGbkcRc NZ13/4WX/A3yw8nArlSfZnGJUCeUB4Ablsk90fAuhFdeBKV3o9f+bgPnc Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10928"; a="462100670" X-IronPort-AV: E=Sophos;i="6.04,288,1695711600"; d="scan'208";a="462100670" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Dec 2023 04:12:23 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10928"; a="846323759" X-IronPort-AV: E=Sophos;i="6.04,288,1695711600"; d="scan'208";a="846323759" Received: from scymds04.sc.intel.com ([10.82.73.238]) by fmsmga004.fm.intel.com with ESMTP; 19 Dec 2023 04:12:20 -0800 Received: from shgcc101.sh.intel.com (shgcc101.sh.intel.com [10.239.85.97]) by scymds04.sc.intel.com (Postfix) with ESMTP id 882982002D88; Tue, 19 Dec 2023 04:12:19 -0800 (PST) From: "Cui, Lili" <lili.cui@intel.com> To: binutils@sourceware.org Cc: hongjiu.lu@intel.com, jbeulich@suse.com Subject: [PATCH v4 0/9] Support Intel APX EGPR Date: Tue, 19 Dec 2023 12:12:09 +0000 Message-Id: <20231219121218.974012-1-lili.cui@intel.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, SPF_HELO_NONE, SPF_NONE, 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.30 Precedence: list List-Id: Binutils mailing list <binutils.sourceware.org> List-Unsubscribe: <https://sourceware.org/mailman/options/binutils>, <mailto:binutils-request@sourceware.org?subject=unsubscribe> List-Archive: <https://sourceware.org/pipermail/binutils/> List-Post: <mailto:binutils@sourceware.org> List-Help: <mailto:binutils-request@sourceware.org?subject=help> List-Subscribe: <https://sourceware.org/mailman/listinfo/binutils>, <mailto:binutils-request@sourceware.org?subject=subscribe> Errors-To: binutils-bounces+ouuuleilei=gmail.com@sourceware.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1785712299768356074 X-GMAIL-MSGID: 1785712299768356074 |
Series |
Support Intel APX EGPR
|
|
Message
Cui, Lili
Dec. 19, 2023, 12:12 p.m. UTC
*** BLURB HERE *** Future optimizations to be made. 1. The current implementation of vexvvvvv needs to be optimized. 2. The handling of double VEX/EVEX templates in check_register() needs to be optimized. 3. Convert vround* with egpr to VRNDSCALE* instead of reporting an error. 4. Find a suitable variable to replace OperandConstraint=REX2_REQUIRED. Cui, Lili (5): Support APX GPR32 with rex2 prefix Created an empty EVEX_MAP4_ sub-table for EVEX instructions. Support APX GPR32 with extend evex prefix Add tests for APX GPR32 with extend evex prefix Support APX PUSHP/POPP Hu, Lin1 (2): Support APX NDD optimized encoding. Support APX JMPABS for disassembler Mo, Zewei (1): Support APX Push2/Pop2 konglin1 (1): Support APX NDD gas/config/tc-i386.c | 466 +++++++++++- gas/doc/c-i386.texi | 7 +- gas/testsuite/gas/i386/apx-push2pop2-inval.l | 5 + gas/testsuite/gas/i386/apx-push2pop2-inval.s | 9 + gas/testsuite/gas/i386/i386.exp | 1 + .../i386/ilp32/x86-64-opcode-inval-intel.d | 47 +- .../gas/i386/ilp32/x86-64-opcode-inval.d | 47 +- .../gas/i386/x86-64-apx-egpr-inval.l | 202 +++++ .../gas/i386/x86-64-apx-egpr-inval.s | 209 +++++ .../gas/i386/x86-64-apx-egpr-promote-inval.l | 20 + .../gas/i386/x86-64-apx-egpr-promote-inval.s | 29 + gas/testsuite/gas/i386/x86-64-apx-evex-egpr.d | 20 + gas/testsuite/gas/i386/x86-64-apx-evex-egpr.s | 21 + .../gas/i386/x86-64-apx-evex-promoted-bad.d | 41 + .../gas/i386/x86-64-apx-evex-promoted-bad.s | 43 ++ .../gas/i386/x86-64-apx-evex-promoted-intel.d | 318 ++++++++ .../gas/i386/x86-64-apx-evex-promoted.d | 318 ++++++++ .../gas/i386/x86-64-apx-evex-promoted.s | 314 ++++++++ .../gas/i386/x86-64-apx-jmpabs-intel.d | 12 + .../gas/i386/x86-64-apx-jmpabs-inval.d | 40 + .../gas/i386/x86-64-apx-jmpabs-inval.s | 15 + gas/testsuite/gas/i386/x86-64-apx-jmpabs.d | 12 + gas/testsuite/gas/i386/x86-64-apx-jmpabs.s | 5 + .../gas/i386/x86-64-apx-ndd-optimize.d | 132 ++++ .../gas/i386/x86-64-apx-ndd-optimize.s | 125 +++ gas/testsuite/gas/i386/x86-64-apx-ndd.d | 160 ++++ gas/testsuite/gas/i386/x86-64-apx-ndd.s | 155 ++++ .../gas/i386/x86-64-apx-push2pop2-intel.d | 42 + .../gas/i386/x86-64-apx-push2pop2-inval.l | 13 + .../gas/i386/x86-64-apx-push2pop2-inval.s | 17 + gas/testsuite/gas/i386/x86-64-apx-push2pop2.d | 42 + gas/testsuite/gas/i386/x86-64-apx-push2pop2.s | 39 + .../gas/i386/x86-64-apx-pushp-popp-intel.d | 14 + .../gas/i386/x86-64-apx-pushp-popp-inval.l | 5 + .../gas/i386/x86-64-apx-pushp-popp-inval.s | 7 + .../gas/i386/x86-64-apx-pushp-popp.d | 14 + .../gas/i386/x86-64-apx-pushp-popp.s | 8 + gas/testsuite/gas/i386/x86-64-apx-rex2.d | 83 ++ gas/testsuite/gas/i386/x86-64-apx-rex2.s | 86 +++ gas/testsuite/gas/i386/x86-64-evex.d | 2 +- gas/testsuite/gas/i386/x86-64-inval-pseudo.l | 6 + gas/testsuite/gas/i386/x86-64-inval-pseudo.s | 4 + .../gas/i386/x86-64-opcode-inval-intel.d | 26 +- gas/testsuite/gas/i386/x86-64-opcode-inval.d | 26 +- gas/testsuite/gas/i386/x86-64-opcode-inval.s | 4 - gas/testsuite/gas/i386/x86-64-pseudos-bad.l | 75 +- gas/testsuite/gas/i386/x86-64-pseudos-bad.s | 74 ++ gas/testsuite/gas/i386/x86-64-pseudos.d | 63 ++ gas/testsuite/gas/i386/x86-64-pseudos.s | 64 ++ gas/testsuite/gas/i386/x86-64.exp | 20 +- include/opcode/i386.h | 2 + opcodes/i386-dis-evex-len.h | 10 + opcodes/i386-dis-evex-prefix.h | 66 ++ opcodes/i386-dis-evex-reg.h | 70 ++ opcodes/i386-dis-evex-w.h | 10 + opcodes/i386-dis-evex-x86-64.h | 50 ++ opcodes/i386-dis-evex.h | 347 ++++++++- opcodes/i386-dis.c | 715 +++++++++++++----- opcodes/i386-gen.c | 52 +- opcodes/i386-opc.h | 27 +- opcodes/i386-opc.tbl | 223 ++++-- opcodes/i386-reg.tbl | 64 ++ 62 files changed, 4688 insertions(+), 455 deletions(-) create mode 100644 gas/testsuite/gas/i386/apx-push2pop2-inval.l create mode 100644 gas/testsuite/gas/i386/apx-push2pop2-inval.s create mode 100644 gas/testsuite/gas/i386/x86-64-apx-egpr-inval.l create mode 100644 gas/testsuite/gas/i386/x86-64-apx-egpr-inval.s create mode 100644 gas/testsuite/gas/i386/x86-64-apx-egpr-promote-inval.l create mode 100644 gas/testsuite/gas/i386/x86-64-apx-egpr-promote-inval.s create mode 100644 gas/testsuite/gas/i386/x86-64-apx-evex-egpr.d create mode 100644 gas/testsuite/gas/i386/x86-64-apx-evex-egpr.s create mode 100644 gas/testsuite/gas/i386/x86-64-apx-evex-promoted-bad.d create mode 100644 gas/testsuite/gas/i386/x86-64-apx-evex-promoted-bad.s create mode 100644 gas/testsuite/gas/i386/x86-64-apx-evex-promoted-intel.d create mode 100644 gas/testsuite/gas/i386/x86-64-apx-evex-promoted.d create mode 100644 gas/testsuite/gas/i386/x86-64-apx-evex-promoted.s create mode 100644 gas/testsuite/gas/i386/x86-64-apx-jmpabs-intel.d create mode 100644 gas/testsuite/gas/i386/x86-64-apx-jmpabs-inval.d create mode 100644 gas/testsuite/gas/i386/x86-64-apx-jmpabs-inval.s create mode 100644 gas/testsuite/gas/i386/x86-64-apx-jmpabs.d create mode 100644 gas/testsuite/gas/i386/x86-64-apx-jmpabs.s create mode 100644 gas/testsuite/gas/i386/x86-64-apx-ndd-optimize.d create mode 100644 gas/testsuite/gas/i386/x86-64-apx-ndd-optimize.s create mode 100644 gas/testsuite/gas/i386/x86-64-apx-ndd.d create mode 100644 gas/testsuite/gas/i386/x86-64-apx-ndd.s create mode 100644 gas/testsuite/gas/i386/x86-64-apx-push2pop2-intel.d create mode 100644 gas/testsuite/gas/i386/x86-64-apx-push2pop2-inval.l create mode 100644 gas/testsuite/gas/i386/x86-64-apx-push2pop2-inval.s create mode 100644 gas/testsuite/gas/i386/x86-64-apx-push2pop2.d create mode 100644 gas/testsuite/gas/i386/x86-64-apx-push2pop2.s create mode 100644 gas/testsuite/gas/i386/x86-64-apx-pushp-popp-intel.d create mode 100644 gas/testsuite/gas/i386/x86-64-apx-pushp-popp-inval.l create mode 100644 gas/testsuite/gas/i386/x86-64-apx-pushp-popp-inval.s create mode 100644 gas/testsuite/gas/i386/x86-64-apx-pushp-popp.d create mode 100644 gas/testsuite/gas/i386/x86-64-apx-pushp-popp.s create mode 100644 gas/testsuite/gas/i386/x86-64-apx-rex2.d create mode 100644 gas/testsuite/gas/i386/x86-64-apx-rex2.s create mode 100644 opcodes/i386-dis-evex-x86-64.h
Comments
On 19.12.2023 13:12, Cui, Lili wrote: > *** BLURB HERE *** > Future optimizations to be made. > 1. The current implementation of vexvvvvv needs to be optimized. > 2. The handling of double VEX/EVEX templates in check_register() needs to be optimized. I hope this is just stale here, and the dependency on templates was now removed again from check_register(). Jan > 3. Convert vround* with egpr to VRNDSCALE* instead of reporting an error. > 4. Find a suitable variable to replace OperandConstraint=REX2_REQUIRED. > > Cui, Lili (5): > Support APX GPR32 with rex2 prefix > Created an empty EVEX_MAP4_ sub-table for EVEX instructions. > Support APX GPR32 with extend evex prefix > Add tests for APX GPR32 with extend evex prefix > Support APX PUSHP/POPP > > Hu, Lin1 (2): > Support APX NDD optimized encoding. > Support APX JMPABS for disassembler > > Mo, Zewei (1): > Support APX Push2/Pop2 > > konglin1 (1): > Support APX NDD
> On 19.12.2023 13:12, Cui, Lili wrote: > > *** BLURB HERE *** > > Future optimizations to be made. > > 1. The current implementation of vexvvvvv needs to be optimized. > > 2. The handling of double VEX/EVEX templates in check_register() needs to > be optimized. > > I hope this is just stale here, and the dependency on templates was now > removed again from check_register(). > > Jan > In fact, I didn't remove it in V4, I didn't find a better place to deal with it. I don't know if you agree with this implementation below. /* For dual VEX/EVEX templates, evex encoding is required when the input has egpr.*/ static INLINE void vex_with_Egpr_requires_evex_encoding (const insn_template *t) { for (unsigned int op = 0; op < i.operands; op++) { if (i.types[op].bitfield.class != Reg) continue; if (i.op[op].regs->reg_flags & RegRex2) i.vec_encoding = vex_encoding_evex; } if ((i.index_reg && (i.index_reg->reg_flags & RegRex2)) || (i.base_reg && (i.base_reg->reg_flags & RegRex2))) i.vec_encoding = vex_encoding_evex; } static INLINE void install_template (const insn_template *t) { unsigned int l; i.tm = *t; /* Dual VEX/EVEX templates need stripping one of the possible variants. */ if (t->opcode_modifier.vex && t->opcode_modifier.evex) { vex_with_Egpr_requires_evex_encoding (t); Regards, Lili.
On 20.12.2023 09:50, Cui, Lili wrote: >> On 19.12.2023 13:12, Cui, Lili wrote: >>> *** BLURB HERE *** >>> Future optimizations to be made. >>> 1. The current implementation of vexvvvvv needs to be optimized. >>> 2. The handling of double VEX/EVEX templates in check_register() needs to >> be optimized. >> >> I hope this is just stale here, and the dependency on templates was now >> removed again from check_register(). > > In fact, I didn't remove it in V4, I didn't find a better place to deal with it. I don't know if you agree with this implementation below. I'm afraid I don't, both because it still isn't clear to me what's wrong with my alternative proposal, and also for the formal reason of ... > /* For dual VEX/EVEX templates, evex encoding is required when the input has > egpr.*/ > static INLINE void > vex_with_Egpr_requires_evex_encoding (const insn_template *t) > { > for (unsigned int op = 0; op < i.operands; op++) > { > if (i.types[op].bitfield.class != Reg) > continue; > > if (i.op[op].regs->reg_flags & RegRex2) > i.vec_encoding = vex_encoding_evex; ... it not being okay to override i.vec_encoding like this, when it may already have been set to another value. Jan > } > > if ((i.index_reg && (i.index_reg->reg_flags & RegRex2)) > || (i.base_reg && (i.base_reg->reg_flags & RegRex2))) > i.vec_encoding = vex_encoding_evex; > } > > static INLINE void > install_template (const insn_template *t) > { > unsigned int l; > > i.tm = *t; > > /* Dual VEX/EVEX templates need stripping one of the possible variants. */ > if (t->opcode_modifier.vex && t->opcode_modifier.evex) > { > vex_with_Egpr_requires_evex_encoding (t); > > > Regards, > Lili.
> -----Original Message----- > From: Jan Beulich <jbeulich@suse.com> > Sent: Wednesday, December 20, 2023 4:57 PM > To: Cui, Lili <lili.cui@intel.com> > Cc: Lu, Hongjiu <hongjiu.lu@intel.com>; binutils@sourceware.org > Subject: Re: [PATCH v4 0/9] Support Intel APX EGPR > > On 20.12.2023 09:50, Cui, Lili wrote: > >> On 19.12.2023 13:12, Cui, Lili wrote: > >>> *** BLURB HERE *** > >>> Future optimizations to be made. > >>> 1. The current implementation of vexvvvvv needs to be optimized. > >>> 2. The handling of double VEX/EVEX templates in check_register() > >>> needs to > >> be optimized. > >> > >> I hope this is just stale here, and the dependency on templates was > >> now removed again from check_register(). > > > > In fact, I didn't remove it in V4, I didn't find a better place to deal with it. I > don't know if you agree with this implementation below. > > I'm afraid I don't, both because it still isn't clear to me what's wrong with my > alternative proposal, and also for the formal reason of ... > For the alternative proposal, do you mean adding a new variable to avoid introducing new loops over all operands? How about this ? or do you want to add other variable and handle it in check_register? --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -464,6 +464,9 @@ struct _i386_insn /* Have NOTRACK prefix. */ const char *notrack_prefix; + /* Has Egpr. */ + bool has_egpr; + /* Error message. */ enum i386_error error; }; @@ -3683,7 +3686,7 @@ install_template (const insn_template *t) || maybe_cpu (t, CpuFMA)) && (maybe_cpu (t, CpuAVX512F) || maybe_cpu (t, CpuAVX512VL))) { - if (need_evex_encoding ()) + if (need_evex_encoding () || i.has_egpr) { i.tm.opcode_modifier.vex = 0; i.tm.cpu.bitfield.cpuavx512f = i.tm.cpu_any.bitfield.cpuavx512f; @@ -3704,7 +3707,7 @@ install_template (const insn_template *t) if (APX_F(CpuCMPCCXADD) || APX_F(CpuAMX_TILE) || APX_F(CpuAVX512F) || APX_F(CpuAVX512DQ) || APX_F(CpuAVX512BW) || APX_F(CpuBMI) || APX_F(CpuBMI2)) - if (need_evex_encoding ()) + if (need_evex_encoding () || i.has_egpr) i.tm.opcode_modifier.vex = 0; else i.tm.opcode_modifier.evex = 0; @@ -14523,11 +14526,12 @@ static bool check_register (const reg_entry *r) || flag_code != CODE_64BIT) return false; + i.has_egpr = true; Lili. > > /* For dual VEX/EVEX templates, evex encoding is required when the input > has > > egpr.*/ > > static INLINE void > > vex_with_Egpr_requires_evex_encoding (const insn_template *t) { > > for (unsigned int op = 0; op < i.operands; op++) > > { > > if (i.types[op].bitfield.class != Reg) > > continue; > > > > if (i.op[op].regs->reg_flags & RegRex2) > > i.vec_encoding = vex_encoding_evex; > > ... it not being okay to override i.vec_encoding like this, when it may already > have been set to another value. > > Jan > > > } > > > > if ((i.index_reg && (i.index_reg->reg_flags & RegRex2)) > > || (i.base_reg && (i.base_reg->reg_flags & RegRex2))) > > i.vec_encoding = vex_encoding_evex; } > > > > static INLINE void > > install_template (const insn_template *t) { > > unsigned int l; > > > > i.tm = *t; > > > > /* Dual VEX/EVEX templates need stripping one of the possible variants. */ > > if (t->opcode_modifier.vex && t->opcode_modifier.evex) > > { > > vex_with_Egpr_requires_evex_encoding (t); > > > > > > Regards, > > Lili.
On 20.12.2023 11:42, Cui, Lili wrote: >> -----Original Message----- >> From: Jan Beulich <jbeulich@suse.com> >> Sent: Wednesday, December 20, 2023 4:57 PM >> >> On 20.12.2023 09:50, Cui, Lili wrote: >>>> On 19.12.2023 13:12, Cui, Lili wrote: >>>>> *** BLURB HERE *** >>>>> Future optimizations to be made. >>>>> 1. The current implementation of vexvvvvv needs to be optimized. >>>>> 2. The handling of double VEX/EVEX templates in check_register() >>>>> needs to >>>> be optimized. >>>> >>>> I hope this is just stale here, and the dependency on templates was >>>> now removed again from check_register(). >>> >>> In fact, I didn't remove it in V4, I didn't find a better place to deal with it. I >> don't know if you agree with this implementation below. >> >> I'm afraid I don't, both because it still isn't clear to me what's wrong with my >> alternative proposal, and also for the formal reason of ... >> > > For the alternative proposal, do you mean adding a new variable to avoid introducing new loops over all operands? How about this ? or do you want to add other variable and handle it in check_register? No, the alternative proposal continues to be to introduce a new enumerator to record in i.vec_encoding (vex_encoding_egpr is what iirc I had suggested before, despite the naming anomaly). What you outline below would, however, still be better than adding another loop (as you had it earlier), imo. > --- a/gas/config/tc-i386.c > +++ b/gas/config/tc-i386.c > @@ -464,6 +464,9 @@ struct _i386_insn > /* Have NOTRACK prefix. */ > const char *notrack_prefix; > > + /* Has Egpr. */ > + bool has_egpr; > + > /* Error message. */ > enum i386_error error; > }; As a general remark, when you add new fields to a struct, please try to find a slot that ideally is using existing padding _and_ is next to related fields, or at least one of the two. Jan
> >>>> On 19.12.2023 13:12, Cui, Lili wrote: > >>>>> *** BLURB HERE *** > >>>>> Future optimizations to be made. > >>>>> 1. The current implementation of vexvvvvv needs to be optimized. > >>>>> 2. The handling of double VEX/EVEX templates in check_register() > >>>>> needs to > >>>> be optimized. > >>>> > >>>> I hope this is just stale here, and the dependency on templates was > >>>> now removed again from check_register(). > >>> > >>> In fact, I didn't remove it in V4, I didn't find a better place to > >>> deal with it. I > >> don't know if you agree with this implementation below. > >> > >> I'm afraid I don't, both because it still isn't clear to me what's > >> wrong with my alternative proposal, and also for the formal reason of ... > >> > > > > For the alternative proposal, do you mean adding a new variable to avoid > introducing new loops over all operands? How about this ? or do you want to > add other variable and handle it in check_register? > > No, the alternative proposal continues to be to introduce a new enumerator > to record in i.vec_encoding (vex_encoding_egpr is what iirc I had suggested > before, despite the naming anomaly). What you outline below would, > however, still be better than adding another loop (as you had it earlier), imo. > I guessed you want to add a new type like vex_encoding_egpr, but I don't know how to do it differently with before, when the instruction support legacy, vex and evex encodings, if we put the vex and eves templates in front of the legacy templates (in i386-opc.tbl), we'll assign the vex_encoding_egpr for the legacy input, and it will have the same problem as before. And we also need to handle it in check_register(). Maybe you hinted at some other way of handling it, but I didn't get it. if (current_templates.start->opcode_modifier.vex && current_templates.start->opcode_modifier.evex) i.vec_encoding = vex_encoding_egpr; > > --- a/gas/config/tc-i386.c > > +++ b/gas/config/tc-i386.c > > @@ -464,6 +464,9 @@ struct _i386_insn > > /* Have NOTRACK prefix. */ > > const char *notrack_prefix; > > > > + /* Has Egpr. */ > > + bool has_egpr; > > + > > /* Error message. */ > > enum i386_error error; > > }; > > As a general remark, when you add new fields to a struct, please try to find a > slot that ideally is using existing padding _and_ is next to related fields, or at > least one of the two. > Moved to --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -438,6 +438,9 @@ struct _i386_insn /* Prefer the REX2 prefix in encoding. */ bool rex2_encoding; + /* Has Egpr. */ + bool has_egpr; + /* Disable instruction size optimization. */ bool no_optimize; Lili.
On 20.12.2023 12:50, Cui, Lili wrote: >>>>>> On 19.12.2023 13:12, Cui, Lili wrote: >>>>>>> *** BLURB HERE *** >>>>>>> Future optimizations to be made. >>>>>>> 1. The current implementation of vexvvvvv needs to be optimized. >>>>>>> 2. The handling of double VEX/EVEX templates in check_register() >>>>>>> needs to >>>>>> be optimized. >>>>>> >>>>>> I hope this is just stale here, and the dependency on templates was >>>>>> now removed again from check_register(). >>>>> >>>>> In fact, I didn't remove it in V4, I didn't find a better place to >>>>> deal with it. I >>>> don't know if you agree with this implementation below. >>>> >>>> I'm afraid I don't, both because it still isn't clear to me what's >>>> wrong with my alternative proposal, and also for the formal reason of ... >>>> >>> >>> For the alternative proposal, do you mean adding a new variable to avoid >> introducing new loops over all operands? How about this ? or do you want to >> add other variable and handle it in check_register? >> >> No, the alternative proposal continues to be to introduce a new enumerator >> to record in i.vec_encoding (vex_encoding_egpr is what iirc I had suggested >> before, despite the naming anomaly). What you outline below would, >> however, still be better than adding another loop (as you had it earlier), imo. >> > > I guessed you want to add a new type like vex_encoding_egpr, but I don't know how to do it differently with before, when the instruction support legacy, vex and evex encodings, if we put the vex and eves templates in front of the legacy templates (in i386-opc.tbl), we'll assign the vex_encoding_egpr for the legacy input, and it will have the same problem as before. And we also need to handle it in check_register(). Maybe you hinted at some other way of handling it, but I didn't get it. > > > if (current_templates.start->opcode_modifier.vex > && current_templates.start->opcode_modifier.evex) > i.vec_encoding = vex_encoding_egpr; Since setting of the new encoding type has to happen in check_register(), using current_templates (as said several times before) is not an option. Anyway, in the interest of forward progress, feel free to go with ... >>> --- a/gas/config/tc-i386.c >>> +++ b/gas/config/tc-i386.c >>> @@ -464,6 +464,9 @@ struct _i386_insn >>> /* Have NOTRACK prefix. */ >>> const char *notrack_prefix; >>> >>> + /* Has Egpr. */ >>> + bool has_egpr; >>> + >>> /* Error message. */ >>> enum i386_error error; >>> }; >> >> As a general remark, when you add new fields to a struct, please try to find a >> slot that ideally is using existing padding _and_ is next to related fields, or at >> least one of the two. >> > > Moved to > > --- a/gas/config/tc-i386.c > +++ b/gas/config/tc-i386.c > @@ -438,6 +438,9 @@ struct _i386_insn > /* Prefer the REX2 prefix in encoding. */ > bool rex2_encoding; > > + /* Has Egpr. */ > + bool has_egpr; ... this approach then, and subsequently I'll see if I can re-arrange things (and if I'm bothered enough to do so). The comment is pretty unhelpful as is, how about "Need to use an eGPR capable encoding (REX2 or EVEX)" or some such? Jan
> On 20.12.2023 12:50, Cui, Lili wrote: > >>>>>> On 19.12.2023 13:12, Cui, Lili wrote: > >>>>>>> *** BLURB HERE *** > >>>>>>> Future optimizations to be made. > >>>>>>> 1. The current implementation of vexvvvvv needs to be optimized. > >>>>>>> 2. The handling of double VEX/EVEX templates in check_register() > >>>>>>> needs to > >>>>>> be optimized. > >>>>>> > >>>>>> I hope this is just stale here, and the dependency on templates > >>>>>> was now removed again from check_register(). > >>>>> > >>>>> In fact, I didn't remove it in V4, I didn't find a better place to > >>>>> deal with it. I > >>>> don't know if you agree with this implementation below. > >>>> > >>>> I'm afraid I don't, both because it still isn't clear to me what's > >>>> wrong with my alternative proposal, and also for the formal reason of ... > >>>> > >>> > >>> For the alternative proposal, do you mean adding a new variable to > >>> avoid > >> introducing new loops over all operands? How about this ? or do you > >> want to add other variable and handle it in check_register? > >> > >> No, the alternative proposal continues to be to introduce a new > >> enumerator to record in i.vec_encoding (vex_encoding_egpr is what > >> iirc I had suggested before, despite the naming anomaly). What you > >> outline below would, however, still be better than adding another loop (as > you had it earlier), imo. > >> > > > > I guessed you want to add a new type like vex_encoding_egpr, but I don't > know how to do it differently with before, when the instruction support > legacy, vex and evex encodings, if we put the vex and eves templates in front > of the legacy templates (in i386-opc.tbl), we'll assign the vex_encoding_egpr > for the legacy input, and it will have the same problem as before. And we also > need to handle it in check_register(). Maybe you hinted at some other way of > handling it, but I didn't get it. > > > > > > if (current_templates.start->opcode_modifier.vex > > && current_templates.start->opcode_modifier.evex) > > i.vec_encoding = vex_encoding_egpr; > > Since setting of the new encoding type has to happen in check_register(), > using current_templates (as said several times before) is not an option. > > Anyway, in the interest of forward progress, feel free to go with ... > > >>> --- a/gas/config/tc-i386.c > >>> +++ b/gas/config/tc-i386.c > >>> @@ -464,6 +464,9 @@ struct _i386_insn > >>> /* Have NOTRACK prefix. */ > >>> const char *notrack_prefix; > >>> > >>> + /* Has Egpr. */ > >>> + bool has_egpr; > >>> + > >>> /* Error message. */ > >>> enum i386_error error; > >>> }; > >> > >> As a general remark, when you add new fields to a struct, please try > >> to find a slot that ideally is using existing padding _and_ is next > >> to related fields, or at least one of the two. > >> > > > > Moved to > > > > --- a/gas/config/tc-i386.c > > +++ b/gas/config/tc-i386.c > > @@ -438,6 +438,9 @@ struct _i386_insn > > /* Prefer the REX2 prefix in encoding. */ > > bool rex2_encoding; > > > > + /* Has Egpr. */ > > + bool has_egpr; > > ... this approach then, and subsequently I'll see if I can re-arrange things (and > if I'm bothered enough to do so). The comment is pretty unhelpful as is, how > about "Need to use an eGPR capable encoding (REX2 or EVEX)" or some such? > Great, thanks! --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -438,6 +438,9 @@ struct _i386_insn /* Prefer the REX2 prefix in encoding. */ bool rex2_encoding; + /* Need to use an Egpr capable encoding (REX2 or EVEX). */ + bool has_egpr; + Lili.