diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-26 21:40:39 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-26 21:40:39 +0100 |
| commit | 1a750182d625a80d4f89fa9f046a447f0cd50aed (patch) | |
| tree | 35df9e016873a727a2dc40244f47ce758b90d5f9 /src | |
| parent | 03a69053a63b73614b80543ad4bdb3d5a878c9fe (diff) | |
| download | box64-1a750182d625a80d4f89fa9f046a447f0cd50aed.tar.gz box64-1a750182d625a80d4f89fa9f046a447f0cd50aed.zip | |
[DYNAREC] Added some more 66 0F opcodes, plus a few small bug fixes
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/dynarec_arm64_0f.c | 10 | ||||
| -rwxr-xr-x | src/dynarec/dynarec_arm64_660f.c | 81 | ||||
| -rw-r--r-- | src/emu/x64run660f.c | 4 |
3 files changed, 86 insertions, 9 deletions
diff --git a/src/dynarec/dynarec_arm64_0f.c b/src/dynarec/dynarec_arm64_0f.c index 6a9a8dff..d9857d42 100755 --- a/src/dynarec/dynarec_arm64_0f.c +++ b/src/dynarec/dynarec_arm64_0f.c @@ -39,7 +39,7 @@ if(MODREG) { \ a = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3)); \ } else { \ - addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<4, 15, rex, 0, 0); \ + addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<4, 15, rex, 0, D); \ a = fpu_get_scratch(dyn); \ VLDR128_U12(a, ed, fixedaddress); \ } @@ -639,7 +639,7 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin ed = xRAX+(nextop&7)+(rex.b<<3); u8 = F8; } else { - addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xff0<<2, 3, rex, 0, 0); + addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xff0<<2, 3, rex, 0, 1); u8 = F8; fixedaddress+=(u8>>(rex.w?6:5))*(rex.w?8:4); LDRxw_U12(x1, wback, fixedaddress); @@ -660,7 +660,7 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin u8 = F8; wback = 0; } else { - addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xff0<<2, 3, rex, 0, 0); + addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xff0<<2, 3, rex, 0, 1); u8 = F8; fixedaddress+=(u8>>(rex.w?6:5))*(rex.w?8:4); LDRxw_U12(x1, wback, fixedaddress); @@ -684,7 +684,7 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin u8 = F8; wback = 0; } else { - addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xff0<<2, 3, rex, 0, 0); + addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xff0<<2, 3, rex, 0, 1); u8 = F8; fixedaddress+=(u8>>(rex.w?6:5))*(rex.w?8:4); LDRxw_U12(x1, wback, fixedaddress); @@ -708,7 +708,7 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin u8 = F8; wback = 0; } else { - addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xff0<<2, 3, rex, 0, 0); + addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xff0<<2, 3, rex, 0, 1); u8 = F8; fixedaddress+=(u8>>(rex.w?6:5))*(rex.w?8:4); LDRxw_U12(x1, wback, fixedaddress); diff --git a/src/dynarec/dynarec_arm64_660f.c b/src/dynarec/dynarec_arm64_660f.c index c35f0224..6fce1a6f 100755 --- a/src/dynarec/dynarec_arm64_660f.c +++ b/src/dynarec/dynarec_arm64_660f.c @@ -61,13 +61,39 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n MAYUSE(eb1); MAYUSE(eb2); MAYUSE(j32); - #if 0//STEP == 3 + #if 0//STEP > 1 static const int8_t mask_shift8[] = { -7, -6, -5, -4, -3, -2, -1, 0 }; #endif switch(opcode) { - + case 0x10: + INST_NAME("MOVUPD Gx,Ex"); + nextop = F8; + GETG; + if(MODREG) { + v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3)); + v0 = sse_get_reg_empty(dyn, ninst, x1, gd); + VMOVQ(v0, v1); + } else { + v0 = sse_get_reg_empty(dyn, ninst, x1, gd); + addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<4, 15, rex, 0, 0); + VLDR128_U12(v0, ed, fixedaddress); + } + break; + case 0x11: + INST_NAME("MOVUPD Ex,Gx"); + nextop = F8; + GETG; + v0 = sse_get_reg(dyn, ninst, x1, gd); + if(MODREG) { + v1 = sse_get_reg_empty(dyn, ninst, x1, (nextop&7)+(rex.b<<3)); + VMOVQ(v1, v0); + } else { + addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<4, 15, rex, 0, 0); + VSTR128_U12(v0, ed, fixedaddress); + } + break; case 0x12: INST_NAME("MOVLPD Gx, Eq"); nextop = F8; @@ -628,6 +654,28 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n } break; + case 0x74: + INST_NAME("PCMPEQB Gx,Ex"); + nextop = F8; + GETGX(v0); + GETEX(q0, 0); + VCMEQQ_8(v0, v0, q0); + break; + case 0x75: + INST_NAME("PCMPEQW Gx,Ex"); + nextop = F8; + GETGX(v0); + GETEX(q0, 0); + VCMEQQ_16(v0, v0, q0); + break; + case 0x76: + INST_NAME("PCMPEQD Gx,Ex"); + nextop = F8; + GETGX(v0); + GETEX(q0, 0); + VCMEQQ_32(v0, v0, q0); + break; + case 0x7E: INST_NAME("MOVD Ed,Gx"); nextop = F8; @@ -829,6 +877,35 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n BFIx(gd, x1, 0, 16); break; + case 0xC4: + INST_NAME("PINSRW Gx,Ed,Ib"); + nextop = F8; + GETGX(v0); + if(MODREG) { + u8 = (F8)&7; + ed = xRAX+(nextop&7)+(rex.b<<3); + VMOVHto(ed, v0, u8); + } else { + addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0, 0, rex, 0, 1); + u8 = (F8)&7; + VLD1_16(wback, v0, u8); + } + break; + case 0xC5: + INST_NAME("PEXTRW Gd,Ex,Ib"); + nextop = F8; + GETG; + if(MODREG) { + GETEX(v0, 1); + u8 = (F8)&7; + VMOVQHfrom(v0, u8, gd); + } else { + addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0, 0, rex, 0, 1); + u8 = (F8)&7; + LDRH_U12(gd, wback, u8*2); + } + break; + case 0xD4: INST_NAME("PADDQ Gx,Ex"); diff --git a/src/emu/x64run660f.c b/src/emu/x64run660f.c index a6d6acd5..7227f6f0 100644 --- a/src/emu/x64run660f.c +++ b/src/emu/x64run660f.c @@ -862,14 +862,14 @@ int Run660F(x64emu_t *emu, rex_t rex) case 0xC4: /* PINSRW Gx,Ew,Ib */ nextop = F8; - GETED(0); + GETED(1); GETGX; tmp8u = F8; GX->uw[tmp8u&7] = ED->word[0]; // only low 16bits break; case 0xC5: /* PEXTRW Gw,Ex,Ib */ nextop = F8; - GETEX(0); + GETEX(1); GETGD; tmp8u = F8; GD->dword[0] = EX->uw[tmp8u&7]; // 16bits extract, 0 extended |