"I am a person who works hard and plays hard."

Yuan Wei
Second Year Graduate Student Department of Computer Science
University of Virginia Charlottesville, VA 22903
Email: yw3f@cs.virginia.edu


Source Code Analysis

Main Page   Compound List   File List   Compound Members   File Members  

alpha.def

Go to the documentation of this file.
00001 /* This doesn't look like -*- C -*-, but it is!
00002  *
00003  * alpha.def - Alpha ISA machine definition
00004  *
00005  * This file is a part of the SimpleScalar tool suite written by
00006  * Todd M. Austin as a part of the Multiscalar Research Project.
00007  *  
00008  * The tool suite is currently maintained by Doug Burger and Todd M. Austin.
00009  * 
00010  * Copyright (C) 1997, 1998 by Todd M. Austin
00011  *
00012  * This source file is distributed "as is" in the hope that it will be
00013  * useful.  The tool set comes with no warranty, and no author or
00014  * distributor accepts any responsibility for the consequences of its
00015  * use. 
00016  * 
00017  * Everyone is granted permission to copy, modify and redistribute
00018  * this tool set under the following conditions:
00019  * 
00020  *    This source code is distributed for non-commercial use only. 
00021  *    Please contact the maintainer for restrictions applying to 
00022  *    commercial use.
00023  *
00024  *    Permission is granted to anyone to make or distribute copies
00025  *    of this source code, either as received or modified, in any
00026  *    medium, provided that all copyright notices, permission and
00027  *    nonwarranty notices are preserved, and that the distributor
00028  *    grants the recipient permission for further redistribution as
00029  *    permitted by this document.
00030  *
00031  *    Permission is granted to distribute this file in compiled
00032  *    or executable form under the same conditions that apply for
00033  *    source code, provided that either:
00034  *
00035  *    A. it is accompanied by the corresponding machine-readable
00036  *       source code,
00037  *    B. it is accompanied by a written offer, with no time limit,
00038  *       to give anyone a machine-readable copy of the corresponding
00039  *       source code in return for reimbursement of the cost of
00040  *       distribution.  This written offer must permit verbatim
00041  *       duplication by anyone, or
00042  *    C. it is distributed by someone who received only the
00043  *       executable form, and is accompanied by a copy of the
00044  *       written offer of source code that they received concurrently.
00045  *
00046  * In other words, you are welcome to use, share and improve this
00047  * source file.  You are forbidden to forbid anyone else to use, share
00048  * and improve what you give them.
00049  *
00050  * INTERNET: dburger@cs.wisc.edu
00051  * US Mail:  1210 W. Dayton Street, Madison, WI 53706
00052  *
00053  * $Id: alpha.def,v 1.1.1.1 2000/05/26 15:22:27 taustin Exp $
00054  *
00055  * $Log: alpha.def,v $
00056  * Revision 1.1.1.1  2000/05/26 15:22:27  taustin
00057  * SimpleScalar Tool Set
00058  *
00059  *
00060  * Revision 1.5  1999/12/31 18:56:17  taustin
00061  * quad_t naming conflicts removed
00062  * Alpha instruction set extensions (MVI, BWX, AMASK, IMPLVER, etc...)
00063  * 21-bit conditional branch offset fix
00064  *
00065  * Revision 1.4  1999/12/13 18:59:20  taustin
00066  * debug printf's removed
00067  *
00068  * Revision 1.3  1999/03/08 06:39:41  taustin
00069  * added Alpha BWX ISA extensions (byte and word loads)
00070  *
00071  * Revision 1.2  1998/08/31 17:14:07  taustin
00072  * fixed MS VC++ shift-by-64bit problems in EXT* instructions
00073  * fixed MS VC++ qword to double problem in FPCR instruction
00074  *
00075  * Revision 1.1  1998/08/27 16:53:47  taustin
00076  * Initial revision
00077  *
00078  *
00079  */
00080 
00081 /* FIXME: these comments are out-of-date */
00082 
00083 /* This file defines all aspects of the SimpleScalar instruction set
00084  * architecture.  Each instruction set in the architecture has a DEFINST()
00085  * macro call included below.  The contents of a instruction definition are
00086  * as follows:
00087  *
00088  *   DEFINST(<enum>,                    <opcode>,
00089  *           <opname>,                  <operands>,
00090  *           <fu_req>,                  <iflags>,
00091  *           <output deps...>,          <input deps...>,
00092  *           <expr>)
00093  *
00094  * Where:
00095  *
00096  *   <enum>     - is an enumerator that is returned when an instruction is
00097  *                decoded by SS_OP_ENUM()
00098  *   <opcode>   - is the opcode of this instruction
00099  *   <opname>   - name of this instruction as a string, used by disassembler
00100  *   <operands> - specified the instruction operand fields and their printed
00101  *                order for disassembly, used by disassembler, the recognized
00102  *                operand field are (the instruction format is detailed in
00103  *                the header file ss.h):
00104  *                  J - target field
00105  *                  j - PC relative target (offset + PC)
00106  *                  s - S register field
00107  *                  b - S register field (base register)
00108  *                  t - T register field
00109  *                  d - D register field
00110  *                  S - S register field (FP register)
00111  *                  T - T register field (FP register)
00112  *                  D - D register field (FP register)
00113  *                  o - load address offset (offset)
00114  *                  i - signed immediate field value
00115  *                  u - unsigned immediate field value
00116  *                  U - upper immediate field value
00117  *                  H - shift amount immediate field value
00118  *                  B - break code
00119  *
00120  *   <fu_req>   - functional unit requirements for this instruction
00121  *   <iflags>   - instruction flags, accessible via the SS_OP_FLAGS()
00122  *                macro, flags are defined with F_* prefix in ss.h
00123  *   <output deps...>
00124  *              - a list of up to two output dependency designators, the
00125  *                following designators are recognized (place an DNA in any
00126  *                unused fields:
00127  *                  DGPR(N)   - general purpose register N
00128  *                  DGPR_D(N) - double word general purpose register N
00129  *                  DCGPR(N)  - general purpose register conditional on
00130  *                              pre/post- increment/decrement mode
00131  *                  DFPR_L(N) - floating-point register N, as word
00132  *                  DFPR_F(N) - floating-point reg N, as single-prec float
00133  *                  DFPR_D(N) - floating-point reg N, as double-prec double
00134  *                  DHI       - HI result register
00135  *                  DLO       - LO result register
00136  *                  DFCC      - floating point condition codes
00137  *                  DCPC      - current PC
00138  *                  DNPC      - next PC
00139  *                  DNA       - no dependence
00140  *
00141  *   <input deps...>
00142  *              - a list of up to three input dependency designators, the
00143  *                designators are defined above (place an DNA in any unused
00144  *                fields.
00145  *
00146  *   <expr>     - a C expression that implements the instruction being
00147  *                defined, the expression must modify all architected state
00148  *                affected by the instruction's execution, by default, the
00149  *                next PC (NPC) value defaults to the current PC (CPC) plus
00150  *                SS_INST_SIZE, as a result, only taken branches need to set
00151  *                NPC
00152  *
00153  *                The following predefined macros are available for use in
00154  *                DEFINST() instruction expressions to access the value of
00155  *                instruction operand/opcode field values:
00156  *
00157  *                  RS      - RS register field value
00158  *                  RT      - RT register field value
00159  *                  RD      - RD register field value
00160  *                  FS      - RS register field value
00161  *                  FT      - RT register field value
00162  *                  FD      - RD register field value
00163  *                  BS      - RS register field value
00164  *                  TARG    - jump target field value
00165  *                  OFS     - signed offset field value
00166  *                  IMM     - signed offset field value
00167  *                  UIMM    - unsigned offset field value
00168  *                  SHAMT   - shift amount field value
00169  *                  BCODE   - break code field value
00170  *
00171  *                To facilitate the construction of performance simulators
00172  *                (which may want to specialize their architected state
00173  *                storage format), all architected register and memory state
00174  *                is accessed through the following macros:
00175  *
00176  *                  GPR(N)         - read general purpose register N
00177  *                  SET_GPR(N,E)   - write general purpose register N with E
00178  *                  GPR_D(N)       - read double word general purpose reg N
00179  *                  SET_GPR_D(N,E) - write double word gen purpose reg N w/ E
00180  *                  FPR_L(N)       - read floating-point register N, as word
00181  *                  SET_FPR_L(N,E) - floating-point reg N, as word, with E
00182  *                  FPR_F(N)       - read FP reg N, as single-prec float
00183  *                  SET_FPR_F(N,E) - write FP reg N, as single-prec float w/ E
00184  *                  FPR_D(N)       - read FP reg N, as double-prec double
00185  *                  SET_FPR_D(N,E) - write FP reg N, as double-prec double w/E
00186  *                  HI             - read HI result register
00187  *                  SET_HI(E)      - write HI result register with E
00188  *                  LO             - read LO result register
00189  *                  SET_LO(E)      - write LO result register with E
00190  *                  FCC            - read floating point condition codes
00191  *                  SET_FCC(E)     - write floating point condition codes w/ E
00192  *                  CPC            - read current PC register
00193  *                  NPC            - read next PC register
00194  *                  SET_NPC(E)     - write next PC register with E
00195  *                  TPC            - read target PC register
00196  *                  SET_TPC(E)     - write target PC register with E
00197  *
00198  *                  READ_SIGNED_BYTE(A)   - read signed byte from address A
00199  *                  READ_UNSIGNED_BYTE(A) - read unsigned byte from address A
00200  *                  READ_SIGNED_HALF(A)   - read signed half from address A
00201  *                  READ_UNSIGNED_HALF(A) - read unsigned half from address A
00202  *                  READ_WORD(A)          - read word from address A
00203  *                  WRITE_BYTE(E,A)       - write byte value E to address A
00204  *                  WRITE_HALF(E,A)       - write half value E to address A
00205  *                  WRITE_WORD(E,A)       - write word value E to address A
00206  *
00207  *                Finally, the following helper functions are available to
00208  *                assist in the construction of instruction expressions:
00209  *
00210  *                  INC_DEC(E,N,S) - execute E and update N as per pre/post-
00211  *                                   incr/decr addressing sementics for an
00212  *                                   access of S bytes
00213  *                  OVER(X,Y)      - check for overflow for X+Y, both signed
00214  *                  UNDER(X,Y)     - check for umderflow for X-Y, both signed
00215  *                  DIV0(N)        - check for divide by zero, N is denom
00216  *                  INTALIGN(N)    - check double word int reg N alignment
00217  *                  FPALIGN(N)     - check double word FP reg N alignment
00218  *                  TALIGN(T)      - check jump target T alignment
00219  */
00220 
00221 #if 0
00222 /* TOP LEVEL decode table */
00223 DEFLINK(TOPLEV, 0x00, "toplev", 26, 0x3f)
00224 CONNECT(TOPLEV)
00225 #endif
00226 
00227 DEFLINK(CALL_PAL, 0x00, "call_pal", 0, 0xff)
00228 
00229 #define LDA_IMPL                                                        \
00230   {                                                                     \
00231     SET_GPR(RA, GPR(RB) + SEXT(OFS));                                   \
00232   }
00233 DEFINST(LDA,                    0x08,
00234         "lda",                  "a,o(b)",
00235         IntALU,                 F_ICOMP,
00236         DGPR(RA), DNA,          DNA, DGPR(RB), DNA)
00237 
00238 #define LDAH_IMPL                                                       \
00239   {                                                                     \
00240     SET_GPR(RA, GPR(RB) + SEXT32(65536 * OFS));                         \
00241   }
00242 DEFINST(LDAH,                   0x09,
00243         "ldah",                 "a,o(b)",
00244         IntALU,                 F_ICOMP,
00245         DGPR(RA), DNA,          DNA, DGPR(RB), DNA)
00246 
00247 /* EV56 BWX extension... */
00248 #define LDBU_IMPL                                                       \
00249   {                                                                     \
00250     byte_t _result;                                                     \
00251     enum md_fault_type _fault;                                          \
00252                                                                         \
00253     _result = READ_BYTE(GPR(RB) + SEXT(OFS), _fault);                   \
00254     if (_fault != md_fault_none)                                        \
00255       DECLARE_FAULT(_fault);                                            \
00256                                                                         \
00257     SET_GPR(RA, (qword_t)_result);                                      \
00258   }
00259 DEFINST(LDBU,                   0x0a,
00260         "ldbu",                 "a,o(b)",
00261         RdPort,                 F_MEM|F_LOAD|F_DISP,
00262         DGPR(RA), DNA,          DNA, DGPR(RB), DNA)
00263 
00264 #define LDQ_U_IMPL                                                      \
00265   {                                                                     \
00266     qword_t _result;                                                    \
00267     enum md_fault_type _fault;                                          \
00268                                                                         \
00269     _result = READ_QWORD((GPR(RB) + SEXT(OFS)) & ~7, _fault);           \
00270     if (_fault != md_fault_none)                                        \
00271       DECLARE_FAULT(_fault);                                            \
00272                                                                         \
00273     SET_GPR(RA, _result);                                               \
00274   }
00275 DEFINST(LDQ_U,                  0x0b,
00276         "ldq_u",                "a,o(b)",
00277         RdPort,                 F_MEM|F_LOAD|F_DISP,
00278         DGPR(RA), DNA,          DNA, DGPR(RB), DNA)
00279 
00280 /* EV56 BWX extension... */
00281 #define LDWU_IMPL                                                       \
00282   {                                                                     \
00283     half_t _result;                                                     \
00284     enum md_fault_type _fault;                                          \
00285                                                                         \
00286     _result = READ_HALF(GPR(RB) + SEXT(OFS), _fault);                   \
00287     if (_fault != md_fault_none)                                        \
00288       DECLARE_FAULT(_fault);                                            \
00289                                                                         \
00290     SET_GPR(RA, (qword_t)_result);                                      \
00291   }
00292 DEFINST(LDWU,                   0x0c,
00293         "ldwu",                 "a,o(b)",
00294         RdPort,                 F_MEM|F_LOAD|F_DISP,
00295         DGPR(RA), DNA,          DNA, DGPR(RB), DNA)
00296 
00297 /* EV56 BWX extension... */
00298 #define STW_IMPL                                                        \
00299   {                                                                     \
00300     enum md_fault_type _fault;                                          \
00301                                                                         \
00302     WRITE_HALF((half_t)GPR(RA), GPR(RB) + SEXT(OFS), _fault);           \
00303     if (_fault != md_fault_none)                                        \
00304       DECLARE_FAULT(_fault);                                            \
00305   }
00306 DEFINST(STW,                    0x0d,
00307         "stw",                  "a,o(b)",
00308         WrPort,                 F_MEM|F_STORE|F_DISP,
00309         DNA, DNA,               DGPR(RA), DGPR(RB), DNA)
00310 
00311 /* EV56 BWX extension... */
00312 #define STB_IMPL                                                        \
00313   {                                                                     \
00314     enum md_fault_type _fault;                                          \
00315                                                                         \
00316     WRITE_BYTE((byte_t)GPR(RA), GPR(RB) + SEXT(OFS), _fault);           \
00317     if (_fault != md_fault_none)                                        \
00318       DECLARE_FAULT(_fault);                                            \
00319   }
00320 DEFINST(STB,                    0x0e,
00321         "stb",                  "a,o(b)",
00322         WrPort,                 F_MEM|F_STORE|F_DISP,
00323         DNA, DNA,               DGPR(RA), DGPR(RB), DNA)
00324 
00325 #define STQ_U_IMPL                                                      \
00326   {                                                                     \
00327     enum md_fault_type _fault;                                          \
00328                                                                         \
00329     WRITE_QWORD(GPR(RA), (GPR(RB) + SEXT(OFS)) & ~7, _fault);           \
00330     if (_fault != md_fault_none)                                        \
00331       DECLARE_FAULT(_fault);                                            \
00332   }
00333 DEFINST(STQ_U,                  0x0f,
00334         "stq_u",                "a,o(b)",
00335         WrPort,                 F_MEM|F_STORE|F_DISP,
00336         DNA, DNA,               DGPR(RA), DGPR(RB), DNA)
00337 
00338 DEFLINK(INTA, 0x10, "inta", 5, 0x7f)
00339 
00340 DEFLINK(INTL, 0x11, "intl", 5, 0x7f)
00341 
00342 DEFLINK(INTS, 0x12, "ints", 5, 0x7f)
00343 
00344 /* changed from 0x7f to 0x3f to allow MUL{Q,L}/V */
00345 DEFLINK(INTM, 0x13, "intm", 5, 0x3f)
00346 
00347 /* added 02/27/99, plakal@cecil, from Alpha Arch Handbook (Rev.4, EV6) */
00348 
00349 /* FIX extensions */
00350 DEFLINK(ITFP, 0x14, "itfp", 5, 0x3f)
00351 
00352 
00353 #define FLTV_IMPL                                                       \
00354   {                                                                     \
00355     /* FIXME: unimplemented */                                          \
00356     DECLARE_FAULT(md_fault_unimpl);                                     \
00357   }
00358 DEFINST(FLTV,                   0x15,
00359         "fltv (unimpl)",        "",
00360         NA,                     NA,
00361         DNA, DNA,               DNA, DNA, DNA)
00362 
00363 DEFLINK(FLTI, 0x16, "flti", 5, 0x3f)
00364 
00365 DEFLINK(FLTL, 0x17, "fltl", 5, /* FIXME: check this... */0x7f)
00366 
00367 /* changed the shift & mask to incorporate new instructions in the group */
00368 DEFLINK(MISC, 0x18, "misc", 8, 0xff)
00369 
00370 DEFLINK(JMPJSR, 0x1a, "jmpjsr", 14, 0x03)
00371 
00372 /* changed from EXTS to FPTI to include more extensions (FIX,CIX,MVI) */
00373 DEFLINK(FPTI, 0x1c, "fpti", 5, 0x7f)
00374 
00375 #define LDF_IMPL                                                        \
00376   {                                                                     \
00377     /* FIXME: unimplemented */                                          \
00378     DECLARE_FAULT(md_fault_unimpl);                                     \
00379   }
00380 DEFINST(LDF,                    0x20,
00381         "ldf (unimpl)",         "",
00382         NA,                     NA,
00383         DNA, DNA,               DNA, DNA, DNA)
00384 
00385 #define LDG_IMPL                                                        \
00386   {                                                                     \
00387     /* FIXME: unimplemented */                                          \
00388     DECLARE_FAULT(md_fault_unimpl);                                     \
00389   }
00390 DEFINST(LDG,                    0x21,
00391         "ldg (unimpl)",         "",
00392         NA,                     NA,
00393         DNA, DNA,               DNA, DNA, DNA)
00394 
00395 #define LDS_IMPL                                                        \
00396   {                                                                     \
00397     sqword_t _longhold, _e1, _e2;                                       \
00398     enum md_fault_type _fault;                                          \
00399                                                                         \
00400     _longhold = READ_WORD(GPR(RB) + SEXT(OFS), _fault);                 \
00401     if (_fault != md_fault_none)                                        \
00402       DECLARE_FAULT(_fault);                                            \
00403                                                                         \
00404     _e1 = _longhold & 0x40000000;                                       \
00405     _e2 = (_longhold >> 23) & ULL(0x7f);                                \
00406     if (_e1)                                                            \
00407       {                                                                 \
00408         if (_e2 == ULL(0x3f800000))                                     \
00409           _e2 = ULL(0x7ff);                                             \
00410         else                                                            \
00411           _e2 |= ULL(0x400);                                            \
00412       }                                                                 \
00413     else                                                                \
00414       {                                                                 \
00415         if (_e2 == 0)                                                   \
00416           _e2 = 0;                                                      \
00417         else                                                            \
00418           _e2 |= ULL(0x380);                                            \
00419       }                                                                 \
00420     SET_FPR_Q(RA, ((_longhold & ULL(0x80000000)) << 32                  \
00421                    | _e2 << 52 | (_longhold & ULL(0x7fffff)) << 29));   \
00422   }
00423 DEFINST(LDS,                    0x22,
00424         "lds",                  "A,o(b)",
00425         RdPort,                 F_MEM|F_LOAD|F_DISP,
00426         DFPR(RA), DNA,          DNA, DGPR(RB), DNA)
00427 
00428 #define LDT_IMPL                                                        \
00429   {                                                                     \
00430     qword_t _result;                                                    \
00431     enum md_fault_type _fault;                                          \
00432                                                                         \
00433     _result = READ_QWORD(GPR(RB) + SEXT(OFS), _fault);                  \
00434     if (_fault != md_fault_none)                                        \
00435       DECLARE_FAULT(_fault);                                            \
00436                                                                         \
00437     SET_FPR_Q(RA, _result);                                             \
00438   }
00439 DEFINST(LDT,                    0x23,
00440         "ldt",                  "A,o(b)",
00441         RdPort,                 F_MEM|F_LOAD|F_DISP,
00442         DFPR(RA), DNA,          DNA, DGPR(RB), DNA)
00443 
00444 #define STF_IMPL                                                        \
00445   {                                                                     \
00446     /* FIXME: unimplemented */                                          \
00447     DECLARE_FAULT(md_fault_unimpl);                                     \
00448   }
00449 DEFINST(STF,                    0x24,
00450         "stf (unimpl)",         "",
00451         NA,                     NA,
00452         DNA, DNA,               DNA, DNA, DNA)
00453 
00454 #define STG_IMPL                                                        \
00455   {                                                                     \
00456     /* FIXME: unimplemented */                                          \
00457     DECLARE_FAULT(md_fault_unimpl);                                     \
00458   }
00459 DEFINST(STG,                    0x25,
00460         "stg (unimpl)",         "",
00461         NA,                     NA,
00462         DNA, DNA,               DNA, DNA, DNA)
00463 
00464 #define STS_IMPL                                                        \
00465   {                                                                     \
00466     sqword_t _longhold;                                                 \
00467     sword_t _inthold;                                                   \
00468     enum md_fault_type _fault;                                          \
00469                                                                         \
00470     _longhold = FPR_Q(RA);                                              \
00471     _inthold = (((_longhold >> 32) & ULL(0xc0000000))                   \
00472                 | ((_longhold >> 29) & ULL(0x3fffffff)));               \
00473     WRITE_WORD(_inthold, GPR(RB) + SEXT(OFS), _fault);                  \
00474     if (_fault != md_fault_none)                                        \
00475       DECLARE_FAULT(_fault);                                            \
00476   }
00477 DEFINST(STS,                    0x26,
00478         "sts",                  "A,o(b)",
00479         WrPort,                 F_MEM|F_STORE|F_DISP,
00480         DNA, DNA,               DFPR(RA), DGPR(RB), DNA)
00481 
00482 #define STT_IMPL                                                        \
00483   {                                                                     \
00484     enum md_fault_type _fault;                                          \
00485                                                                         \
00486     WRITE_QWORD(FPR_Q(RA), GPR(RB) + SEXT(OFS), _fault);                \
00487     if (_fault != md_fault_none)                                        \
00488       DECLARE_FAULT(_fault);                                            \
00489   }
00490 DEFINST(STT,                    0x27,
00491         "stt",                  "A,o(b)",
00492         WrPort,                 F_MEM|F_STORE|F_DISP,
00493         DNA, DNA,               DFPR(RA), DGPR(RB), DNA)
00494 
00495 #define LDL_IMPL                                                        \
00496   {                                                                     \
00497     word_t _result;                                                     \
00498     enum md_fault_type _fault;                                          \
00499                                                                         \
00500     _result = READ_WORD(GPR(RB) + SEXT(OFS), _fault);                   \
00501     if (_fault != md_fault_none)                                        \
00502       DECLARE_FAULT(_fault);                                            \
00503                                                                         \
00504     SET_GPR(RA, (sqword_t)((sword_t)_result));                          \
00505   }
00506 DEFINST(LDL,                    0x28,
00507         "ldl",                  "a,o(b)",
00508         RdPort,                 F_MEM|F_LOAD|F_DISP,
00509         DGPR(RA), DNA,          DNA, DGPR(RB), DNA)
00510 
00511 #define LDQ_IMPL                                                        \
00512   {                                                                     \
00513     qword_t _result;                                                    \
00514     enum md_fault_type _fault;                                          \
00515                                                                         \
00516     _result = READ_QWORD(GPR(RB) + SEXT(OFS), _fault);                  \
00517     if (_fault != md_fault_none)                                        \
00518       DECLARE_FAULT(_fault);                                            \
00519                                                                         \
00520     SET_GPR(RA, _result);                                               \
00521   }
00522 DEFINST(LDQ,                    0x29,
00523         "ldq",                  "a,o(b)",
00524         RdPort,                 F_MEM|F_LOAD|F_DISP,
00525         DGPR(RA), DNA,          DNA, DGPR(RB), DNA)
00526 
00527 /* FIXME: not fully implemented... */
00528 #define LDL_L_IMPL                                                      \
00529   {                                                                     \
00530     word_t _result;                                                     \
00531     enum md_fault_type _fault;                                          \
00532                                                                         \
00533     _result = READ_WORD(GPR(RB) + SEXT(OFS), _fault);                   \
00534     if (_fault != md_fault_none)                                        \
00535       DECLARE_FAULT(_fault);                                            \
00536                                                                         \
00537     SET_GPR(RA, (sqword_t)((sword_t)_result));                          \
00538   }
00539 DEFINST(LDL_L,                  0x2a,
00540         "ldl_l (unimpl)",       "a,o(b)",
00541         RdPort,                 F_MEM|F_LOAD|F_DISP,
00542         DGPR(RA), DNA,          DNA, DGPR(RB), DNA)
00543 
00544 /* FIXME: not fully implemented... */
00545 #define LDQ_L_IMPL                                                      \
00546   {                                                                     \
00547     qword_t _result;                                                    \
00548     enum md_fault_type _fault;                                          \
00549                                                                         \
00550     _result = READ_QWORD(GPR(RB) + SEXT(OFS), _fault);                  \
00551     if (_fault != md_fault_none)                                        \
00552       DECLARE_FAULT(_fault);                                            \
00553                                                                         \
00554     SET_GPR(RA, _result);                                               \
00555   }
00556 DEFINST(LDQ_L,                  0x2b,
00557         "ldq_l (unimpl)",       "a,o(b)",
00558         RdPort,                 F_MEM|F_LOAD|F_DISP,
00559         DGPR(RA), DNA,          DNA, DGPR(RB), DNA)
00560 
00561 #define STL_IMPL                                                        \
00562   {                                                                     \
00563     word_t _src;                                                        \
00564     enum md_fault_type _fault;                                          \
00565                                                                         \
00566     _src = (word_t)(GPR(RA) & ULL(0xffffffff));                         \
00567     WRITE_WORD(_src, GPR(RB) + SEXT(OFS), _fault);                      \
00568     if (_fault != md_fault_none)                                        \
00569       DECLARE_FAULT(_fault);                                            \
00570   }
00571 DEFINST(STL,                    0x2c,
00572         "stl",                  "a,o(b)",
00573         WrPort,                 F_MEM|F_STORE|F_DISP,
00574         DNA, DNA,               DGPR(RA), DGPR(RB), DNA)
00575 
00576 #define STQ_IMPL                                                        \
00577   {                                                                     \
00578     enum md_fault_type _fault;                                          \
00579                                                                         \
00580     WRITE_QWORD(GPR(RA), GPR(RB) + SEXT(OFS), _fault);                  \
00581     if (_fault != md_fault_none)                                        \
00582       DECLARE_FAULT(_fault);                                            \
00583   }
00584 DEFINST(STQ,                    0x2d,
00585         "stq",                  "a,o(b)",
00586         WrPort,                 F_MEM|F_STORE|F_DISP,
00587         DNA, DNA,               DGPR(RA), DGPR(RB), DNA)
00588 
00589 /* FIXME: not fully implemented... */
00590 #define STL_C_IMPL                                                      \
00591   {                                                                     \
00592     word_t _src;                                                        \
00593     enum md_fault_type _fault;                                          \
00594                                                                         \
00595     _src = (word_t)(GPR(RA) & ULL(0xffffffff));                         \
00596     WRITE_WORD(_src, GPR(RB) + SEXT(OFS), _fault);                      \
00597     if (_fault != md_fault_none)                                        \
00598       DECLARE_FAULT(_fault);                                            \
00599   }
00600 DEFINST(STL_C,                  0x2e,
00601         "stl_c (unimpl)",       "a,o(b)",
00602         WrPort,                 F_MEM|F_STORE|F_DISP,
00603         DNA, DNA,               DGPR(RA), DGPR(RB), DNA)
00604 
00605 /* FIXME: not fully implemented... */
00606 #define STQ_C_IMPL                                                      \
00607   {                                                                     \
00608     enum md_fault_type _fault;                                          \
00609                                                                         \
00610     WRITE_QWORD(GPR(RA), GPR(RB) + SEXT(OFS), _fault);                  \
00611     if (_fault != md_fault_none)                                        \
00612       DECLARE_FAULT(_fault);                                            \
00613   }
00614 DEFINST(STQ_C,                  0x2f,
00615         "stq_c (unimpl)",       "a,o(b)",
00616         WrPort,                 F_MEM|F_STORE|F_DISP,
00617         DNA, DNA,               DGPR(RA), DGPR(RB), DNA)
00618 
00619 #define BR_IMPL                                                         \
00620   {                                                                     \
00621     SET_TPC(CPC + (SEXT21(TARG) << 2) + 4);                             \
00622     SET_NPC(CPC + (SEXT21(TARG) << 2) + 4);                             \
00623     SET_GPR(RA, CPC + 4);                                               \
00624   }
00625 DEFINST(BR,                     0x30,
00626         "br",                   "a,J",
00627         IntALU,                 F_CTRL|F_UNCOND|F_DIRJMP,
00628         DGPR(RA), DNA,          DNA, DNA, DNA)
00629 
00630 #define FBEQ_IMPL                                                       \
00631   {                                                                     \
00632     SET_TPC(CPC + (SEXT21(TARG) << 2) + 4);                             \
00633     if (FPR(RA) == 0.0)                                                 \
00634       SET_NPC(CPC + (SEXT21(TARG) << 2) + 4);                           \
00635   }
00636 DEFINST(FBEQ,                   0x31,
00637         "fbeq",                 "A,j",
00638         FloatADD,               F_CTRL|F_COND|F_DIRJMP,
00639         DNA, DNA,               DFPR(RA), DNA, DNA)
00640 
00641 #define FBLT_IMPL                                                       \
00642   {                                                                     \
00643     SET_TPC(CPC + (SEXT21(TARG) << 2) + 4);                             \
00644     if (FPR(RA) < 0.0)                                                  \
00645       SET_NPC(CPC + (SEXT21(TARG) << 2) + 4);                           \
00646   }
00647 DEFINST(FBLT,                   0x32,
00648         "fblt",                 "A,j",
00649         FloatADD,               F_CTRL|F_COND|F_DIRJMP,
00650         DNA, DNA,               DFPR(RA), DNA, DNA)
00651 
00652 #define FBLE_IMPL                                                       \
00653   {                                                                     \
00654     SET_TPC(CPC + (SEXT21(TARG) << 2) + 4);                             \
00655     if (FPR(RA) <= 0.0)                                                 \
00656       SET_NPC(CPC + (SEXT21(TARG) << 2) + 4);                           \
00657   }
00658 DEFINST(FBLE,                   0x33,
00659         "fble",                 "A,j",
00660         FloatADD,               F_CTRL|F_COND|F_DIRJMP,
00661         DNA, DNA,               DFPR(RA), DNA, DNA)
00662 
00663 /* NOTE: this is semantically equivalent to BR, the different opcode tips
00664    off the predictor to use the return address stack... */
00665 #define BSR_IMPL                                                        \
00666   {                                                                     \
00667     SET_TPC(CPC + (SEXT21(TARG) << 2) + 4);                             \
00668     SET_NPC(CPC + (SEXT21(TARG) << 2) + 4);                             \
00669     SET_GPR(RA, CPC + 4);                                               \
00670   }
00671 DEFINST(BSR,                    0x34,
00672         "bsr",                  "a,J",
00673         IntALU,                 F_CTRL|F_UNCOND|F_DIRJMP,
00674         DGPR(RA), DNA,          DNA, DNA, DNA)
00675 
00676 #define FBNE_IMPL                                                       \
00677   {                                                                     \
00678     SET_TPC(CPC + (SEXT21(TARG) << 2) + 4);                             \
00679     if (FPR(RA) != 0.0)                                                 \
00680       SET_NPC(CPC + (SEXT21(TARG) << 2) + 4);                           \
00681   }
00682 DEFINST(FBNE,                   0x35,
00683         "fbne",                 "A,j",
00684         FloatADD,               F_CTRL|F_COND|F_DIRJMP,
00685         DNA, DNA,               DFPR(RA), DNA, DNA)
00686 
00687 #define FBGE_IMPL                                                       \
00688   {                                                                     \
00689     SET_TPC(CPC + (SEXT21(TARG) << 2) + 4);                             \
00690     if (FPR(RA) >= 0.0)                                                 \
00691       SET_NPC(CPC + (SEXT21(TARG) << 2) + 4);                           \
00692   }
00693 DEFINST(FBGE,                   0x36,
00694         "fbge",                 "A,j",
00695         FloatADD,               F_CTRL|F_COND|F_DIRJMP,
00696         DNA, DNA,               DFPR(RA), DNA, DNA)
00697 
00698 #define FBGT_IMPL                                                       \
00699   {                                                                     \
00700     SET_TPC(CPC + (SEXT21(TARG) << 2) + 4);                             \
00701     if (FPR(RA) > 0.0)                                                  \
00702       SET_NPC(CPC + (SEXT21(TARG) << 2) + 4);                           \
00703   }
00704 DEFINST(FBGT,                   0x37,
00705         "fbgt",                 "A,j",
00706         FloatADD,               F_CTRL|F_COND|F_DIRJMP,
00707         DNA, DNA,               DFPR(RA), DNA, DNA)
00708 
00709 #define BLBC_IMPL                                                       \
00710   {                                                                     \
00711     SET_TPC(CPC + (SEXT21(TARG) << 2) + 4);                             \
00712     if (!(GPR(RA) & 1))                                                 \
00713       SET_NPC(CPC + (SEXT21(TARG) << 2) + 4);                           \
00714   }
00715 DEFINST(BLBC,                   0x38,
00716         "blbc",                 "a,j",
00717         IntALU,                 F_CTRL|F_COND|F_DIRJMP,
00718         DNA, DNA,               DGPR(RA), DNA, DNA)
00719 
00720 #define BEQ_IMPL                                                        \
00721   {                                                                     \
00722     SET_TPC(CPC + (SEXT21(TARG) << 2) + 4);                             \
00723     if (GPR(RA) == ULL(0))                                              \
00724       SET_NPC(CPC + (SEXT21(TARG) << 2) + 4);                           \
00725   }
00726 DEFINST(BEQ,                    0x39,
00727         "beq",                  "a,j",
00728         IntALU,                 F_CTRL|F_COND|F_DIRJMP,
00729         DNA, DNA,               DGPR(RA), DNA, DNA)
00730 
00731 #define BLT_IMPL                                                        \
00732   {                                                                     \
00733     SET_TPC(CPC + (SEXT21(TARG) << 2) + 4);                             \
00734     if ((sqword_t)GPR(RA) < LL(0))                                      \
00735       SET_NPC(CPC + (SEXT21(TARG) << 2) + 4);                           \
00736   }
00737 DEFINST(BLT,                    0x3a,
00738         "blt",                  "a,j",
00739         IntALU,                 F_CTRL|F_COND|F_DIRJMP,
00740         DNA, DNA,               DGPR(RA), DNA, DNA)
00741 
00742 #define BLE_IMPL                                                        \
00743   {                                                                     \
00744     SET_TPC(CPC + (SEXT21(TARG) << 2) + 4);                             \
00745     if ((sqword_t)GPR(RA) <= LL(0))                                     \
00746       SET_NPC(CPC + (SEXT21(TARG) << 2) + 4);                           \
00747   }
00748 DEFINST(BLE,                    0x3b,
00749         "ble",                  "a,j",
00750         IntALU,                 F_CTRL|F_COND|F_DIRJMP,
00751         DNA, DNA,               DGPR(RA), DNA, DNA)
00752 
00753 #define BLBS_IMPL                                                       \
00754   {                                                                     \
00755     SET_TPC(CPC + (SEXT21(TARG) << 2) + 4);                             \
00756     if (GPR(RA) & 1)                                                    \
00757       SET_NPC(CPC + (SEXT21(TARG) << 2) + 4);                           \
00758   }
00759 DEFINST(BLBS,                   0x3c,
00760         "blbs",                 "a,j",
00761         IntALU,                 F_CTRL|F_COND|F_DIRJMP,
00762         DNA, DNA,               DGPR(RA), DNA, DNA)
00763 
00764 #define BNE_IMPL                                                        \
00765   {                                                                     \
00766     SET_TPC(CPC + (SEXT21(TARG) << 2) + 4);                             \
00767     if (GPR(RA) != ULL(0))                                              \
00768       SET_NPC(CPC + (SEXT21(TARG) << 2) + 4);                           \
00769   }
00770 DEFINST(BNE,                    0x3d,
00771         "bne",                  "a,j",
00772         IntALU,                 F_CTRL|F_COND|F_DIRJMP,
00773         DNA, DNA,               DGPR(RA), DNA, DNA)
00774 
00775 #define BGE_IMPL                                                        \
00776   {                                                                     \
00777     SET_TPC(CPC + (SEXT21(TARG) << 2) + 4);                             \
00778     if ((sqword_t)GPR(RA) >= LL(0))                                     \
00779       SET_NPC(CPC + (SEXT21(TARG) << 2) + 4);                           \
00780   }
00781 DEFINST(BGE,                    0x3e,
00782         "bge",                  "a,j",
00783         IntALU,                 F_CTRL|F_COND|F_DIRJMP,
00784         DNA, DNA,               DGPR(RA), DNA, DNA)
00785 
00786 #define BGT_IMPL                                                        \
00787   {                                                                     \
00788     SET_TPC(CPC + (SEXT21(TARG) << 2) + 4);                             \
00789     if ((sqword_t)GPR(RA) > LL(0))                                      \
00790       SET_NPC(CPC + (SEXT21(TARG) << 2) + 4);                           \
00791   }
00792 DEFINST(BGT,                    0x3f,
00793         "bgt",                  "a,j",
00794         IntALU,                 F_CTRL|F_COND|F_DIRJMP,
00795         DNA, DNA,               DGPR(RA), DNA, DNA)
00796 
00797 
00798 CONNECT(CALL_PAL)
00799 
00800 #define PAL_CALLSYS_IMPL                                                \
00801   {                                                                     \
00802     SYSCALL(inst);                                                      \
00803   }
00804 DEFINST(PAL_CALLSYS,            0x83,
00805         "call_pal callsys",     "",
00806         NA,                     F_TRAP,
00807         DNA, DNA,               DNA, DNA, DNA)
00808 
00809 #define PAL_RDUNIQ_IMPL                                                 \
00810   {                                                                     \
00811     SET_GPR(/* v0 */0, UNIQ);                                           \
00812   }
00813 DEFINST(PAL_RDUNIQ,             0x9e,
00814         "call_pal rduniq",      "",
00815         NA,                     F_TRAP,
00816         DGPR(/* v0 */0), DNA,   DUNIQ, DNA, DNA)
00817 
00818 #define PAL_WRUNIQ_IMPL                                                 \
00819   {                                                                     \
00820     SET_UNIQ(GPR(/* a0 */16));                                          \
00821   }
00822 DEFINST(PAL_WRUNIQ,             0x9f,
00823         "call_pal wruniq",      "",
00824         NA,                     F_TRAP,
00825         DUNIQ, DNA,             DGPR(/* a0 */16), DNA, DNA)
00826         
00827 
00828 CONNECT(INTA)
00829 
00830 DEFLINK(ADDL_LINK, 0x00, "addl_link", 12, 1)
00831 
00832 DEFLINK(S4ADDL_LINK, 0x02, "s4addl_link", 12, 1)
00833 
00834 DEFLINK(SUBL_LINK, 0x09, "subl_link", 12, 1)
00835 
00836 DEFLINK(S4SUBL_LINK, 0x0b, "s4subl_link", 12, 1)
00837 
00838 DEFLINK(CMPBGE_LINK, 0x0f, "cmpbge_link", 12, 1)
00839 
00840 DEFLINK(S8ADDL_LINK, 0x12, "s8addl_link", 12, 1)
00841 
00842 DEFLINK(S8SUBL_LINK, 0x1b, "s8subl_link", 12, 1)
00843 
00844 DEFLINK(CMPULT_LINK, 0x1d, "cmpult_link", 12, 1)
00845 
00846 DEFLINK(ADDQ_LINK, 0x20, "addq_link", 12, 1)
00847 
00848 DEFLINK(S4ADDQ_LINK, 0x22, "s4addq_link", 12, 1)
00849 
00850 DEFLINK(SUBQ_LINK, 0x29, "subq_link", 12, 1)
00851 
00852 DEFLINK(S4SUBQ_LINK, 0x2b, "s4subq_link", 12, 1)
00853 
00854 DEFLINK(CMPEQ_LINK, 0x2d, "cmpeq_link", 12, 1)
00855 
00856 DEFLINK(S8ADDQ_LINK, 0x32, "s8addq_link", 12, 1)
00857 
00858 DEFLINK(S8SUBQ_LINK, 0x3b, "s8subq_link", 12, 1)
00859 
00860 DEFLINK(CMPULE_LINK, 0x3d, "cmpule_link", 12, 1)
00861 
00862 DEFLINK(ADDLV_LINK, 0x40, "addlv_link", 12, 1)
00863 
00864 DEFLINK(SUBLV_LINK, 0x49, "sublv_link", 12, 1)
00865 
00866 DEFLINK(CMPLT_LINK, 0x4d, "cmplt_link", 12, 1)
00867 
00868 DEFLINK(ADDQV_LINK, 0x60, "addqv_link", 12, 1)
00869 
00870 DEFLINK(SUBQV_LINK, 0x69, "subqv_link", 12, 1)
00871 
00872 DEFLINK(CMPLE_LINK, 0x6d, "cmple_link", 12, 1)
00873 
00874 
00875 CONNECT(ADDL_LINK)
00876 
00877 #define ADDL_IMPL                                                       \
00878   {                                                                     \
00879     SET_GPR(RC, SEXT32((GPR(RA) + GPR(RB)) & ULL(0xffffffff)));         \
00880   }
00881 DEFINST(ADDL,                   0x00,
00882         "addl",                 "a,b,c",
00883         IntALU,                 F_ICOMP,
00884         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
00885 
00886 #define ADDLI_IMPL                                                      \
00887   {                                                                     \
00888     SET_GPR(RC, SEXT32((GPR(RA) + IMM) & ULL(0xffffffff)));             \
00889   }
00890 DEFINST(ADDLI,                  0x01,
00891         "addl",                 "a,i,c",
00892         IntALU,                 F_ICOMP|F_IMM,
00893         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
00894         
00895 
00896 CONNECT(S4ADDL_LINK)
00897 
00898 #define S4ADDL_IMPL                                                     \
00899   {                                                                     \
00900     SET_GPR(RC, SEXT32(((GPR(RA) << 2) + GPR(RB)) & ULL(0xffffffff)));  \
00901   }
00902 DEFINST(S4ADDL,                 0x00,
00903         "s4addl",               "a,b,c",
00904         IntALU,                 F_ICOMP,
00905         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
00906 
00907 #define S4ADDLI_IMPL                                                    \
00908   {                                                                     \
00909     SET_GPR(RC, SEXT32(((GPR(RA) << 2) + IMM) & ULL(0xffffffff)));      \
00910   }
00911 DEFINST(S4ADDLI,                0x01,
00912         "s4addl",               "a,i,c",
00913         IntALU,                 F_ICOMP|F_IMM,
00914         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
00915         
00916 
00917 CONNECT(SUBL_LINK)
00918 
00919 #define SUBL_IMPL                                                       \
00920   {                                                                     \
00921     SET_GPR(RC, SEXT32((GPR(RA) - GPR(RB)) & ULL(0xffffffff)));         \
00922   }
00923 DEFINST(SUBL,                   0x00,
00924         "subl",                 "a,b,c",
00925         IntALU,                 F_ICOMP,
00926         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
00927 
00928 #define SUBLI_IMPL                                                      \
00929   {                                                                     \
00930     SET_GPR(RC, SEXT32((GPR(RA) - IMM) & ULL(0xffffffff)));             \
00931   }
00932 DEFINST(SUBLI,                  0x01,
00933         "subl",                 "a,i,c",
00934         IntALU,                 F_ICOMP|F_IMM,
00935         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
00936 
00937 
00938 CONNECT(S4SUBL_LINK)
00939 
00940 #define S4SUBL_IMPL                                                     \
00941   {                                                                     \
00942     SET_GPR(RC, SEXT32(((GPR(RA) << 2) - GPR(RB)) & ULL(0xffffffff)));  \
00943   }
00944 DEFINST(S4SUBL,                 0x00,
00945         "s4subl",               "a,b,c",
00946         IntALU,                 F_ICOMP,
00947         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
00948 
00949 #define S4SUBLI_IMPL                                                    \
00950   {                                                                     \
00951     SET_GPR(RC, SEXT32(((GPR(RA) << 2) - IMM) & ULL(0xffffffff)));      \
00952   }
00953 DEFINST(S4SUBLI,                0x01,
00954         "s4subl",               "a,i,c",
00955         IntALU,                 F_ICOMP|F_IMM,
00956         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
00957 
00958 
00959 CONNECT(CMPBGE_LINK)
00960 
00961 #define CMPBGE_IMPL                                                     \
00962   {                                                                     \
00963     int _i;                                                             \
00964     qword_t _rav, _rbv;                                                 \
00965                                                                         \
00966     _rav = GPR(RA);                                                     \
00967     _rbv = GPR(RB);                                                     \
00968     SET_GPR(RC, 0);                                                     \
00969                                                                         \
00970     for (_i = 56; _i >= 0; _i -= 8)                                     \
00971       {                                                                 \
00972         SET_GPR(RC, GPR(RC) << 1);                                      \
00973         SET_GPR(RC, (GPR(RC)                                            \
00974                      | ((_rav >> _i & (sqword_t)0xff) >=                \
00975                         (_rbv >> _i & (sqword_t)0xff))));               \
00976       }                                                                 \
00977   }
00978 DEFINST(CMPBGE,                 0x00,
00979         "cmpbge",               "a,b,c",
00980         IntALU,                 F_ICOMP,
00981         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
00982 
00983 #define CMPBGEI_IMPL                                                    \
00984   {                                                                     \
00985     int _i;                                                             \
00986     qword_t _rav, _rbv;                                                 \
00987                                                                         \
00988     _rav = GPR(RA);                                                     \
00989     _rbv = IMM;                                                         \
00990     SET_GPR(RC, 0);                                                     \
00991                                                                         \
00992     for (_i = 56; _i >= 0; _i -= 8)                                     \
00993       {                                                                 \
00994         SET_GPR(RC, GPR(RC) << 1);                                      \
00995         SET_GPR(RC, (GPR(RC)                                            \
00996                      | ((_rav >> _i & (sqword_t)0xff) >=                \
00997                         (_rbv >> _i & (sqword_t)0xff))));               \
00998       }                                                                 \
00999   }
01000 DEFINST(CMPBGEI,                0x01,
01001         "cmpbge",               "a,i,c",
01002         IntALU,                 F_ICOMP|F_IMM,
01003         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01004 
01005 
01006 CONNECT(S8ADDL_LINK)
01007 
01008 #define S8ADDL_IMPL                                                     \
01009   {                                                                     \
01010     SET_GPR(RC, SEXT32(((GPR(RA) << 3) + GPR(RB)) & ULL(0xffffffff)));  \
01011   }
01012 DEFINST(S8ADDL,                 0x00,
01013         "s8addl",               "a,b,c",
01014         IntALU,                 F_ICOMP,
01015         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01016         
01017 #define S8ADDLI_IMPL                                                    \
01018   {                                                                     \
01019     SET_GPR(RC, SEXT32(((GPR(RA) << 3) + IMM) & ULL(0xffffffff)));      \
01020   }
01021 DEFINST(S8ADDLI,                0x01,
01022         "s8addl",               "a,i,c",
01023         IntALU,                 F_ICOMP|F_IMM,
01024         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01025         
01026 
01027 CONNECT(S8SUBL_LINK)
01028 
01029 #define S8SUBL_IMPL                                                     \
01030   {                                                                     \
01031     SET_GPR(RC, SEXT32(((GPR(RA) << 3) - GPR(RB)) & ULL(0xffffffff)));  \
01032   }
01033 DEFINST(S8SUBL,                 0x00,
01034         "s8subl",               "a,b,c",
01035         IntALU,                 F_ICOMP,
01036         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01037         
01038 #define S8SUBLI_IMPL                                                    \
01039   {                                                                     \
01040     SET_GPR(RC, SEXT32(((GPR(RA) << 3) - IMM) & ULL(0xffffffff)));      \
01041   }
01042 DEFINST(S8SUBLI,                0x01,
01043         "s8subl",               "a,i,c",
01044         IntALU,                 F_ICOMP|F_IMM,
01045         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01046 
01047 
01048 CONNECT(CMPULT_LINK)
01049 
01050 #define CMPULT_IMPL                                                     \
01051   {                                                                     \
01052     SET_GPR(RC, (qword_t)GPR(RA) < (qword_t)GPR(RB));                   \
01053   }
01054 DEFINST(CMPULT,                 0x00,
01055         "cmpult",               "a,b,c",
01056         IntALU,                 F_ICOMP,
01057         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01058 
01059 #define CMPULTI_IMPL                                                    \
01060   {                                                                     \
01061     SET_GPR(RC, (qword_t)GPR(RA) < (qword_t)IMM);                       \
01062   }
01063 DEFINST(CMPULTI,                0x01,
01064         "cmpult",               "a,i,c",
01065         IntALU,                 F_ICOMP|F_IMM,
01066         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01067 
01068 
01069 CONNECT(ADDQ_LINK)
01070 
01071 #define ADDQ_IMPL                                                       \
01072   {                                                                     \
01073     SET_GPR(RC, GPR(RA) + GPR(RB));                                     \
01074   }
01075 DEFINST(ADDQ,                   0x00,
01076         "addq",                 "a,b,c",
01077         IntALU,                 F_ICOMP,
01078         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01079         
01080 #define ADDQI_IMPL                                                      \
01081   {                                                                     \
01082     SET_GPR(RC, GPR(RA) + IMM);                                         \
01083   }
01084 DEFINST(ADDQI,                  0x01,
01085         "addq",                 "a,i,c",
01086         IntALU,                 F_ICOMP|F_IMM,
01087         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01088 
01089 
01090 CONNECT(S4ADDQ_LINK)
01091 
01092 #define S4ADDQ_IMPL                                                     \
01093   {                                                                     \
01094     SET_GPR(RC, (GPR(RA) << 2) + GPR(RB));                              \
01095   }
01096 DEFINST(S4ADDQ,                 0x00,
01097         "s4addq",               "a,b,c",
01098         IntALU,                 F_ICOMP,
01099         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01100 
01101 #define S4ADDQI_IMPL                                                    \
01102   {                                                                     \
01103     SET_GPR(RC, (GPR(RA) << 2) + IMM);                                  \
01104   }
01105 DEFINST(S4ADDQI,                0x01,
01106         "s4addq",               "a,i,c",
01107         IntALU,                 F_ICOMP|F_IMM,
01108         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01109 
01110 
01111 CONNECT(SUBQ_LINK)
01112 
01113 #define SUBQ_IMPL                                                       \
01114   {                                                                     \
01115     SET_GPR(RC, GPR(RA) - GPR(RB));                                     \
01116   }
01117 DEFINST(SUBQ,                   0x00,
01118         "subq",                 "a,b,c",
01119         IntALU,                 F_ICOMP,
01120         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01121 
01122 #define SUBQI_IMPL                                                      \
01123   {                                                                     \
01124     SET_GPR(RC, GPR(RA) - IMM);                                         \
01125   }
01126 DEFINST(SUBQI,                  0x01,
01127         "subq",                 "a,i,c",
01128         IntALU,                 F_ICOMP|F_IMM,
01129         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01130 
01131 
01132 CONNECT(S4SUBQ_LINK)
01133 
01134 #define S4SUBQ_IMPL                                                     \
01135   {                                                                     \
01136     SET_GPR(RC, (GPR(RA) << 2) - GPR(RB));                              \
01137   }
01138 DEFINST(S4SUBQ,                 0x00,
01139         "s4subq",               "a,b,c",
01140         IntALU,                 F_ICOMP,
01141         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01142 
01143 #define S4SUBQI_IMPL                                                    \
01144   {                                                                     \
01145     SET_GPR(RC, (GPR(RA) << 2) - IMM);                                  \
01146   }
01147 DEFINST(S4SUBQI,                0x01,
01148         "s4subq",               "a,i,c",
01149         IntALU,                 F_ICOMP|F_IMM,
01150         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01151 
01152 
01153 CONNECT(CMPEQ_LINK)
01154 
01155 #define CMPEQ_IMPL                                                      \
01156   {                                                                     \
01157     SET_GPR(RC, GPR(RA) == GPR(RB));                                    \
01158   }
01159 DEFINST(CMPEQ,                  0x00,
01160         "cmpeq",                "a,b,c",
01161         IntALU,                 F_ICOMP,
01162         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01163 
01164 #define CMPEQI_IMPL                                                     \
01165   {                                                                     \
01166     SET_GPR(RC, GPR(RA) == (qword_t)IMM);                               \
01167   }
01168 DEFINST(CMPEQI,                 0x01,
01169         "cmpeq",                "a,i,c",
01170         IntALU,                 F_ICOMP|F_IMM,
01171         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01172 
01173 
01174 CONNECT(S8ADDQ_LINK)
01175 
01176 #define S8ADDQ_IMPL                                                     \
01177   {                                                                     \
01178     SET_GPR(RC, (GPR(RA) << 3) + GPR(RB));                              \
01179   }
01180 DEFINST(S8ADDQ,                 0x00,
01181         "s8addq",               "a,b,c",
01182         IntALU,                 F_ICOMP,
01183         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01184 
01185 #define S8ADDQI_IMPL                                                    \
01186   {                                                                     \
01187     SET_GPR(RC, (GPR(RA) << 3) + IMM);                                  \
01188   }
01189 DEFINST(S8ADDQI,                0x01,
01190         "s8addq",               "a,i,c",
01191         IntALU,                 F_ICOMP|F_IMM,
01192         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01193 
01194 
01195 CONNECT(S8SUBQ_LINK)
01196 
01197 #define S8SUBQ_IMPL                                                     \
01198   {                                                                     \
01199     SET_GPR(RC, (GPR(RA) << 3) - GPR(RB));                              \
01200   }
01201 DEFINST(S8SUBQ,                 0x00,
01202         "s8subq",               "a,b,c",
01203         IntALU,                 F_ICOMP,
01204         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01205 
01206 #define S8SUBQI_IMPL                                                    \
01207   {                                                                     \
01208     SET_GPR(RC, (GPR(RA) << 3) - IMM);                                  \
01209   }
01210 DEFINST(S8SUBQI,                0x01,
01211         "s8subq",               "a,i,c",
01212         IntALU,                 F_ICOMP|F_IMM,
01213         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01214 
01215 
01216 CONNECT(CMPULE_LINK)
01217 
01218 #define CMPULE_IMPL                                                     \
01219   {                                                                     \
01220     SET_GPR(RC, (qword_t)GPR(RA) <= (qword_t)GPR(RB));                  \
01221   }
01222 DEFINST(CMPULE,                 0x00,
01223         "cmpule",               "a,b,c",
01224         IntALU,                 F_ICOMP,
01225         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01226 
01227 #define CMPULEI_IMPL                                                    \
01228   {                                                                     \
01229     SET_GPR(RC, (qword_t)GPR(RA) <= (qword_t)IMM);                      \
01230   }
01231 DEFINST(CMPULEI,                0x01,
01232         "cmpule",               "a,i,c",
01233         IntALU,                 F_ICOMP|F_IMM,
01234         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01235 
01236 
01237 CONNECT(ADDLV_LINK)
01238 
01239 #define ADDLV_IMPL                                                      \
01240   {                                                                     \
01241     /* FIXME: not checking for overflows... */                          \
01242     SET_GPR(RC, SEXT32((GPR(RA) + GPR(RB)) & ULL(0xffffffff)));         \
01243   }
01244 DEFINST(ADDLV,                  0x00,
01245         "addl/v (unimpl)",      "a,b,c",
01246         IntALU,                 F_ICOMP,
01247         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01248 
01249 #define ADDLVI_IMPL                                                     \
01250   {                                                                     \
01251     /* FIXME: not checking for overflows... */                          \
01252     SET_GPR(RC, SEXT32((GPR(RA) + IMM) & ULL(0xffffffff)));             \
01253   }
01254 DEFINST(ADDLVI,                 0x01,
01255         "addl/v (unimpl)",      "a,i,c",
01256         IntALU,                 F_ICOMP|F_IMM,
01257         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01258 
01259 
01260 CONNECT(SUBLV_LINK)
01261 
01262 #define SUBLV_IMPL                                                      \
01263   {                                                                     \
01264     SET_GPR(RC, SEXT32((GPR(RA) - GPR(RB)) & ULL(0xffffffff)));         \
01265   }
01266 DEFINST(SUBLV,                  0x00,
01267         "subl/v (unimpl)",      "a,b,c",
01268         IntALU,                 F_ICOMP,
01269         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01270 
01271 #define SUBLVI_IMPL                                                     \
01272   {                                                                     \
01273     SET_GPR(RC, SEXT32((GPR(RA) - IMM) & ULL(0xffffffff)));             \
01274   }
01275 DEFINST(SUBLVI,                 0x01,
01276         "subl/v (unimpl)",      "a,i,c",
01277         IntALU,                 F_ICOMP|F_IMM,
01278         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01279 
01280 
01281 CONNECT(CMPLT_LINK)
01282 
01283 #define CMPLT_IMPL                                                      \
01284   {                                                                     \
01285     SET_GPR(RC, (sqword_t)GPR(RA) < (sqword_t)GPR(RB));                 \
01286   }
01287 DEFINST(CMPLT,                  0x00,
01288         "cmplt",                "a,b,c",
01289         IntALU,                 F_ICOMP,
01290         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01291 
01292 #define CMPLTI_IMPL                                                     \
01293   {                                                                     \
01294     SET_GPR(RC, (sqword_t)GPR(RA) < (sqword_t)IMM);                     \
01295   }
01296 DEFINST(CMPLTI,         0x01,
01297         "cmplt",                "a,i,c",
01298         IntALU,                 F_ICOMP|F_IMM,
01299         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01300 
01301 
01302 CONNECT(ADDQV_LINK)
01303 
01304 #define ADDQV_IMPL                                                      \
01305   {                                                                     \
01306     /* FIXME: not checking for overflows... */                          \
01307     SET_GPR(RC, GPR(RA) + GPR(RB));                                     \
01308   }
01309 DEFINST(ADDQV,                  0x00,
01310         "addq/v (unimpl)",      "a,b,c",
01311         IntALU,                 F_ICOMP,
01312         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01313 
01314 #define ADDQVI_IMPL                                                     \
01315   {                                                                     \
01316     /* FIXME: not checking for overflows... */                          \
01317     SET_GPR(RC, GPR(RA) + IMM);                                         \
01318   }
01319 DEFINST(ADDQVI,                 0x01,
01320         "addq/v (unimpl)",      "a,i,c",
01321         IntALU,                 F_ICOMP|F_IMM,
01322         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01323 
01324 
01325 CONNECT(SUBQV_LINK)
01326 
01327 #define SUBQV_IMPL                                                      \
01328   {                                                                     \
01329     /* FIXME: not checking for overflows... */                          \
01330     SET_GPR(RC, GPR(RA) - GPR(RB));                                     \
01331   }
01332 DEFINST(SUBQV,                  0x00,
01333         "subq/v (unimpl)",      "a,b,c",
01334         IntALU,                 F_ICOMP,
01335         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01336 
01337 #define SUBQVI_IMPL                                                     \
01338   {                                                                     \
01339     /* FIXME: not checking for overflows... */                          \
01340     SET_GPR(RC, GPR(RA) - IMM);                                         \
01341   }
01342 DEFINST(SUBQVI,                 0x01,
01343         "subq/v (unimpl)",      "a,b,c",
01344         IntALU,                 F_ICOMP|F_IMM,
01345         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01346 
01347 
01348 CONNECT(CMPLE_LINK)
01349 
01350 #define CMPLE_IMPL                                                      \
01351   {                                                                     \
01352     SET_GPR(RC, (sqword_t)GPR(RA) <= (sqword_t)GPR(RB));                \
01353   }
01354 DEFINST(CMPLE,                  0x00,
01355         "cmple",                "a,b,c",
01356         IntALU,                 F_ICOMP,
01357         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01358 
01359 #define CMPLEI_IMPL                                                     \
01360   {                                                                     \
01361     SET_GPR(RC, (sqword_t)GPR(RA) <= (sqword_t)IMM);                    \
01362   }
01363 DEFINST(CMPLEI,         0x01,
01364         "cmple",                "a,i,c",
01365         IntALU,                 F_ICOMP|F_IMM,
01366         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01367 
01368 
01369 CONNECT(INTL)
01370 
01371 DEFLINK(AND_LINK, 0x00, "and_link", 12, 1)
01372 
01373 DEFLINK(BIC_LINK, 0x08, "bic_link", 12, 1)  /* FIXME: PRM says 0x11.0x00 ?! */
01374 
01375 DEFLINK(CMOVLBS_LINK, 0x14, "cmovlbs_link", 12, 1)
01376 
01377 DEFLINK(CMOVLBC_LINK, 0x16, "cmovlbc_link", 12, 1)
01378 
01379 /* FIXME: BetaDyn recodes some of these for SMT insts (NOP technology)... */
01380 DEFLINK(BIS_LINK, 0x20, "bis_link", 12, 1)
01381 
01382 DEFLINK(CMOVEQ_LINK, 0x24, "cmoveq_link", 12, 1)
01383 
01384 DEFLINK(CMOVNE_LINK, 0x26, "cmovne_link", 12, 1)
01385 
01386 DEFLINK(ORNOT_LINK, 0x28, "ornot_link", 12, 1)
01387 
01388 DEFLINK(XOR_LINK, 0x40, "xor_link", 12, 1)
01389 
01390 DEFLINK(CMOVLT_LINK, 0x44, "cmovlt_link", 12, 1)
01391 
01392 DEFLINK(CMOVGE_LINK, 0x46, "cmovge_link", 12, 1)
01393 
01394 DEFLINK(EQV_LINK, 0x48, "eqv_link", 12, 1)
01395 
01396 /* added 02/27/99, plakal@cecil, from Alpha Arch Handbook (Rev.4, EV6) */
01397 DEFLINK(AMASK_LINK, 0x61, "amask_link", 12, 1)
01398 
01399 DEFLINK(CMOVLE_LINK, 0x64, "cmovle_link", 12, 1)
01400 
01401 DEFLINK(CMOVGT_LINK, 0x66, "cmovgt_link", 12, 1)
01402 
01403 /* added 02/27/99, plakal@cecil, from Alpha Arch Handbook (Rev.4, EV6) */
01404  
01405 /* major implementation version of processor, used for code-scheduling
01406  decisions, rather than ISA decisions. Makes sense to return EV6 -- for
01407  sim-outorder */
01408 #define IMPLVER_IMPL                                                    \
01409   {                                                                     \
01410     SET_GPR(RC, ULL(2));                                                \
01411   }
01412 DEFINST(IMPLVER,                0x6c,
01413         "implver",              "c",
01414         NA,                     NA,
01415         DGPR(RC), DNA,          DNA, DNA, DNA)
01416 
01417 
01418 CONNECT(AND_LINK)
01419 
01420 #define AND_IMPL                                                        \
01421   {                                                                     \
01422     SET_GPR(RC, GPR(RA) & GPR(RB));                                     \
01423   }
01424 DEFINST(AND,                    0x00,
01425         "and",                  "a,b,c",
01426         IntALU,                 F_ICOMP,
01427         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01428 
01429 #define ANDI_IMPL                                                       \
01430   {                                                                     \
01431     SET_GPR(RC, GPR(RA) & IMM);                                         \
01432   }
01433 DEFINST(ANDI,                   0x01,
01434         "and",                  "a,i,c",
01435         IntALU,                 F_ICOMP|F_IMM,
01436         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01437 
01438 
01439 CONNECT(BIC_LINK)
01440 
01441 #define BIC_IMPL                                                        \
01442   {                                                                     \
01443     SET_GPR(RC, GPR(RA) & ~GPR(RB));                                    \
01444   }
01445 DEFINST(BIC,                    0x00,
01446         "bic",                  "a,b,c",
01447         IntALU,                 F_ICOMP,
01448         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01449 
01450 #define BICI_IMPL                                                       \
01451   {                                                                     \
01452     SET_GPR(RC, GPR(RA) & ~IMM);                                        \
01453   }
01454 DEFINST(BICI,                   0x01,
01455         "bic",                  "a,i,c",
01456         IntALU,                 F_ICOMP|F_IMM,
01457         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01458 
01459 
01460 CONNECT(CMOVLBS_LINK)
01461 
01462 #define CMOVLBS_IMPL                                                    \
01463   {                                                                     \
01464     if (GPR(RA) & 1)                                                    \
01465       SET_GPR(RC, GPR(RB));                                             \
01466   }
01467 DEFINST(CMOVLBS,                0x00,
01468         "cmovlbs",              "a,b,c",
01469         IntALU,                 F_ICOMP,
01470         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01471 
01472 #define CMOVLBSI_IMPL                                                   \
01473   {                                                                     \
01474     if (GPR(RA) & 1)                                                    \
01475       SET_GPR(RC, IMM);                                                 \
01476   }
01477 DEFINST(CMOVLBSI,               0x01,
01478         "cmovlbs",              "a,i,c",
01479         IntALU,                 F_ICOMP|F_IMM,
01480         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01481 
01482 
01483 CONNECT(CMOVLBC_LINK)
01484 
01485 #define CMOVLBC_IMPL                                                    \
01486   {                                                                     \
01487     if ((GPR(RA) & 1) == 0)                                             \
01488       SET_GPR(RC, GPR(RB));                                             \
01489   }
01490 DEFINST(CMOVLBC,                0x00,
01491         "cmovlbc",              "a,b,c",
01492         IntALU,                 F_ICOMP,
01493         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01494 
01495 #define CMOVLBCI_IMPL                                                   \
01496   {                                                                     \
01497     if ((GPR(RA) & 1) == 0)                                             \
01498       SET_GPR(RC, IMM);                                                 \
01499   }
01500 DEFINST(CMOVLBCI,               0x01,
01501         "cmovlbc",              "a,i,c",
01502         IntALU,                 F_ICOMP|F_IMM,
01503         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01504 
01505 
01506 CONNECT(BIS_LINK)
01507 
01508 #define BIS_IMPL                                                        \
01509   {                                                                     \
01510     SET_GPR(RC, GPR(RA) | GPR(RB));                                     \
01511   }
01512 DEFINST(BIS,                    0x00,
01513         "bis",                  "a,b,c",
01514         IntALU,                 F_ICOMP,
01515         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01516 
01517 #define BISI_IMPL                                                       \
01518   {                                                                     \
01519     SET_GPR(RC, GPR(RA) | IMM);                                         \
01520   }
01521 DEFINST(BISI,                   0x01,
01522         "bis",                  "a,i,c",
01523         IntALU,                 F_ICOMP|F_IMM,
01524         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01525 
01526 
01527 CONNECT(CMOVEQ_LINK)
01528 
01529 #define CMOVEQ_IMPL                                                     \
01530   {                                                                     \
01531     if (GPR(RA) == 0)                                                   \
01532       SET_GPR(RC, GPR(RB));                                             \
01533   }
01534 DEFINST(CMOVEQ,                 0x00,
01535         "cmoveq",               "a,b,c",
01536         IntALU,                 F_ICOMP,
01537         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01538 
01539 #define CMOVEQI_IMPL                                                    \
01540   {                                                                     \
01541     if (GPR(RA) == 0)                                                   \
01542       SET_GPR(RC, IMM);                                                 \
01543   }
01544 DEFINST(CMOVEQI,                0x01,
01545         "cmoveq",               "a,i,c",
01546         IntALU,                 F_ICOMP|F_IMM,
01547         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01548 
01549 
01550 CONNECT(CMOVNE_LINK)
01551 
01552 #define CMOVNE_IMPL                                                     \
01553   {                                                                     \
01554     if (GPR(RA) != 0)                                                   \
01555       SET_GPR(RC, GPR(RB));                                             \
01556   }
01557 DEFINST(CMOVNE,                 0x00,
01558         "cmovne",               "a,b,c",
01559         IntALU,                 F_ICOMP,
01560         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01561 
01562 #define CMOVNEI_IMPL                                                    \
01563   {                                                                     \
01564     if (GPR(RA) != 0)                                                   \
01565       SET_GPR(RC, IMM);                                                 \
01566   }
01567 DEFINST(CMOVNEI,                0x01,
01568         "cmovne",               "a,i,c",
01569         IntALU,                 F_ICOMP|F_IMM,
01570         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01571 
01572 
01573 CONNECT(ORNOT_LINK)
01574 
01575 #define ORNOT_IMPL                                                      \
01576   {                                                                     \
01577     SET_GPR(RC, GPR(RA) | ~GPR(RB));                                    \
01578   }
01579 DEFINST(ORNOT,                  0x00,
01580         "ornot",                "a,b,c",
01581         IntALU,                 F_ICOMP,
01582         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01583 
01584 #define ORNOTI_IMPL                                                     \
01585   {                                                                     \
01586     SET_GPR(RC, GPR(RA) | ~IMM);                                        \
01587   }
01588 DEFINST(ORNOTI,                 0x01,
01589         "ornot",                "a,i,c",
01590         IntALU,                 F_ICOMP|F_IMM,
01591         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01592 
01593 
01594 CONNECT(XOR_LINK)
01595 
01596 #define XOR_IMPL                                                        \
01597   {                                                                     \
01598     SET_GPR(RC, GPR(RA) ^ GPR(RB));                                     \
01599   }
01600 DEFINST(XOR,                    0x00,
01601         "xor",                  "a,b,c",
01602         IntALU,                 F_ICOMP,
01603         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01604 
01605 #define XORI_IMPL                                                       \
01606   {                                                                     \
01607     SET_GPR(RC, GPR(RA) ^ IMM);                                         \
01608   }
01609 DEFINST(XORI,                   0x01,
01610         "xor",                  "a,i,c",
01611         IntALU,                 F_ICOMP|F_IMM,
01612         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01613 
01614 
01615 CONNECT(CMOVLT_LINK)
01616 
01617 #define CMOVLT_IMPL                                                     \
01618   {                                                                     \
01619     if ((sqword_t)GPR(RA) < LL(0))                                      \
01620       SET_GPR(RC, GPR(RB));                                             \
01621   }
01622 DEFINST(CMOVLT,                 0x00,
01623         "cmovlt",               "a,b,c",
01624         IntALU,                 F_ICOMP,
01625         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01626 
01627 #define CMOVLTI_IMPL                                                    \
01628   {                                                                     \
01629     if ((sqword_t)GPR(RA) < LL(0))                                      \
01630       SET_GPR(RC, IMM);                                                 \
01631   }
01632 DEFINST(CMOVLTI,                0x01,
01633         "cmovlt",               "a,i,c",
01634         IntALU,                 F_ICOMP|F_IMM,
01635         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01636 
01637 
01638 CONNECT(CMOVGE_LINK)
01639 
01640 #define CMOVGE_IMPL                                                     \
01641   {                                                                     \
01642     if ((sqword_t)GPR(RA) >= LL(0))                                     \
01643       SET_GPR(RC, GPR(RB));                                             \
01644   }
01645 DEFINST(CMOVGE,                 0x00,
01646         "cmovge",               "a,b,c",
01647         IntALU,                 F_ICOMP,
01648         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01649 
01650 #define CMOVGEI_IMPL                                                    \
01651   {                                                                     \
01652     if ((sqword_t)GPR(RA) >= LL(0))                                     \
01653       SET_GPR(RC, IMM);                                                 \
01654   }
01655 DEFINST(CMOVGEI,                0x01,
01656         "cmovge",               "a,i,c",
01657         IntALU,                 F_ICOMP|F_IMM,
01658         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01659 
01660 
01661 CONNECT(EQV_LINK)
01662 
01663 #define EQV_IMPL                                                        \
01664   {                                                                     \
01665     SET_GPR(RC, GPR(RA) ^ ~GPR(RB));                                    \
01666   }
01667 DEFINST(EQV,                    0x00,
01668         "eqv",                  "a,b,c",
01669         IntALU,                 F_ICOMP,
01670         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01671 
01672 #define EQVI_IMPL                                                       \
01673   {                                                                     \
01674     SET_GPR(RC, GPR(RA) ^ ~IMM);                                        \
01675   }
01676 DEFINST(EQVI,                   0x01,
01677         "eqv",                  "a,i,c",
01678         IntALU,                 F_ICOMP|F_IMM,
01679         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01680 
01681 
01682 /* added 02/27/99, plakal@cecil, from Alpha Arch Handbook (Rev.4, EV6) */
01683 CONNECT(AMASK_LINK)
01684 
01685 /* AMASK queries support for ISA extensions, currently we support:
01686         BWX (clear bit 0)
01687         FIX (clear bit 1) 
01688         CIX (clear bit 2)
01689         MVI (clear bit 8)
01690 */
01691 #define AMASK_IMPL                                                      \
01692   {                                                                     \
01693     SET_GPR(RC, GPR(RB) & ULL(0xfffffffffffffef8));                     \
01694   }
01695 DEFINST(AMASK,                  0x00,
01696         "amask",                "b,c",
01697         NA,                     NA,
01698         DGPR(RC), DNA,          DGPR(RB), DNA, DNA)
01699 
01700 #define AMASKI_IMPL                                                     \
01701   {                                                                     \
01702     SET_GPR(RC, IMM & ULL(0xfffffffffffffef8));                         \
01703   }
01704 DEFINST(AMASKI,                 0x01,
01705         "amask",                "i,c",
01706         NA,                     F_IMM,
01707         DGPR(RC), DNA,          DNA, DNA, DNA)
01708 
01709 
01710 CONNECT(CMOVLE_LINK)
01711 
01712 #define CMOVLE_IMPL                                                     \
01713   {                                                                     \
01714     if ((sqword_t)GPR(RA) <= LL(0))                                     \
01715       SET_GPR(RC, GPR(RB));                                             \
01716   }
01717 DEFINST(CMOVLE,                 0x00,
01718         "cmovle",               "a,b,c",
01719         IntALU,                 F_ICOMP,
01720         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01721 
01722 #define CMOVLEI_IMPL                                                    \
01723   {                                                                     \
01724     if ((sqword_t)GPR(RA) <= LL(0))                                     \
01725       SET_GPR(RC, IMM);                                                 \
01726   }
01727 DEFINST(CMOVLEI,                0x01,
01728         "cmovle",               "a,i,c",
01729         IntALU,                 F_ICOMP|F_IMM,
01730         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01731 
01732 
01733 CONNECT(CMOVGT_LINK)
01734 
01735 #define CMOVGT_IMPL                                                     \
01736   {                                                                     \
01737     if ((sqword_t)GPR(RA) > LL(0))                                      \
01738       SET_GPR(RC, GPR(RB));                                             \
01739   }
01740 DEFINST(CMOVGT,                 0x00,
01741         "cmovgt",               "a,b,c",
01742         IntALU,                 F_ICOMP,
01743         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01744 
01745 #define CMOVGTI_IMPL                                                    \
01746   {                                                                     \
01747     if ((sqword_t)GPR(RA) > LL(0))                                      \
01748       SET_GPR(RC, IMM);                                                 \
01749   }
01750 DEFINST(CMOVGTI,                0x01,
01751         "cmovgt",               "a,i,c",
01752         IntALU,                 F_ICOMP|F_IMM,
01753         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01754 
01755 
01756 CONNECT(INTS)
01757 
01758 DEFLINK(MSKBL_LINK, 0x02, "mskbl_link", 12, 1)
01759 
01760 DEFLINK(EXTBL_LINK, 0x06, "extbl_link", 12, 1)
01761 
01762 DEFLINK(INSBL_LINK, 0x0b, "insbl_link", 12, 1)
01763 
01764 DEFLINK(MSKWL_LINK, 0x12, "mskwl_link", 12, 1)
01765 
01766 DEFLINK(EXTWL_LINK, 0x16, "extwl_link", 12, 1)
01767 
01768 DEFLINK(INSWL_LINK, 0x1b, "inswl_link", 12, 1)
01769 
01770 DEFLINK(MSKLL_LINK, 0x22, "mskll_link", 12, 1)
01771 
01772 DEFLINK(EXTLL_LINK, 0x26, "extll_link", 12, 1)
01773 
01774 DEFLINK(INSLL_LINK, 0x2b, "insll_link", 12, 1)
01775 
01776 DEFLINK(ZAP_LINK, 0x30, "zap_link", 12, 1)
01777 
01778 DEFLINK(ZAPNOT_LINK, 0x31, "zapnot_link", 12, 1)
01779 
01780 DEFLINK(MSKQL_LINK, 0x32, "mskql_link", 12, 1)
01781 
01782 DEFLINK(SRL_LINK, 0x34, "srl_link", 12, 1)
01783 
01784 DEFLINK(EXTQL_LINK, 0x36, "extql_link", 12, 1)
01785 
01786 DEFLINK(SLL_LINK, 0x39, "sll_link", 12, 1)
01787 
01788 DEFLINK(INSQL_LINK, 0x3b, "insql_link", 12, 1)
01789 
01790 DEFLINK(SRA_LINK, 0x3c, "sra_link", 12, 1)
01791 
01792 DEFLINK(MSKWH_LINK, 0x52, "mskwh_link", 12, 1)
01793 
01794 DEFLINK(INSWH_LINK, 0x57, "inswh_link", 12, 1)
01795 
01796 DEFLINK(EXTWH_LINK, 0x5a, "extwh_link", 12, 1)
01797 
01798 DEFLINK(MSKLH_LINK, 0x62, "msklh_link", 12, 1)
01799 
01800 DEFLINK(INSLH_LINK, 0x67, "inslh_link", 12, 1)
01801 
01802 DEFLINK(EXTLH_LINK, 0x6a, "extlh_link", 12, 1)
01803 
01804 DEFLINK(MSKQH_LINK, 0x72, "mskqh_link", 12, 1)
01805 
01806 DEFLINK(INSQH_LINK, 0x77, "insqh_link", 12, 1)
01807 
01808 DEFLINK(EXTQH_LINK, 0x7a, "extqh_link", 12, 1)
01809 
01810 
01811 CONNECT(MSKBL_LINK)
01812 
01813 #define MSKBL_IMPL                                                      \
01814   {                                                                     \
01815     SET_GPR(RC, GPR(RA) & ~(ULL(0xff) << ((GPR(RB) & 0x7) * 8)));       \
01816   }
01817 DEFINST(MSKBL,                  0x00,
01818         "mskbl",                "a,b,c",
01819         IntALU,                 F_ICOMP,
01820         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01821 
01822 #define MSKBLI_IMPL                                                     \
01823   {                                                                     \
01824     SET_GPR(RC, GPR(RA) & ~(ULL(0xff) << ((IMM & 0x7) * 8)));           \
01825   }
01826 DEFINST(MSKBLI,                 0x01,
01827         "mskbl",                "a,i,c",
01828         IntALU,                 F_ICOMP|F_IMM,
01829         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01830 
01831 
01832 CONNECT(EXTBL_LINK)
01833 
01834 #define EXTBL_IMPL                                                      \
01835   {                                                                     \
01836     SET_GPR(RC, (GPR(RA) >> ((GPR(RB) & 0x7) * 8)) & LL(0xff));         \
01837   }
01838 DEFINST(EXTBL,                  0x00,
01839         "extbl",                "a,b,c",
01840         IntALU,                 F_ICOMP,
01841         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01842 
01843 #define EXTBLI_IMPL                                                     \
01844   {                                                                     \
01845     SET_GPR(RC, (GPR(RA) >> ((IMM & 0x7) * 8)) & LL(0xff));             \
01846   }
01847 DEFINST(EXTBLI,                 0x01,
01848         "extbl",                "a,i,c",
01849         IntALU,                 F_ICOMP|F_IMM,
01850         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01851 
01852 
01853 CONNECT(INSBL_LINK)
01854 
01855 #define INSBL_IMPL                                                      \
01856   {                                                                     \
01857     SET_GPR(RC, ((GPR(RA) << ((GPR(RB) & 0x7) * 8))                     \
01858                      & (ULL(0xff) << ((GPR(RB) & 0x7) * 8))));          \
01859   }
01860 DEFINST(INSBL,                  0x00,
01861         "insbl",                "a,b,c",
01862         IntALU,                 F_ICOMP,
01863         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01864 
01865 #define INSBLI_IMPL                                                     \
01866   {                                                                     \
01867     SET_GPR(RC, ((GPR(RA) << ((IMM & 0x7) * 8))                         \
01868                      & (ULL(0xff) << ((IMM & 0x7) * 8))));              \
01869   }
01870 DEFINST(INSBLI,                 0x01,
01871         "insbl",                "a,i,c",
01872         IntALU,                 F_ICOMP|F_IMM,
01873         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01874 
01875 
01876 CONNECT(MSKWL_LINK)
01877 
01878 #define MSKWL_IMPL                                                      \
01879   {                                                                     \
01880     SET_GPR(RC, GPR(RA) & ~(ULL(0xffff) << ((GPR(RB) & 0x7) * 8)));     \
01881   }
01882 DEFINST(MSKWL,                  0x00,
01883         "mskwl",                "a,b,c",
01884         IntALU,                 F_ICOMP,
01885         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01886 
01887 #define MSKWLI_IMPL                                                     \
01888   {                                                                     \
01889     SET_GPR(RC, GPR(RA) & ~(ULL(0xffff) << ((IMM & 0x7) * 8)));         \
01890   }
01891 DEFINST(MSKWLI,                 0x01,
01892         "mskwl",                "a,i,c",
01893         IntALU,                 F_ICOMP|F_IMM,
01894         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01895 
01896 
01897 CONNECT(EXTWL_LINK)
01898 
01899 #define EXTWL_IMPL                                                      \
01900   {                                                                     \
01901     SET_GPR(RC, (GPR(RA) >> ((GPR(RB) & 0x7) * 8)) & LL(0xffff));       \
01902   }
01903 DEFINST(EXTWL,                  0x00,
01904         "extwl",                "a,b,c",
01905         IntALU,                 F_ICOMP,
01906         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01907 
01908 #define EXTWLI_IMPL                                                     \
01909   {                                                                     \
01910     SET_GPR(RC, (GPR(RA) >> ((IMM & 0x7) * 8)) & LL(0xffff));           \
01911   }
01912 DEFINST(EXTWLI,                 0x01,
01913         "extwl",                "a,i,c",
01914         IntALU,                 F_ICOMP|F_IMM,
01915         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01916 
01917 
01918 CONNECT(INSWL_LINK)
01919 
01920 #define INSWL_IMPL                                                      \
01921   {                                                                     \
01922     SET_GPR(RC, ((GPR(RA) << ((GPR(RB) & 0x7) * 8))                     \
01923                      & (ULL(0xffff) << ((GPR(RB) & 0x7) * 8))));        \
01924   }
01925 DEFINST(INSWL,                  0x00,
01926         "inswl",                "a,b,c",
01927         IntALU,                 F_ICOMP,
01928         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01929 
01930 #define INSWLI_IMPL                                                     \
01931   {                                                                     \
01932     SET_GPR(RC, ((GPR(RA) << ((IMM & 0x7) * 8))                         \
01933                      & (ULL(0xffff) << ((IMM & 0x7) * 8))));            \
01934   }
01935 DEFINST(INSWLI,                 0x01,
01936         "inswl",                "a,i,c",
01937         IntALU,                 F_ICOMP|F_IMM,
01938         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01939 
01940 
01941 CONNECT(MSKLL_LINK)
01942 
01943 #define MSKLL_IMPL                                                      \
01944   {                                                                     \
01945     SET_GPR(RC, GPR(RA) & ~(ULL(0xffffffff) << ((GPR(RB) & 0x7) * 8))); \
01946   }
01947 DEFINST(MSKLL,                  0x00,
01948         "mskll",                "a,b,c",
01949         IntALU,                 F_ICOMP,
01950         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01951 
01952 #define MSKLLI_IMPL                                                     \
01953   {                                                                     \
01954     SET_GPR(RC, GPR(RA) & ~(ULL(0xffffffff) << ((IMM & 0x7) * 8)));     \
01955   }
01956 DEFINST(MSKLLI,                 0x01,
01957         "mskll",                "a,i,c",
01958         IntALU,                 F_ICOMP|F_IMM,
01959         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01960 
01961 
01962 CONNECT(EXTLL_LINK)
01963 
01964 #define EXTLL_IMPL                                                      \
01965   {                                                                     \
01966     SET_GPR(RC, (GPR(RA) >> ((GPR(RB) & 0x7) * 8)) & LL(0xffffffff));   \
01967   }
01968 DEFINST(EXTLL,                  0x00,
01969         "extll",                "a,b,c",
01970         IntALU,                 F_ICOMP,
01971         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01972 
01973 #define EXTLLI_IMPL                                                     \
01974   {                                                                     \
01975     SET_GPR(RC, (GPR(RA) >> ((IMM & 0x7) * 8)) & LL(0xffffffff));       \
01976   }
01977 DEFINST(EXTLLI,                 0x01,
01978         "extll",                "a,i,c",
01979         IntALU,                 F_ICOMP|F_IMM,
01980         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
01981 
01982 
01983 CONNECT(INSLL_LINK)
01984 
01985 #define INSLL_IMPL                                                      \
01986   {                                                                     \
01987     SET_GPR(RC, ((GPR(RA) << ((GPR(RB) & 0x7) * 8))                     \
01988                      & (ULL(0xffffffff) << ((GPR(RB) & 0x7) * 8))));    \
01989   }
01990 DEFINST(INSLL,                  0x00,
01991         "insll",                "a,b,c",
01992         IntALU,                 F_ICOMP,
01993         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
01994 
01995 #define INSLLI_IMPL                                                     \
01996   {                                                                     \
01997     SET_GPR(RC, ((GPR(RA) << ((IMM & 0x7) * 8))                         \
01998                      & (ULL(0xffffffff) << ((IMM & 0x7) * 8))));        \
01999   }
02000 DEFINST(INSLLI,                 0x01,
02001         "insll",                "a,i,c",
02002         IntALU,                 F_ICOMP|F_IMM,
02003         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
02004 
02005 
02006 CONNECT(ZAP_LINK)
02007 
02008 #define ZAP_IMPL                                                        \
02009   {                                                                     \
02010     int _i;                                                             \
02011     qword_t _temp = LL(0xff);                                           \
02012     qword_t _rav = GPR(RA);                                             \
02013     qword_t _rbv = GPR(RB);                                             \
02014                                                                         \
02015     SET_GPR(RC, 0);                                                     \
02016     for (_i = 1; _i < 0x100; _i = _i << 1)                              \
02017       {                                                                 \
02018         if (_i & ~_rbv)                                                 \
02019           SET_GPR(RC, GPR(RC) | (_rav & _temp));                        \
02020         _temp = _temp << 8;                                             \
02021       }                                                                 \
02022   }
02023 DEFINST(ZAP,                    0x00,
02024         "zap",                  "a,b,c",
02025         IntALU,                 F_ICOMP,
02026         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
02027 
02028 #define ZAPI_IMPL                                                       \
02029   {                                                                     \
02030     int _i;                                                             \
02031     qword_t _temp = LL(0xff);                                           \
02032     qword_t _rav = GPR(RA);                                             \
02033     qword_t _rbv = IMM;                                                 \
02034                                                                         \
02035     SET_GPR(RC, 0);                                                     \
02036     for (_i = 1; _i < 0x100; _i = _i << 1)                              \
02037       {                                                                 \
02038         if (_i & ~_rbv)                                                 \
02039           SET_GPR(RC, GPR(RC) | (_rav & _temp));                        \
02040         _temp = _temp << 8;                                             \
02041       }                                                                 \
02042   }
02043 DEFINST(ZAPI,                   0x01,
02044         "zap",                  "a,i,c",
02045         IntALU,                 F_ICOMP|F_IMM,
02046         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
02047 
02048 
02049 CONNECT(ZAPNOT_LINK)
02050 
02051 #define ZAPNOT_IMPL                                                     \
02052   {                                                                     \
02053     int _i;                                                             \
02054     qword_t _temp = LL(0xff);                                           \
02055     qword_t _rav = GPR(RA);                                             \
02056     qword_t _rbv = GPR(RB);                                             \
02057                                                                         \
02058     SET_GPR(RC, 0);                                                     \
02059     for (_i = 1; _i < 0x100; _i = _i << 1)                              \
02060       {                                                                 \
02061         if (_i & _rbv)                                                  \
02062           SET_GPR(RC, GPR(RC) | (_rav & _temp));                        \
02063         _temp = _temp << 8;                                             \
02064       }                                                                 \
02065   }
02066 DEFINST(ZAPNOT,                 0x00,
02067         "zapnot",               "a,b,c",
02068         IntALU,                 F_ICOMP,
02069         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
02070 
02071 #define ZAPNOTI_IMPL                                                    \
02072   {                                                                     \
02073     int _i;                                                             \
02074     qword_t _temp = LL(0xff);                                           \
02075     qword_t _rav = GPR(RA);                                             \
02076     qword_t _rbv = IMM;                                                 \
02077                                                                         \
02078     SET_GPR(RC, 0);                                                     \
02079     for (_i = 1; _i < 0x100; _i = _i << 1)                              \
02080       {                                                                 \
02081         if (_i & _rbv)                                                  \
02082           SET_GPR(RC, GPR(RC) | (_rav & _temp));                        \
02083         _temp = _temp << 8;                                             \
02084       }                                                                 \
02085   }
02086 DEFINST(ZAPNOTI,                0x01,
02087         "zapnot",               "a,i,c",
02088         IntALU,                 F_ICOMP|F_IMM,
02089         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
02090 
02091 
02092 CONNECT(MSKQL_LINK)
02093 
02094 #define MSKQL_IMPL                                                      \
02095   {                                                                     \
02096     SET_GPR(RC, (GPR(RA)                                                \
02097                  & ~(ULL(0xffffffffffffffff)                            \
02098                      << ((GPR(RB) & 0x7) * 8))));                       \
02099   }
02100 DEFINST(MSKQL,                  0x00,
02101         "mskql",                "a,b,c",
02102         IntALU,                 F_ICOMP,
02103         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
02104 
02105 #define MSKQLI_IMPL                                                     \
02106   {                                                                     \
02107     SET_GPR(RC, (GPR(RA)                                                \
02108                  & ~(ULL(0xffffffffffffffff) << ((IMM & 0x7) * 8))));   \
02109   }
02110 DEFINST(MSKQLI,                 0x01,
02111         "mskql",                "a,i,c",
02112         IntALU,                 F_ICOMP|F_IMM,
02113         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
02114 
02115 
02116 CONNECT(SRL_LINK)
02117 
02118 #define SRL_IMPL                                                        \
02119   {                                                                     \
02120     SET_GPR(RC, GPR(RA) >> (GPR(RB) & 0x3f));                           \
02121   }
02122 DEFINST(SRL,                    0x00,
02123         "srl",                  "a,b,c",
02124         IntALU,                 F_ICOMP,
02125         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
02126 
02127 #define SRLI_IMPL                                                       \
02128   {                                                                     \
02129     SET_GPR(RC, GPR(RA) >> (IMM & 0x3f));                               \
02130   }
02131 DEFINST(SRLI,                   0x01,
02132         "srl",          "a,i,c",
02133         IntALU,                 F_ICOMP|F_IMM,
02134         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
02135 
02136 
02137 CONNECT(EXTQL_LINK)
02138 
02139 #define EXTQL_IMPL                                                      \
02140   {                                                                     \
02141     SET_GPR(RC, GPR(RA) >> ((GPR(RB) & 0x7) * 8));                      \
02142   }
02143 DEFINST(EXTQL,                  0x00,
02144         "extql",                "a,b,c",
02145         IntALU,                 F_ICOMP,
02146         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
02147 
02148 #define EXTQLI_IMPL                                                     \
02149   {                                                                     \
02150     SET_GPR(RC, GPR(RA) >> ((IMM & 0x7) * 8));                          \
02151   }
02152 DEFINST(EXTQLI,                 0x01,
02153         "extql",                "a,i,c",
02154         IntALU,                 F_ICOMP|F_IMM,
02155         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
02156 
02157 
02158 CONNECT(SLL_LINK)
02159 
02160 #define SLL_IMPL                                                        \
02161   {                                                                     \
02162     SET_GPR(RC, GPR(RA) << (GPR(RB) & 0x3f));                           \
02163   }
02164 DEFINST(SLL,                    0x00,
02165         "sll",                  "a,b,c",
02166         IntALU,                 F_ICOMP,
02167         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
02168 
02169 #define SLLI_IMPL                                                       \
02170   {                                                                     \
02171     SET_GPR(RC, GPR(RA) << (IMM & 0x3f));                               \
02172   }
02173 DEFINST(SLLI,                   0x01,
02174         "sll",                  "a,i,c",
02175         IntALU,                 F_ICOMP|F_IMM,
02176         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
02177 
02178 
02179 CONNECT(INSQL_LINK)
02180 
02181 #define INSQL_IMPL                                                      \
02182   {                                                                     \
02183     SET_GPR(RC, ((GPR(RA) << ((GPR(RB) & 0x7) * 8))                     \
02184                  & (ULL(0xffffffffffffffff) << ((GPR(RB) & 0x7) * 8))));\
02185   }
02186 DEFINST(INSQL,                  0x00,
02187         "insql",                "a,b,c",
02188         IntALU,                 F_ICOMP,
02189         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
02190 
02191 #define INSQLI_IMPL                                                     \
02192   {                                                                     \
02193     SET_GPR(RC, ((GPR(RA) << ((IMM & 0x7) * 8))                         \
02194                  & (ULL(0xffffffffffffffff) << ((IMM & 0x7) * 8))));    \
02195   }
02196 DEFINST(INSQLI,                 0x01,
02197         "insql",                "a,i,c",
02198         IntALU,                 F_ICOMP|F_IMM,
02199         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
02200 
02201 CONNECT(SRA_LINK)
02202 
02203 #define SRA_IMPL                                                        \
02204   {                                                                     \
02205     SET_GPR(RC, (sqword_t)GPR(RA) >> (GPR(RB) & 0x3f));                 \
02206   }
02207 DEFINST(SRA,                    0x00,
02208         "sra",                  "a,b,c",
02209         IntALU,                 F_ICOMP,
02210         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
02211 
02212 #define SRAI_IMPL                                                       \
02213   {                                                                     \
02214     SET_GPR(RC, (sqword_t)GPR(RA) >> (IMM & 0x3f));                     \
02215   }
02216 DEFINST(SRAI,                   0x01,
02217         "sra",          "a,i,c",
02218         IntALU,                 F_ICOMP|F_IMM,
02219         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
02220 
02221 
02222 CONNECT(MSKWH_LINK)
02223 
02224 #define MSKWH_IMPL                                                      \
02225   {                                                                     \
02226     if ((GPR(RB) & 0x7) != 0)                                           \
02227       SET_GPR(RC, GPR(RA) & ~(ULL(0xffff) >> ((8 - (GPR(RB) & 0x7)) * 8)));\
02228     else                                                                \
02229       SET_GPR(RC, GPR(RA));                                             \
02230   }
02231 DEFINST(MSKWH,                  0x00,
02232         "mskwh",                "a,b,c",
02233         IntALU,                 F_ICOMP,
02234         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
02235 
02236 #define MSKWHI_IMPL                                                     \
02237   {                                                                     \
02238     if ((IMM & 0x7) != 0)                                               \
02239       SET_GPR(RC, GPR(RA) & ~(ULL(0xffff) >> ((8 - (IMM & 0x7)) * 8))); \
02240     else                                                                \
02241       SET_GPR(RC, GPR(RA));                                             \
02242   }
02243 DEFINST(MSKWHI,                 0x01,
02244         "mskwh",                "a,i,c",
02245         IntALU,                 F_ICOMP|F_IMM,
02246         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
02247 
02248 
02249 CONNECT(INSWH_LINK)
02250 
02251 #define INSWH_IMPL                                                      \
02252   {                                                                     \
02253     if ((GPR(RB) & 0x7) != 0)                                           \
02254       SET_GPR(RC, ((GPR(RA) >> (63 - (GPR(RB) & 0x7) * 8)) >> 1         \
02255                    & (ULL(0xffff) >> ((8 - (GPR(RB) & 0x7)) * 8))));    \
02256     else                                                                \
02257       SET_GPR(RC, 0);                                                   \
02258   }
02259 DEFINST(INSWH,                  0x00,
02260         "inswh",                "a,b,c",
02261         IntALU,                 F_ICOMP,
02262         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
02263 
02264 #define INSWHI_IMPL                                                     \
02265   {                                                                     \
02266     if ((IMM & 0x7) != 0)                                               \
02267       SET_GPR(RC, ((GPR(RA) >> (63 - (IMM & 0x7) * 8)) >> 1             \
02268                    & (ULL(0xffff) >> ((8 - (IMM & 0x7)) * 8))));        \
02269     else                                                                \
02270       SET_GPR(RC, 0);                                                   \
02271   }
02272 DEFINST(INSWHI,                 0x01,
02273         "inswh",                "a,i,c",
02274         IntALU,                 F_ICOMP|F_IMM,
02275         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
02276 
02277 
02278 CONNECT(EXTWH_LINK)
02279 
02280 #define EXTWH_IMPL                                                      \
02281   {                                                                     \
02282     SET_GPR(RC, (GPR(RA) << ((64 - (GPR(RB)&0x7) * 8) & 0x3f)) & LL(0xffff));\
02283   }
02284 DEFINST(EXTWH,                  0x00,
02285         "extwh",                "a,b,c",
02286         IntALU,                 F_ICOMP,
02287         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
02288 
02289 #define EXTWHI_IMPL                                                     \
02290   {                                                                     \
02291     SET_GPR(RC, (GPR(RA) << ((64 - (IMM & 0x7) * 8) & 0x3f)) & LL(0xffff));\
02292   }
02293 DEFINST(EXTWHI,                 0x01,
02294         "extwh",                "a,i,c",
02295         IntALU,                 F_ICOMP|F_IMM,
02296         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
02297 
02298 
02299 CONNECT(MSKLH_LINK)
02300 
02301 #define MSKLH_IMPL                                                      \
02302   {                                                                     \
02303     if ((GPR(RB) & 0x7) != 0)                                           \
02304       SET_GPR(RC, GPR(RA) & ~(ULL(0xffffffff) >>                        \
02305                               ((8 - (GPR(RB) & 0x7)) * 8)));            \
02306     else                                                                \
02307       SET_GPR(RC, GPR(RA));                                             \
02308   }
02309 DEFINST(MSKLH,                  0x00,
02310         "msklh",                "a,b,c",
02311         IntALU,                 F_ICOMP,
02312         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
02313 
02314 #define MSKLHI_IMPL                                                     \
02315   {                                                                     \
02316     if ((IMM & 0x7) != 0)                                               \
02317       SET_GPR(RC, GPR(RA) & ~(ULL(0xffffffff) >>                        \
02318                               ((8 - (IMM & 0x7)) * 8)));                \
02319     else                                                                \
02320       SET_GPR(RC, GPR(RA));                                             \
02321   }
02322 DEFINST(MSKLHI,                 0x01,
02323         "msklh",                "a,i,c",
02324         IntALU,                 F_ICOMP|F_IMM,
02325         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
02326 
02327 
02328 CONNECT(INSLH_LINK)
02329 
02330 #define INSLH_IMPL                                                      \
02331   {                                                                     \
02332     if ((GPR(RB) & 0x7) != 0)                                           \
02333       SET_GPR(RC, ((GPR(RA) >> (63 - (GPR(RB) & 0x7) * 8)) >> 1         \
02334                    & (ULL(0xffffffff) >> ((8 - (GPR(RB) & 0x7)) * 8))));\
02335     else                                                                \
02336       SET_GPR(RC, 0);                                                   \
02337   }
02338 DEFINST(INSLH,                  0x00,
02339         "inslh",                "a,b,c",
02340         IntALU,                 F_ICOMP,
02341         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
02342 
02343 #define INSLHI_IMPL                                                     \
02344   {                                                                     \
02345     if ((IMM & 0x7) != 0)                                               \
02346       SET_GPR(RC, ((GPR(RA) >> (63 - (IMM & 0x7) * 8)) >> 1             \
02347                    & (ULL(0xffffffff) >> ((8 - (IMM & 0x7)) * 8))));    \
02348     SET_GPR(RC, 0);                                                     \
02349   }
02350 DEFINST(INSLHI,                 0x01,
02351         "inslh",                "a,i,c",
02352         IntALU,                 F_ICOMP|F_IMM,
02353         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
02354 
02355 
02356 CONNECT(EXTLH_LINK)
02357 
02358 #define EXTLH_IMPL                                                      \
02359   {                                                                     \
02360     SET_GPR(RC, (GPR(RA) <<                                             \
02361                  ((64 - (GPR(RB) & 0x7) * 8) & 0x3f)) & LL(0xffffffff));\
02362   }
02363 DEFINST(EXTLH,                  0x00,
02364         "extlh",                "a,b,c",
02365         IntALU,                 F_ICOMP,
02366         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
02367 
02368 #define EXTLHI_IMPL                                                     \
02369   {                                                                     \
02370     SET_GPR(RC, (GPR(RA) << ((64 - (IMM&0x7) * 8) & 0x3f)) & LL(0xffffffff));\
02371   }
02372 DEFINST(EXTLHI,                 0x01,
02373         "extlh",                "a,i,c",
02374         IntALU,                 F_ICOMP|F_IMM,
02375         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
02376 
02377 
02378 CONNECT(MSKQH_LINK)
02379 
02380 #define MSKQH_IMPL                                                      \
02381   {                                                                     \
02382     if ((GPR(RB) & 0x7) != 0)                                           \
02383       SET_GPR(RC, (GPR(RA) & ~(ULL(0xffffffffffffffff)                  \
02384                                >> ((8 - (GPR(RB) & 0x7)) * 8))));       \
02385     else                                                                \
02386       SET_GPR(RC, GPR(RA));                                             \
02387   }
02388 DEFINST(MSKQH,                  0x00,
02389         "mskqh",                "a,b,c",
02390         IntALU,                 F_ICOMP,
02391         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
02392 
02393 #define MSKQHI_IMPL                                                     \
02394   {                                                                     \
02395     if ((IMM & 0x7) != 0)                                               \
02396       SET_GPR(RC, (GPR(RA) & ~(ULL(0xffffffffffffffff)                  \
02397                                >> ((8 - (IMM & 0x7)) * 8))));           \
02398     else                                                                \
02399       SET_GPR(RC, GPR(RA));                                             \
02400   }
02401 DEFINST(MSKQHI,                 0x01,
02402         "mskqh",                "a,i,c",
02403         IntALU,                 F_ICOMP|F_IMM,
02404         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
02405 
02406 
02407 CONNECT(INSQH_LINK)
02408 
02409 #define INSQH_IMPL                                                      \
02410   {                                                                     \
02411     if ((GPR(RB) & 0x7) != 0)                                           \
02412       SET_GPR(RC, ((GPR(RA) >> (63 - (GPR(RB) & 0x7) * 8)) >> 1         \
02413                    & (ULL(0xffffffffffffffff)                           \
02414                       >> ((8 - (GPR(RB) & 0x7)) * 8))));                \
02415     else                                                                \
02416       SET_GPR(RC, 0);                                                   \
02417   }
02418 DEFINST(INSQH,                  0x00,
02419         "insqh",                "a,b,c",
02420         IntALU,                 F_ICOMP,
02421         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
02422 
02423 #define INSQHI_IMPL                                                     \
02424   {                                                                     \
02425     if ((IMM & 0x7) != 0)                                               \
02426       SET_GPR(RC, ((GPR(RA) >> (63 - (IMM & 0x7) * 8)) >> 1             \
02427                    & (ULL(0xffffffffffffffff)                           \
02428                       >> ((8 - (IMM & 0x7)) * 8))));                    \
02429     else                                                                \
02430       SET_GPR(RC, 0);                                                   \
02431   }
02432 DEFINST(INSQHI,                 0x01,
02433         "insqh",                "a,i,c",
02434         IntALU,                 F_ICOMP|F_IMM,
02435         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
02436 
02437 
02438 CONNECT(EXTQH_LINK)
02439 
02440 #define EXTQH_IMPL                                                      \
02441   {                                                                     \
02442     SET_GPR(RC, (GPR(RA) << ((64 - (GPR(RB) & 0x7) * 8) & 0x3f)));      \
02443   }
02444 DEFINST(EXTQH,                  0x00,
02445         "extqh",                "a,b,c",
02446         IntALU,                 F_ICOMP,
02447         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
02448 
02449 #define EXTQHI_IMPL                                                     \
02450   {                                                                     \
02451     SET_GPR(RC, (GPR(RA) << ((64 - (IMM & 0x7) * 8) & 0x3f)));          \
02452   }
02453 DEFINST(EXTQHI,                 0x01,
02454         "extqh",                "a,i,c",
02455         IntALU,                 F_ICOMP|F_IMM,
02456         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
02457 
02458 
02459 CONNECT(INTM)
02460 
02461 /* FIXME: changed mask in DEFLINK(INTM ... above so that MUL{Q,L}/V
02462    now map to MUL{Q,L}, i.e. no overflow checking (earlier they
02463    generated unimplemented-faults). I think this is more symmetrical
02464    because {ADD,SUB}{L,Q}/V also do not check for overflow.  */
02465 
02466 DEFLINK(MULL_LINK, 0x00, "mull_link", 12, 1)
02467 
02468 DEFLINK(MULQ_LINK, 0x20, "mulq_link", 12, 1)
02469 
02470 DEFLINK(UMULH_LINK, 0x30, "umulh_link", 12, 1)
02471 
02472 
02473 CONNECT(MULL_LINK)
02474 
02475 #define MULL_IMPL                                                       \
02476   {                                                                     \
02477     SET_GPR(RC, SEXT32((GPR(RA) * GPR(RB)) & ULL(0xffffffff)));         \
02478   }
02479 DEFINST(MULL,                   0x00,
02480         "mull",                 "a,b,c",
02481         IntMULT,                F_ICOMP,
02482         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
02483 
02484 #define MULLI_IMPL                                                      \
02485   {                                                                     \
02486     SET_GPR(RC, SEXT32((GPR(RA) * IMM) & ULL(0xffffffff)));             \
02487   }
02488 DEFINST(MULLI,                  0x01,
02489         "mull",                 "a,i,c",
02490         IntMULT,                F_ICOMP|F_IMM,
02491         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
02492 
02493 
02494 CONNECT(MULQ_LINK)
02495 
02496 #define MULQ_IMPL                                                       \
02497   {                                                                     \
02498     SET_GPR(RC, GPR(RA) * GPR(RB));                                     \
02499   }
02500 DEFINST(MULQ,                   0x00,
02501         "mulq",                 "a,b,c",
02502         IntMULT,                F_ICOMP,
02503         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
02504 
02505 #define MULQI_IMPL                                                      \
02506   {                                                                     \
02507     SET_GPR(RC, GPR(RA) * IMM);                                         \
02508   }
02509 DEFINST(MULQI,                  0x01,
02510         "mulq",                 "a,i,c",
02511         IntMULT,                F_ICOMP|F_IMM,
02512         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
02513 
02514 
02515 CONNECT(UMULH_LINK)
02516 
02517 #define UMULH_IMPL                                                      \
02518   {                                                                     \
02519     sqword_t _v1 = GPR(RA);                                             \
02520     sqword_t _v2 = GPR(RB);                                             \
02521     qword_t _result;                                                    \
02522     qword_t _a, _b, _c, _d;                                             \
02523     qword_t _bd, _ad, _cb, _ac;                                         \
02524     qword_t _mid, _mid2, _carry_mid = 0;                                \
02525                                                                         \
02526     _a = (_v1 >> 32) & LL(0xffffffff);                                  \
02527     _b = _v1 & LL(0xffffffff);                                          \
02528     _c = (_v2 >> 32) & LL(0xffffffff);                                  \
02529     _d = _v2 & LL(0xffffffff);                                          \
02530   /*myfprintf(stderr, "%n: %p %p %p %p\n", sim_num_insn, _a, _b, _c, _d);*/\
02531                                                                         \
02532     _bd = _b * _d;                                                      \
02533     _ad = _a * _d;                                                      \
02534     _cb = _c * _b;                                                      \
02535     _ac = _a * _c;                                                      \
02536   /*myfprintf(stderr, "    %p %p %p %p\n", _bd, _ad, _cb, _ac);*/       \
02537                                                                         \
02538     _mid = _ad + _cb;                                                   \
02539     if (ARITH_OVFL(_mid, _ad, _cb))                                     \
02540       _carry_mid = 1;                                                   \
02541                                                                         \
02542     _mid2 = _mid + ((_bd >> 32) & LL(0xffffffff));                      \
02543     if (ARITH_OVFL(_mid2, _mid, ((_bd >> 32) & LL(0xffffffff))))        \
02544       _carry_mid += 1;                                                  \
02545     _result =                                                           \
02546       _ac + (_carry_mid << 32) + ((_mid2 >> 32) & LL(0xffffffff));      \
02547     /*myfprintf(stderr, "    %p %p %p %p\n", _mid,_mid2,_carry_mid,_result);*/\
02548                                                                         \
02549     SET_GPR(RC, _result);                                               \
02550   }
02551 DEFINST(UMULH,                  0x00,
02552         "umulh",                "a,b,c",
02553         IntMULT,                F_ICOMP,
02554         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
02555 
02556 #define UMULHI_IMPL                                                     \
02557   {                                                                     \
02558     sqword_t _v1 = GPR(RA);                                             \
02559     sqword_t _v2 = IMM;                                                 \
02560     qword_t _result;                                                    \
02561     qword_t _a, _b, _c, _d;                                             \
02562     qword_t _bd, _ad, _cb, _ac;                                         \
02563     qword_t _mid, _mid2, _carry_mid = 0;                                \
02564                                                                         \
02565     _a = (_v1 >> 32) & LL(0xffffffff);                                  \
02566     _b = _v1 & LL(0xffffffff);                                          \
02567     _c = (_v2 >> 32) & LL(0xffffffff);                                  \
02568     _d = _v2 & LL(0xffffffff);                                          \
02569                                                                         \
02570     _bd = _b * _d;                                                      \
02571     _ad = _a * _d;                                                      \
02572     _cb = _c * _b;                                                      \
02573     _ac = _a * _c;                                                      \
02574                                                                         \
02575     _mid = _ad + _cb;                                                   \
02576     if (ARITH_OVFL(_mid, _ad, _cb))                                     \
02577       _carry_mid = 1;                                                   \
02578                                                                         \
02579     _mid2 = _mid + ((_bd >> 32) & LL(0xffffffff));                      \
02580     if (ARITH_OVFL(_mid2, _mid, ((_bd >> 32) & LL(0xffffffff))))        \
02581       _carry_mid += 1;                                                  \
02582     _result =                                                           \
02583       _ac + (_carry_mid << 32) + ((_mid2 >> 32) & LL(0xffffffff));      \
02584                                                                         \
02585     SET_GPR(RC, _result);                                               \
02586   }
02587 DEFINST(UMULHI,                 0x01,
02588         "umulh",                "a,i,c",
02589         IntMULT,                F_ICOMP|F_IMM,
02590         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
02591 
02592 
02593 /* added 02/27/99, plakal@cecil, from Alpha Arch Handbook (Rev.4, EV6) */
02594 /* FIX extensions */
02595 CONNECT(ITFP)
02596 
02597 #define ITOFS_IMPL                                                      \
02598   {                                                                     \
02599     sqword_t _longhold, _e1, _e2;                                       \
02600                                                                         \
02601     _longhold = GPR(RA) & ULL(0xffffffff);                              \
02602                                                                         \
02603     _e1 = _longhold & 0x40000000;                                       \
02604     _e2 = (_longhold >> 23) & ULL(0x7f);                                \
02605     if (_e1)                                                            \
02606       {                                                                 \
02607         if (_e2 == ULL(0x3f800000))                                     \
02608           _e2 = ULL(0x7ff);                                             \
02609         else                                                            \
02610           _e2 |= ULL(0x400);                                            \
02611       }                                                                 \
02612     else                                                                \
02613       {                                                                 \
02614         if (_e2 == 0)                                                   \
02615           _e2 = 0;                                                      \
02616         else                                                            \
02617           _e2 |= ULL(0x380);                                            \
02618       }                                                                 \
02619     SET_FPR_Q(RC, (((_longhold & ULL(0x80000000)) << 32)                \
02620                    | (_e2 << 52) | ((_longhold & ULL(0x7fffff)) << 29)));\
02621   }
02622 DEFINST(ITOFS,                  0x04,
02623         "itofs",                "a,C",
02624         FloatCVT,               F_FCOMP,  /* FIXME: are these flags correct? */
02625         DFPR(RC), DNA,          DGPR(RA), DNA, DNA)
02626 
02627 #define SQRTF_IMPL                                                      \
02628   {                                                                     \
02629     /* FIXME: unimplemented */                                          \
02630     DECLARE_FAULT(md_fault_unimpl);                                     \
02631   }
02632 DEFINST(SQRTF,                  0x0a,
02633         "sqrtf (unimpl)",       "B,C",
02634         NA,                     NA,
02635         DNA, DNA,               DNA, DNA, DNA)
02636 
02637 
02638 #define SQRTS_IMPL                                                      \
02639   {                                                                     \
02640      if (FPR(RB) < 0.0)                                                 \
02641        DECLARE_FAULT(md_fault_invalid);                                 \
02642                                                                         \
02643    /* -- FIXME: too much precision here */                              \
02644      SET_FPR(RC, (dfloat_t)sqrt((double)FPR(RB)));                      \
02645   }
02646 DEFINST(SQRTS,                  0x0b,
02647         "sqrts",                "B,C",
02648         FloatSQRT,              F_FCOMP,
02649         DFPR(RC), DNA,          DFPR(RB), DNA, DNA)
02650 
02651 #define ITOFF_IMPL                                                      \
02652   {                                                                     \
02653     /* FIXME: unimplemented */                                          \
02654     DECLARE_FAULT(md_fault_unimpl);                                     \
02655   }
02656 DEFINST(ITOFF,                  0x14,
02657         "itoff (unimpl)",       "a,C",
02658         NA,                     NA,
02659         DNA, DNA,               DNA, DNA, DNA)
02660 
02661 #define ITOFT_IMPL                                                      \
02662   {                                                                     \
02663     SET_FPR_Q(RC, GPR(RA));                                             \
02664   }
02665 DEFINST(ITOFT,                  0x24,
02666         "itoft",                "a,C",
02667         FloatCVT,               F_FCOMP,  /* FIXME: are these flags correct? */
02668         DFPR(RC), DNA,          DGPR(RA), DNA, DNA)
02669 
02670 #define SQRTG_IMPL                                                      \
02671   {                                                                     \
02672     /* FIXME: unimplemented */                                          \
02673     DECLARE_FAULT(md_fault_unimpl);                                     \
02674   }
02675 DEFINST(SQRTG,                  0x2a,
02676         "sqrtg (unimpl)",       "B,C",
02677         NA,                     NA,
02678         DNA, DNA,               DNA, DNA, DNA)
02679 
02680 #define SQRTT_IMPL                                                      \
02681   {                                                                     \
02682      if (FPR(RB) < 0.0)                                                 \
02683        DECLARE_FAULT(md_fault_invalid);                                 \
02684                                                                         \
02685      SET_FPR(RC, (dfloat_t)sqrt((double)FPR(RB)));                      \
02686   }
02687 DEFINST(SQRTT,                  0x2b,
02688         "sqrtt",                "B,C",
02689         NA,                     NA,
02690         DFPR(RC), DNA,          DFPR(RB), DNA, DNA)
02691 
02692 
02693 CONNECT(FLTI)
02694 
02695 #define ADDS_IMPL                                                       \
02696   {                                                                     \
02697     /* FIXME: too much precision here... */                             \
02698     SET_FPR(RC, FPR(RA) + FPR(RB));                                     \
02699   }
02700 DEFINST(ADDS,                   0x00,
02701         "adds",                 "A,B,C",
02702         FloatADD,               F_FCOMP,
02703         DFPR(RC), DNA,          DFPR(RA), DFPR(RB), DNA)
02704 
02705 #define SUBS_IMPL                                                       \
02706   {                                                                     \
02707     /* FIXME: too much precision here... */                             \
02708     SET_FPR(RC, FPR(RA) - FPR(RB));                                     \
02709   }
02710 DEFINST(SUBS,                   0x01,
02711         "subs",                 "A,B,C",
02712         FloatADD,               F_FCOMP,
02713         DFPR(RC), DNA,          DFPR(RA), DFPR(RB), DNA)
02714 
02715 #define MULS_IMPL                                                       \
02716   {                                                                     \
02717     /* FIXME: too much precision here... */                             \
02718     SET_FPR(RC, FPR(RA) * FPR(RB));                                     \
02719   }
02720 DEFINST(MULS,                   0x02,
02721         "muls",                 "A,B,C",
02722         FloatMULT,              F_FCOMP,
02723         DFPR(RC), DNA,          DFPR(RA), DFPR(RB), DNA)
02724 
02725 #define DIVS_IMPL                                                       \
02726   {                                                                     \
02727     /* FIXME: too much precision here... */                             \
02728     SET_FPR(RC, FPR(RA) / FPR(RB));                                     \
02729   }
02730 DEFINST(DIVS,                   0x03,
02731         "divs",                 "A,B,C",
02732         FloatDIV,               F_FCOMP,
02733         DFPR(RC), DNA,          DFPR(RA), DFPR(RB), DNA)
02734 
02735 #define ADDT_IMPL                                                       \
02736   {                                                                     \
02737     SET_FPR(RC, FPR(RA) + FPR(RB));                                     \
02738   }
02739 DEFINST(ADDT,                   0x20,
02740         "addt",                 "A,B,C",
02741         FloatADD,                       F_FCOMP,
02742         DFPR(RC), DNA,          DFPR(RA), DFPR(RB), DNA)
02743 
02744 #define SUBT_IMPL                                                       \
02745   {                                                                     \
02746     SET_FPR(RC, FPR(RA) - FPR(RB));                                     \
02747   }
02748 DEFINST(SUBT,                   0x21,
02749         "subt",                 "A,B,C",
02750         FloatADD,                       F_FCOMP,
02751         DFPR(RC), DNA,          DFPR(RA), DFPR(RB), DNA)
02752 
02753 #define MULT_IMPL                                                       \
02754   {                                                                     \
02755     SET_FPR(RC, FPR(RA) * FPR(RB));                                     \
02756   }
02757 DEFINST(MULT,                   0x22,
02758         "mult",                 "A,B,C",
02759         FloatMULT,              F_FCOMP,
02760         DFPR(RC), DNA,          DFPR(RA), DFPR(RB), DNA)
02761 
02762 #define DIVT_IMPL                                                       \
02763   {                                                                     \
02764     SET_FPR(RC, FPR(RA) / FPR(RB));                                     \
02765   }
02766 DEFINST(DIVT,                   0x23,
02767         "divt",                 "A,B,C",
02768         FloatDIV,               F_FCOMP,
02769         DFPR(RC), DNA,          DFPR(RA), DFPR(RB), DNA)
02770 
02771 #define CMPTUN_IMPL                                                     \
02772   {                                                                     \
02773     SET_FPR(RC, (IS_IEEEFP_DBL_NAN(FPR_Q(RA)) || IS_IEEEFP_DBL_NAN(FPR_Q(RB)))\
02774                  ? 2.0                                                  \
02775                  : 0.0);                                                \
02776   }
02777 DEFINST(CMPTUN,                 0x24,
02778         "cmptun",               "A,B,C",
02779         FloatCMP,               F_FCOMP,
02780         DFPR(RC), DNA,          DFPR(RA), DFPR(RB), DNA)
02781 
02782 #define CMPTEQ_IMPL                                                     \
02783   {                                                                     \
02784     SET_FPR(RC, (((FPR_Q(RA) == FPR_Q(RB))                              \
02785                   || (FPR_Q(RA) << 1 == ULL(0)                          \
02786                       && FPR_Q(RB) << 1 == ULL(0)))                     \
02787                  ? 2.0                                                  \
02788                  : 0.0));                                               \
02789   }
02790 DEFINST(CMPTEQ,                 0x25,
02791         "cmpteq",               "A,B,C",
02792         FloatADD,               F_FCOMP,
02793         DFPR(RC), DNA,          DFPR(RA), DFPR(RB), DNA)
02794 
02795 #define CMPTLT_IMPL                                                     \
02796   {                                                                     \
02797     SET_FPR(RC, (FPR(RA) < FPR(RB)) ? 2.0 : 0.0);                       \
02798   }
02799 DEFINST(CMPTLT,                 0x26,
02800         "cmptlt",               "A,B,C",
02801         FloatADD,               F_FCOMP,
02802         DFPR(RC), DNA,          DFPR(RA), DFPR(RB), DNA)
02803 
02804 #define CMPTLE_IMPL                                                     \
02805   {                                                                     \
02806     SET_FPR(RC, (FPR(RA) <= FPR(RB)) ? 2.0 : 0.0);                      \
02807   }
02808 DEFINST(CMPTLE,                 0x27,
02809         "cmptle",               "A,B,C",
02810         FloatADD,               F_FCOMP,
02811         DFPR(RC), DNA,          DFPR(RA), DFPR(RB), DNA)
02812 
02813 #define CVTTS_IMPL                                                      \
02814   {                                                                     \
02815     SET_FPR(RC, (float)FPR(RB));                                        \
02816   }
02817 DEFINST(CVTTS,                  0x2c,
02818         "cvtts",                "B,C",
02819         FloatADD,               F_FCOMP,
02820         DFPR(RC), DNA,          DFPR(RB), DNA, DNA)
02821 
02822 #define CVTTQ_IMPL                                                      \
02823   {                                                                     \
02824     SET_FPR_Q(RC, (sqword_t)FPR(RB));                                   \
02825   }
02826 DEFINST(CVTTQ,                  0x2f,
02827         "cvttq",                "B,C",
02828         FloatADD,               F_FCOMP,
02829         DFPR(RC), DNA,          DFPR(RB), DNA, DNA)
02830 
02831 #define CVTQS_IMPL                                                      \
02832   {                                                                     \
02833     /* FIXME: too much precision here... */                             \
02834     SET_FPR(RC, (sqword_t)FPR_Q(RB));                                   \
02835   }
02836 DEFINST(CVTQS,                  0x3c,
02837         "cvtqs",                "B,C",
02838         FloatADD,               F_FCOMP,
02839         DFPR(RC), DNA,          DFPR(RB), DNA, DNA)
02840 
02841 #define CVTQT_IMPL                                                      \
02842   {                                                                     \
02843     SET_FPR(RC, (sqword_t)FPR_Q(RB));                                   \
02844   }
02845 DEFINST(CVTQT,                  0x3e,
02846         "cvtqt",                "B,C",
02847         FloatADD,               F_FCOMP,
02848         DFPR(RC), DNA,          DFPR(RB), DNA, DNA)
02849 
02850 
02851 CONNECT(FLTL)
02852 
02853 #define CVTLQ_IMPL                                                      \
02854   {                                                                     \
02855     sqword_t _longhold;                                                 \
02856     sword_t _inthold;                                                   \
02857                                                                         \
02858     _longhold = FPR_Q(RB);                                              \
02859     _inthold = (((_longhold >> 32) & 0xc0000000)                        \
02860                 | ((_longhold >> 29) & 0x3fffffff));                    \
02861     SET_FPR_Q(RC, (sqword_t)_inthold);                                  \
02862   }
02863 
02864 DEFINST(CVTLQ,                  0x10,
02865         "cvtlq",                "B,C",
02866         FloatADD,               F_FCOMP,
02867         DFPR(RC), DNA,          DFPR(RB), DNA, DNA)
02868 
02869 #define CPYS_IMPL                                                       \
02870   {                                                                     \
02871     SET_FPR_Q(RC, ((FPR_Q(RA) & ULL(1) << 63)                           \
02872                    | (FPR_Q(RB) & LL(0x7fffffffffffffff))));            \
02873   }
02874 DEFINST(CPYS,                   0x20,
02875         "cpys",                 "A,B,C",
02876         FloatADD,               F_FCOMP,
02877         DFPR(RC), DNA,          DFPR(RA), DFPR(RB), DNA)
02878 
02879 #define CPYSN_IMPL                                                      \
02880   {                                                                     \
02881     SET_FPR_Q(RC, ((FPR_Q(RA) >> 63 ^ 1) << 63                          \
02882                    | (FPR_Q(RB) & LL(0x7fffffffffffffff))));            \
02883   }
02884 DEFINST(CPYSN,                  0x21,
02885         "cpysn",                "A,B,C",
02886         FloatADD,               F_FCOMP,
02887         DFPR(RC), DNA,          DFPR(RA), DFPR(RB), DNA)
02888 
02889 #define CPYSE_IMPL                                                      \
02890   {                                                                     \
02891     SET_FPR_Q(RC, ((FPR_Q(RA) & ULL(0xfff) << 52)                       \
02892                    | (FPR_Q(RB) & ULL(0xfffffffffffff))));              \
02893   }
02894 DEFINST(CPYSE,                  0x22,
02895         "cpyse",                "A,B,C",
02896         FloatADD,               F_FCOMP,
02897         DFPR(RC), DNA,          DFPR(RA), DFPR(RB), DNA)
02898 
02899 #define MT_FPCR_IMPL                                                    \
02900   {                                                                     \
02901     /* FIXED, 02/26/99, plakal@cecil, Glew's fix, read FP reg as qword */\
02902     SET_FPCR(FPR_Q(RA));                                                \
02903   }
02904 DEFINST(MT_FPCR,                0x24,
02905         "mt_fpcr",              "A",
02906         FloatADD,               F_FCOMP,
02907         DFPCR, DNA,             DFPR(RA), DNA, DNA)
02908 
02909 #ifdef _MSC_VER
02910 #define MF_FPCR_IMPL                                                    \
02911   {                                                                     \
02912     /* FIXME: qword_t to double conversion not implemented in MSC */    \
02913     /* FIXED, 02/26/99, plakal@cecil, using Glew's fix, set FP reg as qword */\
02914     SET_FPR_Q(RA, FPCR);                                                \
02915   }
02916 #else /* !_MSC_VER */
02917 #define MF_FPCR_IMPL                                                    \
02918   {                                                                     \
02919     /* FIXED, 02/26/99, plakal@cecil, using Glew's fix, set FP reg as qword */\
02920     SET_FPR_Q(RA, FPCR);                                                \
02921   }
02922 #endif /* _MSC_VER */
02923 DEFINST(MF_FPCR,                0x25,
02924         "mf_fpcr",              "A",
02925         FloatADD,               F_FCOMP,
02926         DFPR(RA), DNA,          DFPCR, DNA, DNA)
02927 
02928 #define FCMOVEQ_IMPL                                                    \
02929   {                                                                     \
02930     if ((FPR_Q(RA) << 1) == ULL(0))                                     \
02931       SET_FPR(RC, FPR(RB));                                             \
02932   }
02933 DEFINST(FCMOVEQ,                0x2a,
02934         "fcmoveq",              "A,B,C",
02935         FloatADD,               F_FCOMP,
02936         DFPR(RC), DNA,          DFPR(RA), DFPR(RB), DNA)
02937 
02938 #define FCMOVNE_IMPL                                                    \
02939   {                                                                     \
02940     if ((FPR_Q(RA) << 1) != ULL(0))                                     \
02941       SET_FPR(RC, FPR(RB));                                             \
02942   }
02943 DEFINST(FCMOVNE,                0x2b,
02944         "fcmovne",              "A,B,C",
02945         FloatADD,               F_FCOMP,
02946         DFPR(RC), DNA,          DFPR(RA), DFPR(RB), DNA)
02947 
02948 #define FCMOVLT_IMPL                                                    \
02949   {                                                                     \
02950     if (((FPR_Q(RA) << 1) != ULL(0)) && (FPR_Q(RA) >> 63))              \
02951       SET_FPR(RC, FPR(RB));                                             \
02952   }
02953 DEFINST(FCMOVLT,                0x2c,
02954         "fcmovlt",              "A,B,C",
02955         FloatADD,               F_FCOMP,
02956         DFPR(RC), DNA,          DFPR(RA), DFPR(RB), DNA)
02957 
02958 #define FCMOVGE_IMPL                                                    \
02959   {                                                                     \
02960     if (((FPR_Q(RA) << 1) == ULL(0)) || (FPR_Q(RA) >> 63 == ULL(0)))    \
02961       SET_FPR(RC, FPR(RB));                                             \
02962   }
02963 DEFINST(FCMOVGE,                0x2d,
02964         "fcmovge",              "A,B,C",
02965         FloatADD,               F_FCOMP,
02966         DFPR(RC), DNA,          DFPR(RA), DFPR(RB), DNA)
02967 
02968 #define FCMOVLE_IMPL                                                    \
02969   {                                                                     \
02970     if (((FPR_Q(RA) << 1) == ULL(0)) || (FPR_Q(RA) >> 63))              \
02971       SET_FPR(RC, FPR(RB));                                             \
02972   }
02973 DEFINST(FCMOVLE,                0x2e,
02974         "fcmovle",              "A,B,C",
02975         FloatADD,               F_FCOMP,
02976         DFPR(RC), DNA,          DFPR(RA), DFPR(RB), DNA)
02977 
02978 #define FCMOVGT_IMPL                                                    \
02979   {                                                                     \
02980     if (((FPR_Q(RA) << 1) != ULL(0)) && (FPR_Q(RA) >> 63 == ULL(0)))    \
02981       SET_FPR(RC, FPR(RB));                                             \
02982   }
02983 DEFINST(FCMOVGT,                0x2f,
02984         "fcmovgt",              "A,B,C",
02985         FloatADD,               F_FCOMP,
02986         DFPR(RC), DNA,          DFPR(RA), DFPR(RB), DNA)
02987 
02988 /* FIXME: CVTQLV and CVTQLSV should map to here... */
02989 #define CVTQL_IMPL                                                      \
02990   {                                                                     \
02991     sqword_t longhold = FPR_Q(RB);                                      \
02992                                                                         \
02993     SET_FPR_Q(RC, (((longhold >> 32) & LL(0xc000000000000000))          \
02994                    | (longhold & LL(0x3fffffff)) << 29));               \
02995   }
02996 DEFINST(CVTQL,                  0x30,
02997         "cvtql",                "B,C",
02998         FloatADD,               F_FCOMP,
02999         DFPR(RC), DNA,          DFPR(RB), DNA, DNA)
03000 
03001 
03002 CONNECT(MISC)
03003 
03004 /* Note: some DEFINSTs below have different MSK values because the
03005    mask & shifts in the MISC link above have changed */
03006 
03007 #define TRAPB_IMPL                                                      \
03008   {                                                                     \
03009     /* FIXME: nada... */                                                \
03010   }
03011 DEFINST(TRAPB,                  0x00,
03012         "trapb",                "",
03013         NA,                     F_TRAP,
03014         DNA, DNA,               DNA, DNA, DNA)
03015 
03016 /* added 02/27/99, plakal@cecil, from Alpha Arch Handbook (Rev.4, EV6) */
03017 #define EXCB_IMPL                                                       \
03018   {                                                                     \
03019     /* FIXME: nada... */                                                \
03020   }
03021 DEFINST(EXCB,                   0x04,
03022         "excb",                 "",
03023         NA,                     F_TRAP,
03024         DNA, DNA,               DNA, DNA, DNA)
03025 
03026 #define MB_IMPL                                                         \
03027   {                                                                     \
03028     /* FIXME: not supported... */                                       \
03029   }
03030 DEFINST(MB,                     0x40, /* -- Changed from 0x04 */
03031         "mb",                   "",
03032         NA,                     F_TRAP,
03033         DNA, DNA,               DNA, DNA, DNA)
03034 
03035 /* added 02/27/99, plakal@cecil, from Alpha Arch Handbook (Rev.4, EV6) */
03036  
03037 #define WMB_IMPL                                                        \
03038   {                                                                     \
03039     /* FIXME: not supported... */                                       \
03040   }
03041 DEFINST(WMB,                    0x44,
03042         "wmb",                  "",
03043         NA,                     F_TRAP,
03044         DNA, DNA,               DNA, DNA, DNA)
03045 
03046 /* changed from unimplemented to unsupported */
03047 #define FETCH_IMPL                                                      \
03048   {                                                                     \
03049     /* FIXME: not supported ... */                                      \
03050   }
03051 DEFINST(FETCH,                  0x80, /* -- Changed from 0x08 */
03052         "fetch",                "0(b)",
03053         NA,                     NA,
03054         DNA, DNA,               DNA, DNA, DNA)
03055 
03056 /* changed from unimplemented to unsupported */
03057 #define FETCH_M_IMPL                                                    \
03058   {                                                                     \
03059     /* FIXME: not supported ... */                                      \
03060   }
03061 DEFINST(FETCH_M,                0xa0, /* -- Changed from 0x0a */
03062         "fetch_m",              "0(b)",
03063         NA,                     NA,
03064         DNA, DNA,               DNA, DNA, DNA)
03065 
03066 /* changed from unimplemented */
03067 #define RPCC_IMPL                                                       \
03068   {                                                                     \
03069     /* FIXME: dumb implementation */                                    \
03070     SET_GPR(RA, ULL(0));                                                \
03071   }
03072 DEFINST(RPCC,                   0xc0, /* -- Changed from 0x0c */
03073         "rpcc",                 "a",
03074         NA,                     NA,
03075         DGPR(RA), DNA,          DNA, DNA, DNA)
03076 
03077 /* added 02/27/99, plakal@cecil, from Alpha Arch Handbook (Rev.4, EV6) */
03078 #define _RC_IMPL                                                        \
03079   {                                                                     \
03080     /* FIXME: not supported */                                          \
03081   }
03082 DEFINST(_RC,                    0xe0,  
03083         "rc",                   "a",
03084         NA,                     NA,
03085         DNA, DNA,               DNA, DNA, DNA)
03086 
03087 /* added 02/27/99, plakal@cecil, from Alpha Arch Handbook (Rev.4, EV6) */
03088 #define ECB_IMPL                                                        \
03089   {                                                                     \
03090     /* FIXME: nada... */                                                \
03091   }
03092 DEFINST(ECB,                    0xe8,
03093         "ecb",                  "(b)",
03094         NA,                     NA,
03095         DNA, DNA,               DNA, DNA, DNA)
03096 
03097 /* changed from unimplemented to unsupported */
03098 #define _RS_IMPL                                                        \
03099   {                                                                     \
03100     /* FIXME: not supported */                                          \
03101   }
03102 DEFINST(_RS,                    0xf0,  /* -- Changed from 0x0f */
03103         "rs",                   "a",
03104         NA,                     NA,
03105         DNA, DNA,               DNA, DNA, DNA)
03106 
03107 /* added 02/27/99, plakal@cecil, from Alpha Arch Handbook (Rev.4, EV6) */
03108 #define WH64_IMPL                                                       \
03109   {                                                                     \
03110     /* FIXME: nada... */                                                \
03111   }
03112 DEFINST(WH64,                   0xf8,
03113         "wh64",                 "(b)",
03114         NA,                     NA,
03115         DNA, DNA,               DNA, DNA, DNA)
03116 
03117 
03118 CONNECT(JMPJSR)
03119 
03120 #define JMP_IMPL                                                        \
03121   {                                                                     \
03122     SET_TPC(GPR(RB) & ~3);                                              \
03123     SET_NPC(GPR(RB) & ~3);                                              \
03124     SET_GPR(RA, CPC + 4);                                               \
03125   }
03126 DEFINST(JMP,                    0x00,
03127         "jmp",                  "a,(b)",
03128         IntALU,                 F_CTRL|F_UNCOND|F_INDIRJMP,
03129         DGPR(RA), DNA,          DGPR(RB), DNA, DNA)
03130 
03131 #define JSR_IMPL                                                        \
03132   {                                                                     \
03133     SET_TPC(GPR(RB) & ~3);                                              \
03134     SET_NPC(GPR(RB) & ~3);                                              \
03135     SET_GPR(RA, CPC + 4);                                               \
03136   }
03137 DEFINST(JSR,                    0x01,
03138         "jsr",                  "a,(b)",
03139         IntALU,                 F_CTRL|F_UNCOND|F_INDIRJMP,
03140         DGPR(RA), DNA,          DGPR(RB), DNA, DNA)
03141 
03142 #define RETN_IMPL                                                       \
03143   {                                                                     \
03144     SET_TPC(GPR(RB) & ~3);                                              \
03145     SET_NPC(GPR(RB) & ~3);                                              \
03146     SET_GPR(RA, CPC + 4);                                               \
03147   }
03148 DEFINST(RETN,                   0x02,
03149         "ret",                  "a,(b)",
03150         IntALU,                 F_CTRL|F_UNCOND|F_INDIRJMP,
03151         DGPR(RA), DNA,          DGPR(RB), DNA, DNA)
03152 
03153 #define JSR_COROUTINE_IMPL                                              \
03154   {                                                                     \
03155     SET_TPC(GPR(RB) & ~3);                                              \
03156     SET_NPC(GPR(RB) & ~3);                                              \
03157     SET_GPR(RA, CPC + 4);                                               \
03158   }
03159 DEFINST(JSR_COROUTINE,          0x03,
03160         "jsr_coroutine",        "a,(b)",
03161         IntALU,                 F_CTRL|F_UNCOND|F_INDIRJMP,
03162         DGPR(RA), DNA,          DGPR(RB), DNA, DNA)
03163 
03164 
03165 /* changed from EXTS to FPTI to include more extensions (FIX,CIX,MVI) */
03166 CONNECT(FPTI)
03167 
03168 /* EV56 BWX extension... */
03169 DEFLINK(SEXTB_LINK, 0x00, "sextb_link", 12, 1)
03170 
03171 /* EV56 BWX extension... */
03172 DEFLINK(SEXTW_LINK, 0x01, "sextw_link", 12, 1)
03173 
03174 /* added 02/27/99, plakal@cecil, from Alpha Arch Handbook (Rev.4, EV6) */
03175  
03176 /* CIX extensions */
03177 
03178 /* FIXME: could write a faster version of 1-bit-counting:
03179    i.e., count = 0; while (n) { n = n & (n-1); count++; } */
03180 #define CTPOP_IMPL                                                      \
03181   {                                                                     \
03182     int _temp, _i;                                                      \
03183     qword_t _qwordhold = GPR(RB);                                       \
03184                                                                         \
03185     _temp = 0;                                                          \
03186     for (_i = 0; _i <= 63; _i++)                                        \
03187       if (_qwordhold & (ULL(1) << _i))                                  \
03188         _temp++;                                                        \
03189                                                                         \
03190     SET_GPR(RC, (qword_t)_temp);                                        \
03191   }
03192 DEFINST(CTPOP,                  0x30,  
03193         "ctpop",                "b,c",
03194         IntALU,                 F_ICOMP,
03195         DGPR(RC), DNA,          DGPR(RB), DNA, DNA)
03196 
03197 /* MVI extensions */
03198 #define PERR_IMPL                                                       \
03199   {                                                                     \
03200     int _i;                                                             \
03201     qword_t _sum_diffs, _qwordhold_a, _qwordhold_b;                     \
03202                                                                         \
03203     _qwordhold_a = GPR(RA);                                             \
03204     _qwordhold_b = GPR(RB);                                             \
03205     _sum_diffs = 0;                                                     \
03206                                                                         \
03207     for (_i = 0; _i <= 7; _i++)                                         \
03208     {                                                                   \
03209       byte_t _bytehold_a, _bytehold_b;                                  \
03210                                                                         \
03211       _bytehold_a = (_qwordhold_a >> (_i*8)) & 0xff;                    \
03212       _bytehold_b = (_qwordhold_b >> (_i*8)) & 0xff;                    \
03213       if (_bytehold_a >= _bytehold_b)                                   \
03214         _sum_diffs += (_bytehold_a - _bytehold_b);                      \
03215       else                                                              \
03216         _sum_diffs += (_bytehold_b - _bytehold_a);                      \
03217     }                                                                   \
03218                                                                         \
03219     SET_GPR(RC, _sum_diffs);                                            \
03220   }
03221 DEFINST(PERR,                   0x31,
03222         "perr",                 "a,b,c",
03223         IntALU,                 F_ICOMP,
03224         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
03225 
03226 
03227 /* CIX extensions */
03228 #define CTLZ_IMPL                                                       \
03229   {                                                                     \
03230     int _temp, _i;                                                      \
03231     qword_t _qwordhold = GPR(RB);                                       \
03232                                                                         \
03233     _temp = 0;                                                          \
03234     for (_i = 63; _i >= 0; _i--)                                        \
03235     {                                                                   \
03236       if (_qwordhold & (ULL(1) << _i))                                  \
03237         break;                                                          \
03238                                                                         \
03239       _temp++;                                                          \
03240     }                                                                   \
03241                                                                         \
03242     SET_GPR(RC, (qword_t)_temp);                                        \
03243   }
03244 DEFINST(CTLZ,                   0x32,  
03245         "ctlz",                 "b,c",
03246         IntALU,                 F_ICOMP,
03247         DGPR(RC), DNA,          DGPR(RB), DNA, DNA)
03248 
03249 #define CTTZ_IMPL                                                       \
03250   {                                                                     \
03251     int _temp, _i;                                                      \
03252     qword_t _qwordhold = GPR(RB);                                       \
03253                                                                         \
03254     _temp = 0;                                                          \
03255     for (_i = 0; _i <= 63; _i++)                                        \
03256     {                                                                   \
03257       if (_qwordhold & (ULL(1) << _i))                                  \
03258         break;                                                          \
03259                                                                         \
03260       _temp++;                                                          \
03261     }                                                                   \
03262                                                                         \
03263     SET_GPR(RC, (qword_t)_temp);                                        \
03264   }
03265 DEFINST(CTTZ,                   0x33,  
03266         "cttz",                 "b,c",
03267         IntALU,                 F_ICOMP,
03268         DGPR(RC), DNA,          DGPR(RB), DNA, DNA)
03269 
03270 
03271 /* MVI extensions */
03272 #define UNPKBW_IMPL                                                     \
03273   {                                                                     \
03274     qword_t _temp, _qwordhold;                                          \
03275                                                                         \
03276     _temp = 0;                                                          \
03277     _qwordhold = GPR(RB);                                               \
03278                                                                         \
03279     _temp |= (_qwordhold & 0xff);                                       \
03280     _temp |= (((_qwordhold >> 8) & 0xff) << 16);                        \
03281     _temp |= (((_qwordhold >> 16) & 0xff) << 32);                       \
03282     _temp |= (((_qwordhold >> 24) & 0xff) << 48);                       \
03283                                                                         \
03284     SET_GPR(RC, _temp);                                                 \
03285   }
03286 DEFINST(UNPKBW,                 0x34,
03287         "unpkbw",               "b,c",
03288         IntALU,                 F_ICOMP,
03289         DGPR(RC), DNA,          DGPR(RB), DNA, DNA)
03290 
03291 #define UNPKBL_IMPL                                                     \
03292   {                                                                     \
03293     qword_t _temp, _qwordhold;                                          \
03294                                                                         \
03295     _temp = 0;                                                          \
03296     _qwordhold = GPR(RB);                                               \
03297                                                                         \
03298     _temp |= (_qwordhold & 0xff);                                       \
03299     _temp |= (((_qwordhold >> 8) & 0xff) << 32);                        \
03300                                                                         \
03301     SET_GPR(RC, _temp);                                                 \
03302   }
03303 DEFINST(UNPKBL,                 0x35,
03304         "unpkbl",               "b,c",
03305         IntALU,                 F_ICOMP,
03306         DGPR(RC), DNA,          DGPR(RB), DNA, DNA)
03307 
03308 #define PKWB_IMPL                                                       \
03309   {                                                                     \
03310     qword_t _temp, _qwordhold;                                          \
03311                                                                         \
03312     _temp = 0;                                                          \
03313     _qwordhold = GPR(RB);                                               \
03314                                                                         \
03315     _temp |= (_qwordhold & 0xff);                                       \
03316     _temp |= (((_qwordhold >> 16) & 0xff) << 8);                        \
03317     _temp |= (((_qwordhold >> 32) & 0xff) << 16);                       \
03318     _temp |= (((_qwordhold >> 48) & 0xff) << 24);                       \
03319                                                                         \
03320     SET_GPR(RC, _temp);                                                 \
03321   }
03322 DEFINST(PKWB,                   0x36,
03323         "pkwb",                 "b,c",
03324         IntALU,                 F_ICOMP,
03325         DGPR(RC), DNA,          DGPR(RB), DNA, DNA)
03326 
03327 #define PKLB_IMPL                                                       \
03328   {                                                                     \
03329     qword_t _temp, _qwordhold;                                          \
03330                                                                         \
03331     _temp = 0;                                                          \
03332     _qwordhold = GPR(RB);                                               \
03333                                                                         \
03334     _temp |= (_qwordhold & 0xff);                                       \
03335     _temp |= (((_qwordhold >> 32) & 0xff) << 8);                        \
03336                                                                         \
03337     SET_GPR(RC, _temp);                                                 \
03338   }
03339 DEFINST(PKLB,                   0x37,
03340         "pklb",                 "b,c",
03341         IntALU,                 F_ICOMP,
03342         DGPR(RC), DNA,          DGPR(RB), DNA, DNA)
03343 
03344 /* following MVI entries were script-generated :) */
03345 
03346 DEFLINK(MINSB8_LINK, 0x38, "minsb8_link", 12, 1)
03347 
03348 DEFLINK(MINSW4_LINK, 0x39, "minsw4_link", 12, 1)
03349 
03350 DEFLINK(MINUB8_LINK, 0x3a, "minub8_link", 12, 1)
03351 
03352 DEFLINK(MINUW4_LINK, 0x3b, "minuw4_link", 12, 1)
03353 
03354 DEFLINK(MAXUB8_LINK, 0x3c, "maxub8_link", 12, 1)
03355 
03356 DEFLINK(MAXUW4_LINK, 0x3d, "maxuw4_link", 12, 1)
03357 
03358 DEFLINK(MAXSB8_LINK, 0x3e, "maxsb8_link", 12, 1)
03359 
03360 DEFLINK(MAXSW4_LINK, 0x3f, "maxsw4_link", 12, 1)
03361 
03362 /* FIX extensions */
03363 #define FTOIT_IMPL                                                      \
03364   {                                                                     \
03365     SET_GPR(RC, FPR_Q(RA));                                             \
03366   }
03367 DEFINST(FTOIT,                  0x70,
03368         "ftoit",                "A,c",
03369         FloatCVT,               F_FCOMP,  /* FIXME: are these flags correct? */
03370         DGPR(RC), DNA,          DFPR(RA), DNA, DNA)
03371 
03372 #define FTOIS_IMPL                                                      \
03373   {                                                                     \
03374     sqword_t _longhold;                                                 \
03375     sword_t _inthold;                                                   \
03376                                                                         \
03377     _longhold = FPR_Q(RA);                                              \
03378     _inthold = (((_longhold >> 32) & ULL(0xc0000000))                   \
03379                 | ((_longhold >> 29) & ULL(0x3fffffff)));               \
03380                                                                         \
03381     SET_GPR(RC, (SEXT32(_longhold >> 63) << 32) | _inthold);            \
03382   }
03383 DEFINST(FTOIS,                  0x78,
03384         "ftois",                "A,c",
03385         FloatCVT,               F_FCOMP,  /* FIXME: are these flags correct? */
03386         DGPR(RC), DNA,          DFPR(RA), DNA, DNA)
03387 
03388 
03389 /* MVI extensions (contd) */
03390 CONNECT(MINSB8_LINK)
03391 
03392 #define MINSB8_IMPL                                                     \
03393 {                                                                       \
03394   int _i;                                                               \
03395   qword_t _qwordhold_a, _qwordhold_b, _qwordhold_c;                     \
03396                                                                         \
03397   _qwordhold_a = GPR(RA);                                               \
03398   _qwordhold_b = GPR(RB);                                               \
03399   _qwordhold_c = 0;                                                     \
03400                                                                         \
03401   for (_i = 0; _i <= 7; _i++)                                           \
03402   {                                                                     \
03403     sbyte_t _bytehold_a, _bytehold_b, _bytehold_c;                      \
03404                                                                         \
03405     _bytehold_a = (_qwordhold_a >> (_i * 8)) & 0xff;                    \
03406     _bytehold_b = (_qwordhold_b >> (_i * 8)) & 0xff;                    \
03407     _bytehold_c = MIN(_bytehold_a, _bytehold_b);                        \
03408                                                                         \
03409     _qwordhold_c |= (((qword_t)(byte_t)_bytehold_c & 0xff) << (_i*8));  \
03410   }                                                                     \
03411                                                                         \
03412   SET_GPR(RC, _qwordhold_c);                                            \
03413 }
03414 DEFINST(MINSB8,                 0x00,
03415         "minsb8",               "a,b,c",
03416         IntALU,                 F_ICOMP,
03417         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
03418 
03419 #define MINSB8I_IMPL                                                    \
03420 {                                                                       \
03421   int _i;                                                               \
03422   qword_t _qwordhold_a, _qwordhold_b, _qwordhold_c;                     \
03423                                                                         \
03424   _qwordhold_a = GPR(RA);                                               \
03425   _qwordhold_b = IMM;                                                   \
03426   _qwordhold_c = 0;                                                     \
03427                                                                         \
03428   for (_i = 0; _i <= 7; _i++)                                           \
03429   {                                                                     \
03430     sbyte_t _bytehold_a, _bytehold_b, _bytehold_c;                      \
03431                                                                         \
03432     _bytehold_a = (_qwordhold_a >> (_i * 8)) & 0xff;                    \
03433     _bytehold_b = (_qwordhold_b >> (_i * 8)) & 0xff;                    \
03434     _bytehold_c = MIN(_bytehold_a, _bytehold_b);                        \
03435                                                                         \
03436     _qwordhold_c |= (((qword_t)(byte_t)_bytehold_c & 0xff) << (_i*8));  \
03437   }                                                                     \
03438                                                                         \
03439   SET_GPR(RC, _qwordhold_c);                                            \
03440 }
03441 DEFINST(MINSB8I,                0x01,
03442         "minsb8",               "a,i,c",
03443         IntALU,                 F_ICOMP|F_IMM,
03444         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
03445 
03446 
03447 CONNECT(MINSW4_LINK)
03448 
03449 #define MINSW4_IMPL                                                     \
03450 {                                                                       \
03451   int _i;                                                               \
03452   qword_t _qwordhold_a, _qwordhold_b, _qwordhold_c;                     \
03453                                                                         \
03454   _qwordhold_a = GPR(RA);                                               \
03455   _qwordhold_b = GPR(RB);                                               \
03456   _qwordhold_c = 0;                                                     \
03457                                                                         \
03458   for (_i = 0; _i <= 3; _i++)                                           \
03459   {                                                                     \
03460     shalf_t _halfhold_a, _halfhold_b, _halfhold_c;                      \
03461                                                                         \
03462     _halfhold_a = (_qwordhold_a >> (_i * 16)) & 0xffff;                 \
03463     _halfhold_b = (_qwordhold_b >> (_i * 16)) & 0xffff;                 \
03464     _halfhold_c = MIN(_halfhold_a, _halfhold_b);                        \
03465                                                                         \
03466     _qwordhold_c |= (((qword_t)(half_t)_halfhold_c & 0xffff) << (_i*16));\
03467   }                                                                     \
03468                                                                         \
03469   SET_GPR(RC, _qwordhold_c);                                            \
03470 }
03471 DEFINST(MINSW4,                 0x00,
03472         "minsw4",               "a,b,c",
03473         IntALU,                 F_ICOMP,
03474         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
03475 
03476 #define MINSW4I_IMPL                                                    \
03477 {                                                                       \
03478   int _i;                                                               \
03479   qword_t _qwordhold_a, _qwordhold_b, _qwordhold_c;                     \
03480                                                                         \
03481   _qwordhold_a = GPR(RA);                                               \
03482   _qwordhold_b = IMM;                                                   \
03483   _qwordhold_c = 0;                                                     \
03484                                                                         \
03485   for (_i = 0; _i <= 3; _i++)                                           \
03486   {                                                                     \
03487     shalf_t _halfhold_a, _halfhold_b, _halfhold_c;                      \
03488                                                                         \
03489     _halfhold_a = (_qwordhold_a >> (_i * 16)) & 0xffff;                 \
03490     _halfhold_b = (_qwordhold_b >> (_i * 16)) & 0xffff;                 \
03491     _halfhold_c = MIN(_halfhold_a, _halfhold_b);                        \
03492                                                                         \
03493     _qwordhold_c |= (((qword_t)(half_t)_halfhold_c & 0xffff) << (_i*16));\
03494   }                                                                     \
03495                                                                         \
03496   SET_GPR(RC, _qwordhold_c);                                            \
03497 }
03498 DEFINST(MINSW4I,                0x01,
03499         "minsw4",               "a,i,c",
03500         IntALU,                 F_ICOMP|F_IMM,
03501         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
03502 
03503 
03504 CONNECT(MINUB8_LINK)
03505 
03506 #define MINUB8_IMPL                                                     \
03507 {                                                                       \
03508   int _i;                                                               \
03509   qword_t _qwordhold_a, _qwordhold_b, _qwordhold_c;                     \
03510                                                                         \
03511   _qwordhold_a = GPR(RA);                                               \
03512   _qwordhold_b = GPR(RB);                                               \
03513   _qwordhold_c = 0;                                                     \
03514                                                                         \
03515   for (_i = 0; _i <= 7; _i++)                                           \
03516   {                                                                     \
03517     byte_t _bytehold_a, _bytehold_b, _bytehold_c;                       \
03518                                                                         \
03519     _bytehold_a = (_qwordhold_a >> (_i * 8)) & 0xff;                    \
03520     _bytehold_b = (_qwordhold_b >> (_i * 8)) & 0xff;                    \
03521     _bytehold_c = MIN(_bytehold_a, _bytehold_b);                        \
03522                                                                         \
03523     _qwordhold_c |= (((qword_t)(byte_t)_bytehold_c & 0xff) << (_i*8));  \
03524   }                                                                     \
03525                                                                         \
03526   SET_GPR(RC, _qwordhold_c);                                            \
03527 }
03528 DEFINST(MINUB8,                 0x00,
03529         "minub8",               "a,b,c",
03530         IntALU,                 F_ICOMP,
03531         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
03532 
03533 #define MINUB8I_IMPL                                                    \
03534 {                                                                       \
03535   int _i;                                                               \
03536   qword_t _qwordhold_a, _qwordhold_b, _qwordhold_c;                     \
03537                                                                         \
03538   _qwordhold_a = GPR(RA);                                               \
03539   _qwordhold_b = IMM;                                                   \
03540   _qwordhold_c = 0;                                                     \
03541                                                                         \
03542   for (_i = 0; _i <= 7; _i++)                                           \
03543   {                                                                     \
03544     byte_t _bytehold_a, _bytehold_b, _bytehold_c;                       \
03545                                                                         \
03546     _bytehold_a = (_qwordhold_a >> (_i * 8)) & 0xff;                    \
03547     _bytehold_b = (_qwordhold_b >> (_i * 8)) & 0xff;                    \
03548     _bytehold_c = MIN(_bytehold_a, _bytehold_b);                        \
03549                                                                         \
03550     _qwordhold_c |= (((qword_t)(byte_t)_bytehold_c & 0xff) << (_i*8));  \
03551   }                                                                     \
03552                                                                         \
03553   SET_GPR(RC, _qwordhold_c);                                            \
03554 }
03555 DEFINST(MINUB8I,                0x01,
03556         "minub8",               "a,i,c",
03557         IntALU,                 F_ICOMP|F_IMM,
03558         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
03559 
03560 
03561 CONNECT(MINUW4_LINK)
03562 
03563 #define MINUW4_IMPL                                                     \
03564 {                                                                       \
03565   int _i;                                                               \
03566   qword_t _qwordhold_a, _qwordhold_b, _qwordhold_c;                     \
03567                                                                         \
03568   _qwordhold_a = GPR(RA);                                               \
03569   _qwordhold_b = GPR(RB);                                               \
03570   _qwordhold_c = 0;                                                     \
03571                                                                         \
03572   for (_i = 0; _i <= 3; _i++)                                           \
03573   {                                                                     \
03574     half_t _halfhold_a, _halfhold_b, _halfhold_c;                       \
03575                                                                         \
03576     _halfhold_a = (_qwordhold_a >> (_i * 16)) & 0xffff;                 \
03577     _halfhold_b = (_qwordhold_b >> (_i * 16)) & 0xffff;                 \
03578     _halfhold_c = MIN(_halfhold_a, _halfhold_b);                        \
03579                                                                         \
03580     _qwordhold_c |= (((qword_t)(half_t)_halfhold_c & 0xffff) << (_i*16));\
03581   }                                                                     \
03582                                                                         \
03583   SET_GPR(RC, _qwordhold_c);                                            \
03584 }
03585 DEFINST(MINUW4,                 0x00,
03586         "minuw4",               "a,b,c",
03587         IntALU,                 F_ICOMP,
03588         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
03589 
03590 #define MINUW4I_IMPL                                                    \
03591 {                                                                       \
03592   int _i;                                                               \
03593   qword_t _qwordhold_a, _qwordhold_b, _qwordhold_c;                     \
03594                                                                         \
03595   _qwordhold_a = GPR(RA);                                               \
03596   _qwordhold_b = IMM;                                                   \
03597   _qwordhold_c = 0;                                                     \
03598                                                                         \
03599   for (_i = 0; _i <= 3; _i++)                                           \
03600   {                                                                     \
03601     half_t _halfhold_a, _halfhold_b, _halfhold_c;                       \
03602                                                                         \
03603     _halfhold_a = (_qwordhold_a >> (_i * 16)) & 0xffff;                 \
03604     _halfhold_b = (_qwordhold_b >> (_i * 16)) & 0xffff;                 \
03605     _halfhold_c = MIN(_halfhold_a, _halfhold_b);                        \
03606                                                                         \
03607     _qwordhold_c |= (((qword_t)(half_t)_halfhold_c & 0xffff) << (_i*16));\
03608   }                                                                     \
03609                                                                         \
03610   SET_GPR(RC, _qwordhold_c);                                            \
03611 }
03612 DEFINST(MINUW4I,                0x01,
03613         "minuw4",               "a,i,c",
03614         IntALU,                 F_ICOMP|F_IMM,
03615         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
03616 
03617 
03618 CONNECT(MAXUB8_LINK)
03619 
03620 #define MAXUB8_IMPL                                                     \
03621 {                                                                       \
03622   int _i;                                                               \
03623   qword_t _qwordhold_a, _qwordhold_b, _qwordhold_c;                     \
03624                                                                         \
03625   _qwordhold_a = GPR(RA);                                               \
03626   _qwordhold_b = GPR(RB);                                               \
03627   _qwordhold_c = 0;                                                     \
03628                                                                         \
03629   for (_i = 0; _i <= 7; _i++)                                           \
03630   {                                                                     \
03631     byte_t _bytehold_a, _bytehold_b, _bytehold_c;                       \
03632                                                                         \
03633     _bytehold_a = (_qwordhold_a >> (_i * 8)) & 0xff;                    \
03634     _bytehold_b = (_qwordhold_b >> (_i * 8)) & 0xff;                    \
03635     _bytehold_c = MAX(_bytehold_a, _bytehold_b);                        \
03636                                                                         \
03637     _qwordhold_c |= (((qword_t)(byte_t)_bytehold_c & 0xff) << (_i*8));  \
03638   }                                                                     \
03639                                                                         \
03640   SET_GPR(RC, _qwordhold_c);                                            \
03641 }
03642 DEFINST(MAXUB8,                 0x00,
03643         "maxub8",               "a,b,c",
03644         IntALU,                 F_ICOMP,
03645         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
03646 
03647 #define MAXUB8I_IMPL                                                    \
03648 {                                                                       \
03649   int _i;                                                               \
03650   qword_t _qwordhold_a, _qwordhold_b, _qwordhold_c;                     \
03651                                                                         \
03652   _qwordhold_a = GPR(RA);                                               \
03653   _qwordhold_b = IMM;                                                   \
03654   _qwordhold_c = 0;                                                     \
03655                                                                         \
03656   for (_i = 0; _i <= 7; _i++)                                           \
03657   {                                                                     \
03658     byte_t _bytehold_a, _bytehold_b, _bytehold_c;                       \
03659                                                                         \
03660     _bytehold_a = (_qwordhold_a >> (_i * 8)) & 0xff;                    \
03661     _bytehold_b = (_qwordhold_b >> (_i * 8)) & 0xff;                    \
03662     _bytehold_c = MAX(_bytehold_a, _bytehold_b);                        \
03663                                                                         \
03664     _qwordhold_c |= (((qword_t)(byte_t)_bytehold_c & 0xff) << (_i*8));  \
03665   }                                                                     \
03666                                                                         \
03667   SET_GPR(RC, _qwordhold_c);                                            \
03668 }
03669 DEFINST(MAXUB8I,                0x01,
03670         "maxub8",               "a,i,c",
03671         IntALU,                 F_ICOMP|F_IMM,
03672         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
03673 
03674 
03675 CONNECT(MAXUW4_LINK)
03676 
03677 #define MAXUW4_IMPL                                                     \
03678 {                                                                       \
03679   int _i;                                                               \
03680   qword_t _qwordhold_a, _qwordhold_b, _qwordhold_c;                     \
03681                                                                         \
03682   _qwordhold_a = GPR(RA);                                               \
03683   _qwordhold_b = GPR(RB);                                               \
03684   _qwordhold_c = 0;                                                     \
03685                                                                         \
03686   for (_i = 0; _i <= 3; _i++)                                           \
03687   {                                                                     \
03688     half_t _halfhold_a, _halfhold_b, _halfhold_c;                       \
03689                                                                         \
03690     _halfhold_a = (_qwordhold_a >> (_i * 16)) & 0xffff;                 \
03691     _halfhold_b = (_qwordhold_b >> (_i * 16)) & 0xffff;                 \
03692     _halfhold_c = MAX(_halfhold_a, _halfhold_b);                        \
03693                                                                         \
03694     _qwordhold_c |= (((qword_t)(half_t)_halfhold_c & 0xffff) << (_i*16));\
03695   }                                                                     \
03696                                                                         \
03697   SET_GPR(RC, _qwordhold_c);                                            \
03698 }
03699 DEFINST(MAXUW4,                 0x00,
03700         "maxuw4",               "a,b,c",
03701         IntALU,                 F_ICOMP,
03702         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
03703 
03704 #define MAXUW4I_IMPL                                                    \
03705 {                                                                       \
03706   int _i;                                                               \
03707   qword_t _qwordhold_a, _qwordhold_b, _qwordhold_c;                     \
03708                                                                         \
03709   _qwordhold_a = GPR(RA);                                               \
03710   _qwordhold_b = IMM;                                                   \
03711   _qwordhold_c = 0;                                                     \
03712                                                                         \
03713   for (_i = 0; _i <= 3; _i++)                                           \
03714   {                                                                     \
03715     half_t _halfhold_a, _halfhold_b, _halfhold_c;                       \
03716                                                                         \
03717     _halfhold_a = (_qwordhold_a >> (_i * 16)) & 0xffff;                 \
03718     _halfhold_b = (_qwordhold_b >> (_i * 16)) & 0xffff;                 \
03719     _halfhold_c = MAX(_halfhold_a, _halfhold_b);                        \
03720                                                                         \
03721     _qwordhold_c |= (((qword_t)(half_t)_halfhold_c & 0xffff) << (_i*16));\
03722   }                                                                     \
03723                                                                         \
03724   SET_GPR(RC, _qwordhold_c);                                            \
03725 }
03726 DEFINST(MAXUW4I,                0x01,
03727         "maxuw4",               "a,i,c",
03728         IntALU,                 F_ICOMP|F_IMM,
03729         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
03730 
03731 
03732 CONNECT(MAXSB8_LINK)
03733 
03734 #define MAXSB8_IMPL                                                     \
03735 {                                                                       \
03736   int _i;                                                               \
03737   qword_t _qwordhold_a, _qwordhold_b, _qwordhold_c;                     \
03738                                                                         \
03739   _qwordhold_a = GPR(RA);                                               \
03740   _qwordhold_b = GPR(RB);                                               \
03741   _qwordhold_c = 0;                                                     \
03742                                                                         \
03743   for (_i = 0; _i <= 7; _i++)                                           \
03744   {                                                                     \
03745     sbyte_t _bytehold_a, _bytehold_b, _bytehold_c;                      \
03746                                                                         \
03747     _bytehold_a = (_qwordhold_a >> (_i * 8)) & 0xff;                    \
03748     _bytehold_b = (_qwordhold_b >> (_i * 8)) & 0xff;                    \
03749     _bytehold_c = MAX(_bytehold_a, _bytehold_b);                        \
03750                                                                         \
03751     _qwordhold_c |= (((qword_t)(byte_t)_bytehold_c & 0xff) << (_i*8));  \
03752   }                                                                     \
03753                                                                         \
03754   SET_GPR(RC, _qwordhold_c);                                            \
03755 }
03756 DEFINST(MAXSB8,                 0x00,
03757         "maxsb8",               "a,b,c",
03758         IntALU,                 F_ICOMP,
03759         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
03760 
03761 #define MAXSB8I_IMPL                                                    \
03762 {                                                                       \
03763   int _i;                                                               \
03764   qword_t _qwordhold_a, _qwordhold_b, _qwordhold_c;                     \
03765                                                                         \
03766   _qwordhold_a = GPR(RA);                                               \
03767   _qwordhold_b = IMM;                                                   \
03768   _qwordhold_c = 0;                                                     \
03769                                                                         \
03770   for (_i = 0; _i <= 7; _i++)                                           \
03771   {                                                                     \
03772     sbyte_t _bytehold_a, _bytehold_b, _bytehold_c;                      \
03773                                                                         \
03774     _bytehold_a = (_qwordhold_a >> (_i * 8)) & 0xff;                    \
03775     _bytehold_b = (_qwordhold_b >> (_i * 8)) & 0xff;                    \
03776     _bytehold_c = MAX(_bytehold_a, _bytehold_b);                        \
03777                                                                         \
03778     _qwordhold_c |= (((qword_t)(byte_t)_bytehold_c & 0xff) << (_i*8));  \
03779   }                                                                     \
03780                                                                         \
03781   SET_GPR(RC, _qwordhold_c);                                            \
03782 }
03783 DEFINST(MAXSB8I,                0x01,
03784         "maxsb8",               "a,i,c",
03785         IntALU,                 F_ICOMP|F_IMM,
03786         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
03787 
03788 
03789 CONNECT(MAXSW4_LINK)
03790 
03791 #define MAXSW4_IMPL                                                     \
03792 {                                                                       \
03793   int _i;                                                               \
03794   qword_t _qwordhold_a, _qwordhold_b, _qwordhold_c;                     \
03795                                                                         \
03796   _qwordhold_a = GPR(RA);                                               \
03797   _qwordhold_b = GPR(RB);                                               \
03798   _qwordhold_c = 0;                                                     \
03799                                                                         \
03800   for (_i = 0; _i <= 3; _i++)                                           \
03801   {                                                                     \
03802     shalf_t _halfhold_a, _halfhold_b, _halfhold_c;                      \
03803                                                                         \
03804     _halfhold_a = (_qwordhold_a >> (_i * 16)) & 0xffff;                 \
03805     _halfhold_b = (_qwordhold_b >> (_i * 16)) & 0xffff;                 \
03806     _halfhold_c = MAX(_halfhold_a, _halfhold_b);                        \
03807                                                                         \
03808     _qwordhold_c |= (((qword_t)(half_t)_halfhold_c & 0xffff) << (_i*16));\
03809   }                                                                     \
03810                                                                         \
03811   SET_GPR(RC, _qwordhold_c);                                            \
03812 }
03813 DEFINST(MAXSW4,                 0x00,
03814         "maxsw4",               "a,b,c",
03815         IntALU,                 F_ICOMP,
03816         DGPR(RC), DNA,          DGPR(RA), DGPR(RB), DNA)
03817 
03818 #define MAXSW4I_IMPL                                                    \
03819 {                                                                       \
03820   int _i;                                                               \
03821   qword_t _qwordhold_a, _qwordhold_b, _qwordhold_c;                     \
03822                                                                         \
03823   _qwordhold_a = GPR(RA);                                               \
03824   _qwordhold_b = IMM;                                                   \
03825   _qwordhold_c = 0;                                                     \
03826                                                                         \
03827   for (_i = 0; _i <= 3; _i++)                                           \
03828   {                                                                     \
03829     shalf_t _halfhold_a, _halfhold_b, _halfhold_c;                      \
03830                                                                         \
03831     _halfhold_a = (_qwordhold_a >> (_i * 16)) & 0xffff;                 \
03832     _halfhold_b = (_qwordhold_b >> (_i * 16)) & 0xffff;                 \
03833     _halfhold_c = MAX(_halfhold_a, _halfhold_b);                        \
03834                                                                         \
03835     _qwordhold_c |= (((qword_t)(half_t)_halfhold_c & 0xffff) << (_i*16));\
03836   }                                                                     \
03837                                                                         \
03838   SET_GPR(RC, _qwordhold_c);                                            \
03839 }
03840 DEFINST(MAXSW4I,                0x01,
03841         "maxsw4",               "a,i,c",
03842         IntALU,                 F_ICOMP|F_IMM,
03843         DGPR(RC), DNA,          DGPR(RA), DNA, DNA)
03844 
03845 
03846 /* EV56 BWX extension... */
03847 CONNECT(SEXTB_LINK)
03848 
03849 /* EV56 BWX extension... */
03850 #define SEXTB_IMPL                                                      \
03851   {                                                                     \
03852     SET_GPR(RC, (qword_t)(sqword_t)(sbyte_t)(GPR(RB) & 0xff));          \
03853   }
03854 DEFINST(SEXTB,                  0x00,
03855         "sextb",                "b,c",
03856         IntALU,                 F_ICOMP,
03857         DGPR(RC), DNA,          DGPR(RB), DNA, DNA)
03858 
03859 /* EV56 BWX extension... */
03860 #define SEXTBI_IMPL                                                     \
03861   {                                                                     \
03862     SET_GPR(RC, (qword_t)(sqword_t)(sbyte_t)(IMM & 0xff));              \
03863   }
03864 DEFINST(SEXTBI,                 0x01,
03865         "sextb",                "i,c",
03866         IntALU,                 F_ICOMP|F_IMM,
03867         DGPR(RC), DNA,          DNA, DNA, DNA)
03868 
03869 
03870 /* EV56 BWX extension... */
03871 CONNECT(SEXTW_LINK)
03872 
03873 /* EV56 BWX extension... */
03874 #define SEXTW_IMPL                                                      \
03875   {                                                                     \
03876     SET_GPR(RC, (qword_t)(sqword_t)(shalf_t)(GPR(RB) & 0xffff));        \
03877   }
03878 DEFINST(SEXTW,                  0x00,
03879         "sextw",                "b,c",
03880         IntALU,                 F_ICOMP,
03881         DGPR(RC), DNA,          DGPR(RB), DNA, DNA)
03882 
03883 /* EV56 BWX extension... */
03884 #define SEXTWI_IMPL                                                     \
03885   {                                                                     \
03886     SET_GPR(RC, (qword_t)(sqword_t)(shalf_t)(IMM & 0xffff));            \
03887   }
03888 DEFINST(SEXTWI,                 0x01,
03889         "sextw",                "i,c",
03890         IntALU,                 F_ICOMP|F_IMM,
03891         DGPR(RC), DNA,          DNA, DNA, DNA)
03892 
03893 
03894 
03895 /* clean up all definitions... */
03896 #undef LDA_IMPL
03897 #undef LDAH_IMPL
03898 #undef LDBU_IMPL
03899 #undef LDQ_U_IMPL
03900 #undef LDWU_IMPL
03901 #undef STW_IMPL
03902 #undef STB_IMPL
03903 #undef STQ_U_IMPL
03904 #undef FLTV_IMPL
03905 #undef LDF_IMPL
03906 #undef LDG_IMPL
03907 #undef LDS_IMPL
03908 #undef LDT_IMPL
03909 #undef STF_IMPL
03910 #undef STG_IMPL
03911 #undef STS_IMPL
03912 #undef STT_IMPL
03913 #undef LDL_IMPL
03914 #undef LDQ_IMPL
03915 #undef LDL_L_IMPL
03916 #undef LDQ_L_IMPL
03917 #undef STL_IMPL
03918 #undef STQ_IMPL
03919 #undef STL_C_IMPL
03920 #undef STQ_C_IMPL
03921 #undef BR_IMPL
03922 #undef FBEQ_IMPL
03923 #undef FBLT_IMPL
03924 #undef FBLE_IMPL
03925 #undef BSR_IMPL
03926 #undef FBNE_IMPL
03927 #undef FBGE_IMPL
03928 #undef FBGT_IMPL
03929 #undef BLBC_IMPL
03930 #undef BEQ_IMPL
03931 #undef BLT_IMPL
03932 #undef BLE_IMPL
03933 #undef BLBS_IMPL
03934 #undef BNE_IMPL
03935 #undef BGE_IMPL
03936 #undef BGT_IMPL
03937 #undef PAL_CALLSYS_IMPL
03938 #undef PAL_RDUNIQ_IMPL
03939 #undef PAL_WRUNIQ_IMPL
03940 #undef ADDL_IMPL
03941 #undef ADDLI_IMPL
03942 #undef S4ADDL_IMPL
03943 #undef S4ADDLI_IMPL
03944 #undef SUBL_IMPL
03945 #undef SUBLI_IMPL
03946 #undef S4SUBL_IMPL
03947 #undef S4SUBLI_IMPL
03948 #undef CMPBGE_IMPL
03949 #undef CMPBGEI_IMPL
03950 #undef S8ADDL_IMPL
03951 #undef S8ADDLI_IMPL
03952 #undef S8SUBL_IMPL
03953 #undef S8SUBLI_IMPL
03954 #undef CMPULT_IMPL
03955 #undef CMPULTI_IMPL
03956 #undef ADDQ_IMPL
03957 #undef ADDQI_IMPL
03958 #undef S4ADDQ_IMPL
03959 #undef S4ADDQI_IMPL
03960 #undef SUBQ_IMPL
03961 #undef SUBQI_IMPL
03962 #undef S4SUBQ_IMPL
03963 #undef S4SUBQI_IMPL
03964 #undef CMPEQ_IMPL
03965 #undef CMPEQI_IMPL
03966 #undef S8ADDQ_IMPL
03967 #undef S8ADDQI_IMPL
03968 #undef S8SUBQ_IMPL
03969 #undef S8SUBQI_IMPL
03970 #undef CMPULE_IMPL
03971 #undef CMPULEI_IMPL
03972 #undef ADDLV_IMPL
03973 #undef ADDLVI_IMPL
03974 #undef SUBLV_IMPL
03975 #undef SUBLVI_IMPL
03976 #undef CMPLT_IMPL
03977 #undef CMPLTI_IMPL
03978 #undef ADDQV_IMPL
03979 #undef ADDQVI_IMPL
03980 #undef SUBQV_IMPL
03981 #undef SUBQVI_IMPL
03982 #undef CMPLE_IMPL
03983 #undef CMPLEI_IMPL
03984 #undef AND_IMPL
03985 #undef ANDI_IMPL
03986 #undef BIC_IMPL
03987 #undef BICI_IMPL
03988 #undef CMOVLBS_IMPL
03989 #undef CMOVLBSI_IMPL
03990 #undef CMOVLBC_IMPL
03991 #undef CMOVLBCI_IMPL
03992 #undef BIS_IMPL
03993 #undef BISI_IMPL
03994 #undef CMOVEQ_IMPL
03995 #undef CMOVEQI_IMPL
03996 #undef CMOVNE_IMPL
03997 #undef CMOVNEI_IMPL
03998 #undef ORNOT_IMPL
03999 #undef ORNOTI_IMPL
04000 #undef XOR_IMPL
04001 #undef XORI_IMPL
04002 #undef CMOVLT_IMPL
04003 #undef CMOVLTI_IMPL
04004 #undef CMOVGE_IMPL
04005 #undef CMOVGEI_IMPL
04006 #undef EQV_IMPL
04007 #undef EQVI_IMPL
04008 #undef AMASK_IMPL
04009 #undef AMASKI_IMPL
04010 #undef CMOVLE_IMPL
04011 #undef CMOVLEI_IMPL
04012 #undef CMOVGT_IMPL
04013 #undef CMOVGTI_IMPL
04014 #undef IMPLVER_IMPL
04015 #undef MSKBL_IMPL
04016 #undef MSKBLI_IMPL
04017 #undef EXTBL_IMPL
04018 #undef EXTBLI_IMPL
04019 #undef INSBL_IMPL
04020 #undef INSBLI_IMPL
04021 #undef MSKWL_IMPL
04022 #undef MSKWLI_IMPL
04023 #undef EXTWL_IMPL
04024 #undef EXTWLI_IMPL
04025 #undef INSWL_IMPL
04026 #undef INSWLI_IMPL
04027 #undef MSKLL_IMPL
04028 #undef MSKLLI_IMPL
04029 #undef EXTLL_IMPL
04030 #undef EXTLLI_IMPL
04031 #undef INSLL_IMPL
04032 #undef INSLLI_IMPL
04033 #undef ZAP_IMPL
04034 #undef ZAPI_IMPL
04035 #undef ZAPNOT_IMPL
04036 #undef ZAPNOTI_IMPL
04037 #undef MSKQL_IMPL
04038 #undef MSKQLI_IMPL
04039 #undef SRL_IMPL
04040 #undef SRLI_IMPL
04041 #undef EXTQL_IMPL
04042 #undef EXTQLI_IMPL
04043 #undef SLL_IMPL
04044 #undef SLLI_IMPL
04045 #undef INSQL_IMPL
04046 #undef INSQLI_IMPL
04047 #undef SRA_IMPL
04048 #undef SRAI_IMPL
04049 #undef MSKWH_IMPL
04050 #undef MSKWHI_IMPL
04051 #undef INSWH_IMPL
04052 #undef INSWHI_IMPL
04053 #undef EXTWH_IMPL
04054 #undef EXTWHI_IMPL
04055 #undef MSKLH_IMPL
04056 #undef MSKLHI_IMPL
04057 #undef INSLH_IMPL
04058 #undef INSLHI_IMPL
04059 #undef EXTLH_IMPL
04060 #undef EXTLHI_IMPL
04061 #undef MSKQH_IMPL
04062 #undef MSKQHI_IMPL
04063 #undef INSQH_IMPL
04064 #undef INSQHI_IMPL
04065 #undef EXTQH_IMPL
04066 #undef EXTQHI_IMPL
04067 #undef MULL_IMPL
04068 #undef MULLI_IMPL
04069 #undef MULQ_IMPL
04070 #undef MULQI_IMPL
04071 #undef UMULH_IMPL
04072 #undef UMULHI_IMPL
04073 #undef ITOFS_IMPL
04074 #undef SQRTF_IMPL
04075 #undef SQRTS_IMPL
04076 #undef ITOFF_IMPL
04077 #undef ITOFT_IMPL
04078 #undef SQRTG_IMPL
04079 #undef SQRTT_IMPL
04080 #undef ADDS_IMPL
04081 #undef SUBS_IMPL
04082 #undef MULS_IMPL
04083 #undef DIVS_IMPL
04084 #undef ADDT_IMPL
04085 #undef SUBT_IMPL
04086 #undef MULT_IMPL
04087 #undef DIVT_IMPL
04088 #undef CMPTUN_IMPL
04089 #undef CMPTEQ_IMPL
04090 #undef CMPTLT_IMPL
04091 #undef CMPTLE_IMPL
04092 #undef CVTTS_IMPL
04093 #undef CVTTQ_IMPL
04094 #undef CVTQS_IMPL
04095 #undef CVTQT_IMPL
04096 #undef CVTLQ_IMPL
04097 #undef CPYS_IMPL
04098 #undef CPYSN_IMPL
04099 #undef CPYSE_IMPL
04100 #undef MT_FPCR_IMPL
04101 #undef MF_FPCR_IMPL
04102 #undef FCMOVEQ_IMPL
04103 #undef FCMOVNE_IMPL
04104 #undef FCMOVLT_IMPL
04105 #undef FCMOVGE_IMPL
04106 #undef FCMOVLE_IMPL
04107 #undef FCMOVGT_IMPL
04108 #undef CVTQL_IMPL
04109 #undef TRAPB_IMPL
04110 #undef EXCB_IMPL
04111 #undef MB_IMPL
04112 #undef WMB_IMPL
04113 #undef FETCH_IMPL
04114 #undef FETCH_M_IMPL
04115 #undef RPCC_IMPL
04116 #undef _RC_IMPL
04117 #undef ECB_IMPL
04118 #undef _RS_IMPL
04119 #undef WH64_IMPL
04120 #undef JMP_IMPL
04121 #undef JSR_IMPL
04122 #undef RETN_IMPL
04123 #undef JSR_COROUTINE_IMPL
04124 #undef SEXTB_IMPL
04125 #undef SEXTBI_IMPL
04126 #undef SEXTW_IMPL
04127 #undef SEXTWI_IMPL
04128 #undef CTPOP_IMPL
04129 #undef PERR_IMPL
04130 #undef CTLZ_IMPL
04131 #undef CTTZ_IMPL
04132 #undef UNPKBW_IMPL
04133 #undef UNPKBL_IMPL
04134 #undef PKWB_IMPL
04135 #undef PKLB_IMPL
04136 #undef MINSB8_IMPL
04137 #undef MINSW4_IMPL
04138 #undef MINUB8_IMPL
04139 #undef MINUW4_IMPL
04140 #undef MAXUB8_IMPL
04141 #undef MAXUW4_IMPL
04142 #undef MAXSB8_IMPL
04143 #undef MAXSW4_IMPL
04144 #undef FTOIT_IMPL
04145 #undef FTOIS_IMPL
04146 
04147 #undef DEFINST
04148 #undef DEFLINK
04149 #undef CONNECT


UVa CS Department of Computer Science
School of Engineering, University of Virginia
151 Engineer's Way, P.O. Box 400740
Charlottesville, Virginia 22904-4740

(434) 982-2200  Fax: (434) 982-2214