diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-03-08 15:01:17 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-03-08 15:01:17 +0100 |
| commit | 35ed305718688dc28c967167c3cdffbafce50ab0 (patch) | |
| tree | a3cab7da3eaa45f6e3bc5ae75370f8d4d2d27c47 | |
| parent | d3c57eecbca09b77d0ad9647d89f12fc9b4b0939 (diff) | |
| download | box64-35ed305718688dc28c967167c3cdffbafce50ab0.tar.gz box64-35ed305718688dc28c967167c3cdffbafce50ab0.zip | |
[ARM64_DYNAREC] Added 66 64 0F 6F opcode (for #1349)
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_6664.c | 77 |
1 files changed, 47 insertions, 30 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_6664.c b/src/dynarec/arm64/dynarec_arm64_6664.c index 8a616db6..0372a8a1 100644 --- a/src/dynarec/arm64/dynarec_arm64_6664.c +++ b/src/dynarec/arm64/dynarec_arm64_6664.c @@ -66,36 +66,53 @@ uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n FCMPD(v0, v1); FCOMI(x1, x2); break; - case 0xD6: - INST_NAME("MOVQ Ex, Gx"); - nextop = F8; - GETG; - v0 = sse_get_reg(dyn, ninst, x1, gd, 0); - if(MODREG) { - v1 = sse_get_reg_empty(dyn, ninst, x1, (nextop&7) + (rex.b<<3)); - FMOVD(v1, v0); - } else { - grab_segdata(dyn, addr, ninst, x4, seg); - addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0); - VSTR64_REG(v0, ed, x4); - SMWRITE(); - } - break; - - case 0x7F: - INST_NAME("MOVDQA Ex,Gx"); - nextop = F8; - GETGX(v0, 0); - if(MODREG) { - v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 1); - VMOVQ(v1, v0); - } else { - grab_segdata(dyn, addr, ninst, x4, seg); - addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0); - VSTR128_REG(v0, ed, x4); - SMWRITE2(); - } - break; + + case 0x6F: + INST_NAME("MOVDQA Gx,Ex"); + nextop = F8; + if(MODREG) { + v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0); + GETGX_empty(v0); + VMOVQ(v0, v1); + } else { + GETGX_empty(v0); + grab_segdata(dyn, addr, ninst, x4, seg); + addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0); + SMREAD(); + VLDR128_REG(v0, ed, x4); + } + break; + + case 0x7F: + INST_NAME("MOVDQA Ex,Gx"); + nextop = F8; + GETGX(v0, 0); + if(MODREG) { + v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 1); + VMOVQ(v1, v0); + } else { + grab_segdata(dyn, addr, ninst, x4, seg); + addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0); + VSTR128_REG(v0, ed, x4); + SMWRITE2(); + } + break; + + case 0xD6: + INST_NAME("MOVQ Ex, Gx"); + nextop = F8; + GETG; + v0 = sse_get_reg(dyn, ninst, x1, gd, 0); + if(MODREG) { + v1 = sse_get_reg_empty(dyn, ninst, x1, (nextop&7) + (rex.b<<3)); + FMOVD(v1, v0); + } else { + grab_segdata(dyn, addr, ninst, x4, seg); + addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0); + VSTR64_REG(v0, ed, x4); + SMWRITE(); + } + break; default: DEFAULT; |