#include "llvm/PassManager.h" #include "llvm/CodeGen/MachineCodeEmitter.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineInstr.h" #include "SparcInternals.h" namespace { class SparcV9CodeEmitter : public MachineFunctionPass { MachineCodeEmitter &MCE; public: SparcV9CodeEmitter(MachineCodeEmitter &M) : MCE(M) {} bool runOnMachineFunction(MachineFunction &F); private: int64_t getMachineOpValue(MachineOperand &MO); unsigned getValueBit(int64_t Val, unsigned bit); void emitConstant(unsigned Val, unsigned Size); void emitBasicBlock(MachineBasicBlock &MBB); void emitInstruction(MachineInstr &MI); /// Function generated by the CodeEmitterGenerator using TableGen /// unsigned getBinaryCodeForInstr(MachineInstr &MI); }; } bool UltraSparc::addPassesToEmitMachineCode(PassManager &PM, MachineCodeEmitter &MCE) { //PM.add(new SparcV9CodeEmitter(MCE)); //MachineCodeEmitter *M = MachineCodeEmitter::createDebugMachineCodeEmitter(); MachineCodeEmitter *M = MachineCodeEmitter::createFilePrinterMachineCodeEmitter(); PM.add(new SparcV9CodeEmitter(*M)); return false; } void SparcV9CodeEmitter::emitConstant(unsigned Val, unsigned Size) { // Output the constant in big endian byte order... unsigned byteVal; for (int i = Size-1; i >= 0; --i) { byteVal = Val >> 8*i; MCE.emitByte(byteVal & 255); } } int64_t SparcV9CodeEmitter::getMachineOpValue(MachineOperand &MO) { if (MO.isPhysicalRegister()) { return MO.getReg(); } else if (MO.isImmediate()) { return MO.getImmedValue(); } else if (MO.isPCRelativeDisp()) { // FIXME!!! //return MO.getPCRelativeDisp(); return 0; } else { assert(0 && "Unknown type of MachineOperand"); return 0; } } unsigned SparcV9CodeEmitter::getValueBit(int64_t Val, unsigned bit) { Val >>= bit; return (Val & 1); } bool SparcV9CodeEmitter::runOnMachineFunction(MachineFunction &MF) { MCE.startFunction(MF); MCE.emitConstantPool(MF.getConstantPool()); for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) emitBasicBlock(*I); MCE.finishFunction(MF); return false; } void SparcV9CodeEmitter::emitBasicBlock(MachineBasicBlock &MBB) { MCE.startBasicBlock(MBB); for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end(); I != E; ++I) emitInstruction(**I); } void SparcV9CodeEmitter::emitInstruction(MachineInstr &MI) { emitConstant(getBinaryCodeForInstr(MI), 4); } #include "SparcV9CodeEmitter.inc"