Index: lib/Target/X86/X86InstrMMX.td =================================================================== --- lib/Target/X86/X86InstrMMX.td +++ lib/Target/X86/X86InstrMMX.td @@ -109,6 +109,23 @@ (bitconvert (load_mmx addr:$src2))))], itins.rm>, Sched<[itins.Sched.Folded, ReadAfterLd]>; } + // MMXI_binop_rm32_int is like MMXI_binop_rm_int above but for mem32 input + multiclass MMXI_binop_rm32_int opc, string OpcodeStr, Intrinsic IntId, + OpndItins itins, bit Commutable = 0> { + def irr : MMXI, + Sched<[itins.Sched]> { + let isCommutable = Commutable; + } + def irm : MMXI, Sched<[itins.Sched.Folded, ReadAfterLd]>; + } multiclass MMXI_binop_rmi_int opc, bits<8> opc2, Format ImmForm, string OpcodeStr, Intrinsic IntId, @@ -522,13 +539,13 @@ defm MMX_PUNPCKHDQ : MMXI_binop_rm_int<0x6A, "punpckhdq", int_x86_mmx_punpckhdq, MMX_UNPCK_H_ITINS>; -defm MMX_PUNPCKLBW : MMXI_binop_rm_int<0x60, "punpcklbw", +defm MMX_PUNPCKLBW : MMXI_binop_rm32_int<0x60, "punpcklbw", int_x86_mmx_punpcklbw, MMX_UNPCK_L_ITINS>; -defm MMX_PUNPCKLWD : MMXI_binop_rm_int<0x61, "punpcklwd", +defm MMX_PUNPCKLWD : MMXI_binop_rm32_int<0x61, "punpcklwd", int_x86_mmx_punpcklwd, MMX_UNPCK_L_ITINS>; -defm MMX_PUNPCKLDQ : MMXI_binop_rm_int<0x62, "punpckldq", +defm MMX_PUNPCKLDQ : MMXI_binop_rm32_int<0x62, "punpckldq", int_x86_mmx_punpckldq, MMX_UNPCK_L_ITINS>; Index: test/MC/X86/punpack-intel.s =================================================================== --- test/MC/X86/punpack-intel.s +++ test/MC/X86/punpack-intel.s @@ -0,0 +1,16 @@ +; RUN: not llvm-mc -x86-asm-syntax=intel -triple=x86_64 < %s 2>&1 | FileCheck %s + +; CHECK: punpcklbw +punpcklbw mm0, dword ptr [rsp] +; CHECK: punpcklwd +punpcklwd mm0, dword ptr [rsp] +; CHECK: punpckldq +punpckldq mm0, dword ptr [rsp] + +; CHECK: error: invalid operand for instruction +punpcklbw mm0, qword ptr [rsp] +; CHECK: error: invalid operand for instruction +punpcklwd mm0, word ptr [rsp] +; CHECK: error: invalid operand for instruction +punpckldq mm0, qword ptr [rsp] +