mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-04 05:31:06 +00:00
91 lines
2.5 KiB
C++
91 lines
2.5 KiB
C++
|
#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"
|