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