diff --git a/llvm/lib/Target/X86/X86InstrArithmetic.td b/llvm/lib/Target/X86/X86InstrArithmetic.td index ed9f45bdd9d15..5cfa95e085e34 100644 --- a/llvm/lib/Target/X86/X86InstrArithmetic.td +++ b/llvm/lib/Target/X86/X86InstrArithmetic.td @@ -71,24 +71,60 @@ multiclass Mul o, string m, Format RegMRM, Format MemMRM, SDPatternOpera // FIXME: Used for 8-bit mul, ignore result upper 8 bits. // This probably ought to be moved to a def : Pat<> if the // syntax can be accepted. - let Defs = [AL,EFLAGS,AX], Uses = [AL] in - def 8r : MulDivOpR; - let Defs = [AX,DX,EFLAGS], Uses = [AX] in - def 16r : MulDivOpR, OpSize16; - let Defs = [EAX,EDX,EFLAGS], Uses = [EAX] in - def 32r : MulDivOpR, OpSize32; - let Defs = [RAX,RDX,EFLAGS], Uses = [RAX] in - def 64r : MulDivOpR; - let Defs = [AL,EFLAGS,AX], Uses = [AL] in - def 8m : MulDivOpM; - let Defs = [AX,DX,EFLAGS], Uses = [AX] in - def 16m : MulDivOpM, OpSize16; - let Defs = [EAX,EDX,EFLAGS], Uses = [EAX] in - def 32m : MulDivOpM, OpSize32; - let Defs = [RAX,RDX,EFLAGS], Uses = [RAX] in - def 64m : MulDivOpM, Requires<[In64BitMode]>; + let Defs = [AL, EFLAGS, AX], Uses = [AL] in + def 8r : MulDivOpR; + let Defs = [AX, DX, EFLAGS], Uses = [AX] in + def 16r : MulDivOpR, OpSize16; + let Defs = [EAX, EDX, EFLAGS], Uses = [EAX] in + def 32r : MulDivOpR, OpSize32; + let Defs = [RAX, RDX, EFLAGS], Uses = [RAX] in + def 64r : MulDivOpR; + let Defs = [AL, EFLAGS, AX], Uses = [AL] in + def 8m : MulDivOpM; + let Defs = [AX, DX, EFLAGS], Uses = [AX] in + def 16m : MulDivOpM, OpSize16; + let Defs = [EAX, EDX, EFLAGS], Uses = [EAX] in + def 32m : MulDivOpM, OpSize32; + let Defs = [RAX, RDX, EFLAGS], Uses = [RAX] in + def 64m : MulDivOpM, Requires<[In64BitMode]>; + + let Predicates = [In64BitMode] in { + let Defs = [AL, AX], Uses = [AL] in + def 8r_NF : MulDivOpR, NF; + let Defs = [AX, DX], Uses = [AX] in + def 16r_NF : MulDivOpR, NF, PD; + let Defs = [EAX, EDX], Uses = [EAX] in + def 32r_NF : MulDivOpR, NF; + let Defs = [RAX, RDX], Uses = [RAX] in + def 64r_NF : MulDivOpR, NF; + let Defs = [AL, AX], Uses = [AL] in + def 8m_NF : MulDivOpM, NF; + let Defs = [AX, DX], Uses = [AX] in + def 16m_NF : MulDivOpM, NF, PD; + let Defs = [EAX, EDX], Uses = [EAX] in + def 32m_NF : MulDivOpM, NF; + let Defs = [RAX, RDX], Uses = [RAX] in + def 64m_NF : MulDivOpM, NF; + + let Defs = [AL, EFLAGS, AX], Uses = [AL] in + def 8r_EVEX : MulDivOpR, PL; + let Defs = [AX, DX, EFLAGS], Uses = [AX] in + def 16r_EVEX : MulDivOpR, PL, PD; + let Defs = [EAX, EDX, EFLAGS], Uses = [EAX] in + def 32r_EVEX : MulDivOpR, PL; + let Defs = [RAX, RDX, EFLAGS], Uses = [RAX] in + def 64r_EVEX : MulDivOpR, PL; + let Defs = [AL, EFLAGS, AX], Uses = [AL] in + def 8m_EVEX : MulDivOpM, PL; + let Defs = [AX, DX, EFLAGS], Uses = [AX] in + def 16m_EVEX : MulDivOpM, PL, PD; + let Defs = [EAX, EDX, EFLAGS], Uses = [EAX] in + def 32m_EVEX : MulDivOpM, PL; + let Defs = [RAX, RDX, EFLAGS], Uses = [RAX] in + def 64m_EVEX : MulDivOpM, PL; + } } defm MUL : Mul<0xF7, "mul", MRM4r, MRM4m, mul>; @@ -99,54 +135,141 @@ multiclass Div o, string m, Format RegMRM, Format MemMRM> { defvar sched16 = !if(!eq(m, "div"), WriteDiv16, WriteIDiv16); defvar sched32 = !if(!eq(m, "div"), WriteDiv32, WriteIDiv32); defvar sched64 = !if(!eq(m, "div"), WriteDiv64, WriteIDiv64); - let Defs = [AL,AH,EFLAGS], Uses = [AX] in - def 8r : MulDivOpR; - let Defs = [AX,DX,EFLAGS], Uses = [AX,DX] in - def 16r : MulDivOpR, OpSize16; - let Defs = [EAX,EDX,EFLAGS], Uses = [EAX,EDX] in - def 32r : MulDivOpR, OpSize32; - let Defs = [RAX,RDX,EFLAGS], Uses = [RAX,RDX] in - def 64r : MulDivOpR; - let Defs = [AL,AH,EFLAGS], Uses = [AX] in - def 8m : MulDivOpM; - let Defs = [AX,DX,EFLAGS], Uses = [AX,DX] in - def 16m : MulDivOpM, OpSize16; - let Defs = [EAX,EDX,EFLAGS], Uses = [EAX,EDX] in - def 32m : MulDivOpM, OpSize32; - let Defs = [RAX,RDX,EFLAGS], Uses = [RAX,RDX] in - def 64m : MulDivOpM, Requires<[In64BitMode]>; + let Defs = [AL, AH, EFLAGS], Uses = [AX] in + def 8r : MulDivOpR; + let Defs = [AX, DX, EFLAGS], Uses = [AX, DX] in + def 16r : MulDivOpR, OpSize16; + let Defs = [EAX, EDX, EFLAGS], Uses = [EAX, EDX] in + def 32r : MulDivOpR, OpSize32; + let Defs = [RAX, RDX, EFLAGS], Uses = [RAX, RDX] in + def 64r : MulDivOpR; + let Defs = [AL, AH, EFLAGS], Uses = [AX] in + def 8m : MulDivOpM; + let Defs = [AX, DX, EFLAGS], Uses = [AX, DX] in + def 16m : MulDivOpM, OpSize16; + let Defs = [EAX, EDX, EFLAGS], Uses = [EAX, EDX] in + def 32m : MulDivOpM, OpSize32; + let Defs = [RAX, RDX, EFLAGS], Uses = [RAX, RDX] in + def 64m : MulDivOpM, Requires<[In64BitMode]>; + + let Predicates = [In64BitMode] in { + let Defs = [AL, AH], Uses = [AX] in + def 8r_NF : MulDivOpR, NF; + let Defs = [AX, DX], Uses = [AX, DX] in + def 16r_NF : MulDivOpR, NF, PD; + let Defs = [EAX, EDX], Uses = [EAX, EDX] in + def 32r_NF : MulDivOpR, NF; + let Defs = [RAX, RDX], Uses = [RAX, RDX] in + def 64r_NF : MulDivOpR, NF; + let Defs = [AL, AH], Uses = [AX] in + def 8m_NF : MulDivOpM, NF; + let Defs = [AX, DX], Uses = [AX, DX] in + def 16m_NF : MulDivOpM, NF, PD; + let Defs = [EAX, EDX], Uses = [EAX, EDX] in + def 32m_NF : MulDivOpM, NF; + let Defs = [RAX, RDX], Uses = [RAX, RDX] in + def 64m_NF : MulDivOpM, NF; + + let Defs = [AL, AH, EFLAGS], Uses = [AX] in + def 8r_EVEX : MulDivOpR, PL; + let Defs = [AX, DX, EFLAGS], Uses = [AX, DX] in + def 16r_EVEX : MulDivOpR, PL, PD; + let Defs = [EAX, EDX, EFLAGS], Uses = [EAX, EDX] in + def 32r_EVEX : MulDivOpR, PL; + let Defs = [RAX, RDX, EFLAGS], Uses = [RAX, RDX] in + def 64r_EVEX : MulDivOpR, PL; + let Defs = [AL, AH, EFLAGS], Uses = [AX] in + def 8m_EVEX : MulDivOpM, PL; + let Defs = [AX, DX, EFLAGS], Uses = [AX, DX] in + def 16m_EVEX : MulDivOpM, PL, PD; + let Defs = [EAX, EDX, EFLAGS], Uses = [EAX, EDX] in + def 32m_EVEX : MulDivOpM, PL; + let Defs = [RAX, RDX, EFLAGS], Uses = [RAX, RDX] in + def 64m_EVEX : MulDivOpM, PL; + } } + let hasSideEffects = 1 in { // so that we don't speculatively execute -defm DIV: Div<0xF7, "div", MRM6r, MRM6m>; -defm IDIV: Div<0xF7, "idiv", MRM7r, MRM7m>; + defm DIV: Div<0xF7, "div", MRM6r, MRM6m>; + defm IDIV: Div<0xF7, "idiv", MRM7r, MRM7m>; } -class IMulOpRR - : BinOpRR_RF<0xAF, "imul", t, X86smul_flag>, TB { +class IMulOpRR_R + : BinOpRR_R<0xAF, "imul", t, ndd> { let Form = MRMSrcReg; let SchedRW = [sched]; // X = IMUL Y, Z --> X = IMUL Z, Y let isCommutable = 1; } -class IMulOpRM - : BinOpRM_RF<0xAF, "imul", t, X86smul_flag>, TB { -let Form = MRMSrcMem; -let SchedRW = [sched.Folded, sched.ReadAfterFold]; +class IMulOpRR_RF + : BinOpRR_RF<0xAF, "imul", t, X86smul_flag, ndd> { + let Form = MRMSrcReg; + let SchedRW = [sched]; + // X = IMUL Y, Z --> X = IMUL Z, Y + let isCommutable = 1; +} +class IMulOpRM_R + : BinOpRM_R<0xAF, "imul", t, ndd> { + let Form = MRMSrcMem; + let SchedRW = [sched.Folded, sched.ReadAfterFold]; +} +class IMulOpRM_RF + : BinOpRM_RF<0xAF, "imul", t, X86smul_flag, ndd> { + let Form = MRMSrcMem; + let SchedRW = [sched.Folded, sched.ReadAfterFold]; } -def IMUL16rr : IMulOpRR, OpSize16; -def IMUL32rr : IMulOpRR, OpSize32; -def IMUL64rr : IMulOpRR; -def IMUL16rm : IMulOpRM, OpSize16; -def IMUL32rm : IMulOpRM, OpSize32; -def IMUL64rm : IMulOpRM; +let Predicates = [NoNDD] in { + def IMUL16rr : IMulOpRR_RF, TB, OpSize16; + def IMUL32rr : IMulOpRR_RF, TB, OpSize32; + def IMUL64rr : IMulOpRR_RF, TB; + def IMUL16rm : IMulOpRM_RF, TB, OpSize16; + def IMUL32rm : IMulOpRM_RF, TB, OpSize32; + def IMUL64rm : IMulOpRM_RF, TB; +} +let Predicates = [HasNDD, In64BitMode] in { + def IMUL16rr_ND : IMulOpRR_RF, PD; + def IMUL32rr_ND : IMulOpRR_RF; + def IMUL64rr_ND : IMulOpRR_RF; + def IMUL16rm_ND : IMulOpRM_RF, PD; + def IMUL32rm_ND : IMulOpRM_RF; + def IMUL64rm_ND : IMulOpRM_RF; +} + +let Predicates = [In64BitMode], Pattern = [(null_frag)] in { + def IMUL16rr_NF : IMulOpRR_R, NF, PD; + def IMUL32rr_NF : IMulOpRR_R, NF; + def IMUL64rr_NF : IMulOpRR_R, NF; + def IMUL16rm_NF : IMulOpRM_R, NF, PD; + def IMUL32rm_NF : IMulOpRM_R, NF; + def IMUL64rm_NF : IMulOpRM_R, NF; + + def IMUL16rr_NF_ND : IMulOpRR_R, EVEX_NF, PD; + def IMUL32rr_NF_ND : IMulOpRR_R, EVEX_NF; + def IMUL64rr_NF_ND : IMulOpRR_R, EVEX_NF; + def IMUL16rm_NF_ND : IMulOpRM_R, EVEX_NF, PD; + def IMUL32rm_NF_ND : IMulOpRM_R, EVEX_NF; + def IMUL64rm_NF_ND : IMulOpRM_R, EVEX_NF; + + def IMUL16rr_EVEX : IMulOpRR_RF, PL, PD; + def IMUL32rr_EVEX : IMulOpRR_RF, PL; + def IMUL64rr_EVEX : IMulOpRR_RF, PL; + def IMUL16rm_EVEX : IMulOpRM_RF, PL, PD; + def IMUL32rm_EVEX : IMulOpRM_RF, PL; + def IMUL64rm_EVEX : IMulOpRM_RF, PL; +} class IMulOpRI8_R : BinOpRI8<0x6B, "imul", binop_ndd_args, t, MRMSrcReg, - (outs t.RegClass:$dst)>, DefEFLAGS { + (outs t.RegClass:$dst)> { let SchedRW = [sched]; } class IMulOpRI_R + : BinOpRI<0x69, "imul", binop_ndd_args, t, MRMSrcReg, + (outs t.RegClass:$dst), []> { + let SchedRW = [sched]; +} +class IMulOpRI_RF : BinOpRI<0x69, "imul", binop_ndd_args, t, MRMSrcReg, (outs t.RegClass:$dst), [(set t.RegClass:$dst, EFLAGS, (X86smul_flag t.RegClass:$src1, @@ -154,12 +277,16 @@ class IMulOpRI_R let SchedRW = [sched]; } class IMulOpMI8_R - : BinOpMI8<"imul", binop_ndd_args, t, MRMSrcMem, (outs t.RegClass:$dst)>, - DefEFLAGS { + : BinOpMI8<"imul", binop_ndd_args, t, MRMSrcMem, (outs t.RegClass:$dst)> { let Opcode = 0x6B; let SchedRW = [sched.Folded]; } class IMulOpMI_R + : BinOpMI<0x69, "imul", binop_ndd_args, t, MRMSrcMem, + (outs t.RegClass:$dst), []> { + let SchedRW = [sched.Folded]; +} +class IMulOpMI_RF : BinOpMI<0x69, "imul", binop_ndd_args, t, MRMSrcMem, (outs t.RegClass:$dst), [(set t.RegClass:$dst, EFLAGS, (X86smul_flag (t.LoadNode addr:$src1), @@ -167,20 +294,46 @@ class IMulOpMI_R DefEFLAGS { let SchedRW = [sched.Folded]; } -def IMUL16rri8 : IMulOpRI8_R, OpSize16; -def IMUL32rri8 : IMulOpRI8_R, OpSize32; -def IMUL64rri8 : IMulOpRI8_R; -def IMUL16rri : IMulOpRI_R, OpSize16; -def IMUL32rri : IMulOpRI_R, OpSize32; -def IMUL64rri32 : IMulOpRI_R; - -def IMUL16rmi8 : IMulOpMI8_R, OpSize16; -def IMUL32rmi8 : IMulOpMI8_R, OpSize32; -def IMUL64rmi8 : IMulOpMI8_R; -def IMUL16rmi : IMulOpMI_R, OpSize16; -def IMUL32rmi : IMulOpMI_R, OpSize32; -def IMUL64rmi32 : IMulOpMI_R; - +def IMUL16rri8 : IMulOpRI8_R, DefEFLAGS, OpSize16; +def IMUL32rri8 : IMulOpRI8_R, DefEFLAGS, OpSize32; +def IMUL64rri8 : IMulOpRI8_R, DefEFLAGS; +def IMUL16rri : IMulOpRI_RF, OpSize16; +def IMUL32rri : IMulOpRI_RF, OpSize32; +def IMUL64rri32 : IMulOpRI_RF; +def IMUL16rmi8 : IMulOpMI8_R, DefEFLAGS, OpSize16; +def IMUL32rmi8 : IMulOpMI8_R, DefEFLAGS, OpSize32; +def IMUL64rmi8 : IMulOpMI8_R, DefEFLAGS; +def IMUL16rmi : IMulOpMI_RF, OpSize16; +def IMUL32rmi : IMulOpMI_RF, OpSize32; +def IMUL64rmi32 : IMulOpMI_RF; + +let Predicates = [In64BitMode] in { + def IMUL16rri8_NF : IMulOpRI8_R, NF, PD; + def IMUL32rri8_NF : IMulOpRI8_R, NF; + def IMUL64rri8_NF : IMulOpRI8_R, NF; + def IMUL16rri_NF : IMulOpRI_R, NF, PD; + def IMUL32rri_NF : IMulOpRI_R, NF; + def IMUL64rri32_NF : IMulOpRI_R, NF; + def IMUL16rmi8_NF : IMulOpMI8_R, NF, PD; + def IMUL32rmi8_NF : IMulOpMI8_R, NF; + def IMUL64rmi8_NF : IMulOpMI8_R, NF; + def IMUL16rmi_NF : IMulOpMI_R, NF, PD; + def IMUL32rmi_NF : IMulOpMI_R, NF; + def IMUL64rmi32_NF : IMulOpMI_R, NF; + + def IMUL16rri8_EVEX : IMulOpRI8_R, DefEFLAGS, PL, PD; + def IMUL32rri8_EVEX : IMulOpRI8_R, DefEFLAGS, PL; + def IMUL64rri8_EVEX : IMulOpRI8_R, DefEFLAGS, PL; + def IMUL16rri_EVEX : IMulOpRI_RF, PL, PD; + def IMUL32rri_EVEX : IMulOpRI_RF, PL; + def IMUL64rri32_EVEX : IMulOpRI_RF, PL; + def IMUL16rmi8_EVEX : IMulOpMI8_R, DefEFLAGS, PL, PD; + def IMUL32rmi8_EVEX : IMulOpMI8_R, DefEFLAGS, PL; + def IMUL64rmi8_EVEX : IMulOpMI8_R, DefEFLAGS, PL; + def IMUL16rmi_EVEX : IMulOpMI_RF, PL, PD; + def IMUL32rmi_EVEX : IMulOpMI_RF, PL; + def IMUL64rmi32_EVEX : IMulOpMI_RF, PL; +} //===----------------------------------------------------------------------===// // INC and DEC Instructions // diff --git a/llvm/lib/Target/X86/X86InstrPredicates.td b/llvm/lib/Target/X86/X86InstrPredicates.td index 94fa6e45ded9d..cb751639a0575 100644 --- a/llvm/lib/Target/X86/X86InstrPredicates.td +++ b/llvm/lib/Target/X86/X86InstrPredicates.td @@ -8,8 +8,41 @@ def TruePredicate : Predicate<"true">; +// Intel x86 instructions have three separate encoding spaces: legacy, VEX, and +// EVEX. Not all X86 instructions are extended for EGPR. The following is an +// overview of which instructions are extended and how we implement them. +// +// * Legacy space +// All instructions in legacy maps 0 and 1 that have explicit GPR or memory +// operands can use the REX2 prefix to access the EGPR, except XSAVE*/XRSTOR. +// +// * EVEX space +// All instructions in the EVEX space can access the EGPR in their +// register/memory operands. +// +// For the above intructions, the only difference in encoding is reflected in +// the REX2/EVEX prefix when EGPR is used, i.e. the opcode and opcode name are +// unchanged. We don’t add new entries in TD, and instead we extend GPR with +// R16-R31 and make them allocatable only when the feature EGPR is available. +// +// Besides, some instructions in legacy space with map 2/3 and VEX space are +// promoted into EVEX space. Encoding space changes after the promotion, opcode +// and opcode map may change too sometimes. For these instructions, we add new +// entries in TD to avoid overcomplicating the assembler and disassembler. +// +// HasEGPR is for the new entries and NoEGPR is for the entries before +// promotion, so that the promoted variant can be selected first to benefit RA. def HasEGPR : Predicate<"Subtarget->hasEGPR()">; def NoEGPR : Predicate<"!Subtarget->hasEGPR()">; + +// APX extends some instructions with a new form that has an extra register +// operand called a new data destination (NDD). In such forms, NDD is the new +// destination register receiving the result of the computation and all other +// operands (including the original destination operand) become read-only source +// operands. +// +// HasNDD is for the new NDD entries and NoNDD is for the legacy 2-address +// entries, so that the NDD variant can be selected first to benefit RA. def HasNDD : Predicate<"Subtarget->hasNDD()">; def NoNDD : Predicate<"!Subtarget->hasNDD()">; def HasCMOV : Predicate<"Subtarget->canUseCMOV()">; diff --git a/llvm/test/MC/Disassembler/X86/apx/div.txt b/llvm/test/MC/Disassembler/X86/apx/div.txt new file mode 100644 index 0000000000000..277e4464c5780 --- /dev/null +++ b/llvm/test/MC/Disassembler/X86/apx/div.txt @@ -0,0 +1,66 @@ +# RUN: llvm-mc -triple x86_64 -disassemble %s | FileCheck %s --check-prefix=ATT +# RUN: llvm-mc -triple x86_64 -disassemble -output-asm-variant=1 %s | FileCheck %s --check-prefix=INTEL + +# ATT: {evex} divb %bl +# INTEL: {evex} div bl +0x62,0xf4,0x7c,0x08,0xf6,0xf3 + +# ATT: {nf} divb %bl +# INTEL: {nf} div bl +0x62,0xf4,0x7c,0x0c,0xf6,0xf3 + +# ATT: {evex} divw %dx +# INTEL: {evex} div dx +0x62,0xf4,0x7d,0x08,0xf7,0xf2 + +# ATT: {nf} divw %dx +# INTEL: {nf} div dx +0x62,0xf4,0x7d,0x0c,0xf7,0xf2 + +# ATT: {evex} divl %ecx +# INTEL: {evex} div ecx +0x62,0xf4,0x7c,0x08,0xf7,0xf1 + +# ATT: {nf} divl %ecx +# INTEL: {nf} div ecx +0x62,0xf4,0x7c,0x0c,0xf7,0xf1 + +# ATT: {evex} divq %r9 +# INTEL: {evex} div r9 +0x62,0xd4,0xfc,0x08,0xf7,0xf1 + +# ATT: {nf} divq %r9 +# INTEL: {nf} div r9 +0x62,0xd4,0xfc,0x0c,0xf7,0xf1 + +# ATT: {evex} divb 291(%r8,%rax,4) +# INTEL: {evex} div byte ptr [r8 + 4*rax + 291] +0x62,0xd4,0x7c,0x08,0xf6,0xb4,0x80,0x23,0x01,0x00,0x00 + +# ATT: {nf} divb 291(%r8,%rax,4) +# INTEL: {nf} div byte ptr [r8 + 4*rax + 291] +0x62,0xd4,0x7c,0x0c,0xf6,0xb4,0x80,0x23,0x01,0x00,0x00 + +# ATT: {evex} divw 291(%r8,%rax,4) +# INTEL: {evex} div word ptr [r8 + 4*rax + 291] +0x62,0xd4,0x7d,0x08,0xf7,0xb4,0x80,0x23,0x01,0x00,0x00 + +# ATT: {nf} divw 291(%r8,%rax,4) +# INTEL: {nf} div word ptr [r8 + 4*rax + 291] +0x62,0xd4,0x7d,0x0c,0xf7,0xb4,0x80,0x23,0x01,0x00,0x00 + +# ATT: {evex} divl 291(%r8,%rax,4) +# INTEL: {evex} div dword ptr [r8 + 4*rax + 291] +0x62,0xd4,0x7c,0x08,0xf7,0xb4,0x80,0x23,0x01,0x00,0x00 + +# ATT: {nf} divl 291(%r8,%rax,4) +# INTEL: {nf} div dword ptr [r8 + 4*rax + 291] +0x62,0xd4,0x7c,0x0c,0xf7,0xb4,0x80,0x23,0x01,0x00,0x00 + +# ATT: {evex} divq 291(%r8,%rax,4) +# INTEL: {evex} div qword ptr [r8 + 4*rax + 291] +0x62,0xd4,0xfc,0x08,0xf7,0xb4,0x80,0x23,0x01,0x00,0x00 + +# ATT: {nf} divq 291(%r8,%rax,4) +# INTEL: {nf} div qword ptr [r8 + 4*rax + 291] +0x62,0xd4,0xfc,0x0c,0xf7,0xb4,0x80,0x23,0x01,0x00,0x00 diff --git a/llvm/test/MC/Disassembler/X86/apx/idiv.txt b/llvm/test/MC/Disassembler/X86/apx/idiv.txt new file mode 100644 index 0000000000000..f5daf735a0b59 --- /dev/null +++ b/llvm/test/MC/Disassembler/X86/apx/idiv.txt @@ -0,0 +1,66 @@ +# RUN: llvm-mc -triple x86_64 -disassemble %s | FileCheck %s --check-prefix=ATT +# RUN: llvm-mc -triple x86_64 -disassemble -output-asm-variant=1 %s | FileCheck %s --check-prefix=INTEL + +# ATT: {evex} idivb %bl +# INTEL: {evex} idiv bl +0x62,0xf4,0x7c,0x08,0xf6,0xfb + +# ATT: {nf} idivb %bl +# INTEL: {nf} idiv bl +0x62,0xf4,0x7c,0x0c,0xf6,0xfb + +# ATT: {evex} idivw %dx +# INTEL: {evex} idiv dx +0x62,0xf4,0x7d,0x08,0xf7,0xfa + +# ATT: {nf} idivw %dx +# INTEL: {nf} idiv dx +0x62,0xf4,0x7d,0x0c,0xf7,0xfa + +# ATT: {evex} idivl %ecx +# INTEL: {evex} idiv ecx +0x62,0xf4,0x7c,0x08,0xf7,0xf9 + +# ATT: {nf} idivl %ecx +# INTEL: {nf} idiv ecx +0x62,0xf4,0x7c,0x0c,0xf7,0xf9 + +# ATT: {evex} idivq %r9 +# INTEL: {evex} idiv r9 +0x62,0xd4,0xfc,0x08,0xf7,0xf9 + +# ATT: {nf} idivq %r9 +# INTEL: {nf} idiv r9 +0x62,0xd4,0xfc,0x0c,0xf7,0xf9 + +# ATT: {evex} idivb 291(%r8,%rax,4) +# INTEL: {evex} idiv byte ptr [r8 + 4*rax + 291] +0x62,0xd4,0x7c,0x08,0xf6,0xbc,0x80,0x23,0x01,0x00,0x00 + +# ATT: {nf} idivb 291(%r8,%rax,4) +# INTEL: {nf} idiv byte ptr [r8 + 4*rax + 291] +0x62,0xd4,0x7c,0x0c,0xf6,0xbc,0x80,0x23,0x01,0x00,0x00 + +# ATT: {evex} idivw 291(%r8,%rax,4) +# INTEL: {evex} idiv word ptr [r8 + 4*rax + 291] +0x62,0xd4,0x7d,0x08,0xf7,0xbc,0x80,0x23,0x01,0x00,0x00 + +# ATT: {nf} idivw 291(%r8,%rax,4) +# INTEL: {nf} idiv word ptr [r8 + 4*rax + 291] +0x62,0xd4,0x7d,0x0c,0xf7,0xbc,0x80,0x23,0x01,0x00,0x00 + +# ATT: {evex} idivl 291(%r8,%rax,4) +# INTEL: {evex} idiv dword ptr [r8 + 4*rax + 291] +0x62,0xd4,0x7c,0x08,0xf7,0xbc,0x80,0x23,0x01,0x00,0x00 + +# ATT: {nf} idivl 291(%r8,%rax,4) +# INTEL: {nf} idiv dword ptr [r8 + 4*rax + 291] +0x62,0xd4,0x7c,0x0c,0xf7,0xbc,0x80,0x23,0x01,0x00,0x00 + +# ATT: {evex} idivq 291(%r8,%rax,4) +# INTEL: {evex} idiv qword ptr [r8 + 4*rax + 291] +0x62,0xd4,0xfc,0x08,0xf7,0xbc,0x80,0x23,0x01,0x00,0x00 + +# ATT: {nf} idivq 291(%r8,%rax,4) +# INTEL: {nf} idiv qword ptr [r8 + 4*rax + 291] +0x62,0xd4,0xfc,0x0c,0xf7,0xbc,0x80,0x23,0x01,0x00,0x00 diff --git a/llvm/test/MC/Disassembler/X86/apx/imul.txt b/llvm/test/MC/Disassembler/X86/apx/imul.txt new file mode 100644 index 0000000000000..f72a6f4aec8f9 --- /dev/null +++ b/llvm/test/MC/Disassembler/X86/apx/imul.txt @@ -0,0 +1,258 @@ +# RUN: llvm-mc -triple x86_64 -disassemble %s | FileCheck %s --check-prefix=ATT +# RUN: llvm-mc -triple x86_64 -disassemble -output-asm-variant=1 %s | FileCheck %s --check-prefix=INTEL + +# ATT: {evex} imulw $123, %dx, %dx +# INTEL: {evex} imul dx, dx, 123 +0x62,0xf4,0x7d,0x08,0x6b,0xd2,0x7b + +# ATT: {nf} imulw $123, %dx, %dx +# INTEL: {nf} imul dx, dx, 123 +0x62,0xf4,0x7d,0x0c,0x6b,0xd2,0x7b + +# ATT: {evex} imull $123, %ecx, %ecx +# INTEL: {evex} imul ecx, ecx, 123 +0x62,0xf4,0x7c,0x08,0x6b,0xc9,0x7b + +# ATT: {nf} imull $123, %ecx, %ecx +# INTEL: {nf} imul ecx, ecx, 123 +0x62,0xf4,0x7c,0x0c,0x6b,0xc9,0x7b + +# ATT: {evex} imulq $123, %r9, %r9 +# INTEL: {evex} imul r9, r9, 123 +0x62,0x54,0xfc,0x08,0x6b,0xc9,0x7b + +# ATT: {nf} imulq $123, %r9, %r9 +# INTEL: {nf} imul r9, r9, 123 +0x62,0x54,0xfc,0x0c,0x6b,0xc9,0x7b + +# ATT: {evex} imulw $123, 291(%r8,%rax,4), %dx +# INTEL: {evex} imul dx, word ptr [r8 + 4*rax + 291], 123 +0x62,0xd4,0x7d,0x08,0x6b,0x94,0x80,0x23,0x01,0x00,0x00,0x7b + +# ATT: {nf} imulw $123, 291(%r8,%rax,4), %dx +# INTEL: {nf} imul dx, word ptr [r8 + 4*rax + 291], 123 +0x62,0xd4,0x7d,0x0c,0x6b,0x94,0x80,0x23,0x01,0x00,0x00,0x7b + +# ATT: {evex} imull $123, 291(%r8,%rax,4), %ecx +# INTEL: {evex} imul ecx, dword ptr [r8 + 4*rax + 291], 123 +0x62,0xd4,0x7c,0x08,0x6b,0x8c,0x80,0x23,0x01,0x00,0x00,0x7b + +# ATT: {nf} imull $123, 291(%r8,%rax,4), %ecx +# INTEL: {nf} imul ecx, dword ptr [r8 + 4*rax + 291], 123 +0x62,0xd4,0x7c,0x0c,0x6b,0x8c,0x80,0x23,0x01,0x00,0x00,0x7b + +# ATT: {evex} imulq $123, 291(%r8,%rax,4), %r9 +# INTEL: {evex} imul r9, qword ptr [r8 + 4*rax + 291], 123 +0x62,0x54,0xfc,0x08,0x6b,0x8c,0x80,0x23,0x01,0x00,0x00,0x7b + +# ATT: {nf} imulq $123, 291(%r8,%rax,4), %r9 +# INTEL: {nf} imul r9, qword ptr [r8 + 4*rax + 291], 123 +0x62,0x54,0xfc,0x0c,0x6b,0x8c,0x80,0x23,0x01,0x00,0x00,0x7b + +# ATT: {evex} imulw $1234, %dx, %dx +# INTEL: {evex} imul dx, dx, 1234 +0x62,0xf4,0x7d,0x08,0x69,0xd2,0xd2,0x04 + +# ATT: {nf} imulw $1234, %dx, %dx +# INTEL: {nf} imul dx, dx, 1234 +0x62,0xf4,0x7d,0x0c,0x69,0xd2,0xd2,0x04 + +# ATT: {evex} imulw $1234, 291(%r8,%rax,4), %dx +# INTEL: {evex} imul dx, word ptr [r8 + 4*rax + 291], 1234 +0x62,0xd4,0x7d,0x08,0x69,0x94,0x80,0x23,0x01,0x00,0x00,0xd2,0x04 + +# ATT: {nf} imulw $1234, 291(%r8,%rax,4), %dx +# INTEL: {nf} imul dx, word ptr [r8 + 4*rax + 291], 1234 +0x62,0xd4,0x7d,0x0c,0x69,0x94,0x80,0x23,0x01,0x00,0x00,0xd2,0x04 + +# ATT: {evex} imull $123456, %ecx, %ecx +# INTEL: {evex} imul ecx, ecx, 123456 +0x62,0xf4,0x7c,0x08,0x69,0xc9,0x40,0xe2,0x01,0x00 + +# ATT: {nf} imull $123456, %ecx, %ecx +# INTEL: {nf} imul ecx, ecx, 123456 +0x62,0xf4,0x7c,0x0c,0x69,0xc9,0x40,0xe2,0x01,0x00 + +# ATT: {evex} imulq $123456, %r9, %r9 +# INTEL: {evex} imul r9, r9, 123456 +0x62,0x54,0xfc,0x08,0x69,0xc9,0x40,0xe2,0x01,0x00 + +# ATT: {nf} imulq $123456, %r9, %r9 +# INTEL: {nf} imul r9, r9, 123456 +0x62,0x54,0xfc,0x0c,0x69,0xc9,0x40,0xe2,0x01,0x00 + +# ATT: {evex} imull $123456, 291(%r8,%rax,4), %ecx +# INTEL: {evex} imul ecx, dword ptr [r8 + 4*rax + 291], 123456 +0x62,0xd4,0x7c,0x08,0x69,0x8c,0x80,0x23,0x01,0x00,0x00,0x40,0xe2,0x01,0x00 + +# ATT: {nf} imull $123456, 291(%r8,%rax,4), %ecx +# INTEL: {nf} imul ecx, dword ptr [r8 + 4*rax + 291], 123456 +0x62,0xd4,0x7c,0x0c,0x69,0x8c,0x80,0x23,0x01,0x00,0x00,0x40,0xe2,0x01,0x00 + +# ATT: {evex} imulq $123456, 291(%r8,%rax,4), %r9 +# INTEL: {evex} imul r9, qword ptr [r8 + 4*rax + 291], 123456 +0x62,0x54,0xfc,0x08,0x69,0x8c,0x80,0x23,0x01,0x00,0x00,0x40,0xe2,0x01,0x00 + +# ATT: {nf} imulq $123456, 291(%r8,%rax,4), %r9 +# INTEL: {nf} imul r9, qword ptr [r8 + 4*rax + 291], 123456 +0x62,0x54,0xfc,0x0c,0x69,0x8c,0x80,0x23,0x01,0x00,0x00,0x40,0xe2,0x01,0x00 + +# ATT: {evex} imulb %bl +# INTEL: {evex} imul bl +0x62,0xf4,0x7c,0x08,0xf6,0xeb + +# ATT: {nf} imulb %bl +# INTEL: {nf} imul bl +0x62,0xf4,0x7c,0x0c,0xf6,0xeb + +# ATT: {evex} imulw %dx +# INTEL: {evex} imul dx +0x62,0xf4,0x7d,0x08,0xf7,0xea + +# ATT: {nf} imulw %dx +# INTEL: {nf} imul dx +0x62,0xf4,0x7d,0x0c,0xf7,0xea + +# ATT: {evex} imulw %dx, %dx +# INTEL: {evex} imul dx, dx +0x62,0xf4,0x7d,0x08,0xaf,0xd2 + +# ATT: {nf} imulw %dx, %dx +# INTEL: {nf} imul dx, dx +0x62,0xf4,0x7d,0x0c,0xaf,0xd2 + +# ATT: imulw %dx, %dx, %dx +# INTEL: imul dx, dx, dx +0x62,0xf4,0x6d,0x18,0xaf,0xd2 + +# ATT: {nf} imulw %dx, %dx, %dx +# INTEL: {nf} imul dx, dx, dx +0x62,0xf4,0x6d,0x1c,0xaf,0xd2 + +# ATT: {evex} imull %ecx +# INTEL: {evex} imul ecx +0x62,0xf4,0x7c,0x08,0xf7,0xe9 + +# ATT: {nf} imull %ecx +# INTEL: {nf} imul ecx +0x62,0xf4,0x7c,0x0c,0xf7,0xe9 + +# ATT: {evex} imull %ecx, %ecx +# INTEL: {evex} imul ecx, ecx +0x62,0xf4,0x7c,0x08,0xaf,0xc9 + +# ATT: {nf} imull %ecx, %ecx +# INTEL: {nf} imul ecx, ecx +0x62,0xf4,0x7c,0x0c,0xaf,0xc9 + +# ATT: imull %ecx, %ecx, %ecx +# INTEL: imul ecx, ecx, ecx +0x62,0xf4,0x74,0x18,0xaf,0xc9 + +# ATT: {nf} imull %ecx, %ecx, %ecx +# INTEL: {nf} imul ecx, ecx, ecx +0x62,0xf4,0x74,0x1c,0xaf,0xc9 + +# ATT: {evex} imulq %r9 +# INTEL: {evex} imul r9 +0x62,0xd4,0xfc,0x08,0xf7,0xe9 + +# ATT: {nf} imulq %r9 +# INTEL: {nf} imul r9 +0x62,0xd4,0xfc,0x0c,0xf7,0xe9 + +# ATT: {evex} imulq %r9, %r9 +# INTEL: {evex} imul r9, r9 +0x62,0x54,0xfc,0x08,0xaf,0xc9 + +# ATT: {nf} imulq %r9, %r9 +# INTEL: {nf} imul r9, r9 +0x62,0x54,0xfc,0x0c,0xaf,0xc9 + +# ATT: imulq %r9, %r9, %r9 +# INTEL: imul r9, r9, r9 +0x62,0x54,0xb4,0x18,0xaf,0xc9 + +# ATT: {nf} imulq %r9, %r9, %r9 +# INTEL: {nf} imul r9, r9, r9 +0x62,0x54,0xb4,0x1c,0xaf,0xc9 + +# ATT: {evex} imulb 291(%r8,%rax,4) +# INTEL: {evex} imul byte ptr [r8 + 4*rax + 291] +0x62,0xd4,0x7c,0x08,0xf6,0xac,0x80,0x23,0x01,0x00,0x00 + +# ATT: {nf} imulb 291(%r8,%rax,4) +# INTEL: {nf} imul byte ptr [r8 + 4*rax + 291] +0x62,0xd4,0x7c,0x0c,0xf6,0xac,0x80,0x23,0x01,0x00,0x00 + +# ATT: {evex} imulw 291(%r8,%rax,4) +# INTEL: {evex} imul word ptr [r8 + 4*rax + 291] +0x62,0xd4,0x7d,0x08,0xf7,0xac,0x80,0x23,0x01,0x00,0x00 + +# ATT: {nf} imulw 291(%r8,%rax,4) +# INTEL: {nf} imul word ptr [r8 + 4*rax + 291] +0x62,0xd4,0x7d,0x0c,0xf7,0xac,0x80,0x23,0x01,0x00,0x00 + +# ATT: {evex} imulw 291(%r8,%rax,4), %dx +# INTEL: {evex} imul dx, word ptr [r8 + 4*rax + 291] +0x62,0xd4,0x7d,0x08,0xaf,0x94,0x80,0x23,0x01,0x00,0x00 + +# ATT: {nf} imulw 291(%r8,%rax,4), %dx +# INTEL: {nf} imul dx, word ptr [r8 + 4*rax + 291] +0x62,0xd4,0x7d,0x0c,0xaf,0x94,0x80,0x23,0x01,0x00,0x00 + +# ATT: imulw 291(%r8,%rax,4), %dx, %dx +# INTEL: imul dx, dx, word ptr [r8 + 4*rax + 291] +0x62,0xd4,0x6d,0x18,0xaf,0x94,0x80,0x23,0x01,0x00,0x00 + +# ATT: {nf} imulw 291(%r8,%rax,4), %dx, %dx +# INTEL: {nf} imul dx, dx, word ptr [r8 + 4*rax + 291] +0x62,0xd4,0x6d,0x1c,0xaf,0x94,0x80,0x23,0x01,0x00,0x00 + +# ATT: {evex} imull 291(%r8,%rax,4) +# INTEL: {evex} imul dword ptr [r8 + 4*rax + 291] +0x62,0xd4,0x7c,0x08,0xf7,0xac,0x80,0x23,0x01,0x00,0x00 + +# ATT: {nf} imull 291(%r8,%rax,4) +# INTEL: {nf} imul dword ptr [r8 + 4*rax + 291] +0x62,0xd4,0x7c,0x0c,0xf7,0xac,0x80,0x23,0x01,0x00,0x00 + +# ATT: {evex} imull 291(%r8,%rax,4), %ecx +# INTEL: {evex} imul ecx, dword ptr [r8 + 4*rax + 291] +0x62,0xd4,0x7c,0x08,0xaf,0x8c,0x80,0x23,0x01,0x00,0x00 + +# ATT: {nf} imull 291(%r8,%rax,4), %ecx +# INTEL: {nf} imul ecx, dword ptr [r8 + 4*rax + 291] +0x62,0xd4,0x7c,0x0c,0xaf,0x8c,0x80,0x23,0x01,0x00,0x00 + +# ATT: imull 291(%r8,%rax,4), %ecx, %ecx +# INTEL: imul ecx, ecx, dword ptr [r8 + 4*rax + 291] +0x62,0xd4,0x74,0x18,0xaf,0x8c,0x80,0x23,0x01,0x00,0x00 + +# ATT: {nf} imull 291(%r8,%rax,4), %ecx, %ecx +# INTEL: {nf} imul ecx, ecx, dword ptr [r8 + 4*rax + 291] +0x62,0xd4,0x74,0x1c,0xaf,0x8c,0x80,0x23,0x01,0x00,0x00 + +# ATT: {evex} imulq 291(%r8,%rax,4) +# INTEL: {evex} imul qword ptr [r8 + 4*rax + 291] +0x62,0xd4,0xfc,0x08,0xf7,0xac,0x80,0x23,0x01,0x00,0x00 + +# ATT: {nf} imulq 291(%r8,%rax,4) +# INTEL: {nf} imul qword ptr [r8 + 4*rax + 291] +0x62,0xd4,0xfc,0x0c,0xf7,0xac,0x80,0x23,0x01,0x00,0x00 + +# ATT: {evex} imulq 291(%r8,%rax,4), %r9 +# INTEL: {evex} imul r9, qword ptr [r8 + 4*rax + 291] +0x62,0x54,0xfc,0x08,0xaf,0x8c,0x80,0x23,0x01,0x00,0x00 + +# ATT: {nf} imulq 291(%r8,%rax,4), %r9 +# INTEL: {nf} imul r9, qword ptr [r8 + 4*rax + 291] +0x62,0x54,0xfc,0x0c,0xaf,0x8c,0x80,0x23,0x01,0x00,0x00 + +# ATT: imulq 291(%r8,%rax,4), %r9, %r9 +# INTEL: imul r9, r9, qword ptr [r8 + 4*rax + 291] +0x62,0x54,0xb4,0x18,0xaf,0x8c,0x80,0x23,0x01,0x00,0x00 + +# ATT: {nf} imulq 291(%r8,%rax,4), %r9, %r9 +# INTEL: {nf} imul r9, r9, qword ptr [r8 + 4*rax + 291] +0x62,0x54,0xb4,0x1c,0xaf,0x8c,0x80,0x23,0x01,0x00,0x00 diff --git a/llvm/test/MC/Disassembler/X86/apx/mul.txt b/llvm/test/MC/Disassembler/X86/apx/mul.txt new file mode 100644 index 0000000000000..eb5e69e3e2e56 --- /dev/null +++ b/llvm/test/MC/Disassembler/X86/apx/mul.txt @@ -0,0 +1,66 @@ +# RUN: llvm-mc -triple x86_64 -disassemble %s | FileCheck %s --check-prefix=ATT +# RUN: llvm-mc -triple x86_64 -disassemble -output-asm-variant=1 %s | FileCheck %s --check-prefix=INTEL + +# ATT: {evex} mulb %bl +# INTEL: {evex} mul bl +0x62,0xf4,0x7c,0x08,0xf6,0xe3 + +# ATT: {nf} mulb %bl +# INTEL: {nf} mul bl +0x62,0xf4,0x7c,0x0c,0xf6,0xe3 + +# ATT: {evex} mulw %dx +# INTEL: {evex} mul dx +0x62,0xf4,0x7d,0x08,0xf7,0xe2 + +# ATT: {nf} mulw %dx +# INTEL: {nf} mul dx +0x62,0xf4,0x7d,0x0c,0xf7,0xe2 + +# ATT: {evex} mull %ecx +# INTEL: {evex} mul ecx +0x62,0xf4,0x7c,0x08,0xf7,0xe1 + +# ATT: {nf} mull %ecx +# INTEL: {nf} mul ecx +0x62,0xf4,0x7c,0x0c,0xf7,0xe1 + +# ATT: {evex} mulq %r9 +# INTEL: {evex} mul r9 +0x62,0xd4,0xfc,0x08,0xf7,0xe1 + +# ATT: {nf} mulq %r9 +# INTEL: {nf} mul r9 +0x62,0xd4,0xfc,0x0c,0xf7,0xe1 + +# ATT: {evex} mulb 291(%r8,%rax,4) +# INTEL: {evex} mul byte ptr [r8 + 4*rax + 291] +0x62,0xd4,0x7c,0x08,0xf6,0xa4,0x80,0x23,0x01,0x00,0x00 + +# ATT: {nf} mulb 291(%r8,%rax,4) +# INTEL: {nf} mul byte ptr [r8 + 4*rax + 291] +0x62,0xd4,0x7c,0x0c,0xf6,0xa4,0x80,0x23,0x01,0x00,0x00 + +# ATT: {evex} mulw 291(%r8,%rax,4) +# INTEL: {evex} mul word ptr [r8 + 4*rax + 291] +0x62,0xd4,0x7d,0x08,0xf7,0xa4,0x80,0x23,0x01,0x00,0x00 + +# ATT: {nf} mulw 291(%r8,%rax,4) +# INTEL: {nf} mul word ptr [r8 + 4*rax + 291] +0x62,0xd4,0x7d,0x0c,0xf7,0xa4,0x80,0x23,0x01,0x00,0x00 + +# ATT: {evex} mull 291(%r8,%rax,4) +# INTEL: {evex} mul dword ptr [r8 + 4*rax + 291] +0x62,0xd4,0x7c,0x08,0xf7,0xa4,0x80,0x23,0x01,0x00,0x00 + +# ATT: {nf} mull 291(%r8,%rax,4) +# INTEL: {nf} mul dword ptr [r8 + 4*rax + 291] +0x62,0xd4,0x7c,0x0c,0xf7,0xa4,0x80,0x23,0x01,0x00,0x00 + +# ATT: {evex} mulq 291(%r8,%rax,4) +# INTEL: {evex} mul qword ptr [r8 + 4*rax + 291] +0x62,0xd4,0xfc,0x08,0xf7,0xa4,0x80,0x23,0x01,0x00,0x00 + +# ATT: {nf} mulq 291(%r8,%rax,4) +# INTEL: {nf} mul qword ptr [r8 + 4*rax + 291] +0x62,0xd4,0xfc,0x0c,0xf7,0xa4,0x80,0x23,0x01,0x00,0x00 diff --git a/llvm/test/MC/X86/apx/div-att.s b/llvm/test/MC/X86/apx/div-att.s new file mode 100644 index 0000000000000..0b78aa5a59d1d --- /dev/null +++ b/llvm/test/MC/X86/apx/div-att.s @@ -0,0 +1,53 @@ +# RUN: llvm-mc -triple x86_64 -show-encoding %s | FileCheck %s +# RUN: not llvm-mc -triple i386 -show-encoding %s 2>&1 | FileCheck %s --check-prefix=ERROR + +# ERROR-COUNT-16: error: +# ERROR-NOT: error: +# CHECK: {evex} divb %bl +# CHECK: encoding: [0x62,0xf4,0x7c,0x08,0xf6,0xf3] + {evex} divb %bl +# CHECK: {nf} divb %bl +# CHECK: encoding: [0x62,0xf4,0x7c,0x0c,0xf6,0xf3] + {nf} divb %bl +# CHECK: {evex} divw %dx +# CHECK: encoding: [0x62,0xf4,0x7d,0x08,0xf7,0xf2] + {evex} divw %dx +# CHECK: {nf} divw %dx +# CHECK: encoding: [0x62,0xf4,0x7d,0x0c,0xf7,0xf2] + {nf} divw %dx +# CHECK: {evex} divl %ecx +# CHECK: encoding: [0x62,0xf4,0x7c,0x08,0xf7,0xf1] + {evex} divl %ecx +# CHECK: {nf} divl %ecx +# CHECK: encoding: [0x62,0xf4,0x7c,0x0c,0xf7,0xf1] + {nf} divl %ecx +# CHECK: {evex} divq %r9 +# CHECK: encoding: [0x62,0xd4,0xfc,0x08,0xf7,0xf1] + {evex} divq %r9 +# CHECK: {nf} divq %r9 +# CHECK: encoding: [0x62,0xd4,0xfc,0x0c,0xf7,0xf1] + {nf} divq %r9 +# CHECK: {evex} divb 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0x7c,0x08,0xf6,0xb4,0x80,0x23,0x01,0x00,0x00] + {evex} divb 291(%r8,%rax,4) +# CHECK: {nf} divb 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0x7c,0x0c,0xf6,0xb4,0x80,0x23,0x01,0x00,0x00] + {nf} divb 291(%r8,%rax,4) +# CHECK: {evex} divw 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0x7d,0x08,0xf7,0xb4,0x80,0x23,0x01,0x00,0x00] + {evex} divw 291(%r8,%rax,4) +# CHECK: {nf} divw 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0x7d,0x0c,0xf7,0xb4,0x80,0x23,0x01,0x00,0x00] + {nf} divw 291(%r8,%rax,4) +# CHECK: {evex} divl 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0x7c,0x08,0xf7,0xb4,0x80,0x23,0x01,0x00,0x00] + {evex} divl 291(%r8,%rax,4) +# CHECK: {nf} divl 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0x7c,0x0c,0xf7,0xb4,0x80,0x23,0x01,0x00,0x00] + {nf} divl 291(%r8,%rax,4) +# CHECK: {evex} divq 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0xfc,0x08,0xf7,0xb4,0x80,0x23,0x01,0x00,0x00] + {evex} divq 291(%r8,%rax,4) +# CHECK: {nf} divq 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0xfc,0x0c,0xf7,0xb4,0x80,0x23,0x01,0x00,0x00] + {nf} divq 291(%r8,%rax,4) diff --git a/llvm/test/MC/X86/apx/div-intel.s b/llvm/test/MC/X86/apx/div-intel.s new file mode 100644 index 0000000000000..3647b95d5d349 --- /dev/null +++ b/llvm/test/MC/X86/apx/div-intel.s @@ -0,0 +1,50 @@ +# RUN: llvm-mc -triple x86_64 -show-encoding -x86-asm-syntax=intel -output-asm-variant=1 %s | FileCheck %s + +# CHECK: {evex} div bl +# CHECK: encoding: [0x62,0xf4,0x7c,0x08,0xf6,0xf3] + {evex} div bl +# CHECK: {nf} div bl +# CHECK: encoding: [0x62,0xf4,0x7c,0x0c,0xf6,0xf3] + {nf} div bl +# CHECK: {evex} div dx +# CHECK: encoding: [0x62,0xf4,0x7d,0x08,0xf7,0xf2] + {evex} div dx +# CHECK: {nf} div dx +# CHECK: encoding: [0x62,0xf4,0x7d,0x0c,0xf7,0xf2] + {nf} div dx +# CHECK: {evex} div ecx +# CHECK: encoding: [0x62,0xf4,0x7c,0x08,0xf7,0xf1] + {evex} div ecx +# CHECK: {nf} div ecx +# CHECK: encoding: [0x62,0xf4,0x7c,0x0c,0xf7,0xf1] + {nf} div ecx +# CHECK: {evex} div r9 +# CHECK: encoding: [0x62,0xd4,0xfc,0x08,0xf7,0xf1] + {evex} div r9 +# CHECK: {nf} div r9 +# CHECK: encoding: [0x62,0xd4,0xfc,0x0c,0xf7,0xf1] + {nf} div r9 +# CHECK: {evex} div byte ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x7c,0x08,0xf6,0xb4,0x80,0x23,0x01,0x00,0x00] + {evex} div byte ptr [r8 + 4*rax + 291] +# CHECK: {nf} div byte ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x7c,0x0c,0xf6,0xb4,0x80,0x23,0x01,0x00,0x00] + {nf} div byte ptr [r8 + 4*rax + 291] +# CHECK: {evex} div word ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x7d,0x08,0xf7,0xb4,0x80,0x23,0x01,0x00,0x00] + {evex} div word ptr [r8 + 4*rax + 291] +# CHECK: {nf} div word ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x7d,0x0c,0xf7,0xb4,0x80,0x23,0x01,0x00,0x00] + {nf} div word ptr [r8 + 4*rax + 291] +# CHECK: {evex} div dword ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x7c,0x08,0xf7,0xb4,0x80,0x23,0x01,0x00,0x00] + {evex} div dword ptr [r8 + 4*rax + 291] +# CHECK: {nf} div dword ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x7c,0x0c,0xf7,0xb4,0x80,0x23,0x01,0x00,0x00] + {nf} div dword ptr [r8 + 4*rax + 291] +# CHECK: {evex} div qword ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0xfc,0x08,0xf7,0xb4,0x80,0x23,0x01,0x00,0x00] + {evex} div qword ptr [r8 + 4*rax + 291] +# CHECK: {nf} div qword ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0xfc,0x0c,0xf7,0xb4,0x80,0x23,0x01,0x00,0x00] + {nf} div qword ptr [r8 + 4*rax + 291] diff --git a/llvm/test/MC/X86/apx/idiv-att.s b/llvm/test/MC/X86/apx/idiv-att.s new file mode 100644 index 0000000000000..9b5da5808cd13 --- /dev/null +++ b/llvm/test/MC/X86/apx/idiv-att.s @@ -0,0 +1,53 @@ +# RUN: llvm-mc -triple x86_64 -show-encoding %s | FileCheck %s +# RUN: not llvm-mc -triple i386 -show-encoding %s 2>&1 | FileCheck %s --check-prefix=ERROR + +# ERROR-COUNT-16: error: +# ERROR-NOT: error: +# CHECK: {evex} idivb %bl +# CHECK: encoding: [0x62,0xf4,0x7c,0x08,0xf6,0xfb] + {evex} idivb %bl +# CHECK: {nf} idivb %bl +# CHECK: encoding: [0x62,0xf4,0x7c,0x0c,0xf6,0xfb] + {nf} idivb %bl +# CHECK: {evex} idivw %dx +# CHECK: encoding: [0x62,0xf4,0x7d,0x08,0xf7,0xfa] + {evex} idivw %dx +# CHECK: {nf} idivw %dx +# CHECK: encoding: [0x62,0xf4,0x7d,0x0c,0xf7,0xfa] + {nf} idivw %dx +# CHECK: {evex} idivl %ecx +# CHECK: encoding: [0x62,0xf4,0x7c,0x08,0xf7,0xf9] + {evex} idivl %ecx +# CHECK: {nf} idivl %ecx +# CHECK: encoding: [0x62,0xf4,0x7c,0x0c,0xf7,0xf9] + {nf} idivl %ecx +# CHECK: {evex} idivq %r9 +# CHECK: encoding: [0x62,0xd4,0xfc,0x08,0xf7,0xf9] + {evex} idivq %r9 +# CHECK: {nf} idivq %r9 +# CHECK: encoding: [0x62,0xd4,0xfc,0x0c,0xf7,0xf9] + {nf} idivq %r9 +# CHECK: {evex} idivb 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0x7c,0x08,0xf6,0xbc,0x80,0x23,0x01,0x00,0x00] + {evex} idivb 291(%r8,%rax,4) +# CHECK: {nf} idivb 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0x7c,0x0c,0xf6,0xbc,0x80,0x23,0x01,0x00,0x00] + {nf} idivb 291(%r8,%rax,4) +# CHECK: {evex} idivw 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0x7d,0x08,0xf7,0xbc,0x80,0x23,0x01,0x00,0x00] + {evex} idivw 291(%r8,%rax,4) +# CHECK: {nf} idivw 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0x7d,0x0c,0xf7,0xbc,0x80,0x23,0x01,0x00,0x00] + {nf} idivw 291(%r8,%rax,4) +# CHECK: {evex} idivl 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0x7c,0x08,0xf7,0xbc,0x80,0x23,0x01,0x00,0x00] + {evex} idivl 291(%r8,%rax,4) +# CHECK: {nf} idivl 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0x7c,0x0c,0xf7,0xbc,0x80,0x23,0x01,0x00,0x00] + {nf} idivl 291(%r8,%rax,4) +# CHECK: {evex} idivq 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0xfc,0x08,0xf7,0xbc,0x80,0x23,0x01,0x00,0x00] + {evex} idivq 291(%r8,%rax,4) +# CHECK: {nf} idivq 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0xfc,0x0c,0xf7,0xbc,0x80,0x23,0x01,0x00,0x00] + {nf} idivq 291(%r8,%rax,4) diff --git a/llvm/test/MC/X86/apx/idiv-intel.s b/llvm/test/MC/X86/apx/idiv-intel.s new file mode 100644 index 0000000000000..1117df929a16b --- /dev/null +++ b/llvm/test/MC/X86/apx/idiv-intel.s @@ -0,0 +1,50 @@ +# RUN: llvm-mc -triple x86_64 -show-encoding -x86-asm-syntax=intel -output-asm-variant=1 %s | FileCheck %s + +# CHECK: {evex} idiv bl +# CHECK: encoding: [0x62,0xf4,0x7c,0x08,0xf6,0xfb] + {evex} idiv bl +# CHECK: {nf} idiv bl +# CHECK: encoding: [0x62,0xf4,0x7c,0x0c,0xf6,0xfb] + {nf} idiv bl +# CHECK: {evex} idiv dx +# CHECK: encoding: [0x62,0xf4,0x7d,0x08,0xf7,0xfa] + {evex} idiv dx +# CHECK: {nf} idiv dx +# CHECK: encoding: [0x62,0xf4,0x7d,0x0c,0xf7,0xfa] + {nf} idiv dx +# CHECK: {evex} idiv ecx +# CHECK: encoding: [0x62,0xf4,0x7c,0x08,0xf7,0xf9] + {evex} idiv ecx +# CHECK: {nf} idiv ecx +# CHECK: encoding: [0x62,0xf4,0x7c,0x0c,0xf7,0xf9] + {nf} idiv ecx +# CHECK: {evex} idiv r9 +# CHECK: encoding: [0x62,0xd4,0xfc,0x08,0xf7,0xf9] + {evex} idiv r9 +# CHECK: {nf} idiv r9 +# CHECK: encoding: [0x62,0xd4,0xfc,0x0c,0xf7,0xf9] + {nf} idiv r9 +# CHECK: {evex} idiv byte ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x7c,0x08,0xf6,0xbc,0x80,0x23,0x01,0x00,0x00] + {evex} idiv byte ptr [r8 + 4*rax + 291] +# CHECK: {nf} idiv byte ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x7c,0x0c,0xf6,0xbc,0x80,0x23,0x01,0x00,0x00] + {nf} idiv byte ptr [r8 + 4*rax + 291] +# CHECK: {evex} idiv word ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x7d,0x08,0xf7,0xbc,0x80,0x23,0x01,0x00,0x00] + {evex} idiv word ptr [r8 + 4*rax + 291] +# CHECK: {nf} idiv word ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x7d,0x0c,0xf7,0xbc,0x80,0x23,0x01,0x00,0x00] + {nf} idiv word ptr [r8 + 4*rax + 291] +# CHECK: {evex} idiv dword ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x7c,0x08,0xf7,0xbc,0x80,0x23,0x01,0x00,0x00] + {evex} idiv dword ptr [r8 + 4*rax + 291] +# CHECK: {nf} idiv dword ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x7c,0x0c,0xf7,0xbc,0x80,0x23,0x01,0x00,0x00] + {nf} idiv dword ptr [r8 + 4*rax + 291] +# CHECK: {evex} idiv qword ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0xfc,0x08,0xf7,0xbc,0x80,0x23,0x01,0x00,0x00] + {evex} idiv qword ptr [r8 + 4*rax + 291] +# CHECK: {nf} idiv qword ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0xfc,0x0c,0xf7,0xbc,0x80,0x23,0x01,0x00,0x00] + {nf} idiv qword ptr [r8 + 4*rax + 291] diff --git a/llvm/test/MC/X86/apx/imul-att.s b/llvm/test/MC/X86/apx/imul-att.s new file mode 100644 index 0000000000000..a0a19a4239752 --- /dev/null +++ b/llvm/test/MC/X86/apx/imul-att.s @@ -0,0 +1,197 @@ +# RUN: llvm-mc -triple x86_64 -show-encoding %s | FileCheck %s +# RUN: not llvm-mc -triple i386 -show-encoding %s 2>&1 | FileCheck %s --check-prefix=ERROR + +# ERROR-COUNT-64: error: +# ERROR-NOT: error: +# CHECK: {evex} imulw $123, %dx, %dx +# CHECK: encoding: [0x62,0xf4,0x7d,0x08,0x6b,0xd2,0x7b] + {evex} imulw $123, %dx, %dx +# CHECK: {nf} imulw $123, %dx, %dx +# CHECK: encoding: [0x62,0xf4,0x7d,0x0c,0x6b,0xd2,0x7b] + {nf} imulw $123, %dx, %dx +# CHECK: {evex} imull $123, %ecx, %ecx +# CHECK: encoding: [0x62,0xf4,0x7c,0x08,0x6b,0xc9,0x7b] + {evex} imull $123, %ecx, %ecx +# CHECK: {nf} imull $123, %ecx, %ecx +# CHECK: encoding: [0x62,0xf4,0x7c,0x0c,0x6b,0xc9,0x7b] + {nf} imull $123, %ecx, %ecx +# CHECK: {evex} imulq $123, %r9, %r9 +# CHECK: encoding: [0x62,0x54,0xfc,0x08,0x6b,0xc9,0x7b] + {evex} imulq $123, %r9, %r9 +# CHECK: {nf} imulq $123, %r9, %r9 +# CHECK: encoding: [0x62,0x54,0xfc,0x0c,0x6b,0xc9,0x7b] + {nf} imulq $123, %r9, %r9 +# CHECK: {evex} imulw $123, 291(%r8,%rax,4), %dx +# CHECK: encoding: [0x62,0xd4,0x7d,0x08,0x6b,0x94,0x80,0x23,0x01,0x00,0x00,0x7b] + {evex} imulw $123, 291(%r8,%rax,4), %dx +# CHECK: {nf} imulw $123, 291(%r8,%rax,4), %dx +# CHECK: encoding: [0x62,0xd4,0x7d,0x0c,0x6b,0x94,0x80,0x23,0x01,0x00,0x00,0x7b] + {nf} imulw $123, 291(%r8,%rax,4), %dx +# CHECK: {evex} imull $123, 291(%r8,%rax,4), %ecx +# CHECK: encoding: [0x62,0xd4,0x7c,0x08,0x6b,0x8c,0x80,0x23,0x01,0x00,0x00,0x7b] + {evex} imull $123, 291(%r8,%rax,4), %ecx +# CHECK: {nf} imull $123, 291(%r8,%rax,4), %ecx +# CHECK: encoding: [0x62,0xd4,0x7c,0x0c,0x6b,0x8c,0x80,0x23,0x01,0x00,0x00,0x7b] + {nf} imull $123, 291(%r8,%rax,4), %ecx +# CHECK: {evex} imulq $123, 291(%r8,%rax,4), %r9 +# CHECK: encoding: [0x62,0x54,0xfc,0x08,0x6b,0x8c,0x80,0x23,0x01,0x00,0x00,0x7b] + {evex} imulq $123, 291(%r8,%rax,4), %r9 +# CHECK: {nf} imulq $123, 291(%r8,%rax,4), %r9 +# CHECK: encoding: [0x62,0x54,0xfc,0x0c,0x6b,0x8c,0x80,0x23,0x01,0x00,0x00,0x7b] + {nf} imulq $123, 291(%r8,%rax,4), %r9 +# CHECK: {evex} imulw $1234, %dx, %dx +# CHECK: encoding: [0x62,0xf4,0x7d,0x08,0x69,0xd2,0xd2,0x04] + {evex} imulw $1234, %dx, %dx +# CHECK: {nf} imulw $1234, %dx, %dx +# CHECK: encoding: [0x62,0xf4,0x7d,0x0c,0x69,0xd2,0xd2,0x04] + {nf} imulw $1234, %dx, %dx +# CHECK: {evex} imulw $1234, 291(%r8,%rax,4), %dx +# CHECK: encoding: [0x62,0xd4,0x7d,0x08,0x69,0x94,0x80,0x23,0x01,0x00,0x00,0xd2,0x04] + {evex} imulw $1234, 291(%r8,%rax,4), %dx +# CHECK: {nf} imulw $1234, 291(%r8,%rax,4), %dx +# CHECK: encoding: [0x62,0xd4,0x7d,0x0c,0x69,0x94,0x80,0x23,0x01,0x00,0x00,0xd2,0x04] + {nf} imulw $1234, 291(%r8,%rax,4), %dx +# CHECK: {evex} imull $123456, %ecx, %ecx +# CHECK: encoding: [0x62,0xf4,0x7c,0x08,0x69,0xc9,0x40,0xe2,0x01,0x00] + {evex} imull $123456, %ecx, %ecx +# CHECK: {nf} imull $123456, %ecx, %ecx +# CHECK: encoding: [0x62,0xf4,0x7c,0x0c,0x69,0xc9,0x40,0xe2,0x01,0x00] + {nf} imull $123456, %ecx, %ecx +# CHECK: {evex} imulq $123456, %r9, %r9 +# CHECK: encoding: [0x62,0x54,0xfc,0x08,0x69,0xc9,0x40,0xe2,0x01,0x00] + {evex} imulq $123456, %r9, %r9 +# CHECK: {nf} imulq $123456, %r9, %r9 +# CHECK: encoding: [0x62,0x54,0xfc,0x0c,0x69,0xc9,0x40,0xe2,0x01,0x00] + {nf} imulq $123456, %r9, %r9 +# CHECK: {evex} imull $123456, 291(%r8,%rax,4), %ecx +# CHECK: encoding: [0x62,0xd4,0x7c,0x08,0x69,0x8c,0x80,0x23,0x01,0x00,0x00,0x40,0xe2,0x01,0x00] + {evex} imull $123456, 291(%r8,%rax,4), %ecx +# CHECK: {nf} imull $123456, 291(%r8,%rax,4), %ecx +# CHECK: encoding: [0x62,0xd4,0x7c,0x0c,0x69,0x8c,0x80,0x23,0x01,0x00,0x00,0x40,0xe2,0x01,0x00] + {nf} imull $123456, 291(%r8,%rax,4), %ecx +# CHECK: {evex} imulq $123456, 291(%r8,%rax,4), %r9 +# CHECK: encoding: [0x62,0x54,0xfc,0x08,0x69,0x8c,0x80,0x23,0x01,0x00,0x00,0x40,0xe2,0x01,0x00] + {evex} imulq $123456, 291(%r8,%rax,4), %r9 +# CHECK: {nf} imulq $123456, 291(%r8,%rax,4), %r9 +# CHECK: encoding: [0x62,0x54,0xfc,0x0c,0x69,0x8c,0x80,0x23,0x01,0x00,0x00,0x40,0xe2,0x01,0x00] + {nf} imulq $123456, 291(%r8,%rax,4), %r9 +# CHECK: {evex} imulb %bl +# CHECK: encoding: [0x62,0xf4,0x7c,0x08,0xf6,0xeb] + {evex} imulb %bl +# CHECK: {nf} imulb %bl +# CHECK: encoding: [0x62,0xf4,0x7c,0x0c,0xf6,0xeb] + {nf} imulb %bl +# CHECK: {evex} imulw %dx +# CHECK: encoding: [0x62,0xf4,0x7d,0x08,0xf7,0xea] + {evex} imulw %dx +# CHECK: {nf} imulw %dx +# CHECK: encoding: [0x62,0xf4,0x7d,0x0c,0xf7,0xea] + {nf} imulw %dx +# CHECK: {evex} imulw %dx, %dx +# CHECK: encoding: [0x62,0xf4,0x7d,0x08,0xaf,0xd2] + {evex} imulw %dx, %dx +# CHECK: {nf} imulw %dx, %dx +# CHECK: encoding: [0x62,0xf4,0x7d,0x0c,0xaf,0xd2] + {nf} imulw %dx, %dx +# CHECK: imulw %dx, %dx, %dx +# CHECK: encoding: [0x62,0xf4,0x6d,0x18,0xaf,0xd2] + imulw %dx, %dx, %dx +# CHECK: {nf} imulw %dx, %dx, %dx +# CHECK: encoding: [0x62,0xf4,0x6d,0x1c,0xaf,0xd2] + {nf} imulw %dx, %dx, %dx +# CHECK: {evex} imull %ecx +# CHECK: encoding: [0x62,0xf4,0x7c,0x08,0xf7,0xe9] + {evex} imull %ecx +# CHECK: {nf} imull %ecx +# CHECK: encoding: [0x62,0xf4,0x7c,0x0c,0xf7,0xe9] + {nf} imull %ecx +# CHECK: {evex} imull %ecx, %ecx +# CHECK: encoding: [0x62,0xf4,0x7c,0x08,0xaf,0xc9] + {evex} imull %ecx, %ecx +# CHECK: {nf} imull %ecx, %ecx +# CHECK: encoding: [0x62,0xf4,0x7c,0x0c,0xaf,0xc9] + {nf} imull %ecx, %ecx +# CHECK: imull %ecx, %ecx, %ecx +# CHECK: encoding: [0x62,0xf4,0x74,0x18,0xaf,0xc9] + imull %ecx, %ecx, %ecx +# CHECK: {nf} imull %ecx, %ecx, %ecx +# CHECK: encoding: [0x62,0xf4,0x74,0x1c,0xaf,0xc9] + {nf} imull %ecx, %ecx, %ecx +# CHECK: {evex} imulq %r9 +# CHECK: encoding: [0x62,0xd4,0xfc,0x08,0xf7,0xe9] + {evex} imulq %r9 +# CHECK: {nf} imulq %r9 +# CHECK: encoding: [0x62,0xd4,0xfc,0x0c,0xf7,0xe9] + {nf} imulq %r9 +# CHECK: {evex} imulq %r9, %r9 +# CHECK: encoding: [0x62,0x54,0xfc,0x08,0xaf,0xc9] + {evex} imulq %r9, %r9 +# CHECK: {nf} imulq %r9, %r9 +# CHECK: encoding: [0x62,0x54,0xfc,0x0c,0xaf,0xc9] + {nf} imulq %r9, %r9 +# CHECK: imulq %r9, %r9, %r9 +# CHECK: encoding: [0x62,0x54,0xb4,0x18,0xaf,0xc9] + imulq %r9, %r9, %r9 +# CHECK: {nf} imulq %r9, %r9, %r9 +# CHECK: encoding: [0x62,0x54,0xb4,0x1c,0xaf,0xc9] + {nf} imulq %r9, %r9, %r9 +# CHECK: {evex} imulb 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0x7c,0x08,0xf6,0xac,0x80,0x23,0x01,0x00,0x00] + {evex} imulb 291(%r8,%rax,4) +# CHECK: {nf} imulb 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0x7c,0x0c,0xf6,0xac,0x80,0x23,0x01,0x00,0x00] + {nf} imulb 291(%r8,%rax,4) +# CHECK: {evex} imulw 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0x7d,0x08,0xf7,0xac,0x80,0x23,0x01,0x00,0x00] + {evex} imulw 291(%r8,%rax,4) +# CHECK: {nf} imulw 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0x7d,0x0c,0xf7,0xac,0x80,0x23,0x01,0x00,0x00] + {nf} imulw 291(%r8,%rax,4) +# CHECK: {evex} imulw 291(%r8,%rax,4), %dx +# CHECK: encoding: [0x62,0xd4,0x7d,0x08,0xaf,0x94,0x80,0x23,0x01,0x00,0x00] + {evex} imulw 291(%r8,%rax,4), %dx +# CHECK: {nf} imulw 291(%r8,%rax,4), %dx +# CHECK: encoding: [0x62,0xd4,0x7d,0x0c,0xaf,0x94,0x80,0x23,0x01,0x00,0x00] + {nf} imulw 291(%r8,%rax,4), %dx +# CHECK: imulw 291(%r8,%rax,4), %dx, %dx +# CHECK: encoding: [0x62,0xd4,0x6d,0x18,0xaf,0x94,0x80,0x23,0x01,0x00,0x00] + imulw 291(%r8,%rax,4), %dx, %dx +# CHECK: {nf} imulw 291(%r8,%rax,4), %dx, %dx +# CHECK: encoding: [0x62,0xd4,0x6d,0x1c,0xaf,0x94,0x80,0x23,0x01,0x00,0x00] + {nf} imulw 291(%r8,%rax,4), %dx, %dx +# CHECK: {evex} imull 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0x7c,0x08,0xf7,0xac,0x80,0x23,0x01,0x00,0x00] + {evex} imull 291(%r8,%rax,4) +# CHECK: {nf} imull 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0x7c,0x0c,0xf7,0xac,0x80,0x23,0x01,0x00,0x00] + {nf} imull 291(%r8,%rax,4) +# CHECK: {evex} imull 291(%r8,%rax,4), %ecx +# CHECK: encoding: [0x62,0xd4,0x7c,0x08,0xaf,0x8c,0x80,0x23,0x01,0x00,0x00] + {evex} imull 291(%r8,%rax,4), %ecx +# CHECK: {nf} imull 291(%r8,%rax,4), %ecx +# CHECK: encoding: [0x62,0xd4,0x7c,0x0c,0xaf,0x8c,0x80,0x23,0x01,0x00,0x00] + {nf} imull 291(%r8,%rax,4), %ecx +# CHECK: imull 291(%r8,%rax,4), %ecx, %ecx +# CHECK: encoding: [0x62,0xd4,0x74,0x18,0xaf,0x8c,0x80,0x23,0x01,0x00,0x00] + imull 291(%r8,%rax,4), %ecx, %ecx +# CHECK: {nf} imull 291(%r8,%rax,4), %ecx, %ecx +# CHECK: encoding: [0x62,0xd4,0x74,0x1c,0xaf,0x8c,0x80,0x23,0x01,0x00,0x00] + {nf} imull 291(%r8,%rax,4), %ecx, %ecx +# CHECK: {evex} imulq 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0xfc,0x08,0xf7,0xac,0x80,0x23,0x01,0x00,0x00] + {evex} imulq 291(%r8,%rax,4) +# CHECK: {nf} imulq 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0xfc,0x0c,0xf7,0xac,0x80,0x23,0x01,0x00,0x00] + {nf} imulq 291(%r8,%rax,4) +# CHECK: {evex} imulq 291(%r8,%rax,4), %r9 +# CHECK: encoding: [0x62,0x54,0xfc,0x08,0xaf,0x8c,0x80,0x23,0x01,0x00,0x00] + {evex} imulq 291(%r8,%rax,4), %r9 +# CHECK: {nf} imulq 291(%r8,%rax,4), %r9 +# CHECK: encoding: [0x62,0x54,0xfc,0x0c,0xaf,0x8c,0x80,0x23,0x01,0x00,0x00] + {nf} imulq 291(%r8,%rax,4), %r9 +# CHECK: imulq 291(%r8,%rax,4), %r9, %r9 +# CHECK: encoding: [0x62,0x54,0xb4,0x18,0xaf,0x8c,0x80,0x23,0x01,0x00,0x00] + imulq 291(%r8,%rax,4), %r9, %r9 +# CHECK: {nf} imulq 291(%r8,%rax,4), %r9, %r9 +# CHECK: encoding: [0x62,0x54,0xb4,0x1c,0xaf,0x8c,0x80,0x23,0x01,0x00,0x00] + {nf} imulq 291(%r8,%rax,4), %r9, %r9 diff --git a/llvm/test/MC/X86/apx/imul-intel.s b/llvm/test/MC/X86/apx/imul-intel.s new file mode 100644 index 0000000000000..b629272afa467 --- /dev/null +++ b/llvm/test/MC/X86/apx/imul-intel.s @@ -0,0 +1,194 @@ +# RUN: llvm-mc -triple x86_64 -show-encoding -x86-asm-syntax=intel -output-asm-variant=1 %s | FileCheck %s + +# CHECK: {evex} imul dx, dx, 123 +# CHECK: encoding: [0x62,0xf4,0x7d,0x08,0x6b,0xd2,0x7b] + {evex} imul dx, dx, 123 +# CHECK: {nf} imul dx, dx, 123 +# CHECK: encoding: [0x62,0xf4,0x7d,0x0c,0x6b,0xd2,0x7b] + {nf} imul dx, dx, 123 +# CHECK: {evex} imul ecx, ecx, 123 +# CHECK: encoding: [0x62,0xf4,0x7c,0x08,0x6b,0xc9,0x7b] + {evex} imul ecx, ecx, 123 +# CHECK: {nf} imul ecx, ecx, 123 +# CHECK: encoding: [0x62,0xf4,0x7c,0x0c,0x6b,0xc9,0x7b] + {nf} imul ecx, ecx, 123 +# CHECK: {evex} imul r9, r9, 123 +# CHECK: encoding: [0x62,0x54,0xfc,0x08,0x6b,0xc9,0x7b] + {evex} imul r9, r9, 123 +# CHECK: {nf} imul r9, r9, 123 +# CHECK: encoding: [0x62,0x54,0xfc,0x0c,0x6b,0xc9,0x7b] + {nf} imul r9, r9, 123 +# CHECK: {evex} imul dx, word ptr [r8 + 4*rax + 291], 123 +# CHECK: encoding: [0x62,0xd4,0x7d,0x08,0x6b,0x94,0x80,0x23,0x01,0x00,0x00,0x7b] + {evex} imul dx, word ptr [r8 + 4*rax + 291], 123 +# CHECK: {nf} imul dx, word ptr [r8 + 4*rax + 291], 123 +# CHECK: encoding: [0x62,0xd4,0x7d,0x0c,0x6b,0x94,0x80,0x23,0x01,0x00,0x00,0x7b] + {nf} imul dx, word ptr [r8 + 4*rax + 291], 123 +# CHECK: {evex} imul ecx, dword ptr [r8 + 4*rax + 291], 123 +# CHECK: encoding: [0x62,0xd4,0x7c,0x08,0x6b,0x8c,0x80,0x23,0x01,0x00,0x00,0x7b] + {evex} imul ecx, dword ptr [r8 + 4*rax + 291], 123 +# CHECK: {nf} imul ecx, dword ptr [r8 + 4*rax + 291], 123 +# CHECK: encoding: [0x62,0xd4,0x7c,0x0c,0x6b,0x8c,0x80,0x23,0x01,0x00,0x00,0x7b] + {nf} imul ecx, dword ptr [r8 + 4*rax + 291], 123 +# CHECK: {evex} imul r9, qword ptr [r8 + 4*rax + 291], 123 +# CHECK: encoding: [0x62,0x54,0xfc,0x08,0x6b,0x8c,0x80,0x23,0x01,0x00,0x00,0x7b] + {evex} imul r9, qword ptr [r8 + 4*rax + 291], 123 +# CHECK: {nf} imul r9, qword ptr [r8 + 4*rax + 291], 123 +# CHECK: encoding: [0x62,0x54,0xfc,0x0c,0x6b,0x8c,0x80,0x23,0x01,0x00,0x00,0x7b] + {nf} imul r9, qword ptr [r8 + 4*rax + 291], 123 +# CHECK: {evex} imul dx, dx, 1234 +# CHECK: encoding: [0x62,0xf4,0x7d,0x08,0x69,0xd2,0xd2,0x04] + {evex} imul dx, dx, 1234 +# CHECK: {nf} imul dx, dx, 1234 +# CHECK: encoding: [0x62,0xf4,0x7d,0x0c,0x69,0xd2,0xd2,0x04] + {nf} imul dx, dx, 1234 +# CHECK: {evex} imul dx, word ptr [r8 + 4*rax + 291], 1234 +# CHECK: encoding: [0x62,0xd4,0x7d,0x08,0x69,0x94,0x80,0x23,0x01,0x00,0x00,0xd2,0x04] + {evex} imul dx, word ptr [r8 + 4*rax + 291], 1234 +# CHECK: {nf} imul dx, word ptr [r8 + 4*rax + 291], 1234 +# CHECK: encoding: [0x62,0xd4,0x7d,0x0c,0x69,0x94,0x80,0x23,0x01,0x00,0x00,0xd2,0x04] + {nf} imul dx, word ptr [r8 + 4*rax + 291], 1234 +# CHECK: {evex} imul ecx, ecx, 123456 +# CHECK: encoding: [0x62,0xf4,0x7c,0x08,0x69,0xc9,0x40,0xe2,0x01,0x00] + {evex} imul ecx, ecx, 123456 +# CHECK: {nf} imul ecx, ecx, 123456 +# CHECK: encoding: [0x62,0xf4,0x7c,0x0c,0x69,0xc9,0x40,0xe2,0x01,0x00] + {nf} imul ecx, ecx, 123456 +# CHECK: {evex} imul r9, r9, 123456 +# CHECK: encoding: [0x62,0x54,0xfc,0x08,0x69,0xc9,0x40,0xe2,0x01,0x00] + {evex} imul r9, r9, 123456 +# CHECK: {nf} imul r9, r9, 123456 +# CHECK: encoding: [0x62,0x54,0xfc,0x0c,0x69,0xc9,0x40,0xe2,0x01,0x00] + {nf} imul r9, r9, 123456 +# CHECK: {evex} imul ecx, dword ptr [r8 + 4*rax + 291], 123456 +# CHECK: encoding: [0x62,0xd4,0x7c,0x08,0x69,0x8c,0x80,0x23,0x01,0x00,0x00,0x40,0xe2,0x01,0x00] + {evex} imul ecx, dword ptr [r8 + 4*rax + 291], 123456 +# CHECK: {nf} imul ecx, dword ptr [r8 + 4*rax + 291], 123456 +# CHECK: encoding: [0x62,0xd4,0x7c,0x0c,0x69,0x8c,0x80,0x23,0x01,0x00,0x00,0x40,0xe2,0x01,0x00] + {nf} imul ecx, dword ptr [r8 + 4*rax + 291], 123456 +# CHECK: {evex} imul r9, qword ptr [r8 + 4*rax + 291], 123456 +# CHECK: encoding: [0x62,0x54,0xfc,0x08,0x69,0x8c,0x80,0x23,0x01,0x00,0x00,0x40,0xe2,0x01,0x00] + {evex} imul r9, qword ptr [r8 + 4*rax + 291], 123456 +# CHECK: {nf} imul r9, qword ptr [r8 + 4*rax + 291], 123456 +# CHECK: encoding: [0x62,0x54,0xfc,0x0c,0x69,0x8c,0x80,0x23,0x01,0x00,0x00,0x40,0xe2,0x01,0x00] + {nf} imul r9, qword ptr [r8 + 4*rax + 291], 123456 +# CHECK: {evex} imul bl +# CHECK: encoding: [0x62,0xf4,0x7c,0x08,0xf6,0xeb] + {evex} imul bl +# CHECK: {nf} imul bl +# CHECK: encoding: [0x62,0xf4,0x7c,0x0c,0xf6,0xeb] + {nf} imul bl +# CHECK: {evex} imul dx +# CHECK: encoding: [0x62,0xf4,0x7d,0x08,0xf7,0xea] + {evex} imul dx +# CHECK: {nf} imul dx +# CHECK: encoding: [0x62,0xf4,0x7d,0x0c,0xf7,0xea] + {nf} imul dx +# CHECK: {evex} imul dx, dx +# CHECK: encoding: [0x62,0xf4,0x7d,0x08,0xaf,0xd2] + {evex} imul dx, dx +# CHECK: {nf} imul dx, dx +# CHECK: encoding: [0x62,0xf4,0x7d,0x0c,0xaf,0xd2] + {nf} imul dx, dx +# CHECK: imul dx, dx, dx +# CHECK: encoding: [0x62,0xf4,0x6d,0x18,0xaf,0xd2] + imul dx, dx, dx +# CHECK: {nf} imul dx, dx, dx +# CHECK: encoding: [0x62,0xf4,0x6d,0x1c,0xaf,0xd2] + {nf} imul dx, dx, dx +# CHECK: {evex} imul ecx +# CHECK: encoding: [0x62,0xf4,0x7c,0x08,0xf7,0xe9] + {evex} imul ecx +# CHECK: {nf} imul ecx +# CHECK: encoding: [0x62,0xf4,0x7c,0x0c,0xf7,0xe9] + {nf} imul ecx +# CHECK: {evex} imul ecx, ecx +# CHECK: encoding: [0x62,0xf4,0x7c,0x08,0xaf,0xc9] + {evex} imul ecx, ecx +# CHECK: {nf} imul ecx, ecx +# CHECK: encoding: [0x62,0xf4,0x7c,0x0c,0xaf,0xc9] + {nf} imul ecx, ecx +# CHECK: imul ecx, ecx, ecx +# CHECK: encoding: [0x62,0xf4,0x74,0x18,0xaf,0xc9] + imul ecx, ecx, ecx +# CHECK: {nf} imul ecx, ecx, ecx +# CHECK: encoding: [0x62,0xf4,0x74,0x1c,0xaf,0xc9] + {nf} imul ecx, ecx, ecx +# CHECK: {evex} imul r9 +# CHECK: encoding: [0x62,0xd4,0xfc,0x08,0xf7,0xe9] + {evex} imul r9 +# CHECK: {nf} imul r9 +# CHECK: encoding: [0x62,0xd4,0xfc,0x0c,0xf7,0xe9] + {nf} imul r9 +# CHECK: {evex} imul r9, r9 +# CHECK: encoding: [0x62,0x54,0xfc,0x08,0xaf,0xc9] + {evex} imul r9, r9 +# CHECK: {nf} imul r9, r9 +# CHECK: encoding: [0x62,0x54,0xfc,0x0c,0xaf,0xc9] + {nf} imul r9, r9 +# CHECK: imul r9, r9, r9 +# CHECK: encoding: [0x62,0x54,0xb4,0x18,0xaf,0xc9] + imul r9, r9, r9 +# CHECK: {nf} imul r9, r9, r9 +# CHECK: encoding: [0x62,0x54,0xb4,0x1c,0xaf,0xc9] + {nf} imul r9, r9, r9 +# CHECK: {evex} imul byte ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x7c,0x08,0xf6,0xac,0x80,0x23,0x01,0x00,0x00] + {evex} imul byte ptr [r8 + 4*rax + 291] +# CHECK: {nf} imul byte ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x7c,0x0c,0xf6,0xac,0x80,0x23,0x01,0x00,0x00] + {nf} imul byte ptr [r8 + 4*rax + 291] +# CHECK: {evex} imul word ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x7d,0x08,0xf7,0xac,0x80,0x23,0x01,0x00,0x00] + {evex} imul word ptr [r8 + 4*rax + 291] +# CHECK: {nf} imul word ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x7d,0x0c,0xf7,0xac,0x80,0x23,0x01,0x00,0x00] + {nf} imul word ptr [r8 + 4*rax + 291] +# CHECK: {evex} imul dx, word ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x7d,0x08,0xaf,0x94,0x80,0x23,0x01,0x00,0x00] + {evex} imul dx, word ptr [r8 + 4*rax + 291] +# CHECK: {nf} imul dx, word ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x7d,0x0c,0xaf,0x94,0x80,0x23,0x01,0x00,0x00] + {nf} imul dx, word ptr [r8 + 4*rax + 291] +# CHECK: imul dx, dx, word ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x6d,0x18,0xaf,0x94,0x80,0x23,0x01,0x00,0x00] + imul dx, dx, word ptr [r8 + 4*rax + 291] +# CHECK: {nf} imul dx, dx, word ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x6d,0x1c,0xaf,0x94,0x80,0x23,0x01,0x00,0x00] + {nf} imul dx, dx, word ptr [r8 + 4*rax + 291] +# CHECK: {evex} imul dword ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x7c,0x08,0xf7,0xac,0x80,0x23,0x01,0x00,0x00] + {evex} imul dword ptr [r8 + 4*rax + 291] +# CHECK: {nf} imul dword ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x7c,0x0c,0xf7,0xac,0x80,0x23,0x01,0x00,0x00] + {nf} imul dword ptr [r8 + 4*rax + 291] +# CHECK: {evex} imul ecx, dword ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x7c,0x08,0xaf,0x8c,0x80,0x23,0x01,0x00,0x00] + {evex} imul ecx, dword ptr [r8 + 4*rax + 291] +# CHECK: {nf} imul ecx, dword ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x7c,0x0c,0xaf,0x8c,0x80,0x23,0x01,0x00,0x00] + {nf} imul ecx, dword ptr [r8 + 4*rax + 291] +# CHECK: imul ecx, ecx, dword ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x74,0x18,0xaf,0x8c,0x80,0x23,0x01,0x00,0x00] + imul ecx, ecx, dword ptr [r8 + 4*rax + 291] +# CHECK: {nf} imul ecx, ecx, dword ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x74,0x1c,0xaf,0x8c,0x80,0x23,0x01,0x00,0x00] + {nf} imul ecx, ecx, dword ptr [r8 + 4*rax + 291] +# CHECK: {evex} imul qword ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0xfc,0x08,0xf7,0xac,0x80,0x23,0x01,0x00,0x00] + {evex} imul qword ptr [r8 + 4*rax + 291] +# CHECK: {nf} imul qword ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0xfc,0x0c,0xf7,0xac,0x80,0x23,0x01,0x00,0x00] + {nf} imul qword ptr [r8 + 4*rax + 291] +# CHECK: {evex} imul r9, qword ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0x54,0xfc,0x08,0xaf,0x8c,0x80,0x23,0x01,0x00,0x00] + {evex} imul r9, qword ptr [r8 + 4*rax + 291] +# CHECK: {nf} imul r9, qword ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0x54,0xfc,0x0c,0xaf,0x8c,0x80,0x23,0x01,0x00,0x00] + {nf} imul r9, qword ptr [r8 + 4*rax + 291] +# CHECK: imul r9, r9, qword ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0x54,0xb4,0x18,0xaf,0x8c,0x80,0x23,0x01,0x00,0x00] + imul r9, r9, qword ptr [r8 + 4*rax + 291] +# CHECK: {nf} imul r9, r9, qword ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0x54,0xb4,0x1c,0xaf,0x8c,0x80,0x23,0x01,0x00,0x00] + {nf} imul r9, r9, qword ptr [r8 + 4*rax + 291] diff --git a/llvm/test/MC/X86/apx/mul-att.s b/llvm/test/MC/X86/apx/mul-att.s new file mode 100644 index 0000000000000..d40123bae23bb --- /dev/null +++ b/llvm/test/MC/X86/apx/mul-att.s @@ -0,0 +1,53 @@ +# RUN: llvm-mc -triple x86_64 -show-encoding %s | FileCheck %s +# RUN: not llvm-mc -triple i386 -show-encoding %s 2>&1 | FileCheck %s --check-prefix=ERROR + +# ERROR-COUNT-16: error: +# ERROR-NOT: error: +# CHECK: {evex} mulb %bl +# CHECK: encoding: [0x62,0xf4,0x7c,0x08,0xf6,0xe3] + {evex} mulb %bl +# CHECK: {nf} mulb %bl +# CHECK: encoding: [0x62,0xf4,0x7c,0x0c,0xf6,0xe3] + {nf} mulb %bl +# CHECK: {evex} mulw %dx +# CHECK: encoding: [0x62,0xf4,0x7d,0x08,0xf7,0xe2] + {evex} mulw %dx +# CHECK: {nf} mulw %dx +# CHECK: encoding: [0x62,0xf4,0x7d,0x0c,0xf7,0xe2] + {nf} mulw %dx +# CHECK: {evex} mull %ecx +# CHECK: encoding: [0x62,0xf4,0x7c,0x08,0xf7,0xe1] + {evex} mull %ecx +# CHECK: {nf} mull %ecx +# CHECK: encoding: [0x62,0xf4,0x7c,0x0c,0xf7,0xe1] + {nf} mull %ecx +# CHECK: {evex} mulq %r9 +# CHECK: encoding: [0x62,0xd4,0xfc,0x08,0xf7,0xe1] + {evex} mulq %r9 +# CHECK: {nf} mulq %r9 +# CHECK: encoding: [0x62,0xd4,0xfc,0x0c,0xf7,0xe1] + {nf} mulq %r9 +# CHECK: {evex} mulb 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0x7c,0x08,0xf6,0xa4,0x80,0x23,0x01,0x00,0x00] + {evex} mulb 291(%r8,%rax,4) +# CHECK: {nf} mulb 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0x7c,0x0c,0xf6,0xa4,0x80,0x23,0x01,0x00,0x00] + {nf} mulb 291(%r8,%rax,4) +# CHECK: {evex} mulw 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0x7d,0x08,0xf7,0xa4,0x80,0x23,0x01,0x00,0x00] + {evex} mulw 291(%r8,%rax,4) +# CHECK: {nf} mulw 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0x7d,0x0c,0xf7,0xa4,0x80,0x23,0x01,0x00,0x00] + {nf} mulw 291(%r8,%rax,4) +# CHECK: {evex} mull 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0x7c,0x08,0xf7,0xa4,0x80,0x23,0x01,0x00,0x00] + {evex} mull 291(%r8,%rax,4) +# CHECK: {nf} mull 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0x7c,0x0c,0xf7,0xa4,0x80,0x23,0x01,0x00,0x00] + {nf} mull 291(%r8,%rax,4) +# CHECK: {evex} mulq 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0xfc,0x08,0xf7,0xa4,0x80,0x23,0x01,0x00,0x00] + {evex} mulq 291(%r8,%rax,4) +# CHECK: {nf} mulq 291(%r8,%rax,4) +# CHECK: encoding: [0x62,0xd4,0xfc,0x0c,0xf7,0xa4,0x80,0x23,0x01,0x00,0x00] + {nf} mulq 291(%r8,%rax,4) diff --git a/llvm/test/MC/X86/apx/mul-intel.s b/llvm/test/MC/X86/apx/mul-intel.s new file mode 100644 index 0000000000000..11598addfb512 --- /dev/null +++ b/llvm/test/MC/X86/apx/mul-intel.s @@ -0,0 +1,50 @@ +# RUN: llvm-mc -triple x86_64 -show-encoding -x86-asm-syntax=intel -output-asm-variant=1 %s | FileCheck %s + +# CHECK: {evex} mul bl +# CHECK: encoding: [0x62,0xf4,0x7c,0x08,0xf6,0xe3] + {evex} mul bl +# CHECK: {nf} mul bl +# CHECK: encoding: [0x62,0xf4,0x7c,0x0c,0xf6,0xe3] + {nf} mul bl +# CHECK: {evex} mul dx +# CHECK: encoding: [0x62,0xf4,0x7d,0x08,0xf7,0xe2] + {evex} mul dx +# CHECK: {nf} mul dx +# CHECK: encoding: [0x62,0xf4,0x7d,0x0c,0xf7,0xe2] + {nf} mul dx +# CHECK: {evex} mul ecx +# CHECK: encoding: [0x62,0xf4,0x7c,0x08,0xf7,0xe1] + {evex} mul ecx +# CHECK: {nf} mul ecx +# CHECK: encoding: [0x62,0xf4,0x7c,0x0c,0xf7,0xe1] + {nf} mul ecx +# CHECK: {evex} mul r9 +# CHECK: encoding: [0x62,0xd4,0xfc,0x08,0xf7,0xe1] + {evex} mul r9 +# CHECK: {nf} mul r9 +# CHECK: encoding: [0x62,0xd4,0xfc,0x0c,0xf7,0xe1] + {nf} mul r9 +# CHECK: {evex} mul byte ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x7c,0x08,0xf6,0xa4,0x80,0x23,0x01,0x00,0x00] + {evex} mul byte ptr [r8 + 4*rax + 291] +# CHECK: {nf} mul byte ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x7c,0x0c,0xf6,0xa4,0x80,0x23,0x01,0x00,0x00] + {nf} mul byte ptr [r8 + 4*rax + 291] +# CHECK: {evex} mul word ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x7d,0x08,0xf7,0xa4,0x80,0x23,0x01,0x00,0x00] + {evex} mul word ptr [r8 + 4*rax + 291] +# CHECK: {nf} mul word ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x7d,0x0c,0xf7,0xa4,0x80,0x23,0x01,0x00,0x00] + {nf} mul word ptr [r8 + 4*rax + 291] +# CHECK: {evex} mul dword ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x7c,0x08,0xf7,0xa4,0x80,0x23,0x01,0x00,0x00] + {evex} mul dword ptr [r8 + 4*rax + 291] +# CHECK: {nf} mul dword ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0x7c,0x0c,0xf7,0xa4,0x80,0x23,0x01,0x00,0x00] + {nf} mul dword ptr [r8 + 4*rax + 291] +# CHECK: {evex} mul qword ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0xfc,0x08,0xf7,0xa4,0x80,0x23,0x01,0x00,0x00] + {evex} mul qword ptr [r8 + 4*rax + 291] +# CHECK: {nf} mul qword ptr [r8 + 4*rax + 291] +# CHECK: encoding: [0x62,0xd4,0xfc,0x0c,0xf7,0xa4,0x80,0x23,0x01,0x00,0x00] + {nf} mul qword ptr [r8 + 4*rax + 291] diff --git a/llvm/test/TableGen/x86-fold-tables.inc b/llvm/test/TableGen/x86-fold-tables.inc index 4e37285b08ba2..02e4ae52cc914 100644 --- a/llvm/test/TableGen/x86-fold-tables.inc +++ b/llvm/test/TableGen/x86-fold-tables.inc @@ -304,18 +304,30 @@ static const X86FoldTableEntry Table0[] = { {X86::CMP8ri8, X86::CMP8mi8, TB_FOLDED_LOAD}, {X86::CMP8rr, X86::CMP8mr, TB_FOLDED_LOAD}, {X86::DIV16r, X86::DIV16m, TB_FOLDED_LOAD}, + {X86::DIV16r_NF, X86::DIV16m_NF, TB_FOLDED_LOAD}, {X86::DIV32r, X86::DIV32m, TB_FOLDED_LOAD}, + {X86::DIV32r_NF, X86::DIV32m_NF, TB_FOLDED_LOAD}, {X86::DIV64r, X86::DIV64m, TB_FOLDED_LOAD}, + {X86::DIV64r_NF, X86::DIV64m_NF, TB_FOLDED_LOAD}, {X86::DIV8r, X86::DIV8m, TB_FOLDED_LOAD}, + {X86::DIV8r_NF, X86::DIV8m_NF, TB_FOLDED_LOAD}, {X86::EXTRACTPSrr, X86::EXTRACTPSmr, TB_FOLDED_STORE}, {X86::IDIV16r, X86::IDIV16m, TB_FOLDED_LOAD}, + {X86::IDIV16r_NF, X86::IDIV16m_NF, TB_FOLDED_LOAD}, {X86::IDIV32r, X86::IDIV32m, TB_FOLDED_LOAD}, + {X86::IDIV32r_NF, X86::IDIV32m_NF, TB_FOLDED_LOAD}, {X86::IDIV64r, X86::IDIV64m, TB_FOLDED_LOAD}, + {X86::IDIV64r_NF, X86::IDIV64m_NF, TB_FOLDED_LOAD}, {X86::IDIV8r, X86::IDIV8m, TB_FOLDED_LOAD}, + {X86::IDIV8r_NF, X86::IDIV8m_NF, TB_FOLDED_LOAD}, {X86::IMUL16r, X86::IMUL16m, TB_FOLDED_LOAD}, + {X86::IMUL16r_NF, X86::IMUL16m_NF, TB_FOLDED_LOAD}, {X86::IMUL32r, X86::IMUL32m, TB_FOLDED_LOAD}, + {X86::IMUL32r_NF, X86::IMUL32m_NF, TB_FOLDED_LOAD}, {X86::IMUL64r, X86::IMUL64m, TB_FOLDED_LOAD}, + {X86::IMUL64r_NF, X86::IMUL64m_NF, TB_FOLDED_LOAD}, {X86::IMUL8r, X86::IMUL8m, TB_FOLDED_LOAD}, + {X86::IMUL8r_NF, X86::IMUL8m_NF, TB_FOLDED_LOAD}, {X86::JMP16r, X86::JMP16m, TB_FOLDED_LOAD}, {X86::JMP16r_NT, X86::JMP16m_NT, TB_FOLDED_LOAD}, {X86::JMP32r, X86::JMP32m, TB_FOLDED_LOAD}, @@ -347,9 +359,13 @@ static const X86FoldTableEntry Table0[] = { {X86::MOVUPDrr, X86::MOVUPDmr, TB_FOLDED_STORE|TB_NO_REVERSE}, {X86::MOVUPSrr, X86::MOVUPSmr, TB_FOLDED_STORE|TB_NO_REVERSE}, {X86::MUL16r, X86::MUL16m, TB_FOLDED_LOAD}, + {X86::MUL16r_NF, X86::MUL16m_NF, TB_FOLDED_LOAD}, {X86::MUL32r, X86::MUL32m, TB_FOLDED_LOAD}, + {X86::MUL32r_NF, X86::MUL32m_NF, TB_FOLDED_LOAD}, {X86::MUL64r, X86::MUL64m, TB_FOLDED_LOAD}, + {X86::MUL64r_NF, X86::MUL64m_NF, TB_FOLDED_LOAD}, {X86::MUL8r, X86::MUL8m, TB_FOLDED_LOAD}, + {X86::MUL8r_NF, X86::MUL8m_NF, TB_FOLDED_LOAD}, {X86::PEXTRDrr, X86::PEXTRDmr, TB_FOLDED_STORE}, {X86::PEXTRQrr, X86::PEXTRQmr, TB_FOLDED_STORE}, {X86::PTWRITE64r, X86::PTWRITE64m, TB_FOLDED_LOAD}, @@ -622,10 +638,16 @@ static const X86FoldTableEntry Table1[] = { {X86::DEC8r_NF_ND, X86::DEC8m_NF_ND, 0}, {X86::IMUL16rri, X86::IMUL16rmi, 0}, {X86::IMUL16rri8, X86::IMUL16rmi8, 0}, + {X86::IMUL16rri8_NF, X86::IMUL16rmi8_NF, 0}, + {X86::IMUL16rri_NF, X86::IMUL16rmi_NF, 0}, {X86::IMUL32rri, X86::IMUL32rmi, 0}, {X86::IMUL32rri8, X86::IMUL32rmi8, 0}, + {X86::IMUL32rri8_NF, X86::IMUL32rmi8_NF, 0}, + {X86::IMUL32rri_NF, X86::IMUL32rmi_NF, 0}, {X86::IMUL64rri32, X86::IMUL64rmi32, 0}, + {X86::IMUL64rri32_NF, X86::IMUL64rmi32_NF, 0}, {X86::IMUL64rri8, X86::IMUL64rmi8, 0}, + {X86::IMUL64rri8_NF, X86::IMUL64rmi8_NF, 0}, {X86::INC16r_ND, X86::INC16m_ND, 0}, {X86::INC16r_NF_ND, X86::INC16m_NF_ND, 0}, {X86::INC32r_ND, X86::INC32m_ND, 0}, @@ -1665,8 +1687,17 @@ static const X86FoldTableEntry Table2[] = { {X86::HSUBPDrr, X86::HSUBPDrm, TB_ALIGN_16}, {X86::HSUBPSrr, X86::HSUBPSrm, TB_ALIGN_16}, {X86::IMUL16rr, X86::IMUL16rm, 0}, + {X86::IMUL16rr_ND, X86::IMUL16rm_ND, 0}, + {X86::IMUL16rr_NF, X86::IMUL16rm_NF, 0}, + {X86::IMUL16rr_NF_ND, X86::IMUL16rm_NF_ND, 0}, {X86::IMUL32rr, X86::IMUL32rm, 0}, + {X86::IMUL32rr_ND, X86::IMUL32rm_ND, 0}, + {X86::IMUL32rr_NF, X86::IMUL32rm_NF, 0}, + {X86::IMUL32rr_NF_ND, X86::IMUL32rm_NF_ND, 0}, {X86::IMUL64rr, X86::IMUL64rm, 0}, + {X86::IMUL64rr_ND, X86::IMUL64rm_ND, 0}, + {X86::IMUL64rr_NF, X86::IMUL64rm_NF, 0}, + {X86::IMUL64rr_NF_ND, X86::IMUL64rm_NF_ND, 0}, {X86::MAXCPDrr, X86::MAXCPDrm, TB_ALIGN_16}, {X86::MAXCPSrr, X86::MAXCPSrm, TB_ALIGN_16}, {X86::MAXCSDrr, X86::MAXCSDrm, 0},