TargetInstrInfo.h revision 5684c4e2b41f1d6ddf70b116a84f438040f66297
1a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve//===-- llvm/Target/InstrInfo.h - Target Instruction Information --*-C++-*-==// 2a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve// 3a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve// This file describes the target machine instructions to the code generator. 4a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve// 5a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve//===---------------------------------------------------------------------===// 6a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 7a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve#ifndef LLVM_TARGET_MACHINEINSTRINFO_H 8a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve#define LLVM_TARGET_MACHINEINSTRINFO_H 9a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 10a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve#include "llvm/Target/TargetMachine.h" 11a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve#include "llvm/Support/DataTypes.h" 125684c4e2b41f1d6ddf70b116a84f438040f66297Vikram S. Adve#include <vector> 13a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 14a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adveclass MachineInstrDescriptor; 155684c4e2b41f1d6ddf70b116a84f438040f66297Vikram S. Adveclass TmpInstruction; 165684c4e2b41f1d6ddf70b116a84f438040f66297Vikram S. Adveclass MachineInstr; 175684c4e2b41f1d6ddf70b116a84f438040f66297Vikram S. Adveclass Value; 185684c4e2b41f1d6ddf70b116a84f438040f66297Vikram S. Adveclass Instruction; 19a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 20a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 21a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Advetypedef int InstrSchedClass; 22a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 23a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve// Global variable holding an array of descriptors for machine instructions. 24a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve// The actual object needs to be created separately for each target machine. 25a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve// This variable is initialized and reset by class MachineInstrInfo. 26a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve// 27a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve// FIXME: This should be a property of the target so that more than one target 28a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve// at a time can be active... 29a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve// 30a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adveextern const MachineInstrDescriptor *TargetInstrDescriptors; 31a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 32a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 33a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve//--------------------------------------------------------------------------- 34a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve// struct MachineInstrDescriptor: 35a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve// Predefined information about each machine instruction. 36a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve// Designed to initialized statically. 37a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve// 38a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve// class MachineInstructionInfo 39a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve// Interface to description of machine instructions 40a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve// 41a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve//--------------------------------------------------------------------------- 42a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 43a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 44a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adveconst unsigned int M_NOP_FLAG = 1; 45a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adveconst unsigned int M_BRANCH_FLAG = 1 << 1; 46a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adveconst unsigned int M_CALL_FLAG = 1 << 2; 47a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adveconst unsigned int M_RET_FLAG = 1 << 3; 48a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adveconst unsigned int M_ARITH_FLAG = 1 << 4; 49a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adveconst unsigned int M_CC_FLAG = 1 << 6; 50a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adveconst unsigned int M_LOGICAL_FLAG = 1 << 6; 51a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adveconst unsigned int M_INT_FLAG = 1 << 7; 52a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adveconst unsigned int M_FLOAT_FLAG = 1 << 8; 53a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adveconst unsigned int M_CONDL_FLAG = 1 << 9; 54a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adveconst unsigned int M_LOAD_FLAG = 1 << 10; 55a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adveconst unsigned int M_PREFETCH_FLAG = 1 << 11; 56a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adveconst unsigned int M_STORE_FLAG = 1 << 12; 57a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adveconst unsigned int M_DUMMY_PHI_FLAG = 1 << 13; 58a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 59a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 60a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Advestruct MachineInstrDescriptor { 61a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve string opCodeString; // Assembly language mnemonic for the opcode. 62a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve int numOperands; // Number of args; -1 if variable #args 63a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve int resultPos; // Position of the result; -1 if no result 64a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve unsigned int maxImmedConst; // Largest +ve constant in IMMMED field or 0. 65a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve bool immedIsSignExtended; // Is IMMED field sign-extended? If so, 66a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // smallest -ve value is -(maxImmedConst+1). 67a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve unsigned int numDelaySlots; // Number of delay slots after instruction 68a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve unsigned int latency; // Latency in machine cycles 69a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve InstrSchedClass schedClass; // enum identifying instr sched class 70a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve unsigned int iclass; // flags identifying machine instr class 71a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve}; 72a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 73a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 74a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adveclass MachineInstrInfo : public NonCopyableV { 75a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adveprotected: 76a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve const MachineInstrDescriptor* desc; // raw array to allow static init'n 77a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve unsigned int descSize; // number of entries in the desc array 78a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve unsigned int numRealOpCodes; // number of non-dummy op codes 79a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 80a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Advepublic: 81a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve MachineInstrInfo(const MachineInstrDescriptor *desc, unsigned descSize, 82a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve unsigned numRealOpCodes); 83a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve virtual ~MachineInstrInfo(); 84a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 85a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve unsigned getNumRealOpCodes() const { return numRealOpCodes; } 86a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve unsigned getNumTotalOpCodes() const { return descSize; } 87a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 88a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve const MachineInstrDescriptor& getDescriptor(MachineOpCode opCode) const { 89a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve assert(opCode >= 0 && opCode < (int)descSize); 90a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve return desc[opCode]; 91a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve } 92a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 93a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve int getNumOperands(MachineOpCode opCode) const { 94a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve return getDescriptor(opCode).numOperands; 95a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve } 96a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 97a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve int getResultPos(MachineOpCode opCode) const { 98a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve return getDescriptor(opCode).resultPos; 99a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve } 100a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 101a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve unsigned getNumDelaySlots(MachineOpCode opCode) const { 102a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve return getDescriptor(opCode).numDelaySlots; 103a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve } 104a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 105a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve InstrSchedClass getSchedClass(MachineOpCode opCode) const { 106a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve return getDescriptor(opCode).schedClass; 107a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve } 108a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 109a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // 110a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // Query instruction class flags according to the machine-independent 111a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // flags listed above. 112a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // 113a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve unsigned int getIClass(MachineOpCode opCode) const { 114a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve return getDescriptor(opCode).iclass; 115a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve } 116a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve bool isNop(MachineOpCode opCode) const { 117a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve return getDescriptor(opCode).iclass & M_NOP_FLAG; 118a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve } 119a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve bool isBranch(MachineOpCode opCode) const { 120a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve return getDescriptor(opCode).iclass & M_BRANCH_FLAG; 121a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve } 122a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve bool isCall(MachineOpCode opCode) const { 123a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve return getDescriptor(opCode).iclass & M_CALL_FLAG; 124a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve } 125a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve bool isReturn(MachineOpCode opCode) const { 126a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve return getDescriptor(opCode).iclass & M_RET_FLAG; 127a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve } 128a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve bool isControlFlow(MachineOpCode opCode) const { 129a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve return getDescriptor(opCode).iclass & M_BRANCH_FLAG 130a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve || getDescriptor(opCode).iclass & M_CALL_FLAG 131a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve || getDescriptor(opCode).iclass & M_RET_FLAG; 132a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve } 133a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve bool isArith(MachineOpCode opCode) const { 134a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve return getDescriptor(opCode).iclass & M_RET_FLAG; 135a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve } 136a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve bool isCCInstr(MachineOpCode opCode) const { 137a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve return getDescriptor(opCode).iclass & M_CC_FLAG; 138a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve } 139a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve bool isLogical(MachineOpCode opCode) const { 140a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve return getDescriptor(opCode).iclass & M_LOGICAL_FLAG; 141a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve } 142a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve bool isIntInstr(MachineOpCode opCode) const { 143a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve return getDescriptor(opCode).iclass & M_INT_FLAG; 144a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve } 145a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve bool isFloatInstr(MachineOpCode opCode) const { 146a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve return getDescriptor(opCode).iclass & M_FLOAT_FLAG; 147a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve } 148a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve bool isConditional(MachineOpCode opCode) const { 149a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve return getDescriptor(opCode).iclass & M_CONDL_FLAG; 150a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve } 151a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve bool isLoad(MachineOpCode opCode) const { 152a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve return getDescriptor(opCode).iclass & M_LOAD_FLAG; 153a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve } 154a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve bool isPrefetch(MachineOpCode opCode) const { 155a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve return getDescriptor(opCode).iclass & M_PREFETCH_FLAG; 156a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve } 157a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve bool isLoadOrPrefetch(MachineOpCode opCode) const { 158a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve return getDescriptor(opCode).iclass & M_LOAD_FLAG 159a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve || getDescriptor(opCode).iclass & M_PREFETCH_FLAG; 160a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve } 161a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve bool isStore(MachineOpCode opCode) const { 162a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve return getDescriptor(opCode).iclass & M_STORE_FLAG; 163a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve } 164a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve bool isMemoryAccess(MachineOpCode opCode) const { 165a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve return getDescriptor(opCode).iclass & M_LOAD_FLAG 166a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve || getDescriptor(opCode).iclass & M_PREFETCH_FLAG 167a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve || getDescriptor(opCode).iclass & M_STORE_FLAG; 168a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve } 169a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve bool isDummyPhiInstr(MachineOpCode opCode) const { 170a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve return getDescriptor(opCode).iclass & M_DUMMY_PHI_FLAG; 171a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve } 172a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 173a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 174a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // delete this later ******* 175a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve bool isPhi(MachineOpCode opCode) { return isDummyPhiInstr(opCode); } 176a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 177a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 178a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // Check if an instruction can be issued before its operands are ready, 179a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // or if a subsequent instruction that uses its result can be issued 180a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // before the results are ready. 181a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // Default to true since most instructions on many architectures allow this. 182a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // 183a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve virtual bool hasOperandInterlock(MachineOpCode opCode) const { 184a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve return true; 185a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve } 186a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 187a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve virtual bool hasResultInterlock(MachineOpCode opCode) const { 188a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve return true; 189a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve } 190a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 191a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // 192a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // Latencies for individual instructions and instruction pairs 193a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // 194a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve virtual int minLatency(MachineOpCode opCode) const { 195a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve return getDescriptor(opCode).latency; 196a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve } 197a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 198a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve virtual int maxLatency(MachineOpCode opCode) const { 199a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve return getDescriptor(opCode).latency; 200a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve } 201a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 202a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // Check if the specified constant fits in the immediate field 203a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // of this machine instruction 204a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // 205a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve virtual bool constantFitsInImmedField(MachineOpCode opCode, 206a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve int64_t intValue) const; 207a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 208a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // Return the largest +ve constant that can be held in the IMMMED field 209a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // of this machine instruction. 210a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // isSignExtended is set to true if the value is sign-extended before use 211a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // (this is true for all immediate fields in SPARC instructions). 212a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // Return 0 if the instruction has no IMMED field. 213a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve // 214a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve virtual uint64_t maxImmedConstant(MachineOpCode opCode, 215a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve bool &isSignExtended) const { 216a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve isSignExtended = getDescriptor(opCode).immedIsSignExtended; 217a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve return getDescriptor(opCode).maxImmedConst; 218a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve } 2195684c4e2b41f1d6ddf70b116a84f438040f66297Vikram S. Adve 2205684c4e2b41f1d6ddf70b116a84f438040f66297Vikram S. Adve //------------------------------------------------------------------------- 2215684c4e2b41f1d6ddf70b116a84f438040f66297Vikram S. Adve // Code generation support for creating individual machine instructions 2225684c4e2b41f1d6ddf70b116a84f438040f66297Vikram S. Adve //------------------------------------------------------------------------- 2235684c4e2b41f1d6ddf70b116a84f438040f66297Vikram S. Adve 2245684c4e2b41f1d6ddf70b116a84f438040f66297Vikram S. Adve // Create an instruction sequence to put the constant `val' into 2255684c4e2b41f1d6ddf70b116a84f438040f66297Vikram S. Adve // the virtual register `dest'. `val' may be a ConstPoolVal or a 2265684c4e2b41f1d6ddf70b116a84f438040f66297Vikram S. Adve // GlobalValue, viz., the constant address of a global variable or function. 2275684c4e2b41f1d6ddf70b116a84f438040f66297Vikram S. Adve // The generated instructions are returned in `minstrVec'. 2285684c4e2b41f1d6ddf70b116a84f438040f66297Vikram S. Adve // Any temp. registers (TmpInstruction) created are returned in `tempVec'. 2295684c4e2b41f1d6ddf70b116a84f438040f66297Vikram S. Adve // 2305684c4e2b41f1d6ddf70b116a84f438040f66297Vikram S. Adve virtual void CreateCodeToLoadConst(Value* val, 2315684c4e2b41f1d6ddf70b116a84f438040f66297Vikram S. Adve Instruction* dest, 2325684c4e2b41f1d6ddf70b116a84f438040f66297Vikram S. Adve vector<MachineInstr*>& minstrVec, 2335684c4e2b41f1d6ddf70b116a84f438040f66297Vikram S. Adve vector<TmpInstruction*>& temps) const =0; 234a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve}; 235a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve 236a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve#endif 237