Deleted Added
sdiff udiff text old ( 4343:3f11bcf873b3 ) new ( 4371:c5003760793e )
full compact
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}};