42 import org.graalvm.compiler.core.match.MatchPattern;
43 import org.graalvm.compiler.core.match.MatchRuleRegistry;
44 import org.graalvm.compiler.core.match.MatchStatement;
45 import org.graalvm.compiler.debug.DebugContext;
46 import org.graalvm.compiler.debug.GraalError;
47 import org.graalvm.compiler.debug.TTY;
48 import org.graalvm.compiler.graph.GraalGraphError;
49 import org.graalvm.compiler.graph.Node;
50 import org.graalvm.compiler.graph.NodeMap;
51 import org.graalvm.compiler.graph.NodeSourcePosition;
52 import org.graalvm.compiler.graph.iterators.NodeIterable;
53 import org.graalvm.compiler.lir.FullInfopointOp;
54 import org.graalvm.compiler.lir.LIRFrameState;
55 import org.graalvm.compiler.lir.LIRInstruction;
56 import org.graalvm.compiler.lir.LabelRef;
57 import org.graalvm.compiler.lir.StandardOp.JumpOp;
58 import org.graalvm.compiler.lir.StandardOp.LabelOp;
59 import org.graalvm.compiler.lir.SwitchStrategy;
60 import org.graalvm.compiler.lir.Variable;
61 import org.graalvm.compiler.lir.debug.LIRGenerationDebugContext;
62 import org.graalvm.compiler.lir.gen.LIRGenerator;
63 import org.graalvm.compiler.lir.gen.LIRGenerator.Options;
64 import org.graalvm.compiler.lir.gen.LIRGeneratorTool;
65 import org.graalvm.compiler.lir.gen.LIRGeneratorTool.BlockScope;
66 import org.graalvm.compiler.nodes.AbstractBeginNode;
67 import org.graalvm.compiler.nodes.AbstractEndNode;
68 import org.graalvm.compiler.nodes.AbstractMergeNode;
69 import org.graalvm.compiler.nodes.ConstantNode;
70 import org.graalvm.compiler.nodes.DeoptimizingNode;
71 import org.graalvm.compiler.nodes.DirectCallTargetNode;
72 import org.graalvm.compiler.nodes.FixedNode;
73 import org.graalvm.compiler.nodes.FrameState;
74 import org.graalvm.compiler.nodes.FullInfopointNode;
75 import org.graalvm.compiler.nodes.IfNode;
76 import org.graalvm.compiler.nodes.IndirectCallTargetNode;
77 import org.graalvm.compiler.nodes.Invoke;
78 import org.graalvm.compiler.nodes.InvokeWithExceptionNode;
79 import org.graalvm.compiler.nodes.LogicConstantNode;
80 import org.graalvm.compiler.nodes.LogicNode;
81 import org.graalvm.compiler.nodes.LoopEndNode;
560 LIRKind kind = gen.getLIRKind(isNullNode.getValue().stamp());
561 Value nullValue = gen.emitConstant(kind, JavaConstant.NULL_POINTER);
562 return gen.emitConditionalMove(kind.getPlatformKind(), operand(isNullNode.getValue()), nullValue, Condition.EQ, false, trueValue, falseValue);
563 } else if (node instanceof CompareNode) {
564 CompareNode compare = (CompareNode) node;
565 PlatformKind kind = gen.getLIRKind(compare.getX().stamp()).getPlatformKind();
566 return gen.emitConditionalMove(kind, operand(compare.getX()), operand(compare.getY()), compare.condition(), compare.unorderedIsTrue(), trueValue, falseValue);
567 } else if (node instanceof LogicConstantNode) {
568 return gen.emitMove(((LogicConstantNode) node).getValue() ? trueValue : falseValue);
569 } else if (node instanceof IntegerTestNode) {
570 IntegerTestNode test = (IntegerTestNode) node;
571 return gen.emitIntegerTestMove(operand(test.getX()), operand(test.getY()), trueValue, falseValue);
572 } else {
573 throw GraalError.unimplemented(node.toString());
574 }
575 }
576
577 @Override
578 public void emitInvoke(Invoke x) {
579 LoweredCallTargetNode callTarget = (LoweredCallTargetNode) x.callTarget();
580 CallingConvention invokeCc = gen.getResult().getFrameMapBuilder().getRegisterConfig().getCallingConvention(callTarget.callType(), x.asNode().stamp().javaType(gen.getMetaAccess()),
581 callTarget.signature(), gen);
582 gen.getResult().getFrameMapBuilder().callsMethod(invokeCc);
583
584 Value[] parameters = visitInvokeArguments(invokeCc, callTarget.arguments());
585
586 LabelRef exceptionEdge = null;
587 if (x instanceof InvokeWithExceptionNode) {
588 exceptionEdge = getLIRBlock(((InvokeWithExceptionNode) x).exceptionEdge());
589 }
590 LIRFrameState callState = stateWithExceptionEdge(x, exceptionEdge);
591
592 Value result = invokeCc.getReturn();
593 if (callTarget instanceof DirectCallTargetNode) {
594 emitDirectCall((DirectCallTargetNode) callTarget, result, parameters, AllocatableValue.NONE, callState);
595 } else if (callTarget instanceof IndirectCallTargetNode) {
596 emitIndirectCall((IndirectCallTargetNode) callTarget, result, parameters, AllocatableValue.NONE, callState);
597 } else {
598 throw GraalError.shouldNotReachHere();
599 }
600
601 if (isLegal(result)) {
602 setResult(x.asNode(), gen.emitMove(result));
|
42 import org.graalvm.compiler.core.match.MatchPattern;
43 import org.graalvm.compiler.core.match.MatchRuleRegistry;
44 import org.graalvm.compiler.core.match.MatchStatement;
45 import org.graalvm.compiler.debug.DebugContext;
46 import org.graalvm.compiler.debug.GraalError;
47 import org.graalvm.compiler.debug.TTY;
48 import org.graalvm.compiler.graph.GraalGraphError;
49 import org.graalvm.compiler.graph.Node;
50 import org.graalvm.compiler.graph.NodeMap;
51 import org.graalvm.compiler.graph.NodeSourcePosition;
52 import org.graalvm.compiler.graph.iterators.NodeIterable;
53 import org.graalvm.compiler.lir.FullInfopointOp;
54 import org.graalvm.compiler.lir.LIRFrameState;
55 import org.graalvm.compiler.lir.LIRInstruction;
56 import org.graalvm.compiler.lir.LabelRef;
57 import org.graalvm.compiler.lir.StandardOp.JumpOp;
58 import org.graalvm.compiler.lir.StandardOp.LabelOp;
59 import org.graalvm.compiler.lir.SwitchStrategy;
60 import org.graalvm.compiler.lir.Variable;
61 import org.graalvm.compiler.lir.debug.LIRGenerationDebugContext;
62 import org.graalvm.compiler.lir.framemap.FrameMapBuilder;
63 import org.graalvm.compiler.lir.gen.LIRGenerator;
64 import org.graalvm.compiler.lir.gen.LIRGenerator.Options;
65 import org.graalvm.compiler.lir.gen.LIRGeneratorTool;
66 import org.graalvm.compiler.lir.gen.LIRGeneratorTool.BlockScope;
67 import org.graalvm.compiler.nodes.AbstractBeginNode;
68 import org.graalvm.compiler.nodes.AbstractEndNode;
69 import org.graalvm.compiler.nodes.AbstractMergeNode;
70 import org.graalvm.compiler.nodes.ConstantNode;
71 import org.graalvm.compiler.nodes.DeoptimizingNode;
72 import org.graalvm.compiler.nodes.DirectCallTargetNode;
73 import org.graalvm.compiler.nodes.FixedNode;
74 import org.graalvm.compiler.nodes.FrameState;
75 import org.graalvm.compiler.nodes.FullInfopointNode;
76 import org.graalvm.compiler.nodes.IfNode;
77 import org.graalvm.compiler.nodes.IndirectCallTargetNode;
78 import org.graalvm.compiler.nodes.Invoke;
79 import org.graalvm.compiler.nodes.InvokeWithExceptionNode;
80 import org.graalvm.compiler.nodes.LogicConstantNode;
81 import org.graalvm.compiler.nodes.LogicNode;
82 import org.graalvm.compiler.nodes.LoopEndNode;
561 LIRKind kind = gen.getLIRKind(isNullNode.getValue().stamp());
562 Value nullValue = gen.emitConstant(kind, JavaConstant.NULL_POINTER);
563 return gen.emitConditionalMove(kind.getPlatformKind(), operand(isNullNode.getValue()), nullValue, Condition.EQ, false, trueValue, falseValue);
564 } else if (node instanceof CompareNode) {
565 CompareNode compare = (CompareNode) node;
566 PlatformKind kind = gen.getLIRKind(compare.getX().stamp()).getPlatformKind();
567 return gen.emitConditionalMove(kind, operand(compare.getX()), operand(compare.getY()), compare.condition(), compare.unorderedIsTrue(), trueValue, falseValue);
568 } else if (node instanceof LogicConstantNode) {
569 return gen.emitMove(((LogicConstantNode) node).getValue() ? trueValue : falseValue);
570 } else if (node instanceof IntegerTestNode) {
571 IntegerTestNode test = (IntegerTestNode) node;
572 return gen.emitIntegerTestMove(operand(test.getX()), operand(test.getY()), trueValue, falseValue);
573 } else {
574 throw GraalError.unimplemented(node.toString());
575 }
576 }
577
578 @Override
579 public void emitInvoke(Invoke x) {
580 LoweredCallTargetNode callTarget = (LoweredCallTargetNode) x.callTarget();
581 FrameMapBuilder frameMapBuilder = gen.getResult().getFrameMapBuilder();
582 CallingConvention invokeCc = frameMapBuilder.getRegisterConfig().getCallingConvention(callTarget.callType(), x.asNode().stamp().javaType(gen.getMetaAccess()), callTarget.signature(), gen);
583 frameMapBuilder.callsMethod(invokeCc);
584
585 Value[] parameters = visitInvokeArguments(invokeCc, callTarget.arguments());
586
587 LabelRef exceptionEdge = null;
588 if (x instanceof InvokeWithExceptionNode) {
589 exceptionEdge = getLIRBlock(((InvokeWithExceptionNode) x).exceptionEdge());
590 }
591 LIRFrameState callState = stateWithExceptionEdge(x, exceptionEdge);
592
593 Value result = invokeCc.getReturn();
594 if (callTarget instanceof DirectCallTargetNode) {
595 emitDirectCall((DirectCallTargetNode) callTarget, result, parameters, AllocatableValue.NONE, callState);
596 } else if (callTarget instanceof IndirectCallTargetNode) {
597 emitIndirectCall((IndirectCallTargetNode) callTarget, result, parameters, AllocatableValue.NONE, callState);
598 } else {
599 throw GraalError.shouldNotReachHere();
600 }
601
602 if (isLegal(result)) {
603 setResult(x.asNode(), gen.emitMove(result));
|