1*3d8817e4Smiod; IQ2000/IQ10 Common CPU description. -*- Scheme -*- 2*3d8817e4Smiod; Copyright (C) 2000, 2001, 2002 Red Hat, Inc. 3*3d8817e4Smiod; This file is part of CGEN. 4*3d8817e4Smiod; See file COPYING.CGEN for details. 5*3d8817e4Smiod 6*3d8817e4Smiod(include "simplify.inc") 7*3d8817e4Smiod 8*3d8817e4Smiod(define-arch 9*3d8817e4Smiod (name iq2000) 10*3d8817e4Smiod (comment "IQ2000 architecture") 11*3d8817e4Smiod (insn-lsb0? #t) 12*3d8817e4Smiod (machs iq2000 iq10) 13*3d8817e4Smiod (isas iq2000) 14*3d8817e4Smiod) 15*3d8817e4Smiod 16*3d8817e4Smiod(define-isa 17*3d8817e4Smiod (name iq2000) 18*3d8817e4Smiod (comment "Basic IQ2000 instruction set") 19*3d8817e4Smiod (default-insn-word-bitsize 32) 20*3d8817e4Smiod (default-insn-bitsize 32) 21*3d8817e4Smiod (base-insn-bitsize 32) 22*3d8817e4Smiod (decode-assist (31 30 29 28 27 26)) 23*3d8817e4Smiod) 24*3d8817e4Smiod 25*3d8817e4Smiod(define-cpu 26*3d8817e4Smiod (name iq2000bf) 27*3d8817e4Smiod (comment "IQ2000 family") 28*3d8817e4Smiod (endian big) 29*3d8817e4Smiod (word-bitsize 32) 30*3d8817e4Smiod (file-transform "") 31*3d8817e4Smiod) 32*3d8817e4Smiod 33*3d8817e4Smiod(define-cpu 34*3d8817e4Smiod (name iq10bf) 35*3d8817e4Smiod (comment "IQ10 coprocessor family") 36*3d8817e4Smiod (endian big) 37*3d8817e4Smiod (word-bitsize 32) 38*3d8817e4Smiod (file-transform "") 39*3d8817e4Smiod 40*3d8817e4Smiod) 41*3d8817e4Smiod 42*3d8817e4Smiod(define-mach 43*3d8817e4Smiod (name iq2000) 44*3d8817e4Smiod (comment "IQ2000 packet processing engine") 45*3d8817e4Smiod (cpu iq2000bf) 46*3d8817e4Smiod (isas iq2000) 47*3d8817e4Smiod) 48*3d8817e4Smiod 49*3d8817e4Smiod(define-mach 50*3d8817e4Smiod (name iq10) 51*3d8817e4Smiod (comment "IQ10 coprocessor") 52*3d8817e4Smiod (cpu iq10bf) 53*3d8817e4Smiod (isas iq2000) 54*3d8817e4Smiod) 55*3d8817e4Smiod 56*3d8817e4Smiod(define-model 57*3d8817e4Smiod (name iq2000) 58*3d8817e4Smiod (comment "IQ2000 microprocessor") 59*3d8817e4Smiod (mach iq2000) 60*3d8817e4Smiod (unit u-exec "Execution Unit" () 61*3d8817e4Smiod 1 1 ; issue done 62*3d8817e4Smiod () () () ()) 63*3d8817e4Smiod) 64*3d8817e4Smiod 65*3d8817e4Smiod(define-model 66*3d8817e4Smiod (name iq10) 67*3d8817e4Smiod (comment "IQ10 coprocessor") 68*3d8817e4Smiod (mach iq10) 69*3d8817e4Smiod (unit u-exec "Execution Unit" () 70*3d8817e4Smiod 1 1 ; issue done 71*3d8817e4Smiod () () () ()) 72*3d8817e4Smiod) 73*3d8817e4Smiod 74*3d8817e4Smiod; Macros to simplify MACH attribute specification. 75*3d8817e4Smiod 76*3d8817e4Smiod(define-pmacro MACH2000 (MACH iq2000)) 77*3d8817e4Smiod(define-pmacro MACH10 (MACH iq10)) 78*3d8817e4Smiod 79*3d8817e4Smiod 80*3d8817e4Smiod; Hardware elements. 81*3d8817e4Smiod 82*3d8817e4Smiod(define-hardware 83*3d8817e4Smiod (name h-pc) 84*3d8817e4Smiod (comment "program counter") 85*3d8817e4Smiod (attrs PC PROFILE (ISA iq2000)) 86*3d8817e4Smiod (type pc) 87*3d8817e4Smiod (get () (c-call USI "get_h_pc")) 88*3d8817e4Smiod (set (newval) (c-call VOID "set_h_pc" newval)) 89*3d8817e4Smiod) 90*3d8817e4Smiod; FIXME: it would be nice if the hardwired zero in R0 could be 91*3d8817e4Smiod; specified as a virtual hardware element, with one less register in 92*3d8817e4Smiod; the register file proper. 93*3d8817e4Smiod 94*3d8817e4Smiod(define-keyword 95*3d8817e4Smiod (name gr-names) 96*3d8817e4Smiod (print-name h-gr) 97*3d8817e4Smiod (values (r0 0) (%0 0) (r1 1) (%1 1) (r2 2) (%2 2) (r3 3) (%3 3) 98*3d8817e4Smiod (r4 4) (%4 4) (r5 5) (%5 5) (r6 6) (%6 6) (r7 7) (%7 7) 99*3d8817e4Smiod (r8 8) (%8 8) (r9 9) (%9 9) (r10 10) (%10 10) (r11 11) (%11 11) 100*3d8817e4Smiod (r12 12) (%12 12) (r13 13) (%13 13) (r14 14) (%14 14) (r15 15) (%15 15) 101*3d8817e4Smiod (r16 16) (%16 16) (r17 17) (%17 17) (r18 18) (%18 18) (r19 19) (%19 19) 102*3d8817e4Smiod (r20 20) (%20 20) (r21 21) (%21 21) (r22 22) (%22 22) (r23 23) (%23 23) 103*3d8817e4Smiod (r24 24) (%24 24) (r25 25) (%25 25) (r26 26) (%26 26) (r27 27) (%27 27) 104*3d8817e4Smiod (r28 28) (%28 28) (r29 29) (%29 29) (r30 30) (%30 30) (r31 31) (%31 31)) 105*3d8817e4Smiod) 106*3d8817e4Smiod 107*3d8817e4Smiod(define-hardware 108*3d8817e4Smiod (name h-gr) 109*3d8817e4Smiod (comment "General purpose registers") 110*3d8817e4Smiod; (attrs (ISA iq2000) CACHE-ADDR) 111*3d8817e4Smiod (type register SI (32)) 112*3d8817e4Smiod (indices extern-keyword gr-names) 113*3d8817e4Smiod (get (idx) 114*3d8817e4Smiod (cond SI 115*3d8817e4Smiod ((eq idx 0) (const 0)) 116*3d8817e4Smiod (else (raw-reg h-gr idx)))) 117*3d8817e4Smiod (set (idx newval) 118*3d8817e4Smiod (cond VOID 119*3d8817e4Smiod ((eq idx 0) (nop)) 120*3d8817e4Smiod (else (set (raw-reg h-gr idx) newval)))) 121*3d8817e4Smiod) 122*3d8817e4Smiod 123*3d8817e4Smiod 124*3d8817e4Smiod; Instruction fields. 125*3d8817e4Smiod 126*3d8817e4Smiod(dnf f-opcode "opcode field" () 31 6) 127*3d8817e4Smiod(dnf f-rs "register field Rs" () 25 5) 128*3d8817e4Smiod(dnf f-rt "register field Rt" () 20 5) 129*3d8817e4Smiod(dnf f-rd "register field Rd" () 15 5) 130*3d8817e4Smiod(dnf f-shamt "shift amount field" () 10 5) 131*3d8817e4Smiod(dnf f-cp-op "coprocessor op field" () 10 3) 132*3d8817e4Smiod(dnf f-cp-op-10 "coprocessor op field for CAM" () 10 5) 133*3d8817e4Smiod(dnf f-cp-grp "coprocessor group field" () 7 2) 134*3d8817e4Smiod(dnf f-func "function field" () 5 6) 135*3d8817e4Smiod(dnf f-imm "immediate field" () 15 16) 136*3d8817e4Smiod 137*3d8817e4Smiod(define-multi-ifield 138*3d8817e4Smiod (name f-rd-rs) 139*3d8817e4Smiod (comment "register Rd implied from Rs") 140*3d8817e4Smiod (attrs) 141*3d8817e4Smiod (mode UINT) 142*3d8817e4Smiod (subfields f-rd f-rs) 143*3d8817e4Smiod (insert (sequence () 144*3d8817e4Smiod (set (ifield f-rd) (ifield f-rd-rs)) 145*3d8817e4Smiod (set (ifield f-rs) (ifield f-rd-rs)) 146*3d8817e4Smiod )) 147*3d8817e4Smiod (extract (sequence () 148*3d8817e4Smiod (set (ifield f-rd-rs) (ifield f-rs)) 149*3d8817e4Smiod )) 150*3d8817e4Smiod) 151*3d8817e4Smiod 152*3d8817e4Smiod(define-multi-ifield 153*3d8817e4Smiod (name f-rd-rt) 154*3d8817e4Smiod (comment "register Rd implied from Rt") 155*3d8817e4Smiod (attrs) 156*3d8817e4Smiod (mode UINT) 157*3d8817e4Smiod (subfields f-rd f-rt) 158*3d8817e4Smiod (insert (sequence () 159*3d8817e4Smiod (set (ifield f-rd) (ifield f-rd-rt)) 160*3d8817e4Smiod (set (ifield f-rt) (ifield f-rd-rt)) 161*3d8817e4Smiod )) 162*3d8817e4Smiod (extract (sequence () 163*3d8817e4Smiod (set (ifield f-rd-rt) (ifield f-rt)) 164*3d8817e4Smiod )) 165*3d8817e4Smiod) 166*3d8817e4Smiod 167*3d8817e4Smiod(define-multi-ifield 168*3d8817e4Smiod (name f-rt-rs) 169*3d8817e4Smiod (comment "register Rt implied from Rs") 170*3d8817e4Smiod (attrs) 171*3d8817e4Smiod (mode UINT) 172*3d8817e4Smiod (subfields f-rt f-rs) 173*3d8817e4Smiod (insert (sequence () 174*3d8817e4Smiod (set (ifield f-rt) (ifield f-rt-rs)) 175*3d8817e4Smiod (set (ifield f-rs) (ifield f-rt-rs)) 176*3d8817e4Smiod )) 177*3d8817e4Smiod (extract (sequence () 178*3d8817e4Smiod (set (ifield f-rd-rs) (ifield f-rs)) 179*3d8817e4Smiod )) 180*3d8817e4Smiod) 181*3d8817e4Smiod 182*3d8817e4Smiod(df f-jtarg "jump target field" (ABS-ADDR) 15 16 UINT 183*3d8817e4Smiod ((value pc) (srl USI (and USI value #x03FFFF) 2)) 184*3d8817e4Smiod ((value pc) (or USI (and USI pc #xF0000000) (sll USI value 2)))) 185*3d8817e4Smiod 186*3d8817e4Smiod(df f-jtargq10 "iq10 jump target field" (ABS-ADDR) 20 21 UINT 187*3d8817e4Smiod ((value pc) (srl SI (and SI value #x7FFFFF) 2)) 188*3d8817e4Smiod ((value pc) (or SI (and SI pc #xF0000000) (sll SI value 2)))) 189*3d8817e4Smiod 190*3d8817e4Smiod(df f-offset "pc offset field" (PCREL-ADDR) 15 16 INT 191*3d8817e4Smiod ; Actually, this is relative to the address of the delay slot. 192*3d8817e4Smiod ((value pc) (sra SI (sub SI value pc) 2)) 193*3d8817e4Smiod ((value pc) (add SI (sll SI value 2) (add pc 4)))) 194*3d8817e4Smiod 195*3d8817e4Smiod; Instruction fields that scarcely appear in instructions. 196*3d8817e4Smiod 197*3d8817e4Smiod(dnf f-count "count field" () 15 7) 198*3d8817e4Smiod(dnf f-bytecount "byte count field" () 7 8) 199*3d8817e4Smiod(dnf f-index "index field" () 8 9) 200*3d8817e4Smiod(dnf f-mask "mask field" () 9 4) 201*3d8817e4Smiod(dnf f-maskq10 "iq10 mask field" () 10 5) 202*3d8817e4Smiod(dnf f-maskl "mask left field" () 4 5) 203*3d8817e4Smiod(dnf f-excode "execcode field" () 25 20) 204*3d8817e4Smiod(dnf f-rsrvd "reserved field" () 25 10) 205*3d8817e4Smiod(dnf f-10-11 "bits 10:0" () 10 11) 206*3d8817e4Smiod(dnf f-24-19 "bits 24:6" () 24 19) 207*3d8817e4Smiod(dnf f-5 "bit 5" () 5 1) 208*3d8817e4Smiod(dnf f-10 "bit 10" () 10 1) 209*3d8817e4Smiod(dnf f-25 "bit 25" () 25 1) 210*3d8817e4Smiod(dnf f-cam-z "cam global mask z" () 5 3) 211*3d8817e4Smiod(dnf f-cam-y "cam operation y" () 2 3) 212*3d8817e4Smiod(dnf f-cm-3func "CM 3 bit fn field" () 5 3) 213*3d8817e4Smiod(dnf f-cm-4func "CM 4 bit fn field" () 5 4) 214*3d8817e4Smiod(dnf f-cm-3z "CM 3Z field" () 1 2) 215*3d8817e4Smiod(dnf f-cm-4z "CM 4Z field" () 2 3) 216*3d8817e4Smiod 217*3d8817e4Smiod 218*3d8817e4Smiod; Enumerations. 219*3d8817e4Smiod 220*3d8817e4Smiod(define-normal-insn-enum 221*3d8817e4Smiod opcodes "primary opcodes" () OP_ f-opcode 222*3d8817e4Smiod (("SPECIAL" 0) ("REGIMM" 1) ("J" 2) ("JAL" 3) ("BEQ" 4) ("BNE" 5) ("BLEZ" 6) ("BGTZ" 7) 223*3d8817e4Smiod ("ADDI" 8) ("ADDIU" 9) ("SLTI" 10) ("SLTIU" 11) ("ANDI" 12) ("ORI" 13) ("XORI" 14) ("LUI" 15) 224*3d8817e4Smiod ("COP0" 16) ("COP1" 17) ("COP2" 18) ("COP3" 19) ("BEQL" 20) ("BNEL" 21) ("BLEZL" 22) ("BGTZL" 23) 225*3d8817e4Smiod ("BMB0" 24) ("BMB1" 25) ("BMB2" 26) ("BMB3" 27) ("BBI" 28) ("BBV" 29) ("BBIN" 30) ("BBVN" 31) 226*3d8817e4Smiod ("LB" 32) ("LH" 33) ("LW" 35) ("LBU" 36) ("LHU" 37) ("RAM" 39) 227*3d8817e4Smiod ("SB" 40) ("SH" 41) ("SW" 43) ("ANDOI" 44) ("BMB" 45) ("ORUI" 47) 228*3d8817e4Smiod ("LDW" 48) 229*3d8817e4Smiod ("SDW" 56) ("ANDOUI" 63)) 230*3d8817e4Smiod) 231*3d8817e4Smiod 232*3d8817e4Smiod(define-normal-insn-enum 233*3d8817e4Smiod q10_opcodes "iq10-only primary opcodes" () OP10_ f-opcode 234*3d8817e4Smiod (("BMB" 6) ("ORUI" 15) ("BMBL" 22) ("ANDOUI" 47) ("BBIL" 60) ("BBVL" 61) ("BBINL" 62) ("BBVNL" 63)) 235*3d8817e4Smiod) 236*3d8817e4Smiod 237*3d8817e4Smiod(define-normal-insn-enum 238*3d8817e4Smiod regimm-functions "branch sub-opcodes" () FUNC_ f-rt 239*3d8817e4Smiod (("BLTZ" 0) ("BGEZ" 1) ("BLTZL" 2) ("BGEZL" 3) ("BLEZ" 4) ("BGTZ" 5) ("BLEZL" 6) ("BGTZL" 7) 240*3d8817e4Smiod ("BRI" 8) ("BRV" 9) ("BCTX" 12) 241*3d8817e4Smiod ("BLTZAL" 16) ("BGEZAL" 17) ("BLTZALL" 18) ("BGEZALL" 19) ("BLEZAL" 20) ("BGTZAL" 21) ("BLEZALL" 22) ("BGTZALL" 23)) 242*3d8817e4Smiod) 243*3d8817e4Smiod 244*3d8817e4Smiod(define-normal-insn-enum 245*3d8817e4Smiod functions "function sub-opcodes" () FUNC_ f-func 246*3d8817e4Smiod (("SLL" 0) ("SLMV" 1) ("SRL" 2) ("SRA" 3) ("SLLV" 4) ("SRMV" 5) ("SRLV" 6) ("SRAV" 7) 247*3d8817e4Smiod ("JR" 8) ("JALR" 9) ("JCR" 10) ("SYSCALL" 12) ("BREAK" 13) ("SLEEP" 14) 248*3d8817e4Smiod ("ADD" 32) ("ADDU" 33) ("SUB" 34) ("SUBU" 35) ("AND" 36) ("OR" 37) ("XOR" 38) ("NOR" 39) 249*3d8817e4Smiod ("ADO16" 41) ("SLT" 42) ("SLTU" 43) ("MRGB" 45)) 250*3d8817e4Smiod) 251*3d8817e4Smiod 252*3d8817e4Smiod; iq10 special function sub-opcodes 253*3d8817e4Smiod(define-normal-insn-enum 254*3d8817e4Smiod q10s_functions "iq10-only special function sub-opcodes" () FUNC10_ f-func 255*3d8817e4Smiod (("YIELD" 14) ("CNT1S" 46)) 256*3d8817e4Smiod) 257*3d8817e4Smiod 258*3d8817e4Smiod; coprocessor opcodes in concert with f-cp-grp 259*3d8817e4Smiod(define-normal-insn-enum 260*3d8817e4Smiod cop_functions "iq10 function sub-opcodes" () FUNC10_ f-func 261*3d8817e4Smiod (("CFC" 0) ("LOCK" 1) ("CTC" 2) ("UNLK" 3) ("SWRD" 4) ("SWRDL" 5) ("SWWR" 6) ("SWWRU" 7) 262*3d8817e4Smiod ("RBA" 8) ("RBAL" 9) ("RBAR" 10) ("DWRD" 12) ("DWRDL" 13) 263*3d8817e4Smiod ("WBA" 16) ("WBAU" 17) ("WBAC" 18) ("CRC32" 20) ("CRC32B" 21) 264*3d8817e4Smiod ("MCID" 32) ("DBD" 33) ("DBA" 34) ("DPWT" 35) ("AVAIL" 36) ("FREE" 37) ("CHKHDR" 38) ("TSTOD" 39) 265*3d8817e4Smiod ("PKRLA" 40) ("PKRLAU" 41) ("PKRLAH" 42) ("PKRLAC" 43) ("CMPHDR" 44) 266*3d8817e4Smiod 267*3d8817e4Smiod ("CM64RS" 0) ("CM64RD" 1) ("CM64RI" 4) ("CM64CLR" 5) 268*3d8817e4Smiod ("CM64SS" 8) ("CM64SD" 9) ("CM64SI" 12) 269*3d8817e4Smiod ("CM64RA" 16) ("CM64RIA2" 20) ("CM128RIA2" 21) 270*3d8817e4Smiod ("CM64SA" 24) ("CM64SIA2" 28) ("CM128SIA2" 29) 271*3d8817e4Smiod ("CM32RS" 32) ("CM32RD" 33) ("CM32XOR" 34) ("CM32ANDN" 35) ("CM32RI" 36) ("CM128VSA" 38) 272*3d8817e4Smiod ("CM32SS" 40) ("CM32SD" 41) ("CM32OR" 42) ("CM32AND" 43) ("CM32SI" 44) 273*3d8817e4Smiod ("CM32RA" 48) 274*3d8817e4Smiod ("CM32SA" 56) ) 275*3d8817e4Smiod) 276*3d8817e4Smiod 277*3d8817e4Smiod; coprocessor opcodes in concert with f-cp-grp 278*3d8817e4Smiod(define-normal-insn-enum 279*3d8817e4Smiod cop_cm128_4functions "iq10 function sub-opcodes" () FUNC10_ f-cm-4func 280*3d8817e4Smiod (("CM128RIA3" 4) ("CM128SIA3" 6)) 281*3d8817e4Smiod) 282*3d8817e4Smiod 283*3d8817e4Smiod(define-normal-insn-enum 284*3d8817e4Smiod cop_cm128_3functions "iq10 function sub-opcodes" () FUNC10_ f-cm-3func 285*3d8817e4Smiod (("CM128RIA4" 6) ("CM128SIA4" 7)) 286*3d8817e4Smiod) 287*3d8817e4Smiod 288*3d8817e4Smiod(define-normal-insn-enum 289*3d8817e4Smiod cop2_functions "iq10 coprocessor sub-opcodes" () FUNC10_ f-cp-op 290*3d8817e4Smiod (("PKRLI" 0) ("PKRLIU" 1) ("PKRLIH" 2) ("PKRLIC" 3) ("RBIR" 1) ("RBI" 2) ("RBIL" 3) ("WBIC" 5) ("WBI" 6) ("WBIU" 7)) 291*3d8817e4Smiod) 292*3d8817e4Smiod 293*3d8817e4Smiod(define-normal-insn-enum 294*3d8817e4Smiod cop3_cam_functions "iq10 coprocessor cam sub-opcodes" () FUNC10_ f-cp-op-10 295*3d8817e4Smiod (("CAM36" 16) ("CAM72" 17) ("CAM144" 18) ("CAM288" 19)) 296*3d8817e4Smiod) 297*3d8817e4Smiod 298*3d8817e4Smiod 299*3d8817e4Smiod; Attributes. 300*3d8817e4Smiod 301*3d8817e4Smiod(define-attr 302*3d8817e4Smiod (for insn) 303*3d8817e4Smiod (type boolean) 304*3d8817e4Smiod (name YIELD-INSN) 305*3d8817e4Smiod (comment "insn generates a context yield") 306*3d8817e4Smiod) 307*3d8817e4Smiod 308*3d8817e4Smiod(define-attr 309*3d8817e4Smiod (for insn) 310*3d8817e4Smiod (type boolean) 311*3d8817e4Smiod (name LOAD-DELAY) 312*3d8817e4Smiod (comment "insn has a load delay") 313*3d8817e4Smiod) 314*3d8817e4Smiod 315*3d8817e4Smiod(define-attr 316*3d8817e4Smiod (for insn) 317*3d8817e4Smiod (type boolean) 318*3d8817e4Smiod (name EVEN-REG-NUM) 319*3d8817e4Smiod (comment "insn requires an even numbered register in rt(2000) or rd(10)") 320*3d8817e4Smiod) 321*3d8817e4Smiod 322*3d8817e4Smiod(define-attr 323*3d8817e4Smiod (for insn) 324*3d8817e4Smiod (type boolean) 325*3d8817e4Smiod (name UNSUPPORTED) 326*3d8817e4Smiod (comment "insn is unsupported") 327*3d8817e4Smiod) 328*3d8817e4Smiod 329*3d8817e4Smiod(define-pmacro (define-reg-use-attr regfield) 330*3d8817e4Smiod (define-attr 331*3d8817e4Smiod (for insn) 332*3d8817e4Smiod (type boolean) 333*3d8817e4Smiod (name (.sym USES- (.upcase regfield))) 334*3d8817e4Smiod (comment ("insn accesses register operand " regfield)))) 335*3d8817e4Smiod 336*3d8817e4Smiod(define-reg-use-attr "rd") 337*3d8817e4Smiod(define-reg-use-attr "rs") 338*3d8817e4Smiod(define-reg-use-attr "rt") 339*3d8817e4Smiod(define-reg-use-attr "r31") 340*3d8817e4Smiod 341*3d8817e4Smiod 342*3d8817e4Smiod; Operands. 343*3d8817e4Smiod 344*3d8817e4Smiod(dnop rs "register Rs" () h-gr f-rs) 345*3d8817e4Smiod(dnop rt "register Rt" () h-gr f-rt) 346*3d8817e4Smiod(dnop rd "register Rd" () h-gr f-rd) 347*3d8817e4Smiod(dnop rd-rs "register Rd from Rs" () h-gr f-rd-rs) 348*3d8817e4Smiod(dnop rd-rt "register Rd from Rt" () h-gr f-rd-rt) 349*3d8817e4Smiod(dnop rt-rs "register Rt from Rs" () h-gr f-rt-rs) 350*3d8817e4Smiod(dnop shamt "shift amount" () h-uint f-shamt) 351*3d8817e4Smiod(define-operand (name imm) (comment "immediate") (attrs) 352*3d8817e4Smiod (type h-uint) (index f-imm) (handlers (parse "imm"))) 353*3d8817e4Smiod(dnop offset "pc-relative offset" () h-iaddr f-offset) 354*3d8817e4Smiod(dnop baseoff "base register offset" () h-iaddr f-imm) 355*3d8817e4Smiod(dnop jmptarg "jump target" () h-iaddr f-jtarg) 356*3d8817e4Smiod(dnop mask "mask" () h-uint f-mask) 357*3d8817e4Smiod(dnop maskq10 "iq10 mask" () h-uint f-maskq10) 358*3d8817e4Smiod(dnop maskl "mask left" () h-uint f-maskl) 359*3d8817e4Smiod(dnop count "count" () h-uint f-count) 360*3d8817e4Smiod(dnop _index "index" () h-uint f-index) 361*3d8817e4Smiod(dnop execode "execcode" () h-uint f-excode) 362*3d8817e4Smiod(dnop bytecount "byte count" () h-uint f-bytecount) 363*3d8817e4Smiod(dnop cam-y "cam global opn y" () h-uint f-cam-y) 364*3d8817e4Smiod(dnop cam-z "cam global mask z" () h-uint f-cam-z) 365*3d8817e4Smiod(dnop cm-3func "CM 3 bit fn field" () h-uint f-cm-3func) 366*3d8817e4Smiod(dnop cm-4func "CM 4 bit fn field" () h-uint f-cm-4func) 367*3d8817e4Smiod(dnop cm-3z "CM 3 bit Z field" () h-uint f-cm-3z) 368*3d8817e4Smiod(dnop cm-4z "CM 4 bit Z field" () h-uint f-cm-4z) 369*3d8817e4Smiod 370*3d8817e4Smiod; Aliases for the rs and rt operands. This just makes the load/store 371*3d8817e4Smiod; insns easier to compare with the instruction set documentation. 372*3d8817e4Smiod 373*3d8817e4Smiod(dnop base "base register" () h-gr f-rs) 374*3d8817e4Smiod(dnop maskr "mask right" () h-uint f-rs) 375*3d8817e4Smiod(dnop bitnum "bit number" () h-uint f-rt) 376*3d8817e4Smiod 377*3d8817e4Smiod; For high(foo). 378*3d8817e4Smiod(define-operand 379*3d8817e4Smiod (name hi16) 380*3d8817e4Smiod (comment "high 16 bit immediate") 381*3d8817e4Smiod (attrs) 382*3d8817e4Smiod (type h-uint) 383*3d8817e4Smiod (index f-imm) 384*3d8817e4Smiod (handlers (parse "hi16")) 385*3d8817e4Smiod) 386*3d8817e4Smiod 387*3d8817e4Smiod; For low(foo). 388*3d8817e4Smiod(define-operand 389*3d8817e4Smiod (name lo16) 390*3d8817e4Smiod (comment "16 bit signed immediate, for low") 391*3d8817e4Smiod (attrs) 392*3d8817e4Smiod (type h-uint) 393*3d8817e4Smiod (index f-imm) 394*3d8817e4Smiod (handlers (parse "lo16")) 395*3d8817e4Smiod) 396*3d8817e4Smiod 397*3d8817e4Smiod; For negated imm. 398*3d8817e4Smiod(define-operand 399*3d8817e4Smiod (name mlo16) 400*3d8817e4Smiod (comment "negated 16 bit signed immediate") 401*3d8817e4Smiod (attrs) 402*3d8817e4Smiod (type h-uint) 403*3d8817e4Smiod (index f-imm) 404*3d8817e4Smiod (handlers (parse "mlo16")) 405*3d8817e4Smiod) 406*3d8817e4Smiod 407*3d8817e4Smiod; For iq10 jmps 408*3d8817e4Smiod; In the future, we'll want the j & jal to use the 21 bit target, with 409*3d8817e4Smiod; the upper five bits shifted up. For now, don't use this. 410*3d8817e4Smiod(define-operand 411*3d8817e4Smiod (name jmptargq10) 412*3d8817e4Smiod (comment "iq10 21-bit jump offset") 413*3d8817e4Smiod (attrs) 414*3d8817e4Smiod (type h-iaddr) 415*3d8817e4Smiod (index f-jtargq10) 416*3d8817e4Smiod (handlers (parse "jtargq10")) 417*3d8817e4Smiod) 418*3d8817e4Smiod 419*3d8817e4Smiod 420*3d8817e4Smiod; Instructions. 421*3d8817e4Smiod 422*3d8817e4Smiod; A pmacro for use in semantic bodies of unimplemented insns. 423*3d8817e4Smiod(define-pmacro (unimp mnemonic) (nop)) 424*3d8817e4Smiod 425*3d8817e4Smiod(define-pmacro (bitset? value bit-num) 426*3d8817e4Smiod (and value (sll 1 bit-num))) 427*3d8817e4Smiod 428*3d8817e4Smiod(define-pmacro (bitclear? value bit-num) 429*3d8817e4Smiod (not (bitset? value bit-num))) 430*3d8817e4Smiod 431*3d8817e4Smiod; Arithmetic/logic instructions. 432*3d8817e4Smiod 433*3d8817e4Smiod(dni add2 "add registers" (ALIAS NO-DIS USES-RD USES-RS USES-RT) 434*3d8817e4Smiod "add ${rd-rs},$rt" 435*3d8817e4Smiod (+ OP_SPECIAL rt rd-rs (f-shamt 0) FUNC_ADD) 436*3d8817e4Smiod (set rd-rs (add rt rd-rs)) 437*3d8817e4Smiod ()) 438*3d8817e4Smiod 439*3d8817e4Smiod(dni add "add registers" (USES-RD USES-RS USES-RT) 440*3d8817e4Smiod "add $rd,$rs,$rt" 441*3d8817e4Smiod (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_ADD) 442*3d8817e4Smiod (set rd (add rs rt)) 443*3d8817e4Smiod ()) 444*3d8817e4Smiod 445*3d8817e4Smiod 446*3d8817e4Smiod(dni addi2 "add immediate" (ALIAS NO-DIS USES-RS USES-RT) 447*3d8817e4Smiod "addi ${rt-rs},$lo16" 448*3d8817e4Smiod (+ OP_ADDI rt-rs lo16) 449*3d8817e4Smiod (set rt-rs (add rt-rs (ext SI (trunc HI lo16)))) 450*3d8817e4Smiod ()) 451*3d8817e4Smiod 452*3d8817e4Smiod(dni addi "add immediate" (USES-RS USES-RT) 453*3d8817e4Smiod "addi $rt,$rs,$lo16" 454*3d8817e4Smiod (+ OP_ADDI rs rt lo16) 455*3d8817e4Smiod (set rt (add rs (ext SI (trunc HI lo16)))) 456*3d8817e4Smiod ()) 457*3d8817e4Smiod 458*3d8817e4Smiod(dni addiu2 "add immediate unsigned" (ALIAS NO-DIS USES-RS USES-RT) 459*3d8817e4Smiod "addiu ${rt-rs},$lo16" 460*3d8817e4Smiod (+ OP_ADDIU rt-rs lo16) 461*3d8817e4Smiod (set rt-rs (add rt-rs (ext SI (trunc HI lo16)))) 462*3d8817e4Smiod ()) 463*3d8817e4Smiod 464*3d8817e4Smiod(dni addiu "add immediate unsigned" (USES-RS USES-RT) 465*3d8817e4Smiod "addiu $rt,$rs,$lo16" 466*3d8817e4Smiod (+ OP_ADDIU rs rt lo16) 467*3d8817e4Smiod (set rt (add rs (ext SI (trunc HI lo16)))) 468*3d8817e4Smiod ()) 469*3d8817e4Smiod 470*3d8817e4Smiod(dni addu2 "add unsigned" (ALIAS NO-DIS USES-RD USES-RS USES-RT) 471*3d8817e4Smiod "addu ${rd-rs},$rt" 472*3d8817e4Smiod (+ OP_SPECIAL rd-rs rt (f-shamt 0) FUNC_ADDU) 473*3d8817e4Smiod (set rd-rs (add rd-rs rt)) 474*3d8817e4Smiod ()) 475*3d8817e4Smiod 476*3d8817e4Smiod(dni addu "add unsigned" (USES-RD USES-RS USES-RT) 477*3d8817e4Smiod "addu $rd,$rs,$rt" 478*3d8817e4Smiod (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_ADDU) 479*3d8817e4Smiod (set rd (add rs rt)) 480*3d8817e4Smiod ()) 481*3d8817e4Smiod 482*3d8817e4Smiod(dni ado162 "add 16, ones complement" (ALIAS NO-DIS USES-RD USES-RS USES-RT) 483*3d8817e4Smiod "ado16 ${rd-rs},$rt" 484*3d8817e4Smiod (+ OP_SPECIAL rd-rs rt (f-shamt 0) FUNC_ADO16) 485*3d8817e4Smiod (sequence ((HI high) (HI low)) 486*3d8817e4Smiod (set low (add HI (and HI rd-rs #xFFFF) (and HI rt #xFFFF))) 487*3d8817e4Smiod (set high (add HI (srl rd-rs 16) (srl rt 16))) 488*3d8817e4Smiod (set rd-rs (or SI (sll SI high 16) low))) 489*3d8817e4Smiod ()) 490*3d8817e4Smiod 491*3d8817e4Smiod(dni ado16 "add 16, ones complement" (USES-RD USES-RS USES-RT) 492*3d8817e4Smiod "ado16 $rd,$rs,$rt" 493*3d8817e4Smiod (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_ADO16) 494*3d8817e4Smiod (sequence ((HI high) (HI low)) 495*3d8817e4Smiod (set low (add HI (and HI rs #xFFFF) (and HI rt #xFFFF))) 496*3d8817e4Smiod (set high (add HI (srl rs 16) (srl rt 16))) 497*3d8817e4Smiod (set rd (or SI (sll SI high 16) low))) 498*3d8817e4Smiod ()) 499*3d8817e4Smiod 500*3d8817e4Smiod(dni and2 "and register" (ALIAS NO-DIS USES-RD USES-RS USES-RT) 501*3d8817e4Smiod "and ${rd-rs},$rt" 502*3d8817e4Smiod (+ OP_SPECIAL rd-rs rt (f-shamt 0) FUNC_AND) 503*3d8817e4Smiod (set rd-rs (and rd-rs rt)) 504*3d8817e4Smiod ()) 505*3d8817e4Smiod 506*3d8817e4Smiod(dni and "and register" (USES-RD USES-RS USES-RT) 507*3d8817e4Smiod "and $rd,$rs,$rt" 508*3d8817e4Smiod (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_AND) 509*3d8817e4Smiod (set rd (and rs rt)) 510*3d8817e4Smiod ()) 511*3d8817e4Smiod 512*3d8817e4Smiod(dni andi2 "and immediate" (ALIAS NO-DIS USES-RS USES-RT) 513*3d8817e4Smiod "andi ${rt-rs},$lo16" 514*3d8817e4Smiod (+ OP_ANDI rt-rs lo16) 515*3d8817e4Smiod (set rt-rs (and rt-rs (zext SI lo16))) 516*3d8817e4Smiod ()) 517*3d8817e4Smiod 518*3d8817e4Smiod(dni andi "and immediate" (USES-RS USES-RT) 519*3d8817e4Smiod "andi $rt,$rs,$lo16" 520*3d8817e4Smiod (+ OP_ANDI rs rt lo16) 521*3d8817e4Smiod (set rt (and rs (zext SI lo16))) 522*3d8817e4Smiod ()) 523*3d8817e4Smiod 524*3d8817e4Smiod(dni andoi2 "and ones immediate" (ALIAS NO-DIS USES-RS USES-RT) 525*3d8817e4Smiod "andoi ${rt-rs},$lo16" 526*3d8817e4Smiod (+ OP_ANDOI rt-rs lo16) 527*3d8817e4Smiod (set rt-rs (and rt-rs (or #xFFFF0000 (ext SI (trunc HI lo16))))) 528*3d8817e4Smiod ()) 529*3d8817e4Smiod 530*3d8817e4Smiod(dni andoi "and ones immediate" (USES-RS USES-RT) 531*3d8817e4Smiod "andoi $rt,$rs,$lo16" 532*3d8817e4Smiod (+ OP_ANDOI rs rt lo16) 533*3d8817e4Smiod (set rt (and rs (or #xFFFF0000 (ext SI (trunc HI lo16))))) 534*3d8817e4Smiod ()) 535*3d8817e4Smiod 536*3d8817e4Smiod(dni nor2 "nor" (ALIAS NO-DIS USES-RD USES-RS USES-RT) 537*3d8817e4Smiod "nor ${rd-rs},$rt" 538*3d8817e4Smiod (+ OP_SPECIAL rd-rs rt (f-shamt 0) FUNC_NOR) 539*3d8817e4Smiod (set rd-rs (inv (or rd-rs rt))) 540*3d8817e4Smiod ()) 541*3d8817e4Smiod 542*3d8817e4Smiod(dni nor "nor" (USES-RD USES-RS USES-RT) 543*3d8817e4Smiod "nor $rd,$rs,$rt" 544*3d8817e4Smiod (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_NOR) 545*3d8817e4Smiod (set rd (inv (or rs rt))) 546*3d8817e4Smiod ()) 547*3d8817e4Smiod 548*3d8817e4Smiod(dni or2 "or" (ALIAS NO-DIS USES-RD USES-RS USES-RT) 549*3d8817e4Smiod "or ${rd-rs},$rt" 550*3d8817e4Smiod (+ OP_SPECIAL rd-rs rt (f-shamt 0) FUNC_OR) 551*3d8817e4Smiod (set rd-rs (or rd-rs rt)) 552*3d8817e4Smiod ()) 553*3d8817e4Smiod 554*3d8817e4Smiod(dni or "or" (USES-RD USES-RS USES-RT) 555*3d8817e4Smiod "or $rd,$rs,$rt" 556*3d8817e4Smiod (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_OR) 557*3d8817e4Smiod (set rd (or rs rt)) 558*3d8817e4Smiod ()) 559*3d8817e4Smiod 560*3d8817e4Smiod(dni ori2 "or immediate" (ALIAS NO-DIS USES-RS USES-RT) 561*3d8817e4Smiod "ori ${rt-rs},$lo16" 562*3d8817e4Smiod (+ OP_ORI rt-rs lo16) 563*3d8817e4Smiod (set rt-rs (or rt-rs (zext SI lo16))) 564*3d8817e4Smiod ()) 565*3d8817e4Smiod 566*3d8817e4Smiod(dni ori "or immediate" (USES-RS USES-RT) 567*3d8817e4Smiod "ori $rt,$rs,$lo16" 568*3d8817e4Smiod (+ OP_ORI rs rt lo16) 569*3d8817e4Smiod (set rt (or rs (zext SI lo16))) 570*3d8817e4Smiod ()) 571*3d8817e4Smiod 572*3d8817e4Smiod(dni ram "rotate and mask" (USES-RD USES-RT) 573*3d8817e4Smiod "ram $rd,$rt,$shamt,$maskl,$maskr" 574*3d8817e4Smiod (+ OP_RAM maskr rt rd shamt (f-5 0) maskl) 575*3d8817e4Smiod (sequence () 576*3d8817e4Smiod (set rd (ror rt shamt)) 577*3d8817e4Smiod (set rd (and rd (srl #xFFFFFFFF maskl))) 578*3d8817e4Smiod (set rd (and rd (sll #xFFFFFFFF maskr)))) 579*3d8817e4Smiod ()) 580*3d8817e4Smiod 581*3d8817e4Smiod(dni sll "shift left logical" (USES-RD USES-RT) 582*3d8817e4Smiod "sll $rd,$rt,$shamt" 583*3d8817e4Smiod (+ OP_SPECIAL (f-rs 0) rt rd shamt (f-func 0)) 584*3d8817e4Smiod (set rd (sll rt shamt)) 585*3d8817e4Smiod ()) 586*3d8817e4Smiod 587*3d8817e4Smiod(dni sllv2 "shift left logical variable" (ALIAS NO-DIS USES-RD USES-RS USES-RT) 588*3d8817e4Smiod "sllv ${rd-rt},$rs" 589*3d8817e4Smiod (+ OP_SPECIAL rs rd-rt (f-shamt 0) FUNC_SLLV) 590*3d8817e4Smiod (set rd-rt (sll rd-rt (and rs #x1F))) 591*3d8817e4Smiod ()) 592*3d8817e4Smiod 593*3d8817e4Smiod(dni sllv "shift left logical variable" (USES-RD USES-RS USES-RT) 594*3d8817e4Smiod "sllv $rd,$rt,$rs" 595*3d8817e4Smiod (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_SLLV) 596*3d8817e4Smiod (set rd (sll rt (and rs #x1F))) 597*3d8817e4Smiod ()) 598*3d8817e4Smiod 599*3d8817e4Smiod(dni slmv2 "shift left and mask variable" (ALIAS NO-DIS USES-RD USES-RS USES-RT) 600*3d8817e4Smiod "slmv ${rd-rt},$rs,$shamt" 601*3d8817e4Smiod (+ OP_SPECIAL rs rd-rt shamt FUNC_SLMV) 602*3d8817e4Smiod (set rd-rt (and (sll rd-rt shamt) (srl #xFFFFFFFF rs))) 603*3d8817e4Smiod ()) 604*3d8817e4Smiod 605*3d8817e4Smiod(dni slmv "shift left and mask variable" (USES-RD USES-RS USES-RT) 606*3d8817e4Smiod "slmv $rd,$rt,$rs,$shamt" 607*3d8817e4Smiod (+ OP_SPECIAL rs rt rd shamt FUNC_SLMV) 608*3d8817e4Smiod (set rd (and (sll rt shamt) (srl #xFFFFFFFF rs))) 609*3d8817e4Smiod ()) 610*3d8817e4Smiod 611*3d8817e4Smiod(dni slt2 "set if less than" (ALIAS NO-DIS USES-RD USES-RS USES-RT) 612*3d8817e4Smiod "slt ${rd-rs},$rt" 613*3d8817e4Smiod (+ OP_SPECIAL rt rd-rs (f-shamt 0) FUNC_SLT) 614*3d8817e4Smiod (if (lt rd-rs rt) 615*3d8817e4Smiod (set rd-rs 1) 616*3d8817e4Smiod (set rd-rs 0)) 617*3d8817e4Smiod ()) 618*3d8817e4Smiod 619*3d8817e4Smiod(dni slt "set if less than" (USES-RD USES-RS USES-RT) 620*3d8817e4Smiod "slt $rd,$rs,$rt" 621*3d8817e4Smiod (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_SLT) 622*3d8817e4Smiod (if (lt rs rt) 623*3d8817e4Smiod (set rd 1) 624*3d8817e4Smiod (set rd 0)) 625*3d8817e4Smiod ()) 626*3d8817e4Smiod 627*3d8817e4Smiod(dni slti2 "set if less than immediate" (ALIAS NO-DIS USES-RS USES-RT) 628*3d8817e4Smiod "slti ${rt-rs},$imm" 629*3d8817e4Smiod (+ OP_SLTI rt-rs imm) 630*3d8817e4Smiod (if (lt rt-rs (ext SI (trunc HI imm))) 631*3d8817e4Smiod (set rt-rs 1) 632*3d8817e4Smiod (set rt-rs 0)) 633*3d8817e4Smiod ()) 634*3d8817e4Smiod 635*3d8817e4Smiod(dni slti "set if less than immediate" (USES-RS USES-RT) 636*3d8817e4Smiod "slti $rt,$rs,$imm" 637*3d8817e4Smiod (+ OP_SLTI rs rt imm) 638*3d8817e4Smiod (if (lt rs (ext SI (trunc HI imm))) 639*3d8817e4Smiod (set rt 1) 640*3d8817e4Smiod (set rt 0)) 641*3d8817e4Smiod ()) 642*3d8817e4Smiod 643*3d8817e4Smiod(dni sltiu2 "set if less than immediate unsigned" (ALIAS NO-DIS USES-RS USES-RT) 644*3d8817e4Smiod "sltiu ${rt-rs},$imm" 645*3d8817e4Smiod (+ OP_SLTIU rt-rs imm) 646*3d8817e4Smiod (if (ltu rt-rs (ext SI (trunc HI imm))) 647*3d8817e4Smiod (set rt-rs 1) 648*3d8817e4Smiod (set rt-rs 0)) 649*3d8817e4Smiod ()) 650*3d8817e4Smiod 651*3d8817e4Smiod(dni sltiu "set if less than immediate unsigned" (USES-RS USES-RT) 652*3d8817e4Smiod "sltiu $rt,$rs,$imm" 653*3d8817e4Smiod (+ OP_SLTIU rs rt imm) 654*3d8817e4Smiod (if (ltu rs (ext SI (trunc HI imm))) 655*3d8817e4Smiod (set rt 1) 656*3d8817e4Smiod (set rt 0)) 657*3d8817e4Smiod ()) 658*3d8817e4Smiod 659*3d8817e4Smiod(dni sltu2 "set if less than unsigned" (ALIAS NO-DIS USES-RD USES-RS USES-RT) 660*3d8817e4Smiod "sltu ${rd-rs},$rt" 661*3d8817e4Smiod (+ OP_SPECIAL rd-rs rt (f-shamt 0) FUNC_SLTU) 662*3d8817e4Smiod (if (ltu rd-rs rt) 663*3d8817e4Smiod (set rd-rs 1) 664*3d8817e4Smiod (set rd-rs 0)) 665*3d8817e4Smiod ()) 666*3d8817e4Smiod 667*3d8817e4Smiod(dni sltu "set if less than unsigned" (USES-RD USES-RS USES-RT) 668*3d8817e4Smiod "sltu $rd,$rs,$rt" 669*3d8817e4Smiod (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_SLTU) 670*3d8817e4Smiod (if (ltu rs rt) 671*3d8817e4Smiod (set rd 1) 672*3d8817e4Smiod (set rd 0)) 673*3d8817e4Smiod ()) 674*3d8817e4Smiod 675*3d8817e4Smiod(dni sra2 "shift right arithmetic" (ALIAS NO-DIS USES-RD USES-RT) 676*3d8817e4Smiod "sra ${rd-rt},$shamt" 677*3d8817e4Smiod (+ OP_SPECIAL (f-rs 0) rd-rt shamt FUNC_SRA) 678*3d8817e4Smiod (set rd-rt (sra rd-rt shamt)) 679*3d8817e4Smiod ()) 680*3d8817e4Smiod 681*3d8817e4Smiod(dni sra "shift right arithmetic" (USES-RD USES-RT) 682*3d8817e4Smiod "sra $rd,$rt,$shamt" 683*3d8817e4Smiod (+ OP_SPECIAL (f-rs 0) rt rd shamt FUNC_SRA) 684*3d8817e4Smiod (set rd (sra rt shamt)) 685*3d8817e4Smiod ()) 686*3d8817e4Smiod 687*3d8817e4Smiod(dni srav2 "shift right arithmetic variable" (ALIAS NO-DIS USES-RD USES-RS USES-RT) 688*3d8817e4Smiod "srav ${rd-rt},$rs" 689*3d8817e4Smiod (+ OP_SPECIAL rs rd-rt (f-shamt 0) FUNC_SRAV) 690*3d8817e4Smiod (set rd-rt (sra rd-rt (and rs #x1F))) 691*3d8817e4Smiod ()) 692*3d8817e4Smiod 693*3d8817e4Smiod(dni srav "shift right arithmetic variable" (USES-RD USES-RS USES-RT) 694*3d8817e4Smiod "srav $rd,$rt,$rs" 695*3d8817e4Smiod (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_SRAV) 696*3d8817e4Smiod (set rd (sra rt (and rs #x1F))) 697*3d8817e4Smiod ()) 698*3d8817e4Smiod 699*3d8817e4Smiod(dni srl "shift right logical" (USES-RD USES-RT) 700*3d8817e4Smiod "srl $rd,$rt,$shamt" 701*3d8817e4Smiod (+ OP_SPECIAL (f-rs 0) rt rd shamt FUNC_SRL) 702*3d8817e4Smiod (set rd (srl rt shamt)) 703*3d8817e4Smiod ()) 704*3d8817e4Smiod 705*3d8817e4Smiod(dni srlv2 "shift right logical variable" (ALIAS NO-DIS USES-RD USES-RS USES-RT) 706*3d8817e4Smiod "srlv ${rd-rt},$rs" 707*3d8817e4Smiod (+ OP_SPECIAL rs rd-rt (f-shamt 0) FUNC_SRLV) 708*3d8817e4Smiod (set rd-rt (srl rd-rt (and rs #x1F))) 709*3d8817e4Smiod ()) 710*3d8817e4Smiod 711*3d8817e4Smiod(dni srlv "shift right logical variable" (USES-RD USES-RS USES-RT) 712*3d8817e4Smiod "srlv $rd,$rt,$rs" 713*3d8817e4Smiod (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_SRLV) 714*3d8817e4Smiod (set rd (srl rt (and rs #x1F))) 715*3d8817e4Smiod ()) 716*3d8817e4Smiod 717*3d8817e4Smiod(dni srmv2 "shift right and mask variable" (ALIAS NO-DIS USES-RD USES-RS USES-RT) 718*3d8817e4Smiod "srmv ${rd-rt},$rs,$shamt" 719*3d8817e4Smiod (+ OP_SPECIAL rs rd-rt shamt FUNC_SRMV) 720*3d8817e4Smiod (set rd-rt (and (srl rd-rt shamt) (sll #xFFFFFFFF rs))) 721*3d8817e4Smiod ()) 722*3d8817e4Smiod 723*3d8817e4Smiod(dni srmv "shift right and mask variable" (USES-RD USES-RS USES-RT) 724*3d8817e4Smiod "srmv $rd,$rt,$rs,$shamt" 725*3d8817e4Smiod (+ OP_SPECIAL rs rt rd shamt FUNC_SRMV) 726*3d8817e4Smiod (set rd (and (srl rt shamt) (sll #xFFFFFFFF rs))) 727*3d8817e4Smiod ()) 728*3d8817e4Smiod 729*3d8817e4Smiod(dni sub2 "subtract" (ALIAS NO-DIS USES-RD USES-RS USES-RT) 730*3d8817e4Smiod "sub ${rd-rs},$rt" 731*3d8817e4Smiod (+ OP_SPECIAL rt rd-rs (f-shamt 0) FUNC_SUB) 732*3d8817e4Smiod (set rd-rs (sub rd-rs rt)) 733*3d8817e4Smiod ()) 734*3d8817e4Smiod 735*3d8817e4Smiod(dni sub "subtract" (USES-RD USES-RS USES-RT) 736*3d8817e4Smiod "sub $rd,$rs,$rt" 737*3d8817e4Smiod (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_SUB) 738*3d8817e4Smiod (set rd (sub rs rt)) 739*3d8817e4Smiod ()) 740*3d8817e4Smiod 741*3d8817e4Smiod(dni subu2 "subtract unsigned" (ALIAS NO-DIS USES-RD USES-RS USES-RT) 742*3d8817e4Smiod "subu ${rd-rs},$rt" 743*3d8817e4Smiod (+ OP_SPECIAL rt rd-rs (f-shamt 0) FUNC_SUBU) 744*3d8817e4Smiod (set rd-rs (sub rd-rs rt)) 745*3d8817e4Smiod ()) 746*3d8817e4Smiod 747*3d8817e4Smiod(dni subu "subtract unsigned" (USES-RD USES-RS USES-RT) 748*3d8817e4Smiod "subu $rd,$rs,$rt" 749*3d8817e4Smiod (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_SUBU) 750*3d8817e4Smiod (set rd (sub rs rt)) 751*3d8817e4Smiod ()) 752*3d8817e4Smiod 753*3d8817e4Smiod(dni xor2 "exclusive or" (ALIAS NO-DIS USES-RD USES-RS USES-RT) 754*3d8817e4Smiod "xor ${rd-rs},$rt" 755*3d8817e4Smiod (+ OP_SPECIAL rt rd-rs (f-shamt 0) FUNC_XOR) 756*3d8817e4Smiod (set rd-rs (xor rd-rs rt)) 757*3d8817e4Smiod ()) 758*3d8817e4Smiod 759*3d8817e4Smiod(dni xor "exclusive or" (USES-RD USES-RS USES-RT) 760*3d8817e4Smiod "xor $rd,$rs,$rt" 761*3d8817e4Smiod (+ OP_SPECIAL rs rt rd (f-shamt 0) FUNC_XOR) 762*3d8817e4Smiod (set rd (xor rs rt)) 763*3d8817e4Smiod ()) 764*3d8817e4Smiod 765*3d8817e4Smiod(dni xori2 "exclusive or immediate" (ALIAS NO-DIS USES-RS USES-RT) 766*3d8817e4Smiod "xori ${rt-rs},$lo16" 767*3d8817e4Smiod (+ OP_XORI rt-rs lo16) 768*3d8817e4Smiod (set rt-rs (xor rt-rs (zext SI lo16))) 769*3d8817e4Smiod ()) 770*3d8817e4Smiod 771*3d8817e4Smiod(dni xori "exclusive or immediate" (USES-RS USES-RT) 772*3d8817e4Smiod "xori $rt,$rs,$lo16" 773*3d8817e4Smiod (+ OP_XORI rs rt lo16) 774*3d8817e4Smiod (set rt (xor rs (zext SI lo16))) 775*3d8817e4Smiod ()) 776*3d8817e4Smiod 777*3d8817e4Smiod 778*3d8817e4Smiod; Branch instructions. 779*3d8817e4Smiod 780*3d8817e4Smiod(dni bbi "branch bit immediate" (USES-RS) 781*3d8817e4Smiod "bbi $rs($bitnum),$offset" 782*3d8817e4Smiod (+ OP_BBI rs bitnum offset) 783*3d8817e4Smiod (if (bitset? rs bitnum) 784*3d8817e4Smiod (delay 1 (set pc offset))) 785*3d8817e4Smiod ()) 786*3d8817e4Smiod 787*3d8817e4Smiod(dni bbin "branch bit immediate negated" (USES-RS) 788*3d8817e4Smiod "bbin $rs($bitnum),$offset" 789*3d8817e4Smiod (+ OP_BBIN rs bitnum offset) 790*3d8817e4Smiod (if (bitclear? rs bitnum) 791*3d8817e4Smiod (delay 1 (set pc offset))) 792*3d8817e4Smiod ()) 793*3d8817e4Smiod 794*3d8817e4Smiod(dni bbv "branch bit variable" (USES-RS USES-RT) 795*3d8817e4Smiod "bbv $rs,$rt,$offset" 796*3d8817e4Smiod (+ OP_BBV rs rt offset) 797*3d8817e4Smiod (if (bitset? rs (and rt #x1F)) 798*3d8817e4Smiod (delay 1 (set pc offset))) 799*3d8817e4Smiod ()) 800*3d8817e4Smiod 801*3d8817e4Smiod(dni bbvn "branch bit variable negated" (USES-RS USES-RT) 802*3d8817e4Smiod "bbvn $rs,$rt,$offset" 803*3d8817e4Smiod (+ OP_BBVN rs rt offset) 804*3d8817e4Smiod (if (bitclear? rs (and rt #x1F)) 805*3d8817e4Smiod (delay 1 (set pc offset))) 806*3d8817e4Smiod ()) 807*3d8817e4Smiod 808*3d8817e4Smiod(dni beq "branch if equal" (USES-RS USES-RT) 809*3d8817e4Smiod "beq $rs,$rt,$offset" 810*3d8817e4Smiod (+ OP_BEQ rs rt offset) 811*3d8817e4Smiod (if (eq rs rt) 812*3d8817e4Smiod (delay 1 (set pc offset))) 813*3d8817e4Smiod ()) 814*3d8817e4Smiod 815*3d8817e4Smiod(dni beql "branch if equal likely" (USES-RS USES-RT) 816*3d8817e4Smiod "beql $rs,$rt,$offset" 817*3d8817e4Smiod (+ OP_BEQL rs rt offset) 818*3d8817e4Smiod (if (eq rs rt) 819*3d8817e4Smiod (delay 1 (set pc offset)) 820*3d8817e4Smiod (skip 1)) 821*3d8817e4Smiod ()) 822*3d8817e4Smiod 823*3d8817e4Smiod(dni bgez "branch if greater than or equal to zero" (USES-RS) 824*3d8817e4Smiod "bgez $rs,$offset" 825*3d8817e4Smiod (+ OP_REGIMM rs FUNC_BGEZ offset) 826*3d8817e4Smiod (if (ge rs 0) 827*3d8817e4Smiod (delay 1 (set pc offset))) 828*3d8817e4Smiod ()) 829*3d8817e4Smiod 830*3d8817e4Smiod(dni bgezal "branch if greater than or equal to zero and link" (USES-RS USES-R31) 831*3d8817e4Smiod "bgezal $rs,$offset" 832*3d8817e4Smiod (+ OP_REGIMM rs FUNC_BGEZAL offset) 833*3d8817e4Smiod (if (ge rs 0) 834*3d8817e4Smiod (sequence () 835*3d8817e4Smiod (set (reg h-gr 31) (add pc 8)) 836*3d8817e4Smiod (delay 1 (set pc offset)))) 837*3d8817e4Smiod ()) 838*3d8817e4Smiod 839*3d8817e4Smiod(dni bgezall 840*3d8817e4Smiod "branch if greater than equal to zero and link likely" (USES-RS USES-R31) 841*3d8817e4Smiod "bgezall $rs,$offset" 842*3d8817e4Smiod (+ OP_REGIMM rs FUNC_BGEZALL offset) 843*3d8817e4Smiod (if (ge rs 0) 844*3d8817e4Smiod (sequence () 845*3d8817e4Smiod (set (reg h-gr 31) (add pc 8)) 846*3d8817e4Smiod (delay 1 (set pc offset))) 847*3d8817e4Smiod (skip 1)) 848*3d8817e4Smiod ()) 849*3d8817e4Smiod 850*3d8817e4Smiod(dni bgezl "branch if greater or equal to zero likely" (USES-RS) 851*3d8817e4Smiod "bgezl $rs,$offset" 852*3d8817e4Smiod (+ OP_REGIMM rs FUNC_BGEZL offset) 853*3d8817e4Smiod (if (ge rs 0) 854*3d8817e4Smiod (delay 1 (set pc offset)) 855*3d8817e4Smiod (skip 1)) 856*3d8817e4Smiod ()) 857*3d8817e4Smiod 858*3d8817e4Smiod(dni bltz "branch if less than zero" (USES-RS) 859*3d8817e4Smiod "bltz $rs,$offset" 860*3d8817e4Smiod (+ OP_REGIMM rs FUNC_BLTZ offset) 861*3d8817e4Smiod (if (lt rs 0) 862*3d8817e4Smiod (delay 1 (set pc offset))) 863*3d8817e4Smiod ()) 864*3d8817e4Smiod 865*3d8817e4Smiod(dni bltzl "branch if less than zero likely" (USES-RS) 866*3d8817e4Smiod "bltzl $rs,$offset" 867*3d8817e4Smiod (+ OP_REGIMM rs FUNC_BLTZL offset) 868*3d8817e4Smiod (if (lt rs 0) 869*3d8817e4Smiod (delay 1 (set pc offset)) 870*3d8817e4Smiod (skip 1)) 871*3d8817e4Smiod ()) 872*3d8817e4Smiod 873*3d8817e4Smiod(dni bltzal "branch if less than zero and link" (USES-RS USES-R31) 874*3d8817e4Smiod "bltzal $rs,$offset" 875*3d8817e4Smiod (+ OP_REGIMM rs FUNC_BLTZAL offset) 876*3d8817e4Smiod (if (lt rs 0) 877*3d8817e4Smiod (sequence () 878*3d8817e4Smiod (set (reg h-gr 31) (add pc 8)) 879*3d8817e4Smiod (delay 1 (set pc offset)))) 880*3d8817e4Smiod ()) 881*3d8817e4Smiod 882*3d8817e4Smiod(dni bltzall "branch if less than zero and link likely" (USES-RS USES-R31) 883*3d8817e4Smiod "bltzall $rs,$offset" 884*3d8817e4Smiod (+ OP_REGIMM rs FUNC_BLTZALL offset) 885*3d8817e4Smiod (if (lt rs 0) 886*3d8817e4Smiod (sequence () 887*3d8817e4Smiod (set (reg h-gr 31) (add pc 8)) 888*3d8817e4Smiod (delay 1 (set pc offset))) 889*3d8817e4Smiod (skip 1)) 890*3d8817e4Smiod ()) 891*3d8817e4Smiod 892*3d8817e4Smiod(dni bmb0 "branch if matching byte-lane 0" (USES-RS USES-RT) 893*3d8817e4Smiod "bmb0 $rs,$rt,$offset" 894*3d8817e4Smiod (+ OP_BMB0 rs rt offset) 895*3d8817e4Smiod (if (eq (and rs #xFF) (and rt #xFF)) 896*3d8817e4Smiod (delay 1 (set pc offset))) 897*3d8817e4Smiod ()) 898*3d8817e4Smiod 899*3d8817e4Smiod(dni bmb1 "branch if matching byte-lane 1" (USES-RS USES-RT) 900*3d8817e4Smiod "bmb1 $rs,$rt,$offset" 901*3d8817e4Smiod (+ OP_BMB1 rs rt offset) 902*3d8817e4Smiod (if (eq (and rs #xFF00) (and rt #xFF00)) 903*3d8817e4Smiod (delay 1 (set pc offset))) 904*3d8817e4Smiod ()) 905*3d8817e4Smiod 906*3d8817e4Smiod(dni bmb2 "branch if matching byte-lane 2" (USES-RS USES-RT) 907*3d8817e4Smiod "bmb2 $rs,$rt,$offset" 908*3d8817e4Smiod (+ OP_BMB2 rs rt offset) 909*3d8817e4Smiod (if (eq (and rs #xFF0000) (and rt #xFF0000)) 910*3d8817e4Smiod (delay 1 (set pc offset))) 911*3d8817e4Smiod ()) 912*3d8817e4Smiod 913*3d8817e4Smiod(dni bmb3 "branch if matching byte-lane 3" (USES-RS USES-RT) 914*3d8817e4Smiod "bmb3 $rs,$rt,$offset" 915*3d8817e4Smiod (+ OP_BMB3 rs rt offset) 916*3d8817e4Smiod (if (eq (and rs #xFF000000) (and rt #xFF000000)) 917*3d8817e4Smiod (delay 1 (set pc offset))) 918*3d8817e4Smiod ()) 919*3d8817e4Smiod 920*3d8817e4Smiod(dni bne "branch if not equal" (USES-RS USES-RT) 921*3d8817e4Smiod "bne $rs,$rt,$offset" 922*3d8817e4Smiod (+ OP_BNE rs rt offset) 923*3d8817e4Smiod (if (ne rs rt) 924*3d8817e4Smiod (delay 1 (set pc offset))) 925*3d8817e4Smiod ()) 926*3d8817e4Smiod 927*3d8817e4Smiod(dni bnel "branch if not equal likely" (USES-RS USES-RT) 928*3d8817e4Smiod "bnel $rs,$rt,$offset" 929*3d8817e4Smiod (+ OP_BNEL rs rt offset) 930*3d8817e4Smiod (if (ne rs rt) 931*3d8817e4Smiod (delay 1 (set pc offset)) 932*3d8817e4Smiod (skip 1)) 933*3d8817e4Smiod ()) 934*3d8817e4Smiod 935*3d8817e4Smiod 936*3d8817e4Smiod 937*3d8817e4Smiod 938*3d8817e4Smiod; Jump instructions. 939*3d8817e4Smiod; Might as well jump! 940*3d8817e4Smiod 941*3d8817e4Smiod(dni jalr "jump and link register" (USES-RD USES-RS) 942*3d8817e4Smiod "jalr $rd,$rs" 943*3d8817e4Smiod (+ OP_SPECIAL rs (f-rt 0) rd (f-shamt 0) FUNC_JALR) 944*3d8817e4Smiod (delay 1 945*3d8817e4Smiod (sequence () 946*3d8817e4Smiod (set rd (add pc 8)) 947*3d8817e4Smiod (set pc rs))) 948*3d8817e4Smiod ()) 949*3d8817e4Smiod 950*3d8817e4Smiod(dni jr "jump register" (USES-RS) 951*3d8817e4Smiod "jr $rs" 952*3d8817e4Smiod (+ OP_SPECIAL rs (f-rt 0) (f-rd 0) (f-shamt 0) FUNC_JR) 953*3d8817e4Smiod (delay 1 (set pc rs)) 954*3d8817e4Smiod ()) 955*3d8817e4Smiod 956*3d8817e4Smiod 957*3d8817e4Smiod; Load instructions. 958*3d8817e4Smiod 959*3d8817e4Smiod(dni lb "load byte" (LOAD-DELAY USES-RS USES-RT) 960*3d8817e4Smiod "lb $rt,$lo16($base)" 961*3d8817e4Smiod (+ OP_LB base rt lo16) 962*3d8817e4Smiod (set rt (ext WI (mem QI (add base (ext SI (trunc HI lo16)))))) 963*3d8817e4Smiod; (sequence ((SI addr) (SI word)) 964*3d8817e4Smiod; (set addr (add base lo16)) 965*3d8817e4Smiod; (set word (mem SI (and addr (inv 3)))) 966*3d8817e4Smiod; (set word (srl word (sll (and addr 2) 3))) 967*3d8817e4Smiod; (set rt (ext SI word))) 968*3d8817e4Smiod ()) 969*3d8817e4Smiod 970*3d8817e4Smiod(dni lbu "load byte unsigned" (LOAD-DELAY USES-RS USES-RT) 971*3d8817e4Smiod "lbu $rt,$lo16($base)" 972*3d8817e4Smiod (+ OP_LBU base rt lo16) 973*3d8817e4Smiod (set rt (zext WI (mem QI (add base (ext SI (trunc HI lo16)))))) 974*3d8817e4Smiod; (sequence ((SI addr) (SI word)) 975*3d8817e4Smiod; (set addr (add base lo16)) 976*3d8817e4Smiod; (set word (mem SI (and addr (inv 3)))) 977*3d8817e4Smiod; (set rt (srl word (sll (and addr 2) 3)))) 978*3d8817e4Smiod ()) 979*3d8817e4Smiod 980*3d8817e4Smiod(dni lh "load half word" (LOAD-DELAY USES-RS USES-RT) 981*3d8817e4Smiod "lh $rt,$lo16($base)" 982*3d8817e4Smiod (+ OP_LH base rt lo16) 983*3d8817e4Smiod (set rt (ext WI (mem HI (add base (ext SI (trunc HI lo16)))))) 984*3d8817e4Smiod; (sequence ((SI addr) (HI word)) 985*3d8817e4Smiod; (set addr (add base lo16)) 986*3d8817e4Smiod; (set word (mem SI (and addr (inv 3)))) 987*3d8817e4Smiod; (set word (srl word (sll (and addr 1) 4))) 988*3d8817e4Smiod; (set rt (ext SI word))) 989*3d8817e4Smiod ()) 990*3d8817e4Smiod 991*3d8817e4Smiod(dni lhu "load half word unsigned" (LOAD-DELAY USES-RS USES-RT) 992*3d8817e4Smiod "lhu $rt,$lo16($base)" 993*3d8817e4Smiod (+ OP_LHU base rt lo16) 994*3d8817e4Smiod (set rt (zext WI (mem HI (add base (ext SI (trunc HI lo16)))))) 995*3d8817e4Smiod; (sequence ((SI addr) (SI word)) 996*3d8817e4Smiod; (set addr (add base lo16)) 997*3d8817e4Smiod; (set word (mem SI (and addr (inv 3)))) 998*3d8817e4Smiod; (set rt (srl word (sll (and addr 1) 4)))) 999*3d8817e4Smiod ()) 1000*3d8817e4Smiod 1001*3d8817e4Smiod(dni lui "load upper immediate" (USES-RT) 1002*3d8817e4Smiod "lui $rt,$hi16" 1003*3d8817e4Smiod (+ OP_LUI (f-rs 0) rt hi16) 1004*3d8817e4Smiod (set rt (sll hi16 16)) 1005*3d8817e4Smiod ()) 1006*3d8817e4Smiod 1007*3d8817e4Smiod(dni lw "load word" (LOAD-DELAY USES-RS USES-RT) 1008*3d8817e4Smiod "lw $rt,$lo16($base)" 1009*3d8817e4Smiod (+ OP_LW base rt lo16) 1010*3d8817e4Smiod (set rt (mem SI (add base (ext SI (trunc HI lo16))))) 1011*3d8817e4Smiod ()) 1012*3d8817e4Smiod 1013*3d8817e4Smiod 1014*3d8817e4Smiod; Store instructions. 1015*3d8817e4Smiod 1016*3d8817e4Smiod(dni sb "store byte" (USES-RS USES-RT) 1017*3d8817e4Smiod "sb $rt,$lo16($base)" 1018*3d8817e4Smiod (+ OP_SB base rt lo16) 1019*3d8817e4Smiod (set (mem QI (add base (ext SI (trunc HI lo16)))) (and QI rt #xFF)) 1020*3d8817e4Smiod ()) 1021*3d8817e4Smiod 1022*3d8817e4Smiod(dni sh "store half word" (USES-RS USES-RT) 1023*3d8817e4Smiod "sh $rt,$lo16($base)" 1024*3d8817e4Smiod (+ OP_SH base rt lo16) 1025*3d8817e4Smiod (set (mem HI (add base (ext SI (trunc HI lo16)))) (and HI rt #xFFFF)) 1026*3d8817e4Smiod ()) 1027*3d8817e4Smiod 1028*3d8817e4Smiod(dni sw "store word" (USES-RS USES-RT) 1029*3d8817e4Smiod "sw $rt,$lo16($base)" 1030*3d8817e4Smiod (+ OP_SW base rt lo16) 1031*3d8817e4Smiod (set (mem SI (add base (ext SI (trunc HI lo16)))) rt) 1032*3d8817e4Smiod ()) 1033*3d8817e4Smiod 1034*3d8817e4Smiod 1035*3d8817e4Smiod; Special instructions for simulation/debugging 1036*3d8817e4Smiod(dni break "breakpoint" () 1037*3d8817e4Smiod "break" 1038*3d8817e4Smiod (+ OP_SPECIAL (f-rs 0) (f-rt 0) (f-rd 0) (f-shamt 0) FUNC_BREAK) 1039*3d8817e4Smiod (c-call VOID "do_break" pc) 1040*3d8817e4Smiod ()) 1041*3d8817e4Smiod 1042*3d8817e4Smiod(dni syscall "system call" (YIELD-INSN) 1043*3d8817e4Smiod "syscall" 1044*3d8817e4Smiod (+ OP_SPECIAL execode (f-func 12)) 1045*3d8817e4Smiod (c-call VOID "do_syscall") 1046*3d8817e4Smiod ()) 1047*3d8817e4Smiod 1048*3d8817e4Smiod; Macro instructions, common to iq10 & iq2000 1049*3d8817e4Smiod 1050*3d8817e4Smiod(dnmi nop "nop" () 1051*3d8817e4Smiod "nop" 1052*3d8817e4Smiod (emit sll (rd 0) (rt 0) (shamt 0)) 1053*3d8817e4Smiod) 1054*3d8817e4Smiod 1055*3d8817e4Smiod(dnmi li "load immediate" (USES-RS NO-DIS) 1056*3d8817e4Smiod "li $rs,$imm" 1057*3d8817e4Smiod (emit ori (rt 0) rs imm) 1058*3d8817e4Smiod) 1059*3d8817e4Smiod 1060*3d8817e4Smiod(dnmi move "move" (USES-RD USES-RT NO-DIS) 1061*3d8817e4Smiod "move $rd,$rt" 1062*3d8817e4Smiod (emit or rd (rs 0) rt) 1063*3d8817e4Smiod) 1064*3d8817e4Smiod 1065*3d8817e4Smiod(dnmi lb-base-0 "load byte - implied base 0" (USES-RT NO-DIS) 1066*3d8817e4Smiod "lb $rt,$lo16" 1067*3d8817e4Smiod (emit lb rt lo16 (base 0)) 1068*3d8817e4Smiod) 1069*3d8817e4Smiod 1070*3d8817e4Smiod(dnmi lbu-base-0 "load byte unsigned - implied base 0" (USES-RT NO-DIS) 1071*3d8817e4Smiod "lbu $rt,$lo16" 1072*3d8817e4Smiod (emit lbu rt lo16 (base 0)) 1073*3d8817e4Smiod) 1074*3d8817e4Smiod 1075*3d8817e4Smiod(dnmi lh-base-0 "load half - implied base 0" (USES-RT NO-DIS) 1076*3d8817e4Smiod "lh $rt,$lo16" 1077*3d8817e4Smiod (emit lh rt lo16 (base 0)) 1078*3d8817e4Smiod) 1079*3d8817e4Smiod 1080*3d8817e4Smiod(dnmi lw-base-0 "load word - implied base 0" (USES-RT NO-DIS) 1081*3d8817e4Smiod "lw $rt,$lo16" 1082*3d8817e4Smiod (emit lw rt lo16 (base 0)) 1083*3d8817e4Smiod) 1084*3d8817e4Smiod 1085*3d8817e4Smiod(dnmi m-add "add immediate" (USES-RS USES-RT NO-DIS) 1086*3d8817e4Smiod "add $rt,$rs,$lo16" 1087*3d8817e4Smiod (emit addi rt rs lo16)) 1088*3d8817e4Smiod 1089*3d8817e4Smiod(dnmi m-addu "add immediate unsigned" (USES-RS USES-RT NO-DIS) 1090*3d8817e4Smiod "addu $rt,$rs,$lo16" 1091*3d8817e4Smiod (emit addiu rt rs lo16) 1092*3d8817e4Smiod) 1093*3d8817e4Smiod 1094*3d8817e4Smiod(dnmi m-and "and immediate" (USES-RS USES-RT NO-DIS) 1095*3d8817e4Smiod "and $rt,$rs,$lo16" 1096*3d8817e4Smiod (emit andi rt rs lo16) 1097*3d8817e4Smiod) 1098*3d8817e4Smiod 1099*3d8817e4Smiod(dnmi m-j "jump register" (USES-RS NO-DIS) 1100*3d8817e4Smiod "j $rs" 1101*3d8817e4Smiod (emit jr rs) 1102*3d8817e4Smiod) 1103*3d8817e4Smiod 1104*3d8817e4Smiod(dnmi m-or "or immediate" (USES-RS USES-RT NO-DIS) 1105*3d8817e4Smiod "or $rt,$rs,$lo16" 1106*3d8817e4Smiod (emit ori rt rs lo16) 1107*3d8817e4Smiod) 1108*3d8817e4Smiod 1109*3d8817e4Smiod(dnmi m-sll "shift left logical" (USES-RD USES-RT USES-RS NO-DIS) 1110*3d8817e4Smiod "sll $rd,$rt,$rs" 1111*3d8817e4Smiod (emit sllv rd rt rs) 1112*3d8817e4Smiod) 1113*3d8817e4Smiod 1114*3d8817e4Smiod(dnmi m-slt "slt immediate" (USES-RS USES-RT NO-DIS) 1115*3d8817e4Smiod "slt $rt,$rs,$imm" 1116*3d8817e4Smiod (emit slti rt rs imm) 1117*3d8817e4Smiod) 1118*3d8817e4Smiod 1119*3d8817e4Smiod(dnmi m-sltu "sltu immediate" (USES-RS USES-RT NO-DIS) 1120*3d8817e4Smiod "sltu $rt,$rs,$imm" 1121*3d8817e4Smiod (emit sltiu rt rs imm) 1122*3d8817e4Smiod) 1123*3d8817e4Smiod 1124*3d8817e4Smiod(dnmi m-sra "shift right arithmetic" (USES-RD USES-RT USES-RS NO-DIS) 1125*3d8817e4Smiod "sra $rd,$rt,$rs" 1126*3d8817e4Smiod (emit srav rd rt rs) 1127*3d8817e4Smiod) 1128*3d8817e4Smiod 1129*3d8817e4Smiod(dnmi m-srl "shift right logical" (USES-RD USES-RT USES-RS NO-DIS) 1130*3d8817e4Smiod "srl $rd,$rt,$rs" 1131*3d8817e4Smiod (emit srlv rd rt rs) 1132*3d8817e4Smiod) 1133*3d8817e4Smiod 1134*3d8817e4Smiod(dnmi not "not" (USES-RD USES-RT NO-DIS) 1135*3d8817e4Smiod "not $rd,$rt" 1136*3d8817e4Smiod (emit nor rd (rs 0) rt) 1137*3d8817e4Smiod) 1138*3d8817e4Smiod 1139*3d8817e4Smiod(dnmi subi "sub immediate" (USES-RS USES-RT NO-DIS) 1140*3d8817e4Smiod "subi $rt,$rs,$mlo16" 1141*3d8817e4Smiod (emit addiu rt rs mlo16) 1142*3d8817e4Smiod) 1143*3d8817e4Smiod 1144*3d8817e4Smiod(dnmi m-sub "subtract immediate" (USES-RS USES-RT NO-DIS) 1145*3d8817e4Smiod "sub $rt,$rs,$mlo16" 1146*3d8817e4Smiod (emit addiu rt rs mlo16) 1147*3d8817e4Smiod) 1148*3d8817e4Smiod 1149*3d8817e4Smiod(dnmi m-subu "subtract unsigned" (USES-RS USES-RT NO-DIS) 1150*3d8817e4Smiod "subu $rt,$rs,$mlo16" 1151*3d8817e4Smiod (emit addiu rt rs mlo16) 1152*3d8817e4Smiod) 1153*3d8817e4Smiod 1154*3d8817e4Smiod(dnmi sb-base-0 "store byte - implied base 0" (USES-RT NO-DIS) 1155*3d8817e4Smiod "sb $rt,$lo16" 1156*3d8817e4Smiod (emit sb rt lo16 (base 0)) 1157*3d8817e4Smiod) 1158*3d8817e4Smiod 1159*3d8817e4Smiod(dnmi sh-base-0 "store half - implied base 0" (USES-RT NO-DIS) 1160*3d8817e4Smiod "sh $rt,$lo16" 1161*3d8817e4Smiod (emit sh rt lo16 (base 0)) 1162*3d8817e4Smiod) 1163*3d8817e4Smiod 1164*3d8817e4Smiod(dnmi sw-base-0 "store word - implied base 0" (USES-RT NO-DIS) 1165*3d8817e4Smiod "sw $rt,$lo16" 1166*3d8817e4Smiod (emit sw rt lo16 (base 0)) 1167*3d8817e4Smiod) 1168*3d8817e4Smiod 1169*3d8817e4Smiod(dnmi m-xor "xor immediate" (USES-RS USES-RT NO-DIS) 1170*3d8817e4Smiod "xor $rt,$rs,$lo16" 1171*3d8817e4Smiod (emit xori rt rs lo16) 1172*3d8817e4Smiod) 1173*3d8817e4Smiod 1174*3d8817e4Smiod 1175*3d8817e4Smiod(if (keep-mach? (iq2000)) 1176*3d8817e4Smiod(include "../../cpu/iq2000m.cpu")) 1177*3d8817e4Smiod 1178*3d8817e4Smiod(if (keep-mach? (iq10)) 1179*3d8817e4Smiod(include "../../cpu/iq10.cpu")) 1180*3d8817e4Smiod 1181*3d8817e4Smiod 1182*3d8817e4Smiod 1183