@@ -32,6 +32,7 @@ CCodeGen_x86_32::CONSTMATCHER CCodeGen_x86_32::g_constMatchers[] =
32
32
33
33
{ OP_PARAM_RET, MATCH_NIL, MATCH_MEMORY128, MATCH_NIL, &CCodeGen_x86_32::Emit_ParamRet_Mem128 },
34
34
35
+ { OP_CALL, MATCH_NIL, MATCH_RELATIVE, MATCH_CONSTANT, &CCodeGen_x86_32::Emit_Call_Rel },
35
36
{ OP_CALL, MATCH_NIL, MATCH_CONSTANTPTR, MATCH_CONSTANT, &CCodeGen_x86_32::Emit_Call },
36
37
37
38
{ 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
194
195
m_assembler.MovEd (CX86Assembler::rBP, CX86Assembler::MakeIndRegOffAddress (CX86Assembler::rSP, 8 ));
195
196
196
197
// Save registers
197
- for ( unsigned int i = 0 ; i < MAX_REGISTERS; i++ )
198
+ if (m_isTrampoline )
198
199
{
199
- if (m_registerUsage & ( 1 << i) )
200
+ for ( unsigned int i = 0 ; i < MAX_REGISTERS; i++ )
200
201
{
201
202
m_assembler.Push (m_registers[i]);
202
203
}
@@ -260,9 +261,9 @@ void CCodeGen_x86_32::Emit_Epilog()
260
261
261
262
m_assembler.Pop (CX86Assembler::rSP);
262
263
263
- for ( int i = MAX_REGISTERS - 1 ; i >= 0 ; i-- )
264
+ if (m_isTrampoline )
264
265
{
265
- if (m_registerUsage & ( 1 << i) )
266
+ for ( int i = MAX_REGISTERS - 1 ; i >= 0 ; i-- )
266
267
{
267
268
m_assembler.Pop (m_registers[i]);
268
269
}
@@ -415,6 +416,33 @@ void CCodeGen_x86_32::Emit_ParamRet_Mem128(const STATEMENT& statement)
415
416
m_hasImplicitRetValueParam = true ;
416
417
}
417
418
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
+
418
446
void CCodeGen_x86_32::Emit_Call (const STATEMENT& statement)
419
447
{
420
448
auto src1 = statement.src1 ->GetSymbol ().get ();
0 commit comments