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}};