ebp is also callee-saved
This commit is contained in:
parent
f978b66662
commit
132cedff09
10
src/x86/cg.c
10
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());
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user