Fiddling with stack. Still wrong.
This commit is contained in:
parent
495edda8d8
commit
3e52a99adf
|
@ -60,6 +60,8 @@ void IssueCall(X64Emitter& e, FunctionInfo* symbol_info, uint32_t flags) {
|
||||||
e.jmp(e.rax);
|
e.jmp(e.rax);
|
||||||
} else {
|
} else {
|
||||||
e.call(e.rax);
|
e.call(e.rax);
|
||||||
|
e.mov(e.rdx, e.qword[e.rsp + 8]);
|
||||||
|
e.mov(e.rcx, e.qword[e.rsp + 0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -514,6 +516,8 @@ void alloy::backend::x64::lowering::RegisterSequences(LoweringTable* table) {
|
||||||
e.mov(e.r8, (uint64_t)str_copy);
|
e.mov(e.r8, (uint64_t)str_copy);
|
||||||
e.mov(e.rax, (uint64_t)PrintString);
|
e.mov(e.rax, (uint64_t)PrintString);
|
||||||
e.call(e.rax);
|
e.call(e.rax);
|
||||||
|
e.mov(e.rdx, e.qword[e.rsp + 8]);
|
||||||
|
e.mov(e.rcx, e.qword[e.rsp + 0]);
|
||||||
i = e.Advance(i);
|
i = e.Advance(i);
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
@ -624,18 +628,18 @@ void alloy::backend::x64::lowering::RegisterSequences(LoweringTable* table) {
|
||||||
});
|
});
|
||||||
|
|
||||||
table->AddSequence(OPCODE_RETURN, [](X64Emitter& e, Instr*& i) {
|
table->AddSequence(OPCODE_RETURN, [](X64Emitter& e, Instr*& i) {
|
||||||
e.ret();
|
// If this is the last instruction in the last block, just let us
|
||||||
|
// fall through.
|
||||||
|
if (i->next || i->block->next) {
|
||||||
|
e.jmp("epilog");
|
||||||
|
}
|
||||||
i = e.Advance(i);
|
i = e.Advance(i);
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
table->AddSequence(OPCODE_RETURN_TRUE, [](X64Emitter& e, Instr*& i) {
|
table->AddSequence(OPCODE_RETURN_TRUE, [](X64Emitter& e, Instr*& i) {
|
||||||
e.inLocalLabel();
|
|
||||||
CheckBoolean(e, i->src1.value);
|
CheckBoolean(e, i->src1.value);
|
||||||
e.jne(".x", e.T_SHORT);
|
e.je("epilog");
|
||||||
e.ret();
|
|
||||||
e.L(".x");
|
|
||||||
e.outLocalLabel();
|
|
||||||
i = e.Advance(i);
|
i = e.Advance(i);
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
|
@ -214,7 +214,7 @@ void X64CodeChunk::AddTableEntry(uint8_t* code, size_t code_size) {
|
||||||
offset += UNWIND_INFO_SIZE;
|
offset += UNWIND_INFO_SIZE;
|
||||||
|
|
||||||
// TODO(benvanik): take as parameters?
|
// TODO(benvanik): take as parameters?
|
||||||
bool has_prolog = false;
|
bool has_prolog = true;
|
||||||
uint8_t prolog_size = 4;
|
uint8_t prolog_size = 4;
|
||||||
uint8_t stack_bytes = 64;
|
uint8_t stack_bytes = 64;
|
||||||
|
|
||||||
|
|
|
@ -119,11 +119,17 @@ int X64Emitter::Emit(HIRBuilder* builder) {
|
||||||
// IMPORTANT: any changes to the prolog must be kept in sync with
|
// IMPORTANT: any changes to the prolog must be kept in sync with
|
||||||
// X64CodeCache, which dynamically generates exception information.
|
// X64CodeCache, which dynamically generates exception information.
|
||||||
// Adding or changing anything here must be matched!
|
// Adding or changing anything here must be matched!
|
||||||
const bool emit_prolog = false;
|
const bool emit_prolog = true;
|
||||||
const size_t stack_size = 64;
|
const size_t stack_size = 64;
|
||||||
if (emit_prolog) {
|
if (emit_prolog) {
|
||||||
|
mov(qword[rsp + 16], rdx);
|
||||||
|
mov(qword[rsp + 8], rcx);
|
||||||
sub(rsp, stack_size);
|
sub(rsp, stack_size);
|
||||||
// TODO(benvanik): save registers.
|
mov(qword[rsp + 8 * 0], rbx);
|
||||||
|
mov(qword[rsp + 8 * 1], r12);
|
||||||
|
mov(qword[rsp + 8 * 2], r13);
|
||||||
|
mov(qword[rsp + 8 * 3], r14);
|
||||||
|
mov(qword[rsp + 8 * 4], r15);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto lowering_table = backend_->lowering_table();
|
auto lowering_table = backend_->lowering_table();
|
||||||
|
@ -157,8 +163,12 @@ int X64Emitter::Emit(HIRBuilder* builder) {
|
||||||
// Function epilog.
|
// Function epilog.
|
||||||
L("epilog");
|
L("epilog");
|
||||||
if (emit_prolog) {
|
if (emit_prolog) {
|
||||||
|
mov(rbx, qword[rsp + 8 * 0]);
|
||||||
|
mov(r12, qword[rsp + 8 * 1]);
|
||||||
|
mov(r13, qword[rsp + 8 * 2]);
|
||||||
|
mov(r14, qword[rsp + 8 * 3]);
|
||||||
|
mov(r15, qword[rsp + 8 * 4]);
|
||||||
add(rsp, stack_size);
|
add(rsp, stack_size);
|
||||||
// TODO(benvanik): restore registers.
|
|
||||||
}
|
}
|
||||||
ret();
|
ret();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue