diff --git a/src/arch/x86/isa/decoder/two_byte_opcodes.isa b/src/arch/x86/isa/decoder/two_byte_opcodes.isa index e1b20feb1..dfc328c4b 100644 --- a/src/arch/x86/isa/decoder/two_byte_opcodes.isa +++ b/src/arch/x86/isa/decoder/two_byte_opcodes.isa @@ -903,7 +903,7 @@ } // operand size (0x66) 0x1: decode OPCODE_OP_BOTTOM3 { - 0x0: WarnUnimpl::addsubpd_Vo_Wo(); + 0x0: ADDSUBPD(Vo,Wo); 0x1: PSRLW(Vo,Wo); 0x2: PSRLD(Vo,Wo); 0x3: PSRLQ(Vo,Wo); diff --git a/src/arch/x86/isa/insts/simd128/floating_point/arithmetic/simultaneous_addition_and_subtraction.py b/src/arch/x86/isa/insts/simd128/floating_point/arithmetic/simultaneous_addition_and_subtraction.py index 2e9aebfdc..00b191eca 100644 --- a/src/arch/x86/isa/insts/simd128/floating_point/arithmetic/simultaneous_addition_and_subtraction.py +++ b/src/arch/x86/isa/insts/simd128/floating_point/arithmetic/simultaneous_addition_and_subtraction.py @@ -37,5 +37,24 @@ microcode = ''' # ADDSUBPS -# ADDSUBPD + +def macroop ADDSUBPD_XMM_XMM { + msubf xmml, xmml, xmmlm, size=8, ext=Scalar + maddf xmmh, xmmh, xmmhm, size=8, ext=Scalar +}; + +def macroop ADDSUBPD_XMM_M { + ldfp ufp1, seg, sib, disp, dataSize=8 + ldfp ufp2, seg, sib, "DISPLACEMENT+8", dataSize=8 + msubf xmmlm, xmml, ufp1, size=8, ext=0 + maddf xmmhm, xmmh, ufp2, size=8, ext=0 +}; + +def macroop ADDSUBPD_XMM_P { + rdip t7 + ldfp ufp1, seg, sib, disp, dataSize=8 + ldfp ufp2, seg, sib, "DISPLACEMENT+8", dataSize=8 + msubf xmmlm, xmml, ufp1, size=8, ext=0 + maddf xmmhm, xmmh, ufp2, size=8, ext=0 +}; '''