comparison c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotXirGenerator.java @ 1426:ed6bd46ad55e

small cleanup
author Lukas Stadler <lukas.stadler@oracle.com>
date Wed, 18 Aug 2010 11:44:04 -0700
parents 98fffb304868
children 149b1d2316de
comparison
equal deleted inserted replaced
1425:98fffb304868 1426:ed6bd46ad55e
125 newInstanceTemplate = buildNewInstance(); 125 newInstanceTemplate = buildNewInstance();
126 126
127 return templates; 127 return templates;
128 } 128 }
129 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");
160 }
161
162 private XirTemplate buildPrologue(boolean staticMethod) { 130 private XirTemplate buildPrologue(boolean staticMethod) {
163 asm.restart(CiKind.Void); 131 asm.restart(CiKind.Void);
164 XirOperand temp = asm.createRegister("temp (rax)", CiKind.Int, AMD64.rax); 132 XirOperand temp = asm.createRegister("temp (rax)", CiKind.Int, AMD64.rax);
165 XirOperand frame_pointer = asm.createRegister("frame pointer", CiKind.Word, AMD64.rbp); 133 XirOperand frame_pointer = asm.createRegister("frame pointer", CiKind.Word, AMD64.rbp);
166 134
428 asm.bindOutOfLine(dummy); 396 asm.bindOutOfLine(dummy);
429 397
430 return asm.finishTemplate(addr, "invokespecial"); 398 return asm.finishTemplate(addr, "invokespecial");
431 } 399 }
432 400
401 private XirTemplate buildNewInstance() {
402 XirOperand result = asm.restart(CiKind.Word);
403 XirOperand type = asm.createInputParameter("type", CiKind.Object);
404 XirOperand instanceSize = asm.createConstantInputParameter("instance size", CiKind.Word);
405
406 XirOperand thread = asm.createRegister("thread", CiKind.Word, AMD64.r15);
407 XirOperand temp1 = asm.createTemp("temp1", CiKind.Word);
408 XirOperand temp2 = asm.createTemp("temp2", CiKind.Word);
409 XirLabel tlabFull = asm.createOutOfLineLabel("tlab full");
410 XirLabel resume = asm.createInlineLabel("resume");
411
412 asm.pload(CiKind.Word, result, thread, asm.i(config.threadTlabTopOffset), false);
413 asm.add(temp1, result, instanceSize);
414 asm.pload(CiKind.Word, temp2, thread, asm.i(config.threadTlabEndOffset), false);
415
416 asm.jgt(tlabFull, temp1, temp2);
417 asm.pstore(CiKind.Word, thread, asm.i(config.threadTlabTopOffset), temp1, false);
418 asm.bindInline(resume);
419
420 asm.pload(CiKind.Word, temp1, type, asm.i(config.instanceHeaderPrototypeOffset), false);
421 asm.pstore(CiKind.Word, result, temp1, false);
422 asm.pstore(CiKind.Object, result, asm.i(config.hubOffset), type, false);
423
424 asm.bindOutOfLine(tlabFull);
425 XirOperand arg = asm.createRegister("runtime call argument", CiKind.Object, AMD64.rdx);
426 asm.mov(arg, type);
427 asm.callRuntime(config.newInstanceStub, result);
428 asm.jmp(resume);
429
430 return asm.finishTemplate("new instance");
431 }
432
433 @Override 433 @Override
434 public XirSnippet genArrayLength(XirSite site, XirArgument array) { 434 public XirSnippet genArrayLength(XirSite site, XirArgument array) {
435 return new XirSnippet(arrayLengthTemplate, array); 435 return new XirSnippet(arrayLengthTemplate, array);
436 } 436 }
437 437