diff --git a/src/x86/cg.c b/src/x86/cg.c index 96b6022..4ae6a3b 100644 --- a/src/x86/cg.c +++ b/src/x86/cg.c @@ -668,7 +668,7 @@ static bool var_collision(AST *tlc, ScopeItem *v1, ScopeItem *v2) { } static void callee_saved(AST *tlc, struct CalleeSavedState *state) { - bool ebxused = false, ediused = false, esiused = false; + bool ebxused = false, ediused = false, esiused = false, ebpused = false; for(size_t v = 0; v < tlc->chunk.varCount; v++) { size_t resource = REG_CLASSES[tlc->chunk.vars[v]->data.var.registerClass].rs[tlc->chunk.vars[v]->data.var.color]; @@ -682,6 +682,9 @@ static void callee_saved(AST *tlc, struct CalleeSavedState *state) { if(resource & HWR_ESI) { esiused = true; } + if(resource & HWR_EBP) { + ebpused = true; + } } size_t nextUser = 0; @@ -700,6 +703,11 @@ static void callee_saved(AST *tlc, struct CalleeSavedState *state) { state->reg[nextUser] = x86_ia16() ? "di" : "edi"; nextUser++; } + if(ebpused) { + state->stackOffset[nextUser] = nextUser * x86_max_gpr_size(); + state->reg[nextUser] = x86_ia16() ? "bp" : "ebp"; + nextUser++; + } ast_grow_stack_frame(tlc, nextUser * x86_max_gpr_size()); }