123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197 |
- ; IQ2000/IQ10 Common CPU description. -*- Scheme -*-
- ; Copyright 2001, 2002, 2007, 2009 Free Software Foundation, Inc.
- ;
- ; Contributed by Red Hat Inc; developed under contract from Fujitsu.
- ;
- ; This file is part of the GNU Binutils.
- ;
- ; This program is free software; you can redistribute it and/or modify
- ; it under the terms of the GNU General Public License as published by
- ; the Free Software Foundation; either version 3 of the License, or
- ; (at your option) any later version.
- ;
- ; This program is distributed in the hope that it will be useful,
- ; but WITHOUT ANY WARRANTY; without even the implied warranty of
- ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ; GNU General Public License for more details.
- ;
- ; You should have received a copy of the GNU General Public License
- ; along with this program; if not, write to the Free Software
- ; Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
- ; MA 02110-1301, USA.
- (include "simplify.inc")
- (define-arch
- (name iq2000)
- (comment "IQ2000 architecture")
- (insn-lsb0? #t)
- (machs iq2000 iq10)
- (isas iq2000)
- )
- (define-isa
- (name iq2000)
- (comment "Basic IQ2000 instruction set")
- (default-insn-word-bitsize 32)
- (default-insn-bitsize 32)
- (base-insn-bitsize 32)
- (decode-assist (31 30 29 28 27 26))
- )
- (define-cpu
- (name iq2000bf)
- (comment "IQ2000 family")
- (endian big)
- (word-bitsize 32)
- (file-transform "")
- )
- (define-cpu
- (name iq10bf)
- (comment "IQ10 coprocessor family")
- (endian big)
- (word-bitsize 32)
- (file-transform "")
- )
- (define-mach
- (name iq2000)
- (comment "IQ2000 packet processing engine")
- (cpu iq2000bf)
- (isas iq2000)
- )
- (define-mach
- (name iq10)
- (comment "IQ10 coprocessor")
- (cpu iq10bf)
- (isas iq2000)
- )
- (define-model
- (name iq2000)
- (comment "IQ2000 microprocessor")
- (mach iq2000)
- (unit u-exec "Execution Unit" ()
- 1 1 ; issue done
- () () () ())
- )
- (define-model
- (name iq10)
- (comment "IQ10 coprocessor")
- (mach iq10)
- (unit u-exec "Execution Unit" ()
- 1 1 ; issue done
- () () () ())
- )
- ; Macros to simplify MACH attribute specification.
- (define-pmacro MACH2000 (MACH iq2000))
- (define-pmacro MACH10 (MACH iq10))
- ; Hardware elements.
- (define-hardware
- (name h-pc)
- (comment "program counter")
- (attrs PC PROFILE (ISA iq2000))
- (type pc)
- (get () (c-call USI "get_h_pc"))
- (set (newval) (c-call VOID "set_h_pc" newval))
- )
- ; FIXME: it would be nice if the hardwired zero in R0 could be
- ; specified as a virtual hardware element, with one less register in
- ; the register file proper.
- (define-keyword
- (name gr-names)
- (print-name h-gr)
- (values (r0 0) (%0 0) (r1 1) (%1 1) (r2 2) (%2 2) (r3 3) (%3 3)
- (r4 4) (%4 4) (r5 5) (%5 5) (r6 6) (%6 6) (r7 7) (%7 7)
- (r8 8) (%8 8) (r9 9) (%9 9) (r10 10) (%10 10) (r11 11) (%11 11)
- (r12 12) (%12 12) (r13 13) (%13 13) (r14 14) (%14 14) (r15 15) (%15 15)
- (r16 16) (%16 16) (r17 17) (%17 17) (r18 18) (%18 18) (r19 19) (%19 19)
- (r20 20) (%20 20) (r21 21) (%21 21) (r22 22) (%22 22) (r23 23) (%23 23)
- (r24 24) (%24 24) (r25 25) (%25 25) (r26 26) (%26 26) (r27 27) (%27 27)
- (r28 28) (%28 28) (r29 29) (%29 29) (r30 30) (%30 30) (r31 31) (%31 31))
- )
- (define-hardware
- (name h-gr)
- (comment "General purpose registers")
- ; (attrs (ISA iq2000) CACHE-ADDR)
- (type register SI (32))
- (indices extern-keyword gr-names)
- (get (idx)
- (cond SI
- ((eq idx 0) (const 0))
- (else (raw-reg h-gr idx))))
- (set (idx newval)
- (cond VOID
- ((eq idx 0) (nop))
- (else (set (raw-reg h-gr idx) newval))))
- )
- ; Instruction fields.
- (dnf f-opcode "opcode field" () 31 6)
- (dnf f-rs "register field Rs" () 25 5)
- (dnf f-rt "register field Rt" () 20 5)
- (dnf f-rd "register field Rd" () 15 5)
- (dnf f-shamt "shift amount field" () 10 5)
- (dnf f-cp-op "coprocessor op field" () 10 3)
- (dnf f-cp-op-10 "coprocessor op field for CAM" () 10 5)
- (dnf f-cp-grp "coprocessor group field" () 7 2)
- (dnf f-func "function field" () 5 6)
- (dnf f-imm "immediate field" () 15 16)
- (define-multi-ifield
- (name f-rd-rs)
- (comment "register Rd implied from Rs")
- (attrs)
- (mode UINT)
- (subfields f-rd f-rs)
- (insert (sequence ()
- (set (ifield f-rd) (ifield f-rd-rs))
- (set (ifield f-rs) (ifield f-rd-rs))
- ))
- (extract (sequence ()
- (set (ifield f-rd-rs) (ifield f-rs))
- ))
- )
- (define-multi-ifield
- (name f-rd-rt)
- (comment "register Rd implied from Rt")
- (attrs)
- (mode UINT)
- (subfields f-rd f-rt)
- (insert (sequence ()
- (set (ifield f-rd) (ifield f-rd-rt))
- (set (ifield f-rt) (ifield f-rd-rt))
- ))
- (extract (sequence ()
- (set (ifield f-rd-rt) (ifield f-rt))
- ))
- )
- (define-multi-ifield
- (name f-rt-rs)
- (comment "register Rt implied from Rs")
- (attrs)
- (mode UINT)
- (subfields f-rt f-rs)
- (insert (sequence ()
- (set (ifield f-rt) (ifield f-rt-rs))
- (set (ifield f-rs) (ifield f-rt-rs))
- ))
- (extract (sequence ()
- (set (ifield f-rd-rs) (ifield f-rs))
- ))
- )
- (df f-jtarg "jump target field" (ABS-ADDR) 15 16 UINT
- ((value pc) (srl USI (and USI value #x03FFFF) 2))
- ((value pc) (or USI (and USI pc #xF0000000) (sll USI value 2))))
- (df f-jtargq10 "iq10 jump target field" (ABS-ADDR) 20 21 UINT
- ((value pc) (srl SI (and SI value #x7FFFFF) 2))
- ((value pc) (or SI (and SI pc #xF0000000) (sll SI value 2))))
- (df f-offset "pc offset field" (PCREL-ADDR) 15 16 INT
- ; Actually, this is relative to the address of the delay slot.
- ((value pc) (sra SI (sub SI value pc) 2))
- ((value pc) (add SI (sll SI value 2) (add pc 4))))
- ; Instruction fields that scarcely appear in instructions.
- (dnf f-count "count field" () 15 7)
- (dnf f-bytecount "byte count field" () 7 8)
- (dnf f-index "index field" () 8 9)
- (dnf f-mask "mask field" () 9 4)
- (dnf f-maskq10 "iq10 mask field" () 10 5)
- (dnf f-maskl "mask left field" () 4 5)
- (dnf f-excode "execcode field" () 25 20)
- (dnf f-rsrvd "reserved field" () 25 10)
- (dnf f-10-11 "bits 10:0" () 10 11)
- (dnf f-24-19 "bits 24:6" () 24 19)
- (dnf f-5 "bit 5" () 5 1)
- (dnf f-10 "bit 10" () 10 1)
- (dnf f-25 "bit 25" () 25 1)
- (dnf f-cam-z "cam global mask z" () 5 3)
- (dnf f-cam-y "cam operation y" () 2 3)
- (dnf f-cm-3func "CM 3 bit fn field" () 5 3)
- (dnf f-cm-4func "CM 4 bit fn field" () 5 4)
- (dnf f-cm-3z "CM 3Z field" () 1 2)
- (dnf f-cm-4z "CM 4Z field" () 2 3)
- ; Enumerations.
- (define-normal-insn-enum
- opcodes "primary opcodes" () OP_ f-opcode
- (("SPECIAL" 0) ("REGIMM" 1) ("J" 2) ("JAL" 3) ("BEQ" 4) ("BNE" 5) ("BLEZ" 6) ("BGTZ" 7)
- ("ADDI" 8) ("ADDIU" 9) ("SLTI" 10) ("SLTIU" 11) ("ANDI" 12) ("ORI" 13) ("XORI" 14) ("LUI" 15)
- ("COP0" 16) ("COP1" 17) ("COP2" 18) ("COP3" 19) ("BEQL" 20) ("BNEL" 21) ("BLEZL" 22) ("BGTZL" 23)
- ("BMB0" 24) ("BMB1" 25) ("BMB2" 26) ("BMB3" 27) ("BBI" 28) ("BBV" 29) ("BBIN" 30) ("BBVN" 31)
- ("LB" 32) ("LH" 33) ("LW" 35) ("LBU" 36) ("LHU" 37) ("RAM" 39)
- ("SB" 40) ("SH" 41) ("SW" 43) ("ANDOI" 44) ("BMB" 45) ("ORUI" 47)
- ("LDW" 48)
- ("SDW" 56) ("ANDOUI" 63))
- )
- (define-normal-insn-enum
- q10_opcodes "iq10-only primary opcodes" () OP10_ f-opcode
- (("BMB" 6) ("ORUI" 15) ("BMBL" 22) ("ANDOUI" 47) ("BBIL" 60) ("BBVL" 61) ("BBINL" 62) ("BBVNL" 63))
- )
- (define-normal-insn-enum
- regimm-functions "branch sub-opcodes" () FUNC_ f-rt
- (("BLTZ" 0) ("BGEZ" 1) ("BLTZL" 2) ("BGEZL" 3) ("BLEZ" 4) ("BGTZ" 5) ("BLEZL" 6) ("BGTZL" 7)
- ("BRI" 8) ("BRV" 9) ("BCTX" 12)
- ("BLTZAL" 16) ("BGEZAL" 17) ("BLTZALL" 18) ("BGEZALL" 19) ("BLEZAL" 20) ("BGTZAL" 21) ("BLEZALL" 22) ("BGTZALL" 23))
- )
- (define-normal-insn-enum
- functions "function sub-opcodes" () FUNC_ f-func
- (("SLL" 0) ("SLMV" 1) ("SRL" 2) ("SRA" 3) ("SLLV" 4) ("SRMV" 5) ("SRLV" 6) ("SRAV" 7)
- ("JR" 8) ("JALR" 9) ("JCR" 10) ("SYSCALL" 12) ("BREAK" 13) ("SLEEP" 14)
- ("ADD" 32) ("ADDU" 33) ("SUB" 34) ("SUBU" 35) ("AND" 36) ("OR" 37) ("XOR" 38) ("NOR" 39)
- ("ADO16" 41) ("SLT" 42) ("SLTU" 43) ("MRGB" 45))
- )
- ; iq10 special function sub-opcodes
- (define-normal-insn-enum
- q10s_functions "iq10-only special function sub-opcodes" () FUNC10_ f-func
- (("YIELD" 14) ("CNT1S" 46))
- )
- ; coprocessor opcodes in concert with f-cp-grp
- (define-normal-insn-enum
- cop_functions "iq10 function sub-opcodes" () FUNC10_ f-func
- (("CFC" 0) ("LOCK" 1) ("CTC" 2) ("UNLK" 3) ("SWRD" 4) ("SWRDL" 5) ("SWWR" 6) ("SWWRU" 7)
- ("RBA" 8) ("RBAL" 9) ("RBAR" 10) ("DWRD" 12) ("DWRDL" 13)
- ("WBA" 16) ("WBAU" 17) ("WBAC" 18) ("CRC32" 20) ("CRC32B" 21)
- ("MCID" 32) ("DBD" 33) ("DBA" 34) ("DPWT" 35) ("AVAIL" 36) ("FREE" 37) ("CHKHDR" 38) ("TSTOD" 39)
- ("PKRLA" 40) ("PKRLAU" 41) ("PKRLAH" 42) ("PKRLAC" 43) ("CMPHDR" 44)
- ("CM64RS" 0) ("CM64RD" 1) ("CM64RI" 4) ("CM64CLR" 5)
- ("CM64SS" 8) ("CM64SD" 9) ("CM64SI" 12)
- ("CM64RA" 16) ("CM64RIA2" 20) ("CM128RIA2" 21)
- ("CM64SA" 24) ("CM64SIA2" 28) ("CM128SIA2" 29)
- ("CM32RS" 32) ("CM32RD" 33) ("CM32XOR" 34) ("CM32ANDN" 35) ("CM32RI" 36) ("CM128VSA" 38)
- ("CM32SS" 40) ("CM32SD" 41) ("CM32OR" 42) ("CM32AND" 43) ("CM32SI" 44)
- ("CM32RA" 48)
- ("CM32SA" 56) )
- )
- ; coprocessor opcodes in concert with f-cp-grp
- (define-normal-insn-enum
- cop_cm128_4functions "iq10 function sub-opcodes" () FUNC10_ f-cm-4func
- (("CM128RIA3" 4) ("CM128SIA3" 6))
- )
- (define-normal-insn-enum
- cop_cm128_3functions "iq10 function sub-opcodes" () FUNC10_ f-cm-3func
- (("CM128RIA4" 6) ("CM128SIA4" 7))
- )
- (define-normal-insn-enum
- cop2_functions "iq10 coprocessor sub-opcodes" () FUNC10_ f-cp-op
- (("PKRLI" 0) ("PKRLIU" 1) ("PKRLIH" 2) ("PKRLIC" 3) ("RBIR" 1) ("RBI" 2) ("RBIL" 3) ("WBIC" 5) ("WBI" 6) ("WBIU" 7))
- )
- (define-normal-insn-enum
- cop3_cam_functions "iq10 coprocessor cam sub-opcodes" () FUNC10_ f-cp-op-10
- (("CAM36" 16) ("CAM72" 17) ("CAM144" 18) ("CAM288" 19))
- )
- ; Attributes.
- (define-attr
- (for insn)
- (type boolean)
- (name YIELD-INSN)
- (comment "insn generates a context yield")
- )
- (define-attr
- (for insn)
- (type boolean)
- (name LOAD-DELAY)
- (comment "insn has a load delay")
- )
- (define-attr
- (for insn)
- (type boolean)
- (name EVEN-REG-NUM)
- (comment "insn requires an even numbered register in rt(2000) or rd(10)")
- )
- (define-attr
- (for insn)
- (type boolean)
- (name UNSUPPORTED)
- (comment "insn is unsupported")
- )
- (define-pmacro (define-reg-use-attr regfield)
- (define-attr
- (for insn)
- (type boolean)
- (name (.sym USES- (.upcase regfield)))
- (comment ("insn accesses register operand " regfield))))
- (define-reg-use-attr "rd")
- (define-reg-use-attr "rs")
- (define-reg-use-attr "rt")
- (define-reg-use-attr "r31")
- ; Operands.
- (dnop rs "register Rs" () h-gr f-rs)
- (dnop rt "register Rt" () h-gr f-rt)
- (dnop rd "register Rd" () h-gr f-rd)
- (dnop rd-rs "register Rd from Rs" () h-gr f-rd-rs)
- (dnop rd-rt "register Rd from Rt" () h-gr f-rd-rt)
- (dnop rt-rs "register Rt from Rs" () h-gr f-rt-rs)
- (dnop shamt "shift amount" () h-uint f-shamt)
- (define-operand (name imm) (comment "immediate") (attrs)
- (type h-uint) (index f-imm) (handlers (parse "imm")))
- (dnop offset "pc-relative offset" () h-iaddr f-offset)
- (dnop baseoff "base register offset" () h-iaddr f-imm)
- (dnop jmptarg "jump target" () h-iaddr f-jtarg)
- (dnop mask "mask" () h-uint f-mask)
- (dnop maskq10 "iq10 mask" () h-uint f-maskq10)
- (dnop maskl "mask left" () h-uint f-maskl)
- (dnop count "count" () h-uint f-count)
- (dnop _index "index" () h-uint f-index)
- (dnop execode "execcode" () h-uint f-excode)
- (dnop bytecount "byte count" () h-uint f-bytecount)
- (dnop cam-y "cam global opn y" () h-uint f-cam-y)
- (dnop cam-z "cam global mask z" () h-uint f-cam-z)
- (dnop cm-3func "CM 3 bit fn field" () h-uint f-cm-3func)
- (dnop cm-4func "CM 4 bit fn field" () h-uint f-cm-4func)
- (dnop cm-3z "CM 3 bit Z field" () h-uint f-cm-3z)
- (dnop cm-4z "CM 4 bit Z field" () h-uint f-cm-4z)
- ; Aliases for the rs and rt operands. This just makes the load/store
- ; insns easier to compare with the instruction set documentation.
- (dnop base "base register" () h-gr f-rs)
- (dnop maskr "mask right" () h-uint f-rs)
- (dnop bitnum "bit number" () h-uint f-rt)
- ; For high(foo).
- (define-operand
- (name hi16)
- (comment "high 16 bit immediate")
- (attrs)
- (type h-uint)
- (index f-imm)
- (handlers (parse "hi16"))
- )
- ; For low(foo).
- (define-operand
- (name lo16)
- (comment "16 bit signed immediate, for low")
- (attrs)
- (type h-uint)
- (index f-imm)
- (handlers (parse "lo16"))
- )
- ; For negated imm.
- (define-operand
- (name mlo16)
- (comment "negated 16 bit signed immediate")
- (attrs)
- (type h-uint)
- (index f-imm)
- (handlers (parse "mlo16"))
- )
- ; For iq10 jmps
- ; In the future, we'll want the j & jal to use the 21 bit target, with
- ; the upper five bits shifted up. For now, don't use this.
- (define-operand
- (name jmptargq10)
- (comment "iq10 21-bit jump offset")
- (attrs)
- (type h-iaddr)
- (index f-jtargq10)
- (handlers (parse "jtargq10"))
- )
- ; Instructions.
- ; A pmacro for use in semantic bodies of unimplemented insns.
- (define-pmacro (unimp mnemonic) (nop))
- (define-pmacro (bitset? value bit-num)
- (and value (sll 1 bit-num)))
- (define-pmacro (bitclear? value bit-num)
- (not (bitset? value bit-num)))
- ; Arithmetic/logic instructions.
- (dni add2 "add registers" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
- "add ${rd-rs},$rt"
- (+ OP_SPECIAL rt rd-rs (f-shamt 0) FUNC_ADD)
- (set rd-rs (add rt rd-rs))
- ())
- (dni add "add registers" (USES-RD USES-RS USES-RT)
- "add $rd,$rs,$rt"
- (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_ADD)
- (set rd (add rs rt))
- ())
- (dni addi2 "add immediate" (ALIAS NO-DIS USES-RS USES-RT)
- "addi ${rt-rs},$lo16"
- (+ OP_ADDI rt-rs lo16)
- (set rt-rs (add rt-rs (ext SI (trunc HI lo16))))
- ())
- (dni addi "add immediate" (USES-RS USES-RT)
- "addi $rt,$rs,$lo16"
- (+ OP_ADDI rs rt lo16)
- (set rt (add rs (ext SI (trunc HI lo16))))
- ())
- (dni addiu2 "add immediate unsigned" (ALIAS NO-DIS USES-RS USES-RT)
- "addiu ${rt-rs},$lo16"
- (+ OP_ADDIU rt-rs lo16)
- (set rt-rs (add rt-rs (ext SI (trunc HI lo16))))
- ())
- (dni addiu "add immediate unsigned" (USES-RS USES-RT)
- "addiu $rt,$rs,$lo16"
- (+ OP_ADDIU rs rt lo16)
- (set rt (add rs (ext SI (trunc HI lo16))))
- ())
- (dni addu2 "add unsigned" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
- "addu ${rd-rs},$rt"
- (+ OP_SPECIAL rd-rs rt (f-shamt 0) FUNC_ADDU)
- (set rd-rs (add rd-rs rt))
- ())
- (dni addu "add unsigned" (USES-RD USES-RS USES-RT)
- "addu $rd,$rs,$rt"
- (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_ADDU)
- (set rd (add rs rt))
- ())
- (dni ado162 "add 16, ones complement" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
- "ado16 ${rd-rs},$rt"
- (+ OP_SPECIAL rd-rs rt (f-shamt 0) FUNC_ADO16)
- (sequence ((HI high) (HI low))
- (set low (add HI (and HI rd-rs #xFFFF) (and HI rt #xFFFF)))
- (set high (add HI (srl rd-rs 16) (srl rt 16)))
- (set rd-rs (or SI (sll SI high 16) low)))
- ())
- (dni ado16 "add 16, ones complement" (USES-RD USES-RS USES-RT)
- "ado16 $rd,$rs,$rt"
- (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_ADO16)
- (sequence ((HI high) (HI low))
- (set low (add HI (and HI rs #xFFFF) (and HI rt #xFFFF)))
- (set high (add HI (srl rs 16) (srl rt 16)))
- (set rd (or SI (sll SI high 16) low)))
- ())
- (dni and2 "and register" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
- "and ${rd-rs},$rt"
- (+ OP_SPECIAL rd-rs rt (f-shamt 0) FUNC_AND)
- (set rd-rs (and rd-rs rt))
- ())
- (dni and "and register" (USES-RD USES-RS USES-RT)
- "and $rd,$rs,$rt"
- (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_AND)
- (set rd (and rs rt))
- ())
- (dni andi2 "and immediate" (ALIAS NO-DIS USES-RS USES-RT)
- "andi ${rt-rs},$lo16"
- (+ OP_ANDI rt-rs lo16)
- (set rt-rs (and rt-rs (zext SI lo16)))
- ())
- (dni andi "and immediate" (USES-RS USES-RT)
- "andi $rt,$rs,$lo16"
- (+ OP_ANDI rs rt lo16)
- (set rt (and rs (zext SI lo16)))
- ())
- (dni andoi2 "and ones immediate" (ALIAS NO-DIS USES-RS USES-RT)
- "andoi ${rt-rs},$lo16"
- (+ OP_ANDOI rt-rs lo16)
- (set rt-rs (and rt-rs (or #xFFFF0000 (ext SI (trunc HI lo16)))))
- ())
- (dni andoi "and ones immediate" (USES-RS USES-RT)
- "andoi $rt,$rs,$lo16"
- (+ OP_ANDOI rs rt lo16)
- (set rt (and rs (or #xFFFF0000 (ext SI (trunc HI lo16)))))
- ())
- (dni nor2 "nor" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
- "nor ${rd-rs},$rt"
- (+ OP_SPECIAL rd-rs rt (f-shamt 0) FUNC_NOR)
- (set rd-rs (inv (or rd-rs rt)))
- ())
- (dni nor "nor" (USES-RD USES-RS USES-RT)
- "nor $rd,$rs,$rt"
- (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_NOR)
- (set rd (inv (or rs rt)))
- ())
- (dni or2 "or" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
- "or ${rd-rs},$rt"
- (+ OP_SPECIAL rd-rs rt (f-shamt 0) FUNC_OR)
- (set rd-rs (or rd-rs rt))
- ())
- (dni or "or" (USES-RD USES-RS USES-RT)
- "or $rd,$rs,$rt"
- (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_OR)
- (set rd (or rs rt))
- ())
- (dni ori2 "or immediate" (ALIAS NO-DIS USES-RS USES-RT)
- "ori ${rt-rs},$lo16"
- (+ OP_ORI rt-rs lo16)
- (set rt-rs (or rt-rs (zext SI lo16)))
- ())
- (dni ori "or immediate" (USES-RS USES-RT)
- "ori $rt,$rs,$lo16"
- (+ OP_ORI rs rt lo16)
- (set rt (or rs (zext SI lo16)))
- ())
- (dni ram "rotate and mask" (USES-RD USES-RT)
- "ram $rd,$rt,$shamt,$maskl,$maskr"
- (+ OP_RAM maskr rt rd shamt (f-5 0) maskl)
- (sequence ()
- (set rd (ror rt shamt))
- (set rd (and rd (srl #xFFFFFFFF maskl)))
- (set rd (and rd (sll #xFFFFFFFF maskr))))
- ())
- (dni sll "shift left logical" (USES-RD USES-RT)
- "sll $rd,$rt,$shamt"
- (+ OP_SPECIAL (f-rs 0) rt rd shamt (f-func 0))
- (set rd (sll rt shamt))
- ())
- (dni sllv2 "shift left logical variable" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
- "sllv ${rd-rt},$rs"
- (+ OP_SPECIAL rs rd-rt (f-shamt 0) FUNC_SLLV)
- (set rd-rt (sll rd-rt (and rs #x1F)))
- ())
- (dni sllv "shift left logical variable" (USES-RD USES-RS USES-RT)
- "sllv $rd,$rt,$rs"
- (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_SLLV)
- (set rd (sll rt (and rs #x1F)))
- ())
- (dni slmv2 "shift left and mask variable" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
- "slmv ${rd-rt},$rs,$shamt"
- (+ OP_SPECIAL rs rd-rt shamt FUNC_SLMV)
- (set rd-rt (and (sll rd-rt shamt) (srl #xFFFFFFFF rs)))
- ())
- (dni slmv "shift left and mask variable" (USES-RD USES-RS USES-RT)
- "slmv $rd,$rt,$rs,$shamt"
- (+ OP_SPECIAL rs rt rd shamt FUNC_SLMV)
- (set rd (and (sll rt shamt) (srl #xFFFFFFFF rs)))
- ())
- (dni slt2 "set if less than" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
- "slt ${rd-rs},$rt"
- (+ OP_SPECIAL rt rd-rs (f-shamt 0) FUNC_SLT)
- (if (lt rd-rs rt)
- (set rd-rs 1)
- (set rd-rs 0))
- ())
- (dni slt "set if less than" (USES-RD USES-RS USES-RT)
- "slt $rd,$rs,$rt"
- (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_SLT)
- (if (lt rs rt)
- (set rd 1)
- (set rd 0))
- ())
- (dni slti2 "set if less than immediate" (ALIAS NO-DIS USES-RS USES-RT)
- "slti ${rt-rs},$imm"
- (+ OP_SLTI rt-rs imm)
- (if (lt rt-rs (ext SI (trunc HI imm)))
- (set rt-rs 1)
- (set rt-rs 0))
- ())
- (dni slti "set if less than immediate" (USES-RS USES-RT)
- "slti $rt,$rs,$imm"
- (+ OP_SLTI rs rt imm)
- (if (lt rs (ext SI (trunc HI imm)))
- (set rt 1)
- (set rt 0))
- ())
- (dni sltiu2 "set if less than immediate unsigned" (ALIAS NO-DIS USES-RS USES-RT)
- "sltiu ${rt-rs},$imm"
- (+ OP_SLTIU rt-rs imm)
- (if (ltu rt-rs (ext SI (trunc HI imm)))
- (set rt-rs 1)
- (set rt-rs 0))
- ())
- (dni sltiu "set if less than immediate unsigned" (USES-RS USES-RT)
- "sltiu $rt,$rs,$imm"
- (+ OP_SLTIU rs rt imm)
- (if (ltu rs (ext SI (trunc HI imm)))
- (set rt 1)
- (set rt 0))
- ())
- (dni sltu2 "set if less than unsigned" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
- "sltu ${rd-rs},$rt"
- (+ OP_SPECIAL rd-rs rt (f-shamt 0) FUNC_SLTU)
- (if (ltu rd-rs rt)
- (set rd-rs 1)
- (set rd-rs 0))
- ())
- (dni sltu "set if less than unsigned" (USES-RD USES-RS USES-RT)
- "sltu $rd,$rs,$rt"
- (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_SLTU)
- (if (ltu rs rt)
- (set rd 1)
- (set rd 0))
- ())
- (dni sra2 "shift right arithmetic" (ALIAS NO-DIS USES-RD USES-RT)
- "sra ${rd-rt},$shamt"
- (+ OP_SPECIAL (f-rs 0) rd-rt shamt FUNC_SRA)
- (set rd-rt (sra rd-rt shamt))
- ())
- (dni sra "shift right arithmetic" (USES-RD USES-RT)
- "sra $rd,$rt,$shamt"
- (+ OP_SPECIAL (f-rs 0) rt rd shamt FUNC_SRA)
- (set rd (sra rt shamt))
- ())
- (dni srav2 "shift right arithmetic variable" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
- "srav ${rd-rt},$rs"
- (+ OP_SPECIAL rs rd-rt (f-shamt 0) FUNC_SRAV)
- (set rd-rt (sra rd-rt (and rs #x1F)))
- ())
- (dni srav "shift right arithmetic variable" (USES-RD USES-RS USES-RT)
- "srav $rd,$rt,$rs"
- (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_SRAV)
- (set rd (sra rt (and rs #x1F)))
- ())
- (dni srl "shift right logical" (USES-RD USES-RT)
- "srl $rd,$rt,$shamt"
- (+ OP_SPECIAL (f-rs 0) rt rd shamt FUNC_SRL)
- (set rd (srl rt shamt))
- ())
- (dni srlv2 "shift right logical variable" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
- "srlv ${rd-rt},$rs"
- (+ OP_SPECIAL rs rd-rt (f-shamt 0) FUNC_SRLV)
- (set rd-rt (srl rd-rt (and rs #x1F)))
- ())
- (dni srlv "shift right logical variable" (USES-RD USES-RS USES-RT)
- "srlv $rd,$rt,$rs"
- (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_SRLV)
- (set rd (srl rt (and rs #x1F)))
- ())
- (dni srmv2 "shift right and mask variable" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
- "srmv ${rd-rt},$rs,$shamt"
- (+ OP_SPECIAL rs rd-rt shamt FUNC_SRMV)
- (set rd-rt (and (srl rd-rt shamt) (sll #xFFFFFFFF rs)))
- ())
- (dni srmv "shift right and mask variable" (USES-RD USES-RS USES-RT)
- "srmv $rd,$rt,$rs,$shamt"
- (+ OP_SPECIAL rs rt rd shamt FUNC_SRMV)
- (set rd (and (srl rt shamt) (sll #xFFFFFFFF rs)))
- ())
- (dni sub2 "subtract" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
- "sub ${rd-rs},$rt"
- (+ OP_SPECIAL rt rd-rs (f-shamt 0) FUNC_SUB)
- (set rd-rs (sub rd-rs rt))
- ())
- (dni sub "subtract" (USES-RD USES-RS USES-RT)
- "sub $rd,$rs,$rt"
- (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_SUB)
- (set rd (sub rs rt))
- ())
- (dni subu2 "subtract unsigned" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
- "subu ${rd-rs},$rt"
- (+ OP_SPECIAL rt rd-rs (f-shamt 0) FUNC_SUBU)
- (set rd-rs (sub rd-rs rt))
- ())
- (dni subu "subtract unsigned" (USES-RD USES-RS USES-RT)
- "subu $rd,$rs,$rt"
- (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_SUBU)
- (set rd (sub rs rt))
- ())
- (dni xor2 "exclusive or" (ALIAS NO-DIS USES-RD USES-RS USES-RT)
- "xor ${rd-rs},$rt"
- (+ OP_SPECIAL rt rd-rs (f-shamt 0) FUNC_XOR)
- (set rd-rs (xor rd-rs rt))
- ())
- (dni xor "exclusive or" (USES-RD USES-RS USES-RT)
- "xor $rd,$rs,$rt"
- (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_XOR)
- (set rd (xor rs rt))
- ())
- (dni xori2 "exclusive or immediate" (ALIAS NO-DIS USES-RS USES-RT)
- "xori ${rt-rs},$lo16"
- (+ OP_XORI rt-rs lo16)
- (set rt-rs (xor rt-rs (zext SI lo16)))
- ())
- (dni xori "exclusive or immediate" (USES-RS USES-RT)
- "xori $rt,$rs,$lo16"
- (+ OP_XORI rs rt lo16)
- (set rt (xor rs (zext SI lo16)))
- ())
- ; Branch instructions.
- (dni bbi "branch bit immediate" (USES-RS)
- "bbi $rs($bitnum),$offset"
- (+ OP_BBI rs bitnum offset)
- (if (bitset? rs bitnum)
- (delay 1 (set pc offset)))
- ())
- (dni bbin "branch bit immediate negated" (USES-RS)
- "bbin $rs($bitnum),$offset"
- (+ OP_BBIN rs bitnum offset)
- (if (bitclear? rs bitnum)
- (delay 1 (set pc offset)))
- ())
- (dni bbv "branch bit variable" (USES-RS USES-RT)
- "bbv $rs,$rt,$offset"
- (+ OP_BBV rs rt offset)
- (if (bitset? rs (and rt #x1F))
- (delay 1 (set pc offset)))
- ())
- (dni bbvn "branch bit variable negated" (USES-RS USES-RT)
- "bbvn $rs,$rt,$offset"
- (+ OP_BBVN rs rt offset)
- (if (bitclear? rs (and rt #x1F))
- (delay 1 (set pc offset)))
- ())
- (dni beq "branch if equal" (USES-RS USES-RT)
- "beq $rs,$rt,$offset"
- (+ OP_BEQ rs rt offset)
- (if (eq rs rt)
- (delay 1 (set pc offset)))
- ())
- (dni beql "branch if equal likely" (USES-RS USES-RT)
- "beql $rs,$rt,$offset"
- (+ OP_BEQL rs rt offset)
- (if (eq rs rt)
- (delay 1 (set pc offset))
- (skip 1))
- ())
- (dni bgez "branch if greater than or equal to zero" (USES-RS)
- "bgez $rs,$offset"
- (+ OP_REGIMM rs FUNC_BGEZ offset)
- (if (ge rs 0)
- (delay 1 (set pc offset)))
- ())
- (dni bgezal "branch if greater than or equal to zero and link" (USES-RS USES-R31)
- "bgezal $rs,$offset"
- (+ OP_REGIMM rs FUNC_BGEZAL offset)
- (if (ge rs 0)
- (sequence ()
- (set (reg h-gr 31) (add pc 8))
- (delay 1 (set pc offset))))
- ())
- (dni bgezall
- "branch if greater than equal to zero and link likely" (USES-RS USES-R31)
- "bgezall $rs,$offset"
- (+ OP_REGIMM rs FUNC_BGEZALL offset)
- (if (ge rs 0)
- (sequence ()
- (set (reg h-gr 31) (add pc 8))
- (delay 1 (set pc offset)))
- (skip 1))
- ())
- (dni bgezl "branch if greater or equal to zero likely" (USES-RS)
- "bgezl $rs,$offset"
- (+ OP_REGIMM rs FUNC_BGEZL offset)
- (if (ge rs 0)
- (delay 1 (set pc offset))
- (skip 1))
- ())
- (dni bltz "branch if less than zero" (USES-RS)
- "bltz $rs,$offset"
- (+ OP_REGIMM rs FUNC_BLTZ offset)
- (if (lt rs 0)
- (delay 1 (set pc offset)))
- ())
- (dni bltzl "branch if less than zero likely" (USES-RS)
- "bltzl $rs,$offset"
- (+ OP_REGIMM rs FUNC_BLTZL offset)
- (if (lt rs 0)
- (delay 1 (set pc offset))
- (skip 1))
- ())
- (dni bltzal "branch if less than zero and link" (USES-RS USES-R31)
- "bltzal $rs,$offset"
- (+ OP_REGIMM rs FUNC_BLTZAL offset)
- (if (lt rs 0)
- (sequence ()
- (set (reg h-gr 31) (add pc 8))
- (delay 1 (set pc offset))))
- ())
- (dni bltzall "branch if less than zero and link likely" (USES-RS USES-R31)
- "bltzall $rs,$offset"
- (+ OP_REGIMM rs FUNC_BLTZALL offset)
- (if (lt rs 0)
- (sequence ()
- (set (reg h-gr 31) (add pc 8))
- (delay 1 (set pc offset)))
- (skip 1))
- ())
- (dni bmb0 "branch if matching byte-lane 0" (USES-RS USES-RT)
- "bmb0 $rs,$rt,$offset"
- (+ OP_BMB0 rs rt offset)
- (if (eq (and rs #xFF) (and rt #xFF))
- (delay 1 (set pc offset)))
- ())
- (dni bmb1 "branch if matching byte-lane 1" (USES-RS USES-RT)
- "bmb1 $rs,$rt,$offset"
- (+ OP_BMB1 rs rt offset)
- (if (eq (and rs #xFF00) (and rt #xFF00))
- (delay 1 (set pc offset)))
- ())
- (dni bmb2 "branch if matching byte-lane 2" (USES-RS USES-RT)
- "bmb2 $rs,$rt,$offset"
- (+ OP_BMB2 rs rt offset)
- (if (eq (and rs #xFF0000) (and rt #xFF0000))
- (delay 1 (set pc offset)))
- ())
- (dni bmb3 "branch if matching byte-lane 3" (USES-RS USES-RT)
- "bmb3 $rs,$rt,$offset"
- (+ OP_BMB3 rs rt offset)
- (if (eq (and rs #xFF000000) (and rt #xFF000000))
- (delay 1 (set pc offset)))
- ())
- (dni bne "branch if not equal" (USES-RS USES-RT)
- "bne $rs,$rt,$offset"
- (+ OP_BNE rs rt offset)
- (if (ne rs rt)
- (delay 1 (set pc offset)))
- ())
- (dni bnel "branch if not equal likely" (USES-RS USES-RT)
- "bnel $rs,$rt,$offset"
- (+ OP_BNEL rs rt offset)
- (if (ne rs rt)
- (delay 1 (set pc offset))
- (skip 1))
- ())
- ; Jump instructions.
- ; Might as well jump!
- (dni jalr "jump and link register" (USES-RD USES-RS)
- "jalr $rd,$rs"
- (+ OP_SPECIAL rs (f-rt 0) rd (f-shamt 0) FUNC_JALR)
- (delay 1
- (sequence ()
- (set rd (add pc 8))
- (set pc rs)))
- ())
- (dni jr "jump register" (USES-RS)
- "jr $rs"
- (+ OP_SPECIAL rs (f-rt 0) (f-rd 0) (f-shamt 0) FUNC_JR)
- (delay 1 (set pc rs))
- ())
- ; Load instructions.
- (dni lb "load byte" (LOAD-DELAY USES-RS USES-RT)
- "lb $rt,$lo16($base)"
- (+ OP_LB base rt lo16)
- (set rt (ext WI (mem QI (add base (ext SI (trunc HI lo16))))))
- ; (sequence ((SI addr) (SI word))
- ; (set addr (add base lo16))
- ; (set word (mem SI (and addr (inv 3))))
- ; (set word (srl word (sll (and addr 2) 3)))
- ; (set rt (ext SI word)))
- ())
- (dni lbu "load byte unsigned" (LOAD-DELAY USES-RS USES-RT)
- "lbu $rt,$lo16($base)"
- (+ OP_LBU base rt lo16)
- (set rt (zext WI (mem QI (add base (ext SI (trunc HI lo16))))))
- ; (sequence ((SI addr) (SI word))
- ; (set addr (add base lo16))
- ; (set word (mem SI (and addr (inv 3))))
- ; (set rt (srl word (sll (and addr 2) 3))))
- ())
- (dni lh "load half word" (LOAD-DELAY USES-RS USES-RT)
- "lh $rt,$lo16($base)"
- (+ OP_LH base rt lo16)
- (set rt (ext WI (mem HI (add base (ext SI (trunc HI lo16))))))
- ; (sequence ((SI addr) (HI word))
- ; (set addr (add base lo16))
- ; (set word (mem SI (and addr (inv 3))))
- ; (set word (srl word (sll (and addr 1) 4)))
- ; (set rt (ext SI word)))
- ())
- (dni lhu "load half word unsigned" (LOAD-DELAY USES-RS USES-RT)
- "lhu $rt,$lo16($base)"
- (+ OP_LHU base rt lo16)
- (set rt (zext WI (mem HI (add base (ext SI (trunc HI lo16))))))
- ; (sequence ((SI addr) (SI word))
- ; (set addr (add base lo16))
- ; (set word (mem SI (and addr (inv 3))))
- ; (set rt (srl word (sll (and addr 1) 4))))
- ())
- (dni lui "load upper immediate" (USES-RT)
- "lui $rt,$hi16"
- (+ OP_LUI (f-rs 0) rt hi16)
- (set rt (sll hi16 16))
- ())
- (dni lw "load word" (LOAD-DELAY USES-RS USES-RT)
- "lw $rt,$lo16($base)"
- (+ OP_LW base rt lo16)
- (set rt (mem SI (add base (ext SI (trunc HI lo16)))))
- ())
- ; Store instructions.
- (dni sb "store byte" (USES-RS USES-RT)
- "sb $rt,$lo16($base)"
- (+ OP_SB base rt lo16)
- (set (mem QI (add base (ext SI (trunc HI lo16)))) (and QI rt #xFF))
- ())
- (dni sh "store half word" (USES-RS USES-RT)
- "sh $rt,$lo16($base)"
- (+ OP_SH base rt lo16)
- (set (mem HI (add base (ext SI (trunc HI lo16)))) (and HI rt #xFFFF))
- ())
- (dni sw "store word" (USES-RS USES-RT)
- "sw $rt,$lo16($base)"
- (+ OP_SW base rt lo16)
- (set (mem SI (add base (ext SI (trunc HI lo16)))) rt)
- ())
- ; Special instructions for simulation/debugging
- (dni break "breakpoint" ()
- "break"
- (+ OP_SPECIAL (f-rs 0) (f-rt 0) (f-rd 0) (f-shamt 0) FUNC_BREAK)
- (c-call VOID "do_break" pc)
- ())
- (dni syscall "system call" (YIELD-INSN)
- "syscall"
- (+ OP_SPECIAL execode (f-func 12))
- (c-call VOID "do_syscall")
- ())
- ; Macro instructions, common to iq10 & iq2000
- (dnmi nop "nop" ()
- "nop"
- (emit sll (rd 0) (rt 0) (shamt 0))
- )
- (dnmi li "load immediate" (USES-RS NO-DIS)
- "li $rs,$imm"
- (emit ori (rt 0) rs imm)
- )
- (dnmi move "move" (USES-RD USES-RT NO-DIS)
- "move $rd,$rt"
- (emit or rd (rs 0) rt)
- )
- (dnmi lb-base-0 "load byte - implied base 0" (USES-RT NO-DIS)
- "lb $rt,$lo16"
- (emit lb rt lo16 (base 0))
- )
- (dnmi lbu-base-0 "load byte unsigned - implied base 0" (USES-RT NO-DIS)
- "lbu $rt,$lo16"
- (emit lbu rt lo16 (base 0))
- )
- (dnmi lh-base-0 "load half - implied base 0" (USES-RT NO-DIS)
- "lh $rt,$lo16"
- (emit lh rt lo16 (base 0))
- )
- (dnmi lw-base-0 "load word - implied base 0" (USES-RT NO-DIS)
- "lw $rt,$lo16"
- (emit lw rt lo16 (base 0))
- )
- (dnmi m-add "add immediate" (USES-RS USES-RT NO-DIS)
- "add $rt,$rs,$lo16"
- (emit addi rt rs lo16))
- (dnmi m-addu "add immediate unsigned" (USES-RS USES-RT NO-DIS)
- "addu $rt,$rs,$lo16"
- (emit addiu rt rs lo16)
- )
- (dnmi m-and "and immediate" (USES-RS USES-RT NO-DIS)
- "and $rt,$rs,$lo16"
- (emit andi rt rs lo16)
- )
- (dnmi m-j "jump register" (USES-RS NO-DIS)
- "j $rs"
- (emit jr rs)
- )
- (dnmi m-or "or immediate" (USES-RS USES-RT NO-DIS)
- "or $rt,$rs,$lo16"
- (emit ori rt rs lo16)
- )
- (dnmi m-sll "shift left logical" (USES-RD USES-RT USES-RS NO-DIS)
- "sll $rd,$rt,$rs"
- (emit sllv rd rt rs)
- )
- (dnmi m-slt "slt immediate" (USES-RS USES-RT NO-DIS)
- "slt $rt,$rs,$imm"
- (emit slti rt rs imm)
- )
- (dnmi m-sltu "sltu immediate" (USES-RS USES-RT NO-DIS)
- "sltu $rt,$rs,$imm"
- (emit sltiu rt rs imm)
- )
- (dnmi m-sra "shift right arithmetic" (USES-RD USES-RT USES-RS NO-DIS)
- "sra $rd,$rt,$rs"
- (emit srav rd rt rs)
- )
- (dnmi m-srl "shift right logical" (USES-RD USES-RT USES-RS NO-DIS)
- "srl $rd,$rt,$rs"
- (emit srlv rd rt rs)
- )
- (dnmi not "not" (USES-RD USES-RT NO-DIS)
- "not $rd,$rt"
- (emit nor rd (rs 0) rt)
- )
- (dnmi subi "sub immediate" (USES-RS USES-RT NO-DIS)
- "subi $rt,$rs,$mlo16"
- (emit addiu rt rs mlo16)
- )
- (dnmi m-sub "subtract immediate" (USES-RS USES-RT NO-DIS)
- "sub $rt,$rs,$mlo16"
- (emit addiu rt rs mlo16)
- )
- (dnmi m-subu "subtract unsigned" (USES-RS USES-RT NO-DIS)
- "subu $rt,$rs,$mlo16"
- (emit addiu rt rs mlo16)
- )
- (dnmi sb-base-0 "store byte - implied base 0" (USES-RT NO-DIS)
- "sb $rt,$lo16"
- (emit sb rt lo16 (base 0))
- )
- (dnmi sh-base-0 "store half - implied base 0" (USES-RT NO-DIS)
- "sh $rt,$lo16"
- (emit sh rt lo16 (base 0))
- )
- (dnmi sw-base-0 "store word - implied base 0" (USES-RT NO-DIS)
- "sw $rt,$lo16"
- (emit sw rt lo16 (base 0))
- )
- (dnmi m-xor "xor immediate" (USES-RS USES-RT NO-DIS)
- "xor $rt,$rs,$lo16"
- (emit xori rt rs lo16)
- )
- (if (keep-mach? (iq2000))
- (include "iq2000m.cpu"))
- (if (keep-mach? (iq10))
- (include "iq10.cpu"))
|