2
0
mirror of https://github.com/rehlds/metamod-r.git synced 2025-01-13 15:18:19 +03:00

Small jit refactoring

This commit is contained in:
asmodai 2017-02-14 01:20:27 +03:00
parent d1baff96e2
commit efb98cc155

View File

@ -39,6 +39,17 @@ private:
mg_orig_ret = 12, mg_orig_ret = 12,
mg_over_ret = 16, mg_over_ret = 16,
}; };
enum
{
first_arg_offset = 12,
xmmreg_size = 16
};
static size_t align(size_t v, size_t a)
{
return (v + a - 1) & ~(a - 1);
}
}; };
CForwardCallbackJIT::CForwardCallbackJIT(jitdata_t* jitdata) : m_jitdata(jitdata) CForwardCallbackJIT::CForwardCallbackJIT(jitdata_t* jitdata) : m_jitdata(jitdata)
@ -51,13 +62,7 @@ void CForwardCallbackJIT::naked_main()
push(ebx); push(ebx);
push(ebp); push(ebp);
mov(ebp, esp); mov(ebp, esp);
and_(esp, 0xFFFFFFF0); and_(esp, 0xFFFFFFF0); // stack must be 16-aligned when we calling subroutines
enum // constants
{
first_arg_offset = 12,
xmmreg_size = 16
};
enum // stack map enum // stack map
{ {
@ -65,11 +70,6 @@ void CForwardCallbackJIT::naked_main()
over_ret = sizeof(int) over_ret = sizeof(int)
}; };
auto align = [](size_t v, size_t a)
{
return (v + a - 1) & ~(a - 1);
};
auto globals = ebx; auto globals = ebx;
auto mg_backup = m_jitdata->has_ret ? sizeof(int) * 2 /* orig + over */ : 0; auto mg_backup = m_jitdata->has_ret ? sizeof(int) * 2 /* orig + over */ : 0;
auto framesize = align(mg_backup + sizeof(meta_globals_t) + /* for align */m_jitdata->args_count * sizeof(int), xmmreg_size) - m_jitdata->args_count * sizeof(int); auto framesize = align(mg_backup + sizeof(meta_globals_t) + /* for align */m_jitdata->args_count * sizeof(int), xmmreg_size) - m_jitdata->args_count * sizeof(int);
@ -121,7 +121,7 @@ void CForwardCallbackJIT::naked_main()
for (int i = 0, hookid = 0; i < m_jitdata->plugins_count; i++) { for (int i = 0, hookid = 0; i < m_jitdata->plugins_count; i++) {
auto plug = &m_jitdata->plugins[i]; auto plug = &m_jitdata->plugins[i];
if (plug->m_status < PL_RUNNING) // TODO if (plug->m_status < PL_RUNNING) // allow only running and paused
continue; continue;
size_t fn_table = *(size_t *)(size_t(plug) + m_jitdata->table_offset); size_t fn_table = *(size_t *)(size_t(plug) + m_jitdata->table_offset);
@ -133,10 +133,10 @@ void CForwardCallbackJIT::naked_main()
CUniqueLabel go_next_plugin("go_next_plugin"); CUniqueLabel go_next_plugin("go_next_plugin");
// check status and handler set // check status and handler set
cmp(byte_ptr[size_t(&plug->m_status)], PL_RUNNING);
mov(ecx, dword_ptr[fn_table + m_jitdata->pfn_offset]); mov(ecx, dword_ptr[fn_table + m_jitdata->pfn_offset]);
jnz(go_next_plugin); cmp(byte_ptr[size_t(&plug->m_status)], PL_RUNNING);
jecxz(go_next_plugin); jecxz(go_next_plugin);
jnz(go_next_plugin);
if (hookid++) { if (hookid++) {
mov(eax, dword_ptr[globals + mg_mres]); mov(eax, dword_ptr[globals + mg_mres]);
@ -202,7 +202,7 @@ void CForwardCallbackJIT::naked_main()
for (int i = 0, hookid = 0; i < m_jitdata->plugins_count; i++) { for (int i = 0, hookid = 0; i < m_jitdata->plugins_count; i++) {
auto plug = &m_jitdata->plugins[i]; auto plug = &m_jitdata->plugins[i];
if (plug->m_status < PL_RUNNING) if (plug->m_status < PL_RUNNING) // allow only running and paused
continue; continue;
size_t fn_table = *(size_t *)(size_t(plug) + m_jitdata->post_table_offset); size_t fn_table = *(size_t *)(size_t(plug) + m_jitdata->post_table_offset);
@ -214,10 +214,10 @@ void CForwardCallbackJIT::naked_main()
CUniqueLabel go_next_plugin("go_next_plugin"); CUniqueLabel go_next_plugin("go_next_plugin");
// check status and handler set // check status and handler set
cmp(byte_ptr[size_t(&plug->m_status)], PL_RUNNING);
mov(ecx, dword_ptr[fn_table + m_jitdata->pfn_offset]); mov(ecx, dword_ptr[fn_table + m_jitdata->pfn_offset]);
jnz(go_next_plugin); cmp(byte_ptr[size_t(&plug->m_status)], PL_RUNNING);
jecxz(go_next_plugin); jecxz(go_next_plugin);
jnz(go_next_plugin);
if (hookid++) { if (hookid++) {
mov(eax, dword_ptr[globals + mg_mres]); mov(eax, dword_ptr[globals + mg_mres]);
@ -275,13 +275,8 @@ void CForwardCallbackJIT::naked_main()
void CForwardCallbackJIT::call_func(jitasm::Frontend::Reg32 addr) void CForwardCallbackJIT::call_func(jitasm::Frontend::Reg32 addr)
{ {
enum
{
first_arg_offset = 12
};
const size_t fixed_args_count = m_jitdata->args_count - (m_jitdata->has_varargs ? 1u /* excluding format string */ : 0u); const size_t fixed_args_count = m_jitdata->args_count - (m_jitdata->has_varargs ? 1u /* excluding format string */ : 0u);
const size_t strbuf_offset = (m_jitdata->has_ret ? sizeof(int) * 2 : 0u) + sizeof(meta_globals_t); const size_t strbuf_offset = align((m_jitdata->has_ret ? sizeof(int) * 2 : 0) + sizeof(meta_globals_t) + /* for align */m_jitdata->args_count * sizeof(int), xmmreg_size) - m_jitdata->args_count * sizeof(int);
// push formatted buf instead of format string // push formatted buf instead of format string
if (m_jitdata->has_varargs) { if (m_jitdata->has_varargs) {