Skip to content

Commit 5630683

Browse files
committed
Add x86-32 JIT'ed Trampoline
1 parent d46b29e commit 5630683

File tree

2 files changed

+33
-4
lines changed

2 files changed

+33
-4
lines changed

include/Jitter_CodeGen_x86_32.h

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ namespace Jitter
4444
void Emit_ParamRet_Mem128(const STATEMENT&);
4545

4646
//CALL
47+
void Emit_Call_Rel(const STATEMENT&);
4748
void Emit_Call(const STATEMENT&);
4849

4950
//RETURNVALUE

src/Jitter_CodeGen_x86_32.cpp

+32-4
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ CCodeGen_x86_32::CONSTMATCHER CCodeGen_x86_32::g_constMatchers[] =
3232

3333
{ OP_PARAM_RET, MATCH_NIL, MATCH_MEMORY128, MATCH_NIL, &CCodeGen_x86_32::Emit_ParamRet_Mem128 },
3434

35+
{ OP_CALL, MATCH_NIL, MATCH_RELATIVE, MATCH_CONSTANT, &CCodeGen_x86_32::Emit_Call_Rel },
3536
{ OP_CALL, MATCH_NIL, MATCH_CONSTANTPTR, MATCH_CONSTANT, &CCodeGen_x86_32::Emit_Call },
3637

3738
{ OP_RETVAL, MATCH_TEMPORARY, MATCH_NIL, MATCH_NIL, &CCodeGen_x86_32::Emit_RetVal_Tmp },
@@ -194,9 +195,9 @@ void CCodeGen_x86_32::Emit_Prolog(const StatementList& statements, unsigned int
194195
m_assembler.MovEd(CX86Assembler::rBP, CX86Assembler::MakeIndRegOffAddress(CX86Assembler::rSP, 8));
195196

196197
//Save registers
197-
for(unsigned int i = 0; i < MAX_REGISTERS; i++)
198+
if(m_isTrampoline)
198199
{
199-
if(m_registerUsage & (1 << i))
200+
for(unsigned int i = 0; i < MAX_REGISTERS; i++)
200201
{
201202
m_assembler.Push(m_registers[i]);
202203
}
@@ -260,9 +261,9 @@ void CCodeGen_x86_32::Emit_Epilog()
260261

261262
m_assembler.Pop(CX86Assembler::rSP);
262263

263-
for(int i = MAX_REGISTERS - 1; i >= 0; i--)
264+
if(m_isTrampoline)
264265
{
265-
if(m_registerUsage & (1 << i))
266+
for(int i = MAX_REGISTERS - 1; i >= 0; i--)
266267
{
267268
m_assembler.Pop(m_registers[i]);
268269
}
@@ -415,6 +416,33 @@ void CCodeGen_x86_32::Emit_ParamRet_Mem128(const STATEMENT& statement)
415416
m_hasImplicitRetValueParam = true;
416417
}
417418

419+
void CCodeGen_x86_32::Emit_Call_Rel(const STATEMENT& statement)
420+
{
421+
auto src1 = statement.src1->GetSymbol().get();
422+
auto src2 = statement.src2->GetSymbol().get();
423+
424+
uint32 paramCount = src2->m_valueLow;
425+
CALL_STATE callState;
426+
for(unsigned int i = 0; i < paramCount; i++)
427+
{
428+
auto emitter(m_params.back());
429+
m_params.pop_back();
430+
emitter(callState);
431+
}
432+
433+
m_assembler.MovEd(CX86Assembler::rAX, MakeRelativeSymbolAddress(src1));
434+
m_assembler.CallEd(CX86Assembler::MakeRegisterAddress(CX86Assembler::rAX));
435+
436+
if(m_hasImplicitRetValueParam && m_implicitRetValueParamFixUpRequired)
437+
{
438+
//Allocated stack space for the extra parameter is cleaned up by the callee.
439+
//So adjust the amount of stack space we free up after the call
440+
m_assembler.SubId(CX86Assembler::MakeRegisterAddress(CX86Assembler::rSP), 4);
441+
}
442+
443+
m_hasImplicitRetValueParam = false;
444+
}
445+
418446
void CCodeGen_x86_32::Emit_Call(const STATEMENT& statement)
419447
{
420448
auto src1 = statement.src1->GetSymbol().get();

0 commit comments

Comments
 (0)