Mercurial > hg > truffle
diff c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotXirGenerator.java @ 1425:98fffb304868
tlab-allocated "new instance", invokespecial, support for static fields in COMPILER_CLASSES_DO
author | Lukas Stadler <lukas.stadler@oracle.com> |
---|---|
date | Tue, 17 Aug 2010 17:34:25 -0700 |
parents | 1ea65e9d943c |
children | ed6bd46ad55e |
line wrap: on
line diff
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotXirGenerator.java Mon Aug 16 20:00:59 2010 -0700 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotXirGenerator.java Tue Aug 17 17:34:25 2010 -0700 @@ -26,6 +26,7 @@ import com.sun.cri.ri.*; import com.sun.cri.ri.RiType.Representation; import com.sun.cri.xir.*; +import com.sun.cri.xir.CiXirAssembler.XirOperand; import com.sun.cri.xir.CiXirAssembler.*; /** @@ -54,6 +55,8 @@ private XirTemplate arrayLengthTemplate; private XirTemplate exceptionObjectTemplate; private XirTemplate invokeStaticTemplate; + private XirTemplate invokeSpecialTemplate; + private XirTemplate newInstanceTemplate; static class XirPair { @@ -105,6 +108,11 @@ } // templates.add(emptyTemplates[index]); } + + asm.restart(); + XirOperand result = asm.createTemp("result", CiKind.Word); + emptyTemplates[CiKind.Word.ordinal()] = asm.finishTemplate(result, "empty-Word"); + prologueTemplate = buildPrologue(false); staticPrologueTemplate = buildPrologue(true); epilogueTemplate = buildEpilogue(); @@ -113,13 +121,46 @@ instanceofTemplate = buildInstanceof(false); instanceofTemplateNonnull = buildInstanceof(true); invokeStaticTemplate = buildInvokeStatic(); + invokeSpecialTemplate = buildInvokeSpecial(); + newInstanceTemplate = buildNewInstance(); return templates; } + private XirTemplate buildNewInstance() { + XirOperand result = asm.restart(CiKind.Word); + XirOperand type = asm.createInputParameter("type", CiKind.Object); + XirOperand instanceSize = asm.createConstantInputParameter("instance size", CiKind.Word); + + XirOperand thread = asm.createRegister("thread", CiKind.Word, AMD64.r15); + XirOperand temp1 = asm.createTemp("temp1", CiKind.Word); + XirOperand temp2 = asm.createTemp("temp2", CiKind.Word); + XirLabel tlabFull = asm.createOutOfLineLabel("tlab full"); + XirLabel resume = asm.createInlineLabel("resume"); + + asm.pload(CiKind.Word, result, thread, asm.i(config.threadTlabTopOffset), false); + asm.add(temp1, result, instanceSize); + asm.pload(CiKind.Word, temp2, thread, asm.i(config.threadTlabEndOffset), false); + + asm.jgt(tlabFull, temp1, temp2); + asm.pstore(CiKind.Word, thread, asm.i(config.threadTlabTopOffset), temp1, false); + asm.bindInline(resume); + + asm.pload(CiKind.Word, temp1, type, asm.i(config.instanceHeaderPrototypeOffset), false); + asm.pstore(CiKind.Word, result, temp1, false); + asm.pstore(CiKind.Object, result, asm.i(config.hubOffset), type, false); + + asm.bindOutOfLine(tlabFull); + XirOperand arg = asm.createRegister("runtime call argument", CiKind.Object, AMD64.rdx); + asm.mov(arg, type); + asm.callRuntime(config.newInstanceStub, result); + asm.jmp(resume); + + return asm.finishTemplate("new instance"); + } + private XirTemplate buildPrologue(boolean staticMethod) { asm.restart(CiKind.Void); - XirOperand sp = asm.createRegister("stack pointer", CiKind.Word, registerConfig.getStackPointerRegister()); XirOperand temp = asm.createRegister("temp (rax)", CiKind.Int, AMD64.rax); XirOperand frame_pointer = asm.createRegister("frame pointer", CiKind.Word, AMD64.rbp); @@ -372,6 +413,23 @@ return asm.finishTemplate(addr, "invokestatic"); } + private XirTemplate buildInvokeSpecial() { + asm.restart(); + XirParameter addr = asm.createConstantInputParameter("addr", CiKind.Word); + + XirLabel stub = asm.createOutOfLineLabel("specialCallStub"); + + asm.bindOutOfLine(stub); + XirOperand method = asm.createRegister("method", CiKind.Word, AMD64.rbx); + asm.mark(MARK_STATIC_CALL_STUB, XirMark.CALLSITE); + asm.mov(method, asm.w(0l)); + XirLabel dummy = asm.createOutOfLineLabel("dummy"); + asm.jmp(dummy); + asm.bindOutOfLine(dummy); + + return asm.finishTemplate(addr, "invokespecial"); + } + @Override public XirSnippet genArrayLength(XirSite site, XirArgument array) { return new XirSnippet(arrayLengthTemplate, array); @@ -462,7 +520,7 @@ @Override public XirSnippet genInvokeSpecial(XirSite site, XirArgument receiver, RiMethod method) { - return new XirSnippet(emptyTemplates[CiKind.Word.ordinal()]); + return new XirSnippet(invokeSpecialTemplate, XirArgument.forWord(0)); } @Override @@ -492,7 +550,9 @@ @Override public XirSnippet genNewInstance(XirSite site, RiType type) { - return new XirSnippet(emptyTemplates[CiKind.Object.ordinal()]); + assert type instanceof HotSpotTypeResolved; + HotSpotTypeResolved resolved = (HotSpotTypeResolved) type; + return new XirSnippet(newInstanceTemplate, XirArgument.forObject(type), XirArgument.forWord(resolved.instanceSize())); } @Override