diff options
author | MayShao-oc <MayShao-oc@zhaoxin.com> | 2024-10-17 09:33:17 +0800 |
---|---|---|
committer | Haochen Jiang <haochen.jiang@intel.com> | 2024-10-18 15:45:11 +0800 |
commit | 8f0d880434b84b222f87c4ee8f9d6d31d330668d (patch) | |
tree | 31b504303835e4880db9a5518ead14b6663b8887 | |
parent | d6a07eeabbadbf846da7d6841340fc589d9a57aa (diff) | |
download | binutils-8f0d880434b84b222f87c4ee8f9d6d31d330668d.zip binutils-8f0d880434b84b222f87c4ee8f9d6d31d330668d.tar.gz binutils-8f0d880434b84b222f87c4ee8f9d6d31d330668d.tar.bz2 |
x86: Support x86 ZHAOXIN GMI instructions
gas/ChangeLog:
* NEWS: Support ZHAOXIN GMI instructions.
* config/tc-i386.c: Add gmi.
* doc/c-i386.texi: Document gmi.
* testsuite/gas/i386/i386.exp: Add gmi test.
* testsuite/gas/i386/gmi.d: Ditto.
* testsuite/gas/i386/gmi.s: Ditto.
opcodes/ChangeLog:
* i386-dis.c: New comment.
* i386-gen.c: Add gmi.
* i386-opc.h (CpuGMI): New.
* i386-opc.tbl: Add Zhaoxin GMI instructions.
* i386-tbl.h: Regenerated.
* i386-mnem.h: Ditto.
* i386-init.h: Ditto.
-rw-r--r-- | gas/NEWS | 2 | ||||
-rw-r--r-- | gas/config/tc-i386.c | 1 | ||||
-rw-r--r-- | gas/doc/c-i386.texi | 6 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/gmi.d | 12 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/gmi.s | 8 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/i386.exp | 1 | ||||
-rw-r--r-- | opcodes/i386-dis.c | 48 | ||||
-rw-r--r-- | opcodes/i386-gen.c | 1 | ||||
-rw-r--r-- | opcodes/i386-opc.h | 3 | ||||
-rw-r--r-- | opcodes/i386-opc.tbl | 5 |
10 files changed, 84 insertions, 3 deletions
@@ -1,5 +1,7 @@ -*- text -*- +* Add support for the x86 Zhaoxin GMI instructions. + * On x86 emulation support (for secondary targets) was dropped. * Add support for RISC-V Zcmp (cm.mva01s, cm.mvsa01), Smrnmi and CORE-V diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index cfab10d..a695a15 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -1219,6 +1219,7 @@ static const arch_entry cpu_arch[] = SUBARCH (user_msr, USER_MSR, USER_MSR, false), SUBARCH (apx_f, APX_F, APX_F, false), VECARCH (avx10.2, AVX10_2, ANY_AVX10_2, set), + SUBARCH (gmi, GMI, GMI, false), }; #undef SUBARCH diff --git a/gas/doc/c-i386.texi b/gas/doc/c-i386.texi index 9667061..952ddbc 100644 --- a/gas/doc/c-i386.texi +++ b/gas/doc/c-i386.texi @@ -274,7 +274,8 @@ accept various extension mnemonics. For example, @code{snp}, @code{invlpgb}, @code{tlbsync}, -@code{svme} and +@code{svme}, +@code{gmi} and @code{padlock}. Note that these extension mnemonics can be prefixed with @code{no} to revoke the respective (and any dependent) functionality. Note further that the @@ -1705,7 +1706,8 @@ supported on the CPU specified. The choices for @var{cpu_type} are: @item @samp{.lwp} @tab @samp{.fma4} @tab @samp{.xop} @tab @samp{.cx16} @item @samp{.padlock} @tab @samp{.clzero} @tab @samp{.mwaitx} @tab @samp{.rdpru} @item @samp{.mcommit} @tab @samp{.sev_es} @tab @samp{.snp} @tab @samp{.invlpgb} -@item @samp{.tlbsync} @tab @samp{.apx_f} +@item @samp{.tlbsync} @tab @samp{.apx_f} @tab @samp{.gmi} + @end multitable Apart from the warning, there are only two other effects on diff --git a/gas/testsuite/gas/i386/gmi.d b/gas/testsuite/gas/i386/gmi.d new file mode 100644 index 0000000..063da8e --- /dev/null +++ b/gas/testsuite/gas/i386/gmi.d @@ -0,0 +1,12 @@ +#objdump: -dw +#name: zhaoxin gmi + +.*: +file format .* + +Disassembly of section .text: + +0+000 <foo>: + 0:[ ]*f2 0f a6 c0 [ ]*sm2 + 4:[ ]*f3 0f a6 e8 [ ]*sm3 + 8:[ ]*f3 0f a7 f0 [ ]*sm4 +#pass diff --git a/gas/testsuite/gas/i386/gmi.s b/gas/testsuite/gas/i386/gmi.s new file mode 100644 index 0000000..c412de5 --- /dev/null +++ b/gas/testsuite/gas/i386/gmi.s @@ -0,0 +1,8 @@ +# ZHAOXIN GMI instructions + + .text +foo: + sm2 + sm3 + sm4 + .p2align 4,0 diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp index 0a979cc..b214740 100644 --- a/gas/testsuite/gas/i386/i386.exp +++ b/gas/testsuite/gas/i386/i386.exp @@ -114,6 +114,7 @@ if [gas_32_check] then { run_dump_test "quoted2" run_dump_test "unary" run_dump_test "padlock" + run_dump_test "gmi" run_dump_test "crx" run_list_test "cr-err" "" run_dump_test "cdr" diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c index 9cf7edb..ca7d30f 100644 --- a/opcodes/i386-dis.c +++ b/opcodes/i386-dis.c @@ -90,6 +90,7 @@ static bool PCLMUL_Fixup (instr_info *, int, int); static bool VPCMP_Fixup (instr_info *, int, int); static bool VPCOM_Fixup (instr_info *, int, int); static bool NOP_Fixup (instr_info *, int, int); +static bool MONTMUL_Fixup (instr_info *, int, int); static bool OP_3DNowSuffix (instr_info *, int, int); static bool CMP_Fixup (instr_info *, int, int); static bool REP_Fixup (instr_info *, int, int); @@ -1050,6 +1051,9 @@ enum PREFIX_0F7D, PREFIX_0F7E, PREFIX_0F7F, + PREFIX_0FA6_REG_0, + PREFIX_0FA6_REG_5, + PREFIX_0FA7_REG_6, PREFIX_0FAE_REG_0_MOD_3, PREFIX_0FAE_REG_1_MOD_3, PREFIX_0FAE_REG_2_MOD_3, @@ -2855,9 +2859,12 @@ static const struct dis386 reg_table[][8] = { }, /* REG_0FA6 */ { - { "montmul", { { OP_0f07, 0 } }, 0 }, + { PREFIX_TABLE (PREFIX_0FA6_REG_0) }, { "xsha1", { { OP_0f07, 0 } }, 0 }, { "xsha256", { { OP_0f07, 0 } }, 0 }, + { Bad_Opcode }, + { Bad_Opcode }, + { PREFIX_TABLE (PREFIX_0FA6_REG_5) }, }, /* REG_0FA7 */ { @@ -2867,6 +2874,7 @@ static const struct dis386 reg_table[][8] = { { "xcrypt-ctr", { { OP_0f07, 0 } }, 0 }, { "xcrypt-cfb", { { OP_0f07, 0 } }, 0 }, { "xcrypt-ofb", { { OP_0f07, 0 } }, 0 }, + { PREFIX_TABLE (PREFIX_0FA7_REG_6) }, }, /* REG_0FAE */ { @@ -3443,6 +3451,26 @@ static const struct dis386 prefix_table[][4] = { { "movdqa", { EXxS, XM }, PREFIX_OPCODE }, }, + /* PREFIX_0FA6_REG_0 */ + { + { Bad_Opcode }, + { "montmul", { { MONTMUL_Fixup, 0 } }, 0}, + { Bad_Opcode }, + { "sm2", { Skip_MODRM }, 0 }, + }, + + /* PREFIX_0FA6_REG_5 */ + { + { Bad_Opcode }, + { "sm3", { Skip_MODRM }, 0 }, + }, + + /* PREFIX_0FA7_REG_6 */ + { + { Bad_Opcode }, + { "sm4", { Skip_MODRM }, 0 }, + }, + /* PREFIX_0FAE_REG_0_MOD_3 */ { { Bad_Opcode }, @@ -13091,6 +13119,24 @@ OP_0f07 (instr_info *ins, int bytemode, int sizeflag) return OP_E (ins, bytemode, sizeflag); } +/* montmul instruction need display repz and skip modrm */ + +static bool +MONTMUL_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) +{ + if (ins->modrm.mod != 3 || ins->modrm.rm != 0) + return BadOp (ins); + + /* The 0xf3 prefix should be displayed as "repz" for montmul. */ + if (ins->prefixes & PREFIX_REPZ) + ins->all_prefixes[ins->last_repz_prefix] = 0xf3; + + /* Skip mod/rm byte. */ + MODRM_CHECK; + ins->codep++; + return true; +} + /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in 32bit mode and "xchg %rax,%rax" in 64bit mode. */ diff --git a/opcodes/i386-gen.c b/opcodes/i386-gen.c index 2b9f4fc..053b666 100644 --- a/opcodes/i386-gen.c +++ b/opcodes/i386-gen.c @@ -334,6 +334,7 @@ static bitfield cpu_flags[] = BITFIELD (3dnow), BITFIELD (3dnowA), BITFIELD (PadLock), + BITFIELD (GMI), BITFIELD (SVME), BITFIELD (VMX), BITFIELD (SMX), diff --git a/opcodes/i386-opc.h b/opcodes/i386-opc.h index c0d5e44..d404fbc 100644 --- a/opcodes/i386-opc.h +++ b/opcodes/i386-opc.h @@ -66,6 +66,8 @@ enum i386_cpu CpuSSE3, /* VIA PadLock required */ CpuPadLock, + /* ZHAOXIN GMI required */ + CpuGMI, /* AMD Secure Virtual Machine Ext-s required */ CpuSVME, /* VMX Instructions required */ @@ -400,6 +402,7 @@ typedef union i386_cpu_flags unsigned int cpusse2:1; unsigned int cpusse3:1; unsigned int cpupadlock:1; + unsigned int cpugmi:1; unsigned int cpusvme:1; unsigned int cpuvmx:1; unsigned int cpusmx:1; diff --git a/opcodes/i386-opc.tbl b/opcodes/i386-opc.tbl index 96719f9..2717049 100644 --- a/opcodes/i386-opc.tbl +++ b/opcodes/i386-opc.tbl @@ -2131,6 +2131,11 @@ xcryptofb, 0xf30fa7e8, PadLock, NoSuf|RepPrefixOk, {} // Alias for xstore-rng. xstore, 0xfa7c0, PadLock, NoSuf|RepPrefixOk, {} +// ZHAOXIN GMI instructions +sm2, 0xf20fa6c0, GMI, NoSuf, {} +sm3, 0xf30fa6e8, GMI, NoSuf, {} +sm4, 0xf30fa7f0, GMI, NoSuf, {} + // Multy-precision Add Carry, rdseed instructions. <adx:pfx, c:66, o:f3> ad<adx>x, 0x<adx:pfx>66, ADX&APX_F, C|Modrm|CheckOperandSize|No_bSuf|No_wSuf|No_sSuf|DstVVVV|EVexMap4, { Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64, Reg32|Reg64 } |