/*
* This file is part of the Jikes RVM project (http://jikesrvm.org).
*
* This file is licensed to You under the Eclipse Public License (EPL);
* You may not use this file except in compliance with the License. You
* may obtain a copy of the License at
*
* http://www.opensource.org/licenses/eclipse-1.0.php
*
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership.
*/
package org.jikesrvm.compilers.opt.lir2mir;
import org.jikesrvm.ArchitectureSpecificOpt.BURS_TreeNode;
import org.jikesrvm.ArchitectureSpecificOpt.PhysicalRegisterTools;
import org.jikesrvm.ArchitectureSpecificOpt.RegisterPool;
import org.jikesrvm.compilers.opt.ir.IR;
import org.jikesrvm.compilers.opt.ir.Instruction;
import org.jikesrvm.compilers.opt.ir.operand.AddressConstantOperand;
import org.jikesrvm.compilers.opt.ir.operand.ConditionOperand;
import org.jikesrvm.compilers.opt.ir.operand.IntConstantOperand;
import org.jikesrvm.compilers.opt.ir.operand.LongConstantOperand;
import org.jikesrvm.compilers.opt.ir.operand.Operand;
import org.jikesrvm.compilers.opt.ir.operand.RegisterOperand;
import org.jikesrvm.compilers.opt.util.Bits;
import org.vmmagic.unboxed.Address;
/**
* Contains BURS helper functions common to all platforms.
*/
public abstract class BURS_Common_Helpers extends PhysicalRegisterTools {
/** Infinte cost for a rule */
protected static final int INFINITE = 0x7fff;
/**
* The burs object
*/
protected final BURS burs;
/**
* The register pool of the IR being processed
*/
protected final RegisterPool regpool;
protected BURS_Common_Helpers(BURS b) {
burs = b;
regpool = b.ir.regpool;
}
@Override
public final IR getIR() { return burs.ir; }
protected final void EMIT(Instruction s) {
burs.append(s);
}
// returns the given operand as a register
protected static RegisterOperand R(Operand op) {
return op.asRegister();
}
// returns the given operand as an address constant
protected static AddressConstantOperand AC(Operand op) {
return op.asAddressConstant();
}
// returns the given operand as an integer constant
protected static IntConstantOperand IC(Operand op) {
return op.asIntConstant();
}
// returns the given operand as a long constant
protected static LongConstantOperand LC(Operand op) {
return op.asLongConstant();
}
// returns the integer value of the given operand
protected static int IV(Operand op) {
return IC(op).value;
}
// returns the Address value of the given operand
protected static Address AV(Operand op) {
return AC(op).value;
}
// is a == 0?
protected static boolean ZERO(Operand a) {
return (IV(a) == 0);
}
// is a == 1?
protected static boolean ONE(Operand a) {
return (IV(a) == 1);
}
// is a == -1?
protected static boolean MINUSONE(Operand a) {
return (IV(a) == -1);
}
protected static int FITS(Operand op, int numBits, int trueCost) {
return FITS(op, numBits, trueCost, INFINITE);
}
protected static int FITS(Operand op, int numBits, int trueCost, int falseCost) {
if (op.isIntConstant() && Bits.fits(IV(op), numBits)) {
return trueCost;
} else if (op.isAddressConstant() && Bits.fits(AV(op), numBits)) {
return trueCost;
} else {
return falseCost;
}
}
protected static int isZERO(int x, int trueCost) {
return isZERO(x, trueCost, INFINITE);
}
protected static int isZERO(int x, int trueCost, int falseCost) {
return x == 0 ? trueCost : falseCost;
}
protected static int isONE(int x, int trueCost) {
return isONE(x, trueCost, INFINITE);
}
protected static int isONE(int x, int trueCost, int falseCost) {
return x == 1 ? trueCost : falseCost;
}
// helper functions for condition operands
protected static boolean EQ_NE(ConditionOperand c) {
int cond = c.value;
return ((cond == ConditionOperand.EQUAL) || (cond == ConditionOperand.NOT_EQUAL));
}
protected static boolean EQ_LT_LE(ConditionOperand c) {
int cond = c.value;
return ((cond == ConditionOperand.EQUAL) ||
(cond == ConditionOperand.LESS) ||
(cond == ConditionOperand.LESS_EQUAL));
}
protected static boolean EQ_GT_GE(ConditionOperand c) {
int cond = c.value;
return ((cond == ConditionOperand.EQUAL) ||
(cond == ConditionOperand.GREATER) ||
(cond == ConditionOperand.GREATER_EQUAL));
}
/* node accessors */
protected static Instruction P(BURS_TreeNode p) {
return p.getInstruction();
}
protected static Instruction PL(BURS_TreeNode p) {
return p.child1.getInstruction();
}
protected static Instruction PLL(BURS_TreeNode p) {
return p.child1.child1.getInstruction();
}
protected static Instruction PLLL(BURS_TreeNode p) {
return p.child1.child1.child1.getInstruction();
}
protected static Instruction PLLLL(BURS_TreeNode p) {
return p.child1.child1.child1.child1.getInstruction();
}
protected static Instruction PLLLLLL(BURS_TreeNode p) {
return p.child1.child1.child1.child1.child1.child1.getInstruction();
}
protected static Instruction PLLLLLLL(BURS_TreeNode p) {
return p.child1.child1.child1.child1.child1.child1.child1.getInstruction();
}
protected static Instruction PLLLRL(BURS_TreeNode p) {
return p.child1.child1.child1.child2.child1.getInstruction();
}
protected static Instruction PLLLRLL(BURS_TreeNode p) {
return p.child1.child1.child1.child2.child1.child1.getInstruction();
}
protected static Instruction PLLLRLLL(BURS_TreeNode p) {
return p.child1.child1.child1.child2.child1.child1.child1.getInstruction();
}
protected static Instruction PLLRLLL(BURS_TreeNode p) {
return p.child1.child1.child2.child1.child1.child1.getInstruction();
}
protected static Instruction PLLR(BURS_TreeNode p) {
return p.child1.child1.child2.getInstruction();
}
protected static Instruction PLLRL(BURS_TreeNode p) {
return p.child1.child1.child2.child1.getInstruction();
}
protected static Instruction PLLRLL(BURS_TreeNode p) {
return p.child1.child1.child2.child1.child1.getInstruction();
}
protected static Instruction PLLRLLR(BURS_TreeNode p) {
return p.child1.child1.child2.child1.child1.child2.getInstruction();
}
protected static Instruction PLR(BURS_TreeNode p) {
return p.child1.child2.getInstruction();
}
protected static Instruction PLRL(BURS_TreeNode p) {
return p.child1.child2.child1.getInstruction();
}
protected static Instruction PLRLL(BURS_TreeNode p) {
return p.child1.child2.child1.child1.getInstruction();
}
protected static Instruction PLRLLRL(BURS_TreeNode p) {
return p.child1.child2.child1.child1.child2.child1.getInstruction();
}
protected static Instruction PLRR(BURS_TreeNode p) {
return p.child1.child2.child2.getInstruction();
}
protected static Instruction PR(BURS_TreeNode p) {
return p.child2.getInstruction();
}
protected static Instruction PRL(BURS_TreeNode p) {
return p.child2.child1.getInstruction();
}
protected static Instruction PRLL(BURS_TreeNode p) {
return p.child2.child1.child1.getInstruction();
}
protected static Instruction PRLLL(BURS_TreeNode p) {
return p.child2.child1.child1.child1.getInstruction();
}
protected static Instruction PRLLLL(BURS_TreeNode p) {
return p.child2.child1.child1.child1.child1.getInstruction();
}
protected static Instruction PRLLR(BURS_TreeNode p) {
return p.child2.child1.child1.child2.getInstruction();
}
protected static Instruction PRLLRLLL(BURS_TreeNode p) {
return p.child2.child1.child1.child2.child1.child1.child1.getInstruction();
}
protected static Instruction PRLR(BURS_TreeNode p) {
return p.child2.child1.child2.getInstruction();
}
protected static Instruction PRLRL(BURS_TreeNode p) {
return p.child2.child1.child2.child1.getInstruction();
}
protected static Instruction PRR(BURS_TreeNode p) {
return p.child2.child2.getInstruction();
}
protected static Instruction PRRL(BURS_TreeNode p) {
return p.child2.child2.child1.getInstruction();
}
protected static Instruction PRRR(BURS_TreeNode p) {
return p.child2.child2.child2.getInstruction();
}
protected static int V(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p).value;
}
protected static int VL(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child1).value;
}
protected static int VLL(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child1.child1).value;
}
protected static int VLLL(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child1.child1.child1).value;
}
protected static int VLLLL(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child1.child1.child1.child1).value;
}
protected static int VLLLLLR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child1.child1.child1.child1.child1.child2).value;
}
protected static int VLLLLLLR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child1.child1.child1.child1.child1.child1.child2).value;
}
protected static int VLLLLLLLR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child1.child1.child1.child1.child1.child1.child1.child2).value;
}
protected static int VLLLR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child1.child1.child1.child2).value;
}
protected static int VLLLLR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child1.child1.child1.child1.child2).value;
}
protected static int VLLLRLLLR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child1.child1.child1.child2.child1.child1.child1.child2).value;
}
protected static int VLLLRLLR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child1.child1.child1.child2.child1.child1.child2).value;
}
protected static int VLLLRLR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child1.child1.child1.child2.child1.child2).value;
}
protected static int VLLLRR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child1.child1.child1.child2.child2).value;
}
protected static int VLLR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child1.child1.child2).value;
}
protected static int VLLRLLRR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child1.child1.child2.child1.child1.child2.child2).value;
}
protected static int VLLRLR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child1.child1.child2.child1.child2).value;
}
protected static int VLLRLLLR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child1.child1.child2.child1.child1.child1.child2).value;
}
protected static int VLLRLLR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child1.child1.child2.child1.child1.child2).value;
}
protected static int VLLRR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child1.child1.child2.child2).value;
}
protected static int VLR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child1.child2).value;
}
protected static int VLRLR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child1.child2.child1.child2).value;
}
protected static int VLRL(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child1.child2.child1).value;
}
protected static int VLRR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child1.child2.child2).value;
}
protected static int VLRLL(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child1.child2.child1.child1).value;
}
protected static int VLRLLRR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child1.child2.child1.child1.child2.child2).value;
}
protected static int VLRRR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child1.child2.child2.child2).value;
}
protected static int VR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child2).value;
}
protected static int VRL(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child2.child1).value;
}
protected static int VRLLR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child2.child1.child1.child2).value;
}
protected static int VRLLLR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child2.child1.child1.child1.child2).value;
}
protected static int VRLLLLR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child2.child1.child1.child1.child1.child2).value;
}
protected static int VRLLRLLLR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child2.child1.child1.child2.child1.child1.child1.child2).value;
}
protected static int VRLLRLLR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child2.child1.child1.child2.child1.child1.child2).value;
}
protected static int VRLLRR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child2.child1.child1.child2.child2).value;
}
protected static int VRLRLR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child2.child1.child2.child1.child2).value;
}
protected static int VRLRR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child2.child1.child2.child2).value;
}
protected static int VRLL(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child2.child1.child1).value;
}
protected static int VRLR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child2.child1.child2).value;
}
protected static int VRR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child2.child2).value;
}
protected static int VRRL(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child2.child2.child1).value;
}
protected static int VRRLR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child2.child2.child1.child2).value;
}
protected static int VRRR(BURS_TreeNode p) {
return ((BURS_IntConstantTreeNode) p.child2.child2.child2).value;
}
}