Add MMX compare ops

This commit is contained in:
Afonso Bordado 2019-09-26 16:56:19 +00:00
parent 2099b0866c
commit 0d4e4081c4
3 changed files with 103 additions and 4 deletions

View File

@ -367,6 +367,31 @@
GM.sb[7] = (EM->sw[3] > 127) ? 127 : ((EM->sw[3] < -128) ? -128 : EM->sw[3]);
NEXT;
_0f_0x64: /* PCMPGTB Gm,Em */
nextop = F8;
GET_EM;
for (int i = 0; i < 8; i++) {
GM.sb[i] = (GM.sb[i] > EM->sb[i]) ? 0xFF : 0;
}
NEXT;
_0f_0x65: /* PCMPGTW Gm,Em */
nextop = F8;
GET_EM;
for (int i = 0; i < 4; i++) {
GM.sw[i] = (GM.sw[i] > EM->sw[i]) ? 0xFFFF : 0;
}
NEXT;
_0f_0x66: /* PCMPGTD Gm,Em */
nextop = F8;
GET_EM;
for (int i = 0; i < 2; i++) {
GM.sd[i] = (GM.sd[i] > EM->sd[i]) ? 0xFFFFFFFF : 0;
}
NEXT;
_0f_0x67: /* PACKUSWB Gm, Em */
nextop = F8;
GET_EM;
@ -480,6 +505,30 @@
}
NEXT;
_0f_0x74: /* PCMPEQB Gm,Em */
nextop = F8;
GET_EM;
for (int i = 0; i < 8; i++) {
GM.sb[i] = (GM.sb[i] == EM->sb[i]) ? 0xFF : 0;
}
NEXT;
_0f_0x75: /* PCMPEQW Gm,Em */
nextop = F8;
GET_EM;
for (int i = 0; i < 4; i++) {
GM.sw[i] = (GM.sw[i] == EM->sw[i]) ? 0xFFFF : 0;
}
NEXT;
_0f_0x76: /* PCMPEQD Gm,Em */
nextop = F8;
GET_EM;
for (int i = 0; i < 2; i++) {
GM.sd[i] = (GM.sd[i] == EM->sd[i]) ? 0xFFFFFFFF : 0;
}
NEXT;
_0f_0x77: /* EMMS */
// empty MMX, FPU now usable
emu->top = 0;

View File

@ -107,9 +107,9 @@ int Run(x86emu_t *emu)
&&_0f_0x40_8, &&_0f_0x40_9, &&_0f_0x40_A, &&_0f_0x40_B, &&_0f_0x40_C, &&_0f_0x40_D, &&_0f_0x40_E, &&_0f_0x40_F,
&&_0f_0x50, &&_0f_0x51, &&_0f_0x52, &&_default, &&_0f_0x54, &&_0f_0x55, &&_0f_0x56, &&_0f_0x57, //0x50-0x57
&&_0f_0x58, &&_0f_0x59, &&_0f_0x5A, &&_0f_0x5B, &&_0f_0x5C, &&_0f_0x5D, &&_0f_0x5E, &&_0f_0x5F,
&&_0f_0x60, &&_0f_0x61, &&_0f_0x62, &&_0f_0x63, &&_default ,&&_default, &&_default, &&_0f_0x67, //0x60-0x67
&&_0f_0x60, &&_0f_0x61, &&_0f_0x62, &&_0f_0x63, &&_0f_0x64 ,&&_0f_0x65, &&_0f_0x66, &&_0f_0x67, //0x60-0x67
&&_0f_0x68, &&_0f_0x69, &&_0f_0x6A, &&_0f_0x6B, &&_default ,&&_default, &&_0f_0x6E, &&_0f_0x6F, //0x68-0x6F
&&_0f_0x70, &&_0f_0x71, &&_default, &&_0f_0x73, &&_default ,&&_default, &&_default, &&_0f_0x77, //0x70-0x77
&&_0f_0x70, &&_0f_0x71, &&_default, &&_0f_0x73, &&_0f_0x74 ,&&_0f_0x75, &&_0f_0x76, &&_0f_0x77, //0x70-0x77
&&_default, &&_default, &&_default, &&_default, &&_default ,&&_default, &&_0f_0x7E, &&_0f_0x7F, //0x78-0x7F
&&_0f_0x80_0, &&_0f_0x80_1, &&_0f_0x80_2, &&_0f_0x80_3, &&_0f_0x80_4, &&_0f_0x80_5, &&_0f_0x80_6, &&_0f_0x80_7,
&&_0f_0x80_8, &&_0f_0x80_9, &&_0f_0x80_A, &&_0f_0x80_B, &&_0f_0x80_C, &&_0f_0x80_D, &&_0f_0x80_E, &&_0f_0x80_F,

View File

@ -410,8 +410,6 @@ mmx_u64_test_t mmx_punpcklwd_test_data[] = {
};
MMX_64_TEST(test_mmx_punpckhbw, mmx_punpckhbw_test_data, _m_punpckhbw);
MMX_64_TEST(test_mmx_punpckhdq, mmx_punpckhdq_test_data, _m_punpckhdq);
MMX_64_TEST(test_mmx_punpckhwd, mmx_punpckhwd_test_data, _m_punpckhwd);
@ -424,6 +422,50 @@ MMX_64_TEST(test_mmx_punpcklwd, mmx_punpcklwd_test_data, _m_punpcklwd);
mmx_u64_test_t mmx_pcmpeqb_test_data[] = {
{ .a = 0x8877665544332211,
.b = 0x0077005500330011,
.result = 0x00FF00FF00FF00FF },
};
mmx_u64_test_t mmx_pcmpeqw_test_data[] = {
{ .a = 0x4444333322221111,
.b = 0x0000333300001111,
.result = 0x0000FFFF0000FFFF },
};
mmx_u64_test_t mmx_pcmpeqd_test_data[] = {
{ .a = 0x2222222211111111,
.b = 0x2222222200000000,
.result = 0xFFFFFFFF00000000 },
};
mmx_u64_test_t mmx_pcmpgtb_test_data[] = {
{ .a = 0x0000000000002201,
.b = 0x0000000000002300,
.result = 0x00000000000000FF },
};
mmx_u64_test_t mmx_pcmpgtw_test_data[] = {
{ .a = 0x4444333322221111,
.b = 0x0000333300001112,
.result = 0xFFFF0000FFFF0000 },
};
mmx_u64_test_t mmx_pcmpgtd_test_data[] = {
{ .a = 0x2222222111111111,
.b = 0x2222222200000000,
.result = 0x00000000FFFFFFFF },
};
MMX_64_TEST(test_mmx_pcmpeqb, mmx_pcmpeqb_test_data, _m_pcmpeqb);
MMX_64_TEST(test_mmx_pcmpeqw, mmx_pcmpeqw_test_data, _m_pcmpeqw);
MMX_64_TEST(test_mmx_pcmpeqd, mmx_pcmpeqd_test_data, _m_pcmpeqd);
MMX_64_TEST(test_mmx_pcmpgtb, mmx_pcmpgtb_test_data, _m_pcmpgtb);
MMX_64_TEST(test_mmx_pcmpgtw, mmx_pcmpgtw_test_data, _m_pcmpgtw);
MMX_64_TEST(test_mmx_pcmpgtd, mmx_pcmpgtd_test_data, _m_pcmpgtd);
bool test_mmx_cpuid() {
printf("TEST: test_mmx_cpuid\n");
@ -484,6 +526,14 @@ int main() {
errors += (int) test_mmx_punpckldq();
errors += (int) test_mmx_punpcklwd();
errors += (int) test_mmx_pcmpeqb();
errors += (int) test_mmx_pcmpeqw();
errors += (int) test_mmx_pcmpeqd();
errors += (int) test_mmx_pcmpgtb();
errors += (int) test_mmx_pcmpgtw();
errors += (int) test_mmx_pcmpgtd();
printf("Errors: %d\n", errors);
return errors;
}