isa_traits.hh revision 1858
110448Snilay@cs.wisc.edu/* 210448Snilay@cs.wisc.edu * Copyright (c) 2003-2005 The Regents of The University of Michigan 310448Snilay@cs.wisc.edu * All rights reserved. 410448Snilay@cs.wisc.edu * 510448Snilay@cs.wisc.edu * Redistribution and use in source and binary forms, with or without 610448Snilay@cs.wisc.edu * modification, are permitted provided that the following conditions are 710448Snilay@cs.wisc.edu * met: redistributions of source code must retain the above copyright 810448Snilay@cs.wisc.edu * notice, this list of conditions and the following disclaimer; 910448Snilay@cs.wisc.edu * redistributions in binary form must reproduce the above copyright 1010448Snilay@cs.wisc.edu * notice, this list of conditions and the following disclaimer in the 1110448Snilay@cs.wisc.edu * documentation and/or other materials provided with the distribution; 1210448Snilay@cs.wisc.edu * neither the name of the copyright holders nor the names of its 1310448Snilay@cs.wisc.edu * contributors may be used to endorse or promote products derived from 1410448Snilay@cs.wisc.edu * this software without specific prior written permission. 1510448Snilay@cs.wisc.edu * 1610448Snilay@cs.wisc.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1710448Snilay@cs.wisc.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1810448Snilay@cs.wisc.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1910448Snilay@cs.wisc.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2010448Snilay@cs.wisc.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2110448Snilay@cs.wisc.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2210447Snilay@cs.wisc.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2310447Snilay@cs.wisc.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2410447Snilay@cs.wisc.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2510447Snilay@cs.wisc.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2610447Snilay@cs.wisc.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2710447Snilay@cs.wisc.edu */ 2810447Snilay@cs.wisc.edu 2910447Snilay@cs.wisc.edu#ifndef __ARCH_ALPHA_ISA_TRAITS_HH__ 3010447Snilay@cs.wisc.edu#define __ARCH_ALPHA_ISA_TRAITS_HH__ 3110447Snilay@cs.wisc.edu 3210447Snilay@cs.wisc.edu#include "arch/alpha/faults.hh" 3310447Snilay@cs.wisc.edu#include "base/misc.hh" 3410447Snilay@cs.wisc.edu#include "config/full_system.hh" 3510447Snilay@cs.wisc.edu#include "sim/host.hh" 3610447Snilay@cs.wisc.edu 3710447Snilay@cs.wisc.educlass FastCPU; 3810447Snilay@cs.wisc.educlass FullCPU; 3910447Snilay@cs.wisc.educlass Checkpoint; 4010447Snilay@cs.wisc.edu 4110447Snilay@cs.wisc.edu#define TARGET_ALPHA 4210447Snilay@cs.wisc.edu 4310447Snilay@cs.wisc.edutemplate <class ISA> class StaticInst; 4410447Snilay@cs.wisc.edutemplate <class ISA> class StaticInstPtr; 4510447Snilay@cs.wisc.edu 4610447Snilay@cs.wisc.edunamespace EV5 { 4710447Snilay@cs.wisc.eduint DTB_ASN_ASN(uint64_t reg); 4810447Snilay@cs.wisc.eduint ITB_ASN_ASN(uint64_t reg); 4910447Snilay@cs.wisc.edu} 5010447Snilay@cs.wisc.edu 5110447Snilay@cs.wisc.educlass AlphaISA 5210447Snilay@cs.wisc.edu{ 5310447Snilay@cs.wisc.edu public: 5410447Snilay@cs.wisc.edu 5510447Snilay@cs.wisc.edu typedef uint32_t MachInst; 5610447Snilay@cs.wisc.edu typedef uint64_t Addr; 5710447Snilay@cs.wisc.edu typedef uint8_t RegIndex; 5810447Snilay@cs.wisc.edu 5910447Snilay@cs.wisc.edu enum { 6010447Snilay@cs.wisc.edu MemoryEnd = 0xffffffffffffffffULL, 6110447Snilay@cs.wisc.edu 6210447Snilay@cs.wisc.edu NumIntRegs = 32, 6310447Snilay@cs.wisc.edu NumFloatRegs = 32, 6410447Snilay@cs.wisc.edu NumMiscRegs = 32, 6510447Snilay@cs.wisc.edu 6610447Snilay@cs.wisc.edu MaxRegsOfAnyType = 32, 6710447Snilay@cs.wisc.edu // Static instruction parameters 6810447Snilay@cs.wisc.edu MaxInstSrcRegs = 3, 6910447Snilay@cs.wisc.edu MaxInstDestRegs = 2, 7010447Snilay@cs.wisc.edu 7110447Snilay@cs.wisc.edu // semantically meaningful register indices 7210447Snilay@cs.wisc.edu ZeroReg = 31, // architecturally meaningful 7310447Snilay@cs.wisc.edu // the rest of these depend on the ABI 7410447Snilay@cs.wisc.edu StackPointerReg = 30, 7510447Snilay@cs.wisc.edu GlobalPointerReg = 29, 7610447Snilay@cs.wisc.edu ReturnAddressReg = 26, 7710447Snilay@cs.wisc.edu ReturnValueReg = 0, 7810447Snilay@cs.wisc.edu ArgumentReg0 = 16, 7910447Snilay@cs.wisc.edu ArgumentReg1 = 17, 8010447Snilay@cs.wisc.edu ArgumentReg2 = 18, 8110447Snilay@cs.wisc.edu ArgumentReg3 = 19, 8210447Snilay@cs.wisc.edu ArgumentReg4 = 20, 8310447Snilay@cs.wisc.edu ArgumentReg5 = 21, 8410447Snilay@cs.wisc.edu 8510447Snilay@cs.wisc.edu LogVMPageSize = 13, // 8K bytes 8610447Snilay@cs.wisc.edu VMPageSize = (1 << LogVMPageSize), 8710447Snilay@cs.wisc.edu 8810447Snilay@cs.wisc.edu BranchPredAddrShiftAmt = 2, // instructions are 4-byte aligned 8910447Snilay@cs.wisc.edu 9010447Snilay@cs.wisc.edu WordBytes = 4, 9110447Snilay@cs.wisc.edu HalfwordBytes = 2, 9210447Snilay@cs.wisc.edu ByteBytes = 1, 9310447Snilay@cs.wisc.edu DepNA = 0, 9410447Snilay@cs.wisc.edu }; 9510447Snilay@cs.wisc.edu 9610447Snilay@cs.wisc.edu // These enumerate all the registers for dependence tracking. 9710447Snilay@cs.wisc.edu enum DependenceTags { 9810447Snilay@cs.wisc.edu // 0..31 are the integer regs 0..31 9910447Snilay@cs.wisc.edu // 32..63 are the FP regs 0..31, i.e. use (reg + FP_Base_DepTag) 10010447Snilay@cs.wisc.edu FP_Base_DepTag = 32, 10110447Snilay@cs.wisc.edu Ctrl_Base_DepTag = 64, 10210447Snilay@cs.wisc.edu Fpcr_DepTag = 64, // floating point control register 10310447Snilay@cs.wisc.edu Uniq_DepTag = 65, 10410447Snilay@cs.wisc.edu IPR_Base_DepTag = 66 10510447Snilay@cs.wisc.edu }; 10610447Snilay@cs.wisc.edu 10710447Snilay@cs.wisc.edu typedef uint64_t IntReg; 10810447Snilay@cs.wisc.edu typedef IntReg IntRegFile[NumIntRegs]; 10910447Snilay@cs.wisc.edu 11010447Snilay@cs.wisc.edu // floating point register file entry type 11110447Snilay@cs.wisc.edu typedef union { 11210447Snilay@cs.wisc.edu uint64_t q; 11310447Snilay@cs.wisc.edu double d; 11410447Snilay@cs.wisc.edu } FloatReg; 11510447Snilay@cs.wisc.edu 11610447Snilay@cs.wisc.edu typedef union { 11710447Snilay@cs.wisc.edu uint64_t q[NumFloatRegs]; // integer qword view 11810447Snilay@cs.wisc.edu double d[NumFloatRegs]; // double-precision floating point view 11910447Snilay@cs.wisc.edu } FloatRegFile; 12010447Snilay@cs.wisc.edu 12110447Snilay@cs.wisc.edu // control register file contents 12210447Snilay@cs.wisc.edu typedef uint64_t MiscReg; 12310447Snilay@cs.wisc.edu typedef struct { 12410447Snilay@cs.wisc.edu uint64_t fpcr; // floating point condition codes 12510447Snilay@cs.wisc.edu uint64_t uniq; // process-unique register 12610447Snilay@cs.wisc.edu bool lock_flag; // lock flag for LL/SC 12710447Snilay@cs.wisc.edu Addr lock_addr; // lock address for LL/SC 12810447Snilay@cs.wisc.edu } MiscRegFile; 12910447Snilay@cs.wisc.edu 13010447Snilay@cs.wisc.edustatic const Addr PageShift = 13; 13110447Snilay@cs.wisc.edustatic const Addr PageBytes = ULL(1) << PageShift; 13210447Snilay@cs.wisc.edustatic const Addr PageMask = ~(PageBytes - 1); 13310447Snilay@cs.wisc.edustatic const Addr PageOffset = PageBytes - 1; 13410447Snilay@cs.wisc.edu 13510447Snilay@cs.wisc.edu#if FULL_SYSTEM 13610447Snilay@cs.wisc.edu 13710447Snilay@cs.wisc.edu typedef uint64_t InternalProcReg; 13810447Snilay@cs.wisc.edu 13910447Snilay@cs.wisc.edu#include "arch/alpha/isa_fullsys_traits.hh" 14010447Snilay@cs.wisc.edu 14110447Snilay@cs.wisc.edu#else 14210447Snilay@cs.wisc.edu enum { 14310447Snilay@cs.wisc.edu NumInternalProcRegs = 0 14410447Snilay@cs.wisc.edu }; 14510447Snilay@cs.wisc.edu#endif 14610447Snilay@cs.wisc.edu 14710447Snilay@cs.wisc.edu enum { 14810447Snilay@cs.wisc.edu TotalNumRegs = 14910447Snilay@cs.wisc.edu NumIntRegs + NumFloatRegs + NumMiscRegs + NumInternalProcRegs 15010447Snilay@cs.wisc.edu }; 15110447Snilay@cs.wisc.edu 15210447Snilay@cs.wisc.edu enum { 15310447Snilay@cs.wisc.edu TotalDataRegs = NumIntRegs + NumFloatRegs 15410447Snilay@cs.wisc.edu }; 15510447Snilay@cs.wisc.edu 15610447Snilay@cs.wisc.edu typedef union { 15710447Snilay@cs.wisc.edu IntReg intreg; 15810447Snilay@cs.wisc.edu FloatReg fpreg; 15910447Snilay@cs.wisc.edu MiscReg ctrlreg; 16010447Snilay@cs.wisc.edu } AnyReg; 16110447Snilay@cs.wisc.edu 16210447Snilay@cs.wisc.edu struct RegFile { 16310447Snilay@cs.wisc.edu IntRegFile intRegFile; // (signed) integer register file 16410447Snilay@cs.wisc.edu FloatRegFile floatRegFile; // floating point register file 16510447Snilay@cs.wisc.edu MiscRegFile miscRegs; // control register file 16610447Snilay@cs.wisc.edu Addr pc; // program counter 16710447Snilay@cs.wisc.edu Addr npc; // next-cycle program counter 16810447Snilay@cs.wisc.edu#if FULL_SYSTEM 16910447Snilay@cs.wisc.edu IntReg palregs[NumIntRegs]; // PAL shadow registers 17010447Snilay@cs.wisc.edu InternalProcReg ipr[NumInternalProcRegs]; // internal processor regs 17110447Snilay@cs.wisc.edu int intrflag; // interrupt flag 17210447Snilay@cs.wisc.edu bool pal_shadow; // using pal_shadow registers 17310447Snilay@cs.wisc.edu inline int instAsid() { return EV5::ITB_ASN_ASN(ipr[IPR_ITB_ASN]); } 17410447Snilay@cs.wisc.edu inline int dataAsid() { return EV5::DTB_ASN_ASN(ipr[IPR_DTB_ASN]); } 17510447Snilay@cs.wisc.edu#endif // FULL_SYSTEM 17610447Snilay@cs.wisc.edu 17710447Snilay@cs.wisc.edu void serialize(std::ostream &os); 17810447Snilay@cs.wisc.edu void unserialize(Checkpoint *cp, const std::string §ion); 17910447Snilay@cs.wisc.edu }; 18010447Snilay@cs.wisc.edu 18110447Snilay@cs.wisc.edu static StaticInstPtr<AlphaISA> decodeInst(MachInst); 18210447Snilay@cs.wisc.edu 18310447Snilay@cs.wisc.edu // return a no-op instruction... used for instruction fetch faults 18410447Snilay@cs.wisc.edu static const MachInst NoopMachInst; 18510447Snilay@cs.wisc.edu 18610447Snilay@cs.wisc.edu enum annotes { 18710447Snilay@cs.wisc.edu ANNOTE_NONE = 0, 18810447Snilay@cs.wisc.edu // An impossible number for instruction annotations 18910447Snilay@cs.wisc.edu ITOUCH_ANNOTE = 0xffffffff, 19010447Snilay@cs.wisc.edu }; 19110447Snilay@cs.wisc.edu 19210447Snilay@cs.wisc.edu static inline bool isCallerSaveIntegerRegister(unsigned int reg) { 19310447Snilay@cs.wisc.edu panic("register classification not implemented"); 19410447Snilay@cs.wisc.edu return (reg >= 1 && reg <= 8 || reg >= 22 && reg <= 25 || reg == 27); 19510447Snilay@cs.wisc.edu } 19610447Snilay@cs.wisc.edu 19710447Snilay@cs.wisc.edu static inline bool isCalleeSaveIntegerRegister(unsigned int reg) { 19810447Snilay@cs.wisc.edu panic("register classification not implemented"); 19910447Snilay@cs.wisc.edu return (reg >= 9 && reg <= 15); 20010447Snilay@cs.wisc.edu } 20110447Snilay@cs.wisc.edu 20210447Snilay@cs.wisc.edu static inline bool isCallerSaveFloatRegister(unsigned int reg) { 20310447Snilay@cs.wisc.edu panic("register classification not implemented"); 20410447Snilay@cs.wisc.edu return false; 20510447Snilay@cs.wisc.edu } 20610447Snilay@cs.wisc.edu 20710447Snilay@cs.wisc.edu static inline bool isCalleeSaveFloatRegister(unsigned int reg) { 20810447Snilay@cs.wisc.edu panic("register classification not implemented"); 20910447Snilay@cs.wisc.edu return false; 21010447Snilay@cs.wisc.edu } 21110447Snilay@cs.wisc.edu 21210447Snilay@cs.wisc.edu static inline Addr alignAddress(const Addr &addr, 21310447Snilay@cs.wisc.edu unsigned int nbytes) { 21410447Snilay@cs.wisc.edu return (addr & ~(nbytes - 1)); 21510447Snilay@cs.wisc.edu } 21610447Snilay@cs.wisc.edu 21710447Snilay@cs.wisc.edu // Instruction address compression hooks 21810447Snilay@cs.wisc.edu static inline Addr realPCToFetchPC(const Addr &addr) { 21910447Snilay@cs.wisc.edu return addr; 22010447Snilay@cs.wisc.edu } 22110447Snilay@cs.wisc.edu 22210447Snilay@cs.wisc.edu static inline Addr fetchPCToRealPC(const Addr &addr) { 22310447Snilay@cs.wisc.edu return addr; 22410447Snilay@cs.wisc.edu } 22510447Snilay@cs.wisc.edu 22610447Snilay@cs.wisc.edu // the size of "fetched" instructions (not necessarily the size 22710447Snilay@cs.wisc.edu // of real instructions for PISA) 22810447Snilay@cs.wisc.edu static inline size_t fetchInstSize() { 22910447Snilay@cs.wisc.edu return sizeof(MachInst); 23010447Snilay@cs.wisc.edu } 23110447Snilay@cs.wisc.edu 23210447Snilay@cs.wisc.edu static inline MachInst makeRegisterCopy(int dest, int src) { 23310447Snilay@cs.wisc.edu panic("makeRegisterCopy not implemented"); 23410447Snilay@cs.wisc.edu return 0; 23510447Snilay@cs.wisc.edu } 23610447Snilay@cs.wisc.edu 23710447Snilay@cs.wisc.edu // Machine operations 23810447Snilay@cs.wisc.edu 23910447Snilay@cs.wisc.edu static void saveMachineReg(AnyReg &savereg, const RegFile ®_file, 24010447Snilay@cs.wisc.edu int regnum); 24110447Snilay@cs.wisc.edu 24210447Snilay@cs.wisc.edu static void restoreMachineReg(RegFile ®s, const AnyReg ®, 24310447Snilay@cs.wisc.edu int regnum); 24410447Snilay@cs.wisc.edu 24510447Snilay@cs.wisc.edu#if 0 24610447Snilay@cs.wisc.edu static void serializeSpecialRegs(const Serializable::Proxy &proxy, 24710447Snilay@cs.wisc.edu const RegFile ®s); 24810447Snilay@cs.wisc.edu 24910447Snilay@cs.wisc.edu static void unserializeSpecialRegs(const IniFile *db, 25010447Snilay@cs.wisc.edu const std::string &category, 25110447Snilay@cs.wisc.edu ConfigNode *node, 25210447Snilay@cs.wisc.edu RegFile ®s); 25310447Snilay@cs.wisc.edu#endif 25410447Snilay@cs.wisc.edu 25510447Snilay@cs.wisc.edu /** 25610447Snilay@cs.wisc.edu * Function to insure ISA semantics about 0 registers. 25710447Snilay@cs.wisc.edu * @param xc The execution context. 25810447Snilay@cs.wisc.edu */ 25910447Snilay@cs.wisc.edu template <class XC> 26010447Snilay@cs.wisc.edu static void zeroRegisters(XC *xc); 26110447Snilay@cs.wisc.edu}; 26210447Snilay@cs.wisc.edu 26310447Snilay@cs.wisc.edu 26410447Snilay@cs.wisc.edutypedef AlphaISA TheISA; 26510447Snilay@cs.wisc.edu 26610447Snilay@cs.wisc.edutypedef TheISA::MachInst MachInst; 26710447Snilay@cs.wisc.edutypedef TheISA::Addr Addr; 26810447Snilay@cs.wisc.edutypedef TheISA::RegIndex RegIndex; 26910447Snilay@cs.wisc.edutypedef TheISA::IntReg IntReg; 27010447Snilay@cs.wisc.edutypedef TheISA::IntRegFile IntRegFile; 27110447Snilay@cs.wisc.edutypedef TheISA::FloatReg FloatReg; 27210447Snilay@cs.wisc.edutypedef TheISA::FloatRegFile FloatRegFile; 27310447Snilay@cs.wisc.edutypedef TheISA::MiscReg MiscReg; 27410447Snilay@cs.wisc.edutypedef TheISA::MiscRegFile MiscRegFile; 27510447Snilay@cs.wisc.edutypedef TheISA::AnyReg AnyReg; 27610447Snilay@cs.wisc.edutypedef TheISA::RegFile RegFile; 27710447Snilay@cs.wisc.edu 27810447Snilay@cs.wisc.educonst int NumIntRegs = TheISA::NumIntRegs; 27910447Snilay@cs.wisc.educonst int NumFloatRegs = TheISA::NumFloatRegs; 28010447Snilay@cs.wisc.educonst int NumMiscRegs = TheISA::NumMiscRegs; 28110447Snilay@cs.wisc.educonst int TotalNumRegs = TheISA::TotalNumRegs; 28210447Snilay@cs.wisc.educonst int VMPageSize = TheISA::VMPageSize; 28310447Snilay@cs.wisc.educonst int LogVMPageSize = TheISA::LogVMPageSize; 28410447Snilay@cs.wisc.educonst int ZeroReg = TheISA::ZeroReg; 28510447Snilay@cs.wisc.educonst int StackPointerReg = TheISA::StackPointerReg; 28610447Snilay@cs.wisc.educonst int GlobalPointerReg = TheISA::GlobalPointerReg; 28710447Snilay@cs.wisc.educonst int ReturnAddressReg = TheISA::ReturnAddressReg; 28810447Snilay@cs.wisc.educonst int ReturnValueReg = TheISA::ReturnValueReg; 28910447Snilay@cs.wisc.educonst int ArgumentReg0 = TheISA::ArgumentReg0; 29010447Snilay@cs.wisc.educonst int ArgumentReg1 = TheISA::ArgumentReg1; 29110447Snilay@cs.wisc.educonst int ArgumentReg2 = TheISA::ArgumentReg2; 29210447Snilay@cs.wisc.educonst int BranchPredAddrShiftAmt = TheISA::BranchPredAddrShiftAmt; 29310447Snilay@cs.wisc.educonst int MaxAddr = (Addr)-1; 29410447Snilay@cs.wisc.edu 29510447Snilay@cs.wisc.edu#if !FULL_SYSTEM 29610447Snilay@cs.wisc.educlass SyscallReturn { 29710447Snilay@cs.wisc.edu public: 29810447Snilay@cs.wisc.edu template <class T> 29910447Snilay@cs.wisc.edu SyscallReturn(T v, bool s) 30010447Snilay@cs.wisc.edu { 30110447Snilay@cs.wisc.edu retval = (uint64_t)v; 30210447Snilay@cs.wisc.edu success = s; 30310447Snilay@cs.wisc.edu } 30410447Snilay@cs.wisc.edu 30510447Snilay@cs.wisc.edu template <class T> 30610447Snilay@cs.wisc.edu SyscallReturn(T v) 30710447Snilay@cs.wisc.edu { 30810447Snilay@cs.wisc.edu success = (v >= 0); 30910447Snilay@cs.wisc.edu retval = (uint64_t)v; 31010447Snilay@cs.wisc.edu } 31110447Snilay@cs.wisc.edu 31210447Snilay@cs.wisc.edu ~SyscallReturn() {} 31310447Snilay@cs.wisc.edu 31410447Snilay@cs.wisc.edu SyscallReturn& operator=(const SyscallReturn& s) { 31510447Snilay@cs.wisc.edu retval = s.retval; 31610447Snilay@cs.wisc.edu success = s.success; 31710447Snilay@cs.wisc.edu return *this; 31810447Snilay@cs.wisc.edu } 31910447Snilay@cs.wisc.edu 32010447Snilay@cs.wisc.edu bool successful() { return success; } 32110447Snilay@cs.wisc.edu uint64_t value() { return retval; } 32210447Snilay@cs.wisc.edu 32310447Snilay@cs.wisc.edu 32410447Snilay@cs.wisc.edu private: 32510447Snilay@cs.wisc.edu uint64_t retval; 32610447Snilay@cs.wisc.edu bool success; 32710447Snilay@cs.wisc.edu}; 32810447Snilay@cs.wisc.edu 32910447Snilay@cs.wisc.edu#endif 33010447Snilay@cs.wisc.edu 33110447Snilay@cs.wisc.edu 33210447Snilay@cs.wisc.edu#if FULL_SYSTEM 33310447Snilay@cs.wisc.edutypedef TheISA::InternalProcReg InternalProcReg; 33410447Snilay@cs.wisc.educonst int NumInternalProcRegs = TheISA::NumInternalProcRegs; 33510447Snilay@cs.wisc.educonst int NumInterruptLevels = TheISA::NumInterruptLevels; 33610447Snilay@cs.wisc.edu 33710447Snilay@cs.wisc.edu#include "arch/alpha/ev5.hh" 33810447Snilay@cs.wisc.edu#endif 33910447Snilay@cs.wisc.edu 34010447Snilay@cs.wisc.edu#endif // __ARCH_ALPHA_ISA_TRAITS_HH__ 34110447Snilay@cs.wisc.edu