m32c.cpu revision 1.1.1.1 1 ; Renesas M32C CPU description. -*- Scheme -*-
2 ;
3 ; Copyright 2005, 2006, 2007 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 (srl value 16) (and value #xff00))
577 (sll (ext INT (trunc QI (and value #xff))) 16)))
578 ((value pc) (or SI
579 (or (srl value 16) (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 UHI value 16) #x0000ff)
625 (and USI value #x00ff00))
626 (and USI (sll UHI 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 UHI value 16) #x0000ff)
638 (and USI value #x00ff00))
639 (and USI (sll UHI value 16) #x0f0000))) ; extract
640 )
641 (df f-dsp-40-u24 "24 bit unsigned" (all-isas) 40 24 UINT
642 ((value pc) (or USI
643 (or USI
644 (and (srl value 16) #x0000ff)
645 (and value #x00ff00))
646 (and (sll value 16) #xff0000))) ; insert
647 ((value pc) (or USI
648 (or USI
649 (and USI (srl UHI value 16) #x0000ff)
650 (and USI value #x00ff00))
651 (and USI (sll UHI value 16) #xff0000))) ; extract
652 )
653
654 (dnmf f-dsp-40-s32 "32 bit signed" (all-isas) INT
655 (f-dsp-40-u24 f-dsp-64-u8)
656 (sequence () ; insert
657 (set (ifield f-dsp-64-u8) (and (srl (ifield f-dsp-40-s32) 24) #xff))
658 (set (ifield f-dsp-40-u24) (and (ifield f-dsp-40-s32) #xffffff))
659 )
660 (sequence () ; extract
661 (set (ifield f-dsp-40-s32) (or (and (ifield f-dsp-40-u24) #xffffff)
662 (and (sll (ifield f-dsp-64-u8) 24) #xff000000)))
663 )
664 )
665
666 (dnmf f-dsp-48-u20 "20 bit unsigned" (all-isas) UINT
667 (f-dsp-48-u16 f-dsp-64-u8)
668 (sequence () ; insert
669 (set (ifield f-dsp-64-u8) (and (srl (ifield f-dsp-48-u20) 16) #x0f))
670 (set (ifield f-dsp-48-u16) (and (ifield f-dsp-48-u20) #xffff))
671 )
672 (sequence () ; extract
673 (set (ifield f-dsp-48-u20) (or (and (ifield f-dsp-48-u16) #xffff)
674 (and (sll (ifield f-dsp-64-u8) 16) #x0f0000)))
675 )
676 )
677 (dnmf f-dsp-48-u24 "24 bit unsigned" (all-isas) UINT
678 (f-dsp-48-u16 f-dsp-64-u8)
679 (sequence () ; insert
680 (set (ifield f-dsp-64-u8) (and (srl (ifield f-dsp-48-u24) 16) #xff))
681 (set (ifield f-dsp-48-u16) (and (ifield f-dsp-48-u24) #xffff))
682 )
683 (sequence () ; extract
684 (set (ifield f-dsp-48-u24) (or (and (ifield f-dsp-48-u16) #xffff)
685 (and (sll (ifield f-dsp-64-u8) 16) #xff0000)))
686 )
687 )
688
689 (dnmf f-dsp-16-s32 "32 bit signed" (all-isas) INT
690 (f-dsp-16-u16 f-dsp-32-u16)
691 (sequence () ; insert
692 (set (ifield f-dsp-32-u16) (and (srl (ifield f-dsp-16-s32) 16) #xffff))
693 (set (ifield f-dsp-16-u16) (and (ifield f-dsp-16-s32) #xffff))
694 )
695 (sequence () ; extract
696 (set (ifield f-dsp-16-s32) (or (and (ifield f-dsp-16-u16) #xffff)
697 (and (sll (ifield f-dsp-32-u16) 16) #xffff0000)))
698 )
699 )
700
701 (dnmf f-dsp-24-s32 "32 bit signed" (all-isas) INT
702 (f-dsp-24-u8 f-dsp-32-u24)
703 (sequence () ; insert
704 (set (ifield f-dsp-32-u24) (and (srl (ifield f-dsp-24-s32) 8) #xffffff))
705 (set (ifield f-dsp-24-u8) (and (ifield f-dsp-24-s32) #xff))
706 )
707 (sequence () ; extract
708 (set (ifield f-dsp-24-s32) (or (and (ifield f-dsp-24-u8) #xff)
709 (and (sll (ifield f-dsp-32-u24) 8) #xffffff00)))
710 )
711 )
712
713 (df f-dsp-32-s32 "32 bit signed" (all-isas) 32 32 INT
714 ((value pc)
715
716 ;; insert
717 (ext INT
718 (or SI
719 (or SI
720 (and (srl value 24) #x000000ff)
721 (and (srl value 8) #x0000ff00))
722 (or SI
723 (and (sll value 8) #x00ff0000)
724 (and (sll value 24) #xff000000)))))
725
726 ;; extract
727 ((value pc)
728 (ext INT
729 (or SI
730 (or SI
731 (and (srl value 24) #x000000ff)
732 (and (srl value 8) #x0000ff00))
733 (or SI
734 (and (sll value 8) #x00ff0000)
735 (and (sll value 24) #xff000000)))))
736 )
737
738 (dnmf f-dsp-48-u32 "32 bit unsigned" (all-isas) UINT
739 (f-dsp-48-u16 f-dsp-64-u16)
740 (sequence () ; insert
741 (set (ifield f-dsp-64-u16) (and (srl (ifield f-dsp-48-u32) 16) #xffff))
742 (set (ifield f-dsp-48-u16) (and (ifield f-dsp-48-u32) #xffff))
743 )
744 (sequence () ; extract
745 (set (ifield f-dsp-48-u32) (or (and (ifield f-dsp-48-u16) #xffff)
746 (and (sll (ifield f-dsp-64-u16) 16) #xffff0000)))
747 )
748 )
749
750 (dnmf f-dsp-48-s32 "32 bit signed" (all-isas) INT
751 (f-dsp-48-u16 f-dsp-64-u16)
752 (sequence () ; insert
753 (set (ifield f-dsp-64-u16) (and (srl (ifield f-dsp-48-s32) 16) #xffff))
754 (set (ifield f-dsp-48-u16) (and (ifield f-dsp-48-s32) #xffff))
755 )
756 (sequence () ; extract
757 (set (ifield f-dsp-48-s32) (or (and (ifield f-dsp-48-u16) #xffff)
758 (and (sll (ifield f-dsp-64-u16) 16) #xffff0000)))
759 )
760 )
761
762 (dnmf f-dsp-56-s16 "16 bit signed" (all-isas) INT
763 (f-dsp-56-u8 f-dsp-64-u8)
764 (sequence () ; insert
765 (set (ifield f-dsp-56-u8)
766 (and (ifield f-dsp-56-s16) #xff))
767 (set (ifield f-dsp-64-u8)
768 (and (srl (ifield f-dsp-56-s16) 8) #xff))
769 )
770 (sequence () ; extract
771 (set (ifield f-dsp-56-s16)
772 (ext INT
773 (trunc HI (or (sll (ifield f-dsp-64-u8) 8)
774 (ifield f-dsp-56-u8)))))
775 )
776 )
777
778 (df f-dsp-64-s16 " 16 bit signed" (all-isas) 64 16 INT
779 ((value pc) (ext INT
780 (trunc HI
781 (or (and (srl value 8) #x00ff)
782 (and (sll value 8) #xff00))))) ; insert
783 ((value pc) (ext INT
784 (trunc HI
785 (or (and (srl value 8) #x00ff)
786 (and (sll value 8) #xff00))))) ; extract
787 )
788
789 ;-------------------------------------------------------------
790 ; Bit indices
791 ;-------------------------------------------------------------
792
793 (dnf f-bitno16-S "bit index for m16c" (all-isas) 5 3)
794 (dnf f-bitno32-prefixed "bit index for m32c" (all-isas) 21 3)
795 (dnf f-bitno32-unprefixed "bit index for m32c" (all-isas) 13 3)
796
797 (dnmf f-bitbase16-u11-S "unsigned bit,base:11" (all-isas) UINT
798 (f-bitno16-S f-dsp-8-u8)
799 (sequence () ; insert
800 (set (ifield f-bitno16-S) (and f-bitbase16-u11-S #x7))
801 (set (ifield f-dsp-8-u8) (and (srl (ifield f-bitbase16-u11-S) 3) #xff))
802 )
803 (sequence () ; extract
804 (set (ifield f-bitbase16-u11-S) (or (sll (ifield f-dsp-8-u8) 3)
805 (ifield f-bitno16-S)))
806 )
807 )
808
809 (dnmf f-bitbase32-16-u11-unprefixed "unsigned bit,base:11" (all-isas) UINT
810 (f-bitno32-unprefixed f-dsp-16-u8)
811 (sequence () ; insert
812 (set (ifield f-bitno32-unprefixed) (and f-bitbase32-16-u11-unprefixed #x7))
813 (set (ifield f-dsp-16-u8) (and (srl (ifield f-bitbase32-16-u11-unprefixed) 3) #xff))
814 )
815 (sequence () ; extract
816 (set (ifield f-bitbase32-16-u11-unprefixed) (or (sll (ifield f-dsp-16-u8) 3)
817 (ifield f-bitno32-unprefixed)))
818 )
819 )
820 (dnmf f-bitbase32-16-s11-unprefixed "signed bit,base:11" (all-isas) INT
821 (f-bitno32-unprefixed f-dsp-16-s8)
822 (sequence () ; insert
823 (set (ifield f-bitno32-unprefixed) (and f-bitbase32-16-s11-unprefixed #x7))
824 (set (ifield f-dsp-16-s8) (sra INT (ifield f-bitbase32-16-s11-unprefixed) 3))
825 )
826 (sequence () ; extract
827 (set (ifield f-bitbase32-16-s11-unprefixed) (or (sll (ifield f-dsp-16-s8) 3)
828 (ifield f-bitno32-unprefixed)))
829 )
830 )
831 (dnmf f-bitbase32-16-u19-unprefixed "unsigned bit,base:19" (all-isas) UINT
832 (f-bitno32-unprefixed f-dsp-16-u16)
833 (sequence () ; insert
834 (set (ifield f-bitno32-unprefixed) (and f-bitbase32-16-u19-unprefixed #x7))
835 (set (ifield f-dsp-16-u16) (and (srl (ifield f-bitbase32-16-u19-unprefixed) 3) #xffff))
836 )
837 (sequence () ; extract
838 (set (ifield f-bitbase32-16-u19-unprefixed) (or (sll (ifield f-dsp-16-u16) 3)
839 (ifield f-bitno32-unprefixed)))
840 )
841 )
842 (dnmf f-bitbase32-16-s19-unprefixed "signed bit,base:11" (all-isas) INT
843 (f-bitno32-unprefixed f-dsp-16-s16)
844 (sequence () ; insert
845 (set (ifield f-bitno32-unprefixed) (and f-bitbase32-16-s19-unprefixed #x7))
846 (set (ifield f-dsp-16-s16) (sra INT (ifield f-bitbase32-16-s19-unprefixed) 3))
847 )
848 (sequence () ; extract
849 (set (ifield f-bitbase32-16-s19-unprefixed) (or (sll (ifield f-dsp-16-s16) 3)
850 (ifield f-bitno32-unprefixed)))
851 )
852 )
853 ; SID decoder doesn't handle multi-ifield referencing another multi-ifield :-(
854 (dnmf f-bitbase32-16-u27-unprefixed "unsigned bit,base:27" (all-isas) UINT
855 (f-bitno32-unprefixed f-dsp-16-u16 f-dsp-32-u8)
856 (sequence () ; insert
857 (set (ifield f-bitno32-unprefixed) (and f-bitbase32-16-u27-unprefixed #x7))
858 (set (ifield f-dsp-16-u16) (and (srl (ifield f-bitbase32-16-u27-unprefixed) 3) #xffff))
859 (set (ifield f-dsp-32-u8) (and (srl (ifield f-bitbase32-16-u27-unprefixed) 19) #xff))
860 )
861 (sequence () ; extract
862 (set (ifield f-bitbase32-16-u27-unprefixed) (or (sll (ifield f-dsp-16-u16) 3)
863 (or (sll (ifield f-dsp-32-u8) 19)
864 (ifield f-bitno32-unprefixed))))
865 )
866 )
867 (dnmf f-bitbase32-24-u11-prefixed "unsigned bit,base:11" (all-isas) UINT
868 (f-bitno32-prefixed f-dsp-24-u8)
869 (sequence () ; insert
870 (set (ifield f-bitno32-prefixed) (and f-bitbase32-24-u11-prefixed #x7))
871 (set (ifield f-dsp-24-u8) (and (srl (ifield f-bitbase32-24-u11-prefixed) 3) #xff))
872 )
873 (sequence () ; extract
874 (set (ifield f-bitbase32-24-u11-prefixed) (or (sll (ifield f-dsp-24-u8) 3)
875 (ifield f-bitno32-prefixed)))
876 )
877 )
878 (dnmf f-bitbase32-24-s11-prefixed "signed bit,base:11" (all-isas) INT
879 (f-bitno32-prefixed f-dsp-24-s8)
880 (sequence () ; insert
881 (set (ifield f-bitno32-prefixed) (and f-bitbase32-24-s11-prefixed #x7))
882 (set (ifield f-dsp-24-s8) (sra INT (ifield f-bitbase32-24-s11-prefixed) 3))
883 )
884 (sequence () ; extract
885 (set (ifield f-bitbase32-24-s11-prefixed) (or (sll (ifield f-dsp-24-s8) 3)
886 (ifield f-bitno32-prefixed)))
887 )
888 )
889 ; SID decoder doesn't handle multi-ifield referencing another multi-ifield :-(
890 (dnmf f-bitbase32-24-u19-prefixed "unsigned bit,base:19" (all-isas) UINT
891 (f-bitno32-prefixed f-dsp-24-u8 f-dsp-32-u8)
892 (sequence () ; insert
893 (set (ifield f-bitno32-prefixed) (and f-bitbase32-24-u19-prefixed #x7))
894 (set (ifield f-dsp-24-u8) (and (srl (ifield f-bitbase32-24-u19-prefixed) 3) #xff))
895 (set (ifield f-dsp-32-u8) (and (srl (ifield f-bitbase32-24-u19-prefixed) 11) #xff))
896 )
897 (sequence () ; extract
898 (set (ifield f-bitbase32-24-u19-prefixed) (or (sll (ifield f-dsp-24-u8) 3)
899 (or (sll (ifield f-dsp-32-u8) 11)
900 (ifield f-bitno32-prefixed))))
901 )
902 )
903 ; SID decoder doesn't handle multi-ifield referencing another multi-ifield :-(
904 (dnmf f-bitbase32-24-s19-prefixed "signed bit,base:11" (all-isas) INT
905 (f-bitno32-prefixed f-dsp-24-u8 f-dsp-32-s8)
906 (sequence () ; insert
907 (set (ifield f-bitno32-prefixed) (and f-bitbase32-24-s19-prefixed #x7))
908 (set (ifield f-dsp-24-u8) (and (srl (ifield f-bitbase32-24-s19-prefixed) 3) #xff))
909 (set (ifield f-dsp-32-s8) (sra INT (ifield f-bitbase32-24-s19-prefixed) 11))
910 )
911 (sequence () ; extract
912 (set (ifield f-bitbase32-24-s19-prefixed) (or (sll (ifield f-dsp-24-u8) 3)
913 (or (sll (ifield f-dsp-32-s8) 11)
914 (ifield f-bitno32-prefixed))))
915 )
916 )
917 ; SID decoder doesn't handle multi-ifield referencing another multi-ifield :-(
918 (dnmf f-bitbase32-24-u27-prefixed "unsigned bit,base:27" (all-isas) UINT
919 (f-bitno32-prefixed f-dsp-24-u8 f-dsp-32-u16)
920 (sequence () ; insert
921 (set (ifield f-bitno32-prefixed) (and f-bitbase32-24-u27-prefixed #x7))
922 (set (ifield f-dsp-24-u8) (and (srl (ifield f-bitbase32-24-u27-prefixed) 3) #xff))
923 (set (ifield f-dsp-32-u16) (and (srl (ifield f-bitbase32-24-u27-prefixed) 11) #xffff))
924 )
925 (sequence () ; extract
926 (set (ifield f-bitbase32-24-u27-prefixed) (or (sll (ifield f-dsp-24-u8) 3)
927 (or (sll (ifield f-dsp-32-u16) 11)
928 (ifield f-bitno32-prefixed))))
929 )
930 )
931
932 ;-------------------------------------------------------------
933 ; Labels
934 ;-------------------------------------------------------------
935
936 (df f-lab-5-3 "3 bit pc relative unsigned offset" (PCREL-ADDR all-isas) 5 3 UINT
937 ((value pc) (sub SI value (add SI pc 2))) ; insert
938 ((value pc) (add SI value (add SI pc 2))) ; extract
939 )
940 (dnmf f-lab32-jmp-s "unsigned 3 bit pc relative offset" (PCREL-ADDR all-isas) UINT
941 (f-2-2 f-7-1)
942 (sequence ((SI val)) ; insert
943 (set val (sub (sub (ifield f-lab32-jmp-s) pc) 2))
944 (set (ifield f-7-1) (and val #x1))
945 (set (ifield f-2-2) (srl val 1))
946 )
947 (sequence () ; extract
948 (set (ifield f-lab32-jmp-s) (add pc (add (or (sll (ifield f-2-2) 1)
949 (ifield f-7-1))
950 2)))
951 )
952 )
953 (df f-lab-8-8 "8 bit pc relative signed offset" (PCREL-ADDR all-isas) 8 8 INT
954 ((value pc) (sub SI value (add SI pc 1))) ; insert
955 ((value pc) (add SI value (add SI pc 1))) ; extract
956 )
957 (df f-lab-8-16 "16 bit pc relative signed offset" (PCREL-ADDR SIGN-OPT all-isas) 8 16 UINT
958 ((value pc) (or SI (sll (and (sub value (add pc 1)) #xff) 8)
959 (srl (and (sub value (add pc 1)) #xffff) 8)))
960 ((value pc) (add SI (or (srl (and value #xffff) 8)
961 (sra (sll (and value #xff) 24) 16)) (add pc 1)))
962 )
963 (df f-lab-8-24 "24 bit absolute" (all-isas ABS-ADDR) 8 24 UINT
964 ((value pc) (or SI
965 (or (srl value 16) (and value #xff00))
966 (sll (and value #xff) 16)))
967 ((value pc) (or SI
968 (or (srl value 16) (and value #xff00))
969 (sll (and value #xff) 16)))
970 )
971 (df f-lab-16-8 "8 bit pc relative signed offset" (PCREL-ADDR all-isas) 16 8 INT
972 ((value pc) (sub SI value (add SI pc 2))) ; insert
973 ((value pc) (add SI value (add SI pc 2))) ; extract
974 )
975 (df f-lab-24-8 "8 bit pc relative signed offset" (PCREL-ADDR all-isas) 24 8 INT
976 ((value pc) (sub SI value (add SI pc 2))) ; insert
977 ((value pc) (add SI value (add SI pc 2))) ; extract
978 )
979 (df f-lab-32-8 "8 bit pc relative signed offset" (PCREL-ADDR all-isas) 32 8 INT
980 ((value pc) (sub SI value (add SI pc 2))) ; insert
981 ((value pc) (add SI value (add SI pc 2))) ; extract
982 )
983 (df f-lab-40-8 "8 bit pc relative signed offset" (PCREL-ADDR all-isas) 40 8 INT
984 ((value pc) (sub SI value (add SI pc 2))) ; insert
985 ((value pc) (add SI value (add SI pc 2))) ; extract
986 )
987
988 ;-------------------------------------------------------------
989 ; Condition codes
990 ;-------------------------------------------------------------
991
992 (dnf f-cond16 "condition code" (all-isas) 12 4)
993 (dnf f-cond16j-5 "condition code" (all-isas) 5 3)
994
995 (dnmf f-cond32 "condition code" (all-isas) UINT
996 (f-9-1 f-13-3)
997 (sequence () ; insert
998 (set (ifield f-9-1) (and (srl (ifield f-cond32) 3) 1))
999 (set (ifield f-13-3) (and (ifield f-cond32) #x7))
1000 )
1001 (sequence () ; extract
1002 (set (ifield f-cond32) (or (sll (ifield f-9-1) 3)
1003 (ifield f-13-3)))
1004 )
1005 )
1006
1007 (dnmf f-cond32j "condition code" (all-isas) UINT
1008 (f-1-3 f-7-1)
1009 (sequence () ; insert
1010 (set (ifield f-1-3) (and (srl (ifield f-cond32j) 1) #x7))
1011 (set (ifield f-7-1) (and (ifield f-cond32j) #x1))
1012 )
1013 (sequence () ; extract
1014 (set (ifield f-cond32j) (or (sll (ifield f-1-3) 1)
1015 (ifield f-7-1)))
1016 )
1017 )
1018
1020 ;=============================================================
1021 ; Hardware
1022 ;
1023 (dnh h-pc "program counter" (PC all-isas) (pc USI) () () ())
1024
1025 ;-------------------------------------------------------------
1026 ; General registers
1027 ; The actual registers are 16 bits
1028 ;-------------------------------------------------------------
1029
1030 (define-hardware
1031 (name h-gr)
1032 (comment "general 16 bit registers")
1033 (attrs all-isas CACHE-ADDR)
1034 (type register HI (4))
1035 (indices keyword "" (("r0" 0) ("r1" 1) ("r2" 2) ("r3" 3))))
1036
1037 ; Define different views of the grs as VIRTUAL with getter/setter specs
1038 ;
1039 (define-hardware
1040 (name h-gr-QI)
1041 (comment "general 8 bit registers")
1042 (attrs all-isas VIRTUAL)
1043 (type register QI (4))
1044 (indices keyword "" (("r0l" 0) ("r0h" 1) ("r1l" 2) ("r1h" 3)))
1045 (get (index) (and (if SI (mod index 2)
1046 (srl (reg h-gr (div index 2)) 8)
1047 (reg h-gr (div index 2)))
1048 #xff))
1049 (set (index newval) (set (reg h-gr (div index 2))
1050 (if SI (mod index 2)
1051 (or (and (reg h-gr (div index 2)) #xff)
1052 (sll (and newval #xff) 8))
1053 (or (and (reg h-gr (div index 2)) #xff00)
1054 (and newval #xff))))))
1055
1056 (define-hardware
1057 (name h-gr-HI)
1058 (comment "general 16 bit registers")
1059 (attrs all-isas VIRTUAL)
1060 (type register HI (4))
1061 (indices keyword "" (("r0" 0) ("r1" 1) ("r2" 2) ("r3" 3)))
1062 (get (index) (reg h-gr index))
1063 (set (index newval) (set (reg h-gr index) newval)))
1064
1065 (define-hardware
1066 (name h-gr-SI)
1067 (comment "general 32 bit registers")
1068 (attrs all-isas VIRTUAL)
1069 (type register SI (2))
1070 (indices keyword "" (("r2r0" 0) ("r3r1" 1)))
1071 (get (index) (or SI
1072 (and (reg h-gr index) #xffff)
1073 (and (sll (reg h-gr (add index 2)) 16) #xffff0000)))
1074 (set (index newval) (sequence ()
1075 (set (reg h-gr index) (and newval #xffff))
1076 (set (reg h-gr (add index 2)) (srl newval 16)))))
1077
1078 (define-hardware
1079 (name h-gr-ext-QI)
1080 (comment "general 16 bit registers")
1081 (attrs all-isas VIRTUAL)
1082 (type register HI (2))
1083 (indices keyword "" (("r0l" 0) ("r1l" 1)))
1084 (get (index) (reg h-gr-QI (mul index 2)))
1085 (set (index newval) (set (reg h-gr (mul index 2)) newval)))
1086
1087 (define-hardware
1088 (name h-gr-ext-HI)
1089 (comment "general 16 bit registers")
1090 (attrs all-isas VIRTUAL)
1091 (type register SI (2))
1092 (indices keyword "" (("r0" 0) ("r1" 1)))
1093 (get (index) (reg h-gr (mul index 2)))
1094 (set (index newval) (set (reg h-gr-SI index) newval)))
1095
1096 (define-hardware
1097 (name h-r0l)
1098 (comment "r0l register")
1099 (attrs all-isas VIRTUAL)
1100 (type register QI)
1101 (indices keyword "" (("r0l" 0)))
1102 (get () (reg h-gr-QI 0))
1103 (set (newval) (set (reg h-gr-QI 0) newval)))
1104
1105 (define-hardware
1106 (name h-r0h)
1107 (comment "r0h register")
1108 (attrs all-isas VIRTUAL)
1109 (type register QI)
1110 (indices keyword "" (("r0h" 0)))
1111 (get () (reg h-gr-QI 1))
1112 (set (newval) (set (reg h-gr-QI 1) newval)))
1113
1114 (define-hardware
1115 (name h-r1l)
1116 (comment "r1l register")
1117 (attrs all-isas VIRTUAL)
1118 (type register QI)
1119 (indices keyword "" (("r1l" 0)))
1120 (get () (reg h-gr-QI 2))
1121 (set (newval) (set (reg h-gr-QI 2) newval)))
1122
1123 (define-hardware
1124 (name h-r1h)
1125 (comment "r1h register")
1126 (attrs all-isas VIRTUAL)
1127 (type register QI)
1128 (indices keyword "" (("r1h" 0)))
1129 (get () (reg h-gr-QI 3))
1130 (set (newval) (set (reg h-gr-QI 3) newval)))
1131
1132 (define-hardware
1133 (name h-r0)
1134 (comment "r0 register")
1135 (attrs all-isas VIRTUAL)
1136 (type register HI)
1137 (indices keyword "" (("r0" 0)))
1138 (get () (reg h-gr 0))
1139 (set (newval) (set (reg h-gr 0) newval)))
1140
1141 (define-hardware
1142 (name h-r1)
1143 (comment "r1 register")
1144 (attrs all-isas VIRTUAL)
1145 (type register HI)
1146 (indices keyword "" (("r1" 0)))
1147 (get () (reg h-gr 1))
1148 (set (newval) (set (reg h-gr 1) newval)))
1149
1150 (define-hardware
1151 (name h-r2)
1152 (comment "r2 register")
1153 (attrs all-isas VIRTUAL)
1154 (type register HI)
1155 (indices keyword "" (("r2" 0)))
1156 (get () (reg h-gr 2))
1157 (set (newval) (set (reg h-gr 2) newval)))
1158
1159 (define-hardware
1160 (name h-r3)
1161 (comment "r3 register")
1162 (attrs all-isas VIRTUAL)
1163 (type register HI)
1164 (indices keyword "" (("r3" 0)))
1165 (get () (reg h-gr 3))
1166 (set (newval) (set (reg h-gr 3) newval)))
1167
1168 (define-hardware
1169 (name h-r0l-r0h)
1170 (comment "r0l or r0h")
1171 (attrs all-isas VIRTUAL)
1172 (type register QI (2))
1173 (indices keyword "" (("r0l" 0) ("r0h" 1)))
1174 (get (index) (reg h-gr-QI index))
1175 (set (index newval) (set (reg h-gr-QI index) newval)))
1176
1177 (define-hardware
1178 (name h-r2r0)
1179 (comment "r2r0 register")
1180 (attrs all-isas VIRTUAL)
1181 (type register SI)
1182 (indices keyword "" (("r2r0" 0)))
1183 (get () (or (sll (reg h-gr 2) 16) (reg h-gr 0)))
1184 (set (newval)
1185 (sequence ()
1186 (set (reg h-gr 0) newval)
1187 (set (reg h-gr 2) (sra newval 16)))))
1188
1189 (define-hardware
1190 (name h-r3r1)
1191 (comment "r3r1 register")
1192 (attrs all-isas VIRTUAL)
1193 (type register SI)
1194 (indices keyword "" (("r3r1" 0)))
1195 (get () (or (sll (reg h-gr 3) 16) (reg h-gr 1)))
1196 (set (newval)
1197 (sequence ()
1198 (set (reg h-gr 1) newval)
1199 (set (reg h-gr 3) (sra newval 16)))))
1200
1201 (define-hardware
1202 (name h-r1r2r0)
1203 (comment "r1r2r0 register")
1204 (attrs all-isas VIRTUAL)
1205 (type register DI)
1206 (indices keyword "" (("r1r2r0" 0)))
1207 (get () (or DI (sll DI (reg h-gr 1) 32) (or (sll (reg h-gr 2) 16) (reg h-gr 0))))
1208 (set (newval)
1209 (sequence ()
1210 (set (reg h-gr 0) newval)
1211 (set (reg h-gr 2) (sra newval 16))
1212 (set (reg h-gr 1) (sra newval 32)))))
1213
1214 ;-------------------------------------------------------------
1215 ; Address registers
1216 ;-------------------------------------------------------------
1217
1218 (define-hardware
1219 (name h-ar)
1220 (comment "address registers")
1221 (attrs all-isas)
1222 (type register USI (2))
1223 (indices keyword "" (("a0" 0) ("a1" 1)))
1224 (get (index) (c-call USI "h_ar_get_handler" index))
1225 (set (index newval) (c-call VOID "h_ar_set_handler" index newval)))
1226
1227 ; Define different views of the ars as VIRTUAL with getter/setter specs
1228 (define-hardware
1229 (name h-ar-QI)
1230 (comment "8 bit view of address register")
1231 (attrs all-isas VIRTUAL)
1232 (type register QI (2))
1233 (indices keyword "" (("a0" 0) ("a1" 1)))
1234 (get (index) (reg h-ar index))
1235 (set (index newval) (set (reg h-ar index) newval)))
1236
1237 (define-hardware
1238 (name h-ar-HI)
1239 (comment "16 bit view of address register")
1240 (attrs all-isas VIRTUAL)
1241 (type register HI (2))
1242 (indices keyword "" (("a0" 0) ("a1" 1)))
1243 (get (index) (reg h-ar index))
1244 (set (index newval) (set (reg h-ar index) newval)))
1245
1246 (define-hardware
1247 (name h-ar-SI)
1248 (comment "32 bit view of address register")
1249 (attrs all-isas VIRTUAL)
1250 (type register SI)
1251 (indices keyword "" (("a1a0" 0)))
1252 (get () (or SI (sll SI (ext SI (reg h-ar 1)) 16) (ext SI (reg h-ar 0))))
1253 (set (newval) (sequence ()
1254 (set (reg h-ar 0) (and newval #xffff))
1255 (set (reg h-ar 1) (and (srl newval 16) #xffff)))))
1256
1257 (define-hardware
1258 (name h-a0)
1259 (comment "16 bit view of address register")
1260 (attrs all-isas VIRTUAL)
1261 (type register HI)
1262 (indices keyword "" (("a0" 0)))
1263 (get () (reg h-ar 0))
1264 (set (newval) (set (reg h-ar 0) newval)))
1265
1266 (define-hardware
1267 (name h-a1)
1268 (comment "16 bit view of address register")
1269 (attrs all-isas VIRTUAL)
1270 (type register HI)
1271 (indices keyword "" (("a1" 1)))
1272 (get () (reg h-ar 1))
1273 (set (newval) (set (reg h-ar 1) newval)))
1274
1275 ; SB Register
1276 (define-hardware
1277 (name h-sb)
1278 (comment "SB register")
1279 (attrs all-isas)
1280 (type register USI)
1281 (get () (c-call USI "h_sb_get_handler"))
1282 (set (newval) (c-call VOID "h_sb_set_handler" newval))
1283 )
1284
1285 ; FB Register
1286 (define-hardware
1287 (name h-fb)
1288 (comment "FB register")
1289 (attrs all-isas)
1290 (type register USI)
1291 (get () (c-call USI "h_fb_get_handler"))
1292 (set (newval) (c-call VOID "h_fb_set_handler" newval))
1293 )
1294
1295 ; SP Register
1296 (define-hardware
1297 (name h-sp)
1298 (comment "SP register")
1299 (attrs all-isas)
1300 (type register USI)
1301 (get () (c-call USI "h_sp_get_handler"))
1302 (set (newval) (c-call VOID "h_sp_set_handler" newval))
1303 )
1304
1305 ;-------------------------------------------------------------
1306 ; condition-code bits
1307 ;-------------------------------------------------------------
1308
1309 (define-hardware
1310 (name h-sbit)
1311 (comment "sign bit")
1312 (attrs all-isas)
1313 (type register BI)
1314 )
1315
1316 (define-hardware
1317 (name h-zbit)
1318 (comment "zero bit")
1319 (attrs all-isas)
1320 (type register BI)
1321 )
1322
1323 (define-hardware
1324 (name h-obit)
1325 (comment "overflow bit")
1326 (attrs all-isas)
1327 (type register BI)
1328 )
1329
1330 (define-hardware
1331 (name h-cbit)
1332 (comment "carry bit")
1333 (attrs all-isas)
1334 (type register BI)
1335 )
1336
1337 (define-hardware
1338 (name h-ubit)
1339 (comment "stack pointer select bit")
1340 (attrs all-isas)
1341 (type register BI)
1342 )
1343
1344 (define-hardware
1345 (name h-ibit)
1346 (comment "interrupt enable bit")
1347 (attrs all-isas)
1348 (type register BI)
1349 )
1350
1351 (define-hardware
1352 (name h-bbit)
1353 (comment "register bank select bit")
1354 (attrs all-isas)
1355 (type register BI)
1356 )
1357
1358 (define-hardware
1359 (name h-dbit)
1360 (comment "debug bit")
1361 (attrs all-isas)
1362 (type register BI)
1363 )
1364
1365 (define-hardware
1366 (name h-dct0)
1367 (comment "dma transfer count 000")
1368 (attrs all-isas)
1369 (type register UHI)
1370 )
1371 (define-hardware
1372 (name h-dct1)
1373 (comment "dma transfer count 001")
1374 (attrs all-isas)
1375 (type register UHI)
1376 )
1377 (define-hardware
1378 (name h-svf)
1379 (comment "save flag 011")
1380 (attrs all-isas)
1381 (type register UHI)
1382 )
1383 (define-hardware
1384 (name h-drc0)
1385 (comment "dma transfer count reload 100")
1386 (attrs all-isas)
1387 (type register UHI)
1388 )
1389 (define-hardware
1390 (name h-drc1)
1391 (comment "dma transfer count reload 101")
1392 (attrs all-isas)
1393 (type register UHI)
1394 )
1395 (define-hardware
1396 (name h-dmd0)
1397 (comment "dma mode 110")
1398 (attrs all-isas)
1399 (type register UQI)
1400 )
1401 (define-hardware
1402 (name h-dmd1)
1403 (comment "dma mode 111")
1404 (attrs all-isas)
1405 (type register UQI)
1406 )
1407 (define-hardware
1408 (name h-intb)
1409 (comment "interrupt table 000")
1410 (attrs all-isas)
1411 (type register USI)
1412 )
1413 (define-hardware
1414 (name h-svp)
1415 (comment "save pc 100")
1416 (attrs all-isas)
1417 (type register UHI)
1418 )
1419 (define-hardware
1420 (name h-vct)
1421 (comment "vector 101")
1422 (attrs all-isas)
1423 (type register USI)
1424 )
1425 (define-hardware
1426 (name h-isp)
1427 (comment "interrupt stack ptr 111")
1428 (attrs all-isas)
1429 (type register USI)
1430 )
1431 (define-hardware
1432 (name h-dma0)
1433 (comment "dma mem addr 010")
1434 (attrs all-isas)
1435 (type register USI)
1436 )
1437 (define-hardware
1438 (name h-dma1)
1439 (comment "dma mem addr 011")
1440 (attrs all-isas)
1441 (type register USI)
1442 )
1443 (define-hardware
1444 (name h-dra0)
1445 (comment "dma mem addr reload 100")
1446 (attrs all-isas)
1447 (type register USI)
1448 )
1449 (define-hardware
1450 (name h-dra1)
1451 (comment "dma mem addr reload 101")
1452 (attrs all-isas)
1453 (type register USI)
1454 )
1455 (define-hardware
1456 (name h-dsa0)
1457 (comment "dma sfr addr 110")
1458 (attrs all-isas)
1459 (type register USI)
1460 )
1461 (define-hardware
1462 (name h-dsa1)
1463 (comment "dma sfr addr 111")
1464 (attrs all-isas)
1465 (type register USI)
1466 )
1467
1468 ;-------------------------------------------------------------
1469 ; Condition code operand hardware
1470 ;-------------------------------------------------------------
1471
1472 (define-hardware
1473 (name h-cond16)
1474 (comment "condition code hardware for m16c")
1475 (attrs m16c-isa MACH16)
1476 (type immediate UQI)
1477 (values keyword ""
1478 (("geu" #x00) ("c" #x00)
1479 ("gtu" #x01)
1480 ("eq" #x02) ("z" #x02)
1481 ("n" #x03)
1482 ("le" #x04)
1483 ("o" #x05)
1484 ("ge" #x06)
1485 ("ltu" #xf8) ("nc" #xf8)
1486 ("leu" #xf9)
1487 ("ne" #xfa) ("nz" #xfa)
1488 ("pz" #xfb)
1489 ("gt" #xfc)
1490 ("no" #xfd)
1491 ("lt" #xfe)
1492 )
1493 )
1494 )
1495 (define-hardware
1496 (name h-cond16c)
1497 (comment "condition code hardware for m16c")
1498 (attrs m16c-isa MACH16)
1499 (type immediate UQI)
1500 (values keyword ""
1501 (("geu" #x00) ("c" #x00)
1502 ("gtu" #x01)
1503 ("eq" #x02) ("z" #x02)
1504 ("n" #x03)
1505 ("ltu" #x04) ("nc" #x04)
1506 ("leu" #x05)
1507 ("ne" #x06) ("nz" #x06)
1508 ("pz" #x07)
1509 ("le" #x08)
1510 ("o" #x09)
1511 ("ge" #x0a)
1512 ("gt" #x0c)
1513 ("no" #x0d)
1514 ("lt" #x0e)
1515 )
1516 )
1517 )
1518 (define-hardware
1519 (name h-cond16j)
1520 (comment "condition code hardware for m16c")
1521 (attrs m16c-isa MACH16)
1522 (type immediate UQI)
1523 (values keyword ""
1524 (("le" #x08)
1525 ("o" #x09)
1526 ("ge" #x0a)
1527 ("gt" #x0c)
1528 ("no" #x0d)
1529 ("lt" #x0e)
1530 )
1531 )
1532 )
1533 (define-hardware
1534 (name h-cond16j-5)
1535 (comment "condition code hardware for m16c")
1536 (attrs m16c-isa MACH16)
1537 (type immediate UQI)
1538 (values keyword ""
1539 (("geu" #x00) ("c" #x00)
1540 ("gtu" #x01)
1541 ("eq" #x02) ("z" #x02)
1542 ("n" #x03)
1543 ("ltu" #x04) ("nc" #x04)
1544 ("leu" #x05)
1545 ("ne" #x06) ("nz" #x06)
1546 ("pz" #x07)
1547 )
1548 )
1549 )
1550
1551 (define-hardware
1552 (name h-cond32)
1553 (comment "condition code hardware for m32c")
1554 (attrs m32c-isa MACH32)
1555 (type immediate UQI)
1556 (values keyword ""
1557 (("ltu" #x00) ("nc" #x00)
1558 ("leu" #x01)
1559 ("ne" #x02) ("nz" #x02)
1560 ("pz" #x03)
1561 ("no" #x04)
1562 ("gt" #x05)
1563 ("ge" #x06)
1564 ("geu" #x08) ("c" #x08)
1565 ("gtu" #x09)
1566 ("eq" #x0a) ("z" #x0a)
1567 ("n" #x0b)
1568 ("o" #x0c)
1569 ("le" #x0d)
1570 ("lt" #x0e)
1571 )
1572 )
1573 )
1574
1575 (define-hardware
1576 (name h-cr1-32)
1577 (comment "control registers")
1578 (attrs m32c-isa MACH32)
1579 (type immediate UQI)
1580 (values keyword "" (("dct0" 0) ("dct1" 1) ("flg" 2) ("svf" 3) ("drc0" 4)
1581 ("drc1" 5) ("dmd0" 6) ("dmd1" 7))))
1582 (define-hardware
1583 (name h-cr2-32)
1584 (comment "control registers")
1585 (attrs m32c-isa MACH32)
1586 (type immediate UQI)
1587 (values keyword "" (("intb" 0) ("sp" 1) ("sb" 2) ("fb" 3) ("svp" 4)
1588 ("vct" 5) ("isp" 7))))
1589
1590 (define-hardware
1591 (name h-cr3-32)
1592 (comment "control registers")
1593 (attrs m32c-isa MACH32)
1594 (type immediate UQI)
1595 (values keyword "" (("dma0" 2) ("dma1" 3) ("dra0" 4)
1596 ("dra1" 5) ("dsa0" 6) ("dsa1" 7))))
1597 (define-hardware
1598 (name h-cr-16)
1599 (comment "control registers")
1600 (attrs m16c-isa MACH16)
1601 (type immediate UQI)
1602 (values keyword "" (("intbl" 1) ("intbh" 2) ("flg" 3) ("isp" 4)
1603 ("sp" 5) ("sb" 6) ("fb" 7))))
1604
1605 (define-hardware
1606 (name h-flags)
1607 (comment "flag hardware for m32c")
1608 (attrs all-isas)
1609 (type immediate UQI)
1610 (values keyword ""
1611 (("c" #x0)
1612 ("d" #x1)
1613 ("z" #x2)
1614 ("s" #x3)
1615 ("b" #x4)
1616 ("o" #x5)
1617 ("i" #x6)
1618 ("u" #x7)
1619 )
1620 )
1621 )
1622
1623 ;-------------------------------------------------------------
1624 ; Misc helper hardware
1625 ;-------------------------------------------------------------
1626
1627 (define-hardware
1628 (name h-shimm)
1629 (comment "shift immediate")
1630 (attrs all-isas)
1631 (type immediate (INT 4))
1632 (values keyword "" (("1" 0) ("2" 1) ("3" 2) ("4" 3) ("5" 4) ("6" 5) ("7" 6)
1633 ("8" 7) ("-1" -8) ("-2" -7) ("-3" -6) ("-4" -5) ("-5" -4)
1634 ("-6" -3) ("-7" -2) ("-8" -1)
1635 )))
1636 (define-hardware
1637 (name h-bit-index)
1638 (comment "bit index for the next insn")
1639 (attrs m32c-isa MACH32)
1640 (type register UHI)
1641 )
1642 (define-hardware
1643 (name h-src-index)
1644 (comment "source index for the next insn")
1645 (attrs m32c-isa MACH32)
1646 (type register UHI)
1647 )
1648 (define-hardware
1649 (name h-dst-index)
1650 (comment "destination index for the next insn")
1651 (attrs m32c-isa MACH32)
1652 (type register UHI)
1653 )
1654 (define-hardware
1655 (name h-src-indirect)
1656 (comment "indirect src for the next insn")
1657 (attrs all-isas)
1658 (type register UHI)
1659 )
1660 (define-hardware
1661 (name h-dst-indirect)
1662 (comment "indirect dst for the next insn")
1663 (attrs all-isas)
1664 (type register UHI)
1665 )
1666 (define-hardware
1667 (name h-none)
1668 (comment "for storing unused values")
1669 (attrs m32c-isa MACH32)
1670 (type register SI)
1671 )
1672
1674 ;=============================================================
1675 ; Operands
1676 ;-------------------------------------------------------------
1677 ; Source Registers
1678 ;-------------------------------------------------------------
1679
1680 (dnop Src16RnQI "general register QI view" (MACH16 m16c-isa) h-gr-QI f-src16-rn)
1681 (dnop Src16RnHI "general register QH view" (MACH16 m16c-isa) h-gr-HI f-src16-rn)
1682
1683 (dnop Src32RnUnprefixedQI "general register QI view" (MACH32 m32c-isa) h-gr-QI f-src32-rn-unprefixed-QI)
1684 (dnop Src32RnUnprefixedHI "general register HI view" (MACH32 m32c-isa) h-gr-HI f-src32-rn-unprefixed-HI)
1685 (dnop Src32RnUnprefixedSI "general register SI view" (MACH32 m32c-isa) h-gr-SI f-src32-rn-unprefixed-SI)
1686
1687 (dnop Src32RnPrefixedQI "general register QI view" (MACH32 m32c-isa) h-gr-QI f-src32-rn-prefixed-QI)
1688 (dnop Src32RnPrefixedHI "general register HI view" (MACH32 m32c-isa) h-gr-HI f-src32-rn-prefixed-HI)
1689 (dnop Src32RnPrefixedSI "general register SI view" (MACH32 m32c-isa) h-gr-SI f-src32-rn-prefixed-SI)
1690
1691 (dnop Src16An "address register" (MACH16 m16c-isa) h-ar f-src16-an)
1692 (dnop Src16AnQI "address register QI view" (MACH16 m16c-isa) h-ar-QI f-src16-an)
1693 (dnop Src16AnHI "address register HI view" (MACH16 m16c-isa) h-ar-HI f-src16-an)
1694
1695 (dnop Src32AnUnprefixed "address register" (MACH32 m32c-isa) h-ar f-src32-an-unprefixed)
1696 (dnop Src32AnUnprefixedQI "address register QI view" (MACH32 m32c-isa) h-ar-QI f-src32-an-unprefixed)
1697 (dnop Src32AnUnprefixedHI "address register HI view" (MACH32 m32c-isa) h-ar-HI f-src32-an-unprefixed)
1698 (dnop Src32AnUnprefixedSI "address register SI view" (MACH32 m32c-isa) h-ar f-src32-an-unprefixed)
1699
1700 (dnop Src32AnPrefixed "address register" (MACH32 m32c-isa) h-ar f-src32-an-prefixed)
1701 (dnop Src32AnPrefixedQI "address register QI view" (MACH32 m32c-isa) h-ar-QI f-src32-an-prefixed)
1702 (dnop Src32AnPrefixedHI "address register HI view" (MACH32 m32c-isa) h-ar-HI f-src32-an-prefixed)
1703 (dnop Src32AnPrefixedSI "address register SI view" (MACH32 m32c-isa) h-ar f-src32-an-prefixed)
1704
1705 ; Destination Registers
1706 ;
1707 (dnop Dst16RnQI "general register QI view" (MACH16 m16c-isa) h-gr-QI f-dst16-rn)
1708 (dnop Dst16RnHI "general register HI view" (MACH16 m16c-isa) h-gr-HI f-dst16-rn)
1709 (dnop Dst16RnSI "general register SI view" (MACH16 m16c-isa) h-gr-SI f-dst16-rn)
1710 (dnop Dst16RnExtQI "general register QI/HI view for 'ext' insns" (MACH16 m16c-isa) h-gr-ext-QI f-dst16-rn-ext)
1711
1712 (dnop Dst32R0QI-S "general register QI view" (MACH32 m32c-isa) h-r0l f-nil)
1713 (dnop Dst32R0HI-S "general register HI view" (MACH32 m32c-isa) h-r0 f-nil)
1714
1715 (dnop Dst32RnUnprefixedQI "general register QI view" (MACH32 m32c-isa) h-gr-QI f-dst32-rn-unprefixed-QI)
1716 (dnop Dst32RnUnprefixedHI "general register HI view" (MACH32 m32c-isa) h-gr-HI f-dst32-rn-unprefixed-HI)
1717 (dnop Dst32RnUnprefixedSI "general register SI view" (MACH32 m32c-isa) h-gr-SI f-dst32-rn-unprefixed-SI)
1718 (dnop Dst32RnExtUnprefixedQI "general register QI view" (MACH32 m32c-isa) h-gr-ext-QI f-dst32-rn-ext-unprefixed)
1719 (dnop Dst32RnExtUnprefixedHI "general register HI view" (MACH32 m32c-isa) h-gr-ext-HI f-dst32-rn-ext-unprefixed)
1720
1721 (dnop Dst32RnPrefixedQI "general register QI view" (MACH32 m32c-isa) h-gr-QI f-dst32-rn-prefixed-QI)
1722 (dnop Dst32RnPrefixedHI "general register HI view" (MACH32 m32c-isa) h-gr-HI f-dst32-rn-prefixed-HI)
1723 (dnop Dst32RnPrefixedSI "general register SI view" (MACH32 m32c-isa) h-gr-SI f-dst32-rn-prefixed-SI)
1724
1725 (dnop Dst16RnQI-S "general register QI view" (MACH16 m16c-isa) h-r0l-r0h f-dst16-rn-QI-s)
1726
1727 (dnop Dst16AnQI-S "address register QI view" (MACH16 m16c-isa) h-ar-QI f-dst16-rn-QI-s)
1728
1729 (dnop Bit16Rn "general register bit view" (MACH16 m16c-isa) h-gr-HI f-dst16-rn)
1730
1731 (dnop Bit32RnPrefixed "general register bit view" (MACH32 m32c-isa) h-gr-QI f-dst32-rn-prefixed-QI)
1732 (dnop Bit32RnUnprefixed "general register bit view" (MACH32 m32c-isa) h-gr-QI f-dst32-rn-unprefixed-QI)
1733
1734 (dnop R0 "r0" (all-isas) h-r0 f-nil)
1735 (dnop R1 "r1" (all-isas) h-r1 f-nil)
1736 (dnop R2 "r2" (all-isas) h-r2 f-nil)
1737 (dnop R3 "r3" (all-isas) h-r3 f-nil)
1738 (dnop R0l "r0l" (all-isas) h-r0l f-nil)
1739 (dnop R0h "r0h" (all-isas) h-r0h f-nil)
1740 (dnop R2R0 "r2r0" (all-isas) h-r2r0 f-nil)
1741 (dnop R3R1 "r3r1" (all-isas) h-r3r1 f-nil)
1742 (dnop R1R2R0 "r1r2r0" (all-isas) h-r1r2r0 f-nil)
1743
1744 (dnop Dst16An "address register" (MACH16 m16c-isa) h-ar f-dst16-an)
1745 (dnop Dst16AnQI "address register QI view" (MACH16 m16c-isa) h-ar-QI f-dst16-an)
1746 (dnop Dst16AnHI "address register HI view" (MACH16 m16c-isa) h-ar-HI f-dst16-an)
1747 (dnop Dst16AnSI "address register SI view" (MACH16 m16c-isa) h-ar-SI f-dst16-an)
1748 (dnop Dst16An-S "address register HI view" (MACH16 m16c-isa) h-ar-HI f-dst16-an-s)
1749
1750 (dnop Dst32AnUnprefixed "address register" (MACH32 m32c-isa) h-ar f-dst32-an-unprefixed)
1751 (dnop Dst32AnUnprefixedQI "address register QI view" (MACH32 m32c-isa) h-ar-QI f-dst32-an-unprefixed)
1752 (dnop Dst32AnUnprefixedHI "address register HI view" (MACH32 m32c-isa) h-ar-HI f-dst32-an-unprefixed)
1753 (dnop Dst32AnUnprefixedSI "address register SI view" (MACH32 m32c-isa) h-ar f-dst32-an-unprefixed)
1754
1755 (dnop Dst32AnExtUnprefixed "address register" (MACH32 m32c-isa) h-ar f-dst32-an-unprefixed)
1756
1757 (dnop Dst32AnPrefixed "address register" (MACH32 m32c-isa) h-ar f-dst32-an-prefixed)
1758 (dnop Dst32AnPrefixedQI "address register QI view" (MACH32 m32c-isa) h-ar-QI f-dst32-an-prefixed)
1759 (dnop Dst32AnPrefixedHI "address register HI view" (MACH32 m32c-isa) h-ar-HI f-dst32-an-prefixed)
1760 (dnop Dst32AnPrefixedSI "address register SI view" (MACH32 m32c-isa) h-ar f-dst32-an-prefixed)
1761
1762 (dnop Bit16An "address register bit view" (MACH16 m16c-isa) h-ar f-dst16-an)
1763
1764 (dnop Bit32AnPrefixed "address register bit" (MACH32 m32c-isa) h-ar f-dst32-an-prefixed)
1765 (dnop Bit32AnUnprefixed "address register bit" (MACH32 m32c-isa) h-ar f-dst32-an-unprefixed)
1766
1767 (dnop A0 "a0" (all-isas) h-a0 f-nil)
1768 (dnop A1 "a1" (all-isas) h-a1 f-nil)
1769
1770 (dnop sb "SB register" (all-isas SEM-ONLY) h-sb f-nil)
1771 (dnop fb "FB register" (all-isas SEM-ONLY) h-fb f-nil)
1772 (dnop sp "SP register" (all-isas SEM-ONLY) h-sp f-nil)
1773
1774 (define-full-operand SrcDst16-r0l-r0h-S-normal "r0l/r0h pair" (MACH16 m16c-isa)
1775 h-sint DFLT f-5-1
1776 ((parse "r0l_r0h") (print "r0l_r0h")) () ()
1777 )
1778
1779 (define-full-operand Regsetpop "popm regset" (all-isas) h-uint
1780 DFLT f-8-8 ((parse "pop_regset") (print "pop_regset")) () ())
1781 (define-full-operand Regsetpush "pushm regset" (all-isas) h-uint
1782 DFLT f-8-8 ((parse "push_regset") (print "push_regset")) () ())
1783
1784 (dnop Rn16-push-S "r0[lh]" (MACH16 m16c-isa) h-gr-QI f-4-1)
1785 (dnop An16-push-S "a[01]" (MACH16 m16c-isa) h-ar-HI f-4-1)
1786
1787 ;-------------------------------------------------------------
1788 ; Offsets and absolutes
1789 ;-------------------------------------------------------------
1790
1791 (define-full-operand Dsp-8-u6 "unsigned 6 bit displacement at offset 8 bits" (all-isas)
1792 h-uint DFLT f-dsp-8-u6
1793 ((parse "unsigned6")) () ()
1794 )
1795 (define-full-operand Dsp-8-u8 "unsigned 8 bit displacement at offset 8 bits" (all-isas)
1796 h-uint DFLT f-dsp-8-u8
1797 ((parse "unsigned8")) () ()
1798 )
1799 (define-full-operand Dsp-8-u16 "unsigned 16 bit displacement at offset 8 bits" (all-isas)
1800 h-uint DFLT f-dsp-8-u16
1801 ((parse "unsigned16")) () ()
1802 )
1803 (define-full-operand Dsp-8-s8 "signed 8 bit displacement at offset 8 bits" (all-isas)
1804 h-sint DFLT f-dsp-8-s8
1805 ((parse "signed8")) () ()
1806 )
1807 (define-full-operand Dsp-8-s24 "signed 24 bit displacement at offset 8 bits" (all-isas)
1808 h-sint DFLT f-dsp-8-s24
1809 ((parse "signed24")) () ()
1810 )
1811 (define-full-operand Dsp-8-u24 "unsigned 24 bit displacement at offset 8 bits" (all-isas)
1812 h-uint DFLT f-dsp-8-u24
1813 ((parse "unsigned24")) () ()
1814 )
1815 (define-full-operand Dsp-10-u6 "unsigned 6 bit displacement at offset 10 bits" (all-isas)
1816 h-uint DFLT f-dsp-10-u6
1817 ((parse "unsigned6")) () ()
1818 )
1819 (define-full-operand Dsp-16-u8 "unsigned 8 bit displacement at offset 16 bits" (all-isas)
1820 h-uint DFLT f-dsp-16-u8
1821 ((parse "unsigned8")) () ()
1822 )
1823 (define-full-operand Dsp-16-u16 "unsigned 16 bit displacement at offset 16 bits" (all-isas)
1824 h-uint DFLT f-dsp-16-u16
1825 ((parse "unsigned16")) () ()
1826 )
1827 (define-full-operand Dsp-16-u20 "unsigned 20 bit displacement at offset 16 bits" (all-isas)
1828 h-uint DFLT f-dsp-16-u24
1829 ((parse "unsigned20")) () ()
1830 )
1831 (define-full-operand Dsp-16-u24 "unsigned 24 bit displacement at offset 16 bits" (all-isas)
1832 h-uint DFLT f-dsp-16-u24
1833 ((parse "unsigned24")) () ()
1834 )
1835 (define-full-operand Dsp-16-s8 "signed 8 bit displacement at offset 16 bits" (all-isas)
1836 h-sint DFLT f-dsp-16-s8
1837 ((parse "signed8")) () ()
1838 )
1839 (define-full-operand Dsp-16-s16 "signed 16 bit displacement at offset 16 bits" (all-isas)
1840 h-sint DFLT f-dsp-16-s16
1841 ((parse "signed16")) () ()
1842 )
1843 (define-full-operand Dsp-24-u8 "unsigned 8 bit displacement at offset 24 bits" (all-isas)
1844 h-uint DFLT f-dsp-24-u8
1845 ((parse "unsigned8")) () ()
1846 )
1847 (define-full-operand Dsp-24-u16 "unsigned 16 bit displacement at offset 24 bits" (all-isas)
1848 h-uint DFLT f-dsp-24-u16
1849 ((parse "unsigned16")) () ()
1850 )
1851 (define-full-operand Dsp-24-u20 "unsigned 20 bit displacement at offset 24 bits" (all-isas)
1852 h-uint DFLT f-dsp-24-u24
1853 ((parse "unsigned20")) () ()
1854 )
1855 (define-full-operand Dsp-24-u24 "unsigned 24 bit displacement at offset 24 bits" (all-isas)
1856 h-uint DFLT f-dsp-24-u24
1857 ((parse "unsigned24")) () ()
1858 )
1859 (define-full-operand Dsp-24-s8 "signed 8 bit displacement at offset 24 bits" (all-isas)
1860 h-sint DFLT f-dsp-24-s8
1861 ((parse "signed8")) () ()
1862 )
1863 (define-full-operand Dsp-24-s16 "signed 16 bit displacement at offset 24 bits" (all-isas)
1864 h-sint DFLT f-dsp-24-s16
1865 ((parse "signed16")) () ()
1866 )
1867 (define-full-operand Dsp-32-u8 "unsigned 8 bit displacement at offset 32 bits" (all-isas)
1868 h-uint DFLT f-dsp-32-u8
1869 ((parse "unsigned8")) () ()
1870 )
1871 (define-full-operand Dsp-32-u16 "unsigned 16 bit displacement at offset 32 bits" (all-isas)
1872 h-uint DFLT f-dsp-32-u16
1873 ((parse "unsigned16")) () ()
1874 )
1875 (define-full-operand Dsp-32-u24 "unsigned 24 bit displacement at offset 32 bits" (all-isas)
1876 h-uint DFLT f-dsp-32-u24
1877 ((parse "unsigned24")) () ()
1878 )
1879 (define-full-operand Dsp-32-u20 "unsigned 20 bit displacement at offset 32 bits" (all-isas)
1880 h-uint DFLT f-dsp-32-u24
1881 ((parse "unsigned20")) () ()
1882 )
1883 (define-full-operand Dsp-32-s8 "signed 8 bit displacement at offset 32 bits" (all-isas)
1884 h-sint DFLT f-dsp-32-s8
1885 ((parse "signed8")) () ()
1886 )
1887 (define-full-operand Dsp-32-s16 "signed 16 bit displacement at offset 32 bits" (all-isas)
1888 h-sint DFLT f-dsp-32-s16
1889 ((parse "signed16")) () ()
1890 )
1891 (define-full-operand Dsp-40-u8 "unsigned 8 bit displacement at offset 40 bits" (all-isas)
1892 h-uint DFLT f-dsp-40-u8
1893 ((parse "unsigned8")) () ()
1894 )
1895 (define-full-operand Dsp-40-s8 "signed 8 bit displacement at offset 40 bits" (all-isas)
1896 h-sint DFLT f-dsp-40-s8
1897 ((parse "signed8")) () ()
1898 )
1899 (define-full-operand Dsp-40-u16 "unsigned 16 bit displacement at offset 40 bits" (all-isas)
1900 h-uint DFLT f-dsp-40-u16
1901 ((parse "unsigned16")) () ()
1902 )
1903 (define-full-operand Dsp-40-s16 "signed 16 bit displacement at offset 40 bits" (all-isas)
1904 h-sint DFLT f-dsp-40-s16
1905 ((parse "signed16")) () ()
1906 )
1907 (define-full-operand Dsp-40-u20 "unsigned 20 bit displacement at offset 40 bits" (all-isas)
1908 h-uint DFLT f-dsp-40-u20
1909 ((parse "unsigned20")) () ()
1910 )
1911 (define-full-operand Dsp-40-u24 "unsigned 24 bit displacement at offset 40 bits" (all-isas)
1912 h-uint DFLT f-dsp-40-u24
1913 ((parse "unsigned24")) () ()
1914 )
1915 (define-full-operand Dsp-48-u8 "unsigned 8 bit displacement at offset 48 bits" (all-isas)
1916 h-uint DFLT f-dsp-48-u8
1917 ((parse "unsigned8")) () ()
1918 )
1919 (define-full-operand Dsp-48-s8 "signed 8 bit displacement at offset 48 bits" (all-isas)
1920 h-sint DFLT f-dsp-48-s8
1921 ((parse "signed8")) () ()
1922 )
1923 (define-full-operand Dsp-48-u16 "unsigned 16 bit displacement at offset 48 bits" (all-isas)
1924 h-uint DFLT f-dsp-48-u16
1925 ((parse "unsigned16")) () ()
1926 )
1927 (define-full-operand Dsp-48-s16 "signed 16 bit displacement at offset 48 bits" (all-isas)
1928 h-sint DFLT f-dsp-48-s16
1929 ((parse "signed16")) () ()
1930 )
1931 (define-full-operand Dsp-48-u20 "unsigned 24 bit displacement at offset 40 bits" (all-isas)
1932 h-uint DFLT f-dsp-48-u20
1933 ((parse "unsigned24")) () ()
1934 )
1935 (define-full-operand Dsp-48-u24 "unsigned 24 bit displacement at offset 48 bits" (all-isas)
1936 h-uint DFLT f-dsp-48-u24
1937 ((parse "unsigned24")) () ()
1938 )
1939
1940 (define-full-operand Imm-8-s4 "signed 4 bit immediate at offset 8 bits" (all-isas)
1941 h-sint DFLT f-imm-8-s4
1942 ((parse "signed4")) () ()
1943 )
1944 (define-full-operand Imm-8-s4n "negated 4 bit immediate at offset 8 bits" (all-isas)
1945 h-sint DFLT f-imm-8-s4
1946 ((parse "signed4n") (print "signed4n")) () ()
1947 )
1948 (define-full-operand Imm-sh-8-s4 "signed 4 bit shift immediate at offset 8 bits" (all-isas)
1949 h-shimm DFLT f-imm-8-s4
1950 () () ()
1951 )
1952 (define-full-operand Imm-8-QI "signed 8 bit immediate at offset 8 bits" (all-isas)
1953 h-sint DFLT f-dsp-8-s8
1954 ((parse "signed8")) () ()
1955 )
1956 (define-full-operand Imm-8-HI "signed 16 bit immediate at offset 8 bits" (all-isas)
1957 h-sint DFLT f-dsp-8-s16
1958 ((parse "signed16")) () ()
1959 )
1960 (define-full-operand Imm-12-s4 "signed 4 bit immediate at offset 12 bits" (all-isas)
1961 h-sint DFLT f-imm-12-s4
1962 ((parse "signed4")) () ()
1963 )
1964 (define-full-operand Imm-12-s4n "negated 4 bit immediate at offset 12 bits" (all-isas)
1965 h-sint DFLT f-imm-12-s4
1966 ((parse "signed4n") (print "signed4n")) () ()
1967 )
1968 (define-full-operand Imm-sh-12-s4 "signed 4 bit shift immediate at offset 12 bits" (all-isas)
1969 h-shimm DFLT f-imm-12-s4
1970 () () ()
1971 )
1972 (define-full-operand Imm-13-u3 "signed 3 bit immediate at offset 13 bits" (all-isas)
1973 h-sint DFLT f-imm-13-u3
1974 ((parse "signed4")) () ()
1975 )
1976 (define-full-operand Imm-20-s4 "signed 4 bit immediate at offset 20 bits" (all-isas)
1977 h-sint DFLT f-imm-20-s4
1978 ((parse "signed4")) () ()
1979 )
1980 (define-full-operand Imm-sh-20-s4 "signed 4 bit shift immediate at offset 12 bits" (all-isas)
1981 h-shimm DFLT f-imm-20-s4
1982 () () ()
1983 )
1984 (define-full-operand Imm-16-QI "signed 8 bit immediate at offset 16 bits" (all-isas)
1985 h-sint DFLT f-dsp-16-s8
1986 ((parse "signed8")) () ()
1987 )
1988 (define-full-operand Imm-16-HI "signed 16 bit immediate at offset 16 bits" (all-isas)
1989 h-sint DFLT f-dsp-16-s16
1990 ((parse "signed16")) () ()
1991 )
1992 (define-full-operand Imm-16-SI "signed 32 bit immediate at offset 16 bits" (all-isas)
1993 h-sint DFLT f-dsp-16-s32
1994 ((parse "signed32")) () ()
1995 )
1996 (define-full-operand Imm-24-QI "signed 8 bit immediate at offset 24 bits" (all-isas)
1997 h-sint DFLT f-dsp-24-s8
1998 ((parse "signed8")) () ()
1999 )
2000 (define-full-operand Imm-24-HI "signed 16 bit immediate at offset 24 bits" (all-isas)
2001 h-sint DFLT f-dsp-24-s16
2002 ((parse "signed16")) () ()
2003 )
2004 (define-full-operand Imm-24-SI "signed 32 bit immediate at offset 24 bits" (all-isas)
2005 h-sint DFLT f-dsp-24-s32
2006 ((parse "signed32")) () ()
2007 )
2008 (define-full-operand Imm-32-QI "signed 8 bit immediate at offset 32 bits" (all-isas)
2009 h-sint DFLT f-dsp-32-s8
2010 ((parse "signed8")) () ()
2011 )
2012 (define-full-operand Imm-32-SI "signed 32 bit immediate at offset 32 bits" (all-isas)
2013 h-sint DFLT f-dsp-32-s32
2014 ((parse "signed32")) () ()
2015 )
2016 (define-full-operand Imm-32-HI "signed 16 bit immediate at offset 32 bits" (all-isas)
2017 h-sint DFLT f-dsp-32-s16
2018 ((parse "signed16")) () ()
2019 )
2020 (define-full-operand Imm-40-QI "signed 8 bit immediate at offset 40 bits" (all-isas)
2021 h-sint DFLT f-dsp-40-s8
2022 ((parse "signed8")) () ()
2023 )
2024 (define-full-operand Imm-40-HI "signed 16 bit immediate at offset 40 bits" (all-isas)
2025 h-sint DFLT f-dsp-40-s16
2026 ((parse "signed16")) () ()
2027 )
2028 (define-full-operand Imm-40-SI "signed 32 bit immediate at offset 40 bits" (all-isas)
2029 h-sint DFLT f-dsp-40-s32
2030 ((parse "signed32")) () ()
2031 )
2032 (define-full-operand Imm-48-QI "signed 8 bit immediate at offset 48 bits" (all-isas)
2033 h-sint DFLT f-dsp-48-s8
2034 ((parse "signed8")) () ()
2035 )
2036 (define-full-operand Imm-48-HI "signed 16 bit immediate at offset 48 bits" (all-isas)
2037 h-sint DFLT f-dsp-48-s16
2038 ((parse "signed16")) () ()
2039 )
2040 (define-full-operand Imm-48-SI "signed 32 bit immediate at offset 48 bits" (all-isas)
2041 h-sint DFLT f-dsp-48-s32
2042 ((parse "signed32")) () ()
2043 )
2044 (define-full-operand Imm-56-QI "signed 8 bit immediate at offset 56 bits" (all-isas)
2045 h-sint DFLT f-dsp-56-s8
2046 ((parse "signed8")) () ()
2047 )
2048 (define-full-operand Imm-56-HI "signed 16 bit immediate at offset 56 bits" (all-isas)
2049 h-sint DFLT f-dsp-56-s16
2050 ((parse "signed16")) () ()
2051 )
2052 (define-full-operand Imm-64-HI "signed 16 bit immediate at offset 64 bits" (all-isas)
2053 h-sint DFLT f-dsp-64-s16
2054 ((parse "signed16")) () ()
2055 )
2056 (define-full-operand Imm1-S "signed 1 bit immediate for short format binary insns" (m32c-isa)
2057 h-sint DFLT f-imm1-S
2058 ((parse "imm1_S")) () ()
2059 )
2060 (define-full-operand Imm3-S "signed 3 bit immediate for short format binary insns" (m32c-isa)
2061 h-sint DFLT f-imm3-S
2062 ((parse "imm3_S")) () ()
2063 )
2064 (define-full-operand Bit3-S "3 bit bit number" (m32c-isa)
2065 h-sint DFLT f-imm3-S
2066 ((parse "bit3_S")) () ()
2067 )
2068
2069 ;-------------------------------------------------------------
2070 ; Bit numbers
2071 ;-------------------------------------------------------------
2072
2073 (define-full-operand Bitno16R "bit number for indexing registers" (m16c-isa)
2074 h-uint DFLT f-dsp-16-u8
2075 ((parse "Bitno16R")) () ()
2076 )
2077 (dnop Bitno32Prefixed "bit number for indexing objects" (m32c-isa) h-uint f-bitno32-prefixed)
2078 (dnop Bitno32Unprefixed "bit number for indexing objects" (m32c-isa) h-uint f-bitno32-unprefixed)
2079
2080 (define-full-operand BitBase16-16-u8 "unsigned bit,base:8 at offset 16for m16c" (m16c-isa)
2081 h-uint DFLT f-dsp-16-u8
2082 ((parse "unsigned_bitbase8") (print "unsigned_bitbase")) () ()
2083 )
2084 (define-full-operand BitBase16-16-s8 "signed bit,base:8 at offset 16for m16c" (m16c-isa)
2085 h-sint DFLT f-dsp-16-s8
2086 ((parse "signed_bitbase8") (print "signed_bitbase")) () ()
2087 )
2088 (define-full-operand BitBase16-16-u16 "unsigned bit,base:16 at offset 16 for m16c" (m16c-isa)
2089 h-uint DFLT f-dsp-16-u16
2090 ((parse "unsigned_bitbase16") (print "unsigned_bitbase")) () ()
2091 )
2092 (define-full-operand BitBase16-8-u11-S "signed bit,base:11 at offset 16 for m16c" (m16c-isa)
2093 h-uint DFLT f-bitbase16-u11-S
2094 ((parse "unsigned_bitbase11") (print "unsigned_bitbase")) () ()
2095 )
2096
2097 (define-full-operand BitBase32-16-u11-Unprefixed "unsigned bit,base:11 at offset 16 for m32c" (m32c-isa)
2098 h-uint DFLT f-bitbase32-16-u11-unprefixed
2099 ((parse "unsigned_bitbase11") (print "unsigned_bitbase")) () ()
2100 )
2101 (define-full-operand BitBase32-16-s11-Unprefixed "signed bit,base:11 at offset 16 for m32c" (m32c-isa)
2102 h-sint DFLT f-bitbase32-16-s11-unprefixed
2103 ((parse "signed_bitbase11") (print "signed_bitbase")) () ()
2104 )
2105 (define-full-operand BitBase32-16-u19-Unprefixed "unsigned bit,base:19 at offset 16 for m32c" (m32c-isa)
2106 h-uint DFLT f-bitbase32-16-u19-unprefixed
2107 ((parse "unsigned_bitbase19") (print "unsigned_bitbase")) () ()
2108 )
2109 (define-full-operand BitBase32-16-s19-Unprefixed "signed bit,base:19 at offset 16 for m32c" (m32c-isa)
2110 h-sint DFLT f-bitbase32-16-s19-unprefixed
2111 ((parse "signed_bitbase19") (print "signed_bitbase")) () ()
2112 )
2113 (define-full-operand BitBase32-16-u27-Unprefixed "unsigned bit,base:27 at offset 16 for m32c" (m32c-isa)
2114 h-uint DFLT f-bitbase32-16-u27-unprefixed
2115 ((parse "unsigned_bitbase27") (print "unsigned_bitbase")) () ()
2116 )
2117 (define-full-operand BitBase32-24-u11-Prefixed "unsigned bit,base:11 at offset 24 for m32c" (m32c-isa)
2118 h-uint DFLT f-bitbase32-24-u11-prefixed
2119 ((parse "unsigned_bitbase11") (print "unsigned_bitbase")) () ()
2120 )
2121 (define-full-operand BitBase32-24-s11-Prefixed "signed bit,base:11 at offset 24 for m32c" (m32c-isa)
2122 h-sint DFLT f-bitbase32-24-s11-prefixed
2123 ((parse "signed_bitbase11") (print "signed_bitbase")) () ()
2124 )
2125 (define-full-operand BitBase32-24-u19-Prefixed "unsigned bit,base:19 at offset 24 for m32c" (m32c-isa)
2126 h-uint DFLT f-bitbase32-24-u19-prefixed
2127 ((parse "unsigned_bitbase19") (print "unsigned_bitbase")) () ()
2128 )
2129 (define-full-operand BitBase32-24-s19-Prefixed "signed bit,base:19 at offset 24 for m32c" (m32c-isa)
2130 h-sint DFLT f-bitbase32-24-s19-prefixed
2131 ((parse "signed_bitbase19") (print "signed_bitbase")) () ()
2132 )
2133 (define-full-operand BitBase32-24-u27-Prefixed "unsigned bit,base:27 at offset 24 for m32c" (m32c-isa)
2134 h-uint DFLT f-bitbase32-24-u27-prefixed
2135 ((parse "unsigned_bitbase27") (print "unsigned_bitbase")) () ()
2136 )
2137 ;-------------------------------------------------------------
2138 ; Labels
2139 ;-------------------------------------------------------------
2140
2141 (define-full-operand Lab-5-3 "3 bit label" (all-isas RELAX)
2142 h-iaddr DFLT f-lab-5-3
2143 ((parse "lab_5_3")) () () )
2144
2145 (define-full-operand Lab32-jmp-s "3 bit label" (all-isas RELAX)
2146 h-iaddr DFLT f-lab32-jmp-s
2147 ((parse "lab_5_3")) () () )
2148
2149 (dnop Lab-8-8 "8 bit label" (all-isas RELAX) h-iaddr f-lab-8-8)
2150 (dnop Lab-8-16 "16 bit label" (all-isas RELAX) h-iaddr f-lab-8-16)
2151 (dnop Lab-8-24 "24 bit label" (all-isas RELAX) h-iaddr f-lab-8-24)
2152 (dnop Lab-16-8 "8 bit label" (all-isas RELAX) h-iaddr f-lab-16-8)
2153 (dnop Lab-24-8 "8 bit label" (all-isas RELAX) h-iaddr f-lab-24-8)
2154 (dnop Lab-32-8 "8 bit label" (all-isas RELAX) h-iaddr f-lab-32-8)
2155 (dnop Lab-40-8 "8 bit label" (all-isas RELAX) h-iaddr f-lab-40-8)
2156
2157 ;-------------------------------------------------------------
2158 ; Condition code bits
2159 ;-------------------------------------------------------------
2160
2161 (dnop sbit "negative bit" (SEM-ONLY all-isas) h-sbit f-nil)
2162 (dnop obit "overflow bit" (SEM-ONLY all-isas) h-obit f-nil)
2163 (dnop zbit "zero bit" (SEM-ONLY all-isas) h-zbit f-nil)
2164 (dnop cbit "carry bit" (SEM-ONLY all-isas) h-cbit f-nil)
2165 (dnop ubit "stack ptr select bit" (SEM-ONLY all-isas) h-ubit f-nil)
2166 (dnop ibit "interrupt enable bit" (SEM-ONLY all-isas) h-ibit f-nil)
2167 (dnop bbit "reg bank select bit" (SEM-ONLY all-isas) h-bbit f-nil)
2168 (dnop dbit "debug bit" (SEM-ONLY all-isas) h-dbit f-nil)
2169
2170 ;-------------------------------------------------------------
2171 ; Condition operands
2172 ;-------------------------------------------------------------
2173
2174 (define-pmacro (cond-operand mach offset)
2175 (dnop (.sym cond mach - offset) "condition" ((.sym m mach c-isa)) (.sym h-cond mach) (.sym f-dsp- offset -u8))
2176 )
2177
2178 (cond-operand 16 16)
2179 (cond-operand 16 24)
2180 (cond-operand 16 32)
2181 (cond-operand 32 16)
2182 (cond-operand 32 24)
2183 (cond-operand 32 32)
2184 (cond-operand 32 40)
2185
2186 (dnop cond16c "condition" (m16c-isa) h-cond16c f-cond16)
2187 (dnop cond16j "condition" (m16c-isa) h-cond16j f-cond16)
2188 (dnop cond16j5 "condition" (m16c-isa) h-cond16j-5 f-cond16j-5)
2189 (dnop cond32 "condition" (m32c-isa) h-cond32 f-cond32)
2190 (dnop cond32j "condition" (m32c-isa) h-cond32 f-cond32j)
2191 (dnop sccond32 "scCND condition" (m32c-isa) h-cond32 f-cond16)
2192 (dnop flags16 "flags" (m16c-isa) h-flags f-9-3)
2193 (dnop flags32 "flags" (m32c-isa) h-flags f-13-3)
2194 (dnop cr16 "control" (m16c-isa) h-cr-16 f-9-3)
2195 (dnop cr1-Unprefixed-32 "control" (m32c-isa) h-cr1-32 f-13-3)
2196 (dnop cr1-Prefixed-32 "control" (m32c-isa) h-cr1-32 f-21-3)
2197 (dnop cr2-32 "control" (m32c-isa) h-cr2-32 f-13-3)
2198 (dnop cr3-Unprefixed-32 "control" (m32c-isa) h-cr3-32 f-13-3)
2199 (dnop cr3-Prefixed-32 "control" (m32c-isa) h-cr3-32 f-21-3)
2200
2201 ;-------------------------------------------------------------
2202 ; Suffixes
2203 ;-------------------------------------------------------------
2204
2205 (define-full-operand Z "Suffix for zero format insns" (all-isas)
2206 h-sint DFLT f-nil
2207 ((parse "Z") (print "Z")) () ()
2208 )
2209 (define-full-operand S "Suffix for short format insns" (all-isas)
2210 h-sint DFLT f-nil
2211 ((parse "S") (print "S")) () ()
2212 )
2213 (define-full-operand Q "Suffix for quick format insns" (all-isas)
2214 h-sint DFLT f-nil
2215 ((parse "Q") (print "Q")) () ()
2216 )
2217 (define-full-operand G "Suffix for general format insns" (all-isas)
2218 h-sint DFLT f-nil
2219 ((parse "G") (print "G")) () ()
2220 )
2221 (define-full-operand X "Empty suffix" (all-isas)
2222 h-sint DFLT f-nil
2223 ((parse "X") (print "X")) () ()
2224 )
2225 (define-full-operand size "any size specifier" (all-isas)
2226 h-sint DFLT f-nil
2227 ((parse "size") (print "size")) () ()
2228 )
2229 ;-------------------------------------------------------------
2230 ; Misc
2231 ;-------------------------------------------------------------
2232
2233 (dnop BitIndex "Bit Index for the next insn" (SEM-ONLY MACH32 m32c-isa) h-bit-index f-nil)
2234 (dnop SrcIndex "Source Index for the next insn" (SEM-ONLY MACH32 m32c-isa) h-src-index f-nil)
2235 (dnop DstIndex "Destination Index for the next insn" (SEM-ONLY MACH32 m32c-isa) h-dst-index f-nil)
2236 (dnop NoRemainder "Place holder for when the remainder is not kept" (SEM-ONLY MACH32 m32c-isa) h-none f-nil)
2237
2239 ;=============================================================
2240 ; Derived Operands
2241
2242 ; Memory reference macros that clip addresses appropriately. Refer to
2243 ; memory at ADDRESS in MODE, clipped appropriately for either the m16c
2244 ; or m32c.
2245 (define-pmacro (mem16 mode address)
2246 (mem mode (and #xffff address)))
2247
2248 (define-pmacro (mem20 mode address)
2249 (mem mode (and #xfffff address)))
2250
2251 (define-pmacro (mem32 mode address)
2252 (mem mode (and #xffffff address)))
2253
2254 ; Like mem16 and mem32, but takes MACH as a parameter. MACH must be
2255 ; either 16 or 32.
2256 (define-pmacro (mem-mach mach mode address)
2257 ((.sym mem mach) mode address))
2258
2259 ;-------------------------------------------------------------
2260 ; Source
2261 ;-------------------------------------------------------------
2262 ; Rn direct
2263 ;-------------------------------------------------------------
2264
2265 (define-pmacro (src16-Rn-direct-operand xmode)
2266 (begin
2267 (define-derived-operand
2268 (name (.sym src16-Rn-direct- xmode))
2269 (comment (.str "m16c Rn direct source " xmode))
2270 (attrs (machine 16))
2271 (mode xmode)
2272 (args ((.sym Src16Rn xmode)))
2273 (syntax (.str "$Src16Rn" xmode))
2274 (base-ifield f-8-4)
2275 (encoding (+ (f-8-2 0) (.sym Src16Rn xmode)))
2276 (ifield-assertion (eq f-8-2 0))
2277 (getter (trunc xmode (.sym Src16Rn xmode)))
2278 (setter (set (.sym Src16Rn xmode) newval))
2279 )
2280 )
2281 )
2282 (src16-Rn-direct-operand QI)
2283 (src16-Rn-direct-operand HI)
2284
2285 (define-pmacro (src32-Rn-direct-operand group base xmode)
2286 (begin
2287 (define-derived-operand
2288 (name (.sym src32-Rn-direct- group - xmode))
2289 (comment (.str "m32c Rn direct source " xmode))
2290 (attrs (machine 32))
2291 (mode xmode)
2292 (args ((.sym Src32Rn group xmode)))
2293 (syntax (.str "$Src32Rn" group xmode))
2294 (base-ifield (.sym f- base -11))
2295 (encoding (+ ((.sym f- base -3) 4) (.sym Src32Rn group xmode)))
2296 (ifield-assertion (eq (.sym f- base -3) 4))
2297 (getter (trunc xmode (.sym Src32Rn group xmode)))
2298 (setter (set (.sym Src32Rn group xmode) newval))
2299 )
2300 )
2301 )
2302
2303 (src32-Rn-direct-operand Unprefixed 1 QI)
2304 (src32-Rn-direct-operand Prefixed 9 QI)
2305 (src32-Rn-direct-operand Unprefixed 1 HI)
2306 (src32-Rn-direct-operand Prefixed 9 HI)
2307 (src32-Rn-direct-operand Unprefixed 1 SI)
2308 (src32-Rn-direct-operand Prefixed 9 SI)
2309
2310 ;-------------------------------------------------------------
2311 ; An direct
2312 ;-------------------------------------------------------------
2313
2314 (define-pmacro (src16-An-direct-operand xmode)
2315 (begin
2316 (define-derived-operand
2317 (name (.sym src16-An-direct- xmode))
2318 (comment (.str "m16c An direct destination " xmode))
2319 (attrs (machine 16))
2320 (mode xmode)
2321 (args ((.sym Src16An xmode)))
2322 (syntax (.str "$Src16An" xmode))
2323 (base-ifield f-8-4)
2324 (encoding (+ (f-8-2 1) (f-10-1 0) (.sym Src16An xmode)))
2325 (ifield-assertion (andif (eq f-8-2 1) (eq f-10-1 0)))
2326 (getter (trunc xmode (.sym Src16An xmode)))
2327 (setter (set (.sym Src16An xmode) newval))
2328 )
2329 )
2330 )
2331 (src16-An-direct-operand QI)
2332 (src16-An-direct-operand HI)
2333
2334 (define-pmacro (src32-An-direct-operand group base1 base2 xmode)
2335 (begin
2336 (define-derived-operand
2337 (name (.sym src32-An-direct- group - xmode))
2338 (comment (.str "m32c An direct destination " xmode))
2339 (attrs (machine 32))
2340 (mode xmode)
2341 (args ((.sym Src32An group xmode)))
2342 (syntax (.str "$Src32An" group xmode))
2343 (base-ifield (.sym f- base1 -11))
2344 (encoding (+ ((.sym f- base1 -3) 0) ((.sym f- base2 -1) 1) (.sym Src32An group xmode)))
2345 (ifield-assertion (andif (eq (.sym f- base1 -3) 0) (eq (.sym f- base2 -1) 1)))
2346 (getter (trunc xmode (.sym Src32An group xmode)))
2347 (setter (set (.sym Src32An group xmode) newval))
2348 )
2349 )
2350 )
2351
2352 (src32-An-direct-operand Unprefixed 1 10 QI)
2353 (src32-An-direct-operand Unprefixed 1 10 HI)
2354 (src32-An-direct-operand Unprefixed 1 10 SI)
2355 (src32-An-direct-operand Prefixed 9 18 QI)
2356 (src32-An-direct-operand Prefixed 9 18 HI)
2357 (src32-An-direct-operand Prefixed 9 18 SI)
2358
2359 ;-------------------------------------------------------------
2360 ; An indirect
2361 ;-------------------------------------------------------------
2362
2363 (define-pmacro (src16-An-indirect-operand xmode)
2364 (begin
2365 (define-derived-operand
2366 (name (.sym src16-An-indirect- xmode))
2367 (comment (.str "m16c An indirect destination " xmode))
2368 (attrs (machine 16))
2369 (mode xmode)
2370 (args (Src16An))
2371 (syntax "[$Src16An]")
2372 (base-ifield f-8-4)
2373 (encoding (+ (f-8-2 1) (f-10-1 1) Src16An))
2374 (ifield-assertion (andif (eq f-8-2 1) (eq f-10-1 1)))
2375 (getter (mem16 xmode Src16An))
2376 (setter (set (mem16 xmode Src16An) newval))
2377 )
2378 )
2379 )
2380 (src16-An-indirect-operand QI)
2381 (src16-An-indirect-operand HI)
2382
2383 (define-pmacro (src32-An-indirect-operand group base1 base2 xmode)
2384 (begin
2385 (define-derived-operand
2386 (name (.sym src32-An-indirect- group - xmode))
2387 (comment (.str "m32c An indirect destination " xmode))
2388 (attrs (machine 32))
2389 (mode xmode)
2390 (args ((.sym Src32An group)))
2391 (syntax (.str "[$Src32An" group "]"))
2392 (base-ifield (.sym f- base1 -11))
2393 (encoding (+ ((.sym f- base1 -3) 0) ((.sym f- base2 -1) 0) (.sym Src32An group)))
2394 (ifield-assertion (andif (eq (.sym f- base1 -3) 0) (eq (.sym f- base2 -1) 0)))
2395 (getter (c-call xmode (.str "operand_getter_" xmode) (.sym Src32An group)
2396 (const 0)))
2397 (setter (c-call DFLT (.str "operand_setter_" xmode) newval
2398 (.sym Src32An group) (const 0)))
2399 ; (getter (mem32 xmode (.sym Src32An group)))
2400 ; (setter (set (mem32 xmode (.sym Src32An group)) newval))
2401 )
2402 )
2403 )
2404
2405 (src32-An-indirect-operand Unprefixed 1 10 QI)
2406 (src32-An-indirect-operand Unprefixed 1 10 HI)
2407 (src32-An-indirect-operand Unprefixed 1 10 SI)
2408 (src32-An-indirect-operand Prefixed 9 18 QI)
2409 (src32-An-indirect-operand Prefixed 9 18 HI)
2410 (src32-An-indirect-operand Prefixed 9 18 SI)
2411
2412 ;-------------------------------------------------------------
2413 ; dsp:d[r] relative
2414 ;-------------------------------------------------------------
2415
2416 (define-pmacro (src16-relative-operand xmode)
2417 (begin
2418 (define-derived-operand
2419 (name (.sym src16-16-8-SB-relative- xmode))
2420 (comment (.str "m16c dsp:8[sb] relative destination " xmode))
2421 (attrs (machine 16))
2422 (mode xmode)
2423 (args (Dsp-16-u8))
2424 (syntax "${Dsp-16-u8}[sb]")
2425 (base-ifield f-8-4)
2426 (encoding (+ (f-8-4 #xA) Dsp-16-u8))
2427 (ifield-assertion (eq f-8-4 #xA))
2428 (getter (mem16 xmode (add Dsp-16-u8 (reg h-sb))))
2429 (setter (set (mem16 xmode (add Dsp-16-u8 (reg h-sb))) newval))
2430 )
2431 (define-derived-operand
2432 (name (.sym src16-16-16-SB-relative- xmode))
2433 (comment (.str "m16c dsp:16[sb] relative destination " xmode))
2434 (attrs (machine 16))
2435 (mode xmode)
2436 (args (Dsp-16-u16))
2437 (syntax "${Dsp-16-u16}[sb]")
2438 (base-ifield f-8-4)
2439 (encoding (+ (f-8-4 #xE) Dsp-16-u16))
2440 (ifield-assertion (eq f-8-4 #xE))
2441 (getter (mem16 xmode (add Dsp-16-u16 (reg h-sb))))
2442 (setter (set (mem16 xmode (add Dsp-16-u16 (reg h-sb))) newval))
2443 )
2444 (define-derived-operand
2445 (name (.sym src16-16-8-FB-relative- xmode))
2446 (comment (.str "m16c dsp:8[fb] relative destination " xmode))
2447 (attrs (machine 16))
2448 (mode xmode)
2449 (args (Dsp-16-s8))
2450 (syntax "${Dsp-16-s8}[fb]")
2451 (base-ifield f-8-4)
2452 (encoding (+ (f-8-4 #xB) Dsp-16-s8))
2453 (ifield-assertion (eq f-8-4 #xB))
2454 (getter (mem16 xmode (add Dsp-16-s8 (reg h-fb))))
2455 (setter (set (mem16 xmode (add Dsp-16-s8 (reg h-fb))) newval))
2456 )
2457 (define-derived-operand
2458 (name (.sym src16-16-8-An-relative- xmode))
2459 (comment (.str "m16c dsp:8[An] relative destination " xmode))
2460 (attrs (machine 16))
2461 (mode xmode)
2462 (args (Src16An Dsp-16-u8))
2463 (syntax "${Dsp-16-u8}[$Src16An]")
2464 (base-ifield f-8-4)
2465 (encoding (+ (f-8-2 2) (f-10-1 0) Dsp-16-u8 Src16An))
2466 (ifield-assertion (andif (eq f-8-2 2) (eq f-10-1 0)))
2467 (getter (mem16 xmode (add Dsp-16-u8 Src16An)))
2468 (setter (set (mem16 xmode (add Dsp-16-u8 Src16An)) newval))
2469 )
2470 (define-derived-operand
2471 (name (.sym src16-16-16-An-relative- xmode))
2472 (comment (.str "m16c dsp:16[An] relative destination " xmode))
2473 (attrs (machine 16))
2474 (mode xmode)
2475 (args (Src16An Dsp-16-u16))
2476 (syntax "${Dsp-16-u16}[$Src16An]")
2477 (base-ifield f-8-4)
2478 (encoding (+ (f-8-2 3) (f-10-1 0) Dsp-16-u16 Src16An))
2479 (ifield-assertion (andif (eq f-8-2 3) (eq f-10-1 0)))
2480 (getter (mem16 xmode (add Dsp-16-u16 Src16An)))
2481 (setter (set (mem16 xmode (add Dsp-16-u16 Src16An)) newval))
2482 )
2483 (define-derived-operand
2484 (name (.sym src16-16-20-An-relative- xmode))
2485 (comment (.str "m16c dsp:20[An] relative destination " xmode))
2486 (attrs (machine 16))
2487 (mode xmode)
2488 (args (Src16An Dsp-16-u20))
2489 (syntax "${Dsp-16-u20}[$Src16An]")
2490 (base-ifield f-8-4)
2491 (encoding (+ (f-8-2 3) (f-10-1 0) Dsp-16-u20 Src16An))
2492 (ifield-assertion (andif (eq f-8-2 3) (eq f-10-1 0)))
2493 (getter (mem20 xmode (add Dsp-16-u20 Src16An)))
2494 (setter (set (mem20 xmode (add Dsp-16-u20 Src16An)) newval))
2495 )
2496 )
2497 )
2498
2499 (src16-relative-operand QI)
2500 (src16-relative-operand HI)
2501
2502 (define-pmacro (src32-relative-operand offset group base1 base2 xmode)
2503 (begin
2504 (define-derived-operand
2505 (name (.sym src32- offset -8-SB-relative- group - xmode))
2506 (comment (.str "m32c dsp:8[sb] relative destination " xmode))
2507 (attrs (machine 32))
2508 (mode xmode)
2509 (args ((.sym Dsp- offset -u8)))
2510 (syntax (.str "${Dsp-" offset "-u8}[sb]"))
2511 (base-ifield (.sym f- base1 -11))
2512 (encoding (+ ((.sym f- base1 -3) 1) ((.sym f- base2 -2) 2) (.sym Dsp- offset -u8)))
2513 (ifield-assertion (andif (eq (.sym f- base1 -3) 1) (eq (.sym f- base2 -2) 2)))
2514 (getter (c-call xmode (.str "operand_getter_" xmode) sb (.sym Dsp- offset -u8)))
2515 (setter (c-call DFLT (.str "operand_setter_" xmode) newval sb (.sym Dsp- offset -u8)))
2516 ; (getter (mem32 xmode (add (.sym Dsp- offset -u8) (reg h-sb))))
2517 ; (setter (set (mem32 xmode (add (.sym Dsp- offset -u8) (reg h-sb))) newval))
2518 )
2519 (define-derived-operand
2520 (name (.sym src32- offset -16-SB-relative- group - xmode))
2521 (comment (.str "m32c dsp:16[sb] relative destination " xmode))
2522 (attrs (machine 32))
2523 (mode xmode)
2524 (args ((.sym Dsp- offset -u16)))
2525 (syntax (.str "${Dsp-" offset "-u16}[sb]"))
2526 (base-ifield (.sym f- base1 -11))
2527 (encoding (+ ((.sym f- base1 -3) 2) ((.sym f- base2 -2) 2) (.sym Dsp- offset -u16)))
2528 (ifield-assertion (andif (eq (.sym f- base1 -3) 2) (eq (.sym f- base2 -2) 2)))
2529 (getter (c-call xmode (.str "operand_getter_" xmode) sb (.sym Dsp- offset -u16)))
2530 (setter (c-call DFLT (.str "operand_setter_" xmode) newval sb (.sym Dsp- offset -u16)))
2531 ; (getter (mem32 xmode (add (.sym Dsp- offset -u16) (reg h-sb))))
2532 ; (setter (set (mem32 xmode (add (.sym Dsp- offset -u16) (reg h-sb))) newval))
2533 )
2534 (define-derived-operand
2535 (name (.sym src32- offset -8-FB-relative- group - xmode))
2536 (comment (.str "m32c dsp:8[fb] relative destination " xmode))
2537 (attrs (machine 32))
2538 (mode xmode)
2539 (args ((.sym Dsp- offset -s8)))
2540 (syntax (.str "${Dsp-" offset "-s8}[fb]"))
2541 (base-ifield (.sym f- base1 -11))
2542 (encoding (+ ((.sym f- base1 -3) 1) ((.sym f- base2 -2) 3) (.sym Dsp- offset -s8)))
2543 (ifield-assertion (andif (eq (.sym f- base1 -3) 1) (eq (.sym f- base2 -2) 3)))
2544 (getter (c-call xmode (.str "operand_getter_" xmode) fb (.sym Dsp- offset -s8)))
2545 (setter (c-call DFLT (.str "operand_setter_" xmode) newval fb (.sym Dsp- offset -s8)))
2546 ; (getter (mem32 xmode (add (.sym Dsp- offset -s8) (reg h-fb))))
2547 ; (setter (set (mem32 xmode (add (.sym Dsp- offset -s8) (reg h-fb))) newval))
2548 )
2549 (define-derived-operand
2550 (name (.sym src32- offset -16-FB-relative- group - xmode))
2551 (comment (.str "m32c dsp:16[fb] relative destination " xmode))
2552 (attrs (machine 32))
2553 (mode xmode)
2554 (args ((.sym Dsp- offset -s16)))
2555 (syntax (.str "${Dsp-" offset "-s16}[fb]"))
2556 (base-ifield (.sym f- base1 -11))
2557 (encoding (+ ((.sym f- base1 -3) 2) ((.sym f- base2 -2) 3) (.sym Dsp- offset -s16)))
2558 (ifield-assertion (andif (eq (.sym f- base1 -3) 2) (eq (.sym f- base2 -2) 3)))
2559 (getter (c-call xmode (.str "operand_getter_" xmode) fb (.sym Dsp- offset -s16)))
2560 (setter (c-call DFLT (.str "operand_setter_" xmode) newval fb (.sym Dsp- offset -s16)))
2561 ; (getter (mem32 xmode (add (.sym Dsp- offset -s16) (reg h-fb))))
2562 ; (setter (set (mem32 xmode (add (.sym Dsp- offset -s16) (reg h-fb))) newval))
2563 )
2564 (define-derived-operand
2565 (name (.sym src32- offset -8-An-relative- group - xmode))
2566 (comment (.str "m32c dsp:8[An] relative destination " xmode))
2567 (attrs (machine 32))
2568 (mode xmode)
2569 (args ((.sym Src32An group) (.sym Dsp- offset -u8)))
2570 (syntax (.str "${Dsp-" offset "-u8}[$Src32An" group "]"))
2571 (base-ifield (.sym f- base1 -11))
2572 (encoding (+ ((.sym f- base1 -3) 1) ((.sym f- base2 -1) 0) (.sym Dsp- offset -u8) (.sym Src32An group)))
2573 (ifield-assertion (andif (eq (.sym f- base1 -3) 1) (eq (.sym f- base2 -1) 0)))
2574 (getter (c-call xmode (.str "operand_getter_" xmode) (.sym Src32An group) (.sym Dsp- offset -u8)))
2575 (setter (c-call DFLT (.str "operand_setter_" xmode) newval (.sym Src32An group) (.sym Dsp- offset -u8)))
2576 ; (getter (mem32 xmode (add (.sym Dsp- offset -u8) (.sym Src32An group))))
2577 ; (setter (set (mem32 xmode (add (.sym Dsp- offset -u8) (.sym Src32An group))) newval))
2578 )
2579 (define-derived-operand
2580 (name (.sym src32- offset -16-An-relative- group - xmode))
2581 (comment (.str "m32c dsp:16[An] relative destination " xmode))
2582 (attrs (machine 32))
2583 (mode xmode)
2584 (args ((.sym Src32An group) (.sym Dsp- offset -u16)))
2585 (syntax (.str "${Dsp-" offset "-u16}[$Src32An" group "]"))
2586 (base-ifield (.sym f- base1 -11))
2587 (encoding (+ ((.sym f- base1 -3) 2) ((.sym f- base2 -1) 0) (.sym Dsp- offset -u16) (.sym Src32An group)))
2588 (ifield-assertion (andif (eq (.sym f- base1 -3) 2) (eq (.sym f- base2 -1) 0)))
2589 (getter (c-call xmode (.str "operand_getter_" xmode) (.sym Src32An group) (.sym Dsp- offset -u16)))
2590 (setter (c-call DFLT (.str "operand_setter_" xmode) newval (.sym Src32An group) (.sym Dsp- offset -u16)))
2591 ; (getter (mem32 xmode (add (.sym Dsp- offset -u16) (.sym Src32An group))))
2592 ; (setter (set (mem32 xmode (add (.sym Dsp- offset -u16) (.sym Src32An group))) newval))
2593 )
2594 (define-derived-operand
2595 (name (.sym src32- offset -24-An-relative- group - xmode))
2596 (comment (.str "m32c dsp:16[An] relative destination " xmode))
2597 (attrs (machine 32))
2598 (mode xmode)
2599 (args ((.sym Src32An group) (.sym Dsp- offset -u24)))
2600 (syntax (.str "${Dsp-" offset "-u24}[$Src32An" group "]"))
2601 (base-ifield (.sym f- base1 -11))
2602 (encoding (+ ((.sym f- base1 -3) 3) ((.sym f- base2 -1) 0) (.sym Dsp- offset -u24) (.sym Src32An group)))
2603 (ifield-assertion (andif (eq (.sym f- base1 -3) 3) (eq (.sym f- base2 -1) 0)))
2604 (getter (c-call xmode (.str "operand_getter_" xmode) (.sym Src32An group) (.sym Dsp- offset -u24) ))
2605 (setter (c-call DFLT (.str "operand_setter_" xmode) newval (.sym Src32An group) (.sym Dsp- offset -u24)))
2606 ; (getter (mem32 xmode (add (.sym Dsp- offset -u24) (.sym Src32An group))))
2607 ; (setter (set (mem32 xmode (add (.sym Dsp- offset -u24) (.sym Src32An group))) newval))
2608 )
2609 )
2610 )
2611
2612 (src32-relative-operand 16 Unprefixed 1 10 QI)
2613 (src32-relative-operand 16 Unprefixed 1 10 HI)
2614 (src32-relative-operand 16 Unprefixed 1 10 SI)
2615 (src32-relative-operand 24 Prefixed 9 18 QI)
2616 (src32-relative-operand 24 Prefixed 9 18 HI)
2617 (src32-relative-operand 24 Prefixed 9 18 SI)
2618
2619 ;-------------------------------------------------------------
2620 ; Absolute address
2621 ;-------------------------------------------------------------
2622
2623 (define-pmacro (src16-absolute xmode)
2624 (begin
2625 (define-derived-operand
2626 (name (.sym src16-16-16-absolute- xmode))
2627 (comment (.str "m16c absolute address " xmode))
2628 (attrs (machine 16))
2629 (mode xmode)
2630 (args (Dsp-16-u16))
2631 (syntax (.str "${Dsp-16-u16}"))
2632 (base-ifield f-8-4)
2633 (encoding (+ (f-8-4 #xF) Dsp-16-u16))
2634 (ifield-assertion (eq f-8-4 #xF))
2635 (getter (mem16 xmode Dsp-16-u16))
2636 (setter (set (mem16 xmode Dsp-16-u16) newval))
2637 )
2638 )
2639 )
2640
2641 (src16-absolute QI)
2642 (src16-absolute HI)
2643
2644 (define-pmacro (src32-absolute offset group base1 base2 xmode)
2645 (begin
2646 (define-derived-operand
2647 (name (.sym src32- offset -16-absolute- group - xmode))
2648 (comment (.str "m32c absolute address " xmode))
2649 (attrs (machine 32))
2650 (mode xmode)
2651 (args ((.sym Dsp- offset -u16)))
2652 (syntax (.str "${Dsp-" offset "-u16}"))
2653 (base-ifield (.sym f- base1 -11))
2654 (encoding (+ ((.sym f- base1 -3) 3) ((.sym f- base2 -2) 3) (.sym Dsp- offset -u16)))
2655 (ifield-assertion (andif (eq (.sym f- base1 -3) 3) (eq (.sym f- base2 -2) 3)))
2656 (getter (c-call xmode (.str "operand_getter_" xmode) (const 0) (.sym Dsp- offset -u16)))
2657 (setter (c-call DFLT (.str "operand_setter_" xmode) newval (const 0) (.sym Dsp- offset -u16)))
2658 ; (getter (mem32 xmode (.sym Dsp- offset -u16)))
2659 ; (setter (set (mem32 xmode (.sym Dsp- offset -u16)) newval))
2660 )
2661 (define-derived-operand
2662 (name (.sym src32- offset -24-absolute- group - xmode))
2663 (comment (.str "m32c absolute address " xmode))
2664 (attrs (machine 32))
2665 (mode xmode)
2666 (args ((.sym Dsp- offset -u24)))
2667 (syntax (.str "${Dsp-" offset "-u24}"))
2668 (base-ifield (.sym f- base1 -11))
2669 (encoding (+ ((.sym f- base1 -3) 3) ((.sym f- base2 -2) 2) (.sym Dsp- offset -u24)))
2670 (ifield-assertion (andif (eq (.sym f- base1 -3) 3) (eq (.sym f- base2 -2) 2)))
2671 (getter (c-call xmode (.str "operand_getter_" xmode) (const 0) (.sym Dsp- offset -u24)))
2672 (setter (c-call DFLT (.str "operand_setter_" xmode) newval (const 0) (.sym Dsp- offset -u24)))
2673 ; (getter (mem32 xmode (.sym Dsp- offset -u24)))
2674 ; (setter (set (mem32 xmode (.sym Dsp- offset -u24)) newval))
2675 )
2676 )
2677 )
2678
2679 (src32-absolute 16 Unprefixed 1 10 QI)
2680 (src32-absolute 16 Unprefixed 1 10 HI)
2681 (src32-absolute 16 Unprefixed 1 10 SI)
2682 (src32-absolute 24 Prefixed 9 18 QI)
2683 (src32-absolute 24 Prefixed 9 18 HI)
2684 (src32-absolute 24 Prefixed 9 18 SI)
2685
2686 ;-------------------------------------------------------------
2687 ; An indirect indirect
2688 ;
2689 ; Double indirect addressing uses the lower 3 bytes of the value stored
2690 ; at the address referenced by 'op' as the effective address.
2691 ;-------------------------------------------------------------
2692
2693 (define-pmacro (indirect-addr op) (and USI (mem32 USI op) #x00ffffff))
2694
2695 ; (define-pmacro (src-An-indirect-indirect-operand xmode)
2696 ; (define-derived-operand
2697 ; (name (.sym src32-An-indirect-indirect- xmode))
2698 ; (comment (.str "m32c An indirect indirect destination " xmode))
2699 ; (attrs (machine 32))
2700 ; (mode xmode)
2701 ; (args (Src32AnPrefixed))
2702 ; (syntax (.str "[[$Src32AnPrefixed]]"))
2703 ; (base-ifield f-9-11)
2704 ; (encoding (+ (f-9-3 0) (f-18-1 0) Src32AnPrefixed))
2705 ; (ifield-assertion (andif (eq f-9-3 0) (eq f-18-1 0)))
2706 ; (getter (mem32 xmode (indirect-addr Src32AnPrefixed)))
2707 ; (setter (set (mem32 xmode (indirect-addr Src32AnPrefixed)) newval))
2708 ; )
2709 ; )
2710
2711 ; (src-An-indirect-indirect-operand QI)
2712 ; (src-An-indirect-indirect-operand HI)
2713 ; (src-An-indirect-indirect-operand SI)
2714
2715 ;-------------------------------------------------------------
2716 ; Relative indirect
2717 ;-------------------------------------------------------------
2718
2719 (define-pmacro (src-relative-indirect-operand xmode)
2720 (begin
2721 ; (define-derived-operand
2722 ; (name (.sym src32-24-8-SB-relative-indirect- xmode))
2723 ; (comment (.str "m32c dsp:8[sb] relative source " xmode))
2724 ; (attrs (machine 32))
2725 ; (mode xmode)
2726 ; (args (Dsp-24-u8))
2727 ; (syntax "[${Dsp-24-u8}[sb]]")
2728 ; (base-ifield f-9-11)
2729 ; (encoding (+ (f-9-3 1) (f-18-2 2) Dsp-24-u8))
2730 ; (ifield-assertion (andif (eq f-9-3 1) (eq f-18-2 2)))
2731 ; (getter (mem32 xmode (indirect-addr (add Dsp-24-u8 (reg h-sb)))))
2732 ; (setter (set (mem32 xmode (indirect-addr (add Dsp-24-u8 (reg h-sb)))) newval))
2733 ; )
2734 ; (define-derived-operand
2735 ; (name (.sym src32-24-16-SB-relative-indirect- xmode))
2736 ; (comment (.str "m32c dsp:16[sb] relative source " xmode))
2737 ; (attrs (machine 32))
2738 ; (mode xmode)
2739 ; (args (Dsp-24-u16))
2740 ; (syntax "[${Dsp-24-u16}[sb]]")
2741 ; (base-ifield f-9-11)
2742 ; (encoding (+ (f-9-3 2) (f-18-2 2) Dsp-24-u16))
2743 ; (ifield-assertion (andif (eq f-9-3 2) (eq f-18-2 2)))
2744 ; (getter (mem32 xmode (indirect-addr (add Dsp-24-u16 (reg h-sb)))))
2745 ; (setter (set (mem32 xmode (indirect-addr (add Dsp-24-u16 (reg h-sb)))) newval))
2746 ; )
2747 ; (define-derived-operand
2748 ; (name (.sym src32-24-8-FB-relative-indirect- xmode))
2749 ; (comment (.str "m32c dsp:8[fb] relative source " xmode))
2750 ; (attrs (machine 32))
2751 ; (mode xmode)
2752 ; (args (Dsp-24-s8))
2753 ; (syntax "[${Dsp-24-s8}[fb]]")
2754 ; (base-ifield f-9-11)
2755 ; (encoding (+ (f-9-3 1) (f-18-2 3) Dsp-24-s8))
2756 ; (ifield-assertion (andif (eq f-9-3 1) (eq f-18-2 3)))
2757 ; (getter (mem32 xmode (indirect-addr (add Dsp-24-s8 (reg h-fb)))))
2758 ; (setter (set (mem32 xmode (indirect-addr (add Dsp-24-s8 (reg h-fb)))) newval))
2759 ; )
2760 ; (define-derived-operand
2761 ; (name (.sym src32-24-16-FB-relative-indirect- xmode))
2762 ; (comment (.str "m32c dsp:16[fb] relative source " xmode))
2763 ; (attrs (machine 32))
2764 ; (mode xmode)
2765 ; (args (Dsp-24-s16))
2766 ; (syntax "[${Dsp-24-s16}[fb]]")
2767 ; (base-ifield f-9-11)
2768 ; (encoding (+ (f-9-3 2) (f-18-2 3) Dsp-24-s16))
2769 ; (ifield-assertion (andif (eq f-9-3 2) (eq f-18-2 3)))
2770 ; (getter (mem32 xmode (indirect-addr (add Dsp-24-s16 (reg h-fb)))))
2771 ; (setter (set (mem32 xmode (indirect-addr (add Dsp-24-s16 (reg h-fb)))) newval))
2772 ; )
2773 ; (define-derived-operand
2774 ; (name (.sym src32-24-8-An-relative-indirect- xmode))
2775 ; (comment (.str "m32c dsp:8[An] relative indirect source " xmode))
2776 ; (attrs (machine 32))
2777 ; (mode xmode)
2778 ; (args (Src32AnPrefixed Dsp-24-u8))
2779 ; (syntax "[${Dsp-24-u8}[$Src32AnPrefixed]]")
2780 ; (base-ifield f-9-11)
2781 ; (encoding (+ (f-9-3 1) (f-18-1 0) Dsp-24-u8 Src32AnPrefixed))
2782 ; (ifield-assertion (andif (eq f-9-3 1) (eq f-18-1 0)))
2783 ; (getter (mem32 xmode (indirect-addr (add Dsp-24-u8 Src32AnPrefixed))))
2784 ; (setter (set (mem32 xmode (indirect-addr (add Dsp-24-u8 Src32AnPrefixed))) newval))
2785 ; )
2786 ; (define-derived-operand
2787 ; (name (.sym src32-24-16-An-relative-indirect- xmode))
2788 ; (comment (.str "m32c dsp:16[An] relative source " xmode))
2789 ; (attrs (machine 32))
2790 ; (mode xmode)
2791 ; (args (Src32AnPrefixed Dsp-24-u16))
2792 ; (syntax "[${Dsp-24-u16}[$Src32AnPrefixed]]")
2793 ; (base-ifield f-9-11)
2794 ; (encoding (+ (f-9-3 2) (f-18-1 0) Dsp-24-u16 Src32AnPrefixed))
2795 ; (ifield-assertion (andif (eq f-9-3 2) (eq f-18-1 0)))
2796 ; (getter (mem32 xmode (indirect-addr (add Dsp-24-u16 Src32AnPrefixed))))
2797 ; (setter (set (mem32 xmode (indirect-addr (add Dsp-24-u16 Src32AnPrefixed))) newval))
2798 ; )
2799 ; (define-derived-operand
2800 ; (name (.sym src32-24-24-An-relative-indirect- xmode))
2801 ; (comment (.str "m32c dsp:24[An] relative source " xmode))
2802 ; (attrs (machine 32))
2803 ; (mode xmode)
2804 ; (args (Src32AnPrefixed Dsp-24-u24))
2805 ; (syntax "[${Dsp-24-u24}[$Src32AnPrefixed]]")
2806 ; (base-ifield f-9-11)
2807 ; (encoding (+ (f-9-3 3) (f-18-1 0) Dsp-24-u24 Src32AnPrefixed))
2808 ; (ifield-assertion (andif (eq f-9-3 3) (eq f-18-1 0)))
2809 ; (getter (mem32 xmode (indirect-addr (add Dsp-24-u24 Src32AnPrefixed))))
2810 ; (setter (set (mem32 xmode (indirect-addr (add Dsp-24-u24 Src32AnPrefixed))) newval))
2811 ; )
2812 )
2813 )
2814
2815 ; (src-relative-indirect-operand QI)
2816 ; (src-relative-indirect-operand HI)
2817 ; (src-relative-indirect-operand SI)
2818
2819 ;-------------------------------------------------------------
2820 ; Absolute Indirect address
2821 ;-------------------------------------------------------------
2822
2823 (define-pmacro (src32-absolute-indirect offset base1 base2 xmode)
2824 (begin
2825 ; (define-derived-operand
2826 ; (name (.sym src32- offset -16-absolute-indirect-derived- xmode))
2827 ; (comment (.str "m32c absolute indirect address " xmode))
2828 ; (attrs (machine 32))
2829 ; (mode xmode)
2830 ; (args ((.sym Dsp- offset -u16)))
2831 ; (syntax (.str "[${Dsp-" offset "-u16}]"))
2832 ; (base-ifield (.sym f- base1 -11))
2833 ; (encoding (+ ((.sym f- base1 -3) 3) ((.sym f- base2 -2) 3) (.sym Dsp- offset -u16)))
2834 ; (ifield-assertion (andif (eq (.sym f- base1 -3) 3) (eq (.sym f- base2 -2) 3)))
2835 ; (getter (mem32 xmode (indirect-addr (.sym Dsp- offset -u16))))
2836 ; (setter (set (mem32 xmode (indirect-addr (.sym Dsp- offset -u16))) newval))
2837 ; )
2838 ; (define-derived-operand
2839 ; (name (.sym src32- offset -24-absolute-indirect-derived- xmode))
2840 ; (comment (.str "m32c absolute indirect address " xmode))
2841 ; (attrs (machine 32))
2842 ; (mode xmode)
2843 ; (args ((.sym Dsp- offset -u24)))
2844 ; (syntax (.str "[${Dsp-" offset "-u24}]"))
2845 ; (base-ifield (.sym f- base1 -11))
2846 ; (encoding (+ ((.sym f- base1 -3) 3) ((.sym f- base2 -2) 2) (.sym Dsp- offset -u24)))
2847 ; (ifield-assertion (andif (eq (.sym f- base1 -3) 3) (eq (.sym f- base2 -2) 2)))
2848 ; (getter (mem32 xmode (indirect-addr (.sym Dsp- offset -u24))))
2849 ; (setter (set (mem32 xmode (indirect-addr (.sym Dsp- offset -u24))) newval))
2850 ; )
2851 )
2852 )
2853
2854 (src32-absolute-indirect 24 9 18 QI)
2855 (src32-absolute-indirect 24 9 18 HI)
2856 (src32-absolute-indirect 24 9 18 SI)
2857
2858 ;-------------------------------------------------------------
2859 ; Register relative source operands for short format insns
2860 ;-------------------------------------------------------------
2861
2862 (define-pmacro (src-2-S-operands mach xmode base opc1 opc2 opc3)
2863 (begin
2864 (define-derived-operand
2865 (name (.sym src mach -2-S-8-SB-relative- xmode))
2866 (comment (.str "m" mach "c SB relative address"))
2867 (attrs (machine mach))
2868 (mode xmode)
2869 (args (Dsp-8-u8))
2870 (syntax "${Dsp-8-u8}[sb]")
2871 (base-ifield (.sym f- base -2))
2872 (encoding (+ ((.sym f- base -2) opc1) Dsp-8-u8))
2873 (ifield-assertion (eq (.sym f- base -2) opc1))
2874 (getter (c-call xmode (.str "operand_getter_" xmode) sb Dsp-8-u8))
2875 (setter (c-call DFLT (.str "operand_setter_" xmode) newval sb Dsp-8-u8))
2876 ; (getter (mem-mach mach xmode (indirect-addr (add (reg h-sb) Dsp-8-u8))))
2877 ; (setter (set (mem-mach mach xmode (indirect-addr (add (reg h-sb) Dsp-8-u8))) newval))
2878 )
2879 (define-derived-operand
2880 (name (.sym src mach -2-S-8-FB-relative- xmode))
2881 (comment (.str "m" mach "c FB relative address"))
2882 (attrs (machine mach))
2883 (mode xmode)
2884 (args (Dsp-8-s8))
2885 (syntax "${Dsp-8-s8}[fb]")
2886 (base-ifield (.sym f- base -2))
2887 (encoding (+ ((.sym f- base -2) opc2) Dsp-8-s8))
2888 (ifield-assertion (eq (.sym f- base -2) opc2))
2889 (getter (c-call xmode (.str "operand_getter_" xmode) fb Dsp-8-s8))
2890 (setter (c-call DFLT (.str "operand_setter_" xmode) newval fb Dsp-8-s8))
2891 ; (getter (mem-mach mach xmode (indirect-addr (add (reg h-fb) Dsp-8-s8))))
2892 ; (setter (set (mem-mach mach xmode (indirect-addr (add (reg h-fb) Dsp-8-s8))) newval))
2893 )
2894 (define-derived-operand
2895 (name (.sym src mach -2-S-16-absolute- xmode))
2896 (comment (.str "m" mach "c absolute address"))
2897 (attrs (machine mach))
2898 (mode xmode)
2899 (args (Dsp-8-u16))
2900 (syntax "${Dsp-8-u16}")
2901 (base-ifield (.sym f- base -2))
2902 (encoding (+ ((.sym f- base -2) opc3) Dsp-8-u16))
2903 (ifield-assertion (eq (.sym f- base -2) opc3))
2904 (getter (c-call xmode (.str "operand_getter_" xmode) (const 0) Dsp-8-u16))
2905 (setter (c-call DFLT (.str "operand_setter_" xmode) newval (const 0) Dsp-8-u16))
2906 ; (getter (mem-mach mach xmode Dsp-8-u16))
2907 ; (setter (set (mem-mach mach xmode Dsp-8-u16) newval))
2908 )
2909 )
2910 )
2911
2912 (src-2-S-operands 16 QI 6 1 2 3)
2913 (src-2-S-operands 32 QI 2 2 3 1)
2914 (src-2-S-operands 32 HI 2 2 3 1)
2915
2916 ;=============================================================
2917 ; Derived Operands
2918 ;-------------------------------------------------------------
2919 ; Destination
2920 ;-------------------------------------------------------------
2921 ; Rn direct
2922 ;-------------------------------------------------------------
2923
2924 (define-pmacro (dst16-Rn-direct-operand xmode)
2925 (begin
2926 (define-derived-operand
2927 (name (.sym dst16-Rn-direct- xmode))
2928 (comment (.str "m16c Rn direct destination " xmode))
2929 (attrs (machine 16))
2930 (mode xmode)
2931 (args ((.sym Dst16Rn xmode)))
2932 (syntax (.str "$Dst16Rn" xmode))
2933 (base-ifield f-12-4)
2934 (encoding (+ (f-12-2 0) (.sym Dst16Rn xmode)))
2935 (ifield-assertion (eq f-12-2 0))
2936 (getter (trunc xmode (.sym Dst16Rn xmode)))
2937 (setter (set (.sym Dst16Rn xmode) newval))
2938 )
2939 )
2940 )
2941
2942 (dst16-Rn-direct-operand QI)
2943 (dst16-Rn-direct-operand HI)
2944 (dst16-Rn-direct-operand SI)
2945
2946 (define-derived-operand
2947 (name dst16-Rn-direct-Ext-QI)
2948 (comment "m16c Rn direct destination QI")
2949 (attrs (machine 16))
2950 (mode HI)
2951 (args (Dst16RnExtQI))
2952 (syntax "$Dst16RnExtQI")
2953 (base-ifield f-12-4)
2954 (encoding (+ (f-12-2 0) Dst16RnExtQI (f-15-1 0)))
2955 (ifield-assertion (andif (eq f-12-2 0) (eq f-15-1 0)))
2956 (getter (trunc QI (.sym Dst16RnExtQI)))
2957 (setter (set Dst16RnExtQI newval))
2958 )
2959
2960 (define-pmacro (dst32-Rn-direct-operand group base xmode)
2961 (begin
2962 (define-derived-operand
2963 (name (.sym dst32-Rn-direct- group - xmode))
2964 (comment (.str "m32c Rn direct destination " xmode))
2965 (attrs (machine 32))
2966 (mode xmode)
2967 (args ((.sym Dst32Rn group xmode)))
2968 (syntax (.str "$Dst32Rn" group xmode))
2969 (base-ifield (.sym f- base -6))
2970 (encoding (+ ((.sym f- base -3) 4) (.sym Dst32Rn group xmode)))
2971 (ifield-assertion (eq (.sym f- base -3) 4))
2972 (getter (trunc xmode (.sym Dst32Rn group xmode)))
2973 (setter (set (.sym Dst32Rn group xmode) newval))
2974 )
2975 )
2976 )
2977
2978 (dst32-Rn-direct-operand Unprefixed 4 QI)
2979 (dst32-Rn-direct-operand Prefixed 12 QI)
2980 (dst32-Rn-direct-operand Unprefixed 4 HI)
2981 (dst32-Rn-direct-operand Prefixed 12 HI)
2982 (dst32-Rn-direct-operand Unprefixed 4 SI)
2983 (dst32-Rn-direct-operand Prefixed 12 SI)
2984
2985 (define-pmacro (dst32-Rn-direct-Ext-operand group base1 base2 smode dmode)
2986 (begin
2987 (define-derived-operand
2988 (name (.sym dst32-Rn-direct- group - smode))
2989 (comment (.str "m32c Rn direct destination " smode))
2990 (attrs (machine 32))
2991 (mode dmode)
2992 (args ((.sym Dst32Rn group smode)))
2993 (syntax (.str "$Dst32Rn" group smode))
2994 (base-ifield (.sym f- base1 -6))
2995 (encoding (+ ((.sym f- base1 -3) 4) ((.sym f- base2 -1) 1) (.sym Dst32Rn group smode)))
2996 (ifield-assertion (andif (eq (.sym f- base1 -3) 4) (eq (.sym f- base2 -1) 1)))
2997 (getter (trunc smode (.sym Dst32Rn group smode)))
2998 (setter (set (.sym Dst32Rn group smode) newval))
2999 )
3000 )
3001 )
3002
3003 (dst32-Rn-direct-Ext-operand ExtUnprefixed 4 8 QI HI)
3004 (dst32-Rn-direct-Ext-operand ExtUnprefixed 4 8 HI SI)
3005
3006 (define-derived-operand
3007 (name dst32-R3-direct-Unprefixed-HI)
3008 (comment "m32c R3 direct HI")
3009 (attrs (machine 32))
3010 (mode HI)
3011 (args (R3))
3012 (syntax "$R3")
3013 (base-ifield f-4-6)
3014 (encoding (+ (f-4-3 4) (f-8-2 #x1)))
3015 (ifield-assertion (andif (eq f-4-3 4) (eq f-8-2 #x1)))
3016 (getter (trunc HI R3))
3017 (setter (set R3 newval))
3018 )
3019 ;-------------------------------------------------------------
3020 ; An direct
3021 ;-------------------------------------------------------------
3022
3023 (define-pmacro (dst16-An-direct-operand xmode)
3024 (begin
3025 (define-derived-operand
3026 (name (.sym dst16-An-direct- xmode))
3027 (comment (.str "m16c An direct destination " xmode))
3028 (attrs (machine 16))
3029 (mode xmode)
3030 (args ((.sym Dst16An xmode)))
3031 (syntax (.str "$Dst16An" xmode))
3032 (base-ifield f-12-4)
3033 (encoding (+ (f-12-2 1) (f-14-1 0) (.sym Dst16An xmode)))
3034 (ifield-assertion (andif (eq f-12-2 1) (eq f-14-1 0)))
3035 (getter (trunc xmode (.sym Dst16An xmode)))
3036 (setter (set (.sym Dst16An xmode) newval))
3037 )
3038 )
3039 )
3040
3041 (dst16-An-direct-operand QI)
3042 (dst16-An-direct-operand HI)
3043 (dst16-An-direct-operand SI)
3044
3045 (define-pmacro (dst32-An-direct-operand group base1 base2 xmode)
3046 (begin
3047 (define-derived-operand
3048 (name (.sym dst32-An-direct- group - xmode))
3049 (comment (.str "m32c An direct destination " xmode))
3050 (attrs (machine 32))
3051 (mode xmode)
3052 (args ((.sym Dst32An group xmode)))
3053 (syntax (.str "$Dst32An" group xmode))
3054 (base-ifield (.sym f- base1 -6))
3055 (encoding (+ ((.sym f- base1 -3) 0) ((.sym f- base2 -1) 1) (.sym Dst32An group xmode)))
3056 (ifield-assertion (andif (eq (.sym f- base1 -3) 0) (eq (.sym f- base2 -1) 1)))
3057 (getter (trunc xmode (.sym Dst32An group xmode)))
3058 (setter (set (.sym Dst32An group xmode) newval))
3059 )
3060 )
3061 )
3062
3063 (dst32-An-direct-operand Unprefixed 4 8 QI)
3064 (dst32-An-direct-operand Prefixed 12 16 QI)
3065 (dst32-An-direct-operand Unprefixed 4 8 HI)
3066 (dst32-An-direct-operand Prefixed 12 16 HI)
3067 (dst32-An-direct-operand Unprefixed 4 8 SI)
3068 (dst32-An-direct-operand Prefixed 12 16 SI)
3069
3070 ;-------------------------------------------------------------
3071 ; An indirect
3072 ;-------------------------------------------------------------
3073
3074 (define-pmacro (dst16-An-indirect-operand xmode)
3075 (begin
3076 (define-derived-operand
3077 (name (.sym dst16-An-indirect- xmode))
3078 (comment (.str "m16c An indirect destination " xmode))
3079 (attrs (machine 16))
3080 (mode xmode)
3081 (args (Dst16An))
3082 (syntax "[$Dst16An]")
3083 (base-ifield f-12-4)
3084 (encoding (+ (f-12-2 1) (f-14-1 1) Dst16An))
3085 (ifield-assertion (andif (eq f-12-2 1) (eq f-14-1 1)))
3086 (getter (mem16 xmode Dst16An))
3087 (setter (set (mem16 xmode Dst16An) newval))
3088 )
3089 )
3090 )
3091
3092 (dst16-An-indirect-operand QI)
3093 (dst16-An-indirect-operand HI)
3094 (dst16-An-indirect-operand SI)
3095
3096 (define-derived-operand
3097 (name dst16-An-indirect-Ext-QI)
3098 (comment "m16c An indirect destination QI")
3099 (attrs (machine 16))
3100 (mode HI)
3101 (args (Dst16An))
3102 (syntax "[$Dst16An]")
3103 (base-ifield f-12-4)
3104 (encoding (+ (f-12-2 1) (f-14-1 1) Dst16An))
3105 (ifield-assertion (andif (eq f-12-2 1) (eq f-14-1 1)))
3106 (getter (mem16 QI Dst16An))
3107 (setter (set (mem16 HI Dst16An) newval))
3108 )
3109
3110 (define-pmacro (dst32-An-indirect-operand group base1 base2 smode dmode)
3111 (begin
3112 (define-derived-operand
3113 (name (.sym dst32-An-indirect- group - smode))
3114 (comment (.str "m32c An indirect destination " smode))
3115 (attrs (machine 32))
3116 (mode dmode)
3117 (args ((.sym Dst32An group)))
3118 (syntax (.str "[$Dst32An" group "]"))
3119 (base-ifield (.sym f- base1 -6))
3120 (encoding (+ ((.sym f- base1 -3) 0) ((.sym f- base2 -1) 0) (.sym Dst32An group)))
3121 (ifield-assertion (andif (eq (.sym f- base1 -3) 0) (eq (.sym f- base2 -1) 0)))
3122 (getter (c-call dmode (.str "operand_getter_" dmode) (.sym Dst32An group)
3123 (const 0)))
3124 (setter (c-call DFLT (.str "operand_setter_" dmode) newval
3125 (.sym Dst32An group) (const 0)))
3126 ; (getter (mem32 smode (.sym Dst32An group)))
3127 ; (setter (set (mem32 dmode (.sym Dst32An group)) newval))
3128 )
3129 )
3130 )
3131
3132 (dst32-An-indirect-operand Unprefixed 4 8 QI QI)
3133 (dst32-An-indirect-operand Prefixed 12 16 QI QI)
3134 (dst32-An-indirect-operand Unprefixed 4 8 HI HI)
3135 (dst32-An-indirect-operand Prefixed 12 16 HI HI)
3136 (dst32-An-indirect-operand Unprefixed 4 8 SI SI)
3137 (dst32-An-indirect-operand Prefixed 12 16 SI SI)
3138 (dst32-An-indirect-operand ExtUnprefixed 4 8 QI HI)
3139 (dst32-An-indirect-operand ExtUnprefixed 4 8 HI SI)
3140
3141 ;-------------------------------------------------------------
3142 ; dsp:d[r] relative
3143 ;-------------------------------------------------------------
3144
3145 (define-pmacro (dst16-relative-operand offset xmode)
3146 (begin
3147 (define-derived-operand
3148 (name (.sym dst16- offset -8-SB-relative- xmode))
3149 (comment (.str "m16c dsp:8[sb] relative destination " xmode))
3150 (attrs (machine 16))
3151 (mode xmode)
3152 (args ((.sym Dsp- offset -u8)))
3153 (syntax (.str "${Dsp-" offset "-u8}[sb]"))
3154 (base-ifield f-12-4)
3155 (encoding (+ (f-12-4 #xA) (.sym Dsp- offset -u8)))
3156 (ifield-assertion (eq f-12-4 #xA))
3157 (getter (mem16 xmode (add (.sym Dsp- offset -u8) (reg h-sb))))
3158 (setter (set (mem16 xmode (add (.sym Dsp- offset -u8) (reg h-sb))) newval))
3159 )
3160 (define-derived-operand
3161 (name (.sym dst16- offset -16-SB-relative- xmode))
3162 (comment (.str "m16c dsp:16[sb] relative destination " xmode))
3163 (attrs (machine 16))
3164 (mode xmode)
3165 (args ((.sym Dsp- offset -u16)))
3166 (syntax (.str "${Dsp-" offset "-u16}[sb]"))
3167 (base-ifield f-12-4)
3168 (encoding (+ (f-12-4 #xE) (.sym Dsp- offset -u16)))
3169 (ifield-assertion (eq f-12-4 #xE))
3170 (getter (mem16 xmode (add (.sym Dsp- offset -u16) (reg h-sb))))
3171 (setter (set (mem16 xmode (add (.sym Dsp- offset -u16) (reg h-sb))) newval))
3172 )
3173 (define-derived-operand
3174 (name (.sym dst16- offset -8-FB-relative- xmode))
3175 (comment (.str "m16c dsp:8[fb] relative destination " xmode))
3176 (attrs (machine 16))
3177 (mode xmode)
3178 (args ((.sym Dsp- offset -s8)))
3179 (syntax (.str "${Dsp-" offset "-s8}[fb]"))
3180 (base-ifield f-12-4)
3181 (encoding (+ (f-12-4 #xB) (.sym Dsp- offset -s8)))
3182 (ifield-assertion (eq f-12-4 #xB))
3183 (getter (mem16 xmode (add (.sym Dsp- offset -s8) (reg h-fb))))
3184 (setter (set (mem16 xmode (add (.sym Dsp- offset -s8) (reg h-fb))) newval))
3185 )
3186 (define-derived-operand
3187 (name (.sym dst16- offset -8-An-relative- xmode))
3188 (comment (.str "m16c dsp:8[An] relative destination " xmode))
3189 (attrs (machine 16))
3190 (mode xmode)
3191 (args (Dst16An (.sym Dsp- offset -u8)))
3192 (syntax (.str "${Dsp-" offset "-u8}[$Dst16An]"))
3193 (base-ifield f-12-4)
3194 (encoding (+ (f-12-2 2) (f-14-1 0) (.sym Dsp- offset -u8) Dst16An))
3195 (ifield-assertion (andif (eq f-12-2 2) (eq f-14-1 0)))
3196 (getter (mem16 xmode (add (.sym Dsp- offset -u8) Dst16An)))
3197 (setter (set (mem16 xmode (add (.sym Dsp- offset -u8) Dst16An)) newval))
3198 )
3199 (define-derived-operand
3200 (name (.sym dst16- offset -16-An-relative- xmode))
3201 (comment (.str "m16c dsp:16[An] relative destination " xmode))
3202 (attrs (machine 16))
3203 (mode xmode)
3204 (args (Dst16An (.sym Dsp- offset -u16)))
3205 (syntax (.str "${Dsp-" offset "-u16}[$Dst16An]"))
3206 (base-ifield f-12-4)
3207 (encoding (+ (f-12-2 3) (f-14-1 0) (.sym Dsp- offset -u16) Dst16An))
3208 (ifield-assertion (andif (eq f-12-2 3) (eq f-14-1 0)))
3209 (getter (mem16 xmode (add (.sym Dsp- offset -u16) Dst16An)))
3210 (setter (set (mem16 xmode (add (.sym Dsp- offset -u16) Dst16An)) newval))
3211 )
3212 (define-derived-operand
3213 (name (.sym dst16- offset -20-An-relative- xmode))
3214 (comment (.str "m16c dsp:20[An] relative destination " xmode))
3215 (attrs (machine 16))
3216 (mode xmode)
3217 (args (Dst16An (.sym Dsp- offset -u20)))
3218 (syntax (.str "${Dsp-" offset "-u20}[$Dst16An]"))
3219 (base-ifield f-12-4)
3220 (encoding (+ (f-12-2 3) (f-14-1 0) (.sym Dsp- offset -u20) Dst16An))
3221 (ifield-assertion (andif (eq f-12-2 3) (eq f-14-1 0)))
3222 (getter (mem16 xmode (add (.sym Dsp- offset -u20) Dst16An)))
3223 (setter (set (mem16 xmode (add (.sym Dsp- offset -u20) Dst16An)) newval))
3224 )
3225 )
3226 )
3227
3228 (dst16-relative-operand 16 QI)
3229 (dst16-relative-operand 24 QI)
3230 (dst16-relative-operand 32 QI)
3231 (dst16-relative-operand 40 QI)
3232 (dst16-relative-operand 48 QI)
3233 (dst16-relative-operand 16 HI)
3234 (dst16-relative-operand 24 HI)
3235 (dst16-relative-operand 32 HI)
3236 (dst16-relative-operand 40 HI)
3237 (dst16-relative-operand 48 HI)
3238 (dst16-relative-operand 16 SI)
3239 (dst16-relative-operand 24 SI)
3240 (dst16-relative-operand 32 SI)
3241 (dst16-relative-operand 40 SI)
3242 (dst16-relative-operand 48 SI)
3243
3244 (define-pmacro (dst16-relative-Ext-operand offset smode dmode)
3245 (begin
3246 (define-derived-operand
3247 (name (.sym dst16- offset -8-SB-relative-Ext- smode))
3248 (comment (.str "m16c dsp:8[sb] relative destination " smode))
3249 (attrs (machine 16))
3250 (mode dmode)
3251 (args ((.sym Dsp- offset -u8)))
3252 (syntax (.str "${Dsp-" offset "-u8}[sb]"))
3253 (base-ifield f-12-4)
3254 (encoding (+ (f-12-4 #xA) (.sym Dsp- offset -u8)))
3255 (ifield-assertion (eq f-12-4 #xA))
3256 (getter (mem16 smode (add (.sym Dsp- offset -u8) (reg h-sb))))
3257 (setter (set (mem16 dmode (add (.sym Dsp- offset -u8) (reg h-sb))) newval))
3258 )
3259 (define-derived-operand
3260 (name (.sym dst16- offset -16-SB-relative-Ext- smode))
3261 (comment (.str "m16c dsp:16[sb] relative destination " smode))
3262 (attrs (machine 16))
3263 (mode dmode)
3264 (args ((.sym Dsp- offset -u16)))
3265 (syntax (.str "${Dsp-" offset "-u16}[sb]"))
3266 (base-ifield f-12-4)
3267 (encoding (+ (f-12-4 #xE) (.sym Dsp- offset -u16)))
3268 (ifield-assertion (eq f-12-4 #xE))
3269 (getter (mem16 smode (add (.sym Dsp- offset -u16) (reg h-sb))))
3270 (setter (set (mem16 dmode (add (.sym Dsp- offset -u16) (reg h-sb))) newval))
3271 )
3272 (define-derived-operand
3273 (name (.sym dst16- offset -8-FB-relative-Ext- smode))
3274 (comment (.str "m16c dsp:8[fb] relative destination " smode))
3275 (attrs (machine 16))
3276 (mode dmode)
3277 (args ((.sym Dsp- offset -s8)))
3278 (syntax (.str "${Dsp-" offset "-s8}[fb]"))
3279 (base-ifield f-12-4)
3280 (encoding (+ (f-12-4 #xB) (.sym Dsp- offset -s8)))
3281 (ifield-assertion (eq f-12-4 #xB))
3282 (getter (mem16 smode (add (.sym Dsp- offset -s8) (reg h-fb))))
3283 (setter (set (mem16 dmode (add (.sym Dsp- offset -s8) (reg h-fb))) newval))
3284 )
3285 (define-derived-operand
3286 (name (.sym dst16- offset -8-An-relative-Ext- smode))
3287 (comment (.str "m16c dsp:8[An] relative destination " smode))
3288 (attrs (machine 16))
3289 (mode dmode)
3290 (args (Dst16An (.sym Dsp- offset -u8)))
3291 (syntax (.str "${Dsp-" offset "-u8}[$Dst16An]"))
3292 (base-ifield f-12-4)
3293 (encoding (+ (f-12-2 2) (f-14-1 0) (.sym Dsp- offset -u8) Dst16An))
3294 (ifield-assertion (andif (eq f-12-2 2) (eq f-14-1 0)))
3295 (getter (mem16 smode (add (.sym Dsp- offset -u8) Dst16An)))
3296 (setter (set (mem16 dmode (add (.sym Dsp- offset -u8) Dst16An)) newval))
3297 )
3298 (define-derived-operand
3299 (name (.sym dst16- offset -16-An-relative-Ext- smode))
3300 (comment (.str "m16c dsp:16[An] relative destination " smode))
3301 (attrs (machine 16))
3302 (mode dmode)
3303 (args (Dst16An (.sym Dsp- offset -u16)))
3304 (syntax (.str "${Dsp-" offset "-u16}[$Dst16An]"))
3305 (base-ifield f-12-4)
3306 (encoding (+ (f-12-2 3) (f-14-1 0) (.sym Dsp- offset -u16) Dst16An))
3307 (ifield-assertion (andif (eq f-12-2 3) (eq f-14-1 0)))
3308 (getter (mem16 smode (add (.sym Dsp- offset -u16) Dst16An)))
3309 (setter (set (mem16 dmode (add (.sym Dsp- offset -u16) Dst16An)) newval))
3310 )
3311 )
3312 )
3313
3314 (dst16-relative-Ext-operand 16 QI HI)
3315
3316 (define-pmacro (dst32-relative-operand offset group base1 base2 smode dmode)
3317 (begin
3318 (define-derived-operand
3319 (name (.sym dst32- offset -8-SB-relative- group - smode))
3320 (comment (.str "m32c dsp:8[sb] relative destination " smode))
3321 (attrs (machine 32))
3322 (mode dmode)
3323 (args ((.sym Dsp- offset -u8)))
3324 (syntax (.str "${Dsp-" offset "-u8}[sb]"))
3325 (base-ifield (.sym f- base1 -6))
3326 (encoding (+ ((.sym f- base1 -3) 1) ((.sym f- base2 -2) 2) (.sym Dsp- offset -u8)))
3327 (ifield-assertion (andif (eq (.sym f- base1 -3) 1) (eq (.sym f- base2 -2) 2)))
3328 (getter (c-call dmode (.str "operand_getter_" dmode) sb (.sym Dsp- offset -u8)))
3329 (setter (c-call DFLT (.str "operand_setter_" dmode) newval sb (.sym Dsp- offset -u8)))
3330 ; (getter (mem32 smode (add (.sym Dsp- offset -u8) (reg h-sb))))
3331 ; (setter (set (mem32 dmode (add (.sym Dsp- offset -u8) (reg h-sb))) newval))
3332 )
3333 (define-derived-operand
3334 (name (.sym dst32- offset -16-SB-relative- group - smode))
3335 (comment (.str "m32c dsp:16[sb] relative destination " smode))
3336 (attrs (machine 32))
3337 (mode dmode)
3338 (args ((.sym Dsp- offset -u16)))
3339 (syntax (.str "${Dsp-" offset "-u16}[sb]"))
3340 (base-ifield (.sym f- base1 -6))
3341 (encoding (+ ((.sym f- base1 -3) 2) ((.sym f- base2 -2) 2) (.sym Dsp- offset -u16)))
3342 (ifield-assertion (andif (eq (.sym f- base1 -3) 2) (eq (.sym f- base2 -2) 2)))
3343 (getter (c-call dmode (.str "operand_getter_" dmode) sb (.sym Dsp- offset -u16)))
3344 (setter (c-call DFLT (.str "operand_setter_" dmode) newval sb (.sym Dsp- offset -u16)))
3345 ; (getter (mem32 smode (add (.sym Dsp- offset -u16) (reg h-sb))))
3346 ; (setter (set (mem32 dmode (add (.sym Dsp- offset -u16) (reg h-sb))) newval))
3347 )
3348 (define-derived-operand
3349 (name (.sym dst32- offset -8-FB-relative- group - smode))
3350 (comment (.str "m32c dsp:8[fb] relative destination " smode))
3351 (attrs (machine 32))
3352 (mode dmode)
3353 (args ((.sym Dsp- offset -s8)))
3354 (syntax (.str "${Dsp-" offset "-s8}[fb]"))
3355 (base-ifield (.sym f- base1 -6))
3356 (encoding (+ ((.sym f- base1 -3) 1) ((.sym f- base2 -2) 3) (.sym Dsp- offset -s8)))
3357 (ifield-assertion (andif (eq (.sym f- base1 -3) 1) (eq (.sym f- base2 -2) 3)))
3358 (getter (c-call dmode (.str "operand_getter_" dmode) fb (.sym Dsp- offset -s8)))
3359 (setter (c-call DFLT (.str "operand_setter_" dmode) newval fb (.sym Dsp- offset -s8)))
3360 ; (getter (mem32 smode (add (.sym Dsp- offset -s8) (reg h-fb))))
3361 ; (setter (set (mem32 dmode (add (.sym Dsp- offset -s8) (reg h-fb))) newval))
3362 )
3363 (define-derived-operand
3364 (name (.sym dst32- offset -16-FB-relative- group - smode))
3365 (comment (.str "m32c dsp:16[fb] relative destination " smode))
3366 (attrs (machine 32))
3367 (mode dmode)
3368 (args ((.sym Dsp- offset -s16)))
3369 (syntax (.str "${Dsp-" offset "-s16}[fb]"))
3370 (base-ifield (.sym f- base1 -6))
3371 (encoding (+ ((.sym f- base1 -3) 2) ((.sym f- base2 -2) 3) (.sym Dsp- offset -s16)))
3372 (ifield-assertion (andif (eq (.sym f- base1 -3) 2) (eq (.sym f- base2 -2) 3)))
3373 (getter (c-call dmode (.str "operand_getter_" dmode) fb (.sym Dsp- offset -s16)))
3374 (setter (c-call DFLT (.str "operand_setter_" dmode) newval fb (.sym Dsp- offset -s16)))
3375 ; (getter (mem32 smode (add (.sym Dsp- offset -s16) (reg h-fb))))
3376 ; (setter (set (mem32 dmode (add (.sym Dsp- offset -s16) (reg h-fb))) newval))
3377 )
3378 (define-derived-operand
3379 (name (.sym dst32- offset -8-An-relative- group - smode))
3380 (comment (.str "m32c dsp:8[An] relative destination " smode))
3381 (attrs (machine 32))
3382 (mode dmode)
3383 (args ((.sym Dst32An group) (.sym Dsp- offset -u8)))
3384 (syntax (.str "${Dsp-" offset "-u8}[$Dst32An" group "]"))
3385 (base-ifield (.sym f- base1 -6))
3386 (encoding (+ ((.sym f- base1 -3) 1) ((.sym f- base2 -1) 0) (.sym Dsp- offset -u8) (.sym Dst32An group)))
3387 (ifield-assertion (andif (eq (.sym f- base1 -3) 1) (eq (.sym f- base2 -1) 0)))
3388 (getter (c-call dmode (.str "operand_getter_" dmode) (.sym Dst32An group) (.sym Dsp- offset -u8)))
3389 (setter (c-call DFLT (.str "operand_setter_" dmode) newval (.sym Dst32An group) (.sym Dsp- offset -u8)))
3390 ; (getter (mem32 smode (add (.sym Dsp- offset -u8) (.sym Dst32An group))))
3391 ; (setter (set (mem32 dmode (add (.sym Dsp- offset -u8) (.sym Dst32An group))) newval))
3392 )
3393 (define-derived-operand
3394 (name (.sym dst32- offset -16-An-relative- group - smode))
3395 (comment (.str "m32c dsp:16[An] relative destination " smode))
3396 (attrs (machine 32))
3397 (mode dmode)
3398 (args ((.sym Dst32An group) (.sym Dsp- offset -u16)))
3399 (syntax (.str "${Dsp-" offset "-u16}[$Dst32An" group "]"))
3400 (base-ifield (.sym f- base1 -6))
3401 (encoding (+ ((.sym f- base1 -3) 2) ((.sym f- base2 -1) 0) (.sym Dsp- offset -u16) (.sym Dst32An group)))
3402 (ifield-assertion (andif (eq (.sym f- base1 -3) 2) (eq (.sym f- base2 -1) 0)))
3403 (getter (c-call dmode (.str "operand_getter_" dmode) (.sym Dst32An group) (.sym Dsp- offset -u16)))
3404 (setter (c-call DFLT (.str "operand_setter_" dmode) newval (.sym Dst32An group) (.sym Dsp- offset -u16)))
3405 ; (getter (mem32 smode (add (.sym Dsp- offset -u16) (.sym Dst32An group))))
3406 ; (setter (set (mem32 dmode (add (.sym Dsp- offset -u16) (.sym Dst32An group))) newval))
3407 )
3408 (define-derived-operand
3409 (name (.sym dst32- offset -24-An-relative- group - smode))
3410 (comment (.str "m32c dsp:16[An] relative destination " smode))
3411 (attrs (machine 32))
3412 (mode dmode)
3413 (args ((.sym Dst32An group) (.sym Dsp- offset -u24)))
3414 (syntax (.str "${Dsp-" offset "-u24}[$Dst32An" group "]"))
3415 (base-ifield (.sym f- base1 -6))
3416 (encoding (+ ((.sym f- base1 -3) 3) ((.sym f- base2 -1) 0) (.sym Dsp- offset -u24) (.sym Dst32An group)))
3417 (ifield-assertion (andif (eq (.sym f- base1 -3) 3) (eq (.sym f- base2 -1) 0)))
3418 (getter (c-call dmode (.str "operand_getter_" dmode) (.sym Dst32An group) (.sym Dsp- offset -u24)))
3419 (setter (c-call DFLT (.str "operand_setter_" dmode) newval (.sym Dst32An group) (.sym Dsp- offset -u24)))
3420 ; (getter (mem32 smode (add (.sym Dsp- offset -u24) (.sym Dst32An group))))
3421 ; (setter (set (mem32 dmode (add (.sym Dsp- offset -u24) (.sym Dst32An group))) newval))
3422 )
3423 )
3424 )
3425
3426 (dst32-relative-operand 16 Unprefixed 4 8 QI QI)
3427 (dst32-relative-operand 24 Unprefixed 4 8 QI QI)
3428 (dst32-relative-operand 32 Unprefixed 4 8 QI QI)
3429 (dst32-relative-operand 40 Unprefixed 4 8 QI QI)
3430 (dst32-relative-operand 16 Unprefixed 4 8 HI HI)
3431 (dst32-relative-operand 24 Unprefixed 4 8 HI HI)
3432 (dst32-relative-operand 32 Unprefixed 4 8 HI HI)
3433 (dst32-relative-operand 40 Unprefixed 4 8 HI HI)
3434 (dst32-relative-operand 16 Unprefixed 4 8 SI SI)
3435 (dst32-relative-operand 24 Unprefixed 4 8 SI SI)
3436 (dst32-relative-operand 32 Unprefixed 4 8 SI SI)
3437 (dst32-relative-operand 40 Unprefixed 4 8 SI SI)
3438
3439 (dst32-relative-operand 24 Prefixed 12 16 QI QI)
3440 (dst32-relative-operand 32 Prefixed 12 16 QI QI)
3441 (dst32-relative-operand 40 Prefixed 12 16 QI QI)
3442 (dst32-relative-operand 48 Prefixed 12 16 QI QI)
3443 (dst32-relative-operand 24 Prefixed 12 16 HI HI)
3444 (dst32-relative-operand 32 Prefixed 12 16 HI HI)
3445 (dst32-relative-operand 40 Prefixed 12 16 HI HI)
3446 (dst32-relative-operand 48 Prefixed 12 16 HI HI)
3447 (dst32-relative-operand 24 Prefixed 12 16 SI SI)
3448 (dst32-relative-operand 32 Prefixed 12 16 SI SI)
3449 (dst32-relative-operand 40 Prefixed 12 16 SI SI)
3450 (dst32-relative-operand 48 Prefixed 12 16 SI SI)
3451
3452 (dst32-relative-operand 16 ExtUnprefixed 4 8 QI HI)
3453 (dst32-relative-operand 16 ExtUnprefixed 4 8 HI SI)
3454
3455 ;-------------------------------------------------------------
3456 ; Absolute address
3457 ;-------------------------------------------------------------
3458
3459 (define-pmacro (dst16-absolute offset xmode)
3460 (begin
3461 (define-derived-operand
3462 (name (.sym dst16- offset -16-absolute- xmode))
3463 (comment (.str "m16c absolute address " xmode))
3464 (attrs (machine 16))
3465 (mode xmode)
3466 (args ((.sym Dsp- offset -u16)))
3467 (syntax (.str "${Dsp-" offset "-u16}"))
3468 (base-ifield f-12-4)
3469 (encoding (+ (f-12-4 #xF) (.sym Dsp- offset -u16)))
3470 (ifield-assertion (eq f-12-4 #xF))
3471 (getter (mem16 xmode (.sym Dsp- offset -u16)))
3472 (setter (set (mem16 xmode (.sym Dsp- offset -u16)) newval))
3473 )
3474 )
3475 )
3476
3477 (dst16-absolute 16 QI)
3478 (dst16-absolute 24 QI)
3479 (dst16-absolute 32 QI)
3480 (dst16-absolute 40 QI)
3481 (dst16-absolute 48 QI)
3482 (dst16-absolute 16 HI)
3483 (dst16-absolute 24 HI)
3484 (dst16-absolute 32 HI)
3485 (dst16-absolute 40 HI)
3486 (dst16-absolute 48 HI)
3487 (dst16-absolute 16 SI)
3488 (dst16-absolute 24 SI)
3489 (dst16-absolute 32 SI)
3490 (dst16-absolute 40 SI)
3491 (dst16-absolute 48 SI)
3492
3493 (define-derived-operand
3494 (name dst16-16-16-absolute-Ext-QI)
3495 (comment "m16c absolute address QI")
3496 (attrs (machine 16))
3497 (mode HI)
3498 (args (Dsp-16-u16))
3499 (syntax "${Dsp-16-u16}")
3500 (base-ifield f-12-4)
3501 (encoding (+ (f-12-4 #xF) Dsp-16-u16))
3502 (ifield-assertion (eq f-12-4 #xF))
3503 (getter (mem16 QI Dsp-16-u16))
3504 (setter (set (mem16 HI Dsp-16-u16) newval))
3505 )
3506
3507 (define-pmacro (dst32-absolute offset group base1 base2 smode dmode)
3508 (begin
3509 (define-derived-operand
3510 (name (.sym dst32- offset -16-absolute- group - smode))
3511 (comment (.str "m32c absolute address " smode))
3512 (attrs (machine 32))
3513 (mode dmode)
3514 (args ((.sym Dsp- offset -u16)))
3515 (syntax (.str "${Dsp-" offset "-u16}"))
3516 (base-ifield (.sym f- base1 -6))
3517 (encoding (+ ((.sym f- base1 -3) 3) ((.sym f- base2 -2) 3) (.sym Dsp- offset -u16)))
3518 (ifield-assertion (andif (eq (.sym f- base1 -3) 3) (eq (.sym f- base2 -2) 3)))
3519 (getter (c-call smode (.str "operand_getter_" smode) (const 0) (.sym Dsp- offset -u16)))
3520 (setter (c-call DFLT (.str "operand_setter_" dmode) newval (const 0) (.sym Dsp- offset -u16)))
3521 ; (getter (mem32 smode (.sym Dsp- offset -u16)))
3522 ; (setter (set (mem32 dmode (.sym Dsp- offset -u16)) newval))
3523 )
3524 (define-derived-operand
3525 (name (.sym dst32- offset -24-absolute- group - smode))
3526 (comment (.str "m32c absolute address " smode))
3527 (attrs (machine 32))
3528 (mode dmode)
3529 (args ((.sym Dsp- offset -u24)))
3530 (syntax (.str "${Dsp-" offset "-u24}"))
3531 (base-ifield (.sym f- base1 -6))
3532 (encoding (+ ((.sym f- base1 -3) 3) ((.sym f- base2 -2) 2) (.sym Dsp- offset -u24)))
3533 (ifield-assertion (andif (eq (.sym f- base1 -3) 3) (eq (.sym f- base2 -2) 2)))
3534 (getter (c-call smode (.str "operand_getter_" smode) (const 0) (.sym Dsp- offset -u24)))
3535 (setter (c-call DFLT (.str "operand_setter_" dmode) newval (const 0) (.sym Dsp- offset -u24)))
3536 ; (getter (mem32 smode (.sym Dsp- offset -u24)))
3537 ; (setter (set (mem32 dmode (.sym Dsp- offset -u24)) newval))
3538 )
3539 )
3540 )
3541
3542 (dst32-absolute 16 Unprefixed 4 8 QI QI)
3543 (dst32-absolute 24 Unprefixed 4 8 QI QI)
3544 (dst32-absolute 32 Unprefixed 4 8 QI QI)
3545 (dst32-absolute 40 Unprefixed 4 8 QI QI)
3546 (dst32-absolute 16 Unprefixed 4 8 HI HI)
3547 (dst32-absolute 24 Unprefixed 4 8 HI HI)
3548 (dst32-absolute 32 Unprefixed 4 8 HI HI)
3549 (dst32-absolute 40 Unprefixed 4 8 HI HI)
3550 (dst32-absolute 16 Unprefixed 4 8 SI SI)
3551 (dst32-absolute 24 Unprefixed 4 8 SI SI)
3552 (dst32-absolute 32 Unprefixed 4 8 SI SI)
3553 (dst32-absolute 40 Unprefixed 4 8 SI SI)
3554
3555 (dst32-absolute 24 Prefixed 12 16 QI QI)
3556 (dst32-absolute 32 Prefixed 12 16 QI QI)
3557 (dst32-absolute 40 Prefixed 12 16 QI QI)
3558 (dst32-absolute 48 Prefixed 12 16 QI QI)
3559 (dst32-absolute 24 Prefixed 12 16 HI HI)
3560 (dst32-absolute 32 Prefixed 12 16 HI HI)
3561 (dst32-absolute 40 Prefixed 12 16 HI HI)
3562 (dst32-absolute 48 Prefixed 12 16 HI HI)
3563 (dst32-absolute 24 Prefixed 12 16 SI SI)
3564 (dst32-absolute 32 Prefixed 12 16 SI SI)
3565 (dst32-absolute 40 Prefixed 12 16 SI SI)
3566 (dst32-absolute 48 Prefixed 12 16 SI SI)
3567
3568 (dst32-absolute 16 ExtUnprefixed 4 8 QI HI)
3569 (dst32-absolute 16 ExtUnprefixed 4 8 HI SI)
3570
3571 ;-------------------------------------------------------------
3572 ; An indirect indirect
3573 ;-------------------------------------------------------------
3574
3575 ;(define-pmacro (dst-An-indirect-indirect-operand xmode)
3576 ; (define-derived-operand
3577 ; (name (.sym dst32-An-indirect-indirect- xmode))
3578 ; (comment (.str "m32c An indirect indirect destination " xmode))
3579 ; (attrs (machine 32))
3580 ; (mode xmode)
3581 ; (args (Dst32AnPrefixed))
3582 ; (syntax (.str "[[$Dst32AnPrefixed]]"))
3583 ; (base-ifield f-12-6)
3584 ; (encoding (+ (f-12-3 0) (f-16-1 0) Dst32AnPrefixed))
3585 ; (ifield-assertion (andif (eq f-12-3 0) (eq f-16-1 0)))
3586 ; (getter (mem32 xmode (indirect-addr Dst32AnPrefixed)))
3587 ; (setter (set (mem32 xmode (indirect-addr Dst32AnPrefixed)) newval))
3588 ; )
3589 ;)
3590
3591 ; (dst-An-indirect-indirect-operand QI)
3592 ; (dst-An-indirect-indirect-operand HI)
3593 ; (dst-An-indirect-indirect-operand SI)
3594
3595 ;-------------------------------------------------------------
3596 ; Relative indirect
3597 ;-------------------------------------------------------------
3598
3599 (define-pmacro (dst-relative-indirect-operand offset xmode)
3600 (begin
3601 ; (define-derived-operand
3602 ; (name (.sym dst32- offset -8-SB-relative-indirect- xmode))
3603 ; (comment (.str "m32c dsp:8[sb] relative destination " xmode))
3604 ; (attrs (machine 32))
3605 ; (mode xmode)
3606 ; (args ((.sym Dsp- offset -u8)))
3607 ; (syntax (.str "[${Dsp-" offset "-u8}[sb]]"))
3608 ; (base-ifield f-12-6)
3609 ; (encoding (+ (f-12-3 1) (f-16-2 2) (.sym Dsp- offset -u8)))
3610 ; (ifield-assertion (andif (eq f-12-3 1) (eq f-16-2 2)))
3611 ; (getter (mem32 xmode (indirect-addr (add (.sym Dsp- offset -u8) (reg h-sb)))))
3612 ; (setter (set (mem32 xmode (indirect-addr (add (.sym Dsp- offset -u8) (reg h-sb)))) newval))
3613 ; )
3614 ; (define-derived-operand
3615 ; (name (.sym dst32- offset -16-SB-relative-indirect- xmode))
3616 ; (comment (.str "m32c dsp:16[sb] relative destination " xmode))
3617 ; (attrs (machine 32))
3618 ; (mode xmode)
3619 ; (args ((.sym Dsp- offset -u16)))
3620 ; (syntax (.str "[${Dsp-" offset "-u16}[sb]]"))
3621 ; (base-ifield f-12-6)
3622 ; (encoding (+ (f-12-3 2) (f-16-2 2) (.sym Dsp- offset -u16)))
3623 ; (ifield-assertion (andif (eq f-12-3 2) (eq f-16-2 2)))
3624 ; (getter (mem32 xmode (indirect-addr (add (.sym Dsp- offset -u16) (reg h-sb)))))
3625 ; (setter (set (mem32 xmode (indirect-addr (add (.sym Dsp- offset -u16) (reg h-sb)))) newval))
3626 ; )
3627 ; (define-derived-operand
3628 ; (name (.sym dst32- offset -8-FB-relative-indirect- xmode))
3629 ; (comment (.str "m32c dsp:8[fb] relative destination " xmode))
3630 ; (attrs (machine 32))
3631 ; (mode xmode)
3632 ; (args ((.sym Dsp- offset -s8)))
3633 ; (syntax (.str "[${Dsp-" offset "-s8}[fb]]"))
3634 ; (base-ifield f-12-6)
3635 ; (encoding (+ (f-12-3 1) (f-16-2 3) (.sym Dsp- offset -s8)))
3636 ; (ifield-assertion (andif (eq f-12-3 1) (eq f-16-2 3)))
3637 ; (getter (mem32 xmode (indirect-addr (add (.sym Dsp- offset -s8) (reg h-fb)))))
3638 ; (setter (set (mem32 xmode (indirect-addr (add (.sym Dsp- offset -s8) (reg h-fb)))) newval))
3639 ; )
3640 ; (define-derived-operand
3641 ; (name (.sym dst32- offset -16-FB-relative-indirect- xmode))
3642 ; (comment (.str "m32c dsp:16[fb] relative destination " xmode))
3643 ; (attrs (machine 32))
3644 ; (mode xmode)
3645 ; (args ((.sym Dsp- offset -s16)))
3646 ; (syntax (.str "[${Dsp-" offset "-s16}[fb]]"))
3647 ; (base-ifield f-12-6)
3648 ; (encoding (+ (f-12-3 2) (f-16-2 3) (.sym Dsp- offset -s16)))
3649 ; (ifield-assertion (andif (eq f-12-3 2) (eq f-16-2 3)))
3650 ; (getter (mem32 xmode (indirect-addr (add (.sym Dsp- offset -s16) (reg h-fb)))))
3651 ; (setter (set (mem32 xmode (indirect-addr (add (.sym Dsp- offset -s16) (reg h-fb)))) newval))
3652 ; )
3653 ; (define-derived-operand
3654 ; (name (.sym dst32- offset -8-An-relative-indirect- xmode))
3655 ; (comment (.str "m32c dsp:8[An] relative indirect destination " xmode))
3656 ; (attrs (machine 32))
3657 ; (mode xmode)
3658 ; (args (Dst32AnPrefixed (.sym Dsp- offset -u8)))
3659 ; (syntax (.str "[${Dsp-" offset "-u8}[$Dst32AnPrefixed]]"))
3660 ; (base-ifield f-12-6)
3661 ; (encoding (+ (f-12-3 1) (f-16-1 0) (.sym Dsp- offset -u8) Dst32AnPrefixed))
3662 ; (ifield-assertion (andif (eq f-12-3 1) (eq f-16-1 0)))
3663 ; (getter (mem32 xmode (indirect-addr (add (.sym Dsp- offset -u8) Dst32AnPrefixed))))
3664 ; (setter (set (mem32 xmode (indirect-addr (add (.sym Dsp- offset -u8) Dst32AnPrefixed))) newval))
3665 ; )
3666 ; (define-derived-operand
3667 ; (name (.sym dst32- offset -16-An-relative-indirect- xmode))
3668 ; (comment (.str "m32c dsp:16[An] relative destination " xmode))
3669 ; (attrs (machine 32))
3670 ; (mode xmode)
3671 ; (args (Dst32AnPrefixed (.sym Dsp- offset -u16)))
3672 ; (syntax (.str "[${Dsp-" offset "-u16}[$Dst32AnPrefixed]]"))
3673 ; (base-ifield f-12-6)
3674 ; (encoding (+ (f-12-3 2) (f-16-1 0) (.sym Dsp- offset -u16) Dst32AnPrefixed))
3675 ; (ifield-assertion (andif (eq f-12-3 2) (eq f-16-1 0)))
3676 ; (getter (mem32 xmode (indirect-addr (add (.sym Dsp- offset -u16) Dst32AnPrefixed))))
3677 ; (setter (set (mem32 xmode (indirect-addr (add (.sym Dsp- offset -u16) Dst32AnPrefixed))) newval))
3678 ; )
3679 ; (define-derived-operand
3680 ; (name (.sym dst32- offset -24-An-relative-indirect- xmode))
3681 ; (comment (.str "m32c dsp:24[An] relative destination " xmode))
3682 ; (attrs (machine 32))
3683 ; (mode xmode)
3684 ; (args (Dst32AnPrefixed (.sym Dsp- offset -u24)))
3685 ; (syntax (.str "[${Dsp-" offset "-u24}[$Dst32AnPrefixed]]"))
3686 ; (base-ifield f-12-6)
3687 ; (encoding (+ (f-12-3 3) (f-16-1 0) (.sym Dsp- offset -u24) Dst32AnPrefixed))
3688 ; (ifield-assertion (andif (eq f-12-3 3) (eq f-16-1 0)))
3689 ; (getter (mem32 xmode (indirect-addr (add (.sym Dsp- offset -u24) Dst32AnPrefixed))))
3690 ; (setter (set (mem32 xmode (indirect-addr (add (.sym Dsp- offset -u24) Dst32AnPrefixed))) newval))
3691 ; )
3692 )
3693 )
3694
3695 ; (dst-relative-indirect-operand 24 QI)
3696 ; (dst-relative-indirect-operand 32 QI)
3697 ; (dst-relative-indirect-operand 40 QI)
3698 ; (dst-relative-indirect-operand 48 QI)
3699 ; (dst-relative-indirect-operand 24 HI)
3700 ; (dst-relative-indirect-operand 32 HI)
3701 ; (dst-relative-indirect-operand 40 HI)
3702 ; (dst-relative-indirect-operand 48 HI)
3703 ; (dst-relative-indirect-operand 24 SI)
3704 ; (dst-relative-indirect-operand 32 SI)
3705 ; (dst-relative-indirect-operand 40 SI)
3706 ; (dst-relative-indirect-operand 48 SI)
3707
3708 ;-------------------------------------------------------------
3709 ; Absolute indirect
3710 ;-------------------------------------------------------------
3711
3712 (define-pmacro (dst-absolute-indirect offset xmode)
3713 (begin
3714 ; (define-derived-operand
3715 ; (name (.sym dst32- offset -16-absolute-indirect-derived- xmode))
3716 ; (comment (.str "m32c absolute indirect address " xmode))
3717 ; (attrs (machine 32))
3718 ; (mode xmode)
3719 ; (args ((.sym Dsp- offset -u16)))
3720 ; (syntax (.str "[${Dsp-" offset "-u16}]"))
3721 ; (base-ifield f-12-6)
3722 ; (encoding (+ (f-12-3 3) (f-16-2 3) (.sym Dsp- offset -u16)))
3723 ; (ifield-assertion (andif (eq f-12-3 3) (eq f-16-2 3)))
3724 ; (getter (mem32 xmode (indirect-addr (.sym Dsp- offset -u16))))
3725 ; (setter (set (mem32 xmode (indirect-addr (.sym Dsp- offset -u16))) newval))
3726 ; )
3727 ; (define-derived-operand
3728 ; (name (.sym dst32- offset -24-absolute-indirect-derived- xmode))
3729 ; (comment (.str "m32c absolute indirect address " xmode))
3730 ; (attrs (machine 32))
3731 ; (mode xmode)
3732 ; (args ((.sym Dsp- offset -u24)))
3733 ; (syntax (.str "[${Dsp-" offset "-u24}]"))
3734 ; (base-ifield f-12-6)
3735 ; (encoding (+ (f-12-3 3) (f-16-2 2) (.sym Dsp- offset -u24)))
3736 ; (ifield-assertion (andif (eq f-12-3 3) (eq f-16-2 2)))
3737 ; (getter (mem32 xmode (indirect-addr (.sym Dsp- offset -u24))))
3738 ; (setter (set (mem32 xmode (indirect-addr (.sym Dsp- offset -u24))) newval))
3739 ; )
3740 )
3741 )
3742
3743 (dst-absolute-indirect 24 QI)
3744 (dst-absolute-indirect 32 QI)
3745 (dst-absolute-indirect 40 QI)
3746 (dst-absolute-indirect 48 QI)
3747 (dst-absolute-indirect 24 HI)
3748 (dst-absolute-indirect 32 HI)
3749 (dst-absolute-indirect 40 HI)
3750 (dst-absolute-indirect 48 HI)
3751 (dst-absolute-indirect 24 SI)
3752 (dst-absolute-indirect 32 SI)
3753 (dst-absolute-indirect 40 SI)
3754 (dst-absolute-indirect 48 SI)
3755
3756 ;-------------------------------------------------------------
3757 ; Bit operands
3758 ;-------------------------------------------------------------
3759 (define-pmacro (get-register-bit reg bitno)
3760 (and (srl reg bitno) 1)
3761 )
3762
3763 (define-pmacro (set-register-bit reg bitno value)
3764 (set reg (or (and reg (inv (sll 1 bitno)))
3765 (sll (and QI value 1) bitno)))
3766 )
3767
3768 (define-pmacro (get-memory-bit mach base bitno)
3769 (and (srl (mem-mach mach QI (add base (div bitno 8)))
3770 (mod bitno 8))
3771 1)
3772 )
3773
3774 (define-pmacro (set-memory-bit mach base bitno value)
3775 (sequence ((USI addr))
3776 (set addr (add base (div bitno 8)))
3777 (set (mem-mach mach QI addr)
3778 (or (and (mem-mach mach QI addr)
3779 (inv (sll 1 (mod bitno 8))))
3780 (sll (and QI value 1) (mod bitno 8)))))
3781 )
3782
3783 ;-------------------------------------------------------------
3784 ; Rn direct
3785 ;-------------------------------------------------------------
3786
3787 (define-derived-operand
3788 (name bit16-Rn-direct)
3789 (comment "m16c Rn direct bit")
3790 (attrs (machine 16))
3791 (mode BI)
3792 (args (Bitno16R Bit16Rn))
3793 (syntax "$Bitno16R,$Bit16Rn")
3794 (base-ifield f-12-4)
3795 (encoding (+ (f-12-2 0) Bit16Rn Bitno16R))
3796 (ifield-assertion (eq f-12-2 0))
3797 (getter (get-register-bit Bit16Rn Bitno16R))
3798 (setter (set-register-bit Bit16Rn Bitno16R newval))
3799 )
3800
3801 (define-pmacro (bit32-Rn-direct-operand group base)
3802 (begin
3803 (define-derived-operand
3804 (name (.sym bit32-Rn-direct- group))
3805 (comment "m32c Rn direct bit")
3806 (attrs (machine 32))
3807 (mode BI)
3808 (args ((.sym Bitno32 group) (.sym Bit32Rn group)))
3809 (syntax (.str "$Bitno32" group ",$Bit32Rn" group))
3810 (base-ifield (.sym f- base -6))
3811 (encoding (+ ((.sym f- base -3) 4) (.sym Bit32Rn group) (.sym Bitno32 group)))
3812 (ifield-assertion (eq (.sym f- base -3) 4))
3813 (getter (get-register-bit (.sym Bit32Rn group) (.sym Bitno32 group)))
3814 (setter (set-register-bit (.sym Bit32Rn group) (.sym Bitno32 group) newval))
3815 )
3816 )
3817 )
3818
3819 (bit32-Rn-direct-operand Unprefixed 4)
3820 (bit32-Rn-direct-operand Prefixed 12)
3821
3822 ;-------------------------------------------------------------
3823 ; An direct
3824 ;-------------------------------------------------------------
3825
3826 (define-derived-operand
3827 (name bit16-An-direct)
3828 (comment "m16c An direct bit")
3829 (attrs (machine 16))
3830 (mode BI)
3831 (args (Bitno16R Bit16An))
3832 (syntax "$Bitno16R,$Bit16An")
3833 (base-ifield f-12-4)
3834 (encoding (+ (f-12-2 1) (f-14-1 0) Bit16An Bitno16R))
3835 (ifield-assertion (andif (eq f-12-2 1) (eq f-14-1 0)))
3836 (getter (get-register-bit Bit16An Bitno16R))
3837 (setter (set-register-bit Bit16An Bitno16R newval))
3838 )
3839
3840 (define-pmacro (bit32-An-direct-operand group base1 base2)
3841 (begin
3842 (define-derived-operand
3843 (name (.sym bit32-An-direct- group))
3844 (comment "m32c An direct bit")
3845 (attrs (machine 32))
3846 (mode BI)
3847 (args ((.sym Bitno32 group) (.sym Bit32An group)))
3848 (syntax (.str "$Bitno32" group ",$Bit32An" group))
3849 (base-ifield (.sym f- base1 -6))
3850 (encoding (+ ((.sym f- base1 -3) 0) ((.sym f- base2 -1) 1) (.sym Bit32An group) (.sym Bitno32 group)))
3851 (ifield-assertion (andif (eq (.sym f- base1 -3) 0) (eq (.sym f- base2 -1) 1)))
3852 (getter (get-register-bit (.sym Bit32An group) (.sym Bitno32 group)))
3853 (setter (set-register-bit (.sym Bit32An group) (.sym Bitno32 group) newval))
3854 )
3855 )
3856 )
3857
3858 (bit32-An-direct-operand Unprefixed 4 8)
3859 (bit32-An-direct-operand Prefixed 12 16)
3860
3861 ;-------------------------------------------------------------
3862 ; An indirect
3863 ;-------------------------------------------------------------
3864
3865 (define-derived-operand
3866 (name bit16-An-indirect)
3867 (comment "m16c An indirect bit")
3868 (attrs (machine 16))
3869 (mode BI)
3870 (args (Bit16An))
3871 (syntax "[$Bit16An]")
3872 (base-ifield f-12-4)
3873 (encoding (+ (f-12-2 1) (f-14-1 1) Bit16An))
3874 (ifield-assertion (andif (eq f-12-2 1) (eq f-14-1 1)))
3875 (getter (get-memory-bit 16 0 Bit16An))
3876 (setter (set-memory-bit 16 0 Bit16An newval))
3877 )
3878
3879 (define-pmacro (bit32-An-indirect-operand group base1 base2)
3880 (begin
3881 (define-derived-operand
3882 (name (.sym bit32-An-indirect- group))
3883 (comment "m32c An indirect destination ")
3884 (attrs (machine 32))
3885 (mode BI)
3886 (args ((.sym Bitno32 group) (.sym Bit32An group)))
3887 (syntax (.str "$Bitno32" group ",[$Bit32An" group "]"))
3888 (base-ifield (.sym f- base1 -6))
3889 (encoding (+ ((.sym f- base1 -3) 0) ((.sym f- base2 -1) 0) (.sym Bit32An group) (.sym Bitno32 group)))
3890 (ifield-assertion (andif (eq (.sym f- base1 -3) 0) (eq (.sym f- base2 -1) 0)))
3891 (getter (get-memory-bit 32 (.sym Bit32An group) (.sym Bitno32 group)))
3892 (setter (set-memory-bit 32 (.sym Bit32An group) (.sym Bitno32 group) newval))
3893 )
3894 )
3895 )
3896
3897 (bit32-An-indirect-operand Unprefixed 4 8)
3898 (bit32-An-indirect-operand Prefixed 12 16)
3899
3900 ;-------------------------------------------------------------
3901 ; dsp:d[r] relative
3902 ;-------------------------------------------------------------
3903
3904 (define-pmacro (bit16-relative-operand offset)
3905 (begin
3906 (define-derived-operand
3907 (name (.sym bit16- offset -8-SB-relative))
3908 (comment (.str "m16c dsp:8[sb] relative bit " xmode))
3909 (attrs (machine 16))
3910 (mode BI)
3911 (args ((.sym BitBase16- offset -u8)))
3912 (syntax (.str "${BitBase16-" offset "-u8}[sb]"))
3913 (base-ifield f-12-4)
3914 (encoding (+ (f-12-4 #xA) (.sym BitBase16- offset -u8)))
3915 (ifield-assertion (eq f-12-4 #xA))
3916 (getter (get-memory-bit 16 (reg h-sb) (.sym BitBase16- offset -u8)))
3917 (setter (set-memory-bit 16 (reg h-sb) (.sym BitBase16- offset -u8) newval))
3918 )
3919 (define-derived-operand
3920 (name (.sym bit16- offset -16-SB-relative))
3921 (comment (.str "m16c dsp:16[sb] relative bit " xmode))
3922 (attrs (machine 16))
3923 (mode BI)
3924 (args ((.sym BitBase16- offset -u16)))
3925 (syntax (.str "${BitBase16-" offset "-u16}[sb]"))
3926 (base-ifield f-12-4)
3927 (encoding (+ (f-12-4 #xE) (.sym BitBase16- offset -u16)))
3928 (ifield-assertion (eq f-12-4 #xE))
3929 (getter (get-memory-bit 16 (reg h-sb) (.sym BitBase16- offset -u16)))
3930 (setter (set-memory-bit 16 (reg h-sb) (.sym BitBase16- offset -u16) newval))
3931 )
3932 (define-derived-operand
3933 (name (.sym bit16- offset -8-FB-relative))
3934 (comment (.str "m16c dsp:8[fb] relative bit " xmode))
3935 (attrs (machine 16))
3936 (mode BI)
3937 (args ((.sym BitBase16- offset -s8)))
3938 (syntax (.str "${BitBase16-" offset "-s8}[fb]"))
3939 (base-ifield f-12-4)
3940 (encoding (+ (f-12-4 #xB) (.sym BitBase16- offset -s8)))
3941 (ifield-assertion (eq f-12-4 #xB))
3942 (getter (get-memory-bit 16 (reg h-fb) (.sym BitBase16- offset -s8)))
3943 (setter (set-memory-bit 16 (reg h-fb) (.sym BitBase16- offset -s8) newval))
3944 )
3945 (define-derived-operand
3946 (name (.sym bit16- offset -8-An-relative))
3947 (comment (.str "m16c dsp:8[An] relative bit " xmode))
3948 (attrs (machine 16))
3949 (mode BI)
3950 (args (Bit16An (.sym Dsp- offset -u8)))
3951 (syntax (.str "${Dsp-" offset "-u8}[$Bit16An]"))
3952 (base-ifield f-12-4)
3953 (encoding (+ (f-12-2 2) (f-14-1 0) (.sym Dsp- offset -u8) Bit16An))
3954 (ifield-assertion (andif (eq f-12-2 2) (eq f-14-1 0)))
3955 (getter (get-memory-bit 16 (.sym Dsp- offset -u8) Bit16An))
3956 (setter (set-memory-bit 16 (.sym Dsp- offset -u8) Bit16An newval))
3957 )
3958 (define-derived-operand
3959 (name (.sym bit16- offset -16-An-relative))
3960 (comment (.str "m16c dsp:16[An] relative bit " xmode))
3961 (attrs (machine 16))
3962 (mode BI)
3963 (args (Bit16An (.sym Dsp- offset -u16)))
3964 (syntax (.str "${Dsp-" offset "-u16}[$Bit16An]"))
3965 (base-ifield f-12-4)
3966 (encoding (+ (f-12-2 3) (f-14-1 0) (.sym Dsp- offset -u16) Bit16An))
3967 (ifield-assertion (andif (eq f-12-2 3) (eq f-14-1 0)))
3968 (getter (get-memory-bit 16 (.sym Dsp- offset -u16) Bit16An))
3969 (setter (set-memory-bit 16 (.sym Dsp- offset -u16) Bit16An newval))
3970 )
3971 )
3972 )
3973
3974 (bit16-relative-operand 16)
3975
3976 (define-pmacro (bit32-relative-operand offset group base1 base2)
3977 (begin
3978 (define-derived-operand
3979 (name (.sym bit32- offset -11-SB-relative- group))
3980 (comment "m32c bit,base:11[sb] relative bit")
3981 (attrs (machine 32))
3982 (mode BI)
3983 (args ((.sym BitBase32- offset -u11- group)))
3984 (syntax (.str "${BitBase32-" offset "-u11-" group "}[sb]"))
3985 (base-ifield (.sym f- base1 -12))
3986 (encoding (+ ((.sym f- base1 -3) 1) ((.sym f- base2 -2) 2) (.sym BitBase32- offset -u11- group)))
3987 (ifield-assertion (andif (eq (.sym f- base1 -3) 1) (eq (.sym f- base2 -2) 2)))
3988 (getter (get-memory-bit 32 (reg h-sb) (.sym BitBase32- offset -u11- group)))
3989 (setter (set-memory-bit 32 (reg h-sb) (.sym BitBase32- offset -u11- group) newval))
3990 )
3991 (define-derived-operand
3992 (name (.sym bit32- offset -19-SB-relative- group))
3993 (comment "m32c bit,base:19[sb] relative bit")
3994 (attrs (machine 32))
3995 (mode BI)
3996 (args ((.sym BitBase32- offset -u19- group)))
3997 (syntax (.str "${BitBase32-" offset "-u19-" group "}[sb]"))
3998 (base-ifield (.sym f- base1 -12))
3999 (encoding (+ ((.sym f- base1 -3) 2) ((.sym f- base2 -2) 2) (.sym BitBase32- offset -u19- group)))
4000 (ifield-assertion (andif (eq (.sym f- base1 -3) 2) (eq (.sym f- base2 -2) 2)))
4001 (getter (get-memory-bit 32 (reg h-sb) (.sym BitBase32- offset -u19- group)))
4002 (setter (set-memory-bit 32 (reg h-sb) (.sym BitBase32- offset -u19- group) newval))
4003 )
4004 (define-derived-operand
4005 (name (.sym bit32- offset -11-FB-relative- group))
4006 (comment "m32c bit,base:11[fb] relative bit")
4007 (attrs (machine 32))
4008 (mode BI)
4009 (args ((.sym BitBase32- offset -s11- group)))
4010 (syntax (.str "${BitBase32-" offset "-s11-" group "}[fb]"))
4011 (base-ifield (.sym f- base1 -12))
4012 (encoding (+ ((.sym f- base1 -3) 1) ((.sym f- base2 -2) 3) (.sym BitBase32- offset -s11- group)))
4013 (ifield-assertion (andif (eq (.sym f- base1 -3) 1) (eq (.sym f- base2 -2) 3)))
4014 (getter (get-memory-bit 32 (reg h-fb) (.sym BitBase32- offset -s11- group)))
4015 (setter (set-memory-bit 32 (reg h-fb) (.sym BitBase32- offset -s11- group) newval))
4016 )
4017 (define-derived-operand
4018 (name (.sym bit32- offset -19-FB-relative- group))
4019 (comment "m32c bit,base:19[fb] relative bit")
4020 (attrs (machine 32))
4021 (mode BI)
4022 (args ((.sym BitBase32- offset -s19- group)))
4023 (syntax (.str "${BitBase32-" offset "-s19-" group "}[fb]"))
4024 (base-ifield (.sym f- base1 -12))
4025 (encoding (+ ((.sym f- base1 -3) 2) ((.sym f- base2 -2) 3) (.sym BitBase32- offset -s19- group)))
4026 (ifield-assertion (andif (eq (.sym f- base1 -3) 2) (eq (.sym f- base2 -2) 3)))
4027 (getter (get-memory-bit 32 (reg h-fb) (.sym BitBase32- offset -s19- group)))
4028 (setter (set-memory-bit 32 (reg h-fb) (.sym BitBase32- offset -s19- group) newval))
4029 )
4030 (define-derived-operand
4031 (name (.sym bit32- offset -11-An-relative- group))
4032 (comment "m32c bit,base:11[An] relative bit")
4033 (attrs (machine 32))
4034 (mode BI)
4035 (args ((.sym BitBase32- offset -u11- group) (.sym Bit32An group)))
4036 (syntax (.str "${BitBase32-" offset "-u11-" group "}[$Bit32An" group "]"))
4037 (base-ifield (.sym f- base1 -12))
4038 (encoding (+ ((.sym f- base1 -3) 1) ((.sym f- base2 -1) 0) (.sym BitBase32- offset -u11- group) (.sym Bit32An group)))
4039 (ifield-assertion (andif (eq (.sym f- base1 -3) 1) (eq (.sym f- base2 -1) 0)))
4040 (getter (get-memory-bit 32 (.sym Bit32An group) (.sym BitBase32- offset -u11- group)))
4041 (setter (set-memory-bit 32 (.sym Bit32An group) (.sym BitBase32- offset -u11- group) newval))
4042 )
4043 (define-derived-operand
4044 (name (.sym bit32- offset -19-An-relative- group))
4045 (comment "m32c bit,base:19[An] relative bit")
4046 (attrs (machine 32))
4047 (mode BI)
4048 (args ((.sym BitBase32- offset -u19- group) (.sym Bit32An group)))
4049 (syntax (.str "${BitBase32-" offset "-u19-" group "}[$Bit32An" group "]"))
4050 (base-ifield (.sym f- base1 -12))
4051 (encoding (+ ((.sym f- base1 -3) 2) ((.sym f- base2 -1) 0) (.sym BitBase32- offset -u19- group) (.sym Bit32An group)))
4052 (ifield-assertion (andif (eq (.sym f- base1 -3) 2) (eq (.sym f- base2 -1) 0)))
4053 (getter (get-memory-bit 32 (.sym Bit32An group) (.sym BitBase32- offset -u19- group)))
4054 (setter (set-memory-bit 32 (.sym Bit32An group) (.sym BitBase32- offset -u19- group) newval))
4055 )
4056 (define-derived-operand
4057 (name (.sym bit32- offset -27-An-relative- group))
4058 (comment "m32c bit,base:27[An] relative bit")
4059 (attrs (machine 32))
4060 (mode BI)
4061 (args ((.sym BitBase32- offset -u27- group) (.sym Bit32An group)))
4062 (syntax (.str "${BitBase32-" offset "-u27-" group "}[$Bit32An" group "]"))
4063 (base-ifield (.sym f- base1 -12))
4064 (encoding (+ ((.sym f- base1 -3) 3) ((.sym f- base2 -1) 0) (.sym BitBase32- offset -u27- group) (.sym Bit32An group)))
4065 (ifield-assertion (andif (eq (.sym f- base1 -3) 3) (eq (.sym f- base2 -1) 0)))
4066 (getter (get-memory-bit 32 (.sym Bit32An group) (.sym BitBase32- offset -u27- group)))
4067 (setter (set-memory-bit 32 (.sym Bit32An group) (.sym BitBase32- offset -u27- group) newval))
4068 )
4069 )
4070 )
4071
4072 (bit32-relative-operand 16 Unprefixed 4 8)
4073 (bit32-relative-operand 24 Prefixed 12 16)
4074
4075 (define-derived-operand
4076 (name bit16-11-SB-relative-S)
4077 (comment "m16c bit,base:11[sb] relative bit")
4078 (attrs (machine 16))
4079 (mode BI)
4080 (args (BitBase16-8-u11-S))
4081 (syntax "${BitBase16-8-u11-S}[sb]")
4082 (base-ifield (.sym f-5-3))
4083 (encoding (+ BitBase16-8-u11-S))
4084 ; (ifield-assertion (#t))
4085 (getter (get-memory-bit 16 (reg h-sb) BitBase16-8-u11-S))
4086 (setter (set-memory-bit 16 (reg h-sb) BitBase16-8-u11-S newval))
4087 )
4088
4089 (define-derived-operand
4090 (name Rn16-push-S-derived)
4091 (comment "m16c r0[lh] for push,pop short version")
4092 (attrs (machine 16))
4093 (mode QI)
4094 (args (Rn16-push-S))
4095 (syntax "${Rn16-push-S}")
4096 (base-ifield (.sym f-4-1))
4097 (encoding (+ Rn16-push-S))
4098 ; (ifield-assertion (#t))
4099 (getter (trunc QI Rn16-push-S))
4100 (setter (set Rn16-push-S newval))
4101 )
4102
4103 (define-derived-operand
4104 (name An16-push-S-derived)
4105 (comment "m16c r0[lh] for push,pop short version")
4106 (attrs (machine 16))
4107 (mode HI)
4108 (args (An16-push-S))
4109 (syntax "${An16-push-S}")
4110 (base-ifield (.sym f-4-1))
4111 (encoding (+ An16-push-S))
4112 ; (ifield-assertion (#t))
4113 (getter (trunc QI An16-push-S))
4114 (setter (set An16-push-S newval))
4115 )
4116
4117 ;-------------------------------------------------------------
4118 ; Absolute address
4119 ;-------------------------------------------------------------
4120
4121 (define-pmacro (bit16-absolute offset)
4122 (begin
4123 (define-derived-operand
4124 (name (.sym bit16- offset -16-absolute))
4125 (comment "m16c absolute address")
4126 (attrs (machine 16))
4127 (mode BI)
4128 (args ((.sym BitBase16- offset -u16)))
4129 (syntax (.str "${BitBase16-" offset "-u16}"))
4130 (base-ifield f-12-4)
4131 (encoding (+ (f-12-4 #xF) (.sym BitBase16- offset -u16)))
4132 (ifield-assertion (eq f-12-4 #xF))
4133 (getter (get-memory-bit 16 0 (.sym BitBase16- offset -u16)))
4134 (setter (set-memory-bit 16 0 (.sym BitBase16- offset -u16) newval))
4135 )
4136 )
4137 )
4138
4139 (bit16-absolute 16)
4140
4141 (define-pmacro (bit32-absolute offset group base1 base2)
4142 (begin
4143 (define-derived-operand
4144 (name (.sym bit32- offset -19-absolute- group))
4145 (comment "m32c absolute address bit")
4146 (attrs (machine 32))
4147 (mode BI)
4148 (args ((.sym BitBase32- offset -u19- group)))
4149 (syntax (.str "${BitBase32-" offset "-u19-" group "}"))
4150 (base-ifield (.sym f- base1 -12))
4151 (encoding (+ ((.sym f- base1 -3) 3) ((.sym f- base2 -2) 3) (.sym BitBase32- offset -u19- group)))
4152 (ifield-assertion (andif (eq (.sym f- base1 -3) 3) (eq (.sym f- base2 -2) 3)))
4153 (getter (get-memory-bit 32 0 (.sym BitBase32- offset -u19- group)))
4154 (setter (set-memory-bit 32 0 (.sym BitBase32- offset -u19- group) newval))
4155 )
4156 (define-derived-operand
4157 (name (.sym bit32- offset -27-absolute- group))
4158 (comment "m32c absolute address bit")
4159 (attrs (machine 32))
4160 (mode BI)
4161 (args ((.sym BitBase32- offset -u27- group)))
4162 (syntax (.str "${BitBase32-" offset "-u27-" group "}"))
4163 (base-ifield (.sym f- base1 -12))
4164 (encoding (+ ((.sym f- base1 -3) 3) ((.sym f- base2 -2) 2) (.sym BitBase32- offset -u27- group)))
4165 (ifield-assertion (andif (eq (.sym f- base1 -3) 3) (eq (.sym f- base2 -2) 2)))
4166 (getter (get-memory-bit 32 0 (.sym BitBase32- offset -u27- group)))
4167 (setter (set-memory-bit 32 0 (.sym BitBase32- offset -u27- group) newval))
4168 )
4169 )
4170 )
4171
4172 (bit32-absolute 16 Unprefixed 4 8)
4173 (bit32-absolute 24 Prefixed 12 16)
4174
4175 ;-------------------------------------------------------------
4176 ; Destination operands for short fomat insns
4177 ;-------------------------------------------------------------
4178
4179 (define-derived-operand
4180 (name dst16-3-S-R0l-direct-QI)
4181 (comment "m16c R0l direct QI")
4182 (attrs (machine 16))
4183 (mode QI)
4184 (args (R0l))
4185 (syntax "r0l")
4186 (base-ifield f-5-3)
4187 (encoding (+ (f-5-3 4)))
4188 (ifield-assertion (eq f-5-3 4))
4189 (getter (trunc QI R0l))
4190 (setter (set R0l newval))
4191 )
4192 (define-derived-operand
4193 (name dst16-3-S-R0h-direct-QI)
4194 (comment "m16c R0h direct QI")
4195 (attrs (machine 16))
4196 (mode QI)
4197 (args (R0h))
4198 (syntax "r0h")
4199 (base-ifield f-5-3)
4200 (encoding (+ (f-5-3 3)))
4201 (ifield-assertion (eq f-5-3 3))
4202 (getter (trunc QI R0h))
4203 (setter (set R0h newval))
4204 )
4205 (define-derived-operand
4206 (name dst16-3-S-8-8-SB-relative-QI)
4207 (comment "m16c SB relative QI")
4208 (attrs (machine 16))
4209 (mode QI)
4210 (args (Dsp-8-u8))
4211 (syntax "${Dsp-8-u8}[sb]")
4212 (base-ifield f-5-3)
4213 (encoding (+ (f-5-3 5) Dsp-8-u8))
4214 (ifield-assertion (eq f-5-3 5))
4215 (getter (mem16 QI (add Dsp-8-u8 (reg h-sb))))
4216 (setter (set (mem16 QI (add Dsp-8-u8 (reg h-sb))) newval))
4217 )
4218 (define-derived-operand
4219 (name dst16-3-S-8-8-FB-relative-QI)
4220 (comment "m16c FB relative QI")
4221 (attrs (machine 16))
4222 (mode QI)
4223 (args (Dsp-8-s8))
4224 (syntax "${Dsp-8-s8}[fb]")
4225 (base-ifield f-5-3)
4226 (encoding (+ (f-5-3 6) Dsp-8-s8))
4227 (ifield-assertion (eq f-5-3 6))
4228 (getter (mem16 QI (add Dsp-8-s8 (reg h-fb))))
4229 (setter (set (mem16 QI (add Dsp-8-s8 (reg h-fb))) newval))
4230 )
4231 (define-derived-operand
4232 (name dst16-3-S-8-16-absolute-QI)
4233 (comment "m16c absolute address QI")
4234 (attrs (machine 16))
4235 (mode QI)
4236 (args (Dsp-8-u16))
4237 (syntax "${Dsp-8-u16}")
4238 (base-ifield f-5-3)
4239 (encoding (+ (f-5-3 7) Dsp-8-u16))
4240 (ifield-assertion (eq f-5-3 7))
4241 (getter (mem16 QI Dsp-8-u16))
4242 (setter (set (mem16 QI Dsp-8-u16) newval))
4243 )
4244 (define-derived-operand
4245 (name dst16-3-S-16-8-SB-relative-QI)
4246 (comment "m16c SB relative QI")
4247 (attrs (machine 16))
4248 (mode QI)
4249 (args (Dsp-16-u8))
4250 (syntax "${Dsp-16-u8}[sb]")
4251 (base-ifield f-5-3)
4252 (encoding (+ (f-5-3 5) Dsp-16-u8))
4253 (ifield-assertion (eq f-5-3 5))
4254 (getter (mem16 QI (add Dsp-16-u8 (reg h-sb))))
4255 (setter (set (mem16 QI (add Dsp-16-u8 (reg h-sb))) newval))
4256 )
4257 (define-derived-operand
4258 (name dst16-3-S-16-8-FB-relative-QI)
4259 (comment "m16c FB relative QI")
4260 (attrs (machine 16))
4261 (mode QI)
4262 (args (Dsp-16-s8))
4263 (syntax "${Dsp-16-s8}[fb]")
4264 (base-ifield f-5-3)
4265 (encoding (+ (f-5-3 6) Dsp-16-s8))
4266 (ifield-assertion (eq f-5-3 6))
4267 (getter (mem16 QI (add Dsp-16-s8 (reg h-fb))))
4268 (setter (set (mem16 QI (add Dsp-16-s8 (reg h-fb))) newval))
4269 )
4270 (define-derived-operand
4271 (name dst16-3-S-16-16-absolute-QI)
4272 (comment "m16c absolute address QI")
4273 (attrs (machine 16))
4274 (mode QI)
4275 (args (Dsp-16-u16))
4276 (syntax "${Dsp-16-u16}")
4277 (base-ifield f-5-3)
4278 (encoding (+ (f-5-3 7) Dsp-16-u16))
4279 (ifield-assertion (eq f-5-3 7))
4280 (getter (mem16 QI Dsp-16-u16))
4281 (setter (set (mem16 QI Dsp-16-u16) newval))
4282 )
4283 (define-derived-operand
4284 (name srcdst16-r0l-r0h-S-derived)
4285 (comment "m16c r0l/r0h operand for short format insns")
4286 (attrs (machine 16))
4287 (mode SI)
4288 (args (SrcDst16-r0l-r0h-S-normal))
4289 (syntax "${SrcDst16-r0l-r0h-S-normal}")
4290 (base-ifield f-6-3)
4291 (encoding (+ (f-6-2 0) SrcDst16-r0l-r0h-S-normal))
4292 (ifield-assertion (eq f-6-2 0))
4293 (getter (trunc SI SrcDst16-r0l-r0h-S-normal))
4294 (setter ()) ; no setter
4295 )
4296 (define-derived-operand
4297 (name dst32-2-S-R0l-direct-QI)
4298 (comment "m32c R0l direct QI")
4299 (attrs (machine 32))
4300 (mode QI)
4301 (args (R0l))
4302 (syntax "r0l")
4303 (base-ifield f-2-2)
4304 (encoding (+ (f-2-2 0)))
4305 (ifield-assertion (eq f-2-2 0))
4306 (getter (trunc QI R0l))
4307 (setter (set R0l newval))
4308 )
4309 (define-derived-operand
4310 (name dst32-2-S-R0-direct-HI)
4311 (comment "m32c R0 direct HI")
4312 (attrs (machine 32))
4313 (mode HI)
4314 (args (R0))
4315 (syntax "r0")
4316 (base-ifield f-2-2)
4317 (encoding (+ (f-2-2 0)))
4318 (ifield-assertion (eq f-2-2 0))
4319 (getter (trunc HI R0))
4320 (setter (set R0 newval))
4321 )
4322 (define-derived-operand
4323 (name dst32-1-S-A0-direct-HI)
4324 (comment "m32c A0 direct HI")
4325 (attrs (machine 32))
4326 (mode HI)
4327 (args (A0))
4328 (syntax "a0")
4329 (base-ifield f-7-1)
4330 (encoding (+ (f-7-1 0)))
4331 (ifield-assertion (eq f-7-1 0))
4332 (getter (trunc HI A0))
4333 (setter (set A0 newval))
4334 )
4335 (define-derived-operand
4336 (name dst32-1-S-A1-direct-HI)
4337 (comment "m32c A1 direct HI")
4338 (attrs (machine 32))
4339 (mode HI)
4340 (args (A1))
4341 (syntax "a1")
4342 (base-ifield f-7-1)
4343 (encoding (+ (f-7-1 1)))
4344 (ifield-assertion (eq f-7-1 1))
4345 (getter (trunc HI A1))
4346 (setter (set A1 newval))
4347 )
4348 (define-pmacro (dst32-2-S-operands xmode)
4349 (begin
4350 (define-derived-operand
4351 (name (.sym dst32-2-S-8-SB-relative- xmode))
4352 (comment "m32c SB relative for short binary insns")
4353 (attrs (machine 32))
4354 (mode xmode)
4355 (args (Dsp-8-u8))
4356 (syntax "${Dsp-8-u8}[sb]")
4357 (base-ifield f-2-2)
4358 (encoding (+ (f-2-2 2) Dsp-8-u8))
4359 (ifield-assertion (eq f-2-2 2))
4360 (getter (c-call xmode (.str "operand_getter_" xmode) sb Dsp-8-u8))
4361 (setter (c-call DFLT (.str "operand_setter_" xmode) newval sb Dsp-8-u8))
4362 ; (getter (mem32 xmode (add Dsp-8-u8 (reg h-sb))))
4363 ; (setter (set (mem32 xmode (add Dsp-8-u8 (reg h-sb))) newval))
4364 )
4365 (define-derived-operand
4366 (name (.sym dst32-2-S-8-FB-relative- xmode))
4367 (comment "m32c FB relative for short binary insns")
4368 (attrs (machine 32))
4369 (mode xmode)
4370 (args (Dsp-8-s8))
4371 (syntax "${Dsp-8-s8}[fb]")
4372 (base-ifield f-2-2)
4373 (encoding (+ (f-2-2 3) Dsp-8-s8))
4374 (ifield-assertion (eq f-2-2 3))
4375 (getter (c-call xmode (.str "operand_getter_" xmode) fb Dsp-8-s8))
4376 (setter (c-call DFLT (.str "operand_setter_" xmode) newval fb Dsp-8-s8))
4377 ; (getter (mem32 xmode (add Dsp-8-s8 (reg h-fb))))
4378 ; (setter (set (mem32 xmode (add Dsp-8-s8 (reg h-fb))) newval))
4379 )
4380 (define-derived-operand
4381 (name (.sym dst32-2-S-16-absolute- xmode))
4382 (comment "m32c absolute address for short binary insns")
4383 (attrs (machine 32))
4384 (mode xmode)
4385 (args (Dsp-8-u16))
4386 (syntax "${Dsp-8-u16}")
4387 (base-ifield f-2-2)
4388 (encoding (+ (f-2-2 1) Dsp-8-u16))
4389 (ifield-assertion (eq f-2-2 1))
4390 (getter (c-call xmode (.str "operand_getter_" xmode) (const 0) Dsp-8-u16))
4391 (setter (c-call DFLT (.str "operand_setter_" xmode) newval (const 0) Dsp-8-u16))
4392 ; (getter (mem32 xmode Dsp-8-u16))
4393 ; (setter (set (mem32 xmode Dsp-8-u16) newval))
4394 )
4395 ; (define-derived-operand
4396 ; (name (.sym dst32-2-S-8-SB-relative-indirect- xmode))
4397 ; (comment "m32c SB relative for short binary insns")
4398 ; (attrs (machine 32))
4399 ; (mode xmode)
4400 ; (args (Dsp-16-u8))
4401 ; (syntax "[${Dsp-16-u8}[sb]]")
4402 ; (base-ifield f-10-2)
4403 ; (encoding (+ (f-10-2 2) Dsp-16-u8))
4404 ; (ifield-assertion (eq f-10-2 2))
4405 ; (getter (mem32 xmode (indirect-addr (add Dsp-16-u8 (reg h-sb)))))
4406 ; (setter (set (mem32 xmode (indirect-addr (add Dsp-16-u8 (reg h-sb)))) newval))
4407 ; )
4408 ; (define-derived-operand
4409 ; (name (.sym dst32-2-S-8-FB-relative-indirect- xmode))
4410 ; (comment "m32c FB relative for short binary insns")
4411 ; (attrs (machine 32))
4412 ; (mode xmode)
4413 ; (args (Dsp-16-s8))
4414 ; (syntax "[${Dsp-16-s8}[fb]]")
4415 ; (base-ifield f-10-2)
4416 ; (encoding (+ (f-10-2 3) Dsp-16-s8))
4417 ; (ifield-assertion (eq f-10-2 3))
4418 ; (getter (mem32 xmode (indirect-addr (add Dsp-16-s8 (reg h-fb)))))
4419 ; (setter (set (mem32 xmode (indirect-addr (add Dsp-16-s8 (reg h-fb)))) newval))
4420 ; )
4421 ; (define-derived-operand
4422 ; (name (.sym dst32-2-S-16-absolute-indirect- xmode))
4423 ; (comment "m32c absolute address for short binary insns")
4424 ; (attrs (machine 32))
4425 ; (mode xmode)
4426 ; (args (Dsp-16-u16))
4427 ; (syntax "[${Dsp-16-u16}]")
4428 ; (base-ifield f-10-2)
4429 ; (encoding (+ (f-10-2 1) Dsp-16-u16))
4430 ; (ifield-assertion (eq f-10-2 1))
4431 ; (getter (mem32 xmode (indirect-addr Dsp-16-u16)))
4432 ; (setter (set (mem32 xmode (indirect-addr Dsp-16-u16)) newval))
4433 ; )
4434 )
4435 )
4436
4437 (dst32-2-S-operands QI)
4438 (dst32-2-S-operands HI)
4439 (dst32-2-S-operands SI)
4440
4441 ;=============================================================
4442 ; Anyof operands
4443 ;-------------------------------------------------------------
4444 ; Source operands with no additional fields
4445 ;-------------------------------------------------------------
4446
4447 (define-pmacro (src16-basic-operand xmode)
4448 (begin
4449 (define-anyof-operand
4450 (name (.sym src16-basic- xmode))
4451 (comment (.str "m16c source operand of size " xmode " with no additional fields"))
4452 (attrs (machine 16))
4453 (mode xmode)
4454 (choices
4455 (.sym src16-Rn-direct- xmode)
4456 (.sym src16-An-direct- xmode)
4457 (.sym src16-An-indirect- xmode)
4458 )
4459 )
4460 )
4461 )
4462 (src16-basic-operand QI)
4463 (src16-basic-operand HI)
4464
4465 (define-pmacro (src32-basic-operand xmode)
4466 (begin
4467 (define-anyof-operand
4468 (name (.sym src32-basic-Unprefixed- xmode))
4469 (comment (.str "m32c destination operand of size " xmode " with no additional fields"))
4470 (attrs (machine 32))
4471 (mode xmode)
4472 (choices
4473 (.sym src32-Rn-direct-Unprefixed- xmode)
4474 (.sym src32-An-direct-Unprefixed- xmode)
4475 (.sym src32-An-indirect-Unprefixed- xmode)
4476 )
4477 )
4478 (define-anyof-operand
4479 (name (.sym src32-basic-Prefixed- xmode))
4480 (comment (.str "m32c destination operand of size " xmode " with no additional fields"))
4481 (attrs (machine 32))
4482 (mode xmode)
4483 (choices
4484 (.sym src32-Rn-direct-Prefixed- xmode)
4485 (.sym src32-An-direct-Prefixed- xmode)
4486 (.sym src32-An-indirect-Prefixed- xmode)
4487 )
4488 )
4489 ; (define-anyof-operand
4490 ; (name (.sym src32-basic-indirect- xmode))
4491 ; (comment (.str "m32c destination operand of size " xmode " indirect with no additional fields"))
4492 ; (attrs (machine 32))
4493 ; (mode xmode)
4494 ; (choices
4495 ; (.sym src32-An-indirect-indirect- xmode)
4496 ; )
4497 ; )
4498 )
4499 )
4500
4501 (src32-basic-operand QI)
4502 (src32-basic-operand HI)
4503 (src32-basic-operand SI)
4504
4505 (define-anyof-operand
4506 (name src32-basic-ExtPrefixed-QI)
4507 (comment "m32c source operand of size QI with no additional fields")
4508 (attrs (machine 32))
4509 (mode QI)
4510 (choices
4511 src32-Rn-direct-Prefixed-QI
4512 src32-An-indirect-Prefixed-QI
4513 )
4514 )
4515
4516 ;-------------------------------------------------------------
4517 ; Source operands with additional fields at offset 16 bits
4518 ;-------------------------------------------------------------
4519
4520 (define-pmacro (src16-16-operand xmode)
4521 (begin
4522 (define-anyof-operand
4523 (name (.sym src16-16-8- xmode))
4524 (comment (.str "m16c source operand of size " xmode " with additional 8 bit fields at offset 16"))
4525 (attrs (machine 16))
4526 (mode xmode)
4527 (choices
4528 (.sym src16-16-8-An-relative- xmode)
4529 (.sym src16-16-8-SB-relative- xmode)
4530 (.sym src16-16-8-FB-relative- xmode)
4531 )
4532 )
4533 (define-anyof-operand
4534 (name (.sym src16-16-16- xmode))
4535 (comment (.str "m16c source operand of size " xmode " with additional 16 bit fields at offset 16"))
4536 (attrs (machine 16))
4537 (mode xmode)
4538 (choices
4539 (.sym src16-16-16-An-relative- xmode)
4540 (.sym src16-16-16-SB-relative- xmode)
4541 (.sym src16-16-16-absolute- xmode)
4542 )
4543 )
4544 )
4545 )
4546 (src16-16-operand QI)
4547 (src16-16-operand HI)
4548
4549 (define-pmacro (src32-16-operand xmode)
4550 (begin
4551 (define-anyof-operand
4552 (name (.sym src32-16-8-Unprefixed- xmode))
4553 (comment (.str "m32c source operand of size " xmode " with additional 8 bit fields at offset 16"))
4554 (attrs (machine 32))
4555 (mode xmode)
4556 (choices
4557 (.sym src32-16-8-An-relative-Unprefixed- xmode)
4558 (.sym src32-16-8-SB-relative-Unprefixed- xmode)
4559 (.sym src32-16-8-FB-relative-Unprefixed- xmode)
4560 )
4561 )
4562 (define-anyof-operand
4563 (name (.sym src32-16-16-Unprefixed- xmode))
4564 (comment (.str "m32c source operand of size " xmode " with additional 16 bit fields at offset 16"))
4565 (attrs (machine 32))
4566 (mode xmode)
4567 (choices
4568 (.sym src32-16-16-An-relative-Unprefixed- xmode)
4569 (.sym src32-16-16-SB-relative-Unprefixed- xmode)
4570 (.sym src32-16-16-FB-relative-Unprefixed- xmode)
4571 (.sym src32-16-16-absolute-Unprefixed- xmode)
4572 )
4573 )
4574 (define-anyof-operand
4575 (name (.sym src32-16-24-Unprefixed- xmode))
4576 (comment (.str "m32c source operand of size " xmode " with additional 24 bit fields at offset 16"))
4577 (attrs (machine 32))
4578 (mode xmode)
4579 (choices
4580 (.sym src32-16-24-An-relative-Unprefixed- xmode)
4581 (.sym src32-16-24-absolute-Unprefixed- xmode)
4582 )
4583 )
4584 )
4585 )
4586
4587 (src32-16-operand QI)
4588 (src32-16-operand HI)
4589 (src32-16-operand SI)
4590
4591 ;-------------------------------------------------------------
4592 ; Source operands with additional fields at offset 24 bits
4593 ;-------------------------------------------------------------
4594
4595 (define-pmacro (src-24-operand group xmode)
4596 (begin
4597 (define-anyof-operand
4598 (name (.sym src32-24-8- group - xmode))
4599 (comment (.str "m32c source operand of size " xmode " with additional 8 bit fields at offset 24"))
4600 (attrs (machine 32))
4601 (mode xmode)
4602 (choices
4603 (.sym src32-24-8-An-relative- group - xmode)
4604 (.sym src32-24-8-SB-relative- group - xmode)
4605 (.sym src32-24-8-FB-relative- group - xmode)
4606 )
4607 )
4608 (define-anyof-operand
4609 (name (.sym src32-24-16- group - xmode))
4610 (comment (.str "m32c source operand of size " xmode " with additional 16 bit fields at offset 16"))
4611 (attrs (machine 32))
4612 (mode xmode)
4613 (choices
4614 (.sym src32-24-16-An-relative- group - xmode)
4615 (.sym src32-24-16-SB-relative- group - xmode)
4616 (.sym src32-24-16-FB-relative- group - xmode)
4617 (.sym src32-24-16-absolute- group - xmode)
4618 )
4619 )
4620 (define-anyof-operand
4621 (name (.sym src32-24-24- group - xmode))
4622 (comment (.str "m32c source operand of size " xmode " with additional 24 bit fields at offset 16"))
4623 (attrs (machine 32))
4624 (mode xmode)
4625 (choices
4626 (.sym src32-24-24-An-relative- group - xmode)
4627 (.sym src32-24-24-absolute- group - xmode)
4628 )
4629 )
4630 )
4631 )
4632
4633 (src-24-operand Prefixed QI)
4634 (src-24-operand Prefixed HI)
4635 (src-24-operand Prefixed SI)
4636
4637 (define-pmacro (src-24-indirect-operand xmode)
4638 (begin
4639 ; (define-anyof-operand
4640 ; (name (.sym src32-24-8-indirect- xmode))
4641 ; (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 24"))
4642 ; (attrs (machine 32))
4643 ; (mode xmode)
4644 ; (choices
4645 ; (.sym src32-24-8-An-relative-indirect- xmode)
4646 ; (.sym src32-24-8-SB-relative-indirect- xmode)
4647 ; (.sym src32-24-8-FB-relative-indirect- xmode)
4648 ; )
4649 ; )
4650 ; (define-anyof-operand
4651 ; (name (.sym src32-24-16-indirect- xmode))
4652 ; (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 24"))
4653 ; (attrs (machine 32))
4654 ; (mode xmode)
4655 ; (choices
4656 ; (.sym src32-24-16-An-relative-indirect- xmode)
4657 ; (.sym src32-24-16-SB-relative-indirect- xmode)
4658 ; (.sym src32-24-16-FB-relative-indirect- xmode)
4659 ; )
4660 ; )
4661 ; (define-anyof-operand
4662 ; (name (.sym src32-24-24-indirect- xmode))
4663 ; (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 24"))
4664 ; (attrs (machine 32))
4665 ; (mode xmode)
4666 ; (choices
4667 ; (.sym src32-24-24-An-relative-indirect- xmode)
4668 ; )
4669 ; )
4670 ; (define-anyof-operand
4671 ; (name (.sym src32-24-16-absolute-indirect- xmode))
4672 ; (comment (.str "m32c source operand of size " xmode " 16 bit absolute indirect"))
4673 ; (attrs (machine 32))
4674 ; (mode xmode)
4675 ; (choices
4676 ; (.sym src32-24-16-absolute-indirect-derived- xmode)
4677 ; )
4678 ; )
4679 ; (define-anyof-operand
4680 ; (name (.sym src32-24-24-absolute-indirect- xmode))
4681 ; (comment (.str "m32c source operand of size " xmode " 24 bit absolute indirect"))
4682 ; (attrs (machine 32))
4683 ; (mode xmode)
4684 ; (choices
4685 ; (.sym src32-24-24-absolute-indirect-derived- xmode)
4686 ; )
4687 ; )
4688 )
4689 )
4690
4691 ; (src-24-indirect-operand QI)
4692 ; (src-24-indirect-operand HI)
4693 ; (src-24-indirect-operand SI)
4694
4695 ;-------------------------------------------------------------
4696 ; Destination operands with no additional fields
4697 ;-------------------------------------------------------------
4698
4699 (define-pmacro (dst16-basic-operand xmode)
4700 (begin
4701 (define-anyof-operand
4702 (name (.sym dst16-basic- xmode))
4703 (comment (.str "m16c destination operand of size " xmode " with no additional fields"))
4704 (attrs (machine 16))
4705 (mode xmode)
4706 (choices
4707 (.sym dst16-Rn-direct- xmode)
4708 (.sym dst16-An-direct- xmode)
4709 (.sym dst16-An-indirect- xmode)
4710 )
4711 )
4712 )
4713 )
4714
4715 (dst16-basic-operand QI)
4716 (dst16-basic-operand HI)
4717 (dst16-basic-operand SI)
4718
4719 (define-pmacro (dst32-basic-operand xmode)
4720 (begin
4721 (define-anyof-operand
4722 (name (.sym dst32-basic-Unprefixed- xmode))
4723 (comment (.str "m32c destination operand of size " xmode " with no additional fields"))
4724 (attrs (machine 32))
4725 (mode xmode)
4726 (choices
4727 (.sym dst32-Rn-direct-Unprefixed- xmode)
4728 (.sym dst32-An-direct-Unprefixed- xmode)
4729 (.sym dst32-An-indirect-Unprefixed- xmode)
4730 )
4731 )
4732 (define-anyof-operand
4733 (name (.sym dst32-basic-Prefixed- xmode))
4734 (comment (.str "m32c destination operand of size " xmode " with no additional fields"))
4735 (attrs (machine 32))
4736 (mode xmode)
4737 (choices
4738 (.sym dst32-Rn-direct-Prefixed- xmode)
4739 (.sym dst32-An-direct-Prefixed- xmode)
4740 (.sym dst32-An-indirect-Prefixed- xmode)
4741 )
4742 )
4743 )
4744 )
4745
4746 (dst32-basic-operand QI)
4747 (dst32-basic-operand HI)
4748 (dst32-basic-operand SI)
4749
4750 ;-------------------------------------------------------------
4751 ; Destination operands with possible additional fields at offset 16 bits
4752 ;-------------------------------------------------------------
4753
4754 (define-pmacro (dst16-16-operand xmode)
4755 (begin
4756 (define-anyof-operand
4757 (name (.sym dst16-16- xmode))
4758 (comment (.str "m16c destination operand of size " xmode " with additional fields at offset 16"))
4759 (attrs (machine 16))
4760 (mode xmode)
4761 (choices
4762 (.sym dst16-Rn-direct- xmode)
4763 (.sym dst16-An-direct- xmode)
4764 (.sym dst16-An-indirect- xmode)
4765 (.sym dst16-16-8-An-relative- xmode)
4766 (.sym dst16-16-16-An-relative- xmode)
4767 (.sym dst16-16-8-SB-relative- xmode)
4768 (.sym dst16-16-16-SB-relative- xmode)
4769 (.sym dst16-16-8-FB-relative- xmode)
4770 (.sym dst16-16-16-absolute- xmode)
4771 )
4772 )
4773 (define-anyof-operand
4774 (name (.sym dst16-16-8- xmode))
4775 (comment (.str "m16c destination operand of size " xmode " with additional fields at offset 16"))
4776 (attrs (machine 16))
4777 (mode xmode)
4778 (choices
4779 (.sym dst16-16-8-An-relative- xmode)
4780 (.sym dst16-16-8-SB-relative- xmode)
4781 (.sym dst16-16-8-FB-relative- xmode)
4782 )
4783 )
4784 (define-anyof-operand
4785 (name (.sym dst16-16-16- xmode))
4786 (comment (.str "m16c destination operand of size " xmode " with additional fields at offset 16"))
4787 (attrs (machine 16))
4788 (mode xmode)
4789 (choices
4790 (.sym dst16-16-16-An-relative- xmode)
4791 (.sym dst16-16-16-SB-relative- xmode)
4792 (.sym dst16-16-16-absolute- xmode)
4793 )
4794 )
4795 (define-anyof-operand
4796 (name (.sym dst16-16-16sa- xmode))
4797 (comment (.str "m16c destination operand of size " xmode " with additional fields at offset 16"))
4798 (attrs (machine 16))
4799 (mode xmode)
4800 (choices
4801 (.sym dst16-16-16-SB-relative- xmode)
4802 (.sym dst16-16-16-absolute- xmode)
4803 )
4804 )
4805 (define-anyof-operand
4806 (name (.sym dst16-16-20ar- xmode))
4807 (comment (.str "m16c destination operand of size " xmode " with additional fields at offset 16"))
4808 (attrs (machine 16))
4809 (mode xmode)
4810 (choices
4811 (.sym dst16-16-20-An-relative- xmode)
4812 )
4813 )
4814 )
4815 )
4816
4817 (dst16-16-operand QI)
4818 (dst16-16-operand HI)
4819 (dst16-16-operand SI)
4820
4821 (define-anyof-operand
4822 (name dst16-16-Ext-QI)
4823 (comment "m16c destination operand of size QI for 'ext' insns with additional fields at offset 16")
4824 (attrs (machine 16))
4825 (mode QI)
4826 (choices
4827 dst16-Rn-direct-Ext-QI
4828 dst16-An-indirect-Ext-QI
4829 dst16-16-8-An-relative-Ext-QI
4830 dst16-16-16-An-relative-Ext-QI
4831 dst16-16-8-SB-relative-Ext-QI
4832 dst16-16-16-SB-relative-Ext-QI
4833 dst16-16-8-FB-relative-Ext-QI
4834 dst16-16-16-absolute-Ext-QI
4835 )
4836 )
4837
4838 (define-derived-operand
4839 (name dst16-An-indirect-Mova-HI)
4840 (comment "m16c addressof An indirect destination HI")
4841 (attrs (ISA m16c))
4842 (mode HI)
4843 (args (Dst16An))
4844 (syntax "[$Dst16An]")
4845 (base-ifield f-12-4)
4846 (encoding (+ (f-12-2 1) (f-14-1 1) Dst16An))
4847 (ifield-assertion
4848 (andif (eq f-12-2 1) (eq f-14-1 1)))
4849 (getter Dst16An)
4850 (setter (nop))
4851 )
4852
4853 (define-derived-operand
4854 (name dst16-16-8-An-relative-Mova-HI)
4855 (comment
4856 "m16c addressof dsp:8[An] relative destination HI")
4857 (attrs (ISA m16c))
4858 (mode HI)
4859 (args (Dst16An Dsp-16-u8))
4860 (syntax "${Dsp-16-u8}[$Dst16An]")
4861 (base-ifield f-12-4)
4862 (encoding
4863 (+ (f-12-2 2) (f-14-1 0) Dsp-16-u8 Dst16An))
4864 (ifield-assertion
4865 (andif (eq f-12-2 2) (eq f-14-1 0)))
4866 (getter (add Dsp-16-u8 Dst16An))
4867 (setter (nop))
4868 )
4869 (define-derived-operand
4870 (name dst16-16-16-An-relative-Mova-HI)
4871 (comment
4872 "m16c addressof dsp:16[An] relative destination HI")
4873 (attrs (ISA m16c))
4874 (mode HI)
4875 (args (Dst16An Dsp-16-u16))
4876 (syntax "${Dsp-16-u16}[$Dst16An]")
4877 (base-ifield f-12-4)
4878 (encoding
4879 (+ (f-12-2 3) (f-14-1 0) Dsp-16-u16 Dst16An))
4880 (ifield-assertion
4881 (andif (eq f-12-2 3) (eq f-14-1 0)))
4882 (getter (add Dsp-16-u16 Dst16An))
4883 (setter (nop))
4884 )
4885 (define-derived-operand
4886 (name dst16-16-8-SB-relative-Mova-HI)
4887 (comment
4888 "m16c addressof dsp:8[sb] relative destination HI")
4889 (attrs (ISA m16c))
4890 (mode HI)
4891 (args (Dsp-16-u8))
4892 (syntax "${Dsp-16-u8}[sb]")
4893 (base-ifield f-12-4)
4894 (encoding (+ (f-12-4 10) Dsp-16-u8))
4895 (ifield-assertion (eq f-12-4 10))
4896 (getter (add Dsp-16-u8 (reg h-sb)))
4897 (setter (nop))
4898 )
4899 (define-derived-operand
4900 (name dst16-16-16-SB-relative-Mova-HI)
4901 (comment
4902 "m16c addressof dsp:16[sb] relative destination HI")
4903 (attrs (ISA m16c))
4904 (mode HI)
4905 (args (Dsp-16-u16))
4906 (syntax "${Dsp-16-u16}[sb]")
4907 (base-ifield f-12-4)
4908 (encoding (+ (f-12-4 14) Dsp-16-u16))
4909 (ifield-assertion (eq f-12-4 14))
4910 (getter (add Dsp-16-u16 (reg h-sb)))
4911 (setter (nop))
4912 )
4913 (define-derived-operand
4914 (name dst16-16-8-FB-relative-Mova-HI)
4915 (comment
4916 "m16c addressof dsp:8[fb] relative destination HI")
4917 (attrs (ISA m16c))
4918 (mode HI)
4919 (args (Dsp-16-s8))
4920 (syntax "${Dsp-16-s8}[fb]")
4921 (base-ifield f-12-4)
4922 (encoding (+ (f-12-4 11) Dsp-16-s8))
4923 (ifield-assertion (eq f-12-4 11))
4924 (getter (add Dsp-16-s8 (reg h-fb)))
4925 (setter (nop))
4926 )
4927 (define-derived-operand
4928 (name dst16-16-16-absolute-Mova-HI)
4929 (comment "m16c addressof absolute address HI")
4930 (attrs (ISA m16c))
4931 (mode HI)
4932 (args (Dsp-16-u16))
4933 (syntax "${Dsp-16-u16}")
4934 (base-ifield f-12-4)
4935 (encoding (+ (f-12-4 15) Dsp-16-u16))
4936 (ifield-assertion (eq f-12-4 15))
4937 (getter Dsp-16-u16)
4938 (setter (nop))
4939 )
4940
4941 (define-anyof-operand
4942 (name dst16-16-Mova-HI)
4943 (comment "m16c addressof destination operand of size HI with additional fields at offset 16")
4944 (attrs (machine 16))
4945 (mode HI)
4946 (choices
4947 dst16-An-indirect-Mova-HI
4948 dst16-16-8-An-relative-Mova-HI
4949 dst16-16-16-An-relative-Mova-HI
4950 dst16-16-8-SB-relative-Mova-HI
4951 dst16-16-16-SB-relative-Mova-HI
4952 dst16-16-8-FB-relative-Mova-HI
4953 dst16-16-16-absolute-Mova-HI
4954 )
4955 )
4956
4957 (define-derived-operand
4958 (name dst32-An-indirect-Unprefixed-Mova-SI)
4959 (comment "m32c addressof An indirect destination SI")
4960 (attrs (ISA m32c))
4961 (mode SI)
4962 (args (Dst32AnUnprefixed))
4963 (syntax "[$Dst32AnUnprefixed]")
4964 (base-ifield f-4-6)
4965 (encoding
4966 (+ (f-4-3 0) (f-8-1 0) Dst32AnUnprefixed))
4967 (ifield-assertion
4968 (andif (eq f-4-3 0) (eq f-8-1 0)))
4969 (getter Dst32AnUnprefixed)
4970 (setter (nop))
4971 )
4972
4973 (define-derived-operand
4974 (name dst32-16-8-An-relative-Unprefixed-Mova-SI)
4975 (comment "m32c addressof dsp:8[An] relative destination SI")
4976 (attrs (ISA m32c))
4977 (mode SI)
4978 (args (Dst32AnUnprefixed Dsp-16-u8))
4979 (syntax "${Dsp-16-u8}[$Dst32AnUnprefixed]")
4980 (base-ifield f-4-6)
4981 (encoding
4982 (+ (f-4-3 1)
4983 (f-8-1 0)
4984 Dsp-16-u8
4985 Dst32AnUnprefixed))
4986 (ifield-assertion
4987 (andif (eq f-4-3 1) (eq f-8-1 0)))
4988 (getter (add Dsp-16-u8 Dst32AnUnprefixed))
4989 (setter (nop))
4990 )
4991
4992 (define-derived-operand
4993 (name dst32-16-16-An-relative-Unprefixed-Mova-SI)
4994 (comment
4995 "m32c addressof dsp:16[An] relative destination SI")
4996 (attrs (ISA m32c))
4997 (mode SI)
4998 (args (Dst32AnUnprefixed Dsp-16-u16))
4999 (syntax "${Dsp-16-u16}[$Dst32AnUnprefixed]")
5000 (base-ifield f-4-6)
5001 (encoding
5002 (+ (f-4-3 2)
5003 (f-8-1 0)
5004 Dsp-16-u16
5005 Dst32AnUnprefixed))
5006 (ifield-assertion
5007 (andif (eq f-4-3 2) (eq f-8-1 0)))
5008 (getter (add Dsp-16-u16 Dst32AnUnprefixed))
5009 (setter (nop))
5010 )
5011
5012 (define-derived-operand
5013 (name dst32-16-24-An-relative-Unprefixed-Mova-SI)
5014 (comment "addressof m32c dsp:16[An] relative destination SI")
5015 (attrs (ISA m32c))
5016 (mode SI)
5017 (args (Dst32AnUnprefixed Dsp-16-u24))
5018 (syntax "${Dsp-16-u24}[$Dst32AnUnprefixed]")
5019 (base-ifield f-4-6)
5020 (encoding
5021 (+ (f-4-3 3)
5022 (f-8-1 0)
5023 Dsp-16-u24
5024 Dst32AnUnprefixed))
5025 (ifield-assertion
5026 (andif (eq f-4-3 3) (eq f-8-1 0)))
5027 (getter (add Dsp-16-u24 Dst32AnUnprefixed))
5028 (setter (nop))
5029 )
5030
5031 (define-derived-operand
5032 (name dst32-16-8-SB-relative-Unprefixed-Mova-SI)
5033 (comment "m32c addressof dsp:8[sb] relative destination SI")
5034 (attrs (ISA m32c))
5035 (mode SI)
5036 (args (Dsp-16-u8))
5037 (syntax "${Dsp-16-u8}[sb]")
5038 (base-ifield f-4-6)
5039 (encoding (+ (f-4-3 1) (f-8-2 2) Dsp-16-u8))
5040 (ifield-assertion
5041 (andif (eq f-4-3 1) (eq f-8-2 2)))
5042 (getter (add Dsp-16-u8 (reg h-sb)))
5043 (setter (nop))
5044 )
5045
5046 (define-derived-operand
5047 (name dst32-16-16-SB-relative-Unprefixed-Mova-SI)
5048 (comment "m32c addressof dsp:16[sb] relative destination SI")
5049 (attrs (ISA m32c))
5050 (mode SI)
5051 (args (Dsp-16-u16))
5052 (syntax "${Dsp-16-u16}[sb]")
5053 (base-ifield f-4-6)
5054 (encoding (+ (f-4-3 2) (f-8-2 2) Dsp-16-u16))
5055 (ifield-assertion
5056 (andif (eq f-4-3 2) (eq f-8-2 2)))
5057 (getter (add Dsp-16-u16 (reg h-sb)))
5058 (setter (nop))
5059 )
5060
5061 (define-derived-operand
5062 (name dst32-16-8-FB-relative-Unprefixed-Mova-SI)
5063 (comment "m32c addressof dsp:8[fb] relative destination SI")
5064 (attrs (ISA m32c))
5065 (mode SI)
5066 (args (Dsp-16-s8))
5067 (syntax "${Dsp-16-s8}[fb]")
5068 (base-ifield f-4-6)
5069 (encoding (+ (f-4-3 1) (f-8-2 3) Dsp-16-s8))
5070 (ifield-assertion
5071 (andif (eq f-4-3 1) (eq f-8-2 3)))
5072 (getter (add Dsp-16-s8 (reg h-fb)))
5073 (setter (nop))
5074 )
5075
5076 (define-derived-operand
5077 (name dst32-16-16-FB-relative-Unprefixed-Mova-SI)
5078 (comment "m32c addressof dsp:16[fb] relative destination SI")
5079 (attrs (ISA m32c))
5080 (mode SI)
5081 (args (Dsp-16-s16))
5082 (syntax "${Dsp-16-s16}[fb]")
5083 (base-ifield f-4-6)
5084 (encoding (+ (f-4-3 2) (f-8-2 3) Dsp-16-s16))
5085 (ifield-assertion
5086 (andif (eq f-4-3 2) (eq f-8-2 3)))
5087 (getter (add Dsp-16-s16 (reg h-fb)))
5088 (setter (nop))
5089 )
5090
5091 (define-derived-operand
5092 (name dst32-16-16-absolute-Unprefixed-Mova-SI)
5093 (comment "m32c addressof absolute address SI") (attrs (ISA m32c))
5094 (mode SI)
5095 (args (Dsp-16-u16))
5096 (syntax "${Dsp-16-u16}")
5097 (base-ifield f-4-6)
5098 (encoding (+ (f-4-3 3) (f-8-2 3) Dsp-16-u16))
5099 (ifield-assertion
5100 (andif (eq f-4-3 3) (eq f-8-2 3)))
5101 (getter Dsp-16-u16)
5102 (setter (nop))
5103 )
5104
5105 (define-derived-operand
5106 (name dst32-16-24-absolute-Unprefixed-Mova-SI)
5107 (comment "m32c addressof absolute address SI") (attrs (ISA m32c))
5108 (mode SI)
5109 (args (Dsp-16-u24))
5110 (syntax "${Dsp-16-u24}")
5111 (base-ifield f-4-6)
5112 (encoding (+ (f-4-3 3) (f-8-2 2) Dsp-16-u24))
5113 (ifield-assertion
5114 (andif (eq f-4-3 3) (eq f-8-2 2)))
5115 (getter Dsp-16-u24)
5116 (setter (nop))
5117 )
5118
5119 (define-anyof-operand
5120 (name dst32-16-Unprefixed-Mova-SI)
5121 (comment
5122 "m32c addressof destination operand of size SI with additional fields at offset 16")
5123 (attrs (ISA m32c))
5124 (mode SI)
5125 (choices
5126 dst32-An-indirect-Unprefixed-Mova-SI
5127 dst32-16-8-An-relative-Unprefixed-Mova-SI
5128 dst32-16-16-An-relative-Unprefixed-Mova-SI
5129 dst32-16-24-An-relative-Unprefixed-Mova-SI
5130 dst32-16-8-SB-relative-Unprefixed-Mova-SI
5131 dst32-16-16-SB-relative-Unprefixed-Mova-SI
5132 dst32-16-8-FB-relative-Unprefixed-Mova-SI
5133 dst32-16-16-FB-relative-Unprefixed-Mova-SI
5134 dst32-16-16-absolute-Unprefixed-Mova-SI
5135 dst32-16-24-absolute-Unprefixed-Mova-SI))
5136
5137 (define-pmacro (dst32-16-operand xmode)
5138 (begin
5139 (define-anyof-operand
5140 (name (.sym dst32-16-Unprefixed- xmode))
5141 (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 16"))
5142 (attrs (machine 32))
5143 (mode xmode)
5144 (choices
5145 (.sym dst32-Rn-direct-Unprefixed- xmode)
5146 (.sym dst32-An-direct-Unprefixed- xmode)
5147 (.sym dst32-An-indirect-Unprefixed- xmode)
5148 (.sym dst32-16-8-An-relative-Unprefixed- xmode)
5149 (.sym dst32-16-16-An-relative-Unprefixed- xmode)
5150 (.sym dst32-16-24-An-relative-Unprefixed- xmode)
5151 (.sym dst32-16-8-SB-relative-Unprefixed- xmode)
5152 (.sym dst32-16-16-SB-relative-Unprefixed- xmode)
5153 (.sym dst32-16-8-FB-relative-Unprefixed- xmode)
5154 (.sym dst32-16-16-FB-relative-Unprefixed- xmode)
5155 (.sym dst32-16-16-absolute-Unprefixed- xmode)
5156 (.sym dst32-16-24-absolute-Unprefixed- xmode)
5157 )
5158 )
5159 (define-anyof-operand
5160 (name (.sym dst32-16-8-Unprefixed- xmode))
5161 (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 16"))
5162 (attrs (machine 32))
5163 (mode xmode)
5164 (choices
5165 (.sym dst32-16-8-An-relative-Unprefixed- xmode)
5166 (.sym dst32-16-8-SB-relative-Unprefixed- xmode)
5167 (.sym dst32-16-8-FB-relative-Unprefixed- xmode)
5168 )
5169 )
5170 (define-anyof-operand
5171 (name (.sym dst32-16-16-Unprefixed- xmode))
5172 (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 16"))
5173 (attrs (machine 32))
5174 (mode xmode)
5175 (choices
5176 (.sym dst32-16-16-An-relative-Unprefixed- xmode)
5177 (.sym dst32-16-16-SB-relative-Unprefixed- xmode)
5178 (.sym dst32-16-16-FB-relative-Unprefixed- xmode)
5179 (.sym dst32-16-16-absolute-Unprefixed- xmode)
5180 )
5181 )
5182 (define-anyof-operand
5183 (name (.sym dst32-16-16sa-Unprefixed- xmode))
5184 (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 16"))
5185 (attrs (machine 32))
5186 (mode xmode)
5187 (choices
5188 (.sym dst32-16-16-SB-relative-Unprefixed- xmode)
5189 (.sym dst32-16-16-FB-relative-Unprefixed- xmode)
5190 (.sym dst32-16-16-absolute-Unprefixed- xmode)
5191 )
5192 )
5193 (define-anyof-operand
5194 (name (.sym dst32-16-24-Unprefixed- xmode))
5195 (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 16"))
5196 (attrs (machine 32))
5197 (mode xmode)
5198 (choices
5199 (.sym dst32-16-24-An-relative-Unprefixed- xmode)
5200 (.sym dst32-16-24-absolute-Unprefixed- xmode)
5201 )
5202 )
5203 )
5204 )
5205
5206 (dst32-16-operand QI)
5207 (dst32-16-operand HI)
5208 (dst32-16-operand SI)
5209
5210 (define-pmacro (dst32-16-Ext-operand smode dmode)
5211 (begin
5212 (define-anyof-operand
5213 (name (.sym dst32-16-ExtUnprefixed- smode))
5214 (comment (.str "m32c destination operand of size " smode " with additional fields at offset 16"))
5215 (attrs (machine 32))
5216 (mode dmode)
5217 (choices
5218 (.sym dst32-Rn-direct-ExtUnprefixed- smode)
5219 (.sym dst32-An-direct-Unprefixed- dmode) ; ExtUnprefixed mode not required for this operand -- use the normal dmode version
5220 (.sym dst32-An-indirect-ExtUnprefixed- smode)
5221 (.sym dst32-16-8-An-relative-ExtUnprefixed- smode)
5222 (.sym dst32-16-16-An-relative-ExtUnprefixed- smode)
5223 (.sym dst32-16-24-An-relative-ExtUnprefixed- smode)
5224 (.sym dst32-16-8-SB-relative-ExtUnprefixed- smode)
5225 (.sym dst32-16-16-SB-relative-ExtUnprefixed- smode)
5226 (.sym dst32-16-8-FB-relative-ExtUnprefixed- smode)
5227 (.sym dst32-16-16-FB-relative-ExtUnprefixed- smode)
5228 (.sym dst32-16-16-absolute-ExtUnprefixed- smode)
5229 (.sym dst32-16-24-absolute-ExtUnprefixed- smode)
5230 )
5231 )
5232 )
5233 )
5234
5235 (dst32-16-Ext-operand QI HI)
5236 (dst32-16-Ext-operand HI SI)
5237
5238 (define-anyof-operand
5239 (name dst32-16-Unprefixed-Mulex-HI)
5240 (comment "m32c destination operand of size HI with additional fields at offset 16")
5241 (attrs (machine 32))
5242 (mode HI)
5243 (choices
5244 dst32-R3-direct-Unprefixed-HI
5245 dst32-An-direct-Unprefixed-HI
5246 dst32-An-indirect-Unprefixed-HI
5247 dst32-16-8-An-relative-Unprefixed-HI
5248 dst32-16-16-An-relative-Unprefixed-HI
5249 dst32-16-24-An-relative-Unprefixed-HI
5250 dst32-16-8-SB-relative-Unprefixed-HI
5251 dst32-16-16-SB-relative-Unprefixed-HI
5252 dst32-16-8-FB-relative-Unprefixed-HI
5253 dst32-16-16-FB-relative-Unprefixed-HI
5254 dst32-16-16-absolute-Unprefixed-HI
5255 dst32-16-24-absolute-Unprefixed-HI
5256 )
5257 )
5258 ;-------------------------------------------------------------
5259 ; Destination operands with possible additional fields at offset 24 bits
5260 ;-------------------------------------------------------------
5261
5262 (define-pmacro (dst16-24-operand xmode)
5263 (begin
5264 (define-anyof-operand
5265 (name (.sym dst16-24- xmode))
5266 (comment (.str "m16c destination operand of size " xmode " with additional fields at offset 24"))
5267 (attrs (machine 16))
5268 (mode xmode)
5269 (choices
5270 (.sym dst16-Rn-direct- xmode)
5271 (.sym dst16-An-direct- xmode)
5272 (.sym dst16-An-indirect- xmode)
5273 (.sym dst16-24-8-An-relative- xmode)
5274 (.sym dst16-24-16-An-relative- xmode)
5275 (.sym dst16-24-8-SB-relative- xmode)
5276 (.sym dst16-24-16-SB-relative- xmode)
5277 (.sym dst16-24-8-FB-relative- xmode)
5278 (.sym dst16-24-16-absolute- xmode)
5279 )
5280 )
5281 )
5282 )
5283
5284 (dst16-24-operand QI)
5285 (dst16-24-operand HI)
5286
5287 (define-pmacro (dst32-24-operand xmode)
5288 (begin
5289 (define-anyof-operand
5290 (name (.sym dst32-24-Unprefixed- xmode))
5291 (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 24"))
5292 (attrs (machine 32))
5293 (mode xmode)
5294 (choices
5295 (.sym dst32-Rn-direct-Unprefixed- xmode)
5296 (.sym dst32-An-direct-Unprefixed- xmode)
5297 (.sym dst32-An-indirect-Unprefixed- xmode)
5298 (.sym dst32-24-8-An-relative-Unprefixed- xmode)
5299 (.sym dst32-24-16-An-relative-Unprefixed- xmode)
5300 (.sym dst32-24-24-An-relative-Unprefixed- xmode)
5301 (.sym dst32-24-8-SB-relative-Unprefixed- xmode)
5302 (.sym dst32-24-16-SB-relative-Unprefixed- xmode)
5303 (.sym dst32-24-8-FB-relative-Unprefixed- xmode)
5304 (.sym dst32-24-16-FB-relative-Unprefixed- xmode)
5305 (.sym dst32-24-16-absolute-Unprefixed- xmode)
5306 (.sym dst32-24-24-absolute-Unprefixed- xmode)
5307 )
5308 )
5309 (define-anyof-operand
5310 (name (.sym dst32-24-Prefixed- xmode))
5311 (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 24"))
5312 (attrs (machine 32))
5313 (mode xmode)
5314 (choices
5315 (.sym dst32-Rn-direct-Prefixed- xmode)
5316 (.sym dst32-An-direct-Prefixed- xmode)
5317 (.sym dst32-An-indirect-Prefixed- xmode)
5318 (.sym dst32-24-8-An-relative-Prefixed- xmode)
5319 (.sym dst32-24-16-An-relative-Prefixed- xmode)
5320 (.sym dst32-24-24-An-relative-Prefixed- xmode)
5321 (.sym dst32-24-8-SB-relative-Prefixed- xmode)
5322 (.sym dst32-24-16-SB-relative-Prefixed- xmode)
5323 (.sym dst32-24-8-FB-relative-Prefixed- xmode)
5324 (.sym dst32-24-16-FB-relative-Prefixed- xmode)
5325 (.sym dst32-24-16-absolute-Prefixed- xmode)
5326 (.sym dst32-24-24-absolute-Prefixed- xmode)
5327 )
5328 )
5329 (define-anyof-operand
5330 (name (.sym dst32-24-8-Prefixed- xmode))
5331 (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 24"))
5332 (attrs (machine 32))
5333 (mode xmode)
5334 (choices
5335 (.sym dst32-24-8-An-relative-Prefixed- xmode)
5336 (.sym dst32-24-8-SB-relative-Prefixed- xmode)
5337 (.sym dst32-24-8-FB-relative-Prefixed- xmode)
5338 )
5339 )
5340 (define-anyof-operand
5341 (name (.sym dst32-24-16-Prefixed- xmode))
5342 (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 24"))
5343 (attrs (machine 32))
5344 (mode xmode)
5345 (choices
5346 (.sym dst32-24-16-An-relative-Prefixed- xmode)
5347 (.sym dst32-24-16-SB-relative-Prefixed- xmode)
5348 (.sym dst32-24-16-FB-relative-Prefixed- xmode)
5349 (.sym dst32-24-16-absolute-Prefixed- xmode)
5350 )
5351 )
5352 (define-anyof-operand
5353 (name (.sym dst32-24-24-Prefixed- xmode))
5354 (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 24"))
5355 (attrs (machine 32))
5356 (mode xmode)
5357 (choices
5358 (.sym dst32-24-24-An-relative-Prefixed- xmode)
5359 (.sym dst32-24-24-absolute-Prefixed- xmode)
5360 )
5361 )
5362 ; (define-anyof-operand
5363 ; (name (.sym dst32-24-indirect- xmode))
5364 ; (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 24"))
5365 ; (attrs (machine 32))
5366 ; (mode xmode)
5367 ; (choices
5368 ; (.sym dst32-An-indirect-indirect- xmode)
5369 ; (.sym dst32-24-8-An-relative-indirect- xmode)
5370 ; (.sym dst32-24-16-An-relative-indirect- xmode)
5371 ; (.sym dst32-24-24-An-relative-indirect- xmode)
5372 ; (.sym dst32-24-8-SB-relative-indirect- xmode)
5373 ; (.sym dst32-24-16-SB-relative-indirect- xmode)
5374 ; (.sym dst32-24-8-FB-relative-indirect- xmode)
5375 ; (.sym dst32-24-16-FB-relative-indirect- xmode)
5376 ; )
5377 ; )
5378 ; (define-anyof-operand
5379 ; (name (.sym dst32-basic-indirect- xmode))
5380 ; (comment (.str "m32c destination operand of size " xmode " with no additional fields"))
5381 ; (attrs (machine 32))
5382 ; (mode xmode)
5383 ; (choices
5384 ; (.sym dst32-An-indirect-indirect- xmode)
5385 ; )
5386 ; )
5387 ; (define-anyof-operand
5388 ; (name (.sym dst32-24-8-indirect- xmode))
5389 ; (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 24"))
5390 ; (attrs (machine 32))
5391 ; (mode xmode)
5392 ; (choices
5393 ; (.sym dst32-24-8-An-relative-indirect- xmode)
5394 ; (.sym dst32-24-8-SB-relative-indirect- xmode)
5395 ; (.sym dst32-24-8-FB-relative-indirect- xmode)
5396 ; )
5397 ; )
5398 ; (define-anyof-operand
5399 ; (name (.sym dst32-24-16-indirect- xmode))
5400 ; (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 24"))
5401 ; (attrs (machine 32))
5402 ; (mode xmode)
5403 ; (choices
5404 ; (.sym dst32-24-16-An-relative-indirect- xmode)
5405 ; (.sym dst32-24-16-SB-relative-indirect- xmode)
5406 ; (.sym dst32-24-16-FB-relative-indirect- xmode)
5407 ; )
5408 ; )
5409 ; (define-anyof-operand
5410 ; (name (.sym dst32-24-24-indirect- xmode))
5411 ; (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 24"))
5412 ; (attrs (machine 32))
5413 ; (mode xmode)
5414 ; (choices
5415 ; (.sym dst32-24-24-An-relative-indirect- xmode)
5416 ; )
5417 ; )
5418 ; (define-anyof-operand
5419 ; (name (.sym dst32-24-absolute-indirect- xmode))
5420 ; (comment (.str "m32c destination operand of size " xmode " absolute indirect"))
5421 ; (attrs (machine 32))
5422 ; (mode xmode)
5423 ; (choices
5424 ; (.sym dst32-24-16-absolute-indirect-derived- xmode)
5425 ; (.sym dst32-24-24-absolute-indirect-derived- xmode)
5426 ; )
5427 ; )
5428 ; (define-anyof-operand
5429 ; (name (.sym dst32-24-16-absolute-indirect- xmode))
5430 ; (comment (.str "m32c destination operand of size " xmode " absolute indirect"))
5431 ; (attrs (machine 32))
5432 ; (mode xmode)
5433 ; (choices
5434 ; (.sym dst32-24-16-absolute-indirect-derived- xmode)
5435 ; )
5436 ; )
5437 ; (define-anyof-operand
5438 ; (name (.sym dst32-24-24-absolute-indirect- xmode))
5439 ; (comment (.str "m32c destination operand of size " xmode " absolute indirect"))
5440 ; (attrs (machine 32))
5441 ; (mode xmode)
5442 ; (choices
5443 ; (.sym dst32-24-24-absolute-indirect-derived- xmode)
5444 ; )
5445 ; )
5446 )
5447 )
5448
5449 (dst32-24-operand QI)
5450 (dst32-24-operand HI)
5451 (dst32-24-operand SI)
5452
5453 ;-------------------------------------------------------------
5454 ; Destination operands with possible additional fields at offset 32 bits
5455 ;-------------------------------------------------------------
5456
5457 (define-pmacro (dst16-32-operand xmode)
5458 (begin
5459 (define-anyof-operand
5460 (name (.sym dst16-32- xmode))
5461 (comment (.str "m16c destination operand of size " xmode " with additional fields at offset 32"))
5462 (attrs (machine 16))
5463 (mode xmode)
5464 (choices
5465 (.sym dst16-Rn-direct- xmode)
5466 (.sym dst16-An-direct- xmode)
5467 (.sym dst16-An-indirect- xmode)
5468 (.sym dst16-32-8-An-relative- xmode)
5469 (.sym dst16-32-16-An-relative- xmode)
5470 (.sym dst16-32-8-SB-relative- xmode)
5471 (.sym dst16-32-16-SB-relative- xmode)
5472 (.sym dst16-32-8-FB-relative- xmode)
5473 (.sym dst16-32-16-absolute- xmode)
5474 )
5475 )
5476 )
5477 )
5478 (dst16-32-operand QI)
5479 (dst16-32-operand HI)
5480
5481 ; This macro actually handles operands at offset 32, 40 and 48 bits
5482 (define-pmacro (dst32-32plus-operand offset xmode)
5483 (begin
5484 (define-anyof-operand
5485 (name (.sym dst32- offset -Unprefixed- xmode))
5486 (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 32"))
5487 (attrs (machine 32))
5488 (mode xmode)
5489 (choices
5490 (.sym dst32-Rn-direct-Unprefixed- xmode)
5491 (.sym dst32-An-direct-Unprefixed- xmode)
5492 (.sym dst32-An-indirect-Unprefixed- xmode)
5493 (.sym dst32- offset -8-An-relative-Unprefixed- xmode)
5494 (.sym dst32- offset -16-An-relative-Unprefixed- xmode)
5495 (.sym dst32- offset -24-An-relative-Unprefixed- xmode)
5496 (.sym dst32- offset -8-SB-relative-Unprefixed- xmode)
5497 (.sym dst32- offset -16-SB-relative-Unprefixed- xmode)
5498 (.sym dst32- offset -8-FB-relative-Unprefixed- xmode)
5499 (.sym dst32- offset -16-FB-relative-Unprefixed- xmode)
5500 (.sym dst32- offset -16-absolute-Unprefixed- xmode)
5501 (.sym dst32- offset -24-absolute-Unprefixed- xmode)
5502 )
5503 )
5504 (define-anyof-operand
5505 (name (.sym dst32- offset -Prefixed- xmode))
5506 (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 32"))
5507 (attrs (machine 32))
5508 (mode xmode)
5509 (choices
5510 (.sym dst32-Rn-direct-Prefixed- xmode)
5511 (.sym dst32-An-direct-Prefixed- xmode)
5512 (.sym dst32-An-indirect-Prefixed- xmode)
5513 (.sym dst32- offset -8-An-relative-Prefixed- xmode)
5514 (.sym dst32- offset -16-An-relative-Prefixed- xmode)
5515 (.sym dst32- offset -24-An-relative-Prefixed- xmode)
5516 (.sym dst32- offset -8-SB-relative-Prefixed- xmode)
5517 (.sym dst32- offset -16-SB-relative-Prefixed- xmode)
5518 (.sym dst32- offset -8-FB-relative-Prefixed- xmode)
5519 (.sym dst32- offset -16-FB-relative-Prefixed- xmode)
5520 (.sym dst32- offset -16-absolute-Prefixed- xmode)
5521 (.sym dst32- offset -24-absolute-Prefixed- xmode)
5522 )
5523 )
5524 ; (define-anyof-operand
5525 ; (name (.sym dst32- offset -indirect- xmode))
5526 ; (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 32"))
5527 ; (attrs (machine 32))
5528 ; (mode xmode)
5529 ; (choices
5530 ; (.sym dst32-An-indirect-indirect- xmode)
5531 ; (.sym dst32- offset -8-An-relative-indirect- xmode)
5532 ; (.sym dst32- offset -16-An-relative-indirect- xmode)
5533 ; (.sym dst32- offset -24-An-relative-indirect- xmode)
5534 ; (.sym dst32- offset -8-SB-relative-indirect- xmode)
5535 ; (.sym dst32- offset -16-SB-relative-indirect- xmode)
5536 ; (.sym dst32- offset -8-FB-relative-indirect- xmode)
5537 ; (.sym dst32- offset -16-FB-relative-indirect- xmode)
5538 ; )
5539 ; )
5540 ; (define-anyof-operand
5541 ; (name (.sym dst32- offset -absolute-indirect- xmode))
5542 ; (comment (.str "m32c destination operand of size " xmode " absolute indirect"))
5543 ; (attrs (machine 32))
5544 ; (mode xmode)
5545 ; (choices
5546 ; (.sym dst32- offset -16-absolute-indirect-derived- xmode)
5547 ; (.sym dst32- offset -24-absolute-indirect-derived- xmode)
5548 ; )
5549 ; )
5550 )
5551 )
5552
5553 (dst32-32plus-operand 32 QI)
5554 (dst32-32plus-operand 32 HI)
5555 (dst32-32plus-operand 32 SI)
5556 (dst32-32plus-operand 40 QI)
5557 (dst32-32plus-operand 40 HI)
5558 (dst32-32plus-operand 40 SI)
5559
5560 ;-------------------------------------------------------------
5561 ; Destination operands with possible additional fields at offset 48 bits
5562 ;-------------------------------------------------------------
5563
5564 (define-pmacro (dst32-48-operand offset xmode)
5565 (begin
5566 (define-anyof-operand
5567 (name (.sym dst32- offset -Prefixed- xmode))
5568 (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 32"))
5569 (attrs (machine 32))
5570 (mode xmode)
5571 (choices
5572 (.sym dst32-Rn-direct-Prefixed- xmode)
5573 (.sym dst32-An-direct-Prefixed- xmode)
5574 (.sym dst32-An-indirect-Prefixed- xmode)
5575 (.sym dst32- offset -8-An-relative-Prefixed- xmode)
5576 (.sym dst32- offset -16-An-relative-Prefixed- xmode)
5577 (.sym dst32- offset -24-An-relative-Prefixed- xmode)
5578 (.sym dst32- offset -8-SB-relative-Prefixed- xmode)
5579 (.sym dst32- offset -16-SB-relative-Prefixed- xmode)
5580 (.sym dst32- offset -8-FB-relative-Prefixed- xmode)
5581 (.sym dst32- offset -16-FB-relative-Prefixed- xmode)
5582 (.sym dst32- offset -16-absolute-Prefixed- xmode)
5583 (.sym dst32- offset -24-absolute-Prefixed- xmode)
5584 )
5585 )
5586 ; (define-anyof-operand
5587 ; (name (.sym dst32- offset -indirect- xmode))
5588 ; (comment (.str "m32c destination operand of size " xmode " with additional fields at offset 32"))
5589 ; (attrs (machine 32))
5590 ; (mode xmode)
5591 ; (choices
5592 ; (.sym dst32-An-indirect-indirect- xmode)
5593 ; (.sym dst32- offset -8-An-relative-indirect- xmode)
5594 ; (.sym dst32- offset -16-An-relative-indirect- xmode)
5595 ; (.sym dst32- offset -24-An-relative-indirect- xmode)
5596 ; (.sym dst32- offset -8-SB-relative-indirect- xmode)
5597 ; (.sym dst32- offset -16-SB-relative-indirect- xmode)
5598 ; (.sym dst32- offset -8-FB-relative-indirect- xmode)
5599 ; (.sym dst32- offset -16-FB-relative-indirect- xmode)
5600 ; )
5601 ; )
5602 ; (define-anyof-operand
5603 ; (name (.sym dst32- offset -absolute-indirect- xmode))
5604 ; (comment (.str "m32c destination operand of size " xmode " absolute indirect"))
5605 ; (attrs (machine 32))
5606 ; (mode xmode)
5607 ; (choices
5608 ; (.sym dst32- offset -16-absolute-indirect-derived- xmode)
5609 ; (.sym dst32- offset -24-absolute-indirect-derived- xmode)
5610 ; )
5611 ; )
5612 )
5613 )
5614
5615 (dst32-48-operand 48 QI)
5616 (dst32-48-operand 48 HI)
5617 (dst32-48-operand 48 SI)
5618
5619 ;-------------------------------------------------------------
5620 ; Bit operands for m16c
5621 ;-------------------------------------------------------------
5622
5623 (define-pmacro (bit16-operand offset)
5624 (begin
5625 (define-anyof-operand
5626 (name (.sym bit16- offset))
5627 (comment (.str "m16c bit operand with possible additional fields at offset 24"))
5628 (attrs (machine 16))
5629 (mode BI)
5630 (choices
5631 bit16-Rn-direct
5632 bit16-An-direct
5633 bit16-An-indirect
5634 (.sym bit16- offset -8-An-relative)
5635 (.sym bit16- offset -16-An-relative)
5636 (.sym bit16- offset -8-SB-relative)
5637 (.sym bit16- offset -16-SB-relative)
5638 (.sym bit16- offset -8-FB-relative)
5639 (.sym bit16- offset -16-absolute)
5640 )
5641 )
5642 (define-anyof-operand
5643 (name (.sym bit16- offset -basic))
5644 (comment (.str "m16c bit operand with no additional fields"))
5645 (attrs (machine 16))
5646 (mode BI)
5647 (choices
5648 bit16-An-indirect
5649 )
5650 )
5651 (define-anyof-operand
5652 (name (.sym bit16- offset -8))
5653 (comment (.str "m16c bit operand with possible additional fields at offset 24"))
5654 (attrs (machine 16))
5655 (mode BI)
5656 (choices
5657 bit16-Rn-direct
5658 bit16-An-direct
5659 (.sym bit16- offset -8-An-relative)
5660 (.sym bit16- offset -8-SB-relative)
5661 (.sym bit16- offset -8-FB-relative)
5662 )
5663 )
5664 (define-anyof-operand
5665 (name (.sym bit16- offset -16))
5666 (comment (.str "m16c bit operand with possible additional fields at offset 24"))
5667 (attrs (machine 16))
5668 (mode BI)
5669 (choices
5670 (.sym bit16- offset -16-An-relative)
5671 (.sym bit16- offset -16-SB-relative)
5672 (.sym bit16- offset -16-absolute)
5673 )
5674 )
5675 )
5676 )
5677
5678 (bit16-operand 16)
5679
5680 ;-------------------------------------------------------------
5681 ; Bit operands for m32c
5682 ;-------------------------------------------------------------
5683
5684 (define-pmacro (bit32-operand offset group)
5685 (begin
5686 (define-anyof-operand
5687 (name (.sym bit32- offset - group))
5688 (comment (.str "m32c bit operand with possible additional fields at offset 24"))
5689 (attrs (machine 32))
5690 (mode BI)
5691 (choices
5692 (.sym bit32-Rn-direct- group)
5693 (.sym bit32-An-direct- group)
5694 (.sym bit32-An-indirect- group)
5695 (.sym bit32- offset -11-An-relative- group)
5696 (.sym bit32- offset -19-An-relative- group)
5697 (.sym bit32- offset -27-An-relative- group)
5698 (.sym bit32- offset -11-SB-relative- group)
5699 (.sym bit32- offset -19-SB-relative- group)
5700 (.sym bit32- offset -11-FB-relative- group)
5701 (.sym bit32- offset -19-FB-relative- group)
5702 (.sym bit32- offset -19-absolute- group)
5703 (.sym bit32- offset -27-absolute- group)
5704 )
5705 )
5706 )
5707 )
5708
5709 (bit32-operand 16 Unprefixed)
5710 (bit32-operand 24 Prefixed)
5711
5712 (define-anyof-operand
5713 (name bit32-basic-Unprefixed)
5714 (comment "m32c bit operand with no additional fields")
5715 (attrs (machine 32))
5716 (mode BI)
5717 (choices
5718 bit32-Rn-direct-Unprefixed
5719 bit32-An-direct-Unprefixed
5720 bit32-An-indirect-Unprefixed
5721 )
5722 )
5723
5724 (define-anyof-operand
5725 (name bit32-16-8-Unprefixed)
5726 (comment "m32c bit operand with 8 bit additional fields")
5727 (attrs (machine 32))
5728 (mode BI)
5729 (choices
5730 bit32-16-11-An-relative-Unprefixed
5731 bit32-16-11-SB-relative-Unprefixed
5732 bit32-16-11-FB-relative-Unprefixed
5733 )
5734 )
5735
5736 (define-anyof-operand
5737 (name bit32-16-16-Unprefixed)
5738 (comment "m32c bit operand with 16 bit additional fields")
5739 (attrs (machine 32))
5740 (mode BI)
5741 (choices
5742 bit32-16-19-An-relative-Unprefixed
5743 bit32-16-19-SB-relative-Unprefixed
5744 bit32-16-19-FB-relative-Unprefixed
5745 bit32-16-19-absolute-Unprefixed
5746 )
5747 )
5748
5749 (define-anyof-operand
5750 (name bit32-16-24-Unprefixed)
5751 (comment "m32c bit operand with 24 bit additional fields")
5752 (attrs (machine 32))
5753 (mode BI)
5754 (choices
5755 bit32-16-27-An-relative-Unprefixed
5756 bit32-16-27-absolute-Unprefixed
5757 )
5758 )
5759
5760 ;-------------------------------------------------------------
5761 ; Operands for short format binary insns
5762 ;-------------------------------------------------------------
5763
5764 (define-anyof-operand
5765 (name src16-2-S)
5766 (comment "m16c source operand of size QI for short format insns")
5767 (attrs (machine 16))
5768 (mode QI)
5769 (choices
5770 src16-2-S-8-SB-relative-QI
5771 src16-2-S-8-FB-relative-QI
5772 src16-2-S-16-absolute-QI
5773 )
5774 )
5775
5776 (define-anyof-operand
5777 (name src32-2-S-QI)
5778 (comment "m32c source operand of size QI for short format insns")
5779 (attrs (machine 32))
5780 (mode QI)
5781 (choices
5782 src32-2-S-8-SB-relative-QI
5783 src32-2-S-8-FB-relative-QI
5784 src32-2-S-16-absolute-QI
5785 )
5786 )
5787
5788 (define-anyof-operand
5789 (name src32-2-S-HI)
5790 (comment "m32c source operand of size QI for short format insns")
5791 (attrs (machine 32))
5792 (mode HI)
5793 (choices
5794 src32-2-S-8-SB-relative-HI
5795 src32-2-S-8-FB-relative-HI
5796 src32-2-S-16-absolute-HI
5797 )
5798 )
5799
5800 (define-anyof-operand
5801 (name Dst16-3-S-8)
5802 (comment "m16c destination operand of size QI for short format insns")
5803 (attrs (machine 16))
5804 (mode QI)
5805 (choices
5806 dst16-3-S-R0l-direct-QI
5807 dst16-3-S-R0h-direct-QI
5808 dst16-3-S-8-8-SB-relative-QI
5809 dst16-3-S-8-8-FB-relative-QI
5810 dst16-3-S-8-16-absolute-QI
5811 )
5812 )
5813
5814 (define-anyof-operand
5815 (name Dst16-3-S-16)
5816 (comment "m16c destination operand of size QI for short format insns")
5817 (attrs (machine 16))
5818 (mode QI)
5819 (choices
5820 dst16-3-S-R0l-direct-QI
5821 dst16-3-S-R0h-direct-QI
5822 dst16-3-S-16-8-SB-relative-QI
5823 dst16-3-S-16-8-FB-relative-QI
5824 dst16-3-S-16-16-absolute-QI
5825 )
5826 )
5827
5828 (define-anyof-operand
5829 (name srcdst16-r0l-r0h-S)
5830 (comment "m16c r0l/r0h operand of size QI for short format insns")
5831 (attrs (machine 16))
5832 (mode SI)
5833 (choices
5834 srcdst16-r0l-r0h-S-derived
5835 )
5836 )
5837
5838 (define-anyof-operand
5839 (name dst32-2-S-basic-QI)
5840 (comment "m32c r0l operand of size QI for short format binary insns")
5841 (attrs (machine 32))
5842 (mode QI)
5843 (choices
5844 dst32-2-S-R0l-direct-QI
5845 )
5846 )
5847
5848 (define-anyof-operand
5849 (name dst32-2-S-basic-HI)
5850 (comment "m32c r0 operand of size HI for short format binary insns")
5851 (attrs (machine 32))
5852 (mode HI)
5853 (choices
5854 dst32-2-S-R0-direct-HI
5855 )
5856 )
5857
5858 (define-pmacro (dst32-2-S-operands xmode)
5859 (begin
5860 (define-anyof-operand
5861 (name (.sym dst32-2-S-8- xmode))
5862 (comment "m32c operand of size " xmode " for short format binary insns")
5863 (attrs (machine 32))
5864 (mode xmode)
5865 (choices
5866 (.sym dst32-2-S-8-SB-relative- xmode)
5867 (.sym dst32-2-S-8-FB-relative- xmode)
5868 )
5869 )
5870 (define-anyof-operand
5871 (name (.sym dst32-2-S-16- xmode))
5872 (comment "m32c operand of size " xmode " for short format binary insns")
5873 (attrs (machine 32))
5874 (mode xmode)
5875 (choices
5876 (.sym dst32-2-S-16-absolute- xmode)
5877 )
5878 )
5879 ; (define-anyof-operand
5880 ; (name (.sym dst32-2-S-8-indirect- xmode))
5881 ; (comment "m32c operand of size " xmode " for short format binary insns")
5882 ; (attrs (machine 32))
5883 ; (mode xmode)
5884 ; (choices
5885 ; (.sym dst32-2-S-8-SB-relative-indirect- xmode)
5886 ; (.sym dst32-2-S-8-FB-relative-indirect- xmode)
5887 ; )
5888 ; )
5889 ; (define-anyof-operand
5890 ; (name (.sym dst32-2-S-absolute-indirect- xmode))
5891 ; (comment "m32c operand of size " xmode " for short format binary insns")
5892 ; (attrs (machine 32))
5893 ; (mode xmode)
5894 ; (choices
5895 ; (.sym dst32-2-S-16-absolute-indirect- xmode)
5896 ; )
5897 ; )
5898 )
5899 )
5900
5901 (dst32-2-S-operands QI)
5902 (dst32-2-S-operands HI)
5903 (dst32-2-S-operands SI)
5904
5905 (define-anyof-operand
5906 (name dst32-an-S)
5907 (comment "m32c An operand for short format binary insns")
5908 (attrs (machine 32))
5909 (mode HI)
5910 (choices
5911 dst32-1-S-A0-direct-HI
5912 dst32-1-S-A1-direct-HI
5913 )
5914 )
5915
5916 (define-anyof-operand
5917 (name bit16-11-S)
5918 (comment "m16c bit operand for short format insns")
5919 (attrs (machine 16))
5920 (mode BI)
5921 (choices
5922 bit16-11-SB-relative-S
5923 )
5924 )
5925
5926 (define-anyof-operand
5927 (name Rn16-push-S-anyof)
5928 (comment "m16c bit operand for short format insns")
5929 (attrs (machine 16))
5930 (mode QI)
5931 (choices
5932 Rn16-push-S-derived
5933 )
5934 )
5935
5936 (define-anyof-operand
5937 (name An16-push-S-anyof)
5938 (comment "m16c bit operand for short format insns")
5939 (attrs (machine 16))
5940 (mode HI)
5941 (choices
5942 An16-push-S-derived
5943 )
5944 )
5945
5946 ;=============================================================
5947 ; Common macros for instruction definitions
5948 ;
5949 (define-pmacro (set-z x)
5950 (sequence ()
5951 (set zbit (zflag x)))
5952
5953 )
5954
5955 (define-pmacro (set-s x)
5956 (sequence ()
5957 (set sbit (nflag x)))
5958 )
5959
5960 (define-pmacro (set-z-and-s x)
5961 (sequence ()
5962 (set-z x)
5963 (set-s x))
5964 )
5965
5967 ;=============================================================
5968 ; Unary insn macros
5969 ;-------------------------------------------------------------
5970
5971 (define-pmacro (unary-insn-defn-g mach group mode wstr op encoding sem opg)
5972 (dni (.sym op mach wstr - group)
5973 (.str op wstr opg " dst" mach "-" group "-" mode)
5974 ((machine mach) RL_1ADDR)
5975 (.str op wstr opg " ${dst" mach "-" group "-" mode "}")
5976 encoding
5977 (sem mode (.sym dst mach - group - mode))
5978 ())
5979 )
5980
5981 (define-pmacro (unary-insn-defn mach group mode wstr op encoding sem)
5982 (unary-insn-defn-g mach group mode wstr op encoding sem "")
5983 )
5984
5985
5986 (define-pmacro (unary16-defn-g mode wstr wbit op opc1 opc2 opc3 sem opg)
5987 (unary-insn-defn-g 16 16 mode wstr op
5988 (+ opc1 opc2 (f-7-1 wbit) opc3 (.sym dst16-16- mode))
5989 sem opg)
5990 )
5991 (define-pmacro (unary16-defn mode wstr wbit op opc1 opc2 opc3 sem)
5992 (unary-16-defn-g mode wstr wbit op opc1 opc2 opc3 sem "")
5993 )
5994
5995 (define-pmacro (unary32-defn-g mode wstr wbit op opc1 opc2 opc3 sem opg)
5996 (begin
5997 ; Multi insns are tried for assembly in the reverse order in which they appear here, so
5998 ; define the absolute-indirect insns first in order to prevent them from being selected
5999 ; when the mode is register-indirect
6000 ; (unary-insn-defn 32 24-absolute-indirect mode wstr op
6001 ; (+ (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))
6002 ; sem)
6003 (unary-insn-defn-g 32 16-Unprefixed mode wstr op
6004 (+ (f-0-4 opc1) (f-7-1 wbit) (.sym dst32-16-Unprefixed- mode) (f-10-2 opc2) (f-12-4 opc3))
6005 sem opg)
6006 ; (unary-insn-defn 32 24-indirect mode wstr op
6007 ; (+ (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))
6008 ; sem)
6009 )
6010 )
6011 (define-pmacro (unary32-defn mode wstr wbit op opc1 opc2 opc3 sem)
6012 (unary32-defn-g mode wstr wbit op opc1 opc2 opc3 sem "")
6013 )
6014
6015 (define-pmacro (unary-insn-mach-g mach op opc1 opc2 opc3 sem opg)
6016 (begin
6017 (.apply (.sym unary mach -defn-g) (QI .b 0 op opc1 opc2 opc3 sem opg))
6018 (.apply (.sym unary mach -defn-g) (HI .w 1 op opc1 opc2 opc3 sem opg))
6019 )
6020 )
6021 (define-pmacro (unary-insn-mach mach op opc1 opc2 opc3 sem)
6022 (unary-insn-mach-g mach op opc1 opc2 opc3 sem "")
6023 )
6024
6025 (define-pmacro (unary-insn op opc16-1 opc16-2 opc16-3 opc32-1 opc32-2 opc32-3 sem)
6026 (begin
6027 (unary-insn-mach-g 16 op opc16-1 opc16-2 opc16-3 sem "")
6028 (unary-insn-mach-g 32 op opc32-1 opc32-2 opc32-3 sem "")
6029 )
6030 )
6031
6032 (define-pmacro (unary-insn-g op opc16-1 opc16-2 opc16-3 opc32-1 opc32-2 opc32-3 sem)
6033 (begin
6034 (unary-insn-mach-g 16 op opc16-1 opc16-2 opc16-3 sem "$G")
6035 (unary-insn-mach-g 32 op opc32-1 opc32-2 opc32-3 sem "$G")
6036 )
6037 )
6038
6039 ;-------------------------------------------------------------
6040 ; Sign/zero extension macros
6041 ;-------------------------------------------------------------
6042
6043 (define-pmacro (ext-insn-defn mach group smode dmode wstr op encoding sem)
6044 (dni (.sym op mach wstr - group)
6045 (.str op wstr " dst" mach "-" group "-" smode)
6046 ((machine mach))
6047 (.str op wstr " ${dst" mach "-" group "-" smode "}")
6048 encoding
6049 (sem smode dmode (.sym dst mach - group - smode) (.sym dst mach - group - smode))
6050 ())
6051 )
6052
6053 (define-pmacro (ext16-defn smode dmode wstr wbit op opc1 opc2 opc3 sem)
6054 (ext-insn-defn 16 16-Ext smode dmode wstr op
6055 (+ opc1 opc2 (f-7-1 wbit) opc3 (.sym dst16-16-Ext- smode))
6056 sem)
6057 )
6058
6059 (define-pmacro (ext32-defn smode dmode wstr wbit op opc1 opc2 opc3 sem)
6060 (ext-insn-defn 32 16-ExtUnprefixed smode dmode wstr op
6061 (+ opc1 opc2 (f-7-1 wbit) opc3 (.sym dst32-16-ExtUnprefixed- smode))
6062 sem)
6063 )
6064
6065 (define-pmacro (ext32-binary-insn src-group dst-group op wstr encoding sem)
6066 (dni (.sym op 32 wstr - src-group - dst-group)
6067 (.str op 32 wstr " src32-" src-group "-QI,dst32-" dst-group "-HI")
6068 ((machine 32))
6069 (.str op wstr " ${src32-" src-group "-QI},${dst32-" dst-group "-HI}")
6070 encoding
6071 (sem QI HI (.sym src32- src-group -QI) (.sym dst32 - dst-group -HI))
6072 ())
6073 )
6074
6075 (define-pmacro (ext32-binary-defn op wstr opc1 opc2 sem)
6076 (begin
6077 (ext32-binary-insn basic-ExtPrefixed 24-Prefixed op wstr
6078 (+ (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))
6079 sem)
6080 (ext32-binary-insn 24-24-Prefixed 48-Prefixed op wstr
6081 (+ (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))
6082 sem)
6083 (ext32-binary-insn 24-16-Prefixed 40-Prefixed op wstr
6084 (+ (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))
6085 sem)
6086 (ext32-binary-insn 24-8-Prefixed 32-Prefixed op wstr
6087 (+ (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))
6088 sem)
6089 )
6090 )
6091
6092 ;=============================================================
6093 ; Binary Arithmetic macros
6094 ;
6095 ;-------------------------------------------------------------
6096 ;<arith>.size:S src2,r0[l] -- for m32c
6097 ;-------------------------------------------------------------
6098
6099 (define-pmacro (binary-arith32-S-src2 op xmode wstr wbit opc1 opc2 sem)
6100 (dni (.sym op 32 wstr .S-src2-r0- xmode)
6101 (.str op 32 wstr ":S src2,r0[l]")
6102 ((machine 32))
6103 (.str op wstr"$S ${src32-2-S-" xmode "},${Dst32R0" xmode "-S}")
6104 (+ opc1 opc2 (.sym src32-2-S- xmode) (f-7-1 wbit))
6105 (sem xmode (.sym src32-2-S- xmode) (.sym Dst32R0 xmode -S))
6106 ())
6107 )
6108
6109 ;-------------------------------------------------------------
6110 ;<arith>.b:S src2,r0l/r0h -- for m16c
6111 ;-------------------------------------------------------------
6112
6113 (define-pmacro (binary-arith16-b-S-src2 op opc1 opc2 sem)
6114 (begin
6115 (dni (.sym op 16 .b.S-src2)
6116 (.str op ".b:S src2,r0[lh]")
6117 ((machine 16))
6118 (.str op ".b$S ${src16-2-S},${Dst16RnQI-S}")
6119 (+ opc1 opc2 Dst16RnQI-S src16-2-S)
6120 (sem QI src16-2-S Dst16RnQI-S)
6121 ())
6122 (dni (.sym op 16 .b.S-r0l-r0h)
6123 (.str op ".b:S r0l/r0h")
6124 ((machine 16))
6125 (.str op ".b$S ${srcdst16-r0l-r0h-S}")
6126 (+ opc1 opc2 srcdst16-r0l-r0h-S)
6127 (if (eq srcdst16-r0l-r0h-S 0)
6128 (sem QI R0h R0l)
6129 (sem QI R0l R0h))
6130 ())
6131 )
6132 )
6133
6134 ;-------------------------------------------------------------
6135 ;<arith>.b:S #imm8,dst3 -- for m16c
6136 ;-------------------------------------------------------------
6137
6138 (define-pmacro (binary-arith16-b-S-imm8-dst3 op sz opc1 opc2 sem)
6139 (dni (.sym op 16 .b.S-imm8-dst3)
6140 (.str op sz ":S imm8,dst3")
6141 ((machine 16))
6142 (.str op sz "$S #${Imm-8-QI},${Dst16-3-S-16}")
6143 (+ opc1 opc2 Dst16-3-S-16 Imm-8-QI)
6144 (sem QI Imm-8-QI Dst16-3-S-16)
6145 ())
6146 )
6147
6148 ;-------------------------------------------------------------
6149 ;<arith>.size:Q #imm4,sp -- for m16c
6150 ;-------------------------------------------------------------
6151
6152 (define-pmacro (binary-arith16-Q-sp op opc1 opc2 opc3 sem)
6153 (dni (.sym op 16 -wQ-sp)
6154 (.str op ".w:q #imm4,sp")
6155 ((machine 16))
6156 (.str op ".w$Q #${Imm-12-s4},sp")
6157 (+ opc1 opc2 opc3 Imm-12-s4)
6158 (sem QI Imm-12-s4 sp)
6159 ())
6160 )
6161
6162 ;-------------------------------------------------------------
6163 ;<arith>.size:G #imm,sp -- for m16c
6164 ;-------------------------------------------------------------
6165
6166 (define-pmacro (binary-arith16-G-sp-defn mode wstr wbit op opc1 opc2 opc3 opc4 sem)
6167 (dni (.sym op 16 wstr - G-sp)
6168 (.str op wstr " imm-sp " mode)
6169 ((machine 16))
6170 (.str op wstr "$G #${Imm-16-" mode "},sp")
6171 (+ opc1 opc2 (f-7-1 wbit) opc3 opc4 (.sym Imm-16- mode))
6172 (sem mode (.sym Imm-16- mode) sp)
6173 ())
6174 )
6175
6176 (define-pmacro (binary-arith16-G-sp op opc1 opc2 opc3 opc4 sem)
6177 (begin
6178 (binary-arith16-G-sp-defn QI .b 0 op opc1 opc2 opc3 opc4 sem)
6179 (binary-arith16-G-sp-defn HI .w 1 op opc1 opc2 opc3 opc4 sem)
6180 )
6181 )
6182
6183 ;-------------------------------------------------------------
6184 ;<arith>.size:G #imm,dst -- for m16c and m32c
6185 ;-------------------------------------------------------------
6186
6187 (define-pmacro (binary-arith-imm-dst-defn mach src dstgroup dmode wstr op suffix encoding sem)
6188 (dni (.sym op mach wstr - imm-G - dstgroup)
6189 (.str op wstr " " mach "-imm-G-" dstgroup "-" dmode)
6190 ((machine mach) RL_1ADDR)
6191 (.str op wstr "$"suffix " #${" src "},${dst" mach "-" dstgroup "-" dmode "}")
6192 encoding
6193 (sem dmode src (.sym dst mach - dstgroup - dmode))
6194 ())
6195 )
6196
6197 ; m16c variants
6198 (define-pmacro (binary-arith16-imm-dst-defn smode dmode wstr wbit op suffix opc1 opc2 opc3 sem)
6199 (begin
6200 (binary-arith-imm-dst-defn 16 (.sym Imm-32- smode) 16-16 dmode wstr op suffix
6201 (+ opc1 opc2 (f-7-1 wbit) opc3 (.sym dst16-16-16- dmode) (.sym Imm-32- smode))
6202 sem)
6203 (binary-arith-imm-dst-defn 16 (.sym Imm-24- smode) 16-8 dmode wstr op suffix
6204 (+ opc1 opc2 (f-7-1 wbit) opc3 (.sym dst16-16-8- dmode) (.sym Imm-24- smode))
6205 sem)
6206 (binary-arith-imm-dst-defn 16 (.sym Imm-16- smode) basic dmode wstr op suffix
6207 (+ opc1 opc2 (f-7-1 wbit) opc3 (.sym dst16-basic- dmode) (.sym Imm-16- smode))
6208 sem)
6209 )
6210 )
6211
6212 ; m32c Unprefixed variants
6213 (define-pmacro (binary-arith32-imm-dst-Unprefixed smode dmode wstr wbit op suffix opc1 opc2 opc3 sem)
6214 (begin
6215 (binary-arith-imm-dst-defn 32 (.sym Imm-40- smode) 16-24-Unprefixed dmode wstr op suffix
6216 (+ (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))
6217 sem)
6218 (binary-arith-imm-dst-defn 32 (.sym Imm-32- smode) 16-16-Unprefixed dmode wstr op suffix
6219 (+ (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))
6220 sem)
6221 (binary-arith-imm-dst-defn 32 (.sym Imm-24- smode) 16-8-Unprefixed dmode wstr op suffix
6222 (+ (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))
6223 sem)
6224 (binary-arith-imm-dst-defn 32 (.sym Imm-16- smode) basic-Unprefixed dmode wstr op suffix
6225 (+ (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))
6226 sem)
6227 )
6228 )
6229
6230 ; m32c Prefixed variants
6231 (define-pmacro (binary-arith32-imm-dst-Prefixed smode dmode wstr wbit op suffix opc1 opc2 opc3 sem)
6232 (begin
6233 (binary-arith-imm-dst-defn 32 (.sym Imm-48- smode) 24-24-Prefixed dmode wstr op suffix
6234 (+ (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))
6235 sem)
6236 (binary-arith-imm-dst-defn 32 (.sym Imm-40- smode) 24-16-Prefixed dmode wstr op suffix
6237 (+ (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))
6238 sem)
6239 (binary-arith-imm-dst-defn 32 (.sym Imm-32- smode) 24-8-Prefixed dmode wstr op suffix
6240 (+ (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))
6241 sem)
6242 (binary-arith-imm-dst-defn 32 (.sym Imm-24- smode) basic-Prefixed dmode wstr op suffix
6243 (+ (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))
6244 sem)
6245 )
6246 )
6247
6248 ; All m32c variants
6249 (define-pmacro (binary-arith32-imm-dst-defn smode dmode wstr wbit op suffix opc1 opc2 opc3 sem)
6250 (begin
6251 ; Multi insns are tried for assembly in the reverse order in which they appear here, so
6252 ; define the absolute-indirect insns first in order to prevent them from being selected
6253 ; when the mode is register-indirect
6254 ; (binary-arith-imm-dst-defn 32 (.sym Imm-48- smode) 24-24-absolute-indirect dmode wstr op suffix
6255 ; (+ (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))
6256 ; sem)
6257 ; (binary-arith-imm-dst-defn 32 (.sym Imm-40- smode) 24-16-absolute-indirect dmode wstr op suffix
6258 ; (+ (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))
6259 ; sem)
6260 ; Unprefixed modes next
6261 (binary-arith32-imm-dst-Unprefixed smode dmode wstr wbit op suffix opc1 opc2 opc3 sem)
6262
6263 ; Remaining indirect modes
6264 ; (binary-arith-imm-dst-defn 32 (.sym Imm-24- smode) basic-indirect dmode wstr op suffix
6265 ; (+ (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))
6266 ; sem)
6267 ; (binary-arith-imm-dst-defn 32 (.sym Imm-48- smode) 24-24-indirect dmode wstr op suffix
6268 ; (+ (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))
6269 ; sem)
6270 ; (binary-arith-imm-dst-defn 32 (.sym Imm-40- smode) 24-16-indirect dmode wstr op suffix
6271 ; (+ (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))
6272 ; sem)
6273 ; (binary-arith-imm-dst-defn 32 (.sym Imm-32- smode) 24-8-indirect dmode wstr op suffix
6274 ; (+ (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))
6275 ; sem)
6276 )
6277 )
6278
6279 (define-pmacro (binary-arith-imm-dst-mach mach op suffix opc1 opc2 opc3 sem)
6280 (begin
6281 (.apply (.sym binary-arith mach -imm-dst-defn) (QI QI .b 0 op suffix opc1 opc2 opc3 sem))
6282 (.apply (.sym binary-arith mach -imm-dst-defn) (HI HI .w 1 op suffix opc1 opc2 opc3 sem))
6283 )
6284 )
6285
6286 (define-pmacro (binary-arith-imm-dst op suffix opc16-1 opc16-2 opc16-3 opc32-1 opc32-2 opc32-3 sem)
6287 (begin
6288 (binary-arith-imm-dst-mach 16 op suffix opc16-1 opc16-2 opc16-3 sem)
6289 (binary-arith-imm-dst-mach 32 op suffix opc32-1 opc32-2 opc32-3 sem)
6290 )
6291 )
6292
6293 ;-------------------------------------------------------------
6294 ;<arith>.size:Q #imm4,dst -- for m16c and m32c
6295 ;-------------------------------------------------------------
6296
6297 (define-pmacro (binary-arith-imm4-dst-defn mach src dstgroup mode wstr op encoding sem)
6298 (dni (.sym op mach wstr - imm4-Q - dstgroup)
6299 (.str op wstr " " mach "-imm4-Q-" dstgroup "-" mode)
6300 ((machine mach) RL_1ADDR)
6301 (.str op wstr "$Q #${" src "},${dst" mach "-" dstgroup "-" mode "}")
6302 encoding
6303 (sem mode src (.sym dst mach - dstgroup - mode))
6304 ())
6305 )
6306
6307 ; m16c variants
6308 (define-pmacro (binary-arith16-imm4-dst-defn mode wstr wbit1 wbit2 op opc1 opc2 sem)
6309 (binary-arith-imm4-dst-defn 16 Imm-8-s4 16 mode wstr op
6310 (+ opc1 opc2 (f-7-1 wbit2) Imm-8-s4 (.sym dst16-16- mode))
6311 sem)
6312 )
6313
6314 (define-pmacro (binary-arith16-shimm4-dst-defn mode wstr wbit1 wbit2 op opc1 opc2 sem)
6315 (binary-arith-imm4-dst-defn 16 Imm-sh-8-s4 16 mode wstr op
6316 (+ opc1 opc2 (f-7-1 wbit2) Imm-sh-8-s4 (.sym dst16-16- mode))
6317 sem)
6318 )
6319
6320 ; m32c variants
6321 (define-pmacro (binary-arith32-imm4-dst-defn mode wstr wbit1 wbit2 op opc1 opc2 sem)
6322 (begin
6323 ; Multi insns are tried for assembly in the reverse order in which they appear here, so
6324 ; define the absolute-indirect insns first in order to prevent them from being selected
6325 ; when the mode is register-indirect
6326 ; (binary-arith-imm4-dst-defn 32 Imm-20-s4 24-absolute-indirect mode wstr op
6327 ; (+ (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)
6328 ; sem)
6329 (binary-arith-imm4-dst-defn 32 Imm-12-s4 16-Unprefixed mode wstr op
6330 (+ (f-0-3 opc1) (f-3-1 wbit1) (f-7-1 wbit2) (.sym dst32-16-Unprefixed- mode) (f-10-2 opc2) Imm-12-s4)
6331 sem)
6332 ; (binary-arith-imm4-dst-defn 32 Imm-20-s4 24-indirect mode wstr op
6333 ; (+ (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)
6334 ; sem)
6335 )
6336 )
6337
6338 (define-pmacro (binary-arith32-shimm4-dst-defn mode wstr wbit1 wbit2 op opc1 opc2 sem)
6339 (begin
6340 ; Multi insns are tried for assembly in the reverse order in which they appear here, so
6341 ; define the absolute-indirect insns first in order to prevent them from being selected
6342 ; when the mode is register-indirect
6343 ; (binary-arith-imm4-dst-defn 32 Imm-sh-20-s4 24-absolute-indirect mode wstr op
6344 ; (+ (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)
6345 ; sem)
6346 (binary-arith-imm4-dst-defn 32 Imm-sh-12-s4 16-Unprefixed mode wstr op
6347 (+ (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)
6348 sem)
6349 ; (binary-arith-imm4-dst-defn 32 Imm-sh-20-s4 24-indirect mode wstr op
6350 ; (+ (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)
6351 ; sem)
6352 )
6353 )
6354
6355 (define-pmacro (binary-arith-imm4-dst-mach mach op opc1 opc2 sem)
6356 (begin
6357 (.apply (.sym binary-arith mach -imm4-dst-defn) (QI .b 0 0 op opc1 opc2 sem))
6358 (.apply (.sym binary-arith mach -imm4-dst-defn) (HI .w 0 1 op opc1 opc2 sem))
6359 )
6360 )
6361
6362 (define-pmacro (binary-arith-imm4-dst op opc16-1 opc16-2 opc32-1 opc32-2 sem)
6363 (begin
6364 (binary-arith-imm4-dst-mach 16 op opc16-1 opc16-2 sem)
6365 (binary-arith-imm4-dst-mach 32 op opc32-1 opc32-2 sem)
6366 )
6367 )
6368
6369 ;-------------------------------------------------------------
6370 ;<arith>.size:G src,dst -- for m16c and m32c
6371 ;-------------------------------------------------------------
6372
6373 (define-pmacro (binary-arith-src-dst-defn mach srcgroup dstgroup smode dmode wstr op suffix encoding sem)
6374 (dni (.sym op mach wstr - srcgroup - dstgroup)
6375 (.str op wstr " dst" mach "-" srcgroup "-" dstgroup "-" dmode)
6376 ((machine mach) RL_2ADDR)
6377 (.str op wstr "$" suffix " ${src" mach "-" srcgroup "-" smode "},${dst" mach "-" dstgroup "-" dmode "}")
6378 encoding
6379 (sem dmode (.sym src mach - srcgroup - smode) (.sym dst mach - dstgroup - dmode))
6380 ())
6381 )
6382
6383 ; m16c variants
6384 (define-pmacro (binary-arith16-src-dst-defn smode dmode wstr wbit op suffix opc1 opc2 sem)
6385 (begin
6386 (binary-arith-src-dst-defn 16 basic 16 smode dmode wstr op suffix
6387 (+ opc1 opc2 (f-7-1 wbit) (.sym src16-basic- smode) (.sym dst16-16- dmode))
6388 sem)
6389 (binary-arith-src-dst-defn 16 16-16 32 smode dmode wstr op suffix
6390 (+ opc1 opc2 (f-7-1 wbit) (.sym src16-16-16- smode) (.sym dst16-32- dmode))
6391 sem)
6392 (binary-arith-src-dst-defn 16 16-8 24 smode dmode wstr op suffix
6393 (+ opc1 opc2 (f-7-1 wbit) (.sym src16-16-8- smode) (.sym dst16-24- dmode))
6394 sem)
6395 )
6396 )
6397
6398 ; m32c Prefixed variants
6399 (define-pmacro (binary-arith32-src-dst-Prefixed smode dmode wstr wbit op suffix opc1 opc2 sem)
6400 (begin
6401 (binary-arith-src-dst-defn 32 basic-Prefixed 24-Prefixed smode dmode wstr op suffix
6402 (+ (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))
6403 sem)
6404 (binary-arith-src-dst-defn 32 24-24-Prefixed 48-Prefixed smode dmode wstr op suffix
6405 (+ (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))
6406 sem)
6407 (binary-arith-src-dst-defn 32 24-16-Prefixed 40-Prefixed smode dmode wstr op suffix
6408 (+ (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))
6409 sem)
6410 (binary-arith-src-dst-defn 32 24-8-Prefixed 32-Prefixed smode dmode wstr op suffix
6411 (+ (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))
6412 sem)
6413 )
6414 )
6415
6416 ; all m32c variants
6417 (define-pmacro (binary-arith32-src-dst-defn smode dmode wstr wbit op suffix opc1 opc2 sem)
6418 (begin
6419 ; Multi insns are tried for assembly in the reverse order in which they appear here, so
6420 ; define the absolute-indirect insns first in order to prevent them from being selected
6421 ; when the mode is register-indirect
6422 ; (binary-arith-src-dst-defn 32 24-24-absolute-indirect 48-absolute-indirect smode dmode wstr op suffix
6423 ; (+ (f-0-4 4) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6424 ; (.sym src32-24-24-absolute-indirect- smode) (.sym dst32-48-absolute-indirect- dmode) (f-20-4 opc2))
6425 ; sem)
6426 ; (binary-arith-src-dst-defn 32 24-16-absolute-indirect 40-absolute-indirect smode dmode wstr op suffix
6427 ; (+ (f-0-4 4) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6428 ; (.sym src32-24-16-absolute-indirect- smode) (.sym dst32-40-absolute-indirect- dmode) (f-20-4 opc2))
6429 ; sem)
6430 ; (binary-arith-src-dst-defn 32 24-24-absolute-indirect 48-Prefixed smode dmode wstr op suffix
6431 ; (+ (f-0-4 4) (f-4-4 1) (f-8-1 opc1) (f-15-1 wbit)
6432 ; (.sym src32-24-24-absolute-indirect- smode) (.sym dst32-48-Prefixed- dmode) (f-20-4 opc2))
6433 ; sem)
6434 ; (binary-arith-src-dst-defn 32 24-16-absolute-indirect 40-Prefixed smode dmode wstr op suffix
6435 ; (+ (f-0-4 4) (f-4-4 1) (f-8-1 opc1) (f-15-1 wbit)
6436 ; (.sym src32-24-16-absolute-indirect- smode) (.sym dst32-40-Prefixed- dmode) (f-20-4 opc2))
6437 ; sem)
6438 ; (binary-arith-src-dst-defn 32 24-24-absolute-indirect 48-indirect smode dmode wstr op suffix
6439 ; (+ (f-0-4 4) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6440 ; (.sym src32-24-24-absolute-indirect- smode) (.sym dst32-48-indirect- dmode) (f-20-4 opc2))
6441 ; sem)
6442 ; (binary-arith-src-dst-defn 32 24-16-absolute-indirect 40-indirect smode dmode wstr op suffix
6443 ; (+ (f-0-4 4) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6444 ; (.sym src32-24-16-absolute-indirect- smode) (.sym dst32-40-indirect- dmode) (f-20-4 opc2))
6445 ; sem)
6446 ; (binary-arith-src-dst-defn 32 basic-Prefixed 24-absolute-indirect smode dmode wstr op suffix
6447 ; (+ (f-0-4 0) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6448 ; (.sym src32-basic-Prefixed- smode) (.sym dst32-24-absolute-indirect- dmode) (f-20-4 opc2))
6449 ; sem)
6450 ; (binary-arith-src-dst-defn 32 24-24-Prefixed 48-absolute-indirect smode dmode wstr op suffix
6451 ; (+ (f-0-4 0) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6452 ; (.sym src32-24-24-Prefixed- smode) (.sym dst32-48-absolute-indirect- dmode) (f-20-4 opc2))
6453 ; sem)
6454 ; (binary-arith-src-dst-defn 32 24-16-Prefixed 40-absolute-indirect smode dmode wstr op suffix
6455 ; (+ (f-0-4 0) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6456 ; (.sym src32-24-16-Prefixed- smode) (.sym dst32-40-absolute-indirect- dmode) (f-20-4 opc2))
6457 ; sem)
6458 ; (binary-arith-src-dst-defn 32 24-8-Prefixed 32-absolute-indirect smode dmode wstr op suffix
6459 ; (+ (f-0-4 0) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6460 ; (.sym src32-24-8-Prefixed- smode) (.sym dst32-32-absolute-indirect- dmode) (f-20-4 opc2))
6461 ; sem)
6462 ; (binary-arith-src-dst-defn 32 basic-indirect 24-absolute-indirect smode dmode wstr op suffix
6463 ; (+ (f-0-4 4) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6464 ; (.sym src32-basic-indirect- smode) (.sym dst32-24-absolute-indirect- dmode) (f-20-4 opc2))
6465 ; sem)
6466 ; (binary-arith-src-dst-defn 32 24-24-indirect 48-absolute-indirect smode dmode wstr op suffix
6467 ; (+ (f-0-4 4) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6468 ; (.sym src32-24-24-indirect- smode) (.sym dst32-48-absolute-indirect- dmode) (f-20-4 opc2))
6469 ; sem)
6470 ; (binary-arith-src-dst-defn 32 24-16-indirect 40-absolute-indirect smode dmode wstr op suffix
6471 ; (+ (f-0-4 4) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6472 ; (.sym src32-24-16-indirect- smode) (.sym dst32-40-absolute-indirect- dmode) (f-20-4 opc2))
6473 ; sem)
6474 ; (binary-arith-src-dst-defn 32 24-8-indirect 32-absolute-indirect smode dmode wstr op suffix
6475 ; (+ (f-0-4 4) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6476 ; (.sym src32-24-8-indirect- smode) (.sym dst32-32-absolute-indirect- dmode) (f-20-4 opc2))
6477 ; sem)
6478 (binary-arith-src-dst-defn 32 basic-Unprefixed 16-Unprefixed smode dmode wstr op suffix
6479 (+ (f-0-1 opc1) (f-7-1 wbit) (.sym src32-basic-Unprefixed- smode) (.sym dst32-16-Unprefixed- dmode) (f-12-4 opc2))
6480 sem)
6481 (binary-arith-src-dst-defn 32 16-24-Unprefixed 40-Unprefixed smode dmode wstr op suffix
6482 (+ (f-0-1 opc1) (f-7-1 wbit) (.sym src32-16-24-Unprefixed- smode) (.sym dst32-40-Unprefixed- dmode) (f-12-4 opc2))
6483 sem)
6484 (binary-arith-src-dst-defn 32 16-16-Unprefixed 32-Unprefixed smode dmode wstr op suffix
6485 (+ (f-0-1 opc1) (f-7-1 wbit) (.sym src32-16-16-Unprefixed- smode) (.sym dst32-32-Unprefixed- dmode) (f-12-4 opc2))
6486 sem)
6487 (binary-arith-src-dst-defn 32 16-8-Unprefixed 24-Unprefixed smode dmode wstr op suffix
6488 (+ (f-0-1 opc1) (f-7-1 wbit) (.sym src32-16-8-Unprefixed- smode) (.sym dst32-24-Unprefixed- dmode) (f-12-4 opc2))
6489 sem)
6490 ; (binary-arith-src-dst-defn 32 basic-indirect 24-Prefixed smode dmode wstr op suffix
6491 ; (+ (f-0-4 4) (f-4-4 1) (f-8-1 opc1) (f-15-1 wbit)
6492 ; (.sym src32-basic-indirect- smode) (.sym dst32-24-Prefixed- dmode) (f-20-4 opc2))
6493 ; sem)
6494 ; (binary-arith-src-dst-defn 32 24-24-indirect 48-Prefixed smode dmode wstr op suffix
6495 ; (+ (f-0-4 4) (f-4-4 1) (f-8-1 opc1) (f-15-1 wbit)
6496 ; (.sym src32-24-24-indirect- smode) (.sym dst32-48-Prefixed- dmode) (f-20-4 opc2))
6497 ; sem)
6498 ; (binary-arith-src-dst-defn 32 24-16-indirect 40-Prefixed smode dmode wstr op suffix
6499 ; (+ (f-0-4 4) (f-4-4 1) (f-8-1 opc1) (f-15-1 wbit)
6500 ; (.sym src32-24-16-indirect- smode) (.sym dst32-40-Prefixed- dmode) (f-20-4 opc2))
6501 ; sem)
6502 ; (binary-arith-src-dst-defn 32 24-8-indirect 32-Prefixed smode dmode wstr op suffix
6503 ; (+ (f-0-4 4) (f-4-4 1) (f-8-1 opc1) (f-15-1 wbit)
6504 ; (.sym src32-24-8-indirect- smode) (.sym dst32-32-Prefixed- dmode) (f-20-4 opc2))
6505 ; sem)
6506 ; (binary-arith-src-dst-defn 32 basic-Prefixed 24-indirect smode dmode wstr op suffix
6507 ; (+ (f-0-4 0) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6508 ; (.sym src32-basic-Prefixed- smode) (.sym dst32-24-indirect- dmode) (f-20-4 opc2))
6509 ; sem)
6510 ; (binary-arith-src-dst-defn 32 24-24-Prefixed 48-indirect smode dmode wstr op suffix
6511 ; (+ (f-0-4 0) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6512 ; (.sym src32-24-24-Prefixed- smode) (.sym dst32-48-indirect- dmode) (f-20-4 opc2))
6513 ; sem)
6514 ; (binary-arith-src-dst-defn 32 24-16-Prefixed 40-indirect smode dmode wstr op suffix
6515 ; (+ (f-0-4 0) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6516 ; (.sym src32-24-16-Prefixed- smode) (.sym dst32-40-indirect- dmode) (f-20-4 opc2))
6517 ; sem)
6518 ; (binary-arith-src-dst-defn 32 24-8-Prefixed 32-indirect smode dmode wstr op suffix
6519 ; (+ (f-0-4 0) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6520 ; (.sym src32-24-8-Prefixed- smode) (.sym dst32-32-indirect- dmode) (f-20-4 opc2))
6521 ; sem)
6522 ; (binary-arith-src-dst-defn 32 basic-indirect 24-indirect smode dmode wstr op suffix
6523 ; (+ (f-0-4 4) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6524 ; (.sym src32-basic-indirect- smode) (.sym dst32-24-indirect- dmode) (f-20-4 opc2))
6525 ; sem)
6526 ; (binary-arith-src-dst-defn 32 24-24-indirect 48-indirect smode dmode wstr op suffix
6527 ; (+ (f-0-4 4) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6528 ; (.sym src32-24-24-indirect- smode) (.sym dst32-48-indirect- dmode) (f-20-4 opc2))
6529 ; sem)
6530 ; (binary-arith-src-dst-defn 32 24-16-indirect 40-indirect smode dmode wstr op suffix
6531 ; (+ (f-0-4 4) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6532 ; (.sym src32-24-16-indirect- smode) (.sym dst32-40-indirect- dmode) (f-20-4 opc2))
6533 ; sem)
6534 ; (binary-arith-src-dst-defn 32 24-8-indirect 32-indirect smode dmode wstr op suffix
6535 ; (+ (f-0-4 4) (f-4-4 9) (f-8-1 opc1) (f-15-1 wbit)
6536 ; (.sym src32-24-8-indirect- smode) (.sym dst32-32-indirect- dmode) (f-20-4 opc2))
6537 ; sem)
6538 )
6539 )
6540
6541 (define-pmacro (binary-arith-src-dst-mach mach op suffix opc1 opc2 sem)
6542 (begin
6543 (.apply (.sym binary-arith mach -src-dst-defn) (QI QI .b 0 op suffix opc1 opc2 sem))
6544 (.apply (.sym binary-arith mach -src-dst-defn) (HI HI .w 1 op suffix opc1 opc2 sem))
6545 )
6546 )
6547
6548 (define-pmacro (binary-arith-src-dst op suffix opc16-1 opc16-2 opc32-1 opc32-2 sem)
6549 (begin
6550 (binary-arith-src-dst-mach 16 op suffix opc16-1 opc16-2 sem)
6551 (binary-arith-src-dst-mach 32 op suffix opc32-1 opc32-2 sem)
6552 )
6553 )
6554
6555 ;-------------------------------------------------------------
6556 ;<arith>.size:S #imm,dst -- for m32c
6557 ;-------------------------------------------------------------
6558
6559 (define-pmacro (binary-arith32-s-imm-dst-defn src dstgroup mode wstr op encoding sem)
6560 (dni (.sym op 32 wstr - imm-S - dstgroup)
6561 (.str op wstr " 32-imm-S-" dstgroup "-" mode)
6562 ((machine 32))
6563 (.str op wstr "$S #${" src "},${dst32-" dstgroup "-" mode "}")
6564 encoding
6565 (sem mode src (.sym dst32- dstgroup - mode))
6566 ())
6567 )
6568
6569 (define-pmacro (binary-arith32-z-imm-dst-defn src dstgroup mode wstr op encoding sem)
6570 (dni (.sym op 32 wstr - imm-Z - dstgroup)
6571 (.str op wstr " 32-imm-Z-" dstgroup "-" mode)
6572 ((machine 32))
6573 (.str op wstr "$Z #0,${dst32-" dstgroup "-" mode "}")
6574 encoding
6575 (sem mode (const 0) (.sym dst32- dstgroup - mode))
6576 ())
6577 )
6578
6579 (define-pmacro (binary-arith32-s-imm-dst mode wstr wbit op opc1 opc2 sem)
6580 (begin
6581 ; (binary-arith32-s-imm-dst-defn (.sym Imm-32- mode) 2-S-absolute-indirect mode wstr op
6582 ; (+ (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))
6583 ; sem)
6584 (binary-arith32-s-imm-dst-defn (.sym Imm-8- mode) 2-S-basic mode wstr op
6585 (+ (f-0-2 opc1) (.sym dst32-2-S-basic- mode) (f-4-3 opc2) (f-7-1 wbit) (.sym Imm-8- mode))
6586 sem)
6587 (binary-arith32-s-imm-dst-defn (.sym Imm-24- mode) 2-S-16 mode wstr op
6588 (+ (f-0-2 opc1) (.sym dst32-2-S-16- mode) (f-4-3 opc2) (f-7-1 wbit) (.sym Imm-24- mode))
6589 sem)
6590 (binary-arith32-s-imm-dst-defn (.sym Imm-16- mode) 2-S-8 mode wstr op
6591 (+ (f-0-2 opc1) (.sym dst32-2-S-8- mode) (f-4-3 opc2) (f-7-1 wbit) (.sym Imm-16- mode))
6592 sem)
6593 ; (binary-arith32-s-imm-dst-defn (.sym Imm-24- mode) 2-S-8-indirect mode wstr op
6594 ; (+ (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))
6595 ; sem)
6596 )
6597 )
6598
6599 (define-pmacro (binary-arith32-z-imm-dst mode wstr wbit op opc1 opc2 sem)
6600 (begin
6601 ; (binary-arith32-z-imm-dst-defn (.sym Imm-32- mode) 2-S-absolute-indirect mode wstr op
6602 ; (+ (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))
6603 ; sem)
6604 (binary-arith32-z-imm-dst-defn (.sym Imm-8- mode) 2-S-basic mode wstr op
6605 (+ (f-0-2 opc1) (.sym dst32-2-S-basic- mode) (f-4-3 opc2) (f-7-1 wbit))
6606 sem)
6607 (binary-arith32-z-imm-dst-defn (.sym Imm-24- mode) 2-S-16 mode wstr op
6608 (+ (f-0-2 opc1) (.sym dst32-2-S-16- mode) (f-4-3 opc2) (f-7-1 wbit))
6609 sem)
6610 (binary-arith32-z-imm-dst-defn (.sym Imm-16- mode) 2-S-8 mode wstr op
6611 (+ (f-0-2 opc1) (.sym dst32-2-S-8- mode) (f-4-3 opc2) (f-7-1 wbit))
6612 sem)
6613 ; (binary-arith32-z-imm-dst-defn (.sym Imm-24- mode) 2-S-8-indirect mode wstr op
6614 ; (+ (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))
6615 ; sem)
6616 )
6617 )
6618
6619 ;-------------------------------------------------------------
6620 ;<arith>.L:S #imm1,An -- for m32c
6621 ;-------------------------------------------------------------
6622
6623 (define-pmacro (binary-arith32-l-s-imm1-an op opc1 opc2 sem)
6624 (begin
6625 (dni (.sym op 32.l-s-imm1-S-an)
6626 (.str op ".l 32-imm1-S-an")
6627 ((machine 32))
6628 (.str op ".l$S #${Imm1-S},${dst32-an-S}")
6629 (+ opc1 Imm1-S opc2 dst32-an-S)
6630 (sem SI Imm1-S dst32-an-S)
6631 ())
6632 )
6633 )
6634
6635 ;-------------------------------------------------------------
6636 ;<arith>.L:Q #imm3,sp -- for m32c
6637 ;-------------------------------------------------------------
6638
6639 (define-pmacro (binary-arith32-l-q-imm3-sp op opc1 opc2 sem)
6640 (begin
6641 (dni (.sym op 32.l-imm3-Q)
6642 (.str op ".l 32-imm3-Q")
6643 ((machine 32))
6644 (.str op ".l$Q #${Imm3-S},sp")
6645 (+ opc1 Imm3-S opc2)
6646 (sem SI Imm3-S sp)
6647 ())
6648 )
6649 )
6650
6651 ;-------------------------------------------------------------
6652 ;<arith>.L:S #imm8,sp -- for m32c
6653 ;-------------------------------------------------------------
6654
6655 (define-pmacro (binary-arith32-l-s-imm8-sp op opc1 opc2 opc3 opc4 sem)
6656 (begin
6657 (dni (.sym op 32.l-imm8-S)
6658 (.str op ".l 32-imm8-S")
6659 ((machine 32))
6660 (.str op ".l$S #${Imm-16-QI},sp")
6661 (+ opc1 opc2 opc3 opc4 Imm-16-QI)
6662 (sem SI Imm-16-QI sp)
6663 ())
6664 )
6665 )
6666
6667 ;-------------------------------------------------------------
6668 ;<arith>.L:G #imm16,sp -- for m32c
6669 ;-------------------------------------------------------------
6670
6671 (define-pmacro (binary-arith32-l-g-imm16-sp op opc1 opc2 opc3 opc4 sem)
6672 (begin
6673 (dni (.sym op 32.l-imm16-G)
6674 (.str op ".l 32-imm16-G")
6675 ((machine 32))
6676 (.str op ".l$G #${Imm-16-HI},sp")
6677 (+ opc1 opc2 opc3 opc4 Imm-16-HI)
6678 (sem SI Imm-16-HI sp)
6679 ())
6680 )
6681 )
6682
6683 ;-------------------------------------------------------------
6684 ;<arith>jnz.size #imm4,dst,label -- for m16c and m32c
6685 ;-------------------------------------------------------------
6686
6687 (define-pmacro (arith-jnz-imm4-dst-defn mach src dstgroup label mode wstr op encoding sem)
6688 (dni (.sym op mach wstr - imm4 - dstgroup)
6689 (.str op wstr " " mach "-imm4-" dstgroup "-" label "-" mode)
6690 (RL_JUMP RELAXABLE (machine mach))
6691 (.str op wstr " #${" src "},${dst" mach "-" dstgroup "-" mode "},${" label "}")
6692 encoding
6693 (sem mode src (.sym dst mach - dstgroup - mode) label)
6694 ())
6695 )
6696
6697 ; m16c variants
6698 (define-pmacro (arith-jnz16-imm4-dst-defn mode wstr wbit op i4n opc1 opc2 sem)
6699 (begin
6700 (arith-jnz-imm4-dst-defn 16 (.sym Imm-8- i4n) basic Lab-16-8 mode wstr op
6701 (+ opc1 opc2 (f-7-1 wbit) (.sym Imm-8- i4n) (.sym dst16-basic- mode) Lab-16-8)
6702 sem)
6703 (arith-jnz-imm4-dst-defn 16 (.sym Imm-8- i4n) 16-16 Lab-32-8 mode wstr op
6704 (+ opc1 opc2 (f-7-1 wbit) (.sym Imm-8- i4n) (.sym dst16-16-16- mode) Lab-32-8)
6705 sem)
6706 (arith-jnz-imm4-dst-defn 16 (.sym Imm-8- i4n) 16-8 Lab-24-8 mode wstr op
6707 (+ opc1 opc2 (f-7-1 wbit) (.sym Imm-8- i4n) (.sym dst16-16-8- mode) Lab-24-8)
6708 sem)
6709 )
6710 )
6711
6712 ; m32c variants
6713 (define-pmacro (arith-jnz32-imm4-dst-defn mode wstr wbit op i4n opc1 opc2 sem)
6714 (begin
6715 (arith-jnz-imm4-dst-defn 32 (.sym Imm-12- i4n) basic-Unprefixed Lab-16-8 mode wstr op
6716 (+ (f-0-4 opc1) (f-7-1 wbit) (.sym dst32-basic-Unprefixed- mode) (f-10-2 opc2) (.sym Imm-12- i4n) Lab-16-8)
6717 sem)
6718 (arith-jnz-imm4-dst-defn 32 (.sym Imm-12- i4n) 16-24-Unprefixed Lab-40-8 mode wstr op
6719 (+ (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)
6720 sem)
6721 (arith-jnz-imm4-dst-defn 32 (.sym Imm-12- i4n) 16-16-Unprefixed Lab-32-8 mode wstr op
6722 (+ (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)
6723 sem)
6724 (arith-jnz-imm4-dst-defn 32 (.sym Imm-12- i4n) 16-8-Unprefixed Lab-24-8 mode wstr op
6725 (+ (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)
6726 sem)
6727 )
6728 )
6729
6730 (define-pmacro (arith-jnz-imm4-dst-mach mach op i4n opc1 opc2 sem)
6731 (begin
6732 (.apply (.sym arith-jnz mach -imm4-dst-defn) (QI .b 0 op i4n opc1 opc2 sem))
6733 (.apply (.sym arith-jnz mach -imm4-dst-defn) (HI .w 1 op i4n opc1 opc2 sem))
6734 )
6735 )
6736
6737 (define-pmacro (arith-jnz-imm4-dst op i4n opc16-1 opc16-2 opc32-1 opc32-2 sem)
6738 (begin
6739 (arith-jnz-imm4-dst-mach 16 op i4n opc16-1 opc16-2 sem)
6740 (arith-jnz-imm4-dst-mach 32 op i4n opc32-1 opc32-2 sem)
6741 )
6742 )
6743
6744 ;-------------------------------------------------------------
6745 ;mov.size dsp8[sp],dst -- for m16c and m32c
6746 ;-------------------------------------------------------------
6747 (define-pmacro (mov-dspsp-dst-defn mach dstgroup dsp mode wstr op encoding sem)
6748 (dni (.sym op mach wstr -dspsp-dst- dstgroup)
6749 (.str op wstr " " mach "-dsp[sp]-" dstgroup "-" dsp "-" mode)
6750 ((machine mach))
6751 (.str op wstr "$G ${" dsp "}[sp],${dst" mach "-" dstgroup "-" mode "}")
6752 encoding
6753 (sem mach mode dsp (.sym dst mach - dstgroup - mode))
6754 ())
6755 )
6756 (define-pmacro (mov-src-dspsp-defn mach dstgroup dsp mode wstr op encoding sem)
6757 (dni (.sym op mach wstr -dst-dspsp- dstgroup)
6758 (.str op wstr " " mach "-dsp[sp]-" dstgroup "-" dsp "-" mode)
6759 ((machine mach))
6760 (.str op wstr "$G ${dst" mach "-" dstgroup "-" mode "},${" dsp "}[sp]")
6761 encoding
6762 (sem mach mode (.sym dst mach - dstgroup - mode) dsp)
6763 ())
6764 )
6765
6766 ; m16c variants
6767 (define-pmacro (mov16-dspsp-dst-defn mode wstr wbit op opc1 opc2 opc3 sem)
6768 (begin
6769 (mov-dspsp-dst-defn 16 basic Dsp-16-s8 mode wstr op
6770 (+ opc1 opc2 (f-7-1 wbit) opc3 (.sym dst16-basic- mode) Dsp-16-s8)
6771 sem)
6772 (mov-dspsp-dst-defn 16 16-16 Dsp-32-s8 mode wstr op
6773 (+ opc1 opc2 (f-7-1 wbit) opc3 (.sym dst16-16-16- mode) Dsp-32-s8)
6774 sem)
6775 (mov-dspsp-dst-defn 16 16-8 Dsp-24-s8 mode wstr op
6776 (+ opc1 opc2 (f-7-1 wbit) opc3 (.sym dst16-16-8- mode) Dsp-24-s8)
6777 sem)
6778 )
6779 )
6780
6781 (define-pmacro (mov16-src-dspsp-defn mode wstr wbit op opc1 opc2 opc3 sem)
6782 (begin
6783 (mov-src-dspsp-defn 16 basic Dsp-16-s8 mode wstr op
6784 (+ opc1 opc2 (f-7-1 wbit) opc3 (.sym dst16-basic- mode) Dsp-16-s8)
6785 sem)
6786 (mov-src-dspsp-defn 16 16-16 Dsp-32-s8 mode wstr op
6787 (+ opc1 opc2 (f-7-1 wbit) opc3 (.sym dst16-16-16- mode) Dsp-32-s8)
6788 sem)
6789 (mov-src-dspsp-defn 16 16-8 Dsp-24-s8 mode wstr op
6790 (+ opc1 opc2 (f-7-1 wbit) opc3 (.sym dst16-16-8- mode) Dsp-24-s8)
6791 sem)
6792 )
6793 )
6794
6795 ; m32c variants
6796 (define-pmacro (mov32-dspsp-dst-defn mode wstr wbit op opc1 opc2 opc3 sem)
6797 (begin
6798 (mov-dspsp-dst-defn 32 basic-Unprefixed Dsp-16-s8 mode wstr op
6799 (+ (f-0-4 opc1) (f-7-1 wbit) (.sym dst32-basic-Unprefixed- mode) (f-10-2 opc2) (f-12-4 opc3) Dsp-16-s8)
6800 sem)
6801 (mov-dspsp-dst-defn 32 16-24-Unprefixed Dsp-40-s8 mode wstr op
6802 (+ (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)
6803 sem)
6804 (mov-dspsp-dst-defn 32 16-16-Unprefixed Dsp-32-s8 mode wstr op
6805 (+ (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)
6806 sem)
6807 (mov-dspsp-dst-defn 32 16-8-Unprefixed Dsp-24-s8 mode wstr op
6808 (+ (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)
6809 sem)
6810 )
6811 )
6812 (define-pmacro (mov32-src-dspsp-defn mode wstr wbit op opc1 opc2 opc3 sem)
6813 (begin
6814 (mov-src-dspsp-defn 32 basic-Unprefixed Dsp-16-s8 mode wstr op
6815 (+ (f-0-4 opc1) (f-7-1 wbit) (.sym dst32-basic-Unprefixed- mode) (f-10-2 opc2) (f-12-4 opc3) Dsp-16-s8)
6816 sem)
6817 (mov-src-dspsp-defn 32 16-24-Unprefixed Dsp-40-s8 mode wstr op
6818 (+ (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)
6819 sem)
6820 (mov-src-dspsp-defn 32 16-16-Unprefixed Dsp-32-s8 mode wstr op
6821 (+ (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)
6822 sem)
6823 (mov-src-dspsp-defn 32 16-8-Unprefixed Dsp-24-s8 mode wstr op
6824 (+ (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)
6825 sem)
6826 )
6827 )
6828
6829 (define-pmacro (mov-src-dspsp-mach mach op opc1 opc2 opc3 sem)
6830 (begin
6831 (.apply (.sym mov mach -src-dspsp-defn) (QI .b 0 op opc1 opc2 opc3 sem))
6832 (.apply (.sym mov mach -src-dspsp-defn) (HI .w 1 op opc1 opc2 opc3 sem))
6833 )
6834 )
6835
6836 (define-pmacro (mov-dspsp-dst-mach mach op opc1 opc2 opc3 sem)
6837 (begin
6838 (.apply (.sym mov mach -dspsp-dst-defn) (QI .b 0 op opc1 opc2 opc3 sem))
6839 (.apply (.sym mov mach -dspsp-dst-defn) (HI .w 1 op opc1 opc2 opc3 sem))
6840 )
6841 )
6842
6843 (define-pmacro (mov-dspsp-dst op opc16-1 opc16-2 opc16-3 opc32-1 opc32-2 opc32-3 sem)
6844 (begin
6845 (mov-dspsp-dst-mach 16 op opc16-1 opc16-2 opc16-3 sem)
6846 (mov-dspsp-dst-mach 32 op opc32-1 opc32-2 opc32-3 sem)
6847 )
6848 )
6849 (define-pmacro (mov-src-dspsp op opc16-1 opc16-2 opc16-3 opc32-1 opc32-2 opc32-3 sem)
6850 (begin
6851 (mov-src-dspsp-mach 16 op opc16-1 opc16-2 opc16-3 sem)
6852 (mov-src-dspsp-mach 32 op opc32-1 opc32-2 opc32-3 sem)
6853 )
6854 )
6855
6856 ;-------------------------------------------------------------
6857 ; lde dsp24,dst -- for m16c
6858 ;-------------------------------------------------------------
6859
6860 (define-pmacro (lde-dst-dsp mode wstr wbit dstgroup srcdisp)
6861 (begin
6862
6863 (dni (.sym lde wstr - dstgroup -u20)
6864 (.str "lde" wstr "-" dstgroup "-u20")
6865 ((machine 16))
6866 (.str "lde" wstr " ${" srcdisp "},${dst16-" dstgroup "-" mode "}")
6867 (+ (f-0-4 #x7) (f-4-3 #x2) (f-7-1 wbit) (f-8-4 #x8)
6868 (.sym dst16- dstgroup - mode) srcdisp)
6869 (nop)
6870 ())
6871
6872 (dni (.sym lde wstr - dstgroup -u20a0)
6873 (.str "lde" wstr "-" dstgroup "-u20a0")
6874 ((machine 16))
6875 (.str "lde" wstr " ${" srcdisp "}[a0],${dst16-" dstgroup "-" mode "}")
6876 (+ (f-0-4 #x7) (f-4-3 #x2) (f-7-1 wbit) (f-8-4 #x9)
6877 (.sym dst16- dstgroup - mode) srcdisp)
6878 (nop)
6879 ())
6880
6881 (dni (.sym lde wstr - dstgroup -a1a0)
6882 (.str "lde" wstr "-" dstgroup "-a1a0")
6883 ((machine 16))
6884 (.str "lde" wstr " [a1a0],${dst16-" dstgroup "-" mode "}")
6885 (+ (f-0-4 #x7) (f-4-3 #x2) (f-7-1 wbit) (f-8-4 #xa)
6886 (.sym dst16- dstgroup - mode))
6887 (nop)
6888 ())
6889 )
6890 )
6891
6892 (define-pmacro (lde-dst mode wstr wbit)
6893 (begin
6894 ; like: QI .b 0
6895 (lde-dst-dsp mode wstr wbit basic Dsp-16-u20)
6896 (lde-dst-dsp mode wstr wbit 16-8 Dsp-24-u20)
6897 (lde-dst-dsp mode wstr wbit 16-16 Dsp-32-u20)
6898 )
6899 )
6900
6901 ;-------------------------------------------------------------
6902 ; ste dst,dsp24 -- for m16c
6903 ;-------------------------------------------------------------
6904
6905 (define-pmacro (ste-dst-dsp mode wstr wbit dstgroup srcdisp)
6906 (begin
6907
6908 (dni (.sym ste wstr - dstgroup -u20)
6909 (.str "ste" wstr "-" dstgroup "-u20")
6910 ((machine 16))
6911 (.str "ste" wstr " ${dst16-" dstgroup "-" mode "},${" srcdisp "}")
6912 (+ (f-0-4 #x7) (f-4-3 #x2) (f-7-1 wbit) (f-8-4 #x0)
6913 (.sym dst16- dstgroup - mode) srcdisp)
6914 (nop)
6915 ())
6916
6917 (dni (.sym ste wstr - dstgroup -u20a0)
6918 (.str "ste" wstr "-" dstgroup "-u20a0")
6919 ((machine 16))
6920 (.str "ste" wstr " ${dst16-" dstgroup "-" mode "},${" srcdisp "}[a0]")
6921 (+ (f-0-4 #x7) (f-4-3 #x2) (f-7-1 wbit) (f-8-4 #x1)
6922 (.sym dst16- dstgroup - mode) srcdisp)
6923 (nop)
6924 ())
6925
6926 (dni (.sym ste wstr - dstgroup -a1a0)
6927 (.str "ste" wstr "-" dstgroup "-a1a0")
6928 ((machine 16))
6929 (.str "ste" wstr " ${dst16-" dstgroup "-" mode "},[a1a0]")
6930 (+ (f-0-4 #x7) (f-4-3 #x2) (f-7-1 wbit) (f-8-4 #x2)
6931 (.sym dst16- dstgroup - mode))
6932 (nop)
6933 ())
6934 )
6935 )
6936
6937 (define-pmacro (ste-dst mode wstr wbit)
6938 (begin
6939 ; like: QI .b 0
6940 (ste-dst-dsp mode wstr wbit basic Dsp-16-u20)
6941 (ste-dst-dsp mode wstr wbit 16-8 Dsp-24-u20)
6942 (ste-dst-dsp mode wstr wbit 16-16 Dsp-32-u20)
6943 )
6944 )
6945
6946 ;=============================================================
6947 ; Division
6948 ;-------------------------------------------------------------
6949
6950 (define-pmacro (div-sem divop modop opmode reg src quot rem max min)
6951 (sequence ()
6952 (if (eq src 0)
6953 (set obit (const BI 1))
6954 (sequence ((opmode quot-result) (opmode rem-result))
6955 (set quot-result (divop opmode (ext opmode reg) src))
6956 (set rem-result (modop opmode (ext opmode reg) src))
6957 (set obit (orif (gt opmode quot-result max)
6958 (lt opmode quot-result min)))
6959 (set quot quot-result)
6960 (set rem rem-result))))
6961 )
6962
6963 ;<divop>.size #imm -- for m16c and m32c
6964 (define-pmacro (div-imm-defn mach wstr op src encoding divop modop opmode reg quot rem max min sem)
6965 (dni (.sym op mach wstr - src)
6966 (.str op mach wstr "-" src)
6967 ((machine mach))
6968 (.str op wstr " #${" src "}")
6969 encoding
6970 (sem divop modop opmode reg src quot rem max min)
6971 ())
6972 )
6973 (define-pmacro (div16-imm-defn smode wstr wbit op divop modop opmode reg quot rem max min opc1 opc2 opc3 opc4 sem)
6974 (div-imm-defn 16 wstr op (.sym Imm-16 - smode)
6975 (+ opc1 opc2 (f-7-1 wbit) opc3 opc4 (.sym Imm-16 - smode))
6976 divop modop opmode reg quot rem max min
6977 sem)
6978 )
6979 (define-pmacro (div32-imm-defn smode wstr wbit op divop modop opmode reg quot rem max min opc1 opc2 opc3 opc4 sem)
6980 (div-imm-defn 32 wstr op (.sym Imm-16 - smode)
6981 (+ (f-0-4 opc1) (f-4-4 opc2) (f-8-3 opc3) (f-11-1 wbit) (f-12-4 opc4) (.sym Imm-16 - smode))
6982 divop modop opmode reg quot rem max min
6983 sem)
6984 )
6985 (define-pmacro (div-imm-mach mach op divop modop opmode max-QI min-QI max-HI min-HI opc1 opc2 opc3 opc4 sem)
6986 (begin
6987 (.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))
6988 (.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))
6989 )
6990 )
6991 (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)
6992 (begin
6993 (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)
6994 (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)
6995 )
6996 )
6997
6998 ;<divop>.size src -- for m16c and m32c
6999 (define-pmacro (div-src-defn mach wstr op src encoding divop modop opmode reg quot rem max min sem)
7000 (dni (.sym op mach wstr - src)
7001 (.str op mach wstr "-" src)
7002 ((machine mach))
7003 (.str op wstr " ${" src "}")
7004 encoding
7005 (sem divop modop opmode reg src quot rem max min)
7006 ())
7007 )
7008 (define-pmacro (div16-src-defn smode wstr wbit op divop modop opmode reg quot rem max min opc1 opc2 opc3 sem)
7009 (div-src-defn 16 wstr op (.sym dst16-16 - smode)
7010 (+ opc1 opc2 (f-7-1 wbit) opc3 (.sym dst16-16 - smode))
7011 divop modop opmode reg quot rem max min
7012 sem)
7013 )
7014 (define-pmacro (div32-src-defn smode wstr wbit op divop modop opmode reg quot rem max min opc1 opc2 opc3 sem)
7015 (begin
7016 ; Multi insns are tried for assembly in the reverse order in which they appear here, so
7017 ; define the absolute-indirect insns first in order to prevent them from being selected
7018 ; when the mode is register-indirect
7019 ; (div-src-defn 32 wstr op (.sym dst32-24-absolute-indirect- smode)
7020 ; (+ (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))
7021 ; divop modop opmode reg quot rem max min
7022 ; sem)
7023 (div-src-defn 32 wstr op (.sym dst32-16-Unprefixed- smode)
7024 (+ (f-0-4 opc1) (f-7-1 wbit) (f-10-2 opc2) (f-12-4 opc3) (.sym dst32-16-Unprefixed- smode))
7025 divop modop opmode reg quot rem max min
7026 sem)
7027 ; (div-src-defn 32 wstr op (.sym dst32-24-indirect- smode)
7028 ; (+ (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))
7029 ; divop modop opmode reg quot rem max min
7030 ; sem)
7031 )
7032 )
7033 (define-pmacro (div-src-mach mach op divop modop opmode max-QI min-QI max-HI min-HI opc1 opc2 opc3 sem)
7034 (begin
7035 (.apply (.sym div mach -src-defn) (QI .b 0 op divop modop opmode R0 R0l R0h max-QI min-QI opc1 opc2 opc3 sem))
7036 (.apply (.sym div mach -src-defn) (HI .w 1 op divop modop opmode R2R0 R0 R2 max-HI min-HI opc1 opc2 opc3 sem))
7037 )
7038 )
7039 (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)
7040 (begin
7041 (div-src-mach 16 op divop modop opmode max-QI min-QI max-HI min-HI opc16-1 opc16-2 opc16-3 sem)
7042 (div-src-mach 32 op divop modop opmode max-QI min-QI max-HI min-HI opc32-1 opc32-2 opc32-3 sem)
7043 )
7044 )
7045
7046 ;=============================================================
7047 ; Bit manipulation
7048 ;
7049 (define-pmacro (bit-insn-defn mach op suffix opnd encoding sem)
7050 (dni (.sym op mach - suffix - opnd)
7051 (.str op mach ":" suffix " " opnd)
7052 ((machine mach))
7053 (.str op "$" suffix " ${" opnd "}")
7054 encoding
7055 (sem opnd)
7056 ())
7057 )
7058
7059 (define-pmacro (bitsrc16-defn op opc1 opc2 opc3 sem)
7060 (bit-insn-defn 16 op X bit16-16
7061 (+ opc1 opc2 opc3 bit16-16)
7062 sem)
7063 )
7064
7065 (define-pmacro (bitsrc32-defn op opc1 opc2 opc3 sem)
7066 (begin
7067 (bit-insn-defn 32 op X bit32-24-Prefixed
7068 (+ (f-0-4 0) (f-4-4 1) (f-8-4 opc1) bit32-24-Prefixed (f-15-1 opc2) (f-18-3 opc3))
7069 sem)
7070 )
7071 )
7072
7073 (define-pmacro (bitsrc-insn op opc16-1 opc16-2 opc16-3 opc32-1 opc32-2 opc32-3 sem)
7074 (begin
7075 (bitsrc16-defn op opc16-1 opc16-2 opc16-3 sem)
7076 (bitsrc32-defn op opc32-1 opc32-2 opc32-3 sem)
7077 )
7078 )
7079
7080 (define-pmacro (bitdst16-defn op opc1 opc2 opc3 opc4 opc5 opc6 sem)
7081 (begin
7082 (bit-insn-defn 16 op G bit16-16-basic (+ opc1 opc2 opc3 bit16-16-basic) sem)
7083 (bit-insn-defn 16 op G bit16-16-16 (+ opc1 opc2 opc3 bit16-16-16) sem)
7084 (bit-insn-defn 16 op S bit16-11-S (+ opc4 opc5 opc6 bit16-11-S) sem)
7085 (bit-insn-defn 16 op G bit16-16-8 (+ opc1 opc2 opc3 bit16-16-8) sem)
7086 )
7087 )
7088
7089 (define-pmacro (bitdst32-defn op opc1 opc2 opc3 sem)
7090 (begin
7091 (bit-insn-defn 32 op X bit32-16-Unprefixed
7092 (+ (f-0-4 opc1) bit32-16-Unprefixed (f-7-1 opc2) (f-10-3 opc3))
7093 sem)
7094 )
7095 )
7096
7097 (define-pmacro (bitdstnos-insn op opc16-1 opc16-2 opc16-3 opc32-1 opc32-2 opc32-3 sem)
7098 (begin
7099 (bitsrc16-defn op opc16-1 opc16-2 opc16-3 sem)
7100 (bitdst32-defn op opc32-1 opc32-2 opc32-3 sem)
7101 )
7102 )
7103
7104 (define-pmacro (bitdst-insn op opc16-1 opc16-2 opc16-3 opc16-4 opc16-5 opc16-6 opc32-1 opc32-2 opc32-3 sem)
7105 (begin
7106 (bitdst16-defn op opc16-1 opc16-2 opc16-3 opc16-4 opc16-5 opc16-6 sem)
7107 (bitdst32-defn op opc32-1 opc32-2 opc32-3 sem)
7108 )
7109 )
7110
7111 ;=============================================================
7112 ; Bit condition
7113 ;
7114 (define-pmacro (bitcond-insn-defn mach op bit-opnd cond-opnd encoding sem)
7115 (dni (.sym op mach - bit-opnd - cond-opnd)
7116 (.str op mach " " bit-opnd " " cond-opnd)
7117 ((machine mach))
7118 (.str op "${" cond-opnd "} ${" bit-opnd "}")
7119 encoding
7120 (sem mach bit-opnd cond-opnd)
7121 ())
7122 )
7123
7124 (define-pmacro (bitcond16-defn op opc1 opc2 opc3 sem)
7125 (begin
7126 (bitcond-insn-defn 16 op bit16-16-basic cond16-16 (+ opc1 opc2 opc3 bit16-16-basic cond16-16) sem)
7127 (bitcond-insn-defn 16 op bit16-16-16 cond16-32 (+ opc1 opc2 opc3 bit16-16-16 cond16-32) sem)
7128 (bitcond-insn-defn 16 op bit16-16-8 cond16-24 (+ opc1 opc2 opc3 bit16-16-8 cond16-24) sem)
7129 )
7130 )
7131
7132 (define-pmacro (bitcond32-defn op opc1 opc2 opc3 sem)
7133 (begin
7134 (bitcond-insn-defn 32 op bit32-16-24-Unprefixed cond32-40
7135 (+ (f-0-4 opc1) bit32-16-24-Unprefixed (f-7-1 opc2) (f-10-3 opc3) cond32-40)
7136 sem)
7137 (bitcond-insn-defn 32 op bit32-16-16-Unprefixed cond32-32
7138 (+ (f-0-4 opc1) bit32-16-16-Unprefixed (f-7-1 opc2) (f-10-3 opc3) cond32-32)
7139 sem)
7140 (bitcond-insn-defn 32 op bit32-16-8-Unprefixed cond32-24
7141 (+ (f-0-4 opc1) bit32-16-8-Unprefixed (f-7-1 opc2) (f-10-3 opc3) cond32-24)
7142 sem)
7143 (bitcond-insn-defn 32 op bit32-basic-Unprefixed cond32-16
7144 (+ (f-0-4 opc1) bit32-basic-Unprefixed (f-7-1 opc2) (f-10-3 opc3) cond32-16)
7145 sem)
7146 )
7147 )
7148
7149 (define-pmacro (bitcond-insn op opc16-1 opc16-2 opc16-3 opc32-1 opc32-2 opc32-3 sem)
7150 (begin
7151 (bitcond16-defn op opc16-1 opc16-2 opc16-3 sem)
7152 (bitcond32-defn op opc32-1 opc32-2 opc32-3 sem)
7153 )
7154 )
7155
7156 ;=============================================================
7157 ;<insn>.size #imm1,#imm2,dst -- for m32c
7158 ;
7159 (define-pmacro (insn-imm1-imm2-dst-defn src1 src2 dstgroup xmode wstr op encoding sem)
7160 (dni (.sym op 32 wstr - src1 - src2 - dstgroup)
7161 (.str op 32 wstr "-" src1 "-" src2 "-" dstgroup "-" xmode)
7162 ((machine 32))
7163 (.str op wstr " #${" src1 "},#${" src2 "},${dst32-" dstgroup "-" xmode "}")
7164 encoding
7165 (sem xmode src1 src2 (.sym dst32- dstgroup - xmode))
7166 ())
7167 )
7168
7169 ; m32c Prefixed variants
7170 (define-pmacro (insn32-imm1-imm2-dst-Prefixed-defn xmode wstr wbit base1 base2 base3 base4 op opc1 opc2 opc3 sem)
7171 (begin
7172 (insn-imm1-imm2-dst-defn (.sym Imm-48- xmode) (.sym Imm- base4 - xmode) 24-24-Prefixed xmode wstr op
7173 (+ (f-0-4 0) (f-4-4 1) (f-8-4 opc1) (f-18-2 opc2) (f-15-1 wbit) (f-20-4 opc3)
7174 (.sym dst32-24-24-Prefixed- xmode) (.sym Imm-48- xmode) (.sym Imm- base4 - xmode))
7175 sem)
7176 (insn-imm1-imm2-dst-defn (.sym Imm-40- xmode) (.sym Imm- base3 - xmode) 24-16-Prefixed xmode wstr op
7177 (+ (f-0-4 0) (f-4-4 1) (f-8-4 opc1) (f-18-2 opc2) (f-15-1 wbit) (f-20-4 opc3)
7178 (.sym dst32-24-16-Prefixed- xmode) (.sym Imm-40- xmode) (.sym Imm- base3 - xmode))
7179 sem)
7180 (insn-imm1-imm2-dst-defn (.sym Imm-32- xmode) (.sym Imm- base2 - xmode) 24-8-Prefixed xmode wstr op
7181 (+ (f-0-4 0) (f-4-4 1) (f-8-4 opc1) (f-18-2 opc2) (f-15-1 wbit) (f-20-4 opc3)
7182 (.sym dst32-24-8-Prefixed- xmode) (.sym Imm-32- xmode) (.sym Imm- base2 - xmode))
7183 sem)
7184 (insn-imm1-imm2-dst-defn (.sym Imm-24- xmode) (.sym Imm- base1 - xmode) basic-Prefixed xmode wstr op
7185 (+ (f-0-4 0) (f-4-4 1) (f-8-4 opc1) (f-18-2 opc2) (f-15-1 wbit) (f-20-4 opc3)
7186 (.sym dst32-basic-Prefixed- xmode) (.sym Imm-24- xmode) (.sym Imm- base1 - xmode))
7187 sem)
7188 )
7189 )
7190
7191 ; m32c Unprefixed variants
7192 (define-pmacro (insn32-imm1-imm2-dst-Unprefixed-defn xmode wstr wbit base1 base2 base3 base4 op opc1 opc2 opc3 sem)
7193 (begin
7194 (insn-imm1-imm2-dst-defn (.sym Imm-40- xmode) (.sym Imm- base4 - xmode) 16-24-Unprefixed xmode wstr op
7195 (+ (f-0-4 opc1) (f-10-2 opc2) (f-7-1 wbit) (f-12-4 opc3)
7196 (.sym dst32-16-24-Unprefixed- xmode) (.sym Imm-40- xmode) (.sym Imm- base4 - xmode))
7197 sem)
7198 (insn-imm1-imm2-dst-defn (.sym Imm-32- xmode) (.sym Imm- base3 - xmode) 16-16-Unprefixed xmode wstr op
7199 (+ (f-0-4 opc1) (f-10-2 opc2) (f-7-1 wbit) (f-12-4 opc3)
7200 (.sym dst32-16-16-Unprefixed- xmode) (.sym Imm-32- xmode) (.sym Imm- base3 - xmode))
7201 sem)
7202 (insn-imm1-imm2-dst-defn (.sym Imm-24- xmode) (.sym Imm- base2 - xmode) 16-8-Unprefixed xmode wstr op
7203 (+ (f-0-4 opc1) (f-10-2 opc2) (f-7-1 wbit) (f-12-4 opc3)
7204 (.sym dst32-16-8-Unprefixed- xmode) (.sym Imm-24- xmode) (.sym Imm- base2 - xmode))
7205 sem)
7206 (insn-imm1-imm2-dst-defn (.sym Imm-16- xmode) (.sym Imm- base1 - xmode) basic-Unprefixed xmode wstr op
7207 (+ (f-0-4 opc1) (f-10-2 opc2) (f-7-1 wbit) (f-12-4 opc3)
7208 (.sym dst32-basic-Unprefixed- xmode) (.sym Imm-16- xmode) (.sym Imm- base1 - xmode))
7209 sem)
7210 )
7211 )
7212
7213 (define-pmacro (insn-imm1-imm2-dst-Prefixed op opc32-1 opc32-2 opc32-3 sem)
7214 (begin
7215 (insn32-imm1-imm2-dst-Prefixed-defn QI .b 0 32 40 48 56 op opc32-1 opc32-2 opc32-3 sem)
7216 (insn32-imm1-imm2-dst-Prefixed-defn HI .w 1 40 48 56 64 op opc32-1 opc32-2 opc32-3 sem)
7217 )
7218 )
7219 (define-pmacro (insn-imm1-imm2-dst-Unprefixed op opc32-1 opc32-2 opc32-3 sem)
7220 (begin
7221 (insn32-imm1-imm2-dst-Unprefixed-defn QI .b 0 24 32 40 48 op opc32-1 opc32-2 opc32-3 sem)
7222 (insn32-imm1-imm2-dst-Unprefixed-defn HI .w 1 32 40 48 56 op opc32-1 opc32-2 opc32-3 sem)
7223 )
7224 )
7225
7227 ;=============================================================
7228 ; Insn definitions
7229 ;-------------------------------------------------------------
7230 ; abs - absolute
7231 ;-------------------------------------------------------------
7232
7233 (define-pmacro (abs-sem mode dst)
7234 (sequence ((mode result))
7235 (set result (abs mode dst))
7236 (set obit (eq result dst))
7237 (set-z-and-s result)
7238 (set dst result))
7239 )
7240 (unary-insn abs (f-0-4 7) (f-4-3 3) (f-8-4 #xF) #xA #x1 #xF abs-sem)
7241
7242 ;-------------------------------------------------------------
7243 ; adcf - addition carry flag
7244 ;-------------------------------------------------------------
7245
7246 (define-pmacro (adcf-sem mode dst)
7247 (sequence ((mode result))
7248 (set result (addc mode dst 0 cbit))
7249 (set obit (add-oflag mode dst 0 cbit))
7250 (set cbit (add-cflag mode dst 0 cbit))
7251 (set-z-and-s result)
7252 (set dst result))
7253 )
7254 (unary-insn adcf (f-0-4 7) (f-4-3 3) (f-8-4 #xE) #xB #x1 #xE adcf-sem)
7255
7256 ;-------------------------------------------------------------
7257 ; add - binary addition
7258 ;-------------------------------------------------------------
7259
7260 (define-pmacro (add-sem mode src1 dst)
7261 (sequence ((mode result))
7262 (set result (add mode src1 dst))
7263 (set obit (add-oflag mode src1 dst 0))
7264 (set cbit (add-cflag mode src1 dst 0))
7265 (set-z-and-s result)
7266 (set dst result))
7267 )
7268
7269 ; add.L:G #imm32,dst (m32 #2)
7270 (binary-arith32-imm-dst-defn SI SI .l 0 add G #x8 #x3 #x1 add-sem)
7271 ; add.size:G #imm,dst (m16 #1 m32 #1)
7272 (binary-arith-imm-dst add G (f-0-4 7) (f-4-3 3) (f-8-4 4) #x8 #x2 #xE add-sem)
7273 ; add.size:Q #imm4,dst (m16 #2 m32 #3)
7274 (binary-arith-imm4-dst add (f-0-4 #xC) (f-4-3 4) #x7 #x3 add-sem)
7275 (binary-arith32-imm4-dst-defn SI .l 1 0 add #x7 #x3 add-sem)
7276 ; add.b:S #imm8,dst3 (m16 #3)
7277 (binary-arith16-b-S-imm8-dst3 add ".b" (f-0-4 8) (f-4-1 0) add-sem)
7278 ; add.BW:Q #imm4,sp (m16 #7)
7279 (binary-arith16-Q-sp add (f-0-4 7) (f-4-4 #xD) (f-8-4 #xB) add-sem)
7280 (dnmi add16-bQ-sp "add16-bQ-sp" ()
7281 "add.b:q #${Imm-12-s4},sp"
7282 (emit add16-wQ-sp Imm-12-s4))
7283 ; add.BW:G #imm,sp (m16 #6)
7284 (binary-arith16-G-sp add (f-0-4 7) (f-4-3 6) (f-8-4 #xE) (f-12-4 #xB) add-sem)
7285 ; add.BW:G src,dst (m16 #4 m32 #6)
7286 (binary-arith-src-dst add G (f-0-4 #xA) (f-4-3 0) #x1 #x8 add-sem)
7287 ; add.B.S src2,r0l/r0h (m16 #5)
7288 (binary-arith16-b-S-src2 add (f-0-4 2) (f-4-1 0) add-sem)
7289 ; add.L:G src,dst (m32 #7)
7290 (binary-arith32-src-dst-defn SI SI .l 1 add G #x1 #x2 add-sem)
7291 ; add.L:S #imm{1,2},A0/A1 (m32 #5)
7292 (binary-arith32-l-s-imm1-an add (f-0-2 2) (f-3-4 6) add-sem)
7293 ; add.L:Q #imm3,sp (m32 #9)
7294 (binary-arith32-l-q-imm3-sp add (f-0-2 1) (f-4-3 1) add-sem)
7295 ; add.L:S #imm8,sp (m32 #10)
7296 (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)
7297 ; add.L:G #imm16,sp (m32 #8)
7298 (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)
7299 ; add.BW:S #imm,dst2 (m32 #4)
7300 (binary-arith32-s-imm-dst QI .b 0 add #x0 #x3 add-sem)
7301 (binary-arith32-s-imm-dst HI .w 1 add #x0 #x3 add-sem)
7302
7303 ;-------------------------------------------------------------
7304 ; adc - binary add with carry
7305 ;-------------------------------------------------------------
7306
7307 (define-pmacro (addc-sem mode src dst)
7308 (sequence ((mode result))
7309 (set result (addc mode src dst cbit))
7310 (set obit (add-oflag mode src dst cbit))
7311 (set cbit (add-cflag mode src dst cbit))
7312 (set-z-and-s result)
7313 (set dst result))
7314 )
7315
7316 ; adc.size:G #imm,dst
7317 (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)
7318 (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)
7319 (binary-arith32-imm-dst-Prefixed QI QI .b 0 adc X #x8 #x2 #xE addc-sem)
7320 (binary-arith32-imm-dst-Prefixed HI HI .w 1 adc X #x8 #x2 #xE addc-sem)
7321
7322 ; adc.BW:G src,dst
7323 (binary-arith16-src-dst-defn QI QI .b 0 adc X (f-0-4 #xB) (f-4-3 0) addc-sem)
7324 (binary-arith16-src-dst-defn HI HI .w 1 adc X (f-0-4 #xB) (f-4-3 0) addc-sem)
7325 (binary-arith32-src-dst-Prefixed QI QI .b 0 adc X #x1 #x4 addc-sem)
7326 (binary-arith32-src-dst-Prefixed HI HI .w 1 adc X #x1 #x4 addc-sem)
7327
7328 ;-------------------------------------------------------------
7329 ; dadc - decimal add with carry
7330 ; dadd - decimal addition
7331 ;-------------------------------------------------------------
7332
7333 (define-pmacro (dadc-sem mode src dst)
7334 (sequence ((mode result))
7335 (set result (subc mode dst src (not cbit)))
7336 (set cbit (sub-cflag mode dst src (not cbit)))
7337 (set-z-and-s result)
7338 (set dst result))
7339 )
7340
7341 (define-pmacro (decimal-subtraction16-insn op opc1 opc2)
7342 (begin
7343 ; op.b #imm8,r0l
7344 (dni (.sym op 16.b-imm8)
7345 (.str op ".b #imm8")
7346 ((machine 16))
7347 (.str op ".b #${Imm-16-QI},r0l")
7348 (+ (f-0-4 #x7) (f-4-4 #xC) (f-8-4 #xE) (f-12-4 opc1) Imm-16-QI)
7349 ((.sym op -sem) QI Imm-16-QI R0l)
7350 ())
7351 ; op.w #imm16,r0
7352 (dni (.sym op 16.w-imm16)
7353 (.str op ".b #imm16")
7354 ((machine 16))
7355 (.str op ".w #${Imm-16-HI},r0")
7356 (+ (f-0-4 #x7) (f-4-4 #xD) (f-8-4 #xE) (f-12-4 opc1) Imm-16-HI)
7357 ((.sym op -sem) HI Imm-16-HI R0)
7358 ())
7359 ; op.b #r0h,r0l
7360 (dni (.sym op 16.b-r0h-r0l)
7361 (.str op ".b r0h,r0l")
7362 ((machine 16))
7363 (.str op ".b r0h,r0l")
7364 (+ (f-0-4 #x7) (f-4-4 #xC) (f-8-4 #xE) (f-12-4 opc2))
7365 ((.sym op -sem) QI R0h R0l)
7366 ())
7367 ; op.w #r1,r0
7368 (dni (.sym op 16.w-r1-r0)
7369 (.str op ".b r1,r0")
7370 ((machine 16))
7371 (.str op ".w r1,r0")
7372 (+ (f-0-4 #x7) (f-4-4 #xD) (f-8-4 #xE) (f-12-4 opc2))
7373 ((.sym op -sem) HI R1 R0)
7374 ())
7375 )
7376 )
7377
7378 ; dadc for m16c
7379 (decimal-subtraction16-insn dadc #xE #x6 )
7380
7381 ; dadc.size #imm,dst
7382 (binary-arith32-imm-dst-Prefixed QI QI .b 0 dadc X #x8 #x0 #xE dadc-sem)
7383 (binary-arith32-imm-dst-Prefixed HI HI .w 1 dadc X #x8 #x0 #xE dadc-sem)
7384 ; dadc.BW src,dst
7385 (binary-arith32-src-dst-Prefixed QI QI .b 0 dadc X #x1 #x8 dadc-sem)
7386 (binary-arith32-src-dst-Prefixed HI HI .w 1 dadc X #x1 #x8 dadc-sem)
7387
7388 (define-pmacro (dadd-sem mode src dst)
7389 (sequence ((mode result))
7390 (set result (subc mode dst src 0))
7391 (set cbit (sub-cflag mode dst src 0))
7392 (set-z-and-s result)
7393 (set dst result))
7394 )
7395
7396 ; dadd for m16c
7397 (decimal-subtraction16-insn dadd #xC #x4)
7398
7399 ; dadd.size #imm,dst
7400 (binary-arith32-imm-dst-Prefixed QI QI .b 0 dadd X #x8 #x1 #xE dadd-sem)
7401 (binary-arith32-imm-dst-Prefixed HI HI .w 1 dadd X #x8 #x1 #xE dadd-sem)
7402 ; dadd.BW src,dst
7403 (binary-arith32-src-dst-Prefixed QI QI .b 0 dadd X #x1 #x0 dadd-sem)
7404 (binary-arith32-src-dst-Prefixed HI HI .w 1 dadd X #x1 #x0 dadd-sem)
7405
7406 ;-------------------------------------------------------------;
7407 ; addx - Add extend sign with no carry
7408 ;-------------------------------------------------------------;
7409
7410 (define-pmacro (addx-sem mode src dst)
7411 (sequence ((SI source) (SI result))
7412 (set source (zext SI (trunc QI src)))
7413 (set result (add SI source dst))
7414 (set obit (add-oflag SI source dst 0))
7415 (set cbit (add-cflag SI source dst 0))
7416 (set-z-and-s result)
7417 (set dst result))
7418 )
7419
7420 ; addx #imm,dst
7421 (binary-arith32-imm-dst-defn QI SI "" 0 addx X #x8 #x1 #x1 addx-sem)
7422 ; addx src,dst
7423 (binary-arith32-src-dst-defn QI SI "" 0 addx X #x1 #x2 addx-sem)
7424
7425 ;-------------------------------------------------------------
7426 ; adjnz - Add/Sub and branch if not zero
7427 ;-------------------------------------------------------------
7428
7429 (define-pmacro (arith-jnz-sem mode src dst label)
7430 (sequence ((mode result))
7431 (set result (add mode src dst))
7432 (set dst result)
7433 (if (ne result 0)
7434 (set pc label)))
7435 )
7436
7437 ; adjnz.size #imm4,dst,label
7438 (arith-jnz-imm4-dst adjnz s4 (f-0-4 #xF) (f-4-3 4) #xf #x1 arith-jnz-sem)
7439
7440 ;-------------------------------------------------------------
7441 ; and - binary and
7442 ;-------------------------------------------------------------
7443
7444 (define-pmacro (and-sem mode src1 dst)
7445 (sequence ((mode result))
7446 (set result (and mode src1 dst))
7447 (set-z-and-s result)
7448 (set dst result))
7449 )
7450
7451 ; and.size:G #imm,dst (m16 #1 m32 #1)
7452 (binary-arith-imm-dst and G (f-0-4 7) (f-4-3 3) (f-8-4 2) #x8 #x3 #xF and-sem)
7453 ; and.b:S #imm8,dst3 (m16 #2)
7454 (binary-arith16-b-S-imm8-dst3 and ".b" (f-0-4 9) (f-4-1 0) and-sem)
7455 ; and.BW:G src,dst (m16 #3 m32 #3)
7456 (binary-arith-src-dst and G (f-0-4 #x9) (f-4-3 0) #x1 #xD and-sem)
7457 ; and.B.S src2,r0l/r0h (m16 #4)
7458 (binary-arith16-b-S-src2 and (f-0-4 1) (f-4-1 0) and-sem)
7459 ; and.BW:S #imm,dst2 (m32 #2)
7460 (binary-arith32-s-imm-dst QI .b 0 and #x1 #x6 and-sem)
7461 (binary-arith32-s-imm-dst HI .w 1 and #x1 #x6 and-sem)
7462
7463 ;-------------------------------------------------------------
7464 ; band - bit and
7465 ;-------------------------------------------------------------
7466
7467 (define-pmacro (band-sem src)
7468 (set cbit (and src cbit))
7469 )
7470 (bitsrc-insn band (f-0-4 7) (f-4-4 #xE) (f-8-4 4) #xD #x0 #x1 band-sem)
7471
7472 ;-------------------------------------------------------------
7473 ; bclr - bit clear
7474 ;-------------------------------------------------------------
7475
7476 (define-pmacro (bclr-sem dst)
7477 (set dst 0)
7478 )
7479 (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)
7480
7481 ;-------------------------------------------------------------
7482 ; bitindex - bit index
7483 ;-------------------------------------------------------------
7484
7485 (define-pmacro (bitindex-sem mode dst)
7486 (set BitIndex dst)
7487 )
7488 (unary-insn-defn 32 16-Unprefixed QI .b bitindex
7489 (+ (f-0-4 #xC) (f-7-1 0) dst32-16-Unprefixed-QI (f-10-2 #x2) (f-12-4 #xE))
7490 bitindex-sem)
7491 (unary-insn-defn 32 16-Unprefixed HI .w bitindex
7492 (+ (f-0-4 #xC) (f-7-1 1) dst32-16-Unprefixed-HI (f-10-2 #x2) (f-12-4 #xE))
7493 bitindex-sem)
7494
7495 ;-------------------------------------------------------------
7496 ; bmCnd - bit move condition
7497 ;-------------------------------------------------------------
7498
7499 (define-pmacro (test-condition16 cond)
7500 (case UQI cond
7501 ((#x00) (trunc BI cbit))
7502 ((#x01) (not (or cbit zbit)))
7503 ((#x02) (trunc BI zbit))
7504 ((#x03) (trunc BI sbit))
7505 ((#x04) (or zbit (xor sbit obit)))
7506 ((#x05) (trunc BI obit))
7507 ((#x06) (xor sbit obit))
7508 ((#xf8) (not cbit))
7509 ((#xf9) (or cbit zbit))
7510 ((#xfa) (not zbit))
7511 ((#xfb) (not sbit))
7512 ((#xfc) (not (or zbit (xor sbit obit))))
7513 ((#xfd) (not obit))
7514 ((#xfe) (not (xor sbit obit)))
7515 (else (const BI 0))
7516 )
7517 )
7518
7519 (define-pmacro (test-condition32 cond)
7520 (case UQI cond
7521 ((#x00) (not cbit))
7522 ((#x01) (or cbit zbit))
7523 ((#x02) (not zbit))
7524 ((#x03) (not sbit))
7525 ((#x04) (not obit))
7526 ((#x05) (not (or zbit (xor sbit obit))))
7527 ((#x06) (not (xor sbit obit)))
7528 ((#x08) (trunc BI cbit))
7529 ((#x09) (not (or cbit zbit)))
7530 ((#x0a) (trunc BI zbit))
7531 ((#x0b) (trunc BI sbit))
7532 ((#x0c) (trunc BI obit))
7533 ((#x0d) (or zbit (xor sbit obit)))
7534 ((#x0e) (xor sbit obit))
7535 (else (const BI 0))
7536 )
7537 )
7538
7539 (define-pmacro (bitcond-sem mach op cond)
7540 (if ((.sym test-condition mach) cond)
7541 (set op 1)
7542 (set op 0))
7543 )
7544 (bitcond-insn bm (f-0-4 7) (f-4-4 #xE) (f-8-4 2) #xD #x0 #x2 bitcond-sem)
7545
7546 (dni bm16-c
7547 "bm16 C"
7548 ((machine 16))
7549 "bm$cond16c c"
7550 (+ (f-0-4 #x7) (f-4-4 #xD) (f-8-4 #xD) cond16c)
7551 (bitcond-sem 16 cbit cond16c)
7552 ())
7553
7554 (dni bm32-c
7555 "bm32 C"
7556 ((machine 32))
7557 "bm$cond32 c"
7558 (+ (f-0-4 #xD) (f-4-4 #x9) (f-8-1 0) (f-10-3 5) cond32)
7559 (bitcond-sem 32 cbit cond32)
7560 ())
7561
7562 ;-------------------------------------------------------------
7563 ; bnand
7564 ;-------------------------------------------------------------
7565
7566 (define-pmacro (bnand-sem src)
7567 (set cbit (and (inv src) cbit))
7568 )
7569 (bitsrc-insn bnand (f-0-4 7) (f-4-4 #xE) (f-8-4 5) #xD #x0 #x3 bnand-sem)
7570
7571 ;-------------------------------------------------------------
7572 ; bnor
7573 ;-------------------------------------------------------------
7574
7575 (define-pmacro (bnor-sem src)
7576 (set cbit (or (inv src) cbit))
7577 )
7578 (bitsrc-insn bnor (f-0-4 7) (f-4-4 #xE) (f-8-4 7) #xD #x0 #x6 bnor-sem)
7579
7580 ;-------------------------------------------------------------
7581 ; bnot
7582 ;-------------------------------------------------------------
7583
7584 (define-pmacro (bnot-sem dst)
7585 (set dst (inv dst))
7586 )
7587 (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)
7588
7589 ;-------------------------------------------------------------
7590 ; bntst
7591 ;-------------------------------------------------------------
7592
7593 (define-pmacro (bntst-sem src)
7594 (set cbit (inv src))
7595 (set zbit (inv src))
7596 )
7597 (bitsrc-insn bntst (f-0-4 7) (f-4-4 #xE) (f-8-4 3) #xD #x0 #x0 bntst-sem)
7598
7599 ;-------------------------------------------------------------
7600 ; bnxor
7601 ;-------------------------------------------------------------
7602
7603 (define-pmacro (bnxor-sem src)
7604 (set cbit (xor (inv src) cbit))
7605 )
7606 (bitsrc-insn bnxor (f-0-4 7) (f-4-4 #xE) (f-8-4 #xD) #xD #x0 #x7 bnxor-sem)
7607
7608 ;-------------------------------------------------------------
7609 ; bor
7610 ;-------------------------------------------------------------
7611
7612 (define-pmacro (bor-sem src)
7613 (set cbit (or src cbit))
7614 )
7615 (bitsrc-insn bor (f-0-4 7) (f-4-4 #xE) (f-8-4 #x6) #xD #x0 #x4 bor-sem)
7616
7617 ;-------------------------------------------------------------
7618 ; brk
7619 ;-------------------------------------------------------------
7620
7621 (dni brk16
7622 "brk"
7623 ((machine 16))
7624 "brk"
7625 (+ (f-0-4 #x0) (f-4-4 #x0))
7626 (nop)
7627 ())
7628
7629 (dni brk32
7630 "brk"
7631 ((machine 32))
7632 "brk"
7633 (+ (f-0-4 #x0) (f-4-4 #x0))
7634 (nop)
7635 ())
7636
7637 ;-------------------------------------------------------------
7638 ; brk2
7639 ;-------------------------------------------------------------
7640
7641 (dni brk232
7642 "brk2"
7643 ((machine 32))
7644 "brk2"
7645 (+ (f-0-4 #x0) (f-4-4 #x8))
7646 (nop)
7647 ())
7648
7649 ;-------------------------------------------------------------
7650 ; bset
7651 ;-------------------------------------------------------------
7652
7653 (define-pmacro (bset-sem dst)
7654 (set dst 1)
7655 )
7656 (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)
7657
7658 ;-------------------------------------------------------------
7659 ; btst
7660 ;-------------------------------------------------------------
7661
7662 (define-pmacro (btst-sem dst)
7663 (set zbit (inv dst))
7664 (set cbit dst)
7665 )
7666 (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)
7667
7668 (bit-insn-defn 32 btst G bit32-16-Unprefixed
7669 (+ (f-0-4 #xD) bit32-16-Unprefixed (f-7-1 #x0) (f-10-3 #x0))
7670 btst-sem)
7671
7672 (dni btst.s "btst:s" ((machine 32))
7673 "btst:s ${Bit3-S},${Dsp-8-u16}"
7674 (+ (f-0-2 #x0) (f-4-3 #x5) Bit3-S Dsp-8-u16)
7675 () ())
7676
7677 ;-------------------------------------------------------------
7678 ; btstc
7679 ;-------------------------------------------------------------
7680
7681 (define-pmacro (btstc-sem dst)
7682 (set zbit (inv dst))
7683 (set cbit dst)
7684 (set dst (const 0))
7685 )
7686 (bitdstnos-insn btstc (f-0-4 7) (f-4-4 #xE) (f-8-4 #x0) #xD #x0 #x4 btstc-sem)
7687
7688 ;-------------------------------------------------------------
7689 ; btsts
7690 ;-------------------------------------------------------------
7691
7692 (define-pmacro (btsts-sem dst)
7693 (set zbit (inv dst))
7694 (set cbit dst)
7695 (set dst (const 0))
7696 )
7697 (bitdstnos-insn btsts (f-0-4 7) (f-4-4 #xE) (f-8-4 #x1) #xD #x0 #x5 btsts-sem)
7698
7699 ;-------------------------------------------------------------
7700 ; bxor
7701 ;-------------------------------------------------------------
7702
7703 (define-pmacro (bxor-sem src)
7704 (set cbit (xor src cbit))
7705 )
7706 (bitsrc-insn bxor (f-0-4 7) (f-4-4 #xE) (f-8-4 #xC) #xD #x0 #x5 bxor-sem)
7707
7708 ;-------------------------------------------------------------
7709 ; clip
7710 ;-------------------------------------------------------------
7711
7712 (define-pmacro (clip-sem mode imm1 imm2 dest)
7713 (sequence ()
7714 (if (gt mode imm1 dest)
7715 (set dest imm1))
7716 (if (lt mode imm2 dest)
7717 (set dest imm2)))
7718 )
7719
7720 (insn-imm1-imm2-dst-Prefixed clip #x8 #x3 #xE clip-sem)
7721
7722 ;-------------------------------------------------------------
7723 ; cmp - binary compare
7724 ;-------------------------------------------------------------
7725
7726 (define-pmacro (cmp-sem mode src1 dst)
7727 (sequence ((mode result))
7728 (set result (sub mode dst src1))
7729 (set obit (sub-oflag mode dst src1 0))
7730 (set cbit (not (sub-cflag mode dst src1 0)))
7731 (set-z-and-s result))
7732 )
7733
7734 ; cmp.L:G #imm32,dst (m32 #2)
7735 (binary-arith32-imm-dst-defn SI SI .l 0 cmp G #xA #x3 #x1 cmp-sem)
7736 ; cmp.size:G #imm,dst (m16 #1 m32 #1)
7737 (binary-arith-imm-dst cmp G (f-0-4 7) (f-4-3 3) (f-8-4 8) #x9 #x2 #xE cmp-sem)
7738 ; cmp.size:Q #imm4,dst (m16 #2 m32 #3)
7739 (binary-arith-imm4-dst cmp (f-0-4 #xD) (f-4-3 0) #x7 #x1 cmp-sem)
7740 ; cmp.b:S #imm8,dst3 (m16 #3)
7741 (binary-arith16-b-S-imm8-dst3 cmp ".b" (f-0-4 #xE) (f-4-1 0) cmp-sem)
7742 ; cmp.BW:G src,dst (m16 #4 m32 #5)
7743 (binary-arith-src-dst cmp G (f-0-4 #xC) (f-4-3 0) #x1 #x6 cmp-sem)
7744 ; cmp.B.S src2,r0l/r0h (m16 #5)
7745 (binary-arith16-b-S-src2 cmp (f-0-4 3) (f-4-1 1) cmp-sem)
7746 ; cmp.L:G src,dst (m32 #6)
7747 (binary-arith32-src-dst-defn SI SI .l 1 cmp G #x1 #x1 cmp-sem)
7748 ; cmp.BW:S #imm,dst2 (m32 #4)
7749 (binary-arith32-s-imm-dst QI .b 0 cmp #x1 #x3 cmp-sem)
7750 (binary-arith32-s-imm-dst HI .w 1 cmp #x1 #x3 cmp-sem)
7751 ; cmp.BW:s src2,r0[l] (m32 #7)
7752 (binary-arith32-S-src2 cmp QI .b 0 (f-0-2 1) (f-4-3 0) cmp-sem)
7753 (binary-arith32-S-src2 cmp HI .w 1 (f-0-2 1) (f-4-3 0) cmp-sem)
7754
7755 ;-------------------------------------------------------------
7756 ; cmpx - binary compare extend sign
7757 ;-------------------------------------------------------------
7758
7759 (define-pmacro (cmpx-sem mode src1 dst)
7760 (sequence ((mode result))
7761 (set result (sub mode dst (ext mode src1)))
7762 (set obit (sub-oflag mode dst (ext mode src1) 0))
7763 (set cbit (sub-cflag mode dst (ext mode src1) 0))
7764 (set-z-and-s result))
7765 )
7766
7767 (binary-arith32-imm-dst-defn QI SI "" 0 cmpx X #xA #x1 #x1 cmpx-sem)
7768
7769 ;-------------------------------------------------------------
7770 ; dec - decrement
7771 ;-------------------------------------------------------------
7772
7773 (define-pmacro (dec-sem mode dest)
7774 (sequence ((mode result))
7775 (set result (sub mode dest 1))
7776 (set-z-and-s result)
7777 (set dest result))
7778 )
7779
7780 (dni dec16.b
7781 "dec.b Dst16-3-S-8"
7782 ((machine 16))
7783 "dec.b ${Dst16-3-S-8}"
7784 (+ (f-0-4 #xA) (f-4-1 #x1) Dst16-3-S-8)
7785 (dec-sem QI Dst16-3-S-8)
7786 ())
7787
7788 (dni dec16.w
7789 "dec.w Dst16An-S"
7790 ((machine 16))
7791 "dec.w ${Dst16An-S}"
7792 (+ (f-0-4 #xF) (f-5-3 #x2) Dst16An-S)
7793 (dec-sem HI Dst16An-S)
7794 ())
7795
7796 (unary32-defn QI .b 0 dec #xB #x0 #xE dec-sem)
7797 (unary32-defn HI .w 1 dec #xB #x0 #xE dec-sem)
7798
7799 ;-------------------------------------------------------------
7800 ; div - divide
7801 ; divu - divide unsigned
7802 ; divx - divide extension
7803 ;-------------------------------------------------------------
7804
7805 ; div.BW #imm
7806 (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)
7807 (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)
7808 (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)
7809 ; div.BW src
7810 (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)
7811 (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)
7812 (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)
7813
7814 (div-src-defn 32 .l div dst32-24-Prefixed-SI
7815 (+ (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)
7816 div mod SI R2R0 R2R0 NoRemainder #x7fffffff (neg SI #x80000000)
7817 div-sem)
7818 (div-src-defn 32 .l divu dst32-24-Prefixed-SI
7819 (+ (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)
7820 udiv umod USI R2R0 R2R0 NoRemainder #x80000000 0
7821 div-sem)
7822 (div-src-defn 32 .l divx dst32-24-Prefixed-SI
7823 (+ (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)
7824 div mod SI R2R0 R2R0 NoRemainder #x7fffffff (neg SI #x80000000)
7825 div-sem)
7826
7827 ;-------------------------------------------------------------
7828 ; dsbb - decimal subtraction with borrow
7829 ; dsub - decimal subtraction
7830 ;-------------------------------------------------------------
7831
7832 (define-pmacro (dsbb-sem mode src dst)
7833 (sequence ((mode result))
7834 (set result (subc mode dst src (not cbit)))
7835 (set cbit (sub-cflag mode dst src (not cbit)))
7836 (set-z-and-s result)
7837 (set dst result))
7838 )
7839
7840 ; dsbb for m16c
7841 (decimal-subtraction16-insn dsbb #xF #x7)
7842
7843 ; dsbb.size #imm,dst
7844 (binary-arith32-imm-dst-Prefixed QI QI .b 0 dsbb X #x9 #x0 #xE dsbb-sem)
7845 (binary-arith32-imm-dst-Prefixed HI HI .w 1 dsbb X #x9 #x0 #xE dsbb-sem)
7846 ; dsbb.BW src,dst
7847 (binary-arith32-src-dst-Prefixed QI QI .b 0 dsbb X #x1 #xA dsbb-sem)
7848 (binary-arith32-src-dst-Prefixed HI HI .w 1 dsbb X #x1 #xA dsbb-sem)
7849
7850 (define-pmacro (dsub-sem mode src dst)
7851 (sequence ((mode result))
7852 (set result (subc mode dst src 0))
7853 (set cbit (sub-cflag mode dst src 0))
7854 (set-z-and-s result)
7855 (set dst result))
7856 )
7857
7858 ; dsub for m16c
7859 (decimal-subtraction16-insn dsub #xD #x5)
7860
7861 ; dsub.size #imm,dst
7862 (binary-arith32-imm-dst-Prefixed QI QI .b 0 dsub X #x9 #x1 #xE dsub-sem)
7863 (binary-arith32-imm-dst-Prefixed HI HI .w 1 dsub X #x9 #x1 #xE dsub-sem)
7864 ; dsub.BW src,dst
7865 (binary-arith32-src-dst-Prefixed QI QI .b 0 dsub X #x1 #x2 dsub-sem)
7866 (binary-arith32-src-dst-Prefixed HI HI .w 1 dsub X #x1 #x2 dsub-sem)
7867
7868 ;-------------------------------------------------------------
7869 ; sub - binary subtraction
7870 ;-------------------------------------------------------------
7871
7872 (define-pmacro (sub-sem mode src1 dst)
7873 (sequence ((mode result))
7874 (set result (sub mode dst src1))
7875 (set obit (sub-oflag mode dst src1 0))
7876 (set cbit (sub-cflag mode dst src1 0))
7877 (set dst result)
7878 (set-z-and-s result)))
7879
7880 ; sub.size:G #imm,dst (m16 #1 m32 #1)
7881 (binary-arith-imm-dst sub G (f-0-4 7) (f-4-3 3) (f-8-4 5) #x8 #x3 #xE sub-sem)
7882 ; sub.b:S #imm8,dst3 (m16 #2)
7883 (binary-arith16-b-S-imm8-dst3 sub ".b" (f-0-4 8) (f-4-1 1) sub-sem)
7884 ; sub.BW:G src,dst (m16 #3 m32 #4)
7885 (binary-arith-src-dst sub G (f-0-4 #xA) (f-4-3 4) #x1 #xA sub-sem)
7886 ; sub.B.S src2,r0l/r0h (m16 #4)
7887 (binary-arith16-b-S-src2 sub (f-0-4 2) (f-4-1 1) sub-sem)
7888 ; sub.L:G #imm32,dst (m32 #2)
7889 (binary-arith32-imm-dst-defn SI SI .l 0 sub G #x9 #x3 #x1 sub-sem)
7890 ; sub.BW:S #imm,dst2 (m32 #3)
7891 (binary-arith32-s-imm-dst QI .b 0 sub #x0 #x7 sub-sem)
7892 (binary-arith32-s-imm-dst HI .w 1 sub #x0 #x7 sub-sem)
7893 ; sub.L:G src,dst (m32 #5)
7894 (binary-arith32-src-dst-defn SI SI .l 1 sub G #x1 #x0 sub-sem)
7895
7896 ;-------------------------------------------------------------
7897 ; enter - enter function
7898 ; exitd - exit and deallocate stack frame
7899 ;-------------------------------------------------------------
7900
7901 (define-pmacro (enter16-sem mach amt)
7902 (sequence ()
7903 (set (reg h-sp) (sub (reg h-sp) 2))
7904 (set (mem16 HI (reg h-sp)) (reg h-fb))
7905 (set (reg h-fb) (reg h-sp))
7906 (set (reg h-sp) (sub (reg h-sp) amt))))
7907
7908 (define-pmacro (exit16-sem mach)
7909 (sequence ((SI newpc))
7910 (set (reg h-sp) (reg h-fb))
7911 (set (reg h-fb) (mem16 HI (reg h-sp)))
7912 (set (reg h-sp) (add (reg h-sp) 2))
7913 (set newpc (mem16 HI (reg h-sp)))
7914 (set (reg h-sp) (add (reg h-sp) 2))
7915 (set newpc (or newpc (sll (mem16 QI (reg h-sp)) (const 16))))
7916 (set (reg h-sp) (add (reg h-sp) 1))
7917 (set pc newpc)))
7918
7919 (define-pmacro (enter32-sem mach amt)
7920 (sequence ()
7921 (set (reg h-sp) (sub (reg h-sp) 4))
7922 (set (mem32 SI (reg h-sp)) (reg h-fb))
7923 (set (reg h-fb) (reg h-sp))
7924 (set (reg h-sp) (sub (reg h-sp) amt))))
7925
7926 (define-pmacro (exit32-sem mach)
7927 (sequence ((SI newpc))
7928 (set (reg h-sp) (reg h-fb))
7929 (set (reg h-fb) (mem32 SI (reg h-sp)))
7930 (set (reg h-sp) (add (reg h-sp) 4))
7931 (set newpc (mem32 SI (reg h-sp)))
7932 (set (reg h-sp) (add (reg h-sp) 4))
7933 (set pc newpc)))
7934
7935 (dni enter16 "enter #Imm-16-QI" ((machine 16))
7936 ("enter #${Dsp-16-u8}")
7937 (+ (f-0-4 7) (f-4-4 #xC) (f-8-4 #xF) (f-12-4 2) Dsp-16-u8)
7938 (enter16-sem 16 Dsp-16-u8)
7939 ())
7940
7941 (dni exitd16 "exitd" ((machine 16))
7942 ("exitd")
7943 (+ (f-0-4 7) (f-4-4 #xD) (f-8-4 #xF) (f-12-4 2))
7944 (exit16-sem 16)
7945 ())
7946
7947 (dni enter32 "enter #Imm-8-QI" ((machine 32))
7948 ("enter #${Dsp-8-u8}")
7949 (+ (f-0-4 #xE) (f-4-4 #xC) Dsp-8-u8)
7950 (enter32-sem 32 Dsp-8-u8)
7951 ())
7952
7953 (dni exitd32 "exitd" ((machine 32))
7954 ("exitd")
7955 (+ (f-0-4 #xF) (f-4-4 #xC))
7956 (exit32-sem 32)
7957 ())
7958
7959 ;-------------------------------------------------------------
7960 ; fclr - flag register clear
7961 ; fset - flag register set
7962 ;-------------------------------------------------------------
7963
7964 (define-pmacro (set-flags-sem flag)
7965 (sequence ((SI tmp))
7966 (case DFLT flag
7967 ((#x0) (set cbit 1))
7968 ((#x1) (set dbit 1))
7969 ((#x2) (set zbit 1))
7970 ((#x3) (set sbit 1))
7971 ((#x4) (set bbit 1))
7972 ((#x5) (set obit 1))
7973 ((#x6) (set ibit 1))
7974 ((#x7) (set ubit 1)))
7975 )
7976 )
7977
7978 (define-pmacro (clear-flags-sem flag)
7979 (sequence ((SI tmp))
7980 (case DFLT flag
7981 ((#x0) (set cbit 0))
7982 ((#x1) (set dbit 0))
7983 ((#x2) (set zbit 0))
7984 ((#x3) (set sbit 0))
7985 ((#x4) (set bbit 0))
7986 ((#x5) (set obit 0))
7987 ((#x6) (set ibit 0))
7988 ((#x7) (set ubit 0)))
7989 )
7990 )
7991
7992 (dni fclr16 "fclr flag" ((machine 16))
7993 ("fclr ${flags16}")
7994 (+ (f-0-4 #xE) (f-4-4 #xB) (f-8-1 0) flags16 (f-12-4 5))
7995 (clear-flags-sem flags16)
7996 ())
7997
7998 (dni fset16 "fset flag" ((machine 16))
7999 ("fset ${flags16}")
8000 (+ (f-0-4 #xE) (f-4-4 #xB) (f-8-1 0) flags16 (f-12-4 4))
8001 (set-flags-sem flags16)
8002 ())
8003
8004 (dni fclr "fclr" ((machine 32))
8005 ("fclr ${flags32}")
8006 (+ (f-0-4 #xD) (f-4-4 3) (f-8-4 #xE) (f-12-1 1) flags32)
8007 (clear-flags-sem flags32)
8008 ())
8009
8010 (dni fset "fset" ((machine 32))
8011 ("fset ${flags32}")
8012 (+ (f-0-4 #xD) (f-4-4 1) (f-8-4 #xE) (f-12-1 1) flags32)
8013 (set-flags-sem flags32)
8014 ())
8015
8016 ;-------------------------------------------------------------
8017 ; inc - increment
8018 ;-------------------------------------------------------------
8019
8020 (define-pmacro (inc-sem mode dest)
8021 (sequence ((mode result))
8022 (set result (add mode dest 1))
8023 (set-z-and-s result)
8024 (set dest result))
8025 )
8026
8027 (dni inc16.b
8028 "inc.b Dst16-3-S-8"
8029 ((machine 16))
8030 "inc.b ${Dst16-3-S-8}"
8031 (+ (f-0-4 #xA) (f-4-1 #x0) Dst16-3-S-8)
8032 (inc-sem QI Dst16-3-S-8)
8033 ())
8034
8035 (dni inc16.w
8036 "inc.w Dst16An-S"
8037 ((machine 16))
8038 "inc.w ${Dst16An-S}"
8039 (+ (f-0-4 #xB) (f-5-3 #x2) Dst16An-S)
8040 (inc-sem HI Dst16An-S)
8041 ())
8042
8043 (unary32-defn QI .b 0 inc #xA #x0 #xE inc-sem)
8044 (unary32-defn HI .w 1 inc #xA #x0 #xE inc-sem)
8045
8046 ;-------------------------------------------------------------
8047 ; freit - fast return from interrupt (m32)
8048 ; int - interrupt
8049 ; into - interrupt on overflow
8050 ;-------------------------------------------------------------
8051
8052 ; ??? semantics
8053 (dni freit32 "FREIT" ((machine 32))
8054 ("freit")
8055 (+ (f-0-4 9) (f-4-4 #xF))
8056 (nop)
8057 ())
8058
8059 (dni int16 "int Dsp-10-u6" ((machine 16))
8060 ("int #${Dsp-10-u6}")
8061 (+ (f-0-4 #xE) (f-4-4 #xB) (f-8-2 3) Dsp-10-u6)
8062 (c-call VOID "do_int" pc Dsp-10-u6)
8063 ())
8064
8065 (dni into16 "into" ((machine 16))
8066 ("into")
8067 (+ (f-0-4 #xF) (f-4-4 6))
8068 (nop)
8069 ())
8070
8071 (dni int32 "int Dsp-8-u6" ((machine 32))
8072 ("int #${Dsp-8-u6}")
8073 (+ (f-0-4 #xB) (f-4-4 #xE) Dsp-8-u6 (f-14-2 0))
8074 (c-call VOID "do_int" pc Dsp-8-u6)
8075 ())
8076
8077 (dni into32 "into" ((machine 32))
8078 ("into")
8079 (+ (f-0-4 #xB) (f-4-4 #xF))
8080 (nop)
8081 ())
8082
8083 ;-------------------------------------------------------------
8084 ; index (m32c)
8085 ;-------------------------------------------------------------
8086
8087 ; TODO add support to insns allowing index
8088 (define-pmacro (indexb-sem mode d) (set SrcIndex d) (set DstIndex d))
8089 (define-pmacro (indexbd-sem mode d) (set SrcIndex (const 0)) (set DstIndex d))
8090 (define-pmacro (indexbs-sem mode d) (set SrcIndex d) (set DstIndex (const 0)))
8091 (define-pmacro (indexw-sem mode d)
8092 (set SrcIndex (sll d (const 2))) (set DstIndex (sll d (const 2))))
8093 (define-pmacro (indexwd-sem mode d)
8094 (set SrcIndex (const 0)) (set DstIndex (sll d (const 2))))
8095 (define-pmacro (indexws-sem mode d)
8096 (set SrcIndex (sll d (const 2))) (set DstIndex (const 0)))
8097 (define-pmacro (indexl-sem mode d)
8098 (set SrcIndex d) (set DstIndex (sll d (const 2))))
8099 (define-pmacro (indexld-sem mode d)
8100 (set SrcIndex (const 0)) (set DstIndex (sll d (const 2))))
8101 (define-pmacro (indexls-sem mode d)
8102 (set SrcIndex (sll d (const 2))) (set DstIndex (const 0)))
8103
8104 ; Note that "wbit" not where the size bit goes here, hence, it's
8105 ; always 0 in these calls but op2 differs instead.
8106
8107 ; indexb src (index byte)
8108 (unary32-defn QI .b 0 indexb #x8 0 #x3 indexb-sem)
8109 (unary32-defn HI .w 0 indexb #x8 1 #x3 indexb-sem)
8110 ; indexbd src (index byte dest)
8111 (unary32-defn QI .b 0 indexbd #xA 0 3 indexbd-sem)
8112 (unary32-defn HI .w 0 indexbd #xA 1 3 indexbd-sem)
8113 ; indexbs src (index byte src)
8114 (unary32-defn QI .b 0 indexbs #xC 0 3 indexbs-sem)
8115 (unary32-defn HI .w 0 indexbs #xC 1 3 indexbs-sem)
8116 ; indexl src (index long)
8117 (unary32-defn QI .b 0 indexl 9 2 3 indexl-sem)
8118 (unary32-defn HI .w 0 indexl 9 3 3 indexl-sem)
8119 ; indexld src (index long dest)
8120 (unary32-defn QI .b 0 indexld #xB 2 3 indexld-sem)
8121 (unary32-defn HI .w 0 indexld #xB 3 3 indexld-sem)
8122 ; indexls src (index long src)
8123 (unary32-defn QI .b 0 indexls 9 0 3 indexls-sem)
8124 (unary32-defn HI .w 0 indexls 9 1 3 indexls-sem)
8125 ; indexw src (index word)
8126 (unary32-defn QI .b 0 indexw 8 2 3 indexw-sem)
8127 (unary32-defn HI .w 0 indexw 8 3 3 indexw-sem)
8128 ; indexwd src (index word dest)
8129 (unary32-defn QI .b 0 indexwd #xA 2 3 indexwd-sem)
8130 (unary32-defn HI .w 0 indexwd #xA 3 3 indexwd-sem)
8131 ; indexws (index word src)
8132 (unary32-defn QI .b 0 indexws #xC 2 3 indexws-sem)
8133 (unary32-defn HI .w 0 indexws #xC 3 3 indexws-sem)
8134
8135 ;-------------------------------------------------------------
8136 ; jcc - jump on condition
8137 ;-------------------------------------------------------------
8138
8139 (define-pmacro (jcnd32-sem cnd label)
8140 (sequence ()
8141 (case DFLT cnd
8142 ((#x00) (if (not cbit) (set pc label))) ;ltu nc
8143 ((#x01) (if (not (and cbit (not zbit))) (set pc label))) ;leu
8144 ((#x02) (if (not zbit) (set pc label))) ;ne nz
8145 ((#x03) (if (not sbit) (set pc label))) ;pz
8146 ((#x04) (if (not obit) (set pc label))) ;no
8147 ((#x05) (if (not (or zbit (xor sbit obit))) (set pc label))) ;gt
8148 ((#x06) (if (not (xor sbit obit)) (set pc label))) ;ge
8149 ((#x08) (if (trunc BI cbit) (set pc label))) ;geu c
8150 ((#x09) (if (and cbit (not zbit)) (set pc label))) ;gtu
8151 ((#x0a) (if (trunc BI zbit) (set pc label))) ;eq z
8152 ((#x0b) (if (trunc BI sbit) (set pc label))) ;n
8153 ((#x0c) (if (trunc BI obit) (set pc label))) ;o
8154 ((#x0d) (if (or zbit (xor sbit obit)) (set pc label))) ;le
8155 ((#x0e) (if (xor sbit obit) (set pc label))) ;lt
8156 )
8157 )
8158 )
8159
8160 (define-pmacro (jcnd16-sem cnd label)
8161 (sequence ()
8162 (case DFLT cnd
8163 ((#x00) (if (trunc BI cbit) (set pc label))) ;geu c
8164 ((#x01) (if (and cbit (not zbit)) (set pc label))) ;gtu
8165 ((#x02) (if (trunc BI zbit) (set pc label))) ;eq z
8166 ((#x03) (if (trunc BI sbit) (set pc label))) ;n
8167 ((#x04) (if (not cbit) (set pc label))) ;ltu nc
8168 ((#x05) (if (not (and cbit (not zbit))) (set pc label))) ;leu
8169 ((#x06) (if (not zbit) (set pc label))) ;ne nz
8170 ((#x07) (if (not sbit) (set pc label))) ;pz
8171 ((#x08) (if (or zbit (xor sbit obit)) (set pc label))) ;le
8172 ((#x09) (if (trunc BI obit) (set pc label))) ;o
8173 ((#x0a) (if (not (xor sbit obit)) (set pc label))) ;ge
8174 ((#x0c) (if (not (or zbit (xor sbit obit))) (set pc label))) ;gt
8175 ((#x0d) (if (not obit) (set pc label))) ;no
8176 ((#x0e) (if (xor sbit obit) (set pc label))) ;lt
8177 )
8178 )
8179 )
8180
8181 (dni jcnd16-5
8182 "jCnd label"
8183 (RL_JUMP RELAXABLE (machine 16))
8184 "j$cond16j5 ${Lab-8-8}"
8185 (+ (f-0-4 #x6) (f-4-1 1) cond16j5 Lab-8-8)
8186 (jcnd16-sem cond16j5 Lab-8-8)
8187 ()
8188 )
8189
8190 (dni jcnd16
8191 "jCnd label"
8192 (RL_JUMP RELAXABLE (machine 16))
8193 "j$cond16j ${Lab-16-8}"
8194 (+ (f-0-4 #x7) (f-4-4 #xD) (f-8-4 #xC) cond16j Lab-16-8)
8195 (jcnd16-sem cond16j Lab-16-8)
8196 ()
8197 )
8198
8199 (dni jcnd32
8200 "jCnd label"
8201 (RL_JUMP RELAXABLE (machine 32))
8202 "j$cond32j ${Lab-8-8}"
8203 (+ (f-0-1 1) (f-4-3 5) cond32j Lab-8-8)
8204 (jcnd32-sem cond32j Lab-8-8)
8205 ()
8206 )
8207
8208 ;-------------------------------------------------------------
8209 ; jmp - jump
8210 ;-------------------------------------------------------------
8211
8212 ; jmp.s label3 (m16 #1)
8213 (dni jmp16.s "jmp.s Lab-5-3" (RL_JUMP RELAXABLE (machine 16))
8214 ("jmp.s ${Lab-5-3}")
8215 (+ (f-0-4 6) (f-4-1 0) Lab-5-3)
8216 (sequence () (set pc Lab-5-3))
8217 ())
8218 ; jmp.b label8 (m16 #2)
8219 (dni jmp16.b "jmp.b Lab-8-8" (RL_JUMP RELAXABLE (machine 16))
8220 ("jmp.b ${Lab-8-8}")
8221 (+ (f-0-4 #xF) (f-4-4 #xE) Lab-8-8)
8222 (sequence () (set pc Lab-8-8))
8223 ())
8224 ; jmp.w label16 (m16 #3)
8225 (dni jmp16.w "jmp.w Lab-8-16" (RL_JUMP RELAXABLE (machine 16))
8226 ("jmp.w ${Lab-8-16}")
8227 (+ (f-0-4 #xF) (f-4-4 4) Lab-8-16)
8228 (sequence () (set pc Lab-8-16))
8229 ())
8230 ; jmp.a label24 (m16 #4)
8231 (dni jmp16.a "jmp.a Lab-8-24" (RL_JUMP RELAXABLE (machine 16))
8232 ("jmp.a ${Lab-8-24}")
8233 (+ (f-0-4 #xF) (f-4-4 #xC) Lab-8-24)
8234 (sequence () (set pc Lab-8-24))
8235 ())
8236
8237 (define-pmacro (jmp16-sem mode dst)
8238 (set pc (and dst #xfffff))
8239 )
8240 (define-pmacro (jmp32-sem mode dst)
8241 (set pc dst)
8242 )
8243 ; jmpi.w dst (m16 #1 m32 #2)
8244 (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)
8245 (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)
8246 ; jmpi.a dst (m16 #2 m32 #2)
8247 (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)
8248 (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)
8249 ; jmps imm8 (m16 #1)
8250 (dni jmps16 "jmps Imm-8-QI" ((machine 16))
8251 ("jmps #${Imm-8-QI}")
8252 (+ (f-0-4 #xE) (f-4-4 #xE) Imm-8-QI)
8253 (sequence () (set pc Imm-8-QI))
8254 ())
8255 ; jmp.s label3 (m32 #1)
8256 (dni jmp32.s
8257 "jmp.s label"
8258 (RL_JUMP RELAXABLE (machine 32))
8259 "jmp.s ${Lab32-jmp-s}"
8260 (+ (f-0-2 1) (f-4-3 5) Lab32-jmp-s)
8261 (set pc Lab32-jmp-s)
8262 ()
8263 )
8264 ; jmp.b label8 (m32 #2)
8265 (dni jmp32.b "jmp.b Lab-8-8" (RL_JUMP RELAXABLE (machine 32))
8266 ("jmp.b ${Lab-8-8}")
8267 (+ (f-0-4 #xB) (f-4-4 #xB) Lab-8-8)
8268 (set pc Lab-8-8)
8269 ())
8270 ; jmp.w label16 (m32 #3)
8271 (dni jmp32.w "jmp.w Lab-8-16" (RL_JUMP RELAXABLE (machine 32))
8272 ("jmp.w ${Lab-8-16}")
8273 (+ (f-0-4 #xC) (f-4-4 #xE) Lab-8-16)
8274 (set pc Lab-8-16)
8275 ())
8276 ; jmp.a label24 (m32 #4)
8277 (dni jmp32.a "jmp.a Lab-8-24" (RL_JUMP RELAXABLE (machine 32))
8278 ("jmp.a ${Lab-8-24}")
8279 (+ (f-0-4 #xC) (f-4-4 #xC) Lab-8-24)
8280 (set pc Lab-8-24)
8281 ())
8282 ; jmp.s imm8 (m32 #1)
8283 (dni jmps32 "jmps Imm-8-QI" (RL_JUMP (machine 32))
8284 ("jmps #${Imm-8-QI}")
8285 (+ (f-0-4 #xD) (f-4-4 #xC) Imm-8-QI)
8286 (set pc Imm-8-QI)
8287 ())
8288
8289 ;-------------------------------------------------------------
8290 ; jsr jump subroutine
8291 ;-------------------------------------------------------------
8292
8293 (define-pmacro (jsr16-sem length dst)
8294 (sequence ((SI tpc))
8295 (set tpc (add pc length))
8296 (set (reg h-sp) (sub (reg h-sp) 2))
8297 (set (mem16 HI (reg h-sp)) (srl (and tpc #xffff00) 8))
8298 (set (reg h-sp) (sub (reg h-sp) 1))
8299 (set (mem16 QI (reg h-sp)) (and tpc #xff))
8300 (set pc dst)
8301 )
8302 )
8303 (define-pmacro (jsr32-sem length dst)
8304 (sequence ((SI tpc))
8305 (set tpc (add pc length))
8306 (set (reg h-sp) (sub (reg h-sp) 2))
8307 (set (mem32 HI (reg h-sp)) (srl (and tpc #xffff0000) 16))
8308 (set (reg h-sp) (sub (reg h-sp) 2))
8309 (set (mem32 HI (reg h-sp)) (and tpc #xffff))
8310 (set pc dst)
8311 )
8312 )
8313
8314 ; jsr.w label16 (m16 #1)
8315 (dni jsr16.w "jsr.w Lab-8-16" (RL_JUMP RELAXABLE (machine 16))
8316 ("jsr.w ${Lab-8-16}")
8317 (+ (f-0-4 #xF) (f-4-4 5) Lab-8-16)
8318 (jsr16-sem 3 Lab-8-16)
8319 ())
8320 ; jsr.a label24 (m16 #2)
8321 (dni jsr16.a "jsr.a Lab-8-24" (RL_JUMP RELAXABLE (machine 16))
8322 ("jsr.a ${Lab-8-24}")
8323 (+ (f-0-4 #xF) (f-4-4 #xD) Lab-8-24)
8324 (jsr16-sem 4 Lab-8-24)
8325 ())
8326 (define-pmacro (jsri-defn mode op16 op16-1 op16-2 op16-3 op16-sem
8327 op32 op32-1 op32-2 op32-3 op32-4 op32-sem len)
8328 (begin
8329 (dni (.sym jsri16 mode - op16)
8330 (.str "jsri." mode " " op16)
8331 (RL_1ADDR (machine 16))
8332 (.str "jsri." mode " ${" op16 "}")
8333 (+ op16-1 op16-2 op16-3 op16)
8334 (op16-sem len op16)
8335 ())
8336 (dni (.sym jsri32 mode - op32)
8337 (.str "jsri." mode " " op32)
8338 (RL_1ADDR (machine 32))
8339 (.str "jsri." mode " ${" op32 "}")
8340 (+ op32-1 op32-2 op32-3 op32-4 op32)
8341 (op32-sem len op32)
8342 ())
8343 )
8344 )
8345 ; jsri.w dst (m16 #1 m32 #1))
8346 (jsri-defn w dst16-16-20ar-HI (f-0-4 #x7) (f-4-4 #xD) (f-8-4 #x3) jsr16-sem
8347 dst32-16-24-Unprefixed-HI (f-0-4 #xC) (f-7-1 1) (f-10-2 #x1) (f-12-4 #xF) jsr32-sem 4)
8348 (jsri-defn w dst16-16-16sa-HI (f-0-4 #x7) (f-4-4 #xD) (f-8-4 #x3) jsr16-sem
8349 dst32-16-16sa-Unprefixed-HI (f-0-4 #xC) (f-7-1 1) (f-10-2 #x1) (f-12-4 #xF) jsr32-sem 4)
8350 (jsri-defn w dst16-16-8-HI (f-0-4 #x7) (f-4-4 #xD) (f-8-4 #x3) jsr16-sem
8351 dst32-16-8-Unprefixed-HI (f-0-4 #xC) (f-7-1 1) (f-10-2 #x1) (f-12-4 #xF) jsr32-sem 3)
8352 (jsri-defn w dst16-basic-HI (f-0-4 #x7) (f-4-4 #xD) (f-8-4 #x3) jsr16-sem
8353 dst32-basic-Unprefixed-HI (f-0-4 #xC) (f-7-1 1) (f-10-2 #x1) (f-12-4 #xF) jsr32-sem 2)
8354
8355 ; jsri.a (m16 #2 m32 #2)
8356 (jsri-defn a dst16-16-20ar-SI (f-0-4 #x7) (f-4-4 #xD) (f-8-4 #x1) jsr16-sem
8357 dst32-16-24-Unprefixed-SI (f-0-4 #x9) (f-7-1 0) (f-10-2 #x0) (f-12-4 #x1) jsr32-sem 4)
8358 (jsri-defn a dst16-16-8-SI (f-0-4 #x7) (f-4-4 #xD) (f-8-4 #x1) jsr16-sem
8359 dst32-16-8-Unprefixed-SI (f-0-4 #x9) (f-7-1 0) (f-10-2 #x0) (f-12-4 #x1) jsr32-sem 3)
8360 (jsri-defn a dst16-16-16sa-SI (f-0-4 #x7) (f-4-4 #xD) (f-8-4 #x1) jsr16-sem
8361 dst32-16-16sa-Unprefixed-SI (f-0-4 #x9) (f-7-1 0) (f-10-2 #x0) (f-12-4 #x1) jsr32-sem 4)
8362 (jsri-defn a dst16-basic-SI (f-0-4 #x7) (f-4-4 #xD) (f-8-4 #x1) jsr16-sem
8363 dst32-basic-Unprefixed-SI (f-0-4 #x9) (f-7-1 0) (f-10-2 #x0) (f-12-4 #x1) jsr32-sem 2)
8364
8365 (dni jsri32.a "jsr.w dst32-16-24-Unprefixed-HI" (RL_1ADDR (machine 32))
8366 ("jsri.a ${dst32-16-24-Unprefixed-SI}")
8367 (+ (f-0-4 #x9) (f-7-1 0) dst32-16-24-Unprefixed-SI (f-10-2 #x0) (f-12-4 #x1))
8368 (jsr32-sem 6 dst32-16-24-Unprefixed-SI)
8369 ())
8370 ; jsr.w label16 (m32 #1)
8371 (dni jsr32.w "jsr.w label" (RL_JUMP RELAXABLE (machine 32))
8372 ("jsr.w ${Lab-8-16}")
8373 (+ (f-0-4 #xC) (f-4-4 #xF) Lab-8-16)
8374 (jsr32-sem 3 Lab-8-16)
8375 ())
8376 ; jsr.a label16 (m32 #2)
8377 (dni jsr32.a "jsr.a label" (RL_JUMP (machine 32))
8378 ("jsr.a ${Lab-8-24}")
8379 (+ (f-0-4 #xC) (f-4-4 #xD) Lab-8-24)
8380 (jsr32-sem 4 Lab-8-24)
8381 ())
8382 ; jsrs imm8 (m16 #1)
8383 (dni jsrs16 "jsrs Imm-8-QI" ((machine 16))
8384 ("jsrs #${Imm-8-QI}")
8385 (+ (f-0-4 #xE) (f-4-4 #xF) Imm-8-QI)
8386 (jsr16-sem 2 Imm-8-QI)
8387 ())
8388 ; jsrs imm8 (m32 #1)
8389 (dni jsrs "jsrs #Imm-8-QI" ((machine 32))
8390 ("jsrs #${Imm-8-QI}")
8391 (+ (f-0-4 #xD) (f-4-4 #xD) Imm-8-QI)
8392 (jsr32-sem 2 Imm-8-QI)
8393 ())
8394
8395 ;-------------------------------------------------------------
8396 ; ldc - load control register
8397 ; stc - store control register
8398 ;-------------------------------------------------------------
8399
8400 (define-pmacro (ldc32-cr1-sem src dst)
8401 (sequence ()
8402 (case DFLT dst
8403 ((#x0) (set (reg h-dct0) src))
8404 ((#x1) (set (reg h-dct1) src))
8405 ((#x2) (sequence ((HI tflag))
8406 (set tflag src)
8407 (if (and tflag #x1) (set cbit 1))
8408 (if (and tflag #x2) (set dbit 1))
8409 (if (and tflag #x4) (set zbit 1))
8410 (if (and tflag #x8) (set sbit 1))
8411 (if (and tflag #x10) (set bbit 1))
8412 (if (and tflag #x20) (set obit 1))
8413 (if (and tflag #x40) (set ibit 1))
8414 (if (and tflag #x80) (set ubit 1))))
8415 ((#x3) (set (reg h-svf) src))
8416 ((#x4) (set (reg h-drc0) src))
8417 ((#x5) (set (reg h-drc1) src))
8418 ((#x6) (set (reg h-dmd0) src))
8419 ((#x7) (set (reg h-dmd1) src))
8420 )
8421 )
8422 )
8423 (define-pmacro (ldc32-cr2-sem src dst)
8424 (sequence ()
8425 (case DFLT dst
8426 ((#x0) (set (reg h-intb) src))
8427 ((#x1) (set (reg h-sp) src))
8428 ((#x2) (set (reg h-sb) src))
8429 ((#x3) (set (reg h-fb) src))
8430 ((#x4) (set (reg h-svp) src))
8431 ((#x5) (set (reg h-vct) src))
8432 ((#x7) (set (reg h-isp) src))
8433 )
8434 )
8435 )
8436 (define-pmacro (ldc32-cr3-sem src dst)
8437 (sequence ()
8438 (case DFLT dst
8439 ((#x2) (set (reg h-dma0) src))
8440 ((#x3) (set (reg h-dma1) src))
8441 ((#x4) (set (reg h-dra0) src))
8442 ((#x5) (set (reg h-dra1) src))
8443 ((#x6) (set (reg h-dsa0) src))
8444 ((#x7) (set (reg h-dsa1) src))
8445 )
8446 )
8447 )
8448 (define-pmacro (ldc16-sem src dst)
8449 (sequence ()
8450 (case DFLT dst
8451 ((#x1) (set (reg h-intb) src))
8452 ((#x2) (set (reg h-intb) (or (reg h-intb) (sll src (const 16)))))
8453 ((#x3) (sequence ((HI tflag))
8454 (set tflag src)
8455 (if (and tflag #x1) (set cbit 1))
8456 (if (and tflag #x2) (set dbit 1))
8457 (if (and tflag #x4) (set zbit 1))
8458 (if (and tflag #x8) (set sbit 1))
8459 (if (and tflag #x10) (set bbit 1))
8460 (if (and tflag #x20) (set obit 1))
8461 (if (and tflag #x40) (set ibit 1))
8462 (if (and tflag #x80) (set ubit 1))))
8463 ((#x4) (set (reg h-isp) src))
8464 ((#x5) (set (reg h-sp) src))
8465 ((#x6) (set (reg h-sb) src))
8466 ((#x7) (set (reg h-fb) src))
8467 )
8468 )
8469 )
8470
8471 (define-pmacro (stc32-cr1-sem src dst)
8472 (sequence ()
8473 (case DFLT src
8474 ((#x0) (set dst (reg h-dct0)))
8475 ((#x1) (set dst (reg h-dct1)))
8476 ((#x2) (sequence ((HI tflag))
8477 (set tflag 0)
8478 (if (eq cbit 1) (set tflag (or tflag #x1)))
8479 (if (eq dbit 1) (set tflag (or tflag #x2)))
8480 (if (eq zbit 1) (set tflag (or tflag #x4)))
8481 (if (eq sbit 1) (set tflag (or tflag #x8)))
8482 (if (eq bbit 1) (set tflag (or tflag #x10)))
8483 (if (eq obit 1) (set tflag (or tflag #x20)))
8484 (if (eq ibit 1) (set tflag (or tflag #x40)))
8485 (if (eq ubit 1) (set tflag (or tflag #x80)))
8486 (set dst tflag)))
8487 ((#x3) (set dst (reg h-svf)))
8488 ((#x4) (set dst (reg h-drc0)))
8489 ((#x5) (set dst (reg h-drc1)))
8490 ((#x6) (set dst (reg h-dmd0)))
8491 ((#x7) (set dst (reg h-dmd1)))
8492 )
8493 )
8494 )
8495 (define-pmacro (stc32-cr2-sem src dst)
8496 (sequence ()
8497 (case DFLT src
8498 ((#x0) (set dst (reg h-intb)))
8499 ((#x1) (set dst (reg h-sp)))
8500 ((#x2) (set dst (reg h-sb)))
8501 ((#x3) (set dst (reg h-fb)))
8502 ((#x4) (set dst (reg h-svp)))
8503 ((#x5) (set dst (reg h-vct)))
8504 ((#x7) (set dst (reg h-isp)))
8505 )
8506 )
8507 )
8508 (define-pmacro (stc32-cr3-sem src dst)
8509 (sequence ()
8510 (case DFLT src
8511 ((#x2) (set dst (reg h-dma0)))
8512 ((#x3) (set dst (reg h-dma1)))
8513 ((#x4) (set dst (reg h-dra0)))
8514 ((#x5) (set dst (reg h-dra1)))
8515 ((#x6) (set dst (reg h-dsa0)))
8516 ((#x7) (set dst (reg h-dsa1)))
8517 )
8518 )
8519 )
8520 (define-pmacro (stc16-sem src dst)
8521 (sequence ()
8522 (case DFLT src
8523 ((#x1) (set dst (and (reg h-intb) (const #xffff))))
8524 ((#x2) (set dst (srl (reg h-intb) (const 16))))
8525 ((#x3) (sequence ((HI tflag))
8526 (set tflag 0)
8527 (if (eq cbit 1) (set tflag (or tflag #x1)))
8528 (if (eq dbit 1) (set tflag (or tflag #x2)))
8529 (if (eq zbit 1) (set tflag (or tflag #x4)))
8530 (if (eq sbit 1) (set tflag (or tflag #x8)))
8531 (if (eq bbit 1) (set tflag (or tflag #x10)))
8532 (if (eq obit 1) (set tflag (or tflag #x20)))
8533 (if (eq ibit 1) (set tflag (or tflag #x40)))
8534 (if (eq ubit 1) (set tflag (or tflag #x80)))
8535 (set dst tflag)))
8536 ((#x4) (set dst (reg h-isp)))
8537 ((#x5) (set dst (reg h-sp)))
8538 ((#x6) (set dst (reg h-sb)))
8539 ((#x7) (set dst (reg h-fb)))
8540 )
8541 )
8542 )
8543
8544 (dni ldc16.imm16 "ldc #imm,dst" ((machine 16))
8545 ("ldc #${Imm-16-HI},${cr16}")
8546 (+ (f-0-4 #xE) (f-4-4 #xB) (f-8-1 0) (f-12-4 0) cr16 Imm-16-HI)
8547 (ldc16-sem Imm-16-HI cr16)
8548 ())
8549
8550 (dni ldc16.dst "ldc src,dest" ((machine 16))
8551 ("ldc ${dst16-16-HI},${cr16}")
8552 (+ (f-0-4 7) (f-4-4 #xA) (f-8-1 1) cr16 dst16-16-HI)
8553 (ldc16-sem dst16-16-HI cr16)
8554 ())
8555 ; ldc src,dest (m32c #4)
8556 (dni ldc32.src-cr1 "ldc src,dst" ((machine 32))
8557 ("ldc ${dst32-24-Prefixed-HI},${cr1-Prefixed-32}")
8558 (+ (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)
8559 (ldc32-cr1-sem dst32-24-Prefixed-HI cr1-Prefixed-32)
8560 ())
8561 ; ldc src,dest (m32c #5)
8562 (dni ldc32.src-cr2 "ldc src,dest" ((machine 32))
8563 ("ldc ${dst32-16-Unprefixed-SI},${cr2-32}")
8564 (+ (f-0-4 #xD) dst32-16-Unprefixed-SI (f-7-1 1) (f-10-2 0) (f-12-1 0) cr2-32)
8565 (ldc32-cr2-sem dst32-16-Unprefixed-SI cr2-32)
8566 ())
8567 ; ldc src,dest (m32c #6)
8568 (dni ldc32.src-cr3 "ldc src,dst" ((machine 32))
8569 ("ldc ${dst32-24-Prefixed-SI},${cr3-Prefixed-32}")
8570 (+ (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)
8571 (ldc32-cr3-sem dst32-24-Prefixed-SI cr3-Prefixed-32)
8572 ())
8573 ; ldc src,dest (m32c #1)
8574 (dni ldc32.imm16-cr1 "ldc #imm,dst" ((machine 32))
8575 ("ldc #${Imm-16-HI},${cr1-Unprefixed-32}")
8576 (+ (f-0-4 #xD) (f-4-4 5) (f-8-4 #xA) (f-12-1 1) cr1-Unprefixed-32 Imm-16-HI)
8577 (ldc32-cr1-sem Imm-16-HI cr1-Unprefixed-32)
8578 ())
8579 ; ldc src,dest (m32c #2)
8580 (dni ldc32.imm16-cr2 "ldc #imm,dst" ((machine 32))
8581 ("ldc #${Dsp-16-u24},${cr2-32}")
8582 (+ (f-0-4 #xD) (f-4-4 5) (f-8-4 2) (f-12-1 1) cr2-32 Dsp-16-u24)
8583 (ldc32-cr2-sem Dsp-16-u24 cr2-32)
8584 ())
8585 ; ldc src,dest (m32c #3)
8586 (dni ldc32.imm16-cr3 "ldc #imm,dst" ((machine 32))
8587 ("ldc #${Dsp-16-u24},${cr3-Unprefixed-32}")
8588 (+ (f-0-4 #xD) (f-4-4 5) (f-8-4 6) (f-12-1 1) cr3-Unprefixed-32 Dsp-16-u24)
8589 (ldc32-cr3-sem Dsp-16-u24 cr3-Unprefixed-32)
8590 ())
8591
8592 (dni stc16.src "stc src,dest" ((machine 16))
8593 ("stc ${cr16},${dst16-16-HI}")
8594 (+ (f-0-4 7) (f-4-4 #xB) (f-8-1 1) cr16 dst16-16-HI)
8595 (stc16-sem cr16 dst16-16-HI )
8596 ())
8597
8598 (dni stc16.pc "stc pc,dest" ((machine 16))
8599 ("stc pc,${dst16-16-HI}")
8600 (+ (f-0-4 7) (f-4-4 #xC) (f-8-4 #xC) dst16-16-HI)
8601 (sequence () (set dst16-16-HI (reg h-pc)))
8602 ())
8603
8604 (dni stc32.src-cr1 "stc src,dst" ((machine 32))
8605 ("stc ${cr1-Prefixed-32},${dst32-24-Prefixed-HI}")
8606 (+ (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)
8607 (stc32-cr1-sem cr1-Prefixed-32 dst32-24-Prefixed-HI )
8608 ())
8609
8610 (dni stc32.src-cr2 "stc src,dest" ((machine 32))
8611 ("stc ${cr2-32},${dst32-16-Unprefixed-SI}")
8612 (+ (f-0-4 #xD) dst32-16-Unprefixed-SI (f-7-1 1) (f-10-2 0) (f-12-1 2) cr2-32)
8613 (stc32-cr2-sem cr2-32 dst32-16-Unprefixed-SI )
8614 ())
8615
8616 (dni stc32.src-cr3 "stc src,dst" ((machine 32))
8617 ("stc ${cr3-Prefixed-32},${dst32-24-Prefixed-SI}")
8618 (+ (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)
8619 (stc32-cr3-sem cr3-Prefixed-32 dst32-24-Prefixed-SI )
8620 ())
8621
8622 ;-------------------------------------------------------------
8623 ; ldctx - load context
8624 ; stctx - store context
8625 ;-------------------------------------------------------------
8626
8627 ; ??? semantics
8628 (dni ldctx16 "ldctx abs16,abs24" ((machine 16))
8629 ("ldctx ${Dsp-16-u16},${Dsp-32-u24}")
8630 (+ (f-0-4 #x7) (f-4-4 #xC) (f-8-4 #xF) (f-12-4 #x0) Dsp-16-u16 Dsp-32-u24)
8631 (nop)
8632 ())
8633 (dni ldctx32 "ldctx abs16,abs24" ((machine 32))
8634 ("ldctx ${Dsp-16-u16},${Dsp-32-u24}")
8635 (+ (f-0-4 #xB) (f-4-4 #x6) (f-8-4 #xC) (f-12-4 #x3) Dsp-16-u16 Dsp-32-u24)
8636 (nop)
8637 ())
8638 (dni stctx16 "stctx abs16,abs24" ((machine 16))
8639 ("stctx ${Dsp-16-u16},${Dsp-32-u24}")
8640 (+ (f-0-4 #x7) (f-4-4 #xD) (f-8-4 #xF) (f-12-4 #x0) Dsp-16-u16 Dsp-32-u24)
8641 (nop)
8642 ())
8643 (dni stctx32 "stctx abs16,abs24" ((machine 32))
8644 ("stctx ${Dsp-16-u16},${Dsp-32-u24}")
8645 (+ (f-0-4 #xB) (f-4-4 #x6) (f-8-4 #xD) (f-12-4 #x3) Dsp-16-u16 Dsp-32-u24)
8646 (nop)
8647 ())
8648
8649 ;-------------------------------------------------------------
8650 ; lde - load from extra far data area (m16)
8651 ; ste - store to extra far data area (m16)
8652 ;-------------------------------------------------------------
8653
8654 (lde-dst QI .b 0)
8655 (lde-dst HI .w 1)
8656
8657 (ste-dst QI .b 0)
8658 (ste-dst HI .w 1)
8659
8660 ;-------------------------------------------------------------
8661 ; ldipl - load interrupt permission level
8662 ;-------------------------------------------------------------
8663
8664 ; ??? semantics
8665 ; ldintb <==> ldc #imm,intbh ; ldc #imm,intbl
8666
8667 (dni ldipl16.imm "ldipl #imm" ((machine 16))
8668 ("ldipl #${Imm-13-u3}")
8669 (+ (f-0-4 #x7) (f-4-4 #xD) (f-8-4 #xA) (f-12-1 0) Imm-13-u3)
8670 (nop)
8671 ())
8672 (dni ldipl32.imm "ldipl #imm" ((machine 32))
8673 ("ldipl #${Imm-13-u3}")
8674 (+ (f-0-4 #xD) (f-4-4 5) (f-8-4 #xE) (f-12-1 1) Imm-13-u3)
8675 (nop)
8676 ())
8677
8678
8679 ;-------------------------------------------------------------
8680 ; max - maximum value
8681 ;-------------------------------------------------------------
8682
8683 ; TODO check semantics for min -1,0
8684 (define-pmacro (max-sem mode src dst)
8685 (sequence ()
8686 (if (gt mode src dst)
8687 (set mode dst src)))
8688 )
8689
8690 ; max.size:G #imm,dst
8691 (binary-arith32-imm-dst-Prefixed QI QI .b 0 max X #x8 #x3 #xF max-sem)
8692 (binary-arith32-imm-dst-Prefixed HI HI .w 1 max X #x8 #x3 #xF max-sem)
8693
8694 ; max.BW:G src,dst
8695 (binary-arith32-src-dst-Prefixed QI QI .b 0 max X #x1 #xD max-sem)
8696 (binary-arith32-src-dst-Prefixed HI HI .w 1 max X #x1 #xD max-sem)
8697
8698 ;-------------------------------------------------------------
8699 ; min - minimum value
8700 ;-------------------------------------------------------------
8701
8702 (define-pmacro (min-sem mode src dst)
8703 (sequence ()
8704 (if (lt mode src dst)
8705 (set mode dst src)))
8706 )
8707
8708 ; min.size:G #imm,dst
8709 (binary-arith32-imm-dst-Prefixed QI QI .b 0 min X #x8 #x2 #xF min-sem)
8710 (binary-arith32-imm-dst-Prefixed HI HI .w 1 min X #x8 #x2 #xF min-sem)
8711
8712 ; min.BW:G src,dst
8713 (binary-arith32-src-dst-Prefixed QI QI .b 0 min X #x1 #xC min-sem)
8714 (binary-arith32-src-dst-Prefixed HI HI .w 1 min X #x1 #xC min-sem)
8715
8716 ;-------------------------------------------------------------
8717 ; mov - move
8718 ;-------------------------------------------------------------
8719
8720 (define-pmacro (mov-sem mode src1 dst)
8721 (sequence ((mode result))
8722 (set result src1)
8723 (set-z-and-s result)
8724 (set mode dst src1))
8725 )
8726
8727 (define-pmacro (mov-dspsp-dst-sem mach mode src1 dst)
8728 (set dst (mem-mach mach mode (add sp src1)))
8729 )
8730
8731 (define-pmacro (mov-src-dspsp-sem mach mode src dst1)
8732 (set (mem-mach mach mode (add sp dst1)) src)
8733 )
8734
8735 (define-pmacro (mov16-imm-an-defn size mode imm regn op1 op2)
8736 (dni (.sym mov16. size .S-imm- regn)
8737 (.str "mov." size ":S " imm "," regn)
8738 ((machine 16))
8739 (.str "mov." size "$S #${" imm "}," regn)
8740 (+ op1 op2 imm)
8741 (mov-sem mode imm (reg (.sym h- regn)))
8742 ())
8743 )
8744 ; mov.size:G #imm,dst (m16 #1 m32 #1)
8745 (binary-arith-imm-dst mov G (f-0-4 7) (f-4-3 2) (f-8-4 #xC) #x9 #x2 #xF mov-sem)
8746 ; mov.L:G #imm32,dst (m32 #2)
8747 (binary-arith32-imm-dst-defn SI SI .l 0 mov G #xB #x3 #x1 mov-sem)
8748 ; mov.BW:S #imm,dst2 (m32 #4)
8749 (binary-arith32-s-imm-dst QI .b 0 mov #x0 #x2 mov-sem)
8750 (binary-arith32-s-imm-dst HI .w 1 mov #x0 #x2 mov-sem)
8751 ; mov.b:S #imm8,dst3 (m16 #3)
8752 (binary-arith16-b-S-imm8-dst3 mov ".b" (f-0-4 #xC) (f-4-1 0) mov-sem)
8753 ; mov.b:S #imm8,aN (m16 #4)
8754 (mov16-imm-an-defn b QI Imm-8-QI a0 (f-0-4 #xE) (f-4-4 2))
8755 (mov16-imm-an-defn b QI Imm-8-QI a1 (f-0-4 #xE) (f-4-4 #xA))
8756 (mov16-imm-an-defn w HI Imm-8-HI a0 (f-0-4 #xA) (f-4-4 2))
8757 (mov16-imm-an-defn w HI Imm-8-HI a1 (f-0-4 #xA) (f-4-4 #xA))
8758 ; mov.WL:S #imm,A0/A1 (m32 #5)
8759 (define-pmacro (mov32-wl-s-defn mode sz op1 imm regn op2)
8760 (dni (.sym mov32- sz - regn)
8761 (.str "mov." sz ":s" imm "," regn)
8762 ((machine 32))
8763 (.str "mov." sz "$S #${" imm "}," regn)
8764 (+ (f-0-4 op1) (f-4-4 op2) imm)
8765 (mov-sem mode imm (reg (.sym h- regn)))
8766 ())
8767 )
8768 (mov32-wl-s-defn HI w #x9 Imm-8-HI a0 #xC)
8769 (mov32-wl-s-defn HI w #x9 Imm-8-HI a1 #xD)
8770 (mov32-wl-s-defn SI l #xB Dsp-8-s24 a0 #xC)
8771 (mov32-wl-s-defn SI l #xB Dsp-8-s24 a1 #xD)
8772
8773 ; mov.size:Q #imm4,dst (m16 #2 m32 #3)
8774 (binary-arith16-imm4-dst-defn QI .b 0 0 mov (f-0-4 #xD) (f-4-3 4) mov-sem)
8775 (binary-arith16-imm4-dst-defn HI .w 0 1 mov (f-0-4 #xD) (f-4-3 4) mov-sem)
8776 (binary-arith32-imm4-dst-defn QI .b 1 0 mov #x7 #x2 mov-sem)
8777 (binary-arith32-imm4-dst-defn HI .w 1 1 mov #x7 #x2 mov-sem)
8778
8779 ; mov.BW:Z #0,dst (m16 #5 m32 #6)
8780 (dni mov16.b-Z-imm8-dst3
8781 "mov.b:Z #0,Dst16-3-S-8"
8782 ((machine 16))
8783 "mov.b$Z #0,${Dst16-3-S-8}"
8784 (+ (f-0-4 #xB) (f-4-1 #x0) Dst16-3-S-8)
8785 (mov-sem QI (const 0) Dst16-3-S-8)
8786 ())
8787 ; (binary-arith16-b-Z-imm8-dst3 mov ".b" (f-0-4 #xB) (f-4-1 0) mov-sem)
8788 (binary-arith32-z-imm-dst QI .b 0 mov #x0 #x1 mov-sem)
8789 (binary-arith32-z-imm-dst HI .w 1 mov #x0 #x1 mov-sem)
8790 ; mov.BW:G src,dst (m16 #6 m32 #7)
8791 (binary-arith-src-dst mov G (f-0-4 #x7) (f-4-3 1) #x1 #xB mov-sem)
8792 ; mov.B:S src2,a0/a1 (m16 #7)
8793 (dni (.sym mov 16 .b.S-An)
8794 (.str mov ".b:S src2,a[01]")
8795 ((machine 16))
8796 (.str mov ".b$S ${src16-2-S},${Dst16AnQI-S}")
8797 (+ (f-0-4 #x3) (f-4-1 0) Dst16AnQI-S src16-2-S)
8798 (mov-sem QI src16-2-S Dst16AnQI-S)
8799 ())
8800 (define-pmacro (mov16-b-s-an-defn op1 op2 op2c)
8801 (dni (.sym mov16.b.S- op1 - op2)
8802 (.str mov ".b:S " op1 "," op2)
8803 ((machine 16))
8804 (.str mov ".b$S " op1 "," op2)
8805 (+ (f-0-4 #x3) op2c)
8806 (mov-sem QI (reg (.sym h- op1)) (reg (.sym h- op2)))
8807 ())
8808 )
8809 (mov16-b-s-an-defn r0l a1 (f-4-4 #x4))
8810 (mov16-b-s-an-defn r0h a0 (f-4-4 #x0))
8811
8812 ; mov.L:G src,dst (m32 #8)
8813 (binary-arith32-src-dst-defn SI SI .l 1 mov G #x1 #x3 mov-sem)
8814 ; mov.B:S r0l/r0h,dst2 (m16 #8)
8815 (dni (.sym mov 16 .b.S-Rn-An)
8816 (.str mov ".b:S r0[lh],src2")
8817 ((machine 16))
8818 (.str mov ".b$S ${Dst16RnQI-S},${src16-2-S}")
8819 (+ (f-0-4 #x0) (f-4-1 0) Dst16RnQI-S src16-2-S)
8820 (mov-sem QI src16-2-S Dst16RnQI-S)
8821 ())
8822
8823 ; mov.B.S src2,r0l/r0h (m16 #9)
8824 (binary-arith16-b-S-src2 mov (f-0-4 0) (f-4-1 1) mov-sem)
8825
8826 ; mov.BW:S src2,r0l/r0 (m32 #9)
8827 ; mov.BW:S src2,r1l/r1 (m32 #10)
8828 (define-pmacro (mov32-src-r sz szcode mode src dst opc1 opc2)
8829 (begin
8830 (dni (.sym mov32. sz - src - dst)
8831 (.str "mov." sz "src," dst)
8832 ((machine 32))
8833 (.str "mov." sz "$S ${" (.sym src - mode) "}," dst)
8834 (+ (f-0-2 opc1) (.sym src - mode) (f-4-3 opc2) (f-7-1 szcode))
8835 (mov-sem mode (.sym src - mode) (reg (.sym h- dst)))
8836 ())
8837 )
8838 )
8839 (mov32-src-r b 0 QI dst32-2-S-16 r0l 0 4)
8840 (mov32-src-r w 1 HI dst32-2-S-16 r0 0 4)
8841 (mov32-src-r b 0 QI dst32-2-S-8 r0l 0 4)
8842 (mov32-src-r w 1 HI dst32-2-S-8 r0 0 4)
8843 (mov32-src-r b 0 QI dst32-2-S-basic r1l 1 7)
8844 (mov32-src-r w 1 HI dst32-2-S-basic r1 1 7)
8845 (mov32-src-r b 0 QI dst32-2-S-16 r1l 1 7)
8846 (mov32-src-r w 1 HI dst32-2-S-16 r1 1 7)
8847 (mov32-src-r b 0 QI dst32-2-S-8 r1l 1 7)
8848 (mov32-src-r w 1 HI dst32-2-S-8 r1 1 7)
8849
8850 ; mov.BW:S r0l/r0,dst2 (m32 #11)
8851 (define-pmacro (mov32-r-dest sz szcode mode src dst opc1 opc2)
8852 (begin
8853 (dni (.sym mov32. sz - src - dst)
8854 (.str "mov." sz "src," dst)
8855 ((machine 32))
8856 (.str "mov." sz "$S " src ",${" (.sym dst - mode) "}")
8857 (+ (f-0-2 opc1) (.sym dst - mode) (f-4-3 opc2) (f-7-1 szcode))
8858 (mov-sem mode (reg (.sym h- src)) (.sym dst - mode))
8859 ())
8860 )
8861 )
8862 (mov32-r-dest b 0 QI r0l dst32-2-S-16 0 0)
8863 (mov32-r-dest w 1 HI r0 dst32-2-S-16 0 0)
8864 (mov32-r-dest b 0 QI r0l dst32-2-S-8 0 0)
8865 (mov32-r-dest w 1 HI r0 dst32-2-S-8 0 0)
8866
8867 ; mov.L:S src,A0/A1 (m32 #12)
8868 (define-pmacro (mov32-src-a src dst dstcode opc1 opc2)
8869 (begin
8870 (dni (.sym mov32. sz - src - dst)
8871 (.str "mov." sz "src," dst)
8872 ((machine 32))
8873 (.str "mov.l" "$S ${" (.sym src - SI) "}," dst)
8874 (+ (f-0-2 opc1) (.sym src - SI) (f-4-3 opc2) (f-7-1 dstcode))
8875 (mov-sem SI (.sym src - SI) (reg (.sym h- dst)))
8876 ())
8877 )
8878 )
8879 (mov32-src-a dst32-2-S-16 a0 0 1 4)
8880 (mov32-src-a dst32-2-S-16 a1 1 1 4)
8881 (mov32-src-a dst32-2-S-8 a0 0 1 4)
8882 (mov32-src-a dst32-2-S-8 a1 1 1 4)
8883
8884 ; mov.BW:G dsp8[sp],dst (m16 #10 m32 #13)
8885 ; mov.BW:G src,dsp8[sp] (m16 #11 m32 #14)
8886 (mov-dspsp-dst mov (f-0-4 #x7) (f-4-3 2) (f-8-4 #xB) #xB #x0 #xF mov-dspsp-dst-sem)
8887 (mov-src-dspsp mov (f-0-4 #x7) (f-4-3 2) (f-8-4 #x3) #xA #x0 #xF mov-src-dspsp-sem)
8888
8889 ;-------------------------------------------------------------
8890 ; mova - move effective address
8891 ;-------------------------------------------------------------
8892
8893 (define-pmacro (mov16a-defn dst dstop dstcode)
8894 (dni (.sym mova16. src - dst)
8895 (.str "mova src," dst)
8896 ((machine 16))
8897 (.str "mova ${dst16-16-Mova-HI}," dst)
8898 (+ (f-0-4 #xE) (f-4-4 #xB) dst16-16-Mova-HI (f-8-4 dstcode))
8899 (sequence () (set HI (reg dstop) dst16-16-Mova-HI))
8900 ())
8901 )
8902 (mov16a-defn r0 h-r0 0)
8903 (mov16a-defn r1 h-r1 1)
8904 (mov16a-defn r2 h-r2 2)
8905 (mov16a-defn r3 h-r3 3)
8906 (mov16a-defn a0 h-a0 4)
8907 (mov16a-defn a1 h-a1 5)
8908
8909 (define-pmacro (mov32a-defn dst dstop dstcode)
8910 (dni (.sym mova32. src - dst)
8911 (.str "mova src," dst)
8912 ((machine 32))
8913 (.str "mova ${dst32-16-Unprefixed-Mova-SI}," dst)
8914 (+ (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))
8915 (sequence () (set SI (reg dstop) dst32-16-Unprefixed-Mova-SI))
8916 ())
8917 )
8918 (mov32a-defn r2r0 h-r2r0 0)
8919 (mov32a-defn r3r1 h-r3r1 1)
8920 (mov32a-defn a0 h-a0 2)
8921 (mov32a-defn a1 h-a1 3)
8922
8923 ;-------------------------------------------------------------
8924 ; movDir - move nibble
8925 ;-------------------------------------------------------------
8926
8927 (define-pmacro (movdir-sem nib src dst)
8928 (sequence ((SI tmp))
8929 (case DFLT nib
8930 ((0) (set dst (or (and dst #xf0) (and src #xf))))
8931 ((1) (set dst (or (and dst #x0f) (sll (and src #xf) 4))))
8932 ((2) (set dst (or (and dst #xf0) (srl (and src #xf0) 4))))
8933 ((3) (set dst (or (and dst #x0f) (and src #xf0))))
8934 )
8935 )
8936 )
8937 ; movDir src,dst
8938 (define-pmacro (mov16dir-1-defn nib dircode dir)
8939 (dni (.sym mov nib 16 ".r0l-dst")
8940 (.str "mov" nib " r0l,dst")
8941 ((machine 16))
8942 (.str "mov" nib " r0l,${dst16-16-QI}")
8943 (+ (f-0-4 7) (f-4-4 #xC) (f-8-4 dir) dst16-16-QI)
8944 (movdir-sem dircode (reg h-r0l) dst16-16-QI)
8945 ())
8946 )
8947 (mov16dir-1-defn ll 0 8)
8948 (mov16dir-1-defn lh 1 #xA)
8949 (mov16dir-1-defn hl 2 9)
8950 (mov16dir-1-defn hh 3 #xB)
8951 (define-pmacro (mov16dir-2-defn nib dircode dir)
8952 (dni (.sym mov nib 16 ".src-r0l")
8953 (.str "mov" nib " src,r0l")
8954 ((machine 16))
8955 (.str "mov" nib " ${dst16-16-QI},r0l")
8956 (+ (f-0-4 7) (f-4-4 #xC) (f-8-4 dir) dst16-16-QI)
8957 (movdir-sem dircode dst16-16-QI (reg h-r0l))
8958 ())
8959 )
8960 (mov16dir-2-defn ll 0 0)
8961 (mov16dir-2-defn lh 1 2)
8962 (mov16dir-2-defn hl 2 1)
8963 (mov16dir-2-defn hh 3 3)
8964
8965 (define-pmacro (mov32dir-1-defn nib o1o0)
8966 (dni (.sym mov nib 32 ".r0l-dst")
8967 (.str "mov" nib " r0l,dst")
8968 ((machine 32))
8969 (.str "mov" nib " r0l,${dst32-24-Prefixed-QI}")
8970 (+ (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))
8971 (movdir-sem o1o0 (reg h-r0l) dst32-24-Prefixed-QI)
8972 ())
8973 )
8974 (mov32dir-1-defn ll 0)
8975 (mov32dir-1-defn lh 1)
8976 (mov32dir-1-defn hl 2)
8977 (mov32dir-1-defn hh 3)
8978 (define-pmacro (mov32dir-2-defn nib o1o0)
8979 (dni (.sym mov nib 32 ".src-r0l")
8980 (.str "mov" nib " src,r0l")
8981 ((machine 32))
8982 (.str "mov" nib " ${dst32-24-Prefixed-QI},r0l")
8983 (+ (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))
8984 (movdir-sem o1o0 dst32-24-Prefixed-QI (reg h-r0l))
8985 ())
8986 )
8987 (mov32dir-2-defn ll 0)
8988 (mov32dir-2-defn lh 1)
8989 (mov32dir-2-defn hl 2)
8990 (mov32dir-2-defn hh 3)
8991
8992 ;-------------------------------------------------------------
8993 ; movx - move extend sign (m32)
8994 ;-------------------------------------------------------------
8995
8996 (define-pmacro (movx-sem mode src dst)
8997 (sequence ((SI source) (SI result))
8998 (set SI result src)
8999 (set-z-and-s result)
9000 (set dst result))
9001 )
9002
9003 ; movx #imm,dst
9004 (binary-arith32-imm-dst-defn QI SI "" 0 movx X #xB #x1 #x1 movx-sem)
9005
9006 ;-------------------------------------------------------------
9007 ; mul - multiply
9008 ;-------------------------------------------------------------
9009
9010 (define-pmacro (mul-sem mode src1 dst)
9011 (sequence ((mode result))
9012 (set obit (add-oflag mode src1 dst 0))
9013 (set result (mul mode src1 dst))
9014 (set dst result))
9015 )
9016
9017 ; mul.BW #imm,dst
9018 (binary-arith-imm-dst mul G (f-0-4 7) (f-4-3 6) (f-8-4 5) #x8 #x1 #xF mul-sem)
9019 ; mul.BW src,dst
9020 (binary-arith-src-dst mul G (f-0-4 #x7) (f-4-3 4) #x1 #xC mul-sem)
9021
9022 (dni mul_l "mul.l src,r2r0" ((machine 32))
9023 ("mul.l ${dst32-24-Prefixed-SI},r2r0")
9024 (+ (f-0-4 #x0) (f-4-4 #x1) (f-8-4 #x8) (f-15-1 #x1) (f-18-2 #x1) (f-20-4 #xf)
9025 dst32-24-Prefixed-SI)
9026 () ())
9027
9028 (dni mulu_l "mulu.l src,r2r0" ((machine 32))
9029 ("mulu.l ${dst32-24-Prefixed-SI},r2r0")
9030 (+ (f-0-4 #x0) (f-4-4 #x1) (f-8-4 #x8) (f-15-1 #x1) (f-18-2 #x0) (f-20-4 #xf)
9031 dst32-24-Prefixed-SI)
9032 () ())
9033 ;-------------------------------------------------------------
9034 ; mulex - multiple extend sign (m32)
9035 ;-------------------------------------------------------------
9036
9037 ; mulex src,dst
9038 ; (dni mulex-absolute-indirect "mulex [src]" ((machine 32))
9039 ; ("mulex ${dst32-24-absolute-indirect-HI}")
9040 ; (+ (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))
9041 ; (set R1R2R0 (mul DI (ext DI R2R0) (ext DI dst32-24-absolute-indirect-HI)))
9042 ; ())
9043 (dni mulex "mulex src" ((machine 32))
9044 ("mulex ${dst32-16-Unprefixed-Mulex-HI}")
9045 (+ (f-0-4 #xC) dst32-16-Unprefixed-Mulex-HI (f-7-1 1) (f-10-2 3) (f-12-4 #xE))
9046 (set R1R2R0 (mul DI (ext DI R2R0) (ext DI dst32-16-Unprefixed-Mulex-HI)))
9047 ())
9048 ; (dni mulex-indirect "mulex [src]" ((machine 32))
9049 ; ("mulex ${dst32-24-indirect-HI}")
9050 ; (+ (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))
9051 ; (set R1R2R0 (mul DI (ext DI R2R0) (ext DI dst32-24-indirect-HI)))
9052 ; ())
9053
9054 ;-------------------------------------------------------------
9055 ; mulu - multiply unsigned
9056 ;-------------------------------------------------------------
9057
9058 (define-pmacro (mulu-sem mode src1 dst)
9059 (sequence ((mode result))
9060 (set obit (add-oflag mode src1 dst 0))
9061 (set result (mul mode src1 dst))
9062 (set dst result))
9063 )
9064
9065 ; mulu.BW #imm,dst
9066 (binary-arith-imm-dst mulu G (f-0-4 7) (f-4-3 6) (f-8-4 4) #x8 #x0 #xF mulu-sem)
9067 ; mulu.BW src,dst
9068 (binary-arith-src-dst mulu G (f-0-4 #x7) (f-4-3 0) #x1 #x4 mulu-sem)
9069
9070 ;-------------------------------------------------------------
9071 ; neg - twos complement
9072 ;-------------------------------------------------------------
9073
9074 (define-pmacro (neg-sem mode dst)
9075 (sequence ((mode result))
9076 (set result (neg mode dst))
9077 (set-z-and-s result)
9078 (set dst result))
9079 )
9080
9081 ; neg.BW:G
9082 (unary-insn neg (f-0-4 7) (f-4-3 2) (f-8-4 #x5) #xA #x2 #xF neg-sem)
9083
9084 ;-------------------------------------------------------------
9085 ; not - twos complement
9086 ;-------------------------------------------------------------
9087
9088 (define-pmacro (not-sem mode dst)
9089 (sequence ((mode result))
9090 (set result (not mode dst))
9091 (set-z-and-s result)
9092 (set dst result))
9093 )
9094
9095 ; not.BW:G
9096 (unary-insn-g not (f-0-4 7) (f-4-3 2) (f-8-4 #x7) #xA #x1 #xE not-sem)
9097
9098 (dni not16.b.s
9099 "not.b:s Dst16-3-S-8"
9100 ((machine 16))
9101 "not.b:s ${Dst16-3-S-8}"
9102 (+ (f-0-4 #xb) (f-4-1 #x1) Dst16-3-S-8)
9103 (not-sem QI Dst16-3-S-8)
9104 ())
9105
9106 ;-------------------------------------------------------------
9107 ; nop
9108 ;-------------------------------------------------------------
9109
9110 (dni nop16
9111 "nop"
9112 ((machine 16))
9113 "nop"
9114 (+ (f-0-4 #x0) (f-4-4 #x4))
9115 (nop)
9116 ())
9117
9118 (dni nop32
9119 "nop"
9120 ((machine 32))
9121 "nop"
9122 (+ (f-0-4 #xD) (f-4-4 #xE))
9123 (nop)
9124 ())
9125
9126 ;-------------------------------------------------------------
9127 ; or - logical or
9128 ;-------------------------------------------------------------
9129
9130 (define-pmacro (or-sem mode src1 dst)
9131 (sequence ((mode result))
9132 (set result (or mode src1 dst))
9133 (set-z-and-s result)
9134 (set dst result))
9135 )
9136
9137 ; or.BW #imm,dst (m16 #1 m32 #1)
9138 (binary-arith-imm-dst or G (f-0-4 7) (f-4-3 3) (f-8-4 3) #x8 #x2 #xF or-sem)
9139 ; or.b:S #imm8,dst3 (m16 #2 m32 #2)
9140 (binary-arith16-b-S-imm8-dst3 or ".b" (f-0-4 9) (f-4-1 1) or-sem)
9141 (binary-arith32-s-imm-dst QI .b 0 or #x1 #x2 or-sem)
9142 (binary-arith32-s-imm-dst HI .w 1 or #x1 #x2 or-sem)
9143 ; or.BW src,dst (m16 #3 m32 #3)
9144 (binary-arith-src-dst or G (f-0-4 #x9) (f-4-3 4) #x1 #x5 or-sem)
9145 ; or.b:S src,r0[lh] (m16)
9146 (binary-arith16-b-S-src2 or (f-0-4 1) (f-4-1 1) or-sem)
9147
9148 ;-------------------------------------------------------------
9149 ; pop - restore register/memory
9150 ;-------------------------------------------------------------
9151
9152 ; TODO future: split this into .b and .w semantics
9153 (define-pmacro (pop-sem-mach mach mode dst)
9154 (sequence ((mode b_or_w) (SI length))
9155 (set b_or_w -1)
9156 (set b_or_w (srl b_or_w #x8))
9157 (if (eq b_or_w #x0)
9158 (set length 1) ; .b
9159 (set length 2)) ; .w
9160
9161 (case DFLT length
9162 ((1) (set dst (mem-mach mach QI (reg h-sp))))
9163 ((2) (set dst (mem-mach mach HI (reg h-sp)))))
9164 (set (reg h-sp) (add (reg h-sp) length))
9165 )
9166 )
9167
9168 (define-pmacro (pop-sem16 mode dest) (pop-sem-mach 16 mode dest))
9169 (define-pmacro (pop-sem32 mode dest) (pop-sem-mach 32 mode dest))
9170
9171 ; pop.BW:G (m16 #1)
9172 (unary-insn-mach-g 16 pop (f-0-4 7) (f-4-3 2) (f-8-4 #xD) pop-sem16 $G)
9173 ; pop.BW:G (m32 #1)
9174 (unary-insn-mach 32 pop #xB #x2 #xF pop-sem32)
9175
9176 ; pop.b:S r0l/r0h
9177 (dni pop16.b-s-rn "pop.b:S r0[lh]" ((machine 16))
9178 "pop.b$S ${Rn16-push-S-anyof}"
9179 (+ (f-0-4 #x9) Rn16-push-S-anyof (f-5-3 #x2))
9180 (pop-sem16 QI Rn16-push-S-anyof)
9181 ())
9182 ; pop.w:S a0/a1
9183 (dni pop16.b-s-an "pop.w:S a[01]" ((machine 16))
9184 "pop.w$S ${An16-push-S-anyof}"
9185 (+ (f-0-4 #xD) An16-push-S-anyof (f-5-3 #x2))
9186 (pop-sem16 HI An16-push-S-anyof)
9187 ())
9188
9189 ;-------------------------------------------------------------
9190 ; popc - pop control register
9191 ; pushc - push control register
9192 ;-------------------------------------------------------------
9193
9194 (define-pmacro (popc32-cr1-sem mode dst)
9195 (sequence ()
9196 (case DFLT dst
9197 ((#x0) (set (reg h-dct0) (mem32 mode (reg h-sp))))
9198 ((#x1) (set (reg h-dct1) (mem32 mode (reg h-sp))))
9199 ((#x2) (sequence ((HI tflag))
9200 (set tflag (mem32 mode (reg h-sp)))
9201 (if (and tflag #x1) (set cbit 1))
9202 (if (and tflag #x2) (set dbit 1))
9203 (if (and tflag #x4) (set zbit 1))
9204 (if (and tflag #x8) (set sbit 1))
9205 (if (and tflag #x10) (set bbit 1))
9206 (if (and tflag #x20) (set obit 1))
9207 (if (and tflag #x40) (set ibit 1))
9208 (if (and tflag #x80) (set ubit 1))))
9209 ((#x3) (set (reg h-svf) (mem32 mode (reg h-sp))))
9210 ((#x4) (set (reg h-drc0) (mem32 mode (reg h-sp))))
9211 ((#x5) (set (reg h-drc1) (mem32 mode (reg h-sp))))
9212 ((#x6) (set (reg h-dmd0) (mem32 mode (reg h-sp))))
9213 ((#x7) (set (reg h-dmd1) (mem32 mode (reg h-sp))))
9214 )
9215 (set (reg h-sp) (add (reg h-sp) 2))
9216 )
9217 )
9218 (define-pmacro (popc32-cr2-sem mode dst)
9219 (sequence ()
9220 (case DFLT dst
9221 ((#x0) (set (reg h-intb) (mem32 mode (reg h-sp))))
9222 ((#x1) (set (reg h-sp) (mem32 mode (reg h-sp))))
9223 ((#x2) (set (reg h-sb) (mem32 mode (reg h-sp))))
9224 ((#x3) (set (reg h-fb) (mem32 mode (reg h-sp))))
9225 ((#x7) (set (reg h-isp) (mem32 mode (reg h-sp))))
9226 )
9227 (set (reg h-sp) (add (reg h-sp) 4))
9228 )
9229 )
9230 (define-pmacro (popc16-sem mode dst)
9231 (sequence ()
9232 (case DFLT dst
9233 ((#x1) (set (reg h-intb) (or (and (reg h-intb) #x0000)
9234 (mem16 mode (reg h-sp)))))
9235 ((#x2) (set (reg h-intb) (or (and (reg h-intb) #xffff0000)
9236 (mem16 mode (reg h-sp)))))
9237 ((#x3) (sequence ((HI tflag))
9238 (set tflag (mem16 mode (reg h-sp)))
9239 (if (and tflag #x1) (set cbit 1))
9240 (if (and tflag #x2) (set dbit 1))
9241 (if (and tflag #x4) (set zbit 1))
9242 (if (and tflag #x8) (set sbit 1))
9243 (if (and tflag #x10) (set bbit 1))
9244 (if (and tflag #x20) (set obit 1))
9245 (if (and tflag #x40) (set ibit 1))
9246 (if (and tflag #x80) (set ubit 1))))
9247 ((#x4) (set (reg h-isp) (mem16 mode (reg h-sp))))
9248 ((#x5) (set (reg h-sp) (mem16 mode (reg h-sp))))
9249 ((#x6) (set (reg h-sb) (mem16 mode (reg h-sp))))
9250 ((#x7) (set (reg h-fb) (mem16 mode (reg h-sp))))
9251 )
9252 (set (reg h-sp) (add (reg h-sp) 2))
9253 )
9254 )
9255 ; popc dest (m16c #1)
9256 (dni popc16.imm16 "popc dst" ((machine 16))
9257 ("popc ${cr16}")
9258 (+ (f-0-4 #xE) (f-4-4 #xB) (f-8-1 0) (f-12-4 3) cr16)
9259 (popc16-sem HI cr16)
9260 ())
9261 ; popc dest (m32c #1)
9262 (dni popc32.imm16-cr1 "popc dst" ((machine 32))
9263 ("popc ${cr1-Unprefixed-32}")
9264 (+ (f-0-4 #xD) (f-4-4 3) (f-8-4 #xA) (f-12-1 1) cr1-Unprefixed-32)
9265 (popc32-cr1-sem HI cr1-Unprefixed-32)
9266 ())
9267 ; popc dest (m32c #2)
9268 (dni popc32.imm16-cr2 "popc dst" ((machine 32))
9269 ("popc ${cr2-32}")
9270 (+ (f-0-4 #xD) (f-4-4 3) (f-8-4 2) (f-12-1 1) cr2-32)
9271 (popc32-cr2-sem SI cr2-32)
9272 ())
9273
9274 (define-pmacro (pushc32-cr1-sem mode dst)
9275 (sequence ()
9276 (set (reg h-sp) (sub (reg h-sp) 2))
9277 (case DFLT dst
9278 ((#x0) (set (mem32 mode (reg h-sp)) (reg h-dct0)))
9279 ((#x1) (set (mem32 mode (reg h-sp)) (reg h-dct1)))
9280 ((#x2) (sequence ((HI tflag))
9281 (set tflag 0)
9282 (if (eq cbit 1) (set tflag (or tflag #x1)))
9283 (if (eq dbit 1) (set tflag (or tflag #x2)))
9284 (if (eq zbit 1) (set tflag (or tflag #x4)))
9285 (if (eq sbit 1) (set tflag (or tflag #x8)))
9286 (if (eq bbit 1) (set tflag (or tflag #x10)))
9287 (if (eq obit 1) (set tflag (or tflag #x20)))
9288 (if (eq ibit 1) (set tflag (or tflag #x40)))
9289 (if (eq ubit 1) (set tflag (or tflag #x80)))
9290 (set (mem32 mode (reg h-sp)) tflag)))
9291 ((#x3) (set (mem32 mode (reg h-sp)) (reg h-svf)))
9292 ((#x4) (set (mem32 mode (reg h-sp)) (reg h-drc0)))
9293 ((#x5) (set (mem32 mode (reg h-sp)) (reg h-drc1)))
9294 ((#x6) (set (mem32 mode (reg h-sp)) (reg h-dmd0)))
9295 ((#x7) (set (mem32 mode (reg h-sp)) (reg h-dmd1)))
9296 )
9297 )
9298 )
9299 (define-pmacro (pushc32-cr2-sem mode dst)
9300 (sequence ()
9301 (set (reg h-sp) (sub (reg h-sp) 4))
9302 (case DFLT dst
9303 ((#x0) (set (mem32 mode (reg h-sp)) (reg h-intb)))
9304 ((#x1) (set (mem32 mode (reg h-sp)) (reg h-sp)))
9305 ((#x2) (set (mem32 mode (reg h-sp)) (reg h-sb)))
9306 ((#x3) (set (mem32 mode (reg h-sp)) (reg h-fb)))
9307 ((#x7) (set (mem32 mode (reg h-sp)) (reg h-isp)))
9308 )
9309 )
9310 )
9311 (define-pmacro (pushc16-sem mode dst)
9312 (sequence ()
9313 (set (reg h-sp) (sub (reg h-sp) 2))
9314 (case DFLT dst
9315 ((#x1) (set (mem16 mode (reg h-sp)) (and (reg h-intb) #xffff)))
9316 ((#x2) (set (mem16 mode (reg h-sp)) (and (reg h-intb) #xffff0000)))
9317 ((#x3) (sequence ((HI tflag))
9318 (if (eq cbit 1) (set tflag (or tflag #x1)))
9319 (if (eq dbit 1) (set tflag (or tflag #x2)))
9320 (if (eq zbit 1) (set tflag (or tflag #x4)))
9321 (if (eq sbit 1) (set tflag (or tflag #x8)))
9322 (if (eq bbit 1) (set tflag (or tflag #x10)))
9323 (if (eq obit 1) (set tflag (or tflag #x20)))
9324 (if (eq ibit 1) (set tflag (or tflag #x40)))
9325 (if (eq ubit 1) (set tflag (or tflag #x80)))
9326 (set (mem16 mode (reg h-sp)) tflag)))
9327
9328 ((#x4) (set (mem16 mode (reg h-sp)) (reg h-isp)))
9329 ((#x5) (set (mem16 mode (reg h-sp)) (reg h-sp)))
9330 ((#x6) (set (mem16 mode (reg h-sp)) (reg h-sb)))
9331 ((#x7) (set (mem16 mode (reg h-sp)) (reg h-fb)))
9332 )
9333 )
9334 )
9335 ; pushc src (m16c)
9336 (dni pushc16.imm16 "pushc dst" ((machine 16))
9337 ("pushc ${cr16}")
9338 (+ (f-0-4 #xE) (f-4-4 #xB) (f-8-1 0) (f-12-4 2) cr16)
9339 (pushc16-sem HI cr16)
9340 ())
9341 ; pushc src (m32c #1)
9342 (dni pushc32.imm16-cr1 "pushc dst" ((machine 32))
9343 ("pushc ${cr1-Unprefixed-32}")
9344 (+ (f-0-4 #xD) (f-4-4 1) (f-8-4 #xA) (f-12-1 1) cr1-Unprefixed-32)
9345 (pushc32-cr1-sem HI cr1-Unprefixed-32)
9346 ())
9347 ; pushc src (m32c #2)
9348 (dni pushc32.imm16-cr2 "pushc dst" ((machine 32))
9349 ("pushc ${cr2-32}")
9350 (+ (f-0-4 #xD) (f-4-4 1) (f-8-4 2) (f-12-1 1) cr2-32)
9351 (pushc32-cr2-sem SI cr2-32)
9352 ())
9353
9354 ;-------------------------------------------------------------
9355 ; popm - pop multiple
9356 ; pushm - push multiple
9357 ;-------------------------------------------------------------
9358
9359 (define-pmacro (popm-sem machine dst)
9360 (sequence ((SI addrlen))
9361 (if (eq machine 16)
9362 (set addrlen 2)
9363 (set addrlen 4))
9364 (if (and dst 1)
9365 (sequence () (set R0 (mem-mach machine HI (reg h-sp)))
9366 (set (reg h-sp) (add (reg h-sp) 2))))
9367 (if (and dst 2)
9368 (sequence () (set R1 (mem-mach machine HI (reg h-sp)))
9369 (set (reg h-sp) (add (reg h-sp) 2))))
9370 (if (and dst 4)
9371 (sequence () (set R2 (mem-mach machine HI (reg h-sp)))
9372 (set (reg h-sp) (add (reg h-sp) 2))))
9373 (if (and dst 8)
9374 (sequence () (set R3 (mem-mach machine HI (reg h-sp)))
9375 (set (reg h-sp) (add (reg h-sp) 2))))
9376 (if (and dst 16)
9377 (sequence () (set A0 (mem-mach machine HI (reg h-sp)))
9378 (set (reg h-sp) (add (reg h-sp) addrlen))))
9379 (if (and dst 32)
9380 (sequence () (set A1 (mem-mach machine HI (reg h-sp)))
9381 (set (reg h-sp) (add (reg h-sp) addrlen))))
9382 (if (and dst 64)
9383 (sequence () (set (reg h-sb) (mem-mach machine HI (reg h-sp)))
9384 (set (reg h-sp) (add (reg h-sp) addrlen))))
9385 (if (eq dst 128)
9386 (sequence () (set (reg h-fb) (mem-mach machine HI (reg h-sp)))
9387 (set (reg h-sp) (add (reg h-sp) addrlen))))
9388 )
9389 )
9390
9391 (define-pmacro (pushm-sem machine dst)
9392 (sequence ((SI count) (SI addrlen))
9393 (if (eq machine 16)
9394 (set addrlen 2)
9395 (set addrlen 4))
9396 (if (eq dst 1)
9397 (sequence () (set (reg h-sp) (sub (reg h-sp) addrlen))
9398 (set (mem-mach machine HI (reg h-sp)) (reg h-fb))))
9399 (if (and dst 2)
9400 (sequence () (set (reg h-sp) (sub (reg h-sp) addrlen))
9401 (set (mem-mach machine HI (reg h-sp)) (reg h-sb))))
9402 (if (and dst 4)
9403 (sequence () (set (reg h-sp) (sub (reg h-sp) addrlen))
9404 (set (mem-mach machine HI (reg h-sp)) A1)))
9405 (if (and dst 8)
9406 (sequence () (set (reg h-sp) (sub (reg h-sp) addrlen))
9407 (set (mem-mach machine HI (reg h-sp)) A0)))
9408 (if (and dst 16)
9409 (sequence () (set (reg h-sp) (sub (reg h-sp) 2))
9410 (set (mem-mach machine HI (reg h-sp)) R3)))
9411 (if (and dst 32)
9412 (sequence () (set (reg h-sp) (sub (reg h-sp) 2))
9413 (set (mem-mach machine HI (reg h-sp)) R2)))
9414 (if (and dst 64)
9415 (sequence () (set (reg h-sp) (sub (reg h-sp) 2))
9416 (set (mem-mach machine HI (reg h-sp)) R1)))
9417 (if (and dst 128)
9418 (sequence () (set (reg h-sp) (sub (reg h-sp) 2))
9419 (set (mem-mach machine HI (reg h-sp)) R0)))
9420 )
9421 )
9422
9423 (dni popm16 "popm regs" ((machine 16))
9424 ("popm ${Regsetpop}")
9425 (+ (f-0-4 #xE) (f-4-4 #xD) Regsetpop)
9426 (popm-sem 16 Regsetpop)
9427 ())
9428 (dni pushm16 "pushm regs" ((machine 16))
9429 ("pushm ${Regsetpush}")
9430 (+ (f-0-4 #xE) (f-4-4 #xC) Regsetpush)
9431 (pushm-sem 16 Regsetpush)
9432 ())
9433 (dni popm "popm regs" ((machine 32))
9434 ("popm ${Regsetpop}")
9435 (+ (f-0-4 #x8) (f-4-4 #xE) Regsetpop)
9436 (popm-sem 32 Regsetpop)
9437 ())
9438 (dni pushm "pushm regs" ((machine 32))
9439 ("pushm ${Regsetpush}")
9440 (+ (f-0-4 #x8) (f-4-4 #xF) Regsetpush)
9441 (pushm-sem 32 Regsetpush)
9442 ())
9443
9444 ;-------------------------------------------------------------
9445 ; push - Save register/memory/immediate data
9446 ;-------------------------------------------------------------
9447
9448 ; TODO future: split this into .b and .w semantics
9449 (define-pmacro (push-sem-mach mach mode dst)
9450 (sequence ((mode b_or_w) (SI length))
9451 (set b_or_w -1)
9452 (set b_or_w (srl b_or_w #x8))
9453 (if (eq b_or_w #x0)
9454 (set length 1) ; .b
9455 (if (eq b_or_w #xff)
9456 (set length 2) ; .w
9457 (set length 4))) ; .l
9458 (set (reg h-sp) (sub (reg h-sp) length))
9459 (case DFLT length
9460 ((1) (set (mem-mach mach QI (reg h-sp)) dst))
9461 ((2) (set (mem-mach mach HI (reg h-sp)) dst))
9462 ((4) (set (mem-mach mach SI (reg h-sp)) dst)))
9463 )
9464 )
9465
9466 (define-pmacro (push-sem16 mode dst) (push-sem-mach 16 mode dst))
9467 (define-pmacro (push-sem32 mode dst) (push-sem-mach 32 mode dst))
9468
9469 ; push.BW:G imm (m16 #1 m32 #1)
9470 (dni push16.b.G-imm "push.b:G #Imm-16-QI" ((machine 16))
9471 ("push.b$G #${Imm-16-QI}")
9472 (+ (f-0-4 7) (f-4-4 #xC) (f-8-4 #xE) (f-12-4 2) Imm-16-QI)
9473 (push-sem16 QI Imm-16-QI)
9474 ())
9475
9476 (dni push16.w.G-imm "push.w:G #Imm-16-HI" ((machine 16))
9477 ("push.w$G #${Imm-16-HI}")
9478 (+ (f-0-4 7) (f-4-4 #xD) (f-8-4 #xE) (f-12-4 2) Imm-16-HI)
9479 (push-sem16 HI Imm-16-HI)
9480 ())
9481
9482 (dni push32.b.imm "push.b #Imm-8-QI" ((machine 32))
9483 ("push.b #${Imm-8-QI}")
9484 (+ (f-0-4 #xA) (f-4-4 #xE) Imm-8-QI)
9485 (push-sem32 QI Imm-8-QI)
9486 ())
9487
9488 (dni push32.w.imm "push.w #Imm-8-HI" ((machine 32))
9489 ("push.w #${Imm-8-HI}")
9490 (+ (f-0-4 #xA) (f-4-4 #xF) Imm-8-HI)
9491 (push-sem32 HI Imm-8-HI)
9492 ())
9493
9494 ; push.BW:G src (m16 #2)
9495 (unary-insn-mach-g 16 push (f-0-4 7) (f-4-3 2) (f-8-4 #x4) push-sem16 $G)
9496 ; push.BW:G src (m32 #2)
9497 (unary-insn-mach 32 push #xC #x0 #xE push-sem32)
9498
9499
9500 ; push.b:S r0l/r0h (m16 #3)
9501 (dni push16.b-s-rn "push.b:S r0[lh]" ((machine 16))
9502 "push.b$S ${Rn16-push-S-anyof}"
9503 (+ (f-0-4 #x8) Rn16-push-S-anyof (f-5-3 #x2))
9504 (push-sem16 QI Rn16-push-S-anyof)
9505 ())
9506 ; push.w:S a0/a1 (m16 #4)
9507 (dni push16.b-s-an "push.w:S a[01]" ((machine 16))
9508 "push.w$S ${An16-push-S-anyof}"
9509 (+ (f-0-4 #xC) An16-push-S-anyof (f-5-3 #x2))
9510 (push-sem16 HI An16-push-S-anyof)
9511 ())
9512
9513 ; push.l imm32 (m32 #3)
9514 (dni push32.l.imm "push.l #Imm-16-SI" ((machine 32))
9515 ("push.l #${Imm-16-SI}")
9516 (+ (f-0-4 #xB) (f-4-4 6) (f-8-4 5) (f-12-4 3) Imm-16-SI)
9517 (push-sem32 SI Imm-16-SI)
9518 ())
9519 ; push.l src (m32 #4)
9520 (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)
9521
9522 ;-------------------------------------------------------------
9523 ; pusha - push effective address
9524 ;------------------------------------------------------------
9525
9526 (define-pmacro (push16a-sem mode dst)
9527 (sequence ()
9528 (set (reg h-sp) (sub (reg h-sp) 2))
9529 (set (mem16 HI (reg h-sp)) dst))
9530 )
9531 (define-pmacro (push32a-sem mode dst)
9532 (sequence ()
9533 (set (reg h-sp) (sub (reg h-sp) 4))
9534 (set (mem32 SI (reg h-sp)) dst))
9535 )
9536 (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)
9537 (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)
9538
9539 ;-------------------------------------------------------------
9540 ; reit - return from interrupt
9541 ;-------------------------------------------------------------
9542
9543 ; ??? semantics
9544 (dni reit16 "REIT" ((machine 16))
9545 ("reit")
9546 (+ (f-0-4 #xF) (f-4-4 #xB))
9547 (nop)
9548 ())
9549 (dni reit32 "REIT" ((machine 32))
9550 ("reit")
9551 (+ (f-0-4 9) (f-4-4 #xE))
9552 (nop)
9553 ())
9554
9555 ;-------------------------------------------------------------
9556 ; rmpa - repeat multiple and addition
9557 ;-------------------------------------------------------------
9558
9559 ; TODO semantics
9560 (dni rmpa16.b "rmpa.size" ((machine 16))
9561 ("rmpa.b")
9562 (+ (f-0-4 7) (f-4-4 #xC) (f-8-4 #xF) (f-12-4 1))
9563 (nop)
9564 ())
9565 (dni rmpa16.w "rmpa.size" ((machine 16))
9566 ("rmpa.w")
9567 (+ (f-0-4 7) (f-4-4 #xD) (f-8-4 #xF) (f-12-4 1))
9568 (nop)
9569 ())
9570 (dni rmpa32.b "rmpa.size" ((machine 32))
9571 ("rmpa.b")
9572 (+ (f-0-4 #xB) (f-4-4 8) (f-8-4 4) (f-12-4 3))
9573 (nop)
9574 ())
9575
9576 (dni rmpa32.w "rmpa.size" ((machine 32))
9577 ("rmpa.w")
9578 (+ (f-0-4 #xB) (f-4-4 8) (f-8-4 5) (f-12-4 3))
9579 (nop)
9580 ())
9581
9582 ;-------------------------------------------------------------
9583 ; rolc - rotate left with carry
9584 ;-------------------------------------------------------------
9585
9586 ; TODO check semantics
9587 ; TODO future: split this into .b and .w semantics
9588 (define-pmacro (rolc-sem mode dst)
9589 (sequence ((mode result) (SI ocbit) (mode b_or_w) (USI mask))
9590 (set b_or_w -1)
9591 (set b_or_w (srl b_or_w #x8))
9592 (if (eq b_or_w #x0)
9593 (set mask #x8000) ; .b
9594 (set mask #x80000000)) ; .w
9595 (set ocbit cbit)
9596 (set cbit (and dst mask))
9597 (set result (sll mode dst 1))
9598 (set result (or result ocbit))
9599 (set-z-and-s result)
9600 (set dst result))
9601 )
9602 ; rolc.BW src,dst
9603 (unary-insn rolc (f-0-4 7) (f-4-3 3) (f-8-4 #xA) #xB #x2 #xE rolc-sem)
9604
9605 ;-------------------------------------------------------------
9606 ; rorc - rotate right with carry
9607 ;-------------------------------------------------------------
9608
9609 ; TODO check semantics
9610 ; TODO future: split this into .b and .w semantics
9611 (define-pmacro (rorc-sem mode dst)
9612 (sequence ((mode result) (SI ocbit) (mode b_or_w) (USI mask) (SI shamt))
9613 (set b_or_w -1)
9614 (set b_or_w (srl b_or_w #x8))
9615 (if (eq b_or_w #x0)
9616 (sequence () (set mask #x7fff) (set shamt 15)) ; .b
9617 (sequence () (set mask #x7fffffff) (set shamt 31))) ; .w
9618 (set ocbit cbit)
9619 (set cbit (and dst #x1))
9620 (set result (srl mode dst (const 1)))
9621 (set result (or (and result mask) (sll ocbit shamt)))
9622 (set-z-and-s result)
9623 (set dst result))
9624 )
9625 ; rorc.BW src,dst
9626 (unary-insn rorc (f-0-4 7) (f-4-3 3) (f-8-4 #xB) #xA #x2 #xE rorc-sem)
9627
9628 ;-------------------------------------------------------------
9629 ; rot - rotate
9630 ;-------------------------------------------------------------
9631
9632 ; TODO future: split this into .b and .w semantics
9633 (define-pmacro (rot-1-sem mode src1 dst)
9634 (sequence ((mode tmp) (mode b_or_w) (USI mask) (SI shift))
9635 (case DFLT src1
9636 ((#x0) (set shift 1))
9637 ((#x1) (set shift 2))
9638 ((#x2) (set shift 3))
9639 ((#x3) (set shift 4))
9640 ((#x4) (set shift 5))
9641 ((#x5) (set shift 6))
9642 ((#x6) (set shift 7))
9643 ((#x7) (set shift 8))
9644 ((-8) (set shift -1))
9645 ((-7) (set shift -2))
9646 ((-6) (set shift -3))
9647 ((-5) (set shift -4))
9648 ((-4) (set shift -5))
9649 ((-3) (set shift -6))
9650 ((-2) (set shift -7))
9651 ((-1) (set shift -8))
9652 (else (set shift 0))
9653 )
9654 (set b_or_w -1)
9655 (set b_or_w (srl b_or_w #x8))
9656 (if (eq b_or_w #x0)
9657 (set mask #x7fff) ; .b
9658 (set mask #x7fffffff)) ; .w
9659 (set tmp dst)
9660 (if (gt mode shift 0)
9661 (sequence ()
9662 (set tmp (rol mode tmp shift))
9663 (set cbit (and tmp #x1)))
9664 (sequence ()
9665 (set tmp (ror mode tmp (mul shift -1)))
9666 (set cbit (and tmp mask))))
9667 (set-z-and-s tmp)
9668 (set dst tmp))
9669 )
9670 (define-pmacro (rot-2-sem mode dst)
9671 (sequence ((mode tmp) (mode b_or_w) (USI mask))
9672 (set b_or_w -1)
9673 (set b_or_w (srl b_or_w #x8))
9674 (if (eq b_or_w #x0)
9675 (set mask #x7fff) ; .b
9676 (set mask #x7fffffff)) ; .w
9677 (set tmp dst)
9678 (if (gt mode (reg h-r1h) 0)
9679 (sequence ()
9680 (set tmp (rol mode tmp (reg h-r1h)))
9681 (set cbit (and tmp #x1)))
9682 (sequence ()
9683 (set tmp (ror mode tmp (reg h-r1h)))
9684 (set cbit (and tmp mask))))
9685 (set-z-and-s tmp)
9686 (set dst tmp))
9687 )
9688
9689 ; rot.BW #imm4,dst
9690 (binary-arith16-shimm4-dst-defn QI .b 0 0 rot (f-0-4 #xE) (f-4-3 0) rot-1-sem)
9691 (binary-arith16-shimm4-dst-defn HI .w 0 1 rot (f-0-4 #xE) (f-4-3 0) rot-1-sem)
9692 (binary-arith32-shimm4-dst-defn QI .b 0 0 rot #x7 #x2 rot-1-sem)
9693 (binary-arith32-shimm4-dst-defn HI .w 0 1 rot #x7 #x2 rot-1-sem)
9694 ; rot.BW src,dst
9695
9696 (dni rot16.b-dst "rot r1h,dest" ((machine 16))
9697 ("rot.b r1h,${dst16-16-QI}")
9698 (+ (f-0-4 7) (f-4-4 #x4) (f-8-4 #x6) dst16-16-QI)
9699 (rot-2-sem QI dst16-16-QI)
9700 ())
9701 (dni rot16.w-dst "rot r1h,dest" ((machine 16))
9702 ("rot.w r1h,${dst16-16-HI}")
9703 (+ (f-0-4 7) (f-4-4 #x5) (f-8-4 #x6) dst16-16-HI)
9704 (rot-2-sem HI dst16-16-HI)
9705 ())
9706
9707 (dni rot32.b-dst "rot r1h,dest" ((machine 32))
9708 ("rot.b r1h,${dst32-16-Unprefixed-QI}")
9709 (+ (f-0-4 #xA) dst32-16-Unprefixed-QI (f-7-1 0) (f-10-2 3) (f-12-4 #xF))
9710 (rot-2-sem QI dst32-16-Unprefixed-QI)
9711 ())
9712 (dni rot32.w-dst "rot r1h,dest" ((machine 32))
9713 ("rot.w r1h,${dst32-16-Unprefixed-HI}")
9714 (+ (f-0-4 #xA) dst32-16-Unprefixed-HI (f-7-1 1) (f-10-2 3) (f-12-4 #xF))
9715 (rot-2-sem HI dst32-16-Unprefixed-HI)
9716 ())
9717
9718 ;-------------------------------------------------------------
9719 ; rts - return from subroutine
9720 ;-------------------------------------------------------------
9721
9722 (define-pmacro (rts16-sem)
9723 (sequence ((SI tpc))
9724 (set tpc (mem16 HI (reg h-sp)))
9725 (set (reg h-sp) (add (reg h-sp) 2))
9726 (set tpc (or tpc (sll (mem16 QI (reg h-sp)) 16)))
9727 (set (reg h-sp) (add (reg h-sp) 1))
9728 (set pc tpc)
9729 )
9730 )
9731 (define-pmacro (rts32-sem)
9732 (sequence ((SI tpc))
9733 (set tpc (mem32 HI (reg h-sp)))
9734 (set (reg h-sp) (add (reg h-sp) 2))
9735 (set tpc (or tpc (sll (mem32 HI (reg h-sp)) 16)))
9736 (set (reg h-sp) (add (reg h-sp) 2))
9737 (set pc tpc)
9738 )
9739 )
9740
9741 (dni rts16 "rts" ((machine 16))
9742 ("rts")
9743 (+ (f-0-4 #xF) (f-4-4 3))
9744 (rts16-sem)
9745 ())
9746
9747 (dni rts32 "rts" ((machine 32))
9748 ("rts")
9749 (+ (f-0-4 #xD) (f-4-4 #xF))
9750 (rts32-sem)
9751 ())
9752
9753 ;-------------------------------------------------------------
9754 ; sbb - subtract with borrow
9755 ;-------------------------------------------------------------
9756
9757 (define-pmacro (sbb-sem mode src dst)
9758 (sequence ((mode result))
9759 (set result (subc mode dst src cbit))
9760 (set obit (add-oflag mode dst src cbit))
9761 (set cbit (add-oflag mode dst src cbit))
9762 (set-z-and-s result)
9763 (set dst result))
9764 )
9765
9766 ; sbb.size:G #imm,dst
9767 (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)
9768 (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)
9769 (binary-arith32-imm-dst-Prefixed QI QI .b 0 sbb X #x9 #x2 #xE sbb-sem)
9770 (binary-arith32-imm-dst-Prefixed HI HI .w 1 sbb X #x9 #x2 #xE sbb-sem)
9771
9772 ; sbb.BW:G src,dst
9773 (binary-arith16-src-dst-defn QI QI .b 0 sbb X (f-0-4 #xB) (f-4-3 4) sbb-sem)
9774 (binary-arith16-src-dst-defn HI HI .w 1 sbb X (f-0-4 #xB) (f-4-3 4) sbb-sem)
9775 (binary-arith32-src-dst-Prefixed QI QI .b 0 sbb X #x1 #x6 sbb-sem)
9776 (binary-arith32-src-dst-Prefixed HI HI .w 1 sbb X #x1 #x6 sbb-sem)
9777
9778 ;-------------------------------------------------------------
9779 ; sbjnz - subtract then jump on not zero
9780 ;-------------------------------------------------------------
9781
9782 (define-pmacro (sub-jnz-sem mode src dst label)
9783 (sequence ((mode result))
9784 (set result (sub mode dst src))
9785 (set dst result)
9786 (if (ne result 0)
9787 (set pc label)))
9788 )
9789
9790 ; sbjnz.size #imm4,dst,label
9791 (arith-jnz-imm4-dst sbjnz s4n (f-0-4 #xF) (f-4-3 4) #xf #x1 sub-jnz-sem)
9792
9793 ;-------------------------------------------------------------
9794 ; sccnd - store condition on condition (m32)
9795 ;-------------------------------------------------------------
9796
9797 (define-pmacro (sccnd-sem cnd dst)
9798 (sequence ()
9799 (set dst 0)
9800 (case DFLT cnd
9801 ((#x00) (if (not cbit) (set dst 1))) ;ltu nc
9802 ((#x01) (if (or cbit zbit) (set dst 1))) ;leu
9803 ((#x02) (if (not zbit) (set dst 1))) ;ne nz
9804 ((#x03) (if (not sbit) (set dst 1))) ;pz
9805 ((#x04) (if (not obit) (set dst 1))) ;no
9806 ((#x05) (if (not (or zbit (xor sbit obit))) (set dst 1))) ;gt
9807 ((#x06) (if (xor sbit obit) (set dst 1))) ;ge
9808 ((#x08) (if (trunc BI cbit) (set dst 1))) ;geu c
9809 ((#x09) (if (not (or cbit zbit)) (set dst 1))) ;gtu
9810 ((#x0a) (if (trunc BI zbit) (set dst 1))) ;eq z
9811 ((#x0b) (if (trunc BI sbit) (set dst 1))) ;n
9812 ((#x0c) (if (trunc BI obit) (set dst 1))) ;o
9813 ((#x0d) (if (or zbit (xor sbit obit)) (set dst 1))) ;le
9814 ((#x0e) (if (xor sbit obit) (set dst 1))) ;lt
9815 )
9816 )
9817 )
9818
9819 ; scCND dst
9820 (dni sccnd
9821 "sccnd dst"
9822 ((machine 32))
9823 "sc$sccond32 ${dst32-16-Unprefixed-HI}"
9824 (+ (f-0-4 #xD) dst32-16-Unprefixed-HI (f-7-1 1) (f-10-2 3) sccond32)
9825 (sccnd-sem sccond32 dst32-16-Unprefixed-HI)
9826 ())
9827
9828 ;-------------------------------------------------------------
9829 ; scmpu - string compare unequal (m32)
9830 ;-------------------------------------------------------------
9831
9832 ; TODO semantics
9833 (dni scmpu.b "scmpu.b" ((machine 32))
9834 ("scmpu.b")
9835 (+ (f-0-4 #xB) (f-4-4 8) (f-8-4 #xC) (f-12-4 3))
9836 (c-call VOID "scmpu_QI_semantics")
9837 ())
9838
9839 (dni scmpu.w "scmpu.w" ((machine 32))
9840 ("scmpu.w")
9841 (+ (f-0-4 #xB) (f-4-4 8) (f-8-4 #xD) (f-12-4 3))
9842 (c-call VOID "scmpu_HI_semantics")
9843 ())
9844
9845 ;-------------------------------------------------------------
9846 ; sha - shift arithmetic
9847 ;-------------------------------------------------------------
9848
9849 ; TODO future: split this into .b and .w semantics
9850 (define-pmacro (sha-sem mode src1 dst)
9851 (sequence ((mode result)(mode shift)(mode shmode))
9852 (case DFLT src1
9853 ((#x0) (set shift 1))
9854 ((#x1) (set shift 2))
9855 ((#x2) (set shift 3))
9856 ((#x3) (set shift 4))
9857 ((#x4) (set shift 5))
9858 ((#x5) (set shift 6))
9859 ((#x6) (set shift 7))
9860 ((#x7) (set shift 8))
9861 ((-8) (set shift -1))
9862 ((-7) (set shift -2))
9863 ((-6) (set shift -3))
9864 ((-5) (set shift -4))
9865 ((-4) (set shift -5))
9866 ((-3) (set shift -6))
9867 ((-2) (set shift -7))
9868 ((-1) (set shift -8))
9869 (else (set shift 0))
9870 )
9871 (set shmode -1)
9872 (set shmode (srl shmode #x8))
9873 (if (lt mode shift #x0) (set result (sra mode dst (mul shift -1))))
9874 (if (gt mode shift 0) (set result (sll mode dst shift)))
9875 (if (eq shmode #x0) ; QI
9876 (sequence
9877 ((mode cbitamt))
9878 (if (lt mode shift #x0)
9879 (set cbitamt (sub #x8 shift)) ; sra
9880 (set cbitamt (sub shift 1))) ; sll
9881 (set cbit (srl (and (sll dst cbitamt) #x80) #x7))
9882 (set obit (ne (and dst #x80) (and result #x80)))
9883 ))
9884 (if (eq shmode #xff) ; HI
9885 (sequence
9886 ((mode cbitamt))
9887 (if (lt mode shift #x0)
9888 (set cbitamt (sub 16 shift)) ; sra
9889 (set cbitamt (sub shift 1))) ; sll
9890 (set cbit (srl (and (sll dst cbitamt) #x8000) #xf))
9891 (set obit (ne (and dst #x8000) (and result #x8000)))
9892 ))
9893 (set-z-and-s result)
9894 (set dst result))
9895 )
9896 (define-pmacro (shar1h-sem mode dst)
9897 (sequence ((mode result)(mode shmode))
9898 (set shmode -1)
9899 (set shmode (srl shmode #x8))
9900 (if (lt mode (reg h-r1h) 0) (set result (sra mode dst (reg h-r1h))))
9901 (if (gt mode (reg h-r1h) 0) (set result (sll mode dst (reg h-r1h))))
9902 (if (eq shmode #x0) ; QI
9903 (sequence
9904 ((mode cbitamt))
9905 (if (lt mode (reg h-r1h) #x0)
9906 (set cbitamt (sub #x8 (reg h-r1h))) ; sra
9907 (set cbitamt (sub (reg h-r1h) 1))) ; sll
9908 (set cbit (srl (and (sll dst cbitamt) #x80) #x7))
9909 (set obit (ne (and dst #x80) (and result #x80)))
9910 ))
9911 (if (eq shmode #xff) ; HI
9912 (sequence
9913 ((mode cbitamt))
9914 (if (lt mode (reg h-r1h) #x0)
9915 (set cbitamt (sub 16 (reg h-r1h))) ; sra
9916 (set cbitamt (sub (reg h-r1h) 1))) ; sll
9917 (set cbit (srl (and (sll dst cbitamt) #x8000) #xf))
9918 (set obit (ne (and dst #x8000) (and result #x8000)))
9919 ))
9920 (set-z-and-s result)
9921 (set dst result))
9922 )
9923 ; sha.BW #imm4,dst (m16 #1 m32 #1)
9924 (binary-arith16-shimm4-dst-defn QI .b 0 0 sha (f-0-4 #xF) (f-4-3 0) sha-sem)
9925 (binary-arith16-shimm4-dst-defn HI .w 0 1 sha (f-0-4 #xF) (f-4-3 0) sha-sem)
9926 (binary-arith32-shimm4-dst-defn QI .b 1 0 sha #x7 #x0 sha-sem)
9927 (binary-arith32-shimm4-dst-defn HI .w 1 1 sha #x7 #x0 sha-sem)
9928 ; sha.BW r1h,dst (m16 #2 m32 #3)
9929 (dni sha16.b-dst "sha.b r1h,dest" ((machine 16))
9930 ("sha.b r1h,${dst16-16-QI}")
9931 (+ (f-0-4 7) (f-4-4 4) (f-8-4 #xF) dst16-16-QI)
9932 (shar1h-sem HI dst16-16-QI)
9933 ())
9934 (dni sha16.w-dst "sha.w r1h,dest" ((machine 16))
9935 ("sha.w r1h,${dst16-16-HI}")
9936 (+ (f-0-4 7) (f-4-4 5) (f-8-4 #xF) dst16-16-HI)
9937 (shar1h-sem HI dst16-16-HI)
9938 ())
9939 (dni sha32.b-dst "sha.b r1h,dest" ((machine 32))
9940 ("sha.b r1h,${dst32-16-Unprefixed-QI}")
9941 (+ (f-0-4 #xB) dst32-16-Unprefixed-QI (f-7-1 0) (f-10-2 3) (f-12-4 #xE))
9942 (shar1h-sem QI dst32-16-Unprefixed-QI)
9943 ())
9944 (dni sha32.w-dst "sha.w r1h,dest" ((machine 32))
9945 ("sha.w r1h,${dst32-16-Unprefixed-HI}")
9946 (+ (f-0-4 #xB) dst32-16-Unprefixed-HI (f-7-1 1) (f-10-2 3) (f-12-4 #xE))
9947 (shar1h-sem HI dst32-16-Unprefixed-HI)
9948 ())
9949 ; sha.L #imm,dst (m16 #3)
9950 (dni sha16-L-imm-r2r0 "sha.L #Imm-sh-12-s4,r2r0" ((machine 16))
9951 "sha.l #${Imm-sh-12-s4},r2r0"
9952 (+ (f-0-4 #xE) (f-4-4 #xB) (f-8-4 #xA) Imm-sh-12-s4)
9953 (sha-sem SI Imm-sh-12-s4 (reg h-r2r0))
9954 ())
9955 (dni sha16-L-imm-r3r1 "sha.L #Imm-sh-12-s4,r3r1" ((machine 16))
9956 "sha.l #${Imm-sh-12-s4},r3r1"
9957 (+ (f-0-4 #xE) (f-4-4 #xB) (f-8-4 #xB) Imm-sh-12-s4)
9958 (sha-sem SI Imm-sh-12-s4 (reg h-r3r1))
9959 ())
9960 ; sha.L r1h,dst (m16 #4)
9961 (dni sha16-L-r1h-r2r0 "sha.L r1h,r2r0" ((machine 16))
9962 "sha.l r1h,r2r0"
9963 (+ (f-0-4 #xE) (f-4-4 #xB) (f-8-4 2) (f-12-4 1))
9964 (sha-sem SI (reg h-r1h) (reg h-r2r0))
9965 ())
9966 (dni sha16-L-r1h-r3r1 "sha.L r1h,r3r1" ((machine 16))
9967 "sha.l r1h,r3r1"
9968 (+ (f-0-4 #xE) (f-4-4 #xB) (f-8-4 3) (f-12-4 1))
9969 (sha-sem SI (reg h-r1h) (reg h-r3r1))
9970 ())
9971 ; sha.L #imm8,dst (m32 #2)
9972 (binary-arith32-imm-dst-defn QI SI .l 0 sha X #xA #x2 #x1 sha-sem)
9973 ; sha.L r1h,dst (m32 #4)
9974 (dni sha32.l-dst "sha.l r1h,dest" ((machine 32))
9975 ("sha.l r1h,${dst32-16-Unprefixed-SI}")
9976 (+ (f-0-4 #xC) dst32-16-Unprefixed-SI (f-7-1 0) (f-10-2 1) (f-12-4 1))
9977 (shar1h-sem QI dst32-16-Unprefixed-SI)
9978 ())
9979
9980 ;-------------------------------------------------------------
9981 ; shanc - shift arithmetic non carry (m32)
9982 ;-------------------------------------------------------------
9983
9984 ; TODO check semantics
9985 ; shanc.L #imm8,dst
9986 (binary-arith32-imm-dst-defn QI SI .l 0 shanc X #xC #x2 #x1 sha-sem)
9987
9988 ;-------------------------------------------------------------
9989 ; shl - shift logical
9990 ;-------------------------------------------------------------
9991
9992 ; TODO future: split this into .b and .w semantics
9993 (define-pmacro (shl-sem mode src1 dst)
9994 (sequence ((mode result)(mode shift)(mode shmode))
9995 (case DFLT src1
9996 ((#x0) (set shift 1))
9997 ((#x1) (set shift 2))
9998 ((#x2) (set shift 3))
9999 ((#x3) (set shift 4))
10000 ((#x4) (set shift 5))
10001 ((#x5) (set shift 6))
10002 ((#x6) (set shift 7))
10003 ((#x7) (set shift 8))
10004 ((-8) (set shift -1))
10005 ((-7) (set shift -2))
10006 ((-6) (set shift -3))
10007 ((-5) (set shift -4))
10008 ((-4) (set shift -5))
10009 ((-3) (set shift -6))
10010 ((-2) (set shift -7))
10011 ((-1) (set shift -8))
10012 (else (set shift 0))
10013 )
10014 (set shmode -1)
10015 (set shmode (srl shmode #x8))
10016 (if (lt mode shift #x0) (set result (srl mode dst (mul shift -1))))
10017 (if (gt mode shift 0) (set result (sll mode dst shift)))
10018 (if (eq shmode #x0) ; QI
10019 (sequence
10020 ((mode cbitamt))
10021 (if (lt mode shift #x0)
10022 (set cbitamt (sub #x8 shift)); srl
10023 (set cbitamt (sub shift 1))) ; sll
10024 (set cbit (srl (and (sll dst cbitamt) #x80) #x7))
10025 (set obit (ne (and dst #x80) (and result #x80)))
10026 ))
10027 (if (eq shmode #xff) ; HI
10028 (sequence
10029 ((mode cbitamt))
10030 (if (lt mode shift #x0)
10031 (set cbitamt (sub 16 shift)) ; srl
10032 (set cbitamt (sub shift 1))) ; sll
10033 (set cbit (srl (and (sll dst cbitamt) #x8000) #xf))
10034 (set obit (ne (and dst #x8000) (and result #x8000)))
10035 ))
10036 (set-z-and-s result)
10037 (set dst result))
10038 )
10039 (define-pmacro (shlr1h-sem mode dst)
10040 (sequence ((mode result)(mode shmode))
10041 (set shmode -1)
10042 (set shmode (srl shmode #x8))
10043 (if (lt mode (reg h-r1h) 0) (set result (srl mode dst (reg h-r1h))))
10044 (if (gt mode (reg h-r1h) 0) (set result (sll mode dst (reg h-r1h))))
10045 (if (eq shmode #x0) ; QI
10046 (sequence
10047 ((mode cbitamt))
10048 (if (lt mode (reg h-r1h) #x0)
10049 (set cbitamt (sub #x8 (reg h-r1h))) ; srl
10050 (set cbitamt (sub (reg h-r1h) 1))) ; sll
10051 (set cbit (srl (and (sll dst cbitamt) #x80) #x7))
10052 (set obit (ne (and dst #x80) (and result #x80)))
10053 ))
10054 (if (eq shmode #xff) ; HI
10055 (sequence
10056 ((mode cbitamt))
10057 (if (lt mode (reg h-r1h) #x0)
10058 (set cbitamt (sub 16 (reg h-r1h))) ; srl
10059 (set cbitamt (sub (reg h-r1h) 1))) ; sll
10060 (set cbit (srl (and (sll dst cbitamt) #x8000) #xf))
10061 (set obit (ne (and dst #x8000) (and result #x8000)))
10062 ))
10063 (set-z-and-s result)
10064 (set dst result))
10065 )
10066 ; shl.BW #imm4,dst (m16 #1 m32 #1)
10067 (binary-arith16-shimm4-dst-defn QI .b 0 0 shl (f-0-4 #xE) (f-4-3 4) shl-sem)
10068 (binary-arith16-shimm4-dst-defn HI .w 0 1 shl (f-0-4 #xE) (f-4-3 4) shl-sem)
10069 (binary-arith32-shimm4-dst-defn QI .b 0 0 shl #x7 #x0 shl-sem)
10070 (binary-arith32-shimm4-dst-defn HI .w 0 1 shl #x7 #x0 shl-sem)
10071 ; shl.BW r1h,dst (m16 #2 m32 #3)
10072 (dni shl16.b-dst "shl.b r1h,dest" ((machine 16))
10073 ("shl.b r1h,${dst16-16-QI}")
10074 (+ (f-0-4 7) (f-4-4 4) (f-8-4 #xE) dst16-16-QI)
10075 (shlr1h-sem HI dst16-16-QI)
10076 ())
10077 (dni shl16.w-dst "shl.w r1h,dest" ((machine 16))
10078 ("shl.w r1h,${dst16-16-HI}")
10079 (+ (f-0-4 7) (f-4-4 5) (f-8-4 #xE) dst16-16-HI)
10080 (shlr1h-sem HI dst16-16-HI)
10081 ())
10082 (dni shl32.b-dst "shl.b r1h,dest" ((machine 32))
10083 ("shl.b r1h,${dst32-16-Unprefixed-QI}")
10084 (+ (f-0-4 #xA) dst32-16-Unprefixed-QI (f-7-1 0) (f-10-2 3) (f-12-4 #xE))
10085 (shlr1h-sem QI dst32-16-Unprefixed-QI)
10086 ())
10087 (dni shl32.w-dst "shl.w r1h,dest" ((machine 32))
10088 ("shl.w r1h,${dst32-16-Unprefixed-HI}")
10089 (+ (f-0-4 #xA) dst32-16-Unprefixed-HI (f-7-1 1) (f-10-2 3) (f-12-4 #xE))
10090 (shlr1h-sem HI dst32-16-Unprefixed-HI)
10091 ())
10092 ; shl.L #imm,dst (m16 #3)
10093 (dni shl16-L-imm-r2r0 "shl.L #Imm-sh-12-s4,r2r0" ((machine 16))
10094 "shl.l #${Imm-sh-12-s4},r2r0"
10095 (+ (f-0-4 #xE) (f-4-4 #xB) (f-8-4 #x8) Imm-sh-12-s4)
10096 (shl-sem SI Imm-sh-12-s4 (reg h-r2r0))
10097 ())
10098 (dni shl16-L-imm-r3r1 "shl.L #Imm-sh-12-s4,r3r1" ((machine 16))
10099 "shl.l #${Imm-sh-12-s4},r3r1"
10100 (+ (f-0-4 #xE) (f-4-4 #xB) (f-8-4 #x9) Imm-sh-12-s4)
10101 (shl-sem SI Imm-sh-12-s4 (reg h-r3r1))
10102 ())
10103 ; shl.L r1h,dst (m16 #4)
10104 (dni shl16-L-r1h-r2r0 "shl.L r1h,r2r0" ((machine 16))
10105 "shl.l r1h,r2r0"
10106 (+ (f-0-4 #xE) (f-4-4 #xB) (f-8-4 0) (f-12-4 1))
10107 (shl-sem SI (reg h-r1h) (reg h-r2r0))
10108 ())
10109 (dni shl16-L-r1h-r3r1 "shl.L r1h,r3r1" ((machine 16))
10110 "shl.l r1h,r3r1"
10111 (+ (f-0-4 #xE) (f-4-4 #xB) (f-8-4 1) (f-12-4 1))
10112 (shl-sem SI (reg h-r1h) (reg h-r3r1))
10113 ())
10114 ; shl.L #imm8,dst (m32 #2)
10115 (binary-arith32-imm-dst-defn QI SI .l 0 shl X #x9 #x2 #x1 shl-sem)
10116 ; shl.L r1h,dst (m32 #4)
10117 (dni shl32.l-dst "shl.l r1h,dest" ((machine 32))
10118 ("shl.l r1h,${dst32-16-Unprefixed-SI}")
10119 (+ (f-0-4 #xC) dst32-16-Unprefixed-SI (f-7-1 0) (f-10-2 0) (f-12-4 1))
10120 (shlr1h-sem QI dst32-16-Unprefixed-SI)
10121 ())
10122
10123 ;-------------------------------------------------------------
10124 ; shlnc - shift logical non carry
10125 ;-------------------------------------------------------------
10126
10127 ; TODO check semantics
10128 ; shlnc.L #imm8,dst
10129 (binary-arith32-imm-dst-defn QI SI .l 0 shlnc X #x8 #x2 #x1 shl-sem)
10130
10131 ;-------------------------------------------------------------
10132 ; sin - string input (m32)
10133 ;-------------------------------------------------------------
10134
10135 ; TODO semantics
10136 (dni sin32.b "sin" ((machine 32))
10137 ("sin.b")
10138 (+ (f-0-4 #xB) (f-4-4 2) (f-8-4 8) (f-12-4 3))
10139 (c-call VOID "sin_QI_semantics")
10140 ())
10141
10142 (dni sin32.w "sin" ((machine 32))
10143 ("sin.w")
10144 (+ (f-0-4 #xB) (f-4-4 2) (f-8-4 9) (f-12-4 3))
10145 (c-call VOID "sin_HI_semantics")
10146 ())
10147
10148 ;-------------------------------------------------------------
10149 ; smovb - string move backward
10150 ;-------------------------------------------------------------
10151
10152 ; TODO semantics
10153 (dni smovb16.b "smovb.b" ((machine 16))
10154 ("smovb.b")
10155 (+ (f-0-4 7) (f-4-4 #xC) (f-8-4 #xE) (f-12-4 9))
10156 (c-call VOID "smovb_QI_semantics")
10157 ())
10158
10159 (dni smovb16.w "smovb.w" ((machine 16))
10160 ("smovb.w")
10161 (+ (f-0-4 7) (f-4-4 #xD) (f-8-4 #xE) (f-12-4 9))
10162 (c-call VOID "smovb_HI_semantics")
10163 ())
10164
10165 (dni smovb32.b "smovb.b" ((machine 32))
10166 ("smovb.b")
10167 (+ (f-0-4 #xB) (f-4-4 6) (f-8-4 8) (f-12-4 3))
10168 (c-call VOID "smovb_QI_semantics")
10169 ())
10170
10171 (dni smovb32.w "smovb.w" ((machine 32))
10172 ("smovb.w")
10173 (+ (f-0-4 #xB) (f-4-4 6) (f-8-4 9) (f-12-4 3))
10174 (c-call VOID "smovb_HI_semantics")
10175 ())
10176
10177 ;-------------------------------------------------------------
10178 ; smovf - string move forward (m32)
10179 ;-------------------------------------------------------------
10180
10181 ; TODO semantics
10182 (dni smovf16.b "smovf.b" ((machine 16))
10183 ("smovf.b")
10184 (+ (f-0-4 7) (f-4-4 #xC) (f-8-4 #xE) (f-12-4 8))
10185 (c-call VOID "smovf_QI_semantics")
10186 ())
10187
10188 (dni smovf16.w "smovf.w" ((machine 16))
10189 ("smovf.w")
10190 (+ (f-0-4 7) (f-4-4 #xD) (f-8-4 #xE) (f-12-4 8))
10191 (c-call VOID "smovf_HI_semantics")
10192 ())
10193
10194 (dni smovf32.b "smovf.b" ((machine 32))
10195 ("smovf.b")
10196 (+ (f-0-4 #xB) (f-4-4 0) (f-8-4 8) (f-12-4 3))
10197 (c-call VOID "smovf_QI_semantics")
10198 ())
10199
10200 (dni smovf32.w "smovf.w" ((machine 32))
10201 ("smovf.w")
10202 (+ (f-0-4 #xB) (f-4-4 0) (f-8-4 9) (f-12-4 3))
10203 (c-call VOID "smovf_HI_semantics")
10204 ())
10205
10206 ;-------------------------------------------------------------
10207 ; smovu - string move unequal (m32)
10208 ;-------------------------------------------------------------
10209
10210 ; TODO semantics
10211 (dni smovu.b "smovu.b" ((machine 32))
10212 ("smovu.b")
10213 (+ (f-0-4 #xB) (f-4-4 8) (f-8-4 8) (f-12-4 3))
10214 (c-call VOID "smovu_QI_semantics")
10215 ())
10216
10217 (dni smovu.w "smovu.w" ((machine 32))
10218 ("smovu.w")
10219 (+ (f-0-4 #xB) (f-4-4 8) (f-8-4 9) (f-12-4 3))
10220 (c-call VOID "smovu_HI_semantics")
10221 ())
10222
10223 ;-------------------------------------------------------------
10224 ; sout - string output (m32)
10225 ;-------------------------------------------------------------
10226
10227 ; TODO semantics
10228 (dni sout.b "sout.b" ((machine 32))
10229 ("sout.b")
10230 (+ (f-0-4 #xB) (f-4-4 4) (f-8-4 8) (f-12-4 3))
10231 (c-call VOID "sout_QI_semantics")
10232 ())
10233
10234 (dni sout.w "sout" ((machine 32))
10235 ("sout.w")
10236 (+ (f-0-4 #xB) (f-4-4 4) (f-8-4 9) (f-12-4 3))
10237 (c-call VOID "sout_HI_semantics")
10238 ())
10239
10240 ;-------------------------------------------------------------
10241 ; sstr - string store
10242 ;-------------------------------------------------------------
10243
10244 ; TODO semantics
10245 (dni sstr16.b "sstr.b" ((machine 16))
10246 ("sstr.b")
10247 (+ (f-0-4 7) (f-4-4 #xC) (f-8-4 #xE) (f-12-4 #xA))
10248 (c-call VOID "sstr_QI_semantics")
10249 ())
10250
10251 (dni sstr16.w "sstr.w" ((machine 16))
10252 ("sstr.w")
10253 (+ (f-0-4 7) (f-4-4 #xD) (f-8-4 #xE) (f-12-4 #xA))
10254 (c-call VOID "sstr_HI_semantics")
10255 ())
10256
10257 (dni sstr.b "sstr" ((machine 32))
10258 ("sstr.b")
10259 (+ (f-0-4 #xB) (f-4-4 8) (f-8-4 0) (f-12-4 3))
10260 (c-call VOID "sstr_QI_semantics")
10261 ())
10262
10263 (dni sstr.w "sstr" ((machine 32))
10264 ("sstr.w")
10265 (+ (f-0-4 #xB) (f-4-4 8) (f-8-4 1) (f-12-4 3))
10266 (c-call VOID "sstr_HI_semantics")
10267 ())
10268
10269 ;-------------------------------------------------------------
10270 ; stnz - store on not zero
10271 ;-------------------------------------------------------------
10272
10273 (define-pmacro (stnz-sem mode src dst)
10274 (sequence ()
10275 (if (ne zbit (const 1))
10276 (set dst src)))
10277 )
10278 ; stnz #imm8,dst3 (m16)
10279 (binary-arith16-b-S-imm8-dst3 stnz "" (f-0-4 #xD) (f-4-1 0) stnz-sem)
10280 ; stnz.BW #imm,dst (m32)
10281 (binary-arith32-imm-dst-defn QI QI .b 0 stnz X #x9 #x1 #xF stnz-sem)
10282 (binary-arith32-imm-dst-defn HI HI .w 1 stnz X #x9 #x1 #xF stnz-sem)
10283
10284 ;-------------------------------------------------------------
10285 ; stz - store on zero
10286 ;-------------------------------------------------------------
10287
10288 (define-pmacro (stz-sem mode src dst)
10289 (sequence ()
10290 (if (eq zbit (const 1))
10291 (set dst src)))
10292 )
10293 ; stz #imm8,dst3 (m16)
10294 (binary-arith16-b-S-imm8-dst3 stz "" (f-0-4 #xC) (f-4-1 1) stz-sem)
10295 ; stz.BW #imm,dst (m32)
10296 (binary-arith32-imm-dst-defn QI QI .b 0 stz X #x9 #x0 #xF stz-sem)
10297 (binary-arith32-imm-dst-defn HI HI .w 1 stz X #x9 #x0 #xF stz-sem)
10298
10299 ;-------------------------------------------------------------
10300 ; stzx - store on zero extention
10301 ;-------------------------------------------------------------
10302
10303 (define-pmacro (stzx-sem mode src1 src2 dst)
10304 (sequence ()
10305 (if (eq zbit (const 1))
10306 (set dst src1)
10307 (set dst src2)))
10308 )
10309 ; stzx #imm8,dst3 (m16)
10310 (dni stzx16-imm8-imm8-r0h "stzx #Imm8,#Imm8,r0h" ((machine 16))
10311 ("stzx #${Imm-8-QI},#${Imm-16-QI},r0h")
10312 (+ (f-0-4 #xD) (f-4-4 #xB) Imm-8-QI Imm-16-QI)
10313 (stzx-sem QI Imm-8-QI Imm-16-QI (reg h-r0h))
10314 ())
10315 (dni stzx16-imm8-imm8-r0l "stzx #Imm8,#Imm8,r0l" ((machine 16))
10316 ("stzx #${Imm-8-QI},#${Imm-16-QI},r0l")
10317 (+ (f-0-4 #xD) (f-4-4 #xC) Imm-8-QI Imm-16-QI)
10318 (stzx-sem QI Imm-8-QI Imm-16-QI (reg h-r0l))
10319 ())
10320 (dni stzx16-imm8-imm8-dsp8sb "stzx #Imm8,#Imm8,dsp8[sb]" ((machine 16))
10321 ("stzx #${Imm-8-QI},#${Imm-24-QI},${Dsp-16-u8}[sb]")
10322 (+ (f-0-4 #xD) (f-4-4 #xD) Imm-8-QI Dsp-16-u8 Imm-24-QI)
10323 (stzx-sem QI Imm-8-QI Imm-16-QI (mem16 QI (add (reg h-sb) Dsp-24-u8)))
10324 ())
10325 (dni stzx16-imm8-imm8-dsp8fb "stzx #Imm8,#Imm8,dsp8[fb]" ((machine 16))
10326 ("stzx #${Imm-8-QI},#${Imm-24-QI},${Dsp-16-s8}[fb]")
10327 (+ (f-0-4 #xD) (f-4-4 #xE) Imm-8-QI Dsp-16-s8 Imm-24-QI)
10328 (stzx-sem QI Imm-8-QI Imm-24-QI (mem16 QI (add (reg h-fb) Dsp-16-s8)))
10329 ())
10330 (dni stzx16-imm8-imm8-abs16 "stzx #Imm8,#Imm8,abs16" ((machine 16))
10331 ("stzx #${Imm-8-QI},#${Imm-32-QI},${Dsp-16-u16}")
10332 (+ (f-0-4 #xD) (f-4-4 #xF) Imm-8-QI Dsp-16-u16 Imm-32-QI)
10333 (stzx-sem QI Imm-8-QI Imm-32-QI (mem16 QI Dsp-16-u16))
10334 ())
10335 ; stzx.BW #imm,dst (m32)
10336 (insn-imm1-imm2-dst-Unprefixed stzx #x9 #x3 #xF stzx-sem)
10337
10338 ;-------------------------------------------------------------
10339 ; subx - subtract extend (m32)
10340 ;-------------------------------------------------------------
10341
10342 (define-pmacro (subx-sem mode src1 dst)
10343 (sequence ((mode result))
10344 (set result (sub mode dst (ext mode src1)))
10345 (set obit (sub-oflag mode dst (ext mode src1) 0))
10346 (set cbit (sub-cflag mode dst (ext mode src1) 0))
10347 (set dst result)
10348 (set-z-and-s result)))
10349 ; subx #imm8,dst
10350 (binary-arith32-imm-dst-defn QI SI "" 0 subx G #x9 #x1 #x1 subx-sem)
10351 ; subx src,dst
10352 (binary-arith32-src-dst-defn QI SI "" 0 subx G #x1 #x0 subx-sem)
10353
10354 ;-------------------------------------------------------------
10355 ; tst - test
10356 ;-------------------------------------------------------------
10357
10358 (define-pmacro (tst-sem mode src1 dst)
10359 (sequence ((mode result))
10360 (set result (and mode dst src1))
10361 (set-z-and-s result))
10362 )
10363
10364 ; tst.BW #imm,dst (m16 #1 m32 #1)
10365 (binary-arith-imm-dst tst G (f-0-4 7) (f-4-3 3) (f-8-4 0) #x9 #x3 #xE tst-sem)
10366 ; tst.BW src,dst (m16 #2 m32 #3)
10367 (binary-arith16-src-dst-defn QI QI .b 0 tst X (f-0-4 #x8) (f-4-3 0) tst-sem)
10368 (binary-arith16-src-dst-defn HI HI .w 1 tst X (f-0-4 #x8) (f-4-3 0) tst-sem)
10369 (binary-arith32-src-dst-Prefixed QI QI .b 0 tst G #x1 #x9 tst-sem)
10370 (binary-arith32-src-dst-Prefixed HI HI .w 1 tst G #x1 #x9 tst-sem)
10371 ; tst.BW:S #imm,dst2 (m32 #2)
10372 (binary-arith32-s-imm-dst QI .b 0 tst #x0 #x6 tst-sem)
10373 (binary-arith32-s-imm-dst HI .w 1 tst #x0 #x6 tst-sem)
10374
10375 ;-------------------------------------------------------------
10376 ; und - undefined
10377 ;-------------------------------------------------------------
10378
10379 (dni und16 "und" ((machine 16))
10380 ("und")
10381 (+ (f-0-4 #xF) (f-4-4 #xF))
10382 (nop)
10383 ())
10384
10385 (dni und32 "und" ((machine 32))
10386 ("und")
10387 (+ (f-0-4 #xF) (f-4-4 #xF))
10388 (nop)
10389 ())
10390
10391 ;-------------------------------------------------------------
10392 ; wait
10393 ;-------------------------------------------------------------
10394
10395 ; ??? semantics
10396 (dni wait16 "wait" ((machine 16))
10397 ("wait")
10398 (+ (f-0-4 7) (f-4-4 #xD) (f-8-4 #xF) (f-12-4 3))
10399 (nop)
10400 ())
10401
10402 (dni wait "wait" ((machine 32))
10403 ("wait")
10404 (+ (f-0-4 #xB) (f-4-4 2) (f-8-4 0) (f-12-4 3))
10405 (nop)
10406 ())
10407
10408 ;-------------------------------------------------------------
10409 ; xchg - exchange
10410 ;-------------------------------------------------------------
10411
10412 (define-pmacro (xchg-sem mode src dst)
10413 (sequence ((mode result))
10414 (set result src)
10415 (set src dst)
10416 (set dst result))
10417 )
10418 (define-pmacro (xchg16-defn mode sz szc src srcreg)
10419 (dni (.sym xchg16 sz - srcreg)
10420 (.str "xchg" sz "-" srcreg ",dst16-16-" mode)
10421 ((machine 16))
10422 (.str "xchg." sz " " srcreg ",${dst16-16-" mode "}")
10423 (+ (f-0-4 #x7) (f-4-3 #x5) (f-7-1 szc) (f-8-2 0) (f-10-2 src) (.sym dst16-16- mode))
10424 (xchg-sem mode (reg (.sym h- srcreg)) (.sym dst16-16- mode))
10425 ())
10426 )
10427 (xchg16-defn QI b 0 0 r0l)
10428 (xchg16-defn QI b 0 1 r0h)
10429 (xchg16-defn QI b 0 2 r1l)
10430 (xchg16-defn QI b 0 3 r1h)
10431 (xchg16-defn HI w 1 0 r0)
10432 (xchg16-defn HI w 1 1 r1)
10433 (xchg16-defn HI w 1 2 r2)
10434 (xchg16-defn HI w 1 3 r3)
10435 (define-pmacro (xchg32-defn mode sz szc src srcreg)
10436 (dni (.sym xchg32 sz - srcreg)
10437 (.str "xchg" sz "-" srcreg ",dst32-16-Unprefixed-" mode)
10438 ((machine 32))
10439 (.str "xchg." sz " " srcreg ",${dst32-16-Unprefixed-" mode "}")
10440 (+ (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))
10441 (xchg-sem mode (reg (.sym h- srcreg)) (.sym dst32-16-Unprefixed- mode))
10442 ())
10443 )
10444 (xchg32-defn QI b 0 0 r0l)
10445 (xchg32-defn QI b 0 1 r1l)
10446 (xchg32-defn QI b 0 2 a0)
10447 (xchg32-defn QI b 0 3 a1)
10448 (xchg32-defn QI b 0 4 r0h)
10449 (xchg32-defn QI b 0 5 r1h)
10450 (xchg32-defn HI w 1 0 r0)
10451 (xchg32-defn HI w 1 1 r1)
10452 (xchg32-defn HI w 1 2 a0)
10453 (xchg32-defn HI w 1 3 a1)
10454 (xchg32-defn HI w 1 4 r2)
10455 (xchg32-defn HI w 1 5 r3)
10456
10457 ;-------------------------------------------------------------
10458 ; xor - exclusive or
10459 ;-------------------------------------------------------------
10460
10461 (define-pmacro (xor-sem mode src1 dst)
10462 (sequence ((mode result))
10463 (set result (xor mode src1 dst))
10464 (set-z-and-s result)
10465 (set dst result))
10466 )
10467
10468 ; xor.BW #imm,dst (m16 #1 m32 #1)
10469 (binary-arith-imm-dst xor G (f-0-4 7) (f-4-3 3) (f-8-4 1) #x9 #x0 #xE xor-sem)
10470 ; xor.BW src,dst (m16 #3 m32 #3)
10471 (binary-arith-src-dst xor G (f-0-4 #x8) (f-4-3 4) #x1 #x9 xor-sem)
10472
10473 ;-------------------------------------------------------------
10474 ; Widening
10475 ;-------------------------------------------------------------
10476
10477 (define-pmacro (exts-sem smode dmode src dst)
10478 (set dst (ext dmode (trunc smode src)))
10479 )
10480 (define-pmacro (extz-sem smode dmode src dst)
10481 (set dst (zext dmode (trunc smode src)))
10482 )
10483
10484 ; exts.b dst for m16c
10485 (ext16-defn QI HI .b 0 exts (f-0-4 7) (f-4-3 6) (f-8-4 6) exts-sem)
10486
10487 ; exts.w r0 for m16c
10488 (dni exts16.w-r0
10489 "exts.w r0"
10490 ((machine 16))
10491 "exts.w r0"
10492 (+ (f-0-4 #x7) (f-4-4 #xC) (f-8-4 #xF) (f-12-4 3))
10493 (exts-sem HI SI R0 R2R0)
10494 ())
10495
10496 ; exts.size dst for m32c
10497 (ext32-defn QI HI .b 0 exts (f-0-4 #xC) (f-10-2 1) (f-12-4 #xE) exts-sem)
10498 (ext32-defn HI SI .w 1 exts (f-0-4 #xC) (f-10-2 1) (f-12-4 #xE) exts-sem)
10499 ; exts.b src,dst for m32c
10500 (ext32-binary-defn exts .b #x1 #x7 exts-sem)
10501
10502 ; extz.b src,dst for m32c
10503 (ext32-binary-defn extz "" #x1 #xB extz-sem)
10504
10505 ;-------------------------------------------------------------
10506 ; Indirect
10507 ;-------------------------------------------------------------
10508
10509 ; TODO semantics
10510 (dni srcind "SRC-INDIRECT" ((machine 32))
10511 ("src-indirect")
10512 (+ (f-0-4 4) (f-4-4 1))
10513 (set (reg h-src-indirect) 1)
10514 ())
10515
10516 (dni destind "DEST-INDIRECT" ((machine 32))
10517 ("dest-indirect")
10518 (+ (f-0-4 0) (f-4-4 9))
10519 (set (reg h-dst-indirect) 1)
10520 ())
10521
10522 (dni srcdestind "SRC-DEST-INDIRECT" ((machine 32))
10523 ("src-dest-indirect")
10524 (+ (f-0-4 4) (f-4-4 9))
10525 (sequence () (set (reg h-src-indirect) 1) (set (reg h-dst-indirect) 1))
10526 ())
10527