Mercurial > hg > truffle
diff c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotXirGenerator.java @ 1434:72cfb36c6bb2
* enabled all jtt tests
* added proxy that counts jni calls
* honor hotspot stackshadowpages
* constant pool caching
* monitor enter/exit
* arithmetic stubs (frem, drem, ...)
* create stack values for debug info
* some doc
author | Lukas Stadler <lukas.stadler@oracle.com> |
---|---|
date | Thu, 30 Sep 2010 17:19:48 -0700 |
parents | efba53f86c4f |
children | 9e5e83ca2259 |
line wrap: on
line diff
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotXirGenerator.java Thu Sep 16 19:42:20 2010 -0700 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotXirGenerator.java Thu Sep 30 17:19:48 2010 -0700 @@ -71,7 +71,7 @@ this.registerConfig = registerConfig; } - private SimpleTemplates prologueTemplates = new SimpleTemplates(STATIC_METHOD, SYNCHRONIZED) { + private SimpleTemplates prologueTemplates = new SimpleTemplates(STATIC_METHOD) { @Override protected XirTemplate create(CiXirAssembler asm, long flags) { @@ -96,14 +96,11 @@ } asm.align(config.codeEntryAlignment); asm.mark(MARK_VERIFIED_ENTRY); + asm.stackOverflowCheck(); asm.push(framePointer); asm.mov(framePointer, stackPointer); asm.pushFrame(); - if (is(SYNCHRONIZED, flags)) { - // TODO synchronized methods / monitors - } - // -- out of line ------------------------------------------------------- XirOperand thread = asm.createRegister("thread", CiKind.Word, AMD64.r15); XirOperand exceptionOop = asm.createTemp("exception oop", CiKind.Object); @@ -139,10 +136,6 @@ asm.restart(CiKind.Void); XirOperand framePointer = asm.createRegister("frame pointer", CiKind.Word, AMD64.rbp); - if (is(SYNCHRONIZED, flags)) { - // TODO synchronized methods / monitors - } - asm.popFrame(); asm.pop(framePointer); @@ -158,7 +151,9 @@ protected XirTemplate create(CiXirAssembler asm, long flags) { asm.restart(CiKind.Void); - // TODO safepoint + // XirOperand temp = asm.createRegister("temp", CiKind.Word, AMD64.rax); + // asm.pload(CiKind.Word, temp, asm.w(config.safepointPollingAddress), true); + return asm.finishTemplate("safepoint"); } }; @@ -297,14 +292,18 @@ protected XirTemplate create(CiXirAssembler asm, long flags) { asm.restart(CiKind.Void); XirParameter object = asm.createInputParameter("object", CiKind.Object); - XirOperand temp = asm.createRegister("temp", CiKind.Word, AMD64.rax); + XirParameter lock = asm.createInputParameter("lock", CiKind.Word); if (is(NULL_CHECK, flags)) { asm.nop(1); asm.mark(MARK_IMPLICIT_NULL); - asm.pload(CiKind.Word, temp, object, true); + asm.pload(CiKind.Word, asm.createTemp("temp", CiKind.Word), object, true); } - +/* + useRegisters(asm, AMD64.rbx, AMD64.rsi, AMD64.rdx); + useRegisters(asm, AMD64.rax); + asm.callRuntime(config.monitorEnterStub, null, object, lock); +*/ return asm.finishTemplate("monitorEnter"); } }; @@ -315,14 +314,12 @@ protected XirTemplate create(CiXirAssembler asm, long flags) { asm.restart(CiKind.Void); XirParameter object = asm.createInputParameter("object", CiKind.Object); - XirOperand temp = asm.createRegister("temp", CiKind.Word, AMD64.rax); - - if (is(NULL_CHECK, flags)) { - asm.nop(1); - asm.mark(MARK_IMPLICIT_NULL); - asm.pload(CiKind.Word, temp, object, true); - } - + XirParameter lock = asm.createInputParameter("lock", CiKind.Word); +/* + useRegisters(asm, AMD64.rbx, AMD64.rsi, AMD64.rdx); + useRegisters(asm, AMD64.rax); + asm.callRuntime(config.monitorExitStub, null, object, lock); +*/ return asm.finishTemplate("monitorExit"); } }; @@ -360,7 +357,7 @@ XirParameter value = asm.createInputParameter("value", kind); if (is(UNRESOLVED, flags)) { - UnresolvedFieldPatching fieldPatching = new UnresolvedFieldPatching(asm, object, value, false, is(NULL_CHECK, flags), config); + UnresolvedFieldPatching fieldPatching = new UnresolvedFieldPatching(asm, object, value, true, is(NULL_CHECK, flags), config); fieldPatching.emitInline(); // -- out of line ------------------------------------------------------- fieldPatching.emitOutOfLine(); @@ -389,7 +386,7 @@ XirOperand thread = asm.createRegister("thread", CiKind.Word, AMD64.r15); XirOperand temp1 = asm.createRegister("temp1", CiKind.Word, AMD64.rcx); XirOperand temp2 = asm.createRegister("temp2", CiKind.Word, AMD64.rbx); - XirOperand temp2i = asm.createRegister("temp2i", CiKind.Word, AMD64.rbx); + XirOperand temp2i = asm.createRegister("temp2i", CiKind.Int, AMD64.rbx); useRegisters(asm, AMD64.rsi); XirLabel tlabFull = asm.createOutOfLineLabel("tlab full"); XirLabel resume = asm.createInlineLabel("resume"); @@ -421,6 +418,7 @@ asm.bindOutOfLine(tlabFull); XirOperand arg = asm.createRegister("runtime call argument", CiKind.Object, AMD64.rdx); asm.mov(arg, type); + useRegisters(asm, AMD64.rax); asm.callRuntime(config.newInstanceStub, result); asm.jmp(resume); @@ -439,6 +437,7 @@ patching.emitInline(); useRegisters(asm, AMD64.rbx, AMD64.rcx, AMD64.rsi); + useRegisters(asm, AMD64.rax); asm.callRuntime(config.unresolvedNewInstanceStub, result); // -- out of line ------------------------------------------------------- @@ -469,7 +468,8 @@ } asm.mov(length, lengthParam); - useRegisters(asm, AMD64.rax, AMD64.rsi, AMD64.rcx, AMD64.rdi); + useRegisters(asm, AMD64.rsi, AMD64.rcx, AMD64.rdi); + useRegisters(asm, AMD64.rax); asm.callRuntime(config.newObjectArrayStub, result); if (is(UNRESOLVED, flags)) { patching.emitOutOfLine(); @@ -492,7 +492,8 @@ asm.mov(hub, hubParam); asm.mov(length, lengthParam); - useRegisters(asm, AMD64.rax, AMD64.rsi, AMD64.rcx, AMD64.rdi); + useRegisters(asm, AMD64.rsi, AMD64.rcx, AMD64.rdi); + useRegisters(asm, AMD64.rax); asm.callRuntime(config.newTypeArrayStub, result); return asm.finishTemplate("newTypeArray"); @@ -525,6 +526,7 @@ } asm.mov(rank, asm.i(dimensions)); + useRegisters(asm, AMD64.rax); asm.callRuntime(config.newMultiArrayStub, result); if (is(UNRESOLVED, flags)) { patching.emitOutOfLine(); @@ -791,8 +793,8 @@ } @Override - public XirSnippet genResolveClass(XirSite site, RiType type, Representation representation) { - assert representation == Representation.ObjectHub : "unexpected representation: " + representation; + public XirSnippet genResolveClass(XirSite site, RiType type, Representation rep) { + assert rep == Representation.ObjectHub || rep == Representation.StaticFields : "unexpected representation: " + rep; if (type instanceof HotSpotTypeResolved) { return new XirSnippet(resolveClassTemplates.get(site), XirArgument.forObject(type)); } @@ -825,13 +827,13 @@ } @Override - public XirSnippet genMonitorEnter(XirSite site, XirArgument receiver) { - return new XirSnippet(monitorEnterTemplates.get(site), receiver); + public XirSnippet genMonitorEnter(XirSite site, XirArgument receiver, XirArgument lockAddress) { + return new XirSnippet(monitorEnterTemplates.get(site), receiver, lockAddress); } @Override - public XirSnippet genMonitorExit(XirSite site, XirArgument receiver) { - return new XirSnippet(monitorExitTemplates.get(site), receiver); + public XirSnippet genMonitorExit(XirSite site, XirArgument receiver, XirArgument lockAddress) { + return new XirSnippet(monitorExitTemplates.get(site), receiver, lockAddress); } @Override @@ -1038,6 +1040,7 @@ asm.mark(MARK_DUMMY_OOP_RELOCATION); if (nullCheck) { asm.mark(MARK_IMPLICIT_NULL); + asm.safepoint(); } asm.jmp(patchStub);