1// -*- mode:c++ -*- 2 3// Copyright (c) 2007 The Hewlett-Packard Development Company 4// All rights reserved. 5// 6// Redistribution and use of this software in source and binary forms, 7// with or without modification, are permitted provided that the 8// following conditions are met: --- 41 unchanged lines hidden (view full) --- 50// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 51// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 52// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 53// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 54// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 55// 56// Authors: Gabe Black 57 |
58////////////////////////////////////////////////////////////////////////////// 59// 60// Architecture independent 61// 62 |
63// Execute method for macroops. 64def template MacroExecPanic {{ 65 Fault execute(%(CPU_exec_context)s *, Trace::InstRecord *) const 66 { 67 panic("Tried to execute macroop directly!"); |
68 return NoFault; |
69 } 70}}; 71 72output header {{ 73 |
74 // Base class for macroops 75 class MacroOp : public StaticInst |
76 { 77 protected: 78 const uint32_t numMicroOps; 79 80 //Constructor. |
81 MacroOp(const char *mnem, ExtMachInst _machInst, |
82 uint32_t _numMicroOps) 83 : StaticInst(mnem, _machInst, No_OpClass), 84 numMicroOps(_numMicroOps) 85 { 86 assert(numMicroOps); 87 microOps = new StaticInstPtr[numMicroOps]; 88 flags[IsMacroOp] = true; 89 } 90 |
91 ~MacroOp() |
92 { 93 delete [] microOps; 94 } 95 96 StaticInstPtr * microOps; 97 98 StaticInstPtr fetchMicroOp(MicroPC microPC) 99 { 100 assert(microPC < numMicroOps); 101 return microOps[microPC]; 102 } 103 |
104 std::string generateDisassembly(Addr pc, 105 const SymbolTable *symtab) const 106 { 107 return mnemonic; 108 } 109 |
110 %(MacroExecPanic)s 111 }; 112}}; 113 |
114// Basic instruction class declaration template. 115def template MacroDeclare {{ 116 /** 117 * Static instruction class for "%(mnemonic)s". 118 */ 119 class %(class_name)s : public %(base_class)s 120 { 121 public: 122 // Constructor. 123 %(class_name)s(ExtMachInst machInst); 124 }; 125}}; 126 |
127// Basic instruction class constructor template. 128def template MacroConstructor {{ 129 inline %(class_name)s::%(class_name)s(ExtMachInst machInst) 130 : %(base_class)s("%(mnemonic)s", machInst, %(num_micro_ops)s) 131 { 132 %(constructor)s; 133 //alloc_micro_ops is the code that sets up the microOps 134 //array in the parent class. 135 %(alloc_micro_ops)s; 136 } 137}}; 138 |
139////////////////////////////////////////////////////////////////////////////// 140// 141// X86 specific 142// 143 |
144let {{ 145 def genMacroOp(name, Name, opSeq): |
146 numMicroOps = len(opSeq) |
147 allocMicroOps = '' 148 micropc = 0 |
149 for op in opSeq: |
150 allocMicroOps += \ 151 "microOps[%d] = %s;\n" % \ |
152 (micropc, op.getAllocator('"' + name + '"', True, False, #op.delayed, |
153 micropc == 0, 154 micropc == numMicroOps - 1)) 155 micropc += 1 |
156 iop = InstObjParams(name, Name, 'MacroOp', |
157 {'code' : '', 'num_micro_ops' : numMicroOps, 158 'alloc_micro_ops' : allocMicroOps}) |
159 header_output = MacroDeclare.subst(iop) |
160 decoder_output = MacroConstructor.subst(iop) 161 decode_block = BasicDecode.subst(iop) 162 exec_output = '' 163 return (header_output, decoder_output, decode_block, exec_output) 164}}; |