< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64NodeMatchRules.java

Print this page
rev 52509 : [mq]: graal


   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 
  25 
  26 package org.graalvm.compiler.core.aarch64;
  27 

  28 import org.graalvm.compiler.core.gen.NodeMatchRules;


  29 import org.graalvm.compiler.lir.LIRFrameState;

  30 import org.graalvm.compiler.lir.gen.LIRGeneratorTool;

  31 import org.graalvm.compiler.nodes.DeoptimizingNode;
  32 import org.graalvm.compiler.nodes.NodeView;






  33 import org.graalvm.compiler.nodes.memory.Access;
  34 
  35 import jdk.vm.ci.aarch64.AArch64Kind;
  36 
  37 public class AArch64NodeMatchRules extends NodeMatchRules {
  38 
  39     public AArch64NodeMatchRules(LIRGeneratorTool gen) {
  40         super(gen);
  41     }
  42 
  43     protected LIRFrameState getState(Access access) {
  44         if (access instanceof DeoptimizingNode) {
  45             return state((DeoptimizingNode) access);
  46         }
  47         return null;
  48     }
  49 
  50     protected AArch64Kind getMemoryKind(Access access) {
  51         return (AArch64Kind) gen.getLIRKind(access.asNode().stamp(NodeView.DEFAULT)).getPlatformKind();






























  52     }
  53 
  54     @Override
  55     public AArch64LIRGenerator getLIRGeneratorTool() {
  56         return (AArch64LIRGenerator) gen;
  57     }
  58 
  59     protected AArch64ArithmeticLIRGenerator getArithmeticLIRGenerator() {
  60         return (AArch64ArithmeticLIRGenerator) getLIRGeneratorTool().getArithmetic();
  61     }
  62 }


   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 
  25 
  26 package org.graalvm.compiler.core.aarch64;
  27 
  28 import org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler;
  29 import org.graalvm.compiler.core.gen.NodeMatchRules;
  30 import org.graalvm.compiler.core.match.ComplexMatchResult;
  31 import org.graalvm.compiler.core.match.MatchRule;
  32 import org.graalvm.compiler.lir.LIRFrameState;
  33 import org.graalvm.compiler.lir.aarch64.AArch64ArithmeticOp;
  34 import org.graalvm.compiler.lir.gen.LIRGeneratorTool;
  35 import org.graalvm.compiler.nodes.ConstantNode;
  36 import org.graalvm.compiler.nodes.DeoptimizingNode;
  37 import org.graalvm.compiler.nodes.NodeView;
  38 import org.graalvm.compiler.nodes.ValueNode;
  39 import org.graalvm.compiler.nodes.calc.AddNode;
  40 import org.graalvm.compiler.nodes.calc.BinaryNode;
  41 import org.graalvm.compiler.nodes.calc.LeftShiftNode;
  42 import org.graalvm.compiler.nodes.calc.RightShiftNode;
  43 import org.graalvm.compiler.nodes.calc.UnsignedRightShiftNode;
  44 import org.graalvm.compiler.nodes.memory.Access;
  45 
  46 import jdk.vm.ci.aarch64.AArch64Kind;
  47 
  48 public class AArch64NodeMatchRules extends NodeMatchRules {
  49 
  50     public AArch64NodeMatchRules(LIRGeneratorTool gen) {
  51         super(gen);
  52     }
  53 
  54     protected LIRFrameState getState(Access access) {
  55         if (access instanceof DeoptimizingNode) {
  56             return state((DeoptimizingNode) access);
  57         }
  58         return null;
  59     }
  60 
  61     protected AArch64Kind getMemoryKind(Access access) {
  62         return (AArch64Kind) gen.getLIRKind(access.asNode().stamp(NodeView.DEFAULT)).getPlatformKind();
  63     }
  64 
  65     private ComplexMatchResult emitAddSubShift(AArch64ArithmeticOp op, ValueNode value, BinaryNode shift) {
  66         assert shift.getY() instanceof ConstantNode;
  67         int shiftAmount = shift.getY().asJavaConstant().asInt();
  68 
  69         if (shift instanceof LeftShiftNode) {
  70             return builder -> getArithmeticLIRGenerator().emitAddSubShift(op, operand(value), operand(shift.getX()),
  71                             AArch64MacroAssembler.ShiftType.LSL, shiftAmount);
  72         } else if (shift instanceof RightShiftNode) {
  73             return builder -> getArithmeticLIRGenerator().emitAddSubShift(op, operand(value), operand(shift.getX()),
  74                             AArch64MacroAssembler.ShiftType.ASR, shiftAmount);
  75         } else {
  76             assert shift instanceof UnsignedRightShiftNode;
  77             return builder -> getArithmeticLIRGenerator().emitAddSubShift(op, operand(value), operand(shift.getX()),
  78                             AArch64MacroAssembler.ShiftType.LSR, shiftAmount);
  79         }
  80     }
  81 
  82     @MatchRule("(Add=binary a (LeftShift=shift b Constant))")
  83     @MatchRule("(Add=binary a (RightShift=shift b Constant))")
  84     @MatchRule("(Add=binary a (UnsignedRightShift=shift b Constant))")
  85     @MatchRule("(Sub=binary a (LeftShift=shift b Constant))")
  86     @MatchRule("(Sub=binary a (RightShift=shift b Constant))")
  87     @MatchRule("(Sub=binary a (UnsignedRightShift=shift b Constant))")
  88     public ComplexMatchResult addSubShift(BinaryNode binary, ValueNode a, BinaryNode shift) {
  89         if (binary instanceof AddNode) {
  90             return emitAddSubShift(AArch64ArithmeticOp.ADD, a, shift);
  91         }
  92         return emitAddSubShift(AArch64ArithmeticOp.SUB, a, shift);
  93     }
  94 
  95     @Override
  96     public AArch64LIRGenerator getLIRGeneratorTool() {
  97         return (AArch64LIRGenerator) gen;
  98     }
  99 
 100     protected AArch64ArithmeticLIRGenerator getArithmeticLIRGenerator() {
 101         return (AArch64ArithmeticLIRGenerator) getLIRGeneratorTool().getArithmetic();
 102     }
 103 }
< prev index next >