blob: 47043d80b153dbd2f13620a675209ef688e2b0b0 [file] [log] [blame]
Misha Brukman3de36f52003-05-27 20:07:58 +00001#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"
Misha Brukman0cc640e2003-05-27 21:45:05 +00006#include "SparcV9CodeEmitter.h"
Misha Brukman3de36f52003-05-27 20:07:58 +00007
8bool UltraSparc::addPassesToEmitMachineCode(PassManager &PM,
9 MachineCodeEmitter &MCE) {
10 //PM.add(new SparcV9CodeEmitter(MCE));
11 //MachineCodeEmitter *M = MachineCodeEmitter::createDebugMachineCodeEmitter();
12 MachineCodeEmitter *M =
Misha Brukman0cc640e2003-05-27 21:45:05 +000013 MachineCodeEmitter::createFilePrinterMachineCodeEmitter(MCE);
Misha Brukman3de36f52003-05-27 20:07:58 +000014 PM.add(new SparcV9CodeEmitter(*M));
15 return false;
16}
17
18void SparcV9CodeEmitter::emitConstant(unsigned Val, unsigned Size) {
19 // Output the constant in big endian byte order...
20 unsigned byteVal;
21 for (int i = Size-1; i >= 0; --i) {
22 byteVal = Val >> 8*i;
23 MCE.emitByte(byteVal & 255);
24 }
25}
26
27int64_t SparcV9CodeEmitter::getMachineOpValue(MachineOperand &MO) {
28 if (MO.isPhysicalRegister()) {
29 return MO.getReg();
30 } else if (MO.isImmediate()) {
31 return MO.getImmedValue();
32 } else if (MO.isPCRelativeDisp()) {
Misha Brukman0d603452003-05-27 22:41:44 +000033 MCE->saveBBreference(currBB, MO);
Misha Brukman3de36f52003-05-27 20:07:58 +000034 return 0;
35 } else {
36 assert(0 && "Unknown type of MachineOperand");
37 return 0;
38 }
39}
40
41unsigned SparcV9CodeEmitter::getValueBit(int64_t Val, unsigned bit) {
42 Val >>= bit;
43 return (Val & 1);
44}
45
46
47bool SparcV9CodeEmitter::runOnMachineFunction(MachineFunction &MF) {
48 MCE.startFunction(MF);
49 MCE.emitConstantPool(MF.getConstantPool());
50 for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I)
51 emitBasicBlock(*I);
52 MCE.finishFunction(MF);
53 return false;
54}
55
56void SparcV9CodeEmitter::emitBasicBlock(MachineBasicBlock &MBB) {
Misha Brukman0d603452003-05-27 22:41:44 +000057 currBB = MBB.getBasicBlock();
Misha Brukman3de36f52003-05-27 20:07:58 +000058 MCE.startBasicBlock(MBB);
59 for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end(); I != E; ++I)
60 emitInstruction(**I);
61}
62
63void SparcV9CodeEmitter::emitInstruction(MachineInstr &MI) {
64 emitConstant(getBinaryCodeForInstr(MI), 4);
65}
66
67#include "SparcV9CodeEmitter.inc"