comparison graal/GraalCompiler/src/com/sun/c1x/gen/LIRGenerator.java @ 2633:721a45190d6d

Merge.
author Thomas Wuerthinger <thomas@wuerthinger.net>
date Tue, 10 May 2011 18:12:26 +0200
parents 776e026f2e15 569228710be8
children 4dd0573f510b
comparison
equal deleted inserted replaced
2632:776e026f2e15 2633:721a45190d6d
25 import static com.sun.cri.bytecode.Bytecodes.*; 25 import static com.sun.cri.bytecode.Bytecodes.*;
26 import static com.sun.cri.bytecode.Bytecodes.MemoryBarriers.*; 26 import static com.sun.cri.bytecode.Bytecodes.MemoryBarriers.*;
27 import static com.sun.cri.ci.CiCallingConvention.Type.*; 27 import static com.sun.cri.ci.CiCallingConvention.Type.*;
28 import static com.sun.cri.ci.CiValue.*; 28 import static com.sun.cri.ci.CiValue.*;
29 29
30 import java.lang.reflect.*;
31 import java.util.*; 30 import java.util.*;
32 31
33 import com.sun.c1x.*; 32 import com.sun.c1x.*;
34 import com.sun.c1x.alloc.*; 33 import com.sun.c1x.alloc.*;
35 import com.sun.c1x.alloc.OperandPool.VariableFlag; 34 import com.sun.c1x.alloc.OperandPool.VariableFlag;
41 import com.sun.c1x.lir.*; 40 import com.sun.c1x.lir.*;
42 import com.sun.c1x.opt.*; 41 import com.sun.c1x.opt.*;
43 import com.sun.c1x.util.*; 42 import com.sun.c1x.util.*;
44 import com.sun.c1x.value.*; 43 import com.sun.c1x.value.*;
45 import com.sun.c1x.value.FrameState.PhiProcedure; 44 import com.sun.c1x.value.FrameState.PhiProcedure;
46 import com.sun.cri.bytecode.*;
47 import com.sun.cri.bytecode.Bytecodes.MemoryBarriers; 45 import com.sun.cri.bytecode.Bytecodes.MemoryBarriers;
48 import com.sun.cri.ci.*; 46 import com.sun.cri.ci.*;
49 import com.sun.cri.ri.*; 47 import com.sun.cri.ri.*;
50 import com.sun.cri.xir.CiXirAssembler.XirConstant; 48 import com.sun.cri.xir.CiXirAssembler.XirConstant;
51 import com.sun.cri.xir.CiXirAssembler.XirInstruction; 49 import com.sun.cri.xir.CiXirAssembler.XirInstruction;
266 return x.operand(); 264 return x.operand();
267 } 265 }
268 266
269 @Override 267 @Override
270 public void visitBase(Base x) { 268 public void visitBase(Base x) {
269 // emit phi-instruction move after safepoint since this simplifies
270 // describing the state at the safepoint.
271 //moveToPhi();
272
271 // all blocks with a successor must end with an unconditional jump 273 // all blocks with a successor must end with an unconditional jump
272 // to the successor even if they are consecutive 274 // to the successor even if they are consecutive
273 lir.jump(x.defaultSuccessor()); 275 lir.jump(x.defaultSuccessor());
274 } 276 }
275 277
293 } 295 }
294 } 296 }
295 297
296 @Override 298 @Override
297 public void visitResolveClass(ResolveClass i) { 299 public void visitResolveClass(ResolveClass i) {
298 LIRDebugInfo info = stateFor(i); 300 LIRDebugInfo info = stateFor(i, i.stateAfter());
299 XirSnippet snippet = xir.genResolveClass(site(i), i.type, i.portion); 301 XirSnippet snippet = xir.genResolveClass(site(i), i.type, i.portion);
300 emitXir(snippet, i, info, null, true); 302 emitXir(snippet, i, info, null, true);
301 } 303 }
302 304
303 @Override 305 @Override
441 443
442 lir.cmp(i.condition(), left, right); 444 lir.cmp(i.condition(), left, right);
443 lir.cmove(i.condition(), tVal, fVal, reg); 445 lir.cmove(i.condition(), tVal, fVal, reg);
444 } 446 }
445 447
446 /*protected FrameState stateBeforeInvoke(Invoke invoke) { 448 protected FrameState stateBeforeInvoke(Invoke invoke) {
447 FrameState stateAfter = invoke.stateAfter(); 449 FrameState stateAfter = invoke.stateAfter();
448 FrameStateBuilder builder = new FrameStateBuilder(compilation.method, invoke.graph()); 450 FrameStateBuilder builder = new FrameStateBuilder(compilation.method, invoke.graph());
449 System.out.println("stateBeforeInvoke(" + invoke + "); maxStack=" + compilation.method.maxStackSize());
450 System.out.println("stateAfter=" + stateAfter);
451 builder.initializeFrom(stateAfter); 451 builder.initializeFrom(stateAfter);
452 if (invoke.kind != CiKind.Void) { 452 if (invoke.kind != CiKind.Void) {
453 Value pop = builder.pop(invoke.kind); 453 builder.pop(invoke.kind);
454 System.out.println("pop " + pop);
455 } 454 }
456 int argumentCount = invoke.argumentCount(); // invoke.arguments() iterable? 455 int argumentCount = invoke.argumentCount(); // invoke.arguments() iterable?
457 for (int i = 0; i < argumentCount; i++) { 456 for (int i = 0; i < argumentCount; i++) {
458 Value arg = invoke.argument(i); 457 Value arg = invoke.argument(i);
459 System.out.println("push " + arg);
460 builder.push(arg.kind, arg); 458 builder.push(arg.kind, arg);
461 } 459 }
462 return builder.create(invoke.bci()); 460 return builder.create(invoke.bci());
463 }*/ 461 }
464 462
465 @Override 463 @Override
466 public void visitInvoke(Invoke x) { 464 public void visitInvoke(Invoke x) {
467 RiMethod target = x.target(); 465 RiMethod target = x.target();
468 LIRDebugInfo info = stateFor(x); 466 LIRDebugInfo info = stateFor(x, stateBeforeInvoke(x));
469 467
470 XirSnippet snippet = null; 468 XirSnippet snippet = null;
471 469
472 int opcode = x.opcode(); 470 int opcode = x.opcode();
473 XirArgument receiver; 471 XirArgument receiver;
999 CiVariable operand = newVariable(x.kind); 997 CiVariable operand = newVariable(x.kind);
1000 setResult(x, operand); 998 setResult(x, operand);
1001 return operand; 999 return operand;
1002 } 1000 }
1003 1001
1002 private FrameState stateBeforeRegisterFinalizer(RegisterFinalizer rf) {
1003 Value object = rf.object();
1004 FrameStateBuilder builder = new FrameStateBuilder(compilation.method, rf.graph());
1005 builder.initializeFrom(rf.stateAfter());
1006 builder.push(object.kind, object);
1007 return builder.create(rf.bci());
1008 }
1009
1004 @Override 1010 @Override
1005 public void visitRegisterFinalizer(RegisterFinalizer x) { 1011 public void visitRegisterFinalizer(RegisterFinalizer x) {
1006 Value object = x.object(); 1012 CiValue receiver = load(x.object());
1007 CiValue receiver = load(object); 1013 LIRDebugInfo info = stateFor(x, stateBeforeRegisterFinalizer(x));
1008 FrameStateBuilder builder = new FrameStateBuilder(compilation.method, x.graph());
1009 builder.initializeFrom(x.stateAfter());
1010 builder.push(object.kind, object);
1011 LIRDebugInfo info = stateFor(x, builder.create(x.bci()));
1012 callRuntime(CiRuntimeCall.RegisterFinalizer, info, receiver); 1014 callRuntime(CiRuntimeCall.RegisterFinalizer, info, receiver);
1013 setNoResult(x); 1015 setNoResult(x);
1014 } 1016 }
1015 1017
1016 private void visitSwitchRanges(SwitchRange[] x, CiValue value, BlockBegin defaultSux) { 1018 private void visitSwitchRanges(SwitchRange[] x, CiValue value, BlockBegin defaultSux) {
1461 } 1463 }
1462 } 1464 }
1463 } 1465 }
1464 1466
1465 protected LIRDebugInfo maybeStateFor(Instruction x) { 1467 protected LIRDebugInfo maybeStateFor(Instruction x) {
1466 if (lastState == null) { 1468 if (x.stateAfter() == null) {
1467 return null; 1469 return null;
1468 } 1470 }
1469 return stateFor(x, lastState); 1471 return stateFor(x, x.stateAfter());
1470 } 1472 }
1471 1473
1472 protected LIRDebugInfo stateFor(Instruction x) { 1474 protected LIRDebugInfo stateFor(Instruction x) {
1473 assert lastState != null : "must have state before instruction for " + x; 1475 assert lastState != null : "must have state before instruction for " + x;
1474 return stateFor(x, lastState); 1476 return stateFor(x, lastState);
1636 @Override 1638 @Override
1637 public String toString() { 1639 public String toString() {
1638 return "XirSupport<" + current + ">"; 1640 return "XirSupport<" + current + ">";
1639 } 1641 }
1640 1642
1641 } 1643
1642 1644 }
1643 private CiValue emitInvokeKnown(RiMethod method, FrameState stateBefore, Value... args) {
1644 boolean isStatic = Modifier.isStatic(method.accessFlags());
1645 Invoke invoke = new Invoke(isStatic ? Bytecodes.INVOKESTATIC : Bytecodes.INVOKESPECIAL, method.signature().returnKind(), args, method, null, stateBefore, null);
1646 visitInvoke(invoke);
1647 return invoke.operand();
1648 }
1649
1650 1645
1651 @Override 1646 @Override
1652 public void visitFrameState(FrameState i) { 1647 public void visitFrameState(FrameState i) {
1653 // nothing to do for now 1648 // nothing to do for now
1654 } 1649 }