types.hh (11975:a4ba6d5b9774) types.hh (12045:31d9a81ba286)
1/*
2 * Copyright (c) 2007 The Hewlett-Packard Development Company
3 * All rights reserved.
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated
11 * unmodified and in its entirety in all distributions of the software,
12 * modified or unmodified, in source code or in binary form.
13 *
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions are
16 * met: redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer;
18 * redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution;
21 * neither the name of the copyright holders nor the names of its
22 * contributors may be used to endorse or promote products derived from
23 * this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 *
37 * Authors: Gabe Black
38 */
39
40#ifndef __ARCH_X86_TYPES_HH__
41#define __ARCH_X86_TYPES_HH__
42
43#include <iostream>
44
45#include "arch/generic/types.hh"
46#include "base/bitunion.hh"
47#include "base/cprintf.hh"
48#include "base/types.hh"
49#include "sim/serialize.hh"
50
51namespace X86ISA
52{
53 //This really determines how many bytes are passed to the decoder.
54 typedef uint64_t MachInst;
55
56 enum Prefixes {
57 NoOverride,
58 ESOverride,
59 CSOverride,
60 SSOverride,
61 DSOverride,
62 FSOverride,
63 GSOverride,
64 RexPrefix,
65 OperandSizeOverride,
66 AddressSizeOverride,
67 Lock,
68 Rep,
69 Repne,
70 Vex2Prefix,
71 Vex3Prefix,
72 XopPrefix,
73 };
74
75 BitUnion8(LegacyPrefixVector)
76 Bitfield<7, 4> decodeVal;
77 Bitfield<7> repne;
78 Bitfield<6> rep;
79 Bitfield<5> lock;
80 Bitfield<4> op;
81 Bitfield<3> addr;
82 //There can be only one segment override, so they share the
83 //first 3 bits in the legacyPrefixes bitfield.
84 Bitfield<2,0> seg;
85 EndBitUnion(LegacyPrefixVector)
86
87 BitUnion8(ModRM)
88 Bitfield<7,6> mod;
89 Bitfield<5,3> reg;
90 Bitfield<2,0> rm;
91 EndBitUnion(ModRM)
92
93 BitUnion8(Sib)
94 Bitfield<7,6> scale;
95 Bitfield<5,3> index;
96 Bitfield<2,0> base;
97 EndBitUnion(Sib)
98
99 BitUnion8(Rex)
100 //This bit doesn't mean anything according to the ISA, but in
101 //this implementation, it being set means an REX prefix was present.
102 Bitfield<6> present;
103 Bitfield<3> w;
104 Bitfield<2> r;
105 Bitfield<1> x;
106 Bitfield<0> b;
107 EndBitUnion(Rex)
108
1/*
2 * Copyright (c) 2007 The Hewlett-Packard Development Company
3 * All rights reserved.
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated
11 * unmodified and in its entirety in all distributions of the software,
12 * modified or unmodified, in source code or in binary form.
13 *
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions are
16 * met: redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer;
18 * redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution;
21 * neither the name of the copyright holders nor the names of its
22 * contributors may be used to endorse or promote products derived from
23 * this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 *
37 * Authors: Gabe Black
38 */
39
40#ifndef __ARCH_X86_TYPES_HH__
41#define __ARCH_X86_TYPES_HH__
42
43#include <iostream>
44
45#include "arch/generic/types.hh"
46#include "base/bitunion.hh"
47#include "base/cprintf.hh"
48#include "base/types.hh"
49#include "sim/serialize.hh"
50
51namespace X86ISA
52{
53 //This really determines how many bytes are passed to the decoder.
54 typedef uint64_t MachInst;
55
56 enum Prefixes {
57 NoOverride,
58 ESOverride,
59 CSOverride,
60 SSOverride,
61 DSOverride,
62 FSOverride,
63 GSOverride,
64 RexPrefix,
65 OperandSizeOverride,
66 AddressSizeOverride,
67 Lock,
68 Rep,
69 Repne,
70 Vex2Prefix,
71 Vex3Prefix,
72 XopPrefix,
73 };
74
75 BitUnion8(LegacyPrefixVector)
76 Bitfield<7, 4> decodeVal;
77 Bitfield<7> repne;
78 Bitfield<6> rep;
79 Bitfield<5> lock;
80 Bitfield<4> op;
81 Bitfield<3> addr;
82 //There can be only one segment override, so they share the
83 //first 3 bits in the legacyPrefixes bitfield.
84 Bitfield<2,0> seg;
85 EndBitUnion(LegacyPrefixVector)
86
87 BitUnion8(ModRM)
88 Bitfield<7,6> mod;
89 Bitfield<5,3> reg;
90 Bitfield<2,0> rm;
91 EndBitUnion(ModRM)
92
93 BitUnion8(Sib)
94 Bitfield<7,6> scale;
95 Bitfield<5,3> index;
96 Bitfield<2,0> base;
97 EndBitUnion(Sib)
98
99 BitUnion8(Rex)
100 //This bit doesn't mean anything according to the ISA, but in
101 //this implementation, it being set means an REX prefix was present.
102 Bitfield<6> present;
103 Bitfield<3> w;
104 Bitfield<2> r;
105 Bitfield<1> x;
106 Bitfield<0> b;
107 EndBitUnion(Rex)
108
109 BitUnion(uint32_t, ThreeByteVex)
110 Bitfield<7,0> zero;
111 SubBitUnion(first, 15, 8)
112 // Inverted one-bit extension of ModRM reg field
113 Bitfield<15> r;
114 // Inverted one-bit extension of SIB index field
115 Bitfield<14> x;
116 // Inverted one-bit extension, r/m field or SIB base field
117 Bitfield<13> b;
118 // Opcode map select
119 Bitfield<12, 8> map_select;
120 EndSubBitUnion(first)
121 SubBitUnion(second, 23, 16)
122 // Default operand size override for a general purpose register to
123 // 64-bit size in 64-bit mode; operand configuration specifier for
124 // certain YMM/XMM-based operations.
125 Bitfield<23> w;
126 // Source or destination register selector, in ones' complement
127 // format
128 Bitfield<22, 19> vvvv;
129 // Vector length specifier
130 Bitfield<18> l;
131 // Implied 66, F2, or F3 opcode extension
132 Bitfield<17, 16> pp;
133 EndSubBitUnion(second)
134 EndBitUnion(ThreeByteVex)
109 BitUnion8(Vex2Of3)
110 // Inverted bits from the REX prefix.
111 Bitfield<7> r;
112 Bitfield<6> x;
113 Bitfield<5> b;
114 // Selector for what would be two or three byte opcode types.
115 Bitfield<4, 0> m;
116 EndBitUnion(Vex2Of3)
135
117
136 BitUnion16(TwoByteVex)
137 Bitfield<7,0> zero;
138 SubBitUnion(first, 15, 8)
139 // Inverted one-bit extension of ModRM reg field
140 Bitfield<15> r;
141 // Source or destination register selector, in ones' complement
142 // format
143 Bitfield<14, 11> vvvv;
144 // Vector length specifier
145 Bitfield<10> l;
146 // Implied 66, F2, or F3 opcode extension
147 Bitfield<9, 8> pp;
148 EndSubBitUnion(first)
149 EndBitUnion(TwoByteVex)
118 BitUnion8(Vex3Of3)
119 // Bit from the REX prefix.
120 Bitfield<7> w;
121 // Inverted extra register index.
122 Bitfield<6, 3> v;
123 // Vector length specifier.
124 Bitfield<2> l;
125 // Implied 66, F2, or F3 opcode prefix.
126 Bitfield<1, 0> p;
127 EndBitUnion(Vex3Of3)
150
128
129 BitUnion8(Vex2Of2)
130 // Inverted bit from the REX prefix.
131 Bitfield<7> r;
132 // Inverted extra register index.
133 Bitfield<6, 3> v;
134 // Vector length specifier
135 Bitfield<2> l;
136 // Implied 66, F2, or F3 opcode prefix.
137 Bitfield<1, 0> p;
138 EndBitUnion(Vex2Of2)
139
140 BitUnion8(VexInfo)
141 // Extra register index.
142 Bitfield<6, 3> v;
143 // Vector length specifier.
144 Bitfield<2> l;
145 // Whether the VEX prefix was used.
146 Bitfield<0> present;
147 EndBitUnion(VexInfo)
148
151 enum OpcodeType {
152 BadOpcode,
153 OneByteOpcode,
154 TwoByteOpcode,
155 ThreeByte0F38Opcode,
156 ThreeByte0F3AOpcode,
149 enum OpcodeType {
150 BadOpcode,
151 OneByteOpcode,
152 TwoByteOpcode,
153 ThreeByte0F38Opcode,
154 ThreeByte0F3AOpcode,
157 Vex,
158 };
159
160 static inline const char *
161 opcodeTypeToStr(OpcodeType type)
162 {
163 switch (type) {
164 case BadOpcode:
165 return "bad";
166 case OneByteOpcode:
167 return "one byte";
168 case TwoByteOpcode:
169 return "two byte";
170 case ThreeByte0F38Opcode:
171 return "three byte 0f38";
172 case ThreeByte0F3AOpcode:
173 return "three byte 0f3a";
155 };
156
157 static inline const char *
158 opcodeTypeToStr(OpcodeType type)
159 {
160 switch (type) {
161 case BadOpcode:
162 return "bad";
163 case OneByteOpcode:
164 return "one byte";
165 case TwoByteOpcode:
166 return "two byte";
167 case ThreeByte0F38Opcode:
168 return "three byte 0f38";
169 case ThreeByte0F3AOpcode:
170 return "three byte 0f3a";
174 case Vex:
175 return "vex";
176 default:
177 return "unrecognized!";
178 }
179 }
180
181 BitUnion8(Opcode)
182 Bitfield<7,3> top5;
183 Bitfield<2,0> bottom3;
184 EndBitUnion(Opcode)
185
186 BitUnion8(OperatingMode)
187 Bitfield<3> mode;
188 Bitfield<2,0> submode;
189 EndBitUnion(OperatingMode)
190
191 enum X86Mode {
192 LongMode,
193 LegacyMode
194 };
195
196 enum X86SubMode {
197 SixtyFourBitMode,
198 CompatabilityMode,
199 ProtectedMode,
200 Virtual8086Mode,
201 RealMode
202 };
203
204 //The intermediate structure used by the x86 decoder.
205 struct ExtMachInst
206 {
207 //Prefixes
208 LegacyPrefixVector legacy;
209 Rex rex;
171 default:
172 return "unrecognized!";
173 }
174 }
175
176 BitUnion8(Opcode)
177 Bitfield<7,3> top5;
178 Bitfield<2,0> bottom3;
179 EndBitUnion(Opcode)
180
181 BitUnion8(OperatingMode)
182 Bitfield<3> mode;
183 Bitfield<2,0> submode;
184 EndBitUnion(OperatingMode)
185
186 enum X86Mode {
187 LongMode,
188 LegacyMode
189 };
190
191 enum X86SubMode {
192 SixtyFourBitMode,
193 CompatabilityMode,
194 ProtectedMode,
195 Virtual8086Mode,
196 RealMode
197 };
198
199 //The intermediate structure used by the x86 decoder.
200 struct ExtMachInst
201 {
202 //Prefixes
203 LegacyPrefixVector legacy;
204 Rex rex;
210 // We use the following field for encoding both two byte and three byte
211 // escape sequences
212 ThreeByteVex vex;
205 VexInfo vex;
213
214 //This holds all of the bytes of the opcode
215 struct
216 {
217 OpcodeType type;
218 //The main opcode byte. The highest addressed byte in the opcode.
219 Opcode op;
220 } opcode;
221 //Modifier bytes
222 ModRM modRM;
223 Sib sib;
224 //Immediate fields
225 uint64_t immediate;
226 uint64_t displacement;
227
228 //The effective operand size.
229 uint8_t opSize;
230 //The effective address size.
231 uint8_t addrSize;
232 //The effective stack size.
233 uint8_t stackSize;
234 //The size of the displacement
235 uint8_t dispSize;
236
237 //Mode information
238 OperatingMode mode;
239 };
240
241 inline static std::ostream &
242 operator << (std::ostream & os, const ExtMachInst & emi)
243 {
244 ccprintf(os, "\n{\n\tleg = %#x,\n\trex = %#x,\n\t"
245 "vex/xop = %#x,\n\t"
246 "op = {\n\t\ttype = %s,\n\t\top = %#x,\n\t\t},\n\t"
247 "modRM = %#x,\n\tsib = %#x,\n\t"
248 "immediate = %#x,\n\tdisplacement = %#x\n\t"
249 "dispSize = %d}\n",
250 (uint8_t)emi.legacy, (uint8_t)emi.rex,
206
207 //This holds all of the bytes of the opcode
208 struct
209 {
210 OpcodeType type;
211 //The main opcode byte. The highest addressed byte in the opcode.
212 Opcode op;
213 } opcode;
214 //Modifier bytes
215 ModRM modRM;
216 Sib sib;
217 //Immediate fields
218 uint64_t immediate;
219 uint64_t displacement;
220
221 //The effective operand size.
222 uint8_t opSize;
223 //The effective address size.
224 uint8_t addrSize;
225 //The effective stack size.
226 uint8_t stackSize;
227 //The size of the displacement
228 uint8_t dispSize;
229
230 //Mode information
231 OperatingMode mode;
232 };
233
234 inline static std::ostream &
235 operator << (std::ostream & os, const ExtMachInst & emi)
236 {
237 ccprintf(os, "\n{\n\tleg = %#x,\n\trex = %#x,\n\t"
238 "vex/xop = %#x,\n\t"
239 "op = {\n\t\ttype = %s,\n\t\top = %#x,\n\t\t},\n\t"
240 "modRM = %#x,\n\tsib = %#x,\n\t"
241 "immediate = %#x,\n\tdisplacement = %#x\n\t"
242 "dispSize = %d}\n",
243 (uint8_t)emi.legacy, (uint8_t)emi.rex,
251 (uint32_t)emi.vex,
244 (uint8_t)emi.vex,
252 opcodeTypeToStr(emi.opcode.type), (uint8_t)emi.opcode.op,
253 (uint8_t)emi.modRM, (uint8_t)emi.sib,
254 emi.immediate, emi.displacement, emi.dispSize);
255 return os;
256 }
257
258 inline static bool
259 operator == (const ExtMachInst &emi1, const ExtMachInst &emi2)
260 {
261 if (emi1.legacy != emi2.legacy)
262 return false;
263 if (emi1.rex != emi2.rex)
264 return false;
245 opcodeTypeToStr(emi.opcode.type), (uint8_t)emi.opcode.op,
246 (uint8_t)emi.modRM, (uint8_t)emi.sib,
247 emi.immediate, emi.displacement, emi.dispSize);
248 return os;
249 }
250
251 inline static bool
252 operator == (const ExtMachInst &emi1, const ExtMachInst &emi2)
253 {
254 if (emi1.legacy != emi2.legacy)
255 return false;
256 if (emi1.rex != emi2.rex)
257 return false;
258 if (emi1.vex != emi2.vex)
259 return false;
265 if (emi1.opcode.type != emi2.opcode.type)
266 return false;
267 if (emi1.opcode.op != emi2.opcode.op)
268 return false;
269 if (emi1.modRM != emi2.modRM)
270 return false;
271 if (emi1.sib != emi2.sib)
272 return false;
273 if (emi1.immediate != emi2.immediate)
274 return false;
275 if (emi1.displacement != emi2.displacement)
276 return false;
277 if (emi1.mode != emi2.mode)
278 return false;
279 if (emi1.opSize != emi2.opSize)
280 return false;
281 if (emi1.addrSize != emi2.addrSize)
282 return false;
283 if (emi1.stackSize != emi2.stackSize)
284 return false;
285 if (emi1.dispSize != emi2.dispSize)
286 return false;
287 return true;
288 }
289
290 class PCState : public GenericISA::UPCState<MachInst>
291 {
292 protected:
293 typedef GenericISA::UPCState<MachInst> Base;
294
295 uint8_t _size;
296
297 public:
298 void
299 set(Addr val)
300 {
301 Base::set(val);
302 _size = 0;
303 }
304
305 PCState() {}
306 PCState(Addr val) { set(val); }
307
308 void
309 setNPC(Addr val)
310 {
311 Base::setNPC(val);
312 _size = 0;
313 }
314
315 uint8_t size() const { return _size; }
316 void size(uint8_t newSize) { _size = newSize; }
317
318 bool
319 branching() const
320 {
321 return (this->npc() != this->pc() + size()) ||
322 (this->nupc() != this->upc() + 1);
323 }
324
325 void
326 advance()
327 {
328 Base::advance();
329 _size = 0;
330 }
331
332 void
333 uEnd()
334 {
335 Base::uEnd();
336 _size = 0;
337 }
338
339 void
340 serialize(CheckpointOut &cp) const
341 {
342 Base::serialize(cp);
343 SERIALIZE_SCALAR(_size);
344 }
345
346 void
347 unserialize(CheckpointIn &cp)
348 {
349 Base::unserialize(cp);
350 UNSERIALIZE_SCALAR(_size);
351 }
352 };
353
354}
355
356namespace std {
357 template<>
358 struct hash<X86ISA::ExtMachInst> {
359 size_t operator()(const X86ISA::ExtMachInst &emi) const {
260 if (emi1.opcode.type != emi2.opcode.type)
261 return false;
262 if (emi1.opcode.op != emi2.opcode.op)
263 return false;
264 if (emi1.modRM != emi2.modRM)
265 return false;
266 if (emi1.sib != emi2.sib)
267 return false;
268 if (emi1.immediate != emi2.immediate)
269 return false;
270 if (emi1.displacement != emi2.displacement)
271 return false;
272 if (emi1.mode != emi2.mode)
273 return false;
274 if (emi1.opSize != emi2.opSize)
275 return false;
276 if (emi1.addrSize != emi2.addrSize)
277 return false;
278 if (emi1.stackSize != emi2.stackSize)
279 return false;
280 if (emi1.dispSize != emi2.dispSize)
281 return false;
282 return true;
283 }
284
285 class PCState : public GenericISA::UPCState<MachInst>
286 {
287 protected:
288 typedef GenericISA::UPCState<MachInst> Base;
289
290 uint8_t _size;
291
292 public:
293 void
294 set(Addr val)
295 {
296 Base::set(val);
297 _size = 0;
298 }
299
300 PCState() {}
301 PCState(Addr val) { set(val); }
302
303 void
304 setNPC(Addr val)
305 {
306 Base::setNPC(val);
307 _size = 0;
308 }
309
310 uint8_t size() const { return _size; }
311 void size(uint8_t newSize) { _size = newSize; }
312
313 bool
314 branching() const
315 {
316 return (this->npc() != this->pc() + size()) ||
317 (this->nupc() != this->upc() + 1);
318 }
319
320 void
321 advance()
322 {
323 Base::advance();
324 _size = 0;
325 }
326
327 void
328 uEnd()
329 {
330 Base::uEnd();
331 _size = 0;
332 }
333
334 void
335 serialize(CheckpointOut &cp) const
336 {
337 Base::serialize(cp);
338 SERIALIZE_SCALAR(_size);
339 }
340
341 void
342 unserialize(CheckpointIn &cp)
343 {
344 Base::unserialize(cp);
345 UNSERIALIZE_SCALAR(_size);
346 }
347 };
348
349}
350
351namespace std {
352 template<>
353 struct hash<X86ISA::ExtMachInst> {
354 size_t operator()(const X86ISA::ExtMachInst &emi) const {
360 return (((uint64_t)emi.legacy << 40) |
361 ((uint64_t)emi.rex << 32) |
355 return (((uint64_t)emi.legacy << 48) |
356 ((uint64_t)emi.rex << 40) |
357 ((uint64_t)emi.vex << 32) |
362 ((uint64_t)emi.modRM << 24) |
363 ((uint64_t)emi.sib << 16) |
364 ((uint64_t)emi.opcode.type << 8) |
365 ((uint64_t)emi.opcode.op)) ^
366 emi.immediate ^ emi.displacement ^
367 emi.mode ^
368 emi.opSize ^ emi.addrSize ^
369 emi.stackSize ^ emi.dispSize;
370 };
371 };
372}
373
374// These two functions allow ExtMachInst to be used with SERIALIZE_SCALAR
375// and UNSERIALIZE_SCALAR.
376template <>
377void
378paramOut(CheckpointOut &cp, const std::string &name,
379 const X86ISA::ExtMachInst &machInst);
380template <>
381void
382paramIn(CheckpointIn &cp, const std::string &name,
383 X86ISA::ExtMachInst &machInst);
384
385#endif // __ARCH_X86_TYPES_HH__
358 ((uint64_t)emi.modRM << 24) |
359 ((uint64_t)emi.sib << 16) |
360 ((uint64_t)emi.opcode.type << 8) |
361 ((uint64_t)emi.opcode.op)) ^
362 emi.immediate ^ emi.displacement ^
363 emi.mode ^
364 emi.opSize ^ emi.addrSize ^
365 emi.stackSize ^ emi.dispSize;
366 };
367 };
368}
369
370// These two functions allow ExtMachInst to be used with SERIALIZE_SCALAR
371// and UNSERIALIZE_SCALAR.
372template <>
373void
374paramOut(CheckpointOut &cp, const std::string &name,
375 const X86ISA::ExtMachInst &machInst);
376template <>
377void
378paramIn(CheckpointIn &cp, const std::string &name,
379 X86ISA::ExtMachInst &machInst);
380
381#endif // __ARCH_X86_TYPES_HH__