*** Current duplicate SSE/SSE2 instructions list ***

MOVUPS_VpsWps  (0f 10) = MOVUPD_VpdWpd  (66 0f 10) = MOVDQU_VdqWdq (f3 0f 6f)
MOVUPS_WpsVps  (0f 11) = MOVUPD_WpdVpd  (66 0f 11) = MOVDQU_WdqVdq (f3 0f 7f)
MOVAPS_VpsWps  (0f 28) = MOVAPD_VpdWpd  (66 0f 28) = MOVDQA_VdqWdq (66 0f 6f)
MOVAPS_WpsVps  (0f 29) = MOVAPD_WpdVpd  (66 0f 29) = MOVDQA_WdqVdq (66 0f 7f)

MOVNTPS_MdqVps (0f 2b) = MOVNTPD_MdqVpd (66 0f 2b)
MOVLPS_VpsMq   (0f 12) = MOVLPD_VsdMq   (66 0f 12)
MOVLPS_MqVps   (0f 13) = MOVLPD_MqVsd   (66 0f 13)
MOVHPS_VpsMq   (0f 16) = MOVHPD_VpdMq   (66 0f 16)
MOVHPS_MqVps   (0f 17) = MOVHPD_MqVpd   (66 0f 17)

ANDPS_VpsWps   (0f 54) = ANDPD_VpdWpd   (66 0f 54) = PAND_VpdWpd   (66 0f db)
ANDNPS_VpsWps  (0f 55) = ANDNPD_VpdWpd  (66 0f 55) = PANDN_VpdWpd  (66 0f df)
ORPS_VpsWps    (0f 56) = ORPD_VpdWpd    (66 0f 56) = POR_VpdWpd    (66 0f eb)
XORPS_VpsWps   (0f 57) = XORPD_VpdWpd   (66 0f 57) = PXOR_VpdWpd   (66 0f ef)

Removed dupes
This commit is contained in:
Stanislav Shwartsman 2002-11-25 21:58:55 +00:00
parent e03430ec8d
commit bcd57bdcaf
5 changed files with 255 additions and 422 deletions

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: cpu.h,v 1.118 2002-11-21 18:22:03 bdenney Exp $
// $Id: cpu.h,v 1.119 2002-11-25 21:58:47 sshwarts Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2001 MandrakeSoft S.A.
@ -2067,8 +2067,6 @@ union {
BX_SMF void MOVHPS_MqVps(bxInstruction_c *i);
BX_SMF void MOVAPS_VpsWps(bxInstruction_c *i);
BX_SMF void MOVAPS_WpsVps(bxInstruction_c *i);
BX_SMF void MOVAPD_VpdWpd(bxInstruction_c *i);
BX_SMF void MOVAPD_WpdVpd(bxInstruction_c *i);
BX_SMF void CVTPI2PS_VpsQq(bxInstruction_c *i);
BX_SMF void CVTSI2SS_VssEd(bxInstruction_c *i);
BX_SMF void MOVNTPS_MdqVps(bxInstruction_c *i);
@ -2085,10 +2083,6 @@ union {
BX_SMF void RSQRTSS_VssWss(bxInstruction_c *i);
BX_SMF void RCPPS_VpsWps(bxInstruction_c *i);
BX_SMF void RCPSS_VssWss(bxInstruction_c *i);
BX_SMF void ANDPS_VpsWps(bxInstruction_c *i);
BX_SMF void ANDNPS_VpsWps(bxInstruction_c *i);
BX_SMF void ORPS_VpsWps(bxInstruction_c *i);
BX_SMF void XORPS_VpsWps(bxInstruction_c *i);
BX_SMF void ADDPS_VpsWps(bxInstruction_c *i);
BX_SMF void ADDSS_VssWss(bxInstruction_c *i);
BX_SMF void MULPS_VpsWps(bxInstruction_c *i);
@ -2122,9 +2116,7 @@ union {
/* SSE */
/* SSE2 */
BX_SMF void MOVUPD_VpdWpd(bxInstruction_c *i);
BX_SMF void MOVSD_VsdWsd(bxInstruction_c *i);
BX_SMF void MOVUPD_WpdVpd(bxInstruction_c *i);
BX_SMF void MOVSD_WsdVsd(bxInstruction_c *i);
BX_SMF void UNPCKLPD_VpdWq(bxInstruction_c *i);
BX_SMF void UNPCKHPD_VpdWq(bxInstruction_c *i);
@ -2139,10 +2131,6 @@ union {
BX_SMF void MOVMSKPD_EdVRpd(bxInstruction_c *i);
BX_SMF void SQRTPD_VpdWpd(bxInstruction_c *i);
BX_SMF void SQRTSD_VsdWsd(bxInstruction_c *i);
BX_SMF void ANDPD_VpdWpd(bxInstruction_c *i);
BX_SMF void ANDNPD_VpdWpd(bxInstruction_c *i);
BX_SMF void ORPD_VpdWpd(bxInstruction_c *i);
BX_SMF void XORPD_VpdWpd(bxInstruction_c *i);
BX_SMF void ADDPD_VpdWpd(bxInstruction_c *i);
BX_SMF void ADDSD_VsdWsd(bxInstruction_c *i);
BX_SMF void MULPD_VpdWpd(bxInstruction_c *i);
@ -2177,8 +2165,6 @@ union {
BX_SMF void PUNPCKLQDQ_VdqWq(bxInstruction_c *i);
BX_SMF void PUNPCKHQDQ_VdqWq(bxInstruction_c *i);
BX_SMF void MOVD_VdqEd(bxInstruction_c *i);
BX_SMF void MOVDQA_VdqWdq(bxInstruction_c *i);
BX_SMF void MOVDQU_VdqWdq(bxInstruction_c *i);
BX_SMF void PSHUFD_VdqWdqIb(bxInstruction_c *i);
BX_SMF void PSHUFHW_VqWqIb(bxInstruction_c *i);
BX_SMF void PCMPEQB_VdqWdq(bxInstruction_c *i);
@ -2186,8 +2172,6 @@ union {
BX_SMF void PCMPEQD_VdqWdq(bxInstruction_c *i);
BX_SMF void MOVD_EdVd(bxInstruction_c *i);
BX_SMF void MOVQ_VqWq(bxInstruction_c *i);
BX_SMF void MOVDQA_WdqVdq(bxInstruction_c *i);
BX_SMF void MOVDQU_WdqVdq(bxInstruction_c *i);
BX_SMF void CMPPD_VpdWpdIb(bxInstruction_c *i);
BX_SMF void CMPSD_VsdWsdIb(bxInstruction_c *i);
BX_SMF void MOVNTI_MdGd(bxInstruction_c *i);

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: fetchdecode.cc,v 1.35 2002-11-15 13:05:19 sshwarts Exp $
// $Id: fetchdecode.cc,v 1.36 2002-11-25 21:58:28 sshwarts Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2001 MandrakeSoft S.A.
@ -213,26 +213,38 @@ static BxOpcodeInfo_t opcodesMOV_EdGd[2] = {
/* SSE Groups */
/* ********** */
/* ***********************************
According to the Intel/AMD Manuals:
/*
*** Duplicate SSE/SSE2 instructions ***
MOVUPS_VpsWps (0f 10) = MOVUPD_VpdWpd (66 0f 10) = MOVDQU_VdqWdq (f3 0f 6f)
MOVUPS_WpsVps (0f 11) = MOVUPD_WpdVpd (66 0f 11) = MOVDQU_WdqVdq (f3 0f 7f)
MOVAPS_VpsWps (0f 28) = MOVAPD_VpdWpd (66 0f 28) = MOVDQA_VdqWdq (66 0f 6f)
MOVAPS_WpsVps (0f 29) = MOVAPD_WpdVpd (66 0f 29) = MOVDQA_WdqVdq (66 0f 7f)
MOVNTPS_MdqVps (0f 2b) = MOVNTPD_MdqVpd (66 0f 2b)
MOVLPS_VpsMq (0f 12) = MOVLPD_VsdMq (66 0f 12)
MOVLPS_MqVps (0f 13) = MOVLPD_MqVsd (66 0f 13)
MOVHPS_VpsMq (0f 16) = MOVHPD_VpdMq (66 0f 16)
MOVHPS_MqVps (0f 17) = MOVHPD_MqVpd (66 0f 17)
ANDPS_VpsWps (0f 54) = ANDPD_VpdWpd (66 0f 54) = PAND_VpdWpd (66 0f db)
ANDNPS_VpsWps (0f 55) = ANDNPD_VpdWpd (66 0f 55) = PANDN_VpdWpd (66 0f df)
ORPS_VpsWps (0f 56) = ORPD_VpdWpd (66 0f 56) = POR_VpdWpd (66 0f eb)
XORPS_VpsWps (0f 57) = XORPD_VpdWpd (66 0f 57) = PXOR_VpdWpd (66 0f ef)
MOVNTPS_MdqVps (0f 2b) = MOVNTPD_MdqVpd (66 0f 2b)
MOVLPS_VpsMq (0f 12) = MOVLPD_VsdMq (66 0f 12)
MOVLPS_MqVps (0f 13) = MOVLPD_MqVsd (66 0f 13)
MOVHPS_VpsMq (0f 16) = MOVHPD_VpdMq (66 0f 16)
MOVHPS_MqVps (0f 17) = MOVHPD_MqVpd (66 0f 17)
*/
static BxOpcodeInfo_t BxOpcodeGroupSSE_0f10[4] = {
/* -- */ { 0, &BX_CPU_C::MOVUPS_VpsWps },
/* 66 */ { 0, &BX_CPU_C::MOVUPD_VpdWpd },
/* 66 */ { 0, &BX_CPU_C::MOVUPS_VpsWps },
/* F2 */ { 0, &BX_CPU_C::MOVSD_VsdWsd },
/* F3 */ { 0, &BX_CPU_C::MOVSS_VssWss }
};
static BxOpcodeInfo_t BxOpcodeGroupSSE_0f11[4] = {
/* -- */ { 0, &BX_CPU_C::MOVUPS_WpsVps },
/* 66 */ { 0, &BX_CPU_C::MOVUPD_WpdVpd },
/* 66 */ { 0, &BX_CPU_C::MOVUPS_WpsVps },
/* F2 */ { 0, &BX_CPU_C::MOVSD_WsdVsd },
/* F3 */ { 0, &BX_CPU_C::MOVSS_WssVss }
};
@ -281,14 +293,14 @@ static BxOpcodeInfo_t BxOpcodeGroupSSE_0f17[4] = {
static BxOpcodeInfo_t BxOpcodeGroupSSE_0f28[4] = {
/* -- */ { 0, &BX_CPU_C::MOVAPS_VpsWps },
/* 66 */ { 0, &BX_CPU_C::MOVAPD_VpdWpd },
/* 66 */ { 0, &BX_CPU_C::MOVAPS_VpsWps },
/* F2 */ { 0, &BX_CPU_C::BxError },
/* F3 */ { 0, &BX_CPU_C::BxError }
};
static BxOpcodeInfo_t BxOpcodeGroupSSE_0f29[4] = {
/* -- */ { 0, &BX_CPU_C::MOVAPS_WpsVps },
/* 66 */ { 0, &BX_CPU_C::MOVAPD_WpdVpd },
/* 66 */ { 0, &BX_CPU_C::MOVAPS_WpsVps },
/* F2 */ { 0, &BX_CPU_C::BxError },
/* F3 */ { 0, &BX_CPU_C::BxError }
};
@ -364,29 +376,29 @@ static BxOpcodeInfo_t BxOpcodeGroupSSE_0f53[4] = {
};
static BxOpcodeInfo_t BxOpcodeGroupSSE_0f54[4] = {
/* -- */ { 0, &BX_CPU_C::ANDPS_VpsWps },
/* 66 */ { 0, &BX_CPU_C::ANDPD_VpdWpd },
/* -- */ { 0, &BX_CPU_C::PAND_VdqWdq },
/* 66 */ { 0, &BX_CPU_C::PAND_VdqWdq },
/* F2 */ { 0, &BX_CPU_C::BxError },
/* F3 */ { 0, &BX_CPU_C::BxError }
};
static BxOpcodeInfo_t BxOpcodeGroupSSE_0f55[4] = {
/* -- */ { 0, &BX_CPU_C::ANDNPS_VpsWps },
/* 66 */ { 0, &BX_CPU_C::ANDNPD_VpdWpd },
/* -- */ { 0, &BX_CPU_C::PANDN_VdqWdq },
/* 66 */ { 0, &BX_CPU_C::PANDN_VdqWdq },
/* F2 */ { 0, &BX_CPU_C::BxError },
/* F3 */ { 0, &BX_CPU_C::BxError }
};
static BxOpcodeInfo_t BxOpcodeGroupSSE_0f56[4] = {
/* -- */ { 0, &BX_CPU_C::ORPS_VpsWps },
/* 66 */ { 0, &BX_CPU_C::ORPD_VpdWpd },
/* -- */ { 0, &BX_CPU_C::POR_VdqWdq },
/* 66 */ { 0, &BX_CPU_C::POR_VdqWdq },
/* F2 */ { 0, &BX_CPU_C::BxError },
/* F3 */ { 0, &BX_CPU_C::BxError }
};
static BxOpcodeInfo_t BxOpcodeGroupSSE_0f57[4] = {
/* -- */ { 0, &BX_CPU_C::XORPS_VpsWps },
/* 66 */ { 0, &BX_CPU_C::XORPD_VpdWpd },
/* -- */ { 0, &BX_CPU_C::PXOR_VdqWdq },
/* 66 */ { 0, &BX_CPU_C::PXOR_VdqWdq },
/* F2 */ { 0, &BX_CPU_C::BxError },
/* F3 */ { 0, &BX_CPU_C::BxError }
};
@ -554,9 +566,9 @@ static BxOpcodeInfo_t BxOpcodeGroupSSE_0f6e[4] = {
static BxOpcodeInfo_t BxOpcodeGroupSSE_0f6f[4] = {
/* -- */ { 0, &BX_CPU_C::MOVQ_PqQq },
/* 66 */ { 0, &BX_CPU_C::MOVDQA_VdqWdq },
/* 66 */ { 0, &BX_CPU_C::MOVAPS_VpsWps },
/* F2 */ { 0, &BX_CPU_C::BxError },
/* F3 */ { 0, &BX_CPU_C::MOVDQU_VdqWdq },
/* F3 */ { 0, &BX_CPU_C::MOVUPS_VpsWps },
};
static BxOpcodeInfo_t BxOpcodeGroupSSE_0f70[4] = {
@ -596,9 +608,9 @@ static BxOpcodeInfo_t BxOpcodeGroupSSE_0f7e[4] = {
static BxOpcodeInfo_t BxOpcodeGroupSSE_0f7f[4] = {
/* -- */ { 0, &BX_CPU_C::MOVQ_QqPq },
/* 66 */ { 0, &BX_CPU_C::MOVDQA_WdqVdq },
/* 66 */ { 0, &BX_CPU_C::MOVAPS_WpsVps },
/* F2 */ { 0, &BX_CPU_C::BxError },
/* F3 */ { 0, &BX_CPU_C::MOVDQU_WdqVdq },
/* F3 */ { 0, &BX_CPU_C::MOVUPS_WpsVps },
};
static BxOpcodeInfo_t BxOpcodeGroupSSE_0fc2[4] = {

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: fetchdecode64.cc,v 1.31 2002-11-19 05:47:43 bdenney Exp $
// $Id: fetchdecode64.cc,v 1.32 2002-11-25 21:58:35 sshwarts Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2001 MandrakeSoft S.A.
@ -281,26 +281,38 @@ static BxOpcodeInfo_t opcodesMOV_EdGd[2] = {
/* SSE Groups */
/* ********** */
/* ***********************************
According to the Intel/AMD Manuals:
/*
*** Duplicate SSE/SSE2 instructions ***
MOVUPS_VpsWps (0f 10) = MOVUPD_VpdWpd (66 0f 10) = MOVDQU_VdqWdq (f3 0f 6f)
MOVUPS_WpsVps (0f 11) = MOVUPD_WpdVpd (66 0f 11) = MOVDQU_WdqVdq (f3 0f 7f)
MOVAPS_VpsWps (0f 28) = MOVAPD_VpdWpd (66 0f 28) = MOVDQA_VdqWdq (66 0f 6f)
MOVAPS_WpsVps (0f 29) = MOVAPD_WpdVpd (66 0f 29) = MOVDQA_WdqVdq (66 0f 7f)
MOVNTPS_MdqVps (0f 2b) = MOVNTPD_MdqVpd (66 0f 2b)
MOVLPS_VpsMq (0f 12) = MOVLPD_VsdMq (66 0f 12)
MOVLPS_MqVps (0f 13) = MOVLPD_MqVsd (66 0f 13)
MOVHPS_VpsMq (0f 16) = MOVHPD_VpdMq (66 0f 16)
MOVHPS_MqVps (0f 17) = MOVHPD_MqVpd (66 0f 17)
ANDPS_VpsWps (0f 54) = ANDPD_VpdWpd (66 0f 54) = PAND_VpdWpd (66 0f db)
ANDNPS_VpsWps (0f 55) = ANDNPD_VpdWpd (66 0f 55) = PANDN_VpdWpd (66 0f df)
ORPS_VpsWps (0f 56) = ORPD_VpdWpd (66 0f 56) = POR_VpdWpd (66 0f eb)
XORPS_VpsWps (0f 57) = XORPD_VpdWpd (66 0f 57) = PXOR_VpdWpd (66 0f ef)
MOVNTPS_MdqVps (0f 2b) = MOVNTPD_MdqVpd (66 0f 2b)
MOVLPS_VpsMq (0f 12) = MOVLPD_VsdMq (66 0f 12)
MOVLPS_MqVps (0f 13) = MOVLPD_MqVsd (66 0f 13)
MOVHPS_VpsMq (0f 16) = MOVHPD_VpdMq (66 0f 16)
MOVHPS_MqVps (0f 17) = MOVHPD_MqVpd (66 0f 17)
*/
static BxOpcodeInfo_t BxOpcodeGroupSSE_0f10[4] = {
/* -- */ { 0, &BX_CPU_C::MOVUPS_VpsWps },
/* 66 */ { 0, &BX_CPU_C::MOVUPD_VpdWpd },
/* 66 */ { 0, &BX_CPU_C::MOVUPS_VpsWps },
/* F2 */ { 0, &BX_CPU_C::MOVSD_VsdWsd },
/* F3 */ { 0, &BX_CPU_C::MOVSS_VssWss }
};
static BxOpcodeInfo_t BxOpcodeGroupSSE_0f11[4] = {
/* -- */ { 0, &BX_CPU_C::MOVUPS_WpsVps },
/* 66 */ { 0, &BX_CPU_C::MOVUPD_WpdVpd },
/* 66 */ { 0, &BX_CPU_C::MOVUPS_WpsVps },
/* F2 */ { 0, &BX_CPU_C::MOVSD_WsdVsd },
/* F3 */ { 0, &BX_CPU_C::MOVSS_WssVss }
};
@ -349,14 +361,14 @@ static BxOpcodeInfo_t BxOpcodeGroupSSE_0f17[4] = {
static BxOpcodeInfo_t BxOpcodeGroupSSE_0f28[4] = {
/* -- */ { 0, &BX_CPU_C::MOVAPS_VpsWps },
/* 66 */ { 0, &BX_CPU_C::MOVAPD_VpdWpd },
/* 66 */ { 0, &BX_CPU_C::MOVAPS_VpsWps },
/* F2 */ { 0, &BX_CPU_C::BxError },
/* F3 */ { 0, &BX_CPU_C::BxError }
};
static BxOpcodeInfo_t BxOpcodeGroupSSE_0f29[4] = {
/* -- */ { 0, &BX_CPU_C::MOVAPS_WpsVps },
/* 66 */ { 0, &BX_CPU_C::MOVAPD_WpdVpd },
/* 66 */ { 0, &BX_CPU_C::MOVAPS_WpsVps },
/* F2 */ { 0, &BX_CPU_C::BxError },
/* F3 */ { 0, &BX_CPU_C::BxError }
};
@ -432,29 +444,29 @@ static BxOpcodeInfo_t BxOpcodeGroupSSE_0f53[4] = {
};
static BxOpcodeInfo_t BxOpcodeGroupSSE_0f54[4] = {
/* -- */ { 0, &BX_CPU_C::ANDPS_VpsWps },
/* 66 */ { 0, &BX_CPU_C::ANDPD_VpdWpd },
/* -- */ { 0, &BX_CPU_C::PAND_VdqWdq },
/* 66 */ { 0, &BX_CPU_C::PAND_VdqWdq },
/* F2 */ { 0, &BX_CPU_C::BxError },
/* F3 */ { 0, &BX_CPU_C::BxError }
};
static BxOpcodeInfo_t BxOpcodeGroupSSE_0f55[4] = {
/* -- */ { 0, &BX_CPU_C::ANDNPS_VpsWps },
/* 66 */ { 0, &BX_CPU_C::ANDNPD_VpdWpd },
/* -- */ { 0, &BX_CPU_C::PANDN_VdqWdq },
/* 66 */ { 0, &BX_CPU_C::PANDN_VdqWdq },
/* F2 */ { 0, &BX_CPU_C::BxError },
/* F3 */ { 0, &BX_CPU_C::BxError }
};
static BxOpcodeInfo_t BxOpcodeGroupSSE_0f56[4] = {
/* -- */ { 0, &BX_CPU_C::ORPS_VpsWps },
/* 66 */ { 0, &BX_CPU_C::ORPD_VpdWpd },
/* -- */ { 0, &BX_CPU_C::POR_VdqWdq },
/* 66 */ { 0, &BX_CPU_C::POR_VdqWdq },
/* F2 */ { 0, &BX_CPU_C::BxError },
/* F3 */ { 0, &BX_CPU_C::BxError }
};
static BxOpcodeInfo_t BxOpcodeGroupSSE_0f57[4] = {
/* -- */ { 0, &BX_CPU_C::XORPS_VpsWps },
/* 66 */ { 0, &BX_CPU_C::XORPD_VpdWpd },
/* -- */ { 0, &BX_CPU_C::PXOR_VdqWdq },
/* 66 */ { 0, &BX_CPU_C::PXOR_VdqWdq },
/* F2 */ { 0, &BX_CPU_C::BxError },
/* F3 */ { 0, &BX_CPU_C::BxError }
};
@ -622,9 +634,9 @@ static BxOpcodeInfo_t BxOpcodeGroupSSE_0f6e[4] = {
static BxOpcodeInfo_t BxOpcodeGroupSSE_0f6f[4] = {
/* -- */ { 0, &BX_CPU_C::MOVQ_PqQq },
/* 66 */ { 0, &BX_CPU_C::MOVDQA_VdqWdq },
/* 66 */ { 0, &BX_CPU_C::MOVAPS_VpsWps },
/* F2 */ { 0, &BX_CPU_C::BxError },
/* F3 */ { 0, &BX_CPU_C::MOVDQU_VdqWdq },
/* F3 */ { 0, &BX_CPU_C::MOVUPS_VpsWps },
};
static BxOpcodeInfo_t BxOpcodeGroupSSE_0f70[4] = {
@ -664,9 +676,9 @@ static BxOpcodeInfo_t BxOpcodeGroupSSE_0f7e[4] = {
static BxOpcodeInfo_t BxOpcodeGroupSSE_0f7f[4] = {
/* -- */ { 0, &BX_CPU_C::MOVQ_QqPq },
/* 66 */ { 0, &BX_CPU_C::MOVDQA_WdqVdq },
/* 66 */ { 0, &BX_CPU_C::MOVAPS_WpsVps },
/* F2 */ { 0, &BX_CPU_C::BxError },
/* F3 */ { 0, &BX_CPU_C::MOVDQU_WdqVdq },
/* F3 */ { 0, &BX_CPU_C::MOVAPS_WpsVps },
};
static BxOpcodeInfo_t BxOpcodeGroupSSE_0fc2[4] = {

View File

@ -251,14 +251,29 @@ void BX_CPU_C::FXRSTOR(bxInstruction_c *i)
#endif
}
/* MOVUPS: 0F 10 */
/* MOVUPD: 66 0F 10 */
/* MOVDQU: F3 0F 6F */
void BX_CPU_C::MOVUPS_VpsWps(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 1
BX_CPU_THIS_PTR prepareSSE();
BX_PANIC(("MOVUPS_VpsWps: SSE instruction still not implemented"));
BxPackedXmmRegister op;
/* op is a register or memory reference */
if (i->modC0()) {
op = BX_READ_XMM_REG(i->rm());
}
else {
/* pointer, segment address pair */
readVirtualDQword(i->seg(), RMAddr(i), (Bit8u *) &op);
}
/* now write result back to destination */
BX_WRITE_XMM_REG(i->nnn(), op);
#else
BX_INFO(("MOVUPS_VpsWps: SSE not supported in current configuration"));
BX_INFO(("MOVUPS/MOVUPD/MOVDQU_VpsWps: SSE not supported in current configuration"));
UndefinedOpcode(i);
#endif
}
@ -275,14 +290,25 @@ void BX_CPU_C::MOVSS_VssWss(bxInstruction_c *i)
#endif
}
/* MOVUPS: 0F 11 */
/* MOVUPD: 66 0F 11 */
/* MOVDQU: F3 0F 7F */
void BX_CPU_C::MOVUPS_WpsVps(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 1
BX_CPU_THIS_PTR prepareSSE();
BX_PANIC(("MOVUPS_WpsVps: SSE instruction still not implemented"));
BxPackedXmmRegister op = BX_READ_XMM_REG(i->nnn());
/* op is a register or memory reference */
if (i->modC0()) {
BX_WRITE_XMM_REG(i->rm(), op);
}
else {
writeVirtualDQword(i->seg(), RMAddr(i), (Bit8u *) &op);
}
#else
BX_INFO(("MOVUPS_WpsVps: SSE not supported in current configuration"));
BX_INFO(("MOVUPS/MOVUPD/MOVDQU_WpsVps: SSE not supported in current configuration"));
UndefinedOpcode(i);
#endif
}
@ -371,26 +397,52 @@ void BX_CPU_C::MOVHPS_MqVps(bxInstruction_c *i)
#endif
}
/* MOVAPS: 0F 28 */
/* MOVAPD: 66 0F 28 */
/* MOVDQA: F3 0F 6F */
void BX_CPU_C::MOVAPS_VpsWps(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 1
BX_CPU_THIS_PTR prepareSSE();
BX_PANIC(("MOVAPS_VpsWps: SSE instruction still not implemented"));
BxPackedXmmRegister op;
/* op is a register or memory reference */
if (i->modC0()) {
op = BX_READ_XMM_REG(i->rm());
}
else {
/* pointer, segment address pair */
readVirtualDQwordAligned(i->seg(), RMAddr(i), (Bit8u *) &op);
}
/* now write result back to destination */
BX_WRITE_XMM_REG(i->nnn(), op);
#else
BX_INFO(("MOVAPS_VpsWps: SSE not supported in current configuration"));
BX_INFO(("MOVAPS/MOVAPD/MOVDQA_VpsWps: SSE not supported in current configuration"));
UndefinedOpcode(i);
#endif
}
/* MOVAPS: 0F 29 */
/* MOVAPD: 66 0F 29 */
/* MOVDQA: F3 0F 7F */
void BX_CPU_C::MOVAPS_WpsVps(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 1
BX_CPU_THIS_PTR prepareSSE();
BX_PANIC(("MOVAPS_WpsVps: SSE instruction still not implemented"));
BxPackedXmmRegister op = BX_READ_XMM_REG(i->nnn());
/* op is a register or memory reference */
if (i->modC0()) {
BX_WRITE_XMM_REG(i->rm(), op);
}
else {
writeVirtualDQwordAligned(i->seg(), RMAddr(i), (Bit8u *) &op);
}
#else
BX_INFO(("MOVAPS_WpsVps: SSE not supported in current configuration"));
BX_INFO(("MOVAPS/MOVAPD/MOVDQA_WpsVps: SSE not supported in current configuration"));
UndefinedOpcode(i);
#endif
}
@ -419,6 +471,7 @@ void BX_CPU_C::CVTSI2SS_VssEd(bxInstruction_c *i)
#endif
}
/* 0F 2B */
void BX_CPU_C::MOVNTPS_MdqVps(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 1
@ -433,7 +486,7 @@ void BX_CPU_C::MOVNTPS_MdqVps(bxInstruction_c *i)
writeVirtualDQword(i->seg(), RMAddr(i), (Bit8u *)(&val128));
#else
BX_INFO(("MOVNTPS_MdqVps: SSE not supported in current configuration"));
BX_INFO(("MOVNTPS/MOVNTPD_MdqVps: SSE not supported in current configuration"));
UndefinedOpcode(i);
#endif
}
@ -594,54 +647,6 @@ void BX_CPU_C::RCPSS_VssWss(bxInstruction_c *i)
#endif
}
void BX_CPU_C::ANDPS_VpsWps(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 1
BX_CPU_THIS_PTR prepareSSE();
BX_PANIC(("ANDPS_VpsWps: SSE instruction still not implemented"));
#else
BX_INFO(("ANDPS_VpsWps: SSE not supported in current configuration"));
UndefinedOpcode(i);
#endif
}
void BX_CPU_C::ANDNPS_VpsWps(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 1
BX_CPU_THIS_PTR prepareSSE();
BX_PANIC(("ANDNPS_VpsWps: SSE instruction still not implemented"));
#else
BX_INFO(("ANDNPS_VpsWps: SSE not supported in current configuration"));
UndefinedOpcode(i);
#endif
}
void BX_CPU_C::ORPS_VpsWps(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 1
BX_CPU_THIS_PTR prepareSSE();
BX_PANIC(("ORPS_VpsWps: SSE instruction still not implemented"));
#else
BX_INFO(("ORPS_VpsWps: SSE not supported in current configuration"));
UndefinedOpcode(i);
#endif
}
void BX_CPU_C::XORPS_VpsWps(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 1
BX_CPU_THIS_PTR prepareSSE();
BX_PANIC(("XORPS_VpsWps: SSE instruction still not implemented"));
#else
BX_INFO(("XORPS_VpsWps: SSE not supported in current configuration"));
UndefinedOpcode(i);
#endif
}
void BX_CPU_C::ADDPS_VpsWps(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 1
@ -855,3 +860,123 @@ void BX_CPU_C::MASKMOVQ_PqPRq(bxInstruction_c *i)
UndefinedOpcode(i);
#endif
}
/* ANDPS: 0F 54 */
/* ANDPD: 66 0F 54 */
/* PAND: F3 0F DB */
void BX_CPU_C::PAND_VdqWdq(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 1
BX_CPU_THIS_PTR prepareSSE();
BxPackedXmmRegister op1 = BX_READ_XMM_REG(i->nnn()), op2;
/* op2 is a register or memory reference */
if (i->modC0()) {
op2 = BX_READ_XMM_REG(i->rm());
}
else {
/* pointer, segment address pair */
readVirtualDQwordAligned(i->seg(), RMAddr(i), (Bit8u *) &op2);
}
op1.xmm64u(0) &= op2.xmm64u(0);
op1.xmm64u(1) &= op2.xmm64u(1);
/* now write result back to destination */
BX_WRITE_XMM_REG(i->nnn(), op1);
#else
BX_INFO(("ANDPS/ANDPD/PAND_VdqWdq: SSE not supported in current configuration"));
UndefinedOpcode(i);
#endif
}
/* ANDNPS: 0F 55 */
/* ANDNPD: 66 0F 55 */
/* PANDN: F3 0F DF */
void BX_CPU_C::PANDN_VdqWdq(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 1
BX_CPU_THIS_PTR prepareSSE();
BxPackedXmmRegister op1 = BX_READ_XMM_REG(i->nnn()), op2, result;
/* op2 is a register or memory reference */
if (i->modC0()) {
op2 = BX_READ_XMM_REG(i->rm());
}
else {
/* pointer, segment address pair */
readVirtualDQwordAligned(i->seg(), RMAddr(i), (Bit8u *) &op2);
}
result.xmm64u(0) = ~(op1.xmm64u(0)) & op2.xmm64u(0);
result.xmm64u(1) = ~(op1.xmm64u(1)) & op2.xmm64u(1);
/* now write result back to destination */
BX_WRITE_XMM_REG(i->nnn(), result);
#else
BX_INFO(("ANDNPS/ANDNPD/PANDN_VdqWdq: SSE not supported in current configuration"));
UndefinedOpcode(i);
#endif
}
/* ORPS: 0F 56 */
/* ORPD: 66 0F 56 */
/* POR: F3 0F EB */
void BX_CPU_C::POR_VdqWdq(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 1
BX_CPU_THIS_PTR prepareSSE();
BxPackedXmmRegister op1 = BX_READ_XMM_REG(i->nnn()), op2;
/* op2 is a register or memory reference */
if (i->modC0()) {
op2 = BX_READ_XMM_REG(i->rm());
}
else {
/* pointer, segment address pair */
readVirtualDQwordAligned(i->seg(), RMAddr(i), (Bit8u *) &op2);
}
op1.xmm64u(0) |= op2.xmm64u(0);
op1.xmm64u(1) |= op2.xmm64u(1);
/* now write result back to destination */
BX_WRITE_XMM_REG(i->nnn(), op1);
#else
BX_INFO(("ORPS/ORPD/POR_VdqWdq: SSE not supported in current configuration"));
UndefinedOpcode(i);
#endif
}
/* XORPS: 0F 57 */
/* XORPD: 66 0F 57 */
/* PXOR: F3 0F EF */
void BX_CPU_C::PXOR_VdqWdq(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 1
BX_CPU_THIS_PTR prepareSSE();
BxPackedXmmRegister op1 = BX_READ_XMM_REG(i->nnn()), op2;
/* op2 is a register or memory reference */
if (i->modC0()) {
op2 = BX_READ_XMM_REG(i->rm());
}
else {
/* pointer, segment address pair */
readVirtualDQwordAligned(i->seg(), RMAddr(i), (Bit8u *) &op2);
}
op1.xmm64u(0) ^= op2.xmm64u(0);
op1.xmm64u(1) ^= op2.xmm64u(1);
/* now write result back to destination */
BX_WRITE_XMM_REG(i->nnn(), op1);
#else
BX_INFO(("XORPS/XORPD/PXOR_VdqWdq: SSE not supported in current configuration"));
UndefinedOpcode(i);
#endif
}

View File

@ -24,42 +24,6 @@
#include "bochs.h"
#define LOG_THIS BX_CPU_THIS_PTR
void BX_CPU_C::MOVAPD_VpdWpd(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 2
BX_CPU_THIS_PTR prepareSSE();
BX_PANIC(("MOVAPD_VpdWpd: SSE instruction still not implemented"));
#else
BX_INFO(("MOVAPD_VpdWpd: SSE not supported in current configuration"));
UndefinedOpcode(i);
#endif
}
void BX_CPU_C::MOVAPD_WpdVpd(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 2
BX_CPU_THIS_PTR prepareSSE();
BX_PANIC(("MOVAPD_WpdVpd: SSE instruction still not implemented"));
#else
BX_INFO(("MOVAPD_WpdVpd: SSE not supported in current configuration"));
UndefinedOpcode(i);
#endif
}
void BX_CPU_C::MOVUPD_VpdWpd(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 2
BX_CPU_THIS_PTR prepareSSE();
BX_PANIC(("MOVUPD_VpdWpd: SSE2 instruction still not implemented"));
#else
BX_INFO(("MOVUPD_VpdWpd: SSE2 not supported in current configuration"));
UndefinedOpcode(i);
#endif
}
void BX_CPU_C::MOVSD_VsdWsd(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 2
@ -72,18 +36,6 @@ void BX_CPU_C::MOVSD_VsdWsd(bxInstruction_c *i)
#endif
}
void BX_CPU_C::MOVUPD_WpdVpd(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 2
BX_CPU_THIS_PTR prepareSSE();
BX_PANIC(("MOVUPD_WpdVpd: SSE2 instruction still not implemented"));
#else
BX_INFO(("MOVUPD_WpdVpd: SSE2 not supported in current configuration"));
UndefinedOpcode(i);
#endif
}
void BX_CPU_C::MOVSD_WsdVsd(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 2
@ -252,54 +204,6 @@ void BX_CPU_C::SQRTSD_VsdWsd(bxInstruction_c *i)
#endif
}
void BX_CPU_C::ANDPD_VpdWpd(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 2
BX_CPU_THIS_PTR prepareSSE();
BX_PANIC(("ANDPD_VpdWpd: SSE2 instruction still not implemented"));
#else
BX_INFO(("ANDPD_VpdWpd: SSE2 not supported in current configuration"));
UndefinedOpcode(i);
#endif
}
void BX_CPU_C::ANDNPD_VpdWpd(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 2
BX_CPU_THIS_PTR prepareSSE();
BX_PANIC(("ANDNPD_VpdWpd: SSE2 instruction still not implemented"));
#else
BX_INFO(("ANDNPD_VpdWpd: SSE2 not supported in current configuration"));
UndefinedOpcode(i);
#endif
}
void BX_CPU_C::ORPD_VpdWpd(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 2
BX_CPU_THIS_PTR prepareSSE();
BX_PANIC(("ORPD_VpdWpd: SSE2 instruction still not implemented"));
#else
BX_INFO(("ORPD_VpdWpd: SSE2 not supported in current configuration"));
UndefinedOpcode(i);
#endif
}
void BX_CPU_C::XORPD_VpdWpd(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 2
BX_CPU_THIS_PTR prepareSSE();
BX_PANIC(("XORPD_VpdWpd: SSE2 instruction still not implemented"));
#else
BX_INFO(("XORPD_VpdWpd: SSE2 not supported in current configuration"));
UndefinedOpcode(i);
#endif
}
void BX_CPU_C::ADDPD_VpdWpd(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 2
@ -1040,56 +944,6 @@ void BX_CPU_C::MOVD_VdqEd(bxInstruction_c *i)
#endif
}
/* 66 0F 6F */
void BX_CPU_C::MOVDQA_VdqWdq(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 2
BX_CPU_THIS_PTR prepareSSE();
BxPackedXmmRegister op;
/* op is a register or memory reference */
if (i->modC0()) {
op = BX_READ_XMM_REG(i->rm());
}
else {
/* pointer, segment address pair */
readVirtualDQwordAligned(i->seg(), RMAddr(i), (Bit8u *) &op);
}
/* now write result back to destination */
BX_WRITE_XMM_REG(i->nnn(), op);
#else
BX_INFO(("MOVDQA_VdqWdq: SSE2 not supported in current configuration"));
UndefinedOpcode(i);
#endif
}
/* F3 0F 6F */
void BX_CPU_C::MOVDQU_VdqWdq(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 2
BX_CPU_THIS_PTR prepareSSE();
BxPackedXmmRegister op;
/* op is a register or memory reference */
if (i->modC0()) {
op = BX_READ_XMM_REG(i->rm());
}
else {
/* pointer, segment address pair */
readVirtualDQword(i->seg(), RMAddr(i), (Bit8u *) &op);
}
/* now write result back to destination */
BX_WRITE_XMM_REG(i->nnn(), op);
#else
BX_INFO(("MOVDQU_VdqWdq: SSE2 not supported in current configuration"));
UndefinedOpcode(i);
#endif
}
/* 66 0F 70 */
void BX_CPU_C::PSHUFD_VdqWdqIb(bxInstruction_c *i)
{
@ -1312,48 +1166,6 @@ void BX_CPU_C::MOVQ_VqWq(bxInstruction_c *i)
#endif
}
/* 66 0F 7F */
void BX_CPU_C::MOVDQA_WdqVdq(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 2
BX_CPU_THIS_PTR prepareSSE();
BxPackedXmmRegister op = BX_READ_XMM_REG(i->nnn());
/* op is a register or memory reference */
if (i->modC0()) {
BX_WRITE_XMM_REG(i->rm(), op);
}
else {
writeVirtualDQwordAligned(i->seg(), RMAddr(i), (Bit8u *) &op);
}
#else
BX_INFO(("MOVDQA_WdqVdq: SSE2 not supported in current configuration"));
UndefinedOpcode(i);
#endif
}
/* F3 0F 7F */
void BX_CPU_C::MOVDQU_WdqVdq(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 2
BX_CPU_THIS_PTR prepareSSE();
BxPackedXmmRegister op = BX_READ_XMM_REG(i->nnn());
/* op is a register or memory reference */
if (i->modC0()) {
BX_WRITE_XMM_REG(i->rm(), op);
}
else {
writeVirtualDQword(i->seg(), RMAddr(i), (Bit8u *) &op);
}
#else
BX_INFO(("MOVDQU_WdqVdq: SSE2 not supported in current configuration"));
UndefinedOpcode(i);
#endif
}
void BX_CPU_C::CMPPD_VpdWpdIb(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 2
@ -1797,34 +1609,6 @@ void BX_CPU_C::PMINUB_VdqWdq(bxInstruction_c *i)
#endif
}
/* 66 0F DB */
void BX_CPU_C::PAND_VdqWdq(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 2
BX_CPU_THIS_PTR prepareSSE();
BxPackedXmmRegister op1 = BX_READ_XMM_REG(i->nnn()), op2;
/* op2 is a register or memory reference */
if (i->modC0()) {
op2 = BX_READ_XMM_REG(i->rm());
}
else {
/* pointer, segment address pair */
readVirtualDQwordAligned(i->seg(), RMAddr(i), (Bit8u *) &op2);
}
op1.xmm64u(0) &= op2.xmm64u(0);
op1.xmm64u(1) &= op2.xmm64u(1);
/* now write result back to destination */
BX_WRITE_XMM_REG(i->nnn(), op1);
#else
BX_INFO(("PAND_VdqWdq: SSE2 not supported in current configuration"));
UndefinedOpcode(i);
#endif
}
/* 66 0F DC */
void BX_CPU_C::PADDUSB_VdqWdq(bxInstruction_c *i)
{
@ -1919,34 +1703,6 @@ void BX_CPU_C::PMAXUB_VdqWdq(bxInstruction_c *i)
#endif
}
/* 66 0F DF */
void BX_CPU_C::PANDN_VdqWdq(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 2
BX_CPU_THIS_PTR prepareSSE();
BxPackedXmmRegister op1 = BX_READ_XMM_REG(i->nnn()), op2, result;
/* op2 is a register or memory reference */
if (i->modC0()) {
op2 = BX_READ_XMM_REG(i->rm());
}
else {
/* pointer, segment address pair */
readVirtualDQwordAligned(i->seg(), RMAddr(i), (Bit8u *) &op2);
}
result.xmm64u(0) = ~(op1.xmm64u(0)) & op2.xmm64u(0);
result.xmm64u(1) = ~(op1.xmm64u(1)) & op2.xmm64u(1);
/* now write result back to destination */
BX_WRITE_XMM_REG(i->nnn(), result);
#else
BX_INFO(("PANDN_VdqWdq: SSE2 not supported in current configuration"));
UndefinedOpcode(i);
#endif
}
/* 66 0F E0 */
void BX_CPU_C::PAVGB_VdqWdq(bxInstruction_c *i)
{
@ -2350,34 +2106,6 @@ void BX_CPU_C::PMINSW_VdqWdq(bxInstruction_c *i)
#endif
}
/* 66 0F EB */
void BX_CPU_C::POR_VdqWdq(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 2
BX_CPU_THIS_PTR prepareSSE();
BxPackedXmmRegister op1 = BX_READ_XMM_REG(i->nnn()), op2;
/* op2 is a register or memory reference */
if (i->modC0()) {
op2 = BX_READ_XMM_REG(i->rm());
}
else {
/* pointer, segment address pair */
readVirtualDQwordAligned(i->seg(), RMAddr(i), (Bit8u *) &op2);
}
op1.xmm64u(0) |= op2.xmm64u(0);
op1.xmm64u(1) |= op2.xmm64u(1);
/* now write result back to destination */
BX_WRITE_XMM_REG(i->nnn(), op1);
#else
BX_INFO(("POR_VdqWdq: SSE2 not supported in current configuration"));
UndefinedOpcode(i);
#endif
}
/* 66 0F EC */
void BX_CPU_C::PADDSB_VdqWdq(bxInstruction_c *i)
{
@ -2475,34 +2203,6 @@ void BX_CPU_C::PMAXSW_VdqWdq(bxInstruction_c *i)
#endif
}
/* 66 0F EF */
void BX_CPU_C::PXOR_VdqWdq(bxInstruction_c *i)
{
#if BX_SUPPORT_SSE >= 2
BX_CPU_THIS_PTR prepareSSE();
BxPackedXmmRegister op1 = BX_READ_XMM_REG(i->nnn()), op2;
/* op2 is a register or memory reference */
if (i->modC0()) {
op2 = BX_READ_XMM_REG(i->rm());
}
else {
/* pointer, segment address pair */
readVirtualDQwordAligned(i->seg(), RMAddr(i), (Bit8u *) &op2);
}
op1.xmm64u(0) ^= op2.xmm64u(0);
op1.xmm64u(1) ^= op2.xmm64u(1);
/* now write result back to destination */
BX_WRITE_XMM_REG(i->nnn(), op1);
#else
BX_INFO(("PXOR_VdqWdq: SSE2 not supported in current configuration"));
UndefinedOpcode(i);
#endif
}
/* 66 0F F1 */
void BX_CPU_C::PSLLW_VdqWdq(bxInstruction_c *i)
{