< prev index next >
test/compiler/jvmci/jdk.vm.ci.code.test/src/jdk/vm/ci/code/test/amd64/AMD64TestAssembler.java
Print this page
*** 44,53 ****
--- 44,56 ----
import jdk.vm.ci.meta.JavaKind;
import jdk.vm.ci.meta.VMConstant;
public class AMD64TestAssembler extends TestAssembler {
+ private static final Register scratchRegister = AMD64.r12;
+ private static final Register doubleScratch = AMD64.xmm15;
+
public AMD64TestAssembler(CodeCacheProvider codeCache, TestHotSpotVMConfig config) {
super(codeCache, config, 16, 16, AMD64Kind.DWORD, AMD64.rax, AMD64.rcx, AMD64.rdi, AMD64.r8, AMD64.r9, AMD64.r10);
}
private void emitFatNop() {
*** 224,242 ****
Register ret = newRegister();
emitModRMMemory(true, 0x8B, ret.encoding, b.encoding, offset); // MOV r64,r/m64
return ret;
}
@Override
public StackSlot emitIntToStack(Register a) {
StackSlot ret = newStackSlot(AMD64Kind.DWORD);
return emitIntToStack(ret, a);
}
public StackSlot emitIntToStack(StackSlot ret, Register a) {
// MOV r/m32,r32
! emitModRMMemory(false, 0x89, a.encoding, AMD64.rbp.encoding, ret.getRawOffset() + 16);
return ret;
}
@Override
public StackSlot emitLongToStack(Register a) {
--- 227,253 ----
Register ret = newRegister();
emitModRMMemory(true, 0x8B, ret.encoding, b.encoding, offset); // MOV r64,r/m64
return ret;
}
+ private int getAdjustedOffset(StackSlot ret) {
+ if (ret.getRawOffset() < 0) {
+ return ret.getRawOffset() + 16;
+ } else {
+ return -(frameSize - ret.getRawOffset()) + 16;
+ }
+ }
+
@Override
public StackSlot emitIntToStack(Register a) {
StackSlot ret = newStackSlot(AMD64Kind.DWORD);
return emitIntToStack(ret, a);
}
public StackSlot emitIntToStack(StackSlot ret, Register a) {
// MOV r/m32,r32
! emitModRMMemory(false, 0x89, a.encoding, AMD64.rbp.encoding, getAdjustedOffset(ret));
return ret;
}
@Override
public StackSlot emitLongToStack(Register a) {
*** 244,254 ****
return emitLongToStack(ret, a);
}
public StackSlot emitLongToStack(StackSlot ret, Register a) {
// MOV r/m64,r64
! emitModRMMemory(true, 0x89, a.encoding, AMD64.rbp.encoding, ret.getRawOffset() + 16);
return ret;
}
@Override
public StackSlot emitFloatToStack(Register a) {
--- 255,265 ----
return emitLongToStack(ret, a);
}
public StackSlot emitLongToStack(StackSlot ret, Register a) {
// MOV r/m64,r64
! emitModRMMemory(true, 0x89, a.encoding, AMD64.rbp.encoding, getAdjustedOffset(ret));
return ret;
}
@Override
public StackSlot emitFloatToStack(Register a) {
*** 260,274 ****
emitREX(false, a.encoding, 0, 0);
code.emitByte(0xF3);
code.emitByte(0x0F);
code.emitByte(0x11); // MOVSS xmm2/m32, xmm1
code.emitByte(0x85 | ((a.encoding & 0x7) << 3)); // [rbp+offset]
! if (ret.getRawOffset() < 0) {
! code.emitInt(ret.getRawOffset() + 16);
! } else {
! code.emitInt(-(frameSize - ret.getRawOffset()) + 16);
! }
return ret;
}
@Override
public StackSlot emitDoubleToStack(Register a) {
--- 271,281 ----
emitREX(false, a.encoding, 0, 0);
code.emitByte(0xF3);
code.emitByte(0x0F);
code.emitByte(0x11); // MOVSS xmm2/m32, xmm1
code.emitByte(0x85 | ((a.encoding & 0x7) << 3)); // [rbp+offset]
! code.emitInt(getAdjustedOffset(ret));
return ret;
}
@Override
public StackSlot emitDoubleToStack(Register a) {
*** 280,294 ****
emitREX(false, a.encoding, 0, 0);
code.emitByte(0xF2);
code.emitByte(0x0F);
code.emitByte(0x11); // MOVSD xmm2/m32, xmm1
code.emitByte(0x85 | ((a.encoding & 0x7) << 3)); // [rbp+offset]
! if (ret.getRawOffset() < 0) {
! code.emitInt(ret.getRawOffset() + 16);
! } else {
! code.emitInt(-(frameSize - ret.getRawOffset()) + 16);
! }
return ret;
}
@Override
public StackSlot emitPointerToStack(Register a) {
--- 287,297 ----
emitREX(false, a.encoding, 0, 0);
code.emitByte(0xF2);
code.emitByte(0x0F);
code.emitByte(0x11); // MOVSD xmm2/m32, xmm1
code.emitByte(0x85 | ((a.encoding & 0x7) << 3)); // [rbp+offset]
! code.emitInt(getAdjustedOffset(ret));
return ret;
}
@Override
public StackSlot emitPointerToStack(Register a) {
*** 381,399 ****
emitLoadLong(reg, (Long) prim);
}
} else if (av instanceof StackSlot) {
StackSlot slot = (StackSlot) av;
if (prim instanceof Float) {
! emitFloatToStack(slot, emitLoadFloat((Float) prim));
} else if (prim instanceof Double) {
! emitDoubleToStack(slot, emitLoadDouble((Double) prim));
} else if (prim instanceof Integer) {
! emitIntToStack(slot, emitLoadInt((Integer) prim));
} else if (prim instanceof Long) {
! emitLongToStack(slot, emitLoadLong((Long) prim));
! }
assert false : "Unimplemented";
} else {
throw new IllegalArgumentException("Unknown value " + av);
}
}
--- 384,403 ----
emitLoadLong(reg, (Long) prim);
}
} else if (av instanceof StackSlot) {
StackSlot slot = (StackSlot) av;
if (prim instanceof Float) {
! emitFloatToStack(slot, emitLoadFloat(doubleScratch, (Float) prim));
} else if (prim instanceof Double) {
! emitDoubleToStack(slot, emitLoadDouble(doubleScratch, (Double) prim));
} else if (prim instanceof Integer) {
! emitIntToStack(slot, emitLoadInt(scratchRegister, (Integer) prim));
} else if (prim instanceof Long) {
! emitLongToStack(slot, emitLoadLong(scratchRegister, (Long) prim));
! } else {
assert false : "Unimplemented";
+ }
} else {
throw new IllegalArgumentException("Unknown value " + av);
}
}
< prev index next >