diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/Sparc/.cvsignore | 1 | ||||
| -rw-r--r-- | llvm/lib/Target/Sparc/Makefile | 3 | ||||
| -rw-r--r-- | llvm/lib/Target/Sparc/SparcV9CodeEmitter.cpp | 90 | 
3 files changed, 94 insertions, 0 deletions
| diff --git a/llvm/lib/Target/Sparc/.cvsignore b/llvm/lib/Target/Sparc/.cvsignore new file mode 100644 index 00000000000..636b15c8e3c --- /dev/null +++ b/llvm/lib/Target/Sparc/.cvsignore @@ -0,0 +1 @@ +SparcV9CodeEmitter.inc diff --git a/llvm/lib/Target/Sparc/Makefile b/llvm/lib/Target/Sparc/Makefile index 68c6fee9aa8..aca3a0e2ab6 100644 --- a/llvm/lib/Target/Sparc/Makefile +++ b/llvm/lib/Target/Sparc/Makefile @@ -32,3 +32,6 @@ Debug/Sparc.burm : Debug/Sparc.burg.in1  $(BUILD_ROOT)/Depend/Sparc.burm.d: $(BUILD_ROOT)/Depend/.dir  	touch $@ +SparcV9CodeEmitter.inc: SparcV9.td +	@echo "TableGen-erating $@" +	cpp -P SparcV9.td | tblgen -gen-emitter > SparcV9CodeEmitter.inc diff --git a/llvm/lib/Target/Sparc/SparcV9CodeEmitter.cpp b/llvm/lib/Target/Sparc/SparcV9CodeEmitter.cpp new file mode 100644 index 00000000000..4f779904779 --- /dev/null +++ b/llvm/lib/Target/Sparc/SparcV9CodeEmitter.cpp @@ -0,0 +1,90 @@ +#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" | 

