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#include "arch/x86/insts/microop.hh"
41
42#include "arch/x86/regs/misc.hh"
43
44namespace X86ISA
45{
46
47    bool X86MicroopBase::checkCondition(uint64_t flags, int condition) const
48    {
49        CCFlagBits ccflags = flags;
50        switch(condition)
51        {
52          case ConditionTests::True:
53            return true;
54          case ConditionTests::ECF:
55            return ccflags.ecf;
56          case ConditionTests::EZF:
57            return ccflags.ezf;
58          case ConditionTests::SZnZF:
59            return !(!ccflags.ezf && ccflags.zf);
60          case ConditionTests::MSTRZ:
61            panic("This condition is not implemented!");
62          case ConditionTests::STRZ:
63            panic("This condition is not implemented!");
64          case ConditionTests::MSTRC:
65            panic("This condition is not implemented!");
66          case ConditionTests::STRZnEZF:
67            return !ccflags.ezf && ccflags.zf;
68                //And no interrupts or debug traps are waiting
69          case ConditionTests::OF:
70            return ccflags.of;
71          case ConditionTests::CF:
72            return ccflags.cf;
73          case ConditionTests::ZF:
74            return ccflags.zf;
75          case ConditionTests::CvZF:
76            return ccflags.cf | ccflags.zf;
77          case ConditionTests::SF:
78            return ccflags.sf;
79          case ConditionTests::PF:
80            return ccflags.pf;
81          case ConditionTests::SxOF:
82            return ccflags.sf ^ ccflags.of;
83          case ConditionTests::SxOvZF:
84            return (ccflags.sf ^ ccflags.of) | ccflags.zf;
85          case ConditionTests::False:
86            return false;
87          case ConditionTests::NotECF:
88            return !ccflags.ecf;
89          case ConditionTests::NotEZF:
90            return !ccflags.ezf;
91          case ConditionTests::NotSZnZF:
92            return !ccflags.ezf && ccflags.zf;
93          case ConditionTests::NotMSTRZ:
94            panic("This condition is not implemented!");
95          case ConditionTests::NotSTRZ:
96            panic("This condition is not implemented!");
97          case ConditionTests::NotMSTRC:
98            panic("This condition is not implemented!");
99          case ConditionTests::STRnZnEZF:
100            return !ccflags.ezf && !ccflags.zf;
101                //And no interrupts or debug traps are waiting
102          case ConditionTests::NotOF:
103            return !ccflags.of;
104          case ConditionTests::NotCF:
105            return !ccflags.cf;
106          case ConditionTests::NotZF:
107            return !ccflags.zf;
108          case ConditionTests::NotCvZF:
109            return !(ccflags.cf | ccflags.zf);
110          case ConditionTests::NotSF:
111            return !ccflags.sf;
112          case ConditionTests::NotPF:
113            return !ccflags.pf;
114          case ConditionTests::NotSxOF:
115            return !(ccflags.sf ^ ccflags.of);
116          case ConditionTests::NotSxOvZF:
117            return !((ccflags.sf ^ ccflags.of) | ccflags.zf);
118        }
119        panic("Unknown condition: %d\n", condition);
120        return true;
121    }
122}
123