From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.126]) by sourceware.org (Postfix) with ESMTPS id F3D28386C59E for ; Tue, 19 Dec 2023 12:13:19 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org F3D28386C59E 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 F3D28386C59E Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=134.134.136.126 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1702988002; cv=none; b=XFrC0jflGKA3e2j/4uMgS9dZGBATF5KVIayVUqF1qGgNFe6I9eW+iOMS+91nBrj6agV1gZunXnK2MXN95S+ja2dVntp5D+ush5lRY1ufJr5dQCFk1EzYgT+3qzo0DfJtluyHLAyYhvSqnpka2La/UD9w1QYYX8PzPEHm27qfFjw= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1702988002; c=relaxed/simple; bh=7mQfVZgkJWA60aLzX11onhdaL49EMoiEbfFLH8OwX2k=; h=DKIM-Signature:From:To:Subject:Date:Message-Id:MIME-Version; b=flzXoatihz+E5Lj1VgAT08i9GiviIpOhxQ1fUtjG4EEEnVKuYuHpof0YE5ySzGDBcPqupvQvdrY/Mrpzzgf5LsQ/VO618sbs14TvIWzU9SwvhT+8GqkmQ40U/A9viWwXaLnZpV1huIHnrSX1PHg0urWKUvk7pTMEhHFm2YvsVI8= 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=1702988000; x=1734524000; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=7mQfVZgkJWA60aLzX11onhdaL49EMoiEbfFLH8OwX2k=; b=e1gvi6DCAsumw35cjPnzIJAKAFJG4TJDTP9bZOLWtSAJ9TvTn4WYpZv5 8g9pXX843sZcuIU2rWwq3LBiKMuIV8v8fqN2X1SVgPryFKEujlXFcJyL8 DDpYQWU/AoZv+zMMiwpjRRAMFgrwBh1rUgSSWTv5KU/VBLK9YFCRbbE4/ WcoENc/11TKwDRUUPVNb8ZMiHha7yupsW8EbZuUp7mULaCatWJgneP+n0 W2iqmMa2V1IpUG9MFPwdA0j7TVxArilMsZV/bGRR5f1fAVnZts1un7VmP y+mGZKcmDtoDw3YzmGCkAaYGhkfbIO4bambEY27LNhSmezNsbbn/ZgdBs Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10928"; a="380633973" X-IronPort-AV: E=Sophos;i="6.04,288,1695711600"; d="scan'208";a="380633973" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Dec 2023 04:12:35 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10928"; a="725712609" X-IronPort-AV: E=Sophos;i="6.04,288,1695711600"; d="scan'208";a="725712609" Received: from scymds04.sc.intel.com ([10.82.73.238]) by orsmga003.jf.intel.com with ESMTP; 19 Dec 2023 04:12:35 -0800 Received: from shgcc101.sh.intel.com (shgcc101.sh.intel.com [10.239.85.97]) by scymds04.sc.intel.com (Postfix) with ESMTP id 30BF82002D88; Tue, 19 Dec 2023 04:12:34 -0800 (PST) From: "Cui, Lili" To: binutils@sourceware.org Cc: hongjiu.lu@intel.com, jbeulich@suse.com Subject: [PATCH v4 7/9] Support APX PUSHP/POPP Date: Tue, 19 Dec 2023 12:12:16 +0000 Message-Id: <20231219121218.974012-8-lili.cui@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231219121218.974012-1-lili.cui@intel.com> References: <20231219121218.974012-1-lili.cui@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-10.3 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,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 List-Id: gas/ChangeLog: * config/tc-i386.c (process_operands): Handle "PUSHP/POPP requires rex2.w == 1." * testsuite/gas/i386/x86-64.exp: Add new test for PUSHP/POPP. * testsuite/gas/i386/x86-64-apx-pushp-popp-intel.d: New test. * testsuite/gas/i386/x86-64-apx-pushp-popp-inval.l: Ditto. * testsuite/gas/i386/x86-64-apx-pushp-popp-inval.s: Ditto. * testsuite/gas/i386/x86-64-apx-pushp-popp.d: Ditto. * testsuite/gas/i386/x86-64-apx-pushp-popp.s: Ditto. opcodes/ChangeLog: * i386-dis.c (putop): print pushp and popp. * i386-opc.tbl: Added new insns. * i386-init.h : Regenerated. * i386-mnem.h : Regenerated. * i386-tbl.h: Regenerated. --- gas/config/tc-i386.c | 3 +- .../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.exp | 3 + opcodes/i386-dis.c | 55 ++++++++++++------- opcodes/i386-opc.h | 2 + opcodes/i386-opc.tbl | 3 + 10 files changed, 94 insertions(+), 20 deletions(-) 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 diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 4771373f4f8..d62f7d83b05 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -3901,7 +3901,8 @@ is_apx_evex_encoding (void) static INLINE bool is_apx_rex2_encoding (void) { - return i.rex2 || i.rex2_encoding; + return i.rex2 || i.rex2_encoding + || i.tm.opcode_modifier.operandconstraint == REX2_REQUIRED; } static unsigned int diff --git a/gas/testsuite/gas/i386/x86-64-apx-pushp-popp-intel.d b/gas/testsuite/gas/i386/x86-64-apx-pushp-popp-intel.d new file mode 100644 index 00000000000..44e3e96a5df --- /dev/null +++ b/gas/testsuite/gas/i386/x86-64-apx-pushp-popp-intel.d @@ -0,0 +1,14 @@ +#as: +#objdump: -dw -Mintel +#name: x86_64 APX_F pushp popp insns (Intel disassembly) +#source: x86-64-apx-pushp-popp.s + +.*: +file format .* + +Disassembly of section \.text: + +0+ <_start>: +\s*[a-f0-9]+:\s*d5 08 50[ ]+pushp rax +\s*[a-f0-9]+:\s*d5 19 57[ ]+pushp r31 +\s*[a-f0-9]+:\s*d5 08 58[ ]+popp rax +\s*[a-f0-9]+:\s*d5 19 5f[ ]+popp r31 diff --git a/gas/testsuite/gas/i386/x86-64-apx-pushp-popp-inval.l b/gas/testsuite/gas/i386/x86-64-apx-pushp-popp-inval.l new file mode 100644 index 00000000000..c4d774b9673 --- /dev/null +++ b/gas/testsuite/gas/i386/x86-64-apx-pushp-popp-inval.l @@ -0,0 +1,5 @@ +.* Assembler messages: +.*:4: Error: operand size mismatch for `pushp' +.*:5: Error: operand size mismatch for `popp' +.*:6: Error: operand size mismatch for `pushp' +.*:7: Error: operand size mismatch for `popp' diff --git a/gas/testsuite/gas/i386/x86-64-apx-pushp-popp-inval.s b/gas/testsuite/gas/i386/x86-64-apx-pushp-popp-inval.s new file mode 100644 index 00000000000..28ed5d8145a --- /dev/null +++ b/gas/testsuite/gas/i386/x86-64-apx-pushp-popp-inval.s @@ -0,0 +1,7 @@ +# Check bytecode of APX_F pushp popp instructions with illegal instructions. + + .text + pushp %eax + popp %eax + pushp (%rax) + popp (%rax) diff --git a/gas/testsuite/gas/i386/x86-64-apx-pushp-popp.d b/gas/testsuite/gas/i386/x86-64-apx-pushp-popp.d new file mode 100644 index 00000000000..b20e5ba9a35 --- /dev/null +++ b/gas/testsuite/gas/i386/x86-64-apx-pushp-popp.d @@ -0,0 +1,14 @@ +#as: +#objdump: -dw +#name: x86_64 APX_F pushp popp insns +#source: x86-64-apx-pushp-popp.s + +.*: +file format .* + +Disassembly of section \.text: + +0+ <_start>: +\s*[a-f0-9]+:\s*d5 08 50[ ]+pushp %rax +\s*[a-f0-9]+:\s*d5 19 57[ ]+pushp %r31 +\s*[a-f0-9]+:\s*d5 08 58[ ]+popp %rax +\s*[a-f0-9]+:\s*d5 19 5f[ ]+popp %r31 diff --git a/gas/testsuite/gas/i386/x86-64-apx-pushp-popp.s b/gas/testsuite/gas/i386/x86-64-apx-pushp-popp.s new file mode 100644 index 00000000000..0ea66d0e70c --- /dev/null +++ b/gas/testsuite/gas/i386/x86-64-apx-pushp-popp.s @@ -0,0 +1,8 @@ +# Check 64bit APX_F pushp popp instructions + + .text + _start: + pushp %rax + pushp %r31 + popp %rax + popp %r31 diff --git a/gas/testsuite/gas/i386/x86-64.exp b/gas/testsuite/gas/i386/x86-64.exp index 2296ad4af7d..112ab35fdb8 100644 --- a/gas/testsuite/gas/i386/x86-64.exp +++ b/gas/testsuite/gas/i386/x86-64.exp @@ -348,6 +348,9 @@ run_dump_test "x86-64-avx512dq-rcigrne" run_dump_test "x86-64-apx-push2pop2" run_dump_test "x86-64-apx-push2pop2-intel" run_list_test "x86-64-apx-push2pop2-inval" +run_dump_test "x86-64-apx-pushp-popp" +run_dump_test "x86-64-apx-pushp-popp-intel" +run_list_test "x86-64-apx-pushp-popp-inval" run_dump_test "x86-64-avx512dq-rcigru-intel" run_dump_test "x86-64-avx512dq-rcigru" run_dump_test "x86-64-avx512dq-rcigrz-intel" diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c index cf02e34bcc8..b9fd010062a 100644 --- a/opcodes/i386-dis.c +++ b/opcodes/i386-dis.c @@ -303,6 +303,9 @@ struct dis_private { /* M0 in rex2 prefix represents map0 or map1. */ #define REX2_M 0x8 +/* {rex2} is not printed when the REX2_SPECIAL is set. */ +#define REX2_SPECIAL 16 + /* Flags stored in PREFIXES. */ #define PREFIX_REPZ 1 #define PREFIX_REPNZ 2 @@ -1931,23 +1934,23 @@ static const struct dis386 dis386[] = { { "dec{S|}", { RMeSI }, 0 }, { "dec{S|}", { RMeDI }, 0 }, /* 50 */ - { "push{!P|}", { RMrAX }, 0 }, - { "push{!P|}", { RMrCX }, 0 }, - { "push{!P|}", { RMrDX }, 0 }, - { "push{!P|}", { RMrBX }, 0 }, - { "push{!P|}", { RMrSP }, 0 }, - { "push{!P|}", { RMrBP }, 0 }, - { "push{!P|}", { RMrSI }, 0 }, - { "push{!P|}", { RMrDI }, 0 }, + { "push!P", { RMrAX }, 0 }, + { "push!P", { RMrCX }, 0 }, + { "push!P", { RMrDX }, 0 }, + { "push!P", { RMrBX }, 0 }, + { "push!P", { RMrSP }, 0 }, + { "push!P", { RMrBP }, 0 }, + { "push!P", { RMrSI }, 0 }, + { "push!P", { RMrDI }, 0 }, /* 58 */ - { "pop{!P|}", { RMrAX }, 0 }, - { "pop{!P|}", { RMrCX }, 0 }, - { "pop{!P|}", { RMrDX }, 0 }, - { "pop{!P|}", { RMrBX }, 0 }, - { "pop{!P|}", { RMrSP }, 0 }, - { "pop{!P|}", { RMrBP }, 0 }, - { "pop{!P|}", { RMrSI }, 0 }, - { "pop{!P|}", { RMrDI }, 0 }, + { "pop!P", { RMrAX }, 0 }, + { "pop!P", { RMrCX }, 0 }, + { "pop!P", { RMrDX }, 0 }, + { "pop!P", { RMrBX }, 0 }, + { "pop!P", { RMrSP }, 0 }, + { "pop!P", { RMrBP }, 0 }, + { "pop!P", { RMrSI }, 0 }, + { "pop!P", { RMrDI }, 0 }, /* 60 */ { X86_64_TABLE (X86_64_60) }, { X86_64_TABLE (X86_64_61) }, @@ -9790,9 +9793,10 @@ print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax) /* Check if the REX2 prefix is used. */ if (ins.last_rex2_prefix >= 0 - && ((ins.rex2 & 0x7) ^ (ins.rex2_used & 0x7)) == 0 - && (ins.rex ^ ins.rex_used) == 0 - && (ins.rex2 & 0x7)) + && ((ins.rex2 & REX2_SPECIAL) + || (((ins.rex2 & 7) ^ (ins.rex2_used & 7)) == 0 + && (ins.rex ^ ins.rex_used) == 0 + && (ins.rex2 & 7)))) ins.all_prefixes[ins.last_rex2_prefix] = 0; /* Check if the SEG prefix is used. */ @@ -10639,6 +10643,19 @@ putop (instr_info *ins, const char *in_template, int sizeflag) case 'P': if (l == 0) { + if (!cond && ins->last_rex2_prefix >= 0 && (ins->rex & REX_W)) + { + /* For pushp and popp, p is printed and do not print {rex2} + for them. */ + *ins->obufp++ = 'p'; + ins->rex2 |= REX2_SPECIAL; + break; + } + + /* For "!P" print nothing else in Intel syntax. */ + if (!cond && ins->intel_syntax) + break; + if ((ins->modrm.mod == 3 || !cond) && !(sizeflag & SUFFIX_ALWAYS)) break; diff --git a/opcodes/i386-opc.h b/opcodes/i386-opc.h index 5e4f4f97f52..cd261718f59 100644 --- a/opcodes/i386-opc.h +++ b/opcodes/i386-opc.h @@ -579,6 +579,8 @@ enum /* Instrucion requires that destination must be distinct from source registers. */ #define DISTINCT_DEST 9 + /* Instrucion requires REX2 prefix. */ +#define REX2_REQUIRED 10 OperandConstraint, /* instruction ignores operand size prefix and in Intel mode ignores mnemonic size suffix check. */ diff --git a/opcodes/i386-opc.tbl b/opcodes/i386-opc.tbl index 4bb268c4bfb..eb054c9cfc7 100644 --- a/opcodes/i386-opc.tbl +++ b/opcodes/i386-opc.tbl @@ -85,6 +85,7 @@ #define RegKludge OperandConstraint=REG_KLUDGE #define SwapSources OperandConstraint=SWAP_SOURCES #define Ugh OperandConstraint=UGH +#define Rex2 OperandConstraint=REX2_REQUIRED #define ATTSyntax Dialect=ATT_SYNTAX #define ATTMnemonic Dialect=ATT_MNEMONIC @@ -232,6 +233,7 @@ push, 0x68, i186&No64, DefaultSize|No_bSuf|No_sSuf|No_qSuf, { Imm16|Imm32 } push, 0x6, No64, DefaultSize|No_bSuf|No_sSuf|No_qSuf, { SReg } // In 64bit mode, the operand size is implicitly 64bit. push, 0x50, x64, No_bSuf|No_lSuf|No_sSuf|NoRex64, { Reg16|Reg64 } +pushp, 0x50, APX_F, No_bSuf|No_wSuf|No_lSuf|No_sSuf|Rex2, { Reg64 } push, 0xff/6, x64, Modrm|DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64, { Reg16|Reg64|Unspecified|BaseIndex } push, 0x6a, x64, DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64, { Imm8S } push, 0x68, x64, DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64, { Imm16|Imm32S } @@ -245,6 +247,7 @@ pop, 0x8f/0, No64, Modrm|DefaultSize|No_bSuf|No_sSuf|No_qSuf, { Reg16|Reg32|Unsp pop, 0x7, No64, DefaultSize|No_bSuf|No_sSuf|No_qSuf, { SReg } // In 64bit mode, the operand size is implicitly 64bit. pop, 0x58, x64, No_bSuf|No_lSuf|No_sSuf|NoRex64, { Reg16|Reg64 } +popp, 0x58, APX_F, No_bSuf|No_wSuf|No_lSuf|No_sSuf|Rex2, { Reg64 } pop, 0x8f/0, x64, Modrm|DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64, { Reg16|Reg64|Unspecified|BaseIndex } pop, 0xfa1, x64, DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64, { SReg } -- 2.25.1