microblaze-dis.c 62 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100
  1. /* Disassemble Xilinx microblaze instructions.
  2. Copyright (C) 1993, 1999, 2000 Free Software Foundation, Inc.
  3. This program is free software; you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation; either version 2 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program; if not, see <http://www.gnu.org/licenses/>. */
  13. /*
  14. * Copyright (c) 2001 Xilinx, Inc. All rights reserved.
  15. *
  16. * Redistribution and use in source and binary forms are permitted
  17. * provided that the above copyright notice and this paragraph are
  18. * duplicated in all such forms and that any documentation,
  19. * advertising materials, and other materials related to such
  20. * distribution and use acknowledge that the software was developed
  21. * by Xilinx, Inc. The name of the Company may not be used to endorse
  22. * or promote products derived from this software without specific prior
  23. * written permission.
  24. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  25. * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  26. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  27. *
  28. * Xilinx, Inc.
  29. */
  30. #include <stdio.h>
  31. #define STATIC_TABLE
  32. #define DEFINE_TABLE
  33. #define TRUE 1
  34. #define FALSE 0
  35. #ifndef MICROBLAZE_OPC
  36. #define MICROBLAZE_OPC
  37. /* Assembler instructions for Xilinx's microblaze processor
  38. Copyright (C) 1999, 2000 Free Software Foundation, Inc.
  39. This program is free software; you can redistribute it and/or modify
  40. it under the terms of the GNU General Public License as published by
  41. the Free Software Foundation; either version 2 of the License, or
  42. (at your option) any later version.
  43. This program is distributed in the hope that it will be useful,
  44. but WITHOUT ANY WARRANTY; without even the implied warranty of
  45. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  46. GNU General Public License for more details.
  47. You should have received a copy of the GNU General Public License
  48. along with this program; if not, see <http://www.gnu.org/licenses/>. */
  49. /*
  50. * Copyright (c) 2001 Xilinx, Inc. All rights reserved.
  51. *
  52. * Redistribution and use in source and binary forms are permitted
  53. * provided that the above copyright notice and this paragraph are
  54. * duplicated in all such forms and that any documentation,
  55. * advertising materials, and other materials related to such
  56. * distribution and use acknowledge that the software was developed
  57. * by Xilinx, Inc. The name of the Company may not be used to endorse
  58. * or promote products derived from this software without specific prior
  59. * written permission.
  60. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  61. * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  62. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  63. *
  64. * Xilinx, Inc.
  65. */
  66. #ifndef MICROBLAZE_OPCM
  67. #define MICROBLAZE_OPCM
  68. /*
  69. * Copyright (c) 2001 Xilinx, Inc. All rights reserved.
  70. *
  71. * Redistribution and use in source and binary forms are permitted
  72. * provided that the above copyright notice and this paragraph are
  73. * duplicated in all such forms and that any documentation,
  74. * advertising materials, and other materials related to such
  75. * distribution and use acknowledge that the software was developed
  76. * by Xilinx, Inc. The name of the Company may not be used to endorse
  77. * or promote products derived from this software without specific prior
  78. * written permission.
  79. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  80. * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  81. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  82. *
  83. * Xilinx, Inc.
  84. * $Header:
  85. */
  86. enum microblaze_instr {
  87. add, rsub, addc, rsubc, addk, rsubk, addkc, rsubkc, cmp, cmpu,
  88. addi, rsubi, addic, rsubic, addik, rsubik, addikc, rsubikc, mul, mulh, mulhu, mulhsu,
  89. idiv, idivu, bsll, bsra, bsrl, get, put, nget, nput, cget, cput,
  90. ncget, ncput, muli, bslli, bsrai, bsrli, mului, or, and, xor,
  91. andn, pcmpbf, pcmpbc, pcmpeq, pcmpne, sra, src, srl, sext8, sext16, wic, wdc, wdcclear, wdcflush, mts, mfs, br, brd,
  92. brld, bra, brad, brald, microblaze_brk, beq, beqd, bne, bned, blt,
  93. bltd, ble, bled, bgt, bgtd, bge, bged, ori, andi, xori, andni,
  94. imm, rtsd, rtid, rtbd, rted, bri, brid, brlid, brai, braid, bralid,
  95. brki, beqi, beqid, bnei, bneid, blti, bltid, blei, bleid, bgti,
  96. bgtid, bgei, bgeid, lbu, lhu, lw, lwx, sb, sh, sw, swx, lbui, lhui, lwi,
  97. sbi, shi, swi, msrset, msrclr, tuqula, fadd, frsub, fmul, fdiv,
  98. fcmp_lt, fcmp_eq, fcmp_le, fcmp_gt, fcmp_ne, fcmp_ge, fcmp_un, flt, fint, fsqrt,
  99. tget, tcget, tnget, tncget, tput, tcput, tnput, tncput,
  100. eget, ecget, neget, necget, eput, ecput, neput, necput,
  101. teget, tecget, tneget, tnecget, teput, tecput, tneput, tnecput,
  102. aget, caget, naget, ncaget, aput, caput, naput, ncaput,
  103. taget, tcaget, tnaget, tncaget, taput, tcaput, tnaput, tncaput,
  104. eaget, ecaget, neaget, necaget, eaput, ecaput, neaput, necaput,
  105. teaget, tecaget, tneaget, tnecaget, teaput, tecaput, tneaput, tnecaput,
  106. getd, tgetd, cgetd, tcgetd, ngetd, tngetd, ncgetd, tncgetd,
  107. putd, tputd, cputd, tcputd, nputd, tnputd, ncputd, tncputd,
  108. egetd, tegetd, ecgetd, tecgetd, negetd, tnegetd, necgetd, tnecgetd,
  109. eputd, teputd, ecputd, tecputd, neputd, tneputd, necputd, tnecputd,
  110. agetd, tagetd, cagetd, tcagetd, nagetd, tnagetd, ncagetd, tncagetd,
  111. aputd, taputd, caputd, tcaputd, naputd, tnaputd, ncaputd, tncaputd,
  112. eagetd, teagetd, ecagetd, tecagetd, neagetd, tneagetd, necagetd, tnecagetd,
  113. eaputd, teaputd, ecaputd, tecaputd, neaputd, tneaputd, necaputd, tnecaputd,
  114. invalid_inst } ;
  115. enum microblaze_instr_type {
  116. arithmetic_inst, logical_inst, mult_inst, div_inst, branch_inst,
  117. return_inst, immediate_inst, special_inst, memory_load_inst,
  118. memory_store_inst, barrel_shift_inst, anyware_inst };
  119. #define INST_WORD_SIZE 4
  120. /* gen purpose regs go from 0 to 31 */
  121. /* mask is reg num - max_reg_num, ie reg_num - 32 in this case */
  122. #define REG_PC_MASK 0x8000
  123. #define REG_MSR_MASK 0x8001
  124. #define REG_EAR_MASK 0x8003
  125. #define REG_ESR_MASK 0x8005
  126. #define REG_FSR_MASK 0x8007
  127. #define REG_BTR_MASK 0x800b
  128. #define REG_EDR_MASK 0x800d
  129. #define REG_PVR_MASK 0xa000
  130. #define REG_PID_MASK 0x9000
  131. #define REG_ZPR_MASK 0x9001
  132. #define REG_TLBX_MASK 0x9002
  133. #define REG_TLBLO_MASK 0x9003
  134. #define REG_TLBHI_MASK 0x9004
  135. #define REG_TLBSX_MASK 0x9005
  136. #define MIN_REGNUM 0
  137. #define MAX_REGNUM 31
  138. #define MIN_PVR_REGNUM 0
  139. #define MAX_PVR_REGNUM 15
  140. #define REG_PC 32 /* PC */
  141. #define REG_MSR 33 /* machine status reg */
  142. #define REG_EAR 35 /* Exception reg */
  143. #define REG_ESR 37 /* Exception reg */
  144. #define REG_FSR 39 /* FPU Status reg */
  145. #define REG_BTR 43 /* Branch Target reg */
  146. #define REG_EDR 45 /* Exception reg */
  147. #define REG_PVR 40960 /* Program Verification reg */
  148. #define REG_PID 36864 /* MMU: Process ID reg */
  149. #define REG_ZPR 36865 /* MMU: Zone Protect reg */
  150. #define REG_TLBX 36866 /* MMU: TLB Index reg */
  151. #define REG_TLBLO 36867 /* MMU: TLB Low reg */
  152. #define REG_TLBHI 36868 /* MMU: TLB High reg */
  153. #define REG_TLBSX 36869 /* MMU: TLB Search Index reg */
  154. /* alternate names for gen purpose regs */
  155. #define REG_SP 1 /* stack pointer */
  156. #define REG_ROSDP 2 /* read-only small data pointer */
  157. #define REG_RWSDP 13 /* read-write small data pointer */
  158. /* Assembler Register - Used in Delay Slot Optimization */
  159. #define REG_AS 18
  160. #define REG_ZERO 0
  161. #define RD_LOW 21 /* low bit for RD */
  162. #define RA_LOW 16 /* low bit for RA */
  163. #define RB_LOW 11 /* low bit for RB */
  164. #define IMM_LOW 0 /* low bit for immediate */
  165. #define RD_MASK 0x03E00000
  166. #define RA_MASK 0x001F0000
  167. #define RB_MASK 0x0000F800
  168. #define IMM_MASK 0x0000FFFF
  169. // imm mask for barrel shifts
  170. #define IMM5_MASK 0x0000001F
  171. // FSL imm mask for get, put instructions
  172. #define RFSL_MASK 0x000000F
  173. // imm mask for msrset, msrclr instructions
  174. #define IMM15_MASK 0x00007FFF
  175. #endif /* MICROBLAZE-OPCM */
  176. #define INST_TYPE_RD_R1_R2 0
  177. #define INST_TYPE_RD_R1_IMM 1
  178. #define INST_TYPE_RD_R1_UNSIGNED_IMM 2
  179. #define INST_TYPE_RD_R1 3
  180. #define INST_TYPE_RD_R2 4
  181. #define INST_TYPE_RD_IMM 5
  182. #define INST_TYPE_R2 6
  183. #define INST_TYPE_R1_R2 7
  184. #define INST_TYPE_R1_IMM 8
  185. #define INST_TYPE_IMM 9
  186. #define INST_TYPE_SPECIAL_R1 10
  187. #define INST_TYPE_RD_SPECIAL 11
  188. #define INST_TYPE_R1 12
  189. // new instn type for barrel shift imms
  190. #define INST_TYPE_RD_R1_IMM5 13
  191. #define INST_TYPE_RD_RFSL 14
  192. #define INST_TYPE_R1_RFSL 15
  193. // new insn type for insn cache
  194. #define INST_TYPE_RD_R1_SPECIAL 16
  195. // new insn type for msrclr, msrset insns.
  196. #define INST_TYPE_RD_IMM15 17
  197. // new insn type for tuqula rd - addik rd, r0, 42
  198. #define INST_TYPE_RD 18
  199. // new insn type for t*put
  200. #define INST_TYPE_RFSL 19
  201. #define INST_TYPE_NONE 25
  202. #define INST_PC_OFFSET 1 /* instructions where the label address is resolved as a PC offset (for branch label)*/
  203. #define INST_NO_OFFSET 0 /* instructions where the label address is resolved as an absolute value (for data mem or abs address)*/
  204. #define IMMVAL_MASK_NON_SPECIAL 0x0000
  205. #define IMMVAL_MASK_MTS 0x4000
  206. #define IMMVAL_MASK_MFS 0x0000
  207. #define OPCODE_MASK_H 0xFC000000 /* High 6 bits only */
  208. #define OPCODE_MASK_H1 0xFFE00000 /* High 11 bits */
  209. #define OPCODE_MASK_H2 0xFC1F0000 /* High 6 and bits 20-16 */
  210. #define OPCODE_MASK_H12 0xFFFF0000 /* High 16 */
  211. #define OPCODE_MASK_H4 0xFC0007FF /* High 6 and low 11 bits */
  212. #define OPCODE_MASK_H13S 0xFFE0EFF0 /* High 11 and 15:1 bits and last nibble of last byte for spr */
  213. #define OPCODE_MASK_H23S 0xFC1FC000 /* High 6, 20-16 and 15:1 bits and last nibble of last byte for spr */
  214. #define OPCODE_MASK_H34 0xFC00FFFF /* High 6 and low 16 bits */
  215. #define OPCODE_MASK_H14 0xFFE007FF /* High 11 and low 11 bits */
  216. #define OPCODE_MASK_H24 0xFC1F07FF /* High 6, bits 20-16 and low 11 bits */
  217. #define OPCODE_MASK_H124 0xFFFF07FF /* High 16, and low 11 bits */
  218. #define OPCODE_MASK_H1234 0xFFFFFFFF /* All 32 bits */
  219. #define OPCODE_MASK_H3 0xFC000600 /* High 6 bits and bits 21, 22 */
  220. #define OPCODE_MASK_H32 0xFC00FC00 /* High 6 bits and bit 16-21 */
  221. #define OPCODE_MASK_H34B 0xFC0000FF /* High 6 bits and low 8 bits */
  222. #define OPCODE_MASK_H34C 0xFC0007E0 /* High 6 bits and bits 21-26 */
  223. // New Mask for msrset, msrclr insns.
  224. #define OPCODE_MASK_H23N 0xFC1F8000 /* High 6 and bits 11 - 16 */
  225. #define DELAY_SLOT 1
  226. #define NO_DELAY_SLOT 0
  227. #define MAX_OPCODES 280
  228. struct op_code_struct {
  229. const char *name;
  230. short inst_type; /* registers and immediate values involved */
  231. short inst_offset_type; /* immediate vals offset from PC? (= 1 for branches) */
  232. short delay_slots; /* info about delay slots needed after this instr. */
  233. short immval_mask;
  234. unsigned long bit_sequence; /* all the fixed bits for the op are set and all the variable bits (reg names, imm vals) are set to 0 */
  235. unsigned long opcode_mask; /* which bits define the opcode */
  236. enum microblaze_instr instr;
  237. enum microblaze_instr_type instr_type;
  238. /* more info about output format here */
  239. } opcodes[MAX_OPCODES] =
  240. {
  241. {"add", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x00000000, OPCODE_MASK_H4, add, arithmetic_inst },
  242. {"rsub", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x04000000, OPCODE_MASK_H4, rsub, arithmetic_inst },
  243. {"addc", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x08000000, OPCODE_MASK_H4, addc, arithmetic_inst },
  244. {"rsubc", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x0C000000, OPCODE_MASK_H4, rsubc, arithmetic_inst },
  245. {"addk", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x10000000, OPCODE_MASK_H4, addk, arithmetic_inst },
  246. {"rsubk", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x14000000, OPCODE_MASK_H4, rsubk, arithmetic_inst },
  247. {"cmp", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x14000001, OPCODE_MASK_H4, cmp, arithmetic_inst },
  248. {"cmpu", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x14000003, OPCODE_MASK_H4, cmpu, arithmetic_inst },
  249. {"addkc", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x18000000, OPCODE_MASK_H4, addkc, arithmetic_inst },
  250. {"rsubkc",INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x1C000000, OPCODE_MASK_H4, rsubkc, arithmetic_inst },
  251. {"addi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x20000000, OPCODE_MASK_H, addi, arithmetic_inst },
  252. {"rsubi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x24000000, OPCODE_MASK_H, rsubi, arithmetic_inst },
  253. {"addic", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x28000000, OPCODE_MASK_H, addic, arithmetic_inst },
  254. {"rsubic",INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x2C000000, OPCODE_MASK_H, rsubic, arithmetic_inst },
  255. {"addik", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x30000000, OPCODE_MASK_H, addik, arithmetic_inst },
  256. {"rsubik",INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x34000000, OPCODE_MASK_H, rsubik, arithmetic_inst },
  257. {"addikc",INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x38000000, OPCODE_MASK_H, addikc, arithmetic_inst },
  258. {"rsubikc",INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x3C000000, OPCODE_MASK_H, rsubikc, arithmetic_inst },
  259. {"mul", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x40000000, OPCODE_MASK_H4, mul, mult_inst },
  260. {"mulh", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x40000001, OPCODE_MASK_H4, mulh, mult_inst },
  261. {"mulhu", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x40000003, OPCODE_MASK_H4, mulhu, mult_inst },
  262. {"mulhsu",INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x40000002, OPCODE_MASK_H4, mulhsu, mult_inst },
  263. {"idiv", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x48000000, OPCODE_MASK_H4, idiv, div_inst },
  264. {"idivu", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x48000002, OPCODE_MASK_H4, idivu, div_inst },
  265. {"bsll", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x44000400, OPCODE_MASK_H3, bsll, barrel_shift_inst },
  266. {"bsra", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x44000200, OPCODE_MASK_H3, bsra, barrel_shift_inst },
  267. {"bsrl", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x44000000, OPCODE_MASK_H3, bsrl, barrel_shift_inst },
  268. {"get", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C000000, OPCODE_MASK_H32, get, anyware_inst },
  269. {"put", INST_TYPE_R1_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C008000, OPCODE_MASK_H32, put, anyware_inst },
  270. {"nget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C004000, OPCODE_MASK_H32, nget, anyware_inst },
  271. {"nput", INST_TYPE_R1_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00C000, OPCODE_MASK_H32, nput, anyware_inst },
  272. {"cget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C002000, OPCODE_MASK_H32, cget, anyware_inst },
  273. {"cput", INST_TYPE_R1_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00A000, OPCODE_MASK_H32, cput, anyware_inst },
  274. {"ncget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C006000, OPCODE_MASK_H32, ncget, anyware_inst },
  275. {"ncput", INST_TYPE_R1_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00E000, OPCODE_MASK_H32, ncput, anyware_inst },
  276. {"muli", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x60000000, OPCODE_MASK_H, muli, mult_inst },
  277. {"bslli", INST_TYPE_RD_R1_IMM5, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x64000400, OPCODE_MASK_H3, bslli, barrel_shift_inst },
  278. {"bsrai", INST_TYPE_RD_R1_IMM5, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x64000200, OPCODE_MASK_H3, bsrai, barrel_shift_inst },
  279. {"bsrli", INST_TYPE_RD_R1_IMM5, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x64000000, OPCODE_MASK_H3, bsrli, barrel_shift_inst },
  280. {"or", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x80000000, OPCODE_MASK_H4, or, logical_inst },
  281. {"and", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x84000000, OPCODE_MASK_H4, and, logical_inst },
  282. {"xor", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x88000000, OPCODE_MASK_H4, xor, logical_inst },
  283. {"andn", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x8C000000, OPCODE_MASK_H4, andn, logical_inst },
  284. {"pcmpbf",INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x80000400, OPCODE_MASK_H4, pcmpbf, logical_inst },
  285. {"pcmpbc",INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x84000400, OPCODE_MASK_H4, pcmpbc, logical_inst },
  286. {"pcmpeq",INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x88000400, OPCODE_MASK_H4, pcmpeq, logical_inst },
  287. {"pcmpne",INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x8C000400, OPCODE_MASK_H4, pcmpne, logical_inst },
  288. {"sra", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000001, OPCODE_MASK_H34, sra, logical_inst },
  289. {"src", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000021, OPCODE_MASK_H34, src, logical_inst },
  290. {"srl", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000041, OPCODE_MASK_H34, srl, logical_inst },
  291. {"sext8", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000060, OPCODE_MASK_H34, sext8, logical_inst },
  292. {"sext16",INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000061, OPCODE_MASK_H34, sext16, logical_inst },
  293. {"wic", INST_TYPE_RD_R1_SPECIAL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000068, OPCODE_MASK_H34B, wic, special_inst },
  294. {"wdc", INST_TYPE_RD_R1_SPECIAL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000064, OPCODE_MASK_H34B, wdc, special_inst },
  295. {"wdc.clear", INST_TYPE_RD_R1_SPECIAL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000066, OPCODE_MASK_H34B, wdcclear, special_inst },
  296. {"wdc.flush", INST_TYPE_RD_R1_SPECIAL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000074, OPCODE_MASK_H34B, wdcflush, special_inst },
  297. {"mts", INST_TYPE_SPECIAL_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_MTS, 0x9400C000, OPCODE_MASK_H13S, mts, special_inst },
  298. {"mfs", INST_TYPE_RD_SPECIAL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_MFS, 0x94008000, OPCODE_MASK_H23S, mfs, special_inst },
  299. {"br", INST_TYPE_R2, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x98000000, OPCODE_MASK_H124, br, branch_inst },
  300. {"brd", INST_TYPE_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x98100000, OPCODE_MASK_H124, brd, branch_inst },
  301. {"brld", INST_TYPE_RD_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x98140000, OPCODE_MASK_H24, brld, branch_inst },
  302. {"bra", INST_TYPE_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x98080000, OPCODE_MASK_H124, bra, branch_inst },
  303. {"brad", INST_TYPE_R2, INST_NO_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x98180000, OPCODE_MASK_H124, brad, branch_inst },
  304. {"brald", INST_TYPE_RD_R2, INST_NO_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x981C0000, OPCODE_MASK_H24, brald, branch_inst },
  305. {"brk", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x980C0000, OPCODE_MASK_H24, microblaze_brk, branch_inst },
  306. {"beq", INST_TYPE_R1_R2, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9C000000, OPCODE_MASK_H14, beq, branch_inst },
  307. {"beqd", INST_TYPE_R1_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9E000000, OPCODE_MASK_H14, beqd, branch_inst },
  308. {"bne", INST_TYPE_R1_R2, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9C200000, OPCODE_MASK_H14, bne, branch_inst },
  309. {"bned", INST_TYPE_R1_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9E200000, OPCODE_MASK_H14, bned, branch_inst },
  310. {"blt", INST_TYPE_R1_R2, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9C400000, OPCODE_MASK_H14, blt, branch_inst },
  311. {"bltd", INST_TYPE_R1_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9E400000, OPCODE_MASK_H14, bltd, branch_inst },
  312. {"ble", INST_TYPE_R1_R2, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9C600000, OPCODE_MASK_H14, ble, branch_inst },
  313. {"bled", INST_TYPE_R1_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9E600000, OPCODE_MASK_H14, bled, branch_inst },
  314. {"bgt", INST_TYPE_R1_R2, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9C800000, OPCODE_MASK_H14, bgt, branch_inst },
  315. {"bgtd", INST_TYPE_R1_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9E800000, OPCODE_MASK_H14, bgtd, branch_inst },
  316. {"bge", INST_TYPE_R1_R2, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9CA00000, OPCODE_MASK_H14, bge, branch_inst },
  317. {"bged", INST_TYPE_R1_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9EA00000, OPCODE_MASK_H14, bged, branch_inst },
  318. {"ori", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xA0000000, OPCODE_MASK_H, ori, logical_inst },
  319. {"andi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xA4000000, OPCODE_MASK_H, andi, logical_inst },
  320. {"xori", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xA8000000, OPCODE_MASK_H, xori, logical_inst },
  321. {"andni", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xAC000000, OPCODE_MASK_H, andni, logical_inst },
  322. {"imm", INST_TYPE_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB0000000, OPCODE_MASK_H12, imm, immediate_inst },
  323. {"rtsd", INST_TYPE_R1_IMM, INST_NO_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB6000000, OPCODE_MASK_H1, rtsd, return_inst },
  324. {"rtid", INST_TYPE_R1_IMM, INST_NO_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB6200000, OPCODE_MASK_H1, rtid, return_inst },
  325. {"rtbd", INST_TYPE_R1_IMM, INST_NO_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB6400000, OPCODE_MASK_H1, rtbd, return_inst },
  326. {"rted", INST_TYPE_R1_IMM, INST_NO_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB6800000, OPCODE_MASK_H1, rted, return_inst },
  327. {"bri", INST_TYPE_IMM, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB8000000, OPCODE_MASK_H12, bri, branch_inst },
  328. {"brid", INST_TYPE_IMM, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB8100000, OPCODE_MASK_H12, brid, branch_inst },
  329. {"brlid", INST_TYPE_RD_IMM, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB8140000, OPCODE_MASK_H2, brlid, branch_inst },
  330. {"brai", INST_TYPE_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB8080000, OPCODE_MASK_H12, brai, branch_inst },
  331. {"braid", INST_TYPE_IMM, INST_NO_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB8180000, OPCODE_MASK_H12, braid, branch_inst },
  332. {"bralid",INST_TYPE_RD_IMM, INST_NO_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB81C0000, OPCODE_MASK_H2, bralid, branch_inst },
  333. {"brki", INST_TYPE_RD_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB80C0000, OPCODE_MASK_H2, brki, branch_inst },
  334. {"beqi", INST_TYPE_R1_IMM, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBC000000, OPCODE_MASK_H1, beqi, branch_inst },
  335. {"beqid", INST_TYPE_R1_IMM, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBE000000, OPCODE_MASK_H1, beqid, branch_inst },
  336. {"bnei", INST_TYPE_R1_IMM, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBC200000, OPCODE_MASK_H1, bnei, branch_inst },
  337. {"bneid", INST_TYPE_R1_IMM, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBE200000, OPCODE_MASK_H1, bneid, branch_inst },
  338. {"blti", INST_TYPE_R1_IMM, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBC400000, OPCODE_MASK_H1, blti, branch_inst },
  339. {"bltid", INST_TYPE_R1_IMM, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBE400000, OPCODE_MASK_H1, bltid, branch_inst },
  340. {"blei", INST_TYPE_R1_IMM, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBC600000, OPCODE_MASK_H1, blei, branch_inst },
  341. {"bleid", INST_TYPE_R1_IMM, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBE600000, OPCODE_MASK_H1, bleid, branch_inst },
  342. {"bgti", INST_TYPE_R1_IMM, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBC800000, OPCODE_MASK_H1, bgti, branch_inst },
  343. {"bgtid", INST_TYPE_R1_IMM, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBE800000, OPCODE_MASK_H1, bgtid, branch_inst },
  344. {"bgei", INST_TYPE_R1_IMM, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBCA00000, OPCODE_MASK_H1, bgei, branch_inst },
  345. {"bgeid", INST_TYPE_R1_IMM, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBEA00000, OPCODE_MASK_H1, bgeid, branch_inst },
  346. {"lbu", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xC0000000, OPCODE_MASK_H4, lbu, memory_load_inst },
  347. {"lhu", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xC4000000, OPCODE_MASK_H4, lhu, memory_load_inst },
  348. {"lw", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xC8000000, OPCODE_MASK_H4, lw, memory_load_inst },
  349. {"lwx", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xC8000400, OPCODE_MASK_H4, lwx, memory_load_inst },
  350. {"sb", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xD0000000, OPCODE_MASK_H4, sb, memory_store_inst },
  351. {"sh", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xD4000000, OPCODE_MASK_H4, sh, memory_store_inst },
  352. {"sw", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xD8000000, OPCODE_MASK_H4, sw, memory_store_inst },
  353. {"swx", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xD8000400, OPCODE_MASK_H4, swx, memory_store_inst },
  354. {"lbui", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE0000000, OPCODE_MASK_H, lbui, memory_load_inst },
  355. {"lhui", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE4000000, OPCODE_MASK_H, lhui, memory_load_inst },
  356. {"lwi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE8000000, OPCODE_MASK_H, lwi, memory_load_inst },
  357. {"sbi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xF0000000, OPCODE_MASK_H, sbi, memory_store_inst },
  358. {"shi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xF4000000, OPCODE_MASK_H, shi, memory_store_inst },
  359. {"swi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xF8000000, OPCODE_MASK_H, swi, memory_store_inst },
  360. {"nop", INST_TYPE_NONE, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x80000000, OPCODE_MASK_H1234, invalid_inst, logical_inst }, /* translates to or r0, r0, r0 */
  361. {"la", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x30000000, OPCODE_MASK_H, invalid_inst, arithmetic_inst }, /* la translates to addik */
  362. {"tuqula",INST_TYPE_RD, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x3000002A, OPCODE_MASK_H, invalid_inst, arithmetic_inst }, /* tuqula rd translates to addik rd, r0, 42 */
  363. {"not", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xA800FFFF, OPCODE_MASK_H34, invalid_inst, logical_inst }, /* not translates to xori rd,ra,-1 */
  364. {"neg", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x04000000, OPCODE_MASK_H, invalid_inst, arithmetic_inst }, /* neg translates to rsub rd, ra, r0 */
  365. {"rtb", INST_TYPE_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB6000004, OPCODE_MASK_H1, invalid_inst, return_inst }, /* rtb translates to rts rd, 4 */
  366. {"sub", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x04000000, OPCODE_MASK_H, invalid_inst, arithmetic_inst }, /* sub translates to rsub rd, rb, ra */
  367. {"lmi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE8000000, OPCODE_MASK_H, invalid_inst, memory_load_inst },
  368. {"smi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xF8000000, OPCODE_MASK_H, invalid_inst, memory_store_inst },
  369. {"msrset",INST_TYPE_RD_IMM15, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x94100000, OPCODE_MASK_H23N, msrset, special_inst },
  370. {"msrclr",INST_TYPE_RD_IMM15, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x94110000, OPCODE_MASK_H23N, msrclr, special_inst },
  371. {"fadd", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000000, OPCODE_MASK_H4, fadd, arithmetic_inst },
  372. {"frsub", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000080, OPCODE_MASK_H4, frsub, arithmetic_inst },
  373. {"fmul", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000100, OPCODE_MASK_H4, fmul, arithmetic_inst },
  374. {"fdiv", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000180, OPCODE_MASK_H4, fdiv, arithmetic_inst },
  375. {"fcmp.lt", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000210, OPCODE_MASK_H4, fcmp_lt, arithmetic_inst },
  376. {"fcmp.eq", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000220, OPCODE_MASK_H4, fcmp_eq, arithmetic_inst },
  377. {"fcmp.le", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000230, OPCODE_MASK_H4, fcmp_le, arithmetic_inst },
  378. {"fcmp.gt", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000240, OPCODE_MASK_H4, fcmp_gt, arithmetic_inst },
  379. {"fcmp.ne", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000250, OPCODE_MASK_H4, fcmp_ne, arithmetic_inst },
  380. {"fcmp.ge", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000260, OPCODE_MASK_H4, fcmp_ge, arithmetic_inst },
  381. {"fcmp.un", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000200, OPCODE_MASK_H4, fcmp_un, arithmetic_inst },
  382. {"flt", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000280, OPCODE_MASK_H4, flt, arithmetic_inst },
  383. {"fint", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000300, OPCODE_MASK_H4, fint, arithmetic_inst },
  384. {"fsqrt", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000380, OPCODE_MASK_H4, fsqrt, arithmetic_inst },
  385. {"tget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C001000, OPCODE_MASK_H32, tget, anyware_inst },
  386. {"tcget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C003000, OPCODE_MASK_H32, tcget, anyware_inst },
  387. {"tnget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C005000, OPCODE_MASK_H32, tnget, anyware_inst },
  388. {"tncget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C007000, OPCODE_MASK_H32, tncget, anyware_inst },
  389. {"tput", INST_TYPE_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C009000, OPCODE_MASK_H32, tput, anyware_inst },
  390. {"tcput", INST_TYPE_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00B000, OPCODE_MASK_H32, tcput, anyware_inst },
  391. {"tnput", INST_TYPE_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00D000, OPCODE_MASK_H32, tnput, anyware_inst },
  392. {"tncput", INST_TYPE_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00F000, OPCODE_MASK_H32, tncput, anyware_inst },
  393. {"eget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C000400, OPCODE_MASK_H32, eget, anyware_inst },
  394. {"ecget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C002400, OPCODE_MASK_H32, ecget, anyware_inst },
  395. {"neget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C004400, OPCODE_MASK_H32, neget, anyware_inst },
  396. {"necget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C006400, OPCODE_MASK_H32, necget, anyware_inst },
  397. {"eput", INST_TYPE_R1_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C008400, OPCODE_MASK_H32, eput, anyware_inst },
  398. {"ecput", INST_TYPE_R1_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00A400, OPCODE_MASK_H32, ecput, anyware_inst },
  399. {"neput", INST_TYPE_R1_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00C400, OPCODE_MASK_H32, neput, anyware_inst },
  400. {"necput", INST_TYPE_R1_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00E400, OPCODE_MASK_H32, necput, anyware_inst },
  401. {"teget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C001400, OPCODE_MASK_H32, teget, anyware_inst },
  402. {"tecget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C003400, OPCODE_MASK_H32, tecget, anyware_inst },
  403. {"tneget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C005400, OPCODE_MASK_H32, tneget, anyware_inst },
  404. {"tnecget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C007400, OPCODE_MASK_H32, tnecget, anyware_inst },
  405. {"teput", INST_TYPE_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C009400, OPCODE_MASK_H32, teput, anyware_inst },
  406. {"tecput", INST_TYPE_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00B400, OPCODE_MASK_H32, tecput, anyware_inst },
  407. {"tneput", INST_TYPE_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00D400, OPCODE_MASK_H32, tneput, anyware_inst },
  408. {"tnecput", INST_TYPE_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00F400, OPCODE_MASK_H32, tnecput, anyware_inst },
  409. {"aget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C000800, OPCODE_MASK_H32, aget, anyware_inst },
  410. {"caget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C002800, OPCODE_MASK_H32, caget, anyware_inst },
  411. {"naget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C004800, OPCODE_MASK_H32, naget, anyware_inst },
  412. {"ncaget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C006800, OPCODE_MASK_H32, ncaget, anyware_inst },
  413. {"aput", INST_TYPE_R1_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C008800, OPCODE_MASK_H32, aput, anyware_inst },
  414. {"caput", INST_TYPE_R1_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00A800, OPCODE_MASK_H32, caput, anyware_inst },
  415. {"naput", INST_TYPE_R1_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00C800, OPCODE_MASK_H32, naput, anyware_inst },
  416. {"ncaput", INST_TYPE_R1_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00E800, OPCODE_MASK_H32, ncaput, anyware_inst },
  417. {"taget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C001800, OPCODE_MASK_H32, taget, anyware_inst },
  418. {"tcaget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C003800, OPCODE_MASK_H32, tcaget, anyware_inst },
  419. {"tnaget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C005800, OPCODE_MASK_H32, tnaget, anyware_inst },
  420. {"tncaget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C007800, OPCODE_MASK_H32, tncaget, anyware_inst },
  421. {"taput", INST_TYPE_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C009800, OPCODE_MASK_H32, taput, anyware_inst },
  422. {"tcaput", INST_TYPE_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00B800, OPCODE_MASK_H32, tcaput, anyware_inst },
  423. {"tnaput", INST_TYPE_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00D800, OPCODE_MASK_H32, tnaput, anyware_inst },
  424. {"tncaput", INST_TYPE_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00F800, OPCODE_MASK_H32, tncaput, anyware_inst },
  425. {"eaget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C000C00, OPCODE_MASK_H32, eget, anyware_inst },
  426. {"ecaget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C002C00, OPCODE_MASK_H32, ecget, anyware_inst },
  427. {"neaget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C004C00, OPCODE_MASK_H32, neget, anyware_inst },
  428. {"necaget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C006C00, OPCODE_MASK_H32, necget, anyware_inst },
  429. {"eaput", INST_TYPE_R1_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C008C00, OPCODE_MASK_H32, eput, anyware_inst },
  430. {"ecaput", INST_TYPE_R1_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00AC00, OPCODE_MASK_H32, ecput, anyware_inst },
  431. {"neaput", INST_TYPE_R1_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00CC00, OPCODE_MASK_H32, neput, anyware_inst },
  432. {"necaput", INST_TYPE_R1_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00EC00, OPCODE_MASK_H32, necput, anyware_inst },
  433. {"teaget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C001C00, OPCODE_MASK_H32, teaget, anyware_inst },
  434. {"tecaget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C003C00, OPCODE_MASK_H32, tecaget, anyware_inst },
  435. {"tneaget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C005C00, OPCODE_MASK_H32, tneaget, anyware_inst },
  436. {"tnecaget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C007C00, OPCODE_MASK_H32, tnecaget, anyware_inst },
  437. {"teaput", INST_TYPE_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C009C00, OPCODE_MASK_H32, teaput, anyware_inst },
  438. {"tecaput", INST_TYPE_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00BC00, OPCODE_MASK_H32, tecaput, anyware_inst },
  439. {"tneaput", INST_TYPE_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00DC00, OPCODE_MASK_H32, tneaput, anyware_inst },
  440. {"tnecaput", INST_TYPE_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00FC00, OPCODE_MASK_H32, tnecaput, anyware_inst },
  441. {"getd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000000, OPCODE_MASK_H34C, getd, anyware_inst },
  442. {"tgetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000080, OPCODE_MASK_H34C, tgetd, anyware_inst },
  443. {"cgetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000100, OPCODE_MASK_H34C, cgetd, anyware_inst },
  444. {"tcgetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000180, OPCODE_MASK_H34C, tcgetd, anyware_inst },
  445. {"ngetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000200, OPCODE_MASK_H34C, ngetd, anyware_inst },
  446. {"tngetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000280, OPCODE_MASK_H34C, tngetd, anyware_inst },
  447. {"ncgetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000300, OPCODE_MASK_H34C, ncgetd, anyware_inst },
  448. {"tncgetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000380, OPCODE_MASK_H34C, tncgetd, anyware_inst },
  449. {"putd", INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000400, OPCODE_MASK_H34C, putd, anyware_inst },
  450. {"tputd", INST_TYPE_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000480, OPCODE_MASK_H34C, tputd, anyware_inst },
  451. {"cputd", INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000500, OPCODE_MASK_H34C, cputd, anyware_inst },
  452. {"tcputd", INST_TYPE_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000580, OPCODE_MASK_H34C, tcputd, anyware_inst },
  453. {"nputd", INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000600, OPCODE_MASK_H34C, nputd, anyware_inst },
  454. {"tnputd", INST_TYPE_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000680, OPCODE_MASK_H34C, tnputd, anyware_inst },
  455. {"ncputd", INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000700, OPCODE_MASK_H34C, ncputd, anyware_inst },
  456. {"tncputd", INST_TYPE_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000780, OPCODE_MASK_H34C, tncputd, anyware_inst },
  457. {"egetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000020, OPCODE_MASK_H34C, egetd, anyware_inst },
  458. {"tegetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0000A0, OPCODE_MASK_H34C, tegetd, anyware_inst },
  459. {"ecgetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000120, OPCODE_MASK_H34C, ecgetd, anyware_inst },
  460. {"tecgetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0001A0, OPCODE_MASK_H34C, tecgetd, anyware_inst },
  461. {"negetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000220, OPCODE_MASK_H34C, negetd, anyware_inst },
  462. {"tnegetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0002A0, OPCODE_MASK_H34C, tnegetd, anyware_inst },
  463. {"necgetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000320, OPCODE_MASK_H34C, necgetd, anyware_inst },
  464. {"tnecgetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0003A0, OPCODE_MASK_H34C, tnecgetd, anyware_inst },
  465. {"eputd", INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000420, OPCODE_MASK_H34C, eputd, anyware_inst },
  466. {"teputd", INST_TYPE_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0004A0, OPCODE_MASK_H34C, teputd, anyware_inst },
  467. {"ecputd", INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000520, OPCODE_MASK_H34C, ecputd, anyware_inst },
  468. {"tecputd", INST_TYPE_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0005A0, OPCODE_MASK_H34C, tecputd, anyware_inst },
  469. {"neputd", INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000620, OPCODE_MASK_H34C, neputd, anyware_inst },
  470. {"tneputd", INST_TYPE_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0006A0, OPCODE_MASK_H34C, tneputd, anyware_inst },
  471. {"necputd", INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000720, OPCODE_MASK_H34C, necputd, anyware_inst },
  472. {"tnecputd", INST_TYPE_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0007A0, OPCODE_MASK_H34C, tnecputd, anyware_inst },
  473. {"agetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000040, OPCODE_MASK_H34C, agetd, anyware_inst },
  474. {"tagetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0000C0, OPCODE_MASK_H34C, tagetd, anyware_inst },
  475. {"cagetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000140, OPCODE_MASK_H34C, cagetd, anyware_inst },
  476. {"tcagetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0001C0, OPCODE_MASK_H34C, tcagetd, anyware_inst },
  477. {"nagetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000240, OPCODE_MASK_H34C, nagetd, anyware_inst },
  478. {"tnagetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0002C0, OPCODE_MASK_H34C, tnagetd, anyware_inst },
  479. {"ncagetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000340, OPCODE_MASK_H34C, ncagetd, anyware_inst },
  480. {"tncagetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0003C0, OPCODE_MASK_H34C, tncagetd, anyware_inst },
  481. {"aputd", INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000440, OPCODE_MASK_H34C, aputd, anyware_inst },
  482. {"taputd", INST_TYPE_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0004C0, OPCODE_MASK_H34C, taputd, anyware_inst },
  483. {"caputd", INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000540, OPCODE_MASK_H34C, caputd, anyware_inst },
  484. {"tcaputd", INST_TYPE_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0005C0, OPCODE_MASK_H34C, tcaputd, anyware_inst },
  485. {"naputd", INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000640, OPCODE_MASK_H34C, naputd, anyware_inst },
  486. {"tnaputd", INST_TYPE_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0006C0, OPCODE_MASK_H34C, tnaputd, anyware_inst },
  487. {"ncaputd", INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000740, OPCODE_MASK_H34C, ncaputd, anyware_inst },
  488. {"tncaputd", INST_TYPE_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0007C0, OPCODE_MASK_H34C, tncaputd, anyware_inst },
  489. {"eagetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000060, OPCODE_MASK_H34C, eagetd, anyware_inst },
  490. {"teagetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0000E0, OPCODE_MASK_H34C, teagetd, anyware_inst },
  491. {"ecagetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000160, OPCODE_MASK_H34C, ecagetd, anyware_inst },
  492. {"tecagetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0001E0, OPCODE_MASK_H34C, tecagetd, anyware_inst },
  493. {"neagetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000260, OPCODE_MASK_H34C, neagetd, anyware_inst },
  494. {"tneagetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0002E0, OPCODE_MASK_H34C, tneagetd, anyware_inst },
  495. {"necagetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000360, OPCODE_MASK_H34C, necagetd, anyware_inst },
  496. {"tnecagetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0003E0, OPCODE_MASK_H34C, tnecagetd, anyware_inst },
  497. {"eaputd", INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000460, OPCODE_MASK_H34C, eaputd, anyware_inst },
  498. {"teaputd", INST_TYPE_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0004E0, OPCODE_MASK_H34C, teaputd, anyware_inst },
  499. {"ecaputd", INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000560, OPCODE_MASK_H34C, ecaputd, anyware_inst },
  500. {"tecaputd", INST_TYPE_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0005E0, OPCODE_MASK_H34C, tecaputd, anyware_inst },
  501. {"neaputd", INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000660, OPCODE_MASK_H34C, neaputd, anyware_inst },
  502. {"tneaputd", INST_TYPE_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0006E0, OPCODE_MASK_H34C, tneaputd, anyware_inst },
  503. {"necaputd", INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000760, OPCODE_MASK_H34C, necaputd, anyware_inst },
  504. {"tnecaputd", INST_TYPE_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0007E0, OPCODE_MASK_H34C, tnecaputd, anyware_inst },
  505. {"", 0, 0, 0, 0, 0, 0, 0, 0},
  506. };
  507. /* prefix for register names */
  508. char register_prefix[] = "r";
  509. char special_register_prefix[] = "spr";
  510. char fsl_register_prefix[] = "rfsl";
  511. char pvr_register_prefix[] = "rpvr";
  512. /* #defines for valid immediate range */
  513. #define MIN_IMM ((int) 0x80000000)
  514. #define MAX_IMM ((int) 0x7fffffff)
  515. #define MIN_IMM15 ((int) 0x0000)
  516. #define MAX_IMM15 ((int) 0x7fff)
  517. #endif /* MICROBLAZE_OPC */
  518. #include "dis-asm.h"
  519. #include <strings.h>
  520. #define get_field_rd(instr) get_field(instr, RD_MASK, RD_LOW)
  521. #define get_field_r1(instr) get_field(instr, RA_MASK, RA_LOW)
  522. #define get_field_r2(instr) get_field(instr, RB_MASK, RB_LOW)
  523. #define get_int_field_imm(instr) ((instr & IMM_MASK) >> IMM_LOW)
  524. #define get_int_field_r1(instr) ((instr & RA_MASK) >> RA_LOW)
  525. /* Local function prototypes. */
  526. static char * get_field (long instr, long mask, unsigned short low);
  527. static char * get_field_imm (long instr);
  528. static char * get_field_imm5 (long instr);
  529. static char * get_field_rfsl (long instr);
  530. static char * get_field_imm15 (long instr);
  531. #if 0
  532. static char * get_field_unsigned_imm (long instr);
  533. #endif
  534. char * get_field_special (long instr, struct op_code_struct * op);
  535. unsigned long read_insn_microblaze (bfd_vma memaddr,
  536. struct disassemble_info *info,
  537. struct op_code_struct **opr);
  538. enum microblaze_instr get_insn_microblaze (long inst,
  539. bfd_boolean *isunsignedimm,
  540. enum microblaze_instr_type *insn_type,
  541. short *delay_slots);
  542. short get_delay_slots_microblaze (long inst);
  543. enum microblaze_instr microblaze_decode_insn (long insn,
  544. int *rd,
  545. int *ra,
  546. int *rb,
  547. int *imm);
  548. unsigned long
  549. microblaze_get_target_address (long inst,
  550. bfd_boolean immfound,
  551. int immval,
  552. long pcval,
  553. long r1val,
  554. long r2val,
  555. bfd_boolean *targetvalid,
  556. bfd_boolean *unconditionalbranch);
  557. static char *
  558. get_field (long instr, long mask, unsigned short low)
  559. {
  560. char tmpstr[25];
  561. sprintf(tmpstr, "%s%d", register_prefix, (int)((instr & mask) >> low));
  562. return(strdup(tmpstr));
  563. }
  564. static char *
  565. get_field_imm (long instr)
  566. {
  567. char tmpstr[25];
  568. sprintf(tmpstr, "%d", (short)((instr & IMM_MASK) >> IMM_LOW));
  569. return(strdup(tmpstr));
  570. }
  571. static char *
  572. get_field_imm5 (long instr)
  573. {
  574. char tmpstr[25];
  575. sprintf(tmpstr, "%d", (short)((instr & IMM5_MASK) >> IMM_LOW));
  576. return(strdup(tmpstr));
  577. }
  578. static char *
  579. get_field_rfsl (long instr)
  580. {
  581. char tmpstr[25];
  582. sprintf(tmpstr, "%s%d", fsl_register_prefix, (short)((instr & RFSL_MASK) >> IMM_LOW));
  583. return(strdup(tmpstr));
  584. }
  585. static char *
  586. get_field_imm15 (long instr)
  587. {
  588. char tmpstr[25];
  589. sprintf(tmpstr, "%d", (short)((instr & IMM15_MASK) >> IMM_LOW));
  590. return(strdup(tmpstr));
  591. }
  592. #if 0
  593. static char *
  594. get_field_unsigned_imm (long instr)
  595. {
  596. char tmpstr[25];
  597. sprintf(tmpstr, "%d", (int)((instr & IMM_MASK) >> IMM_LOW));
  598. return(strdup(tmpstr));
  599. }
  600. #endif
  601. /*
  602. char *
  603. get_field_special (instr)
  604. long instr;
  605. {
  606. char tmpstr[25];
  607. sprintf(tmpstr, "%s%s", register_prefix, (((instr & IMM_MASK) >> IMM_LOW) & REG_MSR_MASK) == 0 ? "pc" : "msr");
  608. return(strdup(tmpstr));
  609. }
  610. */
  611. char *
  612. get_field_special (long instr, struct op_code_struct * op)
  613. {
  614. char tmpstr[25];
  615. char spr[6];
  616. switch ( (((instr & IMM_MASK) >> IMM_LOW) ^ op->immval_mask) ) {
  617. case REG_MSR_MASK :
  618. strcpy(spr, "msr");
  619. break;
  620. case REG_PC_MASK :
  621. strcpy(spr, "pc");
  622. break;
  623. case REG_EAR_MASK :
  624. strcpy(spr, "ear");
  625. break;
  626. case REG_ESR_MASK :
  627. strcpy(spr, "esr");
  628. break;
  629. case REG_FSR_MASK :
  630. strcpy(spr, "fsr");
  631. break;
  632. case REG_BTR_MASK :
  633. strcpy(spr, "btr");
  634. break;
  635. case REG_EDR_MASK :
  636. strcpy(spr, "edr");
  637. break;
  638. case REG_PID_MASK :
  639. strcpy(spr, "pid");
  640. break;
  641. case REG_ZPR_MASK :
  642. strcpy(spr, "zpr");
  643. break;
  644. case REG_TLBX_MASK :
  645. strcpy(spr, "tlbx");
  646. break;
  647. case REG_TLBLO_MASK :
  648. strcpy(spr, "tlblo");
  649. break;
  650. case REG_TLBHI_MASK :
  651. strcpy(spr, "tlbhi");
  652. break;
  653. case REG_TLBSX_MASK :
  654. strcpy(spr, "tlbsx");
  655. break;
  656. default :
  657. {
  658. if ( ((((instr & IMM_MASK) >> IMM_LOW) ^ op->immval_mask) & 0xE000) == REG_PVR_MASK) {
  659. sprintf(tmpstr, "%spvr%d", register_prefix, (unsigned short)(((instr & IMM_MASK) >> IMM_LOW) ^ op->immval_mask) ^ REG_PVR_MASK);
  660. return(strdup(tmpstr));
  661. } else {
  662. strcpy(spr, "pc");
  663. }
  664. }
  665. break;
  666. }
  667. sprintf(tmpstr, "%s%s", register_prefix, spr);
  668. return(strdup(tmpstr));
  669. }
  670. unsigned long
  671. read_insn_microblaze (bfd_vma memaddr,
  672. struct disassemble_info *info,
  673. struct op_code_struct **opr)
  674. {
  675. unsigned char ibytes[4];
  676. int status;
  677. struct op_code_struct * op;
  678. unsigned long inst;
  679. status = info->read_memory_func (memaddr, ibytes, 4, info);
  680. if (status != 0)
  681. {
  682. info->memory_error_func (status, memaddr, info);
  683. return 0;
  684. }
  685. if (info->endian == BFD_ENDIAN_BIG)
  686. inst = (ibytes[0] << 24) | (ibytes[1] << 16) | (ibytes[2] << 8) | ibytes[3];
  687. else if (info->endian == BFD_ENDIAN_LITTLE)
  688. inst = (ibytes[3] << 24) | (ibytes[2] << 16) | (ibytes[1] << 8) | ibytes[0];
  689. else
  690. abort ();
  691. /* Just a linear search of the table. */
  692. for (op = opcodes; op->name != 0; op ++)
  693. if (op->bit_sequence == (inst & op->opcode_mask))
  694. break;
  695. *opr = op;
  696. return inst;
  697. }
  698. int
  699. print_insn_microblaze (bfd_vma memaddr, struct disassemble_info * info)
  700. {
  701. fprintf_function fprintf_func = info->fprintf_func;
  702. void * stream = info->stream;
  703. unsigned long inst, prev_inst;
  704. struct op_code_struct * op, *pop;
  705. int immval = 0;
  706. bfd_boolean immfound = FALSE;
  707. static bfd_vma prev_insn_addr = -1; /*init the prev insn addr */
  708. static int prev_insn_vma = -1; /*init the prev insn vma */
  709. int curr_insn_vma = info->buffer_vma;
  710. info->bytes_per_chunk = 4;
  711. inst = read_insn_microblaze (memaddr, info, &op);
  712. if (inst == 0) {
  713. return -1;
  714. }
  715. if (prev_insn_vma == curr_insn_vma) {
  716. if (memaddr-(info->bytes_per_chunk) == prev_insn_addr) {
  717. prev_inst = read_insn_microblaze (prev_insn_addr, info, &pop);
  718. if (prev_inst == 0)
  719. return -1;
  720. if (pop->instr == imm) {
  721. immval = (get_int_field_imm(prev_inst) << 16) & 0xffff0000;
  722. immfound = TRUE;
  723. }
  724. else {
  725. immval = 0;
  726. immfound = FALSE;
  727. }
  728. }
  729. }
  730. /* make curr insn as prev insn */
  731. prev_insn_addr = memaddr;
  732. prev_insn_vma = curr_insn_vma;
  733. if (op->name == 0) {
  734. fprintf_func (stream, ".short 0x%04lx", inst);
  735. }
  736. else
  737. {
  738. fprintf_func (stream, "%s", op->name);
  739. switch (op->inst_type)
  740. {
  741. case INST_TYPE_RD_R1_R2:
  742. fprintf_func(stream, "\t%s, %s, %s", get_field_rd(inst), get_field_r1(inst), get_field_r2(inst));
  743. break;
  744. case INST_TYPE_RD_R1_IMM:
  745. fprintf_func(stream, "\t%s, %s, %s", get_field_rd(inst), get_field_r1(inst), get_field_imm(inst));
  746. if (info->print_address_func && get_int_field_r1(inst) == 0 && info->symbol_at_address_func) {
  747. if (immfound)
  748. immval |= (get_int_field_imm(inst) & 0x0000ffff);
  749. else {
  750. immval = get_int_field_imm(inst);
  751. if (immval & 0x8000)
  752. immval |= 0xFFFF0000;
  753. }
  754. if (immval > 0 && info->symbol_at_address_func(immval, info)) {
  755. fprintf_func (stream, "\t// ");
  756. info->print_address_func (immval, info);
  757. }
  758. }
  759. break;
  760. case INST_TYPE_RD_R1_IMM5:
  761. fprintf_func(stream, "\t%s, %s, %s", get_field_rd(inst), get_field_r1(inst), get_field_imm5(inst));
  762. break;
  763. case INST_TYPE_RD_RFSL:
  764. fprintf_func(stream, "\t%s, %s", get_field_rd(inst), get_field_rfsl(inst));
  765. break;
  766. case INST_TYPE_R1_RFSL:
  767. fprintf_func(stream, "\t%s, %s", get_field_r1(inst), get_field_rfsl(inst));
  768. break;
  769. case INST_TYPE_RD_SPECIAL:
  770. fprintf_func(stream, "\t%s, %s", get_field_rd(inst), get_field_special(inst, op));
  771. break;
  772. case INST_TYPE_SPECIAL_R1:
  773. fprintf_func(stream, "\t%s, %s", get_field_special(inst, op), get_field_r1(inst));
  774. break;
  775. case INST_TYPE_RD_R1:
  776. fprintf_func(stream, "\t%s, %s", get_field_rd(inst), get_field_r1(inst));
  777. break;
  778. case INST_TYPE_R1_R2:
  779. fprintf_func(stream, "\t%s, %s", get_field_r1(inst), get_field_r2(inst));
  780. break;
  781. case INST_TYPE_R1_IMM:
  782. fprintf_func(stream, "\t%s, %s", get_field_r1(inst), get_field_imm(inst));
  783. /* The non-pc relative instructions are returns, which shouldn't
  784. have a label printed */
  785. if (info->print_address_func && op->inst_offset_type == INST_PC_OFFSET && info->symbol_at_address_func) {
  786. if (immfound)
  787. immval |= (get_int_field_imm(inst) & 0x0000ffff);
  788. else {
  789. immval = get_int_field_imm(inst);
  790. if (immval & 0x8000)
  791. immval |= 0xFFFF0000;
  792. }
  793. immval += memaddr;
  794. if (immval > 0 && info->symbol_at_address_func(immval, info)) {
  795. fprintf_func (stream, "\t// ");
  796. info->print_address_func (immval, info);
  797. } else {
  798. fprintf_func (stream, "\t\t// ");
  799. fprintf_func (stream, "%x", immval);
  800. }
  801. }
  802. break;
  803. case INST_TYPE_RD_IMM:
  804. fprintf_func(stream, "\t%s, %s", get_field_rd(inst), get_field_imm(inst));
  805. if (info->print_address_func && info->symbol_at_address_func) {
  806. if (immfound)
  807. immval |= (get_int_field_imm(inst) & 0x0000ffff);
  808. else {
  809. immval = get_int_field_imm(inst);
  810. if (immval & 0x8000)
  811. immval |= 0xFFFF0000;
  812. }
  813. if (op->inst_offset_type == INST_PC_OFFSET)
  814. immval += (int) memaddr;
  815. if (info->symbol_at_address_func(immval, info)) {
  816. fprintf_func (stream, "\t// ");
  817. info->print_address_func (immval, info);
  818. }
  819. }
  820. break;
  821. case INST_TYPE_IMM:
  822. fprintf_func(stream, "\t%s", get_field_imm(inst));
  823. if (info->print_address_func && info->symbol_at_address_func && op->instr != imm) {
  824. if (immfound)
  825. immval |= (get_int_field_imm(inst) & 0x0000ffff);
  826. else {
  827. immval = get_int_field_imm(inst);
  828. if (immval & 0x8000)
  829. immval |= 0xFFFF0000;
  830. }
  831. if (op->inst_offset_type == INST_PC_OFFSET)
  832. immval += (int) memaddr;
  833. if (immval > 0 && info->symbol_at_address_func(immval, info)) {
  834. fprintf_func (stream, "\t// ");
  835. info->print_address_func (immval, info);
  836. } else if (op->inst_offset_type == INST_PC_OFFSET) {
  837. fprintf_func (stream, "\t\t// ");
  838. fprintf_func (stream, "%x", immval);
  839. }
  840. }
  841. break;
  842. case INST_TYPE_RD_R2:
  843. fprintf_func(stream, "\t%s, %s", get_field_rd(inst), get_field_r2(inst));
  844. break;
  845. case INST_TYPE_R2:
  846. fprintf_func(stream, "\t%s", get_field_r2(inst));
  847. break;
  848. case INST_TYPE_R1:
  849. fprintf_func(stream, "\t%s", get_field_r1(inst));
  850. break;
  851. case INST_TYPE_RD_R1_SPECIAL:
  852. fprintf_func(stream, "\t%s, %s", get_field_rd(inst), get_field_r2(inst));
  853. break;
  854. case INST_TYPE_RD_IMM15:
  855. fprintf_func(stream, "\t%s, %s", get_field_rd(inst), get_field_imm15(inst));
  856. break;
  857. /* For tuqula instruction */
  858. case INST_TYPE_RD:
  859. fprintf_func(stream, "\t%s", get_field_rd(inst));
  860. break;
  861. case INST_TYPE_RFSL:
  862. fprintf_func(stream, "\t%s", get_field_rfsl(inst));
  863. break;
  864. default:
  865. /* if the disassembler lags the instruction set */
  866. fprintf_func (stream, "\tundecoded operands, inst is 0x%04lx", inst);
  867. break;
  868. }
  869. }
  870. /* Say how many bytes we consumed? */
  871. return 4;
  872. }
  873. enum microblaze_instr
  874. get_insn_microblaze (long inst,
  875. bfd_boolean *isunsignedimm,
  876. enum microblaze_instr_type *insn_type,
  877. short *delay_slots)
  878. {
  879. struct op_code_struct * op;
  880. *isunsignedimm = FALSE;
  881. /* Just a linear search of the table. */
  882. for (op = opcodes; op->name != 0; op ++)
  883. if (op->bit_sequence == (inst & op->opcode_mask))
  884. break;
  885. if (op->name == 0)
  886. return invalid_inst;
  887. else {
  888. *isunsignedimm = (op->inst_type == INST_TYPE_RD_R1_UNSIGNED_IMM);
  889. *insn_type = op->instr_type;
  890. *delay_slots = op->delay_slots;
  891. return op->instr;
  892. }
  893. }
  894. short
  895. get_delay_slots_microblaze (long inst)
  896. {
  897. bfd_boolean isunsignedimm;
  898. enum microblaze_instr_type insn_type;
  899. enum microblaze_instr op;
  900. short delay_slots;
  901. op = get_insn_microblaze( inst, &isunsignedimm, &insn_type, &delay_slots);
  902. if (op == invalid_inst)
  903. return 0;
  904. else
  905. return delay_slots;
  906. }
  907. enum microblaze_instr
  908. microblaze_decode_insn (long insn,
  909. int *rd,
  910. int *ra,
  911. int *rb,
  912. int *imm)
  913. {
  914. enum microblaze_instr op;
  915. bfd_boolean t1;
  916. enum microblaze_instr_type t2;
  917. short t3;
  918. op = get_insn_microblaze(insn, &t1, &t2, &t3);
  919. *rd = (insn & RD_MASK) >> RD_LOW;
  920. *ra = (insn & RA_MASK) >> RA_LOW;
  921. *rb = (insn & RB_MASK) >> RB_LOW;
  922. t3 = (insn & IMM_MASK) >> IMM_LOW;
  923. *imm = (int) t3;
  924. return (op);
  925. }
  926. unsigned long
  927. microblaze_get_target_address (long inst,
  928. bfd_boolean immfound,
  929. int immval,
  930. long pcval,
  931. long r1val,
  932. long r2val,
  933. bfd_boolean *targetvalid,
  934. bfd_boolean *unconditionalbranch)
  935. {
  936. struct op_code_struct * op;
  937. long targetaddr = 0;
  938. *unconditionalbranch = FALSE;
  939. /* Just a linear search of the table. */
  940. for (op = opcodes; op->name != 0; op ++)
  941. if (op->bit_sequence == (inst & op->opcode_mask))
  942. break;
  943. if (op->name == 0) {
  944. *targetvalid = FALSE;
  945. } else if (op->instr_type == branch_inst) {
  946. switch (op->inst_type) {
  947. case INST_TYPE_R2:
  948. *unconditionalbranch = TRUE;
  949. /* fallthru */
  950. case INST_TYPE_RD_R2:
  951. case INST_TYPE_R1_R2:
  952. targetaddr = r2val;
  953. *targetvalid = TRUE;
  954. if (op->inst_offset_type == INST_PC_OFFSET)
  955. targetaddr += pcval;
  956. break;
  957. case INST_TYPE_IMM:
  958. *unconditionalbranch = TRUE;
  959. /* fallthru */
  960. case INST_TYPE_RD_IMM:
  961. case INST_TYPE_R1_IMM:
  962. if (immfound) {
  963. targetaddr = (immval << 16) & 0xffff0000;
  964. targetaddr |= (get_int_field_imm(inst) & 0x0000ffff);
  965. } else {
  966. targetaddr = get_int_field_imm(inst);
  967. if (targetaddr & 0x8000)
  968. targetaddr |= 0xFFFF0000;
  969. }
  970. if (op->inst_offset_type == INST_PC_OFFSET)
  971. targetaddr += pcval;
  972. *targetvalid = TRUE;
  973. break;
  974. default:
  975. *targetvalid = FALSE;
  976. break;
  977. }
  978. } else if (op->instr_type == return_inst) {
  979. if (immfound) {
  980. targetaddr = (immval << 16) & 0xffff0000;
  981. targetaddr |= (get_int_field_imm(inst) & 0x0000ffff);
  982. } else {
  983. targetaddr = get_int_field_imm(inst);
  984. if (targetaddr & 0x8000)
  985. targetaddr |= 0xFFFF0000;
  986. }
  987. targetaddr += r1val;
  988. *targetvalid = TRUE;
  989. } else {
  990. *targetvalid = FALSE;
  991. }
  992. return targetaddr;
  993. }