public abstract class Operand extends Object
Operand identifies an operand for an
Instruction. A single Operand object should
not be shared between instructions (or even be used twice in
the same instruction). Operands should not be shared between
instructions because we use the
reference to the operand's containing instruction
to construct use/def chains. We also store program-point specific
information about an symbolic register
in the RegisterOperands that
refer to the
Register.
Operands are divided into several primary categories
RegisterOperand represent symbolic and
and physical registers.
ConstantOperand
represent various kinds of constant operands.
MethodOperand represents the targets of CALL instructions.
BranchOperand, BasicBlockOperand,
and BranchOperand are used to encode CFG
information in LABEL, BBEND, and branch instructions.
ConditionOperand and TrapCodeOperand
encode the conditions tested by conditional branches and
trap instructions.
LocationOperand represents the memory location
accessed by a load or store operation.
TypeOperand encodes a RVMType for use
in instructions such as NEW or INSTANCEOF that operate on the
type hierarchy.
Instruction,
BasicBlockOperand,
BranchOperand,
ConditionOperand,
ConstantOperand,
DoubleConstantOperand,
FloatConstantOperand,
IntConstantOperand,
LocationOperand,
LongConstantOperand,
MethodOperand,
NullConstantOperand,
RegisterOperand,
StringConstantOperand,
TrapCodeOperand,
TrueGuardOperand,
TypeOperand| Modifier and Type | Field and Description |
|---|---|
Instruction |
instruction
Handle back to containing instruction.
|
| Constructor and Description |
|---|
Operand() |
| Modifier and Type | Method and Description |
|---|---|
AddressConstantOperand |
asAddressConstant()
Cast to an
AddressConstantOperand. |
BasicBlockOperand |
asBlock()
Cast to an
BasicBlockOperand. |
BranchOperand |
asBranch()
Cast to an
BranchOperand. |
ClassConstantOperand |
asClassConstant()
Cast to an
ClassConstantOperand. |
ConditionOperand |
asCondition()
Cast to an
ConditionOperand. |
DoubleConstantOperand |
asDoubleConstant()
Cast to an
DoubleConstantOperand. |
FloatConstantOperand |
asFloatConstant()
Cast to an
FloatConstantOperand. |
IntConstantOperand |
asIntConstant()
Cast to an
IntConstantOperand. |
LocationOperand |
asLocation()
Cast to an
LocationOperand. |
LongConstantOperand |
asLongConstant()
Cast to an
LongConstantOperand. |
MemoryOperand |
asMemory()
Cast to an
MemoryOperand. |
MethodOperand |
asMethod()
Cast to an
MethodOperand. |
NullConstantOperand |
asNullConstant()
Cast to an
NullConstantOperand. |
ObjectConstantOperand |
asObjectConstant()
Cast to an
ObjectConstantOperand. |
RegisterOperand |
asRegister()
Cast to an
RegisterOperand. |
StackLocationOperand |
asStackLocation()
Cast to an
StackLocationOperand. |
StringConstantOperand |
asStringConstant()
Cast to an
StringConstantOperand. |
TIBConstantOperand |
asTIBConstant()
Cast to an
TIBConstantOperand. |
TypeOperand |
asType()
Cast to an
TypeOperand. |
private static boolean |
compatiblePrimitives(TypeReference type1,
TypeReference type2) |
static boolean |
conservativelyApproximates(Operand op1,
Operand op2)
Compare two operands based on their positions in the operand lattice.
|
abstract Operand |
copy()
Return a new operand that is semantically equivalent to
this. |
int |
getIndexInInstruction()
Return the index of the operand in its containing instruction (SLOW).
|
TypeReference |
getType()
Return the
TypeReference of the value represented by the operand. |
boolean |
isAddress()
Does the operand represent a value of the address data type?
|
boolean |
isAddressConstant()
Is the operand an
AddressConstantOperand? |
boolean |
isBlock()
Is the operand an
BasicBlockOperand? |
boolean |
isBranch()
Is the operand an
BranchOperand? |
boolean |
isClassConstant()
Is the operand an
ClassConstantOperand? |
boolean |
isConstant()
Is the operand an
ConstantOperand? |
boolean |
isDefinitelyNull()
Does the operand definitely represent
null? |
boolean |
isDouble()
Does the operand represent a value of the double data type?
|
boolean |
isDoubleConstant()
Is the operand an
DoubleConstantOperand? |
boolean |
isFloat()
Does the operand represent a value of the float data type?
|
boolean |
isFloatConstant()
Is the operand an
FloatConstantOperand? |
boolean |
isInt()
Does the operand represent a value of the int data type?
|
boolean |
isIntConstant()
Is the operand an
IntConstantOperand? |
boolean |
isIntLike()
Does the operand represent a value of an int-like data type?
|
boolean |
isLocation()
Is the operand an
LocationOperand? |
boolean |
isLong()
Does the operand represent a value of the long data type?
|
boolean |
isLongConstant()
Is the operand an
LongConstantOperand? |
boolean |
isMemory()
Is the operand an
MemoryOperand? |
boolean |
isMethod()
Is the operand an
MethodOperand? |
boolean |
isMovableObjectConstant()
Is the operand a movable
ObjectConstantOperand? |
boolean |
isNullConstant()
Is the operand an
NullConstantOperand? |
boolean |
isObjectConstant()
Is the operand an
ObjectConstantOperand? |
boolean |
isRef()
Does the operand represent a value of the reference data type?
|
boolean |
isRegister()
Is the operand an
RegisterOperand? |
boolean |
isStackLocation()
Is the operand an
StackLocationOperand? |
boolean |
isStringConstant()
Is the operand an
StringConstantOperand? |
boolean |
isTIBConstant()
Is the operand an
TIBConstantOperand? |
boolean |
isTrueGuard()
Is the operand an
TrueGuardOperand? |
boolean |
isType()
Is the operand an
TypeOperand? |
static Operand |
meet(Operand op1,
Operand op2,
Register reg)
Meet two operands based on their positions in the operand lattice.
|
abstract boolean |
similar(Operand op)
Are two operands semantically equivalent?
|
public Instruction instruction
public Operand()
public final boolean isRegister()
RegisterOperand?true if this is an
instanceof an RegisterOperand
or false if it is not.public final boolean isConstant()
ConstantOperand?true if this is an
instanceof an ConstantOperand
or false if it is not.public final boolean isIntConstant()
IntConstantOperand?true if this is an
instanceof an IntConstantOperand
or false if it is not.public final boolean isAddressConstant()
AddressConstantOperand?true if this is an
instanceof an AddressConstantOperand
or false if it is not.public final boolean isFloatConstant()
FloatConstantOperand?true if this is an
instanceof an FloatConstantOperand
or false if it is not.public final boolean isLongConstant()
LongConstantOperand?true if this is an
instanceof an LongConstantOperand
or false if it is not.public final boolean isDoubleConstant()
DoubleConstantOperand?true if this is an
instanceof an DoubleConstantOperand
or false if it is not.public final boolean isStringConstant()
StringConstantOperand?true if this is an
instanceof an StringConstantOperand
or false if it is not.public final boolean isClassConstant()
ClassConstantOperand?true if this is an
instanceof an ClassConstantOperand
or false if it is not.public final boolean isObjectConstant()
ObjectConstantOperand?true if this is an
instanceof an ObjectConstantOperand
or false if it is not.public boolean isMovableObjectConstant()
ObjectConstantOperand?public final boolean isTIBConstant()
TIBConstantOperand?true if this is an
instanceof an TIBConstantOperand
or false if it is not.public final boolean isNullConstant()
NullConstantOperand?true if this is an
instanceof an NullConstantOperand
or false if it is not.public final boolean isTrueGuard()
TrueGuardOperand?true if this is an
instanceof an TrueGuardOperand
or false if it is not.public final boolean isBranch()
BranchOperand?true if this is an
instanceof an BranchOperand
or false if it is not.public final boolean isBlock()
BasicBlockOperand?true if this is an
instanceof an BasicBlockOperand
or false if it is not.public final boolean isMemory()
MemoryOperand?true if this is an
instanceof an MemoryOperand
or false if it is not.public final boolean isStackLocation()
StackLocationOperand?true if this is an
instanceof an StackLocationOperand
or false if it is not.public final boolean isMethod()
MethodOperand?true if this is an
instanceof an MethodOperand
or false if it is not.public final boolean isLocation()
LocationOperand?true if this is an
instanceof an LocationOperand
or false if it is not.public final boolean isType()
TypeOperand?true if this is an
instanceof an TypeOperand
or false if it is not.public final RegisterOperand asRegister()
RegisterOperand.this cast as an RegisterOperandpublic final IntConstantOperand asIntConstant()
IntConstantOperand.this cast as an IntConstantOperandpublic final AddressConstantOperand asAddressConstant()
AddressConstantOperand.this cast as an AddressConstantOperandpublic final FloatConstantOperand asFloatConstant()
FloatConstantOperand.this cast as an FloatConstantOperandpublic final LongConstantOperand asLongConstant()
LongConstantOperand.this cast as an LongConstantOperandpublic final DoubleConstantOperand asDoubleConstant()
DoubleConstantOperand.this cast as an DoubleConstantOperandpublic final StringConstantOperand asStringConstant()
StringConstantOperand.this cast as an StringConstantOperandpublic final ClassConstantOperand asClassConstant()
ClassConstantOperand.this cast as an ClassConstantOperandpublic final ObjectConstantOperand asObjectConstant()
ObjectConstantOperand.this cast as an ObjectConstantOperandpublic final TIBConstantOperand asTIBConstant()
TIBConstantOperand.this cast as an TIBConstantOperandpublic final NullConstantOperand asNullConstant()
NullConstantOperand.this cast as an NullConstantOperandpublic final BranchOperand asBranch()
BranchOperand.this cast as an BranchOperandpublic final BasicBlockOperand asBlock()
BasicBlockOperand.this cast as an BasicBlockOperandpublic final MemoryOperand asMemory()
MemoryOperand.this cast as an MemoryOperandpublic final StackLocationOperand asStackLocation()
StackLocationOperand.this cast as an StackLocationOperandpublic final MethodOperand asMethod()
MethodOperand.this cast as an MethodOperandpublic final TypeOperand asType()
TypeOperand.this cast as an TypeOperandpublic final ConditionOperand asCondition()
ConditionOperand.this cast as an ConditionOperandpublic final LocationOperand asLocation()
LocationOperand.this cast as an LocationOperandpublic boolean isIntLike()
true if the data type of this
is int-like as defined by TypeReference.isIntLikeType()
or false if it is not.public boolean isInt()
true if the data type of this
is an int as defined by TypeReference.isIntType()
or false if it is not.public boolean isLong()
true if the data type of this
is a long as defined by TypeReference.isLongType()
or false if it is not.public boolean isFloat()
true if the data type of this
is a float as defined by TypeReference.isFloatType()
or false if it is not.public boolean isDouble()
true if the data type of this
is a double as defined by TypeReference.isDoubleType()
or false if it is not.public boolean isRef()
true if the data type of this
is a reference as defined by TypeReference.isReferenceType()
or false if it is not.public boolean isAddress()
true if the data type of this
is an address as defined by TypeReference.isAddressType()
or false if it is not.public boolean isDefinitelyNull()
null?true if the operand definitely represents
null or false if it does not.public abstract Operand copy()
this.thispublic abstract boolean similar(Operand op)
op - other operandtrue if this and op
are semantically equivalent or false
if they are not.public TypeReference getType()
TypeReference of the value represented by the operand.public int getIndexInInstruction()
public static boolean conservativelyApproximates(Operand op1, Operand op2)
op1 - the first operand to compareop2 - the second operand to comparetrue if op1 conservatively approximates op2 or
false if it does not.public static Operand meet(Operand op1, Operand op2, Register reg)
null to stand for bottom (the meet of
the two operands is an illegal value). For exmaple,
meet(5.0, "hi") would evalaute to bottom.
Meet returns op1 iff conservativelyApproximates(op1, op2):
this is exploited in BC2IR to avoid doing redundant
work.
Unfortunately there is a fair amount of code duplication
between conservativelyApproximates(org.jikesrvm.compilers.opt.ir.operand.Operand, org.jikesrvm.compilers.opt.ir.operand.Operand) and
meet(org.jikesrvm.compilers.opt.ir.operand.Operand, org.jikesrvm.compilers.opt.ir.operand.Operand, org.jikesrvm.compilers.opt.ir.Register), but factoring out the common control logic
is a non-trivial task.
op1 - the first operand to meetop2 - the second operand to meetreg - the Register to use to
create a new RegisterOperand
if meeting op1 and op2 requires doing so.null when
the meet evaluates to bottom. It will return
op1 when conservativelyApproximates(op1, op2)
evaluates to true.private static boolean compatiblePrimitives(TypeReference type1, TypeReference type2)