mirror of
https://github.com/ptitSeb/box64.git
synced 2024-11-27 03:43:52 +08:00
[RV64_DYNAREC] Split 660f.c to speedup compilation a bit (#1924)
This commit is contained in:
parent
f65feaf9da
commit
143fc90a4c
@ -956,6 +956,7 @@ if(RV64_DYNAREC)
|
||||
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_df.c"
|
||||
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_f0.c"
|
||||
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_660f.c"
|
||||
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_660f38.c"
|
||||
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_660f_vector.c"
|
||||
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_66f20f.c"
|
||||
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_66f30f.c"
|
||||
|
@ -1652,69 +1652,67 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
|
||||
LD(x3, gback, gdoffset + 0);
|
||||
SD(x3, wback, fixedaddress);
|
||||
break;
|
||||
#define GO(GETFLAGS, NO, YES, F) \
|
||||
READFLAGS(F); \
|
||||
i32_ = F32S; \
|
||||
if(rex.is32bits) \
|
||||
j64 = (uint32_t)(addr+i32_); \
|
||||
else \
|
||||
j64 = addr+i32_; \
|
||||
BARRIER(BARRIER_MAYBE); \
|
||||
JUMP(j64, 1); \
|
||||
GETFLAGS; \
|
||||
if (dyn->insts[ninst].x64.jmp_insts == -1 || CHECK_CACHE()) { \
|
||||
/* out of the block */ \
|
||||
i32 = dyn->insts[ninst].epilog - (dyn->native_size); \
|
||||
B##NO##_safe(x1, i32); \
|
||||
if (dyn->insts[ninst].x64.jmp_insts == -1) { \
|
||||
if (!(dyn->insts[ninst].x64.barrier & BARRIER_FLOAT)) \
|
||||
fpu_purgecache(dyn, ninst, 1, x1, x2, x3); \
|
||||
jump_to_next(dyn, j64, 0, ninst, rex.is32bits); \
|
||||
} else { \
|
||||
CacheTransform(dyn, ninst, cacheupd, x1, x2, x3); \
|
||||
i32 = dyn->insts[dyn->insts[ninst].x64.jmp_insts].address - (dyn->native_size); \
|
||||
B(i32); \
|
||||
} \
|
||||
} else { \
|
||||
/* inside the block */ \
|
||||
i32 = dyn->insts[dyn->insts[ninst].x64.jmp_insts].address - (dyn->native_size); \
|
||||
B##YES##_safe(x1, i32); \
|
||||
}
|
||||
|
||||
#define GO(GETFLAGS, NO, YES, F) \
|
||||
READFLAGS(F); \
|
||||
i32_ = F32S; \
|
||||
if(rex.is32bits) \
|
||||
j64 = (uint32_t)(addr+i32_); \
|
||||
else \
|
||||
j64 = addr+i32_; \
|
||||
BARRIER(BARRIER_MAYBE); \
|
||||
JUMP(j64, 1); \
|
||||
GETFLAGS; \
|
||||
if (dyn->insts[ninst].x64.jmp_insts == -1 || CHECK_CACHE()) { \
|
||||
/* out of the block */ \
|
||||
i32 = dyn->insts[ninst].epilog - (dyn->native_size); \
|
||||
B##NO##_safe(x1, i32); \
|
||||
if (dyn->insts[ninst].x64.jmp_insts == -1) { \
|
||||
if (!(dyn->insts[ninst].x64.barrier & BARRIER_FLOAT)) \
|
||||
fpu_purgecache(dyn, ninst, 1, x1, x2, x3); \
|
||||
jump_to_next(dyn, j64, 0, ninst, rex.is32bits); \
|
||||
} else { \
|
||||
CacheTransform(dyn, ninst, cacheupd, x1, x2, x3); \
|
||||
i32 = dyn->insts[dyn->insts[ninst].x64.jmp_insts].address - (dyn->native_size); \
|
||||
B(i32); \
|
||||
} \
|
||||
} else { \
|
||||
/* inside the block */ \
|
||||
i32 = dyn->insts[dyn->insts[ninst].x64.jmp_insts].address - (dyn->native_size); \
|
||||
B##YES##_safe(x1, i32); \
|
||||
}
|
||||
GOCOND(0x80, "J", "Id");
|
||||
#undef GO
|
||||
|
||||
#define GO(GETFLAGS, NO, YES, F) \
|
||||
READFLAGS(F); \
|
||||
GETFLAGS; \
|
||||
nextop = F8; \
|
||||
S##YES(x3, x1); \
|
||||
if (MODREG) { \
|
||||
if (rex.rex) { \
|
||||
eb1 = xRAX + (nextop & 7) + (rex.b << 3); \
|
||||
eb2 = 0; \
|
||||
} else { \
|
||||
ed = (nextop & 7); \
|
||||
eb2 = (ed >> 2) * 8; \
|
||||
eb1 = xRAX + (ed & 3); \
|
||||
} \
|
||||
if (eb2) { \
|
||||
LUI(x1, 0xffff0); \
|
||||
ORI(x1, x1, 0xff); \
|
||||
AND(eb1, eb1, x1); \
|
||||
SLLI(x3, x3, 8); \
|
||||
} else { \
|
||||
ANDI(eb1, eb1, 0xf00); \
|
||||
} \
|
||||
OR(eb1, eb1, x3); \
|
||||
} else { \
|
||||
addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0); \
|
||||
SB(x3, ed, fixedaddress); \
|
||||
SMWRITE(); \
|
||||
}
|
||||
#undef GO
|
||||
|
||||
#define GO(GETFLAGS, NO, YES, F) \
|
||||
READFLAGS(F); \
|
||||
GETFLAGS; \
|
||||
nextop = F8; \
|
||||
S##YES(x3, x1); \
|
||||
if (MODREG) { \
|
||||
if (rex.rex) { \
|
||||
eb1 = xRAX + (nextop & 7) + (rex.b << 3); \
|
||||
eb2 = 0; \
|
||||
} else { \
|
||||
ed = (nextop & 7); \
|
||||
eb2 = (ed >> 2) * 8; \
|
||||
eb1 = xRAX + (ed & 3); \
|
||||
} \
|
||||
if (eb2) { \
|
||||
LUI(x1, 0xffff0); \
|
||||
ORI(x1, x1, 0xff); \
|
||||
AND(eb1, eb1, x1); \
|
||||
SLLI(x3, x3, 8); \
|
||||
} else { \
|
||||
ANDI(eb1, eb1, 0xf00); \
|
||||
} \
|
||||
OR(eb1, eb1, x3); \
|
||||
} else { \
|
||||
addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0); \
|
||||
SB(x3, ed, fixedaddress); \
|
||||
SMWRITE(); \
|
||||
}
|
||||
GOCOND(0x90, "SET", "Eb");
|
||||
#undef GO
|
||||
#undef GO
|
||||
|
||||
case 0xA2:
|
||||
INST_NAME("CPUID");
|
||||
|
File diff suppressed because it is too large
Load Diff
1266
src/dynarec/rv64/dynarec_rv64_660f38.c
Normal file
1266
src/dynarec/rv64/dynarec_rv64_660f38.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -1133,6 +1133,7 @@ void* rv64_next(x64emu_t* emu, uintptr_t addr);
|
||||
#define dynarec64_DF STEPNAME(dynarec64_DF)
|
||||
#define dynarec64_F0 STEPNAME(dynarec64_F0)
|
||||
#define dynarec64_660F STEPNAME(dynarec64_660F)
|
||||
#define dynarec64_660F38 STEPNAME(dynarec64_660F38)
|
||||
#define dynarec64_66F20F STEPNAME(dynarec64_66F20F)
|
||||
#define dynarec64_66F30F STEPNAME(dynarec64_66F30F)
|
||||
#define dynarec64_6664 STEPNAME(dynarec64_6664)
|
||||
@ -1556,6 +1557,7 @@ uintptr_t dynarec64_DE(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
|
||||
uintptr_t dynarec64_DF(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog);
|
||||
uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog);
|
||||
uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog);
|
||||
uintptr_t dynarec64_660F38(dynarec_rv64_t* dyn, uintptr_t addr, uint8_t opcode, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog);
|
||||
uintptr_t dynarec64_66F20F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog);
|
||||
uintptr_t dynarec64_66F30F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog);
|
||||
uintptr_t dynarec64_6664(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int seg, int* ok, int* need_epilog);
|
||||
|
Loading…
Reference in New Issue
Block a user