ebp is also callee-saved

This commit is contained in:
Mid 2025-10-15 14:10:54 +03:00
parent f978b66662
commit 132cedff09

View File

@ -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());
}