types.hh revision 6329:5d8b91875859
110260SAndrew.Bardsley@arm.com/*
210260SAndrew.Bardsley@arm.com * Copyright (c) 2007 The Hewlett-Packard Development Company
310260SAndrew.Bardsley@arm.com * All rights reserved.
410260SAndrew.Bardsley@arm.com *
510260SAndrew.Bardsley@arm.com * Redistribution and use of this software in source and binary forms,
610260SAndrew.Bardsley@arm.com * with or without modification, are permitted provided that the
710260SAndrew.Bardsley@arm.com * following conditions are met:
810260SAndrew.Bardsley@arm.com *
910260SAndrew.Bardsley@arm.com * The software must be used only for Non-Commercial Use which means any
1010260SAndrew.Bardsley@arm.com * use which is NOT directed to receiving any direct monetary
1110260SAndrew.Bardsley@arm.com * compensation for, or commercial advantage from such use.  Illustrative
1210260SAndrew.Bardsley@arm.com * examples of non-commercial use are academic research, personal study,
1310260SAndrew.Bardsley@arm.com * teaching, education and corporate research & development.
1410260SAndrew.Bardsley@arm.com * Illustrative examples of commercial use are distributing products for
1510260SAndrew.Bardsley@arm.com * commercial advantage and providing services using the software for
1610260SAndrew.Bardsley@arm.com * commercial advantage.
1710260SAndrew.Bardsley@arm.com *
1810260SAndrew.Bardsley@arm.com * If you wish to use this software or functionality therein that may be
1910260SAndrew.Bardsley@arm.com * covered by patents for commercial use, please contact:
2010260SAndrew.Bardsley@arm.com *     Director of Intellectual Property Licensing
2110260SAndrew.Bardsley@arm.com *     Office of Strategy and Technology
2210260SAndrew.Bardsley@arm.com *     Hewlett-Packard Company
2310260SAndrew.Bardsley@arm.com *     1501 Page Mill Road
2410260SAndrew.Bardsley@arm.com *     Palo Alto, California  94304
2510260SAndrew.Bardsley@arm.com *
2610260SAndrew.Bardsley@arm.com * Redistributions of source code must retain the above copyright notice,
2710260SAndrew.Bardsley@arm.com * this list of conditions and the following disclaimer.  Redistributions
2810260SAndrew.Bardsley@arm.com * in binary form must reproduce the above copyright notice, this list of
2910260SAndrew.Bardsley@arm.com * conditions and the following disclaimer in the documentation and/or
3010260SAndrew.Bardsley@arm.com * other materials provided with the distribution.  Neither the name of
3110260SAndrew.Bardsley@arm.com * the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its
3210260SAndrew.Bardsley@arm.com * contributors may be used to endorse or promote products derived from
3310260SAndrew.Bardsley@arm.com * this software without specific prior written permission.  No right of
3410260SAndrew.Bardsley@arm.com * sublicense is granted herewith.  Derivatives of the software and
3510260SAndrew.Bardsley@arm.com * output created using the software may be prepared, but only for
3610260SAndrew.Bardsley@arm.com * Non-Commercial Uses.  Derivatives of the software may be shared with
3710260SAndrew.Bardsley@arm.com * others provided: (i) the others agree to abide by the list of
3810260SAndrew.Bardsley@arm.com * conditions herein which includes the Non-Commercial Use restrictions;
3910260SAndrew.Bardsley@arm.com * and (ii) such Derivatives of the software include the above copyright
4010260SAndrew.Bardsley@arm.com * notice to acknowledge the contribution from this software where
4110260SAndrew.Bardsley@arm.com * applicable, this list of conditions and the disclaimer below.
4210260SAndrew.Bardsley@arm.com *
4310260SAndrew.Bardsley@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4410260SAndrew.Bardsley@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
4510260SAndrew.Bardsley@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
46 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
47 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
48 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
49 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
50 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
51 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
52 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
53 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
54 *
55 * Authors: Gabe Black
56 */
57
58#ifndef __ARCH_X86_TYPES_HH__
59#define __ARCH_X86_TYPES_HH__
60
61#include <iostream>
62
63#include "base/bitunion.hh"
64#include "base/cprintf.hh"
65#include "base/types.hh"
66
67namespace X86ISA
68{
69    //This really determines how many bytes are passed to the predecoder.
70    typedef uint64_t MachInst;
71
72    enum Prefixes {
73        NoOverride,
74        ESOverride,
75        CSOverride,
76        SSOverride,
77        DSOverride,
78        FSOverride,
79        GSOverride,
80        RexPrefix,
81        OperandSizeOverride,
82        AddressSizeOverride,
83        Lock,
84        Rep,
85        Repne
86    };
87
88    BitUnion8(LegacyPrefixVector)
89        Bitfield<7, 4> decodeVal;
90        Bitfield<7> repne;
91        Bitfield<6> rep;
92        Bitfield<5> lock;
93        Bitfield<4> op;
94        Bitfield<3> addr;
95        //There can be only one segment override, so they share the
96        //first 3 bits in the legacyPrefixes bitfield.
97        Bitfield<2,0> seg;
98    EndBitUnion(LegacyPrefixVector)
99
100    BitUnion8(ModRM)
101        Bitfield<7,6> mod;
102        Bitfield<5,3> reg;
103        Bitfield<2,0> rm;
104    EndBitUnion(ModRM)
105
106    BitUnion8(Sib)
107        Bitfield<7,6> scale;
108        Bitfield<5,3> index;
109        Bitfield<2,0> base;
110    EndBitUnion(Sib)
111
112    BitUnion8(Rex)
113        //This bit doesn't mean anything according to the ISA, but in
114        //this implementation, it being set means an REX prefix was present.
115        Bitfield<6> present;
116        Bitfield<3> w;
117        Bitfield<2> r;
118        Bitfield<1> x;
119        Bitfield<0> b;
120    EndBitUnion(Rex)
121
122    BitUnion8(Opcode)
123        Bitfield<7,3> top5;
124        Bitfield<2,0> bottom3;
125    EndBitUnion(Opcode)
126
127    BitUnion8(OperatingMode)
128        Bitfield<3> mode;
129        Bitfield<2,0> submode;
130    EndBitUnion(OperatingMode)
131
132    enum X86Mode {
133        LongMode,
134        LegacyMode
135    };
136
137    enum X86SubMode {
138        SixtyFourBitMode,
139        CompatabilityMode,
140        ProtectedMode,
141        Virtual8086Mode,
142        RealMode
143    };
144
145    //The intermediate structure the x86 predecoder returns.
146    struct ExtMachInst
147    {
148        //Prefixes
149        LegacyPrefixVector legacy;
150        Rex rex;
151        //This holds all of the bytes of the opcode
152        struct
153        {
154            //The number of bytes in this opcode. Right now, we ignore that
155            //this can be 3 in some cases
156            uint8_t num;
157            //The first byte detected in a 2+ byte opcode. Should be 0xF0.
158            uint8_t prefixA;
159            //The second byte detected in a 3+ byte opcode. Could be 0xF0 for
160            //3dnow instructions, or 0x38-0x3F for some SSE instructions.
161            uint8_t prefixB;
162            //The main opcode byte. The highest addressed byte in the opcode.
163            Opcode op;
164        } opcode;
165        //Modifier bytes
166        ModRM modRM;
167        Sib sib;
168        //Immediate fields
169        uint64_t immediate;
170        uint64_t displacement;
171
172        //The effective operand size.
173        uint8_t opSize;
174        //The effective address size.
175        uint8_t addrSize;
176        //The effective stack size.
177        uint8_t stackSize;
178
179        //Mode information
180        OperatingMode mode;
181    };
182
183    inline static std::ostream &
184        operator << (std::ostream & os, const ExtMachInst & emi)
185    {
186        ccprintf(os, "\n{\n\tleg = %#x,\n\trex = %#x,\n\t"
187                     "op = {\n\t\tnum = %d,\n\t\top = %#x,\n\t\t"
188                           "prefixA = %#x,\n\t\tprefixB = %#x\n\t},\n\t"
189                     "modRM = %#x,\n\tsib = %#x,\n\t"
190                     "immediate = %#x,\n\tdisplacement = %#x\n}\n",
191                     (uint8_t)emi.legacy, (uint8_t)emi.rex,
192                     emi.opcode.num, (uint8_t)emi.opcode.op,
193                     emi.opcode.prefixA, emi.opcode.prefixB,
194                     (uint8_t)emi.modRM, (uint8_t)emi.sib,
195                     emi.immediate, emi.displacement);
196        return os;
197    }
198
199    inline static bool
200        operator == (const ExtMachInst &emi1, const ExtMachInst &emi2)
201    {
202        if(emi1.legacy != emi2.legacy)
203            return false;
204        if(emi1.rex != emi2.rex)
205            return false;
206        if(emi1.opcode.num != emi2.opcode.num)
207            return false;
208        if(emi1.opcode.op != emi2.opcode.op)
209            return false;
210        if(emi1.opcode.prefixA != emi2.opcode.prefixA)
211            return false;
212        if(emi1.opcode.prefixB != emi2.opcode.prefixB)
213            return false;
214        if(emi1.modRM != emi2.modRM)
215            return false;
216        if(emi1.sib != emi2.sib)
217            return false;
218        if(emi1.immediate != emi2.immediate)
219            return false;
220        if(emi1.displacement != emi2.displacement)
221            return false;
222        if(emi1.mode != emi2.mode)
223            return false;
224        if(emi1.opSize != emi2.opSize)
225            return false;
226        if(emi1.addrSize != emi2.addrSize)
227            return false;
228        if(emi1.stackSize != emi2.stackSize)
229            return false;
230        return true;
231    }
232
233    struct CoreSpecific {
234        int core_type;
235    };
236};
237
238#endif // __ARCH_X86_TYPES_HH__
239