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()]);