# Copyright (c) 2003-2005 The Regents of The University of Michigan
# Copyright (c) 2013 Advanced Micro Devices, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met: redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer;
# redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution;
# neither the name of the copyright holders nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# Authors: Steve Reinhardt

from m5.params import *

# Set of boolean static instruction properties.
#
# Notes:
# - The IsInteger and IsFloating flags are based on the class of registers
# accessed by the instruction.  Although most instructions will have exactly
# one of these two flags set, it is possible for an instruction to have
# neither (e.g., direct unconditional branches, memory barriers) or both
# (e.g., an FP/int conversion).
# - If IsMemRef is set, then exactly one of IsLoad or IsStore will be set.
# - If IsControl is set, then exactly one of IsDirectControl or IsIndirect
# Control will be set, and exactly one of IsCondControl or IsUncondControl
# will be set.
# - IsSerializing, IsMemBarrier, and IsWriteBarrier are implemented as flags
# since in the current model there's no other way for instructions to inject
# behavior into the pipeline outside of fetch.  Once we go to an exec-in-exec
# CPU model we should be able to get rid of these flags and implement this
# behavior via the execute() methods.

class StaticInstFlags(Enum):
    wrapper_name = 'StaticInstFlags'
    wrapper_is_struct = True
    enum_name = 'Flags'

    vals = [
        'IsNop',            # Is a no-op (no effect at all).

        'IsInteger',        # References integer regs.
        'IsFloating',       # References FP regs.
        'IsCC',             # References CC regs.
        'IsVector',         # References Vector regs.
        'IsVectorElem',     # References Vector reg elems.

        'IsMemRef',         # References memory (load, store, or prefetch)
        'IsLoad',           # Reads from memory (load or prefetch).
        'IsStore',          # Writes to memory.
        'IsAtomic',         # Does atomic RMW to memory.
        'IsStoreConditional',   # Store conditional instruction.
        'IsIndexed',        # Accesses memory with an indexed address
                            # computation
        'IsInstPrefetch',   # Instruction-cache prefetch.
        'IsDataPrefetch',   # Data-cache prefetch.

        'IsControl',        # Control transfer instruction.
        'IsDirectControl',  # PC relative control transfer.
        'IsIndirectControl',# Register indirect control transfer.
        'IsCondControl',    # Conditional control transfer.
        'IsUncondControl',  # Unconditional control transfer.
        'IsCall',           # Subroutine call.
        'IsReturn',         # Subroutine return.

        'IsCondDelaySlot',  # Conditional Delay-Slot Instruction

        'IsThreadSync',     # Thread synchronization operation.

        'IsSerializing',    # Serializes pipeline: won't execute until all
                            # older instructions have committed.
        'IsSerializeBefore',
        'IsSerializeAfter',
        'IsMemBarrier',     # Is a memory barrier
        'IsWriteBarrier',   # Is a write barrier
        'IsReadBarrier',    # Is a read barrier
        'IsERET',           # <- Causes the IFU to stall (MIPS ISA)

        'IsNonSpeculative', # Should not be executed speculatively
        'IsQuiesce',        # Is a quiesce instruction

        'IsIprAccess',      # Accesses IPRs
        'IsUnverifiable',   # Can't be verified by a checker

        'IsSyscall',        # Causes a system call to be emulated in syscall
                            # emulation mode.

        # Flags for microcode
        'IsMacroop',        # Is a macroop containing microops
        'IsMicroop',        # Is a microop
        'IsDelayedCommit',  # This microop doesn't commit right away
        'IsLastMicroop',    # This microop ends a microop sequence
        'IsFirstMicroop',   # This microop begins a microop sequence
        # This flag doesn't do anything yet
        'IsMicroBranch',    # This microop branches within the microcode for
                            # a macroop
        'IsDspOp',
        'IsSquashAfter'     # Squash all uncommitted state after executed
        ]
