| Brian Gaeke | b3deed9 | 2004-04-06 23:21:45 +0000 | [diff] [blame] | 1 | //===-- DelaySlotFiller.cpp - SparcV8 delay slot filler -------------------===// | 
|  | 2 | // | 
|  | 3 | //                     The LLVM Compiler Infrastructure | 
|  | 4 | // | 
|  | 5 | // This file was developed by the LLVM research group and is distributed under | 
|  | 6 | // the University of Illinois Open Source License. See LICENSE.TXT for details. | 
|  | 7 | // | 
|  | 8 | //===----------------------------------------------------------------------===// | 
|  | 9 | // | 
|  | 10 | // Simple local delay slot filler for SparcV8 machine code | 
|  | 11 | // | 
|  | 12 | //===----------------------------------------------------------------------===// | 
|  | 13 |  | 
|  | 14 | #include "SparcV8.h" | 
| Brian Gaeke | b3deed9 | 2004-04-06 23:21:45 +0000 | [diff] [blame] | 15 | #include "llvm/CodeGen/MachineFunctionPass.h" | 
| Brian Gaeke | b3deed9 | 2004-04-06 23:21:45 +0000 | [diff] [blame] | 16 | #include "llvm/CodeGen/MachineInstrBuilder.h" | 
| Brian Gaeke | b3deed9 | 2004-04-06 23:21:45 +0000 | [diff] [blame] | 17 | #include "Support/Statistic.h" | 
| Brian Gaeke | 589bf05 | 2004-04-06 23:25:07 +0000 | [diff] [blame] | 18 |  | 
| Brian Gaeke | b3deed9 | 2004-04-06 23:21:45 +0000 | [diff] [blame] | 19 | using namespace llvm; | 
|  | 20 |  | 
|  | 21 | namespace { | 
|  | 22 | Statistic<> FilledSlots ("delayslotfiller", "Num. of delay slots filled"); | 
|  | 23 |  | 
|  | 24 | struct Filler : public MachineFunctionPass { | 
|  | 25 | /// Target machine description which we query for reg. names, data | 
|  | 26 | /// layout, etc. | 
|  | 27 | /// | 
|  | 28 | TargetMachine &TM; | 
|  | 29 |  | 
|  | 30 | Filler (TargetMachine &tm) : TM (tm) { } | 
|  | 31 |  | 
|  | 32 | virtual const char *getPassName () const { | 
|  | 33 | return "SparcV8 Delay Slot Filler"; | 
|  | 34 | } | 
|  | 35 |  | 
|  | 36 | bool runOnMachineBasicBlock (MachineBasicBlock &MBB); | 
|  | 37 | bool runOnMachineFunction (MachineFunction &F) { | 
|  | 38 | bool Changed = false; | 
|  | 39 | for (MachineFunction::iterator FI = F.begin (), FE = F.end (); | 
|  | 40 | FI != FE; ++FI) | 
|  | 41 | Changed |= runOnMachineBasicBlock (*FI); | 
|  | 42 | return Changed; | 
|  | 43 | } | 
|  | 44 |  | 
|  | 45 | }; | 
|  | 46 | } // end of anonymous namespace | 
|  | 47 |  | 
|  | 48 | /// createSparcV8DelaySlotFillerPass - Returns a pass that fills in delay | 
|  | 49 | /// slots in SparcV8 MachineFunctions | 
|  | 50 | /// | 
|  | 51 | FunctionPass *llvm::createSparcV8DelaySlotFillerPass (TargetMachine &tm) { | 
|  | 52 | return new Filler (tm); | 
|  | 53 | } | 
|  | 54 |  | 
|  | 55 | static bool hasDelaySlot (unsigned Opcode) { | 
|  | 56 | switch (Opcode) { | 
| Brian Gaeke | a067fb3 | 2004-06-17 22:33:57 +0000 | [diff] [blame^] | 57 | case V8::BA: | 
|  | 58 | case V8::BCC: | 
|  | 59 | case V8::BCS: | 
|  | 60 | case V8::BE: | 
|  | 61 | case V8::BG: | 
|  | 62 | case V8::BGE: | 
|  | 63 | case V8::BGU: | 
|  | 64 | case V8::BL: | 
|  | 65 | case V8::BLE: | 
|  | 66 | case V8::BLEU: | 
|  | 67 | case V8::BNE: | 
| Brian Gaeke | b3deed9 | 2004-04-06 23:21:45 +0000 | [diff] [blame] | 68 | case V8::CALL: | 
|  | 69 | case V8::RETL: | 
|  | 70 | return true; | 
|  | 71 | default: | 
|  | 72 | return false; | 
|  | 73 | } | 
|  | 74 | } | 
|  | 75 |  | 
|  | 76 | /// runOnMachineBasicBlock - Fill in delay slots for the given basic block. | 
| Brian Gaeke | 37f92b5 | 2004-04-07 04:05:12 +0000 | [diff] [blame] | 77 | /// Currently, we fill delay slots with NOPs. We assume there is only one | 
|  | 78 | /// delay slot per delayed instruction. | 
| Brian Gaeke | b3deed9 | 2004-04-06 23:21:45 +0000 | [diff] [blame] | 79 | /// | 
|  | 80 | bool Filler::runOnMachineBasicBlock (MachineBasicBlock &MBB) { | 
| Brian Gaeke | 37f92b5 | 2004-04-07 04:05:12 +0000 | [diff] [blame] | 81 | bool Changed = false; | 
| Brian Gaeke | b3deed9 | 2004-04-06 23:21:45 +0000 | [diff] [blame] | 82 | for (MachineBasicBlock::iterator I = MBB.begin (); I != MBB.end (); ++I) | 
|  | 83 | if (hasDelaySlot (I->getOpcode ())) { | 
|  | 84 | MachineBasicBlock::iterator J = I; | 
|  | 85 | ++J; | 
| Brian Gaeke | 37f92b5 | 2004-04-07 04:05:12 +0000 | [diff] [blame] | 86 | BuildMI (MBB, J, V8::NOP, 0); | 
| Brian Gaeke | b3deed9 | 2004-04-06 23:21:45 +0000 | [diff] [blame] | 87 | ++FilledSlots; | 
| Brian Gaeke | 37f92b5 | 2004-04-07 04:05:12 +0000 | [diff] [blame] | 88 | Changed = true; | 
| Brian Gaeke | b3deed9 | 2004-04-06 23:21:45 +0000 | [diff] [blame] | 89 | } | 
| Brian Gaeke | 37f92b5 | 2004-04-07 04:05:12 +0000 | [diff] [blame] | 90 | return Changed; | 
| Brian Gaeke | b3deed9 | 2004-04-06 23:21:45 +0000 | [diff] [blame] | 91 | } |