ldstop.isa revision 8432
17087Snate@binkert.org// Copyright (c) 2007-2008 The Hewlett-Packard Development Company 27087Snate@binkert.org// All rights reserved. 37087Snate@binkert.org// 47087Snate@binkert.org// The license below extends only to copyright in the software and shall 57087Snate@binkert.org// not be construed as granting a license to any other intellectual 67087Snate@binkert.org// property including but not limited to intellectual property relating 77087Snate@binkert.org// to a hardware implementation of the functionality of the software 87087Snate@binkert.org// licensed hereunder. You may use the software subject to the license 97087Snate@binkert.org// terms below provided that you ensure that this notice is replicated 107087Snate@binkert.org// unmodified and in its entirety in all distributions of the software, 117087Snate@binkert.org// modified or unmodified, in source code or in binary form. 127087Snate@binkert.org// 135359Sgblack@eecs.umich.edu// Copyright (c) 2008 The Regents of The University of Michigan 145359Sgblack@eecs.umich.edu// All rights reserved. 155359Sgblack@eecs.umich.edu// 165359Sgblack@eecs.umich.edu// Redistribution and use in source and binary forms, with or without 175359Sgblack@eecs.umich.edu// modification, are permitted provided that the following conditions are 185359Sgblack@eecs.umich.edu// met: redistributions of source code must retain the above copyright 195359Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer; 205359Sgblack@eecs.umich.edu// redistributions in binary form must reproduce the above copyright 215359Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer in the 225359Sgblack@eecs.umich.edu// documentation and/or other materials provided with the distribution; 235359Sgblack@eecs.umich.edu// neither the name of the copyright holders nor the names of its 245359Sgblack@eecs.umich.edu// contributors may be used to endorse or promote products derived from 255359Sgblack@eecs.umich.edu// this software without specific prior written permission. 265359Sgblack@eecs.umich.edu// 275359Sgblack@eecs.umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 285359Sgblack@eecs.umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 295359Sgblack@eecs.umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 305359Sgblack@eecs.umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 315359Sgblack@eecs.umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 325359Sgblack@eecs.umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 335359Sgblack@eecs.umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 345359Sgblack@eecs.umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 355359Sgblack@eecs.umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 365359Sgblack@eecs.umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 375359Sgblack@eecs.umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 385359Sgblack@eecs.umich.edu// 395359Sgblack@eecs.umich.edu// Authors: Gabe Black 405359Sgblack@eecs.umich.edu 414561Sgblack@eecs.umich.edu////////////////////////////////////////////////////////////////////////// 424561Sgblack@eecs.umich.edu// 434561Sgblack@eecs.umich.edu// LdStOp Microop templates 444561Sgblack@eecs.umich.edu// 454561Sgblack@eecs.umich.edu////////////////////////////////////////////////////////////////////////// 464561Sgblack@eecs.umich.edu 474601Sgblack@eecs.umich.edu// LEA template 484601Sgblack@eecs.umich.edu 494601Sgblack@eecs.umich.edudef template MicroLeaExecute {{ 504601Sgblack@eecs.umich.edu Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, 514601Sgblack@eecs.umich.edu Trace::InstRecord *traceData) const 524601Sgblack@eecs.umich.edu { 534601Sgblack@eecs.umich.edu Fault fault = NoFault; 544601Sgblack@eecs.umich.edu Addr EA; 554601Sgblack@eecs.umich.edu 564601Sgblack@eecs.umich.edu %(op_decl)s; 574601Sgblack@eecs.umich.edu %(op_rd)s; 584601Sgblack@eecs.umich.edu %(ea_code)s; 594601Sgblack@eecs.umich.edu DPRINTF(X86, "%s : %s: The address is %#x\n", instMnem, mnemonic, EA); 604601Sgblack@eecs.umich.edu 614601Sgblack@eecs.umich.edu %(code)s; 624601Sgblack@eecs.umich.edu if(fault == NoFault) 634601Sgblack@eecs.umich.edu { 644601Sgblack@eecs.umich.edu %(op_wb)s; 654601Sgblack@eecs.umich.edu } 664601Sgblack@eecs.umich.edu 674601Sgblack@eecs.umich.edu return fault; 684601Sgblack@eecs.umich.edu } 694601Sgblack@eecs.umich.edu}}; 704601Sgblack@eecs.umich.edu 714601Sgblack@eecs.umich.edudef template MicroLeaDeclare {{ 724601Sgblack@eecs.umich.edu class %(class_name)s : public %(base_class)s 734601Sgblack@eecs.umich.edu { 744601Sgblack@eecs.umich.edu public: 754601Sgblack@eecs.umich.edu %(class_name)s(ExtMachInst _machInst, 767620Sgblack@eecs.umich.edu const char * instMnem, uint64_t setFlags, 776345Sgblack@eecs.umich.edu uint8_t _scale, InstRegIndex _index, InstRegIndex _base, 786345Sgblack@eecs.umich.edu uint64_t _disp, InstRegIndex _segment, 796345Sgblack@eecs.umich.edu InstRegIndex _data, 805912Sgblack@eecs.umich.edu uint8_t _dataSize, uint8_t _addressSize, 815912Sgblack@eecs.umich.edu Request::FlagsType _memFlags); 824601Sgblack@eecs.umich.edu 834601Sgblack@eecs.umich.edu %(BasicExecDeclare)s 844601Sgblack@eecs.umich.edu }; 854601Sgblack@eecs.umich.edu}}; 864601Sgblack@eecs.umich.edu 874601Sgblack@eecs.umich.edu// Load templates 884601Sgblack@eecs.umich.edu 894587Sgblack@eecs.umich.edudef template MicroLoadExecute {{ 904587Sgblack@eecs.umich.edu Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, 914587Sgblack@eecs.umich.edu Trace::InstRecord *traceData) const 924587Sgblack@eecs.umich.edu { 934587Sgblack@eecs.umich.edu Fault fault = NoFault; 944587Sgblack@eecs.umich.edu Addr EA; 954587Sgblack@eecs.umich.edu 964587Sgblack@eecs.umich.edu %(op_decl)s; 974587Sgblack@eecs.umich.edu %(op_rd)s; 984587Sgblack@eecs.umich.edu %(ea_code)s; 994587Sgblack@eecs.umich.edu DPRINTF(X86, "%s : %s: The address is %#x\n", instMnem, mnemonic, EA); 1004587Sgblack@eecs.umich.edu 1015912Sgblack@eecs.umich.edu fault = read(xc, EA, Mem, memFlags); 1024720Sgblack@eecs.umich.edu 1035920Sgblack@eecs.umich.edu if (fault == NoFault) { 1044587Sgblack@eecs.umich.edu %(code)s; 1056736Sgblack@eecs.umich.edu } else if (memFlags & Request::PREFETCH) { 1065920Sgblack@eecs.umich.edu // For prefetches, ignore any faults/exceptions. 1075920Sgblack@eecs.umich.edu return NoFault; 1084587Sgblack@eecs.umich.edu } 1094587Sgblack@eecs.umich.edu if(fault == NoFault) 1104587Sgblack@eecs.umich.edu { 1114587Sgblack@eecs.umich.edu %(op_wb)s; 1124587Sgblack@eecs.umich.edu } 1134587Sgblack@eecs.umich.edu 1144587Sgblack@eecs.umich.edu return fault; 1154587Sgblack@eecs.umich.edu } 1164587Sgblack@eecs.umich.edu}}; 1174587Sgblack@eecs.umich.edu 1184587Sgblack@eecs.umich.edudef template MicroLoadInitiateAcc {{ 1194587Sgblack@eecs.umich.edu Fault %(class_name)s::initiateAcc(%(CPU_exec_context)s * xc, 1204587Sgblack@eecs.umich.edu Trace::InstRecord * traceData) const 1214587Sgblack@eecs.umich.edu { 1224587Sgblack@eecs.umich.edu Fault fault = NoFault; 1234587Sgblack@eecs.umich.edu Addr EA; 1244587Sgblack@eecs.umich.edu 1254587Sgblack@eecs.umich.edu %(op_decl)s; 1264587Sgblack@eecs.umich.edu %(op_rd)s; 1274587Sgblack@eecs.umich.edu %(ea_code)s; 1284587Sgblack@eecs.umich.edu DPRINTF(X86, "%s : %s: The address is %#x\n", instMnem, mnemonic, EA); 1294587Sgblack@eecs.umich.edu 1305912Sgblack@eecs.umich.edu fault = read(xc, EA, Mem, memFlags); 1314587Sgblack@eecs.umich.edu 1324587Sgblack@eecs.umich.edu return fault; 1334587Sgblack@eecs.umich.edu } 1344587Sgblack@eecs.umich.edu}}; 1354587Sgblack@eecs.umich.edu 1364587Sgblack@eecs.umich.edudef template MicroLoadCompleteAcc {{ 1374587Sgblack@eecs.umich.edu Fault %(class_name)s::completeAcc(PacketPtr pkt, 1384587Sgblack@eecs.umich.edu %(CPU_exec_context)s * xc, 1394587Sgblack@eecs.umich.edu Trace::InstRecord * traceData) const 1404587Sgblack@eecs.umich.edu { 1414587Sgblack@eecs.umich.edu Fault fault = NoFault; 1424587Sgblack@eecs.umich.edu 1434587Sgblack@eecs.umich.edu %(op_decl)s; 1444587Sgblack@eecs.umich.edu %(op_rd)s; 1454587Sgblack@eecs.umich.edu 1465727Sgblack@eecs.umich.edu Mem = get(pkt); 1475002Sgblack@eecs.umich.edu 1484587Sgblack@eecs.umich.edu %(code)s; 1494587Sgblack@eecs.umich.edu 1504587Sgblack@eecs.umich.edu if(fault == NoFault) 1514587Sgblack@eecs.umich.edu { 1524587Sgblack@eecs.umich.edu %(op_wb)s; 1534587Sgblack@eecs.umich.edu } 1544587Sgblack@eecs.umich.edu 1554587Sgblack@eecs.umich.edu return fault; 1564587Sgblack@eecs.umich.edu } 1574587Sgblack@eecs.umich.edu}}; 1584587Sgblack@eecs.umich.edu 1594587Sgblack@eecs.umich.edu// Store templates 1604587Sgblack@eecs.umich.edu 1614587Sgblack@eecs.umich.edudef template MicroStoreExecute {{ 1624587Sgblack@eecs.umich.edu Fault %(class_name)s::execute(%(CPU_exec_context)s * xc, 1634587Sgblack@eecs.umich.edu Trace::InstRecord *traceData) const 1644587Sgblack@eecs.umich.edu { 1654587Sgblack@eecs.umich.edu Fault fault = NoFault; 1664587Sgblack@eecs.umich.edu 1674587Sgblack@eecs.umich.edu Addr EA; 1684587Sgblack@eecs.umich.edu %(op_decl)s; 1694587Sgblack@eecs.umich.edu %(op_rd)s; 1704587Sgblack@eecs.umich.edu %(ea_code)s; 1714587Sgblack@eecs.umich.edu DPRINTF(X86, "%s : %s: The address is %#x\n", instMnem, mnemonic, EA); 1724587Sgblack@eecs.umich.edu 1734587Sgblack@eecs.umich.edu %(code)s; 1744587Sgblack@eecs.umich.edu 1754587Sgblack@eecs.umich.edu if(fault == NoFault) 1764587Sgblack@eecs.umich.edu { 1775912Sgblack@eecs.umich.edu fault = write(xc, Mem, EA, memFlags); 1784767Sgblack@eecs.umich.edu if(fault == NoFault) 1794720Sgblack@eecs.umich.edu { 1804767Sgblack@eecs.umich.edu %(op_wb)s; 1814720Sgblack@eecs.umich.edu } 1824587Sgblack@eecs.umich.edu } 1834587Sgblack@eecs.umich.edu 1844587Sgblack@eecs.umich.edu return fault; 1854587Sgblack@eecs.umich.edu } 1864587Sgblack@eecs.umich.edu}}; 1874587Sgblack@eecs.umich.edu 1884587Sgblack@eecs.umich.edudef template MicroStoreInitiateAcc {{ 1894587Sgblack@eecs.umich.edu Fault %(class_name)s::initiateAcc(%(CPU_exec_context)s * xc, 1904587Sgblack@eecs.umich.edu Trace::InstRecord * traceData) const 1914587Sgblack@eecs.umich.edu { 1924587Sgblack@eecs.umich.edu Fault fault = NoFault; 1934587Sgblack@eecs.umich.edu 1944587Sgblack@eecs.umich.edu Addr EA; 1954587Sgblack@eecs.umich.edu %(op_decl)s; 1964587Sgblack@eecs.umich.edu %(op_rd)s; 1974587Sgblack@eecs.umich.edu %(ea_code)s; 1984587Sgblack@eecs.umich.edu DPRINTF(X86, "%s : %s: The address is %#x\n", instMnem, mnemonic, EA); 1994587Sgblack@eecs.umich.edu 2004587Sgblack@eecs.umich.edu %(code)s; 2014587Sgblack@eecs.umich.edu 2024587Sgblack@eecs.umich.edu if(fault == NoFault) 2034587Sgblack@eecs.umich.edu { 2045912Sgblack@eecs.umich.edu write(xc, Mem, EA, memFlags); 2054587Sgblack@eecs.umich.edu } 2064587Sgblack@eecs.umich.edu return fault; 2074587Sgblack@eecs.umich.edu } 2084587Sgblack@eecs.umich.edu}}; 2094587Sgblack@eecs.umich.edu 2104587Sgblack@eecs.umich.edudef template MicroStoreCompleteAcc {{ 2115892Sgblack@eecs.umich.edu Fault %(class_name)s::completeAcc(PacketPtr pkt, 2125892Sgblack@eecs.umich.edu %(CPU_exec_context)s * xc, Trace::InstRecord * traceData) const 2134587Sgblack@eecs.umich.edu { 2145892Sgblack@eecs.umich.edu %(op_decl)s; 2155892Sgblack@eecs.umich.edu %(op_rd)s; 2165892Sgblack@eecs.umich.edu %(complete_code)s; 2175892Sgblack@eecs.umich.edu %(op_wb)s; 2184587Sgblack@eecs.umich.edu return NoFault; 2194587Sgblack@eecs.umich.edu } 2204587Sgblack@eecs.umich.edu}}; 2214587Sgblack@eecs.umich.edu 2224587Sgblack@eecs.umich.edu// Common templates 2234587Sgblack@eecs.umich.edu 2244587Sgblack@eecs.umich.edu//This delcares the initiateAcc function in memory operations 2254587Sgblack@eecs.umich.edudef template InitiateAccDeclare {{ 2264587Sgblack@eecs.umich.edu Fault initiateAcc(%(CPU_exec_context)s *, Trace::InstRecord *) const; 2274587Sgblack@eecs.umich.edu}}; 2284587Sgblack@eecs.umich.edu 2294587Sgblack@eecs.umich.edu//This declares the completeAcc function in memory operations 2304587Sgblack@eecs.umich.edudef template CompleteAccDeclare {{ 2314587Sgblack@eecs.umich.edu Fault completeAcc(PacketPtr, %(CPU_exec_context)s *, Trace::InstRecord *) const; 2324587Sgblack@eecs.umich.edu}}; 2334587Sgblack@eecs.umich.edu 2344587Sgblack@eecs.umich.edudef template MicroLdStOpDeclare {{ 2354587Sgblack@eecs.umich.edu class %(class_name)s : public %(base_class)s 2364587Sgblack@eecs.umich.edu { 2374561Sgblack@eecs.umich.edu public: 2384561Sgblack@eecs.umich.edu %(class_name)s(ExtMachInst _machInst, 2397620Sgblack@eecs.umich.edu const char * instMnem, uint64_t setFlags, 2406345Sgblack@eecs.umich.edu uint8_t _scale, InstRegIndex _index, InstRegIndex _base, 2416345Sgblack@eecs.umich.edu uint64_t _disp, InstRegIndex _segment, 2426345Sgblack@eecs.umich.edu InstRegIndex _data, 2435912Sgblack@eecs.umich.edu uint8_t _dataSize, uint8_t _addressSize, 2445912Sgblack@eecs.umich.edu Request::FlagsType _memFlags); 2454561Sgblack@eecs.umich.edu 2464561Sgblack@eecs.umich.edu %(BasicExecDeclare)s 2474587Sgblack@eecs.umich.edu 2484587Sgblack@eecs.umich.edu %(InitiateAccDeclare)s 2494587Sgblack@eecs.umich.edu 2504587Sgblack@eecs.umich.edu %(CompleteAccDeclare)s 2514561Sgblack@eecs.umich.edu }; 2524561Sgblack@eecs.umich.edu}}; 2534561Sgblack@eecs.umich.edu 2544561Sgblack@eecs.umich.edudef template MicroLdStOpConstructor {{ 2554561Sgblack@eecs.umich.edu inline %(class_name)s::%(class_name)s( 2567620Sgblack@eecs.umich.edu ExtMachInst machInst, const char * instMnem, uint64_t setFlags, 2576345Sgblack@eecs.umich.edu uint8_t _scale, InstRegIndex _index, InstRegIndex _base, 2586345Sgblack@eecs.umich.edu uint64_t _disp, InstRegIndex _segment, 2596345Sgblack@eecs.umich.edu InstRegIndex _data, 2605912Sgblack@eecs.umich.edu uint8_t _dataSize, uint8_t _addressSize, 2615912Sgblack@eecs.umich.edu Request::FlagsType _memFlags) : 2627620Sgblack@eecs.umich.edu %(base_class)s(machInst, "%(mnemonic)s", instMnem, setFlags, 2634587Sgblack@eecs.umich.edu _scale, _index, _base, 2644587Sgblack@eecs.umich.edu _disp, _segment, _data, 2655912Sgblack@eecs.umich.edu _dataSize, _addressSize, _memFlags, %(op_class)s) 2664561Sgblack@eecs.umich.edu { 2677626Sgblack@eecs.umich.edu %(constructor)s; 2684561Sgblack@eecs.umich.edu } 2694561Sgblack@eecs.umich.edu}}; 2704561Sgblack@eecs.umich.edu 2714587Sgblack@eecs.umich.edulet {{ 2724587Sgblack@eecs.umich.edu class LdStOp(X86Microop): 2735912Sgblack@eecs.umich.edu def __init__(self, data, segment, addr, disp, 2748103Sgblack@eecs.umich.edu dataSize, addressSize, baseFlags, atCPL0, prefetch, nonSpec): 2754587Sgblack@eecs.umich.edu self.data = data 2764587Sgblack@eecs.umich.edu [self.scale, self.index, self.base] = addr 2774587Sgblack@eecs.umich.edu self.disp = disp 2784587Sgblack@eecs.umich.edu self.segment = segment 2794712Sgblack@eecs.umich.edu self.dataSize = dataSize 2805149Sgblack@eecs.umich.edu self.addressSize = addressSize 2815912Sgblack@eecs.umich.edu self.memFlags = baseFlags 2825912Sgblack@eecs.umich.edu if atCPL0: 2835912Sgblack@eecs.umich.edu self.memFlags += " | (CPL0FlagBit << FlagShift)" 2848102Sgblack@eecs.umich.edu self.instFlags = "" 2855920Sgblack@eecs.umich.edu if prefetch: 2866736Sgblack@eecs.umich.edu self.memFlags += " | Request::PREFETCH" 2878103Sgblack@eecs.umich.edu self.instFlags += " | (1ULL << StaticInst::IsDataPrefetch)" 2888103Sgblack@eecs.umich.edu if nonSpec: 2898103Sgblack@eecs.umich.edu self.instFlags += " | (1ULL << StaticInst::IsNonSpeculative)" 2905965Sgblack@eecs.umich.edu self.memFlags += " | (machInst.legacy.addr ? " + \ 2915965Sgblack@eecs.umich.edu "(AddrSizeFlagBit << FlagShift) : 0)" 2924587Sgblack@eecs.umich.edu 2937620Sgblack@eecs.umich.edu def getAllocator(self, microFlags): 2947620Sgblack@eecs.umich.edu allocator = '''new %(class_name)s(machInst, macrocodeBlock, 2954587Sgblack@eecs.umich.edu %(flags)s, %(scale)s, %(index)s, %(base)s, 2964587Sgblack@eecs.umich.edu %(disp)s, %(segment)s, %(data)s, 2975912Sgblack@eecs.umich.edu %(dataSize)s, %(addressSize)s, %(memFlags)s)''' % { 2984587Sgblack@eecs.umich.edu "class_name" : self.className, 2998102Sgblack@eecs.umich.edu "flags" : self.microFlagsText(microFlags) + self.instFlags, 3004587Sgblack@eecs.umich.edu "scale" : self.scale, "index" : self.index, 3014587Sgblack@eecs.umich.edu "base" : self.base, 3024587Sgblack@eecs.umich.edu "disp" : self.disp, 3034587Sgblack@eecs.umich.edu "segment" : self.segment, "data" : self.data, 3045912Sgblack@eecs.umich.edu "dataSize" : self.dataSize, "addressSize" : self.addressSize, 3055912Sgblack@eecs.umich.edu "memFlags" : self.memFlags} 3064587Sgblack@eecs.umich.edu return allocator 3077967Sgblack@eecs.umich.edu 3087967Sgblack@eecs.umich.edu class BigLdStOp(X86Microop): 3097967Sgblack@eecs.umich.edu def __init__(self, data, segment, addr, disp, 3108103Sgblack@eecs.umich.edu dataSize, addressSize, baseFlags, atCPL0, prefetch, nonSpec): 3117967Sgblack@eecs.umich.edu self.data = data 3127967Sgblack@eecs.umich.edu [self.scale, self.index, self.base] = addr 3137967Sgblack@eecs.umich.edu self.disp = disp 3147967Sgblack@eecs.umich.edu self.segment = segment 3157967Sgblack@eecs.umich.edu self.dataSize = dataSize 3167967Sgblack@eecs.umich.edu self.addressSize = addressSize 3177967Sgblack@eecs.umich.edu self.memFlags = baseFlags 3187967Sgblack@eecs.umich.edu if atCPL0: 3197967Sgblack@eecs.umich.edu self.memFlags += " | (CPL0FlagBit << FlagShift)" 3208103Sgblack@eecs.umich.edu self.instFlags = "" 3217967Sgblack@eecs.umich.edu if prefetch: 3227967Sgblack@eecs.umich.edu self.memFlags += " | Request::PREFETCH" 3238103Sgblack@eecs.umich.edu self.instFlags += " | (1ULL << StaticInst::IsDataPrefetch)" 3248103Sgblack@eecs.umich.edu if nonSpec: 3258103Sgblack@eecs.umich.edu self.instFlags += " | (1ULL << StaticInst::IsNonSpeculative)" 3267967Sgblack@eecs.umich.edu self.memFlags += " | (machInst.legacy.addr ? " + \ 3277967Sgblack@eecs.umich.edu "(AddrSizeFlagBit << FlagShift) : 0)" 3287967Sgblack@eecs.umich.edu 3297967Sgblack@eecs.umich.edu def getAllocator(self, microFlags): 3307967Sgblack@eecs.umich.edu allocString = ''' 3317967Sgblack@eecs.umich.edu (%(dataSize)s >= 4) ? 3327967Sgblack@eecs.umich.edu (StaticInstPtr)(new %(class_name)sBig(machInst, 3337967Sgblack@eecs.umich.edu macrocodeBlock, %(flags)s, %(scale)s, %(index)s, 3347967Sgblack@eecs.umich.edu %(base)s, %(disp)s, %(segment)s, %(data)s, 3357967Sgblack@eecs.umich.edu %(dataSize)s, %(addressSize)s, %(memFlags)s)) : 3367967Sgblack@eecs.umich.edu (StaticInstPtr)(new %(class_name)s(machInst, 3377967Sgblack@eecs.umich.edu macrocodeBlock, %(flags)s, %(scale)s, %(index)s, 3387967Sgblack@eecs.umich.edu %(base)s, %(disp)s, %(segment)s, %(data)s, 3397967Sgblack@eecs.umich.edu %(dataSize)s, %(addressSize)s, %(memFlags)s)) 3407967Sgblack@eecs.umich.edu ''' 3417967Sgblack@eecs.umich.edu allocator = allocString % { 3427967Sgblack@eecs.umich.edu "class_name" : self.className, 3438103Sgblack@eecs.umich.edu "flags" : self.microFlagsText(microFlags) + self.instFlags, 3447967Sgblack@eecs.umich.edu "scale" : self.scale, "index" : self.index, 3457967Sgblack@eecs.umich.edu "base" : self.base, 3467967Sgblack@eecs.umich.edu "disp" : self.disp, 3477967Sgblack@eecs.umich.edu "segment" : self.segment, "data" : self.data, 3487967Sgblack@eecs.umich.edu "dataSize" : self.dataSize, "addressSize" : self.addressSize, 3497967Sgblack@eecs.umich.edu "memFlags" : self.memFlags} 3507967Sgblack@eecs.umich.edu return allocator 3514587Sgblack@eecs.umich.edu}}; 3524587Sgblack@eecs.umich.edu 3534587Sgblack@eecs.umich.edulet {{ 3544587Sgblack@eecs.umich.edu 3554587Sgblack@eecs.umich.edu # Make these empty strings so that concatenating onto 3564587Sgblack@eecs.umich.edu # them will always work. 3574587Sgblack@eecs.umich.edu header_output = "" 3584587Sgblack@eecs.umich.edu decoder_output = "" 3594587Sgblack@eecs.umich.edu exec_output = "" 3604587Sgblack@eecs.umich.edu 3615969Sgblack@eecs.umich.edu calculateEA = ''' 3625969Sgblack@eecs.umich.edu EA = bits(SegBase + scale * Index + Base + disp, addressSize * 8 - 1, 0); 3635969Sgblack@eecs.umich.edu ''' 3644587Sgblack@eecs.umich.edu 3657967Sgblack@eecs.umich.edu def defineMicroLoadOp(mnemonic, code, bigCode='', 3667967Sgblack@eecs.umich.edu mem_flags="0", big=True): 3674587Sgblack@eecs.umich.edu global header_output 3684587Sgblack@eecs.umich.edu global decoder_output 3694587Sgblack@eecs.umich.edu global exec_output 3704587Sgblack@eecs.umich.edu global microopClasses 3714587Sgblack@eecs.umich.edu Name = mnemonic 3724587Sgblack@eecs.umich.edu name = mnemonic.lower() 3734587Sgblack@eecs.umich.edu 3744587Sgblack@eecs.umich.edu # Build up the all register version of this micro op 3757967Sgblack@eecs.umich.edu iops = [InstObjParams(name, Name, 'X86ISA::LdStOp', 3767967Sgblack@eecs.umich.edu {"code": code, "ea_code": calculateEA})] 3777967Sgblack@eecs.umich.edu if big: 3787967Sgblack@eecs.umich.edu iops += [InstObjParams(name, Name + "Big", 'X86ISA::LdStOp', 3797967Sgblack@eecs.umich.edu {"code": bigCode, "ea_code": calculateEA})] 3807967Sgblack@eecs.umich.edu for iop in iops: 3817967Sgblack@eecs.umich.edu header_output += MicroLdStOpDeclare.subst(iop) 3827967Sgblack@eecs.umich.edu decoder_output += MicroLdStOpConstructor.subst(iop) 3837967Sgblack@eecs.umich.edu exec_output += MicroLoadExecute.subst(iop) 3847967Sgblack@eecs.umich.edu exec_output += MicroLoadInitiateAcc.subst(iop) 3857967Sgblack@eecs.umich.edu exec_output += MicroLoadCompleteAcc.subst(iop) 3864587Sgblack@eecs.umich.edu 3877967Sgblack@eecs.umich.edu base = LdStOp 3887967Sgblack@eecs.umich.edu if big: 3897967Sgblack@eecs.umich.edu base = BigLdStOp 3907967Sgblack@eecs.umich.edu class LoadOp(base): 3915149Sgblack@eecs.umich.edu def __init__(self, data, segment, addr, disp = 0, 3925912Sgblack@eecs.umich.edu dataSize="env.dataSize", 3935912Sgblack@eecs.umich.edu addressSize="env.addressSize", 3948103Sgblack@eecs.umich.edu atCPL0=False, prefetch=False, nonSpec=False): 3955912Sgblack@eecs.umich.edu super(LoadOp, self).__init__(data, segment, addr, 3965920Sgblack@eecs.umich.edu disp, dataSize, addressSize, mem_flags, 3978103Sgblack@eecs.umich.edu atCPL0, prefetch, nonSpec) 3984587Sgblack@eecs.umich.edu self.className = Name 3994587Sgblack@eecs.umich.edu self.mnemonic = name 4004587Sgblack@eecs.umich.edu 4014587Sgblack@eecs.umich.edu microopClasses[name] = LoadOp 4024587Sgblack@eecs.umich.edu 4037967Sgblack@eecs.umich.edu defineMicroLoadOp('Ld', 'Data = merge(Data, Mem, dataSize);', 4047967Sgblack@eecs.umich.edu 'Data = Mem & mask(dataSize * 8);') 4055912Sgblack@eecs.umich.edu defineMicroLoadOp('Ldst', 'Data = merge(Data, Mem, dataSize);', 4067967Sgblack@eecs.umich.edu 'Data = Mem & mask(dataSize * 8);', 4077967Sgblack@eecs.umich.edu '(StoreCheck << FlagShift)') 4086079Sgblack@eecs.umich.edu defineMicroLoadOp('Ldstl', 'Data = merge(Data, Mem, dataSize);', 4097967Sgblack@eecs.umich.edu 'Data = Mem & mask(dataSize * 8);', 4107967Sgblack@eecs.umich.edu '(StoreCheck << FlagShift) | Request::LOCKED') 4117967Sgblack@eecs.umich.edu defineMicroLoadOp('Ldfp', 'FpData.uqw = Mem;', big = False) 4124587Sgblack@eecs.umich.edu 4138432Sgblack@eecs.umich.edu def defineMicroStoreOp(mnemonic, code, completeCode="", mem_flags="0"): 4144587Sgblack@eecs.umich.edu global header_output 4154587Sgblack@eecs.umich.edu global decoder_output 4164587Sgblack@eecs.umich.edu global exec_output 4174587Sgblack@eecs.umich.edu global microopClasses 4184587Sgblack@eecs.umich.edu Name = mnemonic 4194587Sgblack@eecs.umich.edu name = mnemonic.lower() 4204587Sgblack@eecs.umich.edu 4214587Sgblack@eecs.umich.edu # Build up the all register version of this micro op 4224679Sgblack@eecs.umich.edu iop = InstObjParams(name, Name, 'X86ISA::LdStOp', 4235118Sgblack@eecs.umich.edu {"code": code, 4245892Sgblack@eecs.umich.edu "complete_code": completeCode, 4255912Sgblack@eecs.umich.edu "ea_code": calculateEA}) 4264587Sgblack@eecs.umich.edu header_output += MicroLdStOpDeclare.subst(iop) 4274587Sgblack@eecs.umich.edu decoder_output += MicroLdStOpConstructor.subst(iop) 4284587Sgblack@eecs.umich.edu exec_output += MicroStoreExecute.subst(iop) 4294587Sgblack@eecs.umich.edu exec_output += MicroStoreInitiateAcc.subst(iop) 4304587Sgblack@eecs.umich.edu exec_output += MicroStoreCompleteAcc.subst(iop) 4314587Sgblack@eecs.umich.edu 4324587Sgblack@eecs.umich.edu class StoreOp(LdStOp): 4335149Sgblack@eecs.umich.edu def __init__(self, data, segment, addr, disp = 0, 4345912Sgblack@eecs.umich.edu dataSize="env.dataSize", 4355912Sgblack@eecs.umich.edu addressSize="env.addressSize", 4368103Sgblack@eecs.umich.edu atCPL0=False, nonSpec=False): 4378103Sgblack@eecs.umich.edu super(StoreOp, self).__init__(data, segment, addr, disp, 4388103Sgblack@eecs.umich.edu dataSize, addressSize, mem_flags, atCPL0, False, 4398103Sgblack@eecs.umich.edu nonSpec) 4404587Sgblack@eecs.umich.edu self.className = Name 4414587Sgblack@eecs.umich.edu self.mnemonic = name 4424587Sgblack@eecs.umich.edu 4434587Sgblack@eecs.umich.edu microopClasses[name] = StoreOp 4444587Sgblack@eecs.umich.edu 4455919Sgblack@eecs.umich.edu defineMicroStoreOp('St', 'Mem = pick(Data, 2, dataSize);') 4466080Sgblack@eecs.umich.edu defineMicroStoreOp('Stul', 'Mem = pick(Data, 2, dataSize);', 4476080Sgblack@eecs.umich.edu mem_flags="Request::LOCKED") 4485027Sgblack@eecs.umich.edu defineMicroStoreOp('Stfp', 'Mem = FpData.uqw;') 4495892Sgblack@eecs.umich.edu defineMicroStoreOp('Cda', 'Mem = 0;', mem_flags="Request::NO_ACCESS") 4504601Sgblack@eecs.umich.edu 4514679Sgblack@eecs.umich.edu iop = InstObjParams("lea", "Lea", 'X86ISA::LdStOp', 4525118Sgblack@eecs.umich.edu {"code": "Data = merge(Data, EA, dataSize);", 4536056Sgblack@eecs.umich.edu "ea_code": ''' 4546056Sgblack@eecs.umich.edu EA = bits(scale * Index + Base + disp, addressSize * 8 - 1, 0); 4556056Sgblack@eecs.umich.edu '''}) 4564601Sgblack@eecs.umich.edu header_output += MicroLeaDeclare.subst(iop) 4574601Sgblack@eecs.umich.edu decoder_output += MicroLdStOpConstructor.subst(iop) 4584601Sgblack@eecs.umich.edu exec_output += MicroLeaExecute.subst(iop) 4594601Sgblack@eecs.umich.edu 4604601Sgblack@eecs.umich.edu class LeaOp(LdStOp): 4615149Sgblack@eecs.umich.edu def __init__(self, data, segment, addr, disp = 0, 4625149Sgblack@eecs.umich.edu dataSize="env.dataSize", addressSize="env.addressSize"): 4638103Sgblack@eecs.umich.edu super(LeaOp, self).__init__(data, segment, addr, disp, 4648103Sgblack@eecs.umich.edu dataSize, addressSize, "0", False, False, False) 4654601Sgblack@eecs.umich.edu self.className = "Lea" 4664601Sgblack@eecs.umich.edu self.mnemonic = "lea" 4674601Sgblack@eecs.umich.edu 4684601Sgblack@eecs.umich.edu microopClasses["lea"] = LeaOp 4695178Sgblack@eecs.umich.edu 4705178Sgblack@eecs.umich.edu 4715359Sgblack@eecs.umich.edu iop = InstObjParams("tia", "Tia", 'X86ISA::LdStOp', 4725359Sgblack@eecs.umich.edu {"code": "xc->demapPage(EA, 0);", 4735912Sgblack@eecs.umich.edu "ea_code": calculateEA}) 4745359Sgblack@eecs.umich.edu header_output += MicroLeaDeclare.subst(iop) 4755359Sgblack@eecs.umich.edu decoder_output += MicroLdStOpConstructor.subst(iop) 4765359Sgblack@eecs.umich.edu exec_output += MicroLeaExecute.subst(iop) 4775359Sgblack@eecs.umich.edu 4785359Sgblack@eecs.umich.edu class TiaOp(LdStOp): 4795359Sgblack@eecs.umich.edu def __init__(self, segment, addr, disp = 0, 4805912Sgblack@eecs.umich.edu dataSize="env.dataSize", 4815912Sgblack@eecs.umich.edu addressSize="env.addressSize"): 4826345Sgblack@eecs.umich.edu super(TiaOp, self).__init__("InstRegIndex(NUM_INTREGS)", segment, 4838103Sgblack@eecs.umich.edu addr, disp, dataSize, addressSize, "0", False, False, 4848103Sgblack@eecs.umich.edu False) 4855359Sgblack@eecs.umich.edu self.className = "Tia" 4865359Sgblack@eecs.umich.edu self.mnemonic = "tia" 4875359Sgblack@eecs.umich.edu 4885359Sgblack@eecs.umich.edu microopClasses["tia"] = TiaOp 4895359Sgblack@eecs.umich.edu 4905178Sgblack@eecs.umich.edu class CdaOp(LdStOp): 4915178Sgblack@eecs.umich.edu def __init__(self, segment, addr, disp = 0, 4925912Sgblack@eecs.umich.edu dataSize="env.dataSize", 4935912Sgblack@eecs.umich.edu addressSize="env.addressSize", atCPL0=False): 4946345Sgblack@eecs.umich.edu super(CdaOp, self).__init__("InstRegIndex(NUM_INTREGS)", segment, 4956624Sgblack@eecs.umich.edu addr, disp, dataSize, addressSize, "Request::NO_ACCESS", 4968103Sgblack@eecs.umich.edu atCPL0, False, False) 4975178Sgblack@eecs.umich.edu self.className = "Cda" 4985178Sgblack@eecs.umich.edu self.mnemonic = "cda" 4995178Sgblack@eecs.umich.edu 5005178Sgblack@eecs.umich.edu microopClasses["cda"] = CdaOp 5014587Sgblack@eecs.umich.edu}}; 5024587Sgblack@eecs.umich.edu 503