summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/Sparc
diff options
context:
space:
mode:
authorMisha Brukman <brukman+llvm@gmail.com>2003-05-27 20:07:58 +0000
committerMisha Brukman <brukman+llvm@gmail.com>2003-05-27 20:07:58 +0000
commit3e9272fb2926ea4a6fdff198b3da482b2fb8aef9 (patch)
tree11a828171d906396bde986e08563caaed0701896 /llvm/lib/Target/Sparc
parentd452b60678186a4acffe4744135f842e0bff6f95 (diff)
downloadbcm5719-llvm-3e9272fb2926ea4a6fdff198b3da482b2fb8aef9.tar.gz
bcm5719-llvm-3e9272fb2926ea4a6fdff198b3da482b2fb8aef9.zip
SparcV9CodeEmitter.cpp is a part of the Sparc code emitter. The main function
that assembles instructions is generated via TableGen (and hence must be built before building this directory, but that's already the case in the top-level Makefile). Also added is .cvsignore to ignore the generated file `SparcV9CodeEmitter.inc', which is included by SparcV9CodeEmitter.cpp . llvm-svn: 6357
Diffstat (limited to 'llvm/lib/Target/Sparc')
-rw-r--r--llvm/lib/Target/Sparc/.cvsignore1
-rw-r--r--llvm/lib/Target/Sparc/Makefile3
-rw-r--r--llvm/lib/Target/Sparc/SparcV9CodeEmitter.cpp90
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"
OpenPOWER on IntegriCloud