diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86ATTInstPrinter.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86ATTInstPrinter.cpp --- a/llvm/lib/Target/X86/MCTargetDesc/X86ATTInstPrinter.cpp +++ b/llvm/lib/Target/X86/MCTargetDesc/X86ATTInstPrinter.cpp @@ -176,11 +176,15 @@ if ((Desc.TSFlags & X86II::FormMask) == X86II::MRMSrcMem) { if (Desc.TSFlags & X86II::EVEX_B) { // Broadcast form. - // Load size is based on W-bit. - if (Desc.TSFlags & X86II::VEX_W) + // Load size is word for TA map. Otherwise it is based on W-bit. + if ((Desc.TSFlags & X86II::OpMapMask) == X86II::TA) { + assert(!(Desc.TSFlags & X86II::VEX_W) && "Unknown W-bit value!"); + printwordmem(MI, CurOp--, OS); + } else if (Desc.TSFlags & X86II::VEX_W) { printqwordmem(MI, CurOp--, OS); - else + } else { printdwordmem(MI, CurOp--, OS); + } // Print the number of elements broadcasted. unsigned NumElts; @@ -190,11 +194,19 @@ NumElts = (Desc.TSFlags & X86II::VEX_W) ? 4 : 8; else NumElts = (Desc.TSFlags & X86II::VEX_W) ? 2 : 4; - if ((Desc.TSFlags & X86II::OpMapMask) == X86II::TA) + if ((Desc.TSFlags & X86II::OpMapMask) == X86II::TA) { + assert(!(Desc.TSFlags & X86II::VEX_W) && "Unknown W-bit value!"); NumElts *= 2; + } OS << "{1to" << NumElts << "}"; } else { - if ((Desc.TSFlags & X86II::OpPrefixMask) == X86II::XS) + if ((Desc.TSFlags & X86II::OpMapMask) == X86II::TA && + (Desc.TSFlags & X86II::OpPrefixMask) == X86II::XS) + printwordmem(MI, CurOp--, OS); + else if ((Desc.TSFlags & X86II::OpMapMask) == X86II::TA && + (Desc.TSFlags & X86II::OpPrefixMask) == X86II::XD) + llvm_unreachable("Unexpected op prefix!"); + else if ((Desc.TSFlags & X86II::OpPrefixMask) == X86II::XS) printdwordmem(MI, CurOp--, OS); else if ((Desc.TSFlags & X86II::OpPrefixMask) == X86II::XD) printqwordmem(MI, CurOp--, OS); diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86IntelInstPrinter.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86IntelInstPrinter.cpp --- a/llvm/lib/Target/X86/MCTargetDesc/X86IntelInstPrinter.cpp +++ b/llvm/lib/Target/X86/MCTargetDesc/X86IntelInstPrinter.cpp @@ -132,6 +132,20 @@ case X86::VCMPPSZrrib: case X86::VCMPPSZrribk: case X86::VCMPSDZrrb_Int: case X86::VCMPSDZrrb_Intk: case X86::VCMPSSZrrb_Int: case X86::VCMPSSZrrb_Intk: + case X86::VCMPPHZ128rmi: case X86::VCMPPHZ128rri: + case X86::VCMPPHZ256rmi: case X86::VCMPPHZ256rri: + case X86::VCMPPHZrmi: case X86::VCMPPHZrri: + case X86::VCMPSHZrm: case X86::VCMPSHZrr: + case X86::VCMPSHZrm_Int: case X86::VCMPSHZrr_Int: + case X86::VCMPPHZ128rmik: case X86::VCMPPHZ128rrik: + case X86::VCMPPHZ256rmik: case X86::VCMPPHZ256rrik: + case X86::VCMPPHZrmik: case X86::VCMPPHZrrik: + case X86::VCMPSHZrm_Intk: case X86::VCMPSHZrr_Intk: + case X86::VCMPPHZ128rmbi: case X86::VCMPPHZ128rmbik: + case X86::VCMPPHZ256rmbi: case X86::VCMPPHZ256rmbik: + case X86::VCMPPHZrmbi: case X86::VCMPPHZrmbik: + case X86::VCMPPHZrrib: case X86::VCMPPHZrribk: + case X86::VCMPSHZrrb_Int: case X86::VCMPSHZrrb_Intk: if (Imm >= 0 && Imm <= 31) { OS << '\t'; printCMPMnemonic(MI, /*IsVCMP*/true, OS); @@ -152,11 +166,15 @@ if ((Desc.TSFlags & X86II::FormMask) == X86II::MRMSrcMem) { if (Desc.TSFlags & X86II::EVEX_B) { // Broadcast form. - // Load size is based on W-bit. - if (Desc.TSFlags & X86II::VEX_W) + // Load size is word for TA map. Otherwise it is based on W-bit. + if ((Desc.TSFlags & X86II::OpMapMask) == X86II::TA) { + assert(!(Desc.TSFlags & X86II::VEX_W) && "Unknown W-bit value!"); + printwordmem(MI, CurOp++, OS); + } else if (Desc.TSFlags & X86II::VEX_W) { printqwordmem(MI, CurOp++, OS); - else + } else { printdwordmem(MI, CurOp++, OS); + } // Print the number of elements broadcasted. unsigned NumElts; @@ -166,9 +184,19 @@ NumElts = (Desc.TSFlags & X86II::VEX_W) ? 4 : 8; else NumElts = (Desc.TSFlags & X86II::VEX_W) ? 2 : 4; + if ((Desc.TSFlags & X86II::OpMapMask) == X86II::TA) { + assert(!(Desc.TSFlags & X86II::VEX_W) && "Unknown W-bit value!"); + NumElts *= 2; + } OS << "{1to" << NumElts << "}"; } else { - if ((Desc.TSFlags & X86II::OpPrefixMask) == X86II::XS) + if ((Desc.TSFlags & X86II::OpMapMask) == X86II::TA && + (Desc.TSFlags & X86II::OpPrefixMask) == X86II::XS) + printwordmem(MI, CurOp++, OS); + else if ((Desc.TSFlags & X86II::OpMapMask) == X86II::TA && + (Desc.TSFlags & X86II::OpPrefixMask) == X86II::XD) + llvm_unreachable("Unexpected op prefix!"); + else if ((Desc.TSFlags & X86II::OpPrefixMask) == X86II::XS) printdwordmem(MI, CurOp++, OS); else if ((Desc.TSFlags & X86II::OpPrefixMask) == X86II::XD) printqwordmem(MI, CurOp++, OS); diff --git a/llvm/test/MC/Disassembler/X86/avx512fp16.txt b/llvm/test/MC/Disassembler/X86/avx512fp16.txt --- a/llvm/test/MC/Disassembler/X86/avx512fp16.txt +++ b/llvm/test/MC/Disassembler/X86/avx512fp16.txt @@ -126,51 +126,51 @@ 0x62,0x65,0x16,0x87,0x58,0x72,0x80 # ATT: vcmpeqph %zmm28, %zmm29, %k5 -# INTEL: vcmpph k5, zmm29, zmm28, 0 +# INTEL: vcmpeqph k5, zmm29, zmm28 0x62,0x93,0x14,0x40,0xc2,0xec,0x00 # ATT: vcmpleph {sae}, %zmm28, %zmm29, %k5 -# INTEL: vcmpph k5, zmm29, zmm28, {sae}, 2 +# INTEL: vcmpleph k5, zmm29, zmm28, {sae} 0x62,0x93,0x14,0x10,0xc2,0xec,0x02 # ATT: vcmpneqph 268435456(%rbp,%r14,8), %zmm29, %k5 {%k7} -# INTEL: vcmpph k5 {k7}, zmm29, zmmword ptr [rbp + 8*r14 + 268435456], 4 +# INTEL: vcmpneqph k5 {k7}, zmm29, zmmword ptr [rbp + 8*r14 + 268435456] 0x62,0xb3,0x14,0x47,0xc2,0xac,0xf5,0x00,0x00,0x00,0x10,0x04 # ATT: vcmpnleph (%r9){1to32}, %zmm29, %k5 -# INTEL: vcmpph k5, zmm29, word ptr [r9]{1to32}, 6 +# INTEL: vcmpnleph k5, zmm29, word ptr [r9]{1to32} 0x62,0xd3,0x14,0x50,0xc2,0x29,0x06 # ATT: vcmpeq_uqph 8128(%rcx), %zmm29, %k5 -# INTEL: vcmpph k5, zmm29, zmmword ptr [rcx + 8128], 8 +# INTEL: vcmpeq_uqph k5, zmm29, zmmword ptr [rcx + 8128] 0x62,0xf3,0x14,0x40,0xc2,0x69,0x7f,0x08 # ATT: vcmpngtph -256(%rdx){1to32}, %zmm29, %k5 {%k7} -# INTEL: vcmpph k5 {k7}, zmm29, word ptr [rdx - 256]{1to32}, 10 +# INTEL: vcmpngtph k5 {k7}, zmm29, word ptr [rdx - 256]{1to32} 0x62,0xf3,0x14,0x57,0xc2,0x6a,0x80,0x0a # ATT: vcmpneq_oqsh %xmm28, %xmm29, %k5 -# INTEL: vcmpsh k5, xmm29, xmm28, 12 +# INTEL: vcmpneq_oqsh k5, xmm29, xmm28 0x62,0x93,0x16,0x00,0xc2,0xec,0x0c # ATT: vcmpgtsh {sae}, %xmm28, %xmm29, %k5 -# INTEL: vcmpsh k5, xmm29, xmm28, {sae}, 14 +# INTEL: vcmpgtsh k5, xmm29, xmm28, {sae} 0x62,0x93,0x16,0x10,0xc2,0xec,0x0e # ATT: vcmpeq_ossh 268435456(%rbp,%r14,8), %xmm29, %k5 {%k7} -# INTEL: vcmpsh k5 {k7}, xmm29, word ptr [rbp + 8*r14 + 268435456], 16 +# INTEL: vcmpeq_ossh k5 {k7}, xmm29, word ptr [rbp + 8*r14 + 268435456] 0x62,0xb3,0x16,0x07,0xc2,0xac,0xf5,0x00,0x00,0x00,0x10,0x10 # ATT: vcmple_oqsh (%r9), %xmm29, %k5 -# INTEL: vcmpsh k5, xmm29, word ptr [r9], 18 +# INTEL: vcmple_oqsh k5, xmm29, word ptr [r9] 0x62,0xd3,0x16,0x00,0xc2,0x29,0x12 # ATT: vcmpneq_ussh 254(%rcx), %xmm29, %k5 -# INTEL: vcmpsh k5, xmm29, word ptr [rcx + 254], 20 +# INTEL: vcmpneq_ussh k5, xmm29, word ptr [rcx + 254] 0x62,0xf3,0x16,0x00,0xc2,0x69,0x7f,0x14 # ATT: vcmpnle_uqsh -256(%rdx), %xmm29, %k5 {%k7} -# INTEL: vcmpsh k5 {k7}, xmm29, word ptr [rdx - 256], 22 +# INTEL: vcmpnle_uqsh k5 {k7}, xmm29, word ptr [rdx - 256] 0x62,0xf3,0x16,0x07,0xc2,0x6a,0x80,0x16 # ATT: vcomish %xmm29, %xmm30 diff --git a/llvm/test/MC/Disassembler/X86/avx512fp16vl.txt b/llvm/test/MC/Disassembler/X86/avx512fp16vl.txt --- a/llvm/test/MC/Disassembler/X86/avx512fp16vl.txt +++ b/llvm/test/MC/Disassembler/X86/avx512fp16vl.txt @@ -42,43 +42,43 @@ 0x62,0xf5,0x54,0x9f,0x58,0x72,0x80 # ATT: vcmpltph %ymm4, %ymm5, %k5 -# INTEL: vcmpph k5, ymm5, ymm4, 1 +# INTEL: vcmpltph k5, ymm5, ymm4 0x62,0xf3,0x54,0x28,0xc2,0xec,0x01 # ATT: vcmpunordph %xmm4, %xmm5, %k5 -# INTEL: vcmpph k5, xmm5, xmm4, 3 +# INTEL: vcmpunordph k5, xmm5, xmm4 0x62,0xf3,0x54,0x08,0xc2,0xec,0x03 # ATT: vcmpnltph 268435456(%esp,%esi,8), %xmm5, %k5 {%k7} -# INTEL: vcmpph k5 {k7}, xmm5, xmmword ptr [esp + 8*esi + 268435456], 5 +# INTEL: vcmpnltph k5 {k7}, xmm5, xmmword ptr [esp + 8*esi + 268435456] 0x62,0xf3,0x54,0x0f,0xc2,0xac,0xf4,0x00,0x00,0x00,0x10,0x05 # ATT: vcmpordph (%ecx){1to8}, %xmm5, %k5 -# INTEL: vcmpph k5, xmm5, word ptr [ecx]{1to8}, 7 +# INTEL: vcmpordph k5, xmm5, word ptr [ecx]{1to8} 0x62,0xf3,0x54,0x18,0xc2,0x29,0x07 # ATT: vcmpngeph 2032(%ecx), %xmm5, %k5 -# INTEL: vcmpph k5, xmm5, xmmword ptr [ecx + 2032], 9 +# INTEL: vcmpngeph k5, xmm5, xmmword ptr [ecx + 2032] 0x62,0xf3,0x54,0x08,0xc2,0x69,0x7f,0x09 # ATT: vcmpfalseph -256(%edx){1to8}, %xmm5, %k5 {%k7} -# INTEL: vcmpph k5 {k7}, xmm5, word ptr [edx - 256]{1to8}, 11 +# INTEL: vcmpfalseph k5 {k7}, xmm5, word ptr [edx - 256]{1to8} 0x62,0xf3,0x54,0x1f,0xc2,0x6a,0x80,0x0b # ATT: vcmpgeph 268435456(%esp,%esi,8), %ymm5, %k5 {%k7} -# INTEL: vcmpph k5 {k7}, ymm5, ymmword ptr [esp + 8*esi + 268435456], 13 +# INTEL: vcmpgeph k5 {k7}, ymm5, ymmword ptr [esp + 8*esi + 268435456] 0x62,0xf3,0x54,0x2f,0xc2,0xac,0xf4,0x00,0x00,0x00,0x10,0x0d # ATT: vcmptrueph (%ecx){1to16}, %ymm5, %k5 -# INTEL: vcmpph k5, ymm5, word ptr [ecx]{1to16}, 15 +# INTEL: vcmptrueph k5, ymm5, word ptr [ecx]{1to16} 0x62,0xf3,0x54,0x38,0xc2,0x29,0x0f # ATT: vcmplt_oqph 4064(%ecx), %ymm5, %k5 -# INTEL: vcmpph k5, ymm5, ymmword ptr [ecx + 4064], 17 +# INTEL: vcmplt_oqph k5, ymm5, ymmword ptr [ecx + 4064] 0x62,0xf3,0x54,0x28,0xc2,0x69,0x7f,0x11 # ATT: vcmpunord_sph -256(%edx){1to16}, %ymm5, %k5 {%k7} -# INTEL: vcmpph k5 {k7}, ymm5, word ptr [edx - 256]{1to16}, 19 +# INTEL: vcmpunord_sph k5 {k7}, ymm5, word ptr [edx - 256]{1to16} 0x62,0xf3,0x54,0x3f,0xc2,0x6a,0x80,0x13 # ATT: vdivph %ymm4, %ymm5, %ymm6