1 /***************************************************************************
2 * Copyright (C) 2013 Andes Technology *
3 * Hsiangkai Wang <hkwang@andestech.com> *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *
19 ***************************************************************************/
25 #include <helper/log.h>
26 #include <target/target.h>
27 #include "nds32_disassembler.h"
29 static const int enable4_bits
[] = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};
31 int nds32_read_opcode(struct nds32
*nds32
, uint32_t address
, uint32_t *value
)
33 struct target
*target
= nds32
->target
;
36 if (!target_was_examined(target
)) {
37 LOG_ERROR("Target not examined yet");
41 int retval
= target_read_buffer(target
, address
, 4, value_buf
);
43 if (retval
== ERROR_OK
) {
44 /* instructions are always big-endian */
45 *value
= be_to_h_u32(value_buf
);
47 LOG_DEBUG("address: 0x%8.8" PRIx32
", value: 0x%8.8" PRIx32
"",
52 LOG_DEBUG("address: 0x%8.8" PRIx32
" failed",
59 static int nds32_parse_type_0(uint32_t opcode
, int32_t *imm
)
61 *imm
= opcode
& 0x1FFFFFF;
66 static int nds32_parse_type_1(uint32_t opcode
, uint8_t *rt
, int32_t *imm
)
68 *rt
= (opcode
>> 20) & 0x1F;
69 *imm
= opcode
& 0xFFFFF;
74 static int nds32_parse_type_2(uint32_t opcode
, uint8_t *rt
, uint8_t *ra
, int32_t *imm
)
76 *rt
= (opcode
>> 20) & 0x1F;
77 *ra
= (opcode
>> 15) & 0x1F;
78 *imm
= opcode
& 0x7FFF;
83 static int nds32_parse_type_3(uint32_t opcode
, uint8_t *rt
, uint8_t *ra
,
84 uint8_t *rb
, int32_t *imm
)
86 *rt
= (opcode
>> 20) & 0x1F;
87 *ra
= (opcode
>> 15) & 0x1F;
88 *rb
= (opcode
>> 10) & 0x1F;
89 *imm
= opcode
& 0x3FF;
94 static int nds32_parse_type_4(uint32_t opcode
, uint8_t *rt
, uint8_t *ra
,
95 uint8_t *rb
, uint8_t *rd
, uint8_t *sub_opc
)
97 *rt
= (opcode
>> 20) & 0x1F;
98 *ra
= (opcode
>> 15) & 0x1F;
99 *rb
= (opcode
>> 10) & 0x1F;
100 *rd
= (opcode
>> 5) & 0x1F;
101 *sub_opc
= opcode
& 0x1F;
106 /* LBI, LHI, LWI, LBI.bi, LHI.bi, LWI.bi */
107 static int nds32_parse_group_0_insn(struct nds32
*nds32
, uint32_t opcode
,
109 struct nds32_instruction
*instruction
)
113 opc_6
= instruction
->info
.opc_6
;
115 switch (opc_6
& 0x7) {
117 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
118 &(instruction
->info
.ra
), &(instruction
->info
.imm
));
119 instruction
->info
.imm
= (instruction
->info
.imm
<< 17) >> 17; /* sign-extend */
120 instruction
->type
= NDS32_INSN_LOAD_STORE
;
121 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
122 &(instruction
->access_start
));
123 instruction
->access_start
+= instruction
->info
.imm
;
124 instruction
->access_end
= instruction
->access_start
+ 1;
125 snprintf(instruction
->text
,
127 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
128 "\tLBI\t$r%" PRIu8
",[$r%" PRIu8
"+#%" PRId32
"]",
130 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
131 instruction
->info
.imm
);
134 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
135 &(instruction
->info
.ra
), &(instruction
->info
.imm
));
136 instruction
->info
.imm
= (instruction
->info
.imm
<< 17) >> 16; /* sign-extend */
137 instruction
->type
= NDS32_INSN_LOAD_STORE
;
138 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
139 &(instruction
->access_start
));
140 instruction
->access_start
+= instruction
->info
.imm
;
141 instruction
->access_end
= instruction
->access_start
+ 2;
142 snprintf(instruction
->text
,
144 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
145 "\tLHI\t$r%" PRIu8
",[$r%" PRIu8
"+#%" PRId32
"]",
147 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
148 instruction
->info
.imm
);
151 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
152 &(instruction
->info
.ra
), &(instruction
->info
.imm
));
153 instruction
->info
.imm
= (instruction
->info
.imm
<< 17) >> 15; /* sign-extend */
154 instruction
->type
= NDS32_INSN_LOAD_STORE
;
155 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
156 &(instruction
->access_start
));
157 instruction
->access_start
+= instruction
->info
.imm
;
158 instruction
->access_end
= instruction
->access_start
+ 4;
159 snprintf(instruction
->text
,
161 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
162 "\tLWI\t$r%" PRIu8
",[$r%" PRIu8
"+#%" PRId32
"]",
164 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
165 instruction
->info
.imm
);
168 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
169 &(instruction
->info
.ra
), &(instruction
->info
.imm
));
170 instruction
->info
.imm
= (instruction
->info
.imm
<< 17) >> 17; /* sign-extend */
171 instruction
->type
= NDS32_INSN_LOAD_STORE
;
172 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
173 &(instruction
->access_start
));
174 instruction
->access_end
= instruction
->access_start
+ 1;
175 snprintf(instruction
->text
,
177 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
178 "\tLBI.bi\t$r%" PRIu8
",[$r%" PRIu8
"],#%" PRId32
,
180 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
181 instruction
->info
.imm
);
184 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
185 &(instruction
->info
.ra
), &(instruction
->info
.imm
));
186 instruction
->info
.imm
= (instruction
->info
.imm
<< 17) >> 16; /* sign-extend */
187 instruction
->type
= NDS32_INSN_LOAD_STORE
;
188 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
189 &(instruction
->access_start
));
190 instruction
->access_end
= instruction
->access_start
+ 2;
191 snprintf(instruction
->text
,
193 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
194 "\tLHI.bi\t$r%" PRIu8
",[$r%" PRIu8
"],#%" PRId32
,
196 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
197 instruction
->info
.imm
);
200 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
201 &(instruction
->info
.ra
), &(instruction
->info
.imm
));
202 instruction
->info
.imm
= (instruction
->info
.imm
<< 17) >> 15; /* sign-extend */
203 instruction
->type
= NDS32_INSN_LOAD_STORE
;
204 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
205 &(instruction
->access_start
));
206 instruction
->access_end
= instruction
->access_start
+ 4;
207 snprintf(instruction
->text
,
209 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
210 "\tLWI.bi\t$r%" PRIu8
",[$r%" PRIu8
"],#%" PRId32
"",
212 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
213 instruction
->info
.imm
);
216 snprintf(instruction
->text
,
218 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
"\tUNDEFINED INSTRUCTION",
227 static int nds32_parse_group_1_insn(struct nds32
*nds32
, uint32_t opcode
,
228 uint32_t address
, struct nds32_instruction
*instruction
)
232 opc_6
= instruction
->info
.opc_6
;
234 switch (opc_6
& 0x7) {
236 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
237 &(instruction
->info
.ra
), &(instruction
->info
.imm
));
238 instruction
->info
.imm
= (instruction
->info
.imm
<< 17) >> 17; /* sign-extend */
239 instruction
->type
= NDS32_INSN_LOAD_STORE
;
240 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
241 &(instruction
->access_start
));
242 instruction
->access_start
+= instruction
->info
.imm
;
243 instruction
->access_end
= instruction
->access_start
+ 1;
244 snprintf(instruction
->text
,
246 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
247 "\tSBI\t$r%" PRIu8
",[$r%" PRIu8
"+#%" PRId32
"]",
249 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
250 instruction
->info
.imm
);
253 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
254 &(instruction
->info
.ra
), &(instruction
->info
.imm
));
255 instruction
->info
.imm
= (instruction
->info
.imm
<< 17) >> 16; /* sign-extend */
256 instruction
->type
= NDS32_INSN_LOAD_STORE
;
257 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
258 &(instruction
->access_start
));
259 instruction
->access_start
+= instruction
->info
.imm
;
260 instruction
->access_end
= instruction
->access_start
+ 2;
261 snprintf(instruction
->text
,
263 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
264 "\tSHI\t$r%" PRIu8
",[$r%" PRIu8
"+#%" PRId32
"]",
266 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
267 instruction
->info
.imm
);
270 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
271 &(instruction
->info
.ra
), &(instruction
->info
.imm
));
272 instruction
->info
.imm
= (instruction
->info
.imm
<< 17) >> 15; /* sign-extend */
273 instruction
->type
= NDS32_INSN_LOAD_STORE
;
274 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
275 &(instruction
->access_start
));
276 instruction
->access_start
+= instruction
->info
.imm
;
277 instruction
->access_end
= instruction
->access_start
+ 4;
278 snprintf(instruction
->text
,
280 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
281 "\tSWI\t$r%" PRIu8
",[$r%" PRIu8
"+#%" PRId32
"]",
283 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
284 instruction
->info
.imm
);
287 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
288 &(instruction
->info
.ra
), &(instruction
->info
.imm
));
289 instruction
->info
.imm
= (instruction
->info
.imm
<< 17) >> 17; /* sign-extend */
290 instruction
->type
= NDS32_INSN_LOAD_STORE
;
291 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
292 &(instruction
->access_start
));
293 instruction
->access_end
= instruction
->access_start
+ 1;
294 snprintf(instruction
->text
,
296 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
297 "\tSBI.bi\t$r%" PRIu8
",[$r%" PRIu8
"],#%" PRId32
,
299 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
300 instruction
->info
.imm
);
303 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
304 &(instruction
->info
.ra
), &(instruction
->info
.imm
));
305 instruction
->info
.imm
= (instruction
->info
.imm
<< 17) >> 16; /* sign-extend */
306 instruction
->type
= NDS32_INSN_LOAD_STORE
;
307 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
308 &(instruction
->access_start
));
309 instruction
->access_end
= instruction
->access_start
+ 2;
310 snprintf(instruction
->text
,
312 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
313 "\tSHI.bi\t$r%" PRIu8
",[$r%" PRIu8
"],#%" PRId32
,
315 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
316 instruction
->info
.imm
);
319 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
320 &(instruction
->info
.ra
), &(instruction
->info
.imm
));
321 instruction
->info
.imm
= (instruction
->info
.imm
<< 17) >> 15; /* sign-extend */
322 instruction
->type
= NDS32_INSN_LOAD_STORE
;
323 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
324 &(instruction
->access_start
));
325 instruction
->access_end
= instruction
->access_start
+ 4;
326 snprintf(instruction
->text
,
328 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
329 "\tSWI.bi\t$r%" PRIu8
",[$r%" PRIu8
"],#%" PRId32
,
331 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
332 instruction
->info
.imm
);
335 snprintf(instruction
->text
,
337 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
"\tUNDEFINED INSTRUCTION",
346 static int nds32_parse_group_2_insn(struct nds32
*nds32
, uint32_t opcode
,
347 uint32_t address
, struct nds32_instruction
*instruction
)
351 opc_6
= instruction
->info
.opc_6
;
353 switch (opc_6
& 0x7) {
355 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
356 &(instruction
->info
.ra
), &(instruction
->info
.imm
));
357 instruction
->info
.imm
= (instruction
->info
.imm
<< 17) >> 17; /* sign-extend */
358 instruction
->type
= NDS32_INSN_LOAD_STORE
;
359 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
360 &(instruction
->access_start
));
361 instruction
->access_start
+= instruction
->info
.imm
;
362 instruction
->access_end
= instruction
->access_start
+ 1;
363 snprintf(instruction
->text
,
365 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
366 "\tLBSI\t$r%" PRIu8
",[$r%" PRIu8
"+#%" PRId32
"]",
368 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
369 instruction
->info
.imm
);
372 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
373 &(instruction
->info
.ra
), &(instruction
->info
.imm
));
374 instruction
->info
.imm
= (instruction
->info
.imm
<< 17) >> 16; /* sign-extend */
375 instruction
->type
= NDS32_INSN_LOAD_STORE
;
376 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
377 &(instruction
->access_start
));
378 instruction
->access_start
+= instruction
->info
.imm
;
379 instruction
->access_end
= instruction
->access_start
+ 2;
380 snprintf(instruction
->text
,
382 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
383 "\tLHSI\t$r%" PRIu8
",[$r%" PRIu8
"+#%" PRId32
"]",
385 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
386 instruction
->info
.imm
);
388 case 3: { /* DPREFI */
390 nds32_parse_type_2(opcode
, &sub_type
, &(instruction
->info
.ra
),
391 &(instruction
->info
.imm
));
392 instruction
->info
.sub_opc
= sub_type
& 0xF;
393 instruction
->type
= NDS32_INSN_MISC
;
394 if (sub_type
& 0x10) { /* DPREFI.d */
396 instruction
->info
.imm
= (instruction
->info
.imm
<< 17) >> 14;
397 snprintf(instruction
->text
,
399 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
400 "\tDPREFI.d\t%" PRIu8
",[$r%" PRIu8
"+#%" PRId32
"]",
402 opcode
, instruction
->info
.sub_opc
,
403 instruction
->info
.ra
, instruction
->info
.imm
);
404 } else { /* DPREFI.w */
406 instruction
->info
.imm
= (instruction
->info
.imm
<< 17) >> 15;
407 snprintf(instruction
->text
,
409 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
410 "\tDPREFI.w\t%" PRIu8
",[$r%" PRIu8
"+#%" PRId32
"]",
412 opcode
, instruction
->info
.sub_opc
,
413 instruction
->info
.ra
, instruction
->info
.imm
);
417 case 4: /* LBSI.bi */
418 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
419 &(instruction
->info
.ra
), &(instruction
->info
.imm
));
420 instruction
->info
.imm
= (instruction
->info
.imm
<< 17) >> 17; /* sign-extend */
421 instruction
->type
= NDS32_INSN_LOAD_STORE
;
422 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
423 &(instruction
->access_start
));
424 instruction
->access_end
= instruction
->access_start
+ 1;
425 snprintf(instruction
->text
,
427 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
428 "\tLBSI.bi\t$r%" PRIu8
",[$r%" PRIu8
"],#%" PRId32
,
430 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
431 instruction
->info
.imm
);
433 case 5: /* LHSI.bi */
434 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
435 &(instruction
->info
.ra
), &(instruction
->info
.imm
));
436 instruction
->info
.imm
= (instruction
->info
.imm
<< 17) >> 16; /* sign-extend */
437 instruction
->type
= NDS32_INSN_LOAD_STORE
;
438 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
439 &(instruction
->access_start
));
440 instruction
->access_end
= instruction
->access_start
+ 2;
441 snprintf(instruction
->text
,
443 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
444 "\tLHSI.bi\t$r%" PRIu8
",[$r%" PRIu8
"],#%" PRId32
,
446 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
447 instruction
->info
.imm
);
450 nds32_parse_type_1(opcode
, &(instruction
->info
.rt
), &(instruction
->info
.imm
));
451 instruction
->type
= NDS32_INSN_LOAD_STORE
;
452 if ((instruction
->info
.imm
>> 19) & 0x1) { /* LBSI.gp */
453 instruction
->info
.imm
= (instruction
->info
.imm
<< 13) >> 13;
454 nds32_get_mapped_reg(nds32
, R29
, &(instruction
->access_start
));
455 instruction
->access_start
+= instruction
->info
.imm
;
456 instruction
->access_end
= instruction
->access_start
+ 1;
457 snprintf(instruction
->text
,
459 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
460 "\tLBSI.gp\t$r%" PRIu8
",[#%" PRId32
"]",
462 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
463 } else { /* LBI.gp */
464 instruction
->info
.imm
= (instruction
->info
.imm
<< 13) >> 13;
465 nds32_get_mapped_reg(nds32
, R29
, &(instruction
->access_start
));
466 instruction
->access_start
+= instruction
->info
.imm
;
467 instruction
->access_end
= instruction
->access_start
+ 1;
468 snprintf(instruction
->text
,
470 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
471 "\tLBI.gp\t$r%" PRIu8
",[#%" PRId32
"]",
473 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
477 snprintf(instruction
->text
,
479 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
"\tUNDEFINED INSTRUCTION",
488 static int nds32_parse_mem(struct nds32
*nds32
, uint32_t opcode
, uint32_t address
,
489 struct nds32_instruction
*instruction
)
491 uint32_t sub_opcode
= opcode
& 0x3F;
492 uint32_t val_ra
, val_rb
;
493 switch (sub_opcode
>> 3) {
495 switch (sub_opcode
& 0x7) {
497 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
498 &(instruction
->info
.ra
), \
499 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
500 instruction
->type
= NDS32_INSN_LOAD_STORE
;
501 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
, &val_ra
);
502 nds32_get_mapped_reg(nds32
, instruction
->info
.rb
, &val_rb
);
503 instruction
->access_start
= val_ra
+
504 (val_rb
<< ((instruction
->info
.imm
>> 8) & 0x3));
505 instruction
->access_end
= instruction
->access_start
+ 1;
506 snprintf(instruction
->text
,
508 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
509 "\tLB\t$r%" PRIu8
",[$r%" PRIu8
"+($r%" PRIu8
"<<%" PRId32
")]",
511 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
512 instruction
->info
.rb
,
513 (instruction
->info
.imm
>> 8) & 0x3);
516 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
517 &(instruction
->info
.ra
),
518 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
519 instruction
->type
= NDS32_INSN_LOAD_STORE
;
520 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
, &val_ra
);
521 nds32_get_mapped_reg(nds32
, instruction
->info
.rb
, &val_rb
);
522 instruction
->access_start
= val_ra
+
523 (val_rb
<< ((instruction
->info
.imm
>> 8) & 0x3));
524 instruction
->access_end
= instruction
->access_start
+ 2;
525 snprintf(instruction
->text
,
527 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
528 "\tLH\t$r%" PRIu8
",[$r%" PRIu8
"+($r%" PRIu8
"<<%" PRId32
")]",
530 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
531 instruction
->info
.rb
,
532 (instruction
->info
.imm
>> 8) & 0x3);
535 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
536 &(instruction
->info
.ra
),
537 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
538 instruction
->type
= NDS32_INSN_LOAD_STORE
;
539 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
, &val_ra
);
540 nds32_get_mapped_reg(nds32
, instruction
->info
.rb
, &val_rb
);
541 instruction
->access_start
= val_ra
+
542 (val_rb
<< ((instruction
->info
.imm
>> 8) & 0x3));
543 instruction
->access_end
= instruction
->access_start
+ 4;
544 snprintf(instruction
->text
,
546 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
547 "\tLW\t$r%" PRIu8
",[$r%" PRIu8
"+($r%" PRIu8
"<<%" PRId32
")]",
549 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
550 instruction
->info
.rb
,
551 (instruction
->info
.imm
>> 8) & 0x3);
554 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
555 &(instruction
->info
.ra
),
556 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
557 instruction
->type
= NDS32_INSN_LOAD_STORE
;
558 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
559 &(instruction
->access_start
));
560 instruction
->access_end
= instruction
->access_start
+ 1;
561 snprintf(instruction
->text
,
563 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
564 "\tLB.bi\t$r%" PRIu8
",[$r%" PRIu8
"],($r%" PRIu8
"<<%" PRId32
")",
566 opcode
, instruction
->info
.rt
,
567 instruction
->info
.ra
, instruction
->info
.rb
,
568 (instruction
->info
.imm
>> 8) & 0x3);
571 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
572 &(instruction
->info
.ra
),
573 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
574 instruction
->type
= NDS32_INSN_LOAD_STORE
;
575 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
576 &(instruction
->access_start
));
577 instruction
->access_end
= instruction
->access_start
+ 2;
578 snprintf(instruction
->text
,
580 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
581 "\tLH.bi\t$r%" PRIu8
",[$r%" PRIu8
"],($r%" PRIu8
"<<%" PRId32
")",
583 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
584 instruction
->info
.rb
,
585 (instruction
->info
.imm
>> 8) & 0x3);
588 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
589 &(instruction
->info
.ra
),
590 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
591 instruction
->type
= NDS32_INSN_LOAD_STORE
;
592 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
593 &(instruction
->access_start
));
594 instruction
->access_end
= instruction
->access_start
+ 4;
595 snprintf(instruction
->text
,
597 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
598 "\tLW.bi\t$r%" PRIu8
",[$r%" PRIu8
"],($r%" PRIu8
"<<%" PRId32
")",
600 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
601 instruction
->info
.rb
,
602 (instruction
->info
.imm
>> 8) & 0x3);
607 switch (sub_opcode
& 0x7) {
609 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
610 &(instruction
->info
.ra
),
611 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
612 instruction
->type
= NDS32_INSN_LOAD_STORE
;
613 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
, &val_ra
);
614 nds32_get_mapped_reg(nds32
, instruction
->info
.rb
, &val_rb
);
615 instruction
->access_start
= val_ra
+
616 (val_rb
<< ((instruction
->info
.imm
>> 8) & 0x3));
617 instruction
->access_end
= instruction
->access_start
+ 1;
618 snprintf(instruction
->text
,
620 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
621 "\tSB\t$r%" PRIu8
",[$r%" PRIu8
"+($r%" PRIu8
"<<%" PRId32
")]",
623 opcode
, instruction
->info
.rt
,
624 instruction
->info
.ra
, instruction
->info
.rb
,
625 (instruction
->info
.imm
>> 8) & 0x3);
628 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
629 &(instruction
->info
.ra
),
630 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
631 instruction
->type
= NDS32_INSN_LOAD_STORE
;
632 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
, &val_ra
);
633 nds32_get_mapped_reg(nds32
, instruction
->info
.rb
, &val_rb
);
634 instruction
->access_start
= val_ra
+
635 (val_rb
<< ((instruction
->info
.imm
>> 8) & 0x3));
636 instruction
->access_end
= instruction
->access_start
+ 2;
637 snprintf(instruction
->text
,
639 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
640 "\tSH\t$r%" PRIu8
",[$r%" PRIu8
"+($r%" PRIu8
"<<%" PRId32
")]",
642 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
643 instruction
->info
.rb
,
644 (instruction
->info
.imm
>> 8) & 0x3);
647 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
648 &(instruction
->info
.ra
),
649 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
650 instruction
->type
= NDS32_INSN_LOAD_STORE
;
651 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
, &val_ra
);
652 nds32_get_mapped_reg(nds32
, instruction
->info
.rb
, &val_rb
);
653 instruction
->access_start
= val_ra
+
654 (val_rb
<< ((instruction
->info
.imm
>> 8) & 0x3));
655 instruction
->access_end
= instruction
->access_start
+ 4;
656 snprintf(instruction
->text
,
658 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
659 "\tSW\t$r%" PRIu8
",[$r%" PRIu8
"+($r%" PRIu8
"<<%" PRId32
")]",
661 opcode
, instruction
->info
.rt
,
662 instruction
->info
.ra
, instruction
->info
.rb
,
663 (instruction
->info
.imm
>> 8) & 0x3);
666 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
667 &(instruction
->info
.ra
),
668 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
669 instruction
->type
= NDS32_INSN_LOAD_STORE
;
670 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
671 &(instruction
->access_start
));
672 instruction
->access_end
= instruction
->access_start
+ 1;
673 snprintf(instruction
->text
,
675 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
676 "\tSB.bi\t$r%" PRIu8
",[$r%" PRIu8
"],($r%" PRIu8
"<<%" PRId32
")",
678 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
679 instruction
->info
.rb
,
680 (instruction
->info
.imm
>> 8) & 0x3);
683 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
684 &(instruction
->info
.ra
),
685 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
686 instruction
->type
= NDS32_INSN_LOAD_STORE
;
687 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
688 &(instruction
->access_start
));
689 instruction
->access_end
= instruction
->access_start
+ 2;
690 snprintf(instruction
->text
,
692 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
693 "\tSH.bi\t$r%" PRIu8
",[$r%" PRIu8
"],($r%" PRIu8
"<<%" PRId32
")",
695 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
696 instruction
->info
.rb
,
697 (instruction
->info
.imm
>> 8) & 0x3);
700 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
701 &(instruction
->info
.ra
),
702 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
703 instruction
->type
= NDS32_INSN_LOAD_STORE
;
704 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
705 &(instruction
->access_start
));
706 instruction
->access_end
= instruction
->access_start
+ 4;
707 snprintf(instruction
->text
,
709 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
710 "\tSW.bi\t$r%" PRIu8
",[$r%" PRIu8
"],($r%" PRIu8
"<<%" PRId32
")",
712 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
713 instruction
->info
.rb
,
714 (instruction
->info
.imm
>> 8) & 0x3);
719 switch (sub_opcode
& 0x7) {
721 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
722 &(instruction
->info
.ra
),
723 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
724 instruction
->type
= NDS32_INSN_LOAD_STORE
;
725 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
, &val_ra
);
726 nds32_get_mapped_reg(nds32
, instruction
->info
.rb
, &val_rb
);
727 instruction
->access_start
= val_ra
+
728 (val_rb
<< ((instruction
->info
.imm
>> 8) & 0x3));
729 instruction
->access_end
= instruction
->access_start
+ 1;
730 snprintf(instruction
->text
,
732 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
733 "\tLBS\t$r%" PRIu8
",[$r%" PRIu8
"+($r%" PRIu8
"<<%" PRId32
")]",
735 opcode
, instruction
->info
.rt
,
736 instruction
->info
.ra
, instruction
->info
.rb
,
737 (instruction
->info
.imm
>> 8) & 0x3);
740 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
741 &(instruction
->info
.ra
),
742 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
743 instruction
->type
= NDS32_INSN_LOAD_STORE
;
744 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
, &val_ra
);
745 nds32_get_mapped_reg(nds32
, instruction
->info
.rb
, &val_rb
);
746 instruction
->access_start
= val_ra
+
747 (val_rb
<< ((instruction
->info
.imm
>> 8) & 0x3));
748 instruction
->access_end
= instruction
->access_start
+ 2;
749 snprintf(instruction
->text
,
751 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
752 "\tLHS\t$r%" PRIu8
",[$r%" PRIu8
"+($r%" PRIu8
"<<%" PRId32
")]",
754 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
755 instruction
->info
.rb
,
756 (instruction
->info
.imm
>> 8) & 0x3);
759 nds32_parse_type_3(opcode
, &(instruction
->info
.sub_opc
),
760 &(instruction
->info
.ra
),
761 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
762 instruction
->type
= NDS32_INSN_MISC
;
763 snprintf(instruction
->text
,
765 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
766 "\tDPREF\t#%" PRIu8
",[$r%" PRIu8
"+($r%" PRIu8
"<<#%" PRId32
")]",
768 opcode
, instruction
->info
.sub_opc
,
769 instruction
->info
.ra
, instruction
->info
.rb
,
770 (instruction
->info
.imm
>> 8) & 0x3);
773 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
774 &(instruction
->info
.ra
),
775 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
776 instruction
->type
= NDS32_INSN_LOAD_STORE
;
777 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
778 &(instruction
->access_start
));
779 instruction
->access_end
= instruction
->access_start
+ 1;
780 snprintf(instruction
->text
,
782 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
783 "\tLBS.bi\t$r%" PRIu8
",[$r%" PRIu8
"],($r%" PRIu8
"<<%" PRId32
")",
785 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
786 instruction
->info
.rb
,
787 (instruction
->info
.imm
>> 8) & 0x3);
790 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
791 &(instruction
->info
.ra
),
792 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
793 instruction
->type
= NDS32_INSN_LOAD_STORE
;
794 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
795 &(instruction
->access_start
));
796 instruction
->access_end
= instruction
->access_start
+ 2;
797 snprintf(instruction
->text
,
799 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
800 "\tLHS.bi\t$r%" PRIu8
",[$r%" PRIu8
"],($r%" PRIu8
"<<%" PRId32
")",
802 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
803 instruction
->info
.rb
,
804 (instruction
->info
.imm
>> 8) & 0x3);
809 switch (sub_opcode
& 0x7) {
811 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
812 &(instruction
->info
.ra
),
813 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
814 instruction
->type
= NDS32_INSN_LOAD_STORE
;
815 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
, &val_ra
);
816 nds32_get_mapped_reg(nds32
, instruction
->info
.rb
, &val_rb
);
817 instruction
->access_start
= val_ra
+
818 (val_rb
<< ((instruction
->info
.imm
>> 8) & 0x3));
819 instruction
->access_end
= instruction
->access_start
+ 4;
820 snprintf(instruction
->text
,
822 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
823 "\tLLW\t$r%" PRIu8
",[$r%" PRIu8
"+($r%" PRIu8
"<<%" PRId32
")]",
825 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
826 instruction
->info
.rb
,
827 (instruction
->info
.imm
>> 8) & 0x3);
830 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
831 &(instruction
->info
.ra
),
832 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
833 instruction
->type
= NDS32_INSN_LOAD_STORE
;
834 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
, &val_ra
);
835 nds32_get_mapped_reg(nds32
, instruction
->info
.rb
, &val_rb
);
836 instruction
->access_start
= val_ra
+
837 (val_rb
<< ((instruction
->info
.imm
>> 8) & 0x3));
838 instruction
->access_end
= instruction
->access_start
+ 4;
839 snprintf(instruction
->text
,
841 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
842 "\tSCW\t$r%" PRIu8
",[$r%" PRIu8
"+($r%" PRIu8
"<<%" PRId32
")]",
844 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
845 instruction
->info
.rb
,
846 (instruction
->info
.imm
>> 8) & 0x3);
851 switch (sub_opcode
& 0x7) {
853 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
854 &(instruction
->info
.ra
),
855 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
856 instruction
->type
= NDS32_INSN_LOAD_STORE
;
857 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
, &val_ra
);
858 nds32_get_mapped_reg(nds32
, instruction
->info
.rb
, &val_rb
);
859 instruction
->access_start
= val_ra
+
860 (val_rb
<< ((instruction
->info
.imm
>> 8) & 0x3));
861 instruction
->access_end
= instruction
->access_start
+ 1;
862 snprintf(instruction
->text
,
864 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
865 "\tLBUP\t$r%" PRIu8
",[$r%" PRIu8
"+($r%" PRIu8
"<<%" PRId32
")]",
867 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
868 instruction
->info
.rb
,
869 (instruction
->info
.imm
>> 8) & 0x3);
872 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
873 &(instruction
->info
.ra
),
874 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
875 instruction
->type
= NDS32_INSN_LOAD_STORE
;
876 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
, &val_ra
);
877 nds32_get_mapped_reg(nds32
, instruction
->info
.rb
, &val_rb
);
878 instruction
->access_start
= val_ra
+
879 (val_rb
<< ((instruction
->info
.imm
>> 8) & 0x3));
880 instruction
->access_end
= instruction
->access_start
+ 4;
881 snprintf(instruction
->text
,
883 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
884 "\tLWUP\t$r%" PRIu8
",[$r%" PRIu8
"+($r%" PRIu8
"<<%" PRId32
")]",
886 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
887 instruction
->info
.rb
,
888 (instruction
->info
.imm
>> 8) & 0x3);
893 switch (sub_opcode
& 0x7) {
895 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
896 &(instruction
->info
.ra
),
897 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
898 instruction
->type
= NDS32_INSN_LOAD_STORE
;
899 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
, &val_ra
);
900 nds32_get_mapped_reg(nds32
, instruction
->info
.rb
, &val_rb
);
901 instruction
->access_start
= val_ra
+
902 (val_rb
<< ((instruction
->info
.imm
>> 8) & 0x3));
903 instruction
->access_end
= instruction
->access_start
+ 1;
904 snprintf(instruction
->text
,
906 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
907 "\tSBUP\t$r%" PRIu8
",[$r%" PRIu8
"+($r%" PRIu8
"<<%" PRId32
")]",
909 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
910 instruction
->info
.rb
,
911 (instruction
->info
.imm
>> 8) & 0x3);
914 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
915 &(instruction
->info
.ra
),
916 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
917 instruction
->type
= NDS32_INSN_LOAD_STORE
;
918 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
, &val_ra
);
919 nds32_get_mapped_reg(nds32
, instruction
->info
.rb
, &val_rb
);
920 instruction
->access_start
= val_ra
+
921 (val_rb
<< ((instruction
->info
.imm
>> 8) & 0x3));
922 instruction
->access_end
= instruction
->access_start
+ 4;
923 snprintf(instruction
->text
,
925 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
926 "\tSWUP\t$r%" PRIu8
",[$r%" PRIu8
"+($r%" PRIu8
"<<%" PRId32
")]",
928 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
929 instruction
->info
.rb
,
930 (instruction
->info
.imm
>> 8) & 0x3);
935 snprintf(instruction
->text
,
937 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
"\tUNDEFINED INSTRUCTION",
946 static int nds32_calculate_lsmw_access_range(struct nds32
*nds32
,
947 struct nds32_instruction
*instruction
)
953 enable4
= (instruction
->info
.imm
>> 6) & 0xF;
954 ba
= (instruction
->info
.imm
>> 4) & 0x1;
955 id
= (instruction
->info
.imm
>> 3) & 0x1;
958 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
, &(instruction
->access_start
));
959 if (id
) { /* decrease */
960 /* access_end is the (last_element+1), so no need to minus 4 */
961 /* instruction->access_end -= 4; */
962 instruction
->access_end
= instruction
->access_start
;
963 } else { /* increase */
964 instruction
->access_start
+= 4;
967 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
, &(instruction
->access_start
));
968 instruction
->access_end
= instruction
->access_start
- 4;
971 if (id
) { /* decrease */
972 instruction
->access_start
= instruction
->access_end
-
973 4 * (instruction
->info
.rd
- instruction
->info
.rb
+ 1);
974 instruction
->access_start
-= (4 * enable4_bits
[enable4
]);
975 } else { /* increase */
976 instruction
->access_end
= instruction
->access_start
+
977 4 * (instruction
->info
.rd
- instruction
->info
.rb
+ 1);
978 instruction
->access_end
+= (4 * enable4_bits
[enable4
]);
984 static int nds32_parse_lsmw(struct nds32
*nds32
, uint32_t opcode
, uint32_t address
,
985 struct nds32_instruction
*instruction
)
987 if (opcode
& 0x20) { /* SMW, SMWA, SMWZB */
988 switch (opcode
& 0x3) {
992 nds32_parse_type_3(opcode
, &(instruction
->info
.rb
),
993 &(instruction
->info
.ra
),
994 &(instruction
->info
.rd
), &(instruction
->info
.imm
));
995 instruction
->type
= NDS32_INSN_LOAD_STORE
;
996 nds32_calculate_lsmw_access_range(nds32
, instruction
);
997 snprintf(instruction
->text
,
999 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1000 "\tSMW\t$r%" PRIu8
",[$r%" PRIu8
"],$r%" PRIu8
",%" PRId32
,
1002 opcode
, instruction
->info
.rb
, instruction
->info
.ra
,
1003 instruction
->info
.rd
,
1004 (instruction
->info
.imm
>> 6) & 0xF);
1007 nds32_parse_type_3(opcode
, &(instruction
->info
.rb
),
1008 &(instruction
->info
.ra
),
1009 &(instruction
->info
.rd
), &(instruction
->info
.imm
));
1010 instruction
->type
= NDS32_INSN_LOAD_STORE
;
1011 nds32_calculate_lsmw_access_range(nds32
, instruction
);
1012 snprintf(instruction
->text
,
1014 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1015 "\tSMWA\t$r%" PRIu8
",[$r%" PRIu8
"],$r%" PRIu8
",%" PRId32
,
1017 opcode
, instruction
->info
.rb
, instruction
->info
.ra
,
1018 instruction
->info
.rd
,
1019 (instruction
->info
.imm
>> 6) & 0xF);
1022 nds32_parse_type_3(opcode
, &(instruction
->info
.rb
),
1023 &(instruction
->info
.ra
),
1024 &(instruction
->info
.rd
), &(instruction
->info
.imm
));
1025 instruction
->type
= NDS32_INSN_LOAD_STORE
;
1026 /* TODO: calculate access_start/access_end */
1027 snprintf(instruction
->text
,
1029 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1030 "\tSMWZB\t$r%" PRIu8
",[$r%" PRIu8
"],$r%" PRIu8
",%" PRId32
,
1032 opcode
, instruction
->info
.rb
, instruction
->info
.ra
,
1033 instruction
->info
.rd
,
1034 (instruction
->info
.imm
>> 6) & 0xF);
1037 snprintf(instruction
->text
,
1039 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
"\tUNDEFINED INSTRUCTION",
1044 } else { /* LMW, LMWA, LMWZB */
1045 switch (opcode
& 0x3) {
1047 nds32_parse_type_3(opcode
, &(instruction
->info
.rb
),
1048 &(instruction
->info
.ra
),
1049 &(instruction
->info
.rd
), &(instruction
->info
.imm
));
1050 instruction
->type
= NDS32_INSN_LOAD_STORE
;
1051 nds32_calculate_lsmw_access_range(nds32
, instruction
);
1052 snprintf(instruction
->text
,
1054 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1055 "\tLMW\t$r%" PRIu8
",[$r%" PRIu8
"],$r%" PRIu8
",%" PRId32
,
1057 opcode
, instruction
->info
.rb
, instruction
->info
.ra
,
1058 instruction
->info
.rd
,
1059 (instruction
->info
.imm
>> 6) & 0xF);
1062 nds32_parse_type_3(opcode
, &(instruction
->info
.rb
),
1063 &(instruction
->info
.ra
),
1064 &(instruction
->info
.rd
), &(instruction
->info
.imm
));
1065 instruction
->type
= NDS32_INSN_LOAD_STORE
;
1066 nds32_calculate_lsmw_access_range(nds32
, instruction
);
1067 snprintf(instruction
->text
,
1069 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1070 "\tLMWA\t$r%" PRIu8
",[$r%" PRIu8
"],$r%" PRIu8
",%" PRId32
,
1072 opcode
, instruction
->info
.rb
, instruction
->info
.ra
,
1073 instruction
->info
.rd
,
1074 (instruction
->info
.imm
>> 6) & 0xF);
1077 nds32_parse_type_3(opcode
, &(instruction
->info
.rb
),
1078 &(instruction
->info
.ra
),
1079 &(instruction
->info
.rd
), &(instruction
->info
.imm
));
1080 instruction
->type
= NDS32_INSN_LOAD_STORE
;
1081 /* TODO: calculate access_start/access_end */
1082 snprintf(instruction
->text
,
1084 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1085 "\tLMWZB\t$r%" PRIu8
",[$r%" PRIu8
"],$r%" PRIu8
",%" PRId32
,
1087 opcode
, instruction
->info
.rb
, instruction
->info
.ra
,
1088 instruction
->info
.rd
,
1089 (instruction
->info
.imm
>> 6) & 0xF);
1092 snprintf(instruction
->text
,
1094 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
"\tUNDEFINED INSTRUCTION",
1104 static int nds32_parse_hwgp(struct nds32
*nds32
, uint32_t opcode
, uint32_t address
,
1105 struct nds32_instruction
*instruction
)
1107 switch ((opcode
>> 18) & 0x3) {
1108 case 0: /* LHI.gp */
1109 nds32_parse_type_1(opcode
, &(instruction
->info
.rt
), &(instruction
->info
.imm
));
1110 instruction
->info
.imm
= (instruction
->info
.imm
<< 14) >> 13; /* sign-extend */
1111 instruction
->type
= NDS32_INSN_LOAD_STORE
;
1112 nds32_get_mapped_reg(nds32
, R29
, &(instruction
->access_start
));
1113 instruction
->access_start
+= instruction
->info
.imm
;
1114 instruction
->access_end
= instruction
->access_start
+ 2;
1115 snprintf(instruction
->text
,
1117 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1118 "\tLHI.gp\t$r%" PRIu8
",[#%" PRId32
"]",
1120 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
1122 case 1: /* LHSI.gp */
1123 nds32_parse_type_1(opcode
, &(instruction
->info
.rt
), &(instruction
->info
.imm
));
1124 instruction
->info
.imm
= (instruction
->info
.imm
<< 14) >> 13; /* sign-extend */
1125 instruction
->type
= NDS32_INSN_LOAD_STORE
;
1126 nds32_get_mapped_reg(nds32
, R29
, &(instruction
->access_start
));
1127 instruction
->access_start
+= instruction
->info
.imm
;
1128 instruction
->access_end
= instruction
->access_start
+ 2;
1129 snprintf(instruction
->text
,
1131 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1132 "\tLHSI.gp\t$r%" PRIu8
",[#%" PRId32
"]",
1134 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
1136 case 2: /* SHI.gp */
1137 nds32_parse_type_1(opcode
, &(instruction
->info
.rt
), &(instruction
->info
.imm
));
1138 instruction
->info
.imm
= (instruction
->info
.imm
<< 14) >> 13; /* sign-extend */
1139 instruction
->type
= NDS32_INSN_LOAD_STORE
;
1140 nds32_get_mapped_reg(nds32
, R29
, &(instruction
->access_start
));
1141 instruction
->access_start
+= instruction
->info
.imm
;
1142 instruction
->access_end
= instruction
->access_start
+ 2;
1143 snprintf(instruction
->text
,
1145 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1146 "\tSHI.gp\t$r%" PRIu8
",[#%" PRId32
"]",
1148 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
1151 instruction
->type
= NDS32_INSN_LOAD_STORE
;
1152 if ((opcode
>> 17) & 0x1) { /* SWI.gp */
1153 nds32_parse_type_1(opcode
, &(instruction
->info
.rt
),
1154 &(instruction
->info
.imm
));
1156 instruction
->info
.imm
= (instruction
->info
.imm
<< 15) >> 13;
1157 nds32_get_mapped_reg(nds32
, R29
, &(instruction
->access_start
));
1158 instruction
->access_start
+= instruction
->info
.imm
;
1159 instruction
->access_end
= instruction
->access_start
+ 4;
1160 snprintf(instruction
->text
,
1162 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1163 "\tSWI.gp\t$r%" PRIu8
",[#%" PRId32
"]",
1165 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
1166 } else { /* LWI.gp */
1167 nds32_parse_type_1(opcode
, &(instruction
->info
.rt
),
1168 &(instruction
->info
.imm
));
1170 instruction
->info
.imm
= (instruction
->info
.imm
<< 15) >> 13;
1171 nds32_get_mapped_reg(nds32
, R29
, &(instruction
->access_start
));
1172 instruction
->access_start
+= instruction
->info
.imm
;
1173 instruction
->access_end
= instruction
->access_start
+ 4;
1174 snprintf(instruction
->text
,
1176 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1177 "\tLWI.gp\t$r%" PRIu8
",[#%" PRId32
"]",
1179 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
1184 snprintf(instruction
->text
,
1186 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
"\tUNDEFINED INSTRUCTION",
1195 static int nds32_parse_sbgp(struct nds32
*nds32
, uint32_t opcode
, uint32_t address
,
1196 struct nds32_instruction
*instruction
)
1198 switch ((opcode
>> 19) & 0x1) {
1199 case 0: /* SBI.gp */
1200 nds32_parse_type_1(opcode
, &(instruction
->info
.rt
), &(instruction
->info
.imm
));
1201 instruction
->info
.imm
= (instruction
->info
.imm
<< 13) >> 13; /* sign-extend */
1202 instruction
->type
= NDS32_INSN_LOAD_STORE
;
1203 nds32_get_mapped_reg(nds32
, R29
, &(instruction
->access_start
));
1204 instruction
->access_start
+= instruction
->info
.imm
;
1205 instruction
->access_end
= instruction
->access_start
+ 1;
1206 snprintf(instruction
->text
,
1208 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1209 "\tSBI.gp\t$r%" PRIu8
",[#%" PRId32
"]",
1211 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
1213 case 1: /* ADDI.gp */
1214 nds32_parse_type_1(opcode
, &(instruction
->info
.rt
), &(instruction
->info
.imm
));
1215 instruction
->info
.imm
= (instruction
->info
.imm
<< 13) >> 13; /* sign-extend */
1216 instruction
->type
= NDS32_INSN_DATA_PROC
;
1217 snprintf(instruction
->text
,
1219 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1220 "\tADDI.gp\t$r%" PRIu8
",#%" PRId32
"",
1222 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
1225 snprintf(instruction
->text
,
1227 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
"\tUNDEFINED INSTRUCTION",
1236 static int nds32_parse_group_3_insn(struct nds32
*nds32
, uint32_t opcode
, uint32_t address
,
1237 struct nds32_instruction
*instruction
)
1241 opc_6
= instruction
->info
.opc_6
;
1243 switch (opc_6
& 0x7) {
1245 nds32_parse_mem(nds32
, opcode
, address
, instruction
);
1248 nds32_parse_lsmw(nds32
, opcode
, address
, instruction
);
1251 nds32_parse_hwgp(nds32
, opcode
, address
, instruction
);
1254 nds32_parse_sbgp(nds32
, opcode
, address
, instruction
);
1257 snprintf(instruction
->text
,
1259 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
"\tUNDEFINED INSTRUCTION",
1268 static int nds32_parse_alu_1(uint32_t opcode
, uint32_t address
,
1269 struct nds32_instruction
*instruction
)
1271 switch (opcode
& 0x1F) {
1273 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
), &(instruction
->info
.ra
),
1274 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
1275 instruction
->type
= NDS32_INSN_DATA_PROC
;
1276 instruction
->info
.imm
= (instruction
->info
.imm
>> 5) & 0x1F;
1277 if (instruction
->info
.imm
)
1278 snprintf(instruction
->text
,
1280 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1281 "\tADD_SLLI\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
",%" PRId32
,
1283 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1284 instruction
->info
.rb
,
1285 instruction
->info
.imm
);
1287 snprintf(instruction
->text
,
1289 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1290 "\tADD\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
1292 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1293 instruction
->info
.rb
);
1296 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1297 &(instruction
->info
.ra
),
1298 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
1299 instruction
->type
= NDS32_INSN_DATA_PROC
;
1300 instruction
->info
.imm
= (instruction
->info
.imm
>> 5) & 0x1F;
1301 if (instruction
->info
.imm
)
1302 snprintf(instruction
->text
,
1304 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1305 "\tSUB_SLLI\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
",%" PRId32
,
1307 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1308 instruction
->info
.rb
,
1309 instruction
->info
.imm
);
1311 snprintf(instruction
->text
,
1313 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1314 "\tSUB\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
"",
1316 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1317 instruction
->info
.rb
);
1320 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1321 &(instruction
->info
.ra
),
1322 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
1323 instruction
->type
= NDS32_INSN_DATA_PROC
;
1324 instruction
->info
.imm
= (instruction
->info
.imm
>> 5) & 0x1F;
1325 if (instruction
->info
.imm
)
1326 snprintf(instruction
->text
,
1328 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1329 "\tAND_SLLI\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
",%" PRId32
,
1331 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1332 instruction
->info
.rb
,
1333 instruction
->info
.imm
);
1335 snprintf(instruction
->text
,
1337 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1338 "\tAND\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
"",
1340 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1341 instruction
->info
.rb
);
1344 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1345 &(instruction
->info
.ra
),
1346 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
1347 instruction
->type
= NDS32_INSN_DATA_PROC
;
1348 instruction
->info
.imm
= (instruction
->info
.imm
>> 5) & 0x1F;
1349 if (instruction
->info
.imm
)
1350 snprintf(instruction
->text
,
1352 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1353 "\tXOR_SLLI\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
",%" PRId32
,
1355 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1356 instruction
->info
.rb
,
1357 instruction
->info
.imm
);
1359 snprintf(instruction
->text
,
1361 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1362 "\tXOR\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
1364 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1365 instruction
->info
.rb
);
1368 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1369 &(instruction
->info
.ra
),
1370 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
1371 instruction
->type
= NDS32_INSN_DATA_PROC
;
1372 instruction
->info
.imm
= (instruction
->info
.imm
>> 5) & 0x1F;
1373 if (instruction
->info
.imm
)
1374 snprintf(instruction
->text
,
1376 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1377 "\tOR_SLLI\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
",%" PRId32
,
1379 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1380 instruction
->info
.rb
,
1381 instruction
->info
.imm
);
1383 snprintf(instruction
->text
,
1385 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1386 "\tOR\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
1388 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1389 instruction
->info
.rb
);
1392 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1393 &(instruction
->info
.ra
),
1394 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
1395 instruction
->type
= NDS32_INSN_DATA_PROC
;
1396 snprintf(instruction
->text
,
1398 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1399 "\tNOR\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
1401 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1402 instruction
->info
.rb
);
1405 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1406 &(instruction
->info
.ra
),
1407 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
1408 instruction
->type
= NDS32_INSN_DATA_PROC
;
1409 snprintf(instruction
->text
,
1411 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1412 "\tSLT\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
1414 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1415 instruction
->info
.rb
);
1418 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1419 &(instruction
->info
.ra
),
1420 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
1421 instruction
->type
= NDS32_INSN_DATA_PROC
;
1422 snprintf(instruction
->text
,
1424 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1425 "\tSLTS\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
1427 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1428 instruction
->info
.rb
);
1430 case 8: { /* SLLI */
1433 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1434 &(instruction
->info
.ra
),
1436 instruction
->info
.imm
= imm
;
1437 instruction
->type
= NDS32_INSN_DATA_PROC
;
1438 snprintf(instruction
->text
,
1440 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1441 "\tSLLI\t$r%" PRIu8
",$r%" PRIu8
",#%" PRId32
,
1443 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1444 instruction
->info
.imm
);
1447 case 9: { /* SRLI */
1450 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1451 &(instruction
->info
.ra
),
1453 instruction
->info
.imm
= imm
;
1454 instruction
->type
= NDS32_INSN_DATA_PROC
;
1455 snprintf(instruction
->text
,
1457 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1458 "\tSRLI\t$r%" PRIu8
",$r%" PRIu8
",#%" PRId32
,
1460 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1461 instruction
->info
.imm
);
1464 case 10: { /* SRAI */
1467 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1468 &(instruction
->info
.ra
),
1470 instruction
->info
.imm
= imm
;
1471 instruction
->type
= NDS32_INSN_DATA_PROC
;
1472 snprintf(instruction
->text
,
1474 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1475 "\tSRAI\t$r%" PRIu8
",$r%" PRIu8
",#%" PRId32
,
1477 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1478 instruction
->info
.imm
);
1481 case 11: { /* ROTRI */
1484 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1485 &(instruction
->info
.ra
),
1487 instruction
->info
.imm
= imm
;
1488 instruction
->type
= NDS32_INSN_DATA_PROC
;
1489 snprintf(instruction
->text
,
1491 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1492 "\tROTRI\t$r%" PRIu8
",$r%" PRIu8
",#%" PRId32
,
1494 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1495 instruction
->info
.imm
);
1498 case 12: { /* SLL */
1499 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1500 &(instruction
->info
.ra
),
1501 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
1502 instruction
->type
= NDS32_INSN_DATA_PROC
;
1503 snprintf(instruction
->text
,
1505 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1506 "\tSLL\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
1508 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1509 instruction
->info
.rb
);
1512 case 13: { /* SRL */
1513 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1514 &(instruction
->info
.ra
),
1515 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
1516 instruction
->type
= NDS32_INSN_DATA_PROC
;
1517 snprintf(instruction
->text
,
1519 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1520 "\tSRL\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
1522 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1523 instruction
->info
.rb
);
1526 case 14: { /* SRA */
1527 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1528 &(instruction
->info
.ra
),
1529 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
1530 instruction
->type
= NDS32_INSN_DATA_PROC
;
1531 snprintf(instruction
->text
,
1533 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1534 "\tSRA\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
1536 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1537 instruction
->info
.rb
);
1540 case 15: { /* ROTR */
1541 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1542 &(instruction
->info
.ra
),
1543 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
1544 instruction
->type
= NDS32_INSN_DATA_PROC
;
1545 snprintf(instruction
->text
,
1547 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1548 "\tROTR\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
1550 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1551 instruction
->info
.rb
);
1554 case 16: { /* SEB */
1555 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
1556 &(instruction
->info
.ra
),
1557 &(instruction
->info
.imm
));
1558 instruction
->type
= NDS32_INSN_DATA_PROC
;
1559 snprintf(instruction
->text
,
1561 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1562 "\tSEB\t$r%" PRIu8
",$r%" PRIu8
,
1564 opcode
, instruction
->info
.rt
, instruction
->info
.ra
);
1567 case 17: { /* SEH */
1568 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
1569 &(instruction
->info
.ra
),
1570 &(instruction
->info
.imm
));
1571 instruction
->type
= NDS32_INSN_DATA_PROC
;
1572 snprintf(instruction
->text
,
1574 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1575 "\tSEH\t$r%" PRIu8
",$r%" PRIu8
,
1577 opcode
, instruction
->info
.rt
, instruction
->info
.ra
);
1581 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1582 &(instruction
->info
.ra
),
1583 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
1584 instruction
->type
= NDS32_INSN_DATA_PROC
;
1585 snprintf(instruction
->text
,
1587 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1588 "\tBITC\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
1590 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1591 instruction
->info
.rb
);
1593 case 19: { /* ZEH */
1594 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
1595 &(instruction
->info
.ra
),
1596 &(instruction
->info
.imm
));
1597 instruction
->type
= NDS32_INSN_DATA_PROC
;
1598 snprintf(instruction
->text
,
1600 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1601 "\tZEH\t$r%" PRIu8
",$r%" PRIu8
,
1603 opcode
, instruction
->info
.rt
, instruction
->info
.ra
);
1606 case 20: { /* WSBH */
1607 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
1608 &(instruction
->info
.ra
),
1609 &(instruction
->info
.imm
));
1610 instruction
->type
= NDS32_INSN_DATA_PROC
;
1611 snprintf(instruction
->text
,
1613 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1614 "\tWSBH\t$r%" PRIu8
",$r%" PRIu8
,
1616 opcode
, instruction
->info
.rt
, instruction
->info
.ra
);
1619 case 21: /* OR_SRLI */
1620 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1621 &(instruction
->info
.ra
),
1622 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
1623 instruction
->type
= NDS32_INSN_DATA_PROC
;
1624 instruction
->info
.imm
= (instruction
->info
.imm
>> 5) & 0x1F;
1625 if (instruction
->info
.imm
)
1626 snprintf(instruction
->text
,
1628 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1629 "\tOR_SRLI\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
",%" PRId32
,
1631 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1632 instruction
->info
.rb
,
1633 instruction
->info
.imm
);
1635 snprintf(instruction
->text
,
1637 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1638 "\tOR\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
1640 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1641 instruction
->info
.rb
);
1643 case 22: { /* DIVSR */
1644 nds32_parse_type_4(opcode
, &(instruction
->info
.rt
),
1645 &(instruction
->info
.ra
),
1646 &(instruction
->info
.rb
), &(instruction
->info
.rd
),
1647 &(instruction
->info
.sub_opc
));
1648 instruction
->type
= NDS32_INSN_DATA_PROC
;
1649 snprintf(instruction
->text
,
1651 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1652 "\tDIVSR\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
1654 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1655 instruction
->info
.rb
,
1656 instruction
->info
.rd
);
1659 case 23: { /* DIVR */
1660 nds32_parse_type_4(opcode
, &(instruction
->info
.rt
),
1661 &(instruction
->info
.ra
),
1662 &(instruction
->info
.rb
), &(instruction
->info
.rd
),
1663 &(instruction
->info
.sub_opc
));
1664 instruction
->type
= NDS32_INSN_DATA_PROC
;
1665 snprintf(instruction
->text
,
1667 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1668 "\tDIVR\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
1670 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1671 instruction
->info
.rb
,
1672 instruction
->info
.rd
);
1675 case 24: { /* SVA */
1676 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1677 &(instruction
->info
.ra
),
1678 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
1679 instruction
->type
= NDS32_INSN_DATA_PROC
;
1680 snprintf(instruction
->text
,
1682 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1683 "\tSVA\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
1685 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1686 instruction
->info
.rb
);
1689 case 25: { /* SVS */
1690 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1691 &(instruction
->info
.ra
),
1692 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
1693 instruction
->type
= NDS32_INSN_DATA_PROC
;
1694 snprintf(instruction
->text
,
1696 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1697 "\tSVS\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
1699 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1700 instruction
->info
.rb
);
1703 case 26: { /* CMOVZ */
1704 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1705 &(instruction
->info
.ra
),
1706 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
1707 instruction
->type
= NDS32_INSN_MISC
;
1708 snprintf(instruction
->text
,
1710 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1711 "\tCMOVZ\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
1713 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1714 instruction
->info
.rb
);
1717 case 27: { /* CMOVN */
1718 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1719 &(instruction
->info
.ra
),
1720 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
1721 instruction
->type
= NDS32_INSN_MISC
;
1722 snprintf(instruction
->text
,
1724 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1725 "\tCMOVN\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
1727 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1728 instruction
->info
.rb
);
1731 case 28: /* ADD_SRLI */
1732 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1733 &(instruction
->info
.ra
),
1734 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
1735 instruction
->type
= NDS32_INSN_DATA_PROC
;
1736 instruction
->info
.imm
= (instruction
->info
.imm
>> 5) & 0x1F;
1737 if (instruction
->info
.imm
)
1738 snprintf(instruction
->text
,
1740 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1741 "\tADD_SRLI\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
",%" PRId32
,
1743 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1744 instruction
->info
.rb
,
1745 instruction
->info
.imm
);
1747 snprintf(instruction
->text
,
1749 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1750 "\tADD\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
1752 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1753 instruction
->info
.rb
);
1755 case 29: /* SUB_SRLI */
1756 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1757 &(instruction
->info
.ra
),
1758 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
1759 instruction
->type
= NDS32_INSN_DATA_PROC
;
1760 instruction
->info
.imm
= (instruction
->info
.imm
>> 5) & 0x1F;
1761 if (instruction
->info
.imm
)
1762 snprintf(instruction
->text
,
1764 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1765 "\tSUB_SRLI\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
",%" PRId32
,
1767 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1768 instruction
->info
.rb
,
1769 instruction
->info
.imm
);
1771 snprintf(instruction
->text
,
1773 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1774 "\tSUB\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
1776 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1777 instruction
->info
.rb
);
1779 case 30: /* AND_SRLI */
1780 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1781 &(instruction
->info
.ra
),
1782 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
1783 instruction
->type
= NDS32_INSN_DATA_PROC
;
1784 instruction
->info
.imm
= (instruction
->info
.imm
>> 5) & 0x1F;
1785 if (instruction
->info
.imm
)
1786 snprintf(instruction
->text
,
1788 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1789 "\tAND_SRLI\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
",%" PRId32
,
1791 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1792 instruction
->info
.rb
,
1793 instruction
->info
.imm
);
1795 snprintf(instruction
->text
,
1797 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1798 "\tAND\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
1800 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1801 instruction
->info
.rb
);
1803 case 31: /* XOR_SRLI */
1804 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1805 &(instruction
->info
.ra
),
1806 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
1807 instruction
->type
= NDS32_INSN_DATA_PROC
;
1808 instruction
->info
.imm
= (instruction
->info
.imm
>> 5) & 0x1F;
1809 if (instruction
->info
.imm
)
1810 snprintf(instruction
->text
,
1812 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1813 "\tXOR_SRLI\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
",%" PRId32
,
1815 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1816 instruction
->info
.rb
,
1817 instruction
->info
.imm
);
1819 snprintf(instruction
->text
,
1821 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1822 "\tXOR\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
1824 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1825 instruction
->info
.rb
);
1828 snprintf(instruction
->text
,
1830 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
"\tUNDEFINED INSTRUCTION",
1839 static int nds32_parse_alu_2(uint32_t opcode
, uint32_t address
,
1840 struct nds32_instruction
*instruction
)
1842 switch (opcode
& 0x3F) {
1844 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1845 &(instruction
->info
.ra
),
1846 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
1847 instruction
->type
= NDS32_INSN_DATA_PROC
;
1848 snprintf(instruction
->text
,
1850 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1851 "\tMAX\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
1853 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1854 instruction
->info
.rb
);
1857 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1858 &(instruction
->info
.ra
),
1859 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
1860 instruction
->type
= NDS32_INSN_DATA_PROC
;
1861 snprintf(instruction
->text
,
1863 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1864 "\tMIN\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
1866 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1867 instruction
->info
.rb
);
1870 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1871 &(instruction
->info
.ra
),
1872 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
1873 instruction
->type
= NDS32_INSN_DATA_PROC
;
1874 snprintf(instruction
->text
,
1876 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1877 "\tAVE\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
1879 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1880 instruction
->info
.rb
);
1883 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
1884 &(instruction
->info
.ra
),
1885 &(instruction
->info
.imm
));
1886 instruction
->type
= NDS32_INSN_DATA_PROC
;
1887 snprintf(instruction
->text
,
1889 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1890 "\tAVE\t$r%" PRIu8
",$r%" PRIu8
,
1892 opcode
, instruction
->info
.rt
, instruction
->info
.ra
);
1894 case 4: { /* CLIPS */
1896 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1897 &(instruction
->info
.ra
),
1898 &imm
, &(instruction
->info
.imm
));
1899 instruction
->info
.imm
= imm
;
1900 instruction
->type
= NDS32_INSN_DATA_PROC
;
1901 snprintf(instruction
->text
,
1903 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1904 "\tCLIPS\t$r%" PRIu8
",$r%" PRIu8
",#%" PRId32
,
1906 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1907 instruction
->info
.imm
);
1910 case 5: { /* CLIP */
1912 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1913 &(instruction
->info
.ra
),
1914 &imm
, &(instruction
->info
.imm
));
1915 instruction
->info
.imm
= imm
;
1916 instruction
->type
= NDS32_INSN_DATA_PROC
;
1917 snprintf(instruction
->text
,
1919 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1920 "\tCLIP\t$r%" PRIu8
",$r%" PRIu8
",#%" PRId32
,
1922 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1923 instruction
->info
.imm
);
1927 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
1928 &(instruction
->info
.ra
),
1929 &(instruction
->info
.imm
));
1930 instruction
->type
= NDS32_INSN_DATA_PROC
;
1931 snprintf(instruction
->text
,
1933 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1934 "\tCLO\t$r%" PRIu8
",$r%" PRIu8
,
1936 opcode
, instruction
->info
.rt
, instruction
->info
.ra
);
1939 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
1940 &(instruction
->info
.ra
),
1941 &(instruction
->info
.imm
));
1942 instruction
->type
= NDS32_INSN_DATA_PROC
;
1943 snprintf(instruction
->text
,
1945 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1946 "\tCLZ\t$r%" PRIu8
",$r%" PRIu8
,
1948 opcode
, instruction
->info
.rt
, instruction
->info
.ra
);
1950 case 8: { /* BSET */
1952 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1953 &(instruction
->info
.ra
),
1954 &imm
, &(instruction
->info
.imm
));
1955 instruction
->info
.imm
= imm
;
1956 instruction
->type
= NDS32_INSN_DATA_PROC
;
1957 snprintf(instruction
->text
,
1959 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1960 "\tBSET\t$r%" PRIu8
",$r%" PRIu8
",#%" PRId32
,
1962 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1963 instruction
->info
.imm
);
1966 case 9: { /* BCLR */
1968 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1969 &(instruction
->info
.ra
),
1970 &imm
, &(instruction
->info
.imm
));
1971 instruction
->info
.imm
= imm
;
1972 instruction
->type
= NDS32_INSN_DATA_PROC
;
1973 snprintf(instruction
->text
,
1975 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1976 "\tBCLR\t$r%" PRIu8
",$r%" PRIu8
",#%" PRId32
,
1978 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1979 instruction
->info
.imm
);
1982 case 10: { /* BTGL */
1984 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
1985 &(instruction
->info
.ra
),
1986 &imm
, &(instruction
->info
.imm
));
1987 instruction
->info
.imm
= imm
;
1988 instruction
->type
= NDS32_INSN_DATA_PROC
;
1989 snprintf(instruction
->text
,
1991 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
1992 "\tBTGL\t$r%" PRIu8
",$r%" PRIu8
",#%" PRId32
,
1994 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
1995 instruction
->info
.imm
);
1998 case 11: { /* BTST */
2000 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
2001 &(instruction
->info
.ra
),
2002 &imm
, &(instruction
->info
.imm
));
2003 instruction
->info
.imm
= imm
;
2004 instruction
->type
= NDS32_INSN_DATA_PROC
;
2005 snprintf(instruction
->text
,
2007 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2008 "\tBTST\t$r%" PRIu8
",$r%" PRIu8
",#%" PRId32
,
2010 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
2011 instruction
->info
.imm
);
2015 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
2016 &(instruction
->info
.ra
),
2017 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
2018 instruction
->type
= NDS32_INSN_DATA_PROC
;
2019 snprintf(instruction
->text
,
2021 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2022 "\tBSE\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
2024 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
2025 instruction
->info
.rb
);
2028 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
2029 &(instruction
->info
.ra
),
2030 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
2031 instruction
->type
= NDS32_INSN_DATA_PROC
;
2032 snprintf(instruction
->text
,
2034 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2035 "\tBSP\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
2037 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
2038 instruction
->info
.rb
);
2041 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
2042 &(instruction
->info
.ra
),
2043 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
2044 instruction
->type
= NDS32_INSN_DATA_PROC
;
2045 snprintf(instruction
->text
,
2047 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2048 "\tFFB\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
2050 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
2051 instruction
->info
.rb
);
2053 case 15: /* FFMISM */
2054 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
2055 &(instruction
->info
.ra
),
2056 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
2057 instruction
->type
= NDS32_INSN_DATA_PROC
;
2058 snprintf(instruction
->text
,
2060 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2061 "\tFFMISM\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
2063 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
2064 instruction
->info
.rb
);
2066 case 23: /* FFZMISM */
2067 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
2068 &(instruction
->info
.ra
),
2069 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
2070 instruction
->type
= NDS32_INSN_DATA_PROC
;
2071 snprintf(instruction
->text
,
2073 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2074 "\tFFZMISM\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
2076 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
2077 instruction
->info
.rb
);
2079 case 32: /* MFUSR */
2080 nds32_parse_type_1(opcode
, &(instruction
->info
.rt
),
2081 &(instruction
->info
.imm
));
2082 instruction
->type
= NDS32_INSN_RESOURCE_ACCESS
;
2083 snprintf(instruction
->text
,
2085 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2086 "\tMFUSR\t$r%" PRIu8
",#%" PRId32
,
2088 opcode
, instruction
->info
.rt
,
2089 (instruction
->info
.imm
>> 10) & 0x3FF);
2091 case 33: /* MTUSR */
2092 nds32_parse_type_1(opcode
, &(instruction
->info
.rt
),
2093 &(instruction
->info
.imm
));
2094 instruction
->type
= NDS32_INSN_RESOURCE_ACCESS
;
2095 snprintf(instruction
->text
,
2097 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2098 "\tMTUSR\t$r%" PRIu8
",#%" PRId32
,
2100 opcode
, instruction
->info
.rt
,
2101 (instruction
->info
.imm
>> 10) & 0x3FF);
2104 nds32_parse_type_3(opcode
, &(instruction
->info
.rt
),
2105 &(instruction
->info
.ra
),
2106 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
2107 instruction
->type
= NDS32_INSN_DATA_PROC
;
2108 snprintf(instruction
->text
,
2110 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2111 "\tMUL\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
2113 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
2114 instruction
->info
.rb
);
2116 case 40: { /* MULTS64 */
2118 nds32_parse_type_3(opcode
, &dt_val
,
2119 &(instruction
->info
.ra
),
2120 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
2121 instruction
->type
= NDS32_INSN_DATA_PROC
;
2122 snprintf(instruction
->text
,
2124 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2125 "\tMULTS64\t$D%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
2127 opcode
, (uint8_t)((dt_val
>> 1) & 0x1), instruction
->info
.ra
,
2128 instruction
->info
.rb
);
2131 case 41: { /* MULT64 */
2133 nds32_parse_type_3(opcode
, &dt_val
,
2134 &(instruction
->info
.ra
),
2135 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
2136 instruction
->type
= NDS32_INSN_DATA_PROC
;
2137 snprintf(instruction
->text
,
2139 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2140 "\tMULT64\t$D%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
2142 opcode
, (uint8_t)((dt_val
>> 1) & 0x1), instruction
->info
.ra
,
2143 instruction
->info
.rb
);
2146 case 42: { /* MADDS64 */
2148 nds32_parse_type_3(opcode
, &dt_val
, &(instruction
->info
.ra
),
2149 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
2150 instruction
->type
= NDS32_INSN_DATA_PROC
;
2151 snprintf(instruction
->text
,
2153 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2154 "\tMADDS64\t$D%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
2156 opcode
, (uint8_t)((dt_val
>> 1) & 0x1), instruction
->info
.ra
,
2157 instruction
->info
.rb
);
2160 case 43: { /* MADD64 */
2162 nds32_parse_type_3(opcode
, &dt_val
, &(instruction
->info
.ra
),
2163 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
2164 instruction
->type
= NDS32_INSN_DATA_PROC
;
2165 snprintf(instruction
->text
,
2167 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2168 "\tMADD64\t$D%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
2170 opcode
, (uint8_t)((dt_val
>> 1) & 0x1), instruction
->info
.ra
,
2171 instruction
->info
.rb
);
2174 case 44: { /* MSUBS64 */
2176 nds32_parse_type_3(opcode
, &dt_val
, &(instruction
->info
.ra
),
2177 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
2178 instruction
->type
= NDS32_INSN_DATA_PROC
;
2179 snprintf(instruction
->text
,
2181 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2182 "\tMSUBS64\t$D%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
2184 opcode
, (uint8_t)((dt_val
>> 1) & 0x1), instruction
->info
.ra
,
2185 instruction
->info
.rb
);
2188 case 45: { /* MSUB64 */
2190 nds32_parse_type_3(opcode
, &dt_val
, &(instruction
->info
.ra
),
2191 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
2192 instruction
->type
= NDS32_INSN_DATA_PROC
;
2193 snprintf(instruction
->text
,
2195 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2196 "\tMSUB64\t$D%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
2198 opcode
, (uint8_t)((dt_val
>> 1) & 0x1), instruction
->info
.ra
,
2199 instruction
->info
.rb
);
2202 case 46: { /* DIVS */
2204 nds32_parse_type_3(opcode
, &dt_val
, &(instruction
->info
.ra
),
2205 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
2206 instruction
->type
= NDS32_INSN_DATA_PROC
;
2207 snprintf(instruction
->text
,
2209 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2210 "\tDIVS\t$D%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
2212 opcode
, (uint8_t)((dt_val
>> 1) & 0x1), instruction
->info
.ra
,
2213 instruction
->info
.rb
);
2216 case 47: { /* DIV */
2218 nds32_parse_type_3(opcode
, &dt_val
, &(instruction
->info
.ra
),
2219 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
2220 instruction
->type
= NDS32_INSN_DATA_PROC
;
2221 snprintf(instruction
->text
,
2223 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2224 "\tDIV\t$D%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
2226 opcode
, (uint8_t)((dt_val
>> 1) & 0x1), instruction
->info
.ra
,
2227 instruction
->info
.rb
);
2230 case 49: { /* MULT32 */
2232 nds32_parse_type_3(opcode
, &dt_val
, &(instruction
->info
.ra
),
2233 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
2234 instruction
->type
= NDS32_INSN_DATA_PROC
;
2235 snprintf(instruction
->text
,
2237 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2238 "\tMULT32\t$D%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
2240 opcode
, (uint8_t)((dt_val
>> 1) & 0x1), instruction
->info
.ra
,
2241 instruction
->info
.rb
);
2244 case 51: { /* MADD32 */
2246 nds32_parse_type_3(opcode
, &dt_val
, &(instruction
->info
.ra
),
2247 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
2248 instruction
->type
= NDS32_INSN_DATA_PROC
;
2249 snprintf(instruction
->text
,
2251 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2252 "\tMADD32\t$D%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
2254 opcode
, (uint8_t)((dt_val
>> 1) & 0x1), instruction
->info
.ra
,
2255 instruction
->info
.rb
);
2258 case 53: { /* MSUB32 */
2260 nds32_parse_type_3(opcode
, &dt_val
, &(instruction
->info
.ra
),
2261 &(instruction
->info
.rb
), &(instruction
->info
.imm
));
2262 instruction
->type
= NDS32_INSN_DATA_PROC
;
2263 snprintf(instruction
->text
,
2265 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2266 "\tMSUB32\t$D%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
2268 opcode
, (uint8_t)((dt_val
>> 1) & 0x1), instruction
->info
.ra
,
2269 instruction
->info
.rb
);
2273 snprintf(instruction
->text
,
2275 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
"\tUNDEFINED INSTRUCTION",
2284 static int nds32_parse_group_4_insn(struct nds32
*nds32
, uint32_t opcode
,
2285 uint32_t address
, struct nds32_instruction
*instruction
)
2289 opc_6
= instruction
->info
.opc_6
;
2291 switch (opc_6
& 0x7) {
2293 nds32_parse_alu_1(opcode
, address
, instruction
);
2296 nds32_parse_alu_2(opcode
, address
, instruction
);
2299 nds32_parse_type_1(opcode
, &(instruction
->info
.rt
),
2300 &(instruction
->info
.imm
));
2302 instruction
->info
.imm
= (instruction
->info
.imm
<< 12) >> 12;
2303 instruction
->type
= NDS32_INSN_DATA_PROC
;
2304 snprintf(instruction
->text
,
2306 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2307 "\tMOVI\t$r%" PRIu8
",#%" PRId32
,
2309 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
2312 nds32_parse_type_1(opcode
, &(instruction
->info
.rt
),
2313 &(instruction
->info
.imm
));
2314 instruction
->type
= NDS32_INSN_DATA_PROC
;
2315 snprintf(instruction
->text
,
2317 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2318 "\tSETHI\t$r%" PRIu8
",0x%8.8" PRIx32
,
2320 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
2323 nds32_parse_type_0(opcode
, &(instruction
->info
.imm
));
2325 instruction
->info
.imm
= (instruction
->info
.imm
<< 8) >> 8;
2326 instruction
->type
= NDS32_INSN_JUMP_BRANCH
;
2327 if ((instruction
->info
.imm
>> 24) & 0x1) { /* JAL */
2328 snprintf(instruction
->text
,
2330 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2333 opcode
, instruction
->info
.imm
);
2335 snprintf(instruction
->text
,
2337 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2340 opcode
, instruction
->info
.imm
);
2343 case 5: { /* JREG */
2345 nds32_parse_type_0(opcode
, &imm
);
2346 instruction
->info
.rb
= (imm
>> 10) & 0x1F;
2347 instruction
->type
= NDS32_INSN_JUMP_BRANCH
;
2348 switch (imm
& 0x1F) {
2351 if (imm
& 0x20) { /* RET */
2352 snprintf(instruction
->text
,
2354 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2357 opcode
, instruction
->info
.rb
);
2359 snprintf(instruction
->text
,
2361 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2364 opcode
, instruction
->info
.rb
);
2368 instruction
->info
.rt
= (imm
>> 20) & 0x1F;
2369 snprintf(instruction
->text
,
2371 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2372 "\tJRAL\t$r%" PRIu8
",$r%" PRIu8
,
2374 opcode
, instruction
->info
.rt
, instruction
->info
.rb
);
2377 snprintf(instruction
->text
,
2379 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2380 "\tJRNEZ\t$r%" PRIu8
,
2382 opcode
, instruction
->info
.rb
);
2384 case 3: /* JRALNEZ */
2385 instruction
->info
.rt
= (imm
>> 20) & 0x1F;
2386 if (instruction
->info
.rt
== R30
)
2387 snprintf(instruction
->text
,
2389 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2390 "\tJRALNEZ\t$r%" PRIu8
,
2392 opcode
, instruction
->info
.rb
);
2394 snprintf(instruction
->text
,
2396 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2397 "\tJRALNEZ\t$r%" PRIu8
",$r%" PRIu8
,
2400 instruction
->info
.rt
,
2401 instruction
->info
.rb
);
2409 nds32_parse_type_0(opcode
, &imm
);
2410 instruction
->type
= NDS32_INSN_JUMP_BRANCH
;
2411 if ((imm
>> 14) & 0x1) { /* BNE */
2412 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
2413 &(instruction
->info
.ra
), &(instruction
->info
.imm
));
2415 instruction
->info
.imm
= (instruction
->info
.imm
<< 18) >> 18;
2416 snprintf(instruction
->text
,
2418 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2419 "\tBNE\t$r%" PRIu8
",$r%" PRIu8
",#%" PRId32
,
2421 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
2422 instruction
->info
.imm
);
2424 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
2425 &(instruction
->info
.ra
), &(instruction
->info
.imm
));
2427 instruction
->info
.imm
= (instruction
->info
.imm
<< 18) >> 18;
2428 snprintf(instruction
->text
,
2430 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2431 "\tBEQ\t$r%" PRIu8
",$r%" PRIu8
",#%" PRId32
,
2433 opcode
, instruction
->info
.rt
,
2434 instruction
->info
.ra
,
2435 instruction
->info
.imm
);
2442 nds32_parse_type_0(opcode
, &imm
);
2443 instruction
->type
= NDS32_INSN_JUMP_BRANCH
;
2444 switch ((imm
>> 16) & 0xF) {
2446 nds32_parse_type_1(opcode
, &(instruction
->info
.rt
),
2447 &(instruction
->info
.imm
));
2448 instruction
->info
.imm
= (instruction
->info
.imm
<< 16) >> 16;
2449 snprintf(instruction
->text
,
2451 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2452 "\tBEQZ\t$r%" PRIu8
",#%" PRId32
,
2454 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
2457 nds32_parse_type_1(opcode
, &(instruction
->info
.rt
),
2458 &(instruction
->info
.imm
));
2459 instruction
->info
.imm
= (instruction
->info
.imm
<< 16) >> 16;
2460 snprintf(instruction
->text
,
2462 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2463 "\tBNEZ\t$r%" PRIu8
",#%" PRId32
,
2465 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
2468 nds32_parse_type_1(opcode
, &(instruction
->info
.rt
),
2469 &(instruction
->info
.imm
));
2470 instruction
->info
.imm
= (instruction
->info
.imm
<< 16) >> 16;
2471 snprintf(instruction
->text
,
2473 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2474 "\tBGEZ\t$r%" PRIu8
",#%" PRId32
,
2476 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
2479 nds32_parse_type_1(opcode
, &(instruction
->info
.rt
),
2480 &(instruction
->info
.imm
));
2481 instruction
->info
.imm
= (instruction
->info
.imm
<< 16) >> 16;
2482 snprintf(instruction
->text
,
2484 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2485 "\tBLTZ\t$r%" PRIu8
",#%" PRId32
,
2487 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
2490 nds32_parse_type_1(opcode
, &(instruction
->info
.rt
),
2491 &(instruction
->info
.imm
));
2492 instruction
->info
.imm
= (instruction
->info
.imm
<< 16) >> 16;
2493 snprintf(instruction
->text
,
2495 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2496 "\tBGTZ\t$r%" PRIu8
",#%" PRId32
,
2498 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
2501 nds32_parse_type_1(opcode
, &(instruction
->info
.rt
),
2502 &(instruction
->info
.imm
));
2503 instruction
->info
.imm
= (instruction
->info
.imm
<< 16) >> 16;
2504 snprintf(instruction
->text
,
2506 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2507 "\tBLEZ\t$r%" PRIu8
",#%" PRId32
,
2509 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
2511 case 12: /* BGEZAL */
2512 nds32_parse_type_1(opcode
, &(instruction
->info
.rt
),
2513 &(instruction
->info
.imm
));
2514 instruction
->info
.imm
= (instruction
->info
.imm
<< 16) >> 16;
2515 snprintf(instruction
->text
,
2517 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2518 "\tBGEZAL\t$r%" PRIu8
",#%" PRId32
,
2520 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
2522 case 13: /* BLTZAL */
2523 nds32_parse_type_1(opcode
, &(instruction
->info
.rt
),
2524 &(instruction
->info
.imm
));
2525 instruction
->info
.imm
= (instruction
->info
.imm
<< 16) >> 16;
2526 snprintf(instruction
->text
,
2528 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2529 "\tBLTZAL\t$r%" PRIu8
",#%" PRId32
,
2531 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
2537 snprintf(instruction
->text
,
2539 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
"\tUNDEFINED INSTRUCTION",
2548 static int nds32_parse_group_5_insn(struct nds32
*nds32
, uint32_t opcode
,
2549 uint32_t address
, struct nds32_instruction
*instruction
)
2553 opc_6
= instruction
->info
.opc_6
;
2555 switch (opc_6
& 0x7) {
2557 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
2558 &(instruction
->info
.ra
), &(instruction
->info
.imm
));
2559 instruction
->info
.imm
= (instruction
->info
.imm
<< 17) >> 17; /* sign-extend */
2560 instruction
->type
= NDS32_INSN_DATA_PROC
;
2561 snprintf(instruction
->text
,
2563 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2564 "\tADDI\t$r%" PRIu8
",$r%" PRIu8
",#%" PRId32
,
2566 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
2567 instruction
->info
.imm
);
2570 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
2571 &(instruction
->info
.ra
), &(instruction
->info
.imm
));
2572 instruction
->info
.imm
= (instruction
->info
.imm
<< 17) >> 17; /* sign-extend */
2573 instruction
->type
= NDS32_INSN_DATA_PROC
;
2574 snprintf(instruction
->text
,
2576 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2577 "\tSUBRI\t$r%" PRIu8
",$r%" PRIu8
",#%" PRId32
,
2579 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
2580 instruction
->info
.imm
);
2583 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
2584 &(instruction
->info
.ra
), &(instruction
->info
.imm
));
2585 instruction
->type
= NDS32_INSN_DATA_PROC
;
2586 snprintf(instruction
->text
,
2588 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2589 "\tANDI\t$r%" PRIu8
",$r%" PRIu8
",#%" PRId32
,
2591 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
2592 instruction
->info
.imm
);
2595 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
2596 &(instruction
->info
.ra
), &(instruction
->info
.imm
));
2597 instruction
->type
= NDS32_INSN_DATA_PROC
;
2598 snprintf(instruction
->text
,
2600 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2601 "\tXORI\t$r%" PRIu8
",$r%" PRIu8
",#%" PRId32
,
2603 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
2604 instruction
->info
.imm
);
2607 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
2608 &(instruction
->info
.ra
), &(instruction
->info
.imm
));
2609 instruction
->type
= NDS32_INSN_DATA_PROC
;
2610 snprintf(instruction
->text
,
2612 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2613 "\tORI\t$r%" PRIu8
",$r%" PRIu8
",0x%8.8" PRIx32
,
2615 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
2616 instruction
->info
.imm
);
2619 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
2620 &(instruction
->info
.ra
), &(instruction
->info
.imm
));
2621 instruction
->info
.imm
= (instruction
->info
.imm
<< 17) >> 17; /* sign-extend */
2622 instruction
->type
= NDS32_INSN_DATA_PROC
;
2623 snprintf(instruction
->text
,
2625 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2626 "\tSLTI\t$r%" PRIu8
",$r%" PRIu8
",#%" PRId32
,
2628 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
2629 instruction
->info
.imm
);
2632 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
2633 &(instruction
->info
.ra
), &(instruction
->info
.imm
));
2634 instruction
->info
.imm
= (instruction
->info
.imm
<< 17) >> 17; /* sign-extend */
2635 instruction
->type
= NDS32_INSN_DATA_PROC
;
2636 snprintf(instruction
->text
,
2638 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2639 "\tSLTSI\t$r%" PRIu8
",$r%" PRIu8
",#%" PRId32
,
2641 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
2642 instruction
->info
.imm
);
2645 snprintf(instruction
->text
,
2647 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
"\tUNDEFINED INSTRUCTION",
2656 static int nds32_parse_group_6_insn(struct nds32
*nds32
, uint32_t opcode
,
2657 uint32_t address
, struct nds32_instruction
*instruction
)
2661 opc_6
= instruction
->info
.opc_6
;
2663 switch (opc_6
& 0x7) {
2664 case 2: { /* MISC */
2668 nds32_parse_type_0(opcode
, &imm
);
2670 sub_opc
= imm
& 0x1F;
2672 case 0: /* STANDBY */
2673 instruction
->type
= NDS32_INSN_MISC
;
2674 snprintf(instruction
->text
,
2676 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2677 "\tSTANDBY\t#%" PRIu32
,
2679 opcode
, (opcode
>> 5) & 0x3);
2683 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
2684 &(instruction
->info
.ra
), &(instruction
->info
.imm
));
2685 instruction
->type
= NDS32_INSN_MISC
;
2686 snprintf(instruction
->text
,
2688 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
"\tCCTL",
2693 nds32_parse_type_1(opcode
, &(instruction
->info
.rt
),
2694 &(instruction
->info
.imm
));
2695 instruction
->type
= NDS32_INSN_RESOURCE_ACCESS
;
2696 snprintf(instruction
->text
,
2698 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2699 "\tMFSR\t$r%" PRIu8
",#%" PRId32
,
2701 opcode
, instruction
->info
.rt
,
2702 (instruction
->info
.imm
>> 10) & 0x3FF);
2705 nds32_parse_type_1(opcode
, &(instruction
->info
.ra
),
2706 &(instruction
->info
.imm
));
2707 instruction
->type
= NDS32_INSN_RESOURCE_ACCESS
;
2708 snprintf(instruction
->text
,
2710 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2711 "\tMTSR\t$r%" PRIu8
",#%" PRId32
,
2713 opcode
, instruction
->info
.ra
,
2714 (instruction
->info
.imm
>> 10) & 0x3FF);
2717 instruction
->type
= NDS32_INSN_MISC
;
2718 snprintf(instruction
->text
,
2720 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
"\tIRET",
2725 instruction
->type
= NDS32_INSN_MISC
;
2726 snprintf(instruction
->text
,
2728 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2729 "\tTRAP\t#%" PRId32
,
2731 opcode
, (imm
>> 5) & 0x7FFF);
2734 nds32_parse_type_1(opcode
, &(instruction
->info
.ra
),
2735 &(instruction
->info
.imm
));
2736 instruction
->type
= NDS32_INSN_MISC
;
2737 snprintf(instruction
->text
,
2739 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2740 "\tTEQZ\t$r%" PRIu8
",#%" PRId32
,
2742 opcode
, instruction
->info
.ra
,
2743 (instruction
->info
.imm
>> 5) & 0x7FFF);
2746 nds32_parse_type_1(opcode
, &(instruction
->info
.ra
),
2747 &(instruction
->info
.imm
));
2748 instruction
->type
= NDS32_INSN_MISC
;
2749 snprintf(instruction
->text
,
2751 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2752 "\tTNEZ\t$r%" PRIu8
",#%" PRId32
,
2754 opcode
, instruction
->info
.ra
,
2755 (instruction
->info
.imm
>> 5) & 0x7FFF);
2758 instruction
->type
= NDS32_INSN_MISC
;
2759 snprintf(instruction
->text
,
2761 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
"\tDSB",
2766 instruction
->type
= NDS32_INSN_MISC
;
2767 snprintf(instruction
->text
,
2769 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
"\tISB",
2773 case 10: /* BREAK */
2774 instruction
->type
= NDS32_INSN_MISC
;
2775 instruction
->info
.sub_opc
= imm
& 0x1F;
2776 instruction
->info
.imm
= (imm
>> 5) & 0x7FFF;
2777 snprintf(instruction
->text
,
2779 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2780 "\tBREAK\t#%" PRId32
,
2782 opcode
, instruction
->info
.imm
);
2784 case 11: /* SYSCALL */
2785 instruction
->type
= NDS32_INSN_MISC
;
2786 snprintf(instruction
->text
,
2788 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2789 "\tSYSCALL\t#%" PRId32
,
2791 opcode
, (imm
>> 5) & 0x7FFF);
2793 case 12: /* MSYNC */
2794 instruction
->type
= NDS32_INSN_MISC
;
2795 snprintf(instruction
->text
,
2797 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2798 "\tMSYNC\t#%" PRId32
,
2800 opcode
, (imm
>> 5) & 0x7);
2802 case 13: /* ISYNC */
2803 nds32_parse_type_1(opcode
, &(instruction
->info
.ra
),
2804 &(instruction
->info
.imm
));
2805 instruction
->type
= NDS32_INSN_MISC
;
2806 snprintf(instruction
->text
,
2808 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
2809 "\tISYNC\t$r%" PRIu8
,
2811 opcode
, instruction
->info
.ra
);
2813 case 14: /* TLBOP */
2815 nds32_parse_type_2(opcode
, &(instruction
->info
.rt
),
2816 &(instruction
->info
.ra
), &(instruction
->info
.imm
));
2817 instruction
->type
= NDS32_INSN_RESOURCE_ACCESS
;
2818 snprintf(instruction
->text
,
2820 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
"\tTLBOP",
2829 snprintf(instruction
->text
,
2831 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
"\tUNDEFINED INSTRUCTION",
2840 static uint32_t field_mask
[9] = {
2852 static uint8_t nds32_extract_field_8u(uint16_t opcode
, uint32_t start
, uint32_t length
)
2854 if (0 < length
&& length
< 9)
2855 return (opcode
>> start
) & field_mask
[length
];
2860 static int nds32_parse_group_0_insn_16(struct nds32
*nds32
, uint16_t opcode
,
2861 uint32_t address
, struct nds32_instruction
*instruction
)
2863 switch ((opcode
>> 10) & 0x7) {
2865 instruction
->info
.rt
= nds32_extract_field_8u(opcode
, 5, 5);
2866 instruction
->info
.ra
= nds32_extract_field_8u(opcode
, 0, 5);
2867 instruction
->type
= NDS32_INSN_MISC
;
2868 snprintf(instruction
->text
,
2870 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
2871 "\t\tMOV55\t$r%" PRIu8
",$r%" PRIu8
,
2873 opcode
, instruction
->info
.rt
, instruction
->info
.ra
);
2875 case 1: /* MOVI55 */
2876 instruction
->info
.rt
= nds32_extract_field_8u(opcode
, 5, 5);
2877 instruction
->info
.imm
= nds32_extract_field_8u(opcode
, 0, 5);
2878 instruction
->info
.imm
= (instruction
->info
.imm
<< 27) >> 27;
2879 instruction
->type
= NDS32_INSN_MISC
;
2880 snprintf(instruction
->text
,
2882 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
2883 "\t\tMOVI55\t$r%" PRIu8
",#%" PRId32
,
2885 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
2887 case 2: /* ADD45, SUB45 */
2888 instruction
->info
.rt
= nds32_extract_field_8u(opcode
, 5, 4);
2889 instruction
->info
.rb
= nds32_extract_field_8u(opcode
, 0, 5);
2890 instruction
->type
= NDS32_INSN_DATA_PROC
;
2891 if (nds32_extract_field_8u(opcode
, 9, 1) == 0) { /* ADD45 */
2892 snprintf(instruction
->text
,
2894 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
2895 "\t\tADD45\t$r%" PRIu8
",$r%" PRIu8
,
2897 opcode
, instruction
->info
.rt
, instruction
->info
.rb
);
2898 } else { /* SUB45 */
2899 snprintf(instruction
->text
,
2901 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
2902 "\t\tSUB45\t$r%" PRIu8
",$r%" PRIu8
,
2904 opcode
, instruction
->info
.rt
, instruction
->info
.rb
);
2908 case 3: /* ADDI45, SUBI45 */
2909 instruction
->info
.rt
= nds32_extract_field_8u(opcode
, 5, 4);
2910 instruction
->info
.imm
= nds32_extract_field_8u(opcode
, 0, 5);
2911 instruction
->type
= NDS32_INSN_DATA_PROC
;
2912 if (nds32_extract_field_8u(opcode
, 9, 1) == 0) { /* ADDI45 */
2913 snprintf(instruction
->text
,
2915 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
2916 "\t\tADDI45\t$r%" PRIu8
",#%" PRId32
,
2918 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
2919 } else { /* SUBI45 */
2920 snprintf(instruction
->text
,
2922 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
2923 "\t\tSUBI45\t$r%" PRIu8
",#%" PRId32
,
2925 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
2928 case 4: /* SRAI45, SRLI45 */
2929 instruction
->info
.rt
= nds32_extract_field_8u(opcode
, 5, 4);
2930 instruction
->info
.imm
= nds32_extract_field_8u(opcode
, 0, 5);
2931 instruction
->type
= NDS32_INSN_DATA_PROC
;
2932 if (nds32_extract_field_8u(opcode
, 9, 1) == 0) { /* SRAI45 */
2933 snprintf(instruction
->text
,
2935 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
2936 "\t\tSRAI45\t$r%" PRIu8
",#%" PRId32
,
2938 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
2939 } else { /* SRLI45 */
2940 if ((instruction
->info
.rt
== 0) && (instruction
->info
.imm
== 0)) {
2941 snprintf(instruction
->text
,
2943 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
"\t\tNOP",
2947 snprintf(instruction
->text
,
2949 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
2950 "\t\tSRLI45\t$r%" PRIu8
",#%" PRId32
,
2952 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
2957 instruction
->info
.rt
= nds32_extract_field_8u(opcode
, 6, 3);
2958 instruction
->info
.ra
= nds32_extract_field_8u(opcode
, 3, 3);
2959 instruction
->type
= NDS32_INSN_DATA_PROC
;
2960 if (nds32_extract_field_8u(opcode
, 9, 1) == 0) { /* SLLI333 */
2961 instruction
->info
.imm
= nds32_extract_field_8u(opcode
, 0, 3);
2962 snprintf(instruction
->text
,
2964 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
2965 "\t\tSLLI333\t$r%" PRIu8
",$r%" PRIu8
",#%" PRId32
,
2967 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
2968 instruction
->info
.imm
);
2970 instruction
->info
.sub_opc
= nds32_extract_field_8u(opcode
, 0, 3);
2971 switch (instruction
->info
.sub_opc
) {
2973 snprintf(instruction
->text
,
2975 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
2976 "\t\tZEB33\t$r%" PRIu8
",$r%" PRIu8
,
2978 opcode
, instruction
->info
.rt
, instruction
->info
.ra
);
2981 snprintf(instruction
->text
,
2983 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
2984 "\t\tZEH33\t$r%" PRIu8
",$r%" PRIu8
,
2986 opcode
, instruction
->info
.rt
, instruction
->info
.ra
);
2989 snprintf(instruction
->text
,
2991 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
2992 "\t\tSEB33\t$r%" PRIu8
",$r%" PRIu8
,
2994 opcode
, instruction
->info
.rt
, instruction
->info
.ra
);
2997 snprintf(instruction
->text
,
2999 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3000 "\t\tSEH33\t$r%" PRIu8
",$r%" PRIu8
,
3002 opcode
, instruction
->info
.rt
, instruction
->info
.ra
);
3004 case 4: /* XLSB33 */
3005 snprintf(instruction
->text
,
3007 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3008 "\t\tXLSB33\t$r%" PRIu8
",$r%" PRIu8
,
3010 opcode
, instruction
->info
.rt
, instruction
->info
.ra
);
3012 case 5: /* XLLB33 */
3013 snprintf(instruction
->text
,
3015 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3016 "\t\tXLLB33\t$r%" PRIu8
",$r%" PRIu8
,
3018 opcode
, instruction
->info
.rt
, instruction
->info
.ra
);
3020 case 6: /* BMSKI33 */
3021 instruction
->info
.ra
= 0;
3022 instruction
->info
.imm
= nds32_extract_field_8u(opcode
, 3, 3);
3023 snprintf(instruction
->text
,
3025 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3026 "\t\tBMSKI33\t$r%" PRIu8
",$r%" PRId32
,
3028 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
3030 case 7: /* FEXTI33 */
3031 instruction
->info
.ra
= 0;
3032 instruction
->info
.imm
= nds32_extract_field_8u(opcode
, 3, 3);
3033 snprintf(instruction
->text
,
3035 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3036 "\t\tFEXTI33\t$r%" PRIu8
",$r%" PRId32
,
3038 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
3041 snprintf(instruction
->text
,
3043 "0x%8.8" PRIx32
"\t0x%8.8" PRIx16
3044 "\tUNDEFINED INSTRUCTION",
3051 case 6: /* ADD333, SUB333 */
3052 instruction
->info
.rt
= nds32_extract_field_8u(opcode
, 6, 3);
3053 instruction
->info
.ra
= nds32_extract_field_8u(opcode
, 3, 3);
3054 instruction
->info
.rb
= nds32_extract_field_8u(opcode
, 0, 3);
3055 instruction
->type
= NDS32_INSN_DATA_PROC
;
3056 if (nds32_extract_field_8u(opcode
, 9, 1) == 0) { /* ADD333 */
3057 snprintf(instruction
->text
,
3059 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3060 "\t\tADD333\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
3062 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
3063 instruction
->info
.rb
);
3064 } else { /* SUB333 */
3065 snprintf(instruction
->text
,
3067 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3068 "\t\tSUB333\t$r%" PRIu8
",$r%" PRIu8
",$r%" PRIu8
,
3070 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
3071 instruction
->info
.rb
);
3074 case 7: /* ADDI333, SUBI333 */
3075 instruction
->info
.rt
= nds32_extract_field_8u(opcode
, 6, 3);
3076 instruction
->info
.ra
= nds32_extract_field_8u(opcode
, 3, 3);
3077 instruction
->info
.imm
= nds32_extract_field_8u(opcode
, 0, 3);
3078 instruction
->type
= NDS32_INSN_DATA_PROC
;
3079 if (nds32_extract_field_8u(opcode
, 9, 1) == 0) { /* ADDI333 */
3080 snprintf(instruction
->text
,
3082 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3083 "\t\tADDI333\t$r%" PRIu8
",$r%" PRIu8
",#%" PRId32
,
3085 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
3086 instruction
->info
.imm
);
3087 } else { /* SUBI333 */
3088 snprintf(instruction
->text
,
3090 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3091 "\t\tSUBI333\t$r%" PRIu8
",$r%" PRIu8
",#%" PRId32
,
3093 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
3094 instruction
->info
.imm
);
3098 snprintf(instruction
->text
,
3100 "0x%8.8" PRIx32
"\t0x%8.8" PRIx16
"\tUNDEFINED INSTRUCTION",
3109 static int nds32_parse_group_1_insn_16(struct nds32
*nds32
, uint16_t opcode
,
3110 uint32_t address
, struct nds32_instruction
*instruction
)
3112 switch ((opcode
>> 9) & 0xF) {
3113 case 0: /* LWI333 */
3114 instruction
->info
.rt
= nds32_extract_field_8u(opcode
, 6, 3);
3115 instruction
->info
.ra
= nds32_extract_field_8u(opcode
, 3, 3);
3116 instruction
->info
.imm
= nds32_extract_field_8u(opcode
, 0, 3) << 2;
3117 instruction
->type
= NDS32_INSN_LOAD_STORE
;
3118 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
3119 &(instruction
->access_start
));
3120 instruction
->access_start
+= instruction
->info
.imm
;
3121 instruction
->access_end
= instruction
->access_start
+ 4;
3122 snprintf(instruction
->text
,
3124 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3125 "\t\tLWI333\t$r%" PRIu8
",[$r%" PRIu8
"+(#%" PRId32
")]",
3127 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
3128 instruction
->info
.imm
);
3130 case 1: /* LWI333.BI */
3131 instruction
->info
.rt
= nds32_extract_field_8u(opcode
, 6, 3);
3132 instruction
->info
.ra
= nds32_extract_field_8u(opcode
, 3, 3);
3133 instruction
->info
.imm
= nds32_extract_field_8u(opcode
, 0, 3);
3134 instruction
->type
= NDS32_INSN_LOAD_STORE
;
3135 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
3136 &(instruction
->access_start
));
3137 instruction
->access_end
= instruction
->access_start
+ 4;
3138 snprintf(instruction
->text
,
3140 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3141 "\t\tLWI333.BI\t$r%" PRIu8
",[$r%" PRIu8
"],#%" PRId32
,
3143 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
3144 instruction
->info
.imm
<< 2);
3146 case 2: /* LHI333 */
3147 instruction
->info
.rt
= nds32_extract_field_8u(opcode
, 6, 3);
3148 instruction
->info
.ra
= nds32_extract_field_8u(opcode
, 3, 3);
3149 instruction
->info
.imm
= nds32_extract_field_8u(opcode
, 0, 3) << 1;
3150 instruction
->type
= NDS32_INSN_LOAD_STORE
;
3151 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
3152 &(instruction
->access_start
));
3153 instruction
->access_start
+= instruction
->info
.imm
;
3154 instruction
->access_end
= instruction
->access_start
+ 2;
3155 snprintf(instruction
->text
,
3157 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3158 "\t\tLHI333\t$r%" PRIu8
",[$r%" PRIu8
"+(#%" PRId32
")]",
3160 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
3161 instruction
->info
.imm
);
3163 case 3: /* LBI333 */
3164 instruction
->info
.rt
= nds32_extract_field_8u(opcode
, 6, 3);
3165 instruction
->info
.ra
= nds32_extract_field_8u(opcode
, 3, 3);
3166 instruction
->info
.imm
= nds32_extract_field_8u(opcode
, 0, 3);
3167 instruction
->type
= NDS32_INSN_LOAD_STORE
;
3168 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
3169 &(instruction
->access_start
));
3170 instruction
->access_start
+= instruction
->info
.imm
;
3171 instruction
->access_end
= instruction
->access_start
+ 1;
3172 snprintf(instruction
->text
,
3174 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3175 "\t\tLBI333\t$r%" PRIu8
",[$r%" PRIu8
"+(#%" PRId32
")]",
3177 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
3178 instruction
->info
.imm
);
3180 case 4: /* SWI333 */
3181 instruction
->info
.rt
= nds32_extract_field_8u(opcode
, 6, 3);
3182 instruction
->info
.ra
= nds32_extract_field_8u(opcode
, 3, 3);
3183 instruction
->info
.imm
= nds32_extract_field_8u(opcode
, 0, 3) << 2;
3184 instruction
->type
= NDS32_INSN_LOAD_STORE
;
3185 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
3186 &(instruction
->access_start
));
3187 instruction
->access_start
+= instruction
->info
.imm
;
3188 instruction
->access_end
= instruction
->access_start
+ 4;
3189 snprintf(instruction
->text
,
3191 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3192 "\t\tSWI333\t$r%" PRIu8
",[$r%" PRIu8
"+(#%" PRId32
")]",
3194 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
3195 instruction
->info
.imm
);
3197 case 5: /* SWI333.BI */
3198 instruction
->info
.rt
= nds32_extract_field_8u(opcode
, 6, 3);
3199 instruction
->info
.ra
= nds32_extract_field_8u(opcode
, 3, 3);
3200 instruction
->info
.imm
= nds32_extract_field_8u(opcode
, 0, 3) << 2;
3201 instruction
->type
= NDS32_INSN_LOAD_STORE
;
3202 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
3203 &(instruction
->access_start
));
3204 instruction
->access_end
= instruction
->access_start
+ 4;
3205 snprintf(instruction
->text
,
3207 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3208 "\t\tSWI333.BI\t$r%" PRIu8
",[$r%" PRIu8
"],#%" PRId32
,
3210 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
3211 instruction
->info
.imm
);
3213 case 6: /* SHI333 */
3214 instruction
->info
.rt
= nds32_extract_field_8u(opcode
, 6, 3);
3215 instruction
->info
.ra
= nds32_extract_field_8u(opcode
, 3, 3);
3216 instruction
->info
.imm
= nds32_extract_field_8u(opcode
, 0, 3) << 1;
3217 instruction
->type
= NDS32_INSN_LOAD_STORE
;
3218 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
3219 &(instruction
->access_start
));
3220 instruction
->access_start
+= instruction
->info
.imm
;
3221 instruction
->access_end
= instruction
->access_start
+ 2;
3222 snprintf(instruction
->text
,
3224 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3225 "\t\tSHI333\t$r%" PRIu8
",[$r%" PRIu8
"+(#%" PRId32
")]",
3227 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
3228 instruction
->info
.imm
);
3230 case 7: /* SBI333 */
3231 instruction
->info
.rt
= nds32_extract_field_8u(opcode
, 6, 3);
3232 instruction
->info
.ra
= nds32_extract_field_8u(opcode
, 3, 3);
3233 instruction
->info
.imm
= nds32_extract_field_8u(opcode
, 0, 3);
3234 instruction
->type
= NDS32_INSN_LOAD_STORE
;
3235 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
3236 &(instruction
->access_start
));
3237 instruction
->access_start
+= instruction
->info
.imm
;
3238 instruction
->access_end
= instruction
->access_start
+ 1;
3239 snprintf(instruction
->text
,
3241 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3242 "\t\tSHI333\t$r%" PRIu8
",[$r%" PRIu8
"+(#%" PRId32
")]",
3244 opcode
, instruction
->info
.rt
, instruction
->info
.ra
,
3245 instruction
->info
.imm
);
3247 case 8: /* ADDRI36.SP */
3248 instruction
->info
.rt
= nds32_extract_field_8u(opcode
, 6, 3);
3249 instruction
->info
.imm
= nds32_extract_field_8u(opcode
, 0, 6) << 2;
3250 instruction
->type
= NDS32_INSN_DATA_PROC
;
3251 snprintf(instruction
->text
,
3253 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3254 "\t\tADDRI36.SP\t$r%" PRIu8
",#%" PRId32
,
3256 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
3258 case 9: /* LWI45.FE */
3259 instruction
->info
.rt
= nds32_extract_field_8u(opcode
, 5, 4);
3260 instruction
->info
.imm
= nds32_extract_field_8u(opcode
, 0, 5);
3261 instruction
->info
.imm
-= 32;
3262 instruction
->info
.imm
<<= 2;
3263 instruction
->type
= NDS32_INSN_LOAD_STORE
;
3264 nds32_get_mapped_reg(nds32
, R8
, &(instruction
->access_start
));
3265 instruction
->access_start
+= instruction
->info
.imm
;
3266 instruction
->access_end
= instruction
->access_start
+ 4;
3267 snprintf(instruction
->text
,
3269 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3270 "\t\tLWI45.FE\t$r%" PRIu8
",[#%" PRId32
"]",
3272 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
3274 case 10: /* LWI450 */
3275 instruction
->info
.rt
= nds32_extract_field_8u(opcode
, 5, 4);
3276 instruction
->info
.ra
= nds32_extract_field_8u(opcode
, 0, 5);
3277 instruction
->type
= NDS32_INSN_LOAD_STORE
;
3278 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
3279 &(instruction
->access_start
));
3280 instruction
->access_end
= instruction
->access_start
+ 4;
3281 snprintf(instruction
->text
,
3283 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3284 "\t\tLWI450\t$r%" PRIu8
",$r%" PRIu8
,
3286 opcode
, instruction
->info
.rt
, instruction
->info
.ra
);
3288 case 11: /* SWI450 */
3289 instruction
->info
.rt
= nds32_extract_field_8u(opcode
, 5, 4);
3290 instruction
->info
.ra
= nds32_extract_field_8u(opcode
, 0, 5);
3291 instruction
->type
= NDS32_INSN_LOAD_STORE
;
3292 nds32_get_mapped_reg(nds32
, instruction
->info
.ra
,
3293 &(instruction
->access_start
));
3294 instruction
->access_end
= instruction
->access_start
+ 4;
3295 snprintf(instruction
->text
,
3297 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3298 "\t\tSWI450\t$r%" PRIu8
",$r%" PRIu8
,
3300 opcode
, instruction
->info
.rt
, instruction
->info
.ra
);
3305 case 15: /* LWI37, SWI37 */
3306 instruction
->info
.rt
= nds32_extract_field_8u(opcode
, 8, 3);
3307 instruction
->info
.imm
= nds32_extract_field_8u(opcode
, 0, 7) << 2;
3308 instruction
->type
= NDS32_INSN_LOAD_STORE
;
3309 nds32_get_mapped_reg(nds32
, R28
, &(instruction
->access_start
));
3310 instruction
->access_start
+= instruction
->info
.imm
;
3311 instruction
->access_end
= instruction
->access_start
+ 4;
3312 if (nds32_extract_field_8u(opcode
, 7, 1) == 0) { /* LWI37 */
3313 snprintf(instruction
->text
,
3315 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3316 "\t\tLWI37\t$r%" PRIu8
",[fp+#%" PRId32
"]",
3318 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
3319 } else { /* SWI37 */
3320 snprintf(instruction
->text
,
3322 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3323 "\t\tSWI37\t$r%" PRIu8
",[fp+#%" PRId32
"]",
3325 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
3328 default: /* ERROR */
3329 snprintf(instruction
->text
,
3331 "0x%8.8" PRIx32
"\t0x%8.8" PRIx16
"\tUNDEFINED INSTRUCTION",
3340 static int nds32_parse_group_2_insn_16(struct nds32
*nds32
, uint16_t opcode
,
3341 uint32_t address
, struct nds32_instruction
*instruction
)
3343 switch ((opcode
>> 11) & 0x3) {
3344 case 0: /* BEQZ38 */
3345 instruction
->info
.rt
= nds32_extract_field_8u(opcode
, 8, 3);
3346 instruction
->info
.imm
= nds32_extract_field_8u(opcode
, 0, 8);
3347 instruction
->info
.imm
= (instruction
->info
.imm
<< 24) >> 24;
3348 instruction
->type
= NDS32_INSN_JUMP_BRANCH
;
3349 snprintf(instruction
->text
,
3351 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3352 "\t\tBEQZ38\t$r%" PRIu8
",#%" PRId32
,
3354 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
3356 case 1: /* BNEZ38 */
3357 instruction
->info
.rt
= nds32_extract_field_8u(opcode
, 8, 3);
3358 instruction
->info
.imm
= nds32_extract_field_8u(opcode
, 0, 8);
3359 instruction
->info
.imm
= (instruction
->info
.imm
<< 24) >> 24;
3360 instruction
->type
= NDS32_INSN_JUMP_BRANCH
;
3361 snprintf(instruction
->text
,
3363 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3364 "\t\tBNEZ38\t$r%" PRIu8
",#%" PRId32
,
3366 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
3368 case 2: /* BEQS38,J8 */
3369 instruction
->info
.rt
= nds32_extract_field_8u(opcode
, 8, 3);
3370 instruction
->info
.imm
= nds32_extract_field_8u(opcode
, 0, 8);
3371 instruction
->info
.imm
= (instruction
->info
.imm
<< 24) >> 24;
3372 instruction
->type
= NDS32_INSN_JUMP_BRANCH
;
3373 if (instruction
->info
.rt
== 5) { /* J8 */
3374 snprintf(instruction
->text
,
3376 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3377 "\t\tJ8\t#%" PRId32
,
3379 opcode
, instruction
->info
.imm
);
3380 } else { /* BEQS38 */
3381 snprintf(instruction
->text
,
3383 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3384 "\t\tBEQS38\t$r%" PRIu8
",#%" PRId32
,
3386 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
3389 case 3: /* BNES38, JR5, RET5, JRAL5 */
3390 instruction
->info
.rt
= nds32_extract_field_8u(opcode
, 8, 3);
3391 instruction
->info
.imm
= nds32_extract_field_8u(opcode
, 0, 8);
3392 instruction
->info
.imm
= (instruction
->info
.imm
<< 24) >> 24;
3393 instruction
->type
= NDS32_INSN_JUMP_BRANCH
;
3394 if (instruction
->info
.rt
== 5) {
3395 instruction
->info
.imm
= 0;
3396 instruction
->info
.rb
= nds32_extract_field_8u(opcode
, 0, 5);
3397 switch (nds32_extract_field_8u(opcode
, 5, 3)) {
3399 snprintf(instruction
->text
,
3401 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3402 "\t\tJR5\t$r%" PRIu8
,
3404 opcode
, instruction
->info
.rb
);
3407 snprintf(instruction
->text
,
3409 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3410 "\t\tJRAL5\t$r%" PRIu8
,
3412 opcode
, instruction
->info
.rb
);
3414 case 2: /* EX9.IT */
3415 instruction
->info
.rb
= 0;
3416 instruction
->info
.imm
= nds32_extract_field_8u(opcode
, 0, 5);
3417 /* TODO: implement real instruction semantics */
3418 snprintf(instruction
->text
,
3420 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3421 "\t\tEX9.IT\t#%" PRId32
,
3423 opcode
, instruction
->info
.imm
);
3426 snprintf(instruction
->text
,
3428 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3429 "\t\tRET5\t$r%" PRIu8
,
3431 opcode
, instruction
->info
.rb
);
3433 case 5: /* ADD5.PC */
3434 instruction
->info
.rt
= 0;
3435 instruction
->info
.rt
= nds32_extract_field_8u(opcode
, 0, 5);
3436 instruction
->type
= NDS32_INSN_DATA_PROC
;
3437 snprintf(instruction
->text
,
3439 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3440 "\t\tADD5.PC\t$r%" PRIu8
,
3442 opcode
, instruction
->info
.rt
);
3445 snprintf(instruction
->text
,
3447 "0x%8.8" PRIx32
"\t0x%8.8" PRIx16
3448 "\tUNDEFINED INSTRUCTION",
3453 } else { /* BNES38 */
3454 snprintf(instruction
->text
,
3456 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3457 "\t\tBNES38\t$r%" PRIu8
",#%" PRId32
,
3459 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
3467 static int nds32_parse_group_3_insn_16(struct nds32
*nds32
, uint16_t opcode
,
3468 uint32_t address
, struct nds32_instruction
*instruction
)
3470 switch ((opcode
>> 11) & 0x3) {
3472 switch ((opcode
>> 9) & 0x3) {
3473 case 0: /* SLTS45 */
3474 instruction
->info
.ra
= nds32_extract_field_8u(opcode
, 5, 4);
3475 instruction
->info
.rb
= nds32_extract_field_8u(opcode
, 0, 5);
3476 instruction
->type
= NDS32_INSN_DATA_PROC
;
3477 snprintf(instruction
->text
,
3479 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3480 "\t\tSLTS45\t$r%" PRIu8
",$r%" PRIu8
,
3482 opcode
, instruction
->info
.ra
, instruction
->info
.rb
);
3485 instruction
->info
.ra
= nds32_extract_field_8u(opcode
, 5, 4);
3486 instruction
->info
.rb
= nds32_extract_field_8u(opcode
, 0, 5);
3487 instruction
->type
= NDS32_INSN_DATA_PROC
;
3488 snprintf(instruction
->text
,
3490 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3491 "\t\tSLT45\t$r%" PRIu8
",$r%" PRIu8
,
3493 opcode
, instruction
->info
.ra
, instruction
->info
.rb
);
3495 case 2: /* SLTSI45 */
3496 instruction
->info
.ra
= nds32_extract_field_8u(opcode
, 5, 4);
3497 instruction
->info
.imm
= nds32_extract_field_8u(opcode
, 0, 5);
3498 instruction
->type
= NDS32_INSN_DATA_PROC
;
3499 snprintf(instruction
->text
,
3501 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3502 "\t\tSLTSI45\t$r%" PRIu8
",#%" PRId32
,
3504 opcode
, instruction
->info
.ra
, instruction
->info
.imm
);
3506 case 3: /* SLTI45 */
3507 instruction
->info
.ra
= nds32_extract_field_8u(opcode
, 5, 4);
3508 instruction
->info
.imm
= nds32_extract_field_8u(opcode
, 0, 5);
3509 instruction
->type
= NDS32_INSN_DATA_PROC
;
3510 snprintf(instruction
->text
,
3512 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3513 "\t\tSLTI45\t$r%" PRIu8
",#%" PRId32
,
3515 opcode
, instruction
->info
.ra
, instruction
->info
.imm
);
3520 switch ((opcode
>> 9) & 0x3) {
3522 instruction
->info
.imm
= nds32_extract_field_8u(opcode
, 0, 8);
3523 instruction
->info
.imm
= (instruction
->info
.imm
<< 24) >> 24;
3524 instruction
->type
= NDS32_INSN_JUMP_BRANCH
;
3525 if (nds32_extract_field_8u(opcode
, 8, 1) == 0) { /* BEQZS8 */
3526 snprintf(instruction
->text
,
3528 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3529 "\t\tBEQZS8\t#%" PRId32
,
3531 opcode
, instruction
->info
.imm
);
3532 } else { /* BNEZS8 */
3533 snprintf(instruction
->text
,
3535 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3536 "\t\tBNEZS8\t#%" PRId32
,
3538 opcode
, instruction
->info
.imm
);
3541 case 1: /* BREAK16 */
3542 if (((opcode
>> 5) & 0xF) == 0) {
3543 instruction
->type
= NDS32_INSN_MISC
;
3544 snprintf(instruction
->text
,
3546 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3547 "\t\tBREAK16\t#%" PRId16
,
3549 opcode
, (int16_t)(opcode
& 0x1F));
3550 } else { /* EX9.IT */
3551 instruction
->type
= NDS32_INSN_MISC
;
3552 /* TODO: implement real instruction semantics */
3553 snprintf(instruction
->text
,
3555 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3556 "\t\tEX9.IT\t#%" PRId16
,
3558 opcode
, (int16_t)(opcode
& 0x1FF));
3561 case 2: /* ADDI10S */
3563 instruction
->info
.imm
= opcode
& 0x3FF;
3564 instruction
->info
.imm
= (instruction
->info
.imm
<< 22) >> 22;
3565 instruction
->type
= NDS32_INSN_DATA_PROC
;
3566 snprintf(instruction
->text
,
3568 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3569 "\t\tADDI10.SP\t#%" PRId32
,
3571 opcode
, instruction
->info
.imm
);
3576 instruction
->info
.rt
= nds32_extract_field_8u(opcode
, 8, 3);
3577 instruction
->info
.imm
= nds32_extract_field_8u(opcode
, 0, 7) << 2;
3578 instruction
->type
= NDS32_INSN_LOAD_STORE
;
3579 nds32_get_mapped_reg(nds32
, R31
, &(instruction
->access_start
));
3580 instruction
->access_start
+= instruction
->info
.imm
;
3581 instruction
->access_end
= instruction
->access_start
+ 4;
3582 if (nds32_extract_field_8u(opcode
, 7, 1) == 0) { /* LWI37.SP */
3583 snprintf(instruction
->text
,
3585 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3586 "\t\tLWI37.SP\t$r%" PRIu8
",[+#%" PRId32
"]",
3588 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
3589 } else { /* SWI37.SP */
3590 snprintf(instruction
->text
,
3592 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3593 "\t\tSWI37.SP\t$r%" PRIu8
",[+#%" PRId32
"]",
3595 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
3599 switch ((opcode
>> 9) & 0x3) {
3600 case 0: /* IFCALL9 */
3601 instruction
->info
.imm
= opcode
& 0x1FF;
3602 instruction
->type
= NDS32_INSN_JUMP_BRANCH
;
3603 snprintf(instruction
->text
,
3605 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3606 "\t\tIFCALL9\t#%" PRId32
"",
3608 opcode
, instruction
->info
.imm
);
3610 case 1: /* MOVPI45 */
3611 instruction
->info
.imm
= nds32_extract_field_8u(opcode
, 0, 5) + 16;
3612 instruction
->info
.rt
= nds32_extract_field_8u(opcode
, 5, 4);
3613 instruction
->type
= NDS32_INSN_MISC
;
3614 snprintf(instruction
->text
,
3616 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3617 "\t\tMOVPI45\t$r%" PRIu8
",#%" PRId32
"",
3619 opcode
, instruction
->info
.rt
, instruction
->info
.imm
);
3621 case 2: /* PUSH25, POP25, MOVD44 */
3622 switch ((opcode
>> 7) & 0x3) {
3623 case 0: /* PUSH25 */
3628 instruction
->type
= NDS32_INSN_LOAD_STORE
;
3629 instruction
->info
.imm
=
3630 nds32_extract_field_8u(opcode
, 0, 5) << 3;
3631 re
= nds32_extract_field_8u(opcode
, 5, 2);
3642 instruction
->info
.rd
= re
;
3643 /* GPRs list: R6 ~ Re and fp, gp, lp */
3644 gpr_count
= 3 + (re
- 5);
3646 nds32_get_mapped_reg(nds32
, R31
,
3647 &(instruction
->access_end
));
3648 instruction
->access_start
=
3649 instruction
->access_end
- (gpr_count
* 4);
3651 snprintf(instruction
->text
,
3653 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3654 "\t\tPUSH25\t$r%" PRIu8
",#%" PRId32
,
3656 opcode
, instruction
->info
.rd
,
3657 instruction
->info
.imm
);
3665 instruction
->type
= NDS32_INSN_LOAD_STORE
;
3666 instruction
->info
.imm
=
3667 nds32_extract_field_8u(opcode
, 0, 5) << 3;
3668 re
= nds32_extract_field_8u(opcode
, 5, 2);
3679 instruction
->info
.rd
= re
;
3680 /* GPRs list: R6 ~ Re and fp, gp, lp */
3681 gpr_count
= 3 + (re
- 5);
3683 nds32_get_mapped_reg(nds32
, R31
,
3684 &(instruction
->access_start
));
3685 instruction
->access_start
+= instruction
->info
.imm
;
3686 instruction
->access_end
=
3687 instruction
->access_start
+ (gpr_count
* 4);
3689 snprintf(instruction
->text
,
3691 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3692 "\t\tPOP25\t$r%" PRIu8
",#%" PRId32
,
3694 opcode
, instruction
->info
.rd
,
3695 instruction
->info
.imm
);
3698 case 2: /* MOVD44 */
3700 instruction
->info
.ra
=
3701 nds32_extract_field_8u(opcode
, 0, 4) * 2;
3702 instruction
->info
.rt
=
3703 nds32_extract_field_8u(opcode
, 4, 4) * 2;
3704 instruction
->type
= NDS32_INSN_MISC
;
3705 snprintf(instruction
->text
,
3707 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3708 "\t\tMOVD44\t$r%" PRIu8
",$r%" PRIu8
,
3710 opcode
, instruction
->info
.rt
, instruction
->info
.ra
);
3714 case 3: /* NEG33, NOT33, MUL33, XOR33, AND33, OR33 */
3715 instruction
->info
.ra
= nds32_extract_field_8u(opcode
, 3, 3);
3716 instruction
->info
.rt
= nds32_extract_field_8u(opcode
, 6, 3);
3717 instruction
->type
= NDS32_INSN_DATA_PROC
;
3718 switch (opcode
& 0x7) {
3720 snprintf(instruction
->text
,
3722 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3723 "\t\tNEG33\t$r%" PRIu8
",$r%" PRIu8
,
3725 opcode
, instruction
->info
.rt
, instruction
->info
.ra
);
3728 snprintf(instruction
->text
,
3730 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3731 "\t\tNOT33\t$r%" PRIu8
",$r%" PRIu8
,
3733 opcode
, instruction
->info
.rt
, instruction
->info
.ra
);
3736 snprintf(instruction
->text
,
3738 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3739 "\t\tMUL33\t$r%" PRIu8
",$r%" PRIu8
,
3741 opcode
, instruction
->info
.rt
, instruction
->info
.ra
);
3744 snprintf(instruction
->text
,
3746 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3747 "\t\tXOR33\t$r%" PRIu8
",$r%" PRIu8
,
3749 opcode
, instruction
->info
.rt
, instruction
->info
.ra
);
3752 snprintf(instruction
->text
,
3754 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3755 "\t\tAND33\t$r%" PRIu8
",$r%" PRIu8
,
3757 opcode
, instruction
->info
.rt
, instruction
->info
.ra
);
3760 snprintf(instruction
->text
,
3762 "0x%8.8" PRIx32
"\t0x%4.4" PRIx16
3763 "\t\tOR33\t$r%" PRIu8
",$r%" PRIu8
,
3765 opcode
, instruction
->info
.rt
, instruction
->info
.ra
);
3772 snprintf(instruction
->text
,
3774 "0x%8.8" PRIx32
"\t0x%8.8" PRIx16
"\tUNDEFINED INSTRUCTION",
3783 int nds32_evaluate_opcode(struct nds32
*nds32
, uint32_t opcode
, uint32_t address
,
3784 struct nds32_instruction
*instruction
)
3786 int retval
= ERROR_OK
;
3788 /* clear fields, to avoid confusion */
3789 memset(instruction
, 0, sizeof(struct nds32_instruction
));
3792 /* 16 bits instruction */
3793 instruction
->instruction_size
= 2;
3794 opcode
= (opcode
>> 16) & 0xFFFF;
3795 instruction
->opcode
= opcode
;
3797 switch ((opcode
>> 13) & 0x3) {
3799 retval
= nds32_parse_group_0_insn_16(nds32
, opcode
, address
, instruction
);
3802 retval
= nds32_parse_group_1_insn_16(nds32
, opcode
, address
, instruction
);
3805 retval
= nds32_parse_group_2_insn_16(nds32
, opcode
, address
, instruction
);
3808 retval
= nds32_parse_group_3_insn_16(nds32
, opcode
, address
, instruction
);
3811 snprintf(instruction
->text
,
3813 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
"\tUNDEFINED INSTRUCTION",
3819 /* 32 bits instruction */
3820 instruction
->instruction_size
= 4;
3821 instruction
->opcode
= opcode
;
3824 opc_6
= opcode
>> 25;
3825 instruction
->info
.opc_6
= opc_6
;
3827 switch ((opc_6
>> 3) & 0x7) {
3828 case 0: /* LBI, LHI, LWI, LBI.bi, LHI.bi, LWI.bi */
3829 retval
= nds32_parse_group_0_insn(nds32
, opcode
, address
, instruction
);
3831 case 1: /* SBI, SHI, SWI, SBI.bi, SHI.bi, SWI.bi */
3832 retval
= nds32_parse_group_1_insn(nds32
, opcode
, address
, instruction
);
3834 case 2: /* LBSI, LHSI, DPREFI, LBSI.bi, LHSI.bi, LBGP */
3835 retval
= nds32_parse_group_2_insn(nds32
, opcode
, address
, instruction
);
3837 case 3: /* MEM, LSMW, HWGP, SBGP */
3838 retval
= nds32_parse_group_3_insn(nds32
, opcode
, address
, instruction
);
3840 case 4: /* ALU_1, ALU_2, MOVI, SETHI, JI, JREG, BR1, BR2 */
3841 retval
= nds32_parse_group_4_insn(nds32
, opcode
, address
, instruction
);
3843 case 5: /* ADDI, SUBRI, ANDI, XORI, ORI, SLTI, SLTSI */
3844 retval
= nds32_parse_group_5_insn(nds32
, opcode
, address
, instruction
);
3847 retval
= nds32_parse_group_6_insn(nds32
, opcode
, address
, instruction
);
3849 default: /* ERROR */
3850 snprintf(instruction
->text
,
3852 "0x%8.8" PRIx32
"\t0x%8.8" PRIx32
"\tUNDEFINED INSTRUCTION",