Mercurial > hg > graal-jvmci-8
comparison 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 |
comparison
equal
deleted
inserted
replaced
1424:1ea65e9d943c | 1425:98fffb304868 |
---|---|
24 import com.sun.cri.ci.CiAddress.Scale; | 24 import com.sun.cri.ci.CiAddress.Scale; |
25 import com.sun.cri.ci.*; | 25 import com.sun.cri.ci.*; |
26 import com.sun.cri.ri.*; | 26 import com.sun.cri.ri.*; |
27 import com.sun.cri.ri.RiType.Representation; | 27 import com.sun.cri.ri.RiType.Representation; |
28 import com.sun.cri.xir.*; | 28 import com.sun.cri.xir.*; |
29 import com.sun.cri.xir.CiXirAssembler.XirOperand; | |
29 import com.sun.cri.xir.CiXirAssembler.*; | 30 import com.sun.cri.xir.CiXirAssembler.*; |
30 | 31 |
31 /** | 32 /** |
32 * | 33 * |
33 * @author Thomas Wuerthinger, Lukas Stadler | 34 * @author Thomas Wuerthinger, Lukas Stadler |
52 private XirTemplate staticPrologueTemplate; | 53 private XirTemplate staticPrologueTemplate; |
53 private XirTemplate epilogueTemplate; | 54 private XirTemplate epilogueTemplate; |
54 private XirTemplate arrayLengthTemplate; | 55 private XirTemplate arrayLengthTemplate; |
55 private XirTemplate exceptionObjectTemplate; | 56 private XirTemplate exceptionObjectTemplate; |
56 private XirTemplate invokeStaticTemplate; | 57 private XirTemplate invokeStaticTemplate; |
58 private XirTemplate invokeSpecialTemplate; | |
59 private XirTemplate newInstanceTemplate; | |
57 | 60 |
58 static class XirPair { | 61 static class XirPair { |
59 | 62 |
60 final XirTemplate resolved; | 63 final XirTemplate resolved; |
61 final XirTemplate unresolved; | 64 final XirTemplate unresolved; |
103 arrayStoreTemplates[index] = buildArrayStore(kind, asm, true, kind == CiKind.Object, kind == CiKind.Object); | 106 arrayStoreTemplates[index] = buildArrayStore(kind, asm, true, kind == CiKind.Object, kind == CiKind.Object); |
104 // newArrayTemplates[index] = buildNewArray(kind); | 107 // newArrayTemplates[index] = buildNewArray(kind); |
105 } | 108 } |
106 // templates.add(emptyTemplates[index]); | 109 // templates.add(emptyTemplates[index]); |
107 } | 110 } |
111 | |
112 asm.restart(); | |
113 XirOperand result = asm.createTemp("result", CiKind.Word); | |
114 emptyTemplates[CiKind.Word.ordinal()] = asm.finishTemplate(result, "empty-Word"); | |
115 | |
108 prologueTemplate = buildPrologue(false); | 116 prologueTemplate = buildPrologue(false); |
109 staticPrologueTemplate = buildPrologue(true); | 117 staticPrologueTemplate = buildPrologue(true); |
110 epilogueTemplate = buildEpilogue(); | 118 epilogueTemplate = buildEpilogue(); |
111 arrayLengthTemplate = buildArrayLength(); | 119 arrayLengthTemplate = buildArrayLength(); |
112 exceptionObjectTemplate = buildExceptionObject(); | 120 exceptionObjectTemplate = buildExceptionObject(); |
113 instanceofTemplate = buildInstanceof(false); | 121 instanceofTemplate = buildInstanceof(false); |
114 instanceofTemplateNonnull = buildInstanceof(true); | 122 instanceofTemplateNonnull = buildInstanceof(true); |
115 invokeStaticTemplate = buildInvokeStatic(); | 123 invokeStaticTemplate = buildInvokeStatic(); |
124 invokeSpecialTemplate = buildInvokeSpecial(); | |
125 newInstanceTemplate = buildNewInstance(); | |
116 | 126 |
117 return templates; | 127 return templates; |
128 } | |
129 | |
130 private XirTemplate buildNewInstance() { | |
131 XirOperand result = asm.restart(CiKind.Word); | |
132 XirOperand type = asm.createInputParameter("type", CiKind.Object); | |
133 XirOperand instanceSize = asm.createConstantInputParameter("instance size", CiKind.Word); | |
134 | |
135 XirOperand thread = asm.createRegister("thread", CiKind.Word, AMD64.r15); | |
136 XirOperand temp1 = asm.createTemp("temp1", CiKind.Word); | |
137 XirOperand temp2 = asm.createTemp("temp2", CiKind.Word); | |
138 XirLabel tlabFull = asm.createOutOfLineLabel("tlab full"); | |
139 XirLabel resume = asm.createInlineLabel("resume"); | |
140 | |
141 asm.pload(CiKind.Word, result, thread, asm.i(config.threadTlabTopOffset), false); | |
142 asm.add(temp1, result, instanceSize); | |
143 asm.pload(CiKind.Word, temp2, thread, asm.i(config.threadTlabEndOffset), false); | |
144 | |
145 asm.jgt(tlabFull, temp1, temp2); | |
146 asm.pstore(CiKind.Word, thread, asm.i(config.threadTlabTopOffset), temp1, false); | |
147 asm.bindInline(resume); | |
148 | |
149 asm.pload(CiKind.Word, temp1, type, asm.i(config.instanceHeaderPrototypeOffset), false); | |
150 asm.pstore(CiKind.Word, result, temp1, false); | |
151 asm.pstore(CiKind.Object, result, asm.i(config.hubOffset), type, false); | |
152 | |
153 asm.bindOutOfLine(tlabFull); | |
154 XirOperand arg = asm.createRegister("runtime call argument", CiKind.Object, AMD64.rdx); | |
155 asm.mov(arg, type); | |
156 asm.callRuntime(config.newInstanceStub, result); | |
157 asm.jmp(resume); | |
158 | |
159 return asm.finishTemplate("new instance"); | |
118 } | 160 } |
119 | 161 |
120 private XirTemplate buildPrologue(boolean staticMethod) { | 162 private XirTemplate buildPrologue(boolean staticMethod) { |
121 asm.restart(CiKind.Void); | 163 asm.restart(CiKind.Void); |
122 XirOperand sp = asm.createRegister("stack pointer", CiKind.Word, registerConfig.getStackPointerRegister()); | |
123 XirOperand temp = asm.createRegister("temp (rax)", CiKind.Int, AMD64.rax); | 164 XirOperand temp = asm.createRegister("temp (rax)", CiKind.Int, AMD64.rax); |
124 XirOperand frame_pointer = asm.createRegister("frame pointer", CiKind.Word, AMD64.rbp); | 165 XirOperand frame_pointer = asm.createRegister("frame pointer", CiKind.Word, AMD64.rbp); |
125 | 166 |
126 asm.align(config.codeEntryAlignment); | 167 asm.align(config.codeEntryAlignment); |
127 asm.mark(MARK_UNVERIFIED_ENTRY); | 168 asm.mark(MARK_UNVERIFIED_ENTRY); |
370 asm.bindOutOfLine(dummy); | 411 asm.bindOutOfLine(dummy); |
371 | 412 |
372 return asm.finishTemplate(addr, "invokestatic"); | 413 return asm.finishTemplate(addr, "invokestatic"); |
373 } | 414 } |
374 | 415 |
416 private XirTemplate buildInvokeSpecial() { | |
417 asm.restart(); | |
418 XirParameter addr = asm.createConstantInputParameter("addr", CiKind.Word); | |
419 | |
420 XirLabel stub = asm.createOutOfLineLabel("specialCallStub"); | |
421 | |
422 asm.bindOutOfLine(stub); | |
423 XirOperand method = asm.createRegister("method", CiKind.Word, AMD64.rbx); | |
424 asm.mark(MARK_STATIC_CALL_STUB, XirMark.CALLSITE); | |
425 asm.mov(method, asm.w(0l)); | |
426 XirLabel dummy = asm.createOutOfLineLabel("dummy"); | |
427 asm.jmp(dummy); | |
428 asm.bindOutOfLine(dummy); | |
429 | |
430 return asm.finishTemplate(addr, "invokespecial"); | |
431 } | |
432 | |
375 @Override | 433 @Override |
376 public XirSnippet genArrayLength(XirSite site, XirArgument array) { | 434 public XirSnippet genArrayLength(XirSite site, XirArgument array) { |
377 return new XirSnippet(arrayLengthTemplate, array); | 435 return new XirSnippet(arrayLengthTemplate, array); |
378 } | 436 } |
379 | 437 |
460 return new XirSnippet(emptyTemplates[CiKind.Word.ordinal()]); | 518 return new XirSnippet(emptyTemplates[CiKind.Word.ordinal()]); |
461 } | 519 } |
462 | 520 |
463 @Override | 521 @Override |
464 public XirSnippet genInvokeSpecial(XirSite site, XirArgument receiver, RiMethod method) { | 522 public XirSnippet genInvokeSpecial(XirSite site, XirArgument receiver, RiMethod method) { |
465 return new XirSnippet(emptyTemplates[CiKind.Word.ordinal()]); | 523 return new XirSnippet(invokeSpecialTemplate, XirArgument.forWord(0)); |
466 } | 524 } |
467 | 525 |
468 @Override | 526 @Override |
469 public XirSnippet genInvokeStatic(XirSite site, RiMethod method) { | 527 public XirSnippet genInvokeStatic(XirSite site, RiMethod method) { |
470 return new XirSnippet(invokeStaticTemplate, XirArgument.forWord(0)); | 528 return new XirSnippet(invokeStaticTemplate, XirArgument.forWord(0)); |
490 return new XirSnippet(emptyTemplates[CiKind.Object.ordinal()]); | 548 return new XirSnippet(emptyTemplates[CiKind.Object.ordinal()]); |
491 } | 549 } |
492 | 550 |
493 @Override | 551 @Override |
494 public XirSnippet genNewInstance(XirSite site, RiType type) { | 552 public XirSnippet genNewInstance(XirSite site, RiType type) { |
495 return new XirSnippet(emptyTemplates[CiKind.Object.ordinal()]); | 553 assert type instanceof HotSpotTypeResolved; |
554 HotSpotTypeResolved resolved = (HotSpotTypeResolved) type; | |
555 return new XirSnippet(newInstanceTemplate, XirArgument.forObject(type), XirArgument.forWord(resolved.instanceSize())); | |
496 } | 556 } |
497 | 557 |
498 @Override | 558 @Override |
499 public XirSnippet genNewMultiArray(XirSite site, XirArgument[] lengths, RiType type) { | 559 public XirSnippet genNewMultiArray(XirSite site, XirArgument[] lengths, RiType type) { |
500 return new XirSnippet(emptyTemplates[CiKind.Object.ordinal()]); | 560 return new XirSnippet(emptyTemplates[CiKind.Object.ordinal()]); |