#include "llvm/PassManager.h" #include "llvm/CodeGen/MachineCodeEmitter.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineInstr.h" #include "SparcInternals.h" #include "SparcV9CodeEmitter.h" bool UltraSparc::addPassesToEmitMachineCode(PassManager &PM, MachineCodeEmitter &MCE) { //PM.add(new SparcV9CodeEmitter(MCE)); //MachineCodeEmitter *M = MachineCodeEmitter::createDebugMachineCodeEmitter(); MachineCodeEmitter *M = MachineCodeEmitter::createFilePrinterMachineCodeEmitter(MCE); 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()) { //MCE.saveBBreference(currBB, MO); 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) { currBB = MBB.getBasicBlock(); 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"