types.cc revision 7087
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 "base/bitunion.hh" 46#include "base/cprintf.hh" 47#include "base/types.hh" 48 49namespace X86ISA 50{ 51 //This really determines how many bytes are passed to the predecoder. 52 typedef uint64_t MachInst; 53 54 enum Prefixes { 55 NoOverride, 56 ESOverride, 57 CSOverride, 58 SSOverride, 59 DSOverride, 60 FSOverride, 61 GSOverride, 62 RexPrefix, 63 OperandSizeOverride, 64 AddressSizeOverride, 65 Lock, 66 Rep, 67 Repne 68 }; 69 70 BitUnion8(LegacyPrefixVector) 71 Bitfield<7, 4> decodeVal; 72 Bitfield<7> repne; 73 Bitfield<6> rep; 74 Bitfield<5> lock; 75 Bitfield<4> op; 76 Bitfield<3> addr; 77 //There can be only one segment override, so they share the 78 //first 3 bits in the legacyPrefixes bitfield. 79 Bitfield<2,0> seg; 80 EndBitUnion(LegacyPrefixVector) 81 82 BitUnion8(ModRM) 83 Bitfield<7,6> mod; 84 Bitfield<5,3> reg; 85 Bitfield<2,0> rm; 86 EndBitUnion(ModRM) 87 88 BitUnion8(Sib) 89 Bitfield<7,6> scale; 90 Bitfield<5,3> index; 91 Bitfield<2,0> base; 92 EndBitUnion(Sib) 93 94 BitUnion8(Rex) 95 //This bit doesn't mean anything according to the ISA, but in 96 //this implementation, it being set means an REX prefix was present. 97 Bitfield<6> present; 98 Bitfield<3> w; 99 Bitfield<2> r; 100 Bitfield<1> x; 101 Bitfield<0> b; 102 EndBitUnion(Rex) 103 104 BitUnion8(Opcode) 105 Bitfield<7,3> top5; 106 Bitfield<2,0> bottom3; 107 EndBitUnion(Opcode) 108 109 BitUnion8(OperatingMode) 110 Bitfield<3> mode; 111 Bitfield<2,0> submode; 112 EndBitUnion(OperatingMode) 113 114 enum X86Mode { 115 LongMode, 116 LegacyMode 117 }; 118 119 enum X86SubMode { 120 SixtyFourBitMode, 121 CompatabilityMode, 122 ProtectedMode, 123 Virtual8086Mode, 124 RealMode 125 }; 126 127 //The intermediate structure the x86 predecoder returns. 128 struct ExtMachInst 129 { 130 //Prefixes 131 LegacyPrefixVector legacy; 132 Rex rex; 133 //This holds all of the bytes of the opcode 134 struct 135 { 136 //The number of bytes in this opcode. Right now, we ignore that 137 //this can be 3 in some cases 138 uint8_t num; 139 //The first byte detected in a 2+ byte opcode. Should be 0xF0. 140 uint8_t prefixA; 141 //The second byte detected in a 3+ byte opcode. Could be 0x38-0x3F 142 //for some SSE instructions. 3dNow! instructions are handled as 143 //two byte opcodes and then split out further by the immediate 144 //byte. 145 uint8_t prefixB; 146 //The main opcode byte. The highest addressed byte in the opcode. 147 Opcode op; 148 } opcode; 149 //Modifier bytes 150 ModRM modRM; 151 Sib sib; 152 //Immediate fields 153 uint64_t immediate; 154 uint64_t displacement; 155 156 //The effective operand size. 157 uint8_t opSize; 158 //The effective address size. 159 uint8_t addrSize; 160 //The effective stack size. 161 uint8_t stackSize; 162 //The size of the displacement 163 uint8_t dispSize; 164 165 //Mode information 166 OperatingMode mode; 167 }; 168 169 inline static std::ostream & 170 operator << (std::ostream & os, const ExtMachInst & emi) 171 { 172 ccprintf(os, "\n{\n\tleg = %#x,\n\trex = %#x,\n\t" 173 "op = {\n\t\tnum = %d,\n\t\top = %#x,\n\t\t" 174 "prefixA = %#x,\n\t\tprefixB = %#x\n\t},\n\t" 175 "modRM = %#x,\n\tsib = %#x,\n\t" 176 "immediate = %#x,\n\tdisplacement = %#x\n\t" 177 "dispSize = %d}\n", 178 (uint8_t)emi.legacy, (uint8_t)emi.rex, 179 emi.opcode.num, (uint8_t)emi.opcode.op, 180 emi.opcode.prefixA, emi.opcode.prefixB, 181 (uint8_t)emi.modRM, (uint8_t)emi.sib, 182 emi.immediate, emi.displacement, emi.dispSize); 183 return os; 184 } 185 186 inline static bool 187 operator == (const ExtMachInst &emi1, const ExtMachInst &emi2) 188 { 189 if(emi1.legacy != emi2.legacy) 190 return false; 191 if(emi1.rex != emi2.rex) 192 return false; 193 if(emi1.opcode.num != emi2.opcode.num) 194 return false; 195 if(emi1.opcode.op != emi2.opcode.op) 196 return false; 197 if(emi1.opcode.prefixA != emi2.opcode.prefixA) 198 return false; 199 if(emi1.opcode.prefixB != emi2.opcode.prefixB) 200 return false; 201 if(emi1.modRM != emi2.modRM) 202 return false; 203 if(emi1.sib != emi2.sib) 204 return false; 205 if(emi1.immediate != emi2.immediate) 206 return false; 207 if(emi1.displacement != emi2.displacement) 208 return false; 209 if(emi1.mode != emi2.mode) 210 return false; 211 if(emi1.opSize != emi2.opSize) 212 return false; 213 if(emi1.addrSize != emi2.addrSize) 214 return false; 215 if(emi1.stackSize != emi2.stackSize) 216 return false; 217 if(emi1.dispSize != emi2.dispSize) 218 return false; 219 return true; 220 } 221 222 struct CoreSpecific { 223 int core_type; 224 }; 225}; 226 227#endif // __ARCH_X86_TYPES_HH__ 228