ldstop.isa revision 4601
14561Sgblack@eecs.umich.edu// Copyright (c) 2007 The Hewlett-Packard Development Company 24561Sgblack@eecs.umich.edu// All rights reserved. 34561Sgblack@eecs.umich.edu// 44561Sgblack@eecs.umich.edu// Redistribution and use of this software in source and binary forms, 54561Sgblack@eecs.umich.edu// with or without modification, are permitted provided that the 64561Sgblack@eecs.umich.edu// following conditions are met: 74561Sgblack@eecs.umich.edu// 84561Sgblack@eecs.umich.edu// The software must be used only for Non-Commercial Use which means any 94561Sgblack@eecs.umich.edu// use which is NOT directed to receiving any direct monetary 104561Sgblack@eecs.umich.edu// compensation for, or commercial advantage from such use. Illustrative 114561Sgblack@eecs.umich.edu// examples of non-commercial use are academic research, personal study, 124561Sgblack@eecs.umich.edu// teaching, education and corporate research & development. 134561Sgblack@eecs.umich.edu// Illustrative examples of commercial use are distributing products for 144561Sgblack@eecs.umich.edu// commercial advantage and providing services using the software for 154561Sgblack@eecs.umich.edu// commercial advantage. 164561Sgblack@eecs.umich.edu// 174561Sgblack@eecs.umich.edu// If you wish to use this software or functionality therein that may be 184561Sgblack@eecs.umich.edu// covered by patents for commercial use, please contact: 194561Sgblack@eecs.umich.edu// Director of Intellectual Property Licensing 204561Sgblack@eecs.umich.edu// Office of Strategy and Technology 214561Sgblack@eecs.umich.edu// Hewlett-Packard Company 224561Sgblack@eecs.umich.edu// 1501 Page Mill Road 234561Sgblack@eecs.umich.edu// Palo Alto, California 94304 244561Sgblack@eecs.umich.edu// 254561Sgblack@eecs.umich.edu// Redistributions of source code must retain the above copyright notice, 264561Sgblack@eecs.umich.edu// this list of conditions and the following disclaimer. Redistributions 274561Sgblack@eecs.umich.edu// in binary form must reproduce the above copyright notice, this list of 284561Sgblack@eecs.umich.edu// conditions and the following disclaimer in the documentation and/or 294561Sgblack@eecs.umich.edu// other materials provided with the distribution. Neither the name of 304561Sgblack@eecs.umich.edu// the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its 314561Sgblack@eecs.umich.edu// contributors may be used to endorse or promote products derived from 324561Sgblack@eecs.umich.edu// this software without specific prior written permission. No right of 334561Sgblack@eecs.umich.edu// sublicense is granted herewith. Derivatives of the software and 344561Sgblack@eecs.umich.edu// output created using the software may be prepared, but only for 354561Sgblack@eecs.umich.edu// Non-Commercial Uses. Derivatives of the software may be shared with 364561Sgblack@eecs.umich.edu// others provided: (i) the others agree to abide by the list of 374561Sgblack@eecs.umich.edu// conditions herein which includes the Non-Commercial Use restrictions; 384561Sgblack@eecs.umich.edu// and (ii) such Derivatives of the software include the above copyright 394561Sgblack@eecs.umich.edu// notice to acknowledge the contribution from this software where 404561Sgblack@eecs.umich.edu// applicable, this list of conditions and the disclaimer below. 414561Sgblack@eecs.umich.edu// 424561Sgblack@eecs.umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 434561Sgblack@eecs.umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 444561Sgblack@eecs.umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 454561Sgblack@eecs.umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 464561Sgblack@eecs.umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 474561Sgblack@eecs.umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 484561Sgblack@eecs.umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 494561Sgblack@eecs.umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 504561Sgblack@eecs.umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 514561Sgblack@eecs.umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 524561Sgblack@eecs.umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 534561Sgblack@eecs.umich.edu// 544561Sgblack@eecs.umich.edu// Authors: Gabe Black 554561Sgblack@eecs.umich.edu 564561Sgblack@eecs.umich.edu////////////////////////////////////////////////////////////////////////// 574561Sgblack@eecs.umich.edu// 584561Sgblack@eecs.umich.edu// LdStOp Microop templates 594561Sgblack@eecs.umich.edu// 604561Sgblack@eecs.umich.edu////////////////////////////////////////////////////////////////////////// 614561Sgblack@eecs.umich.edu 624587Sgblack@eecs.umich.eduoutput header {{ 634587Sgblack@eecs.umich.edu /** 644587Sgblack@eecs.umich.edu * Base class for load and store ops 654587Sgblack@eecs.umich.edu */ 664587Sgblack@eecs.umich.edu class LdStOp : public X86MicroopBase 674561Sgblack@eecs.umich.edu { 684561Sgblack@eecs.umich.edu protected: 694561Sgblack@eecs.umich.edu const uint8_t scale; 704561Sgblack@eecs.umich.edu const RegIndex index; 714561Sgblack@eecs.umich.edu const RegIndex base; 724561Sgblack@eecs.umich.edu const uint64_t disp; 734561Sgblack@eecs.umich.edu const uint8_t segment; 744561Sgblack@eecs.umich.edu const RegIndex data; 754561Sgblack@eecs.umich.edu const uint8_t dataSize; 764561Sgblack@eecs.umich.edu const uint8_t addressSize; 774587Sgblack@eecs.umich.edu 784587Sgblack@eecs.umich.edu //Constructor 794587Sgblack@eecs.umich.edu LdStOp(ExtMachInst _machInst, 804587Sgblack@eecs.umich.edu const char * mnem, const char * _instMnem, 814587Sgblack@eecs.umich.edu bool isMicro, bool isDelayed, bool isFirst, bool isLast, 824587Sgblack@eecs.umich.edu uint8_t _scale, RegIndex _index, RegIndex _base, 834587Sgblack@eecs.umich.edu uint64_t _disp, uint8_t _segment, 844587Sgblack@eecs.umich.edu RegIndex _data, 854587Sgblack@eecs.umich.edu uint8_t _dataSize, uint8_t _addressSize, 864587Sgblack@eecs.umich.edu OpClass __opClass) : 874587Sgblack@eecs.umich.edu X86MicroopBase(machInst, mnem, _instMnem, 884587Sgblack@eecs.umich.edu isMicro, isDelayed, isFirst, isLast, __opClass), 894587Sgblack@eecs.umich.edu scale(_scale), index(_index), base(_base), 904587Sgblack@eecs.umich.edu disp(_disp), segment(_segment), 914587Sgblack@eecs.umich.edu data(_data), 924587Sgblack@eecs.umich.edu dataSize(_dataSize), addressSize(_addressSize) 934587Sgblack@eecs.umich.edu {} 944587Sgblack@eecs.umich.edu 954587Sgblack@eecs.umich.edu std::string generateDisassembly(Addr pc, 964587Sgblack@eecs.umich.edu const SymbolTable *symtab) const; 974587Sgblack@eecs.umich.edu }; 984587Sgblack@eecs.umich.edu}}; 994587Sgblack@eecs.umich.edu 1004587Sgblack@eecs.umich.eduoutput decoder {{ 1014587Sgblack@eecs.umich.edu std::string LdStOp::generateDisassembly(Addr pc, 1024587Sgblack@eecs.umich.edu const SymbolTable *symtab) const 1034587Sgblack@eecs.umich.edu { 1044587Sgblack@eecs.umich.edu std::stringstream response; 1054587Sgblack@eecs.umich.edu 1064587Sgblack@eecs.umich.edu printMnemonic(response, instMnem, mnemonic); 1074587Sgblack@eecs.umich.edu printReg(response, data); 1084587Sgblack@eecs.umich.edu response << ", "; 1094587Sgblack@eecs.umich.edu printSegment(response, segment); 1104587Sgblack@eecs.umich.edu ccprintf(response, ":[%d*", scale); 1114587Sgblack@eecs.umich.edu printReg(response, index); 1124587Sgblack@eecs.umich.edu response << " + "; 1134587Sgblack@eecs.umich.edu printReg(response, base); 1144587Sgblack@eecs.umich.edu ccprintf(response, " + %#x]", disp); 1154587Sgblack@eecs.umich.edu return response.str(); 1164587Sgblack@eecs.umich.edu } 1174587Sgblack@eecs.umich.edu}}; 1184587Sgblack@eecs.umich.edu 1194601Sgblack@eecs.umich.edu// LEA template 1204601Sgblack@eecs.umich.edu 1214601Sgblack@eecs.umich.edudef template MicroLeaExecute {{ 1224601Sgblack@eecs.umich.edu Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, 1234601Sgblack@eecs.umich.edu Trace::InstRecord *traceData) const 1244601Sgblack@eecs.umich.edu { 1254601Sgblack@eecs.umich.edu Fault fault = NoFault; 1264601Sgblack@eecs.umich.edu Addr EA; 1274601Sgblack@eecs.umich.edu 1284601Sgblack@eecs.umich.edu %(op_decl)s; 1294601Sgblack@eecs.umich.edu %(op_rd)s; 1304601Sgblack@eecs.umich.edu %(ea_code)s; 1314601Sgblack@eecs.umich.edu DPRINTF(X86, "%s : %s: The address is %#x\n", instMnem, mnemonic, EA); 1324601Sgblack@eecs.umich.edu 1334601Sgblack@eecs.umich.edu %(code)s; 1344601Sgblack@eecs.umich.edu if(fault == NoFault) 1354601Sgblack@eecs.umich.edu { 1364601Sgblack@eecs.umich.edu %(op_wb)s; 1374601Sgblack@eecs.umich.edu } 1384601Sgblack@eecs.umich.edu 1394601Sgblack@eecs.umich.edu return fault; 1404601Sgblack@eecs.umich.edu } 1414601Sgblack@eecs.umich.edu}}; 1424601Sgblack@eecs.umich.edu 1434601Sgblack@eecs.umich.edudef template MicroLeaDeclare {{ 1444601Sgblack@eecs.umich.edu class %(class_name)s : public %(base_class)s 1454601Sgblack@eecs.umich.edu { 1464601Sgblack@eecs.umich.edu protected: 1474601Sgblack@eecs.umich.edu void buildMe(); 1484601Sgblack@eecs.umich.edu 1494601Sgblack@eecs.umich.edu public: 1504601Sgblack@eecs.umich.edu %(class_name)s(ExtMachInst _machInst, 1514601Sgblack@eecs.umich.edu const char * instMnem, 1524601Sgblack@eecs.umich.edu bool isMicro, bool isDelayed, bool isFirst, bool isLast, 1534601Sgblack@eecs.umich.edu uint8_t _scale, RegIndex _index, RegIndex _base, 1544601Sgblack@eecs.umich.edu uint64_t _disp, uint8_t _segment, 1554601Sgblack@eecs.umich.edu RegIndex _data, 1564601Sgblack@eecs.umich.edu uint8_t _dataSize, uint8_t _addressSize); 1574601Sgblack@eecs.umich.edu 1584601Sgblack@eecs.umich.edu %(class_name)s(ExtMachInst _machInst, 1594601Sgblack@eecs.umich.edu const char * instMnem, 1604601Sgblack@eecs.umich.edu uint8_t _scale, RegIndex _index, RegIndex _base, 1614601Sgblack@eecs.umich.edu uint64_t _disp, uint8_t _segment, 1624601Sgblack@eecs.umich.edu RegIndex _data, 1634601Sgblack@eecs.umich.edu uint8_t _dataSize, uint8_t _addressSize); 1644601Sgblack@eecs.umich.edu 1654601Sgblack@eecs.umich.edu %(BasicExecDeclare)s 1664601Sgblack@eecs.umich.edu }; 1674601Sgblack@eecs.umich.edu}}; 1684601Sgblack@eecs.umich.edu 1694601Sgblack@eecs.umich.edu// Load templates 1704601Sgblack@eecs.umich.edu 1714587Sgblack@eecs.umich.edudef template MicroLoadExecute {{ 1724587Sgblack@eecs.umich.edu Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, 1734587Sgblack@eecs.umich.edu Trace::InstRecord *traceData) const 1744587Sgblack@eecs.umich.edu { 1754587Sgblack@eecs.umich.edu Fault fault = NoFault; 1764587Sgblack@eecs.umich.edu Addr EA; 1774587Sgblack@eecs.umich.edu 1784587Sgblack@eecs.umich.edu %(op_decl)s; 1794587Sgblack@eecs.umich.edu %(op_rd)s; 1804587Sgblack@eecs.umich.edu %(ea_code)s; 1814587Sgblack@eecs.umich.edu DPRINTF(X86, "%s : %s: The address is %#x\n", instMnem, mnemonic, EA); 1824587Sgblack@eecs.umich.edu 1834587Sgblack@eecs.umich.edu fault = xc->read(EA, (%(mem_acc_type)s%(mem_acc_size)s_t&)Mem, 0); 1844587Sgblack@eecs.umich.edu if(fault == NoFault) 1854587Sgblack@eecs.umich.edu { 1864587Sgblack@eecs.umich.edu %(code)s; 1874587Sgblack@eecs.umich.edu } 1884587Sgblack@eecs.umich.edu if(fault == NoFault) 1894587Sgblack@eecs.umich.edu { 1904587Sgblack@eecs.umich.edu %(op_wb)s; 1914587Sgblack@eecs.umich.edu } 1924587Sgblack@eecs.umich.edu 1934587Sgblack@eecs.umich.edu return fault; 1944587Sgblack@eecs.umich.edu } 1954587Sgblack@eecs.umich.edu}}; 1964587Sgblack@eecs.umich.edu 1974587Sgblack@eecs.umich.edudef template MicroLoadInitiateAcc {{ 1984587Sgblack@eecs.umich.edu Fault %(class_name)s::initiateAcc(%(CPU_exec_context)s * xc, 1994587Sgblack@eecs.umich.edu Trace::InstRecord * traceData) const 2004587Sgblack@eecs.umich.edu { 2014587Sgblack@eecs.umich.edu Fault fault = NoFault; 2024587Sgblack@eecs.umich.edu Addr EA; 2034587Sgblack@eecs.umich.edu 2044587Sgblack@eecs.umich.edu %(op_decl)s; 2054587Sgblack@eecs.umich.edu %(op_rd)s; 2064587Sgblack@eecs.umich.edu %(ea_code)s; 2074587Sgblack@eecs.umich.edu DPRINTF(X86, "%s : %s: The address is %#x\n", instMnem, mnemonic, EA); 2084587Sgblack@eecs.umich.edu 2094587Sgblack@eecs.umich.edu fault = xc->read(EA, (%(mem_acc_type)s%(mem_acc_size)s_t&)Mem, 0); 2104587Sgblack@eecs.umich.edu 2114587Sgblack@eecs.umich.edu return fault; 2124587Sgblack@eecs.umich.edu } 2134587Sgblack@eecs.umich.edu}}; 2144587Sgblack@eecs.umich.edu 2154587Sgblack@eecs.umich.edudef template MicroLoadCompleteAcc {{ 2164587Sgblack@eecs.umich.edu Fault %(class_name)s::completeAcc(PacketPtr pkt, 2174587Sgblack@eecs.umich.edu %(CPU_exec_context)s * xc, 2184587Sgblack@eecs.umich.edu Trace::InstRecord * traceData) const 2194587Sgblack@eecs.umich.edu { 2204587Sgblack@eecs.umich.edu Fault fault = NoFault; 2214587Sgblack@eecs.umich.edu 2224587Sgblack@eecs.umich.edu %(op_decl)s; 2234587Sgblack@eecs.umich.edu %(op_rd)s; 2244587Sgblack@eecs.umich.edu 2254587Sgblack@eecs.umich.edu Mem = pkt->get<typeof(Mem)>(); 2264587Sgblack@eecs.umich.edu %(code)s; 2274587Sgblack@eecs.umich.edu 2284587Sgblack@eecs.umich.edu if(fault == NoFault) 2294587Sgblack@eecs.umich.edu { 2304587Sgblack@eecs.umich.edu %(op_wb)s; 2314587Sgblack@eecs.umich.edu } 2324587Sgblack@eecs.umich.edu 2334587Sgblack@eecs.umich.edu return fault; 2344587Sgblack@eecs.umich.edu } 2354587Sgblack@eecs.umich.edu}}; 2364587Sgblack@eecs.umich.edu 2374587Sgblack@eecs.umich.edu// Store templates 2384587Sgblack@eecs.umich.edu 2394587Sgblack@eecs.umich.edudef template MicroStoreExecute {{ 2404587Sgblack@eecs.umich.edu Fault %(class_name)s::execute(%(CPU_exec_context)s * xc, 2414587Sgblack@eecs.umich.edu Trace::InstRecord *traceData) const 2424587Sgblack@eecs.umich.edu { 2434587Sgblack@eecs.umich.edu Fault fault = NoFault; 2444587Sgblack@eecs.umich.edu 2454587Sgblack@eecs.umich.edu Addr EA; 2464587Sgblack@eecs.umich.edu %(op_decl)s; 2474587Sgblack@eecs.umich.edu %(op_rd)s; 2484587Sgblack@eecs.umich.edu %(ea_code)s; 2494587Sgblack@eecs.umich.edu DPRINTF(X86, "%s : %s: The address is %#x\n", instMnem, mnemonic, EA); 2504587Sgblack@eecs.umich.edu 2514587Sgblack@eecs.umich.edu %(code)s; 2524587Sgblack@eecs.umich.edu 2534587Sgblack@eecs.umich.edu if(fault == NoFault) 2544587Sgblack@eecs.umich.edu { 2554587Sgblack@eecs.umich.edu fault = xc->write((%(mem_acc_type)s%(mem_acc_size)s_t)Mem, 2564587Sgblack@eecs.umich.edu EA, 0, 0); 2574587Sgblack@eecs.umich.edu } 2584587Sgblack@eecs.umich.edu if(fault == NoFault) 2594587Sgblack@eecs.umich.edu { 2604587Sgblack@eecs.umich.edu %(op_wb)s; 2614587Sgblack@eecs.umich.edu } 2624587Sgblack@eecs.umich.edu 2634587Sgblack@eecs.umich.edu return fault; 2644587Sgblack@eecs.umich.edu } 2654587Sgblack@eecs.umich.edu}}; 2664587Sgblack@eecs.umich.edu 2674587Sgblack@eecs.umich.edudef template MicroStoreInitiateAcc {{ 2684587Sgblack@eecs.umich.edu Fault %(class_name)s::initiateAcc(%(CPU_exec_context)s * xc, 2694587Sgblack@eecs.umich.edu Trace::InstRecord * traceData) const 2704587Sgblack@eecs.umich.edu { 2714587Sgblack@eecs.umich.edu Fault fault = NoFault; 2724587Sgblack@eecs.umich.edu 2734587Sgblack@eecs.umich.edu Addr EA; 2744587Sgblack@eecs.umich.edu %(op_decl)s; 2754587Sgblack@eecs.umich.edu %(op_rd)s; 2764587Sgblack@eecs.umich.edu %(ea_code)s; 2774587Sgblack@eecs.umich.edu DPRINTF(X86, "%s : %s: The address is %#x\n", instMnem, mnemonic, EA); 2784587Sgblack@eecs.umich.edu 2794587Sgblack@eecs.umich.edu %(code)s; 2804587Sgblack@eecs.umich.edu 2814587Sgblack@eecs.umich.edu if(fault == NoFault) 2824587Sgblack@eecs.umich.edu { 2834587Sgblack@eecs.umich.edu fault = xc->write((%(mem_acc_type)s%(mem_acc_size)s_t)Mem, 2844587Sgblack@eecs.umich.edu EA, 0, 0); 2854587Sgblack@eecs.umich.edu } 2864587Sgblack@eecs.umich.edu if(fault == NoFault) 2874587Sgblack@eecs.umich.edu { 2884587Sgblack@eecs.umich.edu %(op_wb)s; 2894587Sgblack@eecs.umich.edu } 2904587Sgblack@eecs.umich.edu return fault; 2914587Sgblack@eecs.umich.edu } 2924587Sgblack@eecs.umich.edu}}; 2934587Sgblack@eecs.umich.edu 2944587Sgblack@eecs.umich.edudef template MicroStoreCompleteAcc {{ 2954587Sgblack@eecs.umich.edu Fault %(class_name)s::completeAcc(PacketPtr, %(CPU_exec_context)s * xc, 2964587Sgblack@eecs.umich.edu Trace::InstRecord * traceData) const 2974587Sgblack@eecs.umich.edu { 2984587Sgblack@eecs.umich.edu return NoFault; 2994587Sgblack@eecs.umich.edu } 3004587Sgblack@eecs.umich.edu}}; 3014587Sgblack@eecs.umich.edu 3024587Sgblack@eecs.umich.edu// Common templates 3034587Sgblack@eecs.umich.edu 3044587Sgblack@eecs.umich.edu//This delcares the initiateAcc function in memory operations 3054587Sgblack@eecs.umich.edudef template InitiateAccDeclare {{ 3064587Sgblack@eecs.umich.edu Fault initiateAcc(%(CPU_exec_context)s *, Trace::InstRecord *) const; 3074587Sgblack@eecs.umich.edu}}; 3084587Sgblack@eecs.umich.edu 3094587Sgblack@eecs.umich.edu//This declares the completeAcc function in memory operations 3104587Sgblack@eecs.umich.edudef template CompleteAccDeclare {{ 3114587Sgblack@eecs.umich.edu Fault completeAcc(PacketPtr, %(CPU_exec_context)s *, Trace::InstRecord *) const; 3124587Sgblack@eecs.umich.edu}}; 3134587Sgblack@eecs.umich.edu 3144587Sgblack@eecs.umich.edudef template MicroLdStOpDeclare {{ 3154587Sgblack@eecs.umich.edu class %(class_name)s : public %(base_class)s 3164587Sgblack@eecs.umich.edu { 3174587Sgblack@eecs.umich.edu protected: 3184561Sgblack@eecs.umich.edu void buildMe(); 3194561Sgblack@eecs.umich.edu 3204561Sgblack@eecs.umich.edu public: 3214561Sgblack@eecs.umich.edu %(class_name)s(ExtMachInst _machInst, 3224561Sgblack@eecs.umich.edu const char * instMnem, 3234561Sgblack@eecs.umich.edu bool isMicro, bool isDelayed, bool isFirst, bool isLast, 3244561Sgblack@eecs.umich.edu uint8_t _scale, RegIndex _index, RegIndex _base, 3254561Sgblack@eecs.umich.edu uint64_t _disp, uint8_t _segment, 3264561Sgblack@eecs.umich.edu RegIndex _data, 3274561Sgblack@eecs.umich.edu uint8_t _dataSize, uint8_t _addressSize); 3284561Sgblack@eecs.umich.edu 3294561Sgblack@eecs.umich.edu %(class_name)s(ExtMachInst _machInst, 3304561Sgblack@eecs.umich.edu const char * instMnem, 3314561Sgblack@eecs.umich.edu uint8_t _scale, RegIndex _index, RegIndex _base, 3324561Sgblack@eecs.umich.edu uint64_t _disp, uint8_t _segment, 3334561Sgblack@eecs.umich.edu RegIndex _data, 3344561Sgblack@eecs.umich.edu uint8_t _dataSize, uint8_t _addressSize); 3354561Sgblack@eecs.umich.edu 3364561Sgblack@eecs.umich.edu %(BasicExecDeclare)s 3374587Sgblack@eecs.umich.edu 3384587Sgblack@eecs.umich.edu %(InitiateAccDeclare)s 3394587Sgblack@eecs.umich.edu 3404587Sgblack@eecs.umich.edu %(CompleteAccDeclare)s 3414561Sgblack@eecs.umich.edu }; 3424561Sgblack@eecs.umich.edu}}; 3434561Sgblack@eecs.umich.edu 3444561Sgblack@eecs.umich.edudef template MicroLdStOpConstructor {{ 3454561Sgblack@eecs.umich.edu 3464561Sgblack@eecs.umich.edu inline void %(class_name)s::buildMe() 3474561Sgblack@eecs.umich.edu { 3484561Sgblack@eecs.umich.edu %(constructor)s; 3494561Sgblack@eecs.umich.edu } 3504561Sgblack@eecs.umich.edu 3514561Sgblack@eecs.umich.edu inline %(class_name)s::%(class_name)s( 3524561Sgblack@eecs.umich.edu ExtMachInst machInst, const char * instMnem, 3534561Sgblack@eecs.umich.edu uint8_t _scale, RegIndex _index, RegIndex _base, 3544561Sgblack@eecs.umich.edu uint64_t _disp, uint8_t _segment, 3554561Sgblack@eecs.umich.edu RegIndex _data, 3564561Sgblack@eecs.umich.edu uint8_t _dataSize, uint8_t _addressSize) : 3574561Sgblack@eecs.umich.edu %(base_class)s(machInst, "%(mnemonic)s", instMnem, 3584587Sgblack@eecs.umich.edu false, false, false, false, 3594587Sgblack@eecs.umich.edu _scale, _index, _base, 3604587Sgblack@eecs.umich.edu _disp, _segment, _data, 3614587Sgblack@eecs.umich.edu _dataSize, _addressSize, %(op_class)s) 3624561Sgblack@eecs.umich.edu { 3634561Sgblack@eecs.umich.edu buildMe(); 3644561Sgblack@eecs.umich.edu } 3654561Sgblack@eecs.umich.edu 3664561Sgblack@eecs.umich.edu inline %(class_name)s::%(class_name)s( 3674561Sgblack@eecs.umich.edu ExtMachInst machInst, const char * instMnem, 3684561Sgblack@eecs.umich.edu bool isMicro, bool isDelayed, bool isFirst, bool isLast, 3694561Sgblack@eecs.umich.edu uint8_t _scale, RegIndex _index, RegIndex _base, 3704587Sgblack@eecs.umich.edu uint64_t _disp, uint8_t _segment, 3714587Sgblack@eecs.umich.edu RegIndex _data, 3724587Sgblack@eecs.umich.edu uint8_t _dataSize, uint8_t _addressSize) : 3734561Sgblack@eecs.umich.edu %(base_class)s(machInst, "%(mnemonic)s", instMnem, 3744587Sgblack@eecs.umich.edu isMicro, isDelayed, isFirst, isLast, 3754587Sgblack@eecs.umich.edu _scale, _index, _base, 3764587Sgblack@eecs.umich.edu _disp, _segment, _data, 3774587Sgblack@eecs.umich.edu _dataSize, _addressSize, %(op_class)s) 3784561Sgblack@eecs.umich.edu { 3794561Sgblack@eecs.umich.edu buildMe(); 3804561Sgblack@eecs.umich.edu } 3814561Sgblack@eecs.umich.edu}}; 3824561Sgblack@eecs.umich.edu 3834587Sgblack@eecs.umich.edulet {{ 3844587Sgblack@eecs.umich.edu class LdStOp(X86Microop): 3854587Sgblack@eecs.umich.edu def __init__(self, data, segment, addr, disp): 3864587Sgblack@eecs.umich.edu self.data = data 3874587Sgblack@eecs.umich.edu [self.scale, self.index, self.base] = addr 3884587Sgblack@eecs.umich.edu self.disp = disp 3894587Sgblack@eecs.umich.edu self.segment = segment 3904587Sgblack@eecs.umich.edu self.dataSize = "env.dataSize" 3914587Sgblack@eecs.umich.edu self.addressSize = "env.addressSize" 3924587Sgblack@eecs.umich.edu 3934587Sgblack@eecs.umich.edu def getAllocator(self, *microFlags): 3944587Sgblack@eecs.umich.edu allocator = '''new %(class_name)s(machInst, mnemonic 3954587Sgblack@eecs.umich.edu %(flags)s, %(scale)s, %(index)s, %(base)s, 3964587Sgblack@eecs.umich.edu %(disp)s, %(segment)s, %(data)s, 3974587Sgblack@eecs.umich.edu %(dataSize)s, %(addressSize)s)''' % { 3984587Sgblack@eecs.umich.edu "class_name" : self.className, 3994587Sgblack@eecs.umich.edu "flags" : self.microFlagsText(microFlags), 4004587Sgblack@eecs.umich.edu "scale" : self.scale, "index" : self.index, 4014587Sgblack@eecs.umich.edu "base" : self.base, 4024587Sgblack@eecs.umich.edu "disp" : self.disp, 4034587Sgblack@eecs.umich.edu "segment" : self.segment, "data" : self.data, 4044587Sgblack@eecs.umich.edu "dataSize" : self.dataSize, "addressSize" : self.addressSize} 4054587Sgblack@eecs.umich.edu return allocator 4064587Sgblack@eecs.umich.edu}}; 4074587Sgblack@eecs.umich.edu 4084587Sgblack@eecs.umich.edulet {{ 4094587Sgblack@eecs.umich.edu 4104587Sgblack@eecs.umich.edu # Make these empty strings so that concatenating onto 4114587Sgblack@eecs.umich.edu # them will always work. 4124587Sgblack@eecs.umich.edu header_output = "" 4134587Sgblack@eecs.umich.edu decoder_output = "" 4144587Sgblack@eecs.umich.edu exec_output = "" 4154587Sgblack@eecs.umich.edu 4164587Sgblack@eecs.umich.edu calculateEA = "EA = scale * Index + Base + disp;" 4174587Sgblack@eecs.umich.edu 4184587Sgblack@eecs.umich.edu def defineMicroLoadOp(mnemonic, code): 4194587Sgblack@eecs.umich.edu global header_output 4204587Sgblack@eecs.umich.edu global decoder_output 4214587Sgblack@eecs.umich.edu global exec_output 4224587Sgblack@eecs.umich.edu global microopClasses 4234587Sgblack@eecs.umich.edu Name = mnemonic 4244587Sgblack@eecs.umich.edu name = mnemonic.lower() 4254587Sgblack@eecs.umich.edu 4264587Sgblack@eecs.umich.edu # Build up the all register version of this micro op 4274587Sgblack@eecs.umich.edu iop = InstObjParams(name, Name, 'LdStOp', 4284587Sgblack@eecs.umich.edu {"code": code, "ea_code": calculateEA}) 4294587Sgblack@eecs.umich.edu header_output += MicroLdStOpDeclare.subst(iop) 4304587Sgblack@eecs.umich.edu decoder_output += MicroLdStOpConstructor.subst(iop) 4314587Sgblack@eecs.umich.edu exec_output += MicroLoadExecute.subst(iop) 4324587Sgblack@eecs.umich.edu exec_output += MicroLoadInitiateAcc.subst(iop) 4334587Sgblack@eecs.umich.edu exec_output += MicroLoadCompleteAcc.subst(iop) 4344587Sgblack@eecs.umich.edu 4354587Sgblack@eecs.umich.edu class LoadOp(LdStOp): 4364587Sgblack@eecs.umich.edu def __init__(self, data, segment, addr, disp = 0): 4374587Sgblack@eecs.umich.edu super(LoadOp, self).__init__(data, segment, addr, disp) 4384587Sgblack@eecs.umich.edu self.className = Name 4394587Sgblack@eecs.umich.edu self.mnemonic = name 4404587Sgblack@eecs.umich.edu 4414587Sgblack@eecs.umich.edu microopClasses[name] = LoadOp 4424587Sgblack@eecs.umich.edu 4434587Sgblack@eecs.umich.edu defineMicroLoadOp('Ld', 'Data = merge(Data, Mem, dataSize);') 4444587Sgblack@eecs.umich.edu 4454587Sgblack@eecs.umich.edu def defineMicroStoreOp(mnemonic, code): 4464587Sgblack@eecs.umich.edu global header_output 4474587Sgblack@eecs.umich.edu global decoder_output 4484587Sgblack@eecs.umich.edu global exec_output 4494587Sgblack@eecs.umich.edu global microopClasses 4504587Sgblack@eecs.umich.edu Name = mnemonic 4514587Sgblack@eecs.umich.edu name = mnemonic.lower() 4524587Sgblack@eecs.umich.edu 4534587Sgblack@eecs.umich.edu # Build up the all register version of this micro op 4544587Sgblack@eecs.umich.edu iop = InstObjParams(name, Name, 'LdStOp', 4554587Sgblack@eecs.umich.edu {"code": code, "ea_code": calculateEA}) 4564587Sgblack@eecs.umich.edu header_output += MicroLdStOpDeclare.subst(iop) 4574587Sgblack@eecs.umich.edu decoder_output += MicroLdStOpConstructor.subst(iop) 4584587Sgblack@eecs.umich.edu exec_output += MicroStoreExecute.subst(iop) 4594587Sgblack@eecs.umich.edu exec_output += MicroStoreInitiateAcc.subst(iop) 4604587Sgblack@eecs.umich.edu exec_output += MicroStoreCompleteAcc.subst(iop) 4614587Sgblack@eecs.umich.edu 4624587Sgblack@eecs.umich.edu class StoreOp(LdStOp): 4634601Sgblack@eecs.umich.edu def __init__(self, data, segment, addr, disp = 0): 4644601Sgblack@eecs.umich.edu super(LoadOp, self).__init__(data, segment, addr, disp) 4654587Sgblack@eecs.umich.edu self.className = Name 4664587Sgblack@eecs.umich.edu self.mnemonic = name 4674587Sgblack@eecs.umich.edu 4684587Sgblack@eecs.umich.edu microopClasses[name] = StoreOp 4694587Sgblack@eecs.umich.edu 4704587Sgblack@eecs.umich.edu defineMicroLoadOp('St', 'Mem = Data;') 4714601Sgblack@eecs.umich.edu 4724601Sgblack@eecs.umich.edu iop = InstObjParams("lea", "Lea", 'LdStOp', 4734601Sgblack@eecs.umich.edu {"code": "Data = merge(Data, EA, dataSize);", "ea_code": calculateEA}) 4744601Sgblack@eecs.umich.edu header_output += MicroLeaDeclare.subst(iop) 4754601Sgblack@eecs.umich.edu decoder_output += MicroLdStOpConstructor.subst(iop) 4764601Sgblack@eecs.umich.edu exec_output += MicroLeaExecute.subst(iop) 4774601Sgblack@eecs.umich.edu 4784601Sgblack@eecs.umich.edu class LeaOp(LdStOp): 4794601Sgblack@eecs.umich.edu def __init__(self, data, segment, addr, disp = 0): 4804601Sgblack@eecs.umich.edu super(LeaOp, self).__init__(data, segment, addr, disp) 4814601Sgblack@eecs.umich.edu self.className = "Lea" 4824601Sgblack@eecs.umich.edu self.mnemonic = "lea" 4834601Sgblack@eecs.umich.edu 4844601Sgblack@eecs.umich.edu microopClasses["lea"] = LeaOp 4854587Sgblack@eecs.umich.edu}}; 4864587Sgblack@eecs.umich.edu 487