m32c.cpu revision 1.1.1.2 1 ; Renesas M32C CPU description. -*- Scheme -*-
2 ;
3 ; Copyright 2005, 2006, 2007, 2009 Free Software Foundation, Inc.
4 ;
5 ; Contributed by Red Hat Inc; developed under contract from Renesas.
6 ;
7 ; This file is part of the GNU Binutils.
8 ;
9 ; This program is free software; you can redistribute it and/or modify
10 ; it under the terms of the GNU General Public License as published by
11 ; the Free Software Foundation; either version 3 of the License, or
12 ; (at your option) any later version.
13 ;
14 ; This program is distributed in the hope that it will be useful,
15 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
16 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 ; GNU General Public License for more details.
18 ;
19 ; You should have received a copy of the GNU General Public License
20 ; along with this program; if not, write to the Free Software
21 ; Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
22 ; MA 02110-1301, USA.
23
24 (include "simplify.inc")
25
26 (define-arch
27 (name m32c)
28 (comment "Renesas M32C")
29 (default-alignment forced)
30 (insn-lsb0? #f)
31 (machs m16c m32c)
32 (isas m16c m32c)
33 )
34
35 (define-isa
36 (name m16c)
37
38 (default-insn-bitsize 32)
39
40 ; Number of bytes of insn we can initially fetch.
41 (base-insn-bitsize 32)
42
43 ; Used in computing bit numbers.
44 (default-insn-word-bitsize 32)
45
46 (decode-assist (0 1 2 3 4 5 6 7)) ; Initial bitnumbers to decode insns by.
47
48 ; fetches 1 insn at a time.
49 (liw-insns 1)
50
51 ; executes 1 insn at a time.
52 (parallel-insns 1)
53 )
54
55 (define-isa
56 (name m32c)
57
58 (default-insn-bitsize 32)
59
60 ; Number of bytes of insn we can initially fetch.
61 (base-insn-bitsize 32)
62
63 ; Used in computing bit numbers.
64 (default-insn-word-bitsize 32)
65
66 (decode-assist (0 1 2 3 4 5 6 7)) ; Initial bitnumbers to decode insns by.
67
68 ; fetches 1 insn at a time.
69 (liw-insns 1)
70
71 ; executes 1 insn at a time.
72 (parallel-insns 1)
73 )
74
75 (define-cpu
76 ; cpu names must be distinct from the architecture name and machine names.
77 ; The "b" suffix stands for "base" and is the convention.
78 ; The "f" suffix stands for "family" and is the convention.
79 (name m16cbf)
80 (comment "Renesas M16C base family")
81 (insn-endian big)
82 (data-endian little)
83 (word-bitsize 16)
84 )
85
86 (define-cpu
87 ; cpu names must be distinct from the architecture name and machine names.
88 ; The "b" suffix stands for "base" and is the convention.
89 ; The "f" suffix stands for "family" and is the convention.
90 (name m32cbf)
91 (comment "Renesas M32C base family")
92 (insn-endian big)
93 (data-endian little)
94 (word-bitsize 16)
95 )
96
97 (define-mach
98 (name m16c)
99 (comment "Generic M16C cpu")
100 (cpu m32cbf)
101 )
102
103 (define-mach
104 (name m32c)
105 (comment "Generic M32C cpu")
106 (cpu m32cbf)
107 )
108
109 ; Model descriptions.
110
111 (define-model
112 (name m16c)
113 (comment "m16c") (attrs)
114 (mach m16c)
115
116 ; `state' is a list of variables for recording model state
117 ; (state)
118 (unit u-exec "Execution Unit" ()
119 1 1 ; issue done
120 () ; state
121 () ; inputs
122 () ; outputs
123 () ; profile action (default)
124 )
125 )
126
127 (define-model
128 (name m32c)
129 (comment "m32c") (attrs)
130 (mach m32c)
131
132 ; `state' is a list of variables for recording model state
133 ; (state)
134 (unit u-exec "Execution Unit" ()
135 1 1 ; issue done
136 () ; state
137 () ; inputs
138 () ; outputs
139 () ; profile action (default)
140 )
141 )
142
143 (define-attr
144 (type enum)
145 (name RL_TYPE)
146 (values NONE JUMP 1ADDR 2ADDR)
147 (default NONE)
148 )
149
150 ; Macros to simplify MACH attribute specification.
151
152 (define-pmacro all-isas () (ISA m16c,m32c))
153 (define-pmacro m16c-isa () (ISA m16c))
154 (define-pmacro m32c-isa () (ISA m32c))
155
156 (define-pmacro MACH16 (MACH m16c))
157 (define-pmacro MACH32 (MACH m32c))
158
159 (define-pmacro (machine size)
160 (MACH (.sym m size c)) (ISA (.sym m size c)))
161
162 (define-pmacro RL_JUMP (RL_TYPE JUMP))
163 (define-pmacro RL_1ADDR (RL_TYPE 1ADDR))
164 (define-pmacro RL_2ADDR (RL_TYPE 2ADDR))
165
166
168 ;=============================================================
169 ; Fields
170 ;-------------------------------------------------------------
171 ; Main opcodes
172 ;
173 (dnf f-0-1 "opcode" (all-isas) 0 1)
174 (dnf f-0-2 "opcode" (all-isas) 0 2)
175 (dnf f-0-3 "opcode" (all-isas) 0 3)
176 (dnf f-0-4 "opcode" (all-isas) 0 4)
177 (dnf f-1-3 "opcode" (all-isas) 1 3)
178 (dnf f-2-2 "opcode" (all-isas) 2 2)
179 (dnf f-3-4 "opcode" (all-isas) 3 4)
180 (dnf f-3-1 "opcode" (all-isas) 3 1)
181 (dnf f-4-1 "opcode" (all-isas) 4 1)
182 (dnf f-4-3 "opcode" (all-isas) 4 3)
183 (dnf f-4-4 "opcode" (all-isas) 4 4)
184 (dnf f-4-6 "opcode" (all-isas) 4 6)
185 (dnf f-5-1 "opcode" (all-isas) 5 1)
186 (dnf f-5-3 "opcode" (all-isas) 5 3)
187 (dnf f-6-2 "opcode" (all-isas) 6 2)
188 (dnf f-7-1 "opcode" (all-isas) 7 1)
189 (dnf f-8-1 "opcode" (all-isas) 8 1)
190 (dnf f-8-2 "opcode" (all-isas) 8 2)
191 (dnf f-8-3 "opcode" (all-isas) 8 3)
192 (dnf f-8-4 "opcode" (all-isas) 8 4)
193 (dnf f-8-8 "opcode" (all-isas) 8 8)
194 (dnf f-9-3 "opcode" (all-isas) 9 3)
195 (dnf f-9-1 "opcode" (all-isas) 9 1)
196 (dnf f-10-1 "opcode" (all-isas) 10 1)
197 (dnf f-10-2 "opcode" (all-isas) 10 2)
198 (dnf f-10-3 "opcode" (all-isas) 10 3)
199 (dnf f-11-1 "opcode" (all-isas) 11 1)
200 (dnf f-12-1 "opcode" (all-isas) 12 1)
201 (dnf f-12-2 "opcode" (all-isas) 12 2)
202 (dnf f-12-3 "opcode" (all-isas) 12 3)
203 (dnf f-12-4 "opcode" (all-isas) 12 4)
204 (dnf f-12-6 "opcode" (all-isas) 12 6)
205 (dnf f-13-3 "opcode" (all-isas) 13 3)
206 (dnf f-14-1 "opcode" (all-isas) 14 1)
207 (dnf f-14-2 "opcode" (all-isas) 14 2)
208 (dnf f-15-1 "opcode" (all-isas) 15 1)
209 (dnf f-16-1 "opcode" (all-isas) 16 1)
210 (dnf f-16-2 "opcode" (all-isas) 16 2)
211 (dnf f-16-4 "opcode" (all-isas) 16 4)
212 (dnf f-16-8 "opcode" (all-isas) 16 8)
213 (dnf f-18-1 "opcode" (all-isas) 18 1)
214 (dnf f-18-2 "opcode" (all-isas) 18 2)
215 (dnf f-18-3 "opcode" (all-isas) 18 3)
216 (dnf f-20-1 "opcode" (all-isas) 20 1)
217 (dnf f-20-3 "opcode" (all-isas) 20 3)
218 (dnf f-20-2 "opcode" (all-isas) 20 2)
219 (dnf f-20-4 "opcode" (all-isas) 20 4)
220 (dnf f-21-3 "opcode" (all-isas) 21 3)
221 (dnf f-24-2 "opcode" (all-isas) 24 2)
222 (dnf f-24-8 "opcode" (all-isas) 24 8)
223 (dnf f-32-16 "opcode" (all-isas) 32 16)
224
225 ;-------------------------------------------------------------
226 ; Registers
227 ;-------------------------------------------------------------
228
229 (dnf f-src16-rn "source Rn for m16c" (MACH16 m16c-isa) 10 2)
230 (dnf f-src16-an "source An for m16c" (MACH16 m16c-isa) 11 1)
231
232 (dnf f-src32-an-unprefixed "destination An for m32c" (MACH32 m32c-isa) 11 1)
233 (dnf f-src32-an-prefixed "destination An for m32c" (MACH32 m32c-isa) 19 1)
234
235 ; QI mode gr encoding for m32c is different than for m16c. The hardware
236 ; is indexed using the m16c encoding, so perform the transformation here.
237 ; register m16c m32c
238 ; ----------------------
239 ; r0l 00'b 10'b
240 ; r0h 01'b 00'b
241 ; r1l 10'b 11'b
242 ; r1h 11'b 01'b
243 (df f-src32-rn-unprefixed-QI "source Rn QI for m32c" (MACH32 m32c-isa) 10 2 UINT
244 ((value pc) (or USI (and (sll (inv value) 1) 2) (and (srl value 1) 1))) ; insert
245 ((value pc) (or USI (and (inv (srl value 1)) 1) (and (sll value 1) 2))) ; extract
246 )
247 ; QI mode gr encoding for m32c is different than for m16c. The hardware
248 ; is indexed using the m16c encoding, so perform the transformation here.
249 ; register m16c m32c
250 ; ----------------------
251 ; r0l 00'b 10'b
252 ; r0h 01'b 00'b
253 ; r1l 10'b 11'b
254 ; r1h 11'b 01'b
255 (df f-src32-rn-prefixed-QI "source Rn QI for m32c" (MACH32 m32c-isa) 18 2 UINT
256 ((value pc) (or USI (and (sll (inv value) 1) 2) (and (srl value 1) 1))) ; insert
257 ((value pc) (or USI (and (inv (srl value 1)) 1) (and (sll value 1) 2))) ; extract
258 )
259 ; HI mode gr encoding for m32c is different than for m16c. The hardware
260 ; is indexed using the m16c encoding, so perform the transformation here.
261 ; register m16c m32c
262 ; ----------------------
263 ; r0 00'b 10'b
264 ; r1 01'b 11'b
265 ; r2 10'b 00'b
266 ; r3 11'b 01'b
267 (df f-src32-rn-unprefixed-HI "source Rn HI for m32c" (MACH32 m32c-isa) 10 2 UINT
268 ((value pc) (mod USI (add value 2) 4)) ; insert
269 ((value pc) (mod USI (add value 2) 4)) ; extract
270 )
271
272 ; HI mode gr encoding for m32c is different than for m16c. The hardware
273 ; is indexed using the m16c encoding, so perform the transformation here.
274 ; register m16c m32c
275 ; ----------------------
276 ; r0 00'b 10'b
277 ; r1 01'b 11'b
278 ; r2 10'b 00'b
279 ; r3 11'b 01'b
280 (df f-src32-rn-prefixed-HI "source Rn HI for m32c" (MACH32 m32c-isa) 18 2 UINT
281 ((value pc) (mod USI (add value 2) 4)) ; insert
282 ((value pc) (mod USI (add value 2) 4)) ; extract
283 )
284
285 ; SI mode gr encoding for m32c is as follows:
286 ; register encoding index
287 ; -------------------------
288 ; r2r0 10'b 0
289 ; r3r1 11'b 1
290 (df f-src32-rn-unprefixed-SI "source Rn SI for m32c" (MACH32 m32c-isa) 10 2 UINT
291 ((value pc) (add USI value 2)) ; insert
292 ((value pc) (sub USI value 2)) ; extract
293 )
294 (df f-src32-rn-prefixed-SI "source Rn SI for m32c" (MACH32 m32c-isa) 18 2 UINT
295 ((value pc) (add USI value 2)) ; insert
296 ((value pc) (sub USI value 2)) ; extract
297 )
298
299 (dnf f-dst32-rn-ext-unprefixed "destination Rn for m32c" (MACH32 m32c-isa) 9 1)
300
301 (dnf f-dst16-rn "destination Rn for m16c" (MACH16 m16c-isa) 14 2)
302 (dnf f-dst16-rn-ext "destination Rn for m16c" (MACH16 m16c-isa) 14 1)
303 (dnf f-dst16-rn-QI-s "destination Rn for m16c" (MACH16 m16c-isa) 5 1)
304
305 (dnf f-dst16-an "destination An for m16c" (MACH16 m16c-isa) 15 1)
306 (dnf f-dst16-an-s "destination An for m16c" (MACH16 m16c-isa) 4 1)
307
308 (dnf f-dst32-an-unprefixed "destination An for m32c" (MACH32 m32c-isa) 9 1)
309 (dnf f-dst32-an-prefixed "destination An for m32c" (MACH32 m32c-isa) 17 1)
310
311 ; QI mode gr encoding for m32c is different than for m16c. The hardware
312 ; is indexed using the m16c encoding, so perform the transformation here.
313 ; register m16c m32c
314 ; ----------------------
315 ; r0l 00'b 10'b
316 ; r0h 01'b 00'b
317 ; r1l 10'b 11'b
318 ; r1h 11'b 01'b
319 (df f-dst32-rn-unprefixed-QI "destination Rn QI for m32c" (MACH32 m32c-isa) 8 2 UINT
320 ((value pc) (or USI (and (sll (inv value) 1) 2) (and (srl value 1) 1))) ; insert
321 ((value pc) (or USI (and (inv (srl value 1)) 1) (and (sll value 1) 2))) ; extract
322 )
323 (df f-dst32-rn-prefixed-QI "destination Rn QI for m32c" (MACH32 m32c-isa) 16 2 UINT
324 ((value pc) (or USI (and (sll (inv value) 1) 2) (and (srl value 1) 1))) ; insert
325 ((value pc) (or USI (and (inv (srl value 1)) 1) (and (sll value 1) 2))) ; extract
326 )
327 ; HI mode gr encoding for m32c is different than for m16c. The hardware
328 ; is indexed using the m16c encoding, so perform the transformation here.
329 ; register m16c m32c
330 ; ----------------------
331 ; r0 00'b 10'b
332 ; r1 01'b 11'b
333 ; r2 10'b 00'b
334 ; r3 11'b 01'b
335 (df f-dst32-rn-unprefixed-HI "destination Rn HI for m32c" (MACH32 m32c-isa) 8 2 UINT
336 ((value pc) (mod USI (add value 2) 4)) ; insert
337 ((value pc) (mod USI (add value 2) 4)) ; extract
338 )
339 (df f-dst32-rn-prefixed-HI "destination Rn HI for m32c" (MACH32 m32c-isa) 16 2 UINT
340 ((value pc) (mod USI (add value 2) 4)) ; insert
341 ((value pc) (mod USI (add value 2) 4)) ; extract
342 )
343 ; SI mode gr encoding for m32c is as follows:
344 ; register encoding index
345 ; -------------------------
346 ; r2r0 10'b 0
347 ; r3r1 11'b 1
348 (df f-dst32-rn-unprefixed-SI "destination Rn SI for m32c" (MACH32 m32c-isa) 8 2 UINT
349 ((value pc) (add USI value 2)) ; insert
350 ((value pc) (sub USI value 2)) ; extract
351 )
352 (df f-dst32-rn-prefixed-SI "destination Rn SI for m32c" (MACH32 m32c-isa) 16 2 UINT
353 ((value pc) (add USI value 2)) ; insert
354 ((value pc) (sub USI value 2)) ; extract
355 )
356
357 (dnf f-dst16-1-S "destination R0[hl] for m16c" (MACH16 m16c-isa) 5 1)
358
359 ;-------------------------------------------------------------
360 ; Immediates embedded in the base insn
361 ;-------------------------------------------------------------
362
363 (df f-imm-8-s4 "4 bit signed" (all-isas) 8 4 INT #f #f)
364 (df f-imm-12-s4 "4 bit signed" (all-isas) 12 4 INT #f #f)
365 (df f-imm-13-u3 "3 bit unsigned" (all-isas) 13 3 UINT #f #f)
366 (df f-imm-20-s4 "4 bit signed" (all-isas) 20 4 INT #f #f)
367
368 (df f-imm1-S "1 bit immediate for short format binary insns" (MACH32 m32c-isa) 2 1 UINT
369 ((value pc) (sub USI value 1)) ; insert
370 ((value pc) (add USI value 1)) ; extract
371 )
372
373 (dnmf f-imm3-S "3 bit unsigned for short format insns" (all-isas) UINT
374 (f-2-2 f-7-1)
375 (sequence () ; insert
376 (set (ifield f-7-1) (and (sub (ifield f-imm3-S) 1) 1))
377 (set (ifield f-2-2) (and (srl (sub (ifield f-imm3-S) 1) 1) #x3))
378 )
379 (sequence () ; extract
380 (set (ifield f-imm3-S) (add (or (sll (ifield f-2-2) 1)
381 (ifield f-7-1))
382 1))
383 )
384 )
385
386 ;-------------------------------------------------------------
387 ; Immediates and displacements beyond the base insn
388 ;-------------------------------------------------------------
389
390 (df f-dsp-8-u6 "6 bit unsigned" (all-isas) 8 6 UINT #f #f)
391 (df f-dsp-8-u8 "8 bit unsigned" (all-isas) 8 8 UINT #f #f)
392 (df f-dsp-8-s8 "8 bit signed" (all-isas) 8 8 INT #f #f)
393 (df f-dsp-10-u6 "6 bit unsigned" (all-isas) 10 6 UINT #f #f)
394 (df f-dsp-16-u8 "8 bit unsigned" (all-isas) 16 8 UINT #f #f)
395 (df f-dsp-16-s8 "8 bit signed" (all-isas) 16 8 INT #f #f)
396 (df f-dsp-24-u8 "8 bit unsigned" (all-isas) 24 8 UINT #f #f)
397 (df f-dsp-24-s8 "8 bit signed" (all-isas) 24 8 INT #f #f)
398 (df f-dsp-32-u8 "8 bit unsigned" (all-isas) 32 8 UINT #f #f)
399 (df f-dsp-32-s8 "8 bit signed" (all-isas) 32 8 INT #f #f)
400 (df f-dsp-40-u8 "8 bit unsigned" (all-isas) 40 8 UINT #f #f)
401 (df f-dsp-40-s8 "8 bit signed" (all-isas) 40 8 INT #f #f)
402 (df f-dsp-48-u8 "8 bit unsigned" (all-isas) 48 8 UINT #f #f)
403 (df f-dsp-48-s8 "8 bit signed" (all-isas) 48 8 INT #f #f)
404 (df f-dsp-56-u8 "8 bit unsigned" (all-isas) 56 8 UINT #f #f)
405 (df f-dsp-56-s8 "8 bit signed" (all-isas) 56 8 INT #f #f)
406 (df f-dsp-64-u8 "8 bit unsigned" (all-isas) 64 8 UINT #f #f)
407 (df f-dsp-64-s8 "8 bit signed" (all-isas) 64 8 INT #f #f)
408
409 ; Insn opcode endianness is big, but the immediate fields are stored
410 ; in little endian. Handle this here at the field level for all immediate
411 ; fields longer that 1 byte.
412 ;
413 ; CGEN can't handle a field which spans a 32 bit word boundary, so
414 ; handle those as multi ifields.
415 ;
416 ; Take care in expressions using 'srl' or 'sll' as part of some larger
417 ; expression meant to yield sign-extended values. CGEN translates
418 ; uses of those operators into C expressions whose type is 'unsigned
419 ; int', which tends to make the whole expression 'unsigned int'.
420 ; Expressions like (set (ifield foo) X), however, just take X and
421 ; store it in some member of 'struct cgen_fields', all of whose
422 ; members are 'long'. On machines where 'long' is larger than
423 ; 'unsigned int', assigning a "sign-extended" unsigned int to a long
424 ; just produces a very large positive value. insert_normal will
425 ; range-check the field's value and produce odd error messages like
426 ; this:
427 ;
428 ; Error: operand out of range (4160684031 not between -2147483648 and 2147483647) `add.l #-265,-270[fb]'
429 ;
430 ; Annoyingly, the code will work fine on machines where 'long' and
431 ; 'unsigned int' are the same size: the assignment will produce a
432 ; negative number.
433 ;
434 ; Just tell yourself over and over: overflow detection is expensive,
435 ; and you're glad C doesn't do it, because it never happens in real
436 ; life.
437
438 (df f-dsp-8-u16 "16 bit unsigned" (all-isas) 8 16 UINT
439 ((value pc) (or UHI
440 (and (srl value 8) #x00ff)
441 (and (sll value 8) #xff00))) ; insert
442 ((value pc) (or UHI
443 (and UHI (srl UHI value 8) #x00ff)
444 (and UHI (sll UHI value 8) #xff00))) ; extract
445 )
446
447 (df f-dsp-8-s16 "8 bit signed" (all-isas) 8 16 INT
448 ((value pc) (ext INT
449 (trunc HI
450 (or (and (srl value 8) #x00ff)
451 (and (sll value 8) #xff00))))) ; insert
452 ((value pc) (ext INT
453 (trunc HI
454 (or (and (srl value 8) #x00ff)
455 (and (sll value 8) #xff00))))) ; extract
456 )
457
458 (df f-dsp-16-u16 "16 bit unsigned" (all-isas) 16 16 UINT
459 ((value pc) (or UHI
460 (and (srl value 8) #x00ff)
461 (and (sll value 8) #xff00))) ; insert
462 ((value pc) (or UHI
463 (and UHI (srl UHI value 8) #x00ff)
464 (and UHI (sll UHI value 8) #xff00))) ; extract
465 )
466
467 (df f-dsp-16-s16 "16 bit signed" (all-isas) 16 16 INT
468 ((value pc) (ext INT
469 (trunc HI
470 (or (and (srl value 8) #x00ff)
471 (and (sll value 8) #xff00))))) ; insert
472 ((value pc) (ext INT
473 (trunc HI
474 (or (and (srl value 8) #x00ff)
475 (and (sll value 8) #xff00))))) ; extract
476 )
477
478 (dnmf f-dsp-24-u16 "16 bit unsigned" (all-isas) UINT
479 (f-dsp-24-u8 f-dsp-32-u8)
480 (sequence () ; insert
481 (set (ifield f-dsp-24-u8) (and (ifield f-dsp-24-u16) #xff))
482 (set (ifield f-dsp-32-u8) (and (srl (ifield f-dsp-24-u16) 8) #xff))
483 )
484 (sequence () ; extract
485 (set (ifield f-dsp-24-u16) (or (sll (ifield f-dsp-32-u8) 8)
486 (ifield f-dsp-24-u8)))
487 )
488 )
489
490 (dnmf f-dsp-24-s16 "16 bit signed" (all-isas) INT
491 (f-dsp-24-u8 f-dsp-32-u8)
492 (sequence () ; insert
493 (set (ifield f-dsp-24-u8)
494 (and (ifield f-dsp-24-s16) #xff))
495 (set (ifield f-dsp-32-u8)
496 (and (srl (ifield f-dsp-24-s16) 8) #xff))
497 )
498 (sequence () ; extract
499 (set (ifield f-dsp-24-s16)
500 (ext INT
501 (trunc HI (or (sll (ifield f-dsp-32-u8) 8)
502 (ifield f-dsp-24-u8)))))
503 )
504 )
505
506 (df f-dsp-32-u16 "16 bit unsigned" (all-isas) 32 16 UINT
507 ((value pc) (or UHI
508 (and (srl value 8) #x00ff)
509 (and (sll value 8) #xff00))) ; insert
510 ((value pc) (or UHI
511 (and UHI (srl UHI value 8) #x00ff)
512 (and UHI (sll UHI value 8) #xff00))) ; extract
513 )
514
515 (df f-dsp-32-s16 "16 bit signed" (all-isas) 32 16 INT
516 ((value pc) (ext INT
517 (trunc HI
518 (or (and (srl value 8) #x00ff)
519 (and (sll value 8) #xff00))))) ; insert
520 ((value pc) (ext INT
521 (trunc HI
522 (or (and (srl value 8) #x00ff)
523 (and (sll value 8) #xff00))))) ; extract
524 )
525
526 (df f-dsp-40-u16 "16 bit unsigned" (all-isas) 40 16 UINT
527 ((value pc) (or UHI
528 (and (srl value 8) #x00ff)
529 (and (sll value 8) #xff00))) ; insert
530 ((value pc) (or UHI
531 (and UHI (srl UHI value 8) #x00ff)
532 (and UHI (sll UHI value 8) #xff00))) ; extract
533 )
534
535 (df f-dsp-40-s16 "16 bit signed" (all-isas) 40 16 INT
536 ((value pc) (ext INT
537 (trunc HI
538 (or (and (srl value 8) #x00ff)
539 (and (sll value 8) #xff00))))) ; insert
540 ((value pc) (ext INT
541 (trunc HI
542 (or (and (srl value 8) #x00ff)
543 (and (sll value 8) #xff00))))) ; extract
544 )
545
546 (df f-dsp-48-u16 "16 bit unsigned" (all-isas) 48 16 UINT
547 ((value pc) (or UHI
548 (and (srl value 8) #x00ff)
549 (and (sll value 8) #xff00))) ; insert
550 ((value pc) (or UHI
551 (and UHI (srl UHI value 8) #x00ff)
552 (and UHI (sll UHI value 8) #xff00))) ; extract
553 )
554
555 (df f-dsp-48-s16 "16 bit signed" (all-isas) 48 16 INT
556 ((value pc) (ext INT
557 (trunc HI
558 (or (and (srl value 8) #x00ff)
559 (and (sll value 8) #xff00))))) ; insert
560 ((value pc) (ext INT
561 (trunc HI
562 (or (and (srl value 8) #x00ff)
563 (and (sll value 8) #xff00))))) ; extract
564 )
565
566 (df f-dsp-64-u16 "16 bit unsigned" (all-isas) 64 16 UINT
567 ((value pc) (or UHI
568 (and (srl value 8) #x00ff)
569 (and (sll value 8) #xff00))) ; insert
570 ((value pc) (or UHI
571 (and UHI (srl UHI value 8) #x00ff)
572 (and UHI (sll UHI value 8) #xff00))) ; extract
573 )
574 (df f-dsp-8-s24 "24 bit signed" (all-isas) 8 24 INT
575 ((value pc) (or SI
576 (or (and (srl value 16) #xff) (and value #xff00))
577 (sll (ext INT (trunc QI (and value #xff))) 16)))
578 ((value pc) (or SI
579 (or (and (srl value 16) #xff) (and value #xff00))
580 (sll (ext INT (trunc QI (and value #xff))) 16)))
581 )
582
583 (df f-dsp-8-u24 "24 bit unsigned" (all-isas) 8 24 UINT
584 ((value pc) (or SI
585 (or (srl value 16) (and value #xff00))
586 (sll (and value #xff) 16)))
587 ((value pc) (or SI
588 (or (srl value 16) (and value #xff00))
589 (sll (and value #xff) 16)))
590 )
591
592 (dnmf f-dsp-16-u24 "24 bit unsigned" (all-isas) UINT
593 (f-dsp-16-u16 f-dsp-32-u8)
594 (sequence () ; insert
595 (set (ifield f-dsp-16-u16) (and (ifield f-dsp-16-u24) #xffff))
596 (set (ifield f-dsp-32-u8) (and (srl (ifield f-dsp-16-u24) 16) #xff))
597 )
598 (sequence () ; extract
599 (set (ifield f-dsp-16-u24) (or (sll (ifield f-dsp-32-u8) 16)
600 (ifield f-dsp-16-u16)))
601 )
602 )
603
604 (dnmf f-dsp-24-u24 "24 bit unsigned" (all-isas) UINT
605 (f-dsp-24-u8 f-dsp-32-u16)
606 (sequence () ; insert
607 (set (ifield f-dsp-24-u8) (and (ifield f-dsp-24-u24) #xff))
608 (set (ifield f-dsp-32-u16) (and (srl (ifield f-dsp-24-u24) 8) #xffff))
609 )
610 (sequence () ; extract
611 (set (ifield f-dsp-24-u24) (or (sll (ifield f-dsp-32-u16) 8)
612 (ifield f-dsp-24-u8)))
613 )
614 )
615
616 (df f-dsp-32-u24 "24 bit unsigned" (all-isas) 32 24 UINT
617 ((value pc) (or USI
618 (or USI
619 (and (srl value 16) #x0000ff)
620 (and value #x00ff00))
621 (and (sll value 16) #xff0000))) ; insert
622 ((value pc) (or USI
623 (or USI
624 (and USI (srl value 16) #x0000ff)
625 (and USI value #x00ff00))
626 (and USI (sll value 16) #xff0000))) ; extract
627 )
628
629 (df f-dsp-40-u20 "20 bit unsigned" (all-isas) 40 20 UINT
630 ((value pc) (or USI
631 (or USI
632 (and (srl value 16) #x0000ff)
633 (and value #x00ff00))
634 (and (sll value 16) #x0f0000))) ; insert
635 ((value pc) (or USI
636 (or USI
637 (and USI (srl value 16) #x0000ff)
638 (and USI value #x00ff00))
639 (and USI (sll value 16) #x0f0000))) ; extract
640 )
641
642 (df f-dsp-40-u24 "24 bit unsigned" (all-isas) 40 24 UINT
643 ((value pc) (or USI
644 (or USI
645 (and (srl value 16) #x0000ff)
646 (and value #x00ff00))
647 (and (sll value 16) #xff0000))) ; insert
648 ((value pc) (or USI
649 (or USI
650 (and USI (srl value 16) #x0000ff)
651 (and USI value #x00ff00))
652 (and USI (sll value 16) #xff0000))) ; extract
653 )
654
655 (dnmf f-dsp-40-s32 "32 bit signed" (all-isas) INT
656 (f-dsp-40-u24 f-dsp-64-u8)
657 (sequence () ; insert
658 (set (ifield f-dsp-64-u8) (and (srl (ifield f-dsp-40-s32) 24) #xff))
659 (set (ifield f-dsp-40-u24) (and (ifield f-dsp-40-s32) #xffffff))
660 )
661 (sequence () ; extract
662 (set (ifield f-dsp-40-s32) (or (and (ifield f-dsp-40-u24) #xffffff)
663 (and (sll (ifield f-dsp-64-u8) 24) #xff000000)))
664 )
665 )
666
667 (dnmf f-dsp-48-u20 "20 bit unsigned" (all-isas) UINT
668 (f-dsp-48-u16 f-dsp-64-u8)
669 (sequence () ; insert
670 (set (ifield f-dsp-64-u8) (and (srl (ifield f-dsp-48-u20) 16) #x0f))
671 (set (ifield f-dsp-48-u16) (and (ifield f-dsp-48-u20) #xffff))
672 )
673 (sequence () ; extract
674 (set (ifield f-dsp-48-u20) (or (and (ifield f-dsp-48-u16) #xffff)
675 (and (sll (ifield f-dsp-64-u8) 16) #x0f0000)))
676 )
677 )
678 (dnmf f-dsp-48-u24 "24 bit unsigned" (all-isas) UINT
679 (f-dsp-48-u16 f-dsp-64-u8)
680 (sequence () ; insert
681 (set (ifield f-dsp-64-u8) (and (srl (ifield f-dsp-48-u24) 16) #xff))
682 (set (ifield f-dsp-48-u16) (and (ifield f-dsp-48-u24) #xffff))
683 )
684 (sequence () ; extract
685 (set (ifield f-dsp-48-u24) (or (and (ifield f-dsp-48-u16) #xffff)
686 (and (sll (ifield f-dsp-64-u8) 16) #xff0000)))
687 )
688 )
689
690 (dnmf f-dsp-16-s32 "32 bit signed" (all-isas) INT
691 (f-dsp-16-u16 f-dsp-32-u16)
692 (sequence () ; insert
693 (set (ifield f-dsp-32-u16) (and (srl (ifield f-dsp-16-s32) 16) #xffff))
694 (set (ifield f-dsp-16-u16) (and (ifield f-dsp-16-s32) #xffff))
695 )
696 (sequence () ; extract
697 (set (ifield f-dsp-16-s32) (or (and (ifield f-dsp-16-u16) #xffff)
698 (and (sll (ifield f-dsp-32-u16) 16) #xffff0000)))
699 )
700 )
701
702 (dnmf f-dsp-24-s32 "32 bit signed" (all-isas) INT
703 (f-dsp-24-u8 f-dsp-32-u24)
704 (sequence () ; insert
705 (set (ifield f-dsp-32-u24) (and (srl (ifield f-dsp-24-s32) 8) #xffffff))
706 (set (ifield f-dsp-24-u8) (and (ifield f-dsp-24-s32) #xff))
707 )
708 (sequence () ; extract
709 (set (ifield f-dsp-24-s32) (or (and (ifield f-dsp-24-u8) #xff)
710 (and (sll (ifield f-dsp-32-u24) 8) #xffffff00)))
711 )
712 )
713
714 (df f-dsp-32-s32 "32 bit signed" (all-isas) 32 32 INT
715 ((value pc)
716
717 ;; insert
718 (ext INT
719 (or SI
720 (or SI
721 (and (srl value 24) #x000000ff)
722 (and (srl value 8) #x0000ff00))
723 (or SI
724 (and (sll value 8) #x00ff0000)
725 (and (sll value 24) #xff000000)))))
726
727 ;; extract
728 ((value pc)
729 (ext INT
730 (or SI
731 (or SI
732 (and (srl value 24) #x000000ff)
733 (and (srl value 8) #x0000ff00))
734 (or SI
735 (and (sll value 8) #x00ff0000)
736 (and (sll value 24) #xff000000)))))
737 )
738
739 (dnmf f-dsp-48-u32 "32 bit unsigned" (all-isas) UINT
740 (f-dsp-48-u16 f-dsp-64-u16)
741 (sequence () ; insert
742 (set (ifield f-dsp-64-u16) (and (srl (ifield f-dsp-48-u32) 16) #xffff))
743 (set (ifield f-dsp-48-u16) (and (ifield f-dsp-48-u32) #xffff))
744 )
745 (sequence () ; extract
746 (set (ifield f-dsp-48-u32) (or (and (ifield f-dsp-48-u16) #xffff)
747 (and (sll (ifield f-dsp-64-u16) 16) #xffff0000)))
748 )
749 )
750
751 (dnmf f-dsp-48-s32 "32 bit signed" (all-isas) INT
752 (f-dsp-48-u16 f-dsp-64-u16)
753 (sequence () ; insert
754 (set (ifield f-dsp-64-u16) (and (srl (ifield f-dsp-48-s32) 16) #xffff))
755 (set (ifield f-dsp-48-u16) (and (ifield f-dsp-48-s32) #xffff))
756 )
757 (sequence () ; extract
758 (set (ifield f-dsp-48-s32) (or (and (ifield f-dsp-48-u16) #xffff)
759 (and (sll (ifield f-dsp-64-u16) 16) #xffff0000)))
760 )
761 )
762
763 (dnmf f-dsp-56-s16 "16 bit signed" (all-isas) INT
764 (f-dsp-56-u8 f-dsp-64-u8)
765 (sequence () ; insert
766 (set (ifield f-dsp-56-u8)
767 (and (ifield f-dsp-56-s16) #xff))
768 (set (ifield f-dsp-64-u8)
769 (and (srl (ifield f-dsp-56-s16) 8) #xff))
770 )
771 (sequence () ; extract
772 (set (ifield f-dsp-56-s16)
773 (ext INT
774 (trunc HI (or (sll (ifield f-dsp-64-u8) 8)
775 (ifield f-dsp-56-u8)))))
776 )
777 )
778
779 (df f-dsp-64-s16 " 16 bit signed" (all-isas) 64 16 INT
780 ((value pc) (ext INT
781 (trunc HI
782 (or (and (srl value 8) #x00ff)
783 (and (sll value 8) #xff00))))) ; insert
784 ((value pc) (ext INT
785 (trunc HI
786 (or (and (srl value 8) #x00ff)
787 (and (sll value 8) #xff00))))) ; extract
788 )
789
790 ;-------------------------------------------------------------
791 ; Bit indices
792 ;-------------------------------------------------------------
793
794 (dnf f-bitno16-S "bit index for m16c" (all-isas) 5 3)
795 (dnf f-bitno32-prefixed "bit index for m32c" (all-isas) 21 3)
796 (dnf f-bitno32-unprefixed "bit index for m32c" (all-isas) 13 3)
797
798 (dnmf f-bitbase16-u11-S "unsigned bit,base:11" (all-isas) UINT
799 (f-bitno16-S f-dsp-8-u8)
800 (sequence () ; insert
801 (set (ifield f-bitno16-S) (and f-bitbase16-u11-S #x7))
802 (set (ifield f-dsp-8-u8) (and (srl (ifield f-bitbase16-u11-S) 3) #xff))
803 )
804 (sequence () ; extract
805 (set (ifield f-bitbase16-u11-S) (or (sll (ifield f-dsp-8-u8) 3)
806 (ifield f-bitno16-S)))
807 )
808 )
809
810 (dnmf f-bitbase32-16-u11-unprefixed "unsigned bit,base:11" (all-isas) UINT
811 (f-bitno32-unprefixed f-dsp-16-u8)
812 (sequence () ; insert
813 (set (ifield f-bitno32-unprefixed) (and f-bitbase32-16-u11-unprefixed #x7))
814 (set (ifield f-dsp-16-u8) (and (srl (ifield f-bitbase32-16-u11-unprefixed) 3) #xff))
815 )
816 (sequence () ; extract
817 (set (ifield f-bitbase32-16-u11-unprefixed) (or (sll (ifield f-dsp-16-u8) 3)
818 (ifield f-bitno32-unprefixed)))
819 )
820 )
821 (dnmf f-bitbase32-16-s11-unprefixed "signed bit,base:11" (all-isas) INT
822 (f-bitno32-unprefixed f-dsp-16-s8)
823 (sequence () ; insert
824 (set (ifield f-bitno32-unprefixed) (and f-bitbase32-16-s11-unprefixed #x7))
825 (set (ifield f-dsp-16-s8) (sra INT (ifield f-bitbase32-16-s11-unprefixed) 3))
826 )
827 (sequence () ; extract
828 (set (ifield f-bitbase32-16-s11-unprefixed) (or (sll (ifield f-dsp-16-s8) 3)
829 (ifield f-bitno32-unprefixed)))
830 )
831 )
832 (dnmf f-bitbase32-16-u19-unprefixed "unsigned bit,base:19" (all-isas) UINT
833 (f-bitno32-unprefixed f-dsp-16-u16)
834 (sequence () ; insert
835 (set (ifield f-bitno32-unprefixed) (and f-bitbase32-16-u19-unprefixed #x7))
836 (set (ifield f-dsp-16-u16) (and (srl (ifield f-bitbase32-16-u19-unprefixed) 3) #xffff))
837 )
838 (sequence () ; extract
839 (set (ifield f-bitbase32-16-u19-unprefixed) (or (sll (ifield f-dsp-16-u16) 3)
840 (ifield f-bitno32-unprefixed)))
841 )
842 )
843 (dnmf f-bitbase32-16-s19-unprefixed "signed bit,base:11" (all-isas) INT
844 (f-bitno32-unprefixed f-dsp-16-s16)
845 (sequence () ; insert
846 (set (ifield f-bitno32-unprefixed) (and f-bitbase32-16-s19-unprefixed #x7))
847 (set (ifield f-dsp-16-s16) (sra INT (ifield f-bitbase32-16-s19-unprefixed) 3))
848 )
849 (sequence () ; extract
850 (set (ifield f-bitbase32-16-s19-unprefixed) (or (sll (ifield f-dsp-16-s16) 3)
851 (ifield f-bitno32-unprefixed)))
852 )
853 )
854 ; SID decoder doesn't handle multi-ifield referencing another multi-ifield :-(
855 (dnmf f-bitbase32-16-u27-unprefixed "unsigned bit,base:27" (all-isas) UINT
856 (f-bitno32-unprefixed f-dsp-16-u16 f-dsp-32-u8)
857 (sequence () ; insert
858 (set (ifield f-bitno32-unprefixed) (and f-bitbase32-16-u27-unprefixed #x7))
859 (set (ifield f-dsp-16-u16) (and (srl (ifield f-bitbase32-16-u27-unprefixed) 3) #xffff))
860 (set (ifield f-dsp-32-u8) (and (srl (ifield f-bitbase32-16-u27-unprefixed) 19) #xff))
861 )
862 (sequence () ; extract
863 (set (ifield f-bitbase32-16-u27-unprefixed) (or (sll (ifield f-dsp-16-u16) 3)
864 (or (sll (ifield f-dsp-32-u8) 19)
865 (ifield f-bitno32-unprefixed))))
866 )
867 )
868 (dnmf f-bitbase32-24-u11-prefixed "unsigned bit,base:11" (all-isas) UINT
869 (f-bitno32-prefixed f-dsp-24-u8)
870 (sequence () ; insert
871 (set (ifield f-bitno32-prefixed) (and f-bitbase32-24-u11-prefixed #x7))
872 (set (ifield f-dsp-24-u8) (and (srl (ifield f-bitbase32-24-u11-prefixed) 3) #xff))
873 )
874 (sequence () ; extract
875 (set (ifield f-bitbase32-24-u11-prefixed) (or (sll (ifield f-dsp-24-u8) 3)
876 (ifield f-bitno32-prefixed)))
877 )
878 )
879 (dnmf f-bitbase32-24-s11-prefixed "signed bit,base:11" (all-isas) INT
880 (f-bitno32-prefixed f-dsp-24-s8)
881 (sequence () ; insert
882 (set (ifield f-bitno32-prefixed) (and f-bitbase32-24-s11-prefixed #x7))
883 (set (ifield f-dsp-24-s8) (sra INT (ifield f-bitbase32-24-s11-prefixed) 3))
884 )
885 (sequence () ; extract
886 (set (ifield f-bitbase32-24-s11-prefixed) (or (sll (ifield f-dsp-24-s8) 3)
887 (ifield f-bitno32-prefixed)))
888 )
889 )
890 ; SID decoder doesn't handle multi-ifield referencing another multi-ifield :-(
891 (dnmf f-bitbase32-24-u19-prefixed "unsigned bit,base:19" (all-isas) UINT
892 (f-bitno32-prefixed f-dsp-24-u8 f-dsp-32-u8)
893 (sequence () ; insert
894 (set (ifield f-bitno32-prefixed) (and f-bitbase32-24-u19-prefixed #x7))
895 (set (ifield f-dsp-24-u8) (and (srl (ifield f-bitbase32-24-u19-prefixed) 3) #xff))
896 (set (ifield f-dsp-32-u8) (and (srl (ifield f-bitbase32-24-u19-prefixed) 11) #xff))
897 )
898 (sequence () ; extract
899 (set (ifield f-bitbase32-24-u19-prefixed) (or (sll (ifield f-dsp-24-u8) 3)
900 (or (sll (ifield f-dsp-32-u8) 11)
901 (ifield f-bitno32-prefixed))))
902 )
903 )
904 ; SID decoder doesn't handle multi-ifield referencing another multi-ifield :-(
905 (dnmf f-bitbase32-24-s19-prefixed "signed bit,base:11" (all-isas) INT
906 (f-bitno32-prefixed f-dsp-24-u8 f-dsp-32-s8)
907 (sequence () ; insert
908 (set (ifield f-bitno32-prefixed) (and f-bitbase32-24-s19-prefixed #x7))
909 (set (ifield f-dsp-24-u8) (and (srl (ifield f-bitbase32-24-s19-prefixed) 3) #xff))
910 (set (ifield f-dsp-32-s8) (sra INT (ifield f-bitbase32-24-s19-prefixed) 11))
911 )
912 (sequence () ; extract
913 (set (ifield f-bitbase32-24-s19-prefixed) (or (sll (ifield f-dsp-24-u8) 3)
914 (or (sll (ifield f-dsp-32-s8) 11)
915 (ifield f-bitno32-prefixed))))
916 )
917 )
918 ; SID decoder doesn't handle multi-ifield referencing another multi-ifield :-(
919 (dnmf f-bitbase32-24-u27-prefixed "unsigned bit,base:27" (all-isas) UINT
920 (f-bitno32-prefixed f-dsp-24-u8 f-dsp-32-u16)
921 (sequence () ; insert
922 (set (ifield f-bitno32-prefixed) (and f-bitbase32-24-u27-prefixed #x7))
923 (set (ifield f-dsp-24-u8) (and (srl (ifield f-bitbase32-24-u27-prefixed) 3) #xff))
924 (set (ifield f-dsp-32-u16) (and (srl (ifield f-bitbase32-24-u27-prefixed) 11) #xffff))
925 )
926 (sequence () ; extract
927 (set (ifield f-bitbase32-24-u27-prefixed) (or (sll (ifield f-dsp-24-u8) 3)
928 (or (sll (ifield f-dsp-32-u16) 11)
929 (ifield f-bitno32-prefixed))))
930 )
931 )
932
933 ;-------------------------------------------------------------
934 ; Labels
935 ;-------------------------------------------------------------
936
937 (df f-lab-5-3 "3 bit pc relative unsigned offset" (PCREL-ADDR all-isas) 5 3 UINT
938 ((value pc) (sub SI value (add SI pc 2))) ; insert
939 ((value pc) (add SI value (add SI pc 2))) ; extract
940 )
941 (dnmf f-lab32-jmp-s "unsigned 3 bit pc relative offset" (PCREL-ADDR all-isas) UINT
942 (f-2-2 f-7-1)
943 (sequence ((SI val)) ; insert
944 (set val (sub (sub (ifield f-lab32-jmp-s) pc) 2))
945 (set (ifield f-7-1) (and val #x1))
946 (set (ifield f-2-2) (srl val 1))
947 )
948 (sequence () ; extract
949 (set (ifield f-lab32-jmp-s) (add pc (add (or (sll (ifield f-2-2) 1)
950 (ifield f-7-1))
951 2)))
952 )
953 )
954 (df f-lab-8-8 "8 bit pc relative signed offset" (PCREL-ADDR all-isas) 8 8 INT
955 ((value pc) (sub SI value (add SI pc 1))) ; insert
956 ((value pc) (add SI value (add SI pc 1))) ; extract
957 )
958 (df f-lab-8-16 "16 bit pc relative signed offset" (PCREL-ADDR SIGN-OPT all-isas) 8 16 UINT
959 ((value pc) (or SI (sll (and (sub value (add pc 1)) #xff) 8)
960 (srl (and (sub value (add pc 1)) #xffff) 8)))
961 ((value pc) (add SI (or (srl (and value #xffff) 8)
962 (sra (sll (and value #xff) 24) 16)) (add pc 1)))
963 )
964 (df f-lab-8-24 "24 bit absolute" (all-isas ABS-ADDR) 8 24 UINT
965 ((value pc) (or SI
966 (or (srl value 16) (and value #xff00))
967 (sll (and value #xff) 16)))
968 ((value pc) (or SI
969 (or (srl value 16) (and value #xff00))
970 (sll (and value #xff) 16)))
971 )
972 (df f-lab-16-8 "8 bit pc relative signed offset" (PCREL-ADDR all-isas) 16 8 INT
973 ((value pc) (sub SI value (add SI pc 2))) ; insert
974 ((value pc) (add SI value (add SI pc 2))) ; extract
975 )
976 (df f-lab-24-8 "8 bit pc relative signed offset" (PCREL-ADDR all-isas) 24 8 INT
977 ((value pc) (sub SI value (add SI pc 2))) ; insert
978 ((value pc) (add SI value (add SI pc 2))) ; extract
979 )
980 (df f-lab-32-8 "8 bit pc relative signed offset" (PCREL-ADDR all-isas) 32 8 INT
981 ((value pc) (sub SI value (add SI pc 2))) ; insert
982 ((value pc) (add SI value (add SI pc 2))) ; extract
983 )
984 (df f-lab-40-8 "8 bit pc relative signed offset" (PCREL-ADDR all-isas) 40 8 INT
985 ((value pc) (sub SI value (add SI pc 2))) ; insert
986 ((value pc) (add SI value (add SI pc 2))) ; extract
987 )
988
989 ;-------------------------------------------------------------
990 ; Condition codes
991 ;-------------------------------------------------------------
992
993 (dnf f-cond16 "condition code" (all-isas) 12 4)
994 (dnf f-cond16j-5 "condition code" (all-isas) 5 3)
995
996 (dnmf f-cond32 "condition code" (all-isas) UINT
997 (f-9-1 f-13-3)
998 (sequence () ; insert
999 (set (ifield f-9-1) (and (srl (ifield f-cond32) 3) 1))
1000 (set (ifield f-13-3) (and (ifield f-cond32) #x7))
1001 )
1002 (sequence () ; extract
1003 (set (ifield f-cond32) (or (sll (ifield f-9-1) 3)
1004 (ifield f-13-3)))
1005 )
1006 )
1007
1008 (dnmf f-cond32j "condition code" (all-isas) UINT
1009 (f-1-3 f-7-1)
1010 (sequence () ; insert
1011 (set (ifield f-1-3) (and (srl (ifield f-cond32j) 1) #x7))
1012 (set (ifield f-7-1) (and (ifield f-cond32j) #x1))
1013 )
1014 (sequence () ; extract
1015 (set (ifield f-cond32j) (or (sll (ifield f-1-3) 1)
1016 (ifield f-7-1)))
1017 )
1018 )
1019
1021 ;=============================================================
1022 ; Hardware
1023 ;
1024 (dnh h-pc "program counter" (PC all-isas) (pc USI) () () ())
1025
1026 ;-------------------------------------------------------------
1027 ; General registers
1028 ; The actual registers are 16 bits
1029 ;-------------------------------------------------------------
1030
1031 (define-hardware
1032 (name h-gr)
1033 (comment "general 16 bit registers")
1034 (attrs all-isas CACHE-ADDR)
1035 (type register HI (4))
1036 (indices keyword "" (("r0" 0) ("r1" 1) ("r2" 2) ("r3" 3))))
1037
1038 ; Define different views of the grs as VIRTUAL with getter/setter specs
1039 ;
1040 (define-hardware
1041 (name h-gr-QI)
1042 (comment "general 8 bit registers")
1043 (attrs all-isas VIRTUAL)
1044 (type register QI (4))
1045 (indices keyword "" (("r0l" 0) ("r0h" 1) ("r1l" 2) ("r1h" 3)))
1046 (get (index) (and (if SI (mod index 2)
1047 (srl (reg h-gr (div index 2)) 8)
1048 (reg h-gr (div index 2)))
1049 #xff))
1050 (set (index newval) (set (reg h-gr (div index 2))
1051 (if SI (mod index 2)
1052 (or (and (reg h-gr (div index 2)) #xff)
1053 (sll (and newval #xff) 8))
1054 (or (and (reg h-gr (div index 2)) #xff00)
1055 (and newval #xff))))))
1056
1057 (define-hardware
1058 (name h-gr-HI)
1059 (comment "general 16 bit registers")
1060 (attrs all-isas VIRTUAL)
1061 (type register HI (4))
1062 (indices keyword "" (("r0" 0) ("r1" 1) ("r2" 2) ("r3" 3)))
1063 (get (index) (reg h-gr index))
1064 (set (index newval) (set (reg h-gr index) newval)))
1065
1066 (define-hardware
1067 (name h-gr-SI)
1068 (comment "general 32 bit registers")
1069 (attrs all-isas VIRTUAL)
1070 (type register SI (2))
1071 (indices keyword "" (("r2r0" 0) ("r3r1" 1)))
1072 (get (index) (or SI
1073 (and (reg h-gr index) #xffff)
1074 (and (sll (reg h-gr (add index 2)) 16) #xffff0000)))
1075 (set (index newval) (sequence ()
1076 (set (reg h-gr index) (and newval #xffff))
1077 (set (reg h-gr (add index 2)) (srl newval 16)))))
1078
1079 (define-hardware
1080 (name h-gr-ext-QI)
1081 (comment "general 16 bit registers")
1082 (attrs all-isas VIRTUAL)
1083 (type register HI (2))
1084 (indices keyword "" (("r0l" 0) ("r1l" 1)))
1085 (get (index) (reg h-gr-QI (mul index 2)))
1086 (set (index newval) (set (reg h-gr (mul index 2)) newval)))
1087
1088 (define-hardware
1089 (name h-gr-ext-HI)
1090 (comment "general 16 bit registers")
1091 (attrs all-isas VIRTUAL)
1092 (type register SI (2))
1093 (indices keyword "" (("r0" 0) ("r1" 1)))
1094 (get (index) (reg h-gr (mul index 2)))
1095 (set (index newval) (set (reg h-gr-SI index) newval)))
1096
1097 (define-hardware
1098 (name h-r0l)
1099 (comment "r0l register")
1100 (attrs all-isas VIRTUAL)
1101 (type register QI)
1102 (indices keyword "" (("r0l" 0)))
1103 (get () (reg h-gr-QI 0))
1104 (set (newval) (set (reg h-gr-QI 0) newval)))
1105
1106 (define-hardware
1107 (name h-r0h)
1108 (comment "r0h register")
1109 (attrs all-isas VIRTUAL)
1110 (type register QI)
1111 (indices keyword "" (("r0h" 0)))
1112 (get () (reg h-gr-QI 1))
1113 (set (newval) (set (reg h-gr-QI 1) newval)))
1114
1115 (define-hardware
1116 (name h-r1l)
1117 (comment "r1l register")
1118 (attrs all-isas VIRTUAL)
1119 (type register QI)
1120 (indices keyword "" (("r1l" 0)))
1121 (get () (reg h-gr-QI 2))
1122 (set (newval) (set (reg h-gr-QI 2) newval)))
1123
1124 (define-hardware
1125 (name h-r1h)
1126 (comment "r1h register")
1127 (attrs all-isas VIRTUAL)
1128 (type register QI)
1129 (indices keyword "" (("r1h" 0)))
1130 (get () (reg h-gr-QI 3))
1131 (set (newval) (set (reg h-gr-QI 3) newval)))
1132
1133 (define-hardware
1134 (name h-r0)
1135 (comment "r0 register")
1136 (attrs all-isas VIRTUAL)
1137 (type register HI)
1138 (indices keyword "" (("r0" 0)))
1139 (get () (reg h-gr 0))
1140 (set (newval) (set (reg h-gr 0) newval)))
1141
1142 (define-hardware
1143 (name h-r1)
1144 (comment "r1 register")
1145 (attrs all-isas VIRTUAL)
1146 (type register HI)
1147 (indices keyword "" (("r1" 0)))
1148 (get () (reg h-gr 1))
1149 (set (newval) (set (reg h-gr 1) newval)))
1150
1151 (define-hardware
1152 (name h-r2)
1153 (comment "r2 register")
1154 (attrs all-isas VIRTUAL)
1155 (type register HI)
1156 (indices keyword "" (("r2" 0)))
1157 (get () (reg h-gr 2))
1158 (set (newval) (set (reg h-gr 2) newval)))
1159
1160 (define-hardware
1161 (name h-r3)
1162 (comment "r3 register")
1163 (attrs all-isas VIRTUAL)
1164 (type register HI)
1165 (indices keyword "" (("r3" 0)))
1166 (get () (reg h-gr 3))
1167 (set (newval) (set (reg h-gr 3) newval)))
1168
1169 (define-hardware
1170 (name h-r0l-r0h)
1171 (comment "r0l or r0h")
1172 (attrs all-isas VIRTUAL)
1173 (type register QI (2))
1174 (indices keyword "" (("r0l" 0) ("r0h" 1)))
1175 (get (index) (reg h-gr-QI index))
1176 (set (index newval) (set (reg h-gr-QI index) newval)))
1177
1178 (define-hardware
1179 (name h-r2r0)
1180 (comment "r2r0 register")
1181 (attrs all-isas VIRTUAL)
1182 (type register SI)
1183 (indices keyword "" (("r2r0" 0)))
1184 (get () (or (sll (reg h-gr 2) 16) (reg h-gr 0)))
1185 (set (newval)
1186 (sequence ()
1187 (set (reg h-gr 0) newval)
1188 (set (reg h-gr 2) (sra newval 16)))))
1189
1190 (define-hardware
1191 (name h-r3r1)
1192 (comment "r3r1 register")
1193 (attrs all-isas VIRTUAL)
1194 (type register SI)
1195 (indices keyword "" (("r3r1" 0)))
1196 (get () (or (sll (reg h-gr 3) 16) (reg h-gr 1)))
1197 (set (newval)
1198 (sequence ()
1199 (set (reg h-gr 1) newval)
1200 (set (reg h-gr 3) (sra newval 16)))))
1201
1202 (define-hardware
1203 (name h-r1r2r0)
1204 (comment "r1r2r0 register")
1205 (attrs all-isas VIRTUAL)
1206 (type register DI)
1207 (indices keyword "" (("r1r2r0" 0)))
1208 (get () (or DI (sll DI (reg h-gr 1) 32) (or (sll (reg h-gr 2) 16) (reg h-gr 0))))
1209 (set (newval)
1210 (sequence ()
1211 (set (reg h-gr 0) newval)
1212 (set (reg h-gr 2) (sra newval 16))
1213 (set (reg h-gr 1) (sra newval 32)))))
1214
1215 ;-------------------------------------------------------------
1216 ; Address registers
1217 ;-------------------------------------------------------------
1218
1219 (define-hardware
1220 (name h-ar)
1221 (comment "address registers")
1222 (attrs all-isas)
1223 (type register USI (2))
1224 (indices keyword "" (("a0" 0) ("a1" 1)))
1225 (get (index) (c-call USI "h_ar_get_handler" index))
1226 (set (index newval) (c-call VOID "h_ar_set_handler" index newval)))
1227
1228 ; Define different views of the ars as VIRTUAL with getter/setter specs
1229 (define-hardware
1230 (name h-ar-QI)
1231 (comment "8 bit view of address register")
1232 (attrs all-isas VIRTUAL)
1233 (type register QI (2))
1234 (indices keyword "" (("a0" 0) ("a1" 1)))
1235 (get (index) (reg h-ar index))
1236 (set (index newval) (set (reg h-ar index) newval)))
1237
1238 (define-hardware
1239 (name h-ar-HI)
1240 (comment "16 bit view of address register")
1241 (attrs all-isas VIRTUAL)
1242 (type register HI (2))
1243 (indices keyword "" (("a0" 0) ("a1" 1)))
1244 (get (index) (reg h-ar index))
1245 (set (index newval) (set (reg h-ar index) newval)))
1246
1247 (define-hardware
1248 (name h-ar-SI)
1249 (comment "32 bit view of address register")
1250 (attrs all-isas VIRTUAL)
1251 (type register SI)
1252 (indices keyword "" (("a1a0" 0)))
1253 (get () (or SI (sll SI (ext SI (reg h-ar 1)) 16) (ext SI (reg h-ar 0))))
1254 (set (newval) (sequence ()
1255 (set (reg h-ar 0) (and newval #xffff))
1256 (set (reg h-ar 1) (and (srl newval 16) #xffff)))))
1257
1258 (define-hardware
1259 (name h-a0)
1260 (comment "16 bit view of address register")
1261 (attrs all-isas VIRTUAL)
1262 (type register HI)
1263 (indices keyword "" (("a0" 0)))
1264 (get () (reg h-ar 0))
1265 (set (newval) (set (reg h-ar 0) newval)))
1266
1267 (define-hardware
1268 (name h-a1)
1269 (comment "16 bit view of address register")
1270 (attrs all-isas VIRTUAL)
1271 (type register HI)
1272 (indices keyword "" (("a1" 1)))
1273 (get () (reg h-ar 1))
1274 (set (newval) (set (reg h-ar 1) newval)))
1275
1276 ; SB Register
1277 (define-hardware
1278 (name h-sb)
1279 (comment "SB register")
1280 (attrs all-isas)
1281 (type register USI)
1282 (get () (c-call USI "h_sb_get_handler"))
1283 (set (newval) (c-call VOID "h_sb_set_handler" newval))
1284 )
1285
1286 ; FB Register
1287 (define-hardware
1288 (name h-fb)
1289 (comment "FB register")
1290 (attrs all-isas)
1291 (type register USI)
1292 (get () (c-call USI "h_fb_get_handler"))
1293 (set (newval) (c-call VOID "h_fb_set_handler" newval))
1294 )
1295
1296 ; SP Register
1297 (define-hardware
1298 (name h-sp)
1299 (comment "SP register")
1300 (attrs all-isas)
1301 (type register USI)
1302 (get () (c-call USI "h_sp_get_handler"))
1303 (set (newval) (c-call VOID "h_sp_set_handler" newval))
1304 )
1305
1306 ;-------------------------------------------------------------
1307 ; condition-code bits
1308 ;-------------------------------------------------------------
1309
1310 (define-hardware
1311 (name h-sbit)
1312 (comment "sign bit")
1313 (attrs all-isas)
1314 (type register BI)
1315 )
1316
1317 (define-hardware
1318 (name h-zbit)
1319 (comment "zero bit")
1320 (attrs all-isas)
1321 (type register BI)
1322 )
1323
1324 (define-hardware
1325 (name h-obit)
1326 (comment "overflow bit")
1327 (attrs all-isas)
1328 (type register BI)
1329 )
1330
1331 (define-hardware
1332 (name h-cbit)
1333 (comment "carry bit")
1334 (attrs all-isas)
1335 (type register BI)
1336 )
1337
1338 (define-hardware
1339 (name h-ubit)
1340 (comment "stack pointer select bit")
1341 (attrs all-isas)
1342 (type register BI)
1343 )
1344
1345 (define-hardware
1346 (name h-ibit)
1347 (comment "interrupt enable bit")
1348 (attrs all-isas)
1349 (type register BI)
1350 )
1351
1352 (define-hardware
1353 (name h-bbit)
1354 (comment "register bank select bit")
1355 (attrs all-isas)
1356 (type register BI)
1357 )
1358
1359 (define-hardware
1360 (name h-dbit)
1361 (comment "debug bit")
1362 (attrs all-isas)
1363 (type register BI)
1364 )
1365
1366 (define-hardware
1367 (name h-dct0)
1368 (comment "dma transfer count 000")
1369 (attrs all-isas)
1370 (type register UHI)
1371 )
1372 (define-hardware
1373 (name h-dct1)
1374 (comment "dma transfer count 001")
1375 (attrs all-isas)
1376 (type register UHI)
1377 )
1378 (define-hardware
1379 (name h-svf)
1380 (comment "save flag 011")
1381 (attrs all-isas)
1382 (type register UHI)
1383 )
1384 (define-hardware
1385 (name h-drc0)
1386 (comment "dma transfer count reload 100")
1387 (attrs all-isas)
1388 (type register UHI)
1389 )
1390 (define-hardware
1391 (name h-drc1)
1392 (comment "dma transfer count reload 101")
1393 (attrs all-isas)
1394 (type register UHI)
1395 )
1396 (define-hardware
1397 (name h-dmd0)
1398 (comment "dma mode 110")
1399 (attrs all-isas)
1400 (type register UQI)
1401 )
1402 (define-hardware
1403 (name h-dmd1)
1404 (comment "dma mode 111")
1405 (attrs all-isas)
1406 (type register UQI)
1407 )
1408 (define-hardware
1409 (name h-intb)
1410 (comment "interrupt table 000")
1411 (attrs all-isas)
1412 (type register USI)
1413 )
1414 (define-hardware
1415 (name h-svp)
1416 (comment "save pc 100")
1417 (attrs all-isas)
1418 (type register UHI)
1419 )
1420 (define-hardware
1421 (name h-vct)
1422 (comment "vector 101")
1423 (attrs all-isas)
1424 (type register USI)
1425 )
1426 (define-hardware
1427 (name h-isp)
1428 (comment "interrupt stack ptr 111")
1429 (attrs all-isas)
1430 (type register USI)
1431 )
1432 (define-hardware
1433 (name h-dma0)
1434 (comment "dma mem addr 010")
1435 (attrs all-isas)
1436 (type register USI)
1437 )
1438 (define-hardware
1439 (name h-dma1)
1440 (comment "dma mem addr 011")
1441 (attrs all-isas)
1442 (type register USI)
1443 )
1444 (define-hardware
1445 (name h-dra0)
1446 (comment "dma mem addr reload 100")
1447 (attrs all-isas)
1448 (type register USI)
1449 )
1450 (define-hardware
1451 (name h-dra1)
1452 (comment "dma mem addr reload 101")
1453 (attrs all-isas)
1454 (type register USI)
1455 )
1456 (define-hardware
1457 (name h-dsa0)
1458 (comment "dma sfr addr 110")
1459 (attrs all-isas)
1460 (type register USI)
1461 )
1462 (define-hardware
1463 (name h-dsa1)
1464 (comment "dma sfr addr 111")
1465 (attrs all-isas)
1466 (type register USI)
1467 )
1468
1469 ;-------------------------------------------------------------
1470 ; Condition code operand hardware
1471 ;-------------------------------------------------------------
1472
1473 (define-hardware
1474 (name h-cond16)
1475 (comment "condition code hardware for m16c")
1476 (attrs m16c-isa MACH16)
1477 (type immediate UQI)
1478 (values keyword ""
1479 (("geu" #x00) ("c" #x00)
1480 ("gtu" #x01)
1481 ("eq" #x02) ("z" #x02)
1482 ("n" #x03)
1483 ("le" #x04)
1484 ("o" #x05)
1485 ("ge" #x06)
1486 ("ltu" #xf8) ("nc" #xf8)
1487 ("leu" #xf9)
1488 ("ne" #xfa) ("nz" #xfa)
1489 ("pz" #xfb)
1490 ("gt" #xfc)
1491 ("no" #xfd)
1492 ("lt" #xfe)
1493 )
1494 )
1495 )
1496 (define-hardware
1497 (name h-cond16c)
1498 (comment "condition code hardware for m16c")
1499 (attrs m16c-isa MACH16)
1500 (type immediate UQI)
1501 (values keyword ""
1502 (("geu" #x00) ("c" #x00)
1503 ("gtu" #x01)
1504 ("eq" #x02) ("z" #x02)
1505 ("n" #x03)
1506 ("ltu" #x04) ("nc" #x04)
1507 ("leu" #x05)
1508 ("ne" #x06) ("nz" #x06)
1509 ("pz" #x07)
1510 ("le" #x08)
1511 ("o" #x09)
1512 ("ge" #x0a)
1513 ("gt" #x0c)
1514 ("no" #x0d)
1515 ("lt" #x0e)
1516 )
1517 )
1518 )
1519 (define-hardware
1520 (name h-cond16j)
1521 (comment "condition code hardware for m16c")
1522 (attrs m16c-isa MACH16)
1523 (type immediate UQI)
1524 (values keyword ""
1525 (("le" #x08)
1526 ("o" #x09)
1527 ("ge" #x0a)
1528 ("gt" #x0c)
1529 ("no" #x0d)
1530 ("lt" #x0e)
1531 )
1532 )
1533 )
1534 (define-hardware
1535 (name h-cond16j-5)
1536 (comment "condition code hardware for m16c")
1537 (attrs m16c-isa MACH16)
1538 (type immediate UQI)
1539 (values keyword ""
1540 (("geu" #x00) ("c" #x00)
1541 ("gtu" #x01)
1542 ("eq" #x02) ("z" #x02)
1543 ("n" #x03)
1544 ("ltu" #x04) ("nc" #x04)
1545 ("leu" #x05)
1546 ("ne" #x06) ("nz" #x06)
1547 ("pz" #x07)
1548 )
1549 )
1550 )
1551
1552 (define-hardware
1553 (name h-cond32)
1554 (comment "condition code hardware for m32c")
1555 (attrs m32c-isa MACH32)
1556 (type immediate UQI)
1557 (values keyword ""
1558 (("ltu" #x00) ("nc" #x00)
1559 ("leu" #x01)
1560 ("ne" #x02) ("nz" #x02)
1561 ("pz" #x03)
1562 ("no" #x04)
1563 ("gt" #x05)
1564 ("ge" #x06)
1565 ("geu" #x08) ("c" #x08)
1566 ("gtu" #x09)
1567 ("eq" #x0a) ("z" #x0a)
1568 ("n" #x0b)
1569 ("o" #x0c)
1570 ("le" #x0d)
1571 ("lt" #x0e)
1572 )
1573 )
1574 )
1575
1576 (define-hardware
1577 (name h-cr1-32)
1578 (comment "control registers")
1579 (attrs m32c-isa MACH32)
1580 (type immediate UQI)
1581 (values keyword "" (("dct0" 0) ("dct1" 1) ("flg" 2) ("svf" 3) ("drc0" 4)
1582 ("drc1" 5) ("dmd0" 6) ("dmd1" 7))))
1583 (define-hardware
1584 (name h-cr2-32)
1585 (comment "control registers")
1586 (attrs m32c-isa MACH32)
1587 (type immediate UQI)
1588 (values keyword "" (("intb" 0) ("sp" 1) ("sb" 2) ("fb" 3) ("svp" 4)
1589 ("vct" 5) ("isp" 7))))
1590
1591 (define-hardware
1592 (name h-cr3-32)
1593 (comment "control registers")
1594 (attrs m32c-isa MACH32)
1595 (type immediate UQI)
1596 (values keyword "" (("dma0" 2) ("dma1" 3) ("dra0" 4)
1597 ("dra1" 5) ("dsa0" 6) ("dsa1" 7))))
1598 (define-hardware
1599 (name h-cr-16)
1600 (comment "control registers")
1601 (attrs m16c-isa MACH16)
1602 (type immediate UQI)
1603 (values keyword "" (("intbl" 1) ("intbh" 2) ("flg" 3) ("isp" 4)
1604 ("sp" 5) ("sb" 6) ("fb" 7))))
1605
1606 (define-hardware
1607 (name h-flags)
1608 (comment "flag hardware for m32c")
1609 (attrs all-isas)
1610 (type immediate UQI)
1611 (values keyword ""
1612 (("c" #x0)
1613 ("d" #x1)
1614 ("z" #x2)
1615 ("s" #x3)
1616 ("b" #x4)
1617 ("o" #x5)
1618 ("i" #x6)
1619 ("u" #x7)
1620 )
1621 )
1622 )
1623
1624 ;-------------------------------------------------------------
1625 ; Misc helper hardware
1626 ;-------------------------------------------------------------
1627
1628 (define-hardware
1629 (name h-shimm)
1630 (comment "shift immediate")
1631 (attrs all-isas)
1632 (type immediate (INT 4))
1633 (values keyword "" (("1" 0) ("2" 1) ("3" 2) ("4" 3) ("5" 4) ("6" 5) ("7" 6)
1634 ("8" 7) ("-1" -8) ("-2" -7) ("-3" -6) ("-4" -5) ("-5" -4)
1635 ("-6" -3) ("-7" -2) ("-8" -1)
1636 )))
1637 (define-hardware
1638 (name h-bit-index)
1639 (comment "bit index for the next insn")
1640 (attrs m32c-isa MACH32)
1641 (type register UHI)
1642 )
1643 (define-hardware
1644 (name h-src-index)
1645 (comment "source index for the next insn")
1646 (attrs m32c-isa MACH32)
1647 (type register UHI)
1648 )
1649 (define-hardware
1650 (name h-dst-index)
1651 (comment "destination index for the next insn")
1652 (attrs m32c-isa MACH32)
1653 (type register UHI)
1654 )
1655 (define-hardware
1656 (name h-src-indirect)
1657 (comment "indirect src for the next insn")
1658 (attrs all-isas)
1659 (type register UHI)
1660 )
1661 (define-hardware
1662 (name h-dst-indirect)
1663 (comment "indirect dst for the next insn")
1664 (attrs all-isas)
1665 (type register UHI)
1666 )
1667 (define-hardware
1668 (name h-none)
1669 (comment "for storing unused values")
1670 (attrs m32c-isa MACH32)
1671 (type register SI)
1672 )
1673
1675 ;=============================================================
1676 ; Operands
1677 ;-------------------------------------------------------------
1678 ; Source Registers
1679 ;-------------------------------------------------------------
1680
1681 (dnop Src16RnQI "general register QI view" (MACH16 m16c-isa) h-gr-QI f-src16-rn)
1682 (dnop Src16RnHI "general register QH view" (MACH16 m16c-isa) h-gr-HI f-src16-rn)
1683
1684 (dnop Src32RnUnprefixedQI "general register QI view" (MACH32 m32c-isa) h-gr-QI f-src32-rn-unprefixed-QI)
1685 (dnop Src32RnUnprefixedHI "general register HI view" (MACH32 m32c-isa) h-gr-HI f-src32-rn-unprefixed-HI)
1686 (dnop Src32RnUnprefixedSI "general register SI view" (MACH32 m32c-isa) h-gr-SI f-src32-rn-unprefixed-SI)
1687
1688 (dnop Src32RnPrefixedQI "general register QI view" (MACH32 m32c-isa) h-gr-QI f-src32-rn-prefixed-QI)
1689 (dnop Src32RnPrefixedHI "general register HI view" (MACH32 m32c-isa) h-gr-HI f-src32-rn-prefixed-HI)
1690 (dnop Src32RnPrefixedSI "general register SI view" (MACH32 m32c-isa) h-gr-SI f-src32-rn-prefixed-SI)
1691
1692 (dnop Src16An "address register" (MACH16 m16c-isa) h-ar f-src16-an)
1693 (dnop Src16AnQI "address register QI view" (MACH16 m16c-isa) h-ar-QI f-src16-an)
1694 (dnop Src16AnHI "address register HI view" (MACH16 m16c-isa) h-ar-HI f-src16-an)
1695
1696 (dnop Src32AnUnprefixed "address register" (MACH32 m32c-isa) h-ar f-src32-an-unprefixed)
1697 (dnop Src32AnUnprefixedQI "address register QI view" (MACH32 m32c-isa) h-ar-QI f-src32-an-unprefixed)
1698 (dnop Src32AnUnprefixedHI "address register HI view" (MACH32 m32c-isa) h-ar-HI f-src32-an-unprefixed)
1699 (dnop Src32AnUnprefixedSI "address register SI view" (MACH32 m32c-isa) h-ar f-src32-an-unprefixed)
1700
1701 (dnop Src32AnPrefixed "address register" (MACH32 m32c-isa) h-ar f-src32-an-prefixed)
1702 (dnop Src32AnPrefixedQI "address register QI view" (MACH32 m32c-isa) h-ar-QI f-src32-an-prefixed)
1703 (dnop Src32AnPrefixedHI "address register HI view" (MACH32 m32c-isa) h-ar-HI f-src32-an-prefixed)
1704 (dnop Src32AnPrefixedSI "address register SI view" (MACH32 m32c-isa) h-ar f-src32-an-prefixed)
1705
1706 ; Destination Registers
1707 ;
1708 (dnop Dst16RnQI "general register QI view" (MACH16 m16c-isa) h-gr-QI f-dst16-rn)
1709 (dnop Dst16RnHI "general register HI view" (MACH16 m16c-isa) h-gr-HI f-dst16-rn)
1710 (dnop Dst16RnSI "general register SI view" (MACH16 m16c-isa) h-gr-SI f-dst16-rn)
1711 (dnop Dst16RnExtQI "general register QI/HI view for 'ext' insns" (MACH16 m16c-isa) h-gr-ext-QI f-dst16-rn-ext)
1712
1713 (dnop Dst32R0QI-S "general register QI view" (MACH32 m32c-isa) h-r0l f-nil)
1714 (dnop Dst32R0HI-S "general register HI view" (MACH32 m32c-isa) h-r0 f-nil)
1715
1716 (dnop Dst32RnUnprefixedQI "general register QI view" (MACH32 m32c-isa) h-gr-QI f-dst32-rn-unprefixed-QI)
1717 (dnop Dst32RnUnprefixedHI "general register HI view" (MACH32 m32c-isa) h-gr-HI f-dst32-rn-unprefixed-HI)
1718 (dnop Dst32RnUnprefixedSI "general register SI view" (MACH32 m32c-isa) h-gr-SI f-dst32-rn-unprefixed-SI)
1719 (dnop Dst32RnExtUnprefixedQI "general register QI view" (MACH32 m32c-isa) h-gr-ext-QI f-dst32-rn-ext-unprefixed)
1720 (dnop Dst32RnExtUnprefixedHI "general register HI view" (MACH32 m32c-isa) h-gr-ext-HI f-dst32-rn-ext-unprefixed)
1721
1722 (dnop Dst32RnPrefixedQI "general register QI view" (MACH32 m32c-isa) h-gr-QI f-dst32-rn-prefixed-QI)
1723 (dnop Dst32RnPrefixedHI "general register HI view" (MACH32 m32c-isa) h-gr-HI f-dst32-rn-prefixed-HI)
1724 (dnop Dst32RnPrefixedSI "general register SI view" (MACH32 m32c-isa) h-gr-SI f-dst32-rn-prefixed-SI)
1725
1726 (dnop Dst16RnQI-S "general register QI view" (MACH16 m16c-isa) h-r0l-r0h f-dst16-rn-QI-s)
1727
1728 (dnop Dst16AnQI-S "address register QI view" (MACH16 m16c-isa) h-ar-QI f-dst16-rn-QI-s)
1729
1730 (dnop Bit16Rn "general register bit view" (MACH16 m16c-isa) h-gr-HI f-dst16-rn)
1731
1732 (dnop Bit32RnPrefixed "general register bit view" (MACH32 m32c-isa) h-gr-QI f-dst32-rn-prefixed-QI)
1733 (dnop Bit32RnUnprefixed "general register bit view" (MACH32 m32c-isa) h-gr-QI f-dst32-rn-unprefixed-QI)
1734
1735 (dnop R0 "r0" (all-isas) h-r0 f-nil)
1736 (dnop R1 "r1" (all-isas) h-r1 f-nil)
1737 (dnop R2 "r2" (all-isas) h-r2 f-nil)
1738 (dnop R3 "r3" (all-isas) h-r3 f-nil)
1739 (dnop R0l "r0l" (all-isas) h-r0l f-nil)
1740 (dnop R0h "r0h" (all-isas) h-r0h f-nil)
1741 (dnop R2R0 "r2r0" (all-isas) h-r2r0 f-nil)
1742 (dnop R3R1 "r3r1" (all-isas) h-r3r1 f-nil)
1743 (dnop R1R2R0 "r1r2r0" (all-isas) h-r1r2r0 f-nil)
1744
1745 (dnop Dst16An "address register" (MACH16 m16c-isa) h-ar f-dst16-an)
1746 (dnop Dst16AnQI "address register QI view" (MACH16 m16c-isa) h-ar-QI f-dst16-an)
1747 (dnop Dst16AnHI "address register HI view" (MACH16 m16c-isa) h-ar-HI f-dst16-an)
1748 (dnop Dst16AnSI "address register SI view" (MACH16 m16c-isa) h-ar-SI f-dst16-an)
1749 (dnop Dst16An-S "address register HI view" (MACH16 m16c-isa) h-ar-HI f-dst16-an-s)
1750
1751 (dnop Dst32AnUnprefixed "address register" (MACH32 m32c-isa) h-ar f-dst32-an-unprefixed)
1752 (dnop Dst32AnUnprefixedQI "address register QI view" (MACH32 m32c-isa) h-ar-QI f-dst32-an-unprefixed)
1753 (dnop Dst32AnUnprefixedHI "address register HI view" (MACH32 m32c-isa) h-ar-HI f-dst32-an-unprefixed)
1754 (dnop Dst32AnUnprefixedSI "address register SI view" (MACH32 m32c-isa) h-ar f-dst32-an-unprefixed)
1755
1756 (dnop Dst32AnExtUnprefixed "address register" (MACH32 m32c-isa) h-ar f-dst32-an-unprefixed)
1757
1758 (dnop Dst32AnPrefixed "address register" (MACH32 m32c-isa) h-ar f-dst32-an-prefixed)
1759 (dnop Dst32AnPrefixedQI "address register QI view" (MACH32 m32c-isa) h-ar-QI f-dst32-an-prefixed)
1760 (dnop Dst32AnPrefixedHI "address register HI view" (MACH32 m32c-isa) h-ar-HI f-dst32-an-prefixed)
1761 (dnop Dst32AnPrefixedSI "address register SI view" (MACH32 m32c-isa) h-ar f-dst32-an-prefixed)
1762
1763 (dnop Bit16An "address register bit view" (MACH16 m16c-isa) h-ar f-dst16-an)
1764
1765 (dnop Bit32AnPrefixed "address register bit" (MACH32 m32c-isa) h-ar f-dst32-an-prefixed)
1766 (dnop Bit32AnUnprefixed "address register bit" (MACH32 m32c-isa) h-ar f-dst32-an-unprefixed)
1767
1768 (dnop A0 "a0" (all-isas) h-a0 f-nil)
1769 (dnop A1 "a1" (all-isas) h-a1 f-nil)
1770
1771 (dnop sb "SB register" (all-isas SEM-ONLY) h-sb f-nil)
1772 (dnop fb "FB register" (all-isas SEM-ONLY) h-fb f-nil)
1773 (dnop sp "SP register" (all-isas SEM-ONLY) h-sp f-nil)
1774
1775 (define-full-operand SrcDst16-r0l-r0h-S-normal "r0l/r0h pair" (MACH16 m16c-isa)
1776 h-sint DFLT f-5-1
1777 ((parse "r0l_r0h") (print "r0l_r0h")) () ()
1778 )
1779
1780 (define-full-operand Regsetpop "popm regset" (all-isas) h-uint
1781 DFLT f-8-8 ((parse "pop_regset") (print "pop_regset")) () ())
1782 (define-full-operand Regsetpush "pushm regset" (all-isas) h-uint
1783 DFLT f-8-8 ((parse "push_regset") (print "push_regset")) () ())
1784
1785 (dnop Rn16-push-S "r0[lh]" (MACH16 m16c-isa) h-gr-QI f-4-1)
1786 (dnop An16-push-S "a[01]" (MACH16 m16c-isa) h-ar-HI f-4-1)
1787
1788 ;-------------------------------------------------------------
1789 ; Offsets and absolutes
1790 ;-------------------------------------------------------------
1791
1792 (define-full-operand Dsp-8-u6 "unsigned 6 bit displacement at offset 8 bits" (all-isas)
1793 h-uint DFLT f-dsp-8-u6
1794 ((parse "unsigned6")) () ()
1795 )
1796 (define-full-operand Dsp-8-u8 "unsigned 8 bit displacement at offset 8 bits" (all-isas)
1797 h-uint DFLT f-dsp-8-u8
1798 ((parse "unsigned8")) () ()
1799 )
1800 (define-full-operand Dsp-8-u16 "unsigned 16 bit displacement at offset 8 bits" (all-isas)
1801 h-uint DFLT f-dsp-8-u16
1802 ((parse "unsigned16")) () ()
1803 )
1804 (define-full-operand Dsp-8-s8 "signed 8 bit displacement at offset 8 bits" (all-isas)
1805 h-sint DFLT f-dsp-8-s8
1806 ((parse "signed8")) () ()
1807 )
1808 (define-full-operand Dsp-8-s24 "signed 24 bit displacement at offset 8 bits" (all-isas)
1809 h-sint DFLT f-dsp-8-s24
1810 ((parse "signed24")) () ()
1811 )
1812 (define-full-operand Dsp-8-u24 "unsigned 24 bit displacement at offset 8 bits" (all-isas)
1813 h-uint DFLT f-dsp-8-u24
1814 ((parse "unsigned24")) () ()
1815 )
1816 (define-full-operand Dsp-10-u6 "unsigned 6 bit displacement at offset 10 bits" (all-isas)
1817 h-uint DFLT f-dsp-10-u6
1818 ((parse "unsigned6")) () ()
1819 )
1820 (define-full-operand Dsp-16-u8 "unsigned 8 bit displacement at offset 16 bits" (all-isas)
1821 h-uint DFLT f-dsp-16-u8
1822 ((parse "unsigned8")) () ()
1823 )
1824 (define-full-operand Dsp-16-u16 "unsigned 16 bit displacement at offset 16 bits" (all-isas)
1825 h-uint DFLT f-dsp-16-u16
1826 ((parse "unsigned16")) () ()
1827 )
1828 (define-full-operand Dsp-16-u20 "unsigned 20 bit displacement at offset 16 bits" (all-isas)
1829 h-uint DFLT f-dsp-16-u24
1830 ((parse "unsigned20")) () ()
1831 )
1832 (define-full-operand Dsp-16-u24 "unsigned 24 bit displacement at offset 16 bits" (all-isas)
1833 h-uint DFLT f-dsp-16-u24
1834 ((parse "unsigned24")) () ()
1835 )
1836 (define-full-operand Dsp-16-s8 "signed 8 bit displacement at offset 16 bits" (all-isas)
1837 h-sint DFLT f-dsp-16-s8
1838 ((parse "signed8")) () ()
1839 )
1840 (define-full-operand Dsp-16-s16 "signed 16 bit displacement at offset 16 bits" (all-isas)
1841 h-sint DFLT f-dsp-16-s16
1842 ((parse "signed16")) () ()
1843 )
1844 (define-full-operand Dsp-24-u8 "unsigned 8 bit displacement at offset 24 bits" (all-isas)
1845 h-uint DFLT f-dsp-24-u8
1846 ((parse "unsigned8")) () ()
1847 )
1848 (define-full-operand Dsp-24-u16 "unsigned 16 bit displacement at offset 24 bits" (all-isas)
1849 h-uint DFLT f-dsp-24-u16
1850 ((parse "unsigned16")) () ()
1851 )
1852 (define-full-operand Dsp-24-u20 "unsigned 20 bit displacement at offset 24 bits" (all-isas)
1853 h-uint DFLT f-dsp-24-u24
1854 ((parse "unsigned20")) () ()
1855 )
1856 (define-full-operand Dsp-24-u24 "unsigned 24 bit displacement at offset 24 bits" (all-isas)
1857 h-uint DFLT f-dsp-24-u24
1858 ((parse "unsigned24")) () ()
1859 )
1860 (define-full-operand Dsp-24-s8 "signed 8 bit displacement at offset 24 bits" (all-isas)
1861 h-sint DFLT f-dsp-24-s8
1862 ((parse "signed8")) () ()
1863 )
1864 (define-full-operand Dsp-24-s16 "signed 16 bit displacement at offset 24 bits" (all-isas)
1865 h-sint DFLT f-dsp-24-s16
1866 ((parse "signed16")) () ()
1867 )
1868 (define-full-operand Dsp-32-u8 "unsigned 8 bit displacement at offset 32 bits" (all-isas)
1869 h-uint DFLT f-dsp-32-u8
1870 ((parse "unsigned8")) () ()
1871 )
1872 (define-full-operand Dsp-32-u16 "unsigned 16 bit displacement at offset 32 bits" (all-isas)
1873 h-uint DFLT f-dsp-32-u16
1874 ((parse "unsigned16")) () ()
1875 )
1876 (define-full-operand Dsp-32-u24 "unsigned 24 bit displacement at offset 32 bits" (all-isas)
1877 h-uint DFLT f-dsp-32-u24
1878 ((parse "unsigned24")) () ()
1879 )
1880 (define-full-operand Dsp-32-u20 "unsigned 20 bit displacement at offset 32 bits" (all-isas)
1881 h-uint DFLT f-dsp-32-u24
1882 ((parse "unsigned20")) () ()
1883 )
1884 (define-full-operand Dsp-32-s8 "signed 8 bit displacement at offset 32 bits" (all-isas)
1885 h-sint DFLT f-dsp-32-s8
1886 ((parse "signed8")) () ()
1887 )
1888 (define-full-operand Dsp-32-s16 "signed 16 bit displacement at offset 32 bits" (all-isas)
1889 h-sint DFLT f-dsp-32-s16
1890 ((parse "signed16")) () ()
1891 )
1892 (define-full-operand Dsp-40-u8 "unsigned 8 bit displacement at offset 40 bits" (all-isas)
1893 h-uint DFLT f-dsp-40-u8
1894 ((parse "unsigned8")) () ()
1895 )
1896 (define-full-operand Dsp-40-s8 "signed 8 bit displacement at offset 40 bits" (all-isas)
1897 h-sint DFLT f-dsp-40-s8
1898 ((parse "signed8")) () ()
1899 )
1900 (define-full-operand Dsp-40-u16 "unsigned 16 bit displacement at offset 40 bits" (all-isas)
1901 h-uint DFLT f-dsp-40-u16
1902 ((parse "unsigned16")) () ()
1903 )
1904 (define-full-operand Dsp-40-s16 "signed 16 bit displacement at offset 40 bits" (all-isas)
1905 h-sint DFLT f-dsp-40-s16
1906 ((parse "signed16")) () ()
1907 )
1908 (define-full-operand Dsp-40-u20 "unsigned 20 bit displacement at offset 40 bits" (all-isas)
1909 h-uint DFLT f-dsp-40-u20
1910 ((parse "unsigned20")) () ()
1911 )
1912 (define-full-operand Dsp-40-u24 "unsigned 24 bit displacement at offset 40 bits" (all-isas)
1913 h-uint DFLT f-dsp-40-u24
1914 ((parse "unsigned24")) () ()
1915 )
1916 (define-full-operand Dsp-48-u8 "unsigned 8 bit displacement at offset 48 bits" (all-isas)
1917 h-uint DFLT f-dsp-48-u8
1918 ((parse "unsigned8")) () ()
1919 )
1920 (define-full-operand Dsp-48-s8 "signed 8 bit displacement at offset 48 bits" (all-isas)
1921 h-sint DFLT f-dsp-48-s8
1922 ((parse "signed8")) () ()
1923 )
1924 (define-full-operand Dsp-48-u16 "unsigned 16 bit displacement at offset 48 bits" (all-isas)
1925 h-uint DFLT f-dsp-48-u16
1926 ((parse "unsigned16")) () ()
1927 )
1928 (define-full-operand Dsp-48-s16 "signed 16 bit displacement at offset 48 bits" (all-isas)
1929 h-sint DFLT f-dsp-48-s16
1930 ((parse "signed16")) () ()
1931 )
1932 (define-full-operand Dsp-48-u20 "unsigned 24 bit displacement at offset 40 bits" (all-isas)
1933 h-uint DFLT f-dsp-48-u20
1934 ((parse "unsigned24")) () ()
1935 )
1936 (define-full-operand Dsp-48-u24 "unsigned 24 bit displacement at offset 48 bits" (all-isas)
1937 h-uint DFLT f-dsp-48-u24
1938 ((parse "unsigned24")) () ()
1939 )
1940
1941 (define-full-operand Imm-8-s4 "signed 4 bit immediate at offset 8 bits" (all-isas)
1942 h-sint DFLT f-imm-8-s4
1943 ((parse "signed4")) () ()
1944 )
1945 (define-full-operand Imm-8-s4n "negated 4 bit immediate at offset 8 bits" (all-isas)
1946 h-sint DFLT f-imm-8-s4
1947 ((parse "signed4n") (print "signed4n")) () ()
1948 )
1949 (define-full-operand Imm-sh-8-s4 "signed 4 bit shift immediate at offset 8 bits" (all-isas)
1950 h-shimm DFLT f-imm-8-s4
1951 () () ()
1952 )
1953 (define-full-operand Imm-8-QI "signed 8 bit immediate at offset 8 bits" (all-isas)
1954 h-sint DFLT f-dsp-8-s8
1955 ((parse "signed8")) () ()
1956 )
1957 (define-full-operand Imm-8-HI "signed 16 bit immediate at offset 8 bits" (all-isas)
1958 h-sint DFLT f-dsp-8-s16
1959 ((parse "signed16")) () ()
1960 )
1961 (define-full-operand Imm-12-s4 "signed 4 bit immediate at offset 12 bits" (all-isas)
1962 h-sint DFLT f-imm-12-s4
1963 ((parse "signed4")) () ()
1964 )
1965 (define-full-operand Imm-12-s4n "negated 4 bit immediate at offset 12 bits" (all-isas)
1966 h-sint DFLT f-imm-12-s4
1967 ((parse "signed4n") (print "signed4n")) () ()
1968 )
1969 (define-full-operand Imm-sh-12-s4 "signed 4 bit shift immediate at offset 12 bits" (all-isas)
1970 h-shimm DFLT f-imm-12-s4
1971 () () ()
1972 )
1973 (define-full-operand Imm-13-u3 "signed 3 bit immediate at offset 13 bits" (all-isas)
1974 h-sint DFLT f-imm-13-u3
1975 ((parse "signed4")) () ()
1976 )
1977 (define-full-operand Imm-20-s4 "signed 4 bit immediate at offset 20 bits" (all-isas)
1978 h-sint DFLT f-imm-20-s4
1979 ((parse "signed4")) () ()
1980 )
1981 (define-full-operand Imm-sh-20-s4 "signed 4 bit shift immediate at offset 12 bits" (all-isas)
1982 h-shimm DFLT f-imm-20-s4
1983 () () ()
1984 )
1985 (define-full-operand Imm-16-QI "signed 8 bit immediate at offset 16 bits" (all-isas)
1986 h-sint DFLT f-dsp-16-s8
1987 ((parse "signed8")) () ()
1988 )
1989 (define-full-operand Imm-16-HI "signed 16 bit immediate at offset 16 bits" (all-isas)
1990 h-sint DFLT f-dsp-16-s16
1991 ((parse "signed16")) () ()
1992 )
1993 (define-full-operand Imm-16-SI "signed 32 bit immediate at offset 16 bits" (all-isas)
1994 h-sint DFLT f-dsp-16-s32
1995 ((parse "signed32")) () ()
1996 )
1997 (define-full-operand Imm-24-QI "signed 8 bit immediate at offset 24 bits" (all-isas)
1998 h-sint DFLT f-dsp-24-s8
1999 ((parse "signed8")) () ()
2000 )
2001 (define-full-operand Imm-24-HI "signed 16 bit immediate at offset 24 bits" (all-isas)
2002 h-sint DFLT f-dsp-24-s16
2003 ((parse "signed16")) () ()
2004 )
2005 (define-full-operand Imm-24-SI "signed 32 bit immediate at offset 24 bits" (all-isas)
2006 h-sint DFLT f-dsp-24-s32
2007 ((parse "signed32")) () ()
2008 )
2009 (define-full-operand Imm-32-QI "signed 8 bit immediate at offset 32 bits" (all-isas)
2010 h-sint DFLT f-dsp-32-s8
2011 ((parse "signed8")) () ()
2012 )
2013 (define-full-operand Imm-32-SI "signed 32 bit immediate at offset 32 bits" (all-isas)
2014 h-sint DFLT f-dsp-32-s32
2015 ((parse "signed32")) () ()
2016 )
2017 (define-full-operand Imm-32-HI "signed 16 bit immediate at offset 32 bits" (all-isas)
2018 h-sint DFLT f-dsp-32-s16
2019 ((parse "signed16")) () ()
2020 )
2021 (define-full-operand Imm-40-QI "signed 8 bit immediate at offset 40 bits" (all-isas)
2022 h-sint DFLT f-dsp-40-s8
2023 ((parse "signed8")) () ()
2024 )
2025 (define-full-operand Imm-40-HI "signed 16 bit immediate at offset 40 bits" (all-isas)
2026 h-sint DFLT f-dsp-40-s16
2027 ((parse "signed16")) () ()
2028 )
2029 (define-full-operand Imm-40-SI "signed 32 bit immediate at offset 40 bits" (all-isas)
2030 h-sint DFLT f-dsp-40-s32
2031 ((parse "signed32")) () ()
2032 )
2033 (define-full-operand Imm-48-QI "signed 8 bit immediate at offset 48 bits" (all-isas)
2034 h-sint DFLT f-dsp-48-s8
2035 ((parse "signed8")) () ()
2036 )
2037 (define-full-operand Imm-48-HI "signed 16 bit immediate at offset 48 bits" (all-isas)
2038 h-sint DFLT f-dsp-48-s16
2039 ((parse "signed16")) () ()
2040 )
2041 (define-full-operand Imm-48-SI "signed 32 bit immediate at offset 48 bits" (all-isas)
2042 h-sint DFLT f-dsp-48-s32
2043 ((parse "signed32")) () ()
2044 )
2045 (define-full-operand Imm-56-QI "signed 8 bit immediate at offset 56 bits" (all-isas)
2046 h-sint DFLT f-dsp-56-s8
2047 ((parse "signed8")) () ()
2048 )
2049 (define-full-operand Imm-56-HI "signed 16 bit immediate at offset 56 bits" (all-isas)
2050 h-sint DFLT f-dsp-56-s16
2051 ((parse "signed16")) () ()
2052 )
2053 (define-full-operand Imm-64-HI "signed 16 bit immediate at offset 64 bits" (all-isas)
2054 h-sint DFLT f-dsp-64-s16
2055 ((parse "signed16")) () ()
2056 )
2057 (define-full-operand Imm1-S "signed 1 bit immediate for short format binary insns" (m32c-isa)
2058 h-sint DFLT f-imm1-S
2059 ((parse "imm1_S")) () ()
2060 )
2061 (define-full-operand Imm3-S "signed 3 bit immediate for short format binary insns" (m32c-isa)
2062 h-sint DFLT f-imm3-S
2063 ((parse "imm3_S")) () ()
2064 )
2065 (define-full-operand Bit3-S "3 bit bit number" (m32c-isa)
2066 h-sint DFLT f-imm3-S
2067 ((parse "bit3_S")) () ()
2068 )
2069
2070 ;-------------------------------------------------------------
2071 ; Bit numbers
2072 ;-------------------------------------------------------------
2073
2074 (define-full-operand Bitno16R "bit number for indexing registers" (m16c-isa)
2075 h-uint DFLT f-dsp-16-u8
2076 ((parse "Bitno16R")) () ()
2077 )
2078 (dnop Bitno32Prefixed "bit number for indexing objects" (m32c-isa) h-uint f-bitno32-prefixed)
2079 (dnop Bitno32Unprefixed "bit number for indexing objects" (m32c-isa) h-uint f-bitno32-unprefixed)
2080
2081 (define-full-operand BitBase16-16-u8 "unsigned bit,base:8 at offset 16for m16c" (m16c-isa)
2082 h-uint DFLT f-dsp-16-u8
2083 ((parse "unsigned_bitbase8") (print "unsigned_bitbase")) () ()
2084 )
2085 (define-full-operand BitBase16-16-s8 "signed bit,base:8 at offset 16for m16c" (m16c-isa)
2086 h-sint DFLT f-dsp-16-s8
2087 ((parse "signed_bitbase8") (print "signed_bitbase")) () ()
2088 )
2089 (define-full-operand BitBase16-16-u16 "unsigned bit,base:16 at offset 16 for m16c" (m16c-isa)
2090 h-uint DFLT f-dsp-16-u16
2091 ((parse "unsigned_bitbase16") (print "unsigned_bitbase")) () ()
2092 )
2093 (define-full-operand BitBase16-8-u11-S "signed bit,base:11 at offset 16 for m16c" (m16c-isa)
2094 h-uint DFLT f-bitbase16-u11-S
2095 ((parse "unsigned_bitbase11") (print "unsigned_bitbase")) () ()
2096 )
2097
2098 (define-full-operand BitBase32-16-u11-Unprefixed "unsigned bit,base:11 at offset 16 for m32c" (m32c-isa)
2099 h-uint DFLT f-bitbase32-16-u11-unprefixed
2100 ((parse "unsigned_bitbase11") (print "unsigned_bitbase")) () ()
2101 )
2102 (define-full-operand BitBase32-16-s11-Unprefixed "signed bit,base:11 at offset 16 for m32c" (m32c-isa)
2103 h-sint DFLT f-bitbase32-16-s11-unprefixed
2104 ((parse "signed_bitbase11") (print "signed_bitbase")) () ()
2105 )
2106 (define-full-operand BitBase32-16-u19-Unprefixed "unsigned bit,base:19 at offset 16 for m32c" (m32c-isa)
2107 h-uint DFLT f-bitbase32-16-u19-unprefixed
2108 ((parse "unsigned_bitbase19") (print "unsigned_bitbase")) () ()
2109 )
2110 (define-full-operand BitBase32-16-s19-Unprefixed "signed bit,base:19 at offset 16 for m32c" (m32c-isa)
2111 h-sint DFLT f-bitbase32-16-s19-unprefixed
2112 ((parse "signed_bitbase19") (print "signed_bitbase")) () ()
2113 )
2114 (define-full-operand BitBase32-16-u27-Unprefixed "unsigned bit,base:27 at offset 16 for m32c" (m32c-isa)
2115 h-uint DFLT f-bitbase32-16-u27-unprefixed
2116 ((parse "unsigned_bitbase27") (print "unsigned_bitbase")) () ()
2117 )
2118 (define-full-operand BitBase32-24-u11-Prefixed "unsigned bit,base:11 at offset 24 for m32c" (m32c-isa)
2119 h-uint DFLT f-bitbase32-24-u11-prefixed
2120 ((parse "unsigned_bitbase11") (print "unsigned_bitbase")) () ()
2121 )
2122 (define-full-operand BitBase32-24-s11-Prefixed "signed bit,base:11 at offset 24 for m32c" (m32c-isa)
2123 h-sint DFLT f-bitbase32-24-s11-prefixed
2124 ((parse "signed_bitbase11") (print "signed_bitbase")) () ()
2125 )
2126 (define-full-operand BitBase32-24-u19-Prefixed "unsigned bit,base:19 at offset 24 for m32c" (m32c-isa)
2127 h-uint DFLT f-bitbase32-24-u19-prefixed
2128 ((parse "unsigned_bitbase19") (print "unsigned_bitbase")) () ()
2129 )
2130 (define-full-operand BitBase32-24-s19-Prefixed "signed bit,base:19 at offset 24 for m32c" (m32c-isa)
2131 h-sint DFLT f-bitbase32-24-s19-prefixed
2132 ((parse "signed_bitbase19") (print "signed_bitbase")) () ()
2133 )
2134 (define-full-operand BitBase32-24-u27-Prefixed "unsigned bit,base:27 at offset 24 for m32c" (m32c-isa)
2135 h-uint DFLT f-bitbase32-24-u27-prefixed
2136 ((parse "unsigned_bitbase27") (print "unsigned_bitbase")) () ()
2137 )
2138 ;-------------------------------------------------------------
2139 ; Labels
2140 ;-------------------------------------------------------------
2141
2142 (define-full-operand Lab-5-3 "3 bit label" (all-isas RELAX)
2143 h-iaddr DFLT f-lab-5-3
2144 ((parse "lab_5_3")) () () )
2145
2146 (define-full-operand Lab32-jmp-s "3 bit label" (all-isas RELAX)
2147 h-iaddr DFLT f-lab32-jmp-s
2148 ((parse "lab_5_3")) () () )
2149
2150 (dnop Lab-8-8 "8 bit label" (all-isas RELAX) h-iaddr f-lab-8-8)
2151 (dnop Lab-8-16 "16 bit label" (all-isas RELAX) h-iaddr f-lab-8-16)
2152 (dnop Lab-8-24 "24 bit label" (all-isas RELAX) h-iaddr f-lab-8-24)
2153 (dnop Lab-16-8 "8 bit label" (all-isas RELAX) h-iaddr f-lab-16-8)
2154 (dnop Lab-24-8 "8 bit label" (all-isas RELAX) h-iaddr f-lab-24-8)
2155 (dnop Lab-32-8 "8 bit label" (all-isas RELAX) h-iaddr f-lab-32-8)
2156 (dnop Lab-40-8 "8 bit label" (all-isas RELAX) h-iaddr f-lab-40-8)
2157
2158 ;-------------------------------------------------------------
2159 ; Condition code bits
2160 ;-------------------------------------------------------------
2161
2162 (dnop sbit "negative bit" (SEM-ONLY all-isas) h-sbit f-nil)
2163 (dnop obit "overflow bit" (SEM-ONLY all-isas) h-obit f-nil)
2164 (dnop zbit "zero bit" (SEM-ONLY all-isas) h-zbit f-nil)
2165 (dnop cbit "carry bit" (SEM-ONLY all-isas) h-cbit f-nil)
2166 (dnop ubit "stack ptr select bit" (SEM-ONLY all-isas) h-ubit f-nil)
2167 (dnop ibit "interrupt enable bit" (SEM-ONLY all-isas) h-ibit f-nil)
2168 (dnop bbit "reg bank select bit" (SEM-ONLY all-isas) h-bbit f-nil)
2169 (dnop dbit "debug bit" (SEM-ONLY all-isas) h-dbit f-nil)
2170
2171 ;-------------------------------------------------------------
2172 ; Condition operands
2173 ;-------------------------------------------------------------
2174
2175 (define-pmacro (cond-operand mach offset)
2176 (dnop (.sym cond mach - offset) "condition" ((.sym m mach c-isa)) (.sym h-cond mach) (.sym f-dsp- offset -u8))
2177 )
2178
2179 (cond-operand 16 16)
2180 (cond-operand 16 24)
2181 (cond-operand 16 32)
2182 (cond-operand 32 16)
2183 (cond-operand 32 24)
2184 (cond-operand 32 32)
2185 (cond-operand 32 40)
2186
2187 (dnop cond16c "condition" (m16c-isa) h-cond16c f-cond16)
2188 (dnop cond16j "condition" (m16c-isa) h-cond16j f-cond16)
2189 (dnop cond16j5 "condition" (m16c-isa) h-cond16j-5 f-cond16j-5)
2190 (dnop cond32 "condition" (m32c-isa) h-cond32 f-cond32)
2191 (dnop cond32j "condition" (m32c-isa) h-cond32 f-cond32j)
2192 (dnop sccond32 "scCND condition" (m32c-isa) h-cond32 f-cond16)
2193 (dnop flags16 "flags" (m16c-isa) h-flags f-9-3)
2194 (dnop flags32 "flags" (m32c-isa) h-flags f-13-3)
2195 (dnop cr16 "control" (m16c-isa) h-cr-16 f-9-3)
2196 (dnop cr1-Unprefixed-32 "control" (m32c-isa) h-cr1-32 f-13-3)
2197 (dnop cr1-Prefixed-32 "control" (m32c-isa) h-cr1-32 f-21-3)
2198 (dnop cr2-32 "control" (m32c-isa) h-cr2-32 f-13-3)
2199 (dnop cr3-Unprefixed-32 "control" (m32c-isa) h-cr3-32 f-13-3)
2200 (dnop cr3-Prefixed-32 "control" (m32c-isa) h-cr3-32 f-21-3)
2201
2202 ;-------------------------------------------------------------
2203 ; Suffixes
2204 ;-------------------------------------------------------------
2205
2206 (define-full-operand Z "Suffix for zero format insns" (all-isas)
2207 h-sint DFLT f-nil
2208 ((parse "Z") (print "Z")) () ()
2209 )
2210 (define-full-operand S "Suffix for short format insns" (all-isas)
2211 h-sint DFLT f-nil
2212 ((parse "S") (print "S")) () ()
2213 )
2214 (define-full-operand Q "Suffix for quick format insns" (all-isas)
2215 h-sint DFLT f-nil
2216 ((parse "Q") (print "Q")) () ()
2217 )
2218 (define-full-operand G "Suffix for general format insns" (all-isas)
2219 h-sint DFLT f-nil
2220 ((parse "G") (print "G")) () ()
2221 )
2222 (define-full-operand X "Empty suffix" (all-isas)
2223 h-sint DFLT f-nil
2224 ((parse "X") (print "X")) () ()
2225 )
2226 (define-full-operand size "any size specifier" (all-isas)
2227 h-sint DFLT f-nil
2228 ((parse "size") (print "size")) () ()
2229 )
2230 ;-------------------------------------------------------------
2231 ; Misc
2232 ;-------------------------------------------------------------
2233
2234 (dnop BitIndex "Bit Index for the next insn" (SEM-ONLY MACH32 m32c-isa) h-bit-index f-nil)
2235 (dnop SrcIndex "Source Index for the next insn" (SEM-ONLY MACH32 m32c-isa) h-src-index f-nil)
2236 (dnop DstIndex "Destination Index for the next insn" (SEM-ONLY MACH32 m32c-isa) h-dst-index f-nil)
2237 (dnop NoRemainder "Place holder for when the remainder is not kept" (SEM-ONLY MACH32 m32c-isa) h-none f-nil)
2238
2240 ;=============================================================
2241 ; Derived Operands
2242
2243 ; Memory reference macros that clip addresses appropriately. Refer to
2244 ; memory at ADDRESS in MODE, clipped appropriately for either the m16c
2245 ; or m32c.
2246 (define-pmacro (mem16 mode address)
2247 (mem mode (and #xffff address)))
2248
2249 (define-pmacro (mem20 mode address)
2250 (mem mode (and #xfffff address)))
2251
2252 (define-pmacro (mem32 mode address)
2253 (mem mode (and #xffffff address)))
2254
2255 ; Like mem16 and mem32, but takes MACH as a parameter. MACH must be
2256 ; either 16 or 32.
2257 (define-pmacro (mem-mach mach mode address)
2258 ((.sym mem mach) mode address))
2259
2260 ;-------------------------------------------------------------
2261 ; Source
2262 ;-------------------------------------------------------------
2263 ; Rn direct
2264 ;-------------------------------------------------------------
2265
2266 (define-pmacro (src16-Rn-direct-operand xmode)
2267 (begin
2268 (define-derived-operand
2269 (name (.sym src16-Rn-direct- xmode))
2270 (comment (.str "m16c Rn direct source " xmode))
2271 (attrs (machine 16))
2272 (mode xmode)
2273 (args ((.sym Src16Rn xmode)))
2274 (syntax (.str "$Src16Rn" xmode))
2275 (base-ifield f-8-4)
2276 (encoding (+ (f-8-2 0) (.sym Src16Rn xmode)))
2277 (ifield-assertion (eq f-8-2 0))
2278 (getter (trunc xmode (.sym Src16Rn xmode)))
2279 (setter (set (.sym Src16Rn xmode) newval))
2280 )
2281 )
2282 )
2283 (src16-Rn-direct-operand QI)
2284 (src16-Rn-direct-operand HI)
2285
2286 (define-pmacro (src32-Rn-direct-operand group base xmode)
2287 (begin
2288 (define-derived-operand
2289 (name (.sym src32-Rn-direct- group - xmode))
2290 (comment (.str "m32c Rn direct source " xmode))
2291 (attrs (machine 32))
2292 (mode xmode)
2293 (args ((.sym Src32Rn group xmode)))
2294 (syntax (.str "$Src32Rn" group xmode))
2295 (base-ifield (.sym f- base -11))
2296 (encoding (+ ((.sym f- base -3) 4) (.sym Src32Rn group xmode)))
2297 (ifield-assertion (eq (.sym f- base -3) 4))
2298 (getter (trunc xmode (.sym Src32Rn group xmode)))
2299 (setter (set (.sym Src32Rn group xmode) newval))
2300 )
2301 )
2302 )
2303
2304 (src32-Rn-direct-operand Unprefixed 1 QI)
2305 (src32-Rn-direct-operand Prefixed 9 QI)
2306 (src32-Rn-direct-operand Unprefixed 1 HI)
2307 (src32-Rn-direct-operand Prefixed 9 HI)
2308 (src32-Rn-direct-operand Unprefixed 1 SI)
2309 (src32-Rn-direct-operand Prefixed 9 SI)
2310
2311 ;-------------------------------------------------------------
2312 ; An direct
2313 ;-------------------------------------------------------------
2314
2315 (define-pmacro (src16-An-direct-operand xmode)
2316 (begin
2317 (define-derived-operand
2318 (name (.sym src16-An-direct- xmode))
2319 (comment (.str "m16c An direct destination " xmode))
2320 (attrs (machine 16))
2321 (mode xmode)
2322 (args ((.sym Src16An xmode)))
2323 (syntax (.str "$Src16An" xmode))
2324 (base-ifield f-8-4)
2325 (encoding (+ (f-8-2 1) (f-10-1 0) (.sym Src16An xmode)))
2326 (ifield-assertion (andif (eq f-8-2 1) (eq f-10-1 0)))
2327 (getter (trunc xmode (.sym Src16An xmode)))
2328 (setter (set (.sym Src16An xmode) newval))
2329 )
2330 )
2331 )
2332 (src16-An-direct-operand QI)
2333 (src16-An-direct-operand HI)
2334
2335 (define-pmacro (src32-An-direct-operand group base1 base2 xmode)
2336 (begin
2337 (define-derived-operand
2338 (name (.sym src32-An-direct- group - xmode))
2339 (comment (.str "m32c An direct destination " xmode))
2340 (attrs (machine 32))
2341 (mode xmode)
2342 (args ((.sym Src32An group xmode)))
2343 (syntax (.str "$Src32An" group xmode))
2344 (base-ifield (.sym f- base1 -11))
2345 (encoding (+ ((.sym f- base1 -3) 0) ((.sym f- base2 -1) 1) (.sym Src32An group xmode)))
2346 (ifield-assertion (andif (eq (.sym f- base1 -3) 0) (eq (.sym f- base2 -1) 1)))
2347 (getter (trunc xmode (.sym Src32An group xmode)))
2348 (setter (set (.sym Src32An group xmode) newval))
2349 )
2350 )
2351 )
2352
2353 (src32-An-direct-operand Unprefixed 1 10 QI)
2354 (src32-An-direct-operand Unprefixed 1 10 HI)
2355 (src32-An-direct-operand Unprefixed 1 10 SI)
2356 (src32-An-direct-operand Prefixed 9 18 QI)
2357 (src32-An-direct-operand Prefixed 9 18 HI)
2358 (src32-An-direct-operand Prefixed 9 18 SI)
2359
2360 ;-------------------------------------------------------------
2361 ; An indirect
2362 ;-------------------------------------------------------------
2363
2364 (define-pmacro (src16-An-indirect-operand xmode)
2365 (begin
2366 (define-derived-operand
2367 (name (.sym src16-An-indirect- xmode))
2368 (comment (.str "m16c An indirect destination " xmode))
2369 (attrs (machine 16))
2370 (mode xmode)
2371 (args (Src16An))
2372 (syntax "[$Src16An]")
2373 (base-ifield f-8-4)
2374 (encoding (+ (f-8-2 1) (f-10-1 1) Src16An))
2375 (ifield-assertion (andif (eq f-8-2 1) (eq f-10-1 1)))
2376 (getter (mem16 xmode Src16An))
2377 (setter (set (mem16 xmode Src16An) newval))
2378 )
2379 )
2380 )
2381 (src16-An-indirect-operand QI)
2382 (src16-An-indirect-operand HI)
2383
2384 (define-pmacro (src32-An-indirect-operand group base1 base2 xmode)
2385 (begin
2386 (define-derived-operand
2387 (name (.sym src32-An-indirect- group - xmode))
2388 (comment (.str "m32c An indirect destination " xmode))
2389 (attrs (machine 32))
2390 (mode xmode)
2391 (args ((.sym Src32An group)))
2392 (syntax (.str "[$Src32An" group "]"))
2393 (base-ifield (.sym f- base1 -11))
2394 (encoding (+ ((.sym f- base1 -3) 0) ((.sym f- base2 -1) 0) (.sym Src32An group)))
2395 (ifield-assertion (andif (eq (.sym f- base1 -3) 0) (eq (.sym f- base2 -1) 0)))
2396 (getter (c-call xmode (.str "operand_getter_" xmode) (.sym Src32An group)
2397 (const 0)))
2398 (setter (c-call DFLT (.str "operand_setter_" xmode) newval
2399 (.sym Src32An group) (const 0)))
2400 ; (getter (mem32 xmode (.sym Src32An group)))
2401 ; (setter (set (mem32 xmode (.sym Src32An group)) newval))
2402 )
2403 )
2404 )
2405
2406 (src32-An-indirect-operand Unprefixed 1 10 QI)
2407 (src32-An-indirect-operand Unprefixed 1 10 HI)
2408 (src32-An-indirect-operand Unprefixed 1 10 SI)
2409 (src32-An-indirect-operand Prefixed 9 18 QI)
2410 (src32-An-indirect-operand Prefixed 9 18 HI)
2411 (src32-An-indirect-operand Prefixed 9 18 SI)
2412
2413 ;-------------------------------------------------------------
2414 ; dsp:d[r] relative
2415 ;-------------------------------------------------------------
2416
2417 (define-pmacro (src16-relative-operand xmode)
2418 (begin
2419 (define-derived-operand
2420 (name (.sym src16-16-8-SB-relative- xmode))
2421 (comment (.str "m16c dsp:8[sb] relative destination " xmode))
2422 (attrs (machine 16))
2423 (mode xmode)
2424 (args (Dsp-16-u8))
2425 (syntax "${Dsp-16-u8}[sb]")
2426 (base-ifield f-8-4)
2427 (encoding (+ (f-8-4 #xA) Dsp-16-u8))
2428 (ifield-assertion (eq f-8-4 #xA))
2429 (getter (mem16 xmode (add Dsp-16-u8 (reg h-sb))))
2430 (setter (set (mem16 xmode (add Dsp-16-u8 (reg h-sb))) newval))
2431 )
2432 (define-derived-operand
2433 (name (.sym src16-16-16-SB-relative- xmode))
2434 (comment (.str "m16c dsp:16[sb] relative destination " xmode))
2435 (attrs (machine 16))
2436 (mode xmode)
2437 (args (Dsp-16-u16))
2438 (syntax "${Dsp-16-u16}[sb]")
2439 (base-ifield f-8-4)
2440 (encoding (+ (f-8-4 #xE) Dsp-16-u16))
2441 (ifield-assertion (eq f-8-4 #xE))
2442 (getter (mem16 xmode (add Dsp-16-u16 (reg h-sb))))
2443 (setter (set (mem16 xmode (add Dsp-16-u16 (reg h-sb))) newval))
2444 )
2445 (define-derived-operand
2446 (name (.sym src16-16-8-FB-relative- xmode))
2447 (comment (.str "m16c dsp:8[fb] relative destination " xmode))
2448 (attrs (machine 16))
2449 (mode xmode)
2450 (args (Dsp-16-s8))
2451 (syntax "${Dsp-16-s8}[fb]")
2452 (base-ifield f-8-4)
2453 (encoding (+ (f-8-4 #xB) Dsp-16-s8))
2454 (ifield-assertion (eq f-8-4 #xB))
2455 (getter (mem16 xmode (add Dsp-16-s8 (reg h-fb))))
2456 (setter (set (mem16 xmode (add Dsp-16-s8 (reg h-fb))) newval))
2457 )
2458 (define-derived-operand
2459 (name (.sym src16-16-8-An-relative- xmode))
2460 (comment (.str "m16c dsp:8[An] relative destination " xmode))
2461 (attrs (machine 16))
2462 (mode xmode)
2463 (args (Src16An Dsp-16-u8))
2464 (syntax "${Dsp-16-u8}[$Src16An]")
2465 (base-ifield f-8-4)
2466 (encoding (+ (f-8-2 2) (f-10-1 0) Dsp-16-u8 Src16An))
2467 (ifield-assertion (andif (eq f-8-2 2) (eq f-10-1 0)))
2468 (getter (mem16 xmode (add Dsp-16-u8 Src16An)))
2469 (setter (set (mem16 xmode (add Dsp-16-u8 Src16An)) newval))
2470 )
2471 (define-derived-operand
2472 (name (.sym src16-16-16-An-relative- xmode))
2473 (comment (.str "m16c dsp:16[An] relative destination " xmode))
2474 (attrs (machine 16))
2475 (mode xmode)
2476 (args (Src16An Dsp-16-u16))
2477 (syntax "${Dsp-16-u16}[$Src16An]")
2478 (base-ifield f-8-4)
2479 (encoding (+ (f-8-2 3) (f-10-1 0) Dsp-16-u16 Src16An))
2480 (ifield-assertion (andif (eq f-8-2 3) (eq f-10-1 0)))
2481 (getter (mem16 xmode (add Dsp-16-u16 Src16An)))
2482 (setter (set (mem16 xmode (add Dsp-16-u16 Src16An)) newval))
2483 )
2484 (define-derived-operand
2485 (name (.sym src16-16-20-An-relative- xmode))
2486 (comment (.str "m16c dsp:20[An] relative destination " xmode))
2487 (attrs (machine 16))
2488 (mode xmode)
2489 (args (Src16An Dsp-16-u20))
2490 (syntax "${Dsp-16-u20}[$Src16An]")
2491 (base-ifield f-8-4)
2492 (encoding (+ (f-8-2 3) (f-10-1 0) Dsp-16-u20 Src16An))
2493 (ifield-assertion (andif (eq f-8-2 3) (eq f-10-1 0)))
2494 (getter (mem20 xmode (add Dsp-16-u20 Src16An)))
2495 (setter (set (mem20 xmode (add Dsp-16-u20 Src16An)) newval))
2496 )
2497 )
2498 )
2499
2500 (src16-relative-operand QI)
2501 (src16-relative-operand HI)
2502
2503 (define-pmacro (src32-relative-operand offset group base1 base2 xmode)
2504 (begin
2505 (define-derived-operand
2506 (name (.sym src32- offset -8-SB-relative- group - xmode))
2507 (comment (.str "m32c dsp:8[sb] relative destination " xmode))
2508 (attrs (machine 32))
2509 (mode xmode)
2510 (args ((.sym Dsp- offset -u8)))
2511 (syntax (.str "${Dsp-" offset "-u8}[sb]"))
2512 (base-ifield (.sym f- base1 -11))
2513 (encoding (+ ((.sym f- base1 -3) 1) ((.sym f- base2 -2) 2) (.sym Dsp- offset -u8)))
2514 (ifield-assertion (andif (eq (.sym f- base1 -3) 1) (eq (.sym f- base2 -2) 2)))
2515 (getter (c-call xmode (.str "operand_getter_" xmode) sb (.sym Dsp- offset -u8)))
2516 (setter (c-call DFLT (.str "operand_setter_" xmode) newval sb (.sym Dsp- offset -u8)))
2517 ; (getter (mem32 xmode (add (.sym Dsp- offset -u8) (reg h-sb))))
2518 ; (setter (set (mem32 xmode (add (.sym Dsp- offset -u8) (reg h-sb))) newval))
2519 )
2520 (define-derived-operand
2521 (name (.sym src32- offset -16-SB-relative- group - xmode))
2522 (comment (.str "m32c dsp:16[sb] relative destination " xmode))
2523 (attrs (machine 32))
2524 (mode xmode)
2525 (args ((.sym Dsp- offset -u16)))
2526 (syntax (.str "${Dsp-" offset "-u16}[sb]"))
2527 (base-ifield (.sym f- base1 -11))
2528 (encoding (+ ((.sym f- base1 -3) 2) ((.sym f- base2 -2) 2) (.sym Dsp- offset -u16)))
2529 (ifield-assertion (andif (eq (.sym f- base1 -3) 2) (eq (.sym f- base2 -2) 2)))
2530 (getter (c-call xmode (.str "operand_getter_" xmode) sb (.sym Dsp- offset -u16)))
2531 (setter (c-call DFLT (.str "operand_setter_" xmode) newval sb (.sym Dsp- offset -u16)))
2532 ; (getter (mem32 xmode (add (.sym Dsp- offset -u16) (reg h-sb))))
2533 ; (setter (set (mem32 xmode (add (.sym Dsp- offset -u16) (reg h-sb))) newval))
2534 )
2535 (define-derived-operand
2536 (name (.sym src32- offset -8-FB-relative- group - xmode))
2537 (comment (.str "m32c dsp:8[fb] relative destination " xmode))
2538 (attrs (machine 32))
2539 (mode xmode)
2540 (args ((.sym Dsp- offset -s8)))
2541 (syntax (.str "${Dsp-" offset "-s8}[fb]"))
2542 (base-ifield (.sym f- base1 -11))
2543 (encoding (+ ((.sym f- base1 -3) 1) ((.sym f- base2 -2) 3) (.sym Dsp- offset -s8)))
2544 (ifield-assertion (andif (eq (.sym f- base1 -3) 1) (eq (.sym f- base2 -2) 3)))
2545 (getter (c-call xmode (.str "operand_getter_" xmode) fb (.sym Dsp- offset -s8)))
2546 (setter (c-call DFLT (.str "operand_setter_" xmode) newval fb (.sym Dsp- offset -s8)))
2547 ; (getter (mem32 xmode (add (.sym Dsp- offset -s8) (reg h-fb))))
2548 ; (setter (set (mem32 xmode (add (.sym Dsp- offset -s8) (reg h-fb))) newval))
2549 )
2550 (define-derived-operand
2551 (name (.sym src32- offset -16-FB-relative- group - xmode))
2552 (comment (.str "m32c dsp:16[fb] relative destination " xmode))
2553 (attrs (machine 32))
2554 (mode xmode)
2555 (args ((.sym Dsp- offset -s16)))
2556 (syntax (.str "${Dsp-" offset "-s16}[fb]"))
2557 (base-ifield (.sym f- base1 -11))
2558 (encoding (+ ((.sym f- base1 -3) 2) ((.sym f- base2 -2) 3) (.sym Dsp- offset -s16)))
2559 (ifield-assertion (andif (eq (.sym f- base1 -3) 2) (eq (.sym f- base2 -2) 3)))
2560 (getter (c-call xmode (.str "operand_getter_" xmode) fb (.sym Dsp- offset -s16)))
2561 (setter (c-call DFLT (.str "operand_setter_" xmode) newval fb (.sym Dsp- offset -s16)))
2562 ; (getter (mem32 xmode (add (.sym Dsp- offset -s16) (reg h-fb))))
2563 ; (setter (set (mem32 xmode (add (.sym Dsp- offset -s16) (reg h-fb))) newval))
2564 )
2565 (define-derived-operand
2566 (name (.sym src32- offset -8-An-relative- group - xmode))
2567 (comment (.str "m32c dsp:8[An] relative destination " xmode))
2568 (attrs (machine 32))
2569 (mode xmode)
2570 (args ((.sym Src32An group) (.sym Dsp- offset -u8)))
2571 (syntax (.str "${Dsp-" offset "-u8}[$Src32An" group "]"))
2572 (base-ifield (.sym f- base1 -11))
2573 (encoding (+ ((.sym f- base1 -3) 1) ((.sym f- base2 -1) 0) (.sym Dsp- offset -u8) (.sym Src32An group)))
2574 (ifield-assertion (andif (eq (.sym f- base1 -3) 1) (eq (.sym f- base2 -1) 0)))
2575 (getter (c-call xmode (.str "operand_getter_" xmode) (.sym Src32An group) (.sym Dsp- offset -u8)))
2576 (setter (c-call DFLT (.str "operand_setter_" xmode) newval (.sym Src32An group) (.sym Dsp- offset -u8)))
2577 ; (getter (mem32 xmode (add (.sym Dsp- offset -u8) (.sym Src32An group))))
2578 ; (setter (set (mem32 xmode (add (.sym Dsp- offset -u8) (.sym Src32An group))) newval))
2579 )
2580 (define-derived-operand
2581 (name (.sym src32- offset -16-An-relative- group - xmode))
2582 (comment (.str "m32c dsp:16[An] relative destination " xmode))
2583 (attrs (machine 32))
2584 (mode xmode)
2585 (args ((.sym Src32An group) (.sym Dsp- offset -u16)))
2586 (syntax (.str "${Dsp-" offset "-u16}[$Src32An" group "]"))
2587 (base-ifield (.sym f- base1 -11))
2588 (encoding (+ ((.sym f- base1 -3) 2) ((.sym f- base2 -1) 0) (.sym Dsp- offset -u16) (.sym Src32An group)))
2589 (ifield-assertion (andif (eq (.sym f- base1 -3) 2) (eq (.sym f- base2 -1) 0)))
2590 (getter (c-call xmode (.str "operand_getter_" xmode) (.sym Src32An group) (.sym Dsp- offset -u16)))
2591 (setter (c-call DFLT (.str "operand_setter_" xmode) newval (.sym Src32An group) (.sym Dsp- offset -u16)))
2592 ; (getter (mem32 xmode (add (.sym Dsp- offset -u16) (.sym Src32An group))))
2593 ; (setter (set (mem32 xmode (add (.sym Dsp- offset -u16) (.sym Src32An group))) newval))
2594 )
2595 (define-derived-operand
2596 (name (.sym src32- offset -24-An-relative- group - xmode))
2597 (comment (.str "m32c dsp:16[An] relative destination " xmode))
2598 (attrs (machine 32))
2599 (mode xmode)
2600 (args ((.sym Src32An group) (.sym Dsp- offset -u24)))
2601 (syntax (.str "${Dsp-" offset "-u24}[$Src32An" group "]"))
2602 (base-ifield (.sym f- base1 -11))
2603 (encoding (+ ((.sym f- base1 -3) 3) ((.sym f- base2 -1) 0) (.sym Dsp- offset -u24) (.sym Src32An group)))
2604 (ifield-assertion (andif (eq (.sym f- base1 -3) 3) (eq (.sym f- base2 -1) 0)))
2605 (getter (c-call xmode (.str "operand_getter_" xmode) (.sym Src32An group) (.sym Dsp- offset -u24) ))
2606 (setter (c-call DFLT (.str "operand_setter_" xmode) newval (.sym Src32An group) (.sym Dsp- offset -u24)))
2607 ; (getter (mem32 xmode (add (.sym Dsp- offset -u24) (.sym Src32An group))))
2608 ; (setter (set (mem32 xmode (add (.sym Dsp- offset -u24) (.sym Src32An group))) newval))
2609 )
2610 )
2611 )
2612
2613 (src32-relative-operand 16 Unprefixed 1 10 QI)
2614 (src32-relative-operand 16 Unprefixed 1 10 HI)
2615 (src32-relative-operand 16 Unprefixed 1 10 SI)
2616 (src32-relative-operand 24 Prefixed 9 18 QI)
2617 (src32-relative-operand 24 Prefixed 9 18 HI)
2618 (src32-relative-operand 24 Prefixed 9 18 SI)
2619
2620 ;-------------------------------------------------------------
2621 ; Absolute address
2622 ;-------------------------------------------------------------
2623
2624 (define-pmacro (src16-absolute xmode)
2625 (begin
2626 (define-derived-operand
2627 (name (.sym src16-16-16-absolute- xmode))
2628 (comment (.str "m16c absolute address " xmode))
2629 (attrs (machine 16))
2630 (mode xmode)
2631 (args (Dsp-16-u16))
2632 (syntax (.str "${Dsp-16-u16}"))
2633 (base-ifield f-8-4)
2634 (encoding (+ (f-8-4 #xF) Dsp-16-u16))
2635 (ifield-assertion (eq f-8-4 #xF))
2636 (getter (mem16 xmode Dsp-16-u16))
2637 (setter (set (mem16 xmode Dsp-16-u16) newval))
2638 )
2639 )
2640 )
2641
2642 (src16-absolute QI)
2643 (src16-absolute HI)
2644
2645 (define-pmacro (src32-absolute offset group base1 base2 xmode)
2646 (begin
2647 (define-derived-operand
2648 (name (.sym src32- offset -16-absolute- group - xmode))
2649 (comment (.str "m32c absolute address " xmode))
2650 (attrs (machine 32))
2651 (mode xmode)
2652 (args ((.sym Dsp- offset -u16)))
2653 (syntax (.str "${Dsp-" offset "-u16}"))
2654 (base-ifield (.sym f- base1 -11))
2655 (encoding (+ ((.sym f- base1 -3) 3) ((.sym f- base2 -2) 3) (.sym Dsp- offset -u16)))
2656 (ifield-assertion (andif (eq (.sym f- base1 -3) 3) (eq (.sym f- base2 -2) 3)))
2657 (getter (c-call xmode (.str "operand_getter_" xmode) (const 0) (.sym Dsp- offset -u16)))
2658 (setter (c-call DFLT (.str "operand_setter_" xmode) newval (const 0) (.sym Dsp- offset -u16)))
2659 ; (getter (mem32 xmode (.sym Dsp- offset -u16)))
2660 ; (setter (set (mem32 xmode (.sym Dsp- offset -u16)) newval))
2661 )
2662 (define-derived-operand
2663 (name (.sym src32- offset -24-absolute- group - xmode))
2664 (comment (.str "m32c absolute address " xmode))
2665 (attrs (machine 32))
2666 (mode xmode)
2667 (args ((.sym Dsp- offset -u24)))
2668 (syntax (.str "${Dsp-" offset "-u24}"))
2669 (base-ifield (.sym f- base1 -11))
2670 (encoding (+ ((.sym f- base1 -3) 3) ((.sym f- base2 -2) 2) (.sym Dsp- offset -u24)))
2671 (ifield-assertion (andif (eq (.sym f- base1 -3) 3) (eq (.sym f- base2 -2) 2)))
2672 (getter (c-call xmode (.str "operand_getter_" xmode) (const 0) (.sym Dsp- offset -u24)))
2673 (setter (c-call DFLT (.str "operand_setter_" xmode) newval (const 0) (.sym Dsp- offset -u24)))
2674 ; (getter (mem32 xmode (.sym Dsp- offset -u24)))
2675 ; (setter (set (mem32 xmode (.sym Dsp- offset -u24)) newval))
2676 )
2677 )
2678 )
2679
2680 (src32-absolute 16 Unprefixed 1 10 QI)
2681 (src32-absolute 16 Unprefixed 1 10 HI)
2682 (src32-absolute 16 Unprefixed 1 10 SI)
2683 (src32-absolute 24 Prefixed 9 18 QI)
2684 (src32-absolute 24 Prefixed 9 18 HI)
2685 (src32-absolute 24 Prefixed 9 18 SI)
2686
2687 ;-------------------------------------------------------------
2688 ; An indirect indirect
2689 ;
2690 ; Double indirect addressing uses the lower 3 bytes of the value stored
2691 ; at the address referenced by 'op' as the effective address.
2692 ;-------------------------------------------------------------
2693
2694 (define-pmacro (indirect-addr op) (and USI (mem32 USI op) #x00ffffff))
2695
2696 ; (define-pmacro (src-An-indirect-indirect-operand xmode)
2697 ; (define-derived-operand
2698 ; (name (.sym src32-An-indirect-indirect- xmode))
2699 ; (comment (.str "m32c An indirect indirect destination " xmode))
2700 ; (attrs (machine 32))
2701 ; (mode xmode)
2702 ; (args (Src32AnPrefixed))
2703 ; (syntax (.str "[[$Src32AnPrefixed]]"))
2704 ; (base-ifield f-9-11)
2705 ; (encoding (+ (f-9-3 0) (f-18-1 0) Src32AnPrefixed))
2706 ; (ifield-assertion (andif (eq f-9-3 0) (eq f-18-1 0)))
2707 ; (getter (mem32 xmode (indirect-addr Src32AnPrefixed)))
2708 ; (setter (set (mem32 xmode (indirect-addr Src32AnPrefixed)) newval))
2709 ; )
2710 ; )
2711
2712 ; (src-An-indirect-indirect-operand QI)
2713 ; (src-An-indirect-indirect-operand HI)
2714 ; (src-An-indirect-indirect-operand SI)
2715
2716 ;-------------------------------------------------------------
2717 ; Relative indirect
2718 ;-------------------------------------------------------------
2719
2720 (define-pmacro (src-relative-indirect-operand xmode)
2721 (begin
2722 ; (define-derived-operand
2723 ; (name (.sym src32-24-8-SB-relative-indirect- xmode))
2724 ; (comment (.str "m32c dsp:8[sb] relative source " xmode))
2725 ; (attrs (machine 32))
2726 ; (mode xmode)
2727 ; (args (Dsp-24-u8))
2728 ; (syntax "[${Dsp-24-u8}[sb]]")
2729 ; (base-ifield f-9-11)
2730 ; (encoding (+ (f-9-3 1) (f-18-2 2) Dsp-24-u8))
2731 ; (ifield-assertion (andif (eq f-9-3 1) (eq f-18-2 2)))
2732 ; (getter (mem32 xmode (indirect-addr (add Dsp-24-u8 (reg h-sb)))))
2733 ; (setter (set (mem32 xmode (indirect-addr (add Dsp-24-u8 (reg h-sb)))) newval))
2734 ; )
2735 ; (define-derived-operand
2736 ; (name (.sym src32-24-16-SB-relative-indirect- xmode))
2737 ; (comment (.str "m32c dsp:16[sb] relative source " xmode))
2738 ; (attrs (machine 32))
2739 ; (mode xmode)
2740 ; (args (Dsp-24-u16))
2741 ; (syntax "[${Dsp-24-u16}[sb]]")
2742 ; (base-ifield f-9-11)
2743 ; (encoding (+ (f-9-3 2) (f-18-2 2) Dsp-24-u16))
2744 ; (ifield-assertion (andif (eq f-9-3 2) (eq f-18-2 2)))
2745 ; (getter (mem32 xmode (indirect-addr (add Dsp-24-u16 (reg h-sb)))))
2746 ; (setter (set (mem32 xmode (indirect-addr (add Dsp-24-u16 (reg h-sb)))) newval))
2747 ; )
2748 ; (define-derived-operand
2749 ; (name (.sym src32-24-8-FB-relative-indirect- xmode))
2750 ; (comment (.str "m32c dsp:8[fb] relative source " xmode))
2751 ; (attrs (machine 32))
2752 ; (mode xmode)
2753 ; (args (Dsp-24-s8))
2754 ; (syntax "[${Dsp-24-s8}[fb]]")
2755 ; (base-ifield f-9-11)
2756 ; (encoding (+ (f-9-3 1) (f-18-2 3) Dsp-24-s8))
2757 ; (ifield-assertion (andif (eq f-9-3 1) (eq f-18-2 3)))
2758 ; (getter (mem32 xmode (indirect-addr (add Dsp-24-s8 (reg h-fb)))))
2759 ; (setter (set (mem32 xmode (indirect-addr (add Dsp-24-s8 (reg h-fb)))) newval))
2760 ; )
2761 ; (define-derived-operand
2762 ; (name (.sym src32-24-16-FB-relative-indirect- xmode))
2763 ; (comment (.str "m32c dsp:16[fb] relative source " xmode))
2764 ; (attrs (machine 32))
2765 ; (mode xmode)
2766 ; (args (Dsp-24-s16))
2767 ; (syntax "[${Dsp-24-s16}[fb]]")
2768 ; (base-ifield f-9-11)
2769 ; (encoding (+ (f-9-3 2) (f-18-2 3) Dsp-24-s16))
2770 ; (ifield-assertion (andif (eq f-9-3 2) (eq f-18-2 3)))
2771 ; (getter (mem32 xmode (indirect-addr (add Dsp-24-s16 (reg h-fb)))))
2772 ; (setter (set (mem32 xmode (indirect-addr (add Dsp-24-s16 (reg h-fb)))) newval))
2773 ; )
2774 ; (define-derived-operand
2775 ; (name (.sym src32-24-8-An-relative-indirect- xmode))
2776 ; (comment (.str "m32c dsp:8[An] relative indirect source " xmode))
2777 ; (attrs (machine 32))
2778 ; (mode xmode)
2779 ; (args (Src32AnPrefixed Dsp-24-u8))
2780 ; (syntax "[${Dsp-24-u8}[$Src32AnPrefixed]]")
2781 ; (base-ifield f-9-11)
2782 ; (encoding (+ (f-9-3 1) (f-18-1 0) Dsp-24-u8 Src32AnPrefixed))
2783 ; (ifield-assertion (andif (eq f-9-3 1) (eq f-18-1 0)))
2784 ; (getter (mem32 xmode (indirect-addr (add Dsp-24-u8 Src32AnPrefixed))))
2785 ; (setter (set (mem32 xmode (indirect-addr (add Dsp-24-u8 Src32AnPrefixed))) newval))
2786 ; )
2787 ; (define-derived-operand
2788 ; (name (.sym src32-24-16-An-relative-indirect- xmode))
2789 ; (comment (.str "m32c dsp:16[An] relative source " xmode))
2790 ; (attrs (machine 32))
2791 ; (mode xmode)
2792 ; (args (Src32AnPrefixed Dsp-24-u16))
2793 ; (syntax "[${Dsp-24-u16}[$Src32AnPrefixed]]")
2794 ; (base-ifield f-9-11)
2795 ; (encoding (+ (f-9-3 2) (f-18-1 0) Dsp-24-u16 Src32AnPrefixed))
2796 ; (ifield-assertion (andif (eq f-9-3 2) (eq f-18-1 0)))
2797 ; (getter (mem32 xmode (indirect-addr (add Dsp-24-u16 Src32AnPrefixed))))
2798 ; (setter (set (mem32 xmode (indirect-addr (add Dsp-24-u16 Src32AnPrefixed))) newval))
2799 ; )
2800 ; (define-derived-operand
2801 ; (name (.sym src32-24-24-An-relative-indirect- xmode))
2802 ; (comment (.str "m32c dsp:24[An] relative source " xmode))
2803 ; (attrs (machine 32))
2804 ; (mode xmode)
2805 ; (args (Src32AnPrefixed Dsp-24-u24))
2806 ; (syntax "[${Dsp-24-u24}[$Src32AnPrefixed]]")
2807 ; (base-ifield f-9-11)
2808 ; (encoding (+ (f-9-3 3) (f-18-1 0) Dsp-24-u24 Src32AnPrefixed))
2809 ; (ifield-assertion (andif (eq f-9-3 3) (eq f-18-1 0)))
2810 ; (getter (mem32 xmode (indirect-addr (add Dsp-24-u24 Src32AnPrefixed))))
2811 ; (setter (set (mem32 xmode (indirect-addr (add Dsp-24-u24 Src32AnPrefixed))) newval))
2812 ; )
2813 )
2814 )
2815
2816 ; (src-relative-indirect-operand QI)
2817 ; (src-relative-indirect-operand HI)
2818 ; (src-relative-indirect-operand SI)
2819
2820 ;-------------------------------------------------------------
2821 ; Absolute Indirect address
2822 ;-------------------------------------------------------------
2823
2824 (define-pmacro (src32-absolute-indirect offset base1 base2 xmode)
2825 (begin
2826 ; (define-derived-operand
2827 ; (name (.sym src32- offset -16-absolute-indirect-derived- xmode))
2828 ; (comment (.str "m32c absolute indirect address " xmode))
2829 ; (attrs (machine 32))
2830 ; (mode xmode)
2831 ; (args ((.sym Dsp- offset -u16)))
2832 ; (syntax (.str "[${Dsp-" offset "-u16}]"))
2833 ; (base-ifield (.sym f- base1 -11))
2834 ; (encoding (+ ((.sym f- base1 -3) 3) ((.sym f- base2 -2) 3) (.sym Dsp- offset -u16)))
2835 ; (ifield-assertion (andif (eq (.sym f- base1 -3) 3) (eq (.sym f- base2 -2) 3)))
2836 ; (getter (mem32 xmode (indirect-addr (.sym Dsp- offset -u16))))
2837 ; (setter (set (mem32 xmode (indirect-addr (.sym Dsp- offset -u16))) newval))
2838 ; )
2839 ; (define-derived-operand
2840 ; (name (.sym src32- offset -24-absolute-indirect-derived- xmode))
2841 ; (comment (.str "m32c absolute indirect address " xmode))
2842 ; (attrs (machine 32))
2843 ; (mode xmode)
2844 ; (args ((.sym Dsp- offset -u24)))
2845 ; (syntax (.str "[${Dsp-" offset "-u24}]"))
2846 ; (base-ifield (.sym f- base1 -11))
2847 ; (encoding (+ ((.sym f- base1 -3) 3) ((.sym f- base2 -2) 2) (.sym Dsp- offset -u24)))
2848 ; (ifield-assertion (andif (eq (.sym f- base1 -3) 3) (eq (.sym f- base2 -2) 2)))
2849 ; (getter (mem32 xmode (indirect-addr (.sym Dsp- offset -u24))))
2850 ; (setter (set (mem32 xmode (indirect-addr (.sym Dsp- offset -u24))) newval))
2851 ; )
2852 )
2853 )
2854
2855 (src32-absolute-indirect 24 9 18 QI)
2856 (src32-absolute-indirect 24 9 18 HI)
2857 (src32-absolute-indirect 24 9 18 SI)
2858
2859 ;-------------------------------------------------------------
2860 ; Register relative source operands for short format insns
2861 ;-------------------------------------------------------------
2862
2863 (define-pmacro (src-2-S-operands mach xmode base opc1 opc2 opc3)
2864 (begin
2865 (define-derived-operand
2866 (name (.sym src mach -2-S-8-SB-relative- xmode))
2867 (comment (.str "m" mach "c SB relative address"))
2868 (attrs (machine mach))
2869 (mode xmode)
2870 (args (Dsp-8-u8))
2871 (syntax "${Dsp-8-u8}[sb]")
2872 (base-ifield (.sym f- base -2))
2873 (encoding (+ ((.sym f- base -2) opc1) Dsp-8-u8))
2874 (ifield-assertion (eq (.sym f- base -2) opc1))
2875 (getter (c-call xmode (.str "operand_getter_" xmode) sb Dsp-8-u8))
2876 (setter (c-call DFLT (.str "operand_setter_" xmode) newval sb Dsp-8-u8))
2877 ; (getter (mem-mach mach xmode (indirect-addr (add (reg h-sb) Dsp-8-u8))))
2878 ; (setter (set (mem-mach mach xmode (indirect-addr (add (reg h-sb) Dsp-8-u8))) newval))
2879 )
2880 (define-derived-operand
2881 (name (.sym src mach -2-S-8-FB-relative- xmode))
2882 (comment (.str "m" mach "c FB relative address"))
2883 (attrs (machine mach))
2884 (mode xmode)
2885 (args (Dsp-8-s8))
2886 (syntax "${Dsp-8-s8}[fb]")
2887 (base-ifield (.sym f- base -2))
2888 (encoding (+ ((.sym f- base -2) opc2) Dsp-8-s8))
2889 (ifield-assertion (eq (.sym f- base -2) opc2))
2890 (getter (c-call xmode (.str "operand_getter_" xmode) fb Dsp-8-s8))
2891 (setter (c-call DFLT (.str "operand_setter_" xmode) newval fb Dsp-8-s8))
2892 ; (getter (mem-mach mach xmode (indirect-addr (add (reg h-fb) Dsp-8-s8))))
2893 ; (setter (set (mem-mach mach xmode (indirect-addr (add (reg h-fb) Dsp-8-s8))) newval))
2894 )
2895 (define-derived-operand
2896 (name (.sym src mach -2-S-16-absolute- xmode))
2897 (comment (.str "m" mach "c absolute address"))
2898 (attrs (machine mach))
2899 (mode xmode)
2900 (args (Dsp-8-u16))
2901 (syntax "${Dsp-8-u16}")
2902 (base-ifield (.sym f- base -2))
2903 (encoding (+ ((.sym f- base -2) opc3) Dsp-8-u16))
2904 (ifield-assertion (eq (.sym f- base -2) opc3))
2905 (getter (c-call xmode (.str "operand_getter_" xmode) (const 0) Dsp-8-u16))
2906 (setter (c-call DFLT (.str "operand_setter_" xmode) newval (const 0) Dsp-8-u16))
2907 ; (getter (mem-mach mach xmode Dsp-8-u16))
2908 ; (setter (set (mem-mach mach xmode Dsp-8-u16) newval))
2909 )
2910 )
2911 )
2912
2913 (src-2-S-operands 16 QI 6 1 2 3)
2914 (src-2-S-operands 32 QI 2 2 3 1)
2915 (src-2-S-operands 32 HI 2 2 3 1)
2916
2917 ;=============================================================
2918 ; Derived Operands
2919 ;-------------------------------------------------------------
2920 ; Destination
2921 ;-------------------------------------------------------------
2922 ; Rn direct
2923 ;-------------------------------------------------------------
2924
2925 (define-pmacro (dst16-Rn-direct-operand xmode)
2926 (begin
2927 (define-derived-operand
2928 (name (.sym dst16-Rn-direct- xmode))
2929 (comment (.str "m16c Rn direct destination " xmode))
2930 (attrs (machine 16))
2931 (mode xmode)
2932 (args ((.sym Dst16Rn xmode)))
2933 (syntax (.str "$Dst16Rn" xmode))
2934 (base-ifield f-12-4)
2935 (encoding (+ (f-12-2 0) (.sym Dst16Rn xmode)))
2936 (ifield-assertion (eq f-12-2 0))
2937 (getter (trunc xmode (.sym Dst16Rn xmode)))
2938 (setter (set (.sym Dst16Rn xmode) newval))
2939 )
2940 )
2941 )
2942
2943 (dst16-Rn-direct-operand QI)
2944 (dst16-Rn-direct-operand HI)
2945 (dst16-Rn-direct-operand SI)
2946
2947 (define-derived-operand
2948 (name dst16-Rn-direct-Ext-QI)
2949 (comment "m16c Rn direct destination QI")
2950 (attrs (machine 16))
2951 (mode HI)
2952 (args (Dst16RnExtQI))
2953 (syntax "$Dst16RnExtQI")
2954 (base-ifield f-12-4)
2955 (encoding (+ (f-12-2 0) Dst16RnExtQI (f-15-1 0)))
2956 (ifield-assertion (andif (eq f-12-2 0) (eq f-15-1 0)))
2957 (getter (trunc QI (.sym Dst16RnExtQI)))
2958 (setter (set Dst16RnExtQI newval))
2959 )
2960
2961 (define-pmacro (dst32-Rn-direct-operand group base xmode)
2962 (begin
2963 (define-derived-operand
2964 (name (.sym dst32-Rn-direct- group - xmode))
2965 (comment (.str "m32c Rn direct destination " xmode))
2966 (attrs (machine 32))
2967 (mode xmode)
2968 (args ((.sym Dst32Rn group xmode)))
2969 (syntax (.str "$Dst32Rn" group xmode))
2970 (base-ifield (.sym f- base -6))
2971 (encoding (+ ((.sym f- base -3) 4) (.sym Dst32Rn group xmode)))
2972 (ifield-assertion (eq (.sym f- base -3) 4))
2973 (getter (trunc xmode (.sym Dst32Rn group xmode)))
2974 (setter (set (.sym Dst32Rn group xmode) newval))
2975 )
2976 )
2977 )
2978
2979 (dst32-Rn-direct-operand Unprefixed 4 QI)
2980 (dst32-Rn-direct-operand Prefixed 12 QI)
2981 (dst32-Rn-direct-operand Unprefixed 4 HI)
2982 (dst32-Rn-direct-operand Prefixed 12 HI)
2983 (dst32-Rn-direct-operand Unprefixed 4 SI)
2984 (dst32-Rn-direct-operand Prefixed 12 SI)
2985
2986 (define-pmacro (dst32-Rn-direct-Ext-operand group base1 base2 smode dmode)
2987 (begin
2988 (define-derived-operand
2989 (name (.sym dst32-Rn-direct- group - smode))
2990 (comment (.str "m32c Rn direct destination " smode))
2991 (attrs (machine 32))
2992 (mode dmode)
2993 (args ((.sym Dst32Rn group smode)))
2994 (syntax (.str "$Dst32Rn" group smode))
2995 (base-ifield (.sym f- base1 -6))
2996 (encoding (+ ((.sym f- base1 -3) 4) ((.sym f- base2 -1) 1) (.sym Dst32Rn group smode)))
2997 (ifield-assertion (andif (eq (.sym f- base1 -3) 4) (eq (.sym f- base2 -1) 1)))
2998 (getter (trunc smode (.sym Dst32Rn group smode)))
2999 (setter (set (.sym Dst32Rn group smode) newval))
3000 )
3001 )
3002 )
3003
3004 (dst32-Rn-direct-Ext-operand ExtUnprefixed 4 8 QI HI)
3005 (dst32-Rn-direct-Ext-operand ExtUnprefixed 4 8 HI SI)
3006
3007 (define-derived-operand
3008 (name dst32-R3-direct-Unprefixed-HI)
3009 (comment "m32c R3 direct HI")
3010 (attrs (machine 32))
3011 (mode HI)
3012 (args (R3))
3013 (syntax "$R3")
3014 (base-ifield f-4-6)
3015 (encoding (+ (f-4-3 4) (f-8-2 #x1)))
3016 (ifield-assertion (andif (eq f-4-3 4) (eq f-8-2 #x1)))
3017 (getter (trunc HI R3))
3018 (setter (set R3 newval))
3019 )
3020 ;-------------------------------------------------------------
3021 ; An direct
3022 ;-------------------------------------------------------------
3023
3024 (define-pmacro (dst16-An-direct-operand xmode)
3025 (begin
3026 (define-derived-operand
3027 (name (.sym dst16-An-direct- xmode))
3028 (comment (.str "m16c An direct destination " xmode))
3029 (attrs (machine 16))
3030 (mode xmode)
3031 (args ((.sym Dst16An xmode)))
3032 (syntax (.str "$Dst16An" xmode))
3033 (base-ifield f-12-4)
3034 (encoding (+ (f-12-2 1) (f-14-1 0) (.sym Dst16An xmode)))
3035 (ifield-assertion (andif (eq f-12-2 1) (eq f-14-1 0)))
3036 (getter (trunc xmode (.sym Dst16An xmode)))
3037 (setter (set (.sym Dst16An xmode) newval))
3038 )
3039 )
3040 )
3041
3042 (dst16-An-direct-operand QI)
3043 (dst16-An-direct-operand HI)
3044 (dst16-An-direct-operand SI)
3045
3046 (define-pmacro (dst32-An-direct-operand group base1 base2 xmode)
3047 (begin
3048 (define-derived-operand
3049 (name (.sym dst32-An-direct- group - xmode))
3050 (comment (.str "m32c An direct destination " xmode))
3051 (attrs (machine 32))
3052 (mode xmode)
3053 (args ((.sym Dst32An group xmode)))
3054 (syntax (.str "$Dst32An" group xmode))
3055 (base-ifield (.sym f- base1 -6))
3056 (encoding (+ ((.sym f- base1 -3) 0) ((.sym f- base2 -1) 1) (.sym Dst32An group xmode)))
3057 (ifield-assertion (andif (eq (.sym f- base1 -3) 0) (eq (.sym f- base2 -1) 1)))
3058 (getter (trunc xmode (.sym Dst32An group xmode)))
3059 (setter (set (.sym Dst32An group xmode) newval))
3060 )
3061 )
3062 )
3063
3064 (dst32-An-direct-operand Unprefixed 4 8 QI)
3065 (dst32-An-direct-operand Prefixed 12 16 QI)
3066 (dst32-An-direct-operand Unprefixed 4 8 HI)
3067 (dst32-An-direct-operand Prefixed 12 16 HI)
3068 (dst32-An-direct-operand Unprefixed 4 8 SI)
3069 (dst32-An-direct-operand Prefixed 12 16 SI)
3070
3071 ;-------------------------------------------------------------
3072 ; An indirect
3073 ;-------------------------------------------------------------
3074
3075 (define-pmacro (dst16-An-indirect-operand xmode)
3076 (begin
3077 (define-derived-operand
3078 (name (.sym dst16-An-indirect- xmode))
3079 (comment (.str "m16c An indirect destination " xmode))
3080 (attrs (machine 16))
3081 (mode xmode)
3082 (args (Dst16An))
3083 (syntax "[$Dst16An]")
3084 (base-ifield f-12-4)
3085 (encoding (+ (f-12-2 1) (f-14-1 1) Dst16An))
3086 (ifield-assertion (andif (eq f-12-2 1) (eq f-14-1 1)))
3087 (getter (mem16 xmode Dst16An))
3088 (setter (set (mem16 xmode Dst16An) newval))
3089 )
3090 )
3091 )
3092
3093 (dst16-An-indirect-operand QI)
3094 (dst16-An-indirect-operand HI)
3095 (dst16-An-indirect-operand SI)
3096
3097 (define-derived-operand
3098 (name dst16-An-indirect-Ext-QI)
3099 (comment "m16c An indirect destination QI")
3100 (attrs (machine 16))
3101 (mode HI)
3102 (args (Dst16An))
3103 (syntax "[$Dst16An]")
3104 (base-ifield f-12-4)
3105 (encoding (+ (f-12-2 1) (f-14-1 1) Dst16An))
3106 (ifield-assertion (andif (eq f-12-2 1) (eq f-14-1 1)))
3107 (getter (mem16 QI Dst16An))
3108 (setter (set (mem16 HI Dst16An) newval))
3109 )
3110
3111 (define-pmacro (dst32-An-indirect-operand group base1 base2 smode dmode)
3112 (begin
3113 (define-derived-operand
3114 (name (.sym dst32-An-indirect- group - smode))
3115 (comment (.str "m32c An indirect destination " smode))
3116 (attrs (machine 32))
3117 (mode dmode)
3118 (args ((.sym Dst32An group)))
3119 (syntax (.str "[$Dst32An" group "]"))
3120 (base-ifield (.sym f- base1 -6))
3121 (encoding (+ ((.sym f- base1 -3) 0) ((.sym f- base2 -1) 0) (.sym Dst32An group)))
3122 (ifield-assertion (andif (eq (.sym f- base1 -3) 0) (eq (.sym f- base2 -1) 0)))
3123 (getter (c-call dmode (.str "operand_getter_" dmode) (.sym Dst32An group)
3124 (const 0)))
3125 (setter (c-call DFLT (.str "operand_setter_" dmode) newval
3126 (.sym Dst32An group) (const 0)))
3127 ; (getter (mem32 smode (.sym Dst32An group)))
3128 ; (setter (set (mem32 dmode (.sym Dst32An group)) newval))
3129 )
3130 )
3131 )
3132
3133 (dst32-An-indirect-operand Unprefixed 4 8 QI QI)
3134 (dst32-An-indirect-operand Prefixed 12 16 QI QI)
3135 (dst32-An-indirect-operand Unprefixed 4 8 HI HI)
3136 (dst32-An-indirect-operand Prefixed 12 16 HI HI)
3137 (dst32-An-indirect-operand Unprefixed 4 8 SI SI)
3138 (dst32-An-indirect-operand Prefixed 12 16 SI SI)
3139 (dst32-An-indirect-operand ExtUnprefixed 4 8 QI HI)
3140 (dst32-An-indirect-operand ExtUnprefixed 4 8 HI SI)
3141
3142 ;-------------------------------------------------------------
3143 ; dsp:d[r] relative
3144 ;-------------------------------------------------------------
3145
3146 (define-pmacro (dst16-relative-operand offset xmode)
3147 (begin
3148 (define-derived-operand
3149 (name (.sym dst16- offset -8-SB-relative- xmode))
3150 (comment (.str "m16c dsp:8[sb] relative destination " xmode))
3151 (attrs (machine 16))
3152 (mode xmode)
3153 (args ((.sym Dsp- offset -u8)))
3154 (syntax (.str "${Dsp-" offset "-u8}[sb]"))
3155 (base-ifield f-12-4)
3156 (encoding (+ (f-12-4 #xA) (.sym Dsp- offset -u8)))
3157 (ifield-assertion (eq f-12-4 #xA))
3158 (getter (mem16 xmode (add (.sym Dsp- offset -u8) (reg h-sb))))
3159 (setter (set (mem16 xmode (add (.sym Dsp- offset -u8) (reg h-sb))) newval))
3160 )
3161 (define-derived-operand
3162 (name (.sym dst16- offset -16-SB-relative- xmode))
3163 (comment (.str "m16c dsp:16[sb] relative destination " xmode))
3164 (attrs (machine 16))
3165 (mode xmode)
3166 (args ((.sym Dsp- offset -u16)))
3167 (syntax (.str "${Dsp-" offset "-u16}[sb]"))
3168 (base-ifield f-12-4)
3169 (encoding (+ (f-12-4 #xE) (.sym Dsp- offset -u16)))
3170 (ifield-assertion (eq f-12-4 #xE))
3171 (getter (mem16 xmode (add (.sym Dsp- offset -u16) (reg h-sb))))
3172 (setter (set (mem16 xmode (add (.sym Dsp- offset -u16) (reg h-sb))) newval))
3173 )
3174 (define-derived-operand
3175 (name (.sym dst16- offset -8-FB-relative- xmode))
3176 (comment (.str "m16c dsp:8[fb] relative destination " xmode))
3177 (attrs (machine 16))
3178 (mode xmode)
3179 (args ((.sym Dsp- offset -s8)))
3180 (syntax (.str "${Dsp-" offset "-s8}[fb]"))
3181 (base-ifield f-12-4)
3182 (encoding (+ (f-12-4 #xB) (.sym Dsp- offset -s8)))
3183 (ifield-assertion (eq f-12-4 #xB))
3184 (getter (mem16 xmode (add (.sym Dsp- offset -s8) (reg h-fb))))
3185 (setter (set (mem16 xmode (add (.sym Dsp- offset -s8) (reg h-fb))) newval))
3186 )
3187 (define-derived-operand
3188 (name (.sym dst16- offset -8-An-relative- xmode))
3189 (comment (.str "m16c dsp:8[An] relative destination " xmode))
3190 (attrs (machine 16))
3191 (mode xmode)
3192 (args (Dst16An (.sym Dsp- offset -u8)))
3193 (syntax (.str "${Dsp-" offset "-u8}[$Dst16An]"))
3194 (base-ifield f-12-4)
3195 (encoding (+ (f-12-2 2) (f-14-1 0) (.sym Dsp- offset -u8) Dst16An))
3196 (ifield-assertion (andif (eq f-12-2 2) (eq f-14-1 0)))
3197 (getter (mem16 xmode (add (.sym Dsp- offset -u8) Dst16An)))
3198 (setter (set (mem16 xmode (add (.sym Dsp- offset -u8) Dst16An)) newval))
3199 )
3200 (define-derived-operand
3201 (name (.sym dst16- offset -16-An-relative- xmode))
3202 (comment (.str "m16c dsp:16[An] relative destination " xmode))
3203 (attrs (machine 16))
3204 (mode xmode)
3205 (args (Dst16An (.sym Dsp- offset -u16)))
3206 (syntax (.str "${Dsp-" offset "-u16}[$Dst16An]"))
3207 (base-ifield f-12-4)
3208 (encoding (+ (f-12-2 3) (f-14-1 0) (.sym Dsp- offset -u16) Dst16An))
3209 (ifield-assertion (andif (eq f-12-2 3) (eq f-14-1 0)))
3210 (getter (mem16 xmode (add (.sym Dsp- offset -u16) Dst16An)))
3211 (setter (set (mem16 xmode (add (.sym Dsp- offset -u16) Dst16An)) newval))
3212 )
3213 (define-derived-operand
3214 (name (.sym dst16- offset -20-An-relative- xmode))
3215 (comment (.str "m16c dsp:20[An] relative destination " xmode))
3216 (attrs (machine 16))
3217 (mode xmode)
3218 (args (Dst16An (.sym Dsp- offset -u20)))
3219 (syntax (.str "${Dsp-" offset "-u20}[$Dst16An]"))
3220 (base-ifield f-12-4)
3221 (encoding (+ (f-12-2 3) (f-14-1 0) (.sym Dsp- offset -u20) Dst16An))
3222 (ifield-assertion (andif (eq f-12-2 3) (eq f-14-1 0)))
3223 (getter (mem16 xmode (add (.sym Dsp- offset -u20) Dst16An)))
3224 (setter (set (mem16 xmode (add (.sym Dsp- offset -u20) Dst16An)) newval))
3225 )
3226 )
3227 )
3228
3229 (dst16-relative-operand 16 QI)
3230 (dst16-relative-operand 24 QI)
3231 (dst16-relative-operand 32 QI)
3232 (dst16-relative-operand 40 QI)
3233 (dst16-relative-operand 48 QI)
3234 (dst16-relative-operand 16 HI)
3235 (dst16-relative-operand 24 HI)
3236 (dst16-relative-operand 32 HI)
3237 (dst16-relative-operand 40 HI)
3238 (dst16-relative-operand 48 HI)
3239 (dst16-relative-operand 16 SI)
3240 (dst16-relative-operand 24 SI)
3241 (dst16-relative-operand 32 SI)
3242 (dst16-relative-operand 40 SI)
3243 (dst16-relative-operand 48 SI)
3244
3245 (define-pmacro (dst16-relative-Ext-operand offset smode dmode)
3246 (begin
3247 (define-derived-operand
3248 (name (.sym dst16- offset -8-SB-relative-Ext- smode))
3249 (comment (.str "m16c dsp:8[sb] relative destination " smode))
3250 (attrs (machine 16))
3251 (mode dmode)
3252 (args ((.sym Dsp- offset -u8)))
3253 (syntax (.str "${Dsp-" offset "-u8}[sb]"))
3254 (base-ifield f-12-4)
3255 (encoding (+ (f-12-4 #xA) (.sym Dsp- offset -u8)))
3256 (ifield-assertion (eq f-12-4 #xA))
3257 (getter (mem16 smode (add (.sym Dsp- offset -u8) (reg h-sb))))
3258 (setter (set (mem16 dmode (add (.sym Dsp- offset -u8) (reg h-sb))) newval))
3259 )
3260 (define-derived-operand
3261 (name (.sym dst16- offset -16-SB-relative-Ext- smode))
3262 (comment (.str "m16c dsp:16[sb] relative destination " smode))
3263 (attrs (machine 16))
3264 (mode dmode)
3265 (args ((.sym Dsp- offset -u16)))
3266 (syntax (.str "${Dsp-" offset "-u16}[sb]"))
3267 (base-ifield f-12-4)
3268 (encoding (+ (f-12-4 #xE) (.sym Dsp- offset -u16)))
3269 (ifield-assertion (eq f-12-4 #xE))
3270 (getter (mem16 smode (add (.sym Dsp- offset -u16) (reg h-sb))))
3271 (setter (set (mem16 dmode (add (.sym Dsp- offset -u16) (reg h-sb))) newval))
3272 )
3273 (define-derived-operand
3274 (name (.sym dst16- offset -8-FB-relative-Ext- smode))
3275 (comment (.str "m16c dsp:8[fb] relative destination " smode))
3276 (attrs (machine 16))
3277 (mode dmode)
3278 (args ((.sym Dsp- offset -s8)))
3279 (syntax (.str "${Dsp-" offset "-s8}[fb]"))
3280 (base-ifield f-12-4)
3281 (encoding (+ (f-12-4 #xB) (.sym Dsp- offset -s8)))
3282 (ifield-assertion (eq f-12-4 #xB))
3283 (getter (mem16 smode (add (.sym Dsp- offset -s8) (reg h-fb))))
3284 (setter (set (mem16 dmode (add (.sym Dsp- offset -s8) (reg h-fb))) newval))
3285 )
3286 (define-derived-operand
3287 (name (.sym dst16- offset -8-An-relative-Ext- smode))
3288 (comment (.str "m16c dsp:8[An] relative destination " smode))
3289 (attrs (machine 16))
3290 (mode dmode)
3291 (args (Dst16An (.sym Dsp- offset -u8)))
3292 (syntax (.str "${Dsp-" offset "-u8}[$Dst16An]"))
3293 (base-ifield f-12-4)
3294 (encoding (+ (f-12-2 2) (f-14-1 0) (.sym Dsp- offset -u8) Dst16An))
3295 (ifield-assertion (andif (eq f-12-2 2) (eq f-14-1 0)))
3296 (getter (mem16 smode (add (.sym Dsp- offset -u8) Dst16An)))
3297 (setter (set (mem16 dmode (add (.sym Dsp- offset -u8) Dst16An)) newval))
3298 )
3299 (define-derived-operand
3300 (name (.sym dst16- offset -16-An-relative-Ext- smode))
3301 (comment (.str "m16c dsp:16[An] relative destination " smode))
3302 (attrs (machine 16))
3303 (mode dmode)
3304 (args (Dst16An (.sym Dsp- offset -u16)))
3305 (syntax (.str "${Dsp-" offset "-u16}[$Dst16An]"))
3306 (base-ifield f-12-4)
3307 (encoding (+ (f-12-2 3) (f-14-1 0) (.sym Dsp- offset -u16) Dst16An))
3308 (ifield-assertion (andif (eq f-12-2 3) (eq f-14-1 0)))
3309 (getter (mem16 smode (add (.sym Dsp- offset -u16) Dst16An)))
3310 (setter (set (mem16 dmode (add (.sym Dsp- offset -u16) Dst16An)) newval))
3311 )
3312 )
3313 )
3314
3315 (dst16-relative-Ext-operand 16 QI HI)
3316
3317 (define-pmacro (dst32-relative-operand offset group base1 base2 smode dmode)
3318 (begin
3319 (define-derived-operand
3320 (name (.sym dst32- offset -8-SB-relative- group - smode))
3321 (comment (.str "m32c dsp:8[sb] relative destination " smode))
3322 (attrs (machine 32))
3323 (mode dmode)
3324 (args ((.sym Dsp- offset -u8)))
3325 (syntax (.str "${Dsp-" offset "-u8}[sb]"))
3326 (base-ifield (.sym f- base1 -6))
3327 (encoding (+ ((.sym f- base1 -3) 1) ((.sym f- base2 -2) 2) (.sym Dsp- offset -u8)))
3328 (ifield-assertion (andif (eq (.sym f- base1 -3) 1) (eq (.sym f- base2 -2) 2)))
3329 (getter (c-call dmode (.str "operand_getter_" dmode) sb (.sym Dsp- offset -u8)))
3330 (setter (c-call DFLT (.str "operand_setter_" dmode) newval sb (.sym Dsp- offset -u8)))
3331 ; (getter (mem32 smode (add (.sym Dsp- offset -u8) (reg h-sb))))
3332 ; (setter (set (mem32 dmode (add (.sym Dsp- offset -u8) (reg h-sb))) newval))
3333 )
3334 (define-derived-operand
3335 (name (.sym dst32- offset -16-SB-relative- group - smode))
3336 (comment (.str "m32c dsp:16[sb] relative destination " smode))
3337 (attrs (machine 32))
3338 (mode dmode)
3339 (args ((.sym Dsp- offset -u16)))
3340 (syntax (.str "${Dsp-" offset "-u16}[sb]"))
3341 (base-ifield (.sym f- base1 -6))
3342 (encoding (+ ((.sym f- base1 -3) 2) ((.sym f- base2 -2) 2) (.sym Dsp- offset -u16)))
3343 (ifield-assertion (andif (eq (.sym f- base1 -3) 2) (eq (.sym f- base2 -2) 2)))
3344 (getter (c-call dmode (.str "operand_getter_" dmode) sb (.sym Dsp- offset -u16)))
3345 (setter (c-call DFLT (.str "operand_setter_" dmode) newval sb (.sym Dsp- offset -u16)))
3346 ; (getter (mem32 smode (add (.sym Dsp- offset -u16) (reg h-sb))))
3347 ; (setter (set (mem32 dmode (add (.sym Dsp- offset -u16) (reg h-sb))) newval))
3348 )
3349 (define-derived-operand
3350 (name (.sym dst32- offset -8-FB-relative- group - smode))
3351 (comment (.str "m32c dsp:8[fb] relative destination " smode))
3352 (attrs (machine 32))
3353 (mode dmode)
3354 (args ((.sym Dsp- offset -s8)))
3355 (syntax (.str "${Dsp-" offset "-s8}[fb]"))
3356 (base-ifield (.sym f- base1 -6))
3357 (encoding (+ ((.sym f- base1 -3) 1) ((.sym f- base2 -2) 3) (.sym Dsp- offset -s8)))
3358 (ifield-assertion (andif (eq (.sym f- base1 -3) 1) (eq (.sym f- base2 -2) 3)))
3359 (getter (c-call dmode (.str "operand_getter_" dmode) fb (.sym Dsp- offset -s8)))
3360 (setter (c-call DFLT (.str "operand_setter_" dmode) newval fb (.sym Dsp- offset -s8)))
3361 ; (getter (mem32 smode (add (.sym Dsp- offset -s8) (reg h-fb))))
3362 ; (setter (set (mem32 dmode (add (.sym Dsp- offset -s8) (reg h-fb))) newval))
3363 )
3364 (define-derived-operand
3365 (name (.sym dst32- offset -16-FB-relative- group - smode))
3366 (comment (.str "m32c dsp:16[fb] relative destination " smode))
3367 (attrs (machine 32))
3368 (mode dmode)
3369 (args ((.sym Dsp- offset -s16)))
3370 (syntax (.str "${Dsp-" offset "-s16}[fb]"))
3371 (base-ifield (.sym f- base1 -6))
3372 (encoding (+ ((.sym f- base1 -3) 2) ((.sym f- base2 -2) 3) (.sym Dsp- offset -s16)))
3373 (ifield-assertion (andif (eq (.sym f- base1 -3) 2) (eq (.sym f- base2 -2) 3)))
3374 (getter (c-call dmode (.str "operand_getter_" dmode) fb (.sym Dsp- offset -s16)))
3375 (setter (c-call DFLT (.str "operand_setter_" dmode) newval fb (.sym Dsp- offset -s16)))
3376 ; (getter (mem32 smode (add (.sym Dsp- offset -s16) (reg h-fb))))
3377 ; (setter (set (mem32 dmode (add (.sym Dsp- offset -s16) (reg h-fb))) newval))
3378 )
3379 (define-derived-operand
3380 (name (.sym dst32- offset -8-An-relative- group - smode))
3381 (comment (.str "m32c dsp:8[An] relative destination " smode))
3382 (attrs (machine 32))
3383 (mode dmode)
3384 (args ((.sym Dst32An group) (.sym Dsp- offset -u8)))
3385 (syntax (.str "${Dsp-" offset "-u8}[$Dst32An" group "]"))
3386 (base-ifield (.sym f- base1 -6))
3387 (encoding (+ ((.sym f- base1 -3) 1) ((.sym f- base2 -1) 0) (.sym Dsp- offset -u8) (.sym Dst32An group)))
3388 (ifield-assertion (andif (eq (.sym f- base1 -3) 1) (eq (.sym f- base2 -1) 0)))
3389 (getter (c-call dmode (.str "operand_getter_" dmode) (.sym Dst32An group) (.sym Dsp- offset -u8)))
3390 (setter (c-call DFLT (.str "operand_setter_" dmode) newval (.sym Dst32An group) (.sym Dsp- offset -u8)))
3391 ; (getter (mem32 smode (add (.sym Dsp- offset -u8) (.sym Dst32An group))))
3392 ; (setter (set (mem32 dmode (add (.sym Dsp- offset -u8) (.sym Dst32An group))) newval))
3393 )
3394 (define-derived-operand
3395 (name (.sym dst32- offset -16-An-relative- group - smode))
3396 (comment (.str "m32c dsp:16[An] relative destination " smode))
3397 (attrs (machine 32))
3398 (mode dmode)
3399 (args ((.sym Dst32An group) (.sym Dsp- offset -u16)))
3400 (syntax (.str "${Dsp-" offset "-u16}[$Dst32An" group "]"))
3401 (base-ifield (.sym f- base1 -6))
3402 (encoding (+ ((.sym f- base1 -3) 2) ((.sym f- base2 -1) 0) (.sym Dsp- offset -u16) (.sym Dst32An group)))
3403 (ifield-assertion (andif (eq (.sym f- base1 -3) 2) (eq (.sym f- base2 -1) 0)))
3404 (getter (c-call dmode (.str "operand_getter_" dmode) (.sym Dst32An group) (.sym Dsp- offset -u16)))
3405 (setter (c-call DFLT (.str "operand_setter_" dmode) newval (.sym Dst32An group) (.sym Dsp- offset -u16)))
3406 ; (getter (mem32 smode (add (.sym Dsp- offset -u16) (.sym Dst32An group))))
3407 ; (setter (set (mem32 dmode (add (.sym Dsp- offset -u16) (.sym Dst32An group))) newval))
3408 )
3409 (define-derived-operand
3410 (name (.sym dst32- offset -24-An-relative- group - smode))
3411 (comment (.str "m32c dsp:16[An] relative destination " smode))
3412 (attrs (machine 32))
3413 (mode dmode)
3414 (args ((.sym Dst32An group) (.sym Dsp- offset -u24)))
3415 (syntax (.str "${Dsp-" offset "-u24}[$Dst32An" group "]"))
3416 (base-ifield (.sym f- base1 -6))
3417 (encoding (+ ((.sym f- base1 -3) 3) ((.sym f- base2 -1) 0) (.sym Dsp- offset -u24) (.sym Dst32An group)))
3418 (ifield-assertion (andif (eq (.sym f- base1 -3) 3) (eq (.sym f- base2 -1) 0)))
3419 (getter (c-call dmode (.str "operand_getter_" dmode) (.sym Dst32An group) (.sym Dsp- offset -u24)))
3420 (setter (c-call DFLT (.str "operand_setter_" dmode) newval (.sym Dst32An group) (.sym Dsp- offset -u24)))
3421 ; (getter (mem32 smode (add (.sym Dsp- offset -u24) (.sym Dst32An group))))
3422 ; (setter (set (mem32 dmode (add (.sym Dsp- offset -u24) (.sym Dst32An group))) newval))
3423 )
3424 )
3425 )
3426
3427 (dst32-relative-operand 16 Unprefixed 4 8 QI QI)
3428 (dst32-relative-operand 24 Unprefixed 4 8 QI QI)
3429 (dst32-relative-operand 32 Unprefixed 4 8 QI QI)
3430 (dst32-relative-operand 40 Unprefixed 4 8 QI QI)
3431 (dst32-relative-operand 16 Unprefixed 4 8 HI HI)
3432 (dst32-relative-operand 24 Unprefixed 4 8 HI HI)
3433 (dst32-relative-operand 32 Unprefixed 4 8 HI HI)
3434 (dst32-relative-operand 40 Unprefixed 4 8 HI HI)
3435 (dst32-relative-operand 16 Unprefixed 4 8 SI SI)
3436 (dst32-relative-operand 24 Unprefixed 4 8 SI SI)
3437 (dst32-relative-operand 32 Unprefixed 4 8 SI SI)
3438 (dst32-relative-operand 40 Unprefixed 4 8 SI SI)
3439
3440 (dst32-relative-operand 24 Prefixed 12 16 QI QI)
3441 (dst32-relative-operand 32 Prefixed 12 16 QI QI)
3442 (dst32-relative-operand 40 Prefixed 12 16 QI QI)
3443 (dst32-relative-operand 48 Prefixed 12 16 QI QI)
3444 (dst32-relative-operand 24 Prefixed 12 16 HI HI)
3445 (dst32-relative-operand 32 Prefixed 12 16 HI HI)
3446 (dst32-relative-operand 40 Prefixed 12 16 HI HI)
3447 (dst32-relative-operand 48 Prefixed 12 16 HI HI)
3448 (dst32-relative-operand 24 Prefixed 12 16 SI SI)
3449 (dst32-relative-operand 32 Prefixed 12 16 SI SI)
3450 (dst32-relative-operand 40 Prefixed 12 16 SI SI)
3451 (dst32-relative-operand 48 Prefixed 12 16 SI SI)
3452
3453 (dst32-relative-operand 16 ExtUnprefixed 4 8 QI HI)
3454 (dst32-relative-operand 16 ExtUnprefixed 4 8 HI SI)
3455
3456 ;-------------------------------------------------------------
3457 ; Absolute address
3458 ;-------------------------------------------------------------
3459
3460 (define-pmacro (dst16-absolute offset xmode)
3461 (begin
3462 (define-derived-operand
3463 (name (.sym dst16- offset -16-absolute- xmode))
3464 (comment (.str "m16c absolute address " xmode))
3465 (attrs (machine 16))
3466 (mode xmode)
3467 (args ((.sym Dsp- offset -u16)))
3468 (syntax (.str "${Dsp-" offset "-u16}"))
3469 (base-ifield f-12-4)
3470 (encoding (+ (f-12-4 #xF) (.sym Dsp- offset -u16)))
3471 (ifield-assertion (eq f-12-4 #xF))
3472 (getter (mem16 xmode (.sym Dsp- offset -u16)))
3473 (setter (set (mem16 xmode (.sym Dsp- offset -u16)) newval))
3474 )
3475 )
3476 )
3477
3478 (dst16-absolute 16 QI)
3479 (dst16-absolute 24 QI)
3480 (dst16-absolute 32 QI)
3481 (dst16-absolute 40 QI)
3482 (dst16-absolute 48 QI)
3483 (dst16-absolute 16 HI)
3484 (dst16-absolute 24 HI)
3485 (dst16-absolute 32 HI)
3486 (dst16-absolute 40 HI)
3487 (dst16-absolute 48 HI)
3488 (dst16-absolute 16 SI)
3489 (dst16-absolute 24 SI)
3490 (dst16-absolute 32 SI)
3491 (dst16-absolute 40 SI)
3492 (dst16-absolute 48 SI)
3493
3494 (define-derived-operand
3495 (name dst16-16-16-absolute-Ext-QI)
3496 (comment "m16c absolute address QI")
3497 (attrs (machine 16))
3498 (mode HI)
3499 (args (Dsp-16-u16))
3500 (syntax "${Dsp-16-u16}")
3501 (base-ifield f-12-4)
3502 (encoding (+ (f-12-4 #xF) Dsp-16-u16))
3503 (ifield-assertion (eq f-12-4 #xF))
3504 (getter (mem16 QI Dsp-16-u16))
3505 (setter (set (mem16 HI Dsp-16-u16) newval))
3506 )
3507
3508 (define-pmacro (dst32-absolute offset group base1 base2 smode dmode)
3509 (begin
3510 (define-derived-operand
3511 (name (.sym dst32- offset -16-absolute- group - smode))
3512 (comment (.str "m32c absolute address " smode))
3513 (attrs (machine 32))
3514 (mode dmode)
3515 (args ((.sym Dsp- offset -u16)))
3516 (syntax (.str "${Dsp-" offset "-u16}"))
3517 (base-ifield (.sym f- base1 -6))
3518 (encoding (+ ((.sym f- base1 -3) 3) ((.sym f- base2 -2) 3) (.sym Dsp- offset -u16)))
3519 (ifield-assertion (andif (eq (.sym f- base1 -3) 3) (eq (.sym f- base2 -2) 3)))
3520 (getter (c-call smode (.str "operand_getter_" smode) (const 0) (.sym Dsp- offset -u16)))
3521 (setter (c-call DFLT (.str "operand_setter_" dmode) newval (const 0) (.sym Dsp- offset -u16)))
3522 ; (getter (mem32 smode (.sym Dsp- offset -u16)))
3523 ; (setter (set (mem32 dmode (.sym Dsp- offset -u16)) newval))
3524 )
3525 (define-derived-operand
3526 (name (.sym dst32- offset -24-absolute- group - smode))
3527 (comment (.str "m32c absolute address " smode))
3528 (attrs (machine 32))
3529 (mode dmode)
3530 (args ((.sym Dsp- offset -u24)))
3531 (syntax (.str "${Dsp-" offset "-u24}"))
3532 (base-ifield (.sym f- base1 -6))
3533 (encoding (+ ((.sym f- base1 -3) 3) ((.sym f- base2 -2) 2) (.sym Dsp- offset -u24)))
3534 (ifield-assertion (andif (eq (.sym f- base1 -3) 3) (eq (.sym f- base2 -2) 2)))
3535 (getter (c-call smode (.str "operand_getter_" smode) (const 0) (.sym Dsp- offset -u24)))
3536 (setter (c-call DFLT (.str "operand_setter_" dmode) newval (const 0) (.sym Dsp- offset -u24)))
3537 ; (getter (mem32 smode (.sym Dsp- offset -u24)))
3538 ; (setter (set (mem32 dmode (.sym Dsp- offset -u24)) newval))
3539 )
3540 )
3541 )
3542
3543 (dst32-absolute 16 Unprefixed 4 8 QI QI)
3544 (dst32-absolute 24 Unprefixed 4 8 QI QI)
3545 (dst32-absolute 32 Unprefixed 4 8 QI QI)
3546 (dst32-absolute 40 Unprefixed 4 8 QI QI)
3547 (dst32-absolute 16 Unprefixed 4 8 HI HI)
3548 (dst32-absolute 24 Unprefixed 4 8 HI HI)
3549 (dst32-absolute 32 Unprefixed 4 8 HI HI)
3550 (dst32-absolute 40 Unprefixed 4 8 HI HI)
3551 (dst32-absolute 16 Unprefixed 4 8 SI SI)
3552 (dst32-absolute 24 Unprefixed 4 8 SI SI)
3553 (dst32-absolute 32 Unprefixed 4 8 SI SI)
3554 (dst32-absolute 40 Unprefixed 4 8 SI SI)
3555
3556 (dst32-absolute 24 Prefixed 12 16 QI QI)
3557 (dst32-absolute 32 Prefixed 12 16 QI QI)
3558 (dst32-absolute 40 Prefixed 12 16 QI QI)
3559 (dst32-absolute 48 Prefixed 12 16 QI QI)
3560 (dst32-absolute 24 Prefixed 12 16 HI HI)
3561 (dst32-absolute 32 Prefixed 12 16 HI HI)
3562 (dst32-absolute 40 Prefixed 12 16 HI HI)
3563 (dst32-absolute 48 Prefixed 12 16 HI HI)
3564 (dst32-absolute 24 Prefixed 12 16 SI SI)
3565 (dst32-absolute 32 Prefixed 12 16 SI SI)
3566 (dst32-absolute 40 Prefixed 12 16 SI SI)
3567 (dst32-absolute 48 Prefixed 12 16 SI SI)
3568
3569 (dst32-absolute 16 ExtUnprefixed 4 8 QI HI)
3570 (dst32-absolute 16 ExtUnprefixed 4 8 HI SI)
3571
3572 ;-------------------------------------------------------------
3573 ; An indirect indirect
3574 ;-------------------------------------------------------------
3575
3576 ;(define-pmacro (dst-An-indirect-indirect-operand xmode)
3577 ; (define-derived-operand
3578 ; (name (.sym dst32-An-indirect-indirect- xmode))
3579 ; (comment (.str "m32c An indirect indirect destination " xmode))
3580 ; (attrs (machine 32))
3581 ; (mode xmode)
3582 ; (args (Dst32AnPrefixed))
3583 ; (syntax (.str "[[$Dst32AnPrefixed]]"))
3584 ; (base-ifield f-12-6)
3585 ; (encoding (+ (f-12-3 0) (f-16-1 0) Dst32AnPrefixed))
3586 ; (ifield-assertion (andif (eq f-12-3 0) (eq f-16-1 0)))
3587 ; (getter (mem32 xmode (indirect-addr Dst32AnPrefixed)))
3588 ; (setter (set (mem32 xmode (indirect-addr Dst32AnPrefixed)) newval))
3589 ; )
3590 ;)
3591
3592 ; (dst-An-indirect-indirect-operand QI)
3593 ; (dst-An-indirect-indirect-operand HI)
3594 ; (dst-An-indirect-indirect-operand SI)
3595
3596 ;-------------------------------------------------------------
3597 ; Relative indirect
3598 ;-------------------------------------------------------------
3599
3600 (define-pmacro (dst-relative-indirect-operand offset xmode)
3601 (begin
3602 ; (define-derived-operand
3603 ; (name (.sym dst32- offset -8-SB-relative-indirect- xmode))
3604 ; (comment (.str "m32c dsp:8[sb] relative destination " xmode))
3605 ; (attrs (machine 32))
3606 ; (mode xmode)
3607 ; (args ((.sym Dsp- offset -u8)))
3608 ; (syntax (.str "[${Dsp-" offset "-u8}[sb]]"))
3609 ; (base-ifield f-12-6)
3610 ; (encoding (+ (f-12-3 1) (f-16-2 2) (.sym Dsp- offset -u8)))
3611 ; (ifield-assertion (andif (eq f-12-3 1) (eq f-16-2 2)))
3612 ; (getter (mem32 xmode (indirect-addr (add (.sym Dsp- offset -u8) (reg h-sb)))))
3613 ; (setter (set (mem32 xmode (indirect-addr (add (.sym Dsp- offset -u8) (reg h-sb)))) newval))
3614 ; )
3615 ; (define-derived-operand
3616 ; (name (.sym dst32- offset -16-SB-relative-indirect- xmode))
3617 ; (comment (.str "m32c dsp:16[sb] relative destination " xmode))
3618 ; (attrs (machine 32))
3619 ; (mode xmode)
3620 ; (args ((.sym Dsp- offset -u16)))
3621 ; (syntax (.str "[${Dsp-" offset "-u16}[sb]]"))
3622 ; (base-ifield f-12-6)
3623 ; (encoding (+ (f-12-3 2) (f-16-2 2) (.sym Dsp- offset -u16)))
3624 ; (ifield-assertion (andif (eq f-12-3 2) (eq f-16-2 2)))
3625 ; (getter (mem32 xmode (indirect-addr (add (.sym Dsp- offset -u16) (reg h-sb)))))
3626 ; (setter (set (mem32 xmode (indirect-addr (add (.sym Dsp- offset -u16) (reg h-sb)))) newval))
3627 ; )
3628 ; (define-derived-operand
3629 ; (name (.sym dst32- offset -8-FB-relative-indirect- xmode))
3630 ; (comment (.str "m32c dsp:8[fb] relative destination " xmode))
3631 ; (attrs (machine 32))
3632 ; (mode xmode)
3633 ; (args ((.sym Dsp- offset -s8)))
3634 ; (syntax (.str "[${Dsp-" offset "-s8}[fb]]"))
3635 ; (base-ifield f-12-6)
3636 ; (encoding (+ (f-12-3 1) (f-16-2 3) (.sym Dsp- offset -s8)))
3637 ; (ifield-assertion (andif (eq f-12-3 1) (eq f-16-2 3)))
3638 ; (getter (mem32 xmode (indirect-addr (add (.sym Dsp- offset -s8) (reg h-fb)))))
3639 ; (setter (set (mem32 xmode (indirect-addr (add (.sym Dsp- offset -s8) (reg h-fb)))) newval))
3640 ; )
3641 ; (define-derived-operand
3642 ; (name (.sym dst32- offset -16-FB-relative-indirect- xmode))
3643 ; (comment (.str "m32c dsp:16[fb] relative destination " xmode))
3644 ; (attrs (machine 32))
3645 ; (mode xmode)
3646 ; (args ((.sym Dsp- offset -s16)))
3647 ; (syntax (.str "[${Dsp-" offset "-s16}[fb]]"))
3648 ; (base-ifield f-12-6)
3649 ; (encoding (+ (f-12-3 2) (f-16-2 3) (.sym Dsp- offset -s16)))
3650 ; (ifield-assertion (andif (eq f-12-3 2) (eq f-16-2 3)))
3651 ; (getter (mem32 xmode (indirect-addr (add (.sym Dsp- offset -s16) (reg h-fb)))))
3652 ; (setter (set (mem32 xmode (indirect-addr (add (.sym Dsp- offset -s16) (reg h-fb)))) newval))
3653 ; )
3654 ; (define-derived-operand
3655 ; (name (.sym dst32- offset -8-An-relative-indirect- xmode))
3656 ; (comment (.str "m32c dsp:8[An] relative indirect destination " xmode))
3657 ; (attrs (machine 32))
3658 ; (mode xmode)
3659 ; (args (Dst32AnPrefixed (.sym Dsp- offset -u8)))
3660 ; (syntax (.str "[${Dsp-" offset "-u8}[$Dst32AnPrefixed]]"))
3661 ; (base-ifield f-12-6)
3662 ; (encoding (+ (f-12-3 1) (f-16-1 0) (.sym Dsp- offset -u8) Dst32AnPrefixed))
3663 ; (ifield-assertion (andif (eq f-12-3 1) (eq f-16-1 0)))
3664 ; (getter (mem32 xmode (indirect-addr (add (.sym Dsp- offset -u8) Dst32AnPrefixed))))
3665 ; (setter (set (mem32 xmode (indirect-addr (add (.sym Dsp- offset -u8) Dst32AnPrefixed))) newval))
3666 ; )
3667 ; (define-derived-operand
3668 ; (name (.sym dst32- offset -16-An-relative-indirect- xmode))
3669 ; (comment (.str "m32c dsp:16[An] relative destination " xmode))
3670 ; (attrs (machine 32))
3671 ; (mode xmode)
3672 ; (args (Dst32AnPrefixed (.sym Dsp- offset -u16)))
3673 ; (syntax (.str "[${Dsp-" offset "-u16}[$Dst32AnPrefixed]]"))
3674 ; (base-ifield f-12-6)
3675 ; (encoding (+ (f-12-3 2) (f-16-1 0) (.sym Dsp- offset -u16) Dst32AnPrefixed))
3676 ; (ifield-assertion (andif (eq f-12-3 2) (eq f-16-1 0)))
3677 ; (getter (mem32 xmode (indirect-addr (add (.sym Dsp- offset -u16) Dst32AnPrefixed))))
3678 ; (setter (set (mem32 xmode (indirect-addr (add (.sym Dsp- offset -u16) Dst32AnPrefixed))) newval))
3679 ; )
3680 ; (define-derived-operand
3681 ; (name (.sym dst32- offset -24-An-relative-indirect- xmode))
3682 ; (comment (.str "m32c dsp:24[An] relative destination " xmode))
3683 ; (attrs (machine 32))
3684 ; (mode xmode)
3685 ; (args (Dst32AnPrefixed (.sym Dsp- offset -u24)))
3686 ; (syntax (.str "[${Dsp-" offset "-u24}[$Dst32AnPrefixed]]"))
3687 ; (base-ifield f-12-6)
3688 ; (encoding (+ (f-12-3 3) (f-16-1 0) (.sym Dsp- offset -u24) Dst32AnPrefixed))
3689 ; (ifield-assertion (andif (eq f-12-3 3) (eq f-16-1 0)))
3690 ; (getter (mem32 xmode (indirect-addr (add (.sym Dsp- offset -u24) Dst32AnPrefixed))))
3691 ; (setter (set (mem32 xmode (indirect-addr (add (.sym Dsp- offset -u24) Dst32AnPrefixed))) newval))
3692 ; )
3693 )
3694 )
3695
3696 ; (dst-relative-indirect-operand 24 QI)
3697 ; (dst-relative-indirect-operand 32 QI)
3698 ; (dst-relative-indirect-operand 40 QI)
3699 ; (dst-relative-indirect-operand 48 QI)
3700 ; (dst-relative-indirect-operand 24 HI)
3701 ; (dst-relative-indirect-operand 32 HI)
3702 ; (dst-relative-indirect-operand 40 HI)
3703 ; (dst-relative-indirect-operand 48 HI)
3704 ; (dst-relative-indirect-operand 24 SI)
3705 ; (dst-relative-indirect-operand 32 SI)
3706 ; (dst-relative-indirect-operand 40 SI)
3707 ; (dst-relative-indirect-operand 48 SI)
3708
3709 ;-------------------------------------------------------------
3710 ; Absolute indirect
3711 ;-------------------------------------------------------------
3712
3713 (define-pmacro (dst-absolute-indirect offset xmode)
3714 (begin
3715 ; (define-derived-operand
3716 ; (name (.sym dst32- offset -16-absolute-indirect-derived- xmode))
3717 ; (comment (.str "m32c absolute indirect address " xmode))
3718 ; (attrs (machine 32))
3719 ; (mode xmode)
3720 ; (args ((.sym Dsp- offset -u16)))
3721 ; (syntax (.str "[${Dsp-" offset "-u16}]"))
3722 ; (base-ifield f-12-6)
3723 ; (encoding (+ (f-12-3 3) (f-16-2 3) (.sym Dsp- offset -u16)))
3724 ; (ifield-assertion (andif (eq f-12-3 3) (eq f-16-2 3)))
3725 ; (getter (mem32 xmode (indirect-addr (.sym Dsp- offset -u16))))
3726 ; (setter (set (mem32 xmode (indirect-addr (.sym Dsp- offset -u16))) newval))
3727 ; )
3728 ; (define-derived-operand
3729 ; (name (.sym dst32- offset -24-absolute-indirect-derived- xmode))
3730 ; (comment (.str "m32c absolute indirect address " xmode))
3731 ; (attrs (machine 32))
3732 ; (mode xmode)
3733 ; (args ((.sym Dsp- offset -u24)))
3734 ; (syntax (.str "[${Dsp-" offset "-u24}]"))
3735 ; (base-ifield f-12-6)
3736 ; (encoding (+ (f-12-3 3) (f-16-2 2) (.sym Dsp- offset -u24)))
3737 ; (ifield-assertion (andif (eq f-12-3 3) (eq f-16-2 2)))
3738 ; (getter (mem32 xmode (indirect-addr (.sym Dsp- offset -u24))))
3739 ; (setter (set (mem32 xmode (indirect-addr (.sym Dsp- offset -u24))) newval))
3740 ; )
3741 )
3742 )
3743
3744 (dst-absolute-indirect 24 QI)
3745 (dst-absolute-indirect 32 QI)
3746 (dst-absolute-indirect 40 QI)
3747 (dst-absolute-indirect 48 QI)
3748 (dst-absolute-indirect 24 HI)
3749 (dst-absolute-indirect 32 HI)
3750 (dst-absolute-indirect 40 HI)
3751 (dst-absolute-indirect 48 HI)
3752 (dst-absolute-indirect 24 SI)
3753 (dst-absolute-indirect 32 SI)
3754 (dst-absolute-indirect 40 SI)
3755 (dst-absolute-indirect 48 SI)
3756
3757 ;-------------------------------------------------------------
3758 ; Bit operands
3759 ;-------------------------------------------------------------
3760 (define-pmacro (get-register-bit reg bitno)
3761 (and (srl reg bitno) 1)
3762 )
3763
3764 (define-pmacro (set-register-bit reg bitno value)
3765 (set reg (or (and reg (inv (sll 1 bitno)))
3766 (sll (and QI value 1) bitno)))
3767 )
3768
3769 (define-pmacro (get-memory-bit mach base bitno)
3770 (and (srl (mem-mach mach QI (add base (div bitno 8)))
3771 (mod bitno 8))
3772 1)
3773 )
3774
3775 (define-pmacro (set-memory-bit mach base bitno value)
3776 (sequence ((USI addr))
3777 (set addr (add base (div bitno 8)))
3778 (set (mem-mach mach QI addr)
3779 (or (and (mem-mach mach QI addr)
3780 (inv (sll 1 (mod bitno 8))))
3781 (sll (and QI value 1) (mod bitno 8)))))
3782 )
3783
3784 ;-------------------------------------------------------------
3785 ; Rn direct
3786 ;-------------------------------------------------------------
3787
3788 (define-derived-operand
3789 (name bit16-Rn-direct)
3790 (comment "m16c Rn direct bit")
3791 (attrs (machine 16))
3792 (mode BI)
3793 (args (Bitno16R Bit16Rn))
3794 (syntax "$Bitno16R,$Bit16Rn")
3795 (base-ifield f-12-4)
3796 (encoding (+ (f-12-2 0) Bit16Rn Bitno16R))
3797 (ifield-assertion (eq f-12-2 0))
3798 (getter (get-register-bit Bit16Rn Bitno16R))
3799 (setter (set-register-bit Bit16Rn Bitno16R newval))
3800 )
3801
3802 (define-pmacro (bit32-Rn-direct-operand group base)
3803 (begin
3804 (define-derived-operand
3805 (name (.sym bit32-Rn-direct- group))
3806 (comment "m32c Rn direct bit")
3807 (attrs (machine 32))
3808 (mode BI)
3809 (args ((.sym Bitno32 group) (.sym Bit32Rn group)))
3810 (syntax (.str "$Bitno32" group ",$Bit32Rn" group))
3811 (base-ifield (.sym f- base -6))
3812 (encoding (+ ((.sym f- base -3) 4) (.sym Bit32Rn group) (.sym Bitno32 group)))
3813 (ifield-assertion (eq (.sym f- base -3) 4))
3814 (getter (get-register-bit (.sym Bit32Rn group) (.sym Bitno32 group)))
3815 (setter (set-register-bit (.sym Bit32Rn group) (.sym Bitno32 group) newval))
3816 )
3817 )
3818 )
3819
3820 (bit32-Rn-direct-operand Unprefixed 4)
3821 (bit32-Rn-direct-operand Prefixed 12)
3822
3823 ;-------------------------------------------------------------
3824 ; An direct
3825 ;-------------------------------------------------------------
3826
3827 (define-derived-operand
3828 (name bit16-An-direct)
3829 (comment "m16c An direct bit")
3830 (attrs (machine 16))
3831 (mode BI)
3832 (args (Bitno16R Bit16An))
3833 (syntax "$Bitno16R,$Bit16An")
3834 (base-ifield f-12-4)
3835 (encoding (+ (f-12-2 1) (f-14-1 0) Bit16An Bitno16R))
3836 (ifield-assertion (andif (eq f-12-2 1) (eq f-14-1 0)))
3837 (getter (get-register-bit Bit16An Bitno16R))
3838 (setter (set-register-bit Bit16An Bitno16R newval))
3839 )
3840
3841 (define-pmacro (bit32-An-direct-operand group base1 base2)
3842 (begin
3843 (define-derived-operand
3844 (name (.sym bit32-An-direct- group))
3845 (comment "m32c An direct bit")
3846 (attrs (machine 32))
3847 (mode BI)
3848 (args ((.sym Bitno32 group) (.sym Bit32An group)))
3849 (syntax (.str "$Bitno32" group ",$Bit32An" group))
3850 (base-ifield (.sym f- base1 -6))
3851 (encoding (+ ((.sym f- base1 -3) 0) ((.sym f- base2 -1) 1) (.sym Bit32An group) (.sym Bitno32 group)))
3852 (ifield-assertion (andif (eq (.sym f- base1 -3) 0) (eq (.sym f- base2 -1) 1)))
3853 (getter (get-register-bit (.sym Bit32An group) (.sym Bitno32 group)))
3854 (setter (set-register-bit (.sym Bit32An group) (.sym Bitno32 group) newval))
3855 )
3856 )
3857 )
3858
3859 (bit32-An-direct-operand Unprefixed 4 8)
3860 (bit32-An-direct-operand Prefixed 12 16)
3861
3862 ;-------------------------------------------------------------
3863 ; An indirect
3864 ;-------------------------------------------------------------
3865
3866 (define-derived-operand
3867 (name bit16-An-indirect)
3868 (comment "m16c An indirect bit")
3869 (attrs (machine 16))
3870 (mode BI)
3871 (args (Bit16An))
3872 (syntax "[$Bit16An]")
3873 (base-ifield f-12-4)
3874 (encoding (+ (f-12-2 1) (f-14-1 1) Bit16An))
3875 (ifield-assertion (andif (eq f-12-2 1) (eq f-14-1 1)))
3876 (getter (get-memory-bit 16 0 Bit16An))
3877 (setter (set-memory-bit 16 0 Bit16An newval))
3878 )
3879
3880 (define-pmacro (bit32-An-indirect-operand group base1 base2)
3881 (begin
3882 (define-derived-operand
3883 (name (.sym bit32-An-indirect- group))
3884 (comment "m32c An indirect destination ")
3885 (attrs (machine 32))
3886 (mode BI)
3887 (args ((.sym Bitno32 group) (.sym Bit32An group)))
3888 (syntax (.str "$Bitno32" group ",[$Bit32An" group "]"))
3889 (base-ifield (.sym f- base1 -6))
3890 (encoding (+ ((.sym f- base1 -3) 0) ((.sym f- base2 -1) 0) (.sym Bit32An group) (.sym Bitno32 group)))
3891 (ifield-assertion (andif (eq (.sym f- base1 -3) 0) (eq (.sym f- base2 -1) 0)))
3892 (getter (get-memory-bit 32 (.sym Bit32An group) (.sym Bitno32 group)))
3893 (setter (set-memory-bit 32 (.sym Bit32An group) (.sym Bitno32 group) newval))
3894 )
3895 )
3896 )
3897
3898 (bit32-An-indirect-operand Unprefixed 4 8)
3899 (bit32-An-indirect-operand Prefixed 12 16)
3900
3901 ;-------------------------------------------------------------
3902 ; dsp:d[r] relative
3903 ;-------------------------------------------------------------
3904
3905 (define-pmacro (bit16-relative-operand offset)
3906 (begin
3907 (define-derived-operand
3908 (name (.sym bit16- offset -8-SB-relative))
3909 (comment (.str "m16c dsp:8[sb] relative bit " xmode))
3910 (attrs (machine 16))
3911 (mode BI)
3912 (args ((.sym BitBase16- offset -u8)))
3913 (syntax (.str "${BitBase16-" offset "-u8}[sb]"))
3914 (base-ifield f-12-4)
3915 (encoding (+ (f-12-4 #xA) (.sym BitBase16- offset -u8)))
3916 (ifield-assertion (eq f-12-4 #xA))
3917 (getter (get-memory-bit 16 (reg h-sb) (.sym BitBase16- offset -u8)))
3918 (setter (set-memory-bit 16 (reg h-sb) (.sym BitBase16- offset -u8) newval))
3919 )
3920 (define-derived-operand
3921 (name (.sym bit16- offset -16-SB-relative))
3922 (comment (.str "m16c dsp:16[sb] relative bit " xmode))
3923 (attrs (machine 16))
3924 (mode BI)
3925 (args ((.sym BitBase16- offset -u16)))
3926 (syntax (.str "${BitBase16-" offset "-u16}[sb]"))
3927 (base-ifield f-12-4)
3928 (encoding (+ (f-12-4 #xE) (.sym BitBase16- offset -u16)))
3929 (ifield-assertion (eq f-12-4 #xE))
3930 (getter (get-memory-bit 16 (reg h-sb) (.sym BitBase16- offset -u16)))
3931 (setter (set-memory-bit 16 (reg h-sb) (.sym BitBase16- offset -u16) newval))
3932 )
3933 (define-derived-operand
3934 (name (.sym bit16- offset -8-FB-relative))
3935 (comment (.str "m16c dsp:8[fb] relative bit " xmode))
3936 (attrs (machine 16))
3937 (mode BI)
3938 (args ((.sym BitBase16- offset -s8)))
3939 (syntax (.str "${BitBase16-" offset "-s8}[fb]"))
3940 (base-ifield f-12-4)
3941 (encoding (+ (f-12-4 #xB) (.sym BitBase16- offset -s8)))
3942 (ifield-assertion (eq f-12-4 #xB))
3943 (getter (get-memory-bit 16 (reg h-fb) (.sym BitBase16- offset -s8)))
3944 (setter (set-memory-bit 16 (reg h-fb) (.sym BitBase16- offset -s8) newval))
3945 )
3946 (define-derived-operand
3947 (name (.sym bit16- offset -8-An-relative))
3948 (comment (.str "m16c dsp:8[An] relative bit " xmode))
3949 (attrs (machine 16))
3950 (mode BI)
3951 (args (Bit16An (.sym Dsp- offset -u8)))
3952 (syntax (.str "${Dsp-" offset "-u8}[$Bit16An]"))
3953 (base-ifield f-12-4)
3954 (encoding (+ (f-12-2 2) (f-14-1 0) (.sym Dsp- offset -u8) Bit16An))
3955 (ifield-assertion (andif (eq f-12-2 2) (eq f-14-1 0)))
3956 (getter (get-memory-bit 16 (.sym Dsp- offset -u8) Bit16An))
3957 (setter (set-memory-bit 16 (.sym Dsp- offset -u8) Bit16An newval))
3958 )
3959 (define-derived-operand
3960 (name (.sym bit16- offset -16-An-relative))
3961 (comment (.str "m16c dsp:16[An] relative bit " xmode))
3962 (attrs (machine 16))
3963 (mode BI)
3964 (args (Bit16An (.sym Dsp- offset -u16)))
3965 (syntax (.str "${Dsp-" offset "-u16}[$Bit16An]"))
3966 (base-ifield f-12-4)
3967 (encoding (+ (f-12-2 3) (f-14-1 0) (.sym Dsp- offset -u16) Bit16An))
3968 (ifield-assertion (andif (eq f-12-2 3) (eq f-14-1 0)))
3969 (getter (get-memory-bit 16 (.sym Dsp- offset -u16) Bit16An))
3970 (setter (set-memory-bit 16 (.sym Dsp- offset -u16) Bit16An newval))
3971 )
3972 )
3973 )
3974
3975 (bit16-relative-operand 16)
3976
3977 (define-pmacro (bit32-relative-operand offset group base1 base2)
3978 (begin
3979 (define-derived-operand
3980 (name (.sym bit32- offset -11-SB-relative- group))
3981 (comment "m32c bit,base:11[sb] relative bit")
3982 (attrs (machine 32))
3983 (mode BI)
3984 (args ((.sym BitBase32- offset -u11- group)))
3985 (syntax (.str "${BitBase32-" offset "-u11-" group "}[sb]"))
3986 (base-ifield (.sym f- base1 -12))
3987 (encoding (+ ((.sym f- base1 -3) 1) ((.sym f- base2 -2) 2) (.sym BitBase32- offset -u11- group)))
3988 (ifield-assertion (andif (eq (.sym f- base1 -3) 1) (eq (.sym f- base2 -2) 2)))
3989 (getter (get-memory-bit 32 (reg h-sb) (.sym BitBase32- offset -u11- group)))
3990 (setter (set-memory-bit 32 (reg h-sb) (.sym BitBase32- offset -u11- group) newval))
3991 )
3992 (define-derived-operand
3993 (name (.sym bit32- offset -19-SB-relative- group))
3994 (comment "m32c bit,base:19[sb] relative bit")
3995 (attrs (machine 32))
3996 (mode BI)
3997 (args ((.sym BitBase32- offset -u19- group)))
3998 (syntax (.str "${BitBase32-" offset "-u19-" group "}[sb]"))
3999 (base-ifield (.sym f- base1 -12))
4000 (encoding (+ ((.sym f- base1 -3) 2) ((.sym f- base2 -2) 2) (.sym BitBase32- offset -u19- group)))
4001 (ifield-assertion (andif (eq (.sym f- base1 -3) 2) (eq (.sym f- base2 -2) 2)))
4002 (getter (get-memory-bit 32 (reg h-sb) (.sym BitBase32- offset -u19- group)))
4003 (setter (set-memory-bit 32 (reg h-sb) (.sym BitBase32- offset -u19- group) newval))
4004 )
4005 (define-derived-operand
4006 (name (.sym bit32- offset -11-FB-relative- group))
4007 (comment "m32c bit,base:11[fb] relative bit")
4008 (attrs (machine 32))
4009 (mode BI)
4010 (args ((.sym BitBase32- offset -s11- group)))
4011 (syntax (.str "${BitBase32-" offset "-s11-" group "}[fb]"))
4012 (base-ifield (.sym f- base1 -12))
4013 (encoding (+ ((.sym f- base1 -3) 1) ((.sym f- base2 -2) 3) (.sym BitBase32- offset -s11- group)))
4014 (ifield-assertion (andif (eq (.sym f- base1 -3) 1) (eq (.sym f- base2 -2) 3)))
4015 (getter (get-memory-bit 32 (reg h-fb) (.sym BitBase32- offset -s11- group)))
4016 (setter (set-memory-bit 32 (reg h-fb) (.sym BitBase32- offset -s11- group) newval))
4017 )
4018 (define-derived-operand
4019 (name (.sym bit32- offset -19-FB-relative- group))
4020 (comment "m32c bit,base:19[fb] relative bit")
4021 (attrs (machine 32))
4022 (mode BI)
4023 (args ((.sym BitBase32- offset -s19- group)))
4024 (syntax (.str "${BitBase32-" offset "-s19-" group "}[fb]"))
4025 (base-ifield (.sym f- base1 -12))
4026 (encoding (+ ((.sym f- base1 -3) 2) ((.sym f- base2 -2) 3) (.sym BitBase32- offset -s19- group)))
4027 (ifield-assertion (andif (eq (.sym f- base1 -3) 2) (eq (.sym f- base2 -2) 3)))
4028 (getter (get-memory-bit 32 (reg h-fb) (.sym BitBase32- offset -s19- group)))
4029 (setter (set-memory-bit 32 (reg h-fb) (.sym BitBase32- offset -s19- group) newval))
4030 )
4031 (define-derived-operand
4032 (name (.sym bit32- offset -11-An-relative- group))
4033 (comment "m32c bit,base:11[An] relative bit")
4034 (attrs (machine 32))
4035 (mode BI)
4036 (args ((.sym BitBase32- offset -u11- group) (.sym Bit32An group)))
4037 (syntax (.str "${BitBase32-" offset "-u11-" group "}[$Bit32An" group "]"))
4038 (base-ifield (.sym f- base1 -12))
4039 (encoding (+ ((.sym f- base1 -3) 1) ((.sym f- base2 -1) 0) (.sym BitBase32- offset -u11- group) (.sym Bit32An group)))
4040 (ifield-assertion (andif (eq (.sym f- base1 -3) 1) (eq (.sym f- base2 -1) 0)))
4041 (getter (get-memory-bit 32 (.sym Bit32An group) (.sym BitBase32- offset -u11- group)))
4042 (setter (set-memory-bit 32 (.sym Bit32An group) (.sym BitBase32- offset -u11- group) newval))
4043 )
4044 (define-derived-operand
4045 (name (.sym bit32- offset -19-An-relative- group))
4046 (comment "m32c bit,base:19[An] relative bit")
4047 (attrs (machine 32))
4048 (mode BI)
4049 (args ((.sym BitBase32- offset -u19- group) (.sym Bit32An group)))
4050 (syntax (.str "${BitBase32-" offset "-u19-" group "}[$Bit32An" group "]"))
4051 (base-ifield (.sym f- base1 -12))
4052 (encoding (+ ((.sym f- base1 -3) 2) ((.sym f- base2 -1) 0) (.sym BitBase32- offset -u19- group) (.sym Bit32An group)))
4053 (ifield-assertion (andif (eq (.sym f- base1 -3) 2) (eq (.sym f- base2 -1) 0)))
4054 (getter (get-memory-bit 32 (.sym Bit32An group) (.sym BitBase32- offset -u19- group)))
4055 (setter (set-memory-bit 32 (.sym Bit32An group) (.sym BitBase32- offset -u19- group) newval))
4056 )
4057 (define-derived-operand
4058 (name (.sym bit32- offset -27-An-relative- group))
4059 (comment "m32c bit,base:27[An] relative bit")
4060 (attrs (machine 32))
4061 (mode BI)
4062 (args ((.sym BitBase32- offset -u27- group) (.sym Bit32An group)))
4063 (syntax (.str "${BitBase32-" offset "-u27-" group "}[$Bit32An" group "]"))
4064 (base-ifield (.sym f- base1 -12))
4065 (encoding (+ ((.sym f- base1 -3) 3) ((.sym f- base2 -1) 0) (.sym BitBase32- offset -u27- group) (.sym Bit32An group)))
4066 (ifield-assertion (andif (eq (.sym f- base1 -3) 3) (eq (.sym f- base2 -1) 0)))
4067 (getter (get-memory-bit 32 (.sym Bit32An group) (.sym BitBase32- offset -u27- group)))
4068 (setter (set-memory-bit 32 (.sym Bit32An group) (.sym BitBase32- offset -u27- group) newval))
4069 )
4070 )
4071 )
4072
4073 (bit32-relative-operand 16 Unprefixed 4 8)
4074 (bit32-relative-operand 24 Prefixed 12 16)
4075
4076 (define-derived-operand
4077 (name bit16-11-SB-relative-S)
4078 (comment "m16c bit,base:11[sb] relative bit")
4079 (attrs (machine 16))
4080 (mode BI)
4081 (args (BitBase16-8-u11-S))
4082 (syntax "${BitBase16-8-u11-S}[sb]")
4083 (base-ifield (.sym f-5-3))
4084 (encoding (+ BitBase16-8-u11-S))
4085 ; (ifield-assertion (#t))
4086 (getter (get-memory-bit 16 (reg h-sb) BitBase16-8-u11-S))
4087 (setter (set-memory-bit 16 (reg h-sb) BitBase16-8-u11-S newval))
4088 )
4089
4090 (define-derived-operand
4091 (name Rn16-push-S-derived)
4092 (comment "m16c r0[lh] for push,pop short version")
4093 (attrs (machine 16))
4094 (mode QI)
4095 (args (Rn16-push-S))
4096 (syntax "${Rn16-push-S}")
4097 (base-ifield (.sym f-4-1))
4098 (encoding (+ Rn16-push-S))
4099 ; (ifield-assertion (#t))
4100 (getter (trunc QI Rn16-push-S))
4101 (setter (set Rn16-push-S newval))
4102 )
4103
4104 (define-derived-operand
4105 (name An16-push-S-derived)
4106 (comment "m16c r0[lh] for push,pop short version")
4107 (attrs (machine 16))
4108 (mode HI)
4109 (args (An16-push-S))
4110 (syntax "${An16-push-S}")
4111 (base-ifield (.sym f-4-1))
4112 (encoding (+ An16-push-S))
4113 ; (ifield-assertion (#t))
4114 (getter (trunc QI An16-push-S))
4115 (setter (set An16-push-S newval))
4116 )
4117
4118 ;-------------------------------------------------------------
4119 ; Absolute address
4120 ;-------------------------------------------------------------
4121
4122 (define-pmacro (bit16-absolute offset)
4123 (begin
4124 (define-derived-operand
4125 (name (.sym bit16- offset -16-absolute))
4126 (comment "m16c absolute address")
4127 (attrs (machine 16))
4128 (mode BI)
4129 (args ((.sym BitBase16- offset -u16)))
4130 (syntax (.str "${BitBase16-" offset "-u16}"))
4131 (base-ifield f-12-4)
4132 (encoding (+ (f-12-4 #xF) (.sym BitBase16- offset -u16)))
4133 (ifield-assertion (eq f-12-4 #xF))
4134 (getter (get-memory-bit 16 0 (.sym BitBase16- offset -u16)))
4135 (setter (set-memory-bit 16 0 (.sym BitBase16- offset -u16) newval))
4136 )
4137 )
4138 )
4139
4140 (bit16-absolute 16)
4141
4142 (define-pmacro (bit32-absolute offset group base1 base2)
4143 (begin
4144 (define-derived-operand
4145 (name (.sym bit32- offset -19-absolute- group))
4146 (comment "m32c absolute address bit")
4147 (attrs (machine 32))
4148 (mode BI)
4149 (args ((.sym BitBase32- offset -u19- group)))
4150 (syntax (.str "${BitBase32-" offset "-u19-" group "}"))
4151 (base-ifield (.sym f- base1 -12))
4152 (encoding (+ ((.sym f- base1 -3) 3) ((.sym f- base2 -2) 3) (.sym BitBase32- offset -u19- group)))
4153 (ifield-assertion (andif (eq (.sym f- base1 -3) 3) (eq (.sym f- base2 -2) 3)))
4154 (getter (get-memory-bit 32 0 (.sym BitBase32- offset -u19- group)))
4155 (setter (set-memory-bit 32 0 (.sym BitBase32- offset -u19- group) newval))
4156 )
4157 (define-derived-operand
4158 (name (.sym bit32- offset -27-absolute- group))
4159 (comment "m32c absolute address bit")
4160 (attrs (machine 32))
4161 (mode BI)
4162 (args ((.sym BitBase32- offset -u27- group)))
4163 (syntax (.str "${BitBase32-" offset "-u27-" group "}"))
4164 (base-ifield (.sym f- base1 -12))
4165 (encoding (+ ((.sym f- base1 -3) 3) ((.sym f- base2 -2) 2) (.sym BitBase32- offset -u27- group)))
4166 (ifield-assertion (andif (eq (.sym f- base1 -3) 3) (eq (.sym f- base2 -2) 2)))
4167 (getter (get-memory-bit 32 0 (.sym BitBase32- offset -u27- group)))
4168 (setter (set-memory-bit 32 0 (.sym BitBase32- offset -u27- group) newval))
4169 )
4170 )
4171 )
4172
4173 (bit32-absolute 16 Unprefixed 4 8)
4174 (bit32-absolute 24 Prefixed 12 16)
4175
4176 ;-------------------------------------------------------------
4177 ; Destination operands for short fomat insns
4178 ;-------------------------------------------------------------
4179
4180 (define-derived-operand
4181 (name dst16-3-S-R0l-direct-QI)
4182 (comment "m16c R0l direct QI")
4183 (attrs (machine 16))
4184 (mode QI)
4185 (args (R0l))
4186 (syntax "r0l")
4187 (base-ifield f-5-3)
4188 (encoding (+ (f-5-3 4)))
4189 (ifield-assertion (eq f-5-3 4))
4190 (getter (trunc QI R0l))
4191 (setter (set R0l newval))
4192 )
4193 (define-derived-operand
4194 (name dst16-3-S-R0h-direct-QI)
4195 (comment "m16c R0h direct QI")
4196 (attrs (machine 16))
4197 (mode QI)
4198 (args (R0h))
4199 (syntax "r0h")
4200 (base-ifield f-5-3)
4201 (encoding (+ (f-5-3 3)))
4202 (ifield-assertion (eq f-5-3 3))
4203 (getter (trunc QI R0h))
4204 (setter (set R0h newval))
4205 )
4206 (define-derived-operand
4207 (name dst16-3-S-8-8-SB-relative-QI)
4208 (comment "m16c SB relative QI")
4209 (attrs (machine 16))
4210 (mode QI)
4211 (args (Dsp-8-u8))
4212 (syntax "${Dsp-8-u8}[sb]")
4213 (base-ifield f-5-3)
4214 (encoding (+ (f-5-3 5) Dsp-8-u8))
4215 (ifield-assertion (eq f-5-3 5))
4216 (getter (mem16 QI (add Dsp-8-u8 (reg h-sb))))
4217 (setter (set (mem16 QI (add Dsp-8-u8 (reg h-sb))) newval))
4218 )
4219 (define-derived-operand
4220 (name dst16-3-S-8-8-FB-relative-QI)
4221 (comment "m16c FB relative QI")
4222 (attrs (machine 16))
4223 (mode QI)
4224 (args (Dsp-8-s8))
4225 (syntax "${Dsp-8-s8}[fb]")
4226 (base-ifield f-5-3)
4227 (encoding (+ (f-5-3 6) Dsp-8-s8))
4228 (ifield-assertion (eq f-5-3 6))
4229 (getter (mem16 QI (add Dsp-8-s8 (reg h-fb))))
4230 (setter (set (mem16 QI (add Dsp-8-s8 (reg h-fb))) newval))
4231 )
4232 (define-derived-operand
4233 (name dst16-3-S-8-16-absolute-QI)
4234 (comment "m16c absolute address QI")
4235 (attrs (machine 16))
4236 (mode QI)
4237 (args (Dsp-8-u16))
4238 (syntax "${Dsp-8-u16}")
4239 (base-ifield f-5-3)
4240 (encoding (+ (f-5-3 7) Dsp-8-u16))
4241 (ifield-assertion (eq f-5-3 7))
4242 (getter (mem16 QI Dsp-8-u16))
4243 (setter (set (mem16 QI Dsp-8-u16) newval))
4244 )
4245 (define-derived-operand
4246 (name dst16-3-S-16-8-SB-relative-QI)
4247 (comment "m16c SB relative QI")
4248 (attrs (machine 16))
4249 (mode QI)
4250 (args (Dsp-16-u8))
4251 (syntax "${Dsp-16-u8}[sb]")
4252 (base-ifield f-5-3)
4253 (encoding (+ (f-5-3 5) Dsp-16-u8))
4254 (ifield-assertion (eq f-5-3 5))
4255 (getter (mem16 QI (add Dsp-16-u8 (reg h-sb))))
4256 (setter (set (mem16 QI (add Dsp-16-u8 (reg h-sb))) newval))
4257 )
4258 (define-derived-operand
4259 (name dst16-3-S-16-8-FB-relative-QI)
4260 (comment "m16c FB relative QI")
4261 (attrs (machine 16))
4262 (mode QI)
4263 (args (Dsp-16-s8))
4264 (syntax "${Dsp-16-s8}[fb]")
4265 (base-ifield f-5-3)
4266 (encoding (+ (f-5-3 6) Dsp-16-s8))
4267 (ifield-assertion (eq f-5-3 6))
4268 (getter (mem16 QI (add Dsp-16-s8 (reg h-fb))))
4269 (setter (set (mem16 QI (add Dsp-16-s8 (reg h-fb))) newval))
4270 )
4271 (define-derived-operand
4272 (name dst16-3-S-16-16-absolute-QI)
4273 (comment "m16c absolute address QI")
4274 (attrs (machine 16))
4275 (mode QI)
4276 (args (Dsp-16-u16))
4277 (syntax "${Dsp-16-u16}")
4278 (base-ifield f-5-3)
4279 (encoding (+ (f-5-3 7) Dsp-16-u16))
4280 (ifield-assertion (eq f-5-3 7))
4281 (getter (mem16 QI Dsp-16-u16))
4282 (setter (set (mem16 QI Dsp-16-u16) newval))
4283 )
4284 (define-derived-operand
4285 (name srcdst16-r0l-r0h-S-derived)
4286 (comment "m16c r0l/r0h operand for short format insns")
4287 (attrs (machine 16))
4288 (mode SI)
4289 (args (SrcDst16-r0l-r0h-S-normal))
4290 (syntax "${SrcDst16-r0l-r0h-S-normal}")
4291 (base-ifield f-6-3)
4292 (encoding (+ (f-6-2 0) SrcDst16-r0l-r0h-S-normal))
4293 (ifield-assertion (eq f-6-2 0))
4294 (getter (trunc SI SrcDst16-r0l-r0h-S-normal))
4295 (setter ()) ; no setter
4296 )
4297 (define-derived-operand
4298 (name dst32-2-S-R0l-direct-QI)
4299 (comment "m32c R0l direct QI")
4300 (attrs (machine 32))
4301 (mode QI)
4302 (args (R0l))
4303 (syntax "r0l")
4304 (base-ifield f-2-2)
4305 (encoding (+ (f-2-2 0)))
4306 (ifield-assertion (eq f-2-2 0))
4307 (getter (trunc QI R0l))
4308 (setter (set R0l newval))
4309 )
4310 (define-derived-operand
4311 (name dst32-2-S-R0-direct-HI)
4312 (comment "m32c R0 direct HI")
4313 (attrs (machine 32))
4314 (mode HI)
4315 (args (R0))
4316 (syntax "r0")
4317 (base-ifield f-2-2)
4318 (encoding (+ (f-2-2 0)))
4319 (ifield-assertion (eq f-2-2 0))
4320 (getter (trunc HI R0))
4321 (setter (set R0 newval))
4322 )
4323 (define-derived-operand
4324 (name dst32-1-S-A0-direct-HI)
4325 (comment "m32c A0 direct HI")
4326 (attrs (machine 32))
4327 (mode HI)
4328 (args (A0))
4329 (syntax "a0")
4330 (base-ifield f-7-1)
4331 (encoding (+ (f-7-1 0)))
4332 (ifield-assertion (eq f-7-1 0))
4333 (getter (trunc HI A0))
4334 (setter (set A0 newval))
4335 )
4336 (define-derived-operand
4337 (name dst32-1-S-A1-direct-HI)
4338 (comment "m32c A1 direct HI")
4339 (attrs (machine 32))
4340 (mode HI)
4341 (args (A1))
4342 (syntax "a1")
4343 (base-ifield f-7-1)
4344 (encoding (+ (f-7-1 1)))
4345 (ifield-assertion (eq f-7-1 1))
4346 (getter (trunc HI A1))
4347 (setter (set A1 newval))
4348 )
4349 (define-pmacro (dst32-2-S-operands xmode)
4350 (begin
4351 (define-derived-operand
4352 (name (.sym dst32-2-S-8-SB-relative- xmode))
4353 (comment "m32c SB relative for short binary insns")
4354 (attrs (machine 32))
4355 (mode xmode)
4356 (args (Dsp-8-u8))
4357 (syntax "${Dsp-8-u8}[sb]")
4358 (base-ifield f-2-2)
4359 (encoding (+ (f-2-2 2) Dsp-8-u8))
4360 (ifield-assertion (eq f-2-2 2))
4361 (getter (c-call xmode (.str "operand_getter_" xmode) sb Dsp-8-u8))
4362 (setter (c-call DFLT (.str "operand_setter_" xmode) newval sb Dsp-8-u8))
4363 ; (getter (mem32 xmode (add Dsp-8-u8 (reg h-sb))))
4364 ; (setter (set (mem32 xmode (add Dsp-8-u8 (reg h-sb))) newval))
4365 )
4366 (define-derived-operand
4367 (name (.sym dst32-2-S-8-FB-relative- xmode))
4368 (comment "m32c FB relative for short binary insns")
4369 (attrs (machine 32))
4370 (mode xmode)
4371 (args (Dsp-8-s8))
4372 (syntax "${Dsp-8-s8}[fb]")
4373 (base-ifield f-2-2)
4374 (encoding (+ (f-2-2 3) Dsp-8-s8))
4375 (ifield-assertion (eq f-2-2 3))
4376 (getter (c-call xmode (.str "operand_getter_" xmode) fb Dsp-8-s8))
4377 (setter (c-call DFLT (.str "operand_setter_" xmode) newval fb Dsp-8-s8))
4378 ; (getter (mem32 xmode (add Dsp-8-s8 (reg h-fb))))
4379 ; (setter (set (mem32 xmode (add Dsp-8-s8 (reg h-fb))) newval))
4380 )
4381 (define-derived-operand
4382 (name (.sym dst32-2-S-16-absolute- xmode))
4383 (comment "m32c absolute address for short binary insns")
4384 (attrs (machine 32))
4385 (mode xmode)
4386 (args (Dsp-8-u16))
4387 (syntax "${Dsp-8-u16}")
4388 (base-ifield f-2-2)
4389 (encoding (+ (f-2-2 1) Dsp-8-u16))
4390 (ifield-assertion (eq f-2-2 1))
4391 (getter (c-call xmode (.str "operand_getter_" xmode) (const 0) Dsp-8-u16))
4392 (setter (c-call DFLT (.str "operand_setter_" xmode) newval (const 0) Dsp-8-u16))
4393 ; (getter (mem32 xmode Dsp-8-u16))
4394 ; (setter (set (mem32 xmode Dsp-8-u16) newval))
4395 )
4396 ; (define-derived-operand
4397 ; (name (.sym dst32-2-S-8-SB-relative-indirect- xmode))
4398 ; (comment "m32c SB relative for short binary insns")
4399 ; (attrs (machine 32))
4400 ; (mode xmode)
4401 ; (args (Dsp-16-u8))
4402 ; (syntax "[${Dsp-16-u8}[sb]]")
4403 ; (base-ifield f-10-2)
4404 ; (encoding (+ (f-10-2 2) Dsp-16-u8))
4405 ; (ifield-assertion (eq f-10-2 2))
4406 ; (getter (mem32 xmode (indirect-addr (add Dsp-16-u8 (reg h-sb)))))
4407 ; (setter (set (mem32 xmode (indirect-addr (add Dsp-16-u8 (reg h-sb)))) newval))
4408 ; )
4409 ; (define-derived-operand
4410 ; (name (.sym dst32-2-S-8-FB-relative-indirect- xmode))
4411 ; (comment "m32c FB relative for short binary insns")
4412 ; (attrs (machine 32))
4413 ; (mode xmode)
4414 ; (args (Dsp-16-s8))
4415 ; (syntax "[${Dsp-16-s8}[fb]]")
4416 ; (base-ifield f-10-2)
4417 ; (encoding (+ (f-10-2 3) Dsp-16-s8))
4418 ; (ifield-assertion (eq f-10-2 3))
4419 ; (getter (mem32 xmode (indirect-addr (add Dsp-16-s8 (reg h-fb)))))
4420 ; (setter (set (mem32 xmode (indirect-addr (add Dsp-16-s8 (reg h-fb)))) newval))
4421 ; )
4422 ; (define-derived-operand
4423 ; (name (.sym dst32-2-S-16-absolute-indirect- xmode))
4424 ; (comment "m32c absolute address for short binary insns")
4425 ; (attrs (machine 32))
4426 ; (mode xmode)
4427 ; (args (Dsp-16-u16))
4428 ; (syntax "[${Dsp-16-u16}]")
4429 ; (base-ifield f-10-2)
4430 ; (encoding (+ (f-10-2 1) Dsp-16-u16))
4431 ; (ifield-assertion (eq f-10-2 1))
4432 ; (getter (mem32 xmode (indirect-addr Dsp-16-u16)))
4433 ; (setter (set (mem32 xmode (indirect-addr Dsp-16-u16)) newval))
4434 ; )
4435 )
4436 )
4437
4438 (dst32-2-S-operands QI)
4439 (dst32-2-S-operands HI)
4440 (dst32-2-S-operands SI)
4441
4442 ;=============================================================
4443 ; Anyof operands
4444 ;-------------------------------------------------------------
4445 ; Source operands with no additional fields
4446 ;-------------------------------------------------------------
4447
4448 (define-pmacro (src16-basic-operand xmode)
4449 (begin
4450 (define-anyof-operand
4451 (name (.sym src16-basic- xmode))
4452 (comment (.str "m16c source operand of size " xmode " with no additional fields"))
4453 (attrs (machine 16))
4454 (mode xmode)
4455 (choices
4456 (.sym src16-Rn-direct- xmode)
4457 (.sym src16-An-direct- xmode)
4458 (.sym src16-An-indirect- xmode)
4459 )
4460 )
4461 )
4462 )
4463 (src16-basic-operand QI)
4464 (src16-basic-operand HI)
4465
4466 (define-pmacro (src32-basic-operand xmode)
4467 (begin
4468 (define-anyof-operand
4469 (name (.sym src32-basic-Unprefixed- xmode))
4470 (comment (.str "m32c destination operand of size " xmode " with no additional fields"))
4471 (attrs (machine 32))
4472 (mode xmode)
4473 (choices
4474 (.sym src32-Rn-direct-Unprefixed- xmode)
4475 (.sym src32-An-direct-Unprefixed- xmode)
4476 (.sym src32-An-indirect-Unprefixed- xmode)
4477 )
4478 )
4479 (define-anyof-operand
4480 (name (.sym src32-basic-Prefixed- xmode))
4481 (comment (.str "m32c destination operand of size " xmode " with no additional fields"))
4482 (attrs (machine 32))
4483 (mode xmode)
4484 (choices
4485 (.sym src32-Rn-direct-Prefixed- xmode)
4486 (.sym src32-An-direct-Prefixed- xmode)
4487 (.sym src32-An-indirect-Prefixed- xmode)
4488 )
4489 )
4490 ; (define-anyof-operand
4491 ; (name (.sym src32-basic-indirect- xmode))
4492 ; (comment (.str "m32c destination operand of size " xmode " indirect with no additional fields"))
4493 ; (attrs (machine 32))
4494 ; (mode xmode)
4495 ; (choices
4496 ; (.sym src32-An-indirect-indirect- xmode)
4497 ; )
4498 ; )
4499 )
4500 )
4501
4502 (src32-basic-operand QI)
4503 (src32-basic-operand HI)
4504 (src32-basic-operand SI)
4505
4506 (define-anyof-operand
4507 (name src32-basic-ExtPrefixed-QI)
4508 (comment "m32c source operand of size QI with no additional fields")
4509 (attrs (machine 32))
4510 (mode QI)
4511 (choices
4512 src32-Rn-direct-Prefixed-QI
4513 src32-An-indirect-Prefixed-QI
4514 )
4515 )
4516
4517 ;-------------------------------------------------------------
4518 ; Source operands with additional fields at offset 16 bits
4519 ;-------------------------------------------------------------
4520
4521 (define-pmacro (src16-16-operand xmode)
4522 (begin
4523 (define-anyof-operand
4524 (name (.sym src16-16-8- xmode))
4525 (comment (.str "m16c source operand of size " xmode " with additional 8 bit fields at offset 16"))
4526 (attrs (machine 16))
4527 (mode xmode)
4528 (choices
4529 (.sym src16-16-8-An-relative- xmode)
4530 (.sym src16-16-8-SB-relative- xmode)
4531 (.sym src16-16-8-FB-relative- xmode)
4532 )
4533 )
4534 (define-anyof-operand
4535 (name (.sym src16-16-16- xmode))
4536 (comment (.str "m16c source operand of size " xmode " with additional 16 bit fields at offset 16"))
4537 (attrs (machine 16))
4538 (mode xmode)
4539 (choices
4540 (.sym src16-16-16-An-relative- xmode)
4541 (.sym src16-16-16-SB-relative- xmode)
4542 (.sym src16-16-16-absolute- xmode)
4543 )
4544 )
4545 )
4546 )
4547 (src16-16-operand QI)
4548 (src16-16-operand HI)
4549
4550 (define-pmacro (src32-16-operand xmode)
4551 (begin
4552 (define-anyof-operand
4553 (name (.sym src32-16-8-Unprefixed- xmode))
4554 (comment (.str "m32c source operand of size " xmode " with additional 8 bit fields at offset 16"))
4555 (attrs (machine 32))
4556 (mode xmode)
4557 (choices
4558 (.sym src32-16-8-An-relative-Unprefixed- xmode)
4559 (.sym src32-16-8-SB-relative-Unprefixed- xmode)
4560 (.sym src32-16-8-FB-relative-Unprefixed- xmode)
4561 )
4562 )
4563 (define-anyof-operand
4564 (name (.sym src32-16-16-Unprefixed- xmode))
4565 (comment (.str "m32c source operand of size " xmode " with additional 16 bit fields at offset 16"))
4566 (attrs (machine 32))
4567 (mode xmode)
4568 (choices
4569 (.sym src32-16-16-An-relative-Unprefixed- xmode)
4570 (.sym src32-16-16-SB-relative-Unprefixed- xmode)
4571 (.sym src32-16-16-FB-relative-Unprefixed- xmode)
4572 (.sym src32-16-16-absolute-Unprefixed- xmode)
4573 )
4574 )
4575 (define-anyof-operand
4576 (name (.sym src32-16-24-Unprefixed- xmode))
4577 (comment (.str "m32c source operand of size " xmode " with additional 24 bit fields at offset 16"))
4578 (attrs (machine 32))
4579 (mode xmode)
4580 (choices
4581 (.sym src32-16-24-An-relative-Unprefixed- xmode)
4582 (.sym src32-16-24-absolute-Unprefixed- xmode)
4583 )
4584 )
4585 )
4586 )
4587
4588 (src32-16-operand QI)
4589 (src32-16-operand HI)
4590 (src32-16-operand SI)
4591
4592 ;-------------------------------------------------------------
4593 ; Source operands with additional fields at offset 24 bits
4594 ;-------------------------------------------------------------
4595
4596 (define-pmacro (src-24-operand group xmode)
4597 (begin
4598 (define-anyof-operand
4599 (name (.sym src32-24-8- group - xmode))
4600 (comment (.str "m32c source operand of size " xmode " with additional 8 bit fields at offset 24"))
4601 (attrs (machine 32))
4602 (mode xmode)
4603 (choices
4604 (.sym src32-24-8-An-relative- group - xmode)
4605 (.sym src32-24-8-SB-relative- group - xmode)
4606 (.sym src32-24-8-FB-relative- group - xmode)
4607 )
4608 )
4609 (define-anyof-operand
4610 (name (.sym src32-24-16- group - xmode))
4611 (comment (.str "m32c source operand of size " xmode " with additional 16 bit fields at offset 16"))
4612 (attrs (machine 32))
4613 (mode xmode)
4614 (choices
4615 (.sym src32-24-16-An-relative- group - xmode)
4616 (.sym src32-24-16-SB-relative- group - xmode)
4617 (.sym src32-24-16-FB-relative- group - xmode)
4618 (.sym src32-24-16-absolute- group - xmode)
4619 )
4620 )
4621 (define-anyof-operand
4622 (name (.sym src32-24-24- group - xmode))
4623 (comment (.str "m32c source operand of size " xmode " with additional 24 bit fields at offset 16"))
4624 (attrs (machine 32))
4625 (mode xmode)
4626 (choices
4627 (.sym src32-24-24-An-relative- group - xmode)
4628 (.sym src32-24-24-absolute- group - xmode)
4629 )
4630 )
4631 )
4632 )
4633
4634 (src-24-operand Prefixed QI)
4635 (src-24-operand Prefixed HI)
4636 (src-24-operand Prefixed SI)
4637
4638 (define-pmacro (src-24-indirect-operand xmode)
4639 (begin
4640 ; (define-anyof-operand
4641 ; (name (.sym src32-24-8-indirect- xmode))
4642 ; (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 24"))
4643 ; (attrs (machine 32))
4644 ; (mode xmode)
4645 ; (choices
4646 ; (.sym src32-24-8-An-relative-indirect- xmode)
4647 ; (.sym src32-24-8-SB-relative-indirect- xmode)
4648 ; (.sym src32-24-8-FB-relative-indirect- xmode)
4649 ; )
4650 ; )
4651 ; (define-anyof-operand
4652 ; (name (.sym src32-24-16-indirect- xmode))
4653 ; (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 24"))
4654 ; (attrs (machine 32))
4655 ; (mode xmode)
4656 ; (choices
4657 ; (.sym src32-24-16-An-relative-indirect- xmode)
4658 ; (.sym src32-24-16-SB-relative-indirect- xmode)
4659 ; (.sym src32-24-16-FB-relative-indirect- xmode)
4660 ; )
4661 ; )
4662 ; (define-anyof-operand
4663 ; (name (.sym src32-24-24-indirect- xmode))
4664 ; (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 24"))
4665 ; (attrs (machine 32))
4666 ; (mode xmode)
4667 ; (choices
4668 ; (.sym src32-24-24-An-relative-indirect- xmode)
4669 ; )
4670 ; )
4671 ; (define-anyof-operand
4672 ; (name (.sym src32-24-16-absolute-indirect- xmode))
4673 ; (comment (.str "m32c source operand of size " xmode " 16 bit absolute indirect"))
4674 ; (attrs (machine 32))
4675 ; (mode xmode)
4676 ; (choices
4677 ; (.sym src32-24-16-absolute-indirect-derived- xmode)
4678 ; )
4679 ; )
4680 ; (define-anyof-operand
4681 ; (name (.sym src32-24-24-absolute-indirect- xmode))
4682 ; (comment (.str "m32c source operand of size " xmode " 24 bit absolute indirect"))
4683 ; (attrs (machine 32))
4684 ; (mode xmode)
4685 ; (choices
4686 ; (.sym src32-24-24-absolute-indirect-derived- xmode)
4687 ; )
4688 ; )
4689 )
4690 )
4691
4692 ; (src-24-indirect-operand QI)
4693 ; (src-24-indirect-operand HI)
4694 ; (src-24-indirect-operand SI)
4695
4696 ;-------------------------------------------------------------
4697 ; Destination operands with no additional fields
4698 ;-------------------------------------------------------------
4699
4700 (define-pmacro (dst16-basic-operand xmode)
4701 (begin
4702 (define-anyof-operand
4703 (name (.sym dst16-basic- xmode))
4704 (comment (.str "m16c destination operand of size " xmode " with no additional fields"))
4705 (attrs (machine 16))
4706 (mode xmode)
4707 (choices
4708 (.sym dst16-Rn-direct- xmode)
4709 (.sym dst16-An-direct- xmode)
4710 (.sym dst16-An-indirect- xmode)
4711 )
4712 )
4713 )
4714 )
4715
4716 (dst16-basic-operand QI)
4717 (dst16-basic-operand HI)
4718 (dst16-basic-operand SI)
4719
4720 (define-pmacro (dst32-basic-operand xmode)
4721 (begin
4722 (define-anyof-operand
4723 (name (.sym dst32-basic-Unprefixed- xmode))
4724 (comment (.str "m32c destination operand of size " xmode " with no additional fields"))
4725 (attrs (machine 32))
4726 (mode xmode)
4727 (choices
4728 (.sym dst32-Rn-direct-Unprefixed- xmode)
4729 (.sym dst32-An-direct-Unprefixed- xmode)
4730 (.sym dst32-An-indirect-Unprefixed- xmode)
4731 )
4732 )
4733 (define-anyof-operand
4734 (name (.sym dst32-basic-Prefixed- xmode))
4735 (comment (.str "m32c destination operand of size " xmode " with no additional fields"))
4736 (attrs (machine 32))
4737 (mode xmode)
4738 (choices
4739 (.sym dst32-Rn-direct-Prefixed- xmode)
4740 (.sym dst32-An-direct-Prefixed- xmode)
4741 (.sym dst32-An-indirect-Prefixed- xmode)
4742 )
4743 )
4744 )
4745 )
4746
4747 (dst32-basic-operand QI)
4748 (dst32-basic-operand HI)
4749 (dst32-basic-operand SI)
4750
4751 ;-------------------------------------------------------------
4752 ; Destination operands with possible additional fields at offset 16 bits
4753 ;-------------------------------------------------------------
4754
4755 (define-pmacro (dst16-16-operand xmode)
4756 (begin
4757 (define-anyof-operand
4758 (name (.sym dst16-16- xmode))
4759 (comment (.str "m16c destination operand of size " xmode " with additional fields at offset 16"))
4760 (attrs (machine 16))
4761 (mode xmode)
4762 (choices
4763 (.sym dst16-Rn-direct- xmode)
4764 (.sym dst16-An-direct- xmode)
4765 (.sym dst16-An-indirect- xmode)
4766 (.sym dst16-16-8-An-relative- xmode)
4767 (.sym dst16-16-16-An-relative- xmode)
4768 (.sym dst16-16-8-SB-relative- xmode)
4769 (.sym dst16-16-16-SB-relative- xmode)
4770 (.sym dst16-16-8-FB-relative- xmode)
4771 (.sym dst16-16-16-absolute- xmode)
4772 )
4773 )
4774 (define-anyof-operand
4775 (name (.sym dst16-16-8- xmode))
4776 (comment (.str "m16c destination operand of size " xmode " with additional fields at offset 16"))
4777 (attrs (machine 16))
4778 (mode xmode)
4779 (choices
4780 (.sym dst16-16-8-An-relative- xmode)
4781 (.sym dst16-16-8-SB-relative- xmode)
4782 (.sym dst16-16-8-FB-relative- xmode)
4783 )
4784 )
4785 (define-anyof-operand
4786 (name (.sym dst16-16-16- xmode))
4787 (comment (.str "m16c destination operand of size " xmode " with additional fields at offset 16"))
4788 (attrs (machine 16))
4789 (mode xmode)
4790 (choices
4791 (.sym dst16-16-16-An-relative- xmode)
4792 (.sym dst16-16-16-SB-relative- xmode)
4793 (.sym dst16-16-16-absolute- xmode)
4794 )
4795 )
4796 (define-anyof-operand
4797 (name (.sym dst16-16-16sa- xmode))
4798 (comment (.str "m16c destination operand of size " xmode " with additional fields at offset 16"))
4799 (attrs (machine 16))
4800 (mode xmode)
4801 (choices
4802 (.sym dst16-16-16-SB-relative- xmode)
4803 (.sym dst16-16-16-absolute- xmode)
4804 )
4805 )
4806 (define-anyof-operand
4807 (name (.sym dst16-16-20ar- xmode))
4808 (comment (.str "m16c destination operand of size " xmode " with additional fields at offset 16"))
4809 (attrs (machine 16))
4810 (mode xmode)
4811 (choices
4812 (.sym dst16-16-20-An-relative- xmode)
4813 )
4814 )
4815 )
4816 )
4817
4818 (dst16-16-operand QI)
4819 (dst16-16-operand HI)
4820 (dst16-16-operand SI)
4821
4822 (define-anyof-operand
4823 (name dst16-16-Ext-QI)
4824 (comment "m16c destination operand of size QI for 'ext' insns with additional fields at offset 16")
4825 (attrs (machine 16))
4826 (mode QI)
4827 (choices
4828 dst16-Rn-direct-Ext-QI
4829 dst16-An-indirect-Ext-QI
4830 dst16-16-8-An-relative-Ext-QI
4831 dst16-16-16-An-relative-Ext-QI
4832 dst16-16-8-SB-relative-Ext-QI
4833 dst16-16-16-SB-relative-Ext-QI
4834 dst16-16-8-FB-relative-Ext-QI
4835 dst16-16-16-absolute-Ext-QI
4836 )
4837 )
4838
4839 (define-derived-operand
4840 (name dst16-An-indirect-Mova-HI)
4841 (comment "m16c addressof An indirect destination HI")
4842 (attrs (ISA m16c))
4843 (mode HI)
4844 (args (Dst16An))
4845 (syntax "[$Dst16An]")
4846 (base-ifield f-12-4)
4847 (encoding (+ (f-12-2 1) (f-14-1 1) Dst16An))
4848 (ifield-assertion
4849 (andif (eq f-12-2 1) (eq f-14-1 1)))
4850 (getter Dst16An)
4851 (setter (nop))
4852 )
4853
4854 (define-derived-operand
4855 (name dst16-16-8-An-relative-Mova-HI)
4856 (comment
4857 "m16c addressof dsp:8[An] relative destination HI")
4858 (attrs (ISA m16c))
4859 (mode HI)
4860 (args (Dst16An Dsp-16-u8))
4861 (syntax "${Dsp-16-u8}[$Dst16An]")
4862 (base-ifield f-12-4)
4863 (encoding
4864 (+ (f-12-2 2) (f-14-1 0) Dsp-16-u8 Dst16An))
4865 (ifield-assertion
4866 (andif (eq f-12-2 2) (eq f-14-1 0)))
4867 (getter (add Dsp-16-u8 Dst16An))
4868 (setter (nop))
4869 )
4870 (define-derived-operand
4871 (name dst16-16-16-An-relative-Mova-HI)
4872 (comment
4873 "m16c addressof dsp:16[An] relative destination HI")
4874 (attrs (ISA m16c))
4875 (mode HI)
4876 (args (Dst16An Dsp-16-u16))
4877 (syntax "${Dsp-16-u16}[$Dst16An]")
4878 (base-ifield f-12-4)
4879 (encoding
4880 (+ (f-12-2 3) (f-14-1 0) Dsp-16-u16 Dst16An))
4881 (ifield-assertion
4882 (andif (eq f-12-2 3) (eq f-14-1 0)))
4883 (getter (add Dsp-16-u16 Dst16An))
4884 (setter (nop))
4885 )
4886 (define-derived-operand
4887 (name dst16-16-8-SB-relative-Mova-HI)
4888 (comment
4889 "m16c addressof dsp:8[sb] relative destination HI")
4890 (attrs (ISA m16c))
4891 (mode HI)
4892 (args (Dsp-16-u8))
4893 (syntax "${Dsp-16-u8}[sb]")
4894 (base-ifield f-12-4)
4895 (encoding (+ (f-12-4 10) Dsp-16-u8))
4896 (ifield-assertion (eq f-12-4 10))
4897 (getter (add Dsp-16-u8 (reg h-sb)))
4898 (setter (nop))
4899 )
4900 (define-derived-operand
4901 (name dst16-16-16-SB-relative-Mova-HI)
4902 (comment
4903 "m16c addressof dsp:16[sb] relative destination HI")
4904 (attrs (ISA m16c))
4905 (mode HI)
4906 (args (Dsp-16-u16))
4907 (syntax "${Dsp-16-u16}[sb]")
4908 (base-ifield f-12-4)
4909 (encoding (+ (f-12-4 14) Dsp-16-u16))
4910 (ifield-assertion (eq f-12-4 14))
4911 (getter (add Dsp-16-u16 (reg h-sb)))
4912 (setter (nop))
4913 )
4914 (define-derived-operand
4915 (name dst16-16-8-FB-relative-Mova-HI)
4916 (comment
4917 "m16c addressof dsp:8[fb] relative destination HI")
4918 (attrs (ISA m16c))
4919 (mode HI)
4920 (args (Dsp-16-s8))
4921 (syntax "${Dsp-16-s8}[fb]")
4922 (base-ifield f-12-4)
4923 (encoding (+ (f-12-4 11) Dsp-16-s8))
4924 (ifield-assertion (eq f-12-4 11))
4925 (getter (add Dsp-16-s8 (reg h-fb)))
4926 (setter (nop))
4927 )
4928 (define-derived-operand
4929 (name dst16-16-16-absolute-Mova-HI)
4930 (comment "m16c addressof absolute address HI")
4931 (attrs (ISA m16c))
4932 (mode HI)
4933 (args (Dsp-16-u16))
4934 (syntax "${Dsp-16-u16}")
4935 (base-ifield f-12-4)
4936 (encoding (+ (f-12-4 15) Dsp-16-u16))
4937 (ifield-assertion (eq f-12-4 15))
4938 (getter Dsp-16-u16)
4939 (setter (nop))
4940 )
4941
4942 (define-anyof-operand
4943 (name dst16-16-Mova-HI)
4944 (comment "m16c addressof destination operand of size HI with additional fields at offset 16")
4945 (attrs (machine 16))
4946 (mode HI)
4947 (choices
4948 dst16-An-indirect-Mova-HI
4949 dst16-16-8-An-relative-Mova-HI
4950 dst16-16-16-An-relative-Mova-HI
4951 dst16-16-8-SB-relative-Mova-HI
4952 dst16-16-16-SB-relative-Mova-HI
4953 dst16-16-8-FB-relative-Mova-HI
4954 dst16-16-16-absolute-Mova-HI
4955 )
4956 )
4957
4958 (define-derived-operand
4959 (name dst32-An-indirect-Unprefixed-Mova-SI)
4960 (comment "m32c addressof An indirect destination SI")
4961 (attrs (ISA m32c))
4962 (mode SI)
4963 (args (Dst32AnUnprefixed))
4964 (syntax "[$Dst32AnUnprefixed]")
4965 (base-ifield f-4-6)
4966 (encoding
4967 (+ (f-4-3 0) (f-8-1 0) Dst32AnUnprefixed))
4968 (ifield-assertion
4969 (andif (eq f-4-3 0) (eq f-8-1 0)))
4970 (getter Dst32AnUnprefixed)
4971 (setter (nop))
4972 )
4973
4974 (define-derived-operand
4975 (name dst32-16-8-An-relative-Unprefixed-Mova-SI)
4976 (comment "m32c addressof dsp:8[An] relative destination SI")
4977 (attrs (ISA m32c))
4978 (mode SI)
4979 (args (Dst32AnUnprefixed Dsp-16-u8))
4980 (syntax "${Dsp-16-u8}[$Dst32AnUnprefixed]")
4981 (base-ifield f-4-6)
4982 (encoding
4983 (+ (f-4-3 1)
4984 (f-8-1 0)
4985 Dsp-16-u8
4986 Dst32AnUnprefixed))
4987 (ifield-assertion
4988 (andif (eq f-4-3 1) (eq f-8-1 0)))
4989 (getter (add Dsp-16-u8 Dst32AnUnprefixed))
4990 (setter (nop))
4991 )
4992
4993 (define-derived-operand
4994 (name dst32-16-16-An-relative-Unprefixed-Mova-SI)
4995 (comment
4996 "m32c addressof dsp:16[An] relative destination SI")
4997 (attrs (ISA m32c))
4998 (mode SI)
4999 (args (Dst32AnUnprefixed Dsp-16-u16))
5000 (syntax "${Dsp-16-u16}[$Dst32AnUnprefixed]")
5001 (base-ifield f-4-6)
5002 (encoding
5003 (+ (f-4-3 2)
5004 (f-8-1 0)
5005 Dsp-16-u16
5006 Dst32AnUnprefixed))
5007 (ifield-assertion
5008 (andif (eq f-4-3 2) (eq f-8-1 0)))
5009 (getter (add Dsp-16-u16 Dst32AnUnprefixed))
5010 (setter (nop))
5011 )
5012
5013 (define-derived-operand
5014 (name dst32-16-24-An-relative-Unprefixed-Mova-SI)
5015 (comment "addressof m32c dsp:16[An] relative destination SI")
5016 (attrs (ISA m32c))
5017 (mode SI)
5018 (args (Dst32AnUnprefixed Dsp-16-u24))
5019 (syntax "${Dsp-16-u24}[$Dst32AnUnprefixed]")
5020 (base-ifield f-4-6)
5021 (encoding
5022 (+ (f-4-3 3)
5023 (f-8-1 0)
5024 Dsp-16-u24
5025 Dst32AnUnprefixed))
5026 (ifield-assertion
5027 (andif (eq f-4-3 3) (eq f-8-1 0)))
5028 (getter (add Dsp-16-u24 Dst32AnUnprefixed))
5029 (setter (nop))
5030 )
5031
5032 (define-derived-operand
5033 (name dst32-16-8-SB-relative-Unprefixed-Mova-SI)
5034 (comment "m32c addressof dsp:8[sb] relative destination SI")
5035 (attrs (ISA m32c))
5036 (mode SI)
5037 (args (Dsp-16-u8))
5038 (syntax "${Dsp-16-u8}[sb]")
5039 (base-ifield f-4-6)
5040 (encoding (+ (f-4-3 1) (f-8-2 2) Dsp-16-u8))
5041 (ifield-assertion
5042 (andif (eq f-4-3 1) (eq f-8-2 2)))
5043 (getter (add Dsp-16-u8 (reg h-sb)))
5044 (setter (nop))
5045 )
5046
5047 (define-derived-operand
5048 (name dst32-16-16-SB-relative-Unprefixed-Mova-SI)
5049 (comment "m32c addressof dsp:16[sb] relative destination SI")
5050 (attrs (ISA m32c))
5051 (mode SI)
5052 (args (Dsp-16-u16))
5053 (syntax "${Dsp-16-u16}[sb]")
5054 (base-ifield f-4-6)
5055 (encoding (+ (f-4-3 2) (f-8-2 2) Dsp-16-u16))
5056 (ifield-assertion
5057 (andif (eq f-4-3 2) (eq f-8-2 2)))
5058 (getter (add Dsp-16-u16 (reg h-sb)))
5059 (setter (nop))
5060 )
5061
5062 (define-derived-operand
5063 (name dst32-16-8-FB-relative-Unprefixed-Mova-SI)
5064 (comment "m32c addressof dsp:8[fb] relative destination SI")
5065 (attrs (ISA m32c))
5066 (mode SI)
5067 (args (Dsp-16-s8))
5068 (syntax "${Dsp-16-s8}[fb]")
5069 (base-ifield f-4-6)
5070 (encoding (+ (f-4-3 1) (f-8-2 3) Dsp-16-s8))
5071 (ifield-assertion
5072 (andif (eq f-4-3 1) (eq f-8-2 3)))
5073 (getter (add Dsp-16-s8 (reg h-fb)))
5074 (setter (nop))
5075 )
5076
5077 (define-derived-operand
5078 (name dst32-16-16-FB-relative-Unprefixed-Mova-SI)
5079 (comment "m32c addressof dsp:16[fb] relative destination SI")
5080 (attrs (ISA m32c))
5081 (mode SI)
5082 (args (Dsp-16-s16))
5083 (syntax "${Dsp-16-s16}[fb]")
5084 (base-ifield f-4-6)
5085 (encoding (+ (f-4-3 2) (f-8-2 3) Dsp-16-s16))
5086 (ifield-assertion
5087 (andif (eq f-4-3 2) (eq f-8-2 3)))
5088 (getter (add Dsp-16-s16 (reg h-fb)))
5089 (setter (nop))
5090 )
5091
5092 (define-derived-operand
5093 (name dst32-16-16-absolute-Unprefixed-Mova-SI)
5094 (comment "m32c addressof absolute address SI") (attrs (ISA m32c))
5095 (mode SI)
5096 (args (Dsp-16-u16))
5097 (syntax "${Dsp-16-u16}")
5098 (base-ifield f-4-6)
5099 (encoding (+ (f-4-3 3) (f-8-2 3) Dsp-16-u16))
5100 (ifield-assertion
5101 (andif (eq f-4-3 3) (eq f-8-2 3)))
5102 (getter Dsp-16-u16)
5103 (setter (nop))
5104 )
5105
5106 (define-derived-operand
5107 (name dst32-16-24-absolute-Unprefixed-Mova-SI)
5108 (comment "m32c addressof absolute address SI") (attrs (ISA m32c))
5109 (mode SI)
5110 (args (Dsp-16-u24))
5111 (syntax "${Dsp-16-u24}")
5112 (base-ifield f-4-6)
5113 (encoding (+ (f-4-3 3) (f-8-2 2) Dsp-16-u24))
5114 (ifield-assertion
5115 (andif (eq f-4-3 3) (eq f-8-2 2)))
5116 (getter Dsp-16-u24)
5117 (setter (nop))
5118 )
5119
5120 (define-anyof-operand
5121 (name dst32-16-Unprefixed-Mova-SI)
5122 (comment
5123 "m32c addressof destination operand of size SI with additional fields at offset 16")
5124 (attrs (ISA m32c))
5125 (mode SI)
5126 (choices
5127 dst32-An-indirect-Unprefixed-Mova-SI
5128 dst32-16-8-An-relative-Unprefixed-Mova-SI
5129 dst32-16-16-An-relative-Unprefixed-Mova-SI
5130 dst32-16-24-An-relative-Unprefixed-Mova-SI
5131 dst32-16-8-SB-relative-Unprefixed-Mova-SI
5132 dst32-16-16-SB-relative-Unprefixed-Mova-SI
5133 dst32-16-8-FB-relative-Unprefixed-Mova-SI
5134 dst32-16-16-FB-relative-Unprefixed-Mova-SI
5135 dst32-16-16-absolute-Unprefixed-Mova-SI
5136 dst32-16-24-absolute-Unprefixed-Mova-SI))
5137
5138 (define-pmacro (dst32-16-operand xmode)
5139 (begin
5140 (define-anyof-operand
5141 (name (.sym dst32-16-Unprefixed- xmode))
5142 (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 16"))
5143 (attrs (machine 32))
5144 (mode xmode)
5145 (choices
5146 (.sym dst32-Rn-direct-Unprefixed- xmode)
5147 (.sym dst32-An-direct-Unprefixed- xmode)
5148 (.sym dst32-An-indirect-Unprefixed- xmode)
5149 (.sym dst32-16-8-An-relative-Unprefixed- xmode)
5150 (.sym dst32-16-16-An-relative-Unprefixed- xmode)
5151 (.sym dst32-16-24-An-relative-Unprefixed- xmode)
5152 (.sym dst32-16-8-SB-relative-Unprefixed- xmode)
5153 (.sym dst32-16-16-SB-relative-Unprefixed- xmode)
5154 (.sym dst32-16-8-FB-relative-Unprefixed- xmode)
5155 (.sym dst32-16-16-FB-relative-Unprefixed- xmode)
5156 (.sym dst32-16-16-absolute-Unprefixed- xmode)
5157 (.sym dst32-16-24-absolute-Unprefixed- xmode)
5158 )
5159 )
5160 (define-anyof-operand
5161 (name (.sym dst32-16-8-Unprefixed- xmode))
5162 (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 16"))
5163 (attrs (machine 32))
5164 (mode xmode)
5165 (choices
5166 (.sym dst32-16-8-An-relative-Unprefixed- xmode)
5167 (.sym dst32-16-8-SB-relative-Unprefixed- xmode)
5168 (.sym dst32-16-8-FB-relative-Unprefixed- xmode)
5169 )
5170 )
5171 (define-anyof-operand
5172 (name (.sym dst32-16-16-Unprefixed- xmode))
5173 (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 16"))
5174 (attrs (machine 32))
5175 (mode xmode)
5176 (choices
5177 (.sym dst32-16-16-An-relative-Unprefixed- xmode)
5178 (.sym dst32-16-16-SB-relative-Unprefixed- xmode)
5179 (.sym dst32-16-16-FB-relative-Unprefixed- xmode)
5180 (.sym dst32-16-16-absolute-Unprefixed- xmode)
5181 )
5182 )
5183 (define-anyof-operand
5184 (name (.sym dst32-16-16sa-Unprefixed- xmode))
5185 (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 16"))
5186 (attrs (machine 32))
5187 (mode xmode)
5188 (choices
5189 (.sym dst32-16-16-SB-relative-Unprefixed- xmode)
5190 (.sym dst32-16-16-FB-relative-Unprefixed- xmode)
5191 (.sym dst32-16-16-absolute-Unprefixed- xmode)
5192 )
5193 )
5194 (define-anyof-operand
5195 (name (.sym dst32-16-24-Unprefixed- xmode))
5196 (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 16"))
5197 (attrs (machine 32))
5198 (mode xmode)
5199 (choices
5200 (.sym dst32-16-24-An-relative-Unprefixed- xmode)
5201 (.sym dst32-16-24-absolute-Unprefixed- xmode)
5202 )
5203 )
5204 )
5205 )
5206
5207 (dst32-16-operand QI)
5208 (dst32-16-operand HI)
5209 (dst32-16-operand SI)
5210
5211 (define-pmacro (dst32-16-Ext-operand smode dmode)
5212 (begin
5213 (define-anyof-operand
5214 (name (.sym dst32-16-ExtUnprefixed- smode))
5215 (comment (.str "m32c destination operand of size " smode " with additional fields at offset 16"))
5216 (attrs (machine 32))
5217 (mode dmode)
5218 (choices
5219 (.sym dst32-Rn-direct-ExtUnprefixed- smode)
5220 (.sym dst32-An-direct-Unprefixed- dmode) ; ExtUnprefixed mode not required for this operand -- use the normal dmode version
5221 (.sym dst32-An-indirect-ExtUnprefixed- smode)
5222 (.sym dst32-16-8-An-relative-ExtUnprefixed- smode)
5223 (.sym dst32-16-16-An-relative-ExtUnprefixed- smode)
5224 (.sym dst32-16-24-An-relative-ExtUnprefixed- smode)
5225 (.sym dst32-16-8-SB-relative-ExtUnprefixed- smode)
5226 (.sym dst32-16-16-SB-relative-ExtUnprefixed- smode)
5227 (.sym dst32-16-8-FB-relative-ExtUnprefixed- smode)
5228 (.sym dst32-16-16-FB-relative-ExtUnprefixed- smode)
5229 (.sym dst32-16-16-absolute-ExtUnprefixed- smode)
5230 (.sym dst32-16-24-absolute-ExtUnprefixed- smode)
5231 )
5232 )
5233 )
5234 )
5235
5236 (dst32-16-Ext-operand QI HI)
5237 (dst32-16-Ext-operand HI SI)
5238
5239 (define-anyof-operand
5240 (name dst32-16-Unprefixed-Mulex-HI)
5241 (comment "m32c destination operand of size HI with additional fields at offset 16")
5242 (attrs (machine 32))
5243 (mode HI)
5244 (choices
5245 dst32-R3-direct-Unprefixed-HI
5246 dst32-An-direct-Unprefixed-HI
5247 dst32-An-indirect-Unprefixed-HI
5248 dst32-16-8-An-relative-Unprefixed-HI
5249 dst32-16-16-An-relative-Unprefixed-HI
5250 dst32-16-24-An-relative-Unprefixed-HI
5251 dst32-16-8-SB-relative-Unprefixed-HI
5252 dst32-16-16-SB-relative-Unprefixed-HI
5253 dst32-16-8-FB-relative-Unprefixed-HI
5254 dst32-16-16-FB-relative-Unprefixed-HI
5255 dst32-16-16-absolute-Unprefixed-HI
5256 dst32-16-24-absolute-Unprefixed-HI
5257 )
5258 )
5259 ;-------------------------------------------------------------
5260 ; Destination operands with possible additional fields at offset 24 bits
5261 ;-------------------------------------------------------------
5262
5263 (define-pmacro (dst16-24-operand xmode)
5264 (begin
5265 (define-anyof-operand
5266 (name (.sym dst16-24- xmode))
5267 (comment (.str "m16c destination operand of size " xmode " with additional fields at offset 24"))
5268 (attrs (machine 16))
5269 (mode xmode)
5270 (choices
5271 (.sym dst16-Rn-direct- xmode)
5272 (.sym dst16-An-direct- xmode)
5273 (.sym dst16-An-indirect- xmode)
5274 (.sym dst16-24-8-An-relative- xmode)
5275 (.sym dst16-24-16-An-relative- xmode)
5276 (.sym dst16-24-8-SB-relative- xmode)
5277 (.sym dst16-24-16-SB-relative- xmode)
5278 (.sym dst16-24-8-FB-relative- xmode)
5279 (.sym dst16-24-16-absolute- xmode)
5280 )
5281 )
5282 )
5283 )
5284
5285 (dst16-24-operand QI)
5286 (dst16-24-operand HI)
5287
5288 (define-pmacro (dst32-24-operand xmode)
5289 (begin
5290 (define-anyof-operand
5291 (name (.sym dst32-24-Unprefixed- xmode))
5292 (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 24"))
5293 (attrs (machine 32))
5294 (mode xmode)
5295 (choices
5296 (.sym dst32-Rn-direct-Unprefixed- xmode)
5297 (.sym dst32-An-direct-Unprefixed- xmode)
5298 (.sym dst32-An-indirect-Unprefixed- xmode)
5299 (.sym dst32-24-8-An-relative-Unprefixed- xmode)
5300 (.sym dst32-24-16-An-relative-Unprefixed- xmode)
5301 (.sym dst32-24-24-An-relative-Unprefixed- xmode)
5302 (.sym dst32-24-8-SB-relative-Unprefixed- xmode)
5303 (.sym dst32-24-16-SB-relative-Unprefixed- xmode)
5304 (.sym dst32-24-8-FB-relative-Unprefixed- xmode)
5305 (.sym dst32-24-16-FB-relative-Unprefixed- xmode)
5306 (.sym dst32-24-16-absolute-Unprefixed- xmode)
5307 (.sym dst32-24-24-absolute-Unprefixed- xmode)
5308 )
5309 )
5310 (define-anyof-operand
5311 (name (.sym dst32-24-Prefixed- xmode))
5312 (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 24"))
5313 (attrs (machine 32))
5314 (mode xmode)
5315 (choices
5316 (.sym dst32-Rn-direct-Prefixed- xmode)
5317 (.sym dst32-An-direct-Prefixed- xmode)
5318 (.sym dst32-An-indirect-Prefixed- xmode)
5319 (.sym dst32-24-8-An-relative-Prefixed- xmode)
5320 (.sym dst32-24-16-An-relative-Prefixed- xmode)
5321 (.sym dst32-24-24-An-relative-Prefixed- xmode)
5322 (.sym dst32-24-8-SB-relative-Prefixed- xmode)
5323 (.sym dst32-24-16-SB-relative-Prefixed- xmode)
5324 (.sym dst32-24-8-FB-relative-Prefixed- xmode)
5325 (.sym dst32-24-16-FB-relative-Prefixed- xmode)
5326 (.sym dst32-24-16-absolute-Prefixed- xmode)
5327 (.sym dst32-24-24-absolute-Prefixed- xmode)
5328 )
5329 )
5330 (define-anyof-operand
5331 (name (.sym dst32-24-8-Prefixed- xmode))
5332 (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 24"))
5333 (attrs (machine 32))
5334 (mode xmode)
5335 (choices
5336 (.sym dst32-24-8-An-relative-Prefixed- xmode)
5337 (.sym dst32-24-8-SB-relative-Prefixed- xmode)
5338 (.sym dst32-24-8-FB-relative-Prefixed- xmode)
5339 )
5340 )
5341 (define-anyof-operand
5342 (name (.sym dst32-24-16-Prefixed- xmode))
5343 (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 24"))
5344 (attrs (machine 32))
5345 (mode xmode)
5346 (choices
5347 (.sym dst32-24-16-An-relative-Prefixed- xmode)
5348 (.sym dst32-24-16-SB-relative-Prefixed- xmode)
5349 (.sym dst32-24-16-FB-relative-Prefixed- xmode)
5350 (.sym dst32-24-16-absolute-Prefixed- xmode)
5351 )
5352 )
5353 (define-anyof-operand
5354 (name (.sym dst32-24-24-Prefixed- xmode))
5355 (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 24"))
5356 (attrs (machine 32))
5357 (mode xmode)
5358 (choices
5359 (.sym dst32-24-24-An-relative-Prefixed- xmode)
5360 (.sym dst32-24-24-absolute-Prefixed- xmode)
5361 )
5362 )
5363 ; (define-anyof-operand
5364 ; (name (.sym dst32-24-indirect- xmode))
5365 ; (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 24"))
5366 ; (attrs (machine 32))
5367 ; (mode xmode)
5368 ; (choices
5369 ; (.sym dst32-An-indirect-indirect- xmode)
5370 ; (.sym dst32-24-8-An-relative-indirect- xmode)
5371 ; (.sym dst32-24-16-An-relative-indirect- xmode)
5372 ; (.sym dst32-24-24-An-relative-indirect- xmode)
5373 ; (.sym dst32-24-8-SB-relative-indirect- xmode)
5374 ; (.sym dst32-24-16-SB-relative-indirect- xmode)
5375 ; (.sym dst32-24-8-FB-relative-indirect- xmode)
5376 ; (.sym dst32-24-16-FB-relative-indirect- xmode)
5377 ; )
5378 ; )
5379 ; (define-anyof-operand
5380 ; (name (.sym dst32-basic-indirect- xmode))
5381 ; (comment (.str "m32c destination operand of size " xmode " with no additional fields"))
5382 ; (attrs (machine 32))
5383 ; (mode xmode)
5384 ; (choices
5385 ; (.sym dst32-An-indirect-indirect- xmode)
5386 ; )
5387 ; )
5388 ; (define-anyof-operand
5389 ; (name (.sym dst32-24-8-indirect- xmode))
5390 ; (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 24"))
5391 ; (attrs (machine 32))
5392 ; (mode xmode)
5393 ; (choices
5394 ; (.sym dst32-24-8-An-relative-indirect- xmode)
5395 ; (.sym dst32-24-8-SB-relative-indirect- xmode)
5396 ; (.sym dst32-24-8-FB-relative-indirect- xmode)
5397 ; )
5398 ; )
5399 ; (define-anyof-operand
5400 ; (name (.sym dst32-24-16-indirect- xmode))
5401 ; (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 24"))
5402 ; (attrs (machine 32))
5403 ; (mode xmode)
5404 ; (choices
5405 ; (.sym dst32-24-16-An-relative-indirect- xmode)
5406 ; (.sym dst32-24-16-SB-relative-indirect- xmode)
5407 ; (.sym dst32-24-16-FB-relative-indirect- xmode)
5408 ; )
5409 ; )
5410 ; (define-anyof-operand
5411 ; (name (.sym dst32-24-24-indirect- xmode))
5412 ; (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 24"))
5413 ; (attrs (machine 32))
5414 ; (mode xmode)
5415 ; (choices
5416 ; (.sym dst32-24-24-An-relative-indirect- xmode)
5417 ; )
5418 ; )
5419 ; (define-anyof-operand
5420 ; (name (.sym dst32-24-absolute-indirect- xmode))
5421 ; (comment (.str "m32c destination operand of size " xmode " absolute indirect"))
5422 ; (attrs (machine 32))
5423 ; (mode xmode)
5424 ; (choices
5425 ; (.sym dst32-24-16-absolute-indirect-derived- xmode)
5426 ; (.sym dst32-24-24-absolute-indirect-derived- xmode)
5427 ; )
5428 ; )
5429 ; (define-anyof-operand
5430 ; (name (.sym dst32-24-16-absolute-indirect- xmode))
5431 ; (comment (.str "m32c destination operand of size " xmode " absolute indirect"))
5432 ; (attrs (machine 32))
5433 ; (mode xmode)
5434 ; (choices
5435 ; (.sym dst32-24-16-absolute-indirect-derived- xmode)
5436 ; )
5437 ; )
5438 ; (define-anyof-operand
5439 ; (name (.sym dst32-24-24-absolute-indirect- xmode))
5440 ; (comment (.str "m32c destination operand of size " xmode " absolute indirect"))
5441 ; (attrs (machine 32))
5442 ; (mode xmode)
5443 ; (choices
5444 ; (.sym dst32-24-24-absolute-indirect-derived- xmode)
5445 ; )
5446 ; )
5447 )
5448 )
5449
5450 (dst32-24-operand QI)
5451 (dst32-24-operand HI)
5452 (dst32-24-operand SI)
5453
5454 ;-------------------------------------------------------------
5455 ; Destination operands with possible additional fields at offset 32 bits
5456 ;-------------------------------------------------------------
5457
5458 (define-pmacro (dst16-32-operand xmode)
5459 (begin
5460 (define-anyof-operand
5461 (name (.sym dst16-32- xmode))
5462 (comment (.str "m16c destination operand of size " xmode " with additional fields at offset 32"))
5463 (attrs (machine 16))
5464 (mode xmode)
5465 (choices
5466 (.sym dst16-Rn-direct- xmode)
5467 (.sym dst16-An-direct- xmode)
5468 (.sym dst16-An-indirect- xmode)
5469 (.sym dst16-32-8-An-relative- xmode)
5470 (.sym dst16-32-16-An-relative- xmode)
5471 (.sym dst16-32-8-SB-relative- xmode)
5472 (.sym dst16-32-16-SB-relative- xmode)
5473 (.sym dst16-32-8-FB-relative- xmode)
5474 (.sym dst16-32-16-absolute- xmode)
5475 )
5476 )
5477 )
5478 )
5479 (dst16-32-operand QI)
5480 (dst16-32-operand HI)
5481
5482 ; This macro actually handles operands at offset 32, 40 and 48 bits
5483 (define-pmacro (dst32-32plus-operand offset xmode)
5484 (begin
5485 (define-anyof-operand
5486 (name (.sym dst32- offset -Unprefixed- xmode))
5487 (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 32"))
5488 (attrs (machine 32))
5489 (mode xmode)
5490 (choices
5491 (.sym dst32-Rn-direct-Unprefixed- xmode)
5492 (.sym dst32-An-direct-Unprefixed- xmode)
5493 (.sym dst32-An-indirect-Unprefixed- xmode)
5494 (.sym dst32- offset -8-An-relative-Unprefixed- xmode)
5495 (.sym dst32- offset -16-An-relative-Unprefixed- xmode)
5496 (.sym dst32- offset -24-An-relative-Unprefixed- xmode)
5497 (.sym dst32- offset -8-SB-relative-Unprefixed- xmode)
5498 (.sym dst32- offset -16-SB-relative-Unprefixed- xmode)
5499 (.sym dst32- offset -8-FB-relative-Unprefixed- xmode)
5500 (.sym dst32- offset -16-FB-relative-Unprefixed- xmode)
5501 (.sym dst32- offset -16-absolute-Unprefixed- xmode)
5502 (.sym dst32- offset -24-absolute-Unprefixed- xmode)
5503 )
5504 )
5505 (define-anyof-operand
5506 (name (.sym dst32- offset -Prefixed- xmode))
5507 (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 32"))
5508 (attrs (machine 32))
5509 (mode xmode)
5510 (choices
5511 (.sym dst32-Rn-direct-Prefixed- xmode)
5512 (.sym dst32-An-direct-Prefixed- xmode)
5513 (.sym dst32-An-indirect-Prefixed- xmode)
5514 (.sym dst32- offset -8-An-relative-Prefixed- xmode)
5515 (.sym dst32- offset -16-An-relative-Prefixed- xmode)
5516 (.sym dst32- offset -24-An-relative-Prefixed- xmode)
5517 (.sym dst32- offset -8-SB-relative-Prefixed- xmode)
5518 (.sym dst32- offset -16-SB-relative-Prefixed- xmode)
5519 (.sym dst32- offset -8-FB-relative-Prefixed- xmode)
5520 (.sym dst32- offset -16-FB-relative-Prefixed- xmode)
5521 (.sym dst32- offset -16-absolute-Prefixed- xmode)
5522 (.sym dst32- offset -24-absolute-Prefixed- xmode)
5523 )
5524 )
5525 ; (define-anyof-operand
5526 ; (name (.sym dst32- offset -indirect- xmode))
5527 ; (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 32"))
5528 ; (attrs (machine 32))
5529 ; (mode xmode)
5530 ; (choices
5531 ; (.sym dst32-An-indirect-indirect- xmode)
5532 ; (.sym dst32- offset -8-An-relative-indirect- xmode)
5533 ; (.sym dst32- offset -16-An-relative-indirect- xmode)
5534 ; (.sym dst32- offset -24-An-relative-indirect- xmode)
5535 ; (.sym dst32- offset -8-SB-relative-indirect- xmode)
5536 ; (.sym dst32- offset -16-SB-relative-indirect- xmode)
5537 ; (.sym dst32- offset -8-FB-relative-indirect- xmode)
5538 ; (.sym dst32- offset -16-FB-relative-indirect- xmode)
5539 ; )
5540 ; )
5541 ; (define-anyof-operand
5542 ; (name (.sym dst32- offset -absolute-indirect- xmode))
5543 ; (comment (.str "m32c destination operand of size " xmode " absolute indirect"))
5544 ; (attrs (machine 32))
5545 ; (mode xmode)
5546 ; (choices
5547 ; (.sym dst32- offset -16-absolute-indirect-derived- xmode)
5548 ; (.sym dst32- offset -24-absolute-indirect-derived- xmode)
5549 ; )
5550 ; )
5551 )
5552 )
5553
5554 (dst32-32plus-operand 32 QI)
5555 (dst32-32plus-operand 32 HI)
5556 (dst32-32plus-operand 32 SI)
5557 (dst32-32plus-operand 40 QI)
5558 (dst32-32plus-operand 40 HI)
5559 (dst32-32plus-operand 40 SI)
5560
5561 ;-------------------------------------------------------------
5562 ; Destination operands with possible additional fields at offset 48 bits
5563 ;-------------------------------------------------------------
5564
5565 (define-pmacro (dst32-48-operand offset xmode)
5566 (begin
5567 (define-anyof-operand
5568 (name (.sym dst32- offset -Prefixed- xmode))
5569 (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 32"))
5570 (attrs (machine 32))
5571 (mode xmode)
5572 (choices
5573 (.sym dst32-Rn-direct-Prefixed- xmode)
5574 (.sym dst32-An-direct-Prefixed- xmode)
5575 (.sym dst32-An-indirect-Prefixed- xmode)
5576 (.sym dst32- offset -8-An-relative-Prefixed- xmode)
5577 (.sym dst32- offset -16-An-relative-Prefixed- xmode)
5578 (.sym dst32- offset -24-An-relative-Prefixed- xmode)
5579 (.sym dst32- offset -8-SB-relative-Prefixed- xmode)
5580 (.sym dst32- offset -16-SB-relative-Prefixed- xmode)
5581 (.sym dst32- offset -8-FB-relative-Prefixed- xmode)
5582 (.sym dst32- offset -16-FB-relative-Prefixed- xmode)
5583 (.sym dst32- offset -16-absolute-Prefixed- xmode)
5584 (.sym dst32- offset -24-absolute-Prefixed- xmode)
5585 )
5586 )
5587 ; (define-anyof-operand
5588 ; (name (.sym dst32- offset -indirect- xmode))
5589 ; (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 32"))
5590 ; (attrs (machine 32))
5591 ; (mode xmode)
5592 ; (choices
5593 ; (.sym dst32-An-indirect-indirect- xmode)
5594 ; (.sym dst32- offset -8-An-relative-indirect- xmode)
5595 ; (.sym dst32- offset -16-An-relative-indirect- xmode)
5596 ; (.sym dst32- offset -24-An-relative-indirect- xmode)
5597 ; (.sym dst32- offset -8-SB-relative-indirect- xmode)
5598 ; (.sym dst32- offset -16-SB-relative-indirect- xmode)
5599 ; (.sym dst32- offset -8-FB-relative-indirect- xmode)
5600 ; (.sym dst32- offset -16-FB-relative-indirect- xmode)
5601 ; )
5602 ; )
5603 ; (define-anyof-operand
5604 ; (name (.sym dst32- offset -absolute-indirect- xmode))
5605 ; (comment (.str "m32c destination operand of size " xmode " absolute indirect"))
5606 ; (attrs (machine 32))
5607 ; (mode xmode)
5608 ; (choices
5609 ; (.sym dst32- offset -16-absolute-indirect-derived- xmode)
5610 ; (.sym dst32- offset -24-absolute-indirect-derived- xmode)
5611 ; )
5612 ; )
5613 )
5614 )
5615
5616 (dst32-48-operand 48 QI)
5617 (dst32-48-operand 48 HI)
5618 (dst32-48-operand 48 SI)
5619
5620 ;-------------------------------------------------------------
5621 ; Bit operands for m16c
5622 ;-------------------------------------------------------------
5623
5624 (define-pmacro (bit16-operand offset)
5625 (begin
5626 (define-anyof-operand
5627 (name (.sym bit16- offset))
5628 (comment (.str "m16c bit operand with possible additional fields at offset 24"))
5629 (attrs (machine 16))
5630 (mode BI)
5631 (choices
5632 bit16-Rn-direct
5633 bit16-An-direct
5634 bit16-An-indirect
5635 (.sym bit16- offset -8-An-relative)
5636 (.sym bit16- offset -16-An-relative)
5637 (.sym bit16- offset -8-SB-relative)
5638 (.sym bit16- offset -16-SB-relative)
5639 (.sym bit16- offset -8-FB-relative)
5640 (.sym bit16- offset -16-absolute)
5641 )
5642 )
5643 (define-anyof-operand
5644 (name (.sym bit16- offset -basic))
5645 (comment (.str "m16c bit operand with no additional fields"))
5646 (attrs (machine 16))
5647 (mode BI)
5648 (choices
5649 bit16-An-indirect
5650 )
5651 )
5652 (define-anyof-operand
5653 (name (.sym bit16- offset -8))
5654 (comment (.str "m16c bit operand with possible additional fields at offset 24"))
5655 (attrs (machine 16))
5656 (mode BI)
5657 (choices
5658 bit16-Rn-direct
5659 bit16-An-direct
5660 (.sym bit16- offset -8-An-relative)
5661 (.sym bit16- offset -8-SB-relative)
5662 (.sym bit16- offset -8-FB-relative)
5663 )
5664 )
5665 (define-anyof-operand
5666 (name (.sym bit16- offset -16))
5667 (comment (.str "m16c bit operand with possible additional fields at offset 24"))
5668 (attrs (machine 16))
5669 (mode BI)
5670 (choices
5671 (.sym bit16- offset -16-An-relative)
5672 (.sym bit16- offset -16-SB-relative)
5673 (.sym bit16- offset -16-absolute)
5674 )
5675 )
5676 )
5677 )
5678
5679 (bit16-operand 16)
5680
5681 ;-------------------------------------------------------------
5682 ; Bit operands for m32c
5683 ;-------------------------------------------------------------
5684
5685 (define-pmacro (bit32-operand offset group)
5686 (begin
5687 (define-anyof-operand
5688 (name (.sym bit32- offset - group))
5689 (comment (.str "m32c bit operand with possible additional fields at offset 24"))
5690 (attrs (machine 32))
5691 (mode BI)
5692 (choices
5693 (.sym bit32-Rn-direct- group)
5694 (.sym bit32-An-direct- group)
5695 (.sym bit32-An-indirect- group)
5696 (.sym bit32- offset -11-An-relative- group)
5697 (.sym bit32- offset -19-An-relative- group)
5698 (.sym bit32- offset -27-An-relative- group)
5699 (.sym bit32- offset -11-SB-relative- group)
5700 (.sym bit32- offset -19-SB-relative- group)
5701 (.sym bit32- offset -11-FB-relative- group)
5702 (.sym bit32- offset -19-FB-relative- group)
5703 (.sym bit32- offset -19-absolute- group)
5704 (.sym bit32- offset -27-absolute- group)
5705 )
5706 )
5707 )
5708 )
5709
5710 (bit32-operand 16 Unprefixed)
5711 (bit32-operand 24 Prefixed)
5712
5713 (define-anyof-operand
5714 (name bit32-basic-Unprefixed)
5715 (comment "m32c bit operand with no additional fields")
5716 (attrs (machine 32))
5717 (mode BI)
5718 (choices
5719 bit32-Rn-direct-Unprefixed
5720 bit32-An-direct-Unprefixed
5721 bit32-An-indirect-Unprefixed
5722 )
5723 )
5724
5725 (define-anyof-operand
5726 (name bit32-16-8-Unprefixed)
5727 (comment "m32c bit operand with 8 bit additional fields")
5728 (attrs (machine 32))
5729 (mode BI)
5730 (choices
5731 bit32-16-11-An-relative-Unprefixed
5732 bit32-16-11-SB-relative-Unprefixed
5733 bit32-16-11-FB-relative-Unprefixed
5734 )
5735 )
5736
5737 (define-anyof-operand
5738 (name bit32-16-16-Unprefixed)
5739 (comment "m32c bit operand with 16 bit additional fields")
5740 (attrs (machine 32))
5741 (mode BI)
5742 (choices
5743 bit32-16-19-An-relative-Unprefixed
5744 bit32-16-19-SB-relative-Unprefixed
5745 bit32-16-19-FB-relative-Unprefixed
5746 bit32-16-19-absolute-Unprefixed
5747 )
5748 )
5749
5750 (define-anyof-operand
5751 (name bit32-16-24-Unprefixed)
5752 (comment "m32c bit operand with 24 bit additional fields")
5753 (attrs (machine 32))
5754 (mode BI)
5755 (choices
5756 bit32-16-27-An-relative-Unprefixed
5757 bit32-16-27-absolute-Unprefixed
5758 )
5759 )
5760
5761 ;-------------------------------------------------------------
5762 ; Operands for short format binary insns
5763 ;-------------------------------------------------------------
5764
5765 (define-anyof-operand
5766 (name src16-2-S)
5767 (comment "m16c source operand of size QI for short format insns")
5768 (attrs (machine 16))
5769 (mode QI)
5770 (choices
5771 src16-2-S-8-SB-relative-QI
5772 src16-2-S-8-FB-relative-QI
5773 src16-2-S-16-absolute-QI
5774 )
5775 )
5776
5777 (define-anyof-operand
5778 (name src32-2-S-QI)
5779 (comment "m32c source operand of size QI for short format insns")
5780 (attrs (machine 32))
5781 (mode QI)
5782 (choices
5783 src32-2-S-8-SB-relative-QI
5784 src32-2-S-8-FB-relative-QI
5785 src32-2-S-16-absolute-QI
5786 )
5787 )
5788
5789 (define-anyof-operand
5790 (name src32-2-S-HI)
5791 (comment "m32c source operand of size QI for short format insns")
5792 (attrs (machine 32))
5793 (mode HI)
5794 (choices
5795 src32-2-S-8-SB-relative-HI
5796 src32-2-S-8-FB-relative-HI
5797 src32-2-S-16-absolute-HI
5798 )
5799 )
5800
5801 (define-anyof-operand
5802 (name Dst16-3-S-8)
5803 (comment "m16c destination operand of size QI for short format insns")
5804 (attrs (machine 16))
5805 (mode QI)
5806 (choices
5807 dst16-3-S-R0l-direct-QI
5808 dst16-3-S-R0h-direct-QI
5809 dst16-3-S-8-8-SB-relative-QI
5810 dst16-3-S-8-8-FB-relative-QI
5811 dst16-3-S-8-16-absolute-QI
5812 )
5813 )
5814
5815 (define-anyof-operand
5816 (name Dst16-3-S-16)
5817 (comment "m16c destination operand of size QI for short format insns")
5818 (attrs (machine 16))
5819 (mode QI)
5820 (choices
5821 dst16-3-S-R0l-direct-QI
5822 dst16-3-S-R0h-direct-QI
5823 dst16-3-S-16-8-SB-relative-QI
5824 dst16-3-S-16-8-FB-relative-QI
5825 dst16-3-S-16-16-absolute-QI
5826 )
5827 )
5828
5829 (define-anyof-operand
5830 (name srcdst16-r0l-r0h-S)
5831 (comment "m16c r0l/r0h operand of size QI for short format insns")
5832 (attrs (machine 16))
5833 (mode SI)
5834 (choices
5835 srcdst16-r0l-r0h-S-derived
5836 )
5837 )
5838
5839 (define-anyof-operand
5840 (name dst32-2-S-basic-QI)
5841 (comment "m32c r0l operand of size QI for short format binary insns")
5842 (attrs (machine 32))
5843 (mode QI)
5844 (choices
5845 dst32-2-S-R0l-direct-QI
5846 )
5847 )
5848
5849 (define-anyof-operand
5850 (name dst32-2-S-basic-HI)
5851 (comment "m32c r0 operand of size HI for short format binary insns")
5852 (attrs (machine 32))
5853 (mode HI)
5854 (choices
5855 dst32-2-S-R0-direct-HI
5856 )
5857 )
5858
5859 (define-pmacro (dst32-2-S-operands xmode)
5860 (begin
5861 (define-anyof-operand
5862 (name (.sym dst32-2-S-8- xmode))
5863 (comment "m32c operand of size " xmode " for short format binary insns")
5864 (attrs (machine 32))
5865 (mode xmode)
5866 (choices
5867 (.sym dst32-2-S-8-SB-relative- xmode)
5868 (.sym dst32-2-S-8-FB-relative- xmode)
5869 )
5870 )
5871 (define-anyof-operand
5872 (name (.sym dst32-2-S-16- xmode))
5873 (comment "m32c operand of size " xmode " for short format binary insns")
5874 (attrs (machine 32))
5875 (mode xmode)
5876 (choices
5877 (.sym dst32-2-S-16-absolute- xmode)
5878 )
5879 )
5880 ; (define-anyof-operand
5881 ; (name (.sym dst32-2-S-8-indirect- xmode))
5882 ; (comment "m32c operand of size " xmode " for short format binary insns")
5883 ; (attrs (machine 32))
5884 ; (mode xmode)
5885 ; (choices
5886 ; (.sym dst32-2-S-8-SB-relative-indirect- xmode)
5887 ; (.sym dst32-2-S-8-FB-relative-indirect- xmode)
5888 ; )
5889 ; )
5890 ; (define-anyof-operand
5891 ; (name (.sym dst32-2-S-absolute-indirect- xmode))
5892 ; (comment "m32c operand of size " xmode " for short format binary insns")
5893 ; (attrs (machine 32))
5894 ; (mode xmode)
5895 ; (choices
5896 ; (.sym dst32-2-S-16-absolute-indirect- xmode)
5897 ; )
5898 ; )
5899 )
5900 )
5901
5902 (dst32-2-S-operands QI)
5903 (dst32-2-S-operands HI)
5904 (dst32-2-S-operands SI)
5905
5906 (define-anyof-operand
5907 (name dst32-an-S)
5908 (comment "m32c An operand for short format binary insns")
5909 (attrs (machine 32))
5910 (mode HI)
5911 (choices
5912 dst32-1-S-A0-direct-HI
5913 dst32-1-S-A1-direct-HI
5914 )
5915 )
5916
5917 (define-anyof-operand
5918 (name bit16-11-S)
5919 (comment "m16c bit operand for short format insns")
5920 (attrs (machine 16))
5921 (mode BI)
5922 (choices
5923 bit16-11-SB-relative-S
5924 )
5925 )
5926
5927 (define-anyof-operand
5928 (name Rn16-push-S-anyof)
5929 (comment "m16c bit operand for short format insns")
5930 (attrs (machine 16))
5931 (mode QI)
5932 (choices
5933 Rn16-push-S-derived
5934 )
5935 )
5936
5937 (define-anyof-operand
5938 (name An16-push-S-anyof)
5939 (comment "m16c bit operand for short format insns")
5940 (attrs (machine 16))
5941 (mode HI)
5942 (choices
5943 An16-push-S-derived
5944 )
5945 )
5946
5947 ;=============================================================
5948 ; Common macros for instruction definitions
5949 ;
5950 (define-pmacro (set-z x)
5951 (sequence ()
5952 (set zbit (zflag x)))
5953
5954 )
5955
5956 (define-pmacro (set-s x)
5957 (sequence ()
5958 (set sbit (nflag x)))
5959 )
5960
5961 (define-pmacro (set-z-and-s x)
5962 (sequence ()
5963 (set-z x)
5964 (set-s x))
5965 )
5966
5968 ;=============================================================
5969 ; Unary insn macros
5970 ;-------------------------------------------------------------
5971
5972 (define-pmacro (unary-insn-defn-g mach group mode wstr op encoding sem opg)
5973 (dni (.sym op mach wstr - group)
5974 (.str op wstr opg " dst" mach "-" group "-" mode)
5975 ((machine mach) RL_1ADDR)
5976 (.str op wstr opg " ${dst" mach "-" group "-" mode "}")
5977 encoding
5978 (sem mode (.sym dst mach - group - mode))
5979 ())
5980 )
5981
5982 (define-pmacro (unary-insn-defn mach group mode wstr op encoding sem)
5983 (unary-insn-defn-g mach group mode wstr op encoding sem "")
5984 )
5985
5986
5987 (define-pmacro (unary16-defn-g mode wstr wbit op opc1 opc2 opc3 sem opg)
5988 (unary-insn-defn-g 16 16 mode wstr op
5989 (+ opc1 opc2 (f-7-1 wbit) opc3 (.sym dst16-16- mode))
5990 sem opg)
5991 )
5992 (define-pmacro (unary16-defn mode wstr wbit op opc1 opc2 opc3 sem)
5993 (unary-16-defn-g mode wstr wbit op opc1 opc2 opc3 sem "")
5994 )
5995
5996 (define-pmacro (unary32-defn-g mode wstr wbit op opc1 opc2 opc3 sem opg)
5997 (begin
5998 ; Multi insns are tried for assembly in the reverse order in which they appear here, so
5999 ; define the absolute-indirect insns first in order to prevent them from being selected
6000 ; when the mode is register-indirect
6001 ; (unary-insn-defn 32 24-absolute-indirect mode wstr op
6002 ; (+ (f-0-4 0) (f-4-4 9) (f-8-4 opc1) (f-15-1 wbit) (.sym dst32-24-absolute-indirect- mode) (f-18-2 opc2) (f-20-4 opc3))
6003 ; sem)
6004 (unary-insn-defn-g 32 16-Unprefixed mode wstr op
6005 (+ (f-0-4 opc1) (f-7-1 wbit) (.sym dst32-16-Unprefixed- mode) (f-10-2 opc2) (f-12-4 opc3))
6006 sem opg)
6007 ; (unary-insn-defn 32 24-indirect mode wstr op
6008 ; (+ (f-0-4 0) (f-4-4 9) (f-8-4 opc1) (f-15-1 wbit) (.sym dst32-24-indirect- mode) (f-18-2 opc2) (f-20-4 opc3))
6009 ; sem)
6010 )
6011 )
6012 (define-pmacro (unary32-defn mode wstr wbit op opc1 opc2 opc3 sem)
6013 (unary32-defn-g mode wstr wbit op opc1 opc2 opc3 sem "")
6014 )
6015
6016 (define-pmacro (unary-insn-mach-g mach op opc1 opc2 opc3 sem opg)
6017 (begin
6018 (.apply (.sym unary mach -defn-g) (QI .b 0 op opc1 opc2 opc3 sem opg))
6019 (.apply (.sym unary mach -defn-g) (HI .w 1 op opc1 opc2 opc3 sem opg))
6020 )
6021 )
6022 (define-pmacro (unary-insn-mach mach op opc1 opc2 opc3 sem)
6023 (unary-insn-mach-g mach op opc1 opc2 opc3 sem "")
6024 )
6025
6026 (define-pmacro (unary-insn op opc16-1 opc16-2 opc16-3 opc32-1 opc32-2 opc32-3 sem)
6027 (begin
6028 (unary-insn-mach-g 16 op opc16-1 opc16-2 opc16-3 sem "")
6029 (unary-insn-mach-g 32 op opc32-1 opc32-2 opc32-3 sem "")
6030 )
6031 )
6032
6033 (define-pmacro (unary-insn-g op opc16-1 opc16-2 opc16-3 opc32-1 opc32-2 opc32-3 sem)
6034 (begin
6035 (unary-insn-mach-g 16 op opc16-1 opc16-2 opc16-3 sem "$G")
6036 (unary-insn-mach-g 32 op opc32-1 opc32-2 opc32-3 sem "$G")
6037 )
6038 )
6039
6040 ;-------------------------------------------------------------
6041 ; Sign/zero extension macros
6042 ;-------------------------------------------------------------
6043
6044 (define-pmacro (ext-insn-defn mach group smode dmode wstr op encoding sem)
6045 (dni (.sym op mach wstr - group)
6046 (.str op wstr " dst" mach "-" group "-" smode)
6047 ((machine mach))
6048 (.str op wstr " ${dst" mach "-" group "-" smode "}")
6049 encoding
6050 (sem smode dmode (.sym dst mach - group - smode) (.sym dst mach - group - smode))
6051 ())
6052 )
6053
6054 (define-pmacro (ext16-defn smode dmode wstr wbit op opc1 opc2 opc3 sem)
6055 (ext-insn-defn 16 16-Ext smode dmode wstr op
6056 (+ opc1 opc2 (f-7-1 wbit) opc3 (.sym dst16-16-Ext- smode))
6057 sem)
6058 )
6059
6060 (define-pmacro (ext32-defn smode dmode wstr wbit op opc1 opc2 opc3 sem)
6061 (ext-insn-defn 32 16-ExtUnprefixed smode dmode wstr op
6062 (+ opc1 opc2 (f-7-1 wbit) opc3 (.sym dst32-16-ExtUnprefixed- smode))
6063 sem)
6064 )
6065
6066 (define-pmacro (ext32-binary-insn src-group dst-group op wstr encoding sem)
6067 (dni (.sym op 32 wstr - src-group - dst-group)
6068 (.str op 32 wstr " src32-" src-group "-QI,dst32-" dst-group "-HI")
6069 ((machine 32))
6070 (.str op wstr " ${src32-" src-group "-QI},${dst32-" dst-group "-HI}")
6071 encoding
6072 (sem QI HI (.sym src32- src-group -QI) (.sym dst32 - dst-group -HI))
6073 ())
6074 )
6075
6076 (define-pmacro (ext32-binary-defn op wstr opc1 opc2 sem)
6077 (begin
6078 (ext32-binary-insn basic-ExtPrefixed 24-Prefixed op wstr
6079 (+ (f-0-4 0) (f-4-4 1) (f-8-1 opc1) (f-15-1 0) src32-basic-ExtPrefixed-QI dst32-24-Prefixed-HI (f-20-4 opc2))
6080 sem)
6081 (ext32-binary-insn 24-24-Prefixed 48-Prefixed op wstr
6082 (+ (f-0-4 0) (f-4-4 1) (f-8-1 opc1) (f-15-1 0) src32-24-24-Prefixed-QI dst32-48-Prefixed-HI (f-20-4 opc2))
6083 sem)
6084 (ext32-binary-insn 24-16-Prefixed 40-Prefixed op wstr
6085 (+ (f-0-4 0) (f-4-4 1) (f-8-1 opc1) (f-15-1 0) src32-24-16-Prefixed-QI dst32-40-Prefixed-HI (f-20-4 opc2))
6086 sem)
6087 (ext32-binary-insn 24-8-Prefixed 32-Prefixed op wstr
6088 (+ (f-0-4 0) (f-4-4 1) (f-8-1 opc1) (f-15-1 0) src32-24-8-Prefixed-QI dst32-32-Prefixed-HI (f-20-4 opc2))
6089 sem)
6090 )
6091 )
6092
6093 ;=============================================================
6094 ; Binary Arithmetic macros
6095 ;
6096 ;-------------------------------------------------------------
6097 ;<arith>.size:S src2,r0[l] -- for m32c
6098 ;-------------------------------------------------------------
6099
6100 (define-pmacro (binary-arith32-S-src2 op xmode wstr wbit opc1 opc2 sem)
6101 (dni (.sym op 32 wstr .S-src2-r0- xmode)
6102 (.str op 32 wstr ":S src2,r0[l]")
6103 ((machine 32))
6104 (.str op wstr"$S ${src32-2-S-" xmode "},${Dst32R0" xmode "-S}")
6105 (+ opc1 opc2 (.sym src32-2-S- xmode) (f-7-1 wbit))
6106 (sem xmode (.sym src32-2-S- xmode) (.sym Dst32R0 xmode -S))
6107 ())
6108 )
6109
6110 ;-------------------------------------------------------------
6111 ;<arith>.b:S src2,r0l/r0h -- for m16c
6112 ;-------------------------------------------------------------
6113
6114 (define-pmacro (binary-arith16-b-S-src2 op opc1 opc2 sem)
6115 (begin
6116 (dni (.sym op 16 .b.S-src2)
6117 (.str op ".b:S src2,r0[lh]")
6118 ((machine 16))
6119 (.str op ".b$S ${src16-2-S},${Dst16RnQI-S}")
6120 (+ opc1 opc2 Dst16RnQI-S src16-2-S)
6121 (sem QI src16-2-S Dst16RnQI-S)
6122 ())
6123 (dni (.sym op 16 .b.S-r0l-r0h)
6124 (.str op ".b:S r0l/r0h")
6125 ((machine 16))
6126 (.str op ".b$S ${srcdst16-r0l-r0h-S}")
6127 (+ opc1 opc2 srcdst16-r0l-r0h-S)
6128 (if (eq srcdst16-r0l-r0h-S 0)
6129 (sem QI R0h R0l)
6130 (sem QI R0l R0h))
6131 ())
6132 )
6133 )
6134
6135 ;-------------------------------------------------------------
6136 ;<arith>.b:S #imm8,dst3 -- for m16c
6137 ;-------------------------------------------------------------
6138
6139 (define-pmacro (binary-arith16-b-S-imm8-dst3 op sz opc1 opc2 sem)
6140 (dni (.sym op 16 .b.S-imm8-dst3)
6141 (.str op sz ":S imm8,dst3")
6142 ((machine 16))
6143 (.str op sz "$S #${Imm-8-QI},${Dst16-3-S-16}")
6144 (+ opc1 opc2 Dst16-3-S-16 Imm-8-QI)
6145 (sem QI Imm-8-QI Dst16-3-S-16)
6146 ())
6147 )
6148
6149 ;-------------------------------------------------------------
6150 ;<arith>.size:Q #imm4,sp -- for m16c
6151 ;-------------------------------------------------------------
6152
6153 (define-pmacro (binary-arith16-Q-sp op opc1 opc2 opc3 sem)
6154 (dni (.sym op 16 -wQ-sp)
6155 (.str op ".w:q #imm4,sp")
6156 ((machine 16))
6157 (.str op ".w$Q #${Imm-12-s4},sp")
6158 (+ opc1 opc2 opc3 Imm-12-s4)
6159 (sem QI Imm-12-s4 sp)
6160 ())
6161 )
6162
6163 ;-------------------------------------------------------------
6164 ;<arith>.size:G #imm,sp -- for m16c
6165 ;-------------------------------------------------------------
6166
6167 (define-pmacro (binary-arith16-G-sp-defn mode wstr wbit op opc1 opc2 opc3 opc4 sem)
6168 (dni (.sym op 16 wstr - G-sp)
6169 (.str op wstr " imm-sp " mode)
6170 ((machine 16))
6171 (.str op wstr "$G #${Imm-16-" mode "},sp")
6172 (+ opc1 opc2 (f-7-1 wbit) opc3 opc4 (.sym Imm-16- mode))
6173 (sem mode (.sym Imm-16- mode) sp)
6174 ())
6175 )
6176
6177 (define-pmacro (binary-arith16-G-sp op opc1 opc2 opc3 opc4 sem)
6178 (begin
6179 (binary-arith16-G-sp-defn QI .b 0 op opc1 opc2 opc3 opc4 sem)
6180 (binary-arith16-G-sp-defn HI .w 1 op opc1 opc2 opc3 opc4 sem)
6181 )
6182 )
6183
6184 ;-------------------------------------------------------------
6185 ;<arith>.size:G #imm,dst -- for m16c and m32c
6186 ;-------------------------------------------------------------
6187
6188 (define-pmacro (binary-arith-imm-dst-defn mach src dstgroup dmode wstr op suffix encoding sem)
6189 (dni (.sym op mach wstr - imm-G - dstgroup)
6190 (.str op wstr " " mach "-imm-G-" dstgroup "-" dmode)
6191 ((machine mach) RL_1ADDR)
6192 (.str op wstr "$"suffix " #${" src "},${dst" mach "-" dstgroup "-" dmode "}")
6193 encoding
6194 (sem dmode src (.sym dst mach - dstgroup - dmode))
6195 ())
6196 )
6197
6198 ; m16c variants
6199 (define-pmacro (binary-arith16-imm-dst-defn smode dmode wstr wbit op suffix opc1 opc2 opc3 sem)
6200 (begin
6201 (binary-arith-imm-dst-defn 16 (.sym Imm-32- smode) 16-16 dmode wstr op suffix
6202 (+ opc1 opc2 (f-7-1 wbit) opc3 (.sym dst16-16-16- dmode) (.sym Imm-32- smode))
6203 sem)
6204 (binary-arith-imm-dst-defn 16 (.sym Imm-24- smode) 16-8 dmode wstr op suffix
6205 (+ opc1 opc2 (f-7-1 wbit) opc3 (.sym dst16-16-8- dmode) (.sym Imm-24- smode))
6206 sem)
6207 (binary-arith-imm-dst-defn 16 (.sym Imm-16- smode) basic dmode wstr op suffix
6208 (+ opc1 opc2 (f-7-1 wbit) opc3 (.sym dst16-basic- dmode) (.sym Imm-16- smode))
6209 sem)
6210 )
6211 )
6212
6213 ; m32c Unprefixed variants
6214 (define-pmacro (binary-arith32-imm-dst-Unprefixed smode dmode wstr wbit op suffix opc1 opc2 opc3 sem)
6215 (begin
6216 (binary-arith-imm-dst-defn 32 (.sym Imm-40- smode) 16-24-Unprefixed dmode wstr op suffix
6217 (+ (f-0-4 opc1) (f-10-2 opc2) (f-7-1 wbit) (f-12-4 opc3) (.sym dst32-16-24-Unprefixed- dmode) (.sym Imm-40- smode))
6218 sem)
6219 (binary-arith-imm-dst-defn 32 (.sym Imm-32- smode) 16-16-Unprefixed dmode wstr op suffix
6220 (+ (f-0-4 opc1) (f-10-2 opc2) (f-7-1 wbit) (f-12-4 opc3) (.sym dst32-16-16-Unprefixed- dmode) (.sym Imm-32- smode))
6221 sem)
6222 (binary-arith-imm-dst-defn 32 (.sym Imm-24- smode) 16-8-Unprefixed dmode wstr op suffix
6223 (+ (f-0-4 opc1) (f-10-2 opc2) (f-7-1 wbit) (f-12-4 opc3) (.sym dst32-16-8-Unprefixed- dmode) (.sym Imm-24- smode))
6224 sem)
6225 (binary-arith-imm-dst-defn 32 (.sym Imm-16- smode) basic-Unprefixed dmode wstr op suffix
6226 (+ (f-0-4 opc1) (f-10-2 opc2) (f-7-1 wbit) (f-12-4 opc3) (.sym dst32-basic-Unprefixed- dmode) (.sym Imm-16- smode))
6227 sem)
6228 )
6229 )
6230
6231 ; m32c Prefixed variants
6232 (define-pmacro (binary-arith32-imm-dst-Prefixed smode dmode wstr wbit op suffix opc1 opc2 opc3 sem)
6233 (begin
6234 (binary-arith-imm-dst-defn 32 (.sym Imm-48- smode) 24-24-Prefixed dmode wstr op suffix
6235 (+ (f-0-4 0) (f-4-4 1) (f-8-4 opc1) (f-18-2 opc2) (f-15-1 wbit) (f-20-4 opc3) (.sym dst32-24-24-Prefixed- dmode) (.sym Imm-48- smode))
6236 sem)
6237 (binary-arith-imm-dst-defn 32 (.sym Imm-40- smode) 24-16-Prefixed dmode wstr op suffix
6238 (+ (f-0-4 0) (f-4-4 1) (f-8-4 opc1) (f-18-2 opc2) (f-15-1 wbit) (f-20-4 opc3) (.sym dst32-24-16-Prefixed- dmode) (.sym Imm-40- smode))
6239 sem)
6240 (binary-arith-imm-dst-defn 32 (.sym Imm-32- smode) 24-8-Prefixed dmode wstr op suffix
6241 (+ (f-0-4 0) (f-4-4 1) (f-8-4 opc1) (f-18-2 opc2) (f-15-1 wbit) (f-20-4 opc3) (.sym dst32-24-8-Prefixed- dmode) (.sym Imm-32- smode))
6242 sem)
6243 (binary-arith-imm-dst-defn 32 (.sym Imm-24- smode) basic-Prefixed dmode wstr op suffix
6244 (+ (f-0-4 0) (f-4-4 1) (f-8-4 opc1) (f-18-2 opc2) (f-15-1 wbit) (f-20-4 opc3) (.sym dst32-basic-Prefixed- dmode) (.sym Imm-24- smode))
6245 sem)
6246 )
6247 )
6248
6249 ; All m32c variants
6250 (define-pmacro (binary-arith32-imm-dst-defn smode dmode wstr wbit op suffix opc1 opc2 opc3 sem)
6251 (begin
6252 ; Multi insns are tried for assembly in the reverse order in which they appear here, so
6253 ; define the absolute-indirect insns first in order to prevent them from being selected
6254 ; when the mode is register-indirect
6255 ; (binary-arith-imm-dst-defn 32 (.sym Imm-48- smode) 24-24-absolute-indirect dmode wstr op suffix
6256 ; (+ (f-0-4 0) (f-4-4 9) (f-8-4 opc1) (f-18-2 opc2) (f-15-1 wbit) (f-20-4 opc3) (.sym dst32-24-24-absolute-indirect- dmode) (.sym Imm-48- smode))
6257 ; sem)
6258 ; (binary-arith-imm-dst-defn 32 (.sym Imm-40- smode) 24-16-absolute-indirect dmode wstr op suffix
6259 ; (+ (f-0-4 0) (f-4-4 9) (f-8-4 opc1) (f-18-2 opc2) (f-15-1 wbit) (f-20-4 opc3) (.sym dst32-24-16-absolute-indirect- dmode) (.sym Imm-40- smode))
6260 ; sem)
6261 ; Unprefixed modes next
6262 (binary-arith32-imm-dst-Unprefixed smode dmode wstr wbit op suffix opc1 opc2 opc3 sem)
6263
6264 ; Remaining indirect modes
6265 ; (binary-arith-imm-dst-defn 32 (.sym Imm-24- smode) basic-indirect dmode wstr op suffix
6266 ; (+ (f-0-4 0) (f-4-4 9) (f-8-4 opc1) (f-18-2 opc2) (f-15-1 wbit) (f-20-4 opc3) (.sym dst32-basic-indirect- dmode) (.sym Imm-24- smode))
6267 ; sem)
6268 ; (binary-arith-imm-dst-defn 32 (.sym Imm-48- smode) 24-24-indirect dmode wstr op suffix
6269 ; (+ (f-0-4 0) (f-4-4 9) (f-8-4 opc1) (f-18-2 opc2) (f-15-1 wbit) (f-20-4 opc3) (.sym dst32-24-24-indirect- dmode) (.sym Imm-48- smode))
6270 ; sem)
6271 ; (binary-arith-imm-dst-defn 32 (.sym Imm-40- smode) 24-16-indirect dmode wstr op suffix
6272 ; (+ (f-0-4 0) (f-4-4 9) (f-8-4 opc1) (f-18-2 opc2) (f-15-1 wbit) (f-20-4 opc3) (.sym dst32-24-16-indirect- dmode) (.sym Imm-40- smode))
6273 ; sem)
6274 ; (binary-arith-imm-dst-defn 32 (.sym Imm-32- smode) 24-8-indirect dmode wstr op suffix
6275 ; (+ (f-0-4 0) (f-4-4 9) (f-8-4 opc1) (f-18-2 opc2) (f-15-1 wbit) (f-20-4 opc3) (.sym dst32-24-8-indirect- dmode) (.sym Imm-32- smode))
6276 ; sem)
6277 )
6278 )
6279
6280 (define-pmacro (binary-arith-imm-dst-mach mach op suffix opc1 opc2 opc3 sem)
6281 (begin
6282 (.apply (.sym binary-arith mach -imm-dst-defn) (QI QI .b 0 op suffix opc1 opc2 opc3 sem))
6283 (.apply (.sym binary-arith mach -imm-dst-defn) (HI HI .w 1 op suffix opc1 opc2 opc3 sem))
6284 )
6285 )
6286
6287 (define-pmacro (binary-arith-imm-dst op suffix opc16-1 opc16-2 opc16-3 opc32-1 opc32-2 opc32-3 sem)
6288 (begin
6289 (binary-arith-imm-dst-mach 16 op suffix opc16-1 opc16-2 opc16-3 sem)
6290 (binary-arith-imm-dst-mach 32 op suffix opc32-1 opc32-2 opc32-3 sem)
6291 )
6292 )
6293
6294 ;-------------------------------------------------------------
6295 ;<arith>.size:Q #imm4,dst -- for m16c and m32c
6296 ;-------------------------------------------------------------
6297
6298 (define-pmacro (binary-arith-imm4-dst-defn mach src dstgroup mode wstr op encoding sem)
6299 (dni (.sym op mach wstr - imm4-Q - dstgroup)
6300 (.str op wstr " " mach "-imm4-Q-" dstgroup "-" mode)
6301 ((machine mach) RL_1ADDR)
6302 (.str op wstr "$Q #${" src "},${dst" mach "-" dstgroup "-" mode "}")
6303 encoding
6304 (sem mode src (.sym dst mach - dstgroup - mode))
6305 ())
6306 )
6307
6308 ; m16c variants
6309 (define-pmacro (binary-arith16-imm4-dst-defn mode wstr wbit1 wbit2 op opc1 opc2 sem)
6310 (binary-arith-imm4-dst-defn 16 Imm-8-s4 16 mode wstr op
6311 (+ opc1 opc2 (f-7-1 wbit2) Imm-8-s4 (.sym dst16-16- mode))
6312 sem)
6313 )
6314
6315 (define-pmacro (binary-arith16-shimm4-dst-defn mode wstr wbit1 wbit2 op opc1 opc2 sem)
6316 (binary-arith-imm4-dst-defn 16 Imm-sh-8-s4 16 mode wstr op
6317 (+ opc1 opc2 (f-7-1 wbit2) Imm-sh-8-s4 (.sym dst16-16- mode))
6318 sem)
6319 )
6320
6321 ; m32c variants
6322 (define-pmacro (binary-arith32-imm4-dst-defn mode wstr wbit1 wbit2 op opc1 opc2 sem)
6323 (begin
6324 ; Multi insns are tried for assembly in the reverse order in which they appear here, so
6325 ; define the absolute-indirect insns first in order to prevent them from being selected
6326 ; when the mode is register-indirect
6327 ; (binary-arith-imm4-dst-defn 32 Imm-20-s4 24-absolute-indirect mode wstr op
6328 ; (+ (f-0-4 0) (f-4-4 9) (f-8-3 opc1) (f-11-1 wbit1) (f-15-1 wbit2) (.sym dst32-24-absolute-indirect- mode) (f-18-2 opc2) Imm-20-s4)
6329 ; sem)
6330 (binary-arith-imm4-dst-defn 32 Imm-12-s4 16-Unprefixed mode wstr op
6331 (+ (f-0-3 opc1) (f-3-1 wbit1) (f-7-1 wbit2) (.sym dst32-16-Unprefixed- mode) (f-10-2 opc2) Imm-12-s4)
6332 sem)
6333 ; (binary-arith-imm4-dst-defn 32 Imm-20-s4 24-indirect mode wstr op
6334 ; (+ (f-0-4 0) (f-4-4 9) (f-8-3 opc1) (f-11-1 wbit1) (f-15-1 wbit2) (.sym dst32-24-indirect- mode) (f-18-2 opc2) Imm-20-s4)
6335 ; sem)
6336 )
6337 )
6338
6339 (define-pmacro (binary-arith32-shimm4-dst-defn mode wstr wbit1 wbit2 op opc1 opc2 sem)
6340 (begin
6341 ; Multi insns are tried for assembly in the reverse order in which they appear here, so
6342 ; define the absolute-indirect insns first in order to prevent them from being selected
6343 ; when the mode is register-indirect
6344 ; (binary-arith-imm4-dst-defn 32 Imm-sh-20-s4 24-absolute-indirect mode wstr op
6345 ; (+ (f-0-4 0) (f-4-4 9) (f-8-3 opc1) (f-11-1 wbit1) (f-15-1 wbit2) (.sym dst32-24-absolute-indirect- mode) (f-18-2 opc2) Imm-sh-20-s4)
6346 ; sem)
6347 (binary-arith-imm4-dst-defn 32 Imm-sh-12-s4 16-Unprefixed mode wstr op
6348 (+ (f-0-3 opc1) (f-3-1 wbit1) (f-7-1 wbit2) (.sym dst32-16-Unprefixed- mode) (f-10-2 opc2) Imm-sh-12-s4)
6349 sem)
6350 ; (binary-arith-imm4-dst-defn 32 Imm-sh-20-s4 24-indirect mode wstr op
6351 ; (+ (f-0-4 0) (f-4-4 9) (f-8-3 opc1) (f-11-1 wbit1) (f-15-1 wbit2) (.sym dst32-24-indirect- mode) (f-18-2 opc2) Imm-sh-20-s4)
6352 ; sem)
6353 )
6354 )
6355
6356 (define-pmacro (binary-arith-imm4-dst-mach mach op opc1 opc2 sem)
6357 (begin
6358 (.apply (.sym binary-arith mach -imm4-dst-defn) (QI .b 0 0 op opc1 opc2 sem))
6359 (.apply (.sym binary-arith mach -imm4-dst-defn) (HI .w 0 1 op opc1 opc2 sem))
6360 )
6361 )
6362
6363 (define-pmacro (binary-arith-imm4-dst op opc16-1 opc16-2 opc32-1 opc32-2 sem)
6364 (begin
6365 (binary-arith-imm4-dst-mach 16 op opc16-1 opc16-2 sem)
6366 (binary-arith-imm4-dst-mach 32 op opc32-1 opc32-2 sem)
6367 )
6368 )
6369
6370 ;-------------------------------------------------------------
6371 ;<arith>.size:G src,dst -- for m16c and m32c
6372 ;-------------------------------------------------------------
6373
6374 (define-pmacro (binary-arith-src-dst-defn mach srcgroup dstgroup smode dmode wstr op suffix encoding sem)
6375 (dni (.sym op mach wstr - srcgroup - dstgroup)
6376 (.str op wstr " dst" mach "-" srcgroup "-" dstgroup "-" dmode)
6377 ((machine mach) RL_2ADDR)
6378 (.str op wstr "$" suffix " ${src" mach "-" srcgroup "-" smode "},${dst" mach "-" dstgroup "-" dmode "}")
6379 encoding
6380 (sem dmode (.sym src mach - srcgroup - smode) (.sym dst mach - dstgroup - dmode))
6381 ())
6382 )
6383
6384 ; m16c variants
6385 (define-pmacro (binary-arith16-src-dst-defn smode dmode wstr wbit op suffix opc1 opc2 sem)
6386 (begin
6387 (binary-arith-src-dst-defn 16 basic 16 smode dmode wstr op suffix
6388 (+ opc1 opc2 (f-7-1 wbit) (.sym src16-basic- smode) (.sym dst16-16- dmode))
6389 sem)
6390 (binary-arith-src-dst-defn 16 16-16 32 smode dmode wstr op suffix
6391 (+ opc1 opc2 (f-7-1 wbit) (.sym src16-16-16- smode) (.sym dst16-32- dmode))
6392 sem)
6393 (binary-arith-src-dst-defn 16 16-8 24 smode dmode wstr op suffix
6394 (+ opc1 opc2 (f-7-1 wbit) (.sym src16-16-8- smode) (.sym dst16-24- dmode))
6395 sem)
6396 )
6397 )
6398
6399 ; m32c Prefixed variants
6400 (define-pmacro (binary-arith32-src-dst-Prefixed smode dmode wstr wbit op suffix opc1 opc2 sem)
6401 (begin
6402 (binary-arith-src-dst-defn 32 basic-Prefixed 24-Prefixed smode dmode wstr op suffix
6403 (+ (f-0-4 0) (f-4-4 1) (f-8-1 opc1) (f-15-1 wbit) (.sym src32-basic-Prefixed- smode) (.sym dst32-24-Prefixed- dmode) (f-20-4 opc2))
6404 sem)
6405 (binary-arith-src-dst-defn 32 24-24-Prefixed 48-Prefixed smode dmode wstr op suffix
6406 (+ (f-0-4 0) (f-4-4 1) (f-8-1 opc1) (f-15-1 wbit) (.sym src32-24-24-Prefixed- smode) (.sym dst32-48-Prefixed- dmode) (f-20-4 opc2))
6407 sem)
6408 (binary-arith-src-dst-defn 32 24-16-Prefixed 40-Prefixed smode dmode wstr op suffix
6409 (+ (f-0-4 0) (f-4-4 1) (f-8-1 opc1) (f-15-1 wbit) (.sym src32-24-16-Prefixed- smode) (.sym dst32-40-Prefixed- dmode) (f-20-4 opc2))
6410 sem)
6411 (binary-arith-src-dst-defn 32 24-8-Prefixed 32-Prefixed smode dmode wstr op suffix
6412 (+ (f-0-4 0) (f-4-4 1) (f-8-1 opc1) (f-15-1 wbit) (.sym src32-24-8-Prefixed- smode) (.sym dst32-32-Prefixed- dmode) (f-20-4 opc2))
6413 sem)
6414 )
6415 )
6416
6417 ; all m32c variants
6418 (define-pmacro (binary-arith32-src-dst-defn smode dmode wstr wbit op suffix opc1 opc2 sem)
6419 (begin
6420 ; Multi insns are tried for assembly in the reverse order in which they appear here, so
6421 ; define the absolute-indirect insns first in order to prevent them from being selected
6422 ; when the mode is register-indirect
6423 ; (binary-arith-src-dst-defn 32 24-24-absolute-indirect 48-absolute-indirect smode dmode wstr op suffix
6424 ; (+ (f-0-4 4) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6425 ; (.sym src32-24-24-absolute-indirect- smode) (.sym dst32-48-absolute-indirect- dmode) (f-20-4 opc2))
6426 ; sem)
6427 ; (binary-arith-src-dst-defn 32 24-16-absolute-indirect 40-absolute-indirect smode dmode wstr op suffix
6428 ; (+ (f-0-4 4) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6429 ; (.sym src32-24-16-absolute-indirect- smode) (.sym dst32-40-absolute-indirect- dmode) (f-20-4 opc2))
6430 ; sem)
6431 ; (binary-arith-src-dst-defn 32 24-24-absolute-indirect 48-Prefixed smode dmode wstr op suffix
6432 ; (+ (f-0-4 4) (f-4-4 1) (f-8-1 opc1) (f-15-1 wbit)
6433 ; (.sym src32-24-24-absolute-indirect- smode) (.sym dst32-48-Prefixed- dmode) (f-20-4 opc2))
6434 ; sem)
6435 ; (binary-arith-src-dst-defn 32 24-16-absolute-indirect 40-Prefixed smode dmode wstr op suffix
6436 ; (+ (f-0-4 4) (f-4-4 1) (f-8-1 opc1) (f-15-1 wbit)
6437 ; (.sym src32-24-16-absolute-indirect- smode) (.sym dst32-40-Prefixed- dmode) (f-20-4 opc2))
6438 ; sem)
6439 ; (binary-arith-src-dst-defn 32 24-24-absolute-indirect 48-indirect smode dmode wstr op suffix
6440 ; (+ (f-0-4 4) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6441 ; (.sym src32-24-24-absolute-indirect- smode) (.sym dst32-48-indirect- dmode) (f-20-4 opc2))
6442 ; sem)
6443 ; (binary-arith-src-dst-defn 32 24-16-absolute-indirect 40-indirect smode dmode wstr op suffix
6444 ; (+ (f-0-4 4) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6445 ; (.sym src32-24-16-absolute-indirect- smode) (.sym dst32-40-indirect- dmode) (f-20-4 opc2))
6446 ; sem)
6447 ; (binary-arith-src-dst-defn 32 basic-Prefixed 24-absolute-indirect smode dmode wstr op suffix
6448 ; (+ (f-0-4 0) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6449 ; (.sym src32-basic-Prefixed- smode) (.sym dst32-24-absolute-indirect- dmode) (f-20-4 opc2))
6450 ; sem)
6451 ; (binary-arith-src-dst-defn 32 24-24-Prefixed 48-absolute-indirect smode dmode wstr op suffix
6452 ; (+ (f-0-4 0) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6453 ; (.sym src32-24-24-Prefixed- smode) (.sym dst32-48-absolute-indirect- dmode) (f-20-4 opc2))
6454 ; sem)
6455 ; (binary-arith-src-dst-defn 32 24-16-Prefixed 40-absolute-indirect smode dmode wstr op suffix
6456 ; (+ (f-0-4 0) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6457 ; (.sym src32-24-16-Prefixed- smode) (.sym dst32-40-absolute-indirect- dmode) (f-20-4 opc2))
6458 ; sem)
6459 ; (binary-arith-src-dst-defn 32 24-8-Prefixed 32-absolute-indirect smode dmode wstr op suffix
6460 ; (+ (f-0-4 0) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6461 ; (.sym src32-24-8-Prefixed- smode) (.sym dst32-32-absolute-indirect- dmode) (f-20-4 opc2))
6462 ; sem)
6463 ; (binary-arith-src-dst-defn 32 basic-indirect 24-absolute-indirect smode dmode wstr op suffix
6464 ; (+ (f-0-4 4) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6465 ; (.sym src32-basic-indirect- smode) (.sym dst32-24-absolute-indirect- dmode) (f-20-4 opc2))
6466 ; sem)
6467 ; (binary-arith-src-dst-defn 32 24-24-indirect 48-absolute-indirect smode dmode wstr op suffix
6468 ; (+ (f-0-4 4) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6469 ; (.sym src32-24-24-indirect- smode) (.sym dst32-48-absolute-indirect- dmode) (f-20-4 opc2))
6470 ; sem)
6471 ; (binary-arith-src-dst-defn 32 24-16-indirect 40-absolute-indirect smode dmode wstr op suffix
6472 ; (+ (f-0-4 4) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6473 ; (.sym src32-24-16-indirect- smode) (.sym dst32-40-absolute-indirect- dmode) (f-20-4 opc2))
6474 ; sem)
6475 ; (binary-arith-src-dst-defn 32 24-8-indirect 32-absolute-indirect smode dmode wstr op suffix
6476 ; (+ (f-0-4 4) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6477 ; (.sym src32-24-8-indirect- smode) (.sym dst32-32-absolute-indirect- dmode) (f-20-4 opc2))
6478 ; sem)
6479 (binary-arith-src-dst-defn 32 basic-Unprefixed 16-Unprefixed smode dmode wstr op suffix
6480 (+ (f-0-1 opc1) (f-7-1 wbit) (.sym src32-basic-Unprefixed- smode) (.sym dst32-16-Unprefixed- dmode) (f-12-4 opc2))
6481 sem)
6482 (binary-arith-src-dst-defn 32 16-24-Unprefixed 40-Unprefixed smode dmode wstr op suffix
6483 (+ (f-0-1 opc1) (f-7-1 wbit) (.sym src32-16-24-Unprefixed- smode) (.sym dst32-40-Unprefixed- dmode) (f-12-4 opc2))
6484 sem)
6485 (binary-arith-src-dst-defn 32 16-16-Unprefixed 32-Unprefixed smode dmode wstr op suffix
6486 (+ (f-0-1 opc1) (f-7-1 wbit) (.sym src32-16-16-Unprefixed- smode) (.sym dst32-32-Unprefixed- dmode) (f-12-4 opc2))
6487 sem)
6488 (binary-arith-src-dst-defn 32 16-8-Unprefixed 24-Unprefixed smode dmode wstr op suffix
6489 (+ (f-0-1 opc1) (f-7-1 wbit) (.sym src32-16-8-Unprefixed- smode) (.sym dst32-24-Unprefixed- dmode) (f-12-4 opc2))
6490 sem)
6491 ; (binary-arith-src-dst-defn 32 basic-indirect 24-Prefixed smode dmode wstr op suffix
6492 ; (+ (f-0-4 4) (f-4-4 1) (f-8-1 opc1) (f-15-1 wbit)
6493 ; (.sym src32-basic-indirect- smode) (.sym dst32-24-Prefixed- dmode) (f-20-4 opc2))
6494 ; sem)
6495 ; (binary-arith-src-dst-defn 32 24-24-indirect 48-Prefixed smode dmode wstr op suffix
6496 ; (+ (f-0-4 4) (f-4-4 1) (f-8-1 opc1) (f-15-1 wbit)
6497 ; (.sym src32-24-24-indirect- smode) (.sym dst32-48-Prefixed- dmode) (f-20-4 opc2))
6498 ; sem)
6499 ; (binary-arith-src-dst-defn 32 24-16-indirect 40-Prefixed smode dmode wstr op suffix
6500 ; (+ (f-0-4 4) (f-4-4 1) (f-8-1 opc1) (f-15-1 wbit)
6501 ; (.sym src32-24-16-indirect- smode) (.sym dst32-40-Prefixed- dmode) (f-20-4 opc2))
6502 ; sem)
6503 ; (binary-arith-src-dst-defn 32 24-8-indirect 32-Prefixed smode dmode wstr op suffix
6504 ; (+ (f-0-4 4) (f-4-4 1) (f-8-1 opc1) (f-15-1 wbit)
6505 ; (.sym src32-24-8-indirect- smode) (.sym dst32-32-Prefixed- dmode) (f-20-4 opc2))
6506 ; sem)
6507 ; (binary-arith-src-dst-defn 32 basic-Prefixed 24-indirect smode dmode wstr op suffix
6508 ; (+ (f-0-4 0) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6509 ; (.sym src32-basic-Prefixed- smode) (.sym dst32-24-indirect- dmode) (f-20-4 opc2))
6510 ; sem)
6511 ; (binary-arith-src-dst-defn 32 24-24-Prefixed 48-indirect smode dmode wstr op suffix
6512 ; (+ (f-0-4 0) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6513 ; (.sym src32-24-24-Prefixed- smode) (.sym dst32-48-indirect- dmode) (f-20-4 opc2))
6514 ; sem)
6515 ; (binary-arith-src-dst-defn 32 24-16-Prefixed 40-indirect smode dmode wstr op suffix
6516 ; (+ (f-0-4 0) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6517 ; (.sym src32-24-16-Prefixed- smode) (.sym dst32-40-indirect- dmode) (f-20-4 opc2))
6518 ; sem)
6519 ; (binary-arith-src-dst-defn 32 24-8-Prefixed 32-indirect smode dmode wstr op suffix
6520 ; (+ (f-0-4 0) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6521 ; (.sym src32-24-8-Prefixed- smode) (.sym dst32-32-indirect- dmode) (f-20-4 opc2))
6522 ; sem)
6523 ; (binary-arith-src-dst-defn 32 basic-indirect 24-indirect smode dmode wstr op suffix
6524 ; (+ (f-0-4 4) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6525 ; (.sym src32-basic-indirect- smode) (.sym dst32-24-indirect- dmode) (f-20-4 opc2))
6526 ; sem)
6527 ; (binary-arith-src-dst-defn 32 24-24-indirect 48-indirect smode dmode wstr op suffix
6528 ; (+ (f-0-4 4) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6529 ; (.sym src32-24-24-indirect- smode) (.sym dst32-48-indirect- dmode) (f-20-4 opc2))
6530 ; sem)
6531 ; (binary-arith-src-dst-defn 32 24-16-indirect 40-indirect smode dmode wstr op suffix
6532 ; (+ (f-0-4 4) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6533 ; (.sym src32-24-16-indirect- smode) (.sym dst32-40-indirect- dmode) (f-20-4 opc2))
6534 ; sem)
6535 ; (binary-arith-src-dst-defn 32 24-8-indirect 32-indirect smode dmode wstr op suffix
6536 ; (+ (f-0-4 4) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6537 ; (.sym src32-24-8-indirect- smode) (.sym dst32-32-indirect- dmode) (f-20-4 opc2))
6538 ; sem)
6539 )
6540 )
6541
6542 (define-pmacro (binary-arith-src-dst-mach mach op suffix opc1 opc2 sem)
6543 (begin
6544 (.apply (.sym binary-arith mach -src-dst-defn) (QI QI .b 0 op suffix opc1 opc2 sem))
6545 (.apply (.sym binary-arith mach -src-dst-defn) (HI HI .w 1 op suffix opc1 opc2 sem))
6546 )
6547 )
6548
6549 (define-pmacro (binary-arith-src-dst op suffix opc16-1 opc16-2 opc32-1 opc32-2 sem)
6550 (begin
6551 (binary-arith-src-dst-mach 16 op suffix opc16-1 opc16-2 sem)
6552 (binary-arith-src-dst-mach 32 op suffix opc32-1 opc32-2 sem)
6553 )
6554 )
6555
6556 ;-------------------------------------------------------------
6557 ;<arith>.size:S #imm,dst -- for m32c
6558 ;-------------------------------------------------------------
6559
6560 (define-pmacro (binary-arith32-s-imm-dst-defn src dstgroup mode wstr op encoding sem)
6561 (dni (.sym op 32 wstr - imm-S - dstgroup)
6562 (.str op wstr " 32-imm-S-" dstgroup "-" mode)
6563 ((machine 32))
6564 (.str op wstr "$S #${" src "},${dst32-" dstgroup "-" mode "}")
6565 encoding
6566 (sem mode src (.sym dst32- dstgroup - mode))
6567 ())
6568 )
6569
6570 (define-pmacro (binary-arith32-z-imm-dst-defn src dstgroup mode wstr op encoding sem)
6571 (dni (.sym op 32 wstr - imm-Z - dstgroup)
6572 (.str op wstr " 32-imm-Z-" dstgroup "-" mode)
6573 ((machine 32))
6574 (.str op wstr "$Z #0,${dst32-" dstgroup "-" mode "}")
6575 encoding
6576 (sem mode (const 0) (.sym dst32- dstgroup - mode))
6577 ())
6578 )
6579
6580 (define-pmacro (binary-arith32-s-imm-dst mode wstr wbit op opc1 opc2 sem)
6581 (begin
6582 ; (binary-arith32-s-imm-dst-defn (.sym Imm-32- mode) 2-S-absolute-indirect mode wstr op
6583 ; (+ (f-0-4 0) (f-4-4 9) (f-8-2 opc1) (.sym dst32-2-S-absolute-indirect- mode) (f-12-3 opc2) (f-15-1 wbit) (.sym Imm-32- mode))
6584 ; sem)
6585 (binary-arith32-s-imm-dst-defn (.sym Imm-8- mode) 2-S-basic mode wstr op
6586 (+ (f-0-2 opc1) (.sym dst32-2-S-basic- mode) (f-4-3 opc2) (f-7-1 wbit) (.sym Imm-8- mode))
6587 sem)
6588 (binary-arith32-s-imm-dst-defn (.sym Imm-24- mode) 2-S-16 mode wstr op
6589 (+ (f-0-2 opc1) (.sym dst32-2-S-16- mode) (f-4-3 opc2) (f-7-1 wbit) (.sym Imm-24- mode))
6590 sem)
6591 (binary-arith32-s-imm-dst-defn (.sym Imm-16- mode) 2-S-8 mode wstr op
6592 (+ (f-0-2 opc1) (.sym dst32-2-S-8- mode) (f-4-3 opc2) (f-7-1 wbit) (.sym Imm-16- mode))
6593 sem)
6594 ; (binary-arith32-s-imm-dst-defn (.sym Imm-24- mode) 2-S-8-indirect mode wstr op
6595 ; (+ (f-0-4 0) (f-4-4 9) (f-8-2 opc1) (.sym dst32-2-S-8-indirect- mode) (f-12-3 opc2) (f-15-1 wbit) (.sym Imm-24- mode))
6596 ; sem)
6597 )
6598 )
6599
6600 (define-pmacro (binary-arith32-z-imm-dst mode wstr wbit op opc1 opc2 sem)
6601 (begin
6602 ; (binary-arith32-z-imm-dst-defn (.sym Imm-32- mode) 2-S-absolute-indirect mode wstr op
6603 ; (+ (f-0-4 0) (f-4-4 9) (f-8-2 opc1) (.sym dst32-2-S-absolute-indirect- mode) (f-12-3 opc2) (f-15-1 wbit) (.sym Imm-32- mode))
6604 ; sem)
6605 (binary-arith32-z-imm-dst-defn (.sym Imm-8- mode) 2-S-basic mode wstr op
6606 (+ (f-0-2 opc1) (.sym dst32-2-S-basic- mode) (f-4-3 opc2) (f-7-1 wbit))
6607 sem)
6608 (binary-arith32-z-imm-dst-defn (.sym Imm-24- mode) 2-S-16 mode wstr op
6609 (+ (f-0-2 opc1) (.sym dst32-2-S-16- mode) (f-4-3 opc2) (f-7-1 wbit))
6610 sem)
6611 (binary-arith32-z-imm-dst-defn (.sym Imm-16- mode) 2-S-8 mode wstr op
6612 (+ (f-0-2 opc1) (.sym dst32-2-S-8- mode) (f-4-3 opc2) (f-7-1 wbit))
6613 sem)
6614 ; (binary-arith32-z-imm-dst-defn (.sym Imm-24- mode) 2-S-8-indirect mode wstr op
6615 ; (+ (f-0-4 0) (f-4-4 9) (f-8-2 opc1) (.sym dst32-2-S-8-indirect- mode) (f-12-3 opc2) (f-15-1 wbit) (.sym Imm-24- mode))
6616 ; sem)
6617 )
6618 )
6619
6620 ;-------------------------------------------------------------
6621 ;<arith>.L:S #imm1,An -- for m32c
6622 ;-------------------------------------------------------------
6623
6624 (define-pmacro (binary-arith32-l-s-imm1-an op opc1 opc2 sem)
6625 (begin
6626 (dni (.sym op 32.l-s-imm1-S-an)
6627 (.str op ".l 32-imm1-S-an")
6628 ((machine 32))
6629 (.str op ".l$S #${Imm1-S},${dst32-an-S}")
6630 (+ opc1 Imm1-S opc2 dst32-an-S)
6631 (sem SI Imm1-S dst32-an-S)
6632 ())
6633 )
6634 )
6635
6636 ;-------------------------------------------------------------
6637 ;<arith>.L:Q #imm3,sp -- for m32c
6638 ;-------------------------------------------------------------
6639
6640 (define-pmacro (binary-arith32-l-q-imm3-sp op opc1 opc2 sem)
6641 (begin
6642 (dni (.sym op 32.l-imm3-Q)
6643 (.str op ".l 32-imm3-Q")
6644 ((machine 32))
6645 (.str op ".l$Q #${Imm3-S},sp")
6646 (+ opc1 Imm3-S opc2)
6647 (sem SI Imm3-S sp)
6648 ())
6649 )
6650 )
6651
6652 ;-------------------------------------------------------------
6653 ;<arith>.L:S #imm8,sp -- for m32c
6654 ;-------------------------------------------------------------
6655
6656 (define-pmacro (binary-arith32-l-s-imm8-sp op opc1 opc2 opc3 opc4 sem)
6657 (begin
6658 (dni (.sym op 32.l-imm8-S)
6659 (.str op ".l 32-imm8-S")
6660 ((machine 32))
6661 (.str op ".l$S #${Imm-16-QI},sp")
6662 (+ opc1 opc2 opc3 opc4 Imm-16-QI)
6663 (sem SI Imm-16-QI sp)
6664 ())
6665 )
6666 )
6667
6668 ;-------------------------------------------------------------
6669 ;<arith>.L:G #imm16,sp -- for m32c
6670 ;-------------------------------------------------------------
6671
6672 (define-pmacro (binary-arith32-l-g-imm16-sp op opc1 opc2 opc3 opc4 sem)
6673 (begin
6674 (dni (.sym op 32.l-imm16-G)
6675 (.str op ".l 32-imm16-G")
6676 ((machine 32))
6677 (.str op ".l$G #${Imm-16-HI},sp")
6678 (+ opc1 opc2 opc3 opc4 Imm-16-HI)
6679 (sem SI Imm-16-HI sp)
6680 ())
6681 )
6682 )
6683
6684 ;-------------------------------------------------------------
6685 ;<arith>jnz.size #imm4,dst,label -- for m16c and m32c
6686 ;-------------------------------------------------------------
6687
6688 (define-pmacro (arith-jnz-imm4-dst-defn mach src dstgroup label mode wstr op encoding sem)
6689 (dni (.sym op mach wstr - imm4 - dstgroup)
6690 (.str op wstr " " mach "-imm4-" dstgroup "-" label "-" mode)
6691 (RL_JUMP RELAXABLE (machine mach))
6692 (.str op wstr " #${" src "},${dst" mach "-" dstgroup "-" mode "},${" label "}")
6693 encoding
6694 (sem mode src (.sym dst mach - dstgroup - mode) label)
6695 ())
6696 )
6697
6698 ; m16c variants
6699 (define-pmacro (arith-jnz16-imm4-dst-defn mode wstr wbit op i4n opc1 opc2 sem)
6700 (begin
6701 (arith-jnz-imm4-dst-defn 16 (.sym Imm-8- i4n) basic Lab-16-8 mode wstr op
6702 (+ opc1 opc2 (f-7-1 wbit) (.sym Imm-8- i4n) (.sym dst16-basic- mode) Lab-16-8)
6703 sem)
6704 (arith-jnz-imm4-dst-defn 16 (.sym Imm-8- i4n) 16-16 Lab-32-8 mode wstr op
6705 (+ opc1 opc2 (f-7-1 wbit) (.sym Imm-8- i4n) (.sym dst16-16-16- mode) Lab-32-8)
6706 sem)
6707 (arith-jnz-imm4-dst-defn 16 (.sym Imm-8- i4n) 16-8 Lab-24-8 mode wstr op
6708 (+ opc1 opc2 (f-7-1 wbit) (.sym Imm-8- i4n) (.sym dst16-16-8- mode) Lab-24-8)
6709 sem)
6710 )
6711 )
6712
6713 ; m32c variants
6714 (define-pmacro (arith-jnz32-imm4-dst-defn mode wstr wbit op i4n opc1 opc2 sem)
6715 (begin
6716 (arith-jnz-imm4-dst-defn 32 (.sym Imm-12- i4n) basic-Unprefixed Lab-16-8 mode wstr op
6717 (+ (f-0-4 opc1) (f-7-1 wbit) (.sym dst32-basic-Unprefixed- mode) (f-10-2 opc2) (.sym Imm-12- i4n) Lab-16-8)
6718 sem)
6719 (arith-jnz-imm4-dst-defn 32 (.sym Imm-12- i4n) 16-24-Unprefixed Lab-40-8 mode wstr op
6720 (+ (f-0-4 opc1) (f-7-1 wbit) (.sym dst32-16-24-Unprefixed- mode) (f-10-2 opc2) (.sym Imm-12- i4n) Lab-40-8)
6721 sem)
6722 (arith-jnz-imm4-dst-defn 32 (.sym Imm-12- i4n) 16-16-Unprefixed Lab-32-8 mode wstr op
6723 (+ (f-0-4 opc1) (f-7-1 wbit) (.sym dst32-16-16-Unprefixed- mode) (f-10-2 opc2) (.sym Imm-12- i4n) Lab-32-8)
6724 sem)
6725 (arith-jnz-imm4-dst-defn 32 (.sym Imm-12- i4n) 16-8-Unprefixed Lab-24-8 mode wstr op
6726 (+ (f-0-4 opc1) (f-7-1 wbit) (.sym dst32-16-8-Unprefixed- mode) (f-10-2 opc2) (.sym Imm-12- i4n) Lab-24-8)
6727 sem)
6728 )
6729 )
6730
6731 (define-pmacro (arith-jnz-imm4-dst-mach mach op i4n opc1 opc2 sem)
6732 (begin
6733 (.apply (.sym arith-jnz mach -imm4-dst-defn) (QI .b 0 op i4n opc1 opc2 sem))
6734 (.apply (.sym arith-jnz mach -imm4-dst-defn) (HI .w 1 op i4n opc1 opc2 sem))
6735 )
6736 )
6737
6738 (define-pmacro (arith-jnz-imm4-dst op i4n opc16-1 opc16-2 opc32-1 opc32-2 sem)
6739 (begin
6740 (arith-jnz-imm4-dst-mach 16 op i4n opc16-1 opc16-2 sem)
6741 (arith-jnz-imm4-dst-mach 32 op i4n opc32-1 opc32-2 sem)
6742 )
6743 )
6744
6745 ;-------------------------------------------------------------
6746 ;mov.size dsp8[sp],dst -- for m16c and m32c
6747 ;-------------------------------------------------------------
6748 (define-pmacro (mov-dspsp-dst-defn mach dstgroup dsp mode wstr op encoding sem)
6749 (dni (.sym op mach wstr -dspsp-dst- dstgroup)
6750 (.str op wstr " " mach "-dsp[sp]-" dstgroup "-" dsp "-" mode)
6751 ((machine mach))
6752 (.str op wstr "$G ${" dsp "}[sp],${dst" mach "-" dstgroup "-" mode "}")
6753 encoding
6754 (sem mach mode dsp (.sym dst mach - dstgroup - mode))
6755 ())
6756 )
6757 (define-pmacro (mov-src-dspsp-defn mach dstgroup dsp mode wstr op encoding sem)
6758 (dni (.sym op mach wstr -dst-dspsp- dstgroup)
6759 (.str op wstr " " mach "-dsp[sp]-" dstgroup "-" dsp "-" mode)
6760 ((machine mach))
6761 (.str op wstr "$G ${dst" mach "-" dstgroup "-" mode "},${" dsp "}[sp]")
6762 encoding
6763 (sem mach mode (.sym dst mach - dstgroup - mode) dsp)
6764 ())
6765 )
6766
6767 ; m16c variants
6768 (define-pmacro (mov16-dspsp-dst-defn mode wstr wbit op opc1 opc2 opc3 sem)
6769 (begin
6770 (mov-dspsp-dst-defn 16 basic Dsp-16-s8 mode wstr op
6771 (+ opc1 opc2 (f-7-1 wbit) opc3 (.sym dst16-basic- mode) Dsp-16-s8)
6772 sem)
6773 (mov-dspsp-dst-defn 16 16-16 Dsp-32-s8 mode wstr op
6774 (+ opc1 opc2 (f-7-1 wbit) opc3 (.sym dst16-16-16- mode) Dsp-32-s8)
6775 sem)
6776 (mov-dspsp-dst-defn 16 16-8 Dsp-24-s8 mode wstr op
6777 (+ opc1 opc2 (f-7-1 wbit) opc3 (.sym dst16-16-8- mode) Dsp-24-s8)
6778 sem)
6779 )
6780 )
6781
6782 (define-pmacro (mov16-src-dspsp-defn mode wstr wbit op opc1 opc2 opc3 sem)
6783 (begin
6784 (mov-src-dspsp-defn 16 basic Dsp-16-s8 mode wstr op
6785 (+ opc1 opc2 (f-7-1 wbit) opc3 (.sym dst16-basic- mode) Dsp-16-s8)
6786 sem)
6787 (mov-src-dspsp-defn 16 16-16 Dsp-32-s8 mode wstr op
6788 (+ opc1 opc2 (f-7-1 wbit) opc3 (.sym dst16-16-16- mode) Dsp-32-s8)
6789 sem)
6790 (mov-src-dspsp-defn 16 16-8 Dsp-24-s8 mode wstr op
6791 (+ opc1 opc2 (f-7-1 wbit) opc3 (.sym dst16-16-8- mode) Dsp-24-s8)
6792 sem)
6793 )
6794 )
6795
6796 ; m32c variants
6797 (define-pmacro (mov32-dspsp-dst-defn mode wstr wbit op opc1 opc2 opc3 sem)
6798 (begin
6799 (mov-dspsp-dst-defn 32 basic-Unprefixed Dsp-16-s8 mode wstr op
6800 (+ (f-0-4 opc1) (f-7-1 wbit) (.sym dst32-basic-Unprefixed- mode) (f-10-2 opc2) (f-12-4 opc3) Dsp-16-s8)
6801 sem)
6802 (mov-dspsp-dst-defn 32 16-24-Unprefixed Dsp-40-s8 mode wstr op
6803 (+ (f-0-4 opc1) (f-7-1 wbit) (.sym dst32-16-24-Unprefixed- mode) (f-10-2 opc2) (f-12-4 opc3) Dsp-40-s8)
6804 sem)
6805 (mov-dspsp-dst-defn 32 16-16-Unprefixed Dsp-32-s8 mode wstr op
6806 (+ (f-0-4 opc1) (f-7-1 wbit) (.sym dst32-16-16-Unprefixed- mode) (f-10-2 opc2) (f-12-4 opc3) Dsp-32-s8)
6807 sem)
6808 (mov-dspsp-dst-defn 32 16-8-Unprefixed Dsp-24-s8 mode wstr op
6809 (+ (f-0-4 opc1) (f-7-1 wbit) (.sym dst32-16-8-Unprefixed- mode) (f-10-2 opc2) (f-12-4 opc3) Dsp-24-s8)
6810 sem)
6811 )
6812 )
6813 (define-pmacro (mov32-src-dspsp-defn mode wstr wbit op opc1 opc2 opc3 sem)
6814 (begin
6815 (mov-src-dspsp-defn 32 basic-Unprefixed Dsp-16-s8 mode wstr op
6816 (+ (f-0-4 opc1) (f-7-1 wbit) (.sym dst32-basic-Unprefixed- mode) (f-10-2 opc2) (f-12-4 opc3) Dsp-16-s8)
6817 sem)
6818 (mov-src-dspsp-defn 32 16-24-Unprefixed Dsp-40-s8 mode wstr op
6819 (+ (f-0-4 opc1) (f-7-1 wbit) (.sym dst32-16-24-Unprefixed- mode) (f-10-2 opc2) (f-12-4 opc3) Dsp-40-s8)
6820 sem)
6821 (mov-src-dspsp-defn 32 16-16-Unprefixed Dsp-32-s8 mode wstr op
6822 (+ (f-0-4 opc1) (f-7-1 wbit) (.sym dst32-16-16-Unprefixed- mode) (f-10-2 opc2) (f-12-4 opc3) Dsp-32-s8)
6823 sem)
6824 (mov-src-dspsp-defn 32 16-8-Unprefixed Dsp-24-s8 mode wstr op
6825 (+ (f-0-4 opc1) (f-7-1 wbit) (.sym dst32-16-8-Unprefixed- mode) (f-10-2 opc2) (f-12-4 opc3) Dsp-24-s8)
6826 sem)
6827 )
6828 )
6829
6830 (define-pmacro (mov-src-dspsp-mach mach op opc1 opc2 opc3 sem)
6831 (begin
6832 (.apply (.sym mov mach -src-dspsp-defn) (QI .b 0 op opc1 opc2 opc3 sem))
6833 (.apply (.sym mov mach -src-dspsp-defn) (HI .w 1 op opc1 opc2 opc3 sem))
6834 )
6835 )
6836
6837 (define-pmacro (mov-dspsp-dst-mach mach op opc1 opc2 opc3 sem)
6838 (begin
6839 (.apply (.sym mov mach -dspsp-dst-defn) (QI .b 0 op opc1 opc2 opc3 sem))
6840 (.apply (.sym mov mach -dspsp-dst-defn) (HI .w 1 op opc1 opc2 opc3 sem))
6841 )
6842 )
6843
6844 (define-pmacro (mov-dspsp-dst op opc16-1 opc16-2 opc16-3 opc32-1 opc32-2 opc32-3 sem)
6845 (begin
6846 (mov-dspsp-dst-mach 16 op opc16-1 opc16-2 opc16-3 sem)
6847 (mov-dspsp-dst-mach 32 op opc32-1 opc32-2 opc32-3 sem)
6848 )
6849 )
6850 (define-pmacro (mov-src-dspsp op opc16-1 opc16-2 opc16-3 opc32-1 opc32-2 opc32-3 sem)
6851 (begin
6852 (mov-src-dspsp-mach 16 op opc16-1 opc16-2 opc16-3 sem)
6853 (mov-src-dspsp-mach 32 op opc32-1 opc32-2 opc32-3 sem)
6854 )
6855 )
6856
6857 ;-------------------------------------------------------------
6858 ; lde dsp24,dst -- for m16c
6859 ;-------------------------------------------------------------
6860
6861 (define-pmacro (lde-dst-dsp mode wstr wbit dstgroup srcdisp)
6862 (begin
6863
6864 (dni (.sym lde wstr - dstgroup -u20)
6865 (.str "lde" wstr "-" dstgroup "-u20")
6866 ((machine 16))
6867 (.str "lde" wstr " ${" srcdisp "},${dst16-" dstgroup "-" mode "}")
6868 (+ (f-0-4 #x7) (f-4-3 #x2) (f-7-1 wbit) (f-8-4 #x8)
6869 (.sym dst16- dstgroup - mode) srcdisp)
6870 (nop)
6871 ())
6872
6873 (dni (.sym lde wstr - dstgroup -u20a0)
6874 (.str "lde" wstr "-" dstgroup "-u20a0")
6875 ((machine 16))
6876 (.str "lde" wstr " ${" srcdisp "}[a0],${dst16-" dstgroup "-" mode "}")
6877 (+ (f-0-4 #x7) (f-4-3 #x2) (f-7-1 wbit) (f-8-4 #x9)
6878 (.sym dst16- dstgroup - mode) srcdisp)
6879 (nop)
6880 ())
6881
6882 (dni (.sym lde wstr - dstgroup -a1a0)
6883 (.str "lde" wstr "-" dstgroup "-a1a0")
6884 ((machine 16))
6885 (.str "lde" wstr " [a1a0],${dst16-" dstgroup "-" mode "}")
6886 (+ (f-0-4 #x7) (f-4-3 #x2) (f-7-1 wbit) (f-8-4 #xa)
6887 (.sym dst16- dstgroup - mode))
6888 (nop)
6889 ())
6890 )
6891 )
6892
6893 (define-pmacro (lde-dst mode wstr wbit)
6894 (begin
6895 ; like: QI .b 0
6896 (lde-dst-dsp mode wstr wbit basic Dsp-16-u20)
6897 (lde-dst-dsp mode wstr wbit 16-8 Dsp-24-u20)
6898 (lde-dst-dsp mode wstr wbit 16-16 Dsp-32-u20)
6899 )
6900 )
6901
6902 ;-------------------------------------------------------------
6903 ; ste dst,dsp24 -- for m16c
6904 ;-------------------------------------------------------------
6905
6906 (define-pmacro (ste-dst-dsp mode wstr wbit dstgroup srcdisp)
6907 (begin
6908
6909 (dni (.sym ste wstr - dstgroup -u20)
6910 (.str "ste" wstr "-" dstgroup "-u20")
6911 ((machine 16))
6912 (.str "ste" wstr " ${dst16-" dstgroup "-" mode "},${" srcdisp "}")
6913 (+ (f-0-4 #x7) (f-4-3 #x2) (f-7-1 wbit) (f-8-4 #x0)
6914 (.sym dst16- dstgroup - mode) srcdisp)
6915 (nop)
6916 ())
6917
6918 (dni (.sym ste wstr - dstgroup -u20a0)
6919 (.str "ste" wstr "-" dstgroup "-u20a0")
6920 ((machine 16))
6921 (.str "ste" wstr " ${dst16-" dstgroup "-" mode "},${" srcdisp "}[a0]")
6922 (+ (f-0-4 #x7) (f-4-3 #x2) (f-7-1 wbit) (f-8-4 #x1)
6923 (.sym dst16- dstgroup - mode) srcdisp)
6924 (nop)
6925 ())
6926
6927 (dni (.sym ste wstr - dstgroup -a1a0)
6928 (.str "ste" wstr "-" dstgroup "-a1a0")
6929 ((machine 16))
6930 (.str "ste" wstr " ${dst16-" dstgroup "-" mode "},[a1a0]")
6931 (+ (f-0-4 #x7) (f-4-3 #x2) (f-7-1 wbit) (f-8-4 #x2)
6932 (.sym dst16- dstgroup - mode))
6933 (nop)
6934 ())
6935 )
6936 )
6937
6938 (define-pmacro (ste-dst mode wstr wbit)
6939 (begin
6940 ; like: QI .b 0
6941 (ste-dst-dsp mode wstr wbit basic Dsp-16-u20)
6942 (ste-dst-dsp mode wstr wbit 16-8 Dsp-24-u20)
6943 (ste-dst-dsp mode wstr wbit 16-16 Dsp-32-u20)
6944 )
6945 )
6946
6947 ;=============================================================
6948 ; Division
6949 ;-------------------------------------------------------------
6950
6951 (define-pmacro (div-sem divop modop opmode reg src quot rem max min)
6952 (sequence ()
6953 (if (eq src 0)
6954 (set obit (const BI 1))
6955 (sequence ((opmode quot-result) (opmode rem-result))
6956 (set quot-result (divop opmode (ext opmode reg) src))
6957 (set rem-result (modop opmode (ext opmode reg) src))
6958 (set obit (orif (gt opmode quot-result max)
6959 (lt opmode quot-result min)))
6960 (set quot quot-result)
6961 (set rem rem-result))))
6962 )
6963
6964 ;<divop>.size #imm -- for m16c and m32c
6965 (define-pmacro (div-imm-defn mach wstr op src encoding divop modop opmode reg quot rem max min sem)
6966 (dni (.sym op mach wstr - src)
6967 (.str op mach wstr "-" src)
6968 ((machine mach))
6969 (.str op wstr " #${" src "}")
6970 encoding
6971 (sem divop modop opmode reg src quot rem max min)
6972 ())
6973 )
6974 (define-pmacro (div16-imm-defn smode wstr wbit op divop modop opmode reg quot rem max min opc1 opc2 opc3 opc4 sem)
6975 (div-imm-defn 16 wstr op (.sym Imm-16 - smode)
6976 (+ opc1 opc2 (f-7-1 wbit) opc3 opc4 (.sym Imm-16 - smode))
6977 divop modop opmode reg quot rem max min
6978 sem)
6979 )
6980 (define-pmacro (div32-imm-defn smode wstr wbit op divop modop opmode reg quot rem max min opc1 opc2 opc3 opc4 sem)
6981 (div-imm-defn 32 wstr op (.sym Imm-16 - smode)
6982 (+ (f-0-4 opc1) (f-4-4 opc2) (f-8-3 opc3) (f-11-1 wbit) (f-12-4 opc4) (.sym Imm-16 - smode))
6983 divop modop opmode reg quot rem max min
6984 sem)
6985 )
6986 (define-pmacro (div-imm-mach mach op divop modop opmode max-QI min-QI max-HI min-HI opc1 opc2 opc3 opc4 sem)
6987 (begin
6988 (.apply (.sym div mach -imm-defn) (QI .b 0 op divop modop opmode R0 R0l R0h max-QI min-QI opc1 opc2 opc3 opc4 sem))
6989 (.apply (.sym div mach -imm-defn) (HI .w 1 op divop modop opmode R2R0 R0 R2 max-HI min-HI opc1 opc2 opc3 opc4 sem))
6990 )
6991 )
6992 (define-pmacro (div-imm op divop modop opmode max-QI min-QI max-HI min-HI opc16-1 opc16-2 opc16-3 opc16-4 opc32-1 opc32-2 opc32-3 opc32-4 sem)
6993 (begin
6994 (div-imm-mach 16 op divop modop opmode max-QI min-QI max-HI min-HI opc16-1 opc16-2 opc16-3 opc16-4 sem)
6995 (div-imm-mach 32 op divop modop opmode max-QI min-QI max-HI min-HI opc32-1 opc32-2 opc32-3 opc32-4 sem)
6996 )
6997 )
6998
6999 ;<divop>.size src -- for m16c and m32c
7000 (define-pmacro (div-src-defn mach wstr op src encoding divop modop opmode reg quot rem max min sem)
7001 (dni (.sym op mach wstr - src)
7002 (.str op mach wstr "-" src)
7003 ((machine mach))
7004 (.str op wstr " ${" src "}")
7005 encoding
7006 (sem divop modop opmode reg src quot rem max min)
7007 ())
7008 )
7009 (define-pmacro (div16-src-defn smode wstr wbit op divop modop opmode reg quot rem max min opc1 opc2 opc3 sem)
7010 (div-src-defn 16 wstr op (.sym dst16-16 - smode)
7011 (+ opc1 opc2 (f-7-1 wbit) opc3 (.sym dst16-16 - smode))
7012 divop modop opmode reg quot rem max min
7013 sem)
7014 )
7015 (define-pmacro (div32-src-defn smode wstr wbit op divop modop opmode reg quot rem max min opc1 opc2 opc3 sem)
7016 (begin
7017 ; Multi insns are tried for assembly in the reverse order in which they appear here, so
7018 ; define the absolute-indirect insns first in order to prevent them from being selected
7019 ; when the mode is register-indirect
7020 ; (div-src-defn 32 wstr op (.sym dst32-24-absolute-indirect- smode)
7021 ; (+ (f-0-4 0) (f-4-4 9) (f-8-4 opc1) (f-15-1 wbit) (f-18-2 opc2) (f-20-4 opc3) (.sym dst32-24-absolute-indirect - smode))
7022 ; divop modop opmode reg quot rem max min
7023 ; sem)
7024 (div-src-defn 32 wstr op (.sym dst32-16-Unprefixed- smode)
7025 (+ (f-0-4 opc1) (f-7-1 wbit) (f-10-2 opc2) (f-12-4 opc3) (.sym dst32-16-Unprefixed- smode))
7026 divop modop opmode reg quot rem max min
7027 sem)
7028 ; (div-src-defn 32 wstr op (.sym dst32-24-indirect- smode)
7029 ; (+ (f-0-4 0) (f-4-4 9) (f-8-4 opc1) (f-15-1 wbit) (f-18-2 opc2) (f-20-4 opc3) (.sym dst32-24-indirect - smode))
7030 ; divop modop opmode reg quot rem max min
7031 ; sem)
7032 )
7033 )
7034 (define-pmacro (div-src-mach mach op divop modop opmode max-QI min-QI max-HI min-HI opc1 opc2 opc3 sem)
7035 (begin
7036 (.apply (.sym div mach -src-defn) (QI .b 0 op divop modop opmode R0 R0l R0h max-QI min-QI opc1 opc2 opc3 sem))
7037 (.apply (.sym div mach -src-defn) (HI .w 1 op divop modop opmode R2R0 R0 R2 max-HI min-HI opc1 opc2 opc3 sem))
7038 )
7039 )
7040 (define-pmacro (div-src op divop modop opmode max-QI min-QI max-HI min-HI opc16-1 opc16-2 opc16-3 opc32-1 opc32-2 opc32-3 sem)
7041 (begin
7042 (div-src-mach 16 op divop modop opmode max-QI min-QI max-HI min-HI opc16-1 opc16-2 opc16-3 sem)
7043 (div-src-mach 32 op divop modop opmode max-QI min-QI max-HI min-HI opc32-1 opc32-2 opc32-3 sem)
7044 )
7045 )
7046
7047 ;=============================================================
7048 ; Bit manipulation
7049 ;
7050 (define-pmacro (bit-insn-defn mach op suffix opnd encoding sem)
7051 (dni (.sym op mach - suffix - opnd)
7052 (.str op mach ":" suffix " " opnd)
7053 ((machine mach))
7054 (.str op "$" suffix " ${" opnd "}")
7055 encoding
7056 (sem opnd)
7057 ())
7058 )
7059
7060 (define-pmacro (bitsrc16-defn op opc1 opc2 opc3 sem)
7061 (bit-insn-defn 16 op X bit16-16
7062 (+ opc1 opc2 opc3 bit16-16)
7063 sem)
7064 )
7065
7066 (define-pmacro (bitsrc32-defn op opc1 opc2 opc3 sem)
7067 (begin
7068 (bit-insn-defn 32 op X bit32-24-Prefixed
7069 (+ (f-0-4 0) (f-4-4 1) (f-8-4 opc1) bit32-24-Prefixed (f-15-1 opc2) (f-18-3 opc3))
7070 sem)
7071 )
7072 )
7073
7074 (define-pmacro (bitsrc-insn op opc16-1 opc16-2 opc16-3 opc32-1 opc32-2 opc32-3 sem)
7075 (begin
7076 (bitsrc16-defn op opc16-1 opc16-2 opc16-3 sem)
7077 (bitsrc32-defn op opc32-1 opc32-2 opc32-3 sem)
7078 )
7079 )
7080
7081 (define-pmacro (bitdst16-defn op opc1 opc2 opc3 opc4 opc5 opc6 sem)
7082 (begin
7083 (bit-insn-defn 16 op G bit16-16-basic (+ opc1 opc2 opc3 bit16-16-basic) sem)
7084 (bit-insn-defn 16 op G bit16-16-16 (+ opc1 opc2 opc3 bit16-16-16) sem)
7085 (bit-insn-defn 16 op S bit16-11-S (+ opc4 opc5 opc6 bit16-11-S) sem)
7086 (bit-insn-defn 16 op G bit16-16-8 (+ opc1 opc2 opc3 bit16-16-8) sem)
7087 )
7088 )
7089
7090 (define-pmacro (bitdst32-defn op opc1 opc2 opc3 sem)
7091 (begin
7092 (bit-insn-defn 32 op X bit32-16-Unprefixed
7093 (+ (f-0-4 opc1) bit32-16-Unprefixed (f-7-1 opc2) (f-10-3 opc3))
7094 sem)
7095 )
7096 )
7097
7098 (define-pmacro (bitdstnos-insn op opc16-1 opc16-2 opc16-3 opc32-1 opc32-2 opc32-3 sem)
7099 (begin
7100 (bitsrc16-defn op opc16-1 opc16-2 opc16-3 sem)
7101 (bitdst32-defn op opc32-1 opc32-2 opc32-3 sem)
7102 )
7103 )
7104
7105 (define-pmacro (bitdst-insn op opc16-1 opc16-2 opc16-3 opc16-4 opc16-5 opc16-6 opc32-1 opc32-2 opc32-3 sem)
7106 (begin
7107 (bitdst16-defn op opc16-1 opc16-2 opc16-3 opc16-4 opc16-5 opc16-6 sem)
7108 (bitdst32-defn op opc32-1 opc32-2 opc32-3 sem)
7109 )
7110 )
7111
7112 ;=============================================================
7113 ; Bit condition
7114 ;
7115 (define-pmacro (bitcond-insn-defn mach op bit-opnd cond-opnd encoding sem)
7116 (dni (.sym op mach - bit-opnd - cond-opnd)
7117 (.str op mach " " bit-opnd " " cond-opnd)
7118 ((machine mach))
7119 (.str op "${" cond-opnd "} ${" bit-opnd "}")
7120 encoding
7121 (sem mach bit-opnd cond-opnd)
7122 ())
7123 )
7124
7125 (define-pmacro (bitcond16-defn op opc1 opc2 opc3 sem)
7126 (begin
7127 (bitcond-insn-defn 16 op bit16-16-basic cond16-16 (+ opc1 opc2 opc3 bit16-16-basic cond16-16) sem)
7128 (bitcond-insn-defn 16 op bit16-16-16 cond16-32 (+ opc1 opc2 opc3 bit16-16-16 cond16-32) sem)
7129 (bitcond-insn-defn 16 op bit16-16-8 cond16-24 (+ opc1 opc2 opc3 bit16-16-8 cond16-24) sem)
7130 )
7131 )
7132
7133 (define-pmacro (bitcond32-defn op opc1 opc2 opc3 sem)
7134 (begin
7135 (bitcond-insn-defn 32 op bit32-16-24-Unprefixed cond32-40
7136 (+ (f-0-4 opc1) bit32-16-24-Unprefixed (f-7-1 opc2) (f-10-3 opc3) cond32-40)
7137 sem)
7138 (bitcond-insn-defn 32 op bit32-16-16-Unprefixed cond32-32
7139 (+ (f-0-4 opc1) bit32-16-16-Unprefixed (f-7-1 opc2) (f-10-3 opc3) cond32-32)
7140 sem)
7141 (bitcond-insn-defn 32 op bit32-16-8-Unprefixed cond32-24
7142 (+ (f-0-4 opc1) bit32-16-8-Unprefixed (f-7-1 opc2) (f-10-3 opc3) cond32-24)
7143 sem)
7144 (bitcond-insn-defn 32 op bit32-basic-Unprefixed cond32-16
7145 (+ (f-0-4 opc1) bit32-basic-Unprefixed (f-7-1 opc2) (f-10-3 opc3) cond32-16)
7146 sem)
7147 )
7148 )
7149
7150 (define-pmacro (bitcond-insn op opc16-1 opc16-2 opc16-3 opc32-1 opc32-2 opc32-3 sem)
7151 (begin
7152 (bitcond16-defn op opc16-1 opc16-2 opc16-3 sem)
7153 (bitcond32-defn op opc32-1 opc32-2 opc32-3 sem)
7154 )
7155 )
7156
7157 ;=============================================================
7158 ;<insn>.size #imm1,#imm2,dst -- for m32c
7159 ;
7160 (define-pmacro (insn-imm1-imm2-dst-defn src1 src2 dstgroup xmode wstr op encoding sem)
7161 (dni (.sym op 32 wstr - src1 - src2 - dstgroup)
7162 (.str op 32 wstr "-" src1 "-" src2 "-" dstgroup "-" xmode)
7163 ((machine 32))
7164 (.str op wstr " #${" src1 "},#${" src2 "},${dst32-" dstgroup "-" xmode "}")
7165 encoding
7166 (sem xmode src1 src2 (.sym dst32- dstgroup - xmode))
7167 ())
7168 )
7169
7170 ; m32c Prefixed variants
7171 (define-pmacro (insn32-imm1-imm2-dst-Prefixed-defn xmode wstr wbit base1 base2 base3 base4 op opc1 opc2 opc3 sem)
7172 (begin
7173 (insn-imm1-imm2-dst-defn (.sym Imm-48- xmode) (.sym Imm- base4 - xmode) 24-24-Prefixed xmode wstr op
7174 (+ (f-0-4 0) (f-4-4 1) (f-8-4 opc1) (f-18-2 opc2) (f-15-1 wbit) (f-20-4 opc3)
7175 (.sym dst32-24-24-Prefixed- xmode) (.sym Imm-48- xmode) (.sym Imm- base4 - xmode))
7176 sem)
7177 (insn-imm1-imm2-dst-defn (.sym Imm-40- xmode) (.sym Imm- base3 - xmode) 24-16-Prefixed xmode wstr op
7178 (+ (f-0-4 0) (f-4-4 1) (f-8-4 opc1) (f-18-2 opc2) (f-15-1 wbit) (f-20-4 opc3)
7179 (.sym dst32-24-16-Prefixed- xmode) (.sym Imm-40- xmode) (.sym Imm- base3 - xmode))
7180 sem)
7181 (insn-imm1-imm2-dst-defn (.sym Imm-32- xmode) (.sym Imm- base2 - xmode) 24-8-Prefixed xmode wstr op
7182 (+ (f-0-4 0) (f-4-4 1) (f-8-4 opc1) (f-18-2 opc2) (f-15-1 wbit) (f-20-4 opc3)
7183 (.sym dst32-24-8-Prefixed- xmode) (.sym Imm-32- xmode) (.sym Imm- base2 - xmode))
7184 sem)
7185 (insn-imm1-imm2-dst-defn (.sym Imm-24- xmode) (.sym Imm- base1 - xmode) basic-Prefixed xmode wstr op
7186 (+ (f-0-4 0) (f-4-4 1) (f-8-4 opc1) (f-18-2 opc2) (f-15-1 wbit) (f-20-4 opc3)
7187 (.sym dst32-basic-Prefixed- xmode) (.sym Imm-24- xmode) (.sym Imm- base1 - xmode))
7188 sem)
7189 )
7190 )
7191
7192 ; m32c Unprefixed variants
7193 (define-pmacro (insn32-imm1-imm2-dst-Unprefixed-defn xmode wstr wbit base1 base2 base3 base4 op opc1 opc2 opc3 sem)
7194 (begin
7195 (insn-imm1-imm2-dst-defn (.sym Imm-40- xmode) (.sym Imm- base4 - xmode) 16-24-Unprefixed xmode wstr op
7196 (+ (f-0-4 opc1) (f-10-2 opc2) (f-7-1 wbit) (f-12-4 opc3)
7197 (.sym dst32-16-24-Unprefixed- xmode) (.sym Imm-40- xmode) (.sym Imm- base4 - xmode))
7198 sem)
7199 (insn-imm1-imm2-dst-defn (.sym Imm-32- xmode) (.sym Imm- base3 - xmode) 16-16-Unprefixed xmode wstr op
7200 (+ (f-0-4 opc1) (f-10-2 opc2) (f-7-1 wbit) (f-12-4 opc3)
7201 (.sym dst32-16-16-Unprefixed- xmode) (.sym Imm-32- xmode) (.sym Imm- base3 - xmode))
7202 sem)
7203 (insn-imm1-imm2-dst-defn (.sym Imm-24- xmode) (.sym Imm- base2 - xmode) 16-8-Unprefixed xmode wstr op
7204 (+ (f-0-4 opc1) (f-10-2 opc2) (f-7-1 wbit) (f-12-4 opc3)
7205 (.sym dst32-16-8-Unprefixed- xmode) (.sym Imm-24- xmode) (.sym Imm- base2 - xmode))
7206 sem)
7207 (insn-imm1-imm2-dst-defn (.sym Imm-16- xmode) (.sym Imm- base1 - xmode) basic-Unprefixed xmode wstr op
7208 (+ (f-0-4 opc1) (f-10-2 opc2) (f-7-1 wbit) (f-12-4 opc3)
7209 (.sym dst32-basic-Unprefixed- xmode) (.sym Imm-16- xmode) (.sym Imm- base1 - xmode))
7210 sem)
7211 )
7212 )
7213
7214 (define-pmacro (insn-imm1-imm2-dst-Prefixed op opc32-1 opc32-2 opc32-3 sem)
7215 (begin
7216 (insn32-imm1-imm2-dst-Prefixed-defn QI .b 0 32 40 48 56 op opc32-1 opc32-2 opc32-3 sem)
7217 (insn32-imm1-imm2-dst-Prefixed-defn HI .w 1 40 48 56 64 op opc32-1 opc32-2 opc32-3 sem)
7218 )
7219 )
7220 (define-pmacro (insn-imm1-imm2-dst-Unprefixed op opc32-1 opc32-2 opc32-3 sem)
7221 (begin
7222 (insn32-imm1-imm2-dst-Unprefixed-defn QI .b 0 24 32 40 48 op opc32-1 opc32-2 opc32-3 sem)
7223 (insn32-imm1-imm2-dst-Unprefixed-defn HI .w 1 32 40 48 56 op opc32-1 opc32-2 opc32-3 sem)
7224 )
7225 )
7226
7228 ;=============================================================
7229 ; Insn definitions
7230 ;-------------------------------------------------------------
7231 ; abs - absolute
7232 ;-------------------------------------------------------------
7233
7234 (define-pmacro (abs-sem mode dst)
7235 (sequence ((mode result))
7236 (set result (abs mode dst))
7237 (set obit (eq result dst))
7238 (set-z-and-s result)
7239 (set dst result))
7240 )
7241 (unary-insn abs (f-0-4 7) (f-4-3 3) (f-8-4 #xF) #xA #x1 #xF abs-sem)
7242
7243 ;-------------------------------------------------------------
7244 ; adcf - addition carry flag
7245 ;-------------------------------------------------------------
7246
7247 (define-pmacro (adcf-sem mode dst)
7248 (sequence ((mode result))
7249 (set result (addc mode dst 0 cbit))
7250 (set obit (add-oflag mode dst 0 cbit))
7251 (set cbit (add-cflag mode dst 0 cbit))
7252 (set-z-and-s result)
7253 (set dst result))
7254 )
7255 (unary-insn adcf (f-0-4 7) (f-4-3 3) (f-8-4 #xE) #xB #x1 #xE adcf-sem)
7256
7257 ;-------------------------------------------------------------
7258 ; add - binary addition
7259 ;-------------------------------------------------------------
7260
7261 (define-pmacro (add-sem mode src1 dst)
7262 (sequence ((mode result))
7263 (set result (add mode src1 dst))
7264 (set obit (add-oflag mode src1 dst 0))
7265 (set cbit (add-cflag mode src1 dst 0))
7266 (set-z-and-s result)
7267 (set dst result))
7268 )
7269
7270 ; add.L:G #imm32,dst (m32 #2)
7271 (binary-arith32-imm-dst-defn SI SI .l 0 add G #x8 #x3 #x1 add-sem)
7272 ; add.size:G #imm,dst (m16 #1 m32 #1)
7273 (binary-arith-imm-dst add G (f-0-4 7) (f-4-3 3) (f-8-4 4) #x8 #x2 #xE add-sem)
7274 ; add.size:Q #imm4,dst (m16 #2 m32 #3)
7275 (binary-arith-imm4-dst add (f-0-4 #xC) (f-4-3 4) #x7 #x3 add-sem)
7276 (binary-arith32-imm4-dst-defn SI .l 1 0 add #x7 #x3 add-sem)
7277 ; add.b:S #imm8,dst3 (m16 #3)
7278 (binary-arith16-b-S-imm8-dst3 add ".b" (f-0-4 8) (f-4-1 0) add-sem)
7279 ; add.BW:Q #imm4,sp (m16 #7)
7280 (binary-arith16-Q-sp add (f-0-4 7) (f-4-4 #xD) (f-8-4 #xB) add-sem)
7281 (dnmi add16-bQ-sp "add16-bQ-sp" ()
7282 "add.b:q #${Imm-12-s4},sp"
7283 (emit add16-wQ-sp Imm-12-s4))
7284 ; add.BW:G #imm,sp (m16 #6)
7285 (binary-arith16-G-sp add (f-0-4 7) (f-4-3 6) (f-8-4 #xE) (f-12-4 #xB) add-sem)
7286 ; add.BW:G src,dst (m16 #4 m32 #6)
7287 (binary-arith-src-dst add G (f-0-4 #xA) (f-4-3 0) #x1 #x8 add-sem)
7288 ; add.B.S src2,r0l/r0h (m16 #5)
7289 (binary-arith16-b-S-src2 add (f-0-4 2) (f-4-1 0) add-sem)
7290 ; add.L:G src,dst (m32 #7)
7291 (binary-arith32-src-dst-defn SI SI .l 1 add G #x1 #x2 add-sem)
7292 ; add.L:S #imm{1,2},A0/A1 (m32 #5)
7293 (binary-arith32-l-s-imm1-an add (f-0-2 2) (f-3-4 6) add-sem)
7294 ; add.L:Q #imm3,sp (m32 #9)
7295 (binary-arith32-l-q-imm3-sp add (f-0-2 1) (f-4-3 1) add-sem)
7296 ; add.L:S #imm8,sp (m32 #10)
7297 (binary-arith32-l-s-imm8-sp add (f-0-4 #xb) (f-4-4 6) (f-8-4 0) (f-12-4 3) add-sem)
7298 ; add.L:G #imm16,sp (m32 #8)
7299 (binary-arith32-l-g-imm16-sp add (f-0-4 #xb) (f-4-4 6) (f-8-4 1) (f-12-4 3) add-sem)
7300 ; add.BW:S #imm,dst2 (m32 #4)
7301 (binary-arith32-s-imm-dst QI .b 0 add #x0 #x3 add-sem)
7302 (binary-arith32-s-imm-dst HI .w 1 add #x0 #x3 add-sem)
7303
7304 ;-------------------------------------------------------------
7305 ; adc - binary add with carry
7306 ;-------------------------------------------------------------
7307
7308 (define-pmacro (addc-sem mode src dst)
7309 (sequence ((mode result))
7310 (set result (addc mode src dst cbit))
7311 (set obit (add-oflag mode src dst cbit))
7312 (set cbit (add-cflag mode src dst cbit))
7313 (set-z-and-s result)
7314 (set dst result))
7315 )
7316
7317 ; adc.size:G #imm,dst
7318 (binary-arith16-imm-dst-defn QI QI .b 0 adc X (f-0-4 7) (f-4-3 3) (f-8-4 6) addc-sem)
7319 (binary-arith16-imm-dst-defn HI HI .w 1 adc X (f-0-4 7) (f-4-3 3) (f-8-4 6) addc-sem)
7320 (binary-arith32-imm-dst-Prefixed QI QI .b 0 adc X #x8 #x2 #xE addc-sem)
7321 (binary-arith32-imm-dst-Prefixed HI HI .w 1 adc X #x8 #x2 #xE addc-sem)
7322
7323 ; adc.BW:G src,dst
7324 (binary-arith16-src-dst-defn QI QI .b 0 adc X (f-0-4 #xB) (f-4-3 0) addc-sem)
7325 (binary-arith16-src-dst-defn HI HI .w 1 adc X (f-0-4 #xB) (f-4-3 0) addc-sem)
7326 (binary-arith32-src-dst-Prefixed QI QI .b 0 adc X #x1 #x4 addc-sem)
7327 (binary-arith32-src-dst-Prefixed HI HI .w 1 adc X #x1 #x4 addc-sem)
7328
7329 ;-------------------------------------------------------------
7330 ; dadc - decimal add with carry
7331 ; dadd - decimal addition
7332 ;-------------------------------------------------------------
7333
7334 (define-pmacro (dadc-sem mode src dst)
7335 (sequence ((mode result))
7336 (set result (subc mode dst src (not cbit)))
7337 (set cbit (sub-cflag mode dst src (not cbit)))
7338 (set-z-and-s result)
7339 (set dst result))
7340 )
7341
7342 (define-pmacro (decimal-subtraction16-insn op opc1 opc2)
7343 (begin
7344 ; op.b #imm8,r0l
7345 (dni (.sym op 16.b-imm8)
7346 (.str op ".b #imm8")
7347 ((machine 16))
7348 (.str op ".b #${Imm-16-QI},r0l")
7349 (+ (f-0-4 #x7) (f-4-4 #xC) (f-8-4 #xE) (f-12-4 opc1) Imm-16-QI)
7350 ((.sym op -sem) QI Imm-16-QI R0l)
7351 ())
7352 ; op.w #imm16,r0
7353 (dni (.sym op 16.w-imm16)
7354 (.str op ".b #imm16")
7355 ((machine 16))
7356 (.str op ".w #${Imm-16-HI},r0")
7357 (+ (f-0-4 #x7) (f-4-4 #xD) (f-8-4 #xE) (f-12-4 opc1) Imm-16-HI)
7358 ((.sym op -sem) HI Imm-16-HI R0)
7359 ())
7360 ; op.b #r0h,r0l
7361 (dni (.sym op 16.b-r0h-r0l)
7362 (.str op ".b r0h,r0l")
7363 ((machine 16))
7364 (.str op ".b r0h,r0l")
7365 (+ (f-0-4 #x7) (f-4-4 #xC) (f-8-4 #xE) (f-12-4 opc2))
7366 ((.sym op -sem) QI R0h R0l)
7367 ())
7368 ; op.w #r1,r0
7369 (dni (.sym op 16.w-r1-r0)
7370 (.str op ".b r1,r0")
7371 ((machine 16))
7372 (.str op ".w r1,r0")
7373 (+ (f-0-4 #x7) (f-4-4 #xD) (f-8-4 #xE) (f-12-4 opc2))
7374 ((.sym op -sem) HI R1 R0)
7375 ())
7376 )
7377 )
7378
7379 ; dadc for m16c
7380 (decimal-subtraction16-insn dadc #xE #x6 )
7381
7382 ; dadc.size #imm,dst
7383 (binary-arith32-imm-dst-Prefixed QI QI .b 0 dadc X #x8 #x0 #xE dadc-sem)
7384 (binary-arith32-imm-dst-Prefixed HI HI .w 1 dadc X #x8 #x0 #xE dadc-sem)
7385 ; dadc.BW src,dst
7386 (binary-arith32-src-dst-Prefixed QI QI .b 0 dadc X #x1 #x8 dadc-sem)
7387 (binary-arith32-src-dst-Prefixed HI HI .w 1 dadc X #x1 #x8 dadc-sem)
7388
7389 (define-pmacro (dadd-sem mode src dst)
7390 (sequence ((mode result))
7391 (set result (subc mode dst src 0))
7392 (set cbit (sub-cflag mode dst src 0))
7393 (set-z-and-s result)
7394 (set dst result))
7395 )
7396
7397 ; dadd for m16c
7398 (decimal-subtraction16-insn dadd #xC #x4)
7399
7400 ; dadd.size #imm,dst
7401 (binary-arith32-imm-dst-Prefixed QI QI .b 0 dadd X #x8 #x1 #xE dadd-sem)
7402 (binary-arith32-imm-dst-Prefixed HI HI .w 1 dadd X #x8 #x1 #xE dadd-sem)
7403 ; dadd.BW src,dst
7404 (binary-arith32-src-dst-Prefixed QI QI .b 0 dadd X #x1 #x0 dadd-sem)
7405 (binary-arith32-src-dst-Prefixed HI HI .w 1 dadd X #x1 #x0 dadd-sem)
7406
7407 ;-------------------------------------------------------------;
7408 ; addx - Add extend sign with no carry
7409 ;-------------------------------------------------------------;
7410
7411 (define-pmacro (addx-sem mode src dst)
7412 (sequence ((SI source) (SI result))
7413 (set source (zext SI (trunc QI src)))
7414 (set result (add SI source dst))
7415 (set obit (add-oflag SI source dst 0))
7416 (set cbit (add-cflag SI source dst 0))
7417 (set-z-and-s result)
7418 (set dst result))
7419 )
7420
7421 ; addx #imm,dst
7422 (binary-arith32-imm-dst-defn QI SI "" 0 addx X #x8 #x1 #x1 addx-sem)
7423 ; addx src,dst
7424 (binary-arith32-src-dst-defn QI SI "" 0 addx X #x1 #x2 addx-sem)
7425
7426 ;-------------------------------------------------------------
7427 ; adjnz - Add/Sub and branch if not zero
7428 ;-------------------------------------------------------------
7429
7430 (define-pmacro (arith-jnz-sem mode src dst label)
7431 (sequence ((mode result))
7432 (set result (add mode src dst))
7433 (set dst result)
7434 (if (ne result 0)
7435 (set pc label)))
7436 )
7437
7438 ; adjnz.size #imm4,dst,label
7439 (arith-jnz-imm4-dst adjnz s4 (f-0-4 #xF) (f-4-3 4) #xf #x1 arith-jnz-sem)
7440
7441 ;-------------------------------------------------------------
7442 ; and - binary and
7443 ;-------------------------------------------------------------
7444
7445 (define-pmacro (and-sem mode src1 dst)
7446 (sequence ((mode result))
7447 (set result (and mode src1 dst))
7448 (set-z-and-s result)
7449 (set dst result))
7450 )
7451
7452 ; and.size:G #imm,dst (m16 #1 m32 #1)
7453 (binary-arith-imm-dst and G (f-0-4 7) (f-4-3 3) (f-8-4 2) #x8 #x3 #xF and-sem)
7454 ; and.b:S #imm8,dst3 (m16 #2)
7455 (binary-arith16-b-S-imm8-dst3 and ".b" (f-0-4 9) (f-4-1 0) and-sem)
7456 ; and.BW:G src,dst (m16 #3 m32 #3)
7457 (binary-arith-src-dst and G (f-0-4 #x9) (f-4-3 0) #x1 #xD and-sem)
7458 ; and.B.S src2,r0l/r0h (m16 #4)
7459 (binary-arith16-b-S-src2 and (f-0-4 1) (f-4-1 0) and-sem)
7460 ; and.BW:S #imm,dst2 (m32 #2)
7461 (binary-arith32-s-imm-dst QI .b 0 and #x1 #x6 and-sem)
7462 (binary-arith32-s-imm-dst HI .w 1 and #x1 #x6 and-sem)
7463
7464 ;-------------------------------------------------------------
7465 ; band - bit and
7466 ;-------------------------------------------------------------
7467
7468 (define-pmacro (band-sem src)
7469 (set cbit (and src cbit))
7470 )
7471 (bitsrc-insn band (f-0-4 7) (f-4-4 #xE) (f-8-4 4) #xD #x0 #x1 band-sem)
7472
7473 ;-------------------------------------------------------------
7474 ; bclr - bit clear
7475 ;-------------------------------------------------------------
7476
7477 (define-pmacro (bclr-sem dst)
7478 (set dst 0)
7479 )
7480 (bitdst-insn bclr (f-0-4 7) (f-4-4 #xE) (f-8-4 8) (f-0-2 1) (f-2-2 0) (f-4-1 0) #xD #x0 #x6 bclr-sem)
7481
7482 ;-------------------------------------------------------------
7483 ; bitindex - bit index
7484 ;-------------------------------------------------------------
7485
7486 (define-pmacro (bitindex-sem mode dst)
7487 (set BitIndex dst)
7488 )
7489 (unary-insn-defn 32 16-Unprefixed QI .b bitindex
7490 (+ (f-0-4 #xC) (f-7-1 0) dst32-16-Unprefixed-QI (f-10-2 #x2) (f-12-4 #xE))
7491 bitindex-sem)
7492 (unary-insn-defn 32 16-Unprefixed HI .w bitindex
7493 (+ (f-0-4 #xC) (f-7-1 1) dst32-16-Unprefixed-HI (f-10-2 #x2) (f-12-4 #xE))
7494 bitindex-sem)
7495
7496 ;-------------------------------------------------------------
7497 ; bmCnd - bit move condition
7498 ;-------------------------------------------------------------
7499
7500 (define-pmacro (test-condition16 cond)
7501 (case UQI cond
7502 ((#x00) (trunc BI cbit))
7503 ((#x01) (not (or cbit zbit)))
7504 ((#x02) (trunc BI zbit))
7505 ((#x03) (trunc BI sbit))
7506 ((#x04) (or zbit (xor sbit obit)))
7507 ((#x05) (trunc BI obit))
7508 ((#x06) (xor sbit obit))
7509 ((#xf8) (not cbit))
7510 ((#xf9) (or cbit zbit))
7511 ((#xfa) (not zbit))
7512 ((#xfb) (not sbit))
7513 ((#xfc) (not (or zbit (xor sbit obit))))
7514 ((#xfd) (not obit))
7515 ((#xfe) (not (xor sbit obit)))
7516 (else (const BI 0))
7517 )
7518 )
7519
7520 (define-pmacro (test-condition32 cond)
7521 (case UQI cond
7522 ((#x00) (not cbit))
7523 ((#x01) (or cbit zbit))
7524 ((#x02) (not zbit))
7525 ((#x03) (not sbit))
7526 ((#x04) (not obit))
7527 ((#x05) (not (or zbit (xor sbit obit))))
7528 ((#x06) (not (xor sbit obit)))
7529 ((#x08) (trunc BI cbit))
7530 ((#x09) (not (or cbit zbit)))
7531 ((#x0a) (trunc BI zbit))
7532 ((#x0b) (trunc BI sbit))
7533 ((#x0c) (trunc BI obit))
7534 ((#x0d) (or zbit (xor sbit obit)))
7535 ((#x0e) (xor sbit obit))
7536 (else (const BI 0))
7537 )
7538 )
7539
7540 (define-pmacro (bitcond-sem mach op cond)
7541 (if ((.sym test-condition mach) cond)
7542 (set op 1)
7543 (set op 0))
7544 )
7545 (bitcond-insn bm (f-0-4 7) (f-4-4 #xE) (f-8-4 2) #xD #x0 #x2 bitcond-sem)
7546
7547 (dni bm16-c
7548 "bm16 C"
7549 ((machine 16))
7550 "bm$cond16c c"
7551 (+ (f-0-4 #x7) (f-4-4 #xD) (f-8-4 #xD) cond16c)
7552 (bitcond-sem 16 cbit cond16c)
7553 ())
7554
7555 (dni bm32-c
7556 "bm32 C"
7557 ((machine 32))
7558 "bm$cond32 c"
7559 (+ (f-0-4 #xD) (f-4-4 #x9) (f-8-1 0) (f-10-3 5) cond32)
7560 (bitcond-sem 32 cbit cond32)
7561 ())
7562
7563 ;-------------------------------------------------------------
7564 ; bnand
7565 ;-------------------------------------------------------------
7566
7567 (define-pmacro (bnand-sem src)
7568 (set cbit (and (inv src) cbit))
7569 )
7570 (bitsrc-insn bnand (f-0-4 7) (f-4-4 #xE) (f-8-4 5) #xD #x0 #x3 bnand-sem)
7571
7572 ;-------------------------------------------------------------
7573 ; bnor
7574 ;-------------------------------------------------------------
7575
7576 (define-pmacro (bnor-sem src)
7577 (set cbit (or (inv src) cbit))
7578 )
7579 (bitsrc-insn bnor (f-0-4 7) (f-4-4 #xE) (f-8-4 7) #xD #x0 #x6 bnor-sem)
7580
7581 ;-------------------------------------------------------------
7582 ; bnot
7583 ;-------------------------------------------------------------
7584
7585 (define-pmacro (bnot-sem dst)
7586 (set dst (inv dst))
7587 )
7588 (bitdst-insn bnot (f-0-4 7) (f-4-4 #xE) (f-8-4 #xA) (f-0-2 1) (f-2-2 1) (f-4-1 0) #xD #x0 #x3 bnot-sem)
7589
7590 ;-------------------------------------------------------------
7591 ; bntst
7592 ;-------------------------------------------------------------
7593
7594 (define-pmacro (bntst-sem src)
7595 (set cbit (inv src))
7596 (set zbit (inv src))
7597 )
7598 (bitsrc-insn bntst (f-0-4 7) (f-4-4 #xE) (f-8-4 3) #xD #x0 #x0 bntst-sem)
7599
7600 ;-------------------------------------------------------------
7601 ; bnxor
7602 ;-------------------------------------------------------------
7603
7604 (define-pmacro (bnxor-sem src)
7605 (set cbit (xor (inv src) cbit))
7606 )
7607 (bitsrc-insn bnxor (f-0-4 7) (f-4-4 #xE) (f-8-4 #xD) #xD #x0 #x7 bnxor-sem)
7608
7609 ;-------------------------------------------------------------
7610 ; bor
7611 ;-------------------------------------------------------------
7612
7613 (define-pmacro (bor-sem src)
7614 (set cbit (or src cbit))
7615 )
7616 (bitsrc-insn bor (f-0-4 7) (f-4-4 #xE) (f-8-4 #x6) #xD #x0 #x4 bor-sem)
7617
7618 ;-------------------------------------------------------------
7619 ; brk
7620 ;-------------------------------------------------------------
7621
7622 (dni brk16
7623 "brk"
7624 ((machine 16))
7625 "brk"
7626 (+ (f-0-4 #x0) (f-4-4 #x0))
7627 (nop)
7628 ())
7629
7630 (dni brk32
7631 "brk"
7632 ((machine 32))
7633 "brk"
7634 (+ (f-0-4 #x0) (f-4-4 #x0))
7635 (nop)
7636 ())
7637
7638 ;-------------------------------------------------------------
7639 ; brk2
7640 ;-------------------------------------------------------------
7641
7642 (dni brk232
7643 "brk2"
7644 ((machine 32))
7645 "brk2"
7646 (+ (f-0-4 #x0) (f-4-4 #x8))
7647 (nop)
7648 ())
7649
7650 ;-------------------------------------------------------------
7651 ; bset
7652 ;-------------------------------------------------------------
7653
7654 (define-pmacro (bset-sem dst)
7655 (set dst 1)
7656 )
7657 (bitdst-insn bset (f-0-4 7) (f-4-4 #xE) (f-8-4 9) (f-0-2 1) (f-2-2 0) (f-4-1 1) #xD #x0 #x7 bset-sem)
7658
7659 ;-------------------------------------------------------------
7660 ; btst
7661 ;-------------------------------------------------------------
7662
7663 (define-pmacro (btst-sem dst)
7664 (set zbit (inv dst))
7665 (set cbit dst)
7666 )
7667 (bitdst16-defn btst (f-0-4 7) (f-4-4 #xE) (f-8-4 #xB) (f-0-2 1) (f-2-2 1) (f-4-1 1) btst-sem)
7668
7669 (bit-insn-defn 32 btst G bit32-16-Unprefixed
7670 (+ (f-0-4 #xD) bit32-16-Unprefixed (f-7-1 #x0) (f-10-3 #x0))
7671 btst-sem)
7672
7673 (dni btst.s "btst:s" ((machine 32))
7674 "btst:s ${Bit3-S},${Dsp-8-u16}"
7675 (+ (f-0-2 #x0) (f-4-3 #x5) Bit3-S Dsp-8-u16)
7676 () ())
7677
7678 ;-------------------------------------------------------------
7679 ; btstc
7680 ;-------------------------------------------------------------
7681
7682 (define-pmacro (btstc-sem dst)
7683 (set zbit (inv dst))
7684 (set cbit dst)
7685 (set dst (const 0))
7686 )
7687 (bitdstnos-insn btstc (f-0-4 7) (f-4-4 #xE) (f-8-4 #x0) #xD #x0 #x4 btstc-sem)
7688
7689 ;-------------------------------------------------------------
7690 ; btsts
7691 ;-------------------------------------------------------------
7692
7693 (define-pmacro (btsts-sem dst)
7694 (set zbit (inv dst))
7695 (set cbit dst)
7696 (set dst (const 0))
7697 )
7698 (bitdstnos-insn btsts (f-0-4 7) (f-4-4 #xE) (f-8-4 #x1) #xD #x0 #x5 btsts-sem)
7699
7700 ;-------------------------------------------------------------
7701 ; bxor
7702 ;-------------------------------------------------------------
7703
7704 (define-pmacro (bxor-sem src)
7705 (set cbit (xor src cbit))
7706 )
7707 (bitsrc-insn bxor (f-0-4 7) (f-4-4 #xE) (f-8-4 #xC) #xD #x0 #x5 bxor-sem)
7708
7709 ;-------------------------------------------------------------
7710 ; clip
7711 ;-------------------------------------------------------------
7712
7713 (define-pmacro (clip-sem mode imm1 imm2 dest)
7714 (sequence ()
7715 (if (gt mode imm1 dest)
7716 (set dest imm1))
7717 (if (lt mode imm2 dest)
7718 (set dest imm2)))
7719 )
7720
7721 (insn-imm1-imm2-dst-Prefixed clip #x8 #x3 #xE clip-sem)
7722
7723 ;-------------------------------------------------------------
7724 ; cmp - binary compare
7725 ;-------------------------------------------------------------
7726
7727 (define-pmacro (cmp-sem mode src1 dst)
7728 (sequence ((mode result))
7729 (set result (sub mode dst src1))
7730 (set obit (sub-oflag mode dst src1 0))
7731 (set cbit (not (sub-cflag mode dst src1 0)))
7732 (set-z-and-s result))
7733 )
7734
7735 ; cmp.L:G #imm32,dst (m32 #2)
7736 (binary-arith32-imm-dst-defn SI SI .l 0 cmp G #xA #x3 #x1 cmp-sem)
7737 ; cmp.size:G #imm,dst (m16 #1 m32 #1)
7738 (binary-arith-imm-dst cmp G (f-0-4 7) (f-4-3 3) (f-8-4 8) #x9 #x2 #xE cmp-sem)
7739 ; cmp.size:Q #imm4,dst (m16 #2 m32 #3)
7740 (binary-arith-imm4-dst cmp (f-0-4 #xD) (f-4-3 0) #x7 #x1 cmp-sem)
7741 ; cmp.b:S #imm8,dst3 (m16 #3)
7742 (binary-arith16-b-S-imm8-dst3 cmp ".b" (f-0-4 #xE) (f-4-1 0) cmp-sem)
7743 ; cmp.BW:G src,dst (m16 #4 m32 #5)
7744 (binary-arith-src-dst cmp G (f-0-4 #xC) (f-4-3 0) #x1 #x6 cmp-sem)
7745 ; cmp.B.S src2,r0l/r0h (m16 #5)
7746 (binary-arith16-b-S-src2 cmp (f-0-4 3) (f-4-1 1) cmp-sem)
7747 ; cmp.L:G src,dst (m32 #6)
7748 (binary-arith32-src-dst-defn SI SI .l 1 cmp G #x1 #x1 cmp-sem)
7749 ; cmp.BW:S #imm,dst2 (m32 #4)
7750 (binary-arith32-s-imm-dst QI .b 0 cmp #x1 #x3 cmp-sem)
7751 (binary-arith32-s-imm-dst HI .w 1 cmp #x1 #x3 cmp-sem)
7752 ; cmp.BW:s src2,r0[l] (m32 #7)
7753 (binary-arith32-S-src2 cmp QI .b 0 (f-0-2 1) (f-4-3 0) cmp-sem)
7754 (binary-arith32-S-src2 cmp HI .w 1 (f-0-2 1) (f-4-3 0) cmp-sem)
7755
7756 ;-------------------------------------------------------------
7757 ; cmpx - binary compare extend sign
7758 ;-------------------------------------------------------------
7759
7760 (define-pmacro (cmpx-sem mode src1 dst)
7761 (sequence ((mode result))
7762 (set result (sub mode dst (ext mode src1)))
7763 (set obit (sub-oflag mode dst (ext mode src1) 0))
7764 (set cbit (sub-cflag mode dst (ext mode src1) 0))
7765 (set-z-and-s result))
7766 )
7767
7768 (binary-arith32-imm-dst-defn QI SI "" 0 cmpx X #xA #x1 #x1 cmpx-sem)
7769
7770 ;-------------------------------------------------------------
7771 ; dec - decrement
7772 ;-------------------------------------------------------------
7773
7774 (define-pmacro (dec-sem mode dest)
7775 (sequence ((mode result))
7776 (set result (sub mode dest 1))
7777 (set-z-and-s result)
7778 (set dest result))
7779 )
7780
7781 (dni dec16.b
7782 "dec.b Dst16-3-S-8"
7783 ((machine 16))
7784 "dec.b ${Dst16-3-S-8}"
7785 (+ (f-0-4 #xA) (f-4-1 #x1) Dst16-3-S-8)
7786 (dec-sem QI Dst16-3-S-8)
7787 ())
7788
7789 (dni dec16.w
7790 "dec.w Dst16An-S"
7791 ((machine 16))
7792 "dec.w ${Dst16An-S}"
7793 (+ (f-0-4 #xF) (f-5-3 #x2) Dst16An-S)
7794 (dec-sem HI Dst16An-S)
7795 ())
7796
7797 (unary32-defn QI .b 0 dec #xB #x0 #xE dec-sem)
7798 (unary32-defn HI .w 1 dec #xB #x0 #xE dec-sem)
7799
7800 ;-------------------------------------------------------------
7801 ; div - divide
7802 ; divu - divide unsigned
7803 ; divx - divide extension
7804 ;-------------------------------------------------------------
7805
7806 ; div.BW #imm
7807 (div-imm div div mod SI 127 -128 32767 -32768 (f-0-4 #x7) (f-4-3 6) (f-8-4 #xE) (f-12-4 #x1) #xB #x0 #x2 #x3 div-sem)
7808 (div-imm divu udiv umod USI 255 0 65535 0 (f-0-4 #x7) (f-4-3 6) (f-8-4 #xE) (f-12-4 #x0) #xB #x0 #x0 #x3 div-sem)
7809 (div-imm divx div mod SI 127 -128 32767 -32768 (f-0-4 #x7) (f-4-3 6) (f-8-4 #xE) (f-12-4 #x3) #xB #x2 #x2 #x3 div-sem)
7810 ; div.BW src
7811 (div-src div div mod SI 127 -128 32767 -32768 (f-0-4 #x7) (f-4-3 3) (f-8-4 #xD) #x8 #x1 #xE div-sem)
7812 (div-src divu udiv umod USI 255 0 65535 0 (f-0-4 #x7) (f-4-3 3) (f-8-4 #xC) #x8 #x0 #xE div-sem)
7813 (div-src divx div mod SI 127 -128 32767 -32768 (f-0-4 #x7) (f-4-3 3) (f-8-4 #x9) #x9 #x1 #xE div-sem)
7814
7815 (div-src-defn 32 .l div dst32-24-Prefixed-SI
7816 (+ (f-0-4 0) (f-4-4 1) (f-8-4 #xA) (f-15-1 1) (f-18-2 #x1) (f-20-4 #xf) dst32-24-Prefixed-SI)
7817 div mod SI R2R0 R2R0 NoRemainder #x7fffffff (neg SI #x80000000)
7818 div-sem)
7819 (div-src-defn 32 .l divu dst32-24-Prefixed-SI
7820 (+ (f-0-4 0) (f-4-4 1) (f-8-4 #xA) (f-15-1 1) (f-18-2 #x0) (f-20-4 #xf) dst32-24-Prefixed-SI)
7821 udiv umod USI R2R0 R2R0 NoRemainder #x80000000 0
7822 div-sem)
7823 (div-src-defn 32 .l divx dst32-24-Prefixed-SI
7824 (+ (f-0-4 0) (f-4-4 1) (f-8-4 #xA) (f-15-1 1) (f-18-2 #x2) (f-20-4 #xf) dst32-24-Prefixed-SI)
7825 div mod SI R2R0 R2R0 NoRemainder #x7fffffff (neg SI #x80000000)
7826 div-sem)
7827
7828 ;-------------------------------------------------------------
7829 ; dsbb - decimal subtraction with borrow
7830 ; dsub - decimal subtraction
7831 ;-------------------------------------------------------------
7832
7833 (define-pmacro (dsbb-sem mode src dst)
7834 (sequence ((mode result))
7835 (set result (subc mode dst src (not cbit)))
7836 (set cbit (sub-cflag mode dst src (not cbit)))
7837 (set-z-and-s result)
7838 (set dst result))
7839 )
7840
7841 ; dsbb for m16c
7842 (decimal-subtraction16-insn dsbb #xF #x7)
7843
7844 ; dsbb.size #imm,dst
7845 (binary-arith32-imm-dst-Prefixed QI QI .b 0 dsbb X #x9 #x0 #xE dsbb-sem)
7846 (binary-arith32-imm-dst-Prefixed HI HI .w 1 dsbb X #x9 #x0 #xE dsbb-sem)
7847 ; dsbb.BW src,dst
7848 (binary-arith32-src-dst-Prefixed QI QI .b 0 dsbb X #x1 #xA dsbb-sem)
7849 (binary-arith32-src-dst-Prefixed HI HI .w 1 dsbb X #x1 #xA dsbb-sem)
7850
7851 (define-pmacro (dsub-sem mode src dst)
7852 (sequence ((mode result))
7853 (set result (subc mode dst src 0))
7854 (set cbit (sub-cflag mode dst src 0))
7855 (set-z-and-s result)
7856 (set dst result))
7857 )
7858
7859 ; dsub for m16c
7860 (decimal-subtraction16-insn dsub #xD #x5)
7861
7862 ; dsub.size #imm,dst
7863 (binary-arith32-imm-dst-Prefixed QI QI .b 0 dsub X #x9 #x1 #xE dsub-sem)
7864 (binary-arith32-imm-dst-Prefixed HI HI .w 1 dsub X #x9 #x1 #xE dsub-sem)
7865 ; dsub.BW src,dst
7866 (binary-arith32-src-dst-Prefixed QI QI .b 0 dsub X #x1 #x2 dsub-sem)
7867 (binary-arith32-src-dst-Prefixed HI HI .w 1 dsub X #x1 #x2 dsub-sem)
7868
7869 ;-------------------------------------------------------------
7870 ; sub - binary subtraction
7871 ;-------------------------------------------------------------
7872
7873 (define-pmacro (sub-sem mode src1 dst)
7874 (sequence ((mode result))
7875 (set result (sub mode dst src1))
7876 (set obit (sub-oflag mode dst src1 0))
7877 (set cbit (sub-cflag mode dst src1 0))
7878 (set dst result)
7879 (set-z-and-s result)))
7880
7881 ; sub.size:G #imm,dst (m16 #1 m32 #1)
7882 (binary-arith-imm-dst sub G (f-0-4 7) (f-4-3 3) (f-8-4 5) #x8 #x3 #xE sub-sem)
7883 ; sub.b:S #imm8,dst3 (m16 #2)
7884 (binary-arith16-b-S-imm8-dst3 sub ".b" (f-0-4 8) (f-4-1 1) sub-sem)
7885 ; sub.BW:G src,dst (m16 #3 m32 #4)
7886 (binary-arith-src-dst sub G (f-0-4 #xA) (f-4-3 4) #x1 #xA sub-sem)
7887 ; sub.B.S src2,r0l/r0h (m16 #4)
7888 (binary-arith16-b-S-src2 sub (f-0-4 2) (f-4-1 1) sub-sem)
7889 ; sub.L:G #imm32,dst (m32 #2)
7890 (binary-arith32-imm-dst-defn SI SI .l 0 sub G #x9 #x3 #x1 sub-sem)
7891 ; sub.BW:S #imm,dst2 (m32 #3)
7892 (binary-arith32-s-imm-dst QI .b 0 sub #x0 #x7 sub-sem)
7893 (binary-arith32-s-imm-dst HI .w 1 sub #x0 #x7 sub-sem)
7894 ; sub.L:G src,dst (m32 #5)
7895 (binary-arith32-src-dst-defn SI SI .l 1 sub G #x1 #x0 sub-sem)
7896
7897 ;-------------------------------------------------------------
7898 ; enter - enter function
7899 ; exitd - exit and deallocate stack frame
7900 ;-------------------------------------------------------------
7901
7902 (define-pmacro (enter16-sem mach amt)
7903 (sequence ()
7904 (set (reg h-sp) (sub (reg h-sp) 2))
7905 (set (mem16 HI (reg h-sp)) (reg h-fb))
7906 (set (reg h-fb) (reg h-sp))
7907 (set (reg h-sp) (sub (reg h-sp) amt))))
7908
7909 (define-pmacro (exit16-sem mach)
7910 (sequence ((SI newpc))
7911 (set (reg h-sp) (reg h-fb))
7912 (set (reg h-fb) (mem16 HI (reg h-sp)))
7913 (set (reg h-sp) (add (reg h-sp) 2))
7914 (set newpc (mem16 HI (reg h-sp)))
7915 (set (reg h-sp) (add (reg h-sp) 2))
7916 (set newpc (or newpc (sll (mem16 QI (reg h-sp)) (const 16))))
7917 (set (reg h-sp) (add (reg h-sp) 1))
7918 (set pc newpc)))
7919
7920 (define-pmacro (enter32-sem mach amt)
7921 (sequence ()
7922 (set (reg h-sp) (sub (reg h-sp) 4))
7923 (set (mem32 SI (reg h-sp)) (reg h-fb))
7924 (set (reg h-fb) (reg h-sp))
7925 (set (reg h-sp) (sub (reg h-sp) amt))))
7926
7927 (define-pmacro (exit32-sem mach)
7928 (sequence ((SI newpc))
7929 (set (reg h-sp) (reg h-fb))
7930 (set (reg h-fb) (mem32 SI (reg h-sp)))
7931 (set (reg h-sp) (add (reg h-sp) 4))
7932 (set newpc (mem32 SI (reg h-sp)))
7933 (set (reg h-sp) (add (reg h-sp) 4))
7934 (set pc newpc)))
7935
7936 (dni enter16 "enter #Imm-16-QI" ((machine 16))
7937 ("enter #${Dsp-16-u8}")
7938 (+ (f-0-4 7) (f-4-4 #xC) (f-8-4 #xF) (f-12-4 2) Dsp-16-u8)
7939 (enter16-sem 16 Dsp-16-u8)
7940 ())
7941
7942 (dni exitd16 "exitd" ((machine 16))
7943 ("exitd")
7944 (+ (f-0-4 7) (f-4-4 #xD) (f-8-4 #xF) (f-12-4 2))
7945 (exit16-sem 16)
7946 ())
7947
7948 (dni enter32 "enter #Imm-8-QI" ((machine 32))
7949 ("enter #${Dsp-8-u8}")
7950 (+ (f-0-4 #xE) (f-4-4 #xC) Dsp-8-u8)
7951 (enter32-sem 32 Dsp-8-u8)
7952 ())
7953
7954 (dni exitd32 "exitd" ((machine 32))
7955 ("exitd")
7956 (+ (f-0-4 #xF) (f-4-4 #xC))
7957 (exit32-sem 32)
7958 ())
7959
7960 ;-------------------------------------------------------------
7961 ; fclr - flag register clear
7962 ; fset - flag register set
7963 ;-------------------------------------------------------------
7964
7965 (define-pmacro (set-flags-sem flag)
7966 (sequence ((SI tmp))
7967 (case DFLT flag
7968 ((#x0) (set cbit 1))
7969 ((#x1) (set dbit 1))
7970 ((#x2) (set zbit 1))
7971 ((#x3) (set sbit 1))
7972 ((#x4) (set bbit 1))
7973 ((#x5) (set obit 1))
7974 ((#x6) (set ibit 1))
7975 ((#x7) (set ubit 1)))
7976 )
7977 )
7978
7979 (define-pmacro (clear-flags-sem flag)
7980 (sequence ((SI tmp))
7981 (case DFLT flag
7982 ((#x0) (set cbit 0))
7983 ((#x1) (set dbit 0))
7984 ((#x2) (set zbit 0))
7985 ((#x3) (set sbit 0))
7986 ((#x4) (set bbit 0))
7987 ((#x5) (set obit 0))
7988 ((#x6) (set ibit 0))
7989 ((#x7) (set ubit 0)))
7990 )
7991 )
7992
7993 (dni fclr16 "fclr flag" ((machine 16))
7994 ("fclr ${flags16}")
7995 (+ (f-0-4 #xE) (f-4-4 #xB) (f-8-1 0) flags16 (f-12-4 5))
7996 (clear-flags-sem flags16)
7997 ())
7998
7999 (dni fset16 "fset flag" ((machine 16))
8000 ("fset ${flags16}")
8001 (+ (f-0-4 #xE) (f-4-4 #xB) (f-8-1 0) flags16 (f-12-4 4))
8002 (set-flags-sem flags16)
8003 ())
8004
8005 (dni fclr "fclr" ((machine 32))
8006 ("fclr ${flags32}")
8007 (+ (f-0-4 #xD) (f-4-4 3) (f-8-4 #xE) (f-12-1 1) flags32)
8008 (clear-flags-sem flags32)
8009 ())
8010
8011 (dni fset "fset" ((machine 32))
8012 ("fset ${flags32}")
8013 (+ (f-0-4 #xD) (f-4-4 1) (f-8-4 #xE) (f-12-1 1) flags32)
8014 (set-flags-sem flags32)
8015 ())
8016
8017 ;-------------------------------------------------------------
8018 ; inc - increment
8019 ;-------------------------------------------------------------
8020
8021 (define-pmacro (inc-sem mode dest)
8022 (sequence ((mode result))
8023 (set result (add mode dest 1))
8024 (set-z-and-s result)
8025 (set dest result))
8026 )
8027
8028 (dni inc16.b
8029 "inc.b Dst16-3-S-8"
8030 ((machine 16))
8031 "inc.b ${Dst16-3-S-8}"
8032 (+ (f-0-4 #xA) (f-4-1 #x0) Dst16-3-S-8)
8033 (inc-sem QI Dst16-3-S-8)
8034 ())
8035
8036 (dni inc16.w
8037 "inc.w Dst16An-S"
8038 ((machine 16))
8039 "inc.w ${Dst16An-S}"
8040 (+ (f-0-4 #xB) (f-5-3 #x2) Dst16An-S)
8041 (inc-sem HI Dst16An-S)
8042 ())
8043
8044 (unary32-defn QI .b 0 inc #xA #x0 #xE inc-sem)
8045 (unary32-defn HI .w 1 inc #xA #x0 #xE inc-sem)
8046
8047 ;-------------------------------------------------------------
8048 ; freit - fast return from interrupt (m32)
8049 ; int - interrupt
8050 ; into - interrupt on overflow
8051 ;-------------------------------------------------------------
8052
8053 ; ??? semantics
8054 (dni freit32 "FREIT" ((machine 32))
8055 ("freit")
8056 (+ (f-0-4 9) (f-4-4 #xF))
8057 (nop)
8058 ())
8059
8060 (dni int16 "int Dsp-10-u6" ((machine 16))
8061 ("int #${Dsp-10-u6}")
8062 (+ (f-0-4 #xE) (f-4-4 #xB) (f-8-2 3) Dsp-10-u6)
8063 (c-call VOID "do_int" pc Dsp-10-u6)
8064 ())
8065
8066 (dni into16 "into" ((machine 16))
8067 ("into")
8068 (+ (f-0-4 #xF) (f-4-4 6))
8069 (nop)
8070 ())
8071
8072 (dni int32 "int Dsp-8-u6" ((machine 32))
8073 ("int #${Dsp-8-u6}")
8074 (+ (f-0-4 #xB) (f-4-4 #xE) Dsp-8-u6 (f-14-2 0))
8075 (c-call VOID "do_int" pc Dsp-8-u6)
8076 ())
8077
8078 (dni into32 "into" ((machine 32))
8079 ("into")
8080 (+ (f-0-4 #xB) (f-4-4 #xF))
8081 (nop)
8082 ())
8083
8084 ;-------------------------------------------------------------
8085 ; index (m32c)
8086 ;-------------------------------------------------------------
8087
8088 ; TODO add support to insns allowing index
8089 (define-pmacro (indexb-sem mode d) (set SrcIndex d) (set DstIndex d))
8090 (define-pmacro (indexbd-sem mode d) (set SrcIndex (const 0)) (set DstIndex d))
8091 (define-pmacro (indexbs-sem mode d) (set SrcIndex d) (set DstIndex (const 0)))
8092 (define-pmacro (indexw-sem mode d)
8093 (set SrcIndex (sll d (const 2))) (set DstIndex (sll d (const 2))))
8094 (define-pmacro (indexwd-sem mode d)
8095 (set SrcIndex (const 0)) (set DstIndex (sll d (const 2))))
8096 (define-pmacro (indexws-sem mode d)
8097 (set SrcIndex (sll d (const 2))) (set DstIndex (const 0)))
8098 (define-pmacro (indexl-sem mode d)
8099 (set SrcIndex d) (set DstIndex (sll d (const 2))))
8100 (define-pmacro (indexld-sem mode d)
8101 (set SrcIndex (const 0)) (set DstIndex (sll d (const 2))))
8102 (define-pmacro (indexls-sem mode d)
8103 (set SrcIndex (sll d (const 2))) (set DstIndex (const 0)))
8104
8105 ; Note that "wbit" not where the size bit goes here, hence, it's
8106 ; always 0 in these calls but op2 differs instead.
8107
8108 ; indexb src (index byte)
8109 (unary32-defn QI .b 0 indexb #x8 0 #x3 indexb-sem)
8110 (unary32-defn HI .w 0 indexb #x8 1 #x3 indexb-sem)
8111 ; indexbd src (index byte dest)
8112 (unary32-defn QI .b 0 indexbd #xA 0 3 indexbd-sem)
8113 (unary32-defn HI .w 0 indexbd #xA 1 3 indexbd-sem)
8114 ; indexbs src (index byte src)
8115 (unary32-defn QI .b 0 indexbs #xC 0 3 indexbs-sem)
8116 (unary32-defn HI .w 0 indexbs #xC 1 3 indexbs-sem)
8117 ; indexl src (index long)
8118 (unary32-defn QI .b 0 indexl 9 2 3 indexl-sem)
8119 (unary32-defn HI .w 0 indexl 9 3 3 indexl-sem)
8120 ; indexld src (index long dest)
8121 (unary32-defn QI .b 0 indexld #xB 2 3 indexld-sem)
8122 (unary32-defn HI .w 0 indexld #xB 3 3 indexld-sem)
8123 ; indexls src (index long src)
8124 (unary32-defn QI .b 0 indexls 9 0 3 indexls-sem)
8125 (unary32-defn HI .w 0 indexls 9 1 3 indexls-sem)
8126 ; indexw src (index word)
8127 (unary32-defn QI .b 0 indexw 8 2 3 indexw-sem)
8128 (unary32-defn HI .w 0 indexw 8 3 3 indexw-sem)
8129 ; indexwd src (index word dest)
8130 (unary32-defn QI .b 0 indexwd #xA 2 3 indexwd-sem)
8131 (unary32-defn HI .w 0 indexwd #xA 3 3 indexwd-sem)
8132 ; indexws (index word src)
8133 (unary32-defn QI .b 0 indexws #xC 2 3 indexws-sem)
8134 (unary32-defn HI .w 0 indexws #xC 3 3 indexws-sem)
8135
8136 ;-------------------------------------------------------------
8137 ; jcc - jump on condition
8138 ;-------------------------------------------------------------
8139
8140 (define-pmacro (jcnd32-sem cnd label)
8141 (sequence ()
8142 (case DFLT cnd
8143 ((#x00) (if (not cbit) (set pc label))) ;ltu nc
8144 ((#x01) (if (not (and cbit (not zbit))) (set pc label))) ;leu
8145 ((#x02) (if (not zbit) (set pc label))) ;ne nz
8146 ((#x03) (if (not sbit) (set pc label))) ;pz
8147 ((#x04) (if (not obit) (set pc label))) ;no
8148 ((#x05) (if (not (or zbit (xor sbit obit))) (set pc label))) ;gt
8149 ((#x06) (if (not (xor sbit obit)) (set pc label))) ;ge
8150 ((#x08) (if (trunc BI cbit) (set pc label))) ;geu c
8151 ((#x09) (if (and cbit (not zbit)) (set pc label))) ;gtu
8152 ((#x0a) (if (trunc BI zbit) (set pc label))) ;eq z
8153 ((#x0b) (if (trunc BI sbit) (set pc label))) ;n
8154 ((#x0c) (if (trunc BI obit) (set pc label))) ;o
8155 ((#x0d) (if (or zbit (xor sbit obit)) (set pc label))) ;le
8156 ((#x0e) (if (xor sbit obit) (set pc label))) ;lt
8157 )
8158 )
8159 )
8160
8161 (define-pmacro (jcnd16-sem cnd label)
8162 (sequence ()
8163 (case DFLT cnd
8164 ((#x00) (if (trunc BI cbit) (set pc label))) ;geu c
8165 ((#x01) (if (and cbit (not zbit)) (set pc label))) ;gtu
8166 ((#x02) (if (trunc BI zbit) (set pc label))) ;eq z
8167 ((#x03) (if (trunc BI sbit) (set pc label))) ;n
8168 ((#x04) (if (not cbit) (set pc label))) ;ltu nc
8169 ((#x05) (if (not (and cbit (not zbit))) (set pc label))) ;leu
8170 ((#x06) (if (not zbit) (set pc label))) ;ne nz
8171 ((#x07) (if (not sbit) (set pc label))) ;pz
8172 ((#x08) (if (or zbit (xor sbit obit)) (set pc label))) ;le
8173 ((#x09) (if (trunc BI obit) (set pc label))) ;o
8174 ((#x0a) (if (not (xor sbit obit)) (set pc label))) ;ge
8175 ((#x0c) (if (not (or zbit (xor sbit obit))) (set pc label))) ;gt
8176 ((#x0d) (if (not obit) (set pc label))) ;no
8177 ((#x0e) (if (xor sbit obit) (set pc label))) ;lt
8178 )
8179 )
8180 )
8181
8182 (dni jcnd16-5
8183 "jCnd label"
8184 (RL_JUMP RELAXABLE (machine 16))
8185 "j$cond16j5 ${Lab-8-8}"
8186 (+ (f-0-4 #x6) (f-4-1 1) cond16j5 Lab-8-8)
8187 (jcnd16-sem cond16j5 Lab-8-8)
8188 ()
8189 )
8190
8191 (dni jcnd16
8192 "jCnd label"
8193 (RL_JUMP RELAXABLE (machine 16))
8194 "j$cond16j ${Lab-16-8}"
8195 (+ (f-0-4 #x7) (f-4-4 #xD) (f-8-4 #xC) cond16j Lab-16-8)
8196 (jcnd16-sem cond16j Lab-16-8)
8197 ()
8198 )
8199
8200 (dni jcnd32
8201 "jCnd label"
8202 (RL_JUMP RELAXABLE (machine 32))
8203 "j$cond32j ${Lab-8-8}"
8204 (+ (f-0-1 1) (f-4-3 5) cond32j Lab-8-8)
8205 (jcnd32-sem cond32j Lab-8-8)
8206 ()
8207 )
8208
8209 ;-------------------------------------------------------------
8210 ; jmp - jump
8211 ;-------------------------------------------------------------
8212
8213 ; jmp.s label3 (m16 #1)
8214 (dni jmp16.s "jmp.s Lab-5-3" (RL_JUMP RELAXABLE (machine 16))
8215 ("jmp.s ${Lab-5-3}")
8216 (+ (f-0-4 6) (f-4-1 0) Lab-5-3)
8217 (sequence () (set pc Lab-5-3))
8218 ())
8219 ; jmp.b label8 (m16 #2)
8220 (dni jmp16.b "jmp.b Lab-8-8" (RL_JUMP RELAXABLE (machine 16))
8221 ("jmp.b ${Lab-8-8}")
8222 (+ (f-0-4 #xF) (f-4-4 #xE) Lab-8-8)
8223 (sequence () (set pc Lab-8-8))
8224 ())
8225 ; jmp.w label16 (m16 #3)
8226 (dni jmp16.w "jmp.w Lab-8-16" (RL_JUMP RELAXABLE (machine 16))
8227 ("jmp.w ${Lab-8-16}")
8228 (+ (f-0-4 #xF) (f-4-4 4) Lab-8-16)
8229 (sequence () (set pc Lab-8-16))
8230 ())
8231 ; jmp.a label24 (m16 #4)
8232 (dni jmp16.a "jmp.a Lab-8-24" (RL_JUMP RELAXABLE (machine 16))
8233 ("jmp.a ${Lab-8-24}")
8234 (+ (f-0-4 #xF) (f-4-4 #xC) Lab-8-24)
8235 (sequence () (set pc Lab-8-24))
8236 ())
8237
8238 (define-pmacro (jmp16-sem mode dst)
8239 (set pc (and dst #xfffff))
8240 )
8241 (define-pmacro (jmp32-sem mode dst)
8242 (set pc dst)
8243 )
8244 ; jmpi.w dst (m16 #1 m32 #2)
8245 (unary-insn-defn 16 16 HI .w jmpi (+ (f-0-4 7) (f-4-4 #xD) (f-8-4 2) dst16-16-HI) jmp16-sem)
8246 (unary-insn-defn 32 16-Unprefixed HI .w jmpi (+ (f-0-4 #xC) (f-7-1 1) dst32-16-Unprefixed-HI (f-10-2 #x0) (f-12-4 #xF)) jmp32-sem)
8247 ; jmpi.a dst (m16 #2 m32 #2)
8248 (unary-insn-defn 16 16 SI .a jmpi (+ (f-0-4 7) (f-4-4 #xD) (f-8-4 0) dst16-16-SI) jmp16-sem)
8249 (unary-insn-defn 32 16-Unprefixed SI .a jmpi (+ (f-0-4 #x8) (f-7-1 0) dst32-16-Unprefixed-SI (f-10-2 #x0) (f-12-4 1)) jmp32-sem)
8250 ; jmps imm8 (m16 #1)
8251 (dni jmps16 "jmps Imm-8-QI" ((machine 16))
8252 ("jmps #${Imm-8-QI}")
8253 (+ (f-0-4 #xE) (f-4-4 #xE) Imm-8-QI)
8254 (sequence () (set pc Imm-8-QI))
8255 ())
8256 ; jmp.s label3 (m32 #1)
8257 (dni jmp32.s
8258 "jmp.s label"
8259 (RL_JUMP RELAXABLE (machine 32))
8260 "jmp.s ${Lab32-jmp-s}"
8261 (+ (f-0-2 1) (f-4-3 5) Lab32-jmp-s)
8262 (set pc Lab32-jmp-s)
8263 ()
8264 )
8265 ; jmp.b label8 (m32 #2)
8266 (dni jmp32.b "jmp.b Lab-8-8" (RL_JUMP RELAXABLE (machine 32))
8267 ("jmp.b ${Lab-8-8}")
8268 (+ (f-0-4 #xB) (f-4-4 #xB) Lab-8-8)
8269 (set pc Lab-8-8)
8270 ())
8271 ; jmp.w label16 (m32 #3)
8272 (dni jmp32.w "jmp.w Lab-8-16" (RL_JUMP RELAXABLE (machine 32))
8273 ("jmp.w ${Lab-8-16}")
8274 (+ (f-0-4 #xC) (f-4-4 #xE) Lab-8-16)
8275 (set pc Lab-8-16)
8276 ())
8277 ; jmp.a label24 (m32 #4)
8278 (dni jmp32.a "jmp.a Lab-8-24" (RL_JUMP RELAXABLE (machine 32))
8279 ("jmp.a ${Lab-8-24}")
8280 (+ (f-0-4 #xC) (f-4-4 #xC) Lab-8-24)
8281 (set pc Lab-8-24)
8282 ())
8283 ; jmp.s imm8 (m32 #1)
8284 (dni jmps32 "jmps Imm-8-QI" (RL_JUMP (machine 32))
8285 ("jmps #${Imm-8-QI}")
8286 (+ (f-0-4 #xD) (f-4-4 #xC) Imm-8-QI)
8287 (set pc Imm-8-QI)
8288 ())
8289
8290 ;-------------------------------------------------------------
8291 ; jsr jump subroutine
8292 ;-------------------------------------------------------------
8293
8294 (define-pmacro (jsr16-sem length dst)
8295 (sequence ((SI tpc))
8296 (set tpc (add pc length))
8297 (set (reg h-sp) (sub (reg h-sp) 2))
8298 (set (mem16 HI (reg h-sp)) (srl (and tpc #xffff00) 8))
8299 (set (reg h-sp) (sub (reg h-sp) 1))
8300 (set (mem16 QI (reg h-sp)) (and tpc #xff))
8301 (set pc dst)
8302 )
8303 )
8304 (define-pmacro (jsr32-sem length dst)
8305 (sequence ((SI tpc))
8306 (set tpc (add pc length))
8307 (set (reg h-sp) (sub (reg h-sp) 2))
8308 (set (mem32 HI (reg h-sp)) (srl (and tpc #xffff0000) 16))
8309 (set (reg h-sp) (sub (reg h-sp) 2))
8310 (set (mem32 HI (reg h-sp)) (and tpc #xffff))
8311 (set pc dst)
8312 )
8313 )
8314
8315 ; jsr.w label16 (m16 #1)
8316 (dni jsr16.w "jsr.w Lab-8-16" (RL_JUMP RELAXABLE (machine 16))
8317 ("jsr.w ${Lab-8-16}")
8318 (+ (f-0-4 #xF) (f-4-4 5) Lab-8-16)
8319 (jsr16-sem 3 Lab-8-16)
8320 ())
8321 ; jsr.a label24 (m16 #2)
8322 (dni jsr16.a "jsr.a Lab-8-24" (RL_JUMP RELAXABLE (machine 16))
8323 ("jsr.a ${Lab-8-24}")
8324 (+ (f-0-4 #xF) (f-4-4 #xD) Lab-8-24)
8325 (jsr16-sem 4 Lab-8-24)
8326 ())
8327 (define-pmacro (jsri-defn mode op16 op16-1 op16-2 op16-3 op16-sem
8328 op32 op32-1 op32-2 op32-3 op32-4 op32-sem len)
8329 (begin
8330 (dni (.sym jsri16 mode - op16)
8331 (.str "jsri." mode " " op16)
8332 (RL_1ADDR (machine 16))
8333 (.str "jsri." mode " ${" op16 "}")
8334 (+ op16-1 op16-2 op16-3 op16)
8335 (op16-sem len op16)
8336 ())
8337 (dni (.sym jsri32 mode - op32)
8338 (.str "jsri." mode " " op32)
8339 (RL_1ADDR (machine 32))
8340 (.str "jsri." mode " ${" op32 "}")
8341 (+ op32-1 op32-2 op32-3 op32-4 op32)
8342 (op32-sem len op32)
8343 ())
8344 )
8345 )
8346 ; jsri.w dst (m16 #1 m32 #1))
8347 (jsri-defn w dst16-16-20ar-HI (f-0-4 #x7) (f-4-4 #xD) (f-8-4 #x3) jsr16-sem
8348 dst32-16-24-Unprefixed-HI (f-0-4 #xC) (f-7-1 1) (f-10-2 #x1) (f-12-4 #xF) jsr32-sem 4)
8349 (jsri-defn w dst16-16-16sa-HI (f-0-4 #x7) (f-4-4 #xD) (f-8-4 #x3) jsr16-sem
8350 dst32-16-16sa-Unprefixed-HI (f-0-4 #xC) (f-7-1 1) (f-10-2 #x1) (f-12-4 #xF) jsr32-sem 4)
8351 (jsri-defn w dst16-16-8-HI (f-0-4 #x7) (f-4-4 #xD) (f-8-4 #x3) jsr16-sem
8352 dst32-16-8-Unprefixed-HI (f-0-4 #xC) (f-7-1 1) (f-10-2 #x1) (f-12-4 #xF) jsr32-sem 3)
8353 (jsri-defn w dst16-basic-HI (f-0-4 #x7) (f-4-4 #xD) (f-8-4 #x3) jsr16-sem
8354 dst32-basic-Unprefixed-HI (f-0-4 #xC) (f-7-1 1) (f-10-2 #x1) (f-12-4 #xF) jsr32-sem 2)
8355
8356 ; jsri.a (m16 #2 m32 #2)
8357 (jsri-defn a dst16-16-20ar-SI (f-0-4 #x7) (f-4-4 #xD) (f-8-4 #x1) jsr16-sem
8358 dst32-16-24-Unprefixed-SI (f-0-4 #x9) (f-7-1 0) (f-10-2 #x0) (f-12-4 #x1) jsr32-sem 4)
8359 (jsri-defn a dst16-16-8-SI (f-0-4 #x7) (f-4-4 #xD) (f-8-4 #x1) jsr16-sem
8360 dst32-16-8-Unprefixed-SI (f-0-4 #x9) (f-7-1 0) (f-10-2 #x0) (f-12-4 #x1) jsr32-sem 3)
8361 (jsri-defn a dst16-16-16sa-SI (f-0-4 #x7) (f-4-4 #xD) (f-8-4 #x1) jsr16-sem
8362 dst32-16-16sa-Unprefixed-SI (f-0-4 #x9) (f-7-1 0) (f-10-2 #x0) (f-12-4 #x1) jsr32-sem 4)
8363 (jsri-defn a dst16-basic-SI (f-0-4 #x7) (f-4-4 #xD) (f-8-4 #x1) jsr16-sem
8364 dst32-basic-Unprefixed-SI (f-0-4 #x9) (f-7-1 0) (f-10-2 #x0) (f-12-4 #x1) jsr32-sem 2)
8365
8366 (dni jsri32.a "jsr.w dst32-16-24-Unprefixed-HI" (RL_1ADDR (machine 32))
8367 ("jsri.a ${dst32-16-24-Unprefixed-SI}")
8368 (+ (f-0-4 #x9) (f-7-1 0) dst32-16-24-Unprefixed-SI (f-10-2 #x0) (f-12-4 #x1))
8369 (jsr32-sem 6 dst32-16-24-Unprefixed-SI)
8370 ())
8371 ; jsr.w label16 (m32 #1)
8372 (dni jsr32.w "jsr.w label" (RL_JUMP RELAXABLE (machine 32))
8373 ("jsr.w ${Lab-8-16}")
8374 (+ (f-0-4 #xC) (f-4-4 #xF) Lab-8-16)
8375 (jsr32-sem 3 Lab-8-16)
8376 ())
8377 ; jsr.a label16 (m32 #2)
8378 (dni jsr32.a "jsr.a label" (RL_JUMP (machine 32))
8379 ("jsr.a ${Lab-8-24}")
8380 (+ (f-0-4 #xC) (f-4-4 #xD) Lab-8-24)
8381 (jsr32-sem 4 Lab-8-24)
8382 ())
8383 ; jsrs imm8 (m16 #1)
8384 (dni jsrs16 "jsrs Imm-8-QI" ((machine 16))
8385 ("jsrs #${Imm-8-QI}")
8386 (+ (f-0-4 #xE) (f-4-4 #xF) Imm-8-QI)
8387 (jsr16-sem 2 Imm-8-QI)
8388 ())
8389 ; jsrs imm8 (m32 #1)
8390 (dni jsrs "jsrs #Imm-8-QI" ((machine 32))
8391 ("jsrs #${Imm-8-QI}")
8392 (+ (f-0-4 #xD) (f-4-4 #xD) Imm-8-QI)
8393 (jsr32-sem 2 Imm-8-QI)
8394 ())
8395
8396 ;-------------------------------------------------------------
8397 ; ldc - load control register
8398 ; stc - store control register
8399 ;-------------------------------------------------------------
8400
8401 (define-pmacro (ldc32-cr1-sem src dst)
8402 (sequence ()
8403 (case DFLT dst
8404 ((#x0) (set (reg h-dct0) src))
8405 ((#x1) (set (reg h-dct1) src))
8406 ((#x2) (sequence ((HI tflag))
8407 (set tflag src)
8408 (if (and tflag #x1) (set cbit 1))
8409 (if (and tflag #x2) (set dbit 1))
8410 (if (and tflag #x4) (set zbit 1))
8411 (if (and tflag #x8) (set sbit 1))
8412 (if (and tflag #x10) (set bbit 1))
8413 (if (and tflag #x20) (set obit 1))
8414 (if (and tflag #x40) (set ibit 1))
8415 (if (and tflag #x80) (set ubit 1))))
8416 ((#x3) (set (reg h-svf) src))
8417 ((#x4) (set (reg h-drc0) src))
8418 ((#x5) (set (reg h-drc1) src))
8419 ((#x6) (set (reg h-dmd0) src))
8420 ((#x7) (set (reg h-dmd1) src))
8421 )
8422 )
8423 )
8424 (define-pmacro (ldc32-cr2-sem src dst)
8425 (sequence ()
8426 (case DFLT dst
8427 ((#x0) (set (reg h-intb) src))
8428 ((#x1) (set (reg h-sp) src))
8429 ((#x2) (set (reg h-sb) src))
8430 ((#x3) (set (reg h-fb) src))
8431 ((#x4) (set (reg h-svp) src))
8432 ((#x5) (set (reg h-vct) src))
8433 ((#x7) (set (reg h-isp) src))
8434 )
8435 )
8436 )
8437 (define-pmacro (ldc32-cr3-sem src dst)
8438 (sequence ()
8439 (case DFLT dst
8440 ((#x2) (set (reg h-dma0) src))
8441 ((#x3) (set (reg h-dma1) src))
8442 ((#x4) (set (reg h-dra0) src))
8443 ((#x5) (set (reg h-dra1) src))
8444 ((#x6) (set (reg h-dsa0) src))
8445 ((#x7) (set (reg h-dsa1) src))
8446 )
8447 )
8448 )
8449 (define-pmacro (ldc16-sem src dst)
8450 (sequence ()
8451 (case DFLT dst
8452 ((#x1) (set (reg h-intb) src))
8453 ((#x2) (set (reg h-intb) (or (reg h-intb) (sll src (const 16)))))
8454 ((#x3) (sequence ((HI tflag))
8455 (set tflag src)
8456 (if (and tflag #x1) (set cbit 1))
8457 (if (and tflag #x2) (set dbit 1))
8458 (if (and tflag #x4) (set zbit 1))
8459 (if (and tflag #x8) (set sbit 1))
8460 (if (and tflag #x10) (set bbit 1))
8461 (if (and tflag #x20) (set obit 1))
8462 (if (and tflag #x40) (set ibit 1))
8463 (if (and tflag #x80) (set ubit 1))))
8464 ((#x4) (set (reg h-isp) src))
8465 ((#x5) (set (reg h-sp) src))
8466 ((#x6) (set (reg h-sb) src))
8467 ((#x7) (set (reg h-fb) src))
8468 )
8469 )
8470 )
8471
8472 (define-pmacro (stc32-cr1-sem src dst)
8473 (sequence ()
8474 (case DFLT src
8475 ((#x0) (set dst (reg h-dct0)))
8476 ((#x1) (set dst (reg h-dct1)))
8477 ((#x2) (sequence ((HI tflag))
8478 (set tflag 0)
8479 (if (eq cbit 1) (set tflag (or tflag #x1)))
8480 (if (eq dbit 1) (set tflag (or tflag #x2)))
8481 (if (eq zbit 1) (set tflag (or tflag #x4)))
8482 (if (eq sbit 1) (set tflag (or tflag #x8)))
8483 (if (eq bbit 1) (set tflag (or tflag #x10)))
8484 (if (eq obit 1) (set tflag (or tflag #x20)))
8485 (if (eq ibit 1) (set tflag (or tflag #x40)))
8486 (if (eq ubit 1) (set tflag (or tflag #x80)))
8487 (set dst tflag)))
8488 ((#x3) (set dst (reg h-svf)))
8489 ((#x4) (set dst (reg h-drc0)))
8490 ((#x5) (set dst (reg h-drc1)))
8491 ((#x6) (set dst (reg h-dmd0)))
8492 ((#x7) (set dst (reg h-dmd1)))
8493 )
8494 )
8495 )
8496 (define-pmacro (stc32-cr2-sem src dst)
8497 (sequence ()
8498 (case DFLT src
8499 ((#x0) (set dst (reg h-intb)))
8500 ((#x1) (set dst (reg h-sp)))
8501 ((#x2) (set dst (reg h-sb)))
8502 ((#x3) (set dst (reg h-fb)))
8503 ((#x4) (set dst (reg h-svp)))
8504 ((#x5) (set dst (reg h-vct)))
8505 ((#x7) (set dst (reg h-isp)))
8506 )
8507 )
8508 )
8509 (define-pmacro (stc32-cr3-sem src dst)
8510 (sequence ()
8511 (case DFLT src
8512 ((#x2) (set dst (reg h-dma0)))
8513 ((#x3) (set dst (reg h-dma1)))
8514 ((#x4) (set dst (reg h-dra0)))
8515 ((#x5) (set dst (reg h-dra1)))
8516 ((#x6) (set dst (reg h-dsa0)))
8517 ((#x7) (set dst (reg h-dsa1)))
8518 )
8519 )
8520 )
8521 (define-pmacro (stc16-sem src dst)
8522 (sequence ()
8523 (case DFLT src
8524 ((#x1) (set dst (and (reg h-intb) (const #xffff))))
8525 ((#x2) (set dst (srl (reg h-intb) (const 16))))
8526 ((#x3) (sequence ((HI tflag))
8527 (set tflag 0)
8528 (if (eq cbit 1) (set tflag (or tflag #x1)))
8529 (if (eq dbit 1) (set tflag (or tflag #x2)))
8530 (if (eq zbit 1) (set tflag (or tflag #x4)))
8531 (if (eq sbit 1) (set tflag (or tflag #x8)))
8532 (if (eq bbit 1) (set tflag (or tflag #x10)))
8533 (if (eq obit 1) (set tflag (or tflag #x20)))
8534 (if (eq ibit 1) (set tflag (or tflag #x40)))
8535 (if (eq ubit 1) (set tflag (or tflag #x80)))
8536 (set dst tflag)))
8537 ((#x4) (set dst (reg h-isp)))
8538 ((#x5) (set dst (reg h-sp)))
8539 ((#x6) (set dst (reg h-sb)))
8540 ((#x7) (set dst (reg h-fb)))
8541 )
8542 )
8543 )
8544
8545 (dni ldc16.imm16 "ldc #imm,dst" ((machine 16))
8546 ("ldc #${Imm-16-HI},${cr16}")
8547 (+ (f-0-4 #xE) (f-4-4 #xB) (f-8-1 0) (f-12-4 0) cr16 Imm-16-HI)
8548 (ldc16-sem Imm-16-HI cr16)
8549 ())
8550
8551 (dni ldc16.dst "ldc src,dest" ((machine 16))
8552 ("ldc ${dst16-16-HI},${cr16}")
8553 (+ (f-0-4 7) (f-4-4 #xA) (f-8-1 1) cr16 dst16-16-HI)
8554 (ldc16-sem dst16-16-HI cr16)
8555 ())
8556 ; ldc src,dest (m32c #4)
8557 (dni ldc32.src-cr1 "ldc src,dst" ((machine 32))
8558 ("ldc ${dst32-24-Prefixed-HI},${cr1-Prefixed-32}")
8559 (+ (f-0-4 0) (f-4-4 1) (f-8-4 #xD) dst32-24-Prefixed-HI (f-15-1 1) (f-18-2 0) (f-20-1 1) cr1-Prefixed-32)
8560 (ldc32-cr1-sem dst32-24-Prefixed-HI cr1-Prefixed-32)
8561 ())
8562 ; ldc src,dest (m32c #5)
8563 (dni ldc32.src-cr2 "ldc src,dest" ((machine 32))
8564 ("ldc ${dst32-16-Unprefixed-SI},${cr2-32}")
8565 (+ (f-0-4 #xD) dst32-16-Unprefixed-SI (f-7-1 1) (f-10-2 0) (f-12-1 0) cr2-32)
8566 (ldc32-cr2-sem dst32-16-Unprefixed-SI cr2-32)
8567 ())
8568 ; ldc src,dest (m32c #6)
8569 (dni ldc32.src-cr3 "ldc src,dst" ((machine 32))
8570 ("ldc ${dst32-24-Prefixed-SI},${cr3-Prefixed-32}")
8571 (+ (f-0-4 0) (f-4-4 1) (f-8-4 #xD) dst32-24-Prefixed-SI (f-15-1 1) (f-18-2 0) (f-20-1 0) cr3-Prefixed-32)
8572 (ldc32-cr3-sem dst32-24-Prefixed-SI cr3-Prefixed-32)
8573 ())
8574 ; ldc src,dest (m32c #1)
8575 (dni ldc32.imm16-cr1 "ldc #imm,dst" ((machine 32))
8576 ("ldc #${Imm-16-HI},${cr1-Unprefixed-32}")
8577 (+ (f-0-4 #xD) (f-4-4 5) (f-8-4 #xA) (f-12-1 1) cr1-Unprefixed-32 Imm-16-HI)
8578 (ldc32-cr1-sem Imm-16-HI cr1-Unprefixed-32)
8579 ())
8580 ; ldc src,dest (m32c #2)
8581 (dni ldc32.imm16-cr2 "ldc #imm,dst" ((machine 32))
8582 ("ldc #${Dsp-16-u24},${cr2-32}")
8583 (+ (f-0-4 #xD) (f-4-4 5) (f-8-4 2) (f-12-1 1) cr2-32 Dsp-16-u24)
8584 (ldc32-cr2-sem Dsp-16-u24 cr2-32)
8585 ())
8586 ; ldc src,dest (m32c #3)
8587 (dni ldc32.imm16-cr3 "ldc #imm,dst" ((machine 32))
8588 ("ldc #${Dsp-16-u24},${cr3-Unprefixed-32}")
8589 (+ (f-0-4 #xD) (f-4-4 5) (f-8-4 6) (f-12-1 1) cr3-Unprefixed-32 Dsp-16-u24)
8590 (ldc32-cr3-sem Dsp-16-u24 cr3-Unprefixed-32)
8591 ())
8592
8593 (dni stc16.src "stc src,dest" ((machine 16))
8594 ("stc ${cr16},${dst16-16-HI}")
8595 (+ (f-0-4 7) (f-4-4 #xB) (f-8-1 1) cr16 dst16-16-HI)
8596 (stc16-sem cr16 dst16-16-HI )
8597 ())
8598
8599 (dni stc16.pc "stc pc,dest" ((machine 16))
8600 ("stc pc,${dst16-16-HI}")
8601 (+ (f-0-4 7) (f-4-4 #xC) (f-8-4 #xC) dst16-16-HI)
8602 (sequence () (set dst16-16-HI (reg h-pc)))
8603 ())
8604
8605 (dni stc32.src-cr1 "stc src,dst" ((machine 32))
8606 ("stc ${cr1-Prefixed-32},${dst32-24-Prefixed-HI}")
8607 (+ (f-0-4 0) (f-4-4 1) (f-8-4 #xD) dst32-24-Prefixed-HI (f-15-1 1) (f-18-2 1) (f-20-1 1) cr1-Prefixed-32)
8608 (stc32-cr1-sem cr1-Prefixed-32 dst32-24-Prefixed-HI )
8609 ())
8610
8611 (dni stc32.src-cr2 "stc src,dest" ((machine 32))
8612 ("stc ${cr2-32},${dst32-16-Unprefixed-SI}")
8613 (+ (f-0-4 #xD) dst32-16-Unprefixed-SI (f-7-1 1) (f-10-2 0) (f-12-1 2) cr2-32)
8614 (stc32-cr2-sem cr2-32 dst32-16-Unprefixed-SI )
8615 ())
8616
8617 (dni stc32.src-cr3 "stc src,dst" ((machine 32))
8618 ("stc ${cr3-Prefixed-32},${dst32-24-Prefixed-SI}")
8619 (+ (f-0-4 0) (f-4-4 1) (f-8-4 #xD) dst32-24-Prefixed-SI (f-15-1 1) (f-18-2 1) (f-20-1 0) cr3-Prefixed-32)
8620 (stc32-cr3-sem cr3-Prefixed-32 dst32-24-Prefixed-SI )
8621 ())
8622
8623 ;-------------------------------------------------------------
8624 ; ldctx - load context
8625 ; stctx - store context
8626 ;-------------------------------------------------------------
8627
8628 ; ??? semantics
8629 (dni ldctx16 "ldctx abs16,abs24" ((machine 16))
8630 ("ldctx ${Dsp-16-u16},${Dsp-32-u24}")
8631 (+ (f-0-4 #x7) (f-4-4 #xC) (f-8-4 #xF) (f-12-4 #x0) Dsp-16-u16 Dsp-32-u24)
8632 (nop)
8633 ())
8634 (dni ldctx32 "ldctx abs16,abs24" ((machine 32))
8635 ("ldctx ${Dsp-16-u16},${Dsp-32-u24}")
8636 (+ (f-0-4 #xB) (f-4-4 #x6) (f-8-4 #xC) (f-12-4 #x3) Dsp-16-u16 Dsp-32-u24)
8637 (nop)
8638 ())
8639 (dni stctx16 "stctx abs16,abs24" ((machine 16))
8640 ("stctx ${Dsp-16-u16},${Dsp-32-u24}")
8641 (+ (f-0-4 #x7) (f-4-4 #xD) (f-8-4 #xF) (f-12-4 #x0) Dsp-16-u16 Dsp-32-u24)
8642 (nop)
8643 ())
8644 (dni stctx32 "stctx abs16,abs24" ((machine 32))
8645 ("stctx ${Dsp-16-u16},${Dsp-32-u24}")
8646 (+ (f-0-4 #xB) (f-4-4 #x6) (f-8-4 #xD) (f-12-4 #x3) Dsp-16-u16 Dsp-32-u24)
8647 (nop)
8648 ())
8649
8650 ;-------------------------------------------------------------
8651 ; lde - load from extra far data area (m16)
8652 ; ste - store to extra far data area (m16)
8653 ;-------------------------------------------------------------
8654
8655 (lde-dst QI .b 0)
8656 (lde-dst HI .w 1)
8657
8658 (ste-dst QI .b 0)
8659 (ste-dst HI .w 1)
8660
8661 ;-------------------------------------------------------------
8662 ; ldipl - load interrupt permission level
8663 ;-------------------------------------------------------------
8664
8665 ; ??? semantics
8666 ; ldintb <==> ldc #imm,intbh ; ldc #imm,intbl
8667
8668 (dni ldipl16.imm "ldipl #imm" ((machine 16))
8669 ("ldipl #${Imm-13-u3}")
8670 (+ (f-0-4 #x7) (f-4-4 #xD) (f-8-4 #xA) (f-12-1 0) Imm-13-u3)
8671 (nop)
8672 ())
8673 (dni ldipl32.imm "ldipl #imm" ((machine 32))
8674 ("ldipl #${Imm-13-u3}")
8675 (+ (f-0-4 #xD) (f-4-4 5) (f-8-4 #xE) (f-12-1 1) Imm-13-u3)
8676 (nop)
8677 ())
8678
8679
8680 ;-------------------------------------------------------------
8681 ; max - maximum value
8682 ;-------------------------------------------------------------
8683
8684 ; TODO check semantics for min -1,0
8685 (define-pmacro (max-sem mode src dst)
8686 (sequence ()
8687 (if (gt mode src dst)
8688 (set mode dst src)))
8689 )
8690
8691 ; max.size:G #imm,dst
8692 (binary-arith32-imm-dst-Prefixed QI QI .b 0 max X #x8 #x3 #xF max-sem)
8693 (binary-arith32-imm-dst-Prefixed HI HI .w 1 max X #x8 #x3 #xF max-sem)
8694
8695 ; max.BW:G src,dst
8696 (binary-arith32-src-dst-Prefixed QI QI .b 0 max X #x1 #xD max-sem)
8697 (binary-arith32-src-dst-Prefixed HI HI .w 1 max X #x1 #xD max-sem)
8698
8699 ;-------------------------------------------------------------
8700 ; min - minimum value
8701 ;-------------------------------------------------------------
8702
8703 (define-pmacro (min-sem mode src dst)
8704 (sequence ()
8705 (if (lt mode src dst)
8706 (set mode dst src)))
8707 )
8708
8709 ; min.size:G #imm,dst
8710 (binary-arith32-imm-dst-Prefixed QI QI .b 0 min X #x8 #x2 #xF min-sem)
8711 (binary-arith32-imm-dst-Prefixed HI HI .w 1 min X #x8 #x2 #xF min-sem)
8712
8713 ; min.BW:G src,dst
8714 (binary-arith32-src-dst-Prefixed QI QI .b 0 min X #x1 #xC min-sem)
8715 (binary-arith32-src-dst-Prefixed HI HI .w 1 min X #x1 #xC min-sem)
8716
8717 ;-------------------------------------------------------------
8718 ; mov - move
8719 ;-------------------------------------------------------------
8720
8721 (define-pmacro (mov-sem mode src1 dst)
8722 (sequence ((mode result))
8723 (set result src1)
8724 (set-z-and-s result)
8725 (set mode dst src1))
8726 )
8727
8728 (define-pmacro (mov-dspsp-dst-sem mach mode src1 dst)
8729 (set dst (mem-mach mach mode (add sp src1)))
8730 )
8731
8732 (define-pmacro (mov-src-dspsp-sem mach mode src dst1)
8733 (set (mem-mach mach mode (add sp dst1)) src)
8734 )
8735
8736 (define-pmacro (mov16-imm-an-defn size mode imm regn op1 op2)
8737 (dni (.sym mov16. size .S-imm- regn)
8738 (.str "mov." size ":S " imm "," regn)
8739 ((machine 16))
8740 (.str "mov." size "$S #${" imm "}," regn)
8741 (+ op1 op2 imm)
8742 (mov-sem mode imm (reg (.sym h- regn)))
8743 ())
8744 )
8745 ; mov.size:G #imm,dst (m16 #1 m32 #1)
8746 (binary-arith-imm-dst mov G (f-0-4 7) (f-4-3 2) (f-8-4 #xC) #x9 #x2 #xF mov-sem)
8747 ; mov.L:G #imm32,dst (m32 #2)
8748 (binary-arith32-imm-dst-defn SI SI .l 0 mov G #xB #x3 #x1 mov-sem)
8749 ; mov.BW:S #imm,dst2 (m32 #4)
8750 (binary-arith32-s-imm-dst QI .b 0 mov #x0 #x2 mov-sem)
8751 (binary-arith32-s-imm-dst HI .w 1 mov #x0 #x2 mov-sem)
8752 ; mov.b:S #imm8,dst3 (m16 #3)
8753 (binary-arith16-b-S-imm8-dst3 mov ".b" (f-0-4 #xC) (f-4-1 0) mov-sem)
8754 ; mov.b:S #imm8,aN (m16 #4)
8755 (mov16-imm-an-defn b QI Imm-8-QI a0 (f-0-4 #xE) (f-4-4 2))
8756 (mov16-imm-an-defn b QI Imm-8-QI a1 (f-0-4 #xE) (f-4-4 #xA))
8757 (mov16-imm-an-defn w HI Imm-8-HI a0 (f-0-4 #xA) (f-4-4 2))
8758 (mov16-imm-an-defn w HI Imm-8-HI a1 (f-0-4 #xA) (f-4-4 #xA))
8759 ; mov.WL:S #imm,A0/A1 (m32 #5)
8760 (define-pmacro (mov32-wl-s-defn mode sz op1 imm regn op2)
8761 (dni (.sym mov32- sz - regn)
8762 (.str "mov." sz ":s" imm "," regn)
8763 ((machine 32))
8764 (.str "mov." sz "$S #${" imm "}," regn)
8765 (+ (f-0-4 op1) (f-4-4 op2) imm)
8766 (mov-sem mode imm (reg (.sym h- regn)))
8767 ())
8768 )
8769 (mov32-wl-s-defn HI w #x9 Imm-8-HI a0 #xC)
8770 (mov32-wl-s-defn HI w #x9 Imm-8-HI a1 #xD)
8771 (mov32-wl-s-defn SI l #xB Dsp-8-s24 a0 #xC)
8772 (mov32-wl-s-defn SI l #xB Dsp-8-s24 a1 #xD)
8773
8774 ; mov.size:Q #imm4,dst (m16 #2 m32 #3)
8775 (binary-arith16-imm4-dst-defn QI .b 0 0 mov (f-0-4 #xD) (f-4-3 4) mov-sem)
8776 (binary-arith16-imm4-dst-defn HI .w 0 1 mov (f-0-4 #xD) (f-4-3 4) mov-sem)
8777 (binary-arith32-imm4-dst-defn QI .b 1 0 mov #x7 #x2 mov-sem)
8778 (binary-arith32-imm4-dst-defn HI .w 1 1 mov #x7 #x2 mov-sem)
8779
8780 ; mov.BW:Z #0,dst (m16 #5 m32 #6)
8781 (dni mov16.b-Z-imm8-dst3
8782 "mov.b:Z #0,Dst16-3-S-8"
8783 ((machine 16))
8784 "mov.b$Z #0,${Dst16-3-S-8}"
8785 (+ (f-0-4 #xB) (f-4-1 #x0) Dst16-3-S-8)
8786 (mov-sem QI (const 0) Dst16-3-S-8)
8787 ())
8788 ; (binary-arith16-b-Z-imm8-dst3 mov ".b" (f-0-4 #xB) (f-4-1 0) mov-sem)
8789 (binary-arith32-z-imm-dst QI .b 0 mov #x0 #x1 mov-sem)
8790 (binary-arith32-z-imm-dst HI .w 1 mov #x0 #x1 mov-sem)
8791 ; mov.BW:G src,dst (m16 #6 m32 #7)
8792 (binary-arith-src-dst mov G (f-0-4 #x7) (f-4-3 1) #x1 #xB mov-sem)
8793 ; mov.B:S src2,a0/a1 (m16 #7)
8794 (dni (.sym mov 16 .b.S-An)
8795 (.str mov ".b:S src2,a[01]")
8796 ((machine 16))
8797 (.str mov ".b$S ${src16-2-S},${Dst16AnQI-S}")
8798 (+ (f-0-4 #x3) (f-4-1 0) Dst16AnQI-S src16-2-S)
8799 (mov-sem QI src16-2-S Dst16AnQI-S)
8800 ())
8801 (define-pmacro (mov16-b-s-an-defn op1 op2 op2c)
8802 (dni (.sym mov16.b.S- op1 - op2)
8803 (.str mov ".b:S " op1 "," op2)
8804 ((machine 16))
8805 (.str mov ".b$S " op1 "," op2)
8806 (+ (f-0-4 #x3) op2c)
8807 (mov-sem QI (reg (.sym h- op1)) (reg (.sym h- op2)))
8808 ())
8809 )
8810 (mov16-b-s-an-defn r0l a1 (f-4-4 #x4))
8811 (mov16-b-s-an-defn r0h a0 (f-4-4 #x0))
8812
8813 ; mov.L:G src,dst (m32 #8)
8814 (binary-arith32-src-dst-defn SI SI .l 1 mov G #x1 #x3 mov-sem)
8815 ; mov.B:S r0l/r0h,dst2 (m16 #8)
8816 (dni (.sym mov 16 .b.S-Rn-An)
8817 (.str mov ".b:S r0[lh],src2")
8818 ((machine 16))
8819 (.str mov ".b$S ${Dst16RnQI-S},${src16-2-S}")
8820 (+ (f-0-4 #x0) (f-4-1 0) Dst16RnQI-S src16-2-S)
8821 (mov-sem QI src16-2-S Dst16RnQI-S)
8822 ())
8823
8824 ; mov.B.S src2,r0l/r0h (m16 #9)
8825 (binary-arith16-b-S-src2 mov (f-0-4 0) (f-4-1 1) mov-sem)
8826
8827 ; mov.BW:S src2,r0l/r0 (m32 #9)
8828 ; mov.BW:S src2,r1l/r1 (m32 #10)
8829 (define-pmacro (mov32-src-r sz szcode mode src dst opc1 opc2)
8830 (begin
8831 (dni (.sym mov32. sz - src - dst)
8832 (.str "mov." sz "src," dst)
8833 ((machine 32))
8834 (.str "mov." sz "$S ${" (.sym src - mode) "}," dst)
8835 (+ (f-0-2 opc1) (.sym src - mode) (f-4-3 opc2) (f-7-1 szcode))
8836 (mov-sem mode (.sym src - mode) (reg (.sym h- dst)))
8837 ())
8838 )
8839 )
8840 (mov32-src-r b 0 QI dst32-2-S-16 r0l 0 4)
8841 (mov32-src-r w 1 HI dst32-2-S-16 r0 0 4)
8842 (mov32-src-r b 0 QI dst32-2-S-8 r0l 0 4)
8843 (mov32-src-r w 1 HI dst32-2-S-8 r0 0 4)
8844 (mov32-src-r b 0 QI dst32-2-S-basic r1l 1 7)
8845 (mov32-src-r w 1 HI dst32-2-S-basic r1 1 7)
8846 (mov32-src-r b 0 QI dst32-2-S-16 r1l 1 7)
8847 (mov32-src-r w 1 HI dst32-2-S-16 r1 1 7)
8848 (mov32-src-r b 0 QI dst32-2-S-8 r1l 1 7)
8849 (mov32-src-r w 1 HI dst32-2-S-8 r1 1 7)
8850
8851 ; mov.BW:S r0l/r0,dst2 (m32 #11)
8852 (define-pmacro (mov32-r-dest sz szcode mode src dst opc1 opc2)
8853 (begin
8854 (dni (.sym mov32. sz - src - dst)
8855 (.str "mov." sz "src," dst)
8856 ((machine 32))
8857 (.str "mov." sz "$S " src ",${" (.sym dst - mode) "}")
8858 (+ (f-0-2 opc1) (.sym dst - mode) (f-4-3 opc2) (f-7-1 szcode))
8859 (mov-sem mode (reg (.sym h- src)) (.sym dst - mode))
8860 ())
8861 )
8862 )
8863 (mov32-r-dest b 0 QI r0l dst32-2-S-16 0 0)
8864 (mov32-r-dest w 1 HI r0 dst32-2-S-16 0 0)
8865 (mov32-r-dest b 0 QI r0l dst32-2-S-8 0 0)
8866 (mov32-r-dest w 1 HI r0 dst32-2-S-8 0 0)
8867
8868 ; mov.L:S src,A0/A1 (m32 #12)
8869 (define-pmacro (mov32-src-a src dst dstcode opc1 opc2)
8870 (begin
8871 (dni (.sym mov32. sz - src - dst)
8872 (.str "mov." sz "src," dst)
8873 ((machine 32))
8874 (.str "mov.l" "$S ${" (.sym src - SI) "}," dst)
8875 (+ (f-0-2 opc1) (.sym src - SI) (f-4-3 opc2) (f-7-1 dstcode))
8876 (mov-sem SI (.sym src - SI) (reg (.sym h- dst)))
8877 ())
8878 )
8879 )
8880 (mov32-src-a dst32-2-S-16 a0 0 1 4)
8881 (mov32-src-a dst32-2-S-16 a1 1 1 4)
8882 (mov32-src-a dst32-2-S-8 a0 0 1 4)
8883 (mov32-src-a dst32-2-S-8 a1 1 1 4)
8884
8885 ; mov.BW:G dsp8[sp],dst (m16 #10 m32 #13)
8886 ; mov.BW:G src,dsp8[sp] (m16 #11 m32 #14)
8887 (mov-dspsp-dst mov (f-0-4 #x7) (f-4-3 2) (f-8-4 #xB) #xB #x0 #xF mov-dspsp-dst-sem)
8888 (mov-src-dspsp mov (f-0-4 #x7) (f-4-3 2) (f-8-4 #x3) #xA #x0 #xF mov-src-dspsp-sem)
8889
8890 ;-------------------------------------------------------------
8891 ; mova - move effective address
8892 ;-------------------------------------------------------------
8893
8894 (define-pmacro (mov16a-defn dst dstop dstcode)
8895 (dni (.sym mova16. src - dst)
8896 (.str "mova src," dst)
8897 ((machine 16))
8898 (.str "mova ${dst16-16-Mova-HI}," dst)
8899 (+ (f-0-4 #xE) (f-4-4 #xB) dst16-16-Mova-HI (f-8-4 dstcode))
8900 (sequence () (set HI (reg dstop) dst16-16-Mova-HI))
8901 ())
8902 )
8903 (mov16a-defn r0 h-r0 0)
8904 (mov16a-defn r1 h-r1 1)
8905 (mov16a-defn r2 h-r2 2)
8906 (mov16a-defn r3 h-r3 3)
8907 (mov16a-defn a0 h-a0 4)
8908 (mov16a-defn a1 h-a1 5)
8909
8910 (define-pmacro (mov32a-defn dst dstop dstcode)
8911 (dni (.sym mova32. src - dst)
8912 (.str "mova src," dst)
8913 ((machine 32))
8914 (.str "mova ${dst32-16-Unprefixed-Mova-SI}," dst)
8915 (+ (f-0-4 #xD) dst32-16-Unprefixed-Mova-SI (f-7-1 1) (f-10-2 1) (f-12-1 1) (f-13-3 dstcode))
8916 (sequence () (set SI (reg dstop) dst32-16-Unprefixed-Mova-SI))
8917 ())
8918 )
8919 (mov32a-defn r2r0 h-r2r0 0)
8920 (mov32a-defn r3r1 h-r3r1 1)
8921 (mov32a-defn a0 h-a0 2)
8922 (mov32a-defn a1 h-a1 3)
8923
8924 ;-------------------------------------------------------------
8925 ; movDir - move nibble
8926 ;-------------------------------------------------------------
8927
8928 (define-pmacro (movdir-sem nib src dst)
8929 (sequence ((SI tmp))
8930 (case DFLT nib
8931 ((0) (set dst (or (and dst #xf0) (and src #xf))))
8932 ((1) (set dst (or (and dst #x0f) (sll (and src #xf) 4))))
8933 ((2) (set dst (or (and dst #xf0) (srl (and src #xf0) 4))))
8934 ((3) (set dst (or (and dst #x0f) (and src #xf0))))
8935 )
8936 )
8937 )
8938 ; movDir src,dst
8939 (define-pmacro (mov16dir-1-defn nib dircode dir)
8940 (dni (.sym mov nib 16 ".r0l-dst")
8941 (.str "mov" nib " r0l,dst")
8942 ((machine 16))
8943 (.str "mov" nib " r0l,${dst16-16-QI}")
8944 (+ (f-0-4 7) (f-4-4 #xC) (f-8-4 dir) dst16-16-QI)
8945 (movdir-sem dircode (reg h-r0l) dst16-16-QI)
8946 ())
8947 )
8948 (mov16dir-1-defn ll 0 8)
8949 (mov16dir-1-defn lh 1 #xA)
8950 (mov16dir-1-defn hl 2 9)
8951 (mov16dir-1-defn hh 3 #xB)
8952 (define-pmacro (mov16dir-2-defn nib dircode dir)
8953 (dni (.sym mov nib 16 ".src-r0l")
8954 (.str "mov" nib " src,r0l")
8955 ((machine 16))
8956 (.str "mov" nib " ${dst16-16-QI},r0l")
8957 (+ (f-0-4 7) (f-4-4 #xC) (f-8-4 dir) dst16-16-QI)
8958 (movdir-sem dircode dst16-16-QI (reg h-r0l))
8959 ())
8960 )
8961 (mov16dir-2-defn ll 0 0)
8962 (mov16dir-2-defn lh 1 2)
8963 (mov16dir-2-defn hl 2 1)
8964 (mov16dir-2-defn hh 3 3)
8965
8966 (define-pmacro (mov32dir-1-defn nib o1o0)
8967 (dni (.sym mov nib 32 ".r0l-dst")
8968 (.str "mov" nib " r0l,dst")
8969 ((machine 32))
8970 (.str "mov" nib " r0l,${dst32-24-Prefixed-QI}")
8971 (+ (f-0-4 #x0) (f-4-4 #x1) (f-8-4 #xB) dst32-24-Prefixed-QI (f-15-1 0) (f-18-2 o1o0) (f-20-4 #xE))
8972 (movdir-sem o1o0 (reg h-r0l) dst32-24-Prefixed-QI)
8973 ())
8974 )
8975 (mov32dir-1-defn ll 0)
8976 (mov32dir-1-defn lh 1)
8977 (mov32dir-1-defn hl 2)
8978 (mov32dir-1-defn hh 3)
8979 (define-pmacro (mov32dir-2-defn nib o1o0)
8980 (dni (.sym mov nib 32 ".src-r0l")
8981 (.str "mov" nib " src,r0l")
8982 ((machine 32))
8983 (.str "mov" nib " ${dst32-24-Prefixed-QI},r0l")
8984 (+ (f-0-4 #x0) (f-4-4 #x1) (f-8-4 #xA) dst32-24-Prefixed-QI (f-15-1 0) (f-18-2 o1o0) (f-20-4 #xE))
8985 (movdir-sem o1o0 dst32-24-Prefixed-QI (reg h-r0l))
8986 ())
8987 )
8988 (mov32dir-2-defn ll 0)
8989 (mov32dir-2-defn lh 1)
8990 (mov32dir-2-defn hl 2)
8991 (mov32dir-2-defn hh 3)
8992
8993 ;-------------------------------------------------------------
8994 ; movx - move extend sign (m32)
8995 ;-------------------------------------------------------------
8996
8997 (define-pmacro (movx-sem mode src dst)
8998 (sequence ((SI source) (SI result))
8999 (set SI result src)
9000 (set-z-and-s result)
9001 (set dst result))
9002 )
9003
9004 ; movx #imm,dst
9005 (binary-arith32-imm-dst-defn QI SI "" 0 movx X #xB #x1 #x1 movx-sem)
9006
9007 ;-------------------------------------------------------------
9008 ; mul - multiply
9009 ;-------------------------------------------------------------
9010
9011 (define-pmacro (mul-sem mode src1 dst)
9012 (sequence ((mode result))
9013 (set obit (add-oflag mode src1 dst 0))
9014 (set result (mul mode src1 dst))
9015 (set dst result))
9016 )
9017
9018 ; mul.BW #imm,dst
9019 (binary-arith-imm-dst mul G (f-0-4 7) (f-4-3 6) (f-8-4 5) #x8 #x1 #xF mul-sem)
9020 ; mul.BW src,dst
9021 (binary-arith-src-dst mul G (f-0-4 #x7) (f-4-3 4) #x1 #xC mul-sem)
9022
9023 (dni mul_l "mul.l src,r2r0" ((machine 32))
9024 ("mul.l ${dst32-24-Prefixed-SI},r2r0")
9025 (+ (f-0-4 #x0) (f-4-4 #x1) (f-8-4 #x8) (f-15-1 #x1) (f-18-2 #x1) (f-20-4 #xf)
9026 dst32-24-Prefixed-SI)
9027 () ())
9028
9029 (dni mulu_l "mulu.l src,r2r0" ((machine 32))
9030 ("mulu.l ${dst32-24-Prefixed-SI},r2r0")
9031 (+ (f-0-4 #x0) (f-4-4 #x1) (f-8-4 #x8) (f-15-1 #x1) (f-18-2 #x0) (f-20-4 #xf)
9032 dst32-24-Prefixed-SI)
9033 () ())
9034 ;-------------------------------------------------------------
9035 ; mulex - multiple extend sign (m32)
9036 ;-------------------------------------------------------------
9037
9038 ; mulex src,dst
9039 ; (dni mulex-absolute-indirect "mulex [src]" ((machine 32))
9040 ; ("mulex ${dst32-24-absolute-indirect-HI}")
9041 ; (+ (f-0-4 0) (f-4-4 9) (f-8-4 #xC) dst32-24-absolute-indirect-HI (f-15-1 1) (f-18-2 3) (f-20-4 #xE))
9042 ; (set R1R2R0 (mul DI (ext DI R2R0) (ext DI dst32-24-absolute-indirect-HI)))
9043 ; ())
9044 (dni mulex "mulex src" ((machine 32))
9045 ("mulex ${dst32-16-Unprefixed-Mulex-HI}")
9046 (+ (f-0-4 #xC) dst32-16-Unprefixed-Mulex-HI (f-7-1 1) (f-10-2 3) (f-12-4 #xE))
9047 (set R1R2R0 (mul DI (ext DI R2R0) (ext DI dst32-16-Unprefixed-Mulex-HI)))
9048 ())
9049 ; (dni mulex-indirect "mulex [src]" ((machine 32))
9050 ; ("mulex ${dst32-24-indirect-HI}")
9051 ; (+ (f-0-4 0) (f-4-4 9) (f-8-4 #xC) dst32-24-indirect-HI (f-15-1 1) (f-18-2 3) (f-20-4 #xE))
9052 ; (set R1R2R0 (mul DI (ext DI R2R0) (ext DI dst32-24-indirect-HI)))
9053 ; ())
9054
9055 ;-------------------------------------------------------------
9056 ; mulu - multiply unsigned
9057 ;-------------------------------------------------------------
9058
9059 (define-pmacro (mulu-sem mode src1 dst)
9060 (sequence ((mode result))
9061 (set obit (add-oflag mode src1 dst 0))
9062 (set result (mul mode src1 dst))
9063 (set dst result))
9064 )
9065
9066 ; mulu.BW #imm,dst
9067 (binary-arith-imm-dst mulu G (f-0-4 7) (f-4-3 6) (f-8-4 4) #x8 #x0 #xF mulu-sem)
9068 ; mulu.BW src,dst
9069 (binary-arith-src-dst mulu G (f-0-4 #x7) (f-4-3 0) #x1 #x4 mulu-sem)
9070
9071 ;-------------------------------------------------------------
9072 ; neg - twos complement
9073 ;-------------------------------------------------------------
9074
9075 (define-pmacro (neg-sem mode dst)
9076 (sequence ((mode result))
9077 (set result (neg mode dst))
9078 (set-z-and-s result)
9079 (set dst result))
9080 )
9081
9082 ; neg.BW:G
9083 (unary-insn neg (f-0-4 7) (f-4-3 2) (f-8-4 #x5) #xA #x2 #xF neg-sem)
9084
9085 ;-------------------------------------------------------------
9086 ; not - twos complement
9087 ;-------------------------------------------------------------
9088
9089 (define-pmacro (not-sem mode dst)
9090 (sequence ((mode result))
9091 (set result (not mode dst))
9092 (set-z-and-s result)
9093 (set dst result))
9094 )
9095
9096 ; not.BW:G
9097 (unary-insn-g not (f-0-4 7) (f-4-3 2) (f-8-4 #x7) #xA #x1 #xE not-sem)
9098
9099 (dni not16.b.s
9100 "not.b:s Dst16-3-S-8"
9101 ((machine 16))
9102 "not.b:s ${Dst16-3-S-8}"
9103 (+ (f-0-4 #xb) (f-4-1 #x1) Dst16-3-S-8)
9104 (not-sem QI Dst16-3-S-8)
9105 ())
9106
9107 ;-------------------------------------------------------------
9108 ; nop
9109 ;-------------------------------------------------------------
9110
9111 (dni nop16
9112 "nop"
9113 ((machine 16))
9114 "nop"
9115 (+ (f-0-4 #x0) (f-4-4 #x4))
9116 (nop)
9117 ())
9118
9119 (dni nop32
9120 "nop"
9121 ((machine 32))
9122 "nop"
9123 (+ (f-0-4 #xD) (f-4-4 #xE))
9124 (nop)
9125 ())
9126
9127 ;-------------------------------------------------------------
9128 ; or - logical or
9129 ;-------------------------------------------------------------
9130
9131 (define-pmacro (or-sem mode src1 dst)
9132 (sequence ((mode result))
9133 (set result (or mode src1 dst))
9134 (set-z-and-s result)
9135 (set dst result))
9136 )
9137
9138 ; or.BW #imm,dst (m16 #1 m32 #1)
9139 (binary-arith-imm-dst or G (f-0-4 7) (f-4-3 3) (f-8-4 3) #x8 #x2 #xF or-sem)
9140 ; or.b:S #imm8,dst3 (m16 #2 m32 #2)
9141 (binary-arith16-b-S-imm8-dst3 or ".b" (f-0-4 9) (f-4-1 1) or-sem)
9142 (binary-arith32-s-imm-dst QI .b 0 or #x1 #x2 or-sem)
9143 (binary-arith32-s-imm-dst HI .w 1 or #x1 #x2 or-sem)
9144 ; or.BW src,dst (m16 #3 m32 #3)
9145 (binary-arith-src-dst or G (f-0-4 #x9) (f-4-3 4) #x1 #x5 or-sem)
9146 ; or.b:S src,r0[lh] (m16)
9147 (binary-arith16-b-S-src2 or (f-0-4 1) (f-4-1 1) or-sem)
9148
9149 ;-------------------------------------------------------------
9150 ; pop - restore register/memory
9151 ;-------------------------------------------------------------
9152
9153 ; TODO future: split this into .b and .w semantics
9154 (define-pmacro (pop-sem-mach mach mode dst)
9155 (sequence ((mode b_or_w) (SI length))
9156 (set b_or_w -1)
9157 (set b_or_w (srl b_or_w #x8))
9158 (if (eq b_or_w #x0)
9159 (set length 1) ; .b
9160 (set length 2)) ; .w
9161
9162 (case DFLT length
9163 ((1) (set dst (mem-mach mach QI (reg h-sp))))
9164 ((2) (set dst (mem-mach mach HI (reg h-sp)))))
9165 (set (reg h-sp) (add (reg h-sp) length))
9166 )
9167 )
9168
9169 (define-pmacro (pop-sem16 mode dest) (pop-sem-mach 16 mode dest))
9170 (define-pmacro (pop-sem32 mode dest) (pop-sem-mach 32 mode dest))
9171
9172 ; pop.BW:G (m16 #1)
9173 (unary-insn-mach-g 16 pop (f-0-4 7) (f-4-3 2) (f-8-4 #xD) pop-sem16 $G)
9174 ; pop.BW:G (m32 #1)
9175 (unary-insn-mach 32 pop #xB #x2 #xF pop-sem32)
9176
9177 ; pop.b:S r0l/r0h
9178 (dni pop16.b-s-rn "pop.b:S r0[lh]" ((machine 16))
9179 "pop.b$S ${Rn16-push-S-anyof}"
9180 (+ (f-0-4 #x9) Rn16-push-S-anyof (f-5-3 #x2))
9181 (pop-sem16 QI Rn16-push-S-anyof)
9182 ())
9183 ; pop.w:S a0/a1
9184 (dni pop16.b-s-an "pop.w:S a[01]" ((machine 16))
9185 "pop.w$S ${An16-push-S-anyof}"
9186 (+ (f-0-4 #xD) An16-push-S-anyof (f-5-3 #x2))
9187 (pop-sem16 HI An16-push-S-anyof)
9188 ())
9189
9190 ;-------------------------------------------------------------
9191 ; popc - pop control register
9192 ; pushc - push control register
9193 ;-------------------------------------------------------------
9194
9195 (define-pmacro (popc32-cr1-sem mode dst)
9196 (sequence ()
9197 (case DFLT dst
9198 ((#x0) (set (reg h-dct0) (mem32 mode (reg h-sp))))
9199 ((#x1) (set (reg h-dct1) (mem32 mode (reg h-sp))))
9200 ((#x2) (sequence ((HI tflag))
9201 (set tflag (mem32 mode (reg h-sp)))
9202 (if (and tflag #x1) (set cbit 1))
9203 (if (and tflag #x2) (set dbit 1))
9204 (if (and tflag #x4) (set zbit 1))
9205 (if (and tflag #x8) (set sbit 1))
9206 (if (and tflag #x10) (set bbit 1))
9207 (if (and tflag #x20) (set obit 1))
9208 (if (and tflag #x40) (set ibit 1))
9209 (if (and tflag #x80) (set ubit 1))))
9210 ((#x3) (set (reg h-svf) (mem32 mode (reg h-sp))))
9211 ((#x4) (set (reg h-drc0) (mem32 mode (reg h-sp))))
9212 ((#x5) (set (reg h-drc1) (mem32 mode (reg h-sp))))
9213 ((#x6) (set (reg h-dmd0) (mem32 mode (reg h-sp))))
9214 ((#x7) (set (reg h-dmd1) (mem32 mode (reg h-sp))))
9215 )
9216 (set (reg h-sp) (add (reg h-sp) 2))
9217 )
9218 )
9219 (define-pmacro (popc32-cr2-sem mode dst)
9220 (sequence ()
9221 (case DFLT dst
9222 ((#x0) (set (reg h-intb) (mem32 mode (reg h-sp))))
9223 ((#x1) (set (reg h-sp) (mem32 mode (reg h-sp))))
9224 ((#x2) (set (reg h-sb) (mem32 mode (reg h-sp))))
9225 ((#x3) (set (reg h-fb) (mem32 mode (reg h-sp))))
9226 ((#x7) (set (reg h-isp) (mem32 mode (reg h-sp))))
9227 )
9228 (set (reg h-sp) (add (reg h-sp) 4))
9229 )
9230 )
9231 (define-pmacro (popc16-sem mode dst)
9232 (sequence ()
9233 (case DFLT dst
9234 ((#x1) (set (reg h-intb) (or (and (reg h-intb) #x0000)
9235 (mem16 mode (reg h-sp)))))
9236 ((#x2) (set (reg h-intb) (or (and (reg h-intb) #xffff0000)
9237 (mem16 mode (reg h-sp)))))
9238 ((#x3) (sequence ((HI tflag))
9239 (set tflag (mem16 mode (reg h-sp)))
9240 (if (and tflag #x1) (set cbit 1))
9241 (if (and tflag #x2) (set dbit 1))
9242 (if (and tflag #x4) (set zbit 1))
9243 (if (and tflag #x8) (set sbit 1))
9244 (if (and tflag #x10) (set bbit 1))
9245 (if (and tflag #x20) (set obit 1))
9246 (if (and tflag #x40) (set ibit 1))
9247 (if (and tflag #x80) (set ubit 1))))
9248 ((#x4) (set (reg h-isp) (mem16 mode (reg h-sp))))
9249 ((#x5) (set (reg h-sp) (mem16 mode (reg h-sp))))
9250 ((#x6) (set (reg h-sb) (mem16 mode (reg h-sp))))
9251 ((#x7) (set (reg h-fb) (mem16 mode (reg h-sp))))
9252 )
9253 (set (reg h-sp) (add (reg h-sp) 2))
9254 )
9255 )
9256 ; popc dest (m16c #1)
9257 (dni popc16.imm16 "popc dst" ((machine 16))
9258 ("popc ${cr16}")
9259 (+ (f-0-4 #xE) (f-4-4 #xB) (f-8-1 0) (f-12-4 3) cr16)
9260 (popc16-sem HI cr16)
9261 ())
9262 ; popc dest (m32c #1)
9263 (dni popc32.imm16-cr1 "popc dst" ((machine 32))
9264 ("popc ${cr1-Unprefixed-32}")
9265 (+ (f-0-4 #xD) (f-4-4 3) (f-8-4 #xA) (f-12-1 1) cr1-Unprefixed-32)
9266 (popc32-cr1-sem HI cr1-Unprefixed-32)
9267 ())
9268 ; popc dest (m32c #2)
9269 (dni popc32.imm16-cr2 "popc dst" ((machine 32))
9270 ("popc ${cr2-32}")
9271 (+ (f-0-4 #xD) (f-4-4 3) (f-8-4 2) (f-12-1 1) cr2-32)
9272 (popc32-cr2-sem SI cr2-32)
9273 ())
9274
9275 (define-pmacro (pushc32-cr1-sem mode dst)
9276 (sequence ()
9277 (set (reg h-sp) (sub (reg h-sp) 2))
9278 (case DFLT dst
9279 ((#x0) (set (mem32 mode (reg h-sp)) (reg h-dct0)))
9280 ((#x1) (set (mem32 mode (reg h-sp)) (reg h-dct1)))
9281 ((#x2) (sequence ((HI tflag))
9282 (set tflag 0)
9283 (if (eq cbit 1) (set tflag (or tflag #x1)))
9284 (if (eq dbit 1) (set tflag (or tflag #x2)))
9285 (if (eq zbit 1) (set tflag (or tflag #x4)))
9286 (if (eq sbit 1) (set tflag (or tflag #x8)))
9287 (if (eq bbit 1) (set tflag (or tflag #x10)))
9288 (if (eq obit 1) (set tflag (or tflag #x20)))
9289 (if (eq ibit 1) (set tflag (or tflag #x40)))
9290 (if (eq ubit 1) (set tflag (or tflag #x80)))
9291 (set (mem32 mode (reg h-sp)) tflag)))
9292 ((#x3) (set (mem32 mode (reg h-sp)) (reg h-svf)))
9293 ((#x4) (set (mem32 mode (reg h-sp)) (reg h-drc0)))
9294 ((#x5) (set (mem32 mode (reg h-sp)) (reg h-drc1)))
9295 ((#x6) (set (mem32 mode (reg h-sp)) (reg h-dmd0)))
9296 ((#x7) (set (mem32 mode (reg h-sp)) (reg h-dmd1)))
9297 )
9298 )
9299 )
9300 (define-pmacro (pushc32-cr2-sem mode dst)
9301 (sequence ()
9302 (set (reg h-sp) (sub (reg h-sp) 4))
9303 (case DFLT dst
9304 ((#x0) (set (mem32 mode (reg h-sp)) (reg h-intb)))
9305 ((#x1) (set (mem32 mode (reg h-sp)) (reg h-sp)))
9306 ((#x2) (set (mem32 mode (reg h-sp)) (reg h-sb)))
9307 ((#x3) (set (mem32 mode (reg h-sp)) (reg h-fb)))
9308 ((#x7) (set (mem32 mode (reg h-sp)) (reg h-isp)))
9309 )
9310 )
9311 )
9312 (define-pmacro (pushc16-sem mode dst)
9313 (sequence ()
9314 (set (reg h-sp) (sub (reg h-sp) 2))
9315 (case DFLT dst
9316 ((#x1) (set (mem16 mode (reg h-sp)) (and (reg h-intb) #xffff)))
9317 ((#x2) (set (mem16 mode (reg h-sp)) (and (reg h-intb) #xffff0000)))
9318 ((#x3) (sequence ((HI tflag))
9319 (if (eq cbit 1) (set tflag (or tflag #x1)))
9320 (if (eq dbit 1) (set tflag (or tflag #x2)))
9321 (if (eq zbit 1) (set tflag (or tflag #x4)))
9322 (if (eq sbit 1) (set tflag (or tflag #x8)))
9323 (if (eq bbit 1) (set tflag (or tflag #x10)))
9324 (if (eq obit 1) (set tflag (or tflag #x20)))
9325 (if (eq ibit 1) (set tflag (or tflag #x40)))
9326 (if (eq ubit 1) (set tflag (or tflag #x80)))
9327 (set (mem16 mode (reg h-sp)) tflag)))
9328
9329 ((#x4) (set (mem16 mode (reg h-sp)) (reg h-isp)))
9330 ((#x5) (set (mem16 mode (reg h-sp)) (reg h-sp)))
9331 ((#x6) (set (mem16 mode (reg h-sp)) (reg h-sb)))
9332 ((#x7) (set (mem16 mode (reg h-sp)) (reg h-fb)))
9333 )
9334 )
9335 )
9336 ; pushc src (m16c)
9337 (dni pushc16.imm16 "pushc dst" ((machine 16))
9338 ("pushc ${cr16}")
9339 (+ (f-0-4 #xE) (f-4-4 #xB) (f-8-1 0) (f-12-4 2) cr16)
9340 (pushc16-sem HI cr16)
9341 ())
9342 ; pushc src (m32c #1)
9343 (dni pushc32.imm16-cr1 "pushc dst" ((machine 32))
9344 ("pushc ${cr1-Unprefixed-32}")
9345 (+ (f-0-4 #xD) (f-4-4 1) (f-8-4 #xA) (f-12-1 1) cr1-Unprefixed-32)
9346 (pushc32-cr1-sem HI cr1-Unprefixed-32)
9347 ())
9348 ; pushc src (m32c #2)
9349 (dni pushc32.imm16-cr2 "pushc dst" ((machine 32))
9350 ("pushc ${cr2-32}")
9351 (+ (f-0-4 #xD) (f-4-4 1) (f-8-4 2) (f-12-1 1) cr2-32)
9352 (pushc32-cr2-sem SI cr2-32)
9353 ())
9354
9355 ;-------------------------------------------------------------
9356 ; popm - pop multiple
9357 ; pushm - push multiple
9358 ;-------------------------------------------------------------
9359
9360 (define-pmacro (popm-sem machine dst)
9361 (sequence ((SI addrlen))
9362 (if (eq machine 16)
9363 (set addrlen 2)
9364 (set addrlen 4))
9365 (if (and dst 1)
9366 (sequence () (set R0 (mem-mach machine HI (reg h-sp)))
9367 (set (reg h-sp) (add (reg h-sp) 2))))
9368 (if (and dst 2)
9369 (sequence () (set R1 (mem-mach machine HI (reg h-sp)))
9370 (set (reg h-sp) (add (reg h-sp) 2))))
9371 (if (and dst 4)
9372 (sequence () (set R2 (mem-mach machine HI (reg h-sp)))
9373 (set (reg h-sp) (add (reg h-sp) 2))))
9374 (if (and dst 8)
9375 (sequence () (set R3 (mem-mach machine HI (reg h-sp)))
9376 (set (reg h-sp) (add (reg h-sp) 2))))
9377 (if (and dst 16)
9378 (sequence () (set A0 (mem-mach machine HI (reg h-sp)))
9379 (set (reg h-sp) (add (reg h-sp) addrlen))))
9380 (if (and dst 32)
9381 (sequence () (set A1 (mem-mach machine HI (reg h-sp)))
9382 (set (reg h-sp) (add (reg h-sp) addrlen))))
9383 (if (and dst 64)
9384 (sequence () (set (reg h-sb) (mem-mach machine HI (reg h-sp)))
9385 (set (reg h-sp) (add (reg h-sp) addrlen))))
9386 (if (eq dst 128)
9387 (sequence () (set (reg h-fb) (mem-mach machine HI (reg h-sp)))
9388 (set (reg h-sp) (add (reg h-sp) addrlen))))
9389 )
9390 )
9391
9392 (define-pmacro (pushm-sem machine dst)
9393 (sequence ((SI count) (SI addrlen))
9394 (if (eq machine 16)
9395 (set addrlen 2)
9396 (set addrlen 4))
9397 (if (eq dst 1)
9398 (sequence () (set (reg h-sp) (sub (reg h-sp) addrlen))
9399 (set (mem-mach machine HI (reg h-sp)) (reg h-fb))))
9400 (if (and dst 2)
9401 (sequence () (set (reg h-sp) (sub (reg h-sp) addrlen))
9402 (set (mem-mach machine HI (reg h-sp)) (reg h-sb))))
9403 (if (and dst 4)
9404 (sequence () (set (reg h-sp) (sub (reg h-sp) addrlen))
9405 (set (mem-mach machine HI (reg h-sp)) A1)))
9406 (if (and dst 8)
9407 (sequence () (set (reg h-sp) (sub (reg h-sp) addrlen))
9408 (set (mem-mach machine HI (reg h-sp)) A0)))
9409 (if (and dst 16)
9410 (sequence () (set (reg h-sp) (sub (reg h-sp) 2))
9411 (set (mem-mach machine HI (reg h-sp)) R3)))
9412 (if (and dst 32)
9413 (sequence () (set (reg h-sp) (sub (reg h-sp) 2))
9414 (set (mem-mach machine HI (reg h-sp)) R2)))
9415 (if (and dst 64)
9416 (sequence () (set (reg h-sp) (sub (reg h-sp) 2))
9417 (set (mem-mach machine HI (reg h-sp)) R1)))
9418 (if (and dst 128)
9419 (sequence () (set (reg h-sp) (sub (reg h-sp) 2))
9420 (set (mem-mach machine HI (reg h-sp)) R0)))
9421 )
9422 )
9423
9424 (dni popm16 "popm regs" ((machine 16))
9425 ("popm ${Regsetpop}")
9426 (+ (f-0-4 #xE) (f-4-4 #xD) Regsetpop)
9427 (popm-sem 16 Regsetpop)
9428 ())
9429 (dni pushm16 "pushm regs" ((machine 16))
9430 ("pushm ${Regsetpush}")
9431 (+ (f-0-4 #xE) (f-4-4 #xC) Regsetpush)
9432 (pushm-sem 16 Regsetpush)
9433 ())
9434 (dni popm "popm regs" ((machine 32))
9435 ("popm ${Regsetpop}")
9436 (+ (f-0-4 #x8) (f-4-4 #xE) Regsetpop)
9437 (popm-sem 32 Regsetpop)
9438 ())
9439 (dni pushm "pushm regs" ((machine 32))
9440 ("pushm ${Regsetpush}")
9441 (+ (f-0-4 #x8) (f-4-4 #xF) Regsetpush)
9442 (pushm-sem 32 Regsetpush)
9443 ())
9444
9445 ;-------------------------------------------------------------
9446 ; push - Save register/memory/immediate data
9447 ;-------------------------------------------------------------
9448
9449 ; TODO future: split this into .b and .w semantics
9450 (define-pmacro (push-sem-mach mach mode dst)
9451 (sequence ((mode b_or_w) (SI length))
9452 (set b_or_w -1)
9453 (set b_or_w (srl b_or_w #x8))
9454 (if (eq b_or_w #x0)
9455 (set length 1) ; .b
9456 (if (eq b_or_w #xff)
9457 (set length 2) ; .w
9458 (set length 4))) ; .l
9459 (set (reg h-sp) (sub (reg h-sp) length))
9460 (case DFLT length
9461 ((1) (set (mem-mach mach QI (reg h-sp)) dst))
9462 ((2) (set (mem-mach mach HI (reg h-sp)) dst))
9463 ((4) (set (mem-mach mach SI (reg h-sp)) dst)))
9464 )
9465 )
9466
9467 (define-pmacro (push-sem16 mode dst) (push-sem-mach 16 mode dst))
9468 (define-pmacro (push-sem32 mode dst) (push-sem-mach 32 mode dst))
9469
9470 ; push.BW:G imm (m16 #1 m32 #1)
9471 (dni push16.b.G-imm "push.b:G #Imm-16-QI" ((machine 16))
9472 ("push.b$G #${Imm-16-QI}")
9473 (+ (f-0-4 7) (f-4-4 #xC) (f-8-4 #xE) (f-12-4 2) Imm-16-QI)
9474 (push-sem16 QI Imm-16-QI)
9475 ())
9476
9477 (dni push16.w.G-imm "push.w:G #Imm-16-HI" ((machine 16))
9478 ("push.w$G #${Imm-16-HI}")
9479 (+ (f-0-4 7) (f-4-4 #xD) (f-8-4 #xE) (f-12-4 2) Imm-16-HI)
9480 (push-sem16 HI Imm-16-HI)
9481 ())
9482
9483 (dni push32.b.imm "push.b #Imm-8-QI" ((machine 32))
9484 ("push.b #${Imm-8-QI}")
9485 (+ (f-0-4 #xA) (f-4-4 #xE) Imm-8-QI)
9486 (push-sem32 QI Imm-8-QI)
9487 ())
9488
9489 (dni push32.w.imm "push.w #Imm-8-HI" ((machine 32))
9490 ("push.w #${Imm-8-HI}")
9491 (+ (f-0-4 #xA) (f-4-4 #xF) Imm-8-HI)
9492 (push-sem32 HI Imm-8-HI)
9493 ())
9494
9495 ; push.BW:G src (m16 #2)
9496 (unary-insn-mach-g 16 push (f-0-4 7) (f-4-3 2) (f-8-4 #x4) push-sem16 $G)
9497 ; push.BW:G src (m32 #2)
9498 (unary-insn-mach 32 push #xC #x0 #xE push-sem32)
9499
9500
9501 ; push.b:S r0l/r0h (m16 #3)
9502 (dni push16.b-s-rn "push.b:S r0[lh]" ((machine 16))
9503 "push.b$S ${Rn16-push-S-anyof}"
9504 (+ (f-0-4 #x8) Rn16-push-S-anyof (f-5-3 #x2))
9505 (push-sem16 QI Rn16-push-S-anyof)
9506 ())
9507 ; push.w:S a0/a1 (m16 #4)
9508 (dni push16.b-s-an "push.w:S a[01]" ((machine 16))
9509 "push.w$S ${An16-push-S-anyof}"
9510 (+ (f-0-4 #xC) An16-push-S-anyof (f-5-3 #x2))
9511 (push-sem16 HI An16-push-S-anyof)
9512 ())
9513
9514 ; push.l imm32 (m32 #3)
9515 (dni push32.l.imm "push.l #Imm-16-SI" ((machine 32))
9516 ("push.l #${Imm-16-SI}")
9517 (+ (f-0-4 #xB) (f-4-4 6) (f-8-4 5) (f-12-4 3) Imm-16-SI)
9518 (push-sem32 SI Imm-16-SI)
9519 ())
9520 ; push.l src (m32 #4)
9521 (unary-insn-defn 32 16-Unprefixed SI .l push (+ (f-0-4 #xA) (f-7-1 0) dst32-16-Unprefixed-SI (f-10-2 0) (f-12-4 1)) push-sem32)
9522
9523 ;-------------------------------------------------------------
9524 ; pusha - push effective address
9525 ;------------------------------------------------------------
9526
9527 (define-pmacro (push16a-sem mode dst)
9528 (sequence ()
9529 (set (reg h-sp) (sub (reg h-sp) 2))
9530 (set (mem16 HI (reg h-sp)) dst))
9531 )
9532 (define-pmacro (push32a-sem mode dst)
9533 (sequence ()
9534 (set (reg h-sp) (sub (reg h-sp) 4))
9535 (set (mem32 SI (reg h-sp)) dst))
9536 )
9537 (unary-insn-defn 16 16-Mova HI "" pusha (+ (f-0-4 7) (f-4-4 #xD) (f-8-4 9) dst16-16-Mova-HI) push16a-sem)
9538 (unary-insn-defn 32 16-Unprefixed-Mova SI "" pusha (+ (f-0-4 #xB) (f-7-1 0) dst32-16-Unprefixed-Mova-SI (f-10-2 0) (f-12-4 1)) push32a-sem)
9539
9540 ;-------------------------------------------------------------
9541 ; reit - return from interrupt
9542 ;-------------------------------------------------------------
9543
9544 ; ??? semantics
9545 (dni reit16 "REIT" ((machine 16))
9546 ("reit")
9547 (+ (f-0-4 #xF) (f-4-4 #xB))
9548 (nop)
9549 ())
9550 (dni reit32 "REIT" ((machine 32))
9551 ("reit")
9552 (+ (f-0-4 9) (f-4-4 #xE))
9553 (nop)
9554 ())
9555
9556 ;-------------------------------------------------------------
9557 ; rmpa - repeat multiple and addition
9558 ;-------------------------------------------------------------
9559
9560 ; TODO semantics
9561 (dni rmpa16.b "rmpa.size" ((machine 16))
9562 ("rmpa.b")
9563 (+ (f-0-4 7) (f-4-4 #xC) (f-8-4 #xF) (f-12-4 1))
9564 (nop)
9565 ())
9566 (dni rmpa16.w "rmpa.size" ((machine 16))
9567 ("rmpa.w")
9568 (+ (f-0-4 7) (f-4-4 #xD) (f-8-4 #xF) (f-12-4 1))
9569 (nop)
9570 ())
9571 (dni rmpa32.b "rmpa.size" ((machine 32))
9572 ("rmpa.b")
9573 (+ (f-0-4 #xB) (f-4-4 8) (f-8-4 4) (f-12-4 3))
9574 (nop)
9575 ())
9576
9577 (dni rmpa32.w "rmpa.size" ((machine 32))
9578 ("rmpa.w")
9579 (+ (f-0-4 #xB) (f-4-4 8) (f-8-4 5) (f-12-4 3))
9580 (nop)
9581 ())
9582
9583 ;-------------------------------------------------------------
9584 ; rolc - rotate left with carry
9585 ;-------------------------------------------------------------
9586
9587 ; TODO check semantics
9588 ; TODO future: split this into .b and .w semantics
9589 (define-pmacro (rolc-sem mode dst)
9590 (sequence ((mode result) (SI ocbit) (mode b_or_w) (USI mask))
9591 (set b_or_w -1)
9592 (set b_or_w (srl b_or_w #x8))
9593 (if (eq b_or_w #x0)
9594 (set mask #x8000) ; .b
9595 (set mask #x80000000)) ; .w
9596 (set ocbit cbit)
9597 (set cbit (and dst mask))
9598 (set result (sll mode dst 1))
9599 (set result (or result ocbit))
9600 (set-z-and-s result)
9601 (set dst result))
9602 )
9603 ; rolc.BW src,dst
9604 (unary-insn rolc (f-0-4 7) (f-4-3 3) (f-8-4 #xA) #xB #x2 #xE rolc-sem)
9605
9606 ;-------------------------------------------------------------
9607 ; rorc - rotate right with carry
9608 ;-------------------------------------------------------------
9609
9610 ; TODO check semantics
9611 ; TODO future: split this into .b and .w semantics
9612 (define-pmacro (rorc-sem mode dst)
9613 (sequence ((mode result) (SI ocbit) (mode b_or_w) (USI mask) (SI shamt))
9614 (set b_or_w -1)
9615 (set b_or_w (srl b_or_w #x8))
9616 (if (eq b_or_w #x0)
9617 (sequence () (set mask #x7fff) (set shamt 15)) ; .b
9618 (sequence () (set mask #x7fffffff) (set shamt 31))) ; .w
9619 (set ocbit cbit)
9620 (set cbit (and dst #x1))
9621 (set result (srl mode dst (const 1)))
9622 (set result (or (and result mask) (sll ocbit shamt)))
9623 (set-z-and-s result)
9624 (set dst result))
9625 )
9626 ; rorc.BW src,dst
9627 (unary-insn rorc (f-0-4 7) (f-4-3 3) (f-8-4 #xB) #xA #x2 #xE rorc-sem)
9628
9629 ;-------------------------------------------------------------
9630 ; rot - rotate
9631 ;-------------------------------------------------------------
9632
9633 ; TODO future: split this into .b and .w semantics
9634 (define-pmacro (rot-1-sem mode src1 dst)
9635 (sequence ((mode tmp) (mode b_or_w) (USI mask) (SI shift))
9636 (case DFLT src1
9637 ((#x0) (set shift 1))
9638 ((#x1) (set shift 2))
9639 ((#x2) (set shift 3))
9640 ((#x3) (set shift 4))
9641 ((#x4) (set shift 5))
9642 ((#x5) (set shift 6))
9643 ((#x6) (set shift 7))
9644 ((#x7) (set shift 8))
9645 ((-8) (set shift -1))
9646 ((-7) (set shift -2))
9647 ((-6) (set shift -3))
9648 ((-5) (set shift -4))
9649 ((-4) (set shift -5))
9650 ((-3) (set shift -6))
9651 ((-2) (set shift -7))
9652 ((-1) (set shift -8))
9653 (else (set shift 0))
9654 )
9655 (set b_or_w -1)
9656 (set b_or_w (srl b_or_w #x8))
9657 (if (eq b_or_w #x0)
9658 (set mask #x7fff) ; .b
9659 (set mask #x7fffffff)) ; .w
9660 (set tmp dst)
9661 (if (gt mode shift 0)
9662 (sequence ()
9663 (set tmp (rol mode tmp shift))
9664 (set cbit (and tmp #x1)))
9665 (sequence ()
9666 (set tmp (ror mode tmp (mul shift -1)))
9667 (set cbit (and tmp mask))))
9668 (set-z-and-s tmp)
9669 (set dst tmp))
9670 )
9671 (define-pmacro (rot-2-sem mode dst)
9672 (sequence ((mode tmp) (mode b_or_w) (USI mask))
9673 (set b_or_w -1)
9674 (set b_or_w (srl b_or_w #x8))
9675 (if (eq b_or_w #x0)
9676 (set mask #x7fff) ; .b
9677 (set mask #x7fffffff)) ; .w
9678 (set tmp dst)
9679 (if (gt mode (reg h-r1h) 0)
9680 (sequence ()
9681 (set tmp (rol mode tmp (reg h-r1h)))
9682 (set cbit (and tmp #x1)))
9683 (sequence ()
9684 (set tmp (ror mode tmp (reg h-r1h)))
9685 (set cbit (and tmp mask))))
9686 (set-z-and-s tmp)
9687 (set dst tmp))
9688 )
9689
9690 ; rot.BW #imm4,dst
9691 (binary-arith16-shimm4-dst-defn QI .b 0 0 rot (f-0-4 #xE) (f-4-3 0) rot-1-sem)
9692 (binary-arith16-shimm4-dst-defn HI .w 0 1 rot (f-0-4 #xE) (f-4-3 0) rot-1-sem)
9693 (binary-arith32-shimm4-dst-defn QI .b 0 0 rot #x7 #x2 rot-1-sem)
9694 (binary-arith32-shimm4-dst-defn HI .w 0 1 rot #x7 #x2 rot-1-sem)
9695 ; rot.BW src,dst
9696
9697 (dni rot16.b-dst "rot r1h,dest" ((machine 16))
9698 ("rot.b r1h,${dst16-16-QI}")
9699 (+ (f-0-4 7) (f-4-4 #x4) (f-8-4 #x6) dst16-16-QI)
9700 (rot-2-sem QI dst16-16-QI)
9701 ())
9702 (dni rot16.w-dst "rot r1h,dest" ((machine 16))
9703 ("rot.w r1h,${dst16-16-HI}")
9704 (+ (f-0-4 7) (f-4-4 #x5) (f-8-4 #x6) dst16-16-HI)
9705 (rot-2-sem HI dst16-16-HI)
9706 ())
9707
9708 (dni rot32.b-dst "rot r1h,dest" ((machine 32))
9709 ("rot.b r1h,${dst32-16-Unprefixed-QI}")
9710 (+ (f-0-4 #xA) dst32-16-Unprefixed-QI (f-7-1 0) (f-10-2 3) (f-12-4 #xF))
9711 (rot-2-sem QI dst32-16-Unprefixed-QI)
9712 ())
9713 (dni rot32.w-dst "rot r1h,dest" ((machine 32))
9714 ("rot.w r1h,${dst32-16-Unprefixed-HI}")
9715 (+ (f-0-4 #xA) dst32-16-Unprefixed-HI (f-7-1 1) (f-10-2 3) (f-12-4 #xF))
9716 (rot-2-sem HI dst32-16-Unprefixed-HI)
9717 ())
9718
9719 ;-------------------------------------------------------------
9720 ; rts - return from subroutine
9721 ;-------------------------------------------------------------
9722
9723 (define-pmacro (rts16-sem)
9724 (sequence ((SI tpc))
9725 (set tpc (mem16 HI (reg h-sp)))
9726 (set (reg h-sp) (add (reg h-sp) 2))
9727 (set tpc (or tpc (sll (mem16 QI (reg h-sp)) 16)))
9728 (set (reg h-sp) (add (reg h-sp) 1))
9729 (set pc tpc)
9730 )
9731 )
9732 (define-pmacro (rts32-sem)
9733 (sequence ((SI tpc))
9734 (set tpc (mem32 HI (reg h-sp)))
9735 (set (reg h-sp) (add (reg h-sp) 2))
9736 (set tpc (or tpc (sll (mem32 HI (reg h-sp)) 16)))
9737 (set (reg h-sp) (add (reg h-sp) 2))
9738 (set pc tpc)
9739 )
9740 )
9741
9742 (dni rts16 "rts" ((machine 16))
9743 ("rts")
9744 (+ (f-0-4 #xF) (f-4-4 3))
9745 (rts16-sem)
9746 ())
9747
9748 (dni rts32 "rts" ((machine 32))
9749 ("rts")
9750 (+ (f-0-4 #xD) (f-4-4 #xF))
9751 (rts32-sem)
9752 ())
9753
9754 ;-------------------------------------------------------------
9755 ; sbb - subtract with borrow
9756 ;-------------------------------------------------------------
9757
9758 (define-pmacro (sbb-sem mode src dst)
9759 (sequence ((mode result))
9760 (set result (subc mode dst src cbit))
9761 (set obit (add-oflag mode dst src cbit))
9762 (set cbit (add-oflag mode dst src cbit))
9763 (set-z-and-s result)
9764 (set dst result))
9765 )
9766
9767 ; sbb.size:G #imm,dst
9768 (binary-arith16-imm-dst-defn QI QI .b 0 sbb X (f-0-4 7) (f-4-3 3) (f-8-4 7) sbb-sem)
9769 (binary-arith16-imm-dst-defn HI HI .w 1 sbb X (f-0-4 7) (f-4-3 3) (f-8-4 7) sbb-sem)
9770 (binary-arith32-imm-dst-Prefixed QI QI .b 0 sbb X #x9 #x2 #xE sbb-sem)
9771 (binary-arith32-imm-dst-Prefixed HI HI .w 1 sbb X #x9 #x2 #xE sbb-sem)
9772
9773 ; sbb.BW:G src,dst
9774 (binary-arith16-src-dst-defn QI QI .b 0 sbb X (f-0-4 #xB) (f-4-3 4) sbb-sem)
9775 (binary-arith16-src-dst-defn HI HI .w 1 sbb X (f-0-4 #xB) (f-4-3 4) sbb-sem)
9776 (binary-arith32-src-dst-Prefixed QI QI .b 0 sbb X #x1 #x6 sbb-sem)
9777 (binary-arith32-src-dst-Prefixed HI HI .w 1 sbb X #x1 #x6 sbb-sem)
9778
9779 ;-------------------------------------------------------------
9780 ; sbjnz - subtract then jump on not zero
9781 ;-------------------------------------------------------------
9782
9783 (define-pmacro (sub-jnz-sem mode src dst label)
9784 (sequence ((mode result))
9785 (set result (sub mode dst src))
9786 (set dst result)
9787 (if (ne result 0)
9788 (set pc label)))
9789 )
9790
9791 ; sbjnz.size #imm4,dst,label
9792 (arith-jnz-imm4-dst sbjnz s4n (f-0-4 #xF) (f-4-3 4) #xf #x1 sub-jnz-sem)
9793
9794 ;-------------------------------------------------------------
9795 ; sccnd - store condition on condition (m32)
9796 ;-------------------------------------------------------------
9797
9798 (define-pmacro (sccnd-sem cnd dst)
9799 (sequence ()
9800 (set dst 0)
9801 (case DFLT cnd
9802 ((#x00) (if (not cbit) (set dst 1))) ;ltu nc
9803 ((#x01) (if (or cbit zbit) (set dst 1))) ;leu
9804 ((#x02) (if (not zbit) (set dst 1))) ;ne nz
9805 ((#x03) (if (not sbit) (set dst 1))) ;pz
9806 ((#x04) (if (not obit) (set dst 1))) ;no
9807 ((#x05) (if (not (or zbit (xor sbit obit))) (set dst 1))) ;gt
9808 ((#x06) (if (xor sbit obit) (set dst 1))) ;ge
9809 ((#x08) (if (trunc BI cbit) (set dst 1))) ;geu c
9810 ((#x09) (if (not (or cbit zbit)) (set dst 1))) ;gtu
9811 ((#x0a) (if (trunc BI zbit) (set dst 1))) ;eq z
9812 ((#x0b) (if (trunc BI sbit) (set dst 1))) ;n
9813 ((#x0c) (if (trunc BI obit) (set dst 1))) ;o
9814 ((#x0d) (if (or zbit (xor sbit obit)) (set dst 1))) ;le
9815 ((#x0e) (if (xor sbit obit) (set dst 1))) ;lt
9816 )
9817 )
9818 )
9819
9820 ; scCND dst
9821 (dni sccnd
9822 "sccnd dst"
9823 ((machine 32))
9824 "sc$sccond32 ${dst32-16-Unprefixed-HI}"
9825 (+ (f-0-4 #xD) dst32-16-Unprefixed-HI (f-7-1 1) (f-10-2 3) sccond32)
9826 (sccnd-sem sccond32 dst32-16-Unprefixed-HI)
9827 ())
9828
9829 ;-------------------------------------------------------------
9830 ; scmpu - string compare unequal (m32)
9831 ;-------------------------------------------------------------
9832
9833 ; TODO semantics
9834 (dni scmpu.b "scmpu.b" ((machine 32))
9835 ("scmpu.b")
9836 (+ (f-0-4 #xB) (f-4-4 8) (f-8-4 #xC) (f-12-4 3))
9837 (c-call VOID "scmpu_QI_semantics")
9838 ())
9839
9840 (dni scmpu.w "scmpu.w" ((machine 32))
9841 ("scmpu.w")
9842 (+ (f-0-4 #xB) (f-4-4 8) (f-8-4 #xD) (f-12-4 3))
9843 (c-call VOID "scmpu_HI_semantics")
9844 ())
9845
9846 ;-------------------------------------------------------------
9847 ; sha - shift arithmetic
9848 ;-------------------------------------------------------------
9849
9850 ; TODO future: split this into .b and .w semantics
9851 (define-pmacro (sha-sem mode src1 dst)
9852 (sequence ((mode result)(mode shift)(mode shmode))
9853 (case DFLT src1
9854 ((#x0) (set shift 1))
9855 ((#x1) (set shift 2))
9856 ((#x2) (set shift 3))
9857 ((#x3) (set shift 4))
9858 ((#x4) (set shift 5))
9859 ((#x5) (set shift 6))
9860 ((#x6) (set shift 7))
9861 ((#x7) (set shift 8))
9862 ((-8) (set shift -1))
9863 ((-7) (set shift -2))
9864 ((-6) (set shift -3))
9865 ((-5) (set shift -4))
9866 ((-4) (set shift -5))
9867 ((-3) (set shift -6))
9868 ((-2) (set shift -7))
9869 ((-1) (set shift -8))
9870 (else (set shift 0))
9871 )
9872 (set shmode -1)
9873 (set shmode (srl shmode #x8))
9874 (if (lt mode shift #x0) (set result (sra mode dst (mul shift -1))))
9875 (if (gt mode shift 0) (set result (sll mode dst shift)))
9876 (if (eq shmode #x0) ; QI
9877 (sequence
9878 ((mode cbitamt))
9879 (if (lt mode shift #x0)
9880 (set cbitamt (sub #x8 shift)) ; sra
9881 (set cbitamt (sub shift 1))) ; sll
9882 (set cbit (srl (and (sll dst cbitamt) #x80) #x7))
9883 (set obit (ne (and dst #x80) (and result #x80)))
9884 ))
9885 (if (eq shmode #xff) ; HI
9886 (sequence
9887 ((mode cbitamt))
9888 (if (lt mode shift #x0)
9889 (set cbitamt (sub 16 shift)) ; sra
9890 (set cbitamt (sub shift 1))) ; sll
9891 (set cbit (srl (and (sll dst cbitamt) #x8000) #xf))
9892 (set obit (ne (and dst #x8000) (and result #x8000)))
9893 ))
9894 (set-z-and-s result)
9895 (set dst result))
9896 )
9897 (define-pmacro (shar1h-sem mode dst)
9898 (sequence ((mode result)(mode shmode))
9899 (set shmode -1)
9900 (set shmode (srl shmode #x8))
9901 (if (lt mode (reg h-r1h) 0) (set result (sra mode dst (reg h-r1h))))
9902 (if (gt mode (reg h-r1h) 0) (set result (sll mode dst (reg h-r1h))))
9903 (if (eq shmode #x0) ; QI
9904 (sequence
9905 ((mode cbitamt))
9906 (if (lt mode (reg h-r1h) #x0)
9907 (set cbitamt (sub #x8 (reg h-r1h))) ; sra
9908 (set cbitamt (sub (reg h-r1h) 1))) ; sll
9909 (set cbit (srl (and (sll dst cbitamt) #x80) #x7))
9910 (set obit (ne (and dst #x80) (and result #x80)))
9911 ))
9912 (if (eq shmode #xff) ; HI
9913 (sequence
9914 ((mode cbitamt))
9915 (if (lt mode (reg h-r1h) #x0)
9916 (set cbitamt (sub 16 (reg h-r1h))) ; sra
9917 (set cbitamt (sub (reg h-r1h) 1))) ; sll
9918 (set cbit (srl (and (sll dst cbitamt) #x8000) #xf))
9919 (set obit (ne (and dst #x8000) (and result #x8000)))
9920 ))
9921 (set-z-and-s result)
9922 (set dst result))
9923 )
9924 ; sha.BW #imm4,dst (m16 #1 m32 #1)
9925 (binary-arith16-shimm4-dst-defn QI .b 0 0 sha (f-0-4 #xF) (f-4-3 0) sha-sem)
9926 (binary-arith16-shimm4-dst-defn HI .w 0 1 sha (f-0-4 #xF) (f-4-3 0) sha-sem)
9927 (binary-arith32-shimm4-dst-defn QI .b 1 0 sha #x7 #x0 sha-sem)
9928 (binary-arith32-shimm4-dst-defn HI .w 1 1 sha #x7 #x0 sha-sem)
9929 ; sha.BW r1h,dst (m16 #2 m32 #3)
9930 (dni sha16.b-dst "sha.b r1h,dest" ((machine 16))
9931 ("sha.b r1h,${dst16-16-QI}")
9932 (+ (f-0-4 7) (f-4-4 4) (f-8-4 #xF) dst16-16-QI)
9933 (shar1h-sem HI dst16-16-QI)
9934 ())
9935 (dni sha16.w-dst "sha.w r1h,dest" ((machine 16))
9936 ("sha.w r1h,${dst16-16-HI}")
9937 (+ (f-0-4 7) (f-4-4 5) (f-8-4 #xF) dst16-16-HI)
9938 (shar1h-sem HI dst16-16-HI)
9939 ())
9940 (dni sha32.b-dst "sha.b r1h,dest" ((machine 32))
9941 ("sha.b r1h,${dst32-16-Unprefixed-QI}")
9942 (+ (f-0-4 #xB) dst32-16-Unprefixed-QI (f-7-1 0) (f-10-2 3) (f-12-4 #xE))
9943 (shar1h-sem QI dst32-16-Unprefixed-QI)
9944 ())
9945 (dni sha32.w-dst "sha.w r1h,dest" ((machine 32))
9946 ("sha.w r1h,${dst32-16-Unprefixed-HI}")
9947 (+ (f-0-4 #xB) dst32-16-Unprefixed-HI (f-7-1 1) (f-10-2 3) (f-12-4 #xE))
9948 (shar1h-sem HI dst32-16-Unprefixed-HI)
9949 ())
9950 ; sha.L #imm,dst (m16 #3)
9951 (dni sha16-L-imm-r2r0 "sha.L #Imm-sh-12-s4,r2r0" ((machine 16))
9952 "sha.l #${Imm-sh-12-s4},r2r0"
9953 (+ (f-0-4 #xE) (f-4-4 #xB) (f-8-4 #xA) Imm-sh-12-s4)
9954 (sha-sem SI Imm-sh-12-s4 (reg h-r2r0))
9955 ())
9956 (dni sha16-L-imm-r3r1 "sha.L #Imm-sh-12-s4,r3r1" ((machine 16))
9957 "sha.l #${Imm-sh-12-s4},r3r1"
9958 (+ (f-0-4 #xE) (f-4-4 #xB) (f-8-4 #xB) Imm-sh-12-s4)
9959 (sha-sem SI Imm-sh-12-s4 (reg h-r3r1))
9960 ())
9961 ; sha.L r1h,dst (m16 #4)
9962 (dni sha16-L-r1h-r2r0 "sha.L r1h,r2r0" ((machine 16))
9963 "sha.l r1h,r2r0"
9964 (+ (f-0-4 #xE) (f-4-4 #xB) (f-8-4 2) (f-12-4 1))
9965 (sha-sem SI (reg h-r1h) (reg h-r2r0))
9966 ())
9967 (dni sha16-L-r1h-r3r1 "sha.L r1h,r3r1" ((machine 16))
9968 "sha.l r1h,r3r1"
9969 (+ (f-0-4 #xE) (f-4-4 #xB) (f-8-4 3) (f-12-4 1))
9970 (sha-sem SI (reg h-r1h) (reg h-r3r1))
9971 ())
9972 ; sha.L #imm8,dst (m32 #2)
9973 (binary-arith32-imm-dst-defn QI SI .l 0 sha X #xA #x2 #x1 sha-sem)
9974 ; sha.L r1h,dst (m32 #4)
9975 (dni sha32.l-dst "sha.l r1h,dest" ((machine 32))
9976 ("sha.l r1h,${dst32-16-Unprefixed-SI}")
9977 (+ (f-0-4 #xC) dst32-16-Unprefixed-SI (f-7-1 0) (f-10-2 1) (f-12-4 1))
9978 (shar1h-sem QI dst32-16-Unprefixed-SI)
9979 ())
9980
9981 ;-------------------------------------------------------------
9982 ; shanc - shift arithmetic non carry (m32)
9983 ;-------------------------------------------------------------
9984
9985 ; TODO check semantics
9986 ; shanc.L #imm8,dst
9987 (binary-arith32-imm-dst-defn QI SI .l 0 shanc X #xC #x2 #x1 sha-sem)
9988
9989 ;-------------------------------------------------------------
9990 ; shl - shift logical
9991 ;-------------------------------------------------------------
9992
9993 ; TODO future: split this into .b and .w semantics
9994 (define-pmacro (shl-sem mode src1 dst)
9995 (sequence ((mode result)(mode shift)(mode shmode))
9996 (case DFLT src1
9997 ((#x0) (set shift 1))
9998 ((#x1) (set shift 2))
9999 ((#x2) (set shift 3))
10000 ((#x3) (set shift 4))
10001 ((#x4) (set shift 5))
10002 ((#x5) (set shift 6))
10003 ((#x6) (set shift 7))
10004 ((#x7) (set shift 8))
10005 ((-8) (set shift -1))
10006 ((-7) (set shift -2))
10007 ((-6) (set shift -3))
10008 ((-5) (set shift -4))
10009 ((-4) (set shift -5))
10010 ((-3) (set shift -6))
10011 ((-2) (set shift -7))
10012 ((-1) (set shift -8))
10013 (else (set shift 0))
10014 )
10015 (set shmode -1)
10016 (set shmode (srl shmode #x8))
10017 (if (lt mode shift #x0) (set result (srl mode dst (mul shift -1))))
10018 (if (gt mode shift 0) (set result (sll mode dst shift)))
10019 (if (eq shmode #x0) ; QI
10020 (sequence
10021 ((mode cbitamt))
10022 (if (lt mode shift #x0)
10023 (set cbitamt (sub #x8 shift)); srl
10024 (set cbitamt (sub shift 1))) ; sll
10025 (set cbit (srl (and (sll dst cbitamt) #x80) #x7))
10026 (set obit (ne (and dst #x80) (and result #x80)))
10027 ))
10028 (if (eq shmode #xff) ; HI
10029 (sequence
10030 ((mode cbitamt))
10031 (if (lt mode shift #x0)
10032 (set cbitamt (sub 16 shift)) ; srl
10033 (set cbitamt (sub shift 1))) ; sll
10034 (set cbit (srl (and (sll dst cbitamt) #x8000) #xf))
10035 (set obit (ne (and dst #x8000) (and result #x8000)))
10036 ))
10037 (set-z-and-s result)
10038 (set dst result))
10039 )
10040 (define-pmacro (shlr1h-sem mode dst)
10041 (sequence ((mode result)(mode shmode))
10042 (set shmode -1)
10043 (set shmode (srl shmode #x8))
10044 (if (lt mode (reg h-r1h) 0) (set result (srl mode dst (reg h-r1h))))
10045 (if (gt mode (reg h-r1h) 0) (set result (sll mode dst (reg h-r1h))))
10046 (if (eq shmode #x0) ; QI
10047 (sequence
10048 ((mode cbitamt))
10049 (if (lt mode (reg h-r1h) #x0)
10050 (set cbitamt (sub #x8 (reg h-r1h))) ; srl
10051 (set cbitamt (sub (reg h-r1h) 1))) ; sll
10052 (set cbit (srl (and (sll dst cbitamt) #x80) #x7))
10053 (set obit (ne (and dst #x80) (and result #x80)))
10054 ))
10055 (if (eq shmode #xff) ; HI
10056 (sequence
10057 ((mode cbitamt))
10058 (if (lt mode (reg h-r1h) #x0)
10059 (set cbitamt (sub 16 (reg h-r1h))) ; srl
10060 (set cbitamt (sub (reg h-r1h) 1))) ; sll
10061 (set cbit (srl (and (sll dst cbitamt) #x8000) #xf))
10062 (set obit (ne (and dst #x8000) (and result #x8000)))
10063 ))
10064 (set-z-and-s result)
10065 (set dst result))
10066 )
10067 ; shl.BW #imm4,dst (m16 #1 m32 #1)
10068 (binary-arith16-shimm4-dst-defn QI .b 0 0 shl (f-0-4 #xE) (f-4-3 4) shl-sem)
10069 (binary-arith16-shimm4-dst-defn HI .w 0 1 shl (f-0-4 #xE) (f-4-3 4) shl-sem)
10070 (binary-arith32-shimm4-dst-defn QI .b 0 0 shl #x7 #x0 shl-sem)
10071 (binary-arith32-shimm4-dst-defn HI .w 0 1 shl #x7 #x0 shl-sem)
10072 ; shl.BW r1h,dst (m16 #2 m32 #3)
10073 (dni shl16.b-dst "shl.b r1h,dest" ((machine 16))
10074 ("shl.b r1h,${dst16-16-QI}")
10075 (+ (f-0-4 7) (f-4-4 4) (f-8-4 #xE) dst16-16-QI)
10076 (shlr1h-sem HI dst16-16-QI)
10077 ())
10078 (dni shl16.w-dst "shl.w r1h,dest" ((machine 16))
10079 ("shl.w r1h,${dst16-16-HI}")
10080 (+ (f-0-4 7) (f-4-4 5) (f-8-4 #xE) dst16-16-HI)
10081 (shlr1h-sem HI dst16-16-HI)
10082 ())
10083 (dni shl32.b-dst "shl.b r1h,dest" ((machine 32))
10084 ("shl.b r1h,${dst32-16-Unprefixed-QI}")
10085 (+ (f-0-4 #xA) dst32-16-Unprefixed-QI (f-7-1 0) (f-10-2 3) (f-12-4 #xE))
10086 (shlr1h-sem QI dst32-16-Unprefixed-QI)
10087 ())
10088 (dni shl32.w-dst "shl.w r1h,dest" ((machine 32))
10089 ("shl.w r1h,${dst32-16-Unprefixed-HI}")
10090 (+ (f-0-4 #xA) dst32-16-Unprefixed-HI (f-7-1 1) (f-10-2 3) (f-12-4 #xE))
10091 (shlr1h-sem HI dst32-16-Unprefixed-HI)
10092 ())
10093 ; shl.L #imm,dst (m16 #3)
10094 (dni shl16-L-imm-r2r0 "shl.L #Imm-sh-12-s4,r2r0" ((machine 16))
10095 "shl.l #${Imm-sh-12-s4},r2r0"
10096 (+ (f-0-4 #xE) (f-4-4 #xB) (f-8-4 #x8) Imm-sh-12-s4)
10097 (shl-sem SI Imm-sh-12-s4 (reg h-r2r0))
10098 ())
10099 (dni shl16-L-imm-r3r1 "shl.L #Imm-sh-12-s4,r3r1" ((machine 16))
10100 "shl.l #${Imm-sh-12-s4},r3r1"
10101 (+ (f-0-4 #xE) (f-4-4 #xB) (f-8-4 #x9) Imm-sh-12-s4)
10102 (shl-sem SI Imm-sh-12-s4 (reg h-r3r1))
10103 ())
10104 ; shl.L r1h,dst (m16 #4)
10105 (dni shl16-L-r1h-r2r0 "shl.L r1h,r2r0" ((machine 16))
10106 "shl.l r1h,r2r0"
10107 (+ (f-0-4 #xE) (f-4-4 #xB) (f-8-4 0) (f-12-4 1))
10108 (shl-sem SI (reg h-r1h) (reg h-r2r0))
10109 ())
10110 (dni shl16-L-r1h-r3r1 "shl.L r1h,r3r1" ((machine 16))
10111 "shl.l r1h,r3r1"
10112 (+ (f-0-4 #xE) (f-4-4 #xB) (f-8-4 1) (f-12-4 1))
10113 (shl-sem SI (reg h-r1h) (reg h-r3r1))
10114 ())
10115 ; shl.L #imm8,dst (m32 #2)
10116 (binary-arith32-imm-dst-defn QI SI .l 0 shl X #x9 #x2 #x1 shl-sem)
10117 ; shl.L r1h,dst (m32 #4)
10118 (dni shl32.l-dst "shl.l r1h,dest" ((machine 32))
10119 ("shl.l r1h,${dst32-16-Unprefixed-SI}")
10120 (+ (f-0-4 #xC) dst32-16-Unprefixed-SI (f-7-1 0) (f-10-2 0) (f-12-4 1))
10121 (shlr1h-sem QI dst32-16-Unprefixed-SI)
10122 ())
10123
10124 ;-------------------------------------------------------------
10125 ; shlnc - shift logical non carry
10126 ;-------------------------------------------------------------
10127
10128 ; TODO check semantics
10129 ; shlnc.L #imm8,dst
10130 (binary-arith32-imm-dst-defn QI SI .l 0 shlnc X #x8 #x2 #x1 shl-sem)
10131
10132 ;-------------------------------------------------------------
10133 ; sin - string input (m32)
10134 ;-------------------------------------------------------------
10135
10136 ; TODO semantics
10137 (dni sin32.b "sin" ((machine 32))
10138 ("sin.b")
10139 (+ (f-0-4 #xB) (f-4-4 2) (f-8-4 8) (f-12-4 3))
10140 (c-call VOID "sin_QI_semantics")
10141 ())
10142
10143 (dni sin32.w "sin" ((machine 32))
10144 ("sin.w")
10145 (+ (f-0-4 #xB) (f-4-4 2) (f-8-4 9) (f-12-4 3))
10146 (c-call VOID "sin_HI_semantics")
10147 ())
10148
10149 ;-------------------------------------------------------------
10150 ; smovb - string move backward
10151 ;-------------------------------------------------------------
10152
10153 ; TODO semantics
10154 (dni smovb16.b "smovb.b" ((machine 16))
10155 ("smovb.b")
10156 (+ (f-0-4 7) (f-4-4 #xC) (f-8-4 #xE) (f-12-4 9))
10157 (c-call VOID "smovb_QI_semantics")
10158 ())
10159
10160 (dni smovb16.w "smovb.w" ((machine 16))
10161 ("smovb.w")
10162 (+ (f-0-4 7) (f-4-4 #xD) (f-8-4 #xE) (f-12-4 9))
10163 (c-call VOID "smovb_HI_semantics")
10164 ())
10165
10166 (dni smovb32.b "smovb.b" ((machine 32))
10167 ("smovb.b")
10168 (+ (f-0-4 #xB) (f-4-4 6) (f-8-4 8) (f-12-4 3))
10169 (c-call VOID "smovb_QI_semantics")
10170 ())
10171
10172 (dni smovb32.w "smovb.w" ((machine 32))
10173 ("smovb.w")
10174 (+ (f-0-4 #xB) (f-4-4 6) (f-8-4 9) (f-12-4 3))
10175 (c-call VOID "smovb_HI_semantics")
10176 ())
10177
10178 ;-------------------------------------------------------------
10179 ; smovf - string move forward (m32)
10180 ;-------------------------------------------------------------
10181
10182 ; TODO semantics
10183 (dni smovf16.b "smovf.b" ((machine 16))
10184 ("smovf.b")
10185 (+ (f-0-4 7) (f-4-4 #xC) (f-8-4 #xE) (f-12-4 8))
10186 (c-call VOID "smovf_QI_semantics")
10187 ())
10188
10189 (dni smovf16.w "smovf.w" ((machine 16))
10190 ("smovf.w")
10191 (+ (f-0-4 7) (f-4-4 #xD) (f-8-4 #xE) (f-12-4 8))
10192 (c-call VOID "smovf_HI_semantics")
10193 ())
10194
10195 (dni smovf32.b "smovf.b" ((machine 32))
10196 ("smovf.b")
10197 (+ (f-0-4 #xB) (f-4-4 0) (f-8-4 8) (f-12-4 3))
10198 (c-call VOID "smovf_QI_semantics")
10199 ())
10200
10201 (dni smovf32.w "smovf.w" ((machine 32))
10202 ("smovf.w")
10203 (+ (f-0-4 #xB) (f-4-4 0) (f-8-4 9) (f-12-4 3))
10204 (c-call VOID "smovf_HI_semantics")
10205 ())
10206
10207 ;-------------------------------------------------------------
10208 ; smovu - string move unequal (m32)
10209 ;-------------------------------------------------------------
10210
10211 ; TODO semantics
10212 (dni smovu.b "smovu.b" ((machine 32))
10213 ("smovu.b")
10214 (+ (f-0-4 #xB) (f-4-4 8) (f-8-4 8) (f-12-4 3))
10215 (c-call VOID "smovu_QI_semantics")
10216 ())
10217
10218 (dni smovu.w "smovu.w" ((machine 32))
10219 ("smovu.w")
10220 (+ (f-0-4 #xB) (f-4-4 8) (f-8-4 9) (f-12-4 3))
10221 (c-call VOID "smovu_HI_semantics")
10222 ())
10223
10224 ;-------------------------------------------------------------
10225 ; sout - string output (m32)
10226 ;-------------------------------------------------------------
10227
10228 ; TODO semantics
10229 (dni sout.b "sout.b" ((machine 32))
10230 ("sout.b")
10231 (+ (f-0-4 #xB) (f-4-4 4) (f-8-4 8) (f-12-4 3))
10232 (c-call VOID "sout_QI_semantics")
10233 ())
10234
10235 (dni sout.w "sout" ((machine 32))
10236 ("sout.w")
10237 (+ (f-0-4 #xB) (f-4-4 4) (f-8-4 9) (f-12-4 3))
10238 (c-call VOID "sout_HI_semantics")
10239 ())
10240
10241 ;-------------------------------------------------------------
10242 ; sstr - string store
10243 ;-------------------------------------------------------------
10244
10245 ; TODO semantics
10246 (dni sstr16.b "sstr.b" ((machine 16))
10247 ("sstr.b")
10248 (+ (f-0-4 7) (f-4-4 #xC) (f-8-4 #xE) (f-12-4 #xA))
10249 (c-call VOID "sstr_QI_semantics")
10250 ())
10251
10252 (dni sstr16.w "sstr.w" ((machine 16))
10253 ("sstr.w")
10254 (+ (f-0-4 7) (f-4-4 #xD) (f-8-4 #xE) (f-12-4 #xA))
10255 (c-call VOID "sstr_HI_semantics")
10256 ())
10257
10258 (dni sstr.b "sstr" ((machine 32))
10259 ("sstr.b")
10260 (+ (f-0-4 #xB) (f-4-4 8) (f-8-4 0) (f-12-4 3))
10261 (c-call VOID "sstr_QI_semantics")
10262 ())
10263
10264 (dni sstr.w "sstr" ((machine 32))
10265 ("sstr.w")
10266 (+ (f-0-4 #xB) (f-4-4 8) (f-8-4 1) (f-12-4 3))
10267 (c-call VOID "sstr_HI_semantics")
10268 ())
10269
10270 ;-------------------------------------------------------------
10271 ; stnz - store on not zero
10272 ;-------------------------------------------------------------
10273
10274 (define-pmacro (stnz-sem mode src dst)
10275 (sequence ()
10276 (if (ne zbit (const 1))
10277 (set dst src)))
10278 )
10279 ; stnz #imm8,dst3 (m16)
10280 (binary-arith16-b-S-imm8-dst3 stnz "" (f-0-4 #xD) (f-4-1 0) stnz-sem)
10281 ; stnz.BW #imm,dst (m32)
10282 (binary-arith32-imm-dst-defn QI QI .b 0 stnz X #x9 #x1 #xF stnz-sem)
10283 (binary-arith32-imm-dst-defn HI HI .w 1 stnz X #x9 #x1 #xF stnz-sem)
10284
10285 ;-------------------------------------------------------------
10286 ; stz - store on zero
10287 ;-------------------------------------------------------------
10288
10289 (define-pmacro (stz-sem mode src dst)
10290 (sequence ()
10291 (if (eq zbit (const 1))
10292 (set dst src)))
10293 )
10294 ; stz #imm8,dst3 (m16)
10295 (binary-arith16-b-S-imm8-dst3 stz "" (f-0-4 #xC) (f-4-1 1) stz-sem)
10296 ; stz.BW #imm,dst (m32)
10297 (binary-arith32-imm-dst-defn QI QI .b 0 stz X #x9 #x0 #xF stz-sem)
10298 (binary-arith32-imm-dst-defn HI HI .w 1 stz X #x9 #x0 #xF stz-sem)
10299
10300 ;-------------------------------------------------------------
10301 ; stzx - store on zero extention
10302 ;-------------------------------------------------------------
10303
10304 (define-pmacro (stzx-sem mode src1 src2 dst)
10305 (sequence ()
10306 (if (eq zbit (const 1))
10307 (set dst src1)
10308 (set dst src2)))
10309 )
10310 ; stzx #imm8,dst3 (m16)
10311 (dni stzx16-imm8-imm8-r0h "stzx #Imm8,#Imm8,r0h" ((machine 16))
10312 ("stzx #${Imm-8-QI},#${Imm-16-QI},r0h")
10313 (+ (f-0-4 #xD) (f-4-4 #xB) Imm-8-QI Imm-16-QI)
10314 (stzx-sem QI Imm-8-QI Imm-16-QI (reg h-r0h))
10315 ())
10316 (dni stzx16-imm8-imm8-r0l "stzx #Imm8,#Imm8,r0l" ((machine 16))
10317 ("stzx #${Imm-8-QI},#${Imm-16-QI},r0l")
10318 (+ (f-0-4 #xD) (f-4-4 #xC) Imm-8-QI Imm-16-QI)
10319 (stzx-sem QI Imm-8-QI Imm-16-QI (reg h-r0l))
10320 ())
10321 (dni stzx16-imm8-imm8-dsp8sb "stzx #Imm8,#Imm8,dsp8[sb]" ((machine 16))
10322 ("stzx #${Imm-8-QI},#${Imm-24-QI},${Dsp-16-u8}[sb]")
10323 (+ (f-0-4 #xD) (f-4-4 #xD) Imm-8-QI Dsp-16-u8 Imm-24-QI)
10324 (stzx-sem QI Imm-8-QI Imm-16-QI (mem16 QI (add (reg h-sb) Dsp-24-u8)))
10325 ())
10326 (dni stzx16-imm8-imm8-dsp8fb "stzx #Imm8,#Imm8,dsp8[fb]" ((machine 16))
10327 ("stzx #${Imm-8-QI},#${Imm-24-QI},${Dsp-16-s8}[fb]")
10328 (+ (f-0-4 #xD) (f-4-4 #xE) Imm-8-QI Dsp-16-s8 Imm-24-QI)
10329 (stzx-sem QI Imm-8-QI Imm-24-QI (mem16 QI (add (reg h-fb) Dsp-16-s8)))
10330 ())
10331 (dni stzx16-imm8-imm8-abs16 "stzx #Imm8,#Imm8,abs16" ((machine 16))
10332 ("stzx #${Imm-8-QI},#${Imm-32-QI},${Dsp-16-u16}")
10333 (+ (f-0-4 #xD) (f-4-4 #xF) Imm-8-QI Dsp-16-u16 Imm-32-QI)
10334 (stzx-sem QI Imm-8-QI Imm-32-QI (mem16 QI Dsp-16-u16))
10335 ())
10336 ; stzx.BW #imm,dst (m32)
10337 (insn-imm1-imm2-dst-Unprefixed stzx #x9 #x3 #xF stzx-sem)
10338
10339 ;-------------------------------------------------------------
10340 ; subx - subtract extend (m32)
10341 ;-------------------------------------------------------------
10342
10343 (define-pmacro (subx-sem mode src1 dst)
10344 (sequence ((mode result))
10345 (set result (sub mode dst (ext mode src1)))
10346 (set obit (sub-oflag mode dst (ext mode src1) 0))
10347 (set cbit (sub-cflag mode dst (ext mode src1) 0))
10348 (set dst result)
10349 (set-z-and-s result)))
10350 ; subx #imm8,dst
10351 (binary-arith32-imm-dst-defn QI SI "" 0 subx G #x9 #x1 #x1 subx-sem)
10352 ; subx src,dst
10353 (binary-arith32-src-dst-defn QI SI "" 0 subx G #x1 #x0 subx-sem)
10354
10355 ;-------------------------------------------------------------
10356 ; tst - test
10357 ;-------------------------------------------------------------
10358
10359 (define-pmacro (tst-sem mode src1 dst)
10360 (sequence ((mode result))
10361 (set result (and mode dst src1))
10362 (set-z-and-s result))
10363 )
10364
10365 ; tst.BW #imm,dst (m16 #1 m32 #1)
10366 (binary-arith-imm-dst tst G (f-0-4 7) (f-4-3 3) (f-8-4 0) #x9 #x3 #xE tst-sem)
10367 ; tst.BW src,dst (m16 #2 m32 #3)
10368 (binary-arith16-src-dst-defn QI QI .b 0 tst X (f-0-4 #x8) (f-4-3 0) tst-sem)
10369 (binary-arith16-src-dst-defn HI HI .w 1 tst X (f-0-4 #x8) (f-4-3 0) tst-sem)
10370 (binary-arith32-src-dst-Prefixed QI QI .b 0 tst G #x1 #x9 tst-sem)
10371 (binary-arith32-src-dst-Prefixed HI HI .w 1 tst G #x1 #x9 tst-sem)
10372 ; tst.BW:S #imm,dst2 (m32 #2)
10373 (binary-arith32-s-imm-dst QI .b 0 tst #x0 #x6 tst-sem)
10374 (binary-arith32-s-imm-dst HI .w 1 tst #x0 #x6 tst-sem)
10375
10376 ;-------------------------------------------------------------
10377 ; und - undefined
10378 ;-------------------------------------------------------------
10379
10380 (dni und16 "und" ((machine 16))
10381 ("und")
10382 (+ (f-0-4 #xF) (f-4-4 #xF))
10383 (nop)
10384 ())
10385
10386 (dni und32 "und" ((machine 32))
10387 ("und")
10388 (+ (f-0-4 #xF) (f-4-4 #xF))
10389 (nop)
10390 ())
10391
10392 ;-------------------------------------------------------------
10393 ; wait
10394 ;-------------------------------------------------------------
10395
10396 ; ??? semantics
10397 (dni wait16 "wait" ((machine 16))
10398 ("wait")
10399 (+ (f-0-4 7) (f-4-4 #xD) (f-8-4 #xF) (f-12-4 3))
10400 (nop)
10401 ())
10402
10403 (dni wait "wait" ((machine 32))
10404 ("wait")
10405 (+ (f-0-4 #xB) (f-4-4 2) (f-8-4 0) (f-12-4 3))
10406 (nop)
10407 ())
10408
10409 ;-------------------------------------------------------------
10410 ; xchg - exchange
10411 ;-------------------------------------------------------------
10412
10413 (define-pmacro (xchg-sem mode src dst)
10414 (sequence ((mode result))
10415 (set result src)
10416 (set src dst)
10417 (set dst result))
10418 )
10419 (define-pmacro (xchg16-defn mode sz szc src srcreg)
10420 (dni (.sym xchg16 sz - srcreg)
10421 (.str "xchg" sz "-" srcreg ",dst16-16-" mode)
10422 ((machine 16))
10423 (.str "xchg." sz " " srcreg ",${dst16-16-" mode "}")
10424 (+ (f-0-4 #x7) (f-4-3 #x5) (f-7-1 szc) (f-8-2 0) (f-10-2 src) (.sym dst16-16- mode))
10425 (xchg-sem mode (reg (.sym h- srcreg)) (.sym dst16-16- mode))
10426 ())
10427 )
10428 (xchg16-defn QI b 0 0 r0l)
10429 (xchg16-defn QI b 0 1 r0h)
10430 (xchg16-defn QI b 0 2 r1l)
10431 (xchg16-defn QI b 0 3 r1h)
10432 (xchg16-defn HI w 1 0 r0)
10433 (xchg16-defn HI w 1 1 r1)
10434 (xchg16-defn HI w 1 2 r2)
10435 (xchg16-defn HI w 1 3 r3)
10436 (define-pmacro (xchg32-defn mode sz szc src srcreg)
10437 (dni (.sym xchg32 sz - srcreg)
10438 (.str "xchg" sz "-" srcreg ",dst32-16-Unprefixed-" mode)
10439 ((machine 32))
10440 (.str "xchg." sz " " srcreg ",${dst32-16-Unprefixed-" mode "}")
10441 (+ (f-0-4 #xD) (.sym dst32-16-Unprefixed- mode) (f-7-1 szc) (f-10-2 0) (f-12-1 1) (f-13-3 src))
10442 (xchg-sem mode (reg (.sym h- srcreg)) (.sym dst32-16-Unprefixed- mode))
10443 ())
10444 )
10445 (xchg32-defn QI b 0 0 r0l)
10446 (xchg32-defn QI b 0 1 r1l)
10447 (xchg32-defn QI b 0 2 a0)
10448 (xchg32-defn QI b 0 3 a1)
10449 (xchg32-defn QI b 0 4 r0h)
10450 (xchg32-defn QI b 0 5 r1h)
10451 (xchg32-defn HI w 1 0 r0)
10452 (xchg32-defn HI w 1 1 r1)
10453 (xchg32-defn HI w 1 2 a0)
10454 (xchg32-defn HI w 1 3 a1)
10455 (xchg32-defn HI w 1 4 r2)
10456 (xchg32-defn HI w 1 5 r3)
10457
10458 ;-------------------------------------------------------------
10459 ; xor - exclusive or
10460 ;-------------------------------------------------------------
10461
10462 (define-pmacro (xor-sem mode src1 dst)
10463 (sequence ((mode result))
10464 (set result (xor mode src1 dst))
10465 (set-z-and-s result)
10466 (set dst result))
10467 )
10468
10469 ; xor.BW #imm,dst (m16 #1 m32 #1)
10470 (binary-arith-imm-dst xor G (f-0-4 7) (f-4-3 3) (f-8-4 1) #x9 #x0 #xE xor-sem)
10471 ; xor.BW src,dst (m16 #3 m32 #3)
10472 (binary-arith-src-dst xor G (f-0-4 #x8) (f-4-3 4) #x1 #x9 xor-sem)
10473
10474 ;-------------------------------------------------------------
10475 ; Widening
10476 ;-------------------------------------------------------------
10477
10478 (define-pmacro (exts-sem smode dmode src dst)
10479 (set dst (ext dmode (trunc smode src)))
10480 )
10481 (define-pmacro (extz-sem smode dmode src dst)
10482 (set dst (zext dmode (trunc smode src)))
10483 )
10484
10485 ; exts.b dst for m16c
10486 (ext16-defn QI HI .b 0 exts (f-0-4 7) (f-4-3 6) (f-8-4 6) exts-sem)
10487
10488 ; exts.w r0 for m16c
10489 (dni exts16.w-r0
10490 "exts.w r0"
10491 ((machine 16))
10492 "exts.w r0"
10493 (+ (f-0-4 #x7) (f-4-4 #xC) (f-8-4 #xF) (f-12-4 3))
10494 (exts-sem HI SI R0 R2R0)
10495 ())
10496
10497 ; exts.size dst for m32c
10498 (ext32-defn QI HI .b 0 exts (f-0-4 #xC) (f-10-2 1) (f-12-4 #xE) exts-sem)
10499 (ext32-defn HI SI .w 1 exts (f-0-4 #xC) (f-10-2 1) (f-12-4 #xE) exts-sem)
10500 ; exts.b src,dst for m32c
10501 (ext32-binary-defn exts .b #x1 #x7 exts-sem)
10502
10503 ; extz.b src,dst for m32c
10504 (ext32-binary-defn extz "" #x1 #xB extz-sem)
10505
10506 ;-------------------------------------------------------------
10507 ; Indirect
10508 ;-------------------------------------------------------------
10509
10510 ; TODO semantics
10511 (dni srcind "SRC-INDIRECT" ((machine 32))
10512 ("src-indirect")
10513 (+ (f-0-4 4) (f-4-4 1))
10514 (set (reg h-src-indirect) 1)
10515 ())
10516
10517 (dni destind "DEST-INDIRECT" ((machine 32))
10518 ("dest-indirect")
10519 (+ (f-0-4 0) (f-4-4 9))
10520 (set (reg h-dst-indirect) 1)
10521 ())
10522
10523 (dni srcdestind "SRC-DEST-INDIRECT" ((machine 32))
10524 ("src-dest-indirect")
10525 (+ (f-0-4 4) (f-4-4 9))
10526 (sequence () (set (reg h-src-indirect) 1) (set (reg h-dst-indirect) 1))
10527 ())
10528