1 #include "llvm/PassManager.h"
2 #include "llvm/CodeGen/MachineCodeEmitter.h"
3 #include "llvm/CodeGen/MachineFunctionPass.h"
4 #include "llvm/CodeGen/MachineInstr.h"
5 #include "SparcInternals.h"
6 #include "SparcV9CodeEmitter.h"
8 bool UltraSparc::addPassesToEmitMachineCode(PassManager &PM,
9 MachineCodeEmitter &MCE) {
10 //PM.add(new SparcV9CodeEmitter(MCE));
11 //MachineCodeEmitter *M = MachineCodeEmitter::createDebugMachineCodeEmitter();
12 MachineCodeEmitter *M =
13 MachineCodeEmitter::createFilePrinterMachineCodeEmitter(MCE);
14 PM.add(new SparcV9CodeEmitter(*M));
18 void SparcV9CodeEmitter::emitConstant(unsigned Val, unsigned Size) {
19 // Output the constant in big endian byte order...
21 for (int i = Size-1; i >= 0; --i) {
23 MCE.emitByte(byteVal & 255);
27 int64_t SparcV9CodeEmitter::getMachineOpValue(MachineOperand &MO) {
28 if (MO.isPhysicalRegister()) {
30 } else if (MO.isImmediate()) {
31 return MO.getImmedValue();
32 } else if (MO.isPCRelativeDisp()) {
34 //return MO.getPCRelativeDisp();
37 assert(0 && "Unknown type of MachineOperand");
42 unsigned SparcV9CodeEmitter::getValueBit(int64_t Val, unsigned bit) {
48 bool SparcV9CodeEmitter::runOnMachineFunction(MachineFunction &MF) {
49 MCE.startFunction(MF);
50 MCE.emitConstantPool(MF.getConstantPool());
51 for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I)
53 MCE.finishFunction(MF);
57 void SparcV9CodeEmitter::emitBasicBlock(MachineBasicBlock &MBB) {
58 MCE.startBasicBlock(MBB);
59 for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end(); I != E; ++I)
63 void SparcV9CodeEmitter::emitInstruction(MachineInstr &MI) {
64 emitConstant(getBinaryCodeForInstr(MI), 4);
67 #include "SparcV9CodeEmitter.inc"