Mercurial > hg > truffle
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 } |