scale.backend.sparc
Class BranchRegInstruction

java.lang.Object
  extended by scale.backend.Instruction
      extended by scale.backend.Branch
          extended by scale.backend.sparc.SparcBranch
              extended by scale.backend.sparc.BranchRegInstruction
All Implemented Interfaces:
java.lang.Cloneable

public class BranchRegInstruction
extends SparcBranch

This class represents Sparc Branch on register instructions.

$Id: BranchRegInstruction.java,v 1.23 2007-10-04 19:57:56 burrill Exp $

Copyright 2007 by the Scale Compiler Group,
Department of Computer Science
University of Massachusetts,
Amherst MA. 01003, USA
All Rights Reserved.

Instance=04, Op=00, op2=011

It is important that the branch target always be target 0 and the fall through target be target 1.

See Also:
Branch.addTarget(scale.backend.Label, int)

Field Summary
 
Fields inherited from class scale.backend.sparc.SparcBranch
annulled, delaySlot, opcode, pt
 
Constructor Summary
BranchRegInstruction(int opcode, int rs1, Displacement displacement, boolean annulled, int numTargets, SparcInstruction delaySlot)
           
 
Method Summary
 void assembler(Assembler asm, Emit emit)
          Insert the assembler representation of the instruction into the output stream.
 boolean canBeAnnulled()
          Return true if the branch can be annulled.
 int getDestRegister()
          Return the destination register or -1 if none.
 int[] getSrcRegisters()
          Return the source registers or null if none.
 int getTestRegister()
           
 boolean independent(Instruction inst, RegisterSet registers)
          Return true if this instruction is independent of the specified instruction.
 boolean isUnconditional()
          Return true if the branch is an unconditional transfer of control to a new address.
 void remapRegisters(int[] map)
          Map the virtual registers referenced in the instruction to the specified real registers.
 void remapSrcRegister(int oldReg, int newReg)
          Map the registers used in the instruction as sources to the specified register.
 void setDisplacement(Displacement displacement)
          After all of the instructions have been created, the Sparc Branch displacements must be calculated.
 void specifyRegisterUsage(RegisterAllocator rs, int index, int strength)
          Specify the registers used by this instruction.
 java.lang.String toString()
           
 boolean uses(int register, RegisterSet registers)
          Return true if the instruction uses the register.
 
Methods inherited from class scale.backend.sparc.SparcBranch
assembleDelay, assembleDisp, canBeDeleted, defs, delayToStringBuf, getAnnulled, getDelaySlot, getOpcode, getPt, instructionSize, mods, remapDestRegister, setAnnulled, setDelaySlot, setOpcode, setReturnedStructSize
 
Methods inherited from class scale.backend.Branch
additionalRegsKilled, additionalRegsSet, additionalRegsUsed, addTarget, copy, getBranchProbability, getExecutionCycles, getRegsKilled, getTarget, isBranch, isCall, markAsCall, nullify, numTargets, setBranchProbability, uses
 
Methods inherited from class scale.backend.Instruction
clone, ehash, getBBID, getCopyDest, getCopySrc, getFunctionalUnit, getLoopNumber, getNext, getPredicate, getPredicates, getTag, isCopy, isLabel, isLoad, isMandatory, isMarker, isPhi, isPredicated, isPredicatedOnTrue, isPrefetch, isSpillInstruction, isSpillLoadPoint, isSpillStorePoint, isStore, markSpillInstruction, nullified, numPredicates, removePredicates, setBBID, setLoopNumber, setMandatory, setNext, setPredicate, setPredicate, setPredicatedOnTrue, setPredicates, setsSpecialReg, setTag, specifyNotSpillLoadPoint, specifySpillStorePoint
 
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Constructor Detail

BranchRegInstruction

public BranchRegInstruction(int opcode,
                            int rs1,
                            Displacement displacement,
                            boolean annulled,
                            int numTargets,
                            SparcInstruction delaySlot)
Method Detail

getDestRegister

public int getDestRegister()
Return the destination register or -1 if none.

Overrides:
getDestRegister in class Instruction

getSrcRegisters

public int[] getSrcRegisters()
Return the source registers or null if none.

Overrides:
getSrcRegisters in class Instruction

remapRegisters

public void remapRegisters(int[] map)
Description copied from class: Branch
Map the virtual registers referenced in the instruction to the specified real registers. The mapping is specified using an array that is indexed by the virtual register to return the real register.

Overrides:
remapRegisters in class SparcBranch
Parameters:
map - maps from the virtual register to real register

remapSrcRegister

public void remapSrcRegister(int oldReg,
                             int newReg)
Map the registers used in the instruction as sources to the specified register. If the register is not used as a source register, no change is made.

Overrides:
remapSrcRegister in class SparcBranch
Parameters:
oldReg - is the previous source register
newReg - is the new source register

getTestRegister

public int getTestRegister()

specifyRegisterUsage

public void specifyRegisterUsage(RegisterAllocator rs,
                                 int index,
                                 int strength)
Specify the registers used by this instruction.

Overrides:
specifyRegisterUsage in class SparcBranch
Parameters:
rs - is the register set in use
index - is an index associated with the instruction
strength - is the importance of the instruction
See Also:
RegisterAllocator.useRegister(int,int,int), RegisterAllocator.defRegister(int,int)

uses

public boolean uses(int register,
                    RegisterSet registers)
Return true if the instruction uses the register.

Overrides:
uses in class SparcBranch

setDisplacement

public void setDisplacement(Displacement displacement)
After all of the instructions have been created, the Sparc Branch displacements must be calculated. This must be done prior to generating the assembly file.


independent

public boolean independent(Instruction inst,
                           RegisterSet registers)
Return true if this instruction is independent of the specified instruction. If instructions are independent, than one instruction can be moved before or after the other instruction without changing the semantics of the program.

Overrides:
independent in class Branch
Parameters:
inst - is the specified instruction

assembler

public void assembler(Assembler asm,
                      Emit emit)
Insert the assembler representation of the instruction into the output stream.

Specified by:
assembler in class Instruction

toString

public java.lang.String toString()
Overrides:
toString in class Branch

canBeAnnulled

public boolean canBeAnnulled()
Return true if the branch can be annulled.

Overrides:
canBeAnnulled in class SparcBranch

isUnconditional

public boolean isUnconditional()
Return true if the branch is an unconditional transfer of control to a new address.

Overrides:
isUnconditional in class SparcBranch