[cgen]
[deliverable/binutils-gdb.git] / opcodes / mep-ibld.c
1 /* Instruction building/extraction support for mep. -*- C -*-
2
3 THIS FILE IS MACHINE GENERATED WITH CGEN: Cpu tools GENerator.
4 - the resultant file is machine generated, cgen-ibld.in isn't
5
6 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2005, 2006, 2007,
7 2008 Free Software Foundation, Inc.
8
9 This file is part of libopcodes.
10
11 This library is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 3, or (at your option)
14 any later version.
15
16 It is distributed in the hope that it will be useful, but WITHOUT
17 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
18 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
19 License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software Foundation, Inc.,
23 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
24
25 /* ??? Eventually more and more of this stuff can go to cpu-independent files.
26 Keep that in mind. */
27
28 #include "sysdep.h"
29 #include <stdio.h>
30 #include "ansidecl.h"
31 #include "dis-asm.h"
32 #include "bfd.h"
33 #include "symcat.h"
34 #include "mep-desc.h"
35 #include "mep-opc.h"
36 #include "opintl.h"
37 #include "safe-ctype.h"
38
39 #undef min
40 #define min(a,b) ((a) < (b) ? (a) : (b))
41 #undef max
42 #define max(a,b) ((a) > (b) ? (a) : (b))
43
44 /* Used by the ifield rtx function. */
45 #define FLD(f) (fields->f)
46
47 static const char * insert_normal
48 (CGEN_CPU_DESC, long, unsigned int, unsigned int, unsigned int,
49 unsigned int, unsigned int, unsigned int, CGEN_INSN_BYTES_PTR);
50 static const char * insert_insn_normal
51 (CGEN_CPU_DESC, const CGEN_INSN *,
52 CGEN_FIELDS *, CGEN_INSN_BYTES_PTR, bfd_vma);
53 static int extract_normal
54 (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *, CGEN_INSN_INT,
55 unsigned int, unsigned int, unsigned int, unsigned int,
56 unsigned int, unsigned int, bfd_vma, long *);
57 static int extract_insn_normal
58 (CGEN_CPU_DESC, const CGEN_INSN *, CGEN_EXTRACT_INFO *,
59 CGEN_INSN_INT, CGEN_FIELDS *, bfd_vma);
60 #if CGEN_INT_INSN_P
61 static void put_insn_int_value
62 (CGEN_CPU_DESC, CGEN_INSN_BYTES_PTR, int, int, CGEN_INSN_INT);
63 #endif
64 #if ! CGEN_INT_INSN_P
65 static CGEN_INLINE void insert_1
66 (CGEN_CPU_DESC, unsigned long, int, int, int, unsigned char *);
67 static CGEN_INLINE int fill_cache
68 (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *, int, int, bfd_vma);
69 static CGEN_INLINE long extract_1
70 (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *, int, int, int, unsigned char *, bfd_vma);
71 #endif
72 \f
73 /* Operand insertion. */
74
75 #if ! CGEN_INT_INSN_P
76
77 /* Subroutine of insert_normal. */
78
79 static CGEN_INLINE void
80 insert_1 (CGEN_CPU_DESC cd,
81 unsigned long value,
82 int start,
83 int length,
84 int word_length,
85 unsigned char *bufp)
86 {
87 unsigned long x,mask;
88 int shift;
89
90 x = cgen_get_insn_value (cd, bufp, word_length);
91
92 /* Written this way to avoid undefined behaviour. */
93 mask = (((1L << (length - 1)) - 1) << 1) | 1;
94 if (CGEN_INSN_LSB0_P)
95 shift = (start + 1) - length;
96 else
97 shift = (word_length - (start + length));
98 x = (x & ~(mask << shift)) | ((value & mask) << shift);
99
100 cgen_put_insn_value (cd, bufp, word_length, (bfd_vma) x);
101 }
102
103 #endif /* ! CGEN_INT_INSN_P */
104
105 /* Default insertion routine.
106
107 ATTRS is a mask of the boolean attributes.
108 WORD_OFFSET is the offset in bits from the start of the insn of the value.
109 WORD_LENGTH is the length of the word in bits in which the value resides.
110 START is the starting bit number in the word, architecture origin.
111 LENGTH is the length of VALUE in bits.
112 TOTAL_LENGTH is the total length of the insn in bits.
113
114 The result is an error message or NULL if success. */
115
116 /* ??? This duplicates functionality with bfd's howto table and
117 bfd_install_relocation. */
118 /* ??? This doesn't handle bfd_vma's. Create another function when
119 necessary. */
120
121 static const char *
122 insert_normal (CGEN_CPU_DESC cd,
123 long value,
124 unsigned int attrs,
125 unsigned int word_offset,
126 unsigned int start,
127 unsigned int length,
128 unsigned int word_length,
129 unsigned int total_length,
130 CGEN_INSN_BYTES_PTR buffer)
131 {
132 static char errbuf[100];
133 /* Written this way to avoid undefined behaviour. */
134 unsigned long mask = (((1L << (length - 1)) - 1) << 1) | 1;
135
136 /* If LENGTH is zero, this operand doesn't contribute to the value. */
137 if (length == 0)
138 return NULL;
139
140 if (word_length > 32)
141 abort ();
142
143 /* For architectures with insns smaller than the base-insn-bitsize,
144 word_length may be too big. */
145 if (cd->min_insn_bitsize < cd->base_insn_bitsize)
146 {
147 if (word_offset == 0
148 && word_length > total_length)
149 word_length = total_length;
150 }
151
152 /* Ensure VALUE will fit. */
153 if (CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGN_OPT))
154 {
155 long minval = - (1L << (length - 1));
156 unsigned long maxval = mask;
157
158 if ((value > 0 && (unsigned long) value > maxval)
159 || value < minval)
160 {
161 /* xgettext:c-format */
162 sprintf (errbuf,
163 _("operand out of range (%ld not between %ld and %lu)"),
164 value, minval, maxval);
165 return errbuf;
166 }
167 }
168 else if (! CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED))
169 {
170 unsigned long maxval = mask;
171 unsigned long val = (unsigned long) value;
172
173 /* For hosts with a word size > 32 check to see if value has been sign
174 extended beyond 32 bits. If so then ignore these higher sign bits
175 as the user is attempting to store a 32-bit signed value into an
176 unsigned 32-bit field which is allowed. */
177 if (sizeof (unsigned long) > 4 && ((value >> 32) == -1))
178 val &= 0xFFFFFFFF;
179
180 if (val > maxval)
181 {
182 /* xgettext:c-format */
183 sprintf (errbuf,
184 _("operand out of range (0x%lx not between 0 and 0x%lx)"),
185 val, maxval);
186 return errbuf;
187 }
188 }
189 else
190 {
191 if (! cgen_signed_overflow_ok_p (cd))
192 {
193 long minval = - (1L << (length - 1));
194 long maxval = (1L << (length - 1)) - 1;
195
196 if (value < minval || value > maxval)
197 {
198 sprintf
199 /* xgettext:c-format */
200 (errbuf, _("operand out of range (%ld not between %ld and %ld)"),
201 value, minval, maxval);
202 return errbuf;
203 }
204 }
205 }
206
207 #if CGEN_INT_INSN_P
208
209 {
210 int shift;
211
212 if (CGEN_INSN_LSB0_P)
213 shift = (word_offset + start + 1) - length;
214 else
215 shift = total_length - (word_offset + start + length);
216 *buffer = (*buffer & ~(mask << shift)) | ((value & mask) << shift);
217 }
218
219 #else /* ! CGEN_INT_INSN_P */
220
221 {
222 unsigned char *bufp = (unsigned char *) buffer + word_offset / 8;
223
224 insert_1 (cd, value, start, length, word_length, bufp);
225 }
226
227 #endif /* ! CGEN_INT_INSN_P */
228
229 return NULL;
230 }
231
232 /* Default insn builder (insert handler).
233 The instruction is recorded in CGEN_INT_INSN_P byte order (meaning
234 that if CGEN_INSN_BYTES_PTR is an int * and thus, the value is
235 recorded in host byte order, otherwise BUFFER is an array of bytes
236 and the value is recorded in target byte order).
237 The result is an error message or NULL if success. */
238
239 static const char *
240 insert_insn_normal (CGEN_CPU_DESC cd,
241 const CGEN_INSN * insn,
242 CGEN_FIELDS * fields,
243 CGEN_INSN_BYTES_PTR buffer,
244 bfd_vma pc)
245 {
246 const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
247 unsigned long value;
248 const CGEN_SYNTAX_CHAR_TYPE * syn;
249
250 CGEN_INIT_INSERT (cd);
251 value = CGEN_INSN_BASE_VALUE (insn);
252
253 /* If we're recording insns as numbers (rather than a string of bytes),
254 target byte order handling is deferred until later. */
255
256 #if CGEN_INT_INSN_P
257
258 put_insn_int_value (cd, buffer, cd->base_insn_bitsize,
259 CGEN_FIELDS_BITSIZE (fields), value);
260
261 #else
262
263 cgen_put_insn_value (cd, buffer, min ((unsigned) cd->base_insn_bitsize,
264 (unsigned) CGEN_FIELDS_BITSIZE (fields)),
265 value);
266
267 #endif /* ! CGEN_INT_INSN_P */
268
269 /* ??? It would be better to scan the format's fields.
270 Still need to be able to insert a value based on the operand though;
271 e.g. storing a branch displacement that got resolved later.
272 Needs more thought first. */
273
274 for (syn = CGEN_SYNTAX_STRING (syntax); * syn; ++ syn)
275 {
276 const char *errmsg;
277
278 if (CGEN_SYNTAX_CHAR_P (* syn))
279 continue;
280
281 errmsg = (* cd->insert_operand) (cd, CGEN_SYNTAX_FIELD (*syn),
282 fields, buffer, pc);
283 if (errmsg)
284 return errmsg;
285 }
286
287 return NULL;
288 }
289
290 #if CGEN_INT_INSN_P
291 /* Cover function to store an insn value into an integral insn. Must go here
292 because it needs <prefix>-desc.h for CGEN_INT_INSN_P. */
293
294 static void
295 put_insn_int_value (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
296 CGEN_INSN_BYTES_PTR buf,
297 int length,
298 int insn_length,
299 CGEN_INSN_INT value)
300 {
301 /* For architectures with insns smaller than the base-insn-bitsize,
302 length may be too big. */
303 if (length > insn_length)
304 *buf = value;
305 else
306 {
307 int shift = insn_length - length;
308 /* Written this way to avoid undefined behaviour. */
309 CGEN_INSN_INT mask = (((1L << (length - 1)) - 1) << 1) | 1;
310
311 *buf = (*buf & ~(mask << shift)) | ((value & mask) << shift);
312 }
313 }
314 #endif
315 \f
316 /* Operand extraction. */
317
318 #if ! CGEN_INT_INSN_P
319
320 /* Subroutine of extract_normal.
321 Ensure sufficient bytes are cached in EX_INFO.
322 OFFSET is the offset in bytes from the start of the insn of the value.
323 BYTES is the length of the needed value.
324 Returns 1 for success, 0 for failure. */
325
326 static CGEN_INLINE int
327 fill_cache (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
328 CGEN_EXTRACT_INFO *ex_info,
329 int offset,
330 int bytes,
331 bfd_vma pc)
332 {
333 /* It's doubtful that the middle part has already been fetched so
334 we don't optimize that case. kiss. */
335 unsigned int mask;
336 disassemble_info *info = (disassemble_info *) ex_info->dis_info;
337
338 /* First do a quick check. */
339 mask = (1 << bytes) - 1;
340 if (((ex_info->valid >> offset) & mask) == mask)
341 return 1;
342
343 /* Search for the first byte we need to read. */
344 for (mask = 1 << offset; bytes > 0; --bytes, ++offset, mask <<= 1)
345 if (! (mask & ex_info->valid))
346 break;
347
348 if (bytes)
349 {
350 int status;
351
352 pc += offset;
353 status = (*info->read_memory_func)
354 (pc, ex_info->insn_bytes + offset, bytes, info);
355
356 if (status != 0)
357 {
358 (*info->memory_error_func) (status, pc, info);
359 return 0;
360 }
361
362 ex_info->valid |= ((1 << bytes) - 1) << offset;
363 }
364
365 return 1;
366 }
367
368 /* Subroutine of extract_normal. */
369
370 static CGEN_INLINE long
371 extract_1 (CGEN_CPU_DESC cd,
372 CGEN_EXTRACT_INFO *ex_info ATTRIBUTE_UNUSED,
373 int start,
374 int length,
375 int word_length,
376 unsigned char *bufp,
377 bfd_vma pc ATTRIBUTE_UNUSED)
378 {
379 unsigned long x;
380 int shift;
381
382 x = cgen_get_insn_value (cd, bufp, word_length);
383
384 if (CGEN_INSN_LSB0_P)
385 shift = (start + 1) - length;
386 else
387 shift = (word_length - (start + length));
388 return x >> shift;
389 }
390
391 #endif /* ! CGEN_INT_INSN_P */
392
393 /* Default extraction routine.
394
395 INSN_VALUE is the first base_insn_bitsize bits of the insn in host order,
396 or sometimes less for cases like the m32r where the base insn size is 32
397 but some insns are 16 bits.
398 ATTRS is a mask of the boolean attributes. We only need `SIGNED',
399 but for generality we take a bitmask of all of them.
400 WORD_OFFSET is the offset in bits from the start of the insn of the value.
401 WORD_LENGTH is the length of the word in bits in which the value resides.
402 START is the starting bit number in the word, architecture origin.
403 LENGTH is the length of VALUE in bits.
404 TOTAL_LENGTH is the total length of the insn in bits.
405
406 Returns 1 for success, 0 for failure. */
407
408 /* ??? The return code isn't properly used. wip. */
409
410 /* ??? This doesn't handle bfd_vma's. Create another function when
411 necessary. */
412
413 static int
414 extract_normal (CGEN_CPU_DESC cd,
415 #if ! CGEN_INT_INSN_P
416 CGEN_EXTRACT_INFO *ex_info,
417 #else
418 CGEN_EXTRACT_INFO *ex_info ATTRIBUTE_UNUSED,
419 #endif
420 CGEN_INSN_INT insn_value,
421 unsigned int attrs,
422 unsigned int word_offset,
423 unsigned int start,
424 unsigned int length,
425 unsigned int word_length,
426 unsigned int total_length,
427 #if ! CGEN_INT_INSN_P
428 bfd_vma pc,
429 #else
430 bfd_vma pc ATTRIBUTE_UNUSED,
431 #endif
432 long *valuep)
433 {
434 long value, mask;
435
436 /* If LENGTH is zero, this operand doesn't contribute to the value
437 so give it a standard value of zero. */
438 if (length == 0)
439 {
440 *valuep = 0;
441 return 1;
442 }
443
444 if (word_length > 32)
445 abort ();
446
447 /* For architectures with insns smaller than the insn-base-bitsize,
448 word_length may be too big. */
449 if (cd->min_insn_bitsize < cd->base_insn_bitsize)
450 {
451 if (word_offset + word_length > total_length)
452 word_length = total_length - word_offset;
453 }
454
455 /* Does the value reside in INSN_VALUE, and at the right alignment? */
456
457 if (CGEN_INT_INSN_P || (word_offset == 0 && word_length == total_length))
458 {
459 if (CGEN_INSN_LSB0_P)
460 value = insn_value >> ((word_offset + start + 1) - length);
461 else
462 value = insn_value >> (total_length - ( word_offset + start + length));
463 }
464
465 #if ! CGEN_INT_INSN_P
466
467 else
468 {
469 unsigned char *bufp = ex_info->insn_bytes + word_offset / 8;
470
471 if (word_length > 32)
472 abort ();
473
474 if (fill_cache (cd, ex_info, word_offset / 8, word_length / 8, pc) == 0)
475 return 0;
476
477 value = extract_1 (cd, ex_info, start, length, word_length, bufp, pc);
478 }
479
480 #endif /* ! CGEN_INT_INSN_P */
481
482 /* Written this way to avoid undefined behaviour. */
483 mask = (((1L << (length - 1)) - 1) << 1) | 1;
484
485 value &= mask;
486 /* sign extend? */
487 if (CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED)
488 && (value & (1L << (length - 1))))
489 value |= ~mask;
490
491 *valuep = value;
492
493 return 1;
494 }
495
496 /* Default insn extractor.
497
498 INSN_VALUE is the first base_insn_bitsize bits, translated to host order.
499 The extracted fields are stored in FIELDS.
500 EX_INFO is used to handle reading variable length insns.
501 Return the length of the insn in bits, or 0 if no match,
502 or -1 if an error occurs fetching data (memory_error_func will have
503 been called). */
504
505 static int
506 extract_insn_normal (CGEN_CPU_DESC cd,
507 const CGEN_INSN *insn,
508 CGEN_EXTRACT_INFO *ex_info,
509 CGEN_INSN_INT insn_value,
510 CGEN_FIELDS *fields,
511 bfd_vma pc)
512 {
513 const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
514 const CGEN_SYNTAX_CHAR_TYPE *syn;
515
516 CGEN_FIELDS_BITSIZE (fields) = CGEN_INSN_BITSIZE (insn);
517
518 CGEN_INIT_EXTRACT (cd);
519
520 for (syn = CGEN_SYNTAX_STRING (syntax); *syn; ++syn)
521 {
522 int length;
523
524 if (CGEN_SYNTAX_CHAR_P (*syn))
525 continue;
526
527 length = (* cd->extract_operand) (cd, CGEN_SYNTAX_FIELD (*syn),
528 ex_info, insn_value, fields, pc);
529 if (length <= 0)
530 return length;
531 }
532
533 /* We recognized and successfully extracted this insn. */
534 return CGEN_INSN_BITSIZE (insn);
535 }
536 \f
537 /* Machine generated code added here. */
538
539 const char * mep_cgen_insert_operand
540 (CGEN_CPU_DESC, int, CGEN_FIELDS *, CGEN_INSN_BYTES_PTR, bfd_vma);
541
542 /* Main entry point for operand insertion.
543
544 This function is basically just a big switch statement. Earlier versions
545 used tables to look up the function to use, but
546 - if the table contains both assembler and disassembler functions then
547 the disassembler contains much of the assembler and vice-versa,
548 - there's a lot of inlining possibilities as things grow,
549 - using a switch statement avoids the function call overhead.
550
551 This function could be moved into `parse_insn_normal', but keeping it
552 separate makes clear the interface between `parse_insn_normal' and each of
553 the handlers. It's also needed by GAS to insert operands that couldn't be
554 resolved during parsing. */
555
556 const char *
557 mep_cgen_insert_operand (CGEN_CPU_DESC cd,
558 int opindex,
559 CGEN_FIELDS * fields,
560 CGEN_INSN_BYTES_PTR buffer,
561 bfd_vma pc ATTRIBUTE_UNUSED)
562 {
563 const char * errmsg = NULL;
564 unsigned int total_length = CGEN_FIELDS_BITSIZE (fields);
565
566 switch (opindex)
567 {
568 case MEP_OPERAND_ADDR24A4 :
569 {
570 {
571 FLD (f_24u8a4n_hi) = ((unsigned int) (FLD (f_24u8a4n)) >> (8));
572 FLD (f_24u8a4n_lo) = ((unsigned int) (((FLD (f_24u8a4n)) & (252))) >> (2));
573 }
574 errmsg = insert_normal (cd, fields->f_24u8a4n_hi, 0, 0, 16, 16, 32, total_length, buffer);
575 if (errmsg)
576 break;
577 errmsg = insert_normal (cd, fields->f_24u8a4n_lo, 0, 0, 8, 6, 32, total_length, buffer);
578 if (errmsg)
579 break;
580 }
581 break;
582 case MEP_OPERAND_C5RMUIMM20 :
583 {
584 {
585 FLD (f_c5_rm) = ((unsigned int) (FLD (f_c5_rmuimm20)) >> (16));
586 FLD (f_c5_16u16) = ((FLD (f_c5_rmuimm20)) & (65535));
587 }
588 errmsg = insert_normal (cd, fields->f_c5_rm, 0, 0, 8, 4, 32, total_length, buffer);
589 if (errmsg)
590 break;
591 errmsg = insert_normal (cd, fields->f_c5_16u16, 0, 0, 16, 16, 32, total_length, buffer);
592 if (errmsg)
593 break;
594 }
595 break;
596 case MEP_OPERAND_C5RNMUIMM24 :
597 {
598 {
599 FLD (f_c5_rnm) = ((unsigned int) (FLD (f_c5_rnmuimm24)) >> (16));
600 FLD (f_c5_16u16) = ((FLD (f_c5_rnmuimm24)) & (65535));
601 }
602 errmsg = insert_normal (cd, fields->f_c5_rnm, 0, 0, 4, 8, 32, total_length, buffer);
603 if (errmsg)
604 break;
605 errmsg = insert_normal (cd, fields->f_c5_16u16, 0, 0, 16, 16, 32, total_length, buffer);
606 if (errmsg)
607 break;
608 }
609 break;
610 case MEP_OPERAND_CALLNUM :
611 {
612 {
613 FLD (f_5) = ((((unsigned int) (FLD (f_callnum)) >> (3))) & (1));
614 FLD (f_6) = ((((unsigned int) (FLD (f_callnum)) >> (2))) & (1));
615 FLD (f_7) = ((((unsigned int) (FLD (f_callnum)) >> (1))) & (1));
616 FLD (f_11) = ((FLD (f_callnum)) & (1));
617 }
618 errmsg = insert_normal (cd, fields->f_5, 0, 0, 5, 1, 32, total_length, buffer);
619 if (errmsg)
620 break;
621 errmsg = insert_normal (cd, fields->f_6, 0, 0, 6, 1, 32, total_length, buffer);
622 if (errmsg)
623 break;
624 errmsg = insert_normal (cd, fields->f_7, 0, 0, 7, 1, 32, total_length, buffer);
625 if (errmsg)
626 break;
627 errmsg = insert_normal (cd, fields->f_11, 0, 0, 11, 1, 32, total_length, buffer);
628 if (errmsg)
629 break;
630 }
631 break;
632 case MEP_OPERAND_CCCC :
633 errmsg = insert_normal (cd, fields->f_rm, 0, 0, 8, 4, 32, total_length, buffer);
634 break;
635 case MEP_OPERAND_CCRN :
636 {
637 {
638 FLD (f_ccrn_hi) = ((((unsigned int) (FLD (f_ccrn)) >> (4))) & (3));
639 FLD (f_ccrn_lo) = ((FLD (f_ccrn)) & (15));
640 }
641 errmsg = insert_normal (cd, fields->f_ccrn_hi, 0, 0, 28, 2, 32, total_length, buffer);
642 if (errmsg)
643 break;
644 errmsg = insert_normal (cd, fields->f_ccrn_lo, 0, 0, 4, 4, 32, total_length, buffer);
645 if (errmsg)
646 break;
647 }
648 break;
649 case MEP_OPERAND_CDISP10 :
650 {
651 long value = fields->f_cdisp10;
652 value = (((((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value))) & (512))) ? (((((((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value))) & (1023))) - (1024))) : (((((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value))) & (1023)));
653 errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED), 0, 22, 10, 32, total_length, buffer);
654 }
655 break;
656 case MEP_OPERAND_CDISP10A2 :
657 {
658 long value = fields->f_cdisp10;
659 value = (((((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value))) & (512))) ? (((((((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value))) & (1023))) - (1024))) : (((((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value))) & (1023)));
660 errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED), 0, 22, 10, 32, total_length, buffer);
661 }
662 break;
663 case MEP_OPERAND_CDISP10A4 :
664 {
665 long value = fields->f_cdisp10;
666 value = (((((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value))) & (512))) ? (((((((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value))) & (1023))) - (1024))) : (((((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value))) & (1023)));
667 errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED), 0, 22, 10, 32, total_length, buffer);
668 }
669 break;
670 case MEP_OPERAND_CDISP10A8 :
671 {
672 long value = fields->f_cdisp10;
673 value = (((((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value))) & (512))) ? (((((((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value))) & (1023))) - (1024))) : (((((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value))) & (1023)));
674 errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED), 0, 22, 10, 32, total_length, buffer);
675 }
676 break;
677 case MEP_OPERAND_CDISP12 :
678 errmsg = insert_normal (cd, fields->f_12s20, 0|(1<<CGEN_IFLD_SIGNED), 0, 20, 12, 32, total_length, buffer);
679 break;
680 case MEP_OPERAND_CIMM4 :
681 errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer);
682 break;
683 case MEP_OPERAND_CIMM5 :
684 errmsg = insert_normal (cd, fields->f_5u24, 0, 0, 24, 5, 32, total_length, buffer);
685 break;
686 case MEP_OPERAND_CODE16 :
687 errmsg = insert_normal (cd, fields->f_16u16, 0, 0, 16, 16, 32, total_length, buffer);
688 break;
689 case MEP_OPERAND_CODE24 :
690 {
691 {
692 FLD (f_24u4n_hi) = ((unsigned int) (FLD (f_24u4n)) >> (16));
693 FLD (f_24u4n_lo) = ((FLD (f_24u4n)) & (65535));
694 }
695 errmsg = insert_normal (cd, fields->f_24u4n_hi, 0, 0, 4, 8, 32, total_length, buffer);
696 if (errmsg)
697 break;
698 errmsg = insert_normal (cd, fields->f_24u4n_lo, 0, 0, 16, 16, 32, total_length, buffer);
699 if (errmsg)
700 break;
701 }
702 break;
703 case MEP_OPERAND_CP_FLAG :
704 break;
705 case MEP_OPERAND_CRN :
706 errmsg = insert_normal (cd, fields->f_crn, 0, 0, 4, 4, 32, total_length, buffer);
707 break;
708 case MEP_OPERAND_CRN64 :
709 errmsg = insert_normal (cd, fields->f_crn, 0, 0, 4, 4, 32, total_length, buffer);
710 break;
711 case MEP_OPERAND_CRNX :
712 {
713 {
714 FLD (f_crnx_lo) = ((FLD (f_crnx)) & (15));
715 FLD (f_crnx_hi) = ((unsigned int) (FLD (f_crnx)) >> (4));
716 }
717 errmsg = insert_normal (cd, fields->f_crnx_hi, 0, 0, 28, 1, 32, total_length, buffer);
718 if (errmsg)
719 break;
720 errmsg = insert_normal (cd, fields->f_crnx_lo, 0, 0, 4, 4, 32, total_length, buffer);
721 if (errmsg)
722 break;
723 }
724 break;
725 case MEP_OPERAND_CRNX64 :
726 {
727 {
728 FLD (f_crnx_lo) = ((FLD (f_crnx)) & (15));
729 FLD (f_crnx_hi) = ((unsigned int) (FLD (f_crnx)) >> (4));
730 }
731 errmsg = insert_normal (cd, fields->f_crnx_hi, 0, 0, 28, 1, 32, total_length, buffer);
732 if (errmsg)
733 break;
734 errmsg = insert_normal (cd, fields->f_crnx_lo, 0, 0, 4, 4, 32, total_length, buffer);
735 if (errmsg)
736 break;
737 }
738 break;
739 case MEP_OPERAND_CROC :
740 errmsg = insert_normal (cd, fields->f_ivc2_5u7, 0, 0, 7, 5, 32, total_length, buffer);
741 break;
742 case MEP_OPERAND_CROP :
743 errmsg = insert_normal (cd, fields->f_ivc2_5u23, 0, 0, 23, 5, 32, total_length, buffer);
744 break;
745 case MEP_OPERAND_CRPC :
746 errmsg = insert_normal (cd, fields->f_ivc2_5u26, 0, 0, 26, 5, 32, total_length, buffer);
747 break;
748 case MEP_OPERAND_CRPP :
749 errmsg = insert_normal (cd, fields->f_ivc2_5u18, 0, 0, 18, 5, 32, total_length, buffer);
750 break;
751 case MEP_OPERAND_CRQC :
752 errmsg = insert_normal (cd, fields->f_ivc2_5u21, 0, 0, 21, 5, 32, total_length, buffer);
753 break;
754 case MEP_OPERAND_CRQP :
755 errmsg = insert_normal (cd, fields->f_ivc2_5u13, 0, 0, 13, 5, 32, total_length, buffer);
756 break;
757 case MEP_OPERAND_CSRN :
758 {
759 {
760 FLD (f_csrn_lo) = ((FLD (f_csrn)) & (15));
761 FLD (f_csrn_hi) = ((unsigned int) (FLD (f_csrn)) >> (4));
762 }
763 errmsg = insert_normal (cd, fields->f_csrn_hi, 0, 0, 15, 1, 32, total_length, buffer);
764 if (errmsg)
765 break;
766 errmsg = insert_normal (cd, fields->f_csrn_lo, 0, 0, 8, 4, 32, total_length, buffer);
767 if (errmsg)
768 break;
769 }
770 break;
771 case MEP_OPERAND_CSRN_IDX :
772 {
773 {
774 FLD (f_csrn_lo) = ((FLD (f_csrn)) & (15));
775 FLD (f_csrn_hi) = ((unsigned int) (FLD (f_csrn)) >> (4));
776 }
777 errmsg = insert_normal (cd, fields->f_csrn_hi, 0, 0, 15, 1, 32, total_length, buffer);
778 if (errmsg)
779 break;
780 errmsg = insert_normal (cd, fields->f_csrn_lo, 0, 0, 8, 4, 32, total_length, buffer);
781 if (errmsg)
782 break;
783 }
784 break;
785 case MEP_OPERAND_DBG :
786 break;
787 case MEP_OPERAND_DEPC :
788 break;
789 case MEP_OPERAND_EPC :
790 break;
791 case MEP_OPERAND_EXC :
792 break;
793 case MEP_OPERAND_HI :
794 break;
795 case MEP_OPERAND_IMM16P0 :
796 {
797 {
798 FLD (f_ivc2_8u0) = ((((unsigned int) (FLD (f_ivc2_imm16p0)) >> (8))) & (255));
799 FLD (f_ivc2_8u20) = ((FLD (f_ivc2_imm16p0)) & (255));
800 }
801 errmsg = insert_normal (cd, fields->f_ivc2_8u0, 0, 0, 0, 8, 32, total_length, buffer);
802 if (errmsg)
803 break;
804 errmsg = insert_normal (cd, fields->f_ivc2_8u20, 0, 0, 20, 8, 32, total_length, buffer);
805 if (errmsg)
806 break;
807 }
808 break;
809 case MEP_OPERAND_IMM3P12 :
810 errmsg = insert_normal (cd, fields->f_ivc2_3u12, 0, 0, 12, 3, 32, total_length, buffer);
811 break;
812 case MEP_OPERAND_IMM3P25 :
813 errmsg = insert_normal (cd, fields->f_ivc2_3u25, 0, 0, 25, 3, 32, total_length, buffer);
814 break;
815 case MEP_OPERAND_IMM3P4 :
816 errmsg = insert_normal (cd, fields->f_ivc2_3u4, 0, 0, 4, 3, 32, total_length, buffer);
817 break;
818 case MEP_OPERAND_IMM3P5 :
819 errmsg = insert_normal (cd, fields->f_ivc2_3u5, 0, 0, 5, 3, 32, total_length, buffer);
820 break;
821 case MEP_OPERAND_IMM3P9 :
822 errmsg = insert_normal (cd, fields->f_ivc2_3u9, 0, 0, 9, 3, 32, total_length, buffer);
823 break;
824 case MEP_OPERAND_IMM4P10 :
825 errmsg = insert_normal (cd, fields->f_ivc2_4u10, 0, 0, 10, 4, 32, total_length, buffer);
826 break;
827 case MEP_OPERAND_IMM4P4 :
828 errmsg = insert_normal (cd, fields->f_ivc2_4u4, 0, 0, 4, 4, 32, total_length, buffer);
829 break;
830 case MEP_OPERAND_IMM4P8 :
831 errmsg = insert_normal (cd, fields->f_ivc2_4u8, 0, 0, 8, 4, 32, total_length, buffer);
832 break;
833 case MEP_OPERAND_IMM5P23 :
834 errmsg = insert_normal (cd, fields->f_ivc2_5u23, 0, 0, 23, 5, 32, total_length, buffer);
835 break;
836 case MEP_OPERAND_IMM5P3 :
837 errmsg = insert_normal (cd, fields->f_ivc2_5u3, 0, 0, 3, 5, 32, total_length, buffer);
838 break;
839 case MEP_OPERAND_IMM5P7 :
840 errmsg = insert_normal (cd, fields->f_ivc2_5u7, 0, 0, 7, 5, 32, total_length, buffer);
841 break;
842 case MEP_OPERAND_IMM5P8 :
843 errmsg = insert_normal (cd, fields->f_ivc2_5u8, 0, 0, 8, 5, 32, total_length, buffer);
844 break;
845 case MEP_OPERAND_IMM6P2 :
846 errmsg = insert_normal (cd, fields->f_ivc2_6u2, 0, 0, 2, 6, 32, total_length, buffer);
847 break;
848 case MEP_OPERAND_IMM6P6 :
849 errmsg = insert_normal (cd, fields->f_ivc2_6u6, 0, 0, 6, 6, 32, total_length, buffer);
850 break;
851 case MEP_OPERAND_IMM8P0 :
852 errmsg = insert_normal (cd, fields->f_ivc2_8u0, 0, 0, 0, 8, 32, total_length, buffer);
853 break;
854 case MEP_OPERAND_IMM8P20 :
855 errmsg = insert_normal (cd, fields->f_ivc2_8u20, 0, 0, 20, 8, 32, total_length, buffer);
856 break;
857 case MEP_OPERAND_IMM8P4 :
858 errmsg = insert_normal (cd, fields->f_ivc2_8u4, 0, 0, 4, 8, 32, total_length, buffer);
859 break;
860 case MEP_OPERAND_IVC_X_0_2 :
861 errmsg = insert_normal (cd, fields->f_ivc2_2u0, 0, 0, 0, 2, 32, total_length, buffer);
862 break;
863 case MEP_OPERAND_IVC_X_0_3 :
864 errmsg = insert_normal (cd, fields->f_ivc2_3u0, 0, 0, 0, 3, 32, total_length, buffer);
865 break;
866 case MEP_OPERAND_IVC_X_0_4 :
867 errmsg = insert_normal (cd, fields->f_ivc2_4u0, 0, 0, 0, 4, 32, total_length, buffer);
868 break;
869 case MEP_OPERAND_IVC_X_0_5 :
870 errmsg = insert_normal (cd, fields->f_ivc2_5u0, 0, 0, 0, 5, 32, total_length, buffer);
871 break;
872 case MEP_OPERAND_IVC_X_6_1 :
873 errmsg = insert_normal (cd, fields->f_ivc2_1u6, 0, 0, 6, 1, 32, total_length, buffer);
874 break;
875 case MEP_OPERAND_IVC_X_6_2 :
876 errmsg = insert_normal (cd, fields->f_ivc2_2u6, 0, 0, 6, 2, 32, total_length, buffer);
877 break;
878 case MEP_OPERAND_IVC_X_6_3 :
879 errmsg = insert_normal (cd, fields->f_ivc2_3u6, 0, 0, 6, 3, 32, total_length, buffer);
880 break;
881 case MEP_OPERAND_IVC2C3CCRN :
882 {
883 {
884 FLD (f_ccrn_hi) = ((((unsigned int) (FLD (f_ccrn)) >> (4))) & (3));
885 FLD (f_ccrn_lo) = ((FLD (f_ccrn)) & (15));
886 }
887 errmsg = insert_normal (cd, fields->f_ccrn_hi, 0, 0, 28, 2, 32, total_length, buffer);
888 if (errmsg)
889 break;
890 errmsg = insert_normal (cd, fields->f_ccrn_lo, 0, 0, 4, 4, 32, total_length, buffer);
891 if (errmsg)
892 break;
893 }
894 break;
895 case MEP_OPERAND_IVC2CCRN :
896 {
897 {
898 FLD (f_ivc2_ccrn_h2) = ((((unsigned int) (FLD (f_ivc2_ccrn)) >> (4))) & (3));
899 FLD (f_ivc2_ccrn_lo) = ((FLD (f_ivc2_ccrn)) & (15));
900 }
901 errmsg = insert_normal (cd, fields->f_ivc2_ccrn_h2, 0, 0, 20, 2, 32, total_length, buffer);
902 if (errmsg)
903 break;
904 errmsg = insert_normal (cd, fields->f_ivc2_ccrn_lo, 0, 0, 0, 4, 32, total_length, buffer);
905 if (errmsg)
906 break;
907 }
908 break;
909 case MEP_OPERAND_IVC2CRN :
910 {
911 {
912 FLD (f_ivc2_ccrn_h1) = ((((unsigned int) (FLD (f_ivc2_crnx)) >> (4))) & (1));
913 FLD (f_ivc2_ccrn_lo) = ((FLD (f_ivc2_crnx)) & (15));
914 }
915 errmsg = insert_normal (cd, fields->f_ivc2_ccrn_h1, 0, 0, 20, 1, 32, total_length, buffer);
916 if (errmsg)
917 break;
918 errmsg = insert_normal (cd, fields->f_ivc2_ccrn_lo, 0, 0, 0, 4, 32, total_length, buffer);
919 if (errmsg)
920 break;
921 }
922 break;
923 case MEP_OPERAND_IVC2RM :
924 errmsg = insert_normal (cd, fields->f_ivc2_crm, 0, 0, 4, 4, 32, total_length, buffer);
925 break;
926 case MEP_OPERAND_LO :
927 break;
928 case MEP_OPERAND_LP :
929 break;
930 case MEP_OPERAND_MB0 :
931 break;
932 case MEP_OPERAND_MB1 :
933 break;
934 case MEP_OPERAND_ME0 :
935 break;
936 case MEP_OPERAND_ME1 :
937 break;
938 case MEP_OPERAND_NPC :
939 break;
940 case MEP_OPERAND_OPT :
941 break;
942 case MEP_OPERAND_PCABS24A2 :
943 {
944 {
945 FLD (f_24u5a2n_lo) = ((unsigned int) (((FLD (f_24u5a2n)) & (255))) >> (1));
946 FLD (f_24u5a2n_hi) = ((unsigned int) (FLD (f_24u5a2n)) >> (8));
947 }
948 errmsg = insert_normal (cd, fields->f_24u5a2n_hi, 0, 0, 16, 16, 32, total_length, buffer);
949 if (errmsg)
950 break;
951 errmsg = insert_normal (cd, fields->f_24u5a2n_lo, 0, 0, 5, 7, 32, total_length, buffer);
952 if (errmsg)
953 break;
954 }
955 break;
956 case MEP_OPERAND_PCREL12A2 :
957 {
958 long value = fields->f_12s4a2;
959 value = ((int) (((value) - (pc))) >> (1));
960 errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 4, 11, 32, total_length, buffer);
961 }
962 break;
963 case MEP_OPERAND_PCREL17A2 :
964 {
965 long value = fields->f_17s16a2;
966 value = ((int) (((value) - (pc))) >> (1));
967 errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 16, 16, 32, total_length, buffer);
968 }
969 break;
970 case MEP_OPERAND_PCREL24A2 :
971 {
972 {
973 FLD (f_24s5a2n) = ((FLD (f_24s5a2n)) - (pc));
974 FLD (f_24s5a2n_lo) = ((unsigned int) (((FLD (f_24s5a2n)) & (254))) >> (1));
975 FLD (f_24s5a2n_hi) = ((int) (FLD (f_24s5a2n)) >> (8));
976 }
977 errmsg = insert_normal (cd, fields->f_24s5a2n_hi, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 16, 16, 32, total_length, buffer);
978 if (errmsg)
979 break;
980 errmsg = insert_normal (cd, fields->f_24s5a2n_lo, 0|(1<<CGEN_IFLD_PCREL_ADDR), 0, 5, 7, 32, total_length, buffer);
981 if (errmsg)
982 break;
983 }
984 break;
985 case MEP_OPERAND_PCREL8A2 :
986 {
987 long value = fields->f_8s8a2;
988 value = ((int) (((value) - (pc))) >> (1));
989 errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 8, 7, 32, total_length, buffer);
990 }
991 break;
992 case MEP_OPERAND_PSW :
993 break;
994 case MEP_OPERAND_R0 :
995 break;
996 case MEP_OPERAND_R1 :
997 break;
998 case MEP_OPERAND_RL :
999 errmsg = insert_normal (cd, fields->f_rl, 0, 0, 12, 4, 32, total_length, buffer);
1000 break;
1001 case MEP_OPERAND_RL5 :
1002 errmsg = insert_normal (cd, fields->f_rl5, 0, 0, 20, 4, 32, total_length, buffer);
1003 break;
1004 case MEP_OPERAND_RM :
1005 errmsg = insert_normal (cd, fields->f_rm, 0, 0, 8, 4, 32, total_length, buffer);
1006 break;
1007 case MEP_OPERAND_RMA :
1008 errmsg = insert_normal (cd, fields->f_rm, 0, 0, 8, 4, 32, total_length, buffer);
1009 break;
1010 case MEP_OPERAND_RN :
1011 errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer);
1012 break;
1013 case MEP_OPERAND_RN3 :
1014 errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer);
1015 break;
1016 case MEP_OPERAND_RN3C :
1017 errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer);
1018 break;
1019 case MEP_OPERAND_RN3L :
1020 errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer);
1021 break;
1022 case MEP_OPERAND_RN3S :
1023 errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer);
1024 break;
1025 case MEP_OPERAND_RN3UC :
1026 errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer);
1027 break;
1028 case MEP_OPERAND_RN3UL :
1029 errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer);
1030 break;
1031 case MEP_OPERAND_RN3US :
1032 errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer);
1033 break;
1034 case MEP_OPERAND_RNC :
1035 errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer);
1036 break;
1037 case MEP_OPERAND_RNL :
1038 errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer);
1039 break;
1040 case MEP_OPERAND_RNS :
1041 errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer);
1042 break;
1043 case MEP_OPERAND_RNUC :
1044 errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer);
1045 break;
1046 case MEP_OPERAND_RNUL :
1047 errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer);
1048 break;
1049 case MEP_OPERAND_RNUS :
1050 errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer);
1051 break;
1052 case MEP_OPERAND_SAR :
1053 break;
1054 case MEP_OPERAND_SDISP16 :
1055 errmsg = insert_normal (cd, fields->f_16s16, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 16, 32, total_length, buffer);
1056 break;
1057 case MEP_OPERAND_SIMM16 :
1058 errmsg = insert_normal (cd, fields->f_16s16, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 16, 32, total_length, buffer);
1059 break;
1060 case MEP_OPERAND_SIMM16P0 :
1061 {
1062 {
1063 FLD (f_ivc2_8u0) = ((((unsigned int) (FLD (f_ivc2_simm16p0)) >> (8))) & (255));
1064 FLD (f_ivc2_8u20) = ((FLD (f_ivc2_simm16p0)) & (255));
1065 }
1066 errmsg = insert_normal (cd, fields->f_ivc2_8u0, 0, 0, 0, 8, 32, total_length, buffer);
1067 if (errmsg)
1068 break;
1069 errmsg = insert_normal (cd, fields->f_ivc2_8u20, 0, 0, 20, 8, 32, total_length, buffer);
1070 if (errmsg)
1071 break;
1072 }
1073 break;
1074 case MEP_OPERAND_SIMM6 :
1075 errmsg = insert_normal (cd, fields->f_6s8, 0|(1<<CGEN_IFLD_SIGNED), 0, 8, 6, 32, total_length, buffer);
1076 break;
1077 case MEP_OPERAND_SIMM8 :
1078 errmsg = insert_normal (cd, fields->f_8s8, 0|(1<<CGEN_IFLD_SIGNED), 0, 8, 8, 32, total_length, buffer);
1079 break;
1080 case MEP_OPERAND_SIMM8P0 :
1081 errmsg = insert_normal (cd, fields->f_ivc2_8s0, 0|(1<<CGEN_IFLD_SIGNED), 0, 0, 8, 32, total_length, buffer);
1082 break;
1083 case MEP_OPERAND_SIMM8P20 :
1084 errmsg = insert_normal (cd, fields->f_ivc2_8s20, 0|(1<<CGEN_IFLD_SIGNED), 0, 20, 8, 32, total_length, buffer);
1085 break;
1086 case MEP_OPERAND_SIMM8P4 :
1087 errmsg = insert_normal (cd, fields->f_ivc2_8s4, 0|(1<<CGEN_IFLD_SIGNED), 0, 4, 8, 32, total_length, buffer);
1088 break;
1089 case MEP_OPERAND_SP :
1090 break;
1091 case MEP_OPERAND_SPR :
1092 break;
1093 case MEP_OPERAND_TP :
1094 break;
1095 case MEP_OPERAND_TPR :
1096 break;
1097 case MEP_OPERAND_UDISP2 :
1098 errmsg = insert_normal (cd, fields->f_2u6, 0, 0, 6, 2, 32, total_length, buffer);
1099 break;
1100 case MEP_OPERAND_UDISP7 :
1101 errmsg = insert_normal (cd, fields->f_7u9, 0, 0, 9, 7, 32, total_length, buffer);
1102 break;
1103 case MEP_OPERAND_UDISP7A2 :
1104 {
1105 long value = fields->f_7u9a2;
1106 value = ((unsigned int) (value) >> (1));
1107 errmsg = insert_normal (cd, value, 0, 0, 9, 6, 32, total_length, buffer);
1108 }
1109 break;
1110 case MEP_OPERAND_UDISP7A4 :
1111 {
1112 long value = fields->f_7u9a4;
1113 value = ((unsigned int) (value) >> (2));
1114 errmsg = insert_normal (cd, value, 0, 0, 9, 5, 32, total_length, buffer);
1115 }
1116 break;
1117 case MEP_OPERAND_UIMM16 :
1118 errmsg = insert_normal (cd, fields->f_16u16, 0, 0, 16, 16, 32, total_length, buffer);
1119 break;
1120 case MEP_OPERAND_UIMM2 :
1121 errmsg = insert_normal (cd, fields->f_2u10, 0, 0, 10, 2, 32, total_length, buffer);
1122 break;
1123 case MEP_OPERAND_UIMM24 :
1124 {
1125 {
1126 FLD (f_24u8n_hi) = ((unsigned int) (FLD (f_24u8n)) >> (8));
1127 FLD (f_24u8n_lo) = ((FLD (f_24u8n)) & (255));
1128 }
1129 errmsg = insert_normal (cd, fields->f_24u8n_hi, 0, 0, 16, 16, 32, total_length, buffer);
1130 if (errmsg)
1131 break;
1132 errmsg = insert_normal (cd, fields->f_24u8n_lo, 0, 0, 8, 8, 32, total_length, buffer);
1133 if (errmsg)
1134 break;
1135 }
1136 break;
1137 case MEP_OPERAND_UIMM3 :
1138 errmsg = insert_normal (cd, fields->f_3u5, 0, 0, 5, 3, 32, total_length, buffer);
1139 break;
1140 case MEP_OPERAND_UIMM4 :
1141 errmsg = insert_normal (cd, fields->f_4u8, 0, 0, 8, 4, 32, total_length, buffer);
1142 break;
1143 case MEP_OPERAND_UIMM5 :
1144 errmsg = insert_normal (cd, fields->f_5u8, 0, 0, 8, 5, 32, total_length, buffer);
1145 break;
1146 case MEP_OPERAND_UIMM7A4 :
1147 {
1148 long value = fields->f_7u9a4;
1149 value = ((unsigned int) (value) >> (2));
1150 errmsg = insert_normal (cd, value, 0, 0, 9, 5, 32, total_length, buffer);
1151 }
1152 break;
1153 case MEP_OPERAND_ZERO :
1154 break;
1155
1156 default :
1157 /* xgettext:c-format */
1158 fprintf (stderr, _("Unrecognized field %d while building insn.\n"),
1159 opindex);
1160 abort ();
1161 }
1162
1163 return errmsg;
1164 }
1165
1166 int mep_cgen_extract_operand
1167 (CGEN_CPU_DESC, int, CGEN_EXTRACT_INFO *, CGEN_INSN_INT, CGEN_FIELDS *, bfd_vma);
1168
1169 /* Main entry point for operand extraction.
1170 The result is <= 0 for error, >0 for success.
1171 ??? Actual values aren't well defined right now.
1172
1173 This function is basically just a big switch statement. Earlier versions
1174 used tables to look up the function to use, but
1175 - if the table contains both assembler and disassembler functions then
1176 the disassembler contains much of the assembler and vice-versa,
1177 - there's a lot of inlining possibilities as things grow,
1178 - using a switch statement avoids the function call overhead.
1179
1180 This function could be moved into `print_insn_normal', but keeping it
1181 separate makes clear the interface between `print_insn_normal' and each of
1182 the handlers. */
1183
1184 int
1185 mep_cgen_extract_operand (CGEN_CPU_DESC cd,
1186 int opindex,
1187 CGEN_EXTRACT_INFO *ex_info,
1188 CGEN_INSN_INT insn_value,
1189 CGEN_FIELDS * fields,
1190 bfd_vma pc)
1191 {
1192 /* Assume success (for those operands that are nops). */
1193 int length = 1;
1194 unsigned int total_length = CGEN_FIELDS_BITSIZE (fields);
1195
1196 switch (opindex)
1197 {
1198 case MEP_OPERAND_ADDR24A4 :
1199 {
1200 length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_24u8a4n_hi);
1201 if (length <= 0) break;
1202 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 6, 32, total_length, pc, & fields->f_24u8a4n_lo);
1203 if (length <= 0) break;
1204 FLD (f_24u8a4n) = ((((FLD (f_24u8a4n_hi)) << (8))) | (((FLD (f_24u8a4n_lo)) << (2))));
1205 }
1206 break;
1207 case MEP_OPERAND_C5RMUIMM20 :
1208 {
1209 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_c5_rm);
1210 if (length <= 0) break;
1211 length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_c5_16u16);
1212 if (length <= 0) break;
1213 {
1214 FLD (f_c5_rmuimm20) = ((FLD (f_c5_16u16)) | (((FLD (f_c5_rm)) << (16))));
1215 }
1216 }
1217 break;
1218 case MEP_OPERAND_C5RNMUIMM24 :
1219 {
1220 length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 8, 32, total_length, pc, & fields->f_c5_rnm);
1221 if (length <= 0) break;
1222 length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_c5_16u16);
1223 if (length <= 0) break;
1224 {
1225 FLD (f_c5_rnmuimm24) = ((FLD (f_c5_16u16)) | (((FLD (f_c5_rnm)) << (16))));
1226 }
1227 }
1228 break;
1229 case MEP_OPERAND_CALLNUM :
1230 {
1231 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 1, 32, total_length, pc, & fields->f_5);
1232 if (length <= 0) break;
1233 length = extract_normal (cd, ex_info, insn_value, 0, 0, 6, 1, 32, total_length, pc, & fields->f_6);
1234 if (length <= 0) break;
1235 length = extract_normal (cd, ex_info, insn_value, 0, 0, 7, 1, 32, total_length, pc, & fields->f_7);
1236 if (length <= 0) break;
1237 length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 1, 32, total_length, pc, & fields->f_11);
1238 if (length <= 0) break;
1239 FLD (f_callnum) = ((((FLD (f_5)) << (3))) | (((((FLD (f_6)) << (2))) | (((((FLD (f_7)) << (1))) | (FLD (f_11)))))));
1240 }
1241 break;
1242 case MEP_OPERAND_CCCC :
1243 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_rm);
1244 break;
1245 case MEP_OPERAND_CCRN :
1246 {
1247 length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 2, 32, total_length, pc, & fields->f_ccrn_hi);
1248 if (length <= 0) break;
1249 length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_ccrn_lo);
1250 if (length <= 0) break;
1251 FLD (f_ccrn) = ((((FLD (f_ccrn_hi)) << (4))) | (FLD (f_ccrn_lo)));
1252 }
1253 break;
1254 case MEP_OPERAND_CDISP10 :
1255 {
1256 long value;
1257 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 22, 10, 32, total_length, pc, & value);
1258 value = (((((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value))) & (512))) ? (((((((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value))) & (1023))) - (1024))) : (((((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value))) & (1023)));
1259 fields->f_cdisp10 = value;
1260 }
1261 break;
1262 case MEP_OPERAND_CDISP10A2 :
1263 {
1264 long value;
1265 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 22, 10, 32, total_length, pc, & value);
1266 value = (((((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value))) & (512))) ? (((((((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value))) & (1023))) - (1024))) : (((((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value))) & (1023)));
1267 fields->f_cdisp10 = value;
1268 }
1269 break;
1270 case MEP_OPERAND_CDISP10A4 :
1271 {
1272 long value;
1273 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 22, 10, 32, total_length, pc, & value);
1274 value = (((((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value))) & (512))) ? (((((((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value))) & (1023))) - (1024))) : (((((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value))) & (1023)));
1275 fields->f_cdisp10 = value;
1276 }
1277 break;
1278 case MEP_OPERAND_CDISP10A8 :
1279 {
1280 long value;
1281 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 22, 10, 32, total_length, pc, & value);
1282 value = (((((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value))) & (512))) ? (((((((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value))) & (1023))) - (1024))) : (((((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value))) & (1023)));
1283 fields->f_cdisp10 = value;
1284 }
1285 break;
1286 case MEP_OPERAND_CDISP12 :
1287 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 20, 12, 32, total_length, pc, & fields->f_12s20);
1288 break;
1289 case MEP_OPERAND_CIMM4 :
1290 length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn);
1291 break;
1292 case MEP_OPERAND_CIMM5 :
1293 length = extract_normal (cd, ex_info, insn_value, 0, 0, 24, 5, 32, total_length, pc, & fields->f_5u24);
1294 break;
1295 case MEP_OPERAND_CODE16 :
1296 length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_16u16);
1297 break;
1298 case MEP_OPERAND_CODE24 :
1299 {
1300 length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 8, 32, total_length, pc, & fields->f_24u4n_hi);
1301 if (length <= 0) break;
1302 length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_24u4n_lo);
1303 if (length <= 0) break;
1304 FLD (f_24u4n) = ((((FLD (f_24u4n_hi)) << (16))) | (FLD (f_24u4n_lo)));
1305 }
1306 break;
1307 case MEP_OPERAND_CP_FLAG :
1308 break;
1309 case MEP_OPERAND_CRN :
1310 length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_crn);
1311 break;
1312 case MEP_OPERAND_CRN64 :
1313 length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_crn);
1314 break;
1315 case MEP_OPERAND_CRNX :
1316 {
1317 length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 1, 32, total_length, pc, & fields->f_crnx_hi);
1318 if (length <= 0) break;
1319 length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_crnx_lo);
1320 if (length <= 0) break;
1321 FLD (f_crnx) = ((((FLD (f_crnx_hi)) << (4))) | (FLD (f_crnx_lo)));
1322 }
1323 break;
1324 case MEP_OPERAND_CRNX64 :
1325 {
1326 length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 1, 32, total_length, pc, & fields->f_crnx_hi);
1327 if (length <= 0) break;
1328 length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_crnx_lo);
1329 if (length <= 0) break;
1330 FLD (f_crnx) = ((((FLD (f_crnx_hi)) << (4))) | (FLD (f_crnx_lo)));
1331 }
1332 break;
1333 case MEP_OPERAND_CROC :
1334 length = extract_normal (cd, ex_info, insn_value, 0, 0, 7, 5, 32, total_length, pc, & fields->f_ivc2_5u7);
1335 break;
1336 case MEP_OPERAND_CROP :
1337 length = extract_normal (cd, ex_info, insn_value, 0, 0, 23, 5, 32, total_length, pc, & fields->f_ivc2_5u23);
1338 break;
1339 case MEP_OPERAND_CRPC :
1340 length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 5, 32, total_length, pc, & fields->f_ivc2_5u26);
1341 break;
1342 case MEP_OPERAND_CRPP :
1343 length = extract_normal (cd, ex_info, insn_value, 0, 0, 18, 5, 32, total_length, pc, & fields->f_ivc2_5u18);
1344 break;
1345 case MEP_OPERAND_CRQC :
1346 length = extract_normal (cd, ex_info, insn_value, 0, 0, 21, 5, 32, total_length, pc, & fields->f_ivc2_5u21);
1347 break;
1348 case MEP_OPERAND_CRQP :
1349 length = extract_normal (cd, ex_info, insn_value, 0, 0, 13, 5, 32, total_length, pc, & fields->f_ivc2_5u13);
1350 break;
1351 case MEP_OPERAND_CSRN :
1352 {
1353 length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 1, 32, total_length, pc, & fields->f_csrn_hi);
1354 if (length <= 0) break;
1355 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_csrn_lo);
1356 if (length <= 0) break;
1357 FLD (f_csrn) = ((((FLD (f_csrn_hi)) << (4))) | (FLD (f_csrn_lo)));
1358 }
1359 break;
1360 case MEP_OPERAND_CSRN_IDX :
1361 {
1362 length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 1, 32, total_length, pc, & fields->f_csrn_hi);
1363 if (length <= 0) break;
1364 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_csrn_lo);
1365 if (length <= 0) break;
1366 FLD (f_csrn) = ((((FLD (f_csrn_hi)) << (4))) | (FLD (f_csrn_lo)));
1367 }
1368 break;
1369 case MEP_OPERAND_DBG :
1370 break;
1371 case MEP_OPERAND_DEPC :
1372 break;
1373 case MEP_OPERAND_EPC :
1374 break;
1375 case MEP_OPERAND_EXC :
1376 break;
1377 case MEP_OPERAND_HI :
1378 break;
1379 case MEP_OPERAND_IMM16P0 :
1380 {
1381 length = extract_normal (cd, ex_info, insn_value, 0, 0, 0, 8, 32, total_length, pc, & fields->f_ivc2_8u0);
1382 if (length <= 0) break;
1383 length = extract_normal (cd, ex_info, insn_value, 0, 0, 20, 8, 32, total_length, pc, & fields->f_ivc2_8u20);
1384 if (length <= 0) break;
1385 {
1386 FLD (f_ivc2_imm16p0) = ((FLD (f_ivc2_8u20)) | (((FLD (f_ivc2_8u0)) << (8))));
1387 }
1388 }
1389 break;
1390 case MEP_OPERAND_IMM3P12 :
1391 length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 3, 32, total_length, pc, & fields->f_ivc2_3u12);
1392 break;
1393 case MEP_OPERAND_IMM3P25 :
1394 length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 3, 32, total_length, pc, & fields->f_ivc2_3u25);
1395 break;
1396 case MEP_OPERAND_IMM3P4 :
1397 length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 3, 32, total_length, pc, & fields->f_ivc2_3u4);
1398 break;
1399 case MEP_OPERAND_IMM3P5 :
1400 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_ivc2_3u5);
1401 break;
1402 case MEP_OPERAND_IMM3P9 :
1403 length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 3, 32, total_length, pc, & fields->f_ivc2_3u9);
1404 break;
1405 case MEP_OPERAND_IMM4P10 :
1406 length = extract_normal (cd, ex_info, insn_value, 0, 0, 10, 4, 32, total_length, pc, & fields->f_ivc2_4u10);
1407 break;
1408 case MEP_OPERAND_IMM4P4 :
1409 length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_ivc2_4u4);
1410 break;
1411 case MEP_OPERAND_IMM4P8 :
1412 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_ivc2_4u8);
1413 break;
1414 case MEP_OPERAND_IMM5P23 :
1415 length = extract_normal (cd, ex_info, insn_value, 0, 0, 23, 5, 32, total_length, pc, & fields->f_ivc2_5u23);
1416 break;
1417 case MEP_OPERAND_IMM5P3 :
1418 length = extract_normal (cd, ex_info, insn_value, 0, 0, 3, 5, 32, total_length, pc, & fields->f_ivc2_5u3);
1419 break;
1420 case MEP_OPERAND_IMM5P7 :
1421 length = extract_normal (cd, ex_info, insn_value, 0, 0, 7, 5, 32, total_length, pc, & fields->f_ivc2_5u7);
1422 break;
1423 case MEP_OPERAND_IMM5P8 :
1424 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 5, 32, total_length, pc, & fields->f_ivc2_5u8);
1425 break;
1426 case MEP_OPERAND_IMM6P2 :
1427 length = extract_normal (cd, ex_info, insn_value, 0, 0, 2, 6, 32, total_length, pc, & fields->f_ivc2_6u2);
1428 break;
1429 case MEP_OPERAND_IMM6P6 :
1430 length = extract_normal (cd, ex_info, insn_value, 0, 0, 6, 6, 32, total_length, pc, & fields->f_ivc2_6u6);
1431 break;
1432 case MEP_OPERAND_IMM8P0 :
1433 length = extract_normal (cd, ex_info, insn_value, 0, 0, 0, 8, 32, total_length, pc, & fields->f_ivc2_8u0);
1434 break;
1435 case MEP_OPERAND_IMM8P20 :
1436 length = extract_normal (cd, ex_info, insn_value, 0, 0, 20, 8, 32, total_length, pc, & fields->f_ivc2_8u20);
1437 break;
1438 case MEP_OPERAND_IMM8P4 :
1439 length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 8, 32, total_length, pc, & fields->f_ivc2_8u4);
1440 break;
1441 case MEP_OPERAND_IVC_X_0_2 :
1442 length = extract_normal (cd, ex_info, insn_value, 0, 0, 0, 2, 32, total_length, pc, & fields->f_ivc2_2u0);
1443 break;
1444 case MEP_OPERAND_IVC_X_0_3 :
1445 length = extract_normal (cd, ex_info, insn_value, 0, 0, 0, 3, 32, total_length, pc, & fields->f_ivc2_3u0);
1446 break;
1447 case MEP_OPERAND_IVC_X_0_4 :
1448 length = extract_normal (cd, ex_info, insn_value, 0, 0, 0, 4, 32, total_length, pc, & fields->f_ivc2_4u0);
1449 break;
1450 case MEP_OPERAND_IVC_X_0_5 :
1451 length = extract_normal (cd, ex_info, insn_value, 0, 0, 0, 5, 32, total_length, pc, & fields->f_ivc2_5u0);
1452 break;
1453 case MEP_OPERAND_IVC_X_6_1 :
1454 length = extract_normal (cd, ex_info, insn_value, 0, 0, 6, 1, 32, total_length, pc, & fields->f_ivc2_1u6);
1455 break;
1456 case MEP_OPERAND_IVC_X_6_2 :
1457 length = extract_normal (cd, ex_info, insn_value, 0, 0, 6, 2, 32, total_length, pc, & fields->f_ivc2_2u6);
1458 break;
1459 case MEP_OPERAND_IVC_X_6_3 :
1460 length = extract_normal (cd, ex_info, insn_value, 0, 0, 6, 3, 32, total_length, pc, & fields->f_ivc2_3u6);
1461 break;
1462 case MEP_OPERAND_IVC2C3CCRN :
1463 {
1464 length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 2, 32, total_length, pc, & fields->f_ccrn_hi);
1465 if (length <= 0) break;
1466 length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_ccrn_lo);
1467 if (length <= 0) break;
1468 FLD (f_ccrn) = ((((FLD (f_ccrn_hi)) << (4))) | (FLD (f_ccrn_lo)));
1469 }
1470 break;
1471 case MEP_OPERAND_IVC2CCRN :
1472 {
1473 length = extract_normal (cd, ex_info, insn_value, 0, 0, 20, 2, 32, total_length, pc, & fields->f_ivc2_ccrn_h2);
1474 if (length <= 0) break;
1475 length = extract_normal (cd, ex_info, insn_value, 0, 0, 0, 4, 32, total_length, pc, & fields->f_ivc2_ccrn_lo);
1476 if (length <= 0) break;
1477 FLD (f_ivc2_ccrn) = ((((FLD (f_ivc2_ccrn_h2)) << (4))) | (FLD (f_ivc2_ccrn_lo)));
1478 }
1479 break;
1480 case MEP_OPERAND_IVC2CRN :
1481 {
1482 length = extract_normal (cd, ex_info, insn_value, 0, 0, 20, 1, 32, total_length, pc, & fields->f_ivc2_ccrn_h1);
1483 if (length <= 0) break;
1484 length = extract_normal (cd, ex_info, insn_value, 0, 0, 0, 4, 32, total_length, pc, & fields->f_ivc2_ccrn_lo);
1485 if (length <= 0) break;
1486 FLD (f_ivc2_crnx) = ((((FLD (f_ivc2_ccrn_h1)) << (4))) | (FLD (f_ivc2_ccrn_lo)));
1487 }
1488 break;
1489 case MEP_OPERAND_IVC2RM :
1490 length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_ivc2_crm);
1491 break;
1492 case MEP_OPERAND_LO :
1493 break;
1494 case MEP_OPERAND_LP :
1495 break;
1496 case MEP_OPERAND_MB0 :
1497 break;
1498 case MEP_OPERAND_MB1 :
1499 break;
1500 case MEP_OPERAND_ME0 :
1501 break;
1502 case MEP_OPERAND_ME1 :
1503 break;
1504 case MEP_OPERAND_NPC :
1505 break;
1506 case MEP_OPERAND_OPT :
1507 break;
1508 case MEP_OPERAND_PCABS24A2 :
1509 {
1510 length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_24u5a2n_hi);
1511 if (length <= 0) break;
1512 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 7, 32, total_length, pc, & fields->f_24u5a2n_lo);
1513 if (length <= 0) break;
1514 FLD (f_24u5a2n) = ((((FLD (f_24u5a2n_hi)) << (8))) | (((FLD (f_24u5a2n_lo)) << (1))));
1515 }
1516 break;
1517 case MEP_OPERAND_PCREL12A2 :
1518 {
1519 long value;
1520 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 4, 11, 32, total_length, pc, & value);
1521 value = ((((value) << (1))) + (pc));
1522 fields->f_12s4a2 = value;
1523 }
1524 break;
1525 case MEP_OPERAND_PCREL17A2 :
1526 {
1527 long value;
1528 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 16, 16, 32, total_length, pc, & value);
1529 value = ((((value) << (1))) + (pc));
1530 fields->f_17s16a2 = value;
1531 }
1532 break;
1533 case MEP_OPERAND_PCREL24A2 :
1534 {
1535 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 16, 16, 32, total_length, pc, & fields->f_24s5a2n_hi);
1536 if (length <= 0) break;
1537 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_PCREL_ADDR), 0, 5, 7, 32, total_length, pc, & fields->f_24s5a2n_lo);
1538 if (length <= 0) break;
1539 FLD (f_24s5a2n) = ((((((FLD (f_24s5a2n_hi)) << (8))) | (((FLD (f_24s5a2n_lo)) << (1))))) + (pc));
1540 }
1541 break;
1542 case MEP_OPERAND_PCREL8A2 :
1543 {
1544 long value;
1545 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 8, 7, 32, total_length, pc, & value);
1546 value = ((((value) << (1))) + (pc));
1547 fields->f_8s8a2 = value;
1548 }
1549 break;
1550 case MEP_OPERAND_PSW :
1551 break;
1552 case MEP_OPERAND_R0 :
1553 break;
1554 case MEP_OPERAND_R1 :
1555 break;
1556 case MEP_OPERAND_RL :
1557 length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 4, 32, total_length, pc, & fields->f_rl);
1558 break;
1559 case MEP_OPERAND_RL5 :
1560 length = extract_normal (cd, ex_info, insn_value, 0, 0, 20, 4, 32, total_length, pc, & fields->f_rl5);
1561 break;
1562 case MEP_OPERAND_RM :
1563 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_rm);
1564 break;
1565 case MEP_OPERAND_RMA :
1566 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_rm);
1567 break;
1568 case MEP_OPERAND_RN :
1569 length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn);
1570 break;
1571 case MEP_OPERAND_RN3 :
1572 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3);
1573 break;
1574 case MEP_OPERAND_RN3C :
1575 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3);
1576 break;
1577 case MEP_OPERAND_RN3L :
1578 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3);
1579 break;
1580 case MEP_OPERAND_RN3S :
1581 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3);
1582 break;
1583 case MEP_OPERAND_RN3UC :
1584 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3);
1585 break;
1586 case MEP_OPERAND_RN3UL :
1587 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3);
1588 break;
1589 case MEP_OPERAND_RN3US :
1590 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3);
1591 break;
1592 case MEP_OPERAND_RNC :
1593 length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn);
1594 break;
1595 case MEP_OPERAND_RNL :
1596 length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn);
1597 break;
1598 case MEP_OPERAND_RNS :
1599 length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn);
1600 break;
1601 case MEP_OPERAND_RNUC :
1602 length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn);
1603 break;
1604 case MEP_OPERAND_RNUL :
1605 length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn);
1606 break;
1607 case MEP_OPERAND_RNUS :
1608 length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn);
1609 break;
1610 case MEP_OPERAND_SAR :
1611 break;
1612 case MEP_OPERAND_SDISP16 :
1613 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 16, 32, total_length, pc, & fields->f_16s16);
1614 break;
1615 case MEP_OPERAND_SIMM16 :
1616 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 16, 32, total_length, pc, & fields->f_16s16);
1617 break;
1618 case MEP_OPERAND_SIMM16P0 :
1619 {
1620 length = extract_normal (cd, ex_info, insn_value, 0, 0, 0, 8, 32, total_length, pc, & fields->f_ivc2_8u0);
1621 if (length <= 0) break;
1622 length = extract_normal (cd, ex_info, insn_value, 0, 0, 20, 8, 32, total_length, pc, & fields->f_ivc2_8u20);
1623 if (length <= 0) break;
1624 {
1625 FLD (f_ivc2_simm16p0) = ((FLD (f_ivc2_8u20)) | (((FLD (f_ivc2_8u0)) << (8))));
1626 }
1627 }
1628 break;
1629 case MEP_OPERAND_SIMM6 :
1630 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 8, 6, 32, total_length, pc, & fields->f_6s8);
1631 break;
1632 case MEP_OPERAND_SIMM8 :
1633 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 8, 8, 32, total_length, pc, & fields->f_8s8);
1634 break;
1635 case MEP_OPERAND_SIMM8P0 :
1636 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 0, 8, 32, total_length, pc, & fields->f_ivc2_8s0);
1637 break;
1638 case MEP_OPERAND_SIMM8P20 :
1639 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 20, 8, 32, total_length, pc, & fields->f_ivc2_8s20);
1640 break;
1641 case MEP_OPERAND_SIMM8P4 :
1642 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 4, 8, 32, total_length, pc, & fields->f_ivc2_8s4);
1643 break;
1644 case MEP_OPERAND_SP :
1645 break;
1646 case MEP_OPERAND_SPR :
1647 break;
1648 case MEP_OPERAND_TP :
1649 break;
1650 case MEP_OPERAND_TPR :
1651 break;
1652 case MEP_OPERAND_UDISP2 :
1653 length = extract_normal (cd, ex_info, insn_value, 0, 0, 6, 2, 32, total_length, pc, & fields->f_2u6);
1654 break;
1655 case MEP_OPERAND_UDISP7 :
1656 length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 7, 32, total_length, pc, & fields->f_7u9);
1657 break;
1658 case MEP_OPERAND_UDISP7A2 :
1659 {
1660 long value;
1661 length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 6, 32, total_length, pc, & value);
1662 value = ((value) << (1));
1663 fields->f_7u9a2 = value;
1664 }
1665 break;
1666 case MEP_OPERAND_UDISP7A4 :
1667 {
1668 long value;
1669 length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 5, 32, total_length, pc, & value);
1670 value = ((value) << (2));
1671 fields->f_7u9a4 = value;
1672 }
1673 break;
1674 case MEP_OPERAND_UIMM16 :
1675 length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_16u16);
1676 break;
1677 case MEP_OPERAND_UIMM2 :
1678 length = extract_normal (cd, ex_info, insn_value, 0, 0, 10, 2, 32, total_length, pc, & fields->f_2u10);
1679 break;
1680 case MEP_OPERAND_UIMM24 :
1681 {
1682 length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_24u8n_hi);
1683 if (length <= 0) break;
1684 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 8, 32, total_length, pc, & fields->f_24u8n_lo);
1685 if (length <= 0) break;
1686 FLD (f_24u8n) = ((((FLD (f_24u8n_hi)) << (8))) | (FLD (f_24u8n_lo)));
1687 }
1688 break;
1689 case MEP_OPERAND_UIMM3 :
1690 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_3u5);
1691 break;
1692 case MEP_OPERAND_UIMM4 :
1693 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_4u8);
1694 break;
1695 case MEP_OPERAND_UIMM5 :
1696 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 5, 32, total_length, pc, & fields->f_5u8);
1697 break;
1698 case MEP_OPERAND_UIMM7A4 :
1699 {
1700 long value;
1701 length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 5, 32, total_length, pc, & value);
1702 value = ((value) << (2));
1703 fields->f_7u9a4 = value;
1704 }
1705 break;
1706 case MEP_OPERAND_ZERO :
1707 break;
1708
1709 default :
1710 /* xgettext:c-format */
1711 fprintf (stderr, _("Unrecognized field %d while decoding insn.\n"),
1712 opindex);
1713 abort ();
1714 }
1715
1716 return length;
1717 }
1718
1719 cgen_insert_fn * const mep_cgen_insert_handlers[] =
1720 {
1721 insert_insn_normal,
1722 };
1723
1724 cgen_extract_fn * const mep_cgen_extract_handlers[] =
1725 {
1726 extract_insn_normal,
1727 };
1728
1729 int mep_cgen_get_int_operand (CGEN_CPU_DESC, int, const CGEN_FIELDS *);
1730 bfd_vma mep_cgen_get_vma_operand (CGEN_CPU_DESC, int, const CGEN_FIELDS *);
1731
1732 /* Getting values from cgen_fields is handled by a collection of functions.
1733 They are distinguished by the type of the VALUE argument they return.
1734 TODO: floating point, inlining support, remove cases where result type
1735 not appropriate. */
1736
1737 int
1738 mep_cgen_get_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1739 int opindex,
1740 const CGEN_FIELDS * fields)
1741 {
1742 int value;
1743
1744 switch (opindex)
1745 {
1746 case MEP_OPERAND_ADDR24A4 :
1747 value = fields->f_24u8a4n;
1748 break;
1749 case MEP_OPERAND_C5RMUIMM20 :
1750 value = fields->f_c5_rmuimm20;
1751 break;
1752 case MEP_OPERAND_C5RNMUIMM24 :
1753 value = fields->f_c5_rnmuimm24;
1754 break;
1755 case MEP_OPERAND_CALLNUM :
1756 value = fields->f_callnum;
1757 break;
1758 case MEP_OPERAND_CCCC :
1759 value = fields->f_rm;
1760 break;
1761 case MEP_OPERAND_CCRN :
1762 value = fields->f_ccrn;
1763 break;
1764 case MEP_OPERAND_CDISP10 :
1765 value = fields->f_cdisp10;
1766 break;
1767 case MEP_OPERAND_CDISP10A2 :
1768 value = fields->f_cdisp10;
1769 break;
1770 case MEP_OPERAND_CDISP10A4 :
1771 value = fields->f_cdisp10;
1772 break;
1773 case MEP_OPERAND_CDISP10A8 :
1774 value = fields->f_cdisp10;
1775 break;
1776 case MEP_OPERAND_CDISP12 :
1777 value = fields->f_12s20;
1778 break;
1779 case MEP_OPERAND_CIMM4 :
1780 value = fields->f_rn;
1781 break;
1782 case MEP_OPERAND_CIMM5 :
1783 value = fields->f_5u24;
1784 break;
1785 case MEP_OPERAND_CODE16 :
1786 value = fields->f_16u16;
1787 break;
1788 case MEP_OPERAND_CODE24 :
1789 value = fields->f_24u4n;
1790 break;
1791 case MEP_OPERAND_CP_FLAG :
1792 value = 0;
1793 break;
1794 case MEP_OPERAND_CRN :
1795 value = fields->f_crn;
1796 break;
1797 case MEP_OPERAND_CRN64 :
1798 value = fields->f_crn;
1799 break;
1800 case MEP_OPERAND_CRNX :
1801 value = fields->f_crnx;
1802 break;
1803 case MEP_OPERAND_CRNX64 :
1804 value = fields->f_crnx;
1805 break;
1806 case MEP_OPERAND_CROC :
1807 value = fields->f_ivc2_5u7;
1808 break;
1809 case MEP_OPERAND_CROP :
1810 value = fields->f_ivc2_5u23;
1811 break;
1812 case MEP_OPERAND_CRPC :
1813 value = fields->f_ivc2_5u26;
1814 break;
1815 case MEP_OPERAND_CRPP :
1816 value = fields->f_ivc2_5u18;
1817 break;
1818 case MEP_OPERAND_CRQC :
1819 value = fields->f_ivc2_5u21;
1820 break;
1821 case MEP_OPERAND_CRQP :
1822 value = fields->f_ivc2_5u13;
1823 break;
1824 case MEP_OPERAND_CSRN :
1825 value = fields->f_csrn;
1826 break;
1827 case MEP_OPERAND_CSRN_IDX :
1828 value = fields->f_csrn;
1829 break;
1830 case MEP_OPERAND_DBG :
1831 value = 0;
1832 break;
1833 case MEP_OPERAND_DEPC :
1834 value = 0;
1835 break;
1836 case MEP_OPERAND_EPC :
1837 value = 0;
1838 break;
1839 case MEP_OPERAND_EXC :
1840 value = 0;
1841 break;
1842 case MEP_OPERAND_HI :
1843 value = 0;
1844 break;
1845 case MEP_OPERAND_IMM16P0 :
1846 value = fields->f_ivc2_imm16p0;
1847 break;
1848 case MEP_OPERAND_IMM3P12 :
1849 value = fields->f_ivc2_3u12;
1850 break;
1851 case MEP_OPERAND_IMM3P25 :
1852 value = fields->f_ivc2_3u25;
1853 break;
1854 case MEP_OPERAND_IMM3P4 :
1855 value = fields->f_ivc2_3u4;
1856 break;
1857 case MEP_OPERAND_IMM3P5 :
1858 value = fields->f_ivc2_3u5;
1859 break;
1860 case MEP_OPERAND_IMM3P9 :
1861 value = fields->f_ivc2_3u9;
1862 break;
1863 case MEP_OPERAND_IMM4P10 :
1864 value = fields->f_ivc2_4u10;
1865 break;
1866 case MEP_OPERAND_IMM4P4 :
1867 value = fields->f_ivc2_4u4;
1868 break;
1869 case MEP_OPERAND_IMM4P8 :
1870 value = fields->f_ivc2_4u8;
1871 break;
1872 case MEP_OPERAND_IMM5P23 :
1873 value = fields->f_ivc2_5u23;
1874 break;
1875 case MEP_OPERAND_IMM5P3 :
1876 value = fields->f_ivc2_5u3;
1877 break;
1878 case MEP_OPERAND_IMM5P7 :
1879 value = fields->f_ivc2_5u7;
1880 break;
1881 case MEP_OPERAND_IMM5P8 :
1882 value = fields->f_ivc2_5u8;
1883 break;
1884 case MEP_OPERAND_IMM6P2 :
1885 value = fields->f_ivc2_6u2;
1886 break;
1887 case MEP_OPERAND_IMM6P6 :
1888 value = fields->f_ivc2_6u6;
1889 break;
1890 case MEP_OPERAND_IMM8P0 :
1891 value = fields->f_ivc2_8u0;
1892 break;
1893 case MEP_OPERAND_IMM8P20 :
1894 value = fields->f_ivc2_8u20;
1895 break;
1896 case MEP_OPERAND_IMM8P4 :
1897 value = fields->f_ivc2_8u4;
1898 break;
1899 case MEP_OPERAND_IVC_X_0_2 :
1900 value = fields->f_ivc2_2u0;
1901 break;
1902 case MEP_OPERAND_IVC_X_0_3 :
1903 value = fields->f_ivc2_3u0;
1904 break;
1905 case MEP_OPERAND_IVC_X_0_4 :
1906 value = fields->f_ivc2_4u0;
1907 break;
1908 case MEP_OPERAND_IVC_X_0_5 :
1909 value = fields->f_ivc2_5u0;
1910 break;
1911 case MEP_OPERAND_IVC_X_6_1 :
1912 value = fields->f_ivc2_1u6;
1913 break;
1914 case MEP_OPERAND_IVC_X_6_2 :
1915 value = fields->f_ivc2_2u6;
1916 break;
1917 case MEP_OPERAND_IVC_X_6_3 :
1918 value = fields->f_ivc2_3u6;
1919 break;
1920 case MEP_OPERAND_IVC2C3CCRN :
1921 value = fields->f_ccrn;
1922 break;
1923 case MEP_OPERAND_IVC2CCRN :
1924 value = fields->f_ivc2_ccrn;
1925 break;
1926 case MEP_OPERAND_IVC2CRN :
1927 value = fields->f_ivc2_crnx;
1928 break;
1929 case MEP_OPERAND_IVC2RM :
1930 value = fields->f_ivc2_crm;
1931 break;
1932 case MEP_OPERAND_LO :
1933 value = 0;
1934 break;
1935 case MEP_OPERAND_LP :
1936 value = 0;
1937 break;
1938 case MEP_OPERAND_MB0 :
1939 value = 0;
1940 break;
1941 case MEP_OPERAND_MB1 :
1942 value = 0;
1943 break;
1944 case MEP_OPERAND_ME0 :
1945 value = 0;
1946 break;
1947 case MEP_OPERAND_ME1 :
1948 value = 0;
1949 break;
1950 case MEP_OPERAND_NPC :
1951 value = 0;
1952 break;
1953 case MEP_OPERAND_OPT :
1954 value = 0;
1955 break;
1956 case MEP_OPERAND_PCABS24A2 :
1957 value = fields->f_24u5a2n;
1958 break;
1959 case MEP_OPERAND_PCREL12A2 :
1960 value = fields->f_12s4a2;
1961 break;
1962 case MEP_OPERAND_PCREL17A2 :
1963 value = fields->f_17s16a2;
1964 break;
1965 case MEP_OPERAND_PCREL24A2 :
1966 value = fields->f_24s5a2n;
1967 break;
1968 case MEP_OPERAND_PCREL8A2 :
1969 value = fields->f_8s8a2;
1970 break;
1971 case MEP_OPERAND_PSW :
1972 value = 0;
1973 break;
1974 case MEP_OPERAND_R0 :
1975 value = 0;
1976 break;
1977 case MEP_OPERAND_R1 :
1978 value = 0;
1979 break;
1980 case MEP_OPERAND_RL :
1981 value = fields->f_rl;
1982 break;
1983 case MEP_OPERAND_RL5 :
1984 value = fields->f_rl5;
1985 break;
1986 case MEP_OPERAND_RM :
1987 value = fields->f_rm;
1988 break;
1989 case MEP_OPERAND_RMA :
1990 value = fields->f_rm;
1991 break;
1992 case MEP_OPERAND_RN :
1993 value = fields->f_rn;
1994 break;
1995 case MEP_OPERAND_RN3 :
1996 value = fields->f_rn3;
1997 break;
1998 case MEP_OPERAND_RN3C :
1999 value = fields->f_rn3;
2000 break;
2001 case MEP_OPERAND_RN3L :
2002 value = fields->f_rn3;
2003 break;
2004 case MEP_OPERAND_RN3S :
2005 value = fields->f_rn3;
2006 break;
2007 case MEP_OPERAND_RN3UC :
2008 value = fields->f_rn3;
2009 break;
2010 case MEP_OPERAND_RN3UL :
2011 value = fields->f_rn3;
2012 break;
2013 case MEP_OPERAND_RN3US :
2014 value = fields->f_rn3;
2015 break;
2016 case MEP_OPERAND_RNC :
2017 value = fields->f_rn;
2018 break;
2019 case MEP_OPERAND_RNL :
2020 value = fields->f_rn;
2021 break;
2022 case MEP_OPERAND_RNS :
2023 value = fields->f_rn;
2024 break;
2025 case MEP_OPERAND_RNUC :
2026 value = fields->f_rn;
2027 break;
2028 case MEP_OPERAND_RNUL :
2029 value = fields->f_rn;
2030 break;
2031 case MEP_OPERAND_RNUS :
2032 value = fields->f_rn;
2033 break;
2034 case MEP_OPERAND_SAR :
2035 value = 0;
2036 break;
2037 case MEP_OPERAND_SDISP16 :
2038 value = fields->f_16s16;
2039 break;
2040 case MEP_OPERAND_SIMM16 :
2041 value = fields->f_16s16;
2042 break;
2043 case MEP_OPERAND_SIMM16P0 :
2044 value = fields->f_ivc2_simm16p0;
2045 break;
2046 case MEP_OPERAND_SIMM6 :
2047 value = fields->f_6s8;
2048 break;
2049 case MEP_OPERAND_SIMM8 :
2050 value = fields->f_8s8;
2051 break;
2052 case MEP_OPERAND_SIMM8P0 :
2053 value = fields->f_ivc2_8s0;
2054 break;
2055 case MEP_OPERAND_SIMM8P20 :
2056 value = fields->f_ivc2_8s20;
2057 break;
2058 case MEP_OPERAND_SIMM8P4 :
2059 value = fields->f_ivc2_8s4;
2060 break;
2061 case MEP_OPERAND_SP :
2062 value = 0;
2063 break;
2064 case MEP_OPERAND_SPR :
2065 value = 0;
2066 break;
2067 case MEP_OPERAND_TP :
2068 value = 0;
2069 break;
2070 case MEP_OPERAND_TPR :
2071 value = 0;
2072 break;
2073 case MEP_OPERAND_UDISP2 :
2074 value = fields->f_2u6;
2075 break;
2076 case MEP_OPERAND_UDISP7 :
2077 value = fields->f_7u9;
2078 break;
2079 case MEP_OPERAND_UDISP7A2 :
2080 value = fields->f_7u9a2;
2081 break;
2082 case MEP_OPERAND_UDISP7A4 :
2083 value = fields->f_7u9a4;
2084 break;
2085 case MEP_OPERAND_UIMM16 :
2086 value = fields->f_16u16;
2087 break;
2088 case MEP_OPERAND_UIMM2 :
2089 value = fields->f_2u10;
2090 break;
2091 case MEP_OPERAND_UIMM24 :
2092 value = fields->f_24u8n;
2093 break;
2094 case MEP_OPERAND_UIMM3 :
2095 value = fields->f_3u5;
2096 break;
2097 case MEP_OPERAND_UIMM4 :
2098 value = fields->f_4u8;
2099 break;
2100 case MEP_OPERAND_UIMM5 :
2101 value = fields->f_5u8;
2102 break;
2103 case MEP_OPERAND_UIMM7A4 :
2104 value = fields->f_7u9a4;
2105 break;
2106 case MEP_OPERAND_ZERO :
2107 value = 0;
2108 break;
2109
2110 default :
2111 /* xgettext:c-format */
2112 fprintf (stderr, _("Unrecognized field %d while getting int operand.\n"),
2113 opindex);
2114 abort ();
2115 }
2116
2117 return value;
2118 }
2119
2120 bfd_vma
2121 mep_cgen_get_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
2122 int opindex,
2123 const CGEN_FIELDS * fields)
2124 {
2125 bfd_vma value;
2126
2127 switch (opindex)
2128 {
2129 case MEP_OPERAND_ADDR24A4 :
2130 value = fields->f_24u8a4n;
2131 break;
2132 case MEP_OPERAND_C5RMUIMM20 :
2133 value = fields->f_c5_rmuimm20;
2134 break;
2135 case MEP_OPERAND_C5RNMUIMM24 :
2136 value = fields->f_c5_rnmuimm24;
2137 break;
2138 case MEP_OPERAND_CALLNUM :
2139 value = fields->f_callnum;
2140 break;
2141 case MEP_OPERAND_CCCC :
2142 value = fields->f_rm;
2143 break;
2144 case MEP_OPERAND_CCRN :
2145 value = fields->f_ccrn;
2146 break;
2147 case MEP_OPERAND_CDISP10 :
2148 value = fields->f_cdisp10;
2149 break;
2150 case MEP_OPERAND_CDISP10A2 :
2151 value = fields->f_cdisp10;
2152 break;
2153 case MEP_OPERAND_CDISP10A4 :
2154 value = fields->f_cdisp10;
2155 break;
2156 case MEP_OPERAND_CDISP10A8 :
2157 value = fields->f_cdisp10;
2158 break;
2159 case MEP_OPERAND_CDISP12 :
2160 value = fields->f_12s20;
2161 break;
2162 case MEP_OPERAND_CIMM4 :
2163 value = fields->f_rn;
2164 break;
2165 case MEP_OPERAND_CIMM5 :
2166 value = fields->f_5u24;
2167 break;
2168 case MEP_OPERAND_CODE16 :
2169 value = fields->f_16u16;
2170 break;
2171 case MEP_OPERAND_CODE24 :
2172 value = fields->f_24u4n;
2173 break;
2174 case MEP_OPERAND_CP_FLAG :
2175 value = 0;
2176 break;
2177 case MEP_OPERAND_CRN :
2178 value = fields->f_crn;
2179 break;
2180 case MEP_OPERAND_CRN64 :
2181 value = fields->f_crn;
2182 break;
2183 case MEP_OPERAND_CRNX :
2184 value = fields->f_crnx;
2185 break;
2186 case MEP_OPERAND_CRNX64 :
2187 value = fields->f_crnx;
2188 break;
2189 case MEP_OPERAND_CROC :
2190 value = fields->f_ivc2_5u7;
2191 break;
2192 case MEP_OPERAND_CROP :
2193 value = fields->f_ivc2_5u23;
2194 break;
2195 case MEP_OPERAND_CRPC :
2196 value = fields->f_ivc2_5u26;
2197 break;
2198 case MEP_OPERAND_CRPP :
2199 value = fields->f_ivc2_5u18;
2200 break;
2201 case MEP_OPERAND_CRQC :
2202 value = fields->f_ivc2_5u21;
2203 break;
2204 case MEP_OPERAND_CRQP :
2205 value = fields->f_ivc2_5u13;
2206 break;
2207 case MEP_OPERAND_CSRN :
2208 value = fields->f_csrn;
2209 break;
2210 case MEP_OPERAND_CSRN_IDX :
2211 value = fields->f_csrn;
2212 break;
2213 case MEP_OPERAND_DBG :
2214 value = 0;
2215 break;
2216 case MEP_OPERAND_DEPC :
2217 value = 0;
2218 break;
2219 case MEP_OPERAND_EPC :
2220 value = 0;
2221 break;
2222 case MEP_OPERAND_EXC :
2223 value = 0;
2224 break;
2225 case MEP_OPERAND_HI :
2226 value = 0;
2227 break;
2228 case MEP_OPERAND_IMM16P0 :
2229 value = fields->f_ivc2_imm16p0;
2230 break;
2231 case MEP_OPERAND_IMM3P12 :
2232 value = fields->f_ivc2_3u12;
2233 break;
2234 case MEP_OPERAND_IMM3P25 :
2235 value = fields->f_ivc2_3u25;
2236 break;
2237 case MEP_OPERAND_IMM3P4 :
2238 value = fields->f_ivc2_3u4;
2239 break;
2240 case MEP_OPERAND_IMM3P5 :
2241 value = fields->f_ivc2_3u5;
2242 break;
2243 case MEP_OPERAND_IMM3P9 :
2244 value = fields->f_ivc2_3u9;
2245 break;
2246 case MEP_OPERAND_IMM4P10 :
2247 value = fields->f_ivc2_4u10;
2248 break;
2249 case MEP_OPERAND_IMM4P4 :
2250 value = fields->f_ivc2_4u4;
2251 break;
2252 case MEP_OPERAND_IMM4P8 :
2253 value = fields->f_ivc2_4u8;
2254 break;
2255 case MEP_OPERAND_IMM5P23 :
2256 value = fields->f_ivc2_5u23;
2257 break;
2258 case MEP_OPERAND_IMM5P3 :
2259 value = fields->f_ivc2_5u3;
2260 break;
2261 case MEP_OPERAND_IMM5P7 :
2262 value = fields->f_ivc2_5u7;
2263 break;
2264 case MEP_OPERAND_IMM5P8 :
2265 value = fields->f_ivc2_5u8;
2266 break;
2267 case MEP_OPERAND_IMM6P2 :
2268 value = fields->f_ivc2_6u2;
2269 break;
2270 case MEP_OPERAND_IMM6P6 :
2271 value = fields->f_ivc2_6u6;
2272 break;
2273 case MEP_OPERAND_IMM8P0 :
2274 value = fields->f_ivc2_8u0;
2275 break;
2276 case MEP_OPERAND_IMM8P20 :
2277 value = fields->f_ivc2_8u20;
2278 break;
2279 case MEP_OPERAND_IMM8P4 :
2280 value = fields->f_ivc2_8u4;
2281 break;
2282 case MEP_OPERAND_IVC_X_0_2 :
2283 value = fields->f_ivc2_2u0;
2284 break;
2285 case MEP_OPERAND_IVC_X_0_3 :
2286 value = fields->f_ivc2_3u0;
2287 break;
2288 case MEP_OPERAND_IVC_X_0_4 :
2289 value = fields->f_ivc2_4u0;
2290 break;
2291 case MEP_OPERAND_IVC_X_0_5 :
2292 value = fields->f_ivc2_5u0;
2293 break;
2294 case MEP_OPERAND_IVC_X_6_1 :
2295 value = fields->f_ivc2_1u6;
2296 break;
2297 case MEP_OPERAND_IVC_X_6_2 :
2298 value = fields->f_ivc2_2u6;
2299 break;
2300 case MEP_OPERAND_IVC_X_6_3 :
2301 value = fields->f_ivc2_3u6;
2302 break;
2303 case MEP_OPERAND_IVC2C3CCRN :
2304 value = fields->f_ccrn;
2305 break;
2306 case MEP_OPERAND_IVC2CCRN :
2307 value = fields->f_ivc2_ccrn;
2308 break;
2309 case MEP_OPERAND_IVC2CRN :
2310 value = fields->f_ivc2_crnx;
2311 break;
2312 case MEP_OPERAND_IVC2RM :
2313 value = fields->f_ivc2_crm;
2314 break;
2315 case MEP_OPERAND_LO :
2316 value = 0;
2317 break;
2318 case MEP_OPERAND_LP :
2319 value = 0;
2320 break;
2321 case MEP_OPERAND_MB0 :
2322 value = 0;
2323 break;
2324 case MEP_OPERAND_MB1 :
2325 value = 0;
2326 break;
2327 case MEP_OPERAND_ME0 :
2328 value = 0;
2329 break;
2330 case MEP_OPERAND_ME1 :
2331 value = 0;
2332 break;
2333 case MEP_OPERAND_NPC :
2334 value = 0;
2335 break;
2336 case MEP_OPERAND_OPT :
2337 value = 0;
2338 break;
2339 case MEP_OPERAND_PCABS24A2 :
2340 value = fields->f_24u5a2n;
2341 break;
2342 case MEP_OPERAND_PCREL12A2 :
2343 value = fields->f_12s4a2;
2344 break;
2345 case MEP_OPERAND_PCREL17A2 :
2346 value = fields->f_17s16a2;
2347 break;
2348 case MEP_OPERAND_PCREL24A2 :
2349 value = fields->f_24s5a2n;
2350 break;
2351 case MEP_OPERAND_PCREL8A2 :
2352 value = fields->f_8s8a2;
2353 break;
2354 case MEP_OPERAND_PSW :
2355 value = 0;
2356 break;
2357 case MEP_OPERAND_R0 :
2358 value = 0;
2359 break;
2360 case MEP_OPERAND_R1 :
2361 value = 0;
2362 break;
2363 case MEP_OPERAND_RL :
2364 value = fields->f_rl;
2365 break;
2366 case MEP_OPERAND_RL5 :
2367 value = fields->f_rl5;
2368 break;
2369 case MEP_OPERAND_RM :
2370 value = fields->f_rm;
2371 break;
2372 case MEP_OPERAND_RMA :
2373 value = fields->f_rm;
2374 break;
2375 case MEP_OPERAND_RN :
2376 value = fields->f_rn;
2377 break;
2378 case MEP_OPERAND_RN3 :
2379 value = fields->f_rn3;
2380 break;
2381 case MEP_OPERAND_RN3C :
2382 value = fields->f_rn3;
2383 break;
2384 case MEP_OPERAND_RN3L :
2385 value = fields->f_rn3;
2386 break;
2387 case MEP_OPERAND_RN3S :
2388 value = fields->f_rn3;
2389 break;
2390 case MEP_OPERAND_RN3UC :
2391 value = fields->f_rn3;
2392 break;
2393 case MEP_OPERAND_RN3UL :
2394 value = fields->f_rn3;
2395 break;
2396 case MEP_OPERAND_RN3US :
2397 value = fields->f_rn3;
2398 break;
2399 case MEP_OPERAND_RNC :
2400 value = fields->f_rn;
2401 break;
2402 case MEP_OPERAND_RNL :
2403 value = fields->f_rn;
2404 break;
2405 case MEP_OPERAND_RNS :
2406 value = fields->f_rn;
2407 break;
2408 case MEP_OPERAND_RNUC :
2409 value = fields->f_rn;
2410 break;
2411 case MEP_OPERAND_RNUL :
2412 value = fields->f_rn;
2413 break;
2414 case MEP_OPERAND_RNUS :
2415 value = fields->f_rn;
2416 break;
2417 case MEP_OPERAND_SAR :
2418 value = 0;
2419 break;
2420 case MEP_OPERAND_SDISP16 :
2421 value = fields->f_16s16;
2422 break;
2423 case MEP_OPERAND_SIMM16 :
2424 value = fields->f_16s16;
2425 break;
2426 case MEP_OPERAND_SIMM16P0 :
2427 value = fields->f_ivc2_simm16p0;
2428 break;
2429 case MEP_OPERAND_SIMM6 :
2430 value = fields->f_6s8;
2431 break;
2432 case MEP_OPERAND_SIMM8 :
2433 value = fields->f_8s8;
2434 break;
2435 case MEP_OPERAND_SIMM8P0 :
2436 value = fields->f_ivc2_8s0;
2437 break;
2438 case MEP_OPERAND_SIMM8P20 :
2439 value = fields->f_ivc2_8s20;
2440 break;
2441 case MEP_OPERAND_SIMM8P4 :
2442 value = fields->f_ivc2_8s4;
2443 break;
2444 case MEP_OPERAND_SP :
2445 value = 0;
2446 break;
2447 case MEP_OPERAND_SPR :
2448 value = 0;
2449 break;
2450 case MEP_OPERAND_TP :
2451 value = 0;
2452 break;
2453 case MEP_OPERAND_TPR :
2454 value = 0;
2455 break;
2456 case MEP_OPERAND_UDISP2 :
2457 value = fields->f_2u6;
2458 break;
2459 case MEP_OPERAND_UDISP7 :
2460 value = fields->f_7u9;
2461 break;
2462 case MEP_OPERAND_UDISP7A2 :
2463 value = fields->f_7u9a2;
2464 break;
2465 case MEP_OPERAND_UDISP7A4 :
2466 value = fields->f_7u9a4;
2467 break;
2468 case MEP_OPERAND_UIMM16 :
2469 value = fields->f_16u16;
2470 break;
2471 case MEP_OPERAND_UIMM2 :
2472 value = fields->f_2u10;
2473 break;
2474 case MEP_OPERAND_UIMM24 :
2475 value = fields->f_24u8n;
2476 break;
2477 case MEP_OPERAND_UIMM3 :
2478 value = fields->f_3u5;
2479 break;
2480 case MEP_OPERAND_UIMM4 :
2481 value = fields->f_4u8;
2482 break;
2483 case MEP_OPERAND_UIMM5 :
2484 value = fields->f_5u8;
2485 break;
2486 case MEP_OPERAND_UIMM7A4 :
2487 value = fields->f_7u9a4;
2488 break;
2489 case MEP_OPERAND_ZERO :
2490 value = 0;
2491 break;
2492
2493 default :
2494 /* xgettext:c-format */
2495 fprintf (stderr, _("Unrecognized field %d while getting vma operand.\n"),
2496 opindex);
2497 abort ();
2498 }
2499
2500 return value;
2501 }
2502
2503 void mep_cgen_set_int_operand (CGEN_CPU_DESC, int, CGEN_FIELDS *, int);
2504 void mep_cgen_set_vma_operand (CGEN_CPU_DESC, int, CGEN_FIELDS *, bfd_vma);
2505
2506 /* Stuffing values in cgen_fields is handled by a collection of functions.
2507 They are distinguished by the type of the VALUE argument they accept.
2508 TODO: floating point, inlining support, remove cases where argument type
2509 not appropriate. */
2510
2511 void
2512 mep_cgen_set_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
2513 int opindex,
2514 CGEN_FIELDS * fields,
2515 int value)
2516 {
2517 switch (opindex)
2518 {
2519 case MEP_OPERAND_ADDR24A4 :
2520 fields->f_24u8a4n = value;
2521 break;
2522 case MEP_OPERAND_C5RMUIMM20 :
2523 fields->f_c5_rmuimm20 = value;
2524 break;
2525 case MEP_OPERAND_C5RNMUIMM24 :
2526 fields->f_c5_rnmuimm24 = value;
2527 break;
2528 case MEP_OPERAND_CALLNUM :
2529 fields->f_callnum = value;
2530 break;
2531 case MEP_OPERAND_CCCC :
2532 fields->f_rm = value;
2533 break;
2534 case MEP_OPERAND_CCRN :
2535 fields->f_ccrn = value;
2536 break;
2537 case MEP_OPERAND_CDISP10 :
2538 fields->f_cdisp10 = value;
2539 break;
2540 case MEP_OPERAND_CDISP10A2 :
2541 fields->f_cdisp10 = value;
2542 break;
2543 case MEP_OPERAND_CDISP10A4 :
2544 fields->f_cdisp10 = value;
2545 break;
2546 case MEP_OPERAND_CDISP10A8 :
2547 fields->f_cdisp10 = value;
2548 break;
2549 case MEP_OPERAND_CDISP12 :
2550 fields->f_12s20 = value;
2551 break;
2552 case MEP_OPERAND_CIMM4 :
2553 fields->f_rn = value;
2554 break;
2555 case MEP_OPERAND_CIMM5 :
2556 fields->f_5u24 = value;
2557 break;
2558 case MEP_OPERAND_CODE16 :
2559 fields->f_16u16 = value;
2560 break;
2561 case MEP_OPERAND_CODE24 :
2562 fields->f_24u4n = value;
2563 break;
2564 case MEP_OPERAND_CP_FLAG :
2565 break;
2566 case MEP_OPERAND_CRN :
2567 fields->f_crn = value;
2568 break;
2569 case MEP_OPERAND_CRN64 :
2570 fields->f_crn = value;
2571 break;
2572 case MEP_OPERAND_CRNX :
2573 fields->f_crnx = value;
2574 break;
2575 case MEP_OPERAND_CRNX64 :
2576 fields->f_crnx = value;
2577 break;
2578 case MEP_OPERAND_CROC :
2579 fields->f_ivc2_5u7 = value;
2580 break;
2581 case MEP_OPERAND_CROP :
2582 fields->f_ivc2_5u23 = value;
2583 break;
2584 case MEP_OPERAND_CRPC :
2585 fields->f_ivc2_5u26 = value;
2586 break;
2587 case MEP_OPERAND_CRPP :
2588 fields->f_ivc2_5u18 = value;
2589 break;
2590 case MEP_OPERAND_CRQC :
2591 fields->f_ivc2_5u21 = value;
2592 break;
2593 case MEP_OPERAND_CRQP :
2594 fields->f_ivc2_5u13 = value;
2595 break;
2596 case MEP_OPERAND_CSRN :
2597 fields->f_csrn = value;
2598 break;
2599 case MEP_OPERAND_CSRN_IDX :
2600 fields->f_csrn = value;
2601 break;
2602 case MEP_OPERAND_DBG :
2603 break;
2604 case MEP_OPERAND_DEPC :
2605 break;
2606 case MEP_OPERAND_EPC :
2607 break;
2608 case MEP_OPERAND_EXC :
2609 break;
2610 case MEP_OPERAND_HI :
2611 break;
2612 case MEP_OPERAND_IMM16P0 :
2613 fields->f_ivc2_imm16p0 = value;
2614 break;
2615 case MEP_OPERAND_IMM3P12 :
2616 fields->f_ivc2_3u12 = value;
2617 break;
2618 case MEP_OPERAND_IMM3P25 :
2619 fields->f_ivc2_3u25 = value;
2620 break;
2621 case MEP_OPERAND_IMM3P4 :
2622 fields->f_ivc2_3u4 = value;
2623 break;
2624 case MEP_OPERAND_IMM3P5 :
2625 fields->f_ivc2_3u5 = value;
2626 break;
2627 case MEP_OPERAND_IMM3P9 :
2628 fields->f_ivc2_3u9 = value;
2629 break;
2630 case MEP_OPERAND_IMM4P10 :
2631 fields->f_ivc2_4u10 = value;
2632 break;
2633 case MEP_OPERAND_IMM4P4 :
2634 fields->f_ivc2_4u4 = value;
2635 break;
2636 case MEP_OPERAND_IMM4P8 :
2637 fields->f_ivc2_4u8 = value;
2638 break;
2639 case MEP_OPERAND_IMM5P23 :
2640 fields->f_ivc2_5u23 = value;
2641 break;
2642 case MEP_OPERAND_IMM5P3 :
2643 fields->f_ivc2_5u3 = value;
2644 break;
2645 case MEP_OPERAND_IMM5P7 :
2646 fields->f_ivc2_5u7 = value;
2647 break;
2648 case MEP_OPERAND_IMM5P8 :
2649 fields->f_ivc2_5u8 = value;
2650 break;
2651 case MEP_OPERAND_IMM6P2 :
2652 fields->f_ivc2_6u2 = value;
2653 break;
2654 case MEP_OPERAND_IMM6P6 :
2655 fields->f_ivc2_6u6 = value;
2656 break;
2657 case MEP_OPERAND_IMM8P0 :
2658 fields->f_ivc2_8u0 = value;
2659 break;
2660 case MEP_OPERAND_IMM8P20 :
2661 fields->f_ivc2_8u20 = value;
2662 break;
2663 case MEP_OPERAND_IMM8P4 :
2664 fields->f_ivc2_8u4 = value;
2665 break;
2666 case MEP_OPERAND_IVC_X_0_2 :
2667 fields->f_ivc2_2u0 = value;
2668 break;
2669 case MEP_OPERAND_IVC_X_0_3 :
2670 fields->f_ivc2_3u0 = value;
2671 break;
2672 case MEP_OPERAND_IVC_X_0_4 :
2673 fields->f_ivc2_4u0 = value;
2674 break;
2675 case MEP_OPERAND_IVC_X_0_5 :
2676 fields->f_ivc2_5u0 = value;
2677 break;
2678 case MEP_OPERAND_IVC_X_6_1 :
2679 fields->f_ivc2_1u6 = value;
2680 break;
2681 case MEP_OPERAND_IVC_X_6_2 :
2682 fields->f_ivc2_2u6 = value;
2683 break;
2684 case MEP_OPERAND_IVC_X_6_3 :
2685 fields->f_ivc2_3u6 = value;
2686 break;
2687 case MEP_OPERAND_IVC2C3CCRN :
2688 fields->f_ccrn = value;
2689 break;
2690 case MEP_OPERAND_IVC2CCRN :
2691 fields->f_ivc2_ccrn = value;
2692 break;
2693 case MEP_OPERAND_IVC2CRN :
2694 fields->f_ivc2_crnx = value;
2695 break;
2696 case MEP_OPERAND_IVC2RM :
2697 fields->f_ivc2_crm = value;
2698 break;
2699 case MEP_OPERAND_LO :
2700 break;
2701 case MEP_OPERAND_LP :
2702 break;
2703 case MEP_OPERAND_MB0 :
2704 break;
2705 case MEP_OPERAND_MB1 :
2706 break;
2707 case MEP_OPERAND_ME0 :
2708 break;
2709 case MEP_OPERAND_ME1 :
2710 break;
2711 case MEP_OPERAND_NPC :
2712 break;
2713 case MEP_OPERAND_OPT :
2714 break;
2715 case MEP_OPERAND_PCABS24A2 :
2716 fields->f_24u5a2n = value;
2717 break;
2718 case MEP_OPERAND_PCREL12A2 :
2719 fields->f_12s4a2 = value;
2720 break;
2721 case MEP_OPERAND_PCREL17A2 :
2722 fields->f_17s16a2 = value;
2723 break;
2724 case MEP_OPERAND_PCREL24A2 :
2725 fields->f_24s5a2n = value;
2726 break;
2727 case MEP_OPERAND_PCREL8A2 :
2728 fields->f_8s8a2 = value;
2729 break;
2730 case MEP_OPERAND_PSW :
2731 break;
2732 case MEP_OPERAND_R0 :
2733 break;
2734 case MEP_OPERAND_R1 :
2735 break;
2736 case MEP_OPERAND_RL :
2737 fields->f_rl = value;
2738 break;
2739 case MEP_OPERAND_RL5 :
2740 fields->f_rl5 = value;
2741 break;
2742 case MEP_OPERAND_RM :
2743 fields->f_rm = value;
2744 break;
2745 case MEP_OPERAND_RMA :
2746 fields->f_rm = value;
2747 break;
2748 case MEP_OPERAND_RN :
2749 fields->f_rn = value;
2750 break;
2751 case MEP_OPERAND_RN3 :
2752 fields->f_rn3 = value;
2753 break;
2754 case MEP_OPERAND_RN3C :
2755 fields->f_rn3 = value;
2756 break;
2757 case MEP_OPERAND_RN3L :
2758 fields->f_rn3 = value;
2759 break;
2760 case MEP_OPERAND_RN3S :
2761 fields->f_rn3 = value;
2762 break;
2763 case MEP_OPERAND_RN3UC :
2764 fields->f_rn3 = value;
2765 break;
2766 case MEP_OPERAND_RN3UL :
2767 fields->f_rn3 = value;
2768 break;
2769 case MEP_OPERAND_RN3US :
2770 fields->f_rn3 = value;
2771 break;
2772 case MEP_OPERAND_RNC :
2773 fields->f_rn = value;
2774 break;
2775 case MEP_OPERAND_RNL :
2776 fields->f_rn = value;
2777 break;
2778 case MEP_OPERAND_RNS :
2779 fields->f_rn = value;
2780 break;
2781 case MEP_OPERAND_RNUC :
2782 fields->f_rn = value;
2783 break;
2784 case MEP_OPERAND_RNUL :
2785 fields->f_rn = value;
2786 break;
2787 case MEP_OPERAND_RNUS :
2788 fields->f_rn = value;
2789 break;
2790 case MEP_OPERAND_SAR :
2791 break;
2792 case MEP_OPERAND_SDISP16 :
2793 fields->f_16s16 = value;
2794 break;
2795 case MEP_OPERAND_SIMM16 :
2796 fields->f_16s16 = value;
2797 break;
2798 case MEP_OPERAND_SIMM16P0 :
2799 fields->f_ivc2_simm16p0 = value;
2800 break;
2801 case MEP_OPERAND_SIMM6 :
2802 fields->f_6s8 = value;
2803 break;
2804 case MEP_OPERAND_SIMM8 :
2805 fields->f_8s8 = value;
2806 break;
2807 case MEP_OPERAND_SIMM8P0 :
2808 fields->f_ivc2_8s0 = value;
2809 break;
2810 case MEP_OPERAND_SIMM8P20 :
2811 fields->f_ivc2_8s20 = value;
2812 break;
2813 case MEP_OPERAND_SIMM8P4 :
2814 fields->f_ivc2_8s4 = value;
2815 break;
2816 case MEP_OPERAND_SP :
2817 break;
2818 case MEP_OPERAND_SPR :
2819 break;
2820 case MEP_OPERAND_TP :
2821 break;
2822 case MEP_OPERAND_TPR :
2823 break;
2824 case MEP_OPERAND_UDISP2 :
2825 fields->f_2u6 = value;
2826 break;
2827 case MEP_OPERAND_UDISP7 :
2828 fields->f_7u9 = value;
2829 break;
2830 case MEP_OPERAND_UDISP7A2 :
2831 fields->f_7u9a2 = value;
2832 break;
2833 case MEP_OPERAND_UDISP7A4 :
2834 fields->f_7u9a4 = value;
2835 break;
2836 case MEP_OPERAND_UIMM16 :
2837 fields->f_16u16 = value;
2838 break;
2839 case MEP_OPERAND_UIMM2 :
2840 fields->f_2u10 = value;
2841 break;
2842 case MEP_OPERAND_UIMM24 :
2843 fields->f_24u8n = value;
2844 break;
2845 case MEP_OPERAND_UIMM3 :
2846 fields->f_3u5 = value;
2847 break;
2848 case MEP_OPERAND_UIMM4 :
2849 fields->f_4u8 = value;
2850 break;
2851 case MEP_OPERAND_UIMM5 :
2852 fields->f_5u8 = value;
2853 break;
2854 case MEP_OPERAND_UIMM7A4 :
2855 fields->f_7u9a4 = value;
2856 break;
2857 case MEP_OPERAND_ZERO :
2858 break;
2859
2860 default :
2861 /* xgettext:c-format */
2862 fprintf (stderr, _("Unrecognized field %d while setting int operand.\n"),
2863 opindex);
2864 abort ();
2865 }
2866 }
2867
2868 void
2869 mep_cgen_set_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
2870 int opindex,
2871 CGEN_FIELDS * fields,
2872 bfd_vma value)
2873 {
2874 switch (opindex)
2875 {
2876 case MEP_OPERAND_ADDR24A4 :
2877 fields->f_24u8a4n = value;
2878 break;
2879 case MEP_OPERAND_C5RMUIMM20 :
2880 fields->f_c5_rmuimm20 = value;
2881 break;
2882 case MEP_OPERAND_C5RNMUIMM24 :
2883 fields->f_c5_rnmuimm24 = value;
2884 break;
2885 case MEP_OPERAND_CALLNUM :
2886 fields->f_callnum = value;
2887 break;
2888 case MEP_OPERAND_CCCC :
2889 fields->f_rm = value;
2890 break;
2891 case MEP_OPERAND_CCRN :
2892 fields->f_ccrn = value;
2893 break;
2894 case MEP_OPERAND_CDISP10 :
2895 fields->f_cdisp10 = value;
2896 break;
2897 case MEP_OPERAND_CDISP10A2 :
2898 fields->f_cdisp10 = value;
2899 break;
2900 case MEP_OPERAND_CDISP10A4 :
2901 fields->f_cdisp10 = value;
2902 break;
2903 case MEP_OPERAND_CDISP10A8 :
2904 fields->f_cdisp10 = value;
2905 break;
2906 case MEP_OPERAND_CDISP12 :
2907 fields->f_12s20 = value;
2908 break;
2909 case MEP_OPERAND_CIMM4 :
2910 fields->f_rn = value;
2911 break;
2912 case MEP_OPERAND_CIMM5 :
2913 fields->f_5u24 = value;
2914 break;
2915 case MEP_OPERAND_CODE16 :
2916 fields->f_16u16 = value;
2917 break;
2918 case MEP_OPERAND_CODE24 :
2919 fields->f_24u4n = value;
2920 break;
2921 case MEP_OPERAND_CP_FLAG :
2922 break;
2923 case MEP_OPERAND_CRN :
2924 fields->f_crn = value;
2925 break;
2926 case MEP_OPERAND_CRN64 :
2927 fields->f_crn = value;
2928 break;
2929 case MEP_OPERAND_CRNX :
2930 fields->f_crnx = value;
2931 break;
2932 case MEP_OPERAND_CRNX64 :
2933 fields->f_crnx = value;
2934 break;
2935 case MEP_OPERAND_CROC :
2936 fields->f_ivc2_5u7 = value;
2937 break;
2938 case MEP_OPERAND_CROP :
2939 fields->f_ivc2_5u23 = value;
2940 break;
2941 case MEP_OPERAND_CRPC :
2942 fields->f_ivc2_5u26 = value;
2943 break;
2944 case MEP_OPERAND_CRPP :
2945 fields->f_ivc2_5u18 = value;
2946 break;
2947 case MEP_OPERAND_CRQC :
2948 fields->f_ivc2_5u21 = value;
2949 break;
2950 case MEP_OPERAND_CRQP :
2951 fields->f_ivc2_5u13 = value;
2952 break;
2953 case MEP_OPERAND_CSRN :
2954 fields->f_csrn = value;
2955 break;
2956 case MEP_OPERAND_CSRN_IDX :
2957 fields->f_csrn = value;
2958 break;
2959 case MEP_OPERAND_DBG :
2960 break;
2961 case MEP_OPERAND_DEPC :
2962 break;
2963 case MEP_OPERAND_EPC :
2964 break;
2965 case MEP_OPERAND_EXC :
2966 break;
2967 case MEP_OPERAND_HI :
2968 break;
2969 case MEP_OPERAND_IMM16P0 :
2970 fields->f_ivc2_imm16p0 = value;
2971 break;
2972 case MEP_OPERAND_IMM3P12 :
2973 fields->f_ivc2_3u12 = value;
2974 break;
2975 case MEP_OPERAND_IMM3P25 :
2976 fields->f_ivc2_3u25 = value;
2977 break;
2978 case MEP_OPERAND_IMM3P4 :
2979 fields->f_ivc2_3u4 = value;
2980 break;
2981 case MEP_OPERAND_IMM3P5 :
2982 fields->f_ivc2_3u5 = value;
2983 break;
2984 case MEP_OPERAND_IMM3P9 :
2985 fields->f_ivc2_3u9 = value;
2986 break;
2987 case MEP_OPERAND_IMM4P10 :
2988 fields->f_ivc2_4u10 = value;
2989 break;
2990 case MEP_OPERAND_IMM4P4 :
2991 fields->f_ivc2_4u4 = value;
2992 break;
2993 case MEP_OPERAND_IMM4P8 :
2994 fields->f_ivc2_4u8 = value;
2995 break;
2996 case MEP_OPERAND_IMM5P23 :
2997 fields->f_ivc2_5u23 = value;
2998 break;
2999 case MEP_OPERAND_IMM5P3 :
3000 fields->f_ivc2_5u3 = value;
3001 break;
3002 case MEP_OPERAND_IMM5P7 :
3003 fields->f_ivc2_5u7 = value;
3004 break;
3005 case MEP_OPERAND_IMM5P8 :
3006 fields->f_ivc2_5u8 = value;
3007 break;
3008 case MEP_OPERAND_IMM6P2 :
3009 fields->f_ivc2_6u2 = value;
3010 break;
3011 case MEP_OPERAND_IMM6P6 :
3012 fields->f_ivc2_6u6 = value;
3013 break;
3014 case MEP_OPERAND_IMM8P0 :
3015 fields->f_ivc2_8u0 = value;
3016 break;
3017 case MEP_OPERAND_IMM8P20 :
3018 fields->f_ivc2_8u20 = value;
3019 break;
3020 case MEP_OPERAND_IMM8P4 :
3021 fields->f_ivc2_8u4 = value;
3022 break;
3023 case MEP_OPERAND_IVC_X_0_2 :
3024 fields->f_ivc2_2u0 = value;
3025 break;
3026 case MEP_OPERAND_IVC_X_0_3 :
3027 fields->f_ivc2_3u0 = value;
3028 break;
3029 case MEP_OPERAND_IVC_X_0_4 :
3030 fields->f_ivc2_4u0 = value;
3031 break;
3032 case MEP_OPERAND_IVC_X_0_5 :
3033 fields->f_ivc2_5u0 = value;
3034 break;
3035 case MEP_OPERAND_IVC_X_6_1 :
3036 fields->f_ivc2_1u6 = value;
3037 break;
3038 case MEP_OPERAND_IVC_X_6_2 :
3039 fields->f_ivc2_2u6 = value;
3040 break;
3041 case MEP_OPERAND_IVC_X_6_3 :
3042 fields->f_ivc2_3u6 = value;
3043 break;
3044 case MEP_OPERAND_IVC2C3CCRN :
3045 fields->f_ccrn = value;
3046 break;
3047 case MEP_OPERAND_IVC2CCRN :
3048 fields->f_ivc2_ccrn = value;
3049 break;
3050 case MEP_OPERAND_IVC2CRN :
3051 fields->f_ivc2_crnx = value;
3052 break;
3053 case MEP_OPERAND_IVC2RM :
3054 fields->f_ivc2_crm = value;
3055 break;
3056 case MEP_OPERAND_LO :
3057 break;
3058 case MEP_OPERAND_LP :
3059 break;
3060 case MEP_OPERAND_MB0 :
3061 break;
3062 case MEP_OPERAND_MB1 :
3063 break;
3064 case MEP_OPERAND_ME0 :
3065 break;
3066 case MEP_OPERAND_ME1 :
3067 break;
3068 case MEP_OPERAND_NPC :
3069 break;
3070 case MEP_OPERAND_OPT :
3071 break;
3072 case MEP_OPERAND_PCABS24A2 :
3073 fields->f_24u5a2n = value;
3074 break;
3075 case MEP_OPERAND_PCREL12A2 :
3076 fields->f_12s4a2 = value;
3077 break;
3078 case MEP_OPERAND_PCREL17A2 :
3079 fields->f_17s16a2 = value;
3080 break;
3081 case MEP_OPERAND_PCREL24A2 :
3082 fields->f_24s5a2n = value;
3083 break;
3084 case MEP_OPERAND_PCREL8A2 :
3085 fields->f_8s8a2 = value;
3086 break;
3087 case MEP_OPERAND_PSW :
3088 break;
3089 case MEP_OPERAND_R0 :
3090 break;
3091 case MEP_OPERAND_R1 :
3092 break;
3093 case MEP_OPERAND_RL :
3094 fields->f_rl = value;
3095 break;
3096 case MEP_OPERAND_RL5 :
3097 fields->f_rl5 = value;
3098 break;
3099 case MEP_OPERAND_RM :
3100 fields->f_rm = value;
3101 break;
3102 case MEP_OPERAND_RMA :
3103 fields->f_rm = value;
3104 break;
3105 case MEP_OPERAND_RN :
3106 fields->f_rn = value;
3107 break;
3108 case MEP_OPERAND_RN3 :
3109 fields->f_rn3 = value;
3110 break;
3111 case MEP_OPERAND_RN3C :
3112 fields->f_rn3 = value;
3113 break;
3114 case MEP_OPERAND_RN3L :
3115 fields->f_rn3 = value;
3116 break;
3117 case MEP_OPERAND_RN3S :
3118 fields->f_rn3 = value;
3119 break;
3120 case MEP_OPERAND_RN3UC :
3121 fields->f_rn3 = value;
3122 break;
3123 case MEP_OPERAND_RN3UL :
3124 fields->f_rn3 = value;
3125 break;
3126 case MEP_OPERAND_RN3US :
3127 fields->f_rn3 = value;
3128 break;
3129 case MEP_OPERAND_RNC :
3130 fields->f_rn = value;
3131 break;
3132 case MEP_OPERAND_RNL :
3133 fields->f_rn = value;
3134 break;
3135 case MEP_OPERAND_RNS :
3136 fields->f_rn = value;
3137 break;
3138 case MEP_OPERAND_RNUC :
3139 fields->f_rn = value;
3140 break;
3141 case MEP_OPERAND_RNUL :
3142 fields->f_rn = value;
3143 break;
3144 case MEP_OPERAND_RNUS :
3145 fields->f_rn = value;
3146 break;
3147 case MEP_OPERAND_SAR :
3148 break;
3149 case MEP_OPERAND_SDISP16 :
3150 fields->f_16s16 = value;
3151 break;
3152 case MEP_OPERAND_SIMM16 :
3153 fields->f_16s16 = value;
3154 break;
3155 case MEP_OPERAND_SIMM16P0 :
3156 fields->f_ivc2_simm16p0 = value;
3157 break;
3158 case MEP_OPERAND_SIMM6 :
3159 fields->f_6s8 = value;
3160 break;
3161 case MEP_OPERAND_SIMM8 :
3162 fields->f_8s8 = value;
3163 break;
3164 case MEP_OPERAND_SIMM8P0 :
3165 fields->f_ivc2_8s0 = value;
3166 break;
3167 case MEP_OPERAND_SIMM8P20 :
3168 fields->f_ivc2_8s20 = value;
3169 break;
3170 case MEP_OPERAND_SIMM8P4 :
3171 fields->f_ivc2_8s4 = value;
3172 break;
3173 case MEP_OPERAND_SP :
3174 break;
3175 case MEP_OPERAND_SPR :
3176 break;
3177 case MEP_OPERAND_TP :
3178 break;
3179 case MEP_OPERAND_TPR :
3180 break;
3181 case MEP_OPERAND_UDISP2 :
3182 fields->f_2u6 = value;
3183 break;
3184 case MEP_OPERAND_UDISP7 :
3185 fields->f_7u9 = value;
3186 break;
3187 case MEP_OPERAND_UDISP7A2 :
3188 fields->f_7u9a2 = value;
3189 break;
3190 case MEP_OPERAND_UDISP7A4 :
3191 fields->f_7u9a4 = value;
3192 break;
3193 case MEP_OPERAND_UIMM16 :
3194 fields->f_16u16 = value;
3195 break;
3196 case MEP_OPERAND_UIMM2 :
3197 fields->f_2u10 = value;
3198 break;
3199 case MEP_OPERAND_UIMM24 :
3200 fields->f_24u8n = value;
3201 break;
3202 case MEP_OPERAND_UIMM3 :
3203 fields->f_3u5 = value;
3204 break;
3205 case MEP_OPERAND_UIMM4 :
3206 fields->f_4u8 = value;
3207 break;
3208 case MEP_OPERAND_UIMM5 :
3209 fields->f_5u8 = value;
3210 break;
3211 case MEP_OPERAND_UIMM7A4 :
3212 fields->f_7u9a4 = value;
3213 break;
3214 case MEP_OPERAND_ZERO :
3215 break;
3216
3217 default :
3218 /* xgettext:c-format */
3219 fprintf (stderr, _("Unrecognized field %d while setting vma operand.\n"),
3220 opindex);
3221 abort ();
3222 }
3223 }
3224
3225 /* Function to call before using the instruction builder tables. */
3226
3227 void
3228 mep_cgen_init_ibld_table (CGEN_CPU_DESC cd)
3229 {
3230 cd->insert_handlers = & mep_cgen_insert_handlers[0];
3231 cd->extract_handlers = & mep_cgen_extract_handlers[0];
3232
3233 cd->insert_operand = mep_cgen_insert_operand;
3234 cd->extract_operand = mep_cgen_extract_operand;
3235
3236 cd->get_int_operand = mep_cgen_get_int_operand;
3237 cd->set_int_operand = mep_cgen_set_int_operand;
3238 cd->get_vma_operand = mep_cgen_get_vma_operand;
3239 cd->set_vma_operand = mep_cgen_set_vma_operand;
3240 }
This page took 0.1039 seconds and 4 git commands to generate.