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) {
|
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++) {
|
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];
|
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) {
|
if(resource & HWR_ESI) {
|
||||||
esiused = true;
|
esiused = true;
|
||||||
}
|
}
|
||||||
|
if(resource & HWR_EBP) {
|
||||||
|
ebpused = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t nextUser = 0;
|
size_t nextUser = 0;
|
||||||
@ -700,6 +703,11 @@ static void callee_saved(AST *tlc, struct CalleeSavedState *state) {
|
|||||||
state->reg[nextUser] = x86_ia16() ? "di" : "edi";
|
state->reg[nextUser] = x86_ia16() ? "di" : "edi";
|
||||||
nextUser++;
|
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());
|
ast_grow_stack_frame(tlc, nextUser * x86_max_gpr_size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user