Add support for V850E3V5 architecture
[deliverable/binutils-gdb.git] / opcodes / v850-opc.c
1 /* Assemble V850 instructions.
2 Copyright 1996-2013 Free Software Foundation, Inc.
3
4 This file is part of the GNU opcodes library.
5
6 This library is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
10
11 It is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14 License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
20
21 #include "sysdep.h"
22 #include <stdio.h>
23 #include "opcode/v850.h"
24 #include "bfd.h"
25 #include "opintl.h"
26
27 /* Regular opcodes. */
28 #define OP(x) ((x & 0x3f) << 5)
29 #define OP_MASK OP (0x3f)
30
31 /* Conditional branch opcodes (Format III). */
32 #define BOP(x) ((0x58 << 4) | (x & 0x0f))
33 #define BOP_MASK ((0x78 << 4) | 0x0f)
34
35 /* Conditional branch opcodes (Format VII). */
36 #define BOP7(x) (0x107e0 | (x & 0xf))
37 #define BOP7_MASK (0x1ffe0 | 0xf)
38
39 /* One-word opcodes. */
40 #define one(x) ((unsigned int) (x))
41
42 /* Two-word opcodes. */
43 #define two(x,y) ((unsigned int) (x) | ((unsigned int) (y) << 16))
44
45 \f
46 /* The functions used to insert and extract complicated operands. */
47
48 /* Note: There is a conspiracy between these functions and
49 v850_insert_operand() in gas/config/tc-v850.c. Error messages
50 containing the string 'out of range' will be ignored unless a
51 specific command line option is given to GAS. */
52
53 static const char * not_valid = N_ ("displacement value is not in range and is not aligned");
54 static const char * out_of_range = N_ ("displacement value is out of range");
55 static const char * not_aligned = N_ ("displacement value is not aligned");
56
57 static const char * immediate_out_of_range = N_ ("immediate value is out of range");
58 static const char * branch_out_of_range = N_ ("branch value out of range");
59 static const char * branch_out_of_range_and_odd_offset = N_ ("branch value not in range and to odd offset");
60 static const char * branch_to_odd_offset = N_ ("branch to odd offset");
61 static const char * pos_out_of_range = N_ ("position value is out of range");
62 static const char * width_out_of_range = N_ ("width value is out of range");
63 static const char * selid_out_of_range = N_ ("SelID is out of range");
64 static const char * vector8_out_of_range = N_ ("vector8 is out of range");
65 static const char * vector5_out_of_range = N_ ("vector5 is out of range");
66 static const char * imm10_out_of_range = N_ ("imm10 is out of range");
67 static const char * sr_selid_out_of_range = N_ ("SR/SelID is out of range");
68
69 int
70 v850_msg_is_out_of_range (const char* msg)
71 {
72 return msg == out_of_range
73 || msg == immediate_out_of_range
74 || msg == branch_out_of_range;
75 }
76
77 static unsigned long
78 insert_i5div1 (unsigned long insn, long value, const char ** errmsg)
79 {
80 if (value > 30 || value < 2)
81 {
82 if (value & 1)
83 * errmsg = _(not_valid);
84 else
85 * errmsg = _(out_of_range);
86 }
87 else if (value & 1)
88 * errmsg = _(not_aligned);
89
90 value = (32 - value)/2;
91
92 return (insn | ((value << (2+16)) & 0x3c0000));
93 }
94
95 static unsigned long
96 extract_i5div1 (unsigned long insn, int * invalid)
97 {
98 unsigned long ret = (insn & 0x003c0000) >> (16+2);
99 ret = 32 - (ret * 2);
100
101 if (invalid != 0)
102 *invalid = (ret > 30 || ret < 2) ? 1 : 0;
103 return ret;
104 }
105
106 static unsigned long
107 insert_i5div2 (unsigned long insn, long value, const char ** errmsg)
108 {
109 if (value > 30 || value < 4)
110 {
111 if (value & 1)
112 * errmsg = _(not_valid);
113 else
114 * errmsg = _(out_of_range);
115 }
116 else if (value & 1)
117 * errmsg = _(not_aligned);
118
119 value = (32 - value)/2;
120
121 return insn | ((value << (2 + 16)) & 0x3c0000);
122 }
123
124 static unsigned long
125 extract_i5div2 (unsigned long insn, int * invalid)
126 {
127 unsigned long ret = (insn & 0x003c0000) >> (16+2);
128 ret = 32 - (ret * 2);
129
130 if (invalid != 0)
131 *invalid = (ret > 30 || ret < 4) ? 1 : 0;
132 return ret;
133 }
134
135 static unsigned long
136 insert_i5div3 (unsigned long insn, long value, const char ** errmsg)
137 {
138 if (value > 32 || value < 2)
139 {
140 if (value & 1)
141 * errmsg = _(not_valid);
142 else
143 * errmsg = _(out_of_range);
144 }
145 else if (value & 1)
146 * errmsg = _(not_aligned);
147
148 value = (32 - value)/2;
149
150 return insn | ((value << (2+16)) & 0x3c0000);
151 }
152
153 static unsigned long
154 extract_i5div3 (unsigned long insn, int * invalid)
155 {
156 unsigned long ret = (insn & 0x003c0000) >> (16+2);
157 ret = 32 - (ret * 2);
158
159 if (invalid != 0)
160 *invalid = (ret > 32 || ret < 2) ? 1 : 0;
161 return ret;
162 }
163
164 static unsigned long
165 insert_d5_4 (unsigned long insn, long value, const char ** errmsg)
166 {
167 if (value > 0x1f || value < 0)
168 {
169 if (value & 1)
170 * errmsg = _(not_valid);
171 else
172 * errmsg = _(out_of_range);
173 }
174 else if (value & 1)
175 * errmsg = _(not_aligned);
176
177 value >>= 1;
178
179 return insn | (value & 0x0f);
180 }
181
182 static unsigned long
183 extract_d5_4 (unsigned long insn, int * invalid)
184 {
185 unsigned long ret = (insn & 0x0f);
186
187 ret <<= 1;
188
189 if (invalid != 0)
190 *invalid = 0;
191 return ret;
192 }
193
194 static unsigned long
195 insert_d8_6 (unsigned long insn, long value, const char ** errmsg)
196 {
197 if (value > 0xff || value < 0)
198 {
199 if ((value % 4) != 0)
200 * errmsg = _(not_valid);
201 else
202 * errmsg = _(out_of_range);
203 }
204 else if ((value % 4) != 0)
205 * errmsg = _(not_aligned);
206
207 value >>= 1;
208
209 return insn | (value & 0x7e);
210 }
211
212 static unsigned long
213 extract_d8_6 (unsigned long insn, int * invalid)
214 {
215 unsigned long ret = (insn & 0x7e);
216
217 ret <<= 1;
218
219 if (invalid != 0)
220 *invalid = 0;
221 return ret;
222 }
223
224 static unsigned long
225 insert_d8_7 (unsigned long insn, long value, const char ** errmsg)
226 {
227 if (value > 0xff || value < 0)
228 {
229 if ((value % 2) != 0)
230 * errmsg = _(not_valid);
231 else
232 * errmsg = _(out_of_range);
233 }
234 else if ((value % 2) != 0)
235 * errmsg = _(not_aligned);
236
237 value >>= 1;
238
239 return insn | (value & 0x7f);
240 }
241
242 static unsigned long
243 extract_d8_7 (unsigned long insn, int * invalid)
244 {
245 unsigned long ret = (insn & 0x7f);
246
247 ret <<= 1;
248
249 if (invalid != 0)
250 *invalid = 0;
251 return ret;
252 }
253
254 static unsigned long
255 insert_v8 (unsigned long insn, long value, const char ** errmsg)
256 {
257 if (value > 0xff || value < 0)
258 * errmsg = _(immediate_out_of_range);
259
260 return insn | (value & 0x1f) | ((value & 0xe0) << (27-5));
261 }
262
263 static unsigned long
264 extract_v8 (unsigned long insn, int * invalid)
265 {
266 unsigned long ret = (insn & 0x1f) | ((insn >> (27-5)) & 0xe0);
267
268 if (invalid != 0)
269 *invalid = 0;
270 return ret;
271 }
272
273 static unsigned long
274 insert_d9 (unsigned long insn, long value, const char ** errmsg)
275 {
276 if (value > 0xff || value < -0x100)
277 {
278 if ((value % 2) != 0)
279 * errmsg = branch_out_of_range_and_odd_offset;
280 else
281 * errmsg = branch_out_of_range;
282 }
283 else if ((value % 2) != 0)
284 * errmsg = branch_to_odd_offset;
285
286 return insn | ((value & 0x1f0) << 7) | ((value & 0x0e) << 3);
287 }
288
289 static unsigned long
290 extract_d9 (unsigned long insn, int * invalid)
291 {
292 signed long ret = ((insn >> 7) & 0x1f0) | ((insn >> 3) & 0x0e);
293
294 ret = (ret ^ 0x100) - 0x100;
295
296 if (invalid != 0)
297 *invalid = 0;
298 return ret;
299 }
300
301 static unsigned long
302 insert_u16_loop (unsigned long insn, long value, const char ** errmsg)
303 {
304 if (value < -0xffff || value > 0)
305 {
306 if ((value % 2) != 0)
307 * errmsg = branch_out_of_range_and_odd_offset;
308 else
309 * errmsg = branch_out_of_range;
310 }
311 else if ((value % 2) != 0)
312 * errmsg = branch_to_odd_offset;
313
314 return insn | ((-value & 0xfffe) << 16);
315 }
316
317 static unsigned long
318 extract_u16_loop (unsigned long insn, int * invalid)
319 {
320 long ret = (insn >> 16) & 0xfffe;
321 ret = -ret;
322
323 if (invalid != 0)
324 *invalid = 0;
325 return ret;
326 }
327
328 static unsigned long
329 insert_d16_15 (unsigned long insn, long value, const char ** errmsg)
330 {
331 if (value > 0x7fff || value < -0x8000)
332 {
333 if ((value % 2) != 0)
334 * errmsg = _(not_valid);
335 else
336 * errmsg = _(out_of_range);
337 }
338 else if ((value % 2) != 0)
339 * errmsg = _(not_aligned);
340
341 return insn | ((value & 0xfffe) << 16);
342 }
343
344 static unsigned long
345 extract_d16_15 (unsigned long insn, int * invalid)
346 {
347 signed long ret = (insn >> 16) & 0xfffe;
348
349 ret = (ret ^ 0x8000) - 0x8000;
350
351 if (invalid != 0)
352 *invalid = 0;
353 return ret;
354 }
355
356 static unsigned long
357 insert_d16_16 (unsigned long insn, signed long value, const char ** errmsg)
358 {
359 if (value > 0x7fff || value < -0x8000)
360 * errmsg = _(out_of_range);
361
362 return insn | ((value & 0xfffe) << 16) | ((value & 1) << 5);
363 }
364
365 static unsigned long
366 extract_d16_16 (unsigned long insn, int * invalid)
367 {
368 signed long ret = ((insn >> 16) & 0xfffe) | ((insn >> 5) & 1);
369
370 ret = (ret ^ 0x8000) - 0x8000;
371
372 if (invalid != 0)
373 *invalid = 0;
374 return ret;
375 }
376
377 static unsigned long
378 insert_d17_16 (unsigned long insn, long value, const char ** errmsg)
379 {
380 if (value > 0xffff || value < -0x10000)
381 * errmsg = _(out_of_range);
382
383 return insn | ((value & 0xfffe) << 16) | ((value & 0x10000) >> (16 - 4));
384 }
385
386 static unsigned long
387 extract_d17_16 (unsigned long insn, int * invalid)
388 {
389 signed long ret = ((insn >> 16) & 0xfffe) | ((insn << (16 - 4)) & 0x10000);
390
391 ret = (ret ^ 0x10000) - 0x10000;
392
393 if (invalid != 0)
394 *invalid = 0;
395 return (unsigned long)ret;
396 }
397
398 static unsigned long
399 insert_d22 (unsigned long insn, long value, const char ** errmsg)
400 {
401 if (value > 0x1fffff || value < -0x200000)
402 {
403 if ((value % 2) != 0)
404 * errmsg = branch_out_of_range_and_odd_offset;
405 else
406 * errmsg = branch_out_of_range;
407 }
408 else if ((value % 2) != 0)
409 * errmsg = branch_to_odd_offset;
410
411 return insn | ((value & 0xfffe) << 16) | ((value & 0x3f0000) >> 16);
412 }
413
414 static unsigned long
415 extract_d22 (unsigned long insn, int * invalid)
416 {
417 signed long ret = ((insn >> 16) & 0xfffe) | ((insn << 16) & 0x3f0000);
418
419 ret = (ret ^ 0x200000) - 0x200000;
420
421 if (invalid != 0)
422 *invalid = 0;
423 return (unsigned long) ret;
424 }
425
426 static unsigned long
427 insert_d23 (unsigned long insn, long value, const char ** errmsg)
428 {
429 if (value > 0x3fffff || value < -0x400000)
430 * errmsg = out_of_range;
431
432 return insn | ((value & 0x7f) << 4) | ((value & 0x7fff80) << (16-7));
433 }
434
435 static unsigned long
436 insert_d23_align1 (unsigned long insn, long value, const char ** errmsg)
437 {
438 if (value > 0x3fffff || value < -0x400000)
439 {
440 if (value & 0x1)
441 * errmsg = _(not_valid);
442 else
443 * errmsg = _(out_of_range);
444 }
445 else if (value & 0x1)
446 * errmsg = _(not_aligned);
447
448 return insn | ((value & 0x7e) << 4) | ((value & 0x7fff80) << (16 - 7));
449 }
450
451 static unsigned long
452 extract_d23 (unsigned long insn, int * invalid)
453 {
454 signed long ret = ((insn >> 4) & 0x7f) | ((insn >> (16-7)) & 0x7fff80);
455
456 ret = (ret ^ 0x400000) - 0x400000;
457
458 if (invalid != 0)
459 *invalid = 0;
460 return (unsigned long) ret;
461 }
462
463 static unsigned long
464 insert_i9 (unsigned long insn, signed long value, const char ** errmsg)
465 {
466 if (value > 0xff || value < -0x100)
467 * errmsg = _(immediate_out_of_range);
468
469 return insn | ((value & 0x1e0) << 13) | (value & 0x1f);
470 }
471
472 static unsigned long
473 extract_i9 (unsigned long insn, int * invalid)
474 {
475 signed long ret = ((insn >> 13) & 0x1e0) | (insn & 0x1f);
476
477 ret = (ret ^ 0x100) - 0x100;
478
479 if (invalid != 0)
480 *invalid = 0;
481 return ret;
482 }
483
484 static unsigned long
485 insert_u9 (unsigned long insn, long v, const char ** errmsg)
486 {
487 unsigned long value = (unsigned long) v;
488
489 if (value > 0x1ff)
490 * errmsg = _(immediate_out_of_range);
491
492 return insn | ((value & 0x1e0) << 13) | (value & 0x1f);
493 }
494
495 static unsigned long
496 extract_u9 (unsigned long insn, int * invalid)
497 {
498 unsigned long ret = ((insn >> 13) & 0x1e0) | (insn & 0x1f);
499
500 if (invalid != 0)
501 *invalid = 0;
502 return ret;
503 }
504
505 static unsigned long
506 insert_spe (unsigned long insn, long v, const char ** errmsg)
507 {
508 unsigned long value = (unsigned long) v;
509
510 if (value != 3)
511 * errmsg = _("invalid register for stack adjustment");
512
513 return insn & ~0x180000;
514 }
515
516 static unsigned long
517 extract_spe (unsigned long insn ATTRIBUTE_UNUSED, int * invalid)
518 {
519 if (invalid != 0)
520 *invalid = 0;
521
522 return 3;
523 }
524
525 static unsigned long
526 insert_r4 (unsigned long insn, long v, const char ** errmsg)
527 {
528 unsigned long value = (unsigned long) v;
529
530 if (value >= 32)
531 * errmsg = _("invalid register name");
532
533 return insn | ((value & 0x01) << 23) | ((value & 0x1e) << 16);
534 }
535
536 static unsigned long
537 extract_r4 (unsigned long insn, int * invalid)
538 {
539 unsigned long r4;
540 unsigned long insn2;
541
542 insn2 = insn >> 16;
543 r4 = (((insn2 & 0x0080) >> 7) | (insn2 & 0x001e));
544
545 if (invalid != 0)
546 *invalid = 0;
547
548 return r4;
549 }
550
551 static unsigned long G_pos;
552
553 static unsigned long
554 insert_POS (unsigned long insn, long pos, const char ** errmsg)
555 {
556 if (pos > 0x1f || pos < 0)
557 * errmsg = _(pos_out_of_range);
558
559 G_pos = (unsigned long) pos;
560
561 return insn; /* Not an oparaton until WIDTH. */
562 }
563
564 static unsigned long
565 extract_POS_U (unsigned long insn, int * invalid)
566 {
567 unsigned long pos,lsb;
568 unsigned long insn2;
569 insn2 = insn >> 16;
570
571 lsb = ((insn2 & 0x0800) >> 8)
572 | ((insn2 & 0x000e) >> 1);
573 lsb += 16;
574 pos = lsb;
575
576 if (invalid != 0)
577 *invalid = 0;
578
579 return pos;
580 }
581
582 static unsigned long
583 extract_POS_L (unsigned long insn, int * invalid)
584 {
585 unsigned long pos,lsb;
586 unsigned long insn2;
587 insn2 = insn >> 16;
588
589 lsb = ((insn2 & 0x0800) >> 8)
590 | ((insn2 & 0x000e) >> 1);
591 pos = lsb;
592
593 if (invalid != 0)
594 *invalid = 0;
595
596 return pos;
597 }
598
599 static unsigned long
600 insert_WIDTH (unsigned long insn, long width, const char ** errmsg)
601 {
602 unsigned long msb, lsb, opc, ret;
603 unsigned long msb_expand, lsb_expand;
604
605 msb = (unsigned long)width + G_pos - 1;
606 lsb = G_pos;
607 opc = 0;
608 G_pos = 0;
609
610 if (width > 0x20 || width < 0)
611 * errmsg = _(width_out_of_range);
612
613 if ((msb >= 16) && (lsb >= 16))
614 opc = 0x0090;
615 else if ((msb >= 16) && (lsb < 16))
616 opc = 0x00b0;
617 else if ((msb < 16) && (lsb < 16))
618 opc = 0x00d0;
619 else
620 * errmsg = _(width_out_of_range);
621
622 msb &= 0x0f;
623 msb_expand = msb << 12;
624 lsb &= 0x0f;
625 lsb_expand = ((lsb & 0x8) << 8)|((lsb & 0x7) << 1);
626
627 ret = (insn & 0x0000ffff) | ((opc | msb_expand | lsb_expand) << 16);
628
629 return ret;
630 }
631
632 static unsigned long
633 extract_WIDTH_U (unsigned long insn, int * invalid)
634 {
635 unsigned long width, msb, lsb;
636 unsigned long insn2;
637 insn2 = insn >> 16;
638
639 msb = ((insn2 & 0xf000) >> 12);
640 msb += 16;
641 lsb = ((insn2 & 0x0800) >> 8)
642 | ((insn2 & 0x000e) >> 1);
643 lsb += 16;
644
645 if (invalid != 0)
646 *invalid = 0;
647
648 width = msb - lsb + 1;
649
650 return width;
651 }
652
653 static unsigned long
654 extract_WIDTH_M (unsigned long insn, int * invalid)
655 {
656 unsigned long width, msb, lsb;
657 unsigned long insn2;
658 insn2 = insn >> 16;
659
660 msb = ((insn2 & 0xf000) >> 12) ;
661 msb += 16;
662 lsb = ((insn2 & 0x0800) >> 8)
663 | ((insn2 & 0x000e) >> 1);
664
665 if (invalid != 0)
666 *invalid = 0;
667
668 width = msb - lsb + 1;
669
670 return width;
671 }
672
673 static unsigned long
674 extract_WIDTH_L (unsigned long insn, int * invalid)
675 {
676 unsigned long width, msb, lsb;
677 unsigned long insn2;
678 insn2 = insn >> 16;
679
680 msb = ((insn2 & 0xf000) >> 12) ;
681 lsb = ((insn2 & 0x0800) >> 8)
682 | ((insn2 & 0x000e) >> 1);
683
684 if (invalid != 0)
685 *invalid = 0;
686
687 width = msb - lsb + 1;
688
689 return width;
690 }
691
692 static unsigned long
693 insert_SELID (unsigned long insn, long selid, const char ** errmsg)
694 {
695 unsigned long ret;
696
697 if (selid > 0x1f || selid < 0)
698 * errmsg = _(selid_out_of_range);
699
700 ret = (insn | ((selid & 0x1f) << 27));
701
702 return ret;
703 }
704
705 static unsigned long
706 extract_SELID (unsigned long insn, int * invalid)
707 {
708 unsigned long selid;
709 unsigned long insn2;
710
711 insn2 = insn >> 16;
712
713 selid = ((insn2 & 0xf800) >> 11);
714
715 if (invalid != 0)
716 *invalid = 0;
717
718 return selid;
719 }
720
721 static unsigned long
722 insert_VECTOR8 (unsigned long insn, long vector8, const char ** errmsg)
723 {
724 unsigned long ret;
725 unsigned long VVV,vvvvv;
726
727 if (vector8 > 0xff || vector8 < 0)
728 * errmsg = _(vector8_out_of_range);
729
730 VVV = (vector8 & 0xe0) >> 5;
731 vvvvv = (vector8 & 0x1f);
732
733 ret = (insn | (VVV << 27) | vvvvv);
734
735 return ret;
736 }
737
738 static unsigned long
739 extract_VECTOR8 (unsigned long insn, int * invalid)
740 {
741 unsigned long vector8;
742 unsigned long VVV,vvvvv;
743 unsigned long insn2;
744
745 insn2 = insn >> 16;
746 VVV = ((insn2 & 0x3800) >> 11);
747 vvvvv = (insn & 0x001f);
748 vector8 = VVV << 5 | vvvvv;
749
750 if (invalid != 0)
751 *invalid = 0;
752
753 return vector8;
754 }
755
756 static unsigned long
757 insert_VECTOR5 (unsigned long insn, long vector5, const char ** errmsg)
758 {
759 unsigned long ret;
760 unsigned long vvvvv;
761
762 if (vector5 > 0x1f || vector5 < 0)
763 * errmsg = _(vector5_out_of_range);
764
765 vvvvv = (vector5 & 0x1f);
766
767 ret = (insn | vvvvv);
768
769 return ret;
770 }
771
772 static unsigned long
773 extract_VECTOR5 (unsigned long insn, int * invalid)
774 {
775 unsigned long vector5;
776
777 vector5 = (insn & 0x001f);
778
779 if (invalid != 0)
780 *invalid = 0;
781
782 return vector5;
783 }
784
785 static unsigned long
786 insert_CACHEOP (unsigned long insn, long cacheop, const char ** errmsg ATTRIBUTE_UNUSED)
787 {
788 unsigned long ret;
789 unsigned long pp,PPPPP;
790
791 pp = (cacheop & 0x60) >> 5;
792 PPPPP = (cacheop & 0x1f);
793
794 ret = insn | (pp << 11) | (PPPPP << 27);
795
796 return ret;
797 }
798
799 static unsigned long
800 extract_CACHEOP (unsigned long insn, int * invalid)
801 {
802 unsigned long ret;
803 unsigned long pp,PPPPP;
804 unsigned long insn2;
805
806 insn2 = insn >> 16;
807
808 PPPPP = ((insn2 & 0xf800) >> 11);
809 pp = ((insn & 0x1800) >> 11);
810
811 ret = (pp << 5) | PPPPP;
812
813 if (invalid != 0)
814 *invalid = 0;
815
816 return ret;
817 }
818
819 static unsigned long
820 insert_PREFOP (unsigned long insn, long prefop, const char ** errmsg ATTRIBUTE_UNUSED)
821 {
822 unsigned long ret;
823 unsigned long PPPPP;
824
825 PPPPP = (prefop & 0x1f);
826
827 ret = insn | (PPPPP << 27);
828
829 return ret;
830 }
831
832 static unsigned long
833 extract_PREFOP (unsigned long insn, int * invalid)
834 {
835 unsigned long ret;
836 unsigned long PPPPP;
837 unsigned long insn2;
838
839 insn2 = insn >> 16;
840
841 PPPPP = (insn2 & 0xf800) >> 11;
842
843 ret = PPPPP;
844
845 if (invalid != 0)
846 *invalid = 0;
847
848 return ret;
849 }
850
851 static unsigned long
852 insert_IMM10U (unsigned long insn, long value, const char ** errmsg)
853 {
854 unsigned long imm10, ret;
855 unsigned long iiiii,IIIII;
856
857 if (value > 0x3ff || value < 0)
858 * errmsg = _(imm10_out_of_range);
859
860 imm10 = ((unsigned long) value) & 0x3ff;
861 IIIII = (imm10 >> 5) & 0x1f;
862 iiiii = imm10 & 0x1f;
863
864 ret = insn | IIIII << 27 | iiiii;
865
866 return ret;
867 }
868
869 static unsigned long
870 extract_IMM10U (unsigned long insn, int * invalid)
871 {
872 unsigned long ret;
873 unsigned long iiiii,IIIII;
874 unsigned long insn2;
875 insn2 = insn >> 16;
876
877 IIIII = ((insn2 & 0xf800) >> 11);
878 iiiii = (insn & 0x001f);
879
880 ret = (IIIII << 5) | iiiii;
881
882 if (invalid != 0)
883 *invalid = 0;
884
885 return ret;
886 }
887
888 static unsigned long
889 insert_SRSEL1 (unsigned long insn, long value, const char ** errmsg)
890 {
891 unsigned long imm10, ret;
892 unsigned long sr,selid;
893
894 if (value > 0x3ff || value < 0)
895 * errmsg = _(sr_selid_out_of_range);
896
897 imm10 = (unsigned long) value;
898 selid = (imm10 & 0x3e0) >> 5;
899 sr = imm10 & 0x1f;
900
901 ret = insn | selid << 27 | sr;
902
903 return ret;
904 }
905
906 static unsigned long
907 extract_SRSEL1 (unsigned long insn, int * invalid)
908 {
909 unsigned long ret;
910 unsigned long sr, selid;
911 unsigned long insn2;
912
913 insn2 = insn >> 16;
914
915 selid = ((insn2 & 0xf800) >> 11);
916 sr = (insn & 0x001f);
917
918 ret = (selid << 5) | sr;
919
920 if (invalid != 0)
921 *invalid = 0;
922
923 return ret;
924 }
925
926 static unsigned long
927 insert_SRSEL2 (unsigned long insn, long value, const char ** errmsg)
928 {
929 unsigned long imm10, ret;
930 unsigned long sr, selid;
931
932 if (value > 0x3ff || value < 0)
933 * errmsg = _(sr_selid_out_of_range);
934
935 imm10 = (unsigned long) value;
936 selid = (imm10 & 0x3e0) >> 5;
937 sr = imm10 & 0x1f;
938
939 ret = insn | selid << 27 | sr << 11;
940
941 return ret;
942 }
943
944 static unsigned long
945 extract_SRSEL2 (unsigned long insn, int * invalid)
946 {
947 unsigned long ret;
948 unsigned long sr, selid;
949 unsigned long insn2;
950
951 insn2 = insn >> 16;
952
953 selid = ((insn2 & 0xf800) >> 11);
954 sr = ((insn & 0xf800) >> 11);
955
956 ret = (selid << 5) | sr;
957
958 if (invalid != 0)
959 *invalid = 0;
960
961 return ret;
962 }
963 \f
964 /* Warning: code in gas/config/tc-v850.c examines the contents of this array.
965 If you change any of the values here, be sure to look for side effects in
966 that code. */
967 const struct v850_operand v850_operands[] =
968 {
969 #define UNUSED 0
970 { 0, 0, NULL, NULL, 0, BFD_RELOC_NONE },
971
972 /* The R1 field in a format 1, 6, 7, 9, C insn. */
973 #define R1 (UNUSED + 1)
974 { 5, 0, NULL, NULL, V850_OPERAND_REG, BFD_RELOC_NONE },
975
976 /* As above, but register 0 is not allowed. */
977 #define R1_NOTR0 (R1 + 1)
978 { 5, 0, NULL, NULL, V850_OPERAND_REG | V850_NOT_R0, BFD_RELOC_NONE },
979
980 /* Even register is allowed. */
981 #define R1_EVEN (R1_NOTR0 + 1)
982 { 4, 1, NULL, NULL, V850_OPERAND_REG | V850_REG_EVEN, BFD_RELOC_NONE },
983
984 /* Bang (bit reverse). */
985 #define R1_BANG (R1_EVEN + 1)
986 { 5, 0, NULL, NULL, V850_OPERAND_REG | V850_OPERAND_BANG, BFD_RELOC_NONE },
987
988 /* Percent (modulo). */
989 #define R1_PERCENT (R1_BANG + 1)
990 { 5, 0, NULL, NULL, V850_OPERAND_REG | V850_OPERAND_PERCENT, BFD_RELOC_NONE },
991
992 /* The R2 field in a format 1, 2, 4, 5, 6, 7, 9, C insn. */
993 #define R2 (R1_PERCENT + 1)
994 { 5, 11, NULL, NULL, V850_OPERAND_REG, BFD_RELOC_NONE },
995
996 /* As above, but register 0 is not allowed. */
997 #define R2_NOTR0 (R2 + 1)
998 { 5, 11, NULL, NULL, V850_OPERAND_REG | V850_NOT_R0, BFD_RELOC_NONE },
999
1000 /* Even register is allowed. */
1001 #define R2_EVEN (R2_NOTR0 + 1)
1002 { 4, 12, NULL, NULL, V850_OPERAND_REG | V850_REG_EVEN, BFD_RELOC_NONE },
1003
1004 /* Reg2 in dispose instruction. */
1005 #define R2_DISPOSE (R2_EVEN + 1)
1006 { 5, 16, NULL, NULL, V850_OPERAND_REG | V850_NOT_R0, BFD_RELOC_NONE },
1007
1008 /* The R3 field in a format 11, 12, C insn. */
1009 #define R3 (R2_DISPOSE + 1)
1010 { 5, 27, NULL, NULL, V850_OPERAND_REG, BFD_RELOC_NONE },
1011
1012 /* As above, but register 0 is not allowed. */
1013 #define R3_NOTR0 (R3 + 1)
1014 { 5, 27, NULL, NULL, V850_OPERAND_REG | V850_NOT_R0, BFD_RELOC_NONE },
1015
1016 /* As above, but odd number registers are not allowed. */
1017 #define R3_EVEN (R3_NOTR0 + 1)
1018 { 4, 28, NULL, NULL, V850_OPERAND_REG | V850_REG_EVEN, BFD_RELOC_NONE },
1019
1020 /* As above, but register 0 is not allowed. */
1021 #define R3_EVEN_NOTR0 (R3_EVEN + 1)
1022 { 4, 28, NULL, NULL, V850_OPERAND_REG | V850_REG_EVEN | V850_NOT_R0, BFD_RELOC_NONE },
1023
1024 /* Forth register in FPU Instruction. */
1025 #define R4 (R3_EVEN_NOTR0 + 1)
1026 { 5, 0, insert_r4, extract_r4, V850_OPERAND_REG, BFD_RELOC_NONE },
1027
1028 /* As above, but odd number registers are not allowed. */
1029 #define R4_EVEN (R4 + 1)
1030 { 4, 17, NULL, NULL, V850_OPERAND_REG | V850_REG_EVEN, BFD_RELOC_NONE },
1031
1032 /* Stack pointer in prepare instruction. */
1033 #define SP (R4_EVEN + 1)
1034 { 2, 0, insert_spe, extract_spe, V850_OPERAND_REG, BFD_RELOC_NONE },
1035
1036 /* EP Register. */
1037 #define EP (SP + 1)
1038 { 0, 0, NULL, NULL, V850_OPERAND_EP, BFD_RELOC_NONE },
1039
1040 /* A list of registers in a prepare/dispose instruction. */
1041 #define LIST12 (EP + 1)
1042 { -1, 0xffe00001, NULL, NULL, V850E_OPERAND_REG_LIST, BFD_RELOC_NONE },
1043
1044 /* System register operands. */
1045 #define OLDSR1 (LIST12 + 1)
1046 { 5, 0, NULL, NULL, V850_OPERAND_SRG, BFD_RELOC_NONE },
1047
1048 #define SR1 (OLDSR1 + 1)
1049 { 0, 0, insert_SRSEL1, extract_SRSEL1, V850_OPERAND_SRG, BFD_RELOC_NONE },
1050
1051 /* The R2 field as a system register. */
1052 #define OLDSR2 (SR1 + 1)
1053 { 5, 11, NULL, NULL, V850_OPERAND_SRG, BFD_RELOC_NONE },
1054
1055 #define SR2 (OLDSR2 + 1)
1056 { 0, 0, insert_SRSEL2, extract_SRSEL2, V850_OPERAND_SRG, BFD_RELOC_NONE },
1057
1058 /* FPU CC bit position. */
1059 #define FFF (SR2 + 1)
1060 { 3, 17, NULL, NULL, 0, BFD_RELOC_NONE },
1061
1062 /* The 4 bit condition code in a setf instruction. */
1063 #define CCCC (FFF + 1)
1064 { 4, 0, NULL, NULL, V850_OPERAND_CC, BFD_RELOC_NONE },
1065
1066 /* Condition code in adf,sdf. */
1067 #define CCCC_NOTSA (CCCC + 1)
1068 { 4, 17, NULL, NULL, V850_OPERAND_CC|V850_NOT_SA, BFD_RELOC_NONE },
1069
1070 /* Condition code in conditional moves. */
1071 #define MOVCC (CCCC_NOTSA + 1)
1072 { 4, 17, NULL, NULL, V850_OPERAND_CC, BFD_RELOC_NONE },
1073
1074 /* Condition code in FPU. */
1075 #define FLOAT_CCCC (MOVCC + 1)
1076 { 4, 27, NULL, NULL, V850_OPERAND_FLOAT_CC, BFD_RELOC_NONE },
1077
1078 /* The 1 bit immediate field in format C insn. */
1079 #define VI1 (FLOAT_CCCC + 1)
1080 { 1, 3, NULL, NULL, 0, BFD_RELOC_NONE },
1081
1082 /* The 1 bit immediate field in format C insn. */
1083 #define VC1 (VI1 + 1)
1084 { 1, 0, NULL, NULL, 0, BFD_RELOC_NONE },
1085
1086 /* The 2 bit immediate field in format C insn. */
1087 #define DI2 (VC1 + 1)
1088 { 2, 17, NULL, NULL, 0, BFD_RELOC_NONE },
1089
1090 /* The 2 bit immediate field in format C insn. */
1091 #define VI2 (DI2 + 1)
1092 { 2, 0, NULL, NULL, 0, BFD_RELOC_NONE },
1093
1094 /* The 2 bit immediate field in format C - DUP insn. */
1095 #define VI2DUP (VI2 + 1)
1096 { 2, 2, NULL, NULL, 0, BFD_RELOC_NONE },
1097
1098 /* The 3 bit immediate field in format 8 insn. */
1099 #define B3 (VI2DUP + 1)
1100 { 3, 11, NULL, NULL, 0, BFD_RELOC_NONE },
1101
1102 /* The 3 bit immediate field in format C insn. */
1103 #define DI3 (B3 + 1)
1104 { 3, 17, NULL, NULL, 0, BFD_RELOC_NONE },
1105
1106 /* The 3 bit immediate field in format C insn. */
1107 #define I3U (DI3 + 1)
1108 { 3, 0, NULL, NULL, 0, BFD_RELOC_NONE },
1109
1110 /* The 4 bit immediate field in format C insn. */
1111 #define I4U (I3U + 1)
1112 { 4, 0, NULL, NULL, 0, BFD_RELOC_NONE },
1113
1114 /* The 4 bit immediate field in fetrap. */
1115 #define I4U_NOTIMM0 (I4U + 1)
1116 { 4, 11, NULL, NULL, V850_NOT_IMM0, BFD_RELOC_NONE },
1117
1118 /* The unsigned disp4 field in a sld.bu. */
1119 #define D4U (I4U_NOTIMM0 + 1)
1120 { 4, 0, NULL, NULL, V850_OPERAND_DISP, BFD_RELOC_V850_TDA_4_4_OFFSET },
1121
1122 /* The imm5 field in a format 2 insn. */
1123 #define I5 (D4U + 1)
1124 { 5, 0, NULL, NULL, V850_OPERAND_SIGNED, BFD_RELOC_NONE },
1125
1126 /* The imm5 field in a format 11 insn. */
1127 #define I5DIV1 (I5 + 1)
1128 { 5, 0, insert_i5div1, extract_i5div1, 0, BFD_RELOC_NONE },
1129
1130 #define I5DIV2 (I5DIV1 + 1)
1131 { 5, 0, insert_i5div2, extract_i5div2, 0, BFD_RELOC_NONE },
1132
1133 #define I5DIV3 (I5DIV2 + 1)
1134 { 5, 0, insert_i5div3, extract_i5div3, 0, BFD_RELOC_NONE },
1135
1136 /* The unsigned imm5 field in a format 2 insn. */
1137 #define I5U (I5DIV3 + 1)
1138 { 5, 0, NULL, NULL, 0, BFD_RELOC_NONE },
1139
1140 /* The imm5 field in a prepare/dispose instruction. */
1141 #define IMM5 (I5U + 1)
1142 { 5, 1, NULL, NULL, 0, BFD_RELOC_NONE },
1143
1144 /* The unsigned disp5 field in a sld.hu. */
1145 #define D5_4U (IMM5 + 1)
1146 { 5, 0, insert_d5_4, extract_d5_4, V850_OPERAND_DISP, BFD_RELOC_V850_TDA_4_5_OFFSET },
1147
1148 /* The IMM6 field in a callt instruction. */
1149 #define IMM6 (D5_4U + 1)
1150 { 6, 0, NULL, NULL, 0, BFD_RELOC_V850_CALLT_6_7_OFFSET },
1151
1152 /* The signed disp7 field in a format 4 insn. */
1153 #define D7U (IMM6 + 1)
1154 { 7, 0, NULL, NULL, V850_OPERAND_DISP, BFD_RELOC_V850_TDA_7_7_OFFSET },
1155
1156 /* The unsigned DISP8 field in a format 4 insn. */
1157 #define D8_7U (D7U + 1)
1158 { 8, 0, insert_d8_7, extract_d8_7, V850_OPERAND_DISP, BFD_RELOC_V850_TDA_7_8_OFFSET },
1159
1160 /* The unsigned DISP8 field in a format 4 insn. */
1161 #define D8_6U (D8_7U + 1)
1162 { 8, 0, insert_d8_6, extract_d8_6, V850_OPERAND_DISP, BFD_RELOC_V850_TDA_6_8_OFFSET },
1163
1164 /* The unsigned DISP8 field in a format 4 insn. */
1165 #define V8 (D8_6U + 1)
1166 { 8, 0, insert_v8, extract_v8, 0, BFD_RELOC_NONE },
1167
1168 /* The imm9 field in a multiply word. */
1169 #define I9 (V8 + 1)
1170 { 9, 0, insert_i9, extract_i9, V850_OPERAND_SIGNED, BFD_RELOC_NONE },
1171
1172 /* The unsigned imm9 field in a multiply word. */
1173 #define U9 (I9 + 1)
1174 { 9, 0, insert_u9, extract_u9, 0, BFD_RELOC_NONE },
1175
1176 /* The DISP9 field in a format 3 insn. */
1177 #define D9 (U9 + 1)
1178 { 9, 0, insert_d9, extract_d9, V850_OPERAND_SIGNED | V850_OPERAND_DISP | V850_PCREL, BFD_RELOC_V850_9_PCREL },
1179
1180 /* The DISP9 field in a format 3 insn, relaxable. */
1181 #define D9_RELAX (D9 + 1)
1182 { 9, 0, insert_d9, extract_d9, V850_OPERAND_RELAX | V850_OPERAND_SIGNED | V850_OPERAND_DISP | V850_PCREL, BFD_RELOC_V850_9_PCREL },
1183
1184 /* The imm16 field in a format 6 insn. */
1185 #define I16 (D9_RELAX + 1)
1186 { 16, 16, NULL, NULL, V850_OPERAND_SIGNED, BFD_RELOC_16 },
1187
1188 /* The signed 16 bit immediate following a prepare instruction. */
1189 #define IMM16LO (I16 + 1)
1190 { 16, 32, NULL, NULL, V850E_IMMEDIATE16 | V850_OPERAND_SIGNED, BFD_RELOC_LO16 },
1191
1192 /* The hi 16 bit immediate following a 32 bit instruction. */
1193 #define IMM16HI (IMM16LO + 1)
1194 { 16, 16, NULL, NULL, V850E_IMMEDIATE16HI, BFD_RELOC_HI16 },
1195
1196 /* The unsigned imm16 in a format 6 insn. */
1197 #define I16U (IMM16HI + 1)
1198 { 16, 16, NULL, NULL, 0, BFD_RELOC_16 },
1199
1200 /* The disp16 field in a format 8 insn. */
1201 #define D16 (I16U + 1)
1202 { 16, 16, NULL, NULL, V850_OPERAND_SIGNED | V850_OPERAND_DISP, BFD_RELOC_16 },
1203
1204 /* The disp16 field in an format 7 unsigned byte load insn. */
1205 #define D16_16 (D16 + 1)
1206 { 16, 0, insert_d16_16, extract_d16_16, V850_OPERAND_SIGNED | V850_OPERAND_DISP, BFD_RELOC_V850_16_SPLIT_OFFSET },
1207
1208 /* The disp16 field in a format 6 insn. */
1209 #define D16_15 (D16_16 + 1)
1210 { 16, 0, insert_d16_15, extract_d16_15, V850_OPERAND_SIGNED | V850_OPERAND_DISP , BFD_RELOC_V850_16_S1 },
1211
1212 /* The unsigned DISP16 field in a format 7 insn. */
1213 #define D16_LOOP (D16_15 + 1)
1214 { 16, 0, insert_u16_loop, extract_u16_loop, V850_OPERAND_RELAX | V850_OPERAND_DISP | V850_PCREL, BFD_RELOC_V850_16_PCREL },
1215
1216 /* The DISP17 field in a format 7 insn. */
1217 #define D17_16 (D16_LOOP + 1)
1218 { 17, 0, insert_d17_16, extract_d17_16, V850_OPERAND_SIGNED | V850_OPERAND_DISP | V850_PCREL, BFD_RELOC_V850_17_PCREL },
1219
1220 /* The DISP22 field in a format 4 insn, relaxable.
1221 This _must_ follow D9_RELAX; the assembler assumes that the longer
1222 version immediately follows the shorter version for relaxing. */
1223 #define D22 (D17_16 + 1)
1224 { 22, 0, insert_d22, extract_d22, V850_OPERAND_SIGNED | V850_OPERAND_DISP | V850_PCREL, BFD_RELOC_V850_22_PCREL },
1225
1226 #define D23 (D22 + 1)
1227 { 23, 0, insert_d23, extract_d23, V850E_IMMEDIATE23 | V850_OPERAND_SIGNED | V850_OPERAND_DISP, BFD_RELOC_V850_23 },
1228
1229 #define D23_ALIGN1 (D23 + 1)
1230 { 23, 0, insert_d23_align1, extract_d23, V850E_IMMEDIATE23 | V850_OPERAND_SIGNED | V850_OPERAND_DISP, BFD_RELOC_V850_23 },
1231
1232 /* The 32 bit immediate following a 32 bit instruction. */
1233 #define IMM32 (D23_ALIGN1 + 1)
1234 { 32, 32, NULL, NULL, V850E_IMMEDIATE32, BFD_RELOC_32 },
1235
1236 #define D32_31 (IMM32 + 1)
1237 { 32, 32, NULL, NULL, V850E_IMMEDIATE32 | V850_OPERAND_SIGNED | V850_OPERAND_DISP, BFD_RELOC_V850_32_ABS },
1238
1239 #define D32_31_PCREL (D32_31 + 1)
1240 { 32, 32, NULL, NULL, V850E_IMMEDIATE32 | V850_OPERAND_SIGNED | V850_OPERAND_DISP | V850_PCREL, BFD_RELOC_V850_32_PCREL },
1241
1242 #define POS_U (D32_31_PCREL + 1)
1243 { 0, 0, insert_POS, extract_POS_U, 0, BFD_RELOC_NONE },
1244
1245 #define POS_M (POS_U + 1)
1246 { 0, 0, insert_POS, extract_POS_L, 0, BFD_RELOC_NONE },
1247
1248 #define POS_L (POS_M + 1)
1249 { 0, 0, insert_POS, extract_POS_L, 0, BFD_RELOC_NONE },
1250
1251 #define WIDTH_U (POS_L + 1)
1252 { 0, 0, insert_WIDTH, extract_WIDTH_U, 0, BFD_RELOC_NONE },
1253
1254 #define WIDTH_M (WIDTH_U + 1)
1255 { 0, 0, insert_WIDTH, extract_WIDTH_M, 0, BFD_RELOC_NONE },
1256
1257 #define WIDTH_L (WIDTH_M + 1)
1258 { 0, 0, insert_WIDTH, extract_WIDTH_L, 0, BFD_RELOC_NONE },
1259
1260 #define SELID (WIDTH_L + 1)
1261 { 5, 27, insert_SELID, extract_SELID, 0, BFD_RELOC_NONE },
1262
1263 #define RIE_IMM5 (SELID + 1)
1264 { 5, 11, NULL, NULL, 0, BFD_RELOC_NONE },
1265
1266 #define RIE_IMM4 (RIE_IMM5 + 1)
1267 { 4, 0, NULL, NULL, 0, BFD_RELOC_NONE },
1268
1269 #define VECTOR8 (RIE_IMM4 + 1)
1270 { 0, 0, insert_VECTOR8, extract_VECTOR8, 0, BFD_RELOC_NONE },
1271
1272 #define VECTOR5 (VECTOR8 + 1)
1273 { 0, 0, insert_VECTOR5, extract_VECTOR5, 0, BFD_RELOC_NONE },
1274
1275 #define VR1 (VECTOR5 + 1)
1276 { 5, 0, NULL, NULL, V850_OPERAND_VREG, BFD_RELOC_NONE },
1277
1278 #define VR2 (VR1 + 1)
1279 { 5, 11, NULL, NULL, V850_OPERAND_VREG, BFD_RELOC_NONE },
1280
1281 #define CACHEOP (VR2 + 1)
1282 { 0, 0, insert_CACHEOP, extract_CACHEOP, V850_OPERAND_CACHEOP, BFD_RELOC_NONE },
1283
1284 #define PREFOP (CACHEOP + 1)
1285 { 0, 0, insert_PREFOP, extract_PREFOP, V850_OPERAND_PREFOP, BFD_RELOC_NONE },
1286
1287 #define IMM10U (PREFOP + 1)
1288 { 0, 0, insert_IMM10U, extract_IMM10U, 0, BFD_RELOC_NONE },
1289 };
1290
1291 \f
1292 /* Reg - Reg instruction format (Format I). */
1293 #define IF1 {R1, R2}
1294
1295 /* Imm - Reg instruction format (Format II). */
1296 #define IF2 {I5, R2}
1297
1298 /* Conditional branch instruction format (Format III). */
1299 #define IF3 {D9_RELAX}
1300
1301 /* 3 operand instruction (Format VI). */
1302 #define IF6 {I16, R1, R2}
1303
1304 /* 3 operand instruction (Format VI). */
1305 #define IF6U {I16U, R1, R2}
1306
1307 /* Conditional branch instruction format (Format VII). */
1308 #define IF7 {D17_16}
1309
1310 \f
1311 /* The opcode table.
1312
1313 The format of the opcode table is:
1314
1315 NAME OPCODE MASK { OPERANDS } MEMOP PROCESSOR
1316
1317 NAME is the name of the instruction.
1318 OPCODE is the instruction opcode.
1319 MASK is the opcode mask; this is used to tell the disassembler
1320 which bits in the actual opcode must match OPCODE.
1321 OPERANDS is the list of operands.
1322 MEMOP specifies which operand (if any) is a memory operand.
1323 PROCESSORS specifies which CPU(s) support the opcode.
1324
1325 The disassembler reads the table in order and prints the first
1326 instruction which matches, so this table is sorted to put more
1327 specific instructions before more general instructions. It is also
1328 sorted by major opcode.
1329
1330 The table is also sorted by name. This is used by the assembler.
1331 When parsing an instruction the assembler finds the first occurance
1332 of the name of the instruciton in this table and then attempts to
1333 match the instruction's arguments with description of the operands
1334 associated with the entry it has just found in this table. If the
1335 match fails the assembler looks at the next entry in this table.
1336 If that entry has the same name as the previous entry, then it
1337 tries to match the instruction against that entry and so on. This
1338 is how the assembler copes with multiple, different formats of the
1339 same instruction. */
1340
1341 const struct v850_opcode v850_opcodes[] =
1342 {
1343 /* Standard instructions. */
1344 { "add", OP (0x0e), OP_MASK, IF1, 0, PROCESSOR_ALL },
1345 { "add", OP (0x12), OP_MASK, IF2, 0, PROCESSOR_ALL },
1346
1347 { "addi", OP (0x30), OP_MASK, IF6, 0, PROCESSOR_ALL },
1348
1349 { "adf", two (0x07e0, 0x03a0), two (0x07e0, 0x07e1), {CCCC_NOTSA, R1, R2, R3}, 0, PROCESSOR_V850E2_UP },
1350
1351 { "and", OP (0x0a), OP_MASK, IF1, 0, PROCESSOR_ALL },
1352
1353 { "andi", OP (0x36), OP_MASK, IF6U, 0, PROCESSOR_ALL },
1354
1355 /* Signed integer. */
1356 { "bge", BOP (0xe), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1357 { "bgt", BOP (0xf), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1358 { "ble", BOP (0x7), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1359 { "blt", BOP (0x6), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1360 /* Unsigned integer. */
1361 { "bh", BOP (0xb), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1362 { "bl", BOP (0x1), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1363 { "bnh", BOP (0x3), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1364 { "bnl", BOP (0x9), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1365 /* Common. */
1366 { "be", BOP (0x2), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1367 { "bne", BOP (0xa), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1368 /* Others. */
1369 { "bc", BOP (0x1), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1370 { "bf", BOP (0xa), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1371 { "bn", BOP (0x4), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1372 { "bnc", BOP (0x9), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1373 { "bnv", BOP (0x8), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1374 { "bnz", BOP (0xa), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1375 { "bp", BOP (0xc), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1376 { "br", BOP (0x5), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1377 { "bsa", BOP (0xd), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1378 { "bt", BOP (0x2), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1379 { "bv", BOP (0x0), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1380 { "bz", BOP (0x2), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1381
1382 /* Signed integer. */
1383 { "bge", two (0x07ee, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP },
1384 { "bgt", two (0x07ef, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP },
1385 { "ble", two (0x07e7, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP },
1386 { "blt", two (0x07e6, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP },
1387 /* Unsigned integer. */
1388 { "bh", two (0x07eb, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP },
1389 { "bl", two (0x07e1, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP },
1390 { "bnh", two (0x07e3, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP },
1391 { "bnl", two (0x07e9, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP },
1392 /* Common. */
1393 { "be", two (0x07e2, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP },
1394 { "bne", two (0x07ea, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP },
1395 /* Others. */
1396 { "bc", two (0x07e1, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP },
1397 { "bf", two (0x07ea, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP },
1398 { "bn", two (0x07e4, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP },
1399 { "bnc", two (0x07e9, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP },
1400 { "bnv", two (0x07e8, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP },
1401 { "bnz", two (0x07ea, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP },
1402 { "bp", two (0x07ec, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP },
1403 { "br", two (0x07e5, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP },
1404 { "bsa", two (0x07ed, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP },
1405 { "bt", two (0x07e2, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP },
1406 { "bv", two (0x07e0, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP },
1407 { "bz", two (0x07e2, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP },
1408 /* Bcond disp17 Gas local alias(not defined in spec). */
1409
1410 /* Signed integer. */
1411 { "bge17", two (0x07ee, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP | PROCESSOR_OPTION_ALIAS },
1412 { "bgt17", two (0x07ef, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP | PROCESSOR_OPTION_ALIAS },
1413 { "ble17", two (0x07e7, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP | PROCESSOR_OPTION_ALIAS },
1414 { "blt17", two (0x07e6, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP | PROCESSOR_OPTION_ALIAS },
1415 /* Unsigned integer. */
1416 { "bh17", two (0x07eb, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP | PROCESSOR_OPTION_ALIAS },
1417 { "bl17", two (0x07e1, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP | PROCESSOR_OPTION_ALIAS },
1418 { "bnh17", two (0x07e3, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP | PROCESSOR_OPTION_ALIAS },
1419 { "bnl17", two (0x07e9, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP | PROCESSOR_OPTION_ALIAS },
1420 /* Common. */
1421 { "be17", two (0x07e2, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP | PROCESSOR_OPTION_ALIAS },
1422 { "bne17", two (0x07ea, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP | PROCESSOR_OPTION_ALIAS },
1423 /* Others. */
1424 { "bc17", two (0x07e1, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP | PROCESSOR_OPTION_ALIAS },
1425 { "bf17", two (0x07ea, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP | PROCESSOR_OPTION_ALIAS },
1426 { "bn17", two (0x07e4, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP | PROCESSOR_OPTION_ALIAS },
1427 { "bnc17", two (0x07e9, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP | PROCESSOR_OPTION_ALIAS },
1428 { "bnv17", two (0x07e8, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP | PROCESSOR_OPTION_ALIAS },
1429 { "bnz17", two (0x07ea, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP | PROCESSOR_OPTION_ALIAS },
1430 { "bp17", two (0x07ec, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP | PROCESSOR_OPTION_ALIAS },
1431 { "br17", two (0x07e5, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP | PROCESSOR_OPTION_ALIAS },
1432 { "bsa17", two (0x07ed, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP | PROCESSOR_OPTION_ALIAS },
1433 { "bt17", two (0x07e2, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP | PROCESSOR_OPTION_ALIAS },
1434 { "bv17", two (0x07e0, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP | PROCESSOR_OPTION_ALIAS },
1435 { "bz17", two (0x07e2, 0x0001), two (0xffef, 0x0001), IF7, 0, PROCESSOR_V850E3V5_UP | PROCESSOR_OPTION_ALIAS },
1436
1437 { "bsh", two (0x07e0, 0x0342), two (0x07ff, 0x07ff), {R2, R3}, 0, PROCESSOR_NOT_V850 },
1438
1439 { "bsw", two (0x07e0, 0x0340), two (0x07ff, 0x07ff), {R2, R3}, 0, PROCESSOR_NOT_V850 },
1440
1441 /* v850e3v5 bitfield instructions. */
1442 { "bins", two (0x07e0, 0x0090), two (0x07e0, 0x07f1), {R1, POS_U, WIDTH_U, R2}, 0, PROCESSOR_V850E3V5_UP },
1443 { "bins", two (0x07e0, 0x00b0), two (0x07e0, 0x07f1), {R1, POS_M, WIDTH_M, R2}, 0, PROCESSOR_V850E3V5_UP },
1444 { "bins", two (0x07e0, 0x00d0), two (0x07e0, 0x07f1), {R1, POS_L, WIDTH_L, R2}, 0, PROCESSOR_V850E3V5_UP },
1445 /* Gas local alias(not defined in spec). */
1446 { "binsu",two (0x07e0, 0x0090), two (0x07e0, 0x07f1), {R1, POS_U, WIDTH_U, R2}, 0, PROCESSOR_V850E3V5_UP | PROCESSOR_OPTION_ALIAS },
1447 { "binsm",two (0x07e0, 0x00b0), two (0x07e0, 0x07f1), {R1, POS_M, WIDTH_M, R2}, 0, PROCESSOR_V850E3V5_UP | PROCESSOR_OPTION_ALIAS },
1448 { "binsl",two (0x07e0, 0x00d0), two (0x07e0, 0x07f1), {R1, POS_L, WIDTH_L, R2}, 0, PROCESSOR_V850E3V5_UP | PROCESSOR_OPTION_ALIAS },
1449
1450 { "cache", two (0xe7e0, 0x0160), two (0xe7e0, 0x07ff), {CACHEOP, R1}, 2, PROCESSOR_V850E3V5_UP },
1451
1452 { "callt", one (0x0200), one (0xffc0), {IMM6}, 0, PROCESSOR_NOT_V850 },
1453
1454 { "caxi", two (0x07e0, 0x00ee), two (0x07e0, 0x07ff), {R1, R2, R3}, 1, PROCESSOR_V850E2_UP },
1455
1456 { "clr1", two (0x87c0, 0x0000), two (0xc7e0, 0x0000), {B3, D16, R1}, 3, PROCESSOR_ALL },
1457 { "clr1", two (0x07e0, 0x00e4), two (0x07e0, 0xffff), {R2, R1}, 3, PROCESSOR_NOT_V850 },
1458
1459 { "cmov", two (0x07e0, 0x0320), two (0x07e0, 0x07e1), {MOVCC, R1, R2, R3}, 0, PROCESSOR_NOT_V850 },
1460 { "cmov", two (0x07e0, 0x0300), two (0x07e0, 0x07e1), {MOVCC, I5, R2, R3}, 0, PROCESSOR_NOT_V850 },
1461
1462 { "cmp", OP (0x0f), OP_MASK, IF1, 0, PROCESSOR_ALL },
1463 { "cmp", OP (0x13), OP_MASK, IF2, 0, PROCESSOR_ALL },
1464
1465 { "ctret", two (0x07e0, 0x0144), two (0xffff, 0xffff), {0}, 0, PROCESSOR_NOT_V850 },
1466
1467 { "dbcp", one (0xe840), one (0xffff), {0}, 0, PROCESSOR_V850E3V5_UP },
1468
1469 { "dbhvtrap", one (0xe040), one (0xffff), {0}, 0, PROCESSOR_V850E3V5_UP },
1470
1471 { "dbpush", two (0x5fe0, 0x0160), two (0xffe0, 0x07ff), {R1, R3}, 0, PROCESSOR_V850E3V5_UP },
1472
1473 { "dbret", two (0x07e0, 0x0146), two (0xffff, 0xffff), {0}, 0, PROCESSOR_NOT_V850 },
1474
1475 { "dbtag", two (0xcfe0, 0x0160), two (0xffe0, 0x07ff), {IMM10U}, 0, PROCESSOR_V850E3V5_UP },
1476
1477 { "dbtrap", one (0xf840), one (0xffff), {0}, 0, PROCESSOR_NOT_V850 },
1478
1479 { "di", two (0x07e0, 0x0160), two (0xffff, 0xffff), {0}, 0, PROCESSOR_ALL },
1480
1481 { "dispose", two (0x0640, 0x0000), two (0xffc0, 0x0000), {IMM5, LIST12, R2_DISPOSE},3, PROCESSOR_NOT_V850 },
1482 { "dispose", two (0x0640, 0x0000), two (0xffc0, 0x001f), {IMM5, LIST12}, 0, PROCESSOR_NOT_V850 },
1483
1484 { "div", two (0x07e0, 0x02c0), two (0x07e0, 0x07ff), {R1, R2, R3}, 0, PROCESSOR_NOT_V850 },
1485
1486 { "divh", two (0x07e0, 0x0280), two (0x07e0, 0x07ff), {R1, R2, R3}, 0, PROCESSOR_NOT_V850 },
1487 { "divh", OP (0x02), OP_MASK, {R1_NOTR0, R2_NOTR0}, 0, PROCESSOR_ALL },
1488
1489 { "divhn", two (0x07e0, 0x0280), two (0x07e0, 0x07c3), {I5DIV1, R1, R2, R3}, 0, PROCESSOR_NOT_V850 | PROCESSOR_OPTION_EXTENSION },
1490
1491 { "divhu", two (0x07e0, 0x0282), two (0x07e0, 0x07ff), {R1, R2, R3}, 0, PROCESSOR_NOT_V850 },
1492
1493 { "divhun", two (0x07e0, 0x0282), two (0x07e0, 0x07c3), {I5DIV1, R1, R2, R3}, 0, PROCESSOR_NOT_V850 | PROCESSOR_OPTION_EXTENSION },
1494 { "divn", two (0x07e0, 0x02c0), two (0x07e0, 0x07c3), {I5DIV2, R1, R2, R3}, 0, PROCESSOR_NOT_V850 | PROCESSOR_OPTION_EXTENSION },
1495
1496 { "divq", two (0x07e0, 0x02fc), two (0x07e0, 0x07ff), {R1, R2, R3}, 0, PROCESSOR_V850E2_UP },
1497
1498 { "divqu", two (0x07e0, 0x02fe), two (0x07e0, 0x07ff), {R1, R2, R3}, 0, PROCESSOR_V850E2_UP },
1499
1500 { "divu", two (0x07e0, 0x02c2), two (0x07e0, 0x07ff), {R1, R2, R3}, 0, PROCESSOR_NOT_V850 },
1501
1502 { "divun", two (0x07e0, 0x02c2), two (0x07e0, 0x07c3), {I5DIV2, R1, R2, R3}, 0, PROCESSOR_NOT_V850 | PROCESSOR_OPTION_EXTENSION },
1503
1504 { "dst", two (0x07e0, 0x0134), two (0xfffff, 0xffff), {0}, 0, PROCESSOR_V850E3V5_UP },
1505
1506 { "ei", two (0x87e0, 0x0160), two (0xffff, 0xffff), {0}, 0, PROCESSOR_ALL },
1507
1508 { "eiret", two (0x07e0, 0x0148), two (0xffff, 0xffff), {0}, 0, PROCESSOR_V850E2_UP },
1509
1510 { "est", two (0x07e0, 0x0132), two (0xfffff, 0xffff), {0}, 0, PROCESSOR_V850E3V5_UP },
1511
1512 { "feret", two (0x07e0, 0x014a), two (0xffff, 0xffff), {0}, 0, PROCESSOR_V850E2_UP },
1513
1514 { "fetrap", one (0x0040), one (0x87ff), {I4U_NOTIMM0}, 0, PROCESSOR_V850E2_UP },
1515
1516 { "halt", two (0x07e0, 0x0120), two (0xffff, 0xffff), {0}, 0, PROCESSOR_ALL },
1517
1518 { "hsh", two (0x07e0, 0x0346), two (0x07ff, 0x07ff), {R2, R3}, 0, PROCESSOR_V850E2_UP },
1519
1520 { "hsw", two (0x07e0, 0x0344), two (0x07ff, 0x07ff), {R2, R3}, 0, PROCESSOR_NOT_V850 },
1521
1522 { "hvcall", two (0xd7e0, 0x4160), two (0xffe0, 0x41ff), {VECTOR8}, 0, PROCESSOR_V850E3V5_UP },
1523 { "hvtrap", two (0x07e0, 0x0110), two (0xffe0, 0xffff), {VECTOR5}, 0, PROCESSOR_V850E3V5_UP },
1524
1525 { "jarl", two (0xc7e0, 0x0160), two (0xffe0, 0x07ff), {R1, R3_NOTR0}, 1, PROCESSOR_V850E3V5_UP},
1526 { "jarl", two (0x0780, 0x0000), two (0x07c0, 0x0001), {D22, R2_NOTR0}, 0, PROCESSOR_ALL},
1527 { "jarl", one (0x02e0), one (0xffe0), {D32_31_PCREL, R1_NOTR0}, 0, PROCESSOR_V850E2_UP },
1528 /* Gas local alias (not defined in spec). */
1529 { "jarlr", two (0xc7e0, 0x0160), two (0xffe0, 0x07ff), {R1, R3_NOTR0}, 1, PROCESSOR_V850E3V5_UP | PROCESSOR_OPTION_ALIAS},
1530 /* Gas local alias of jarl imm22 (not defined in spec). */
1531 { "jarl22", two (0x0780, 0x0000), two (0x07c0, 0x0001), {D22, R2_NOTR0}, 0, PROCESSOR_ALL | PROCESSOR_OPTION_ALIAS},
1532 /* Gas local alias of jarl imm32 (not defined in spec). */
1533 { "jarl32", one (0x02e0), one (0xffe0), {D32_31_PCREL, R1_NOTR0}, 0, PROCESSOR_V850E2_UP | PROCESSOR_OPTION_ALIAS },
1534 { "jarlw", one (0x02e0), one (0xffe0), {D32_31_PCREL, R1_NOTR0}, 0, PROCESSOR_V850E2_UP | PROCESSOR_OPTION_ALIAS },
1535
1536 { "jmp", two (0x06e0, 0x0000), two (0xffe0, 0x0001), {D32_31, R1}, 2, PROCESSOR_V850E3V5_UP },
1537 { "jmp", one (0x06e0), one (0xffe0), {D32_31, R1}, 2, PROCESSOR_V850E2 | PROCESSOR_V850E2V3 },
1538 { "jmp", one (0x0060), one (0xffe0), {R1}, 1, PROCESSOR_ALL },
1539 /* Gas local alias of jmp disp22(not defined in spec). */
1540 { "jmp22", one (0x0060), one (0xffe0), {R1}, 1, PROCESSOR_ALL | PROCESSOR_OPTION_ALIAS },
1541 /* Gas local alias of jmp disp32(not defined in spec). */
1542 { "jmp32", one (0x06e0), one (0xffe0), {D32_31, R1}, 2, PROCESSOR_V850E2_UP | PROCESSOR_OPTION_ALIAS },
1543 { "jmpw", one (0x06e0), one (0xffe0), {D32_31, R1}, 2, PROCESSOR_V850E2_UP | PROCESSOR_OPTION_ALIAS },
1544
1545 { "jr", two (0x0780, 0x0000), two (0xffc0, 0x0001), {D22}, 0, PROCESSOR_ALL },
1546 { "jr", one (0x02e0), one (0xffff), {D32_31_PCREL}, 0, PROCESSOR_V850E2_UP },
1547 /* Gas local alias of mov imm22(not defined in spec). */
1548 { "jr22", two (0x0780, 0x0000), two (0xffc0, 0x0001), {D22}, 0, PROCESSOR_ALL | PROCESSOR_OPTION_ALIAS },
1549 /* Gas local alias of mov imm32(not defined in spec). */
1550 { "jr32", one (0x02e0), one (0xffff), {D32_31_PCREL}, 0, PROCESSOR_V850E2_UP | PROCESSOR_OPTION_ALIAS },
1551
1552 /* Alias of bcond (same as CA850). */
1553 { "jgt", BOP (0xf), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1554 { "jge", BOP (0xe), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1555 { "jlt", BOP (0x6), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1556 { "jle", BOP (0x7), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1557 /* Unsigned integer. */
1558 { "jh", BOP (0xb), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1559 { "jnh", BOP (0x3), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1560 { "jl", BOP (0x1), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1561 { "jnl", BOP (0x9), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1562 /* Common. */
1563 { "je", BOP (0x2), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1564 { "jne", BOP (0xa), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1565 /* Others. */
1566 { "jv", BOP (0x0), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1567 { "jnv", BOP (0x8), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1568 { "jn", BOP (0x4), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1569 { "jp", BOP (0xc), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1570 { "jc", BOP (0x1), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1571 { "jnc", BOP (0x9), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1572 { "jz", BOP (0x2), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1573 { "jnz", BOP (0xa), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1574 { "jbr", BOP (0x5), BOP_MASK, IF3, 0, PROCESSOR_ALL },
1575
1576
1577 { "ldacc", two (0x07e0, 0x0bc4), two (0x07e0, 0xffff), {R1, R2}, 0, PROCESSOR_V850E2_UP | PROCESSOR_OPTION_EXTENSION },
1578
1579 { "ld.b", two (0x0700, 0x0000), two (0x07e0, 0x0000), {D16, R1, R2}, 2, PROCESSOR_ALL },
1580 { "ld.b", two (0x0780, 0x0005), two (0x07e0, 0x000f), {D23, R1, R3}, 2, PROCESSOR_V850E2_UP },
1581 { "ld.b23", two (0x0780, 0x0005), two (0x07e0, 0x000f), {D23, R1, R3}, 2, PROCESSOR_V850E2_UP | PROCESSOR_OPTION_ALIAS },
1582
1583 { "ld.bu", two (0x0780, 0x0001), two (0x07c0, 0x0001), {D16_16, R1, R2_NOTR0}, 2, PROCESSOR_NOT_V850 },
1584 { "ld.bu", two (0x07a0, 0x0005), two (0x07e0, 0x000f), {D23, R1, R3}, 2, PROCESSOR_V850E2_UP },
1585 { "ld.bu23", two (0x07a0, 0x0005), two (0x07e0, 0x000f), {D23, R1, R3}, 2, PROCESSOR_V850E2_UP | PROCESSOR_OPTION_ALIAS },
1586
1587 { "ld.dw", two (0x07a0, 0x0009), two (0xffe0, 0x001f), {D23_ALIGN1, R1, R3_EVEN}, 2, PROCESSOR_V850E3V5_UP },
1588 { "ld.dw23", two (0x07a0, 0x0009), two (0xffe0, 0x001f), {D23_ALIGN1, R1, R3_EVEN}, 2, PROCESSOR_V850E3V5_UP | PROCESSOR_OPTION_ALIAS },
1589
1590 { "ld.h", two (0x0720, 0x0000), two (0x07e0, 0x0001), {D16_15, R1, R2}, 2, PROCESSOR_ALL },
1591 { "ld.h", two (0x0780, 0x0007), two (0x07e0, 0x000f), {D23_ALIGN1, R1, R3}, 2, PROCESSOR_V850E2_UP },
1592 { "ld.h23", two (0x0780, 0x0007), two (0x07e0, 0x000f), {D23_ALIGN1, R1, R3}, 2, PROCESSOR_V850E2_UP | PROCESSOR_OPTION_ALIAS },
1593
1594 { "ld.hu", two (0x07e0, 0x0001), two (0x07e0, 0x0001), {D16_15, R1, R2_NOTR0}, 2, PROCESSOR_NOT_V850 },
1595 { "ld.hu", two (0x07a0, 0x0007), two (0x07e0, 0x000f), {D23_ALIGN1, R1, R3}, 2, PROCESSOR_V850E2_UP },
1596 { "ld.hu23", two (0x07a0, 0x0007), two (0x07e0, 0x000f), {D23_ALIGN1, R1, R3}, 2, PROCESSOR_V850E2_UP | PROCESSOR_OPTION_ALIAS },
1597
1598 { "ld.w", two (0x0720, 0x0001), two (0x07e0, 0x0001), {D16_15, R1, R2}, 2, PROCESSOR_ALL },
1599 { "ld.w", two (0x0780, 0x0009), two (0xffe0, 0x001f), {D23_ALIGN1, R1, R3}, 2, PROCESSOR_V850E2_UP },
1600 { "ld.w23", two (0x0780, 0x0009), two (0x07e0, 0x001f), {D23_ALIGN1, R1, R3}, 2, PROCESSOR_V850E2_UP | PROCESSOR_OPTION_ALIAS },
1601
1602 { "ldl.w", two (0x07e0, 0x0378), two (0xffe0, 0x07ff), {R1, R3}, 1, PROCESSOR_V850E3V5_UP },
1603
1604 { "ldsr", two (0x07e0, 0x0020), two (0x07e0, 0x07ff), {R1, SR2, SELID}, 0, PROCESSOR_V850E3V5_UP },
1605 { "ldsr", two (0x07e0, 0x0020), two (0x07e0, 0x07ff), {R1, SR2}, 0, PROCESSOR_V850E3V5_UP },
1606 { "ldsr", two (0x07e0, 0x0020), two (0x07e0, 0x07ff), {R1, OLDSR2}, 0, (PROCESSOR_ALL & (~ PROCESSOR_V850E3V5_UP)) },
1607
1608 { "ldtc.gr", two (0x07e0, 0x0032), two (0x07e0, 0xffff), {R1, R2}, 0, PROCESSOR_V850E3V5_UP },
1609 { "ldtc.sr", two (0x07e0, 0x0030), two (0x07e0, 0x07ff), {R1, SR2, SELID}, 0, PROCESSOR_V850E3V5_UP },
1610 { "ldtc.sr", two (0x07e0, 0x0030), two (0x07e0, 0x07ff), {R1, SR2}, 0, PROCESSOR_V850E3V5_UP },
1611
1612 { "ldtc.vr", two (0x07e0, 0x0832), two (0x07e0, 0xffff), {R1, VR2}, 0, PROCESSOR_V850E3V5_UP },
1613 { "ldtc.pc", two (0x07e0, 0xf832), two (0x07e0, 0xffff), {R1}, 0, PROCESSOR_V850E3V5_UP },
1614
1615 { "ldvc.sr", two (0x07e0, 0x0034), two (0x07e0, 0x07ff), {R1, SR2, SELID}, 0, PROCESSOR_V850E3V5_UP },
1616 { "ldvc.sr", two (0x07e0, 0x0034), two (0x07e0, 0x07ff), {R1, SR2}, 0, PROCESSOR_V850E3V5_UP },
1617
1618 { "loop", two (0x06e0, 0x0001), two (0xffe0, 0x0001), {R1, D16_LOOP}, 0, PROCESSOR_V850E3V5_UP },
1619
1620 { "macacc", two (0x07e0, 0x0bc0), two (0x07e0, 0xffff), {R1, R2}, 0, PROCESSOR_V850E2_UP | PROCESSOR_OPTION_EXTENSION },
1621
1622 { "mac", two (0x07e0, 0x03c0), two (0x07e0, 0x0fe1), {R1, R2, R3_EVEN, R4_EVEN}, 0, PROCESSOR_V850E2_UP },
1623
1624 { "macu", two (0x07e0, 0x03e0), two (0x07e0, 0x0fe1), {R1, R2, R3_EVEN, R4_EVEN}, 0, PROCESSOR_V850E2_UP },
1625
1626 { "macuacc", two (0x07e0, 0x0bc2), two (0x07e0, 0xffff), {R1, R2}, 0, PROCESSOR_V850E2_UP | PROCESSOR_OPTION_EXTENSION },
1627
1628 { "mov", OP (0x00), OP_MASK, {R1, R2_NOTR0}, 0, PROCESSOR_ALL },
1629 { "mov", OP (0x10), OP_MASK, {I5, R2_NOTR0}, 0, PROCESSOR_ALL },
1630 { "mov", one (0x0620), one (0xffe0), {IMM32, R1}, 0, PROCESSOR_NOT_V850 },
1631 /* Gas local alias of mov imm32(not defined in spec). */
1632 { "movl", one (0x0620), one (0xffe0), {IMM32, R1}, 0, PROCESSOR_NOT_V850 | PROCESSOR_OPTION_ALIAS },
1633
1634 { "movea", OP (0x31), OP_MASK, {I16, R1, R2_NOTR0}, 0, PROCESSOR_ALL },
1635
1636 { "movhi", OP (0x32), OP_MASK, {I16, R1, R2_NOTR0}, 0, PROCESSOR_ALL },
1637
1638 { "mul", two (0x07e0, 0x0220), two (0x07e0, 0x07ff), {R1, R2, R3}, 0, PROCESSOR_NOT_V850 },
1639 { "mul", two (0x07e0, 0x0240), two (0x07e0, 0x07c3), {I9, R2, R3}, 0, PROCESSOR_NOT_V850 },
1640
1641 { "mulh", OP (0x17), OP_MASK, {I5, R2_NOTR0}, 0, PROCESSOR_ALL },
1642 { "mulh", OP (0x07), OP_MASK, {R1, R2_NOTR0}, 0, PROCESSOR_ALL },
1643
1644 { "mulhi", OP (0x37), OP_MASK, {I16, R1, R2_NOTR0}, 0, PROCESSOR_ALL },
1645
1646 { "mulu", two (0x07e0, 0x0222), two (0x07e0, 0x07ff), {R1, R2, R3}, 0, PROCESSOR_NOT_V850 },
1647 { "mulu", two (0x07e0, 0x0242), two (0x07e0, 0x07c3), {U9, R2, R3}, 0, PROCESSOR_NOT_V850 },
1648
1649 { "nop", one (0x00), one (0xffff), {0}, 0, PROCESSOR_ALL },
1650
1651 { "not", OP (0x01), OP_MASK, IF1, 0, PROCESSOR_ALL },
1652
1653 { "not1", two (0x47c0, 0x0000), two (0xc7e0, 0x0000), {B3, D16, R1}, 3, PROCESSOR_ALL },
1654 { "not1", two (0x07e0, 0x00e2), two (0x07e0, 0xffff), {R2, R1}, 3, PROCESSOR_NOT_V850 },
1655
1656 { "or", OP (0x08), OP_MASK, IF1, 0, PROCESSOR_ALL },
1657
1658 { "ori", OP (0x34), OP_MASK, IF6U, 0, PROCESSOR_ALL },
1659
1660 { "popsp", two (0x67e0, 0x0160), two (0xffe0, 0x07ff), {R1, R3}, 0, PROCESSOR_V850E3V5_UP },
1661
1662 { "pref", two (0xdfe0, 0x0160), two (0xffe0, 0x07ff), {PREFOP, R1}, 2, PROCESSOR_V850E3V5_UP },
1663
1664 { "prepare", two (0x0780, 0x0003), two (0xffc0, 0x001f), {LIST12, IMM5, SP}, 0, PROCESSOR_NOT_V850 },
1665 { "prepare", two (0x0780, 0x000b), two (0xffc0, 0x001f), {LIST12, IMM5, IMM16LO},0, PROCESSOR_NOT_V850 },
1666 { "prepare", two (0x0780, 0x0013), two (0xffc0, 0x001f), {LIST12, IMM5, IMM16HI},0, PROCESSOR_NOT_V850 },
1667 { "prepare", two (0x0780, 0x001b), two (0xffc0, 0x001f), {LIST12, IMM5, IMM32}, 0, PROCESSOR_NOT_V850 },
1668 { "prepare", two (0x0780, 0x0001), two (0xffc0, 0x001f), {LIST12, IMM5}, 0, PROCESSOR_NOT_V850 },
1669
1670 { "pushsp", two (0x47e0, 0x0160), two (0xffe0, 0x07ff), {R1, R3}, 0, PROCESSOR_V850E3V5_UP },
1671
1672 { "rotl", two (0x07e0, 0x00c6), two (0x07e0, 0x07ff), {R1, R2, R3}, 0, PROCESSOR_V850E3V5_UP },
1673 { "rotl", two (0x07e0, 0x00c4), two (0x07e0, 0x07ff), {I5U, R2, R3}, 0, PROCESSOR_V850E3V5_UP },
1674
1675 { "reti", two (0x07e0, 0x0140), two (0xffff, 0xffff), {0}, 0, PROCESSOR_ALL },
1676
1677 { "sar", two (0x07e0, 0x00a2), two (0x07e0, 0x07ff), {R1, R2, R3}, 0, PROCESSOR_V850E2_UP },
1678 { "sar", OP (0x15), OP_MASK, {I5U, R2}, 0, PROCESSOR_ALL },
1679 { "sar", two (0x07e0, 0x00a0), two (0x07e0, 0xffff), {R1, R2}, 0, PROCESSOR_ALL },
1680
1681 { "sasf", two (0x07e0, 0x0200), two (0x07f0, 0xffff), {CCCC, R2}, 0, PROCESSOR_NOT_V850 },
1682
1683 { "satadd", two (0x07e0, 0x03ba), two (0x07e0, 0x07ff), {R1, R2, R3}, 0, PROCESSOR_V850E2_UP },
1684 { "satadd", OP (0x11), OP_MASK, {I5, R2_NOTR0}, 0, PROCESSOR_ALL },
1685 { "satadd", OP (0x06), OP_MASK, {R1, R2_NOTR0}, 0, PROCESSOR_ALL },
1686
1687 { "satsub", two (0x07e0, 0x039a), two (0x07e0, 0x07ff), {R1, R2, R3}, 0, PROCESSOR_V850E2_UP },
1688 { "satsub", OP (0x05), OP_MASK, {R1, R2_NOTR0}, 0, PROCESSOR_ALL },
1689
1690 { "satsubi", OP (0x33), OP_MASK, {I16, R1, R2_NOTR0}, 0, PROCESSOR_ALL },
1691
1692 { "satsubr", OP (0x04), OP_MASK, {R1, R2_NOTR0}, 0, PROCESSOR_ALL },
1693
1694 { "sbf", two (0x07e0, 0x0380), two (0x07e0, 0x07e1), {CCCC_NOTSA, R1, R2, R3}, 0, PROCESSOR_V850E2_UP },
1695
1696 { "sch0l", two (0x07e0, 0x0364), two (0x07ff, 0x07ff), {R2, R3}, 0, PROCESSOR_V850E2_UP },
1697
1698 { "sch0r", two (0x07e0, 0x0360), two (0x07ff, 0x07ff), {R2, R3}, 0, PROCESSOR_V850E2_UP },
1699
1700 { "sch1l", two (0x07e0, 0x0366), two (0x07ff, 0x07ff), {R2, R3}, 0, PROCESSOR_V850E2_UP },
1701
1702 { "sch1r", two (0x07e0, 0x0362), two (0x07ff, 0x07ff), {R2, R3}, 0, PROCESSOR_V850E2_UP },
1703
1704 { "sdivhn", two (0x07e0, 0x0180), two (0x07e0, 0x07c3), {I5DIV3, R1, R2, R3}, 0, PROCESSOR_NOT_V850 | PROCESSOR_OPTION_EXTENSION },
1705 { "sdivhun", two (0x07e0, 0x0182), two (0x07e0, 0x07c3), {I5DIV3, R1, R2, R3}, 0, PROCESSOR_NOT_V850 | PROCESSOR_OPTION_EXTENSION },
1706 { "sdivn", two (0x07e0, 0x01c0), two (0x07e0, 0x07c3), {I5DIV3, R1, R2, R3}, 0, PROCESSOR_NOT_V850 | PROCESSOR_OPTION_EXTENSION },
1707 { "sdivun", two (0x07e0, 0x01c2), two (0x07e0, 0x07c3), {I5DIV3, R1, R2, R3}, 0, PROCESSOR_NOT_V850 | PROCESSOR_OPTION_EXTENSION },
1708
1709 { "set1", two (0x07c0, 0x0000), two (0xc7e0, 0x0000), {B3, D16, R1}, 3, PROCESSOR_ALL },
1710 { "set1", two (0x07e0, 0x00e0), two (0x07e0, 0xffff), {R2, R1}, 3, PROCESSOR_NOT_V850 },
1711
1712 { "setf", two (0x07e0, 0x0000), two (0x07f0, 0xffff), {CCCC, R2}, 0, PROCESSOR_ALL },
1713
1714 { "shl", two (0x07e0, 0x00c2), two (0x07e0, 0x07ff), {R1, R2, R3}, 0, PROCESSOR_V850E2_UP },
1715 { "shl", OP (0x16), OP_MASK, {I5U, R2}, 0, PROCESSOR_ALL },
1716 { "shl", two (0x07e0, 0x00c0), two (0x07e0, 0xffff), {R1, R2}, 0, PROCESSOR_ALL },
1717
1718 { "shr", two (0x07e0, 0x0082), two (0x07e0, 0x07ff), {R1, R2, R3}, 0, PROCESSOR_V850E2_UP },
1719 { "shr", OP (0x14), OP_MASK, {I5U, R2}, 0, PROCESSOR_ALL },
1720 { "shr", two (0x07e0, 0x0080), two (0x07e0, 0xffff), {R1, R2}, 0, PROCESSOR_ALL },
1721
1722 { "sld.b", one (0x0300), one (0x0780), {D7U, EP, R2}, 2, PROCESSOR_ALL },
1723
1724 { "sld.bu", one (0x0060), one (0x07f0), {D4U, EP, R2_NOTR0}, 2, PROCESSOR_NOT_V850 },
1725
1726 { "sld.h", one (0x0400), one (0x0780), {D8_7U,EP, R2}, 2, PROCESSOR_ALL },
1727
1728 { "sld.hu", one (0x0070), one (0x07f0), {D5_4U,EP, R2_NOTR0}, 2, PROCESSOR_NOT_V850 },
1729
1730 { "sld.w", one (0x0500), one (0x0781), {D8_6U,EP, R2}, 2, PROCESSOR_ALL },
1731
1732 { "snooze", two (0x0fe0, 0x0120), two (0xffff, 0xffff), {0}, 0, PROCESSOR_V850E3V5_UP },
1733
1734 { "sst.b", one (0x0380), one (0x0780), {R2, D7U, EP}, 3, PROCESSOR_ALL },
1735
1736 { "sst.h", one (0x0480), one (0x0780), {R2, D8_7U,EP}, 3, PROCESSOR_ALL },
1737
1738 { "sst.w", one (0x0501), one (0x0781), {R2, D8_6U,EP}, 3, PROCESSOR_ALL },
1739
1740 { "stacch", two (0x07e0, 0x0bca), two (0x07ff, 0xffff), {R2}, 0, PROCESSOR_V850E2_UP | PROCESSOR_OPTION_EXTENSION },
1741 { "staccl", two (0x07e0, 0x0bc8), two (0x07ff, 0xffff), {R2}, 0, PROCESSOR_V850E2_UP | PROCESSOR_OPTION_EXTENSION },
1742
1743 { "st.b", two (0x0740, 0x0000), two (0x07e0, 0x0000), {R2, D16, R1}, 3, PROCESSOR_ALL },
1744 { "st.b", two (0x0780, 0x000d), two (0x07e0, 0x000f), {R3, D23, R1}, 3, PROCESSOR_V850E2_UP },
1745 { "st.b23", two (0x0780, 0x000d), two (0x07e0, 0x000f), {R3, D23, R1}, 3, PROCESSOR_V850E2_UP | PROCESSOR_OPTION_ALIAS },
1746
1747 { "st.dw", two (0x07a0, 0x000f), two (0xffe0, 0x001f), {R3_EVEN, D23_ALIGN1, R1}, 3, PROCESSOR_V850E3V5_UP },
1748 { "st.dw23", two (0x07a0, 0x000f), two (0xffe0, 0x001f), {R3_EVEN, D23_ALIGN1, R1}, 3, PROCESSOR_V850E3V5_UP | PROCESSOR_OPTION_ALIAS },
1749
1750 { "st.h", two (0x0760, 0x0000), two (0x07e0, 0x0001), {R2, D16_15, R1}, 3, PROCESSOR_ALL },
1751 { "st.h", two (0x07a0, 0x000d), two (0x07e0, 0x000f), {R3, D23_ALIGN1, R1}, 3, PROCESSOR_V850E2_UP },
1752 { "st.h23", two (0x07a0, 0x000d), two (0x07e0, 0x000f), {R3, D23_ALIGN1, R1}, 3, PROCESSOR_V850E2_UP | PROCESSOR_OPTION_ALIAS },
1753
1754 { "st.w", two (0x0760, 0x0001), two (0x07e0, 0x0001), {R2, D16_15, R1}, 3, PROCESSOR_ALL },
1755 { "st.w", two (0x0780, 0x000f), two (0x07e0, 0x000f), {R3, D23_ALIGN1, R1}, 3, PROCESSOR_V850E2_UP },
1756 { "st.w23", two (0x0780, 0x000f), two (0x07e0, 0x000f), {R3, D23_ALIGN1, R1}, 3, PROCESSOR_V850E2_UP | PROCESSOR_OPTION_ALIAS },
1757
1758 { "stc.w", two (0x07e0, 0x037a), two (0xffe0, 0x07ff), {R3, R1}, 2, PROCESSOR_V850E3V5_UP },
1759
1760 { "stsr", two (0x07e0, 0x0040), two (0x07e0, 0x07ff), {SR1, R2, SELID}, 0, PROCESSOR_V850E3V5_UP },
1761 { "stsr", two (0x07e0, 0x0040), two (0x07e0, 0x07ff), {SR1, R2}, 0, PROCESSOR_V850E3V5_UP },
1762 { "stsr", two (0x07e0, 0x0040), two (0x07e0, 0x07ff), {OLDSR1, R2}, 0, (PROCESSOR_ALL & (~ PROCESSOR_V850E3V5_UP)) },
1763
1764 { "sttc.gr", two (0x07e0, 0x0052), two (0x07e0, 0xffff), {R1, R2}, 0, PROCESSOR_V850E3V5_UP },
1765 { "sttc.sr", two (0x07e0, 0x0050), two (0x07e0, 0x07ff), {SR1, R2, SELID}, 0, PROCESSOR_V850E3V5_UP },
1766 { "sttc.sr", two (0x07e0, 0x0050), two (0x07e0, 0x07ff), {SR1, R2}, 0, PROCESSOR_V850E3V5_UP },
1767 { "sttc.vr", two (0x07e0, 0x0852), two (0x07e0, 0xffff), {VR1, R2}, 0, PROCESSOR_V850E3V5_UP },
1768 { "sttc.pc", two (0x07e0, 0xf852), two (0x07e0, 0xffff), {R2}, 0, PROCESSOR_V850E3V5_UP },
1769
1770 { "stvc.sr", two (0x07e0, 0x0054), two (0x07e0, 0x07ff), {SR1, R2, SELID}, 0, PROCESSOR_V850E3V5_UP },
1771 { "stvc.sr", two (0x07e0, 0x0054), two (0x07e0, 0x07ff), {SR1, R2}, 0, PROCESSOR_V850E3V5_UP },
1772
1773 { "sub", OP (0x0d), OP_MASK, IF1, 0, PROCESSOR_ALL },
1774
1775 { "subr", OP (0x0c), OP_MASK, IF1, 0, PROCESSOR_ALL },
1776
1777 { "switch", one (0x0040), one (0xffe0), {R1_NOTR0}, 0, PROCESSOR_NOT_V850 },
1778
1779 { "sxb", one (0x00a0), one (0xffe0), {R1}, 0, PROCESSOR_NOT_V850 },
1780
1781 { "sxh", one (0x00e0), one (0xffe0), {R1}, 0, PROCESSOR_NOT_V850 },
1782
1783 { "tlbai", two (0x87e0, 0x8960), two (0xffff, 0xffff), {0}, 0, PROCESSOR_V850E3V5_UP },
1784 { "tlbr", two (0x87e0, 0xe960), two (0xffff, 0xffff), {0}, 0, PROCESSOR_V850E3V5_UP },
1785 { "tlbs", two (0x87e0, 0xc160), two (0xffff, 0xffff), {0}, 0, PROCESSOR_V850E3V5_UP },
1786 { "tlbvi", two (0x87e0, 0x8160), two (0xffff, 0xffff), {0}, 0, PROCESSOR_V850E3V5_UP },
1787 { "tlbw", two (0x87e0, 0xe160), two (0xffff, 0xffff), {0}, 0, PROCESSOR_V850E3V5_UP },
1788
1789 { "trap", two (0x07e0, 0x0100), two (0xffe0, 0xffff), {I5U}, 0, PROCESSOR_ALL },
1790
1791 { "tst", OP (0x0b), OP_MASK, IF1, 0, PROCESSOR_ALL },
1792
1793 { "tst1", two (0xc7c0, 0x0000), two (0xc7e0, 0x0000), {B3, D16, R1}, 3, PROCESSOR_ALL },
1794 { "tst1", two (0x07e0, 0x00e6), two (0x07e0, 0xffff), {R2, R1}, 3, PROCESSOR_NOT_V850 },
1795
1796 { "xor", OP (0x09), OP_MASK, IF1, 0, PROCESSOR_ALL },
1797
1798 { "xori", OP (0x35), OP_MASK, IF6U, 0, PROCESSOR_ALL },
1799
1800 { "zxb", one (0x0080), one (0xffe0), {R1}, 0, PROCESSOR_NOT_V850 },
1801
1802 { "zxh", one (0x00c0), one (0xffe0), {R1}, 0, PROCESSOR_NOT_V850 },
1803
1804 /* Floating point operation. */
1805 { "absf.d", two (0x07e0, 0x0458), two (0x0fff, 0x0fff), {R2_EVEN, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1806 { "absf.s", two (0x07e0, 0x0448), two (0x07ff, 0x07ff), {R2, R3}, 0, PROCESSOR_V850E2V3_UP },
1807 { "addf.d", two (0x07e0, 0x0470), two (0x0fe1, 0x0fff), {R1_EVEN, R2_EVEN, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1808 { "addf.s", two (0x07e0, 0x0460), two (0x07e0, 0x07ff), {R1, R2, R3}, 0, PROCESSOR_V850E2V3_UP },
1809 { "ceilf.dl", two (0x07e2, 0x0454), two (0x0fff, 0x0fff), {R2_EVEN, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1810 { "ceilf.dul", two (0x07f2, 0x0454), two (0x0fff, 0x0fff), {R2_EVEN, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1811 { "ceilf.duw", two (0x07f2, 0x0450), two (0x0fff, 0x07ff), {R2_EVEN, R3}, 0, PROCESSOR_V850E2V3_UP },
1812 { "ceilf.dw", two (0x07e2, 0x0450), two (0x0fff, 0x07ff), {R2_EVEN, R3}, 0, PROCESSOR_V850E2V3_UP },
1813 { "ceilf.sl", two (0x07e2, 0x0444), two (0x07ff, 0x0fff), {R2, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1814 { "ceilf.sul", two (0x07f2, 0x0444), two (0x07ff, 0x0fff), {R2, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1815 { "ceilf.suw", two (0x07f2, 0x0440), two (0x07ff, 0x07ff), {R2, R3}, 0, PROCESSOR_V850E2V3_UP },
1816 { "ceilf.sw", two (0x07e2, 0x0440), two (0x07ff, 0x07ff), {R2, R3}, 0, PROCESSOR_V850E2V3_UP },
1817 { "ceilf.sw", two (0x07e2, 0x0440), two (0x07ff, 0x07ff), {R2, R3}, 0, PROCESSOR_V850E2V3_UP },
1818 { "cmovf.d", two (0x07e0, 0x0410), two (0x0fe1, 0x0ff1), {FFF, R1_EVEN, R2_EVEN, R3_EVEN_NOTR0}, 0, PROCESSOR_V850E2V3_UP },
1819 /* Default value for FFF is 0(not defined in spec). */
1820 { "cmovf.d", two (0x07e0, 0x0410), two (0x0fe1, 0x0fff), {R1_EVEN, R2_EVEN, R3_EVEN_NOTR0}, 0, PROCESSOR_V850E2V3_UP },
1821 { "cmovf.s", two (0x07e0, 0x0400), two (0x07e0, 0x07f1), {FFF, R1, R2, R3_NOTR0}, 0, PROCESSOR_V850E2V3_UP },
1822 /* Default value for FFF is 0(not defined in spec). */
1823 { "cmovf.s", two (0x07e0, 0x0400), two (0x07e0, 0x07ff), {R1, R2, R3_NOTR0}, 0, PROCESSOR_V850E2V3_UP },
1824 { "cmpf.d", two (0x07e0, 0x0430), two (0x0fe1, 0x87f1), {FLOAT_CCCC, R2_EVEN, R1_EVEN, FFF}, 0, PROCESSOR_V850E2V3_UP },
1825 { "cmpf.d", two (0x07e0, 0x0430), two (0x0fe1, 0x87ff), {FLOAT_CCCC, R2_EVEN, R1_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1826 { "cmpf.s", two (0x07e0, 0x0420), two (0x07e0, 0x87f1), {FLOAT_CCCC, R2, R1, FFF}, 0, PROCESSOR_V850E2V3_UP },
1827 { "cmpf.s", two (0x07e0, 0x0420), two (0x07e0, 0x87ff), {FLOAT_CCCC, R2, R1}, 0, PROCESSOR_V850E2V3_UP },
1828 { "cvtf.dl", two (0x07e4, 0x0454), two (0x0fff, 0x0fff), {R2_EVEN, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1829 { "cvtf.ds", two (0x07e3, 0x0452), two (0x0fff, 0x07ff), {R2_EVEN, R3}, 0, PROCESSOR_V850E2V3_UP },
1830 { "cvtf.dul", two (0x07f4, 0x0454), two (0x0fff, 0x0fff), {R2_EVEN, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1831 { "cvtf.duw", two (0x07f4, 0x0450), two (0x0fff, 0x07ff), {R2_EVEN, R3}, 0, PROCESSOR_V850E2V3_UP },
1832 { "cvtf.dw", two (0x07e4, 0x0450), two (0x0fff, 0x07ff), {R2_EVEN, R3}, 0, PROCESSOR_V850E2V3_UP },
1833 { "cvtf.ld", two (0x07e1, 0x0452), two (0x0fff, 0x0fff), {R2_EVEN, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1834 { "cvtf.ls", two (0x07e1, 0x0442), two (0x0fff, 0x07ff), {R2_EVEN, R3}, 0, PROCESSOR_V850E2V3_UP },
1835 { "cvtf.sd", two (0x07e2, 0x0452), two (0x07ff, 0x0fff), {R2, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1836 { "cvtf.sl", two (0x07e4, 0x0444), two (0x07ff, 0x0fff), {R2, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1837 { "cvtf.sul", two (0x07f4, 0x0444), two (0x07ff, 0x0fff), {R2, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1838 { "cvtf.suw", two (0x07f4, 0x0440), two (0x07ff, 0x07ff), {R2, R3}, 0, PROCESSOR_V850E2V3_UP },
1839 { "cvtf.sw", two (0x07e4, 0x0440), two (0x07ff, 0x07ff), {R2, R3}, 0, PROCESSOR_V850E2V3_UP },
1840 { "cvtf.uld", two (0x07f1, 0x0452), two (0x0fff, 0x0fff), {R2_EVEN, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1841 { "cvtf.uls", two (0x07f1, 0x0442), two (0x0fff, 0x07ff), {R2_EVEN, R3}, 0, PROCESSOR_V850E2V3_UP },
1842 { "cvtf.uwd", two (0x07f0, 0x0452), two (0x07ff, 0x0fff), {R2, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1843 { "cvtf.uws", two (0x07f0, 0x0442), two (0x07ff, 0x07ff), {R2, R3}, 0, PROCESSOR_V850E2V3_UP },
1844 { "cvtf.wd", two (0x07e0, 0x0452), two (0x07ff, 0x0fff), {R2, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1845 { "cvtf.ws", two (0x07e0, 0x0442), two (0x07ff, 0x07ff), {R2, R3}, 0, PROCESSOR_V850E2V3_UP },
1846 { "divf.d", two (0x07e0, 0x047e), two (0x0fe1, 0x0fff), {R1_EVEN, R2_EVEN, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1847 { "divf.s", two (0x07e0, 0x046e), two (0x07e0, 0x07ff), {R1_NOTR0, R2, R3}, 0, PROCESSOR_V850E2V3_UP },
1848 { "floorf.dl", two (0x07e3, 0x0454), two (0x0fff, 0x0fff), {R2_EVEN, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1849 { "floorf.dul", two (0x07f3, 0x0454), two (0x0fff, 0x0fff), {R2_EVEN, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1850 { "floorf.duw", two (0x07f3, 0x0450), two (0x0fff, 0x07ff), {R2_EVEN, R3}, 0, PROCESSOR_V850E2V3_UP },
1851 { "floorf.dw", two (0x07e3, 0x0450), two (0x0fff, 0x07ff), {R2_EVEN, R3}, 0, PROCESSOR_V850E2V3_UP },
1852 { "floorf.sl", two (0x07e3, 0x0444), two (0x07ff, 0x0fff), {R2, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1853 { "floorf.sul", two (0x07f3, 0x0444), two (0x07ff, 0x0fff), {R2, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1854 { "floorf.suw", two (0x07f3, 0x0440), two (0x07ff, 0x07ff), {R2, R3}, 0, PROCESSOR_V850E2V3_UP },
1855 { "floorf.sw", two (0x07e3, 0x0440), two (0x07ff, 0x07ff), {R2, R3}, 0, PROCESSOR_V850E2V3_UP },
1856 { "maddf.s", two (0x07e0, 0x0500), two (0x07e0, 0x0761), {R1, R2, R3, R4}, 0, PROCESSOR_V850E2V3_UP },
1857 { "maxf.d", two (0x07e0, 0x0478), two (0x0fe1, 0x0fff), {R1_EVEN, R2_EVEN, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1858 { "maxf.s", two (0x07e0, 0x0468), two (0x07e0, 0x07ff), {R1, R2, R3}, 0, PROCESSOR_V850E2V3_UP },
1859 { "minf.d", two (0x07e0, 0x047a), two (0x0fe1, 0x0fff), {R1_EVEN, R2_EVEN, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1860 { "minf.s", two (0x07e0, 0x046a), two (0x07e0, 0x07ff), {R1, R2, R3}, 0, PROCESSOR_V850E2V3_UP },
1861 { "msubf.s", two (0x07e0, 0x0520), two (0x07e0, 0x0761), {R1, R2, R3, R4}, 0, PROCESSOR_V850E2V3_UP },
1862 { "mulf.d", two (0x07e0, 0x0474), two (0x0fe1, 0x0fff), {R1_EVEN, R2_EVEN, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1863 { "mulf.s", two (0x07e0, 0x0464), two (0x07e0, 0x07ff), {R1, R2, R3}, 0, PROCESSOR_V850E2V3_UP },
1864 { "negf.d", two (0x07e1, 0x0458), two (0x0fff, 0x0fff), {R2_EVEN, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1865 { "negf.s", two (0x07e1, 0x0448), two (0x07ff, 0x07ff), {R2, R3}, 0, PROCESSOR_V850E2V3_UP },
1866 { "nmaddf.s", two (0x07e0, 0x0540), two (0x07e0, 0x0761), {R1, R2, R3, R4}, 0, PROCESSOR_V850E2V3_UP },
1867 { "nmsubf.s", two (0x07e0, 0x0560), two (0x07e0, 0x0761), {R1, R2, R3, R4}, 0, PROCESSOR_V850E2V3_UP },
1868 { "recipf.d", two (0x07e1, 0x045e), two (0x0fff, 0x0fff), {R2_EVEN, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1869 { "recipf.s", two (0x07e1, 0x044e), two (0x07ff, 0x07ff), {R2, R3}, 0, PROCESSOR_V850E2V3_UP },
1870
1871 { "roundf.dl", two (0x07e0, 0x0454), two (0x0fff, 0x0fff), {R2_EVEN, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP | PROCESSOR_OPTION_EXTENSION },
1872 { "roundf.dul", two (0x07f0, 0x0454), two (0x0fff, 0x0fff), {R2_EVEN, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP | PROCESSOR_OPTION_EXTENSION },
1873 { "roundf.duw", two (0x07f0, 0x0450), two (0x0fff, 0x07ff), {R2_EVEN, R3}, 0, PROCESSOR_V850E2V3_UP | PROCESSOR_OPTION_EXTENSION },
1874 { "roundf.dw", two (0x07e0, 0x0450), two (0x0fff, 0x07ff), {R2_EVEN, R3}, 0, PROCESSOR_V850E2V3_UP | PROCESSOR_OPTION_EXTENSION },
1875 { "roundf.sl", two (0x07e0, 0x0444), two (0x07ff, 0x0fff), {R2, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP | PROCESSOR_OPTION_EXTENSION },
1876 { "roundf.sul", two (0x07f0, 0x0444), two (0x07ff, 0x0fff), {R2, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP | PROCESSOR_OPTION_EXTENSION },
1877 { "roundf.suw", two (0x07f0, 0x0440), two (0x07ff, 0x07ff), {R2, R3}, 0, PROCESSOR_V850E2V3_UP | PROCESSOR_OPTION_EXTENSION },
1878 { "roundf.sw", two (0x07e0, 0x0440), two (0x07ff, 0x07ff), {R2, R3}, 0, PROCESSOR_V850E2V3_UP | PROCESSOR_OPTION_EXTENSION },
1879
1880 { "rsqrtf.d", two (0x07e2, 0x045e), two (0x0fff, 0x0fff), {R2_EVEN, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1881 { "rsqrtf.s", two (0x07e2, 0x044e), two (0x07ff, 0x07ff), {R2, R3}, 0, PROCESSOR_V850E2V3_UP },
1882 { "sqrtf.d", two (0x07e0, 0x045e), two (0x0fff, 0x0fff), {R2_EVEN, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1883 { "sqrtf.s", two (0x07e0, 0x044e), two (0x07ff, 0x07ff), {R2, R3}, 0, PROCESSOR_V850E2V3_UP },
1884 { "subf.d", two (0x07e0, 0x0472), two (0x0fe1, 0x0fff), {R1_EVEN, R2_EVEN, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1885 { "subf.s", two (0x07e0, 0x0462), two (0x07e0, 0x07ff), {R1, R2, R3}, 0, PROCESSOR_V850E2V3_UP },
1886 { "trfsr", two (0x07e0, 0x0400), two (0xffff, 0xfff1), {FFF}, 0, PROCESSOR_V850E2V3_UP },
1887 { "trfsr", two (0x07e0, 0x0400), two (0xffff, 0xffff), {0}, 0, PROCESSOR_V850E2V3_UP },
1888 { "trncf.dl", two (0x07e1, 0x0454), two (0x0fff, 0x0fff), {R2_EVEN, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1889 { "trncf.dul", two (0x07f1, 0x0454), two (0x0fff, 0x0fff), {R2_EVEN, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1890 { "trncf.duw", two (0x07f1, 0x0450), two (0x0fff, 0x07ff), {R2_EVEN, R3}, 0, PROCESSOR_V850E2V3_UP },
1891 { "trncf.dw", two (0x07e1, 0x0450), two (0x0fff, 0x07ff), {R2_EVEN, R3}, 0, PROCESSOR_V850E2V3_UP },
1892 { "trncf.sl", two (0x07e1, 0x0444), two (0x07ff, 0x0fff), {R2, R3_EVEN}, 0, PROCESSOR_V850E2V3_UP },
1893 { "trncf.sul", two (0x07f1, 0x0444), two (0x07ff, 0x07ff), {R2, R3}, 0, PROCESSOR_V850E2V3_UP },
1894 { "trncf.suw", two (0x07f1, 0x0440), two (0x07ff, 0x07ff), {R2, R3}, 0, PROCESSOR_V850E2V3_UP },
1895 { "trncf.sw", two (0x07e1, 0x0440), two (0x07ff, 0x07ff), {R2, R3}, 0, PROCESSOR_V850E2V3_UP },
1896
1897 /* Special instruction (from gdb) mov 1, r0. */
1898 { "breakpoint", one (0x0001), one (0xffff), {UNUSED}, 0, PROCESSOR_ALL },
1899
1900 { "synci", one (0x001c), one (0xffff), {0}, 0, PROCESSOR_V850E3V5_UP },
1901
1902 { "synce", one (0x001d), one (0xffff), {0}, 0, PROCESSOR_V850E2V3_UP },
1903 { "syncm", one (0x001e), one (0xffff), {0}, 0, PROCESSOR_V850E2V3_UP },
1904 { "syncp", one (0x001f), one (0xffff), {0}, 0, PROCESSOR_V850E2V3_UP },
1905 { "syscall", two (0xd7e0, 0x0160), two (0xffe0, 0xc7ff), {V8}, 0, PROCESSOR_V850E2V3_UP },
1906 /* Alias of syncp. */
1907 { "sync", one (0x001f), one (0xffff), {0}, 0, PROCESSOR_V850E2V3_UP | PROCESSOR_OPTION_ALIAS },
1908 { "rmtrap", one (0xf040), one (0xffff), {0}, 0, PROCESSOR_V850E2V3_UP },
1909 { "rie", one (0x0040), one (0xffff), {0}, 0, PROCESSOR_V850E2V3_UP },
1910 { "rie", two (0x07f0, 0x0000), two (0x07f0, 0xffff), {RIE_IMM5,RIE_IMM4}, 0, PROCESSOR_V850E2V3_UP },
1911
1912 { 0, 0, 0, {0}, 0, 0 },
1913 } ;
1914
1915 const int v850_num_opcodes =
1916 sizeof (v850_opcodes) / sizeof (v850_opcodes[0]);
This page took 0.2022 seconds and 5 git commands to generate.