X86: Implement the X86 sse2 haddpd instruction
This patch implements the haddpd instruction. It fixes the problem in the previous version (pointed out by Gabe Black) where an incorrect result would happen if you issue the instruction with the same argument twice, i.e. "haddpd %xmm0,%xmm0" This instruction is used by many spec2k benchmarks.
This commit is contained in:
parent
cf269025f9
commit
b2067840a6
2 changed files with 22 additions and 2 deletions
|
@ -707,7 +707,7 @@
|
|||
}
|
||||
// operand size (0x66)
|
||||
0x1: decode OPCODE_OP_BOTTOM3 {
|
||||
0x4: WarnUnimpl::haddpd_Vo_Wo();
|
||||
0x4: HADDPD(Vo,Wo);
|
||||
0x5: WarnUnimpl::hsubpd_Vo_Wo();
|
||||
0x6: WarnUnimpl::movd_Ed_Vd();
|
||||
0x7: MOVDQA(Wo,Vo);
|
||||
|
|
|
@ -55,5 +55,25 @@
|
|||
|
||||
microcode = '''
|
||||
# HADDPS
|
||||
# HADDPD
|
||||
|
||||
def macroop HADDPD_XMM_XMM {
|
||||
maddf ufp1, xmmh , xmml, size=8, ext=1
|
||||
maddf xmmh, xmmlm, xmmhm, size=8, ext=1
|
||||
movfp xmml, ufp1
|
||||
};
|
||||
|
||||
def macroop HADDPD_XMM_M {
|
||||
ldfp ufp1, seg, sib, disp, dataSize=8
|
||||
ldfp ufp2, seg, sib, "DISPLACEMENT+8", dataSize=8
|
||||
maddf xmml, xmmh, xmml, size=8, ext=1
|
||||
maddf xmmh, ufp1, ufp2, size=8, ext=1
|
||||
};
|
||||
|
||||
def macroop HADDPD_XMM_P {
|
||||
rdip t7
|
||||
ldfp ufp1, seg, riprel, disp, dataSize=8
|
||||
ldfp ufp2, seg, riprel, "DISPLACEMENT+8", dataSize=8
|
||||
maddf xmml, xmmh, xmml, size=8, ext=1
|
||||
maddf xmmh, ufp1, ufp2, size=8, ext=1
|
||||
};
|
||||
'''
|
||||
|
|
Loading…
Reference in a new issue