xref: /openbsd-src/gnu/usr.bin/binutils-2.17/cpu/iq2000.cpu (revision 3d8817e467ea46cf4772788d6804dd293abfb01a)
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