//===-- SparcV9InstrInfo.h - Define TargetInstrInfo for SparcV9 -*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This class contains information about individual instructions. // Also see the SparcV9MachineInstrDesc array, which can be found in // SparcV9TargetMachine.cpp. // Other information is computed on demand, and most such functions // default to member functions in base class TargetInstrInfo. // //===----------------------------------------------------------------------===// #ifndef SPARCV9INSTRINFO_H #define SPARCV9INSTRINFO_H #include "llvm/Target/TargetInstrInfo.h" #include "llvm/CodeGen/MachineInstr.h" #include "SparcV9Internals.h" #include "SparcV9RegisterInfo.h" namespace llvm { /// SparcV9InstrInfo - TargetInstrInfo specialized for the SparcV9 target. /// struct SparcV9InstrInfo : public TargetInstrInfo { const SparcV9RegisterInfo RI; public: SparcV9InstrInfo() : TargetInstrInfo(SparcV9MachineInstrDesc, V9::NUM_TOTAL_OPCODES) { } /// getRegisterInfo - TargetInstrInfo is a superset of MRegister info. As /// such, whenever a client has an instance of instruction info, it should /// always be able to get register info as well (through this method). /// virtual const MRegisterInfo &getRegisterInfo() const { return RI; } // All immediate constants are in position 1 except the // store instructions and SETxx. // virtual int getImmedConstantPos(MachineOpCode opCode) const { bool ignore; if (this->maxImmedConstant(opCode, ignore) != 0) { // 1st store opcode assert(! this->isStore((MachineOpCode) V9::STBr - 1)); // last store opcode assert(! this->isStore((MachineOpCode) V9::STXFSRi + 1)); if (opCode == V9::SETHI) return 0; if (opCode >= V9::STBr && opCode <= V9::STXFSRi) return 2; return 1; } else return -1; } virtual bool hasResultInterlock(MachineOpCode opCode) const { // All UltraSPARC instructions have interlocks (note that delay slots // are not considered here). // However, instructions that use the result of an FCMP produce a // 9-cycle stall if they are issued less than 3 cycles after the FCMP. // Force the compiler to insert a software interlock (i.e., gap of // 2 other groups, including NOPs if necessary). return (opCode == V9::FCMPS || opCode == V9::FCMPD || opCode == V9::FCMPQ); } }; } // End llvm namespace #endif