< 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 >