types.hh revision 4601
14120Sgblack@eecs.umich.edu/*
24120Sgblack@eecs.umich.edu * Copyright (c) 2007 The Hewlett-Packard Development Company
34120Sgblack@eecs.umich.edu * All rights reserved.
44120Sgblack@eecs.umich.edu *
54120Sgblack@eecs.umich.edu * Redistribution and use of this software in source and binary forms,
64120Sgblack@eecs.umich.edu * with or without modification, are permitted provided that the
74120Sgblack@eecs.umich.edu * following conditions are met:
84120Sgblack@eecs.umich.edu *
94120Sgblack@eecs.umich.edu * The software must be used only for Non-Commercial Use which means any
104120Sgblack@eecs.umich.edu * use which is NOT directed to receiving any direct monetary
114120Sgblack@eecs.umich.edu * compensation for, or commercial advantage from such use.  Illustrative
124120Sgblack@eecs.umich.edu * examples of non-commercial use are academic research, personal study,
134120Sgblack@eecs.umich.edu * teaching, education and corporate research & development.
144120Sgblack@eecs.umich.edu * Illustrative examples of commercial use are distributing products for
154120Sgblack@eecs.umich.edu * commercial advantage and providing services using the software for
164120Sgblack@eecs.umich.edu * commercial advantage.
174120Sgblack@eecs.umich.edu *
184120Sgblack@eecs.umich.edu * If you wish to use this software or functionality therein that may be
194120Sgblack@eecs.umich.edu * covered by patents for commercial use, please contact:
204120Sgblack@eecs.umich.edu *     Director of Intellectual Property Licensing
214120Sgblack@eecs.umich.edu *     Office of Strategy and Technology
224120Sgblack@eecs.umich.edu *     Hewlett-Packard Company
234120Sgblack@eecs.umich.edu *     1501 Page Mill Road
244120Sgblack@eecs.umich.edu *     Palo Alto, California  94304
254120Sgblack@eecs.umich.edu *
264120Sgblack@eecs.umich.edu * Redistributions of source code must retain the above copyright notice,
274120Sgblack@eecs.umich.edu * this list of conditions and the following disclaimer.  Redistributions
284120Sgblack@eecs.umich.edu * in binary form must reproduce the above copyright notice, this list of
294120Sgblack@eecs.umich.edu * conditions and the following disclaimer in the documentation and/or
304120Sgblack@eecs.umich.edu * other materials provided with the distribution.  Neither the name of
314120Sgblack@eecs.umich.edu * the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its
324120Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
334120Sgblack@eecs.umich.edu * this software without specific prior written permission.  No right of
344120Sgblack@eecs.umich.edu * sublicense is granted herewith.  Derivatives of the software and
354120Sgblack@eecs.umich.edu * output created using the software may be prepared, but only for
364120Sgblack@eecs.umich.edu * Non-Commercial Uses.  Derivatives of the software may be shared with
374120Sgblack@eecs.umich.edu * others provided: (i) the others agree to abide by the list of
384120Sgblack@eecs.umich.edu * conditions herein which includes the Non-Commercial Use restrictions;
394120Sgblack@eecs.umich.edu * and (ii) such Derivatives of the software include the above copyright
404120Sgblack@eecs.umich.edu * notice to acknowledge the contribution from this software where
414120Sgblack@eecs.umich.edu * applicable, this list of conditions and the disclaimer below.
424120Sgblack@eecs.umich.edu *
434120Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
444120Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
454120Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
464120Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
474120Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
484120Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
494120Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
504120Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
514120Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
524120Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
534120Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
544120Sgblack@eecs.umich.edu *
554120Sgblack@eecs.umich.edu * Authors: Gabe Black
564120Sgblack@eecs.umich.edu */
574120Sgblack@eecs.umich.edu
584120Sgblack@eecs.umich.edu#ifndef __ARCH_X86_TYPES_HH__
594120Sgblack@eecs.umich.edu#define __ARCH_X86_TYPES_HH__
604120Sgblack@eecs.umich.edu
614147Sgblack@eecs.umich.edu#include <inttypes.h>
624182Sgblack@eecs.umich.edu#include <iostream>
634147Sgblack@eecs.umich.edu
644276Sgblack@eecs.umich.edu#include "base/bitfield.hh"
654276Sgblack@eecs.umich.edu#include "base/cprintf.hh"
664276Sgblack@eecs.umich.edu
674120Sgblack@eecs.umich.edunamespace X86ISA
684120Sgblack@eecs.umich.edu{
694181Sgblack@eecs.umich.edu    //This really determines how many bytes are passed to the predecoder.
704181Sgblack@eecs.umich.edu    typedef uint64_t MachInst;
714182Sgblack@eecs.umich.edu
724182Sgblack@eecs.umich.edu    enum Prefixes {
734342Sgblack@eecs.umich.edu        NoOverride,
744342Sgblack@eecs.umich.edu        CSOverride,
754342Sgblack@eecs.umich.edu        DSOverride,
764342Sgblack@eecs.umich.edu        ESOverride,
774342Sgblack@eecs.umich.edu        FSOverride,
784342Sgblack@eecs.umich.edu        GSOverride,
794342Sgblack@eecs.umich.edu        SSOverride,
804342Sgblack@eecs.umich.edu        RexPrefix,
814342Sgblack@eecs.umich.edu        OperandSizeOverride,
824342Sgblack@eecs.umich.edu        AddressSizeOverride,
834342Sgblack@eecs.umich.edu        Lock,
844342Sgblack@eecs.umich.edu        Rep,
854342Sgblack@eecs.umich.edu        Repne
864342Sgblack@eecs.umich.edu    };
874342Sgblack@eecs.umich.edu
884342Sgblack@eecs.umich.edu    BitUnion8(LegacyPrefixVector)
894342Sgblack@eecs.umich.edu        Bitfield<7> repne;
904342Sgblack@eecs.umich.edu        Bitfield<6> rep;
914342Sgblack@eecs.umich.edu        Bitfield<5> lock;
924342Sgblack@eecs.umich.edu        Bitfield<4> addr;
934342Sgblack@eecs.umich.edu        Bitfield<3> op;
944182Sgblack@eecs.umich.edu        //There can be only one segment override, so they share the
954182Sgblack@eecs.umich.edu        //first 3 bits in the legacyPrefixes bitfield.
964342Sgblack@eecs.umich.edu        Bitfield<2,0> seg;
974342Sgblack@eecs.umich.edu    EndBitUnion(LegacyPrefixVector)
984182Sgblack@eecs.umich.edu
994276Sgblack@eecs.umich.edu    BitUnion8(ModRM)
1004276Sgblack@eecs.umich.edu        Bitfield<7,6> mod;
1014276Sgblack@eecs.umich.edu        Bitfield<5,3> reg;
1024276Sgblack@eecs.umich.edu        Bitfield<2,0> rm;
1034276Sgblack@eecs.umich.edu    EndBitUnion(ModRM)
1044276Sgblack@eecs.umich.edu
1054276Sgblack@eecs.umich.edu    BitUnion8(Sib)
1064276Sgblack@eecs.umich.edu        Bitfield<7,6> scale;
1074276Sgblack@eecs.umich.edu        Bitfield<5,3> index;
1084276Sgblack@eecs.umich.edu        Bitfield<2,0> base;
1094276Sgblack@eecs.umich.edu    EndBitUnion(Sib)
1104276Sgblack@eecs.umich.edu
1114276Sgblack@eecs.umich.edu    BitUnion8(Rex)
1124276Sgblack@eecs.umich.edu        Bitfield<3> w;
1134276Sgblack@eecs.umich.edu        Bitfield<2> r;
1144276Sgblack@eecs.umich.edu        Bitfield<1> x;
1154276Sgblack@eecs.umich.edu        Bitfield<0> b;
1164276Sgblack@eecs.umich.edu    EndBitUnion(Rex)
1174276Sgblack@eecs.umich.edu
1184276Sgblack@eecs.umich.edu    BitUnion8(Opcode)
1194276Sgblack@eecs.umich.edu        Bitfield<7,3> top5;
1204276Sgblack@eecs.umich.edu        Bitfield<2,0> bottom3;
1214276Sgblack@eecs.umich.edu    EndBitUnion(Opcode)
1224276Sgblack@eecs.umich.edu
1234569Sgblack@eecs.umich.edu    BitUnion8(OperatingMode)
1244569Sgblack@eecs.umich.edu        Bitfield<3> mode;
1254569Sgblack@eecs.umich.edu        Bitfield<2,0> submode;
1264569Sgblack@eecs.umich.edu    EndBitUnion(OperatingMode)
1274569Sgblack@eecs.umich.edu
1284569Sgblack@eecs.umich.edu    enum X86Mode {
1294569Sgblack@eecs.umich.edu        LongMode,
1304569Sgblack@eecs.umich.edu        LegacyMode
1314569Sgblack@eecs.umich.edu    };
1324569Sgblack@eecs.umich.edu
1334569Sgblack@eecs.umich.edu    enum X86SubMode {
1344569Sgblack@eecs.umich.edu        SixtyFourBitMode,
1354569Sgblack@eecs.umich.edu        CompatabilityMode,
1364569Sgblack@eecs.umich.edu        ProtectedMode,
1374569Sgblack@eecs.umich.edu        Virtual8086Mode,
1384569Sgblack@eecs.umich.edu        RealMode
1394569Sgblack@eecs.umich.edu    };
1404569Sgblack@eecs.umich.edu
1414181Sgblack@eecs.umich.edu    //The intermediate structure the x86 predecoder returns.
1424181Sgblack@eecs.umich.edu    struct ExtMachInst
1434181Sgblack@eecs.umich.edu    {
1444276Sgblack@eecs.umich.edu        //Prefixes
1454342Sgblack@eecs.umich.edu        LegacyPrefixVector legacy;
1464276Sgblack@eecs.umich.edu        Rex rex;
1474276Sgblack@eecs.umich.edu        //This holds all of the bytes of the opcode
1484276Sgblack@eecs.umich.edu        struct
1494276Sgblack@eecs.umich.edu        {
1504276Sgblack@eecs.umich.edu            //The number of bytes in this opcode. Right now, we ignore that
1514276Sgblack@eecs.umich.edu            //this can be 3 in some cases
1524276Sgblack@eecs.umich.edu            uint8_t num;
1534276Sgblack@eecs.umich.edu            //The first byte detected in a 2+ byte opcode. Should be 0xF0.
1544276Sgblack@eecs.umich.edu            uint8_t prefixA;
1554276Sgblack@eecs.umich.edu            //The second byte detected in a 3+ byte opcode. Could be 0xF0 for
1564276Sgblack@eecs.umich.edu            //3dnow instructions, or 0x38-0x3F for some SSE instructions.
1574276Sgblack@eecs.umich.edu            uint8_t prefixB;
1584276Sgblack@eecs.umich.edu            //The main opcode byte. The highest addressed byte in the opcode.
1594276Sgblack@eecs.umich.edu            Opcode op;
1604276Sgblack@eecs.umich.edu        } opcode;
1614276Sgblack@eecs.umich.edu        //Modifier bytes
1624276Sgblack@eecs.umich.edu        ModRM modRM;
1634601Sgblack@eecs.umich.edu        Sib sib;
1644276Sgblack@eecs.umich.edu        //Immediate fields
1654182Sgblack@eecs.umich.edu        uint64_t immediate;
1664182Sgblack@eecs.umich.edu        uint64_t displacement;
1674342Sgblack@eecs.umich.edu
1684342Sgblack@eecs.umich.edu        //The effective operand size.
1694342Sgblack@eecs.umich.edu        uint8_t opSize;
1704541Sgblack@eecs.umich.edu        //The effective address size.
1714541Sgblack@eecs.umich.edu        uint8_t addrSize;
1724587Sgblack@eecs.umich.edu        //The effective stack size.
1734587Sgblack@eecs.umich.edu        uint8_t stackSize;
1744569Sgblack@eecs.umich.edu
1754569Sgblack@eecs.umich.edu        //Mode information
1764569Sgblack@eecs.umich.edu        OperatingMode mode;
1774181Sgblack@eecs.umich.edu    };
1784181Sgblack@eecs.umich.edu
1794182Sgblack@eecs.umich.edu    inline static std::ostream &
1804182Sgblack@eecs.umich.edu        operator << (std::ostream & os, const ExtMachInst & emi)
1814182Sgblack@eecs.umich.edu    {
1824276Sgblack@eecs.umich.edu        ccprintf(os, "\n{\n\tleg = %#x,\n\trex = %#x,\n\t"
1834276Sgblack@eecs.umich.edu                     "op = {\n\t\tnum = %d,\n\t\top = %#x,\n\t\t"
1844276Sgblack@eecs.umich.edu                           "prefixA = %#x,\n\t\tprefixB = %#x\n\t},\n\t"
1854276Sgblack@eecs.umich.edu                     "modRM = %#x,\n\tsib = %#x,\n\t"
1864276Sgblack@eecs.umich.edu                     "immediate = %#x,\n\tdisplacement = %#x\n}\n",
1874276Sgblack@eecs.umich.edu                     emi.legacy, (uint8_t)emi.rex,
1884276Sgblack@eecs.umich.edu                     emi.opcode.num, emi.opcode.op,
1894276Sgblack@eecs.umich.edu                     emi.opcode.prefixA, emi.opcode.prefixB,
1904276Sgblack@eecs.umich.edu                     (uint8_t)emi.modRM, (uint8_t)emi.sib,
1914276Sgblack@eecs.umich.edu                     emi.immediate, emi.displacement);
1924182Sgblack@eecs.umich.edu        return os;
1934182Sgblack@eecs.umich.edu    }
1944182Sgblack@eecs.umich.edu
1954182Sgblack@eecs.umich.edu    inline static bool
1964182Sgblack@eecs.umich.edu        operator == (const ExtMachInst &emi1, const ExtMachInst &emi2)
1974181Sgblack@eecs.umich.edu    {
1984334Sgblack@eecs.umich.edu        if(emi1.legacy != emi2.legacy)
1994334Sgblack@eecs.umich.edu            return false;
2004334Sgblack@eecs.umich.edu        if(emi1.rex != emi2.rex)
2014334Sgblack@eecs.umich.edu            return false;
2024334Sgblack@eecs.umich.edu        if(emi1.opcode.num != emi2.opcode.num)
2034334Sgblack@eecs.umich.edu            return false;
2044334Sgblack@eecs.umich.edu        if(emi1.opcode.op != emi2.opcode.op)
2054334Sgblack@eecs.umich.edu            return false;
2064334Sgblack@eecs.umich.edu        if(emi1.opcode.prefixA != emi2.opcode.prefixA)
2074334Sgblack@eecs.umich.edu            return false;
2084334Sgblack@eecs.umich.edu        if(emi1.opcode.prefixB != emi2.opcode.prefixB)
2094334Sgblack@eecs.umich.edu            return false;
2104334Sgblack@eecs.umich.edu        if(emi1.modRM != emi2.modRM)
2114334Sgblack@eecs.umich.edu            return false;
2124334Sgblack@eecs.umich.edu        if(emi1.sib != emi2.sib)
2134334Sgblack@eecs.umich.edu            return false;
2144334Sgblack@eecs.umich.edu        if(emi1.immediate != emi2.immediate)
2154334Sgblack@eecs.umich.edu            return false;
2164334Sgblack@eecs.umich.edu        if(emi1.displacement != emi2.displacement)
2174334Sgblack@eecs.umich.edu            return false;
2184587Sgblack@eecs.umich.edu        if(emi1.mode != emi2.mode)
2194587Sgblack@eecs.umich.edu            return false;
2204587Sgblack@eecs.umich.edu        if(emi1.opSize != emi2.opSize)
2214587Sgblack@eecs.umich.edu            return false;
2224587Sgblack@eecs.umich.edu        if(emi1.addrSize != emi2.addrSize)
2234587Sgblack@eecs.umich.edu            return false;
2244587Sgblack@eecs.umich.edu        if(emi1.stackSize != emi2.stackSize)
2254587Sgblack@eecs.umich.edu            return false;
2264181Sgblack@eecs.umich.edu        return true;
2274181Sgblack@eecs.umich.edu    }
2284122Sgblack@eecs.umich.edu
2294122Sgblack@eecs.umich.edu    typedef uint64_t IntReg;
2304153Sgblack@eecs.umich.edu    //XXX Should this be a 128 bit structure for XMM memory ops?
2314153Sgblack@eecs.umich.edu    typedef uint64_t LargestRead;
2324122Sgblack@eecs.umich.edu    typedef uint64_t MiscReg;
2334122Sgblack@eecs.umich.edu
2344122Sgblack@eecs.umich.edu    //These floating point types are correct for mmx, but not
2354122Sgblack@eecs.umich.edu    //technically for x87 (80 bits) or at all for xmm (128 bits)
2364122Sgblack@eecs.umich.edu    typedef double FloatReg;
2374122Sgblack@eecs.umich.edu    typedef uint64_t FloatRegBits;
2384122Sgblack@eecs.umich.edu    typedef union
2394122Sgblack@eecs.umich.edu    {
2404122Sgblack@eecs.umich.edu        IntReg intReg;
2414122Sgblack@eecs.umich.edu        FloatReg fpReg;
2424122Sgblack@eecs.umich.edu        MiscReg ctrlReg;
2434122Sgblack@eecs.umich.edu    } AnyReg;
2444122Sgblack@eecs.umich.edu
2454122Sgblack@eecs.umich.edu    //XXX This is very hypothetical. X87 instructions would need to
2464122Sgblack@eecs.umich.edu    //change their "context" constantly. It's also not clear how
2474122Sgblack@eecs.umich.edu    //this would be handled as far as out of order execution.
2484122Sgblack@eecs.umich.edu    //Maybe x87 instructions are in order?
2494122Sgblack@eecs.umich.edu    enum RegContextParam
2504122Sgblack@eecs.umich.edu    {
2514122Sgblack@eecs.umich.edu        CONTEXT_X87_TOP
2524122Sgblack@eecs.umich.edu    };
2534122Sgblack@eecs.umich.edu
2544122Sgblack@eecs.umich.edu    typedef int RegContextVal;
2554122Sgblack@eecs.umich.edu
2564122Sgblack@eecs.umich.edu    typedef uint8_t RegIndex;
2574120Sgblack@eecs.umich.edu};
2584120Sgblack@eecs.umich.edu
2594120Sgblack@eecs.umich.edu#endif // __ARCH_X86_TYPES_HH__
260