Mercurial > hg > truffle
diff c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotXirGenerator.java @ 2055:99ad52189524
Refactorings to get towards less CRI overhead.
author | Thomas Wuerthinger <wuerthinger@ssw.jku.at> |
---|---|
date | Thu, 13 Jan 2011 17:45:17 +0100 |
parents | 00bc9eaf0e24 |
children | 89bf01e6b049 |
line wrap: on
line diff
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotXirGenerator.java Wed Jan 12 19:14:32 2011 +0100 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotXirGenerator.java Thu Jan 13 17:45:17 2011 +0100 @@ -37,6 +37,7 @@ import com.sun.cri.xir.CiXirAssembler.XirMark; import com.sun.cri.xir.CiXirAssembler.XirOperand; import com.sun.cri.xir.CiXirAssembler.XirParameter; +import com.sun.cri.xir.CiXirAssembler.XirTemp; /** * @@ -378,6 +379,22 @@ } }; + private KindTemplates writeBarrierTemplate = new KindTemplates() { + + @Override + protected XirTemplate create(CiXirAssembler asm, long flags, CiKind kind) { + asm.restart(CiKind.Void); + XirParameter object = asm.createInputParameter("object", CiKind.Object); + + // Need temp operand, because the write barrier destroys the object pointer. + XirOperand temp = asm.createTemp("temp", CiKind.Object); + asm.mov(temp, object); + + writeBarrier(asm, temp); + return asm.finishTemplate("writeBarrier"); + } + }; + private KindTemplates putFieldTemplates = new KindTemplates(WRITE_BARRIER, NULL_CHECK, UNRESOLVED) { @Override @@ -885,6 +902,11 @@ } @Override + public XirSnippet genWriteBarrier(XirArgument object) { + return new XirSnippet(writeBarrierTemplate.get(null, CiKind.Void), object); + } + + @Override public XirSnippet genPutField(XirSite site, XirArgument object, RiField field, XirArgument value) { if (field.isResolved()) { return new XirSnippet(putFieldTemplates.get(site, field.kind()), object, value, XirArgument.forInt(((HotSpotField) field).offset()));