mirror of
https://github.com/corda/corda.git
synced 2025-01-21 03:55:00 +00:00
include function prologue and epilogue when compiling
This commit is contained in:
parent
fa513beb2f
commit
6271f878e8
@ -15,6 +15,7 @@ const unsigned OperationCount = Return + 1;
|
||||
enum UnaryOperation {
|
||||
Call,
|
||||
Push,
|
||||
Pop,
|
||||
JumpIfLess,
|
||||
JumpIfGreater,
|
||||
JumpIfLessOrEqual,
|
||||
|
@ -534,6 +534,10 @@ class ReturnEvent: public Event {
|
||||
}
|
||||
}
|
||||
|
||||
Assembler::Register base(c->assembler->base());
|
||||
Assembler::Register stack(c->assembler->stack());
|
||||
c->assembler->apply(Move, BytesPerWord, Register, &base, Register, &stack);
|
||||
c->assembler->apply(Pop, BytesPerWord, Register, &base);
|
||||
c->assembler->apply(Return);
|
||||
}
|
||||
|
||||
@ -1156,6 +1160,13 @@ updateJunctions(Context* c)
|
||||
void
|
||||
compile(Context* c)
|
||||
{
|
||||
Assembler* a = c->assembler;
|
||||
|
||||
Assembler::Register base(a->base());
|
||||
Assembler::Register stack(a->stack());
|
||||
a->apply(Push, BytesPerWord, Register, &base);
|
||||
a->apply(Move, BytesPerWord, Register, &stack, Register, &base);
|
||||
|
||||
for (unsigned i = 0; i < c->logicalCodeLength; ++ i) {
|
||||
fprintf(stderr, "compile ip %d\n", i);
|
||||
for (Event* e = c->logicalCode[i].firstEvent; e; e = e->next) {
|
||||
|
40
src/x86.cpp
40
src/x86.cpp
@ -281,6 +281,32 @@ jumpR(Context* c, unsigned size UNUSED, Assembler::Register* a)
|
||||
c->code.append(0xd0 | a->low);
|
||||
}
|
||||
|
||||
void
|
||||
pushR(Context* c, unsigned size, Assembler::Register* a)
|
||||
{
|
||||
if (BytesPerWord == 4 and size == 8) {
|
||||
Assembler::Register ah(a->high);
|
||||
|
||||
pushR(c, 4, &ah);
|
||||
pushR(c, 4, a);
|
||||
} else {
|
||||
c->code.append(0x50 | a->low);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
popR(Context* c, unsigned size, Assembler::Register* a)
|
||||
{
|
||||
if (BytesPerWord == 4 and size == 8) {
|
||||
Assembler::Register ah(a->high);
|
||||
|
||||
popR(c, 4, a);
|
||||
popR(c, 4, &ah);
|
||||
} else {
|
||||
c->code.append(0x50 | a->low);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
moveCR(Context* c, unsigned size UNUSED, Assembler::Constant* a,
|
||||
Assembler::Register* b)
|
||||
@ -307,10 +333,10 @@ void
|
||||
moveRM(Context* c, unsigned size, Assembler::Register* a, Assembler::Memory* b)
|
||||
{
|
||||
if (BytesPerWord == 4 and size == 8) {
|
||||
moveRM(c, 4, a, b);
|
||||
|
||||
Assembler::Register ah(a->high);
|
||||
Assembler::Memory bh(b->base, b->offset + 4, b->index, b->scale);
|
||||
|
||||
moveRM(c, 4, a, b);
|
||||
moveRM(c, 4, &ah, &bh);
|
||||
} else if (BytesPerWord == 8 and size == 4) {
|
||||
encode(c, 0x89, a->low, b, false);
|
||||
@ -324,10 +350,10 @@ moveRR(Context* c, unsigned size, Assembler::Register* a,
|
||||
Assembler::Register* b)
|
||||
{
|
||||
if (BytesPerWord == 4 and size == 8) {
|
||||
moveRR(c, 4, a, b);
|
||||
|
||||
Assembler::Register ah(a->low);
|
||||
Assembler::Register bh(b->low);
|
||||
|
||||
moveRR(c, 4, a, b);
|
||||
moveRR(c, 4, &ah, &bh);
|
||||
} else {
|
||||
rex(c);
|
||||
@ -351,10 +377,10 @@ moveMR(Context* c, unsigned size, Assembler::Memory* a, Assembler::Register* b)
|
||||
case 4:
|
||||
case 8:
|
||||
if (BytesPerWord == 4 and size == 8) {
|
||||
moveMR(c, 4, a, b);
|
||||
|
||||
Assembler::Memory ah(a->base, a->offset + 4, a->index, a->scale);
|
||||
Assembler::Register bh(b->high);
|
||||
|
||||
moveMR(c, 4, a, b);
|
||||
moveMR(c, 4, &ah, &bh);
|
||||
} else if (BytesPerWord == 8 and size == 4) {
|
||||
encode(c, 0x63, b->low, a, true);
|
||||
@ -393,6 +419,8 @@ populateTables()
|
||||
|
||||
UnaryOperations[INDEX1(Call, Constant)] = CAST1(callC);
|
||||
UnaryOperations[INDEX1(Jump, Register)] = CAST1(jumpR);
|
||||
UnaryOperations[INDEX1(Push, Register)] = CAST1(pushR);
|
||||
UnaryOperations[INDEX1(Pop, Register)] = CAST1(popR);
|
||||
|
||||
BinaryOperations[INDEX2(Move, Constant, Register)] = CAST2(moveCR);
|
||||
BinaryOperations[INDEX2(Move, Constant, Memory)] = CAST2(moveCM);
|
||||
|
Loading…
Reference in New Issue
Block a user