ubsan: score: left shift of negative value
[deliverable/binutils-gdb.git] / opcodes / score-dis.c
CommitLineData
1c0d3aa6 1/* Instruction printing code for Score
b3adc24a 2 Copyright (C) 2006-2020 Free Software Foundation, Inc.
1c0d3aa6 3 Contributed by:
c3b7224a 4 Brain.lin (brain.lin@sunplusct.com)
1c0d3aa6
NC
5 Mei Ligang (ligang@sunnorth.com.cn)
6 Pei-Lin Tsai (pltsai@sunplus.com)
7
9b201bb5 8 This file is part of the GNU opcodes library.
1c0d3aa6 9
9b201bb5
NC
10 This library is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3, or (at your option)
1c0d3aa6
NC
13 any later version.
14
9b201bb5
NC
15 It is distributed in the hope that it will be useful, but WITHOUT
16 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
17 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
18 License for more details.
1c0d3aa6
NC
19
20 You should have received a copy of the GNU General Public License
9b201bb5
NC
21 along with this file; see the file COPYING. If not, write to the
22 Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
23 MA 02110-1301, USA. */
1c0d3aa6
NC
24
25#include "sysdep.h"
88c1242d 26#include "disassemble.h"
1c0d3aa6 27#define DEFINE_TABLE
1c0d3aa6
NC
28#include "opintl.h"
29#include "bfd.h"
30
31/* FIXME: This shouldn't be done here. */
32#include "elf-bfd.h"
33#include "elf/internal.h"
34#include "elf/score.h"
35
02b1cb40 36#ifdef BFD64
c3b7224a 37/* s3_s7: opcodes and export prototypes. */
43e65147 38extern int
c3b7224a
NC
39s7_print_insn (bfd_vma pc, struct disassemble_info *info, bfd_boolean little);
40
41struct score_opcode
42{
43 bfd_vma value;
44 bfd_vma mask; /* Recognise instruction if (op & mask) == value. */
45 char *assembler; /* Disassembly string. */
46};
47
48/* Note: There is a partial ordering in this table - it must be searched from
49 the top to obtain a correct match. */
50
51static struct score_opcode score_opcodes[] =
52{
53 /* Score Instructions. */
54 {0x3800000a, 0x3e007fff, "abs\t\t%20-24r, %15-19r"},
43e65147 55 {0x3800004b, 0x3e007fff, "abs.s\t\t%20-24r, %15-19r"},
c3b7224a
NC
56 {0x00000010, 0x3e0003ff, "add\t\t%20-24r, %15-19r, %10-14r"},
57 {0x00000011, 0x3e0003ff, "add.c\t\t%20-24r, %15-19r, %10-14r"},
58 {0x38000048, 0x3e0003ff, "add.s\t\t%20-24r, %15-19r, %10-14r"},
59 {0x00000012, 0x3e0003ff, "addc\t\t%20-24r, %15-19r, %10-14r"},
60 {0x00000013, 0x3e0003ff, "addc.c\t\t%20-24r, %15-19r, %10-14r"},
61 {0x02000000, 0x3e0e0001, "addi\t\t%20-24r, %1-16i"},
62 {0x02000001, 0x3e0e0001, "addi.c\t\t%20-24r, %1-16i"},
63 {0x0a000000, 0x3e0e0001, "addis\t\t%20-24r, %1-16d(0x%1-16x)"},
64 {0x0a000001, 0x3e0e0001, "addis.c\t\t%20-24r, %1-16d(0x%1-16x)"},
65 {0x10000000, 0x3e000001, "addri\t\t%20-24r, %15-19r, %1-14i"},
66 {0x10000001, 0x3e000001, "addri.c\t\t%20-24r, %15-19r, %1-14i"},
67 {0x00004800, 0x00007f00, "add!\t\t%4-7r, %0-3r"},
68 {0x00005c00, 0x00007c00, "addi!\t\t%6-9r, %0-5i"},
69 {0x00000020, 0x3e0003ff, "and\t\t%20-24r, %15-19r, %10-14r"},
70 {0x00000021, 0x3e0003ff, "and.c\t\t%20-24r, %15-19r, %10-14r"},
71 {0x040000000000LL, 0x1c0000000003LL, "andri48\t\t%38-41r,%34-37r, 0x%2-33x"},
72 {0x040000000001LL, 0x1c0000000003LL, "andri48.c\t\t%38-41r,%34-37r, 0x%2-33x"},
73 {0x02080000, 0x3e0e0001, "andi\t\t%20-24r, 0x%1-16x"},
74 {0x02080001, 0x3e0e0001, "andi.c\t\t%20-24r, 0x%1-16x"},
75 {0x0a080000, 0x3e0e0001, "andis\t\t%20-24r, 0x%1-16x"},
76 {0x0a080001, 0x3e0e0001, "andis.c\t\t%20-24r, 0x%1-16x"},
77 {0x18000000, 0x3e000001, "andri\t\t%20-24r, %15-19r, 0x%1-14x"},
78 {0x18000001, 0x3e000001, "andri.c\t\t%20-24r, %15-19r,0x%1-14x"},
79 {0x00004b00, 0x00007f00, "and!\t\t%4-7r, %0-3r"},
80 {0x08000000, 0x3e007c01, "bcs\t\t%b"},
81 {0x08000400, 0x3e007c01, "bcc\t\t%b"},
82 {0x08003800, 0x3e007c01, "bcnz\t\t%b"},
83 {0x08000001, 0x3e007c01, "bcsl\t\t%b"},
84 {0x08000401, 0x3e007c01, "bccl\t\t%b"},
85 {0x08003801, 0x3e007c01, "bcnzl\t\t%b"},
86 {0x0000004c, 0x3e00007e, "bcmpeqz\t\t%15-19r, %z"},
87 {0x0000004c, 0x3e00007e, "bcmpeq\t\t%15-19r, %z"},
88 {0x0000004e, 0x3e00007e, "bcmpnez\t\t%15-19r, %z"},
89 {0x0000004e, 0x3e00007e, "bcmpne\t\t%15-19r, %z"},
90 {0x00003200, 0x00007e00, "bcnz!\t\t%b"},
91 {0x08001000, 0x3e007c01, "beq\t\t%b"},
92 {0x08001001, 0x3e007c01, "beql\t\t%b"},
93 {0x00003800, 0x00007e00, "beq!\t\t%b"},
94 {0x08000800, 0x3e007c01, "bgtu\t\t%b"},
95 {0x08001800, 0x3e007c01, "bgt\t\t%b"},
96 {0x08002000, 0x3e007c01, "bge\t\t%b"},
97 {0x08000801, 0x3e007c01, "bgtul\t\t%b"},
98 {0x08001801, 0x3e007c01, "bgtl\t\t%b"},
99 {0x08002001, 0x3e007c01, "bgel\t\t%b"},
100 {0x00003400, 0x00007e00, "bgtu!\t\t%b"},
101 {0x00003c00, 0x00007e00, "bgt!\t\t%b"},
102 {0x00000029, 0x3e0003ff, "bitclr.c\t%20-24r, %15-19r, 0x%10-14x"},
103 {0x00000028, 0x3e0003ff, "bitclr\t%20-24r, %15-19r, 0x%10-14x"},
104 {0x0000002b, 0x3e0003ff, "bitset.c\t%20-24r, %15-19r, 0x%10-14x"},
105 {0x0000002a, 0x3e0003ff, "bitset\t%20-24r, %15-19r, 0x%10-14x"},
106 {0x0000002d, 0x3e0003ff, "bittst.c\t%15-19r, 0x%10-14x"},
107 {0x0000002f, 0x3e0003ff, "bittgl.c\t%20-24r, %15-19r, 0x%10-14x"},
108 {0x0000002e, 0x3e0003ff, "bittgl\t%20-24r, %15-19r, 0x%10-14x"},
109 {0x00005000, 0x00007e00, "bitclr!\t\t%5-8r, 0x%0-4x"},
110 {0x3800000c, 0x3e0003ff, "bitrev\t\t%20-24r, %15-19r,%10-14r"},
111 {0x00005200, 0x00007e00, "bitset!\t\t%5-8r, 0x%0-4x"},
112 {0x00005400, 0x00007e00, "bittst!\t\t%5-8r, 0x%0-4x"},
113 {0x00005600, 0x00007e00, "bittgl!\t\t%5-8r, 0x%0-4x"},
114 {0x08000c00, 0x3e007c01, "bleu\t\t%b"},
115 {0x08001c00, 0x3e007c01, "ble\t\t%b"},
116 {0x08002400, 0x3e007c01, "blt\t\t%b"},
117 {0x08000c01, 0x3e007c01, "bleul\t\t%b"},
118 {0x08001c01, 0x3e007c01, "blel\t\t%b"},
119 {0x08002401, 0x3e007c01, "bltl\t\t%b"},
120 {0x08003c01, 0x3e007c01, "bl\t\t%b"},
121 {0x00003600, 0x00007e00, "bleu!\t\t%b"},
122 {0x00003e00, 0x00007e00, "ble!\t\t%b"},
123 {0x08002800, 0x3e007c01, "bmi\t\t%b"},
124 {0x08002801, 0x3e007c01, "bmil\t\t%b"},
125 {0x08001400, 0x3e007c01, "bne\t\t%b"},
126 {0x08001401, 0x3e007c01, "bnel\t\t%b"},
127 {0x00003a00, 0x00007e00, "bne!\t\t%b"},
128 {0x08002c00, 0x3e007c01, "bpl\t\t%b"},
129 {0x08002c01, 0x3e007c01, "bpll\t\t%b"},
130 {0x00000008, 0x3e007fff, "brcs\t\t%15-19r"},
131 {0x00000408, 0x3e007fff, "brcc\t\t%15-19r"},
132 {0x00000808, 0x3e007fff, "brgtu\t\t%15-19r"},
133 {0x00000c08, 0x3e007fff, "brleu\t\t%15-19r"},
134 {0x00001008, 0x3e007fff, "breq\t\t%15-19r"},
135 {0x00001408, 0x3e007fff, "brne\t\t%15-19r"},
136 {0x00001808, 0x3e007fff, "brgt\t\t%15-19r"},
137 {0x00001c08, 0x3e007fff, "brle\t\t%15-19r"},
138 {0x00002008, 0x3e007fff, "brge\t\t%15-19r"},
139 {0x00002408, 0x3e007fff, "brlt\t\t%15-19r"},
140 {0x00002808, 0x3e007fff, "brmi\t\t%15-19r"},
141 {0x00002c08, 0x3e007fff, "brpl\t\t%15-19r"},
142 {0x00003008, 0x3e007fff, "brvs\t\t%15-19r"},
143 {0x00003408, 0x3e007fff, "brvc\t\t%15-19r"},
144 {0x00003808, 0x3e007fff, "brcnz\t\t%15-19r"},
145 {0x00003c08, 0x3e007fff, "br\t\t%15-19r"},
146 {0x00000009, 0x3e007fff, "brcsl\t\t%15-19r"},
147 {0x00000409, 0x3e007fff, "brccl\t\t%15-19r"},
148 {0x00000809, 0x3e007fff, "brgtul\t\t%15-19r"},
149 {0x00000c09, 0x3e007fff, "brleul\t\t%15-19r"},
150 {0x00001009, 0x3e007fff, "breql\t\t%15-19r"},
151 {0x00001409, 0x3e007fff, "brnel\t\t%15-19r"},
152 {0x00001809, 0x3e007fff, "brgtl\t\t%15-19r"},
153 {0x00001c09, 0x3e007fff, "brlel\t\t%15-19r"},
154 {0x00002009, 0x3e007fff, "brgel\t\t%15-19r"},
155 {0x00002409, 0x3e007fff, "brltl\t\t%15-19r"},
156 {0x00002809, 0x3e007fff, "brmil\t\t%15-19r"},
157 {0x00002c09, 0x3e007fff, "brpll\t\t%15-19r"},
158 {0x00003009, 0x3e007fff, "brvsl\t\t%15-19r"},
159 {0x00003409, 0x3e007fff, "brvcl\t\t%15-19r"},
160 {0x00003809, 0x3e007fff, "brcnzl\t\t%15-19r"},
161 {0x00003c09, 0x3e007fff, "brl\t\t%15-19r"},
162 {0x00000080, 0x00007fe0, "br!\t\t%0-4r"},
163 {0x000000a0, 0x00007fe0, "brl!\t\t%0-4r"},
164 {0x000000c0, 0x00007fe0, "brr!\t\t%0-4r"},
165 {0x08003000, 0x3e007c01, "bvs\t\t%b"},
166 {0x08003400, 0x3e007c01, "bvc\t\t%b"},
167 {0x08003001, 0x3e007c01, "bvsl\t\t%b"},
168 {0x08003401, 0x3e007c01, "bvcl\t\t%b"},
169 {0x00003000, 0x00007e00, "b!\t\t%b"},
170 {0x08003c00, 0x3e007c01, "b\t\t%b"},
171 {0x30000000, 0x3ff00000, "cache\t\t%20-24d, [%15-19r, %0-14i]"},
172 {0x30100000, 0x3ff00000, "cache\t\t%20-24d, [%15-19r, %0-14i]"},
173 {0x30200000, 0x3ff00000, "cache\t\t%20-24d, [%15-19r, %0-14i]"},
174 {0x30300000, 0x3ff00000, "cache\t\t%20-24d, [%15-19r, %0-14i]"},
175 {0x30400000, 0x3ff00000, "cache\t\t%20-24d, [%15-19r, %0-14i]"},
176 {0x30800000, 0x3ff00000, "cache\t\t%20-24d, [%15-19r, %0-14i]"},
177 {0x30900000, 0x3ff00000, "cache\t\t%20-24d, [%15-19r, %0-14i]"},
178 {0x30a00000, 0x3ff00000, "cache\t\t%20-24d, [%15-19r, %0-14i]"},
179 {0x30b00000, 0x3ff00000, "cache\t\t%20-24d, [%15-19r, %0-14i]"},
180 {0x30c00000, 0x3ff00000, "cache\t\t%20-24d, [%15-19r, %0-14i]"},
181 {0x30d00000, 0x3ff00000, "cache\t\t%20-24d, [%15-19r, %0-14i]"},
182 {0x30e00000, 0x3ff00000, "cache\t\t%20-24d, [%15-19r, %0-14i]"},
183 {0x31000000, 0x3ff00000, "cache\t\t%20-24d, [%15-19r, %0-14i]"},
184 {0x31100000, 0x3ff00000, "cache\t\t%20-24d, [%15-19r, %0-14i]"},
185 {0x31800000, 0x3ff00000, "cache\t\t%20-24d, [%15-19r, %0-14i]"},
186 {0x31a00000, 0x3ff00000, "cache\t\t%20-24d, [%15-19r, %0-14i]"},
187 {0x31b00000, 0x3ff00000, "cache\t\t%20-24d, [%15-19r, %0-14i]"},
188 {0x31c00000, 0x3ff00000, "cache\t\t%20-24d, [%15-19r, %0-14i]"},
189 {0x31d00000, 0x3ff00000, "cache\t\t%20-24d, [%15-19r, %0-14i]"},
190 {0x31e00000, 0x3ff00000, "cache\t\t%20-24d, [%15-19r, %0-14i]"},
191 {0x31f00000, 0x3ff00000, "cache\t\t%20-24d, [%15-19r, %0-14i]"},
192 {0x38000000, 0x3ff003ff, "mad\t\t%15-19r, %10-14r"},
43e65147 193 {0x38000020, 0x3ff003ff, "madu\t\t%15-19r, %10-14r"},
c3b7224a 194 {0x38000080, 0x3ff003ff, "mad.f\t\t%15-19r, %10-14r"},
43e65147 195 {0x38000001, 0x3ff003ff, "msb\t\t%15-19r, %10-14r"},
c3b7224a
NC
196 {0x38000021, 0x3ff003ff, "msbu\t\t%15-19r, %10-14r"},
197 {0x38000081, 0x3ff003ff, "msb.f\t\t%15-19r, %10-14r"},
43e65147
L
198 {0x38000102, 0x3ff003ff, "mazl\t\t%15-19r, %10-14r"},
199 {0x38000182, 0x3ff003ff, "mazl.f\t\t%15-19r, %10-14r"},
200 {0x38000002, 0x3ff003ff, "madl\t\t%15-19r, %10-14r"},
201 {0x380000c2, 0x3ff003ff, "madl.fs\t\t%15-19r, %10-14r"},
202 {0x38000303, 0x3ff003ff, "mazh\t\t%15-19r, %10-14r"},
203 {0x38000383, 0x3ff003ff, "mazh.f\t\t%15-19r, %10-14r"},
204 {0x38000203, 0x3ff003ff, "madh\t\t%15-19r, %10-14r"},
205 {0x380002c3, 0x3ff003ff, "madh.fs\t\t%15-19r, %10-14r"},
206 {0x38000007, 0x3e0003ff, "max\t\t%20-24r, %15-19r, %10-14r"},
207
208 {0x00000064, 0x3e00007e, "mbitclr\t\t[%15-19r, %m], %10-14d"},
209 {0x0000006c, 0x3e00007e, "mbitset\t\t[%15-19r, %m], %10-14d"},
c3b7224a
NC
210
211 {0x38000006, 0x3e0003ff, "min\t\t%20-24r, %15-19r, %10-14r"},
43e65147
L
212 {0x38000104, 0x3ff003ff, "mszl\t\t%15-19r, %10-14r"},
213 {0x38000184, 0x3ff003ff, "mszl.f\t\t%15-19r, %10-14r"},
214 {0x38000004, 0x3ff003ff, "msbl\t\t%15-19r, %10-14r"},
c3b7224a 215 {0x380000c4, 0x3ff003ff, "msbl.fs\t\t%15-19r, %10-14r"},
43e65147
L
216 {0x38000305, 0x3ff003ff, "mszh\t\t%15-19r, %10-14r"},
217 {0x38000385, 0x3ff003ff, "mszh.f\t\t%15-19r, %10-14r"},
218 {0x38000205, 0x3ff003ff, "msbh\t\t%15-19r, %10-14r"},
219 {0x380002c5, 0x3ff003ff, "msbh.fs\t\t%15-19r, %10-14r"},
220 {0x3800004e, 0x3e0003ff, "sll.s\t\t%20-24r, %15-19r, %10-14r"},
221 {0x38000049, 0x3e0003ff, "sub.s\t\t%20-24r, %15-19r, %10-14r"},
222 {0x0000001c, 0x3e007fff, "clz\t\t%20-24r, %15-19r"},
c3b7224a
NC
223 {0x38000000, 0x3e000000, "ceinst\t\t%20-24d, %15-19r, %10-14r, %5-9d, %0-4d"},
224 {0x00000019, 0x3ff003ff, "cmpteq.c\t\t%15-19r, %10-14r"},
225 {0x00100019, 0x3ff003ff, "cmptmi.c\t\t%15-19r, %10-14r"},
226 {0x00300019, 0x3ff003ff, "cmp.c\t\t%15-19r, %10-14r"},
227 {0x0000001b, 0x3ff07fff, "cmpzteq.c\t%15-19r"},
228 {0x0010001b, 0x3ff07fff, "cmpztmi.c\t%15-19r"},
229 {0x0030001b, 0x3ff07fff, "cmpz.c\t\t%15-19r"},
230 {0x02040001, 0x3e0e0001, "cmpi.c\t\t%20-24r, %1-16i"},
231 {0x00004400, 0x00007c00, "cmp!\t\t%5-9r, %0-4r"},
232 {0x00006000, 0x00007c00, "cmpi!\t\t%5-9r, %0-4i"},
233 {0x0c00000c, 0x3e00001f, "cop1\t\tc%20-24r, c%15-19r, c%10-14r, %5-9d"},
234 {0x0c000014, 0x3e00001f, "cop2\t\tc%20-24r, c%15-19r, c%10-14r, %5-9d"},
235 {0x0c00001c, 0x3e00001f, "cop3\t\tc%20-24r, c%15-19r, c%10-14r, %5-9d"},
236 {0x00000044, 0x3e0003ff, "div\t\t%15-19r, %10-14r"},
237 {0x00000144, 0x3e0003ff, "divr.q\t\t%20-24r,%15-19r, %10-14r"},
238 {0x00000244, 0x3e0003ff, "divr.r\t\t%20-24r,%15-19r, %10-14r"},
239 {0x00000344, 0x3e0003ff, "divr\t\t%20-24r,%15-19r, %10-14r"},
240 {0x00000046, 0x3e0003ff, "divu\t\t%15-19r, %10-14r"},
241 {0x00000146, 0x3e0003ff, "divur.q\t\t%20-24r,%15-19r, %10-14r"},
242 {0x00000246, 0x3e0003ff, "divur.r\t\t%20-24r,%15-19r, %10-14r"},
243 {0x00000346, 0x3e0003ff, "divur\t\t%20-24r,%15-19r, %10-14r"},
244 {0x0c0000a4, 0x3e0003ff, "drte"},
245 {0x00e0, 0xffe1, "disint!"},
246 {0x00e1, 0xffe1, "enint!"},
247 {0x00000058, 0x3e0003ff, "extsb\t\t%20-24r, %15-19r"},
248 {0x00000059, 0x3e0003ff, "extsb.c\t\t%20-24r, %15-19r"},
249 {0x0000005a, 0x3e0003ff, "extsh\t\t%20-24r, %15-19r"},
250 {0x0000005b, 0x3e0003ff, "extsh.c\t\t%20-24r, %15-19r"},
251 {0x0000005c, 0x3e0003ff, "extzb\t\t%20-24r, %15-19r"},
252 {0x0000005d, 0x3e0003ff, "extzb.c\t\t%20-24r, %15-19r"},
253 {0x0000005e, 0x3e0003ff, "extzh\t\t%20-24r, %15-19r"},
254 {0x0000005f, 0x3e0003ff, "extzh.c\t\t%20-24r, %15-19r"},
255 {0x04000001, 0x3e000001, "jl\t\t%j"},
256 {0x04000000, 0x3e000001, "j\t\t%j"},
257 {0x26000000, 0x3e000000, "lb\t\t%20-24r, [%15-19r, %0-14i]"},
258 {0x2c000000, 0x3e000000, "lbu\t\t%20-24r, [%15-19r, %0-14i]"},
259 {0x06000003, 0x3e000007, "lb\t\t%20-24r, [%15-19r, %3-14i]+"},
260 {0x06000006, 0x3e000007, "lbu\t\t%20-24r, [%15-19r, %3-14i]+"},
261 {0x0e000003, 0x3e000007, "lb\t\t%20-24r, [%15-19r]+, %3-14i"},
262 {0x0e000006, 0x3e000007, "lbu\t\t%20-24r, [%15-19r]+, %3-14i"},
263 {0x00000060, 0x3e0003ff, "lcb\t\t[%15-19r]+"},
264 {0x00000062, 0x3e0003ff, "lcw\t\t%20-24r, [%15-19r]+"},
265 {0x00000066, 0x3e0003ff, "lce\t\t%20-24r, [%15-19r]+"},
266 {0x0c00000a, 0x3e00001f, "ldc1\t\tc%15-19r, [%20-24r, %5-14i]"},
267 {0x0c000012, 0x3e00001f, "ldc2\t\tc%15-19r, [%20-24r, %5-14i]"},
268 {0x0c00001a, 0x3e00001f, "ldc3\t\tc%15-19r, [%20-24r, %5-14i]"},
269 {0x000000000001LL, 0x1c000000001fLL, "ldi48\t\t%37-41r, %5-36i"},
270 {0x22000000, 0x3e000000, "lh\t\t%20-24r, [%15-19r, %0-14i]"},
271 {0x24000000, 0x3e000000, "lhu\t\t%20-24r, [%15-19r, %0-14i]"},
272 {0x06000001, 0x3e000007, "lh\t\t%20-24r, [%15-19r, %3-14i]+"},
273 {0x06000002, 0x3e000007, "lhu\t\t%20-24r, [%15-19r, %3-14i]+"},
274 {0x0e000001, 0x3e000007, "lh\t\t%20-24r, [%15-19r]+, %3-14i"},
275 {0x0e000002, 0x3e000007, "lhu\t\t%20-24r, [%15-19r]+, %3-14i"},
276 {0x020c0000, 0x3e0e0000, "ldi\t\t%20-24r, 0x%1-16x(%1-16i)"},
277 {0x0a0c0000, 0x3e0e0000, "ldis\t\t%20-24r, 0x%1-16x(%1-16i)"},
278 {0x00006400, 0x00007c00, "ldiu!\t\t%5-9r, %0-4d"},
279 {0x00000032, 0x3e0003ff, "ltbw\t\t%20-24r, [%15-19r, %10-14r]"},
280 {0x00000132, 0x3e0003ff, "ltbh\t\t%20-24r, [%15-19r, %10-14r]"},
281 {0x00000332, 0x3e0003ff, "ltbb\t\t%20-24r, [%15-19r, %10-14r]"},
282 {0x0000000c, 0x3e0003ff, "alw\t\t%20-24r, [%15-19r]"},
283 {0x20000000, 0x3e000000, "lw\t\t%20-24r, [%15-19r, %0-14i]"},
284 {0x06000000, 0x3e000007, "lw\t\t%20-24r, [%15-19r, %3-14i]+"},
285 {0x0e000000, 0x3e000007, "lw\t\t%20-24r, [%15-19r]+, %3-14i"},
286 {0x00001000, 0x00007000, "lw!\t\t%8-11r, [%5-7r,%0-4d2]"},
287 {0x000000000002LL, 0x1c000000001fLL, "lw48\t\t%37-41r,[0x%7-36w]"},
43e65147
L
288 {0x00007a00, 0x00007f00, "madl.fs!\t\t%4-7r, %0-3r"},
289 {0x00007500, 0x00007f00, "madu!\t\t%4-7r, %0-3r"},
c3b7224a 290 {0x00007400, 0x00007f00, "mad.f!\t\t%4-7r, %0-3r"},
43e65147 291 {0x00007900, 0x00007f00, "mazh.f!\t\t%4-7r, %0-3r"},
c3b7224a
NC
292 {0x00007800, 0x00007f00, "mazl.f!\t\t%4-7r, %0-3r"},
293 {0x00000448, 0x3e007fff, "mfcel\t\t%20-24r"},
294 {0x00007100, 0x00007ff0, "mfcel!\t\t%0-3r"},
43e65147
L
295 {0x00000848, 0x3e007fff, "mfceh\t\t%20-24r"},
296 {0x00007110, 0x00007ff0, "mfceh!\t\t%0-3r"},
c3b7224a
NC
297 {0x00000c48, 0x3e007fff, "mfcehl\t\t%20-24r, %15-19r"},
298 {0x00000048, 0x3e0003ff, "mfce\t\t%20-24r, er%10-14d"},
299 {0x00000050, 0x3e0003ff, "mfsr\t\t%20-24r, sr%10-14d"},
300 {0x0c000001, 0x3e00001f, "mfcr\t\t%20-24r, c%15-19r"},
301 {0x0c000009, 0x3e00001f, "mfc1\t\t%20-24r, c%15-19r"},
302 {0x0c000011, 0x3e00001f, "mfc2\t\t%20-24r, c%15-19r"},
303 {0x0c000019, 0x3e00001f, "mfc3\t\t%20-24r, c%15-19r"},
304 {0x0c00000f, 0x3e00001f, "mfcc1\t\t%20-24r, c%15-19r"},
305 {0x0c000017, 0x3e00001f, "mfcc2\t\t%20-24r, c%15-19r"},
306 {0x0c00001f, 0x3e00001f, "mfcc3\t\t%20-24r, c%15-19r"},
307 /* confilct: push! mhfl!. */
308 {0x00000040, 0x00007fe0, "pop!\t\t%0-4r"},
309 {0x00000060, 0x00007fe0, "push!\t\t%0-4r"},
310 {0x00006800, 0x00007c00, "rpop!\t\t%5-9r, %0-4d"},
311 {0x00006c00, 0x00007c00, "rpush!\t\t%5-9r, %0-4d"},
312 {0x00007600, 0x00007f00, "msb.f!\t\t%4-7r, %0-3r"},
313 {0x00007f00, 0x00007f00, "msbh.fs!\t\t%4-7r, %0-3r"},
43e65147 314 {0x00007e00, 0x00007f00, "msbl.fs!\t\t%4-7r, %0-3r"},
c3b7224a
NC
315 {0x00007700, 0x00007f00, "msbu!\t\t%4-7r, %0-3r"},
316 {0x00007d00, 0x00007f00, "mszh.f!\t\t%4-7r, %0-3r"},
317 {0x00007c00, 0x00007f00, "mszl.f!\t\t%4-7r, %0-3r"},
318 {0x0000044a, 0x3e007fff, "mtcel\t\t%20-24r"},
319 {0x00007000, 0x00007ff0, "mtcel!\t\t%0-3r"},
320 {0x0000084a, 0x3e007fff, "mtceh\t\t%20-24r"},
321 {0x00007010, 0x00007ff0, "mtceh!\t\t%0-3r"},
322 {0x00000c4a, 0x3e007fff, "mtcehl\t\t%20-24r, %15-19r"},
323 {0x0000004a, 0x3e0003ff, "mtce\t\t%20-24r, er%10-14d"},
324 {0x00000052, 0x3e0003ff, "mtsr\t\t%15-19r, sr%10-14d"},
325 {0x0c000000, 0x3e00001f, "mtcr\t\t%20-24r, c%15-19r"},
326 {0x0c000008, 0x3e00001f, "mtc1\t\t%20-24r, c%15-19r"},
327 {0x0c000010, 0x3e00001f, "mtc2\t\t%20-24r, c%15-19r"},
328 {0x0c000018, 0x3e00001f, "mtc3\t\t%20-24r, c%15-19r"},
329 {0x0c00000e, 0x3e00001f, "mtcc1\t\t%20-24r, c%15-19r"},
330 {0x0c000016, 0x3e00001f, "mtcc2\t\t%20-24r, c%15-19r"},
331 {0x0c00001e, 0x3e00001f, "mtcc3\t\t%20-24r, c%15-19r"},
332 {0x00000040, 0x3e0003ff, "mul\t\t%15-19r, %10-14r"},
333 {0x00000140, 0x3e0003ff, "mulr.l\t\t%20-24r,%15-19r, %10-14r"},
334 {0x00000240, 0x3e0003ff, "mulr.h\t\t%20-24r,%15-19r, %10-14r"},
335 {0x00000340, 0x3e0003ff, "mulr\t\t%20-24r,%15-19r, %10-14r"},
336 {0x00000141, 0x3e0003ff, "mulr.lf\t\t%20-24r,%15-19r, %10-14r"},
337 {0x00000241, 0x3e0003ff, "mulr.hf\t\t%20-24r,%15-19r, %10-14r"},
338 {0x00000341, 0x3e0003ff, "mulr.f\t\t%20-24r,%15-19r, %10-14r"},
339 {0x00000040, 0x3e0003ff, "maz\t\t%15-19r, %10-14r"},
340 {0x00000041, 0x3e0003ff, "mul.f\t\t%15-19r, %10-14r"},
43e65147 341 {0x00000041, 0x3e0003ff, "maz.f\t\t%15-19r, %10-14r"},
c3b7224a
NC
342 {0x00007200, 0x00007f00, "mul.f!\t\t%4-7r, %0-3r"},
343 {0x00000042, 0x3e0003ff, "mulu\t\t%15-19r, %10-14r"},
344 {0x00000142, 0x3e0003ff, "mulur.l\t\t%20-24r,%15-19r, %10-14r"},
345 {0x00000242, 0x3e0003ff, "mulur.h\t\t%20-24r,%15-19r, %10-14r"},
346 {0x00000342, 0x3e0003ff, "mulur\t\t%20-24r,%15-19r, %10-14r"},
347 {0x00000042, 0x3e0003ff, "mazu\t\t%15-19r, %10-14r"},
43e65147 348 {0x00007300, 0x00007f00, "mulu!\t\t%4-7r, %0-3r"},
c3b7224a
NC
349 {0x00000056, 0x3e007fff, "mvcs\t\t%20-24r, %15-19r"},
350 {0x00000456, 0x3e007fff, "mvcc\t\t%20-24r, %15-19r"},
351 {0x00000856, 0x3e007fff, "mvgtu\t\t%20-24r, %15-19r"},
352 {0x00000c56, 0x3e007fff, "mvleu\t\t%20-24r, %15-19r"},
353 {0x00001056, 0x3e007fff, "mveq\t\t%20-24r, %15-19r"},
354 {0x00001456, 0x3e007fff, "mvne\t\t%20-24r, %15-19r"},
355 {0x00001856, 0x3e007fff, "mvgt\t\t%20-24r, %15-19r"},
356 {0x00001c56, 0x3e007fff, "mvle\t\t%20-24r, %15-19r"},
357 {0x00002056, 0x3e007fff, "mvge\t\t%20-24r, %15-19r"},
358 {0x00002456, 0x3e007fff, "mvlt\t\t%20-24r, %15-19r"},
359 {0x00002856, 0x3e007fff, "mvmi\t\t%20-24r, %15-19r"},
360 {0x00002c56, 0x3e007fff, "mvpl\t\t%20-24r, %15-19r"},
361 {0x00003056, 0x3e007fff, "mvvs\t\t%20-24r, %15-19r"},
362 {0x00003456, 0x3e007fff, "mvvc\t\t%20-24r, %15-19r"},
363 {0x00003c56, 0x3e007fff, "mv\t\t%20-24r, %15-19r"},
364 {0x00004000, 0x00007c00, "mv!\t\t%5-9r, %0-4r"},
365 {0x0000001e, 0x3e0003ff, "neg\t\t%20-24r, %10-14r"},
366 {0x0000001f, 0x3e0003ff, "neg.c\t\t%20-24r, %10-14r"},
367 {0x00000000, 0x3e0003ff, "nop"},
368 {0x00000024, 0x3e0003ff, "not\t\t%20-24r, %15-19r"},
369 {0x00000025, 0x3e0003ff, "not.c\t\t%20-24r, %15-19r"},
370 {0x00000000, 0x00007fff, "nop!"},
371 {0x00000022, 0x3e0003ff, "or\t\t%20-24r, %15-19r, %10-14r"},
372 {0x00000023, 0x3e0003ff, "or.c\t\t%20-24r, %15-19r, %10-14r"},
43e65147
L
373 {0x020a0000, 0x3e0e0001, "ori\t\t%20-24r, 0x%1-16x"},
374 {0x020a0001, 0x3e0e0001, "ori.c\t\t%20-24r, 0x%1-16x"},
c3b7224a
NC
375 {0x0a0a0000, 0x3e0e0001, "oris\t\t%20-24r, 0x%1-16x"},
376 {0x0a0a0001, 0x3e0e0001, "oris.c\t\t%20-24r, 0x%1-16x"},
377 {0x1a000000, 0x3e000001, "orri\t\t%20-24r, %15-19r, 0x%1-14x"},
378 {0x1a000001, 0x3e000001, "orri.c\t\t%20-24r, %15-19r, 0x%1-14x"},
379 {0x00004a00, 0x00007f00, "or!\t\t%4-7r, %0-3r"},
380 {0x040000000002LL, 0x1c0000000003LL, "orri48\t\t%38-41r,%34-37r, 0x%2-33x"},
381 {0x040000000003LL, 0x1c0000000003LL, "orri48.c\t\t%38-41r,%34-37r, 0x%2-33x"},
382 {0x0000000a, 0x3e0003ff, "pflush"},
383 {0x00000038, 0x3e0003ff, "ror\t\t%20-24r, %15-19r, %10-14r"},
384 {0x00000039, 0x3e0003ff, "ror.c\t\t%20-24r, %15-19r, %10-14r"},
385 {0x0000003b, 0x3e0003ff, "rorc.c\t\t%20-24r, %15-19r, %10-14r"},
386 {0x0000003c, 0x3e0003ff, "rol\t\t%20-24r, %15-19r, %10-14r"},
387 {0x0000003d, 0x3e0003ff, "rol.c\t\t%20-24r, %15-19r, %10-14r"},
388 {0x0000003f, 0x3e0003ff, "rolc.c\t\t%20-24r, %15-19r, %10-14r"},
389 {0x00000078, 0x3e0003ff, "rori\t\t%20-24r, %15-19r, %10-14d"},
390 {0x00000079, 0x3e0003ff, "rori.c\t\t%20-24r, %15-19r, %10-14d"},
391 {0x0000007b, 0x3e0003ff, "roric.c\t\t%20-24r, %15-19r, %10-14d"},
392 {0x0000007c, 0x3e0003ff, "roli\t\t%20-24r, %15-19r, %10-14d"},
393 {0x0000007d, 0x3e0003ff, "roli.c\t\t%20-24r, %15-19r, %10-14d"},
394 {0x0000007f, 0x3e0003ff, "rolic.c\t\t%20-24r, %15-19r, %10-14d"},
395 {0x0c000084, 0x3e0003ff, "rte"},
396 {0x2e000000, 0x3e000000, "sb\t\t%20-24r, [%15-19r, %0-14i]"},
397 {0x06000007, 0x3e000007, "sb\t\t%20-24r, [%15-19r, %3-14i]+"},
398 {0x0e000007, 0x3e000007, "sb\t\t%20-24r, [%15-19r]+, %3-14i"},
399 {0x0000000e, 0x3e0003ff, "asw\t\t%20-24r, [%15-19r]"},
400 {0x00000068, 0x3e0003ff, "scb\t\t%20-24r, [%15-19r]+"},
401 {0x0000006a, 0x3e0003ff, "scw\t\t%20-24r, [%15-19r]+"},
402 {0x0000006e, 0x3e0003ff, "sce\t\t[%15-19r]+"},
403 {0x00000006, 0x3e0003ff, "sdbbp\t\t%15-19d"},
404 {0x00000020, 0x00007fe0, "sdbbp!\t\t%0-4d"},
405 {0x000000000000LL, 0x1c000000001fLL, "sdbbp48\t\t%5-9d"},
406 {0x2a000000, 0x3e000000, "sh\t\t%20-24r, [%15-19r, %0-14i]"},
407 {0x06000005, 0x3e000007, "sh\t\t%20-24r, [%15-19r, %3-14i]+"},
408 {0x0e000005, 0x3e000007, "sh\t\t%20-24r, [%15-19r]+, %3-14i"},
409 {0x0c0000c4, 0x3e0003ff, "sleep"},
410 {0x0c0000e4, 0x3e0003ff, "rti"},
411 {0x00000030, 0x3e0003ff, "sll\t\t%20-24r, %15-19r, %10-14r"},
412 {0x00000031, 0x3e0003ff, "sll.c\t\t%20-24r, %15-19r, %10-14r"},
413 {0x00000070, 0x3e0003ff, "slli\t\t%20-24r, %15-19r, %10-14d"},
414 {0x00000071, 0x3e0003ff, "slli.c\t\t%20-24r, %15-19r, %10-14d"},
415 {0x00005800, 0x00007e00, "slli!\t\t%5-8r, %0-4d"},
416 {0x00000034, 0x3e0003ff, "srl\t\t%20-24r, %15-19r, %10-14r"},
417 {0x00000035, 0x3e0003ff, "srl.c\t\t%20-24r, %15-19r, %10-14r"},
418 {0x00000036, 0x3e0003ff, "sra\t\t%20-24r, %15-19r, %10-14r"},
419 {0x00000037, 0x3e0003ff, "sra.c\t\t%20-24r, %15-19r, %10-14r"},
420 {0x00000074, 0x3e0003ff, "srli\t\t%20-24r, %15-19r, %10-14d"},
421 {0x00000075, 0x3e0003ff, "srli.c\t\t%20-24r, %15-19r, %10-14d"},
422 {0x00000076, 0x3e0003ff, "srai\t\t%20-24r, %15-19r, %10-14d"},
423 {0x00000077, 0x3e0003ff, "srai.c\t\t%20-24r, %15-19r, %10-14d"},
424 {0x00005a00, 0x00007e00, "srli!\t\t%5-8r, %0-4d"},
425 {0x0c00000b, 0x3e00001f, "stc1\t\tc%15-19r, [%20-24r, %5-14i]"},
426 {0x0c000013, 0x3e00001f, "stc2\t\tc%15-19r, [%20-24r, %5-14i]"},
427 {0x0c00001b, 0x3e00001f, "stc3\t\tc%15-19r, [%20-24r, %5-14i]"},
428 {0x00000014, 0x3e0003ff, "sub\t\t%20-24r, %15-19r, %10-14r"},
429 {0x00000015, 0x3e0003ff, "sub.c\t\t%20-24r, %15-19r, %10-14r"},
430 {0x00000016, 0x3e0003ff, "subc\t\t%20-24r, %15-19r, %10-14r"},
431 {0x00000017, 0x3e0003ff, "subc.c\t\t%20-24r, %15-19r, %10-14r"},
432 {0x00004900, 0x00007f00, "sub!\t\t%4-7r, %0-3r"},
433 {0x28000000, 0x3e000000, "sw\t\t%20-24r, [%15-19r, %0-14i]"},
434 {0x06000004, 0x3e000007, "sw\t\t%20-24r, [%15-19r, %3-14i]+"},
435 {0x0e000004, 0x3e000007, "sw\t\t%20-24r, [%15-19r]+, %3-14i"},
436 {0x00002000, 0x00007000, "sw!\t\t%8-11r, [%5-7r,%0-4d2]"},
437 {0x000000000003LL, 0x1c000000001fLL, "sw48\t\t%37-41r, [0x%7-36w]"},
438 {0x00000002, 0x3e0003ff, "syscall\t\t%10-24d"},
439 {0x00000054, 0x3e007fff, "tcs"},
440 {0x00000454, 0x3e007fff, "tcc"},
441 {0x00003854, 0x3e007fff, "tcnz"},
442 {0x00001054, 0x3e007fff, "teq"},
443 {0x00000854, 0x3e007fff, "tgtu"},
444 {0x00001854, 0x3e007fff, "tgt"},
445 {0x00002054, 0x3e007fff, "tge"},
446 {0x00000c54, 0x3e007fff, "tleu"},
447 {0x00001c54, 0x3e007fff, "tle"},
448 {0x00002454, 0x3e007fff, "tlt"},
449 {0x0c000004, 0x3e0003ff, "stlb"},
450 {0x0c000024, 0x3e0003ff, "mftlb"},
451 {0x0c000044, 0x3e0003ff, "mtptlb"},
452 {0x0c000064, 0x3e0003ff, "mtrtlb"},
453 {0x00002854, 0x3e007fff, "tmi"},
454 {0x00001454, 0x3e007fff, "tne"},
455 {0x00002c54, 0x3e007fff, "tpl"},
456 {0x00000004, 0x3e007fff, "trapcs\t\t%15-19d"},
457 {0x00000404, 0x3e007fff, "trapcc\t\t%15-19d"},
458 {0x00000804, 0x3e007fff, "trapgtu\t\t%15-19d"},
459 {0x00000c04, 0x3e007fff, "trapleu\t\t%15-19d"},
460 {0x00001004, 0x3e007fff, "trapeq\t\t%15-19d"},
461 {0x00001404, 0x3e007fff, "trapne\t\t%15-19d"},
462 {0x00001804, 0x3e007fff, "trapgt\t\t%15-19d"},
463 {0x00001c04, 0x3e007fff, "traple\t\t%15-19d"},
464 {0x00002004, 0x3e007fff, "trapge\t\t%15-19d"},
465 {0x00002404, 0x3e007fff, "traplt\t\t%15-19d"},
466 {0x00002804, 0x3e007fff, "trapmi\t\t%15-19d"},
467 {0x00002c04, 0x3e007fff, "trappl\t\t%15-19d"},
468 {0x00003004, 0x3e007fff, "trapvs\t\t%15-19d"},
469 {0x00003404, 0x3e007fff, "trapvc\t\t%15-19d"},
470 {0x00003c04, 0x3e007fff, "trap\t\t%15-19d"},
471 {0x00003c54, 0x3e007fff, "tset"},
472 {0x00003054, 0x3e007fff, "tvs"},
473 {0x00003454, 0x3e007fff, "tvc"},
474 {0x00000026, 0x3e0003ff, "xor\t\t%20-24r, %15-19r, %10-14r"},
475 {0x00000027, 0x3e0003ff, "xor.c\t\t%20-24r, %15-19r, %10-14r"},
0f6d864d 476 {0,0,NULL}
c3b7224a 477};
02b1cb40 478\f
c3b7224a 479
1c0d3aa6 480#ifndef streq
c3b7224a 481#define streq(a,b) (strcmp ((a), (b)) == 0)
1c0d3aa6
NC
482#endif
483
484#ifndef strneq
c3b7224a 485#define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0)
1c0d3aa6
NC
486#endif
487
488#ifndef NUM_ELEM
489#define NUM_ELEM(a) (sizeof (a) / sizeof (a)[0])
490#endif
491
492typedef struct
493{
494 const char *name;
495 const char *description;
496 const char *reg_names[32];
497} score_regname;
498
499static score_regname regnames[] =
500{
501 {"gcc", "Select register names used by GCC",
502 {"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
503 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20",
504 "r21", "r22", "r23", "r24", "r25", "r26", "r27", "gp", "r29", "r30", "r31"}},
505};
506
507static unsigned int regname_selected = 0;
508
509#define NUM_SCORE_REGNAMES NUM_ELEM (regnames)
510#define score_regnames regnames[regname_selected].reg_names
511
c3b7224a
NC
512/* Print one instruction from PC on INFO->STREAM.
513 Return the size of the instruction. */
514static int
515print_insn_score48 (struct disassemble_info *info, bfd_vma given)
516{
517 struct score_opcode *insn;
518 void *stream = info->stream;
519 fprintf_ftype func = info->fprintf_func;
520
521 for (insn = score_opcodes; insn->assembler; insn++)
522 {
02b1cb40 523 /* Using insn->mask &0xff00000000 to distinguish 48/32 bit. */
c3b7224a
NC
524 if (((insn->mask & 0xff0000000000LL)!=0) && (given & insn->mask) == insn->value)
525 {
526 info->bytes_per_chunk = 2;
527 info->bytes_per_line =6;
528
529 char *c;
530
531 for (c = insn->assembler; *c; c++)
532 {
533 if (*c == '%')
534 {
535 switch (*++c)
536 {
537 case '0':
538 case '1':
539 case '2':
540 case '3':
541 case '4':
542 case '5':
543 case '6':
544 case '7':
545 case '8':
546 case '9':
547 {
548 int bitstart = *c++ - '0';
549 int bitend = 0;
550
551 while (*c >= '0' && *c <= '9')
552 bitstart = (bitstart * 10) + *c++ - '0';
553
554 switch (*c)
555 {
556 case '-':
557 c++;
558 while (*c >= '0' && *c <= '9')
559 bitend = (bitend * 10) + *c++ - '0';
560
561 if (!bitend)
562 abort ();
563
564 switch (*c)
565 {
566 case 'r':
567 {
b2c759ce 568 unsigned long reg;
c3b7224a
NC
569
570 reg = given >> bitstart;
7936714c 571 reg &= (2u << (bitend - bitstart)) - 1;
c3b7224a
NC
572
573 func (stream, "%s", score_regnames[reg]);
574 }
575 break;
576 case 'd':
577 {
b2c759ce 578 unsigned long reg;
c3b7224a
NC
579
580 reg = given >> bitstart;
7936714c 581 reg &= (2u << (bitend - bitstart)) - 1;
c3b7224a
NC
582
583 func (stream, "%ld", reg);
584 }
585 break;
586 case 'i':
587 {
588 long reg;
589 reg = given >> bitstart;
7936714c
AM
590 reg &= (2u << (bitend - bitstart)) - 1;
591 reg = ((reg ^ (1u << (bitend - bitstart)))
592 - (1u << (bitend - bitstart)));
43e65147 593 /* Fix bug: s3_testsuite 64-bit.
c3b7224a
NC
594 Remove high 32 bits. */
595 reg = (int) reg;
596
597 if (((given & insn->mask) == 0x0c00000a) /* ldc1 */
598 || ((given & insn->mask) == 0x0c000012) /* ldc2 */
599 || ((given & insn->mask) == 0x0c00001c) /* ldc3 */
600 || ((given & insn->mask) == 0x0c00000b) /* stc1 */
601 || ((given & insn->mask) == 0x0c000013) /* stc2 */
602 || ((given & insn->mask) == 0x0c00001b)) /* stc3 */
b2c759ce 603 reg *= 4;
c3b7224a
NC
604
605 func (stream, "%ld", reg);
606 }
607 break;
608 case 'x':
609 {
b2c759ce 610 unsigned long reg;
c3b7224a
NC
611
612 reg = given >> bitstart;
7936714c 613 reg &= (2u << (bitend - bitstart)) - 1;
c3b7224a
NC
614
615 func (stream, "%lx", reg);
616 }
617 break;
618 case 'w':
619 {
b2c759ce 620 unsigned long reg;
c3b7224a 621 reg = given >> bitstart;
7936714c
AM
622 reg &= (2u << (bitend - bitstart)) - 1;
623 reg <<= 2;
c3b7224a
NC
624 func (stream, "%lx", reg);
625 }
626 break;
43e65147 627
c3b7224a
NC
628 default:
629 abort ();
630 }
631 break;
632
633 case '`':
634 c++;
7936714c 635 if ((given & (1u << bitstart)) == 0)
c3b7224a
NC
636 func (stream, "%c", *c);
637 break;
638 case '\'':
639 c++;
7936714c 640 if ((given & (1u << bitstart)) != 0)
c3b7224a
NC
641 func (stream, "%c", *c);
642 break;
643 default:
644 abort ();
645 }
646 break;
c3b7224a 647 }
b33bafa0
AM
648 default:
649 abort ();
c3b7224a
NC
650 }
651 }
652 else
653 func (stream, "%c", *c);
654 }
655 return 6;
656 }
657 }
658
659#if (SCORE_SIMULATOR_ACTIVE)
660 func (stream, _("<illegal instruction>"));
661 return 6;
662#endif
43e65147 663
c3b7224a
NC
664 abort ();
665}
666
1c0d3aa6
NC
667/* Print one instruction from PC on INFO->STREAM.
668 Return the size of the instruction. */
669static int
670print_insn_score32 (bfd_vma pc, struct disassemble_info *info, long given)
671{
672 struct score_opcode *insn;
673 void *stream = info->stream;
02b1cb40 674 int rb_equal_zero=1;
1c0d3aa6
NC
675 fprintf_ftype func = info->fprintf_func;
676
677 for (insn = score_opcodes; insn->assembler; insn++)
678 {
c3b7224a 679 if (((insn->mask & 0xff0000000000LL)==0)&&(insn->mask & 0xffff0000) && (given & insn->mask) == insn->value)
1c0d3aa6 680 {
c3b7224a
NC
681 /* check for bcmpeq / bcmpeqz / bcmpne / bcmpnez */
682 /* given &0x7c00 is for to test if rb is zero ,
43e65147 683 rb_equal_zero =1 : index to bcmpeqz
c3b7224a
NC
684 rb_equal_zero =0 , index to bcmpeq
685 this checking rule only for branch compare ( insn->mask ==0x3e00007e*/
686 if (((given & 0x7c00) !=0)&&(rb_equal_zero ==1)&&(insn->mask == 0x3e00007e)
687 && (insn->value == 0x0000004c || insn->value == 0x0000004e))
688 {
689 rb_equal_zero =0;
690 continue;
691 }
43e65147 692
1c0d3aa6
NC
693 char *c;
694
695 for (c = insn->assembler; *c; c++)
696 {
697 if (*c == '%')
698 {
699 switch (*++c)
700 {
701 case 'j':
702 {
703 int target;
704
705 if (info->flags & INSN_HAS_RELOC)
706 pc = 0;
707 target = (pc & 0xfe000000) | (given & 0x01fffffe);
708 (*info->print_address_func) (target, info);
709 }
710 break;
711 case 'b':
712 {
713 /* Sign-extend a 20-bit number. */
714#define SEXT20(x) ((((x) & 0xfffff) ^ (~ 0x7ffff)) + 0x80000)
715 int disp = ((given & 0x01ff8000) >> 5) | (given & 0x3fe);
716 int target = (pc + SEXT20 (disp));
717
718 (*info->print_address_func) (target, info);
719 }
720 break;
c3b7224a
NC
721 case 'z':
722 {
723#define SEXT10(x) ((((x) & 0x3ff) ^ (~ 0x1ff)) + 0x200)
724 if ((given & 0x7c00 ) == 0)
725 {
726 /* Sign-extend a 20-bit number. */
727 /* disp : [24 -20] , [9-7 ] , [0] */
728 int disp = (given&1)<<1 |((given>>7)&7)<<2 |((given>>20)&0x1f)<<5;
729 int target = (pc + SEXT10 (disp));
730 (*info->print_address_func) (target, info);
731 }
732 else
733 {
b2c759ce 734 unsigned long reg;
c3b7224a
NC
735 int bitstart = 10;
736 int bitend = 14;
737 reg = given >> bitstart;
7936714c 738 reg &= (2u << (bitend - bitstart)) - 1;
c3b7224a
NC
739 /* Sign-extend a 20-bit number. */
740 int disp = (given&1)<<1 |((given>>7)&7)<<2 |((given>>20)&0x1f)<<5;
741 int target = (pc + SEXT10 (disp));
742 func (stream, "%s ,", score_regnames[reg] );
743 (*info->print_address_func) (target, info);
43e65147 744
c3b7224a 745 }
43e65147 746
c3b7224a
NC
747 }
748 break;
749 case 'm':
750 {
751 /* disp : [24 -20] , [9-7 ] , [0] */
752 int disp = (given&1)<<2 |((given>>7)&7)<<3 |((given>>20)&0x1f)<<6;
753 (*info->print_address_func) (disp, info);
754 }
755 break;
1c0d3aa6
NC
756 case '0':
757 case '1':
758 case '2':
759 case '3':
760 case '4':
761 case '5':
762 case '6':
763 case '7':
764 case '8':
765 case '9':
766 {
767 int bitstart = *c++ - '0';
768 int bitend = 0;
769
770 while (*c >= '0' && *c <= '9')
771 bitstart = (bitstart * 10) + *c++ - '0';
772
773 switch (*c)
774 {
775 case '-':
776 c++;
777 while (*c >= '0' && *c <= '9')
778 bitend = (bitend * 10) + *c++ - '0';
779
780 if (!bitend)
781 abort ();
782
783 switch (*c)
784 {
785 case 'r':
786 {
b2c759ce 787 unsigned long reg;
1c0d3aa6
NC
788
789 reg = given >> bitstart;
7936714c 790 reg &= (2u << (bitend - bitstart)) - 1;
1c0d3aa6
NC
791
792 func (stream, "%s", score_regnames[reg]);
793 }
794 break;
795 case 'd':
796 {
b2c759ce 797 unsigned long reg;
1c0d3aa6
NC
798
799 reg = given >> bitstart;
7936714c 800 reg &= (2u << (bitend - bitstart)) - 1;
1c0d3aa6
NC
801
802 func (stream, "%ld", reg);
803 }
804 break;
805 case 'i':
806 {
807 long reg;
808
809 reg = given >> bitstart;
7936714c
AM
810 reg &= (2u << (bitend - bitstart)) - 1;
811 reg = ((reg ^ (1u << (bitend - bitstart)))
812 - (1u << (bitend - bitstart)));
1c0d3aa6
NC
813
814 if (((given & insn->mask) == 0x0c00000a) /* ldc1 */
815 || ((given & insn->mask) == 0x0c000012) /* ldc2 */
816 || ((given & insn->mask) == 0x0c00001c) /* ldc3 */
817 || ((given & insn->mask) == 0x0c00000b) /* stc1 */
818 || ((given & insn->mask) == 0x0c000013) /* stc2 */
819 || ((given & insn->mask) == 0x0c00001b)) /* stc3 */
b2c759ce 820 reg *= 4;
1c0d3aa6
NC
821
822 func (stream, "%ld", reg);
823 }
824 break;
825 case 'x':
826 {
b2c759ce 827 unsigned long reg;
1c0d3aa6
NC
828
829 reg = given >> bitstart;
7936714c 830 reg &= (2u << (bitend - bitstart)) - 1;
1c0d3aa6
NC
831
832 func (stream, "%lx", reg);
833 }
834 break;
835 default:
836 abort ();
837 }
838 break;
c3b7224a 839
1c0d3aa6
NC
840 case '`':
841 c++;
7936714c 842 if ((given & (1u << bitstart)) == 0)
1c0d3aa6
NC
843 func (stream, "%c", *c);
844 break;
845 case '\'':
846 c++;
7936714c 847 if ((given & (1u << bitstart)) != 0)
1c0d3aa6
NC
848 func (stream, "%c", *c);
849 break;
850 default:
851 abort ();
852 }
853 break;
1c0d3aa6 854 }
b33bafa0
AM
855 default:
856 abort ();
1c0d3aa6
NC
857 }
858 }
859 else
860 func (stream, "%c", *c);
861 }
862 return 4;
863 }
864 }
865
866#if (SCORE_SIMULATOR_ACTIVE)
867 func (stream, _("<illegal instruction>"));
868 return 4;
869#endif
870
871 abort ();
872}
873
1c0d3aa6
NC
874/* Print one instruction from PC on INFO->STREAM.
875 Return the size of the instruction. */
876static int
877print_insn_score16 (bfd_vma pc, struct disassemble_info *info, long given)
878{
879 struct score_opcode *insn;
880 void *stream = info->stream;
881 fprintf_ftype func = info->fprintf_func;
882
883 given &= 0xffff;
884 for (insn = score_opcodes; insn->assembler; insn++)
885 {
c3b7224a 886 if (((insn->mask & 0xff0000000000LL)==0) &&!(insn->mask & 0xffff0000) && (given & insn->mask) == insn->value)
1c0d3aa6
NC
887 {
888 char *c = insn->assembler;
889
890 info->bytes_per_chunk = 2;
891 info->bytes_per_line = 4;
892 given &= 0xffff;
893
894 for (; *c; c++)
895 {
896 if (*c == '%')
897 {
898 switch (*++c)
899 {
900
901 case 'j':
902 {
903 int target;
904
905 if (info->flags & INSN_HAS_RELOC)
906 pc = 0;
907
908 target = (pc & 0xfffff000) | (given & 0x00000ffe);
909 (*info->print_address_func) (target, info);
910 }
911 break;
912 case 'b':
913 {
914 /* Sign-extend a 9-bit number. */
c3b7224a
NC
915#define SEXT10(x) ((((x) & 0x3ff) ^ (~ 0x1ff)) + 0x200)
916 int disp = (given & 0x1ff) << 1;
917 int target = (pc + SEXT10 (disp));
1c0d3aa6
NC
918
919 (*info->print_address_func) (target, info);
920 }
921 break;
922
923 case '0':
924 case '1':
925 case '2':
926 case '3':
927 case '4':
928 case '5':
929 case '6':
930 case '7':
931 case '8':
932 case '9':
933 {
934 int bitstart = *c++ - '0';
935 int bitend = 0;
936
937 while (*c >= '0' && *c <= '9')
938 bitstart = (bitstart * 10) + *c++ - '0';
939
940 switch (*c)
941 {
942 case '-':
943 {
944 long reg;
945
946 c++;
947 while (*c >= '0' && *c <= '9')
948 bitend = (bitend * 10) + *c++ - '0';
949 if (!bitend)
950 abort ();
951 reg = given >> bitstart;
7936714c 952 reg &= (2u << (bitend - bitstart)) - 1;
c3b7224a 953
1c0d3aa6
NC
954 switch (*c)
955 {
956 case 'R':
957 func (stream, "%s", score_regnames[reg + 16]);
958 break;
959 case 'r':
960 func (stream, "%s", score_regnames[reg]);
961 break;
962 case 'd':
84e098cd
AM
963 /* Check rpush rd, 0 and rpop! rd, 0.
964 If 0, then print 32. */
965 if (((given & 0x00007c00) == 0x00006c00
966 || (given & 0x00007c00) == 0x00006800)
967 && reg == 0)
968 reg = 32;
969
1c0d3aa6
NC
970 if (*(c + 1) == '\0')
971 func (stream, "%ld", reg);
972 else
973 {
974 c++;
975 if (*c == '1')
976 func (stream, "%ld", reg << 1);
977 else if (*c == '2')
978 func (stream, "%ld", reg << 2);
979 }
980 break;
981
982 case 'x':
983 if (*(c + 1) == '\0')
984 func (stream, "%lx", reg);
985 else
986 {
987 c++;
988 if (*c == '1')
989 func (stream, "%lx", reg << 1);
990 else if (*c == '2')
991 func (stream, "%lx", reg << 2);
992 }
993 break;
994 case 'i':
7936714c 995 reg = (reg ^ (1u << bitend)) - (1u << bitend);
c3b7224a 996 func (stream, "%ld", reg);
1c0d3aa6
NC
997 break;
998 default:
999 abort ();
1000 }
1001 }
1002 break;
1003
1004 case '\'':
1005 c++;
7936714c 1006 if ((given & (1u << bitstart)) != 0)
1c0d3aa6
NC
1007 func (stream, "%c", *c);
1008 break;
1009 default:
1010 abort ();
1011 }
1012 }
1013 break;
1014 default:
1015 abort ();
1016 }
1017 }
1018 else
1019 func (stream, "%c", *c);
1020 }
1021
1022 return 2;
1023 }
1024 }
1025#if (SCORE_SIMULATOR_ACTIVE)
1026 func (stream, _("<illegal instruction>"));
1027 return 2;
1028#endif
43e65147 1029
1c0d3aa6
NC
1030 /* No match. */
1031 abort ();
1032}
1033
1034/* NOTE: There are no checks in these routines that
1035 the relevant number of data bytes exist. */
1036static int
c3b7224a 1037s3_print_insn (bfd_vma pc, struct disassemble_info *info, bfd_boolean little)
1c0d3aa6 1038{
c3b7224a
NC
1039 unsigned char b[6];
1040 bfd_vma given,given_h , given_l, given_16, given_32, given_48;
c3b7224a
NC
1041 bfd_vma ridparity;
1042 int status;
1043 void *stream = info->stream;
1044 fprintf_ftype func = info->fprintf_func;
02b1cb40 1045
1c0d3aa6 1046 info->display_endian = little ? BFD_ENDIAN_LITTLE : BFD_ENDIAN_BIG;
c3b7224a
NC
1047 info->bytes_per_chunk = 2;
1048 status = info->read_memory_func (pc, (bfd_byte *) & b[0], 4, info);
1049 if (status != 0)
1c0d3aa6
NC
1050 {
1051 info->bytes_per_chunk = 2;
1052 status = info->read_memory_func (pc, (bfd_byte *) b, 2, info);
1053 b[3] = b[2] = 0;
c3b7224a
NC
1054 if (status != 0)
1055 {
1056 info->memory_error_func (status, pc, info);
1057 return -1;
1058 }
1059 }
1060 if (little)
1061 {
1062 given = b[0] | (b[1] << 8);
1c0d3aa6
NC
1063 }
1064 else
1065 {
c3b7224a 1066 given = (b[0] << 8) | b[1];
1c0d3aa6
NC
1067 }
1068
c3b7224a
NC
1069 /* Set given_16. */
1070 given_16 = given;
1071
02b1cb40 1072 /* Judge if now is insn_16_p. */
c3b7224a
NC
1073 if ((given & 0x8000)==0)
1074 return print_insn_score16 (pc, info, given);
1075
43e65147 1076 else
c3b7224a
NC
1077 {
1078 if (little)
1079 {
1080 given = ((bfd_vma)b[2]) | ((bfd_vma)b[3] << 8) | ((bfd_vma)b[0] << 16) | ((bfd_vma)b[1] << 24);
1081 }
1082 else
1083 {
1084 given = ((bfd_vma)b[0] << 24) | ((bfd_vma)b[1] << 16) | ((bfd_vma)b[2] << 8) | ((bfd_vma)b[3]);
1085 }
1086
1087 /* Set given_32. */
1088 given_32 = given;
1089
02b1cb40 1090 /* Judge if now is insn_32. */
c3b7224a
NC
1091 if ((given &0x80008000)==0x80000000)
1092 {
1093 /* Get rid of parity. */
1094 ridparity = (given & 0x7FFF);
1095 ridparity |= (given & 0x7FFF0000) >> 1;
1096 given = ridparity;
1097 return print_insn_score32 (pc, info, given);
1098 }
1099 }
1100
02b1cb40 1101 /* The insn is 48 bit. */
c3b7224a 1102 status = info->read_memory_func (pc, (bfd_byte *) & b[0], 6, info);
1c0d3aa6
NC
1103 if (status != 0)
1104 {
1105 info->memory_error_func (status, pc, info);
1106 return -1;
1107 }
1108
1109 if (little)
1110 {
c3b7224a
NC
1111 given = ((bfd_vma)b[4]) | ((bfd_vma)b[5] << 8) | ((bfd_vma)b[2] << 16) | ((bfd_vma)b[3] << 24)
1112 | ((bfd_vma)b[0] << 32) | ((bfd_vma)b[1] << 40);
1c0d3aa6
NC
1113 }
1114 else
1115 {
c3b7224a
NC
1116 given_l = ((bfd_vma)b[5]) | ((bfd_vma)b[4] << 8) | ((bfd_vma)b[3] << 16) | ((bfd_vma)b[2] << 24) ;
1117 given_h = ((bfd_vma)b[1] )|((bfd_vma)b[0] <<8);
1118 given = ((bfd_vma)given_h<<32) | (bfd_vma)given_l ;
43e65147 1119
1c0d3aa6
NC
1120 }
1121
c3b7224a
NC
1122 /* Set given_48. */
1123 given_48 = given;
1c0d3aa6 1124
c3b7224a
NC
1125 if ((given & 0x800080008000LL) == 0x800080000000LL)
1126 {
1127 /* Get rid of parity. */
1128 ridparity = (given & 0x7FFF);
1129 ridparity |= (given & 0x7FFF0000) >> 1;
1130 ridparity |= (given & 0x7FFF00000000LL) >> 2;
1131 given = ridparity;
1132 status = print_insn_score48 (info, given);
1133 return status;
1134 }
1c0d3aa6 1135
c3b7224a 1136 /* Check 0x800080008000, 0x80008000, 0x8000. */
c3b7224a
NC
1137 if ((given_48 & 0x800080008000LL) != 0x800080000000LL)
1138 {
1139#if (SCORE_SIMULATOR_ACTIVE)
1140 func (stream, _("<illegal instruction>"));
1141 return 6;
1142#endif
1143 }
1144 if (((given_32 & 0xffff00000000LL) == 0) && ((given_32 & 0x80008000) != 0x80000000))
1145 {
1146#if (SCORE_SIMULATOR_ACTIVE)
1147 func (stream, _("<illegal instruction>"));
1148 return 4;
1149#endif
1150 }
1151 if (((given_16 & 0xffffffff0000LL) == 0) && ((given_16 & 0x8000) != 0))
1152 {
1153#if (SCORE_SIMULATOR_ACTIVE)
1154 func (stream, _("<illegal instruction>"));
1155 return 2;
1156#endif
1157 }
1158 else
1159 {
1160 return 0;
1161 }
1162}
1c0d3aa6 1163
c3b7224a
NC
1164static unsigned long
1165score_get_arch (disassemble_info *info)
1166{
1167 if (info->arch == bfd_arch_score)
1168 return info->mach;
1c0d3aa6 1169 else
c3b7224a 1170 return 0;
1c0d3aa6
NC
1171}
1172
1173int
1174print_insn_big_score (bfd_vma pc, struct disassemble_info *info)
1175{
c3b7224a
NC
1176 if (score_get_arch (info) == bfd_mach_score3)
1177 return s3_print_insn (pc, info, FALSE);
1178 else
1179 return s7_print_insn (pc, info, FALSE);
1c0d3aa6
NC
1180}
1181
1182int
1183print_insn_little_score (bfd_vma pc, struct disassemble_info *info)
1184{
c3b7224a
NC
1185 if (score_get_arch (info) == bfd_mach_score3)
1186 return s3_print_insn (pc, info, TRUE);
1187 else
1188 return s7_print_insn (pc, info, TRUE);
1c0d3aa6 1189}
02b1cb40
NC
1190#else /* not BFD64 */
1191int
1192print_insn_big_score (bfd_vma pc ATTRIBUTE_UNUSED,
1193 struct disassemble_info * info ATTRIBUTE_UNUSED)
1194{
1195 abort ();
1196}
1197
1198int
1199print_insn_little_score (bfd_vma pc ATTRIBUTE_UNUSED,
1200 struct disassemble_info * info ATTRIBUTE_UNUSED)
1201{
1202 abort ();
1203}
43e65147 1204#endif
This page took 0.725379 seconds and 4 git commands to generate.