(linenum→info "unix/slp.c:2238")

binutils/2.18/cpu/iq2000.cpu

    1: ; IQ2000/IQ10 Common CPU description. -*- Scheme -*-
    2: ; Copyright 2001, 2002, 2007 Free Software Foundation, Inc.
    3: ;
    4: ; Contributed by Red Hat Inc; developed under contract from Fujitsu.
    5: ;
    6: ; This file is part of the GNU Binutils.
    7: ;
    8: ; This program is free software; you can redistribute it and/or modify
    9: ; it under the terms of the GNU General Public License as published by
   10: ; the Free Software Foundation; either version 3 of the License, or
   11: ; (at your option) any later version.
   12: ;
   13: ; This program is distributed in the hope that it will be useful,
   14: ; but WITHOUT ANY WARRANTY; without even the implied warranty of
   15: ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   16: ; GNU General Public License for more details.
   17: ;
   18: ; You should have received a copy of the GNU General Public License
   19: ; along with this program; if not, write to the Free Software
   20: ; Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
   21: ; MA 02110-1301, USA.
   22: 
   23: (include "simplify.inc")
   24: 
   25: (define-arch
   26:   (name iq2000)
   27:   (comment "IQ2000 architecture")
   28:   (insn-lsb0? #t)
   29:   (machs iq2000 iq10)
   30:   (isas iq2000)
   31: )
   32: 
   33: (define-isa
   34:   (name iq2000)
   35:   (comment "Basic IQ2000 instruction set")
   36:   (default-insn-word-bitsize 32)
   37:   (default-insn-bitsize 32)
   38:   (base-insn-bitsize 32)
   39:   (decode-assist (31 30 29 28 27 26))
   40: )
   41: 
   42: (define-cpu
   43:   (name iq2000bf)
   44:   (comment "IQ2000 family")
   45:   (endian big)
   46:   (word-bitsize 32)
   47:   (file-transform "")
   48: )
   49: 
   50: (define-cpu
   51:   (name iq10bf)
   52:   (comment "IQ10 coprocessor family")
   53:   (endian big)
   54:   (word-bitsize 32)
   55:   (file-transform "")
   56: 
   57: )
   58: 
   59: (define-mach
   60:   (name iq2000)
   61:   (comment "IQ2000 packet processing engine")
   62:   (cpu iq2000bf)
   63:   (isas iq2000)
   64: )
   65: 
   66: (define-mach
   67:   (name iq10)
   68:   (comment "IQ10 coprocessor")
   69:   (cpu iq10bf)
   70:   (isas iq2000)
   71: )
   72: 
   73: (define-model
   74:   (name iq2000)
   75:   (comment "IQ2000 microprocessor")
   76:   (mach iq2000)
   77:   (unit u-exec "Execution Unit" ()
   78:         1 1 ; issue done
   79:         () () () ())
   80: )
   81: 
   82: (define-model
   83:   (name iq10)
   84:   (comment "IQ10 coprocessor")
   85:   (mach iq10)
   86:   (unit u-exec "Execution Unit" ()
   87:         1 1 ; issue done
   88:         () () () ())
   89: )
   90: 
   91: ; Macros to simplify MACH attribute specification.
   92: 
   93: (define-pmacro MACH2000 (MACH iq2000))
   94: (define-pmacro MACH10 (MACH iq10))
   95: 
   96: ^L
   97: ; Hardware elements.
   98: 
   99: (define-hardware
  100:   (name h-pc)
  101:   (comment "program counter")
  102:   (attrs PC PROFILE (ISA iq2000))
  103:   (type pc)
  104:   (get () (c-call USI "get_h_pc"))
  105:   (set (newval) (c-call VOID "set_h_pc" newval))
  106: )
  107: ; FIXME: it would be nice if the hardwired zero in R0 could be
  108: ; specified as a virtual hardware element, with one less register in
  109: ; the register file proper.
  110: 
  111: (define-keyword
  112:   (name gr-names)
  113:   (print-name h-gr)
  114:   (values (r0 0)   (%0 0)   (r1 1)   (%1 1)   (r2 2)   (%2 2)   (r3 3)   (%3 3)  
  115:           (r4 4)   (%4 4)   (r5 5)   (%5 5)   (r6 6)   (%6 6)   (r7 7)   (%7 7)
  116:           (r8 8)   (%8 8)   (r9 9)   (%9 9)   (r10 10) (%10 10) (r11 11) (%11 11)
  117:           (r12 12) (%12 12) (r13 13) (%13 13) (r14 14) (%14 14) (r15 15) (%15 15) 
  118:           (r16 16) (%16 16) (r17 17) (%17 17) (r18 18) (%18 18) (r19 19) (%19 19) 
  119:           (r20 20) (%20 20) (r21 21) (%21 21) (r22 22) (%22 22) (r23 23) (%23 23)
  120:           (r24 24) (%24 24) (r25 25) (%25 25) (r26 26) (%26 26) (r27 27) (%27 27) 
  121:           (r28 28) (%28 28) (r29 29) (%29 29) (r30 30) (%30 30) (r31 31) (%31 31))
  122: )
  123: 
  124: (define-hardware 
  125:   (name h-gr)
  126:   (comment "General purpose registers")
  127: ;  (attrs (ISA iq2000) CACHE-ADDR)
  128:   (type register SI (32))
  129:   (indices extern-keyword gr-names)
  130:   (get (idx)
  131:        (cond SI
  132:              ((eq idx 0) (const 0))
  133:              (else (raw-reg h-gr idx))))
  134:   (set (idx newval)
  135:        (cond VOID
  136:              ((eq idx 0) (nop))
  137:              (else (set (raw-reg h-gr idx) newval))))
  138: )
  139: 
  140: ^L
  141: ; Instruction fields.
  142: 
  143: (dnf f-opcode   "opcode field"                  ()  31  6)
  144: (dnf f-rs       "register field Rs"             ()  25  5)
  145: (dnf f-rt       "register field Rt"             ()  20  5)
  146: (dnf f-rd       "register field Rd"             ()  15  5)
  147: (dnf f-shamt    "shift amount field"            ()  10  5)
  148: (dnf f-cp-op    "coprocessor op field"          ()  10  3)
  149: (dnf f-cp-op-10 "coprocessor op field for CAM"  ()  10  5)
  150: (dnf f-cp-grp   "coprocessor group field"       ()   7  2)
  151: (dnf f-func     "function field"                ()   5  6)
  152: (dnf f-imm      "immediate field"               ()  15 16)
  153: 
  154: (define-multi-ifield
  155:   (name f-rd-rs)
  156:   (comment "register Rd implied from Rs")
  157:   (attrs)
  158:   (mode UINT)
  159:   (subfields f-rd f-rs)
  160:   (insert (sequence ()
  161:                     (set (ifield f-rd) (ifield f-rd-rs))
  162:                     (set (ifield f-rs) (ifield f-rd-rs))
  163:                      ))
  164:   (extract (sequence ()
  165:                      (set (ifield f-rd-rs) (ifield f-rs))
  166:                      ))
  167: )
  168: 
  169: (define-multi-ifield
  170:   (name f-rd-rt)
  171:   (comment "register Rd implied from Rt")
  172:   (attrs)
  173:   (mode UINT)
  174:   (subfields f-rd f-rt)
  175:   (insert (sequence ()
  176:                     (set (ifield f-rd) (ifield f-rd-rt))
  177:                     (set (ifield f-rt) (ifield f-rd-rt))
  178:                      ))
  179:   (extract (sequence ()
  180:                      (set (ifield f-rd-rt) (ifield f-rt))
  181:                      ))
  182: )
  183: 
  184: (define-multi-ifield
  185:   (name f-rt-rs)
  186:   (comment "register Rt implied from Rs")
  187:   (attrs)
  188:   (mode UINT)
  189:   (subfields f-rt f-rs)
  190:   (insert (sequence ()
  191:                     (set (ifield f-rt) (ifield f-rt-rs))
  192:                     (set (ifield f-rs) (ifield f-rt-rs))
  193:                      ))
  194:   (extract (sequence ()
  195:                      (set (ifield f-rd-rs) (ifield f-rs))
  196:                      ))
  197: )
  198: 
  199: (df  f-jtarg "jump target field"               (ABS-ADDR) 15 16 UINT
  200:      ((value pc) (srl USI (and USI value #x03FFFF) 2))
  201:      ((value pc) (or USI (and USI pc #xF0000000) (sll USI value 2))))
  202: 
  203: (df  f-jtargq10 "iq10 jump target field"       (ABS-ADDR) 20 21 UINT
  204:      ((value pc) (srl SI (and SI value #x7FFFFF) 2))
  205:      ((value pc) (or SI (and SI pc #xF0000000) (sll SI value 2))))
  206: 
  207: (df  f-offset "pc offset field"                (PCREL-ADDR) 15 16 INT
  208:      ; Actually, this is relative to the address of the delay slot.
  209:      ((value pc) (sra SI (sub SI value pc) 2))
  210:      ((value pc) (add SI (sll SI value 2) (add pc 4))))
  211: 
  212: ; Instruction fields that scarcely appear in instructions.
  213: 
  214: (dnf f-count   "count field"        ()   15  7)
  215: (dnf f-bytecount "byte count field" ()    7  8)
  216: (dnf f-index   "index field"        ()    8  9)
  217: (dnf f-mask    "mask field"         ()    9  4)
  218: (dnf f-maskq10 "iq10 mask field"    ()   10  5)
  219: (dnf f-maskl   "mask left field"    ()    4  5)
  220: (dnf f-excode  "execcode field"     ()   25 20)
  221: (dnf f-rsrvd   "reserved field"     ()   25 10)
  222: (dnf f-10-11   "bits 10:0"          ()   10 11)
  223: (dnf f-24-19   "bits 24:6"          ()   24 19)
  224: (dnf f-5       "bit 5"              ()    5  1)
  225: (dnf f-10      "bit 10"             ()   10  1)
  226: (dnf f-25      "bit 25"             ()   25  1)
  227: (dnf f-cam-z   "cam global mask z"  ()    5  3)
  228: (dnf f-cam-y   "cam operation y"    ()    2  3)
  229: (dnf f-cm-3func "CM 3 bit fn field" ()    5  3)
  230: (dnf f-cm-4func "CM 4 bit fn field" ()    5  4)
  231: (dnf f-cm-3z   "CM 3Z field"        ()    1  2)
  232: (dnf f-cm-4z   "CM 4Z field"        ()    2  3)
  233: 
  234: ^L
  235: ; Enumerations.
  236: 
  237: (define-normal-insn-enum
  238:   opcodes "primary opcodes" () OP_ f-opcode
  239:   (("SPECIAL" 0) ("REGIMM" 1) ("J"     2) ("JAL"    3) ("BEQ"    4) ("BNE"   5) ("BLEZ"   6) ("BGTZ"    7) 
  240:    ("ADDI"    8) ("ADDIU"  9) ("SLTI" 10) ("SLTIU" 11) ("ANDI"  12) ("ORI"  13) ("XORI"  14) ("LUI"    15)
  241:    ("COP0"   16) ("COP1"  17) ("COP2" 18) ("COP3"  19) ("BEQL"  20) ("BNEL" 21) ("BLEZL" 22) ("BGTZL"  23) 
  242:    ("BMB0"   24) ("BMB1"  25) ("BMB2" 26) ("BMB3"  27) ("BBI"   28) ("BBV"  29) ("BBIN"  30) ("BBVN"   31) 
  243:    ("LB"     32) ("LH"    33)             ("LW"    35) ("LBU"   36) ("LHU"  37)              ("RAM"    39)  
  244:    ("SB"     40) ("SH"    41)             ("SW"    43) ("ANDOI" 44) ("BMB"  45)              ("ORUI"   47) 
  245:    ("LDW"    48) 
  246:    ("SDW"    56)                                                                             ("ANDOUI" 63))
  247: )
  248: 
  249: (define-normal-insn-enum
  250:   q10_opcodes "iq10-only primary opcodes" () OP10_ f-opcode
  251:   (("BMB" 6) ("ORUI" 15) ("BMBL" 22) ("ANDOUI" 47) ("BBIL" 60) ("BBVL" 61) ("BBINL" 62) ("BBVNL" 63))
  252: )
  253: 
  254: (define-normal-insn-enum
  255:   regimm-functions "branch sub-opcodes" () FUNC_ f-rt
  256:   (("BLTZ"    0) ("BGEZ"    1) ("BLTZL"    2) ("BGEZL"    3) ("BLEZ"    4) ("BGTZ"    5) ("BLEZL"    6) ("BGTZL"    7) 
  257:    ("BRI"     8) ("BRV"     9)                               ("BCTX"   12) 
  258:    ("BLTZAL" 16) ("BGEZAL" 17) ("BLTZALL" 18) ("BGEZALL" 19) ("BLEZAL" 20) ("BGTZAL" 21) ("BLEZALL" 22) ("BGTZALL" 23))
  259: )
  260: 
  261: (define-normal-insn-enum
  262:   functions "function sub-opcodes" () FUNC_ f-func
  263:   (("SLL"  0) ("SLMV"   1) ("SRL"  2) ("SRA"   3) ("SLLV"     4) ("SRMV"   5) ("SRLV"   6) ("SRAV" 7) 
  264:    ("JR"   8) ("JALR"   9) ("JCR" 10)             ("SYSCALL" 12) ("BREAK" 13) ("SLEEP" 14)
  265:    ("ADD" 32) ("ADDU"  33) ("SUB" 34) ("SUBU" 35) ("AND"     36) ("OR"    37) ("XOR"   38) ("NOR" 39) 
  266:               ("ADO16" 41) ("SLT" 42) ("SLTU" 43)                ("MRGB"  45))
  267: )
  268: 
  269: ; iq10 special function sub-opcodes
  270: (define-normal-insn-enum
  271:   q10s_functions "iq10-only special function sub-opcodes" () FUNC10_ f-func
  272:   (("YIELD" 14) ("CNT1S" 46))
  273: )
  274: 
  275: ; coprocessor opcodes in concert with f-cp-grp
  276: (define-normal-insn-enum
  277:   cop_functions "iq10 function sub-opcodes" () FUNC10_ f-func
  278:   (("CFC"    0) ("LOCK"    1) ("CTC"     2) ("UNLK"    3) ("SWRD"    4) ("SWRDL"   5) ("SWWR"    6) ("SWWRU"  7) 
  279:    ("RBA"    8) ("RBAL"    9) ("RBAR"   10)               ("DWRD"   12) ("DWRDL"  13) 
  280:    ("WBA"   16) ("WBAU"   17) ("WBAC"   18)               ("CRC32"  20) ("CRC32B" 21) 
  281:    ("MCID"  32) ("DBD"    33) ("DBA"    34) ("DPWT"   35) ("AVAIL"  36) ("FREE"   37) ("CHKHDR" 38) ("TSTOD" 39)
  282:    ("PKRLA" 40) ("PKRLAU" 41) ("PKRLAH" 42) ("PKRLAC" 43) ("CMPHDR" 44) 
  283: 
  284:    ("CM64RS"  0) ("CM64RD"  1)                                ("CM64RI"    4) ("CM64CLR"    5)
  285:    ("CM64SS"  8) ("CM64SD"  9)                                ("CM64SI"   12) 
  286:    ("CM64RA" 16)                                              ("CM64RIA2" 20) ("CM128RIA2" 21)
  287:    ("CM64SA" 24)                                              ("CM64SIA2" 28) ("CM128SIA2" 29)
  288:    ("CM32RS" 32) ("CM32RD" 33) ("CM32XOR" 34) ("CM32ANDN" 35) ("CM32RI"   36)                  ("CM128VSA" 38)
  289:    ("CM32SS" 40) ("CM32SD" 41) ("CM32OR"  42) ("CM32AND"  43) ("CM32SI"   44) 
  290:    ("CM32RA" 48)  
  291:    ("CM32SA" 56) )
  292: )
  293: 
  294: ; coprocessor opcodes in concert with f-cp-grp
  295: (define-normal-insn-enum
  296:   cop_cm128_4functions "iq10 function sub-opcodes" () FUNC10_ f-cm-4func
  297:   (("CM128RIA3" 4) ("CM128SIA3" 6))
  298: )
  299: 
  300: (define-normal-insn-enum
  301:   cop_cm128_3functions "iq10 function sub-opcodes" () FUNC10_ f-cm-3func
  302:   (("CM128RIA4" 6) ("CM128SIA4" 7))
  303: )
  304: 
  305: (define-normal-insn-enum
  306:    cop2_functions "iq10 coprocessor sub-opcodes" () FUNC10_ f-cp-op
  307:    (("PKRLI" 0) ("PKRLIU" 1) ("PKRLIH" 2) ("PKRLIC" 3) ("RBIR" 1) ("RBI" 2) ("RBIL" 3) ("WBIC" 5) ("WBI" 6) ("WBIU" 7))
  308: )
  309: 
  310: (define-normal-insn-enum
  311:    cop3_cam_functions "iq10 coprocessor cam sub-opcodes" () FUNC10_ f-cp-op-10
  312:    (("CAM36" 16) ("CAM72" 17) ("CAM144" 18) ("CAM288" 19))
  313: )
  314: 
  315: ^L
  316: ; Attributes.
  317: 
  318: (define-attr
  319:   (for insn)
  320:   (type boolean)
  321:   (name YIELD-INSN)
  322:   (comment "insn generates a context yield")
  323: )
  324: 
  325: (define-attr
  326:   (for insn)
  327:   (type boolean)
  328:   (name LOAD-DELAY)
  329:   (comment "insn has a load delay")
  330: )
  331: 
  332: (define-attr
  333:   (for insn)
  334:   (type boolean)
  335:   (name EVEN-REG-NUM)
  336:   (comment "insn requires an even numbered register in rt(2000) or rd(10)")
  337: )
  338: 
  339: (define-attr
  340:   (for insn)
  341:   (type boolean)
  342:   (name UNSUPPORTED)
  343:   (comment "insn is unsupported")
  344: )
  345: 
  346: (define-pmacro (define-reg-use-attr regfield)
  347:   (define-attr
  348:     (for insn)
  349:     (type boolean)
  350:     (name (.sym USES- (.upcase regfield)))
  351:     (comment ("insn accesses register operand " regfield))))
  352: 
  353: (define-reg-use-attr "rd")
  354: (define-reg-use-attr "rs")
  355: (define-reg-use-attr "rt")
  356: (define-reg-use-attr "r31")
  357: 
  358: ^L
  359: ; Operands.
  360: 
  361: (dnop rs       "register Rs"             () h-gr    f-rs)
  362: (dnop rt       "register Rt"             () h-gr    f-rt)
  363: (dnop rd       "register Rd"             () h-gr    f-rd)
  364: (dnop rd-rs    "register Rd from Rs"     () h-gr    f-rd-rs)
  365: (dnop rd-rt    "register Rd from Rt"     () h-gr    f-rd-rt)
  366: (dnop rt-rs    "register Rt from Rs"     () h-gr    f-rt-rs)
  367: (dnop shamt    "shift amount"            () h-uint  f-shamt)
  368: (define-operand (name imm) (comment "immediate") (attrs)
  369:    (type h-uint) (index f-imm) (handlers (parse "imm")))
  370: (dnop offset   "pc-relative offset"      () h-iaddr f-offset)
  371: (dnop baseoff  "base register offset"    () h-iaddr f-imm)
  372: (dnop jmptarg  "jump target"             () h-iaddr f-jtarg)
  373: (dnop mask     "mask"                    () h-uint  f-mask)
  374: (dnop maskq10  "iq10 mask"               () h-uint  f-maskq10)
  375: (dnop maskl    "mask left"               () h-uint  f-maskl)
  376: (dnop count    "count"                   () h-uint  f-count)
  377: (dnop _index   "index"                   () h-uint  f-index)
  378: (dnop execode  "execcode"                () h-uint  f-excode)
  379: (dnop bytecount "byte count"             () h-uint  f-bytecount)
  380: (dnop cam-y     "cam global opn y"       () h-uint  f-cam-y)
  381: (dnop cam-z     "cam global mask z"      () h-uint  f-cam-z)
  382: (dnop cm-3func  "CM 3 bit fn field"      () h-uint  f-cm-3func)
  383: (dnop cm-4func  "CM 4 bit fn field"      () h-uint  f-cm-4func)
  384: (dnop cm-3z     "CM 3 bit Z field"       () h-uint  f-cm-3z)
  385: (dnop cm-4z     "CM 4 bit Z field"       () h-uint  f-cm-4z)
  386: 
  387: ; Aliases for the rs and rt operands. This just makes the load/store
  388: ; insns easier to compare with the instruction set documentation.
  389: 
  390: (dnop base    "base register"                  () h-gr   f-rs)
  391: (dnop maskr   "mask right"                     () h-uint f-rs)
  392: (dnop bitnum  "bit number"                     () h-uint f-rt)
  393: 
  394: ; For high(foo).
  395: (define-operand
  396:   (name hi16)
  397:   (comment "high 16 bit immediate")
  398:   (attrs)
  399:   (type h-uint)
  400:   (index f-imm)
  401:   (handlers (parse "hi16"))
  402: )
  403: 
  404: ; For low(foo).
  405: (define-operand
  406:   (name lo16)
  407:   (comment "16 bit signed immediate, for low")
  408:   (attrs)
  409:   (type h-uint)
  410:   (index f-imm)
  411:   (handlers (parse "lo16"))
  412: )
  413: 
  414: ; For negated imm.
  415: (define-operand
  416:   (name mlo16)
  417:   (comment "negated 16 bit signed immediate")
  418:   (attrs)
  419:   (type h-uint)
  420:   (index f-imm)
  421:   (handlers (parse "mlo16"))
  422: )
  423: 
  424: ; For iq10 jmps
  425: ; In the future, we'll want the j & jal to use the 21 bit target, with 
  426: ; the upper five bits shifted up.  For now, don't use this.
  427: (define-operand
  428:   (name jmptargq10)
  429:   (comment "iq10 21-bit jump offset")
  430:   (attrs)
  431:   (type h-iaddr)
  432:   (index f-jtargq10)
  433:   (handlers (parse "jtargq10"))
  434: )
  435: 
  436: ^L
  437: ; Instructions.
  438: 
  439: ; A pmacro for use in semantic bodies of unimplemented insns.
  440: (define-pmacro (unimp mnemonic) (nop))
  441: 
  442: (define-pmacro (bitset? value bit-num)
  443:   (and value (sll 1 bit-num)))
  444: 
  445: (define-pmacro (bitclear? value bit-num)
  446:   (not (bitset? value bit-num)))
  447: 
  448: ; Arithmetic/logic instructions.
  449: 
  450: (dni add2 "add registers" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
  451:      "add ${rd-rs},$rt"
  452:      (+ OP_SPECIAL rt rd-rs (f-shamt 0) FUNC_ADD)
  453:      (set rd-rs (add rt rd-rs))
  454:      ())
  455: 
  456: (dni add "add registers" (USES-RD USES-RS USES-RT)
  457:      "add $rd,$rs,$rt"
  458:      (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_ADD)
  459:      (set rd (add rs rt))
  460:      ())
  461: 
  462: 
  463: (dni addi2 "add immediate" (ALIAS NO-DIS USES-RS USES-RT)
  464:      "addi ${rt-rs},$lo16"
  465:      (+ OP_ADDI rt-rs lo16)
  466:      (set rt-rs (add rt-rs (ext SI (trunc HI lo16))))
  467:      ())
  468: 
  469: (dni addi "add immediate" (USES-RS USES-RT)
  470:      "addi $rt,$rs,$lo16"
  471:      (+ OP_ADDI rs rt lo16)
  472:      (set rt (add rs (ext SI (trunc HI lo16))))
  473:      ())
  474: 
  475: (dni addiu2 "add immediate unsigned" (ALIAS NO-DIS USES-RS USES-RT)
  476:      "addiu ${rt-rs},$lo16"
  477:      (+ OP_ADDIU rt-rs lo16)
  478:      (set rt-rs (add rt-rs (ext SI (trunc HI lo16))))
  479:      ())
  480: 
  481: (dni addiu "add immediate unsigned" (USES-RS USES-RT)
  482:      "addiu $rt,$rs,$lo16"
  483:      (+ OP_ADDIU rs rt lo16)
  484:      (set rt (add rs (ext SI (trunc HI lo16))))
  485:      ())
  486: 
  487: (dni addu2 "add unsigned" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
  488:      "addu ${rd-rs},$rt"
  489:      (+ OP_SPECIAL rd-rs rt (f-shamt 0) FUNC_ADDU)
  490:      (set rd-rs (add rd-rs rt))
  491:      ())
  492: 
  493: (dni addu "add unsigned" (USES-RD USES-RS USES-RT)
  494:      "addu $rd,$rs,$rt"
  495:      (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_ADDU)
  496:      (set rd (add rs rt))
  497:      ())
  498: 
  499: (dni ado162 "add 16, ones complement" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
  500:      "ado16 ${rd-rs},$rt"
  501:      (+ OP_SPECIAL rd-rs rt (f-shamt 0) FUNC_ADO16)
  502:      (sequence ((HI high) (HI low))
  503:                (set low (add HI (and HI rd-rs #xFFFF) (and HI rt #xFFFF)))
  504:                (set high (add HI (srl rd-rs 16) (srl rt 16)))
  505:                (set rd-rs (or SI (sll SI high 16) low)))
  506:      ())
  507: 
  508: (dni ado16 "add 16, ones complement" (USES-RD USES-RS USES-RT)
  509:      "ado16 $rd,$rs,$rt"
  510:      (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_ADO16)
  511:      (sequence ((HI high) (HI low))
  512:                (set low (add HI (and HI rs #xFFFF) (and HI rt #xFFFF)))
  513:                (set high (add HI (srl rs 16) (srl rt 16)))
  514:                (set rd (or SI (sll SI high 16) low)))
  515:      ())
  516: 
  517: (dni and2 "and register" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
  518:      "and ${rd-rs},$rt"
  519:      (+ OP_SPECIAL rd-rs rt (f-shamt 0) FUNC_AND)
  520:      (set rd-rs (and rd-rs rt))
  521:      ())
  522: 
  523: (dni and "and register" (USES-RD USES-RS USES-RT)
  524:      "and $rd,$rs,$rt"
  525:      (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_AND)
  526:      (set rd (and rs rt))
  527:      ())
  528: 
  529: (dni andi2 "and immediate" (ALIAS NO-DIS USES-RS USES-RT)
  530:      "andi ${rt-rs},$lo16"
  531:      (+ OP_ANDI rt-rs lo16)
  532:      (set rt-rs (and rt-rs (zext SI lo16)))
  533:      ())
  534: 
  535: (dni andi "and immediate" (USES-RS USES-RT)
  536:      "andi $rt,$rs,$lo16"
  537:      (+ OP_ANDI rs rt lo16)
  538:      (set rt (and rs (zext SI lo16)))
  539:      ())
  540: 
  541: (dni andoi2 "and ones immediate" (ALIAS NO-DIS USES-RS USES-RT)
  542:      "andoi ${rt-rs},$lo16"
  543:      (+ OP_ANDOI rt-rs lo16)
  544:      (set rt-rs (and rt-rs (or #xFFFF0000 (ext SI (trunc HI lo16)))))
  545:      ())
  546: 
  547: (dni andoi "and ones immediate" (USES-RS USES-RT)
  548:      "andoi $rt,$rs,$lo16"
  549:      (+ OP_ANDOI rs rt lo16)
  550:      (set rt (and rs (or #xFFFF0000 (ext SI (trunc HI lo16)))))
  551:      ())
  552: 
  553: (dni nor2 "nor" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
  554:      "nor ${rd-rs},$rt"
  555:      (+ OP_SPECIAL rd-rs rt (f-shamt 0) FUNC_NOR)
  556:      (set rd-rs (inv (or rd-rs rt)))
  557:      ())
  558: 
  559: (dni nor "nor" (USES-RD USES-RS USES-RT)
  560:      "nor $rd,$rs,$rt"
  561:      (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_NOR)
  562:      (set rd (inv (or rs rt)))
  563:      ())
  564: 
  565: (dni or2 "or" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
  566:      "or ${rd-rs},$rt"
  567:      (+ OP_SPECIAL rd-rs rt (f-shamt 0) FUNC_OR)
  568:      (set rd-rs (or rd-rs rt))
  569:      ())
  570: 
  571: (dni or "or" (USES-RD USES-RS USES-RT)
  572:      "or $rd,$rs,$rt"
  573:      (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_OR)
  574:      (set rd (or rs rt))
  575:      ())
  576: 
  577: (dni ori2 "or immediate" (ALIAS NO-DIS USES-RS USES-RT)
  578:      "ori ${rt-rs},$lo16"
  579:      (+ OP_ORI rt-rs lo16)
  580:      (set rt-rs (or rt-rs (zext SI lo16)))
  581:      ())
  582: 
  583: (dni ori "or immediate" (USES-RS USES-RT)
  584:      "ori $rt,$rs,$lo16"
  585:      (+ OP_ORI rs rt lo16)
  586:      (set rt (or rs (zext SI lo16)))
  587:      ())
  588: 
  589: (dni ram "rotate and mask" (USES-RD USES-RT)
  590:      "ram $rd,$rt,$shamt,$maskl,$maskr"
  591:      (+ OP_RAM maskr rt rd shamt (f-5 0) maskl)
  592:      (sequence ()
  593:                (set rd (ror rt shamt))
  594:                (set rd (and rd (srl #xFFFFFFFF maskl)))
  595:                (set rd (and rd (sll #xFFFFFFFF maskr))))
  596:      ())
  597: 
  598: (dni sll "shift left logical" (USES-RD USES-RT)
  599:      "sll $rd,$rt,$shamt"
  600:      (+ OP_SPECIAL (f-rs 0) rt rd shamt (f-func 0))
  601:      (set rd (sll rt shamt))
  602:      ())
  603: 
  604: (dni sllv2 "shift left logical variable" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
  605:      "sllv ${rd-rt},$rs"
  606:      (+ OP_SPECIAL rs rd-rt (f-shamt 0) FUNC_SLLV)
  607:      (set rd-rt (sll rd-rt (and rs #x1F)))
  608:      ())
  609: 
  610: (dni sllv "shift left logical variable" (USES-RD USES-RS USES-RT)
  611:      "sllv $rd,$rt,$rs"
  612:      (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_SLLV)
  613:      (set rd (sll rt (and rs #x1F)))
  614:      ())
  615: 
  616: (dni slmv2 "shift left and mask variable" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
  617:      "slmv ${rd-rt},$rs,$shamt"
  618:      (+ OP_SPECIAL rs rd-rt shamt FUNC_SLMV)
  619:      (set rd-rt (and (sll rd-rt shamt) (srl #xFFFFFFFF rs)))
  620:      ())
  621: 
  622: (dni slmv "shift left and mask variable" (USES-RD USES-RS USES-RT)
  623:      "slmv $rd,$rt,$rs,$shamt"
  624:      (+ OP_SPECIAL rs rt rd shamt FUNC_SLMV)
  625:      (set rd (and (sll rt shamt) (srl #xFFFFFFFF rs)))
  626:      ())
  627: 
  628: (dni slt2 "set if less than" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
  629:      "slt ${rd-rs},$rt"
  630:      (+ OP_SPECIAL rt rd-rs (f-shamt 0) FUNC_SLT)
  631:      (if (lt rd-rs rt)
  632:          (set rd-rs 1)
  633:          (set rd-rs 0))
  634:      ())
  635: 
  636: (dni slt "set if less than" (USES-RD USES-RS USES-RT)
  637:      "slt $rd,$rs,$rt"
  638:      (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_SLT)
  639:      (if (lt rs rt)
  640:          (set rd 1)
  641:          (set rd 0))
  642:      ())
  643: 
  644: (dni slti2 "set if less than immediate" (ALIAS NO-DIS USES-RS USES-RT)
  645:      "slti ${rt-rs},$imm"
  646:      (+ OP_SLTI rt-rs imm)
  647:      (if (lt rt-rs (ext SI (trunc HI imm)))
  648:          (set rt-rs 1)
  649:          (set rt-rs 0))
  650:      ())
  651: 
  652: (dni slti "set if less than immediate" (USES-RS USES-RT)
  653:      "slti $rt,$rs,$imm"
  654:      (+ OP_SLTI rs rt imm)
  655:      (if (lt rs (ext SI (trunc HI imm)))
  656:          (set rt 1)
  657:          (set rt 0))
  658:      ())
  659: 
  660: (dni sltiu2 "set if less than immediate unsigned" (ALIAS NO-DIS USES-RS USES-RT)
  661:      "sltiu ${rt-rs},$imm"
  662:      (+ OP_SLTIU rt-rs imm)
  663:      (if (ltu rt-rs (ext SI (trunc HI imm)))
  664:          (set rt-rs 1)
  665:          (set rt-rs 0))
  666:      ())
  667: 
  668: (dni sltiu "set if less than immediate unsigned" (USES-RS USES-RT)
  669:      "sltiu $rt,$rs,$imm"
  670:      (+ OP_SLTIU rs rt imm)
  671:      (if (ltu rs (ext SI (trunc HI imm)))
  672:          (set rt 1)
  673:          (set rt 0))
  674:      ())
  675: 
  676: (dni sltu2 "set if less than unsigned" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
  677:      "sltu ${rd-rs},$rt"
  678:      (+ OP_SPECIAL rd-rs rt (f-shamt 0) FUNC_SLTU)
  679:      (if (ltu rd-rs rt)
  680:          (set rd-rs 1)
  681:          (set rd-rs 0))
  682:      ())
  683: 
  684: (dni sltu "set if less than unsigned" (USES-RD USES-RS USES-RT)
  685:      "sltu $rd,$rs,$rt"
  686:      (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_SLTU)
  687:      (if (ltu rs rt)
  688:          (set rd 1)
  689:          (set rd 0))
  690:      ())
  691: 
  692: (dni sra2 "shift right arithmetic" (ALIAS NO-DIS USES-RD USES-RT)
  693:      "sra ${rd-rt},$shamt"
  694:      (+ OP_SPECIAL (f-rs 0) rd-rt shamt FUNC_SRA)
  695:      (set rd-rt (sra rd-rt shamt))
  696:      ())
  697: 
  698: (dni sra "shift right arithmetic" (USES-RD USES-RT)
  699:      "sra $rd,$rt,$shamt"
  700:      (+ OP_SPECIAL (f-rs 0) rt rd shamt FUNC_SRA)
  701:      (set rd (sra rt shamt))
  702:      ())
  703: 
  704: (dni srav2 "shift right arithmetic variable" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
  705:      "srav ${rd-rt},$rs"
  706:      (+ OP_SPECIAL rs rd-rt (f-shamt 0) FUNC_SRAV)
  707:      (set rd-rt (sra rd-rt (and rs #x1F)))
  708:      ())
  709: 
  710: (dni srav "shift right arithmetic variable" (USES-RD USES-RS USES-RT)
  711:      "srav $rd,$rt,$rs"
  712:      (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_SRAV)
  713:      (set rd (sra rt (and rs #x1F)))
  714:      ())
  715: 
  716: (dni srl "shift right logical" (USES-RD USES-RT)
  717:      "srl $rd,$rt,$shamt"
  718:      (+ OP_SPECIAL (f-rs 0) rt rd shamt FUNC_SRL)
  719:      (set rd (srl rt shamt))
  720:      ())
  721: 
  722: (dni srlv2 "shift right logical variable" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
  723:      "srlv ${rd-rt},$rs"
  724:      (+ OP_SPECIAL rs rd-rt (f-shamt 0) FUNC_SRLV)
  725:      (set rd-rt (srl rd-rt (and rs #x1F)))
  726:      ())
  727: 
  728: (dni srlv "shift right logical variable" (USES-RD USES-RS USES-RT)
  729:      "srlv $rd,$rt,$rs"
  730:      (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_SRLV)
  731:      (set rd (srl rt (and rs #x1F)))
  732:      ())
  733: 
  734: (dni srmv2 "shift right and mask variable" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
  735:      "srmv ${rd-rt},$rs,$shamt"
  736:      (+ OP_SPECIAL rs rd-rt shamt FUNC_SRMV)
  737:      (set rd-rt (and (srl rd-rt shamt) (sll #xFFFFFFFF rs)))
  738:      ())
  739: 
  740: (dni srmv "shift right and mask variable" (USES-RD USES-RS USES-RT)
  741:      "srmv $rd,$rt,$rs,$shamt"
  742:      (+ OP_SPECIAL rs rt rd shamt FUNC_SRMV)
  743:      (set rd (and (srl rt shamt) (sll #xFFFFFFFF rs)))
  744:      ())
  745: 
  746: (dni sub2 "subtract" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
  747:      "sub ${rd-rs},$rt"
  748:      (+ OP_SPECIAL rt rd-rs (f-shamt 0) FUNC_SUB)
  749:      (set rd-rs (sub rd-rs rt))
  750:      ())
  751: 
  752: (dni sub "subtract" (USES-RD USES-RS USES-RT)
  753:      "sub $rd,$rs,$rt"
  754:      (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_SUB)
  755:      (set rd (sub rs rt))
  756:      ())
  757: 
  758: (dni subu2 "subtract unsigned" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
  759:      "subu ${rd-rs},$rt"
  760:      (+ OP_SPECIAL rt rd-rs (f-shamt 0) FUNC_SUBU)
  761:      (set rd-rs (sub rd-rs rt))
  762:      ())
  763: 
  764: (dni subu "subtract unsigned" (USES-RD USES-RS USES-RT)
  765:      "subu $rd,$rs,$rt"
  766:      (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_SUBU)
  767:      (set rd (sub rs rt))
  768:      ())
  769: 
  770: (dni xor2 "exclusive or" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
  771:      "xor ${rd-rs},$rt"
  772:      (+ OP_SPECIAL rt rd-rs (f-shamt 0) FUNC_XOR)
  773:      (set rd-rs (xor rd-rs rt))
  774:      ())
  775: 
  776: (dni xor "exclusive or" (USES-RD USES-RS USES-RT)
  777:      "xor $rd,$rs,$rt"
  778:      (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_XOR)
  779:      (set rd (xor rs rt))
  780:      ())
  781: 
  782: (dni xori2 "exclusive or immediate" (ALIAS NO-DIS USES-RS USES-RT)
  783:      "xori ${rt-rs},$lo16"
  784:      (+ OP_XORI rt-rs lo16)
  785:      (set rt-rs (xor rt-rs (zext SI lo16)))
  786:      ())
  787: 
  788: (dni xori "exclusive or immedi