microregop.cc revision 4954:17d8fe61258e
16019Shines@cs.fsu.edu/*
26019Shines@cs.fsu.edu * Copyright (c) 2007 The Hewlett-Packard Development Company
36019Shines@cs.fsu.edu * All rights reserved.
46019Shines@cs.fsu.edu *
56019Shines@cs.fsu.edu * Redistribution and use of this software in source and binary forms,
66019Shines@cs.fsu.edu * with or without modification, are permitted provided that the
76019Shines@cs.fsu.edu * following conditions are met:
86019Shines@cs.fsu.edu *
96019Shines@cs.fsu.edu * The software must be used only for Non-Commercial Use which means any
106019Shines@cs.fsu.edu * use which is NOT directed to receiving any direct monetary
116019Shines@cs.fsu.edu * compensation for, or commercial advantage from such use.  Illustrative
126019Shines@cs.fsu.edu * examples of non-commercial use are academic research, personal study,
136019Shines@cs.fsu.edu * teaching, education and corporate research & development.
146019Shines@cs.fsu.edu * Illustrative examples of commercial use are distributing products for
156019Shines@cs.fsu.edu * commercial advantage and providing services using the software for
166019Shines@cs.fsu.edu * commercial advantage.
176019Shines@cs.fsu.edu *
186019Shines@cs.fsu.edu * If you wish to use this software or functionality therein that may be
196019Shines@cs.fsu.edu * covered by patents for commercial use, please contact:
206019Shines@cs.fsu.edu *     Director of Intellectual Property Licensing
216019Shines@cs.fsu.edu *     Office of Strategy and Technology
226019Shines@cs.fsu.edu *     Hewlett-Packard Company
236019Shines@cs.fsu.edu *     1501 Page Mill Road
246019Shines@cs.fsu.edu *     Palo Alto, California  94304
256019Shines@cs.fsu.edu *
266019Shines@cs.fsu.edu * Redistributions of source code must retain the above copyright notice,
276019Shines@cs.fsu.edu * this list of conditions and the following disclaimer.  Redistributions
286019Shines@cs.fsu.edu * in binary form must reproduce the above copyright notice, this list of
296019Shines@cs.fsu.edu * conditions and the following disclaimer in the documentation and/or
306019Shines@cs.fsu.edu * other materials provided with the distribution.  Neither the name of
316019Shines@cs.fsu.edu * the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its
326019Shines@cs.fsu.edu * contributors may be used to endorse or promote products derived from
336019Shines@cs.fsu.edu * this software without specific prior written permission.  No right of
346019Shines@cs.fsu.edu * sublicense is granted herewith.  Derivatives of the software and
356019Shines@cs.fsu.edu * output created using the software may be prepared, but only for
366019Shines@cs.fsu.edu * Non-Commercial Uses.  Derivatives of the software may be shared with
376019Shines@cs.fsu.edu * others provided: (i) the others agree to abide by the list of
386019Shines@cs.fsu.edu * conditions herein which includes the Non-Commercial Use restrictions;
396019Shines@cs.fsu.edu * and (ii) such Derivatives of the software include the above copyright
406019Shines@cs.fsu.edu * notice to acknowledge the contribution from this software where
416019Shines@cs.fsu.edu * applicable, this list of conditions and the disclaimer below.
426019Shines@cs.fsu.edu *
436019Shines@cs.fsu.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
446019Shines@cs.fsu.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
456019Shines@cs.fsu.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
466019Shines@cs.fsu.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
476019Shines@cs.fsu.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
486019Shines@cs.fsu.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
496019Shines@cs.fsu.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
506341Sjack-m5ml2@cs.york.ac.uk * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
516341Sjack-m5ml2@cs.york.ac.uk * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
526341Sjack-m5ml2@cs.york.ac.uk * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
536341Sjack-m5ml2@cs.york.ac.uk * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
546341Sjack-m5ml2@cs.york.ac.uk *
556341Sjack-m5ml2@cs.york.ac.uk * Authors: Gabe Black
566341Sjack-m5ml2@cs.york.ac.uk */
576341Sjack-m5ml2@cs.york.ac.uk
586341Sjack-m5ml2@cs.york.ac.uk#include "arch/x86/insts/microregop.hh"
596341Sjack-m5ml2@cs.york.ac.uk#include "arch/x86/miscregs.hh"
606341Sjack-m5ml2@cs.york.ac.uk#include "base/condcodes.hh"
616341Sjack-m5ml2@cs.york.ac.uk#include <string>
626341Sjack-m5ml2@cs.york.ac.uk
636341Sjack-m5ml2@cs.york.ac.uknamespace X86ISA
646341Sjack-m5ml2@cs.york.ac.uk{
656341Sjack-m5ml2@cs.york.ac.uk    uint64_t RegOpBase::genFlags(uint64_t oldFlags, uint64_t flagMask,
666019Shines@cs.fsu.edu            uint64_t _dest, uint64_t _src1, uint64_t _src2,
676019Shines@cs.fsu.edu            bool subtract) const
686019Shines@cs.fsu.edu    {
696019Shines@cs.fsu.edu        DPRINTF(Sparc, "flagMask = %#x\n", flagMask);
706019Shines@cs.fsu.edu        uint64_t flags = oldFlags & ~flagMask;
716019Shines@cs.fsu.edu        if(flagMask & CFBit)
726019Shines@cs.fsu.edu        {
736341Sjack-m5ml2@cs.york.ac.uk            if(findCarry(dataSize*8, _dest, _src1, _src2))
746341Sjack-m5ml2@cs.york.ac.uk                flags |= CFBit;
756341Sjack-m5ml2@cs.york.ac.uk            if(subtract)
766341Sjack-m5ml2@cs.york.ac.uk                flags ^= CFBit;
776341Sjack-m5ml2@cs.york.ac.uk        }
786341Sjack-m5ml2@cs.york.ac.uk        if(flagMask & PFBit && findParity(dataSize*8, _dest))
796341Sjack-m5ml2@cs.york.ac.uk            flags |= PFBit;
806019Shines@cs.fsu.edu        if(flagMask & ECFBit && findCarry(dataSize*8, _dest, _src1, _src2))
816019Shines@cs.fsu.edu            flags |= ECFBit;
826019Shines@cs.fsu.edu        if(flagMask & AFBit)
836019Shines@cs.fsu.edu        {
846019Shines@cs.fsu.edu            if(findCarry(4, _dest, _src1, _src2))
856019Shines@cs.fsu.edu                flags |= AFBit;
866019Shines@cs.fsu.edu            if(subtract)
876019Shines@cs.fsu.edu                flags ^= AFBit;
886019Shines@cs.fsu.edu        }
896019Shines@cs.fsu.edu        if(flagMask & EZFBit && findZero(dataSize*8, _dest))
906019Shines@cs.fsu.edu            flags |= EZFBit;
916019Shines@cs.fsu.edu        if(flagMask & ZFBit && findZero(dataSize*8, _dest))
926019Shines@cs.fsu.edu            flags |= ZFBit;
936019Shines@cs.fsu.edu        if(flagMask & SFBit && findNegative(dataSize*8, _dest))
946019Shines@cs.fsu.edu            flags |= SFBit;
956019Shines@cs.fsu.edu        if(flagMask & OFBit && findOverflow(dataSize*8, _dest, _src1, _src2))
966019Shines@cs.fsu.edu            flags |= OFBit;
976019Shines@cs.fsu.edu        return flags;
986019Shines@cs.fsu.edu    }
996019Shines@cs.fsu.edu
1006019Shines@cs.fsu.edu    bool RegOpBase::checkCondition(uint64_t flags) const
1016019Shines@cs.fsu.edu    {
1026019Shines@cs.fsu.edu        CCFlagBits ccflags = flags;
1036019Shines@cs.fsu.edu        switch(ext)
1046019Shines@cs.fsu.edu        {
1056019Shines@cs.fsu.edu          case ConditionTests::True:
1066019Shines@cs.fsu.edu            return true;
1076019Shines@cs.fsu.edu          case ConditionTests::ECF:
1086019Shines@cs.fsu.edu            return ccflags.ECF;
1096019Shines@cs.fsu.edu          case ConditionTests::EZF:
1106019Shines@cs.fsu.edu            return ccflags.EZF;
1116019Shines@cs.fsu.edu          case ConditionTests::SZnZF:
1126019Shines@cs.fsu.edu            return !(!ccflags.EZF & ccflags.ZF);
1136019Shines@cs.fsu.edu          case ConditionTests::MSTRZ:
1146019Shines@cs.fsu.edu            panic("This condition is not implemented!");
1156019Shines@cs.fsu.edu          case ConditionTests::STRZ:
1166019Shines@cs.fsu.edu            panic("This condition is not implemented!");
1176019Shines@cs.fsu.edu          case ConditionTests::MSTRC:
1186019Shines@cs.fsu.edu            panic("This condition is not implemented!");
1196019Shines@cs.fsu.edu          case ConditionTests::STRZnEZF:
1206019Shines@cs.fsu.edu            return !ccflags.EZF & ccflags.ZF;
1216019Shines@cs.fsu.edu                //And no interrupts or debug traps are waiting
1226019Shines@cs.fsu.edu          case ConditionTests::OF:
1236019Shines@cs.fsu.edu            return ccflags.OF;
1246019Shines@cs.fsu.edu          case ConditionTests::CF:
1256019Shines@cs.fsu.edu            return ccflags.CF;
1266395Ssaidi@eecs.umich.edu          case ConditionTests::ZF:
1276395Ssaidi@eecs.umich.edu            return ccflags.ZF;
1286395Ssaidi@eecs.umich.edu          case ConditionTests::CvZF:
1296395Ssaidi@eecs.umich.edu            return ccflags.CF | ccflags.ZF;
1306395Ssaidi@eecs.umich.edu          case ConditionTests::SF:
1316395Ssaidi@eecs.umich.edu            return ccflags.SF;
1326395Ssaidi@eecs.umich.edu          case ConditionTests::PF:
1336395Ssaidi@eecs.umich.edu            return ccflags.PF;
1346395Ssaidi@eecs.umich.edu          case ConditionTests::SxOF:
1356395Ssaidi@eecs.umich.edu            return ccflags.SF ^ ccflags.OF;
1366395Ssaidi@eecs.umich.edu          case ConditionTests::SxOvZF:
1376395Ssaidi@eecs.umich.edu            return ccflags.SF ^ ccflags.OF | ccflags.ZF;
1386395Ssaidi@eecs.umich.edu          case ConditionTests::False:
1396395Ssaidi@eecs.umich.edu            return false;
1406395Ssaidi@eecs.umich.edu          case ConditionTests::NotECF:
1416395Ssaidi@eecs.umich.edu            return !ccflags.ECF;
1426395Ssaidi@eecs.umich.edu          case ConditionTests::NotEZF:
1436395Ssaidi@eecs.umich.edu            return !ccflags.EZF;
1446395Ssaidi@eecs.umich.edu          case ConditionTests::NotSZnZF:
1456395Ssaidi@eecs.umich.edu            return !ccflags.EZF & ccflags.ZF;
1466395Ssaidi@eecs.umich.edu          case ConditionTests::NotMSTRZ:
1476395Ssaidi@eecs.umich.edu            panic("This condition is not implemented!");
1486395Ssaidi@eecs.umich.edu          case ConditionTests::NotSTRZ:
1496395Ssaidi@eecs.umich.edu            panic("This condition is not implemented!");
1506395Ssaidi@eecs.umich.edu          case ConditionTests::NotMSTRC:
1516395Ssaidi@eecs.umich.edu            panic("This condition is not implemented!");
1526395Ssaidi@eecs.umich.edu          case ConditionTests::STRnZnEZF:
1536395Ssaidi@eecs.umich.edu            return !ccflags.EZF & !ccflags.ZF;
1546395Ssaidi@eecs.umich.edu                //And no interrupts or debug traps are waiting
1556395Ssaidi@eecs.umich.edu          case ConditionTests::NotOF:
1566395Ssaidi@eecs.umich.edu            return !ccflags.OF;
1576395Ssaidi@eecs.umich.edu          case ConditionTests::NotCF:
1586395Ssaidi@eecs.umich.edu            return !ccflags.CF;
1596395Ssaidi@eecs.umich.edu          case ConditionTests::NotZF:
1606395Ssaidi@eecs.umich.edu            return !ccflags.ZF;
1616395Ssaidi@eecs.umich.edu          case ConditionTests::NotCvZF:
1626395Ssaidi@eecs.umich.edu            return !(ccflags.CF | ccflags.ZF);
1636395Ssaidi@eecs.umich.edu          case ConditionTests::NotSF:
1646395Ssaidi@eecs.umich.edu            return !ccflags.SF;
1656395Ssaidi@eecs.umich.edu          case ConditionTests::NotPF:
1666395Ssaidi@eecs.umich.edu            return !ccflags.PF;
1676395Ssaidi@eecs.umich.edu          case ConditionTests::NotSxOF:
1686019Shines@cs.fsu.edu            return !(ccflags.SF ^ ccflags.OF);
1696019Shines@cs.fsu.edu          case ConditionTests::NotSxOvZF:
1706019Shines@cs.fsu.edu            return !(ccflags.SF ^ ccflags.OF | ccflags.ZF);
171        }
172        panic("Unknown condition: %d\n", ext);
173        return true;
174    }
175
176    std::string RegOp::generateDisassembly(Addr pc,
177            const SymbolTable *symtab) const
178    {
179        std::stringstream response;
180
181        printMnemonic(response, instMnem, mnemonic);
182        printDestReg(response, 0, dataSize);
183        response << ", ";
184        printSrcReg(response, 0, dataSize);
185        response << ", ";
186        printSrcReg(response, 1, dataSize);
187        return response.str();
188    }
189
190    std::string RegOpImm::generateDisassembly(Addr pc,
191            const SymbolTable *symtab) const
192    {
193        std::stringstream response;
194
195        printMnemonic(response, instMnem, mnemonic);
196        printDestReg(response, 0, dataSize);
197        response << ", ";
198        printSrcReg(response, 0, dataSize);
199        ccprintf(response, ", %#x", imm8);
200        return response.str();
201    }
202}
203