14679Sgblack@eecs.umich.edu/*
24679Sgblack@eecs.umich.edu * Copyright (c) 2007 The Hewlett-Packard Development Company
34679Sgblack@eecs.umich.edu * All rights reserved.
44679Sgblack@eecs.umich.edu *
57087Snate@binkert.org * The license below extends only to copyright in the software and shall
67087Snate@binkert.org * not be construed as granting a license to any other intellectual
77087Snate@binkert.org * property including but not limited to intellectual property relating
87087Snate@binkert.org * to a hardware implementation of the functionality of the software
97087Snate@binkert.org * licensed hereunder.  You may use the software subject to the license
107087Snate@binkert.org * terms below provided that you ensure that this notice is replicated
117087Snate@binkert.org * unmodified and in its entirety in all distributions of the software,
127087Snate@binkert.org * modified or unmodified, in source code or in binary form.
134679Sgblack@eecs.umich.edu *
147087Snate@binkert.org * Redistribution and use in source and binary forms, with or without
157087Snate@binkert.org * modification, are permitted provided that the following conditions are
167087Snate@binkert.org * met: redistributions of source code must retain the above copyright
177087Snate@binkert.org * notice, this list of conditions and the following disclaimer;
187087Snate@binkert.org * redistributions in binary form must reproduce the above copyright
197087Snate@binkert.org * notice, this list of conditions and the following disclaimer in the
207087Snate@binkert.org * documentation and/or other materials provided with the distribution;
217087Snate@binkert.org * neither the name of the copyright holders nor the names of its
224679Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
237087Snate@binkert.org * this software without specific prior written permission.
244679Sgblack@eecs.umich.edu *
254679Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
264679Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
274679Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
284679Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
294679Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
304679Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
314679Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
324679Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
334679Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
344679Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
354679Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
364679Sgblack@eecs.umich.edu *
374679Sgblack@eecs.umich.edu * Authors: Gabe Black
384679Sgblack@eecs.umich.edu */
394679Sgblack@eecs.umich.edu
404679Sgblack@eecs.umich.edu#ifndef __ARCH_X86_INSTS_STATICINST_HH__
414679Sgblack@eecs.umich.edu#define __ARCH_X86_INSTS_STATICINST_HH__
424679Sgblack@eecs.umich.edu
434787Sgblack@eecs.umich.edu#include "base/trace.hh"
444679Sgblack@eecs.umich.edu#include "cpu/static_inst.hh"
458232Snate@binkert.org#include "debug/X86.hh"
464679Sgblack@eecs.umich.edu
474679Sgblack@eecs.umich.edunamespace X86ISA
484679Sgblack@eecs.umich.edu{
494679Sgblack@eecs.umich.edu    /**
506345Sgblack@eecs.umich.edu     * Class for register indices passed to instruction constructors. Using a
516345Sgblack@eecs.umich.edu     * wrapper struct for these lets take advantage of the compiler's type
526345Sgblack@eecs.umich.edu     * checking.
536345Sgblack@eecs.umich.edu     */
5412104Snathanael.premillieu@arm.com    struct InstRegIndex : public RegId
556345Sgblack@eecs.umich.edu    {
5612104Snathanael.premillieu@arm.com        explicit InstRegIndex(RegIndex _idx) :
5712104Snathanael.premillieu@arm.com           RegId(computeRegClass(_idx), _idx) {}
5812104Snathanael.premillieu@arm.com
5912104Snathanael.premillieu@arm.com      private:
6012104Snathanael.premillieu@arm.com        // TODO: As X86 register index definition is highly built on the
6112104Snathanael.premillieu@arm.com        //       unified space concept, it is easier for the moment to rely on
6212104Snathanael.premillieu@arm.com        //       an helper function to compute the RegClass. It would be nice
6312104Snathanael.premillieu@arm.com        //       to fix those definition and get rid of this.
6412104Snathanael.premillieu@arm.com        RegClass computeRegClass(RegIndex _idx) {
6512104Snathanael.premillieu@arm.com            if (_idx < FP_Reg_Base) {
6612104Snathanael.premillieu@arm.com                return IntRegClass;
6712104Snathanael.premillieu@arm.com            } else if (_idx < CC_Reg_Base) {
6812104Snathanael.premillieu@arm.com                return FloatRegClass;
6912104Snathanael.premillieu@arm.com            } else if (_idx < Misc_Reg_Base) {
7012104Snathanael.premillieu@arm.com                return CCRegClass;
7112104Snathanael.premillieu@arm.com            } else {
7212104Snathanael.premillieu@arm.com                return MiscRegClass;
7312104Snathanael.premillieu@arm.com            }
7412104Snathanael.premillieu@arm.com        }
756345Sgblack@eecs.umich.edu    };
766345Sgblack@eecs.umich.edu
776345Sgblack@eecs.umich.edu    /**
784679Sgblack@eecs.umich.edu     * Base class for all X86 static instructions.
794679Sgblack@eecs.umich.edu     */
804679Sgblack@eecs.umich.edu
814679Sgblack@eecs.umich.edu    class X86StaticInst : public StaticInst
824679Sgblack@eecs.umich.edu    {
834679Sgblack@eecs.umich.edu      protected:
844679Sgblack@eecs.umich.edu        // Constructor.
854679Sgblack@eecs.umich.edu        X86StaticInst(const char *mnem,
864679Sgblack@eecs.umich.edu             ExtMachInst _machInst, OpClass __opClass)
874679Sgblack@eecs.umich.edu                : StaticInst(mnem, _machInst, __opClass)
884679Sgblack@eecs.umich.edu            {
894679Sgblack@eecs.umich.edu            }
904679Sgblack@eecs.umich.edu
914679Sgblack@eecs.umich.edu        std::string generateDisassembly(Addr pc,
924679Sgblack@eecs.umich.edu            const SymbolTable *symtab) const;
934679Sgblack@eecs.umich.edu
944679Sgblack@eecs.umich.edu        void printMnemonic(std::ostream &os, const char * mnemonic) const;
954679Sgblack@eecs.umich.edu        void printMnemonic(std::ostream &os, const char * instMnemonic,
964679Sgblack@eecs.umich.edu                const char * mnemonic) const;
974679Sgblack@eecs.umich.edu
984679Sgblack@eecs.umich.edu        void printSegment(std::ostream &os, int segment) const;
994679Sgblack@eecs.umich.edu
10012104Snathanael.premillieu@arm.com        void printReg(std::ostream &os, RegId reg, int size) const;
1014693Sgblack@eecs.umich.edu        void printSrcReg(std::ostream &os, int reg, int size) const;
1024693Sgblack@eecs.umich.edu        void printDestReg(std::ostream &os, int reg, int size) const;
1035787Sgblack@eecs.umich.edu        void printMem(std::ostream &os, uint8_t segment,
1045787Sgblack@eecs.umich.edu                uint8_t scale, RegIndex index, RegIndex base,
1055787Sgblack@eecs.umich.edu                uint64_t disp, uint8_t addressSize, bool rip) const;
1064679Sgblack@eecs.umich.edu
1074679Sgblack@eecs.umich.edu        inline uint64_t merge(uint64_t into, uint64_t val, int size) const
1084679Sgblack@eecs.umich.edu        {
1094808Sgblack@eecs.umich.edu            X86IntReg reg = into;
11012106SRekai.GonzalezAlberquilla@arm.com            if (_destRegIdx[0].index() & IntFoldBit)
1114808Sgblack@eecs.umich.edu            {
1124808Sgblack@eecs.umich.edu                reg.H = val;
1134808Sgblack@eecs.umich.edu                return reg;
1144808Sgblack@eecs.umich.edu            }
1154679Sgblack@eecs.umich.edu            switch(size)
1164679Sgblack@eecs.umich.edu            {
1174679Sgblack@eecs.umich.edu              case 1:
1184679Sgblack@eecs.umich.edu                reg.L = val;
1194679Sgblack@eecs.umich.edu                break;
1204679Sgblack@eecs.umich.edu              case 2:
1214679Sgblack@eecs.umich.edu                reg.X = val;
1224679Sgblack@eecs.umich.edu                break;
1234679Sgblack@eecs.umich.edu              case 4:
1244679Sgblack@eecs.umich.edu                //XXX Check if this should be zeroed or sign extended
1254679Sgblack@eecs.umich.edu                reg = 0;
1264679Sgblack@eecs.umich.edu                reg.E = val;
1274679Sgblack@eecs.umich.edu                break;
1284679Sgblack@eecs.umich.edu              case 8:
1294679Sgblack@eecs.umich.edu                reg.R = val;
1304679Sgblack@eecs.umich.edu                break;
1314679Sgblack@eecs.umich.edu              default:
1324679Sgblack@eecs.umich.edu                panic("Tried to merge with unrecognized size %d.\n", size);
1334679Sgblack@eecs.umich.edu            }
1344787Sgblack@eecs.umich.edu            return reg;
1354679Sgblack@eecs.umich.edu        }
1364679Sgblack@eecs.umich.edu
1374808Sgblack@eecs.umich.edu        inline uint64_t pick(uint64_t from, int idx, int size) const
1384679Sgblack@eecs.umich.edu        {
1394808Sgblack@eecs.umich.edu            X86IntReg reg = from;
1404808Sgblack@eecs.umich.edu            DPRINTF(X86, "Picking with size %d\n", size);
14112106SRekai.GonzalezAlberquilla@arm.com            if (_srcRegIdx[idx].index() & IntFoldBit)
1424808Sgblack@eecs.umich.edu                return reg.H;
1434679Sgblack@eecs.umich.edu            switch(size)
1444679Sgblack@eecs.umich.edu            {
1454679Sgblack@eecs.umich.edu              case 1:
1464679Sgblack@eecs.umich.edu                return reg.L;
1474679Sgblack@eecs.umich.edu              case 2:
1484808Sgblack@eecs.umich.edu                return reg.X;
1494808Sgblack@eecs.umich.edu              case 4:
1504679Sgblack@eecs.umich.edu                return reg.E;
1514679Sgblack@eecs.umich.edu              case 8:
1524679Sgblack@eecs.umich.edu                return reg.R;
1534679Sgblack@eecs.umich.edu              default:
1544679Sgblack@eecs.umich.edu                panic("Tried to pick with unrecognized size %d.\n", size);
1554679Sgblack@eecs.umich.edu            }
1564679Sgblack@eecs.umich.edu        }
1575061Sgblack@eecs.umich.edu
1585061Sgblack@eecs.umich.edu        inline int64_t signedPick(uint64_t from, int idx, int size) const
1595061Sgblack@eecs.umich.edu        {
1605061Sgblack@eecs.umich.edu            X86IntReg reg = from;
1615061Sgblack@eecs.umich.edu            DPRINTF(X86, "Picking with size %d\n", size);
16212106SRekai.GonzalezAlberquilla@arm.com            if (_srcRegIdx[idx].index() & IntFoldBit)
1635061Sgblack@eecs.umich.edu                return reg.SH;
1645061Sgblack@eecs.umich.edu            switch(size)
1655061Sgblack@eecs.umich.edu            {
1665061Sgblack@eecs.umich.edu              case 1:
1675061Sgblack@eecs.umich.edu                return reg.SL;
1685061Sgblack@eecs.umich.edu              case 2:
1695061Sgblack@eecs.umich.edu                return reg.SX;
1705061Sgblack@eecs.umich.edu              case 4:
1715061Sgblack@eecs.umich.edu                return reg.SE;
1725061Sgblack@eecs.umich.edu              case 8:
1735061Sgblack@eecs.umich.edu                return reg.SR;
1745061Sgblack@eecs.umich.edu              default:
1755061Sgblack@eecs.umich.edu                panic("Tried to pick with unrecognized size %d.\n", size);
1765061Sgblack@eecs.umich.edu            }
1775061Sgblack@eecs.umich.edu        }
1787720Sgblack@eecs.umich.edu
1797720Sgblack@eecs.umich.edu        void
1807720Sgblack@eecs.umich.edu        advancePC(PCState &pcState) const
1817720Sgblack@eecs.umich.edu        {
1827720Sgblack@eecs.umich.edu            pcState.advance();
1837720Sgblack@eecs.umich.edu        }
1844679Sgblack@eecs.umich.edu    };
1854679Sgblack@eecs.umich.edu}
1864679Sgblack@eecs.umich.edu
1874679Sgblack@eecs.umich.edu#endif //__ARCH_X86_INSTS_STATICINST_HH__
188