macroop.isa (4343:3f11bcf873b3) | macroop.isa (4371:c5003760793e) |
---|---|
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 | 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 |
|
58// Execute method for macroops. 59def template MacroExecPanic {{ 60 Fault execute(%(CPU_exec_context)s *, Trace::InstRecord *) const 61 { 62 panic("Tried to execute macroop directly!"); | 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!"); |
63 M5_DUMMY_RETURN | 68 return NoFault; |
64 } 65}}; 66 67output header {{ 68 | 69 } 70}}; 71 72output header {{ 73 |
69 // Base class for most macroops, except ones that need to commit as 70 // they go. 71 class X86MacroInst : public StaticInst | 74 // Base class for macroops 75 class MacroOp : public StaticInst |
72 { 73 protected: 74 const uint32_t numMicroOps; 75 76 //Constructor. | 76 { 77 protected: 78 const uint32_t numMicroOps; 79 80 //Constructor. |
77 X86MacroInst(const char *mnem, ExtMachInst _machInst, | 81 MacroOp(const char *mnem, ExtMachInst _machInst, |
78 uint32_t _numMicroOps) 79 : StaticInst(mnem, _machInst, No_OpClass), 80 numMicroOps(_numMicroOps) 81 { 82 assert(numMicroOps); 83 microOps = new StaticInstPtr[numMicroOps]; 84 flags[IsMacroOp] = true; 85 } 86 | 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 |
87 ~X86MacroInst() | 91 ~MacroOp() |
88 { 89 delete [] microOps; 90 } 91 92 StaticInstPtr * microOps; 93 94 StaticInstPtr fetchMicroOp(MicroPC microPC) 95 { 96 assert(microPC < numMicroOps); 97 return microOps[microPC]; 98 } 99 | 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 |
|
100 %(MacroExecPanic)s 101 }; 102}}; 103 | 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 |
|
104// Basic instruction class constructor template. 105def template MacroConstructor {{ 106 inline %(class_name)s::%(class_name)s(ExtMachInst machInst) 107 : %(base_class)s("%(mnemonic)s", machInst, %(num_micro_ops)s) 108 { 109 %(constructor)s; 110 //alloc_micro_ops is the code that sets up the microOps 111 //array in the parent class. 112 %(alloc_micro_ops)s; 113 } 114}}; 115 | 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 |
|
116let {{ 117 def genMacroOp(name, Name, opSeq): | 144let {{ 145 def genMacroOp(name, Name, opSeq): |
118 baseClass = 'X86MacroInst' 119 numMicroOps = len(opSeq.ops) | 146 numMicroOps = len(opSeq) |
120 allocMicroOps = '' 121 micropc = 0 | 147 allocMicroOps = '' 148 micropc = 0 |
122 for op in opSeq.ops: | 149 for op in opSeq: |
123 allocMicroOps += \ 124 "microOps[%d] = %s;\n" % \ | 150 allocMicroOps += \ 151 "microOps[%d] = %s;\n" % \ |
125 (micropc, op.getAllocator(True, op.delayed, | 152 (micropc, op.getAllocator('"' + name + '"', True, False, #op.delayed, |
126 micropc == 0, 127 micropc == numMicroOps - 1)) 128 micropc += 1 | 153 micropc == 0, 154 micropc == numMicroOps - 1)) 155 micropc += 1 |
129 iop = InstObjParams(name, Name, baseClass, | 156 iop = InstObjParams(name, Name, 'MacroOp', |
130 {'code' : '', 'num_micro_ops' : numMicroOps, 131 'alloc_micro_ops' : allocMicroOps}) | 157 {'code' : '', 'num_micro_ops' : numMicroOps, 158 'alloc_micro_ops' : allocMicroOps}) |
132 header_output = BasicDeclare.subst(iop) | 159 header_output = MacroDeclare.subst(iop) |
133 decoder_output = MacroConstructor.subst(iop) 134 decode_block = BasicDecode.subst(iop) 135 exec_output = '' 136 return (header_output, decoder_output, decode_block, exec_output) 137}}; | 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}}; |