mirror of
https://github.com/corda/corda.git
synced 2025-01-01 10:46:46 +00:00
implement array load instructions
This commit is contained in:
parent
a73f474f34
commit
ea47976aad
@ -484,6 +484,18 @@ class Assembler {
|
|||||||
code.append(v);
|
code.append(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void shl(int8_t v, Register dst) {
|
||||||
|
rex();
|
||||||
|
if (v == 1) {
|
||||||
|
code.append(0xd1);
|
||||||
|
code.append(0xe0 | dst);
|
||||||
|
} else {
|
||||||
|
code.append(0xc1);
|
||||||
|
code.append(0xe0 | dst);
|
||||||
|
code.append(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ret() {
|
void ret() {
|
||||||
code.append(0xc3);
|
code.append(0xc3);
|
||||||
}
|
}
|
||||||
@ -937,6 +949,10 @@ class Compiler: public Assembler {
|
|||||||
add(stackFootprint, rsp);
|
add(stackFootprint, rsp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (methodReturnCode(t, method) == ObjectField) {
|
||||||
|
mov(rax, 0, rax);
|
||||||
|
}
|
||||||
|
|
||||||
mov(rbp, rsp);
|
mov(rbp, rsp);
|
||||||
pop(rbp);
|
pop(rbp);
|
||||||
ret();
|
ret();
|
||||||
@ -968,6 +984,79 @@ class Compiler: public Assembler {
|
|||||||
unsigned instruction = codeBody(t, code, ip++);
|
unsigned instruction = codeBody(t, code, ip++);
|
||||||
|
|
||||||
switch (instruction) {
|
switch (instruction) {
|
||||||
|
case aaload:
|
||||||
|
case baload:
|
||||||
|
case caload:
|
||||||
|
case daload:
|
||||||
|
case faload:
|
||||||
|
case iaload:
|
||||||
|
case laload:
|
||||||
|
case saload: {
|
||||||
|
Label next(this);
|
||||||
|
Label outOfBounds(this);
|
||||||
|
|
||||||
|
pop(rcx);
|
||||||
|
pop(rax);
|
||||||
|
|
||||||
|
cmp(0, rcx);
|
||||||
|
jl(outOfBounds);
|
||||||
|
|
||||||
|
mov(rax, BytesPerWord, rdx);
|
||||||
|
cmp(rdx, rcx);
|
||||||
|
jge(outOfBounds);
|
||||||
|
|
||||||
|
mov(rax, BytesPerWord * 2, rax);
|
||||||
|
|
||||||
|
switch (instruction) {
|
||||||
|
case aaload:
|
||||||
|
case faload:
|
||||||
|
case iaload:
|
||||||
|
shl(log(BytesPerWord), rcx);
|
||||||
|
sub(rcx, rax);
|
||||||
|
push(rax, 0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case baload:
|
||||||
|
sub(rcx, rax);
|
||||||
|
movs1(rax, 0, rax);
|
||||||
|
push(rax);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case caload:
|
||||||
|
shl(1, rcx);
|
||||||
|
sub(rcx, rax);
|
||||||
|
movz2(rax, 0, rax);
|
||||||
|
push(rax);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case daload:
|
||||||
|
case laload:
|
||||||
|
shl(3, rcx);
|
||||||
|
sub(rcx, rax);
|
||||||
|
push4(rax, 0);
|
||||||
|
push4(rax, 4);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case saload:
|
||||||
|
shl(1, rcx);
|
||||||
|
sub(rcx, rax);
|
||||||
|
movs2(rax, 0, rax);
|
||||||
|
push(rax);
|
||||||
|
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;
|
||||||
|
Loading…
Reference in New Issue
Block a user