diff options
| author | Yang Liu <numbksco@gmail.com> | 2024-05-15 17:22:03 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-05-15 11:22:03 +0200 |
| commit | 75110ac02836b48b306ea99b62e3515c5229dff3 (patch) | |
| tree | 9d615f9f467eab6850e3f2d9c27c5ac9f48681a8 /src | |
| parent | 57bfa3832827c7e61998b3e7edef0dd879bed1ce (diff) | |
| download | box64-75110ac02836b48b306ea99b62e3515c5229dff3.tar.gz box64-75110ac02836b48b306ea99b62e3515c5229dff3.zip | |
[LA64_DYNAREC] Added more opcodes (#1503)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_0f.c | 13 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_f20f.c | 13 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_f30f.c | 13 |
3 files changed, 39 insertions, 0 deletions
diff --git a/src/dynarec/la64/dynarec_la64_0f.c b/src/dynarec/la64/dynarec_la64_0f.c index b63bdca4..7e415b72 100644 --- a/src/dynarec/la64/dynarec_la64_0f.c +++ b/src/dynarec/la64/dynarec_la64_0f.c @@ -150,6 +150,19 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni VEXTRINS_D(v0, q1, 0); } break; + case 0x13: + nextop = F8; + INST_NAME("MOVLPS Ex,Gx"); + GETGX(v0, 0); + if(MODREG) { + v1 = sse_get_reg(dyn, ninst, x1, (nextop & 7) + (rex.b << 3), 1); + VEXTRINS_D(v1, v0, 0); + } else { + addr = geted(dyn, addr, ninst, nextop, &ed, x2, x3, &fixedaddress, rex, NULL, 1, 0); + FST_D(v0, ed, fixedaddress); + SMWRITE2(); + } + break; case 0x14: INST_NAME("UNPCKLPS Gx, Ex"); nextop = F8; diff --git a/src/dynarec/la64/dynarec_la64_f20f.c b/src/dynarec/la64/dynarec_la64_f20f.c index d9d474e6..b6e060ea 100644 --- a/src/dynarec/la64/dynarec_la64_f20f.c +++ b/src/dynarec/la64/dynarec_la64_f20f.c @@ -229,6 +229,19 @@ uintptr_t dynarec64_F20F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int MARK; VEXTRINS_D(v0, d0, 0); // v0[63:0] = d0[63:0] break; + case 0x5F: + INST_NAME("MAXSD Gx, Ex"); + nextop = F8; + GETGX(v0, 1); + GETEXSD(v1, 0, 0); + FCMP_D(fcc0, v0, v1, cUN); + BCNEZ_MARK(fcc0); + FCMP_D(fcc1, v0, v1, cLE); + BCEQZ_MARK2(fcc1); + MARK; + VEXTRINS_D(v0, v1, 0); + MARK2; + break; case 0xC2: INST_NAME("CMPSD Gx, Ex, Ib"); nextop = F8; diff --git a/src/dynarec/la64/dynarec_la64_f30f.c b/src/dynarec/la64/dynarec_la64_f30f.c index f0433cd7..cd72ded4 100644 --- a/src/dynarec/la64/dynarec_la64_f30f.c +++ b/src/dynarec/la64/dynarec_la64_f30f.c @@ -241,6 +241,19 @@ uintptr_t dynarec64_F30F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int } VEXTRINS_D(v0, v1, 0); // v0[63:0] = v1[63:0] break; + case 0x7F: + INST_NAME("MOVDQU Ex,Gx"); + nextop = F8; + GETGX(v0, 0); + if(MODREG) { + v1 = sse_get_reg_empty(dyn, ninst, x1, (nextop & 7) + (rex.b << 3)); + VOR_V(v1, v0, v0); + } else { + addr = geted(dyn, addr, ninst, nextop, &ed, x1, x2, &fixedaddress, rex, NULL, 1, 0); + VST(v0, ed, fixedaddress); + SMWRITE2(); + } + break; case 0xC2: INST_NAME("CMPSS Gx, Ex, Ib"); nextop = F8; |