diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_0f.c | 42 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.h | 9 |
2 files changed, 34 insertions, 17 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_0f.c b/src/dynarec/rv64/dynarec_rv64_0f.c index f080581d..520b1817 100644 --- a/src/dynarec/rv64/dynarec_rv64_0f.c +++ b/src/dynarec/rv64/dynarec_rv64_0f.c @@ -139,18 +139,14 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni nextop = F8; if(MODREG) { INST_NAME("MOVLHPS Gx,Ex"); - GETGX(x1); - GETEX(x2, 0); - LD(x4, wback, 0); - SD(x4, gback, fixedaddress+8); } else { INST_NAME("MOVHPS Gx,Ex"); SMREAD(); - GETGX(x1); - GETEX(x2, 0); - LD(x4, wback, 0); - SD(x4, gback, fixedaddress+8); } + GETGX(x1); + GETEX(x2, 0); + LD(x4, wback, fixedaddress+0); + SD(x4, gback, 8); break; case 0x18: nextop = F8; @@ -187,20 +183,14 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni nextop = F8; GETGX(x1); GETEX(x2, 0); - LD(x3, wback, fixedaddress+0); - LD(x4, wback, fixedaddress+8); - SD(x3, gback, 0); - SD(x4, gback, 8); + SSE_LOOP_MV_Q(x3); break; case 0x29: INST_NAME("MOVAPS Ex,Gx"); nextop = F8; GETGX(x1); GETEX(x2, 0); - LD(x3, gback, 0); - LD(x4, gback, 8); - SD(x3, wback, fixedaddress+0); - SD(x4, wback, fixedaddress+8); + SSE_LOOP_MV_Q2(x3); if(!MODREG) SMWRITE2(); break; @@ -516,7 +506,25 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni LHU(gd, ed, fixedaddress); } break; - + case 0xBA: + nextop = F8; + switch((nextop>>3)&7) { + case 4: + INST_NAME("BT Ed, Ib"); + SETFLAGS(X_CF, SF_SUBSET); + SET_DFNONE(); + GETED(1); + u8 = F8; + u8&=rex.w?0x3f:0x1f; + SRLIxw(x3, ed, u8); + ANDI(x3, x3, 1); // F_CF is 1 + ANDI(xFlags, xFlags, ~1); + OR(xFlags, xFlags, x3); + break; + default: + DEFAULT; + } + break; case 0xBE: INST_NAME("MOVSX Gd, Eb"); nextop = F8; diff --git a/src/dynarec/rv64/dynarec_rv64_helper.h b/src/dynarec/rv64/dynarec_rv64_helper.h index be5931d6..4fb77d50 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.h +++ b/src/dynarec/rv64/dynarec_rv64_helper.h @@ -374,6 +374,15 @@ SSE_LOOP_MV_Q_ITEM(s, 0) \ SSE_LOOP_MV_Q_ITEM(s, 1) +#define SSE_LOOP_MV_Q_ITEM2(s, i) \ + LD(s, gback, i*8); \ + SD(s, wback, fixedaddress+i*8); + +// Loop for SSE opcode that moves 64bits value from gback to wback, use s as scratch. +#define SSE_LOOP_MV_Q2(s) \ + SSE_LOOP_MV_Q_ITEM2(s, 0) \ + SSE_LOOP_MV_Q_ITEM2(s, 1) + // CALL will use x6 for the call address. Return value can be put in ret (unless ret is -1) // R0 will not be pushed/popd if ret is -2 #define CALL(F, ret) call_c(dyn, ninst, F, x6, ret, 1, 0) |