mirror of
https://github.com/corda/corda.git
synced 2025-01-01 10:46:46 +00:00
hello, world!
This commit is contained in:
parent
ea47976aad
commit
7caedba26f
165
src/compile.cpp
165
src/compile.cpp
@ -13,6 +13,8 @@ vmInvoke(void* function, void* stack, unsigned stackSize,
|
|||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
const bool Verbose = false;
|
||||||
|
|
||||||
const unsigned FrameThread = BytesPerWord * 2;
|
const unsigned FrameThread = BytesPerWord * 2;
|
||||||
const unsigned FrameMethod = FrameThread + BytesPerWord;
|
const unsigned FrameMethod = FrameThread + BytesPerWord;
|
||||||
const unsigned FrameNext = FrameNext + BytesPerWord;
|
const unsigned FrameNext = FrameNext + BytesPerWord;
|
||||||
@ -288,24 +290,48 @@ class Assembler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void movz1(Register src, Register dst) {
|
||||||
|
code.append(0x0f);
|
||||||
|
code.append(0xb6);
|
||||||
|
code.append(0xc0 | (dst << 3) | src);
|
||||||
|
}
|
||||||
|
|
||||||
void movz1(Register src, int32_t srcOffset, Register dst) {
|
void movz1(Register src, int32_t srcOffset, Register dst) {
|
||||||
code.append(0x0f);
|
code.append(0x0f);
|
||||||
offsetInstruction(0x86, 0, 0x40, 0x80, dst, src, srcOffset);
|
offsetInstruction(0xb6, 0, 0x40, 0x80, dst, src, srcOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
void movs1(Register src, Register dst) {
|
||||||
|
code.append(0x0f);
|
||||||
|
code.append(0xbe);
|
||||||
|
code.append(0xc0 | (dst << 3) | src);
|
||||||
}
|
}
|
||||||
|
|
||||||
void movs1(Register src, int32_t srcOffset, Register dst) {
|
void movs1(Register src, int32_t srcOffset, Register dst) {
|
||||||
code.append(0x0f);
|
code.append(0x0f);
|
||||||
offsetInstruction(0x8e, 0, 0x40, 0x80, dst, src, srcOffset);
|
offsetInstruction(0xbe, 0, 0x40, 0x80, dst, src, srcOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
void movz2(Register src, Register dst) {
|
||||||
|
code.append(0x0f);
|
||||||
|
code.append(0xb7);
|
||||||
|
code.append(0xc0 | (dst << 3) | src);
|
||||||
}
|
}
|
||||||
|
|
||||||
void movz2(Register src, int32_t srcOffset, Register dst) {
|
void movz2(Register src, int32_t srcOffset, Register dst) {
|
||||||
code.append(0x0f);
|
code.append(0x0f);
|
||||||
offsetInstruction(0x87, 0, 0x40, 0x80, dst, src, srcOffset);
|
offsetInstruction(0xb7, 0, 0x40, 0x80, dst, src, srcOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
void movs2(Register src, Register dst) {
|
||||||
|
code.append(0x0f);
|
||||||
|
code.append(0xbf);
|
||||||
|
code.append(0xc0 | (dst << 3) | src);
|
||||||
}
|
}
|
||||||
|
|
||||||
void movs2(Register src, int32_t srcOffset, Register dst) {
|
void movs2(Register src, int32_t srcOffset, Register dst) {
|
||||||
code.append(0x0f);
|
code.append(0x0f);
|
||||||
offsetInstruction(0x8f, 0, 0x40, 0x80, dst, src, srcOffset);
|
offsetInstruction(0xbf, 0, 0x40, 0x80, dst, src, srcOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mov4(Register src, int32_t srcOffset, Register dst) {
|
void mov4(Register src, int32_t srcOffset, Register dst) {
|
||||||
@ -584,11 +610,18 @@ class Assembler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void cmp(int v, Register reg) {
|
void cmp(int v, Register reg) {
|
||||||
|
assert(code.s, isByte(v)); // todo
|
||||||
|
|
||||||
code.append(0x83);
|
code.append(0x83);
|
||||||
code.append(0xf8 | reg);
|
code.append(0xf8 | reg);
|
||||||
code.append(v);
|
code.append(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cmp(Register a, Register b) {
|
||||||
|
code.append(0x39);
|
||||||
|
code.append(0xc0 | (a << 3) | b);
|
||||||
|
}
|
||||||
|
|
||||||
void call(Register reg) {
|
void call(Register reg) {
|
||||||
code.append(0xff);
|
code.append(0xff);
|
||||||
code.append(0xd0 | reg);
|
code.append(0xd0 | reg);
|
||||||
@ -1005,26 +1038,26 @@ class Compiler: public Assembler {
|
|||||||
cmp(rdx, rcx);
|
cmp(rdx, rcx);
|
||||||
jge(outOfBounds);
|
jge(outOfBounds);
|
||||||
|
|
||||||
mov(rax, BytesPerWord * 2, rax);
|
add(BytesPerWord * 2, rax);
|
||||||
|
|
||||||
switch (instruction) {
|
switch (instruction) {
|
||||||
case aaload:
|
case aaload:
|
||||||
case faload:
|
case faload:
|
||||||
case iaload:
|
case iaload:
|
||||||
shl(log(BytesPerWord), rcx);
|
shl(log(BytesPerWord), rcx);
|
||||||
sub(rcx, rax);
|
add(rcx, rax);
|
||||||
push(rax, 0);
|
push(rax, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case baload:
|
case baload:
|
||||||
sub(rcx, rax);
|
add(rcx, rax);
|
||||||
movs1(rax, 0, rax);
|
movs1(rax, 0, rax);
|
||||||
push(rax);
|
push(rax);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case caload:
|
case caload:
|
||||||
shl(1, rcx);
|
shl(1, rcx);
|
||||||
sub(rcx, rax);
|
add(rcx, rax);
|
||||||
movz2(rax, 0, rax);
|
movz2(rax, 0, rax);
|
||||||
push(rax);
|
push(rax);
|
||||||
break;
|
break;
|
||||||
@ -1032,14 +1065,14 @@ class Compiler: public Assembler {
|
|||||||
case daload:
|
case daload:
|
||||||
case laload:
|
case laload:
|
||||||
shl(3, rcx);
|
shl(3, rcx);
|
||||||
sub(rcx, rax);
|
add(rcx, rax);
|
||||||
push4(rax, 0);
|
push4(rax, 0);
|
||||||
push4(rax, 4);
|
push4(rax, 4);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case saload:
|
case saload:
|
||||||
shl(1, rcx);
|
shl(1, rcx);
|
||||||
sub(rcx, rax);
|
add(rcx, rax);
|
||||||
movs2(rax, 0, rax);
|
movs2(rax, 0, rax);
|
||||||
push(rax);
|
push(rax);
|
||||||
break;
|
break;
|
||||||
@ -1057,6 +1090,75 @@ class Compiler: public Assembler {
|
|||||||
next.mark();
|
next.mark();
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
|
case aastore:
|
||||||
|
case bastore:
|
||||||
|
case castore:
|
||||||
|
case dastore:
|
||||||
|
case fastore:
|
||||||
|
case iastore:
|
||||||
|
case lastore:
|
||||||
|
case sastore: {
|
||||||
|
Label next(this);
|
||||||
|
Label outOfBounds(this);
|
||||||
|
|
||||||
|
if (instruction == dastore or instruction == lastore) {
|
||||||
|
pop(rdx);
|
||||||
|
}
|
||||||
|
pop(rbx);
|
||||||
|
pop(rcx);
|
||||||
|
pop(rax);
|
||||||
|
|
||||||
|
cmp(0, rcx);
|
||||||
|
jl(outOfBounds);
|
||||||
|
|
||||||
|
mov(rax, BytesPerWord, rdi);
|
||||||
|
cmp(rdi, rcx);
|
||||||
|
jge(outOfBounds);
|
||||||
|
|
||||||
|
add(BytesPerWord * 2, rax);
|
||||||
|
|
||||||
|
switch (instruction) {
|
||||||
|
case aastore:
|
||||||
|
case fastore:
|
||||||
|
case iastore:
|
||||||
|
shl(log(BytesPerWord), rcx);
|
||||||
|
add(rcx, rax);
|
||||||
|
mov(rbx, rax, 0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case bastore:
|
||||||
|
add(rcx, rax);
|
||||||
|
mov1(rbx, rax, 0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case castore:
|
||||||
|
case sastore:
|
||||||
|
shl(1, rcx);
|
||||||
|
add(rcx, rax);
|
||||||
|
mov2(rbx, rax, 0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case dastore:
|
||||||
|
case lastore:
|
||||||
|
shl(3, rcx);
|
||||||
|
add(rcx, rax);
|
||||||
|
mov4(rbx, rax, 0);
|
||||||
|
mov4(rdx, rax, 4);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
jmp(next);
|
||||||
|
|
||||||
|
outOfBounds.mark();
|
||||||
|
compileCall
|
||||||
|
(reinterpret_cast<uintptr_t>(throwNew),
|
||||||
|
reinterpret_cast<uintptr_t>
|
||||||
|
(arrayBody(t, t->m->types,
|
||||||
|
Machine::ArrayIndexOutOfBoundsExceptionType)));
|
||||||
|
|
||||||
|
next.mark();
|
||||||
|
} break;
|
||||||
|
|
||||||
case aconst_null:
|
case aconst_null:
|
||||||
push(0);
|
push(0);
|
||||||
break;
|
break;
|
||||||
@ -1125,6 +1227,11 @@ class Compiler: public Assembler {
|
|||||||
ret();
|
ret();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case arraylength:
|
||||||
|
pop(rax);
|
||||||
|
push(rax, BytesPerWord);
|
||||||
|
break;
|
||||||
|
|
||||||
case astore:
|
case astore:
|
||||||
case istore:
|
case istore:
|
||||||
case fstore:
|
case fstore:
|
||||||
@ -1316,6 +1423,24 @@ class Compiler: public Assembler {
|
|||||||
jmp((ip - 5) + offset);
|
jmp((ip - 5) + offset);
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
|
case i2b:
|
||||||
|
mov(rsp, 0, rax);
|
||||||
|
movs1(rax, rax);
|
||||||
|
mov(rax, rsp, 0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case i2c:
|
||||||
|
mov(rsp, 0, rax);
|
||||||
|
movz2(rax, rax);
|
||||||
|
mov(rax, rsp, 0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case i2s:
|
||||||
|
mov(rsp, 0, rax);
|
||||||
|
movs2(rax, rax);
|
||||||
|
mov(rax, rsp, 0);
|
||||||
|
break;
|
||||||
|
|
||||||
case iadd:
|
case iadd:
|
||||||
pop(rax);
|
pop(rax);
|
||||||
pop(rcx);
|
pop(rcx);
|
||||||
@ -1870,9 +1995,11 @@ compileMethod2(MyThread* t, object method)
|
|||||||
ACQUIRE(t, t->m->classLock);
|
ACQUIRE(t, t->m->classLock);
|
||||||
|
|
||||||
if (methodCompiled(t, method) == t->m->processor->methodStub(t)) {
|
if (methodCompiled(t, method) == t->m->processor->methodStub(t)) {
|
||||||
fprintf(stderr, "compiling %s.%s\n",
|
if (Verbose) {
|
||||||
&byteArrayBody(t, className(t, methodClass(t, method)), 0),
|
fprintf(stderr, "compiling %s.%s\n",
|
||||||
&byteArrayBody(t, methodName(t, method), 0));
|
&byteArrayBody(t, className(t, methodClass(t, method)), 0),
|
||||||
|
&byteArrayBody(t, methodName(t, method), 0));
|
||||||
|
}
|
||||||
|
|
||||||
Compiler c(t->m->system);
|
Compiler c(t->m->system);
|
||||||
c.compile(t, method);
|
c.compile(t, method);
|
||||||
@ -1882,11 +2009,13 @@ compileMethod2(MyThread* t, object method)
|
|||||||
|
|
||||||
c.code.copyTo(&compiledBody(t, compiled, 0));
|
c.code.copyTo(&compiledBody(t, compiled, 0));
|
||||||
|
|
||||||
fprintf(stderr, "compiled %s.%s from %p to %p\n",
|
if (Verbose) {
|
||||||
&byteArrayBody(t, className(t, methodClass(t, method)), 0),
|
fprintf(stderr, "compiled %s.%s from %p to %p\n",
|
||||||
&byteArrayBody(t, methodName(t, method), 0),
|
&byteArrayBody(t, className(t, methodClass(t, method)), 0),
|
||||||
&compiledBody(t, compiled, 0),
|
&byteArrayBody(t, methodName(t, method), 0),
|
||||||
&compiledBody(t, compiled, 0) + compiledLength(t, compiled));
|
&compiledBody(t, compiled, 0),
|
||||||
|
&compiledBody(t, compiled, 0) + compiledLength(t, compiled));
|
||||||
|
}
|
||||||
|
|
||||||
set(t, methodCompiled(t, method), compiled);
|
set(t, methodCompiled(t, method), compiled);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user