dasm_ppc.lua 56 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919
  1. ------------------------------------------------------------------------------
  2. -- DynASM PPC/PPC64 module.
  3. --
  4. -- Copyright (C) 2005-2021 Mike Pall. All rights reserved.
  5. -- See dynasm.lua for full copyright notice.
  6. --
  7. -- Support for various extensions contributed by Caio Souza Oliveira.
  8. ------------------------------------------------------------------------------
  9. -- Module information:
  10. local _info = {
  11. arch = "ppc",
  12. description = "DynASM PPC module",
  13. version = "1.5.0",
  14. vernum = 10500,
  15. release = "2021-05-02",
  16. author = "Mike Pall",
  17. license = "MIT",
  18. }
  19. -- Exported glue functions for the arch-specific module.
  20. local _M = { _info = _info }
  21. -- Cache library functions.
  22. local type, tonumber, pairs, ipairs = type, tonumber, pairs, ipairs
  23. local assert, setmetatable = assert, setmetatable
  24. local _s = string
  25. local sub, format, byte, char = _s.sub, _s.format, _s.byte, _s.char
  26. local match, gmatch = _s.match, _s.gmatch
  27. local concat, sort = table.concat, table.sort
  28. local bit = bit or require("bit")
  29. local band, shl, shr, sar = bit.band, bit.lshift, bit.rshift, bit.arshift
  30. local tohex = bit.tohex
  31. -- Inherited tables and callbacks.
  32. local g_opt, g_arch
  33. local wline, werror, wfatal, wwarn
  34. -- Action name list.
  35. -- CHECK: Keep this in sync with the C code!
  36. local action_names = {
  37. "STOP", "SECTION", "ESC", "REL_EXT",
  38. "ALIGN", "REL_LG", "LABEL_LG",
  39. "REL_PC", "LABEL_PC", "IMM", "IMMSH"
  40. }
  41. -- Maximum number of section buffer positions for dasm_put().
  42. -- CHECK: Keep this in sync with the C code!
  43. local maxsecpos = 25 -- Keep this low, to avoid excessively long C lines.
  44. -- Action name -> action number.
  45. local map_action = {}
  46. for n,name in ipairs(action_names) do
  47. map_action[name] = n-1
  48. end
  49. -- Action list buffer.
  50. local actlist = {}
  51. -- Argument list for next dasm_put(). Start with offset 0 into action list.
  52. local actargs = { 0 }
  53. -- Current number of section buffer positions for dasm_put().
  54. local secpos = 1
  55. ------------------------------------------------------------------------------
  56. -- Dump action names and numbers.
  57. local function dumpactions(out)
  58. out:write("DynASM encoding engine action codes:\n")
  59. for n,name in ipairs(action_names) do
  60. local num = map_action[name]
  61. out:write(format(" %-10s %02X %d\n", name, num, num))
  62. end
  63. out:write("\n")
  64. end
  65. -- Write action list buffer as a huge static C array.
  66. local function writeactions(out, name)
  67. local nn = #actlist
  68. if nn == 0 then nn = 1; actlist[0] = map_action.STOP end
  69. out:write("static const unsigned int ", name, "[", nn, "] = {\n")
  70. for i = 1,nn-1 do
  71. assert(out:write("0x", tohex(actlist[i]), ",\n"))
  72. end
  73. assert(out:write("0x", tohex(actlist[nn]), "\n};\n\n"))
  74. end
  75. ------------------------------------------------------------------------------
  76. -- Add word to action list.
  77. local function wputxw(n)
  78. assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range")
  79. actlist[#actlist+1] = n
  80. end
  81. -- Add action to list with optional arg. Advance buffer pos, too.
  82. local function waction(action, val, a, num)
  83. local w = assert(map_action[action], "bad action name `"..action.."'")
  84. wputxw(w * 0x10000 + (val or 0))
  85. if a then actargs[#actargs+1] = a end
  86. if a or num then secpos = secpos + (num or 1) end
  87. end
  88. -- Flush action list (intervening C code or buffer pos overflow).
  89. local function wflush(term)
  90. if #actlist == actargs[1] then return end -- Nothing to flush.
  91. if not term then waction("STOP") end -- Terminate action list.
  92. wline(format("dasm_put(Dst, %s);", concat(actargs, ", ")), true)
  93. actargs = { #actlist } -- Actionlist offset is 1st arg to next dasm_put().
  94. secpos = 1 -- The actionlist offset occupies a buffer position, too.
  95. end
  96. -- Put escaped word.
  97. local function wputw(n)
  98. if n <= 0xffffff then waction("ESC") end
  99. wputxw(n)
  100. end
  101. -- Reserve position for word.
  102. local function wpos()
  103. local pos = #actlist+1
  104. actlist[pos] = ""
  105. return pos
  106. end
  107. -- Store word to reserved position.
  108. local function wputpos(pos, n)
  109. assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range")
  110. actlist[pos] = n
  111. end
  112. ------------------------------------------------------------------------------
  113. -- Global label name -> global label number. With auto assignment on 1st use.
  114. local next_global = 20
  115. local map_global = setmetatable({}, { __index = function(t, name)
  116. if not match(name, "^[%a_][%w_]*$") then werror("bad global label") end
  117. local n = next_global
  118. if n > 2047 then werror("too many global labels") end
  119. next_global = n + 1
  120. t[name] = n
  121. return n
  122. end})
  123. -- Dump global labels.
  124. local function dumpglobals(out, lvl)
  125. local t = {}
  126. for name, n in pairs(map_global) do t[n] = name end
  127. out:write("Global labels:\n")
  128. for i=20,next_global-1 do
  129. out:write(format(" %s\n", t[i]))
  130. end
  131. out:write("\n")
  132. end
  133. -- Write global label enum.
  134. local function writeglobals(out, prefix)
  135. local t = {}
  136. for name, n in pairs(map_global) do t[n] = name end
  137. out:write("enum {\n")
  138. for i=20,next_global-1 do
  139. out:write(" ", prefix, t[i], ",\n")
  140. end
  141. out:write(" ", prefix, "_MAX\n};\n")
  142. end
  143. -- Write global label names.
  144. local function writeglobalnames(out, name)
  145. local t = {}
  146. for name, n in pairs(map_global) do t[n] = name end
  147. out:write("static const char *const ", name, "[] = {\n")
  148. for i=20,next_global-1 do
  149. out:write(" \"", t[i], "\",\n")
  150. end
  151. out:write(" (const char *)0\n};\n")
  152. end
  153. ------------------------------------------------------------------------------
  154. -- Extern label name -> extern label number. With auto assignment on 1st use.
  155. local next_extern = 0
  156. local map_extern_ = {}
  157. local map_extern = setmetatable({}, { __index = function(t, name)
  158. -- No restrictions on the name for now.
  159. local n = next_extern
  160. if n > 2047 then werror("too many extern labels") end
  161. next_extern = n + 1
  162. t[name] = n
  163. map_extern_[n] = name
  164. return n
  165. end})
  166. -- Dump extern labels.
  167. local function dumpexterns(out, lvl)
  168. out:write("Extern labels:\n")
  169. for i=0,next_extern-1 do
  170. out:write(format(" %s\n", map_extern_[i]))
  171. end
  172. out:write("\n")
  173. end
  174. -- Write extern label names.
  175. local function writeexternnames(out, name)
  176. out:write("static const char *const ", name, "[] = {\n")
  177. for i=0,next_extern-1 do
  178. out:write(" \"", map_extern_[i], "\",\n")
  179. end
  180. out:write(" (const char *)0\n};\n")
  181. end
  182. ------------------------------------------------------------------------------
  183. -- Arch-specific maps.
  184. local map_archdef = { sp = "r1" } -- Ext. register name -> int. name.
  185. local map_type = {} -- Type name -> { ctype, reg }
  186. local ctypenum = 0 -- Type number (for Dt... macros).
  187. -- Reverse defines for registers.
  188. function _M.revdef(s)
  189. if s == "r1" then return "sp" end
  190. return s
  191. end
  192. local map_cond = {
  193. lt = 0, gt = 1, eq = 2, so = 3,
  194. ge = 4, le = 5, ne = 6, ns = 7,
  195. }
  196. ------------------------------------------------------------------------------
  197. local map_op, op_template
  198. local function op_alias(opname, f)
  199. return function(params, nparams)
  200. if not params then return "-> "..opname:sub(1, -3) end
  201. f(params, nparams)
  202. op_template(params, map_op[opname], nparams)
  203. end
  204. end
  205. -- Template strings for PPC instructions.
  206. map_op = {
  207. tdi_3 = "08000000ARI",
  208. twi_3 = "0c000000ARI",
  209. mulli_3 = "1c000000RRI",
  210. subfic_3 = "20000000RRI",
  211. cmplwi_3 = "28000000XRU",
  212. cmplwi_2 = "28000000-RU",
  213. cmpldi_3 = "28200000XRU",
  214. cmpldi_2 = "28200000-RU",
  215. cmpwi_3 = "2c000000XRI",
  216. cmpwi_2 = "2c000000-RI",
  217. cmpdi_3 = "2c200000XRI",
  218. cmpdi_2 = "2c200000-RI",
  219. addic_3 = "30000000RRI",
  220. ["addic._3"] = "34000000RRI",
  221. addi_3 = "38000000RR0I",
  222. li_2 = "38000000RI",
  223. la_2 = "38000000RD",
  224. addis_3 = "3c000000RR0I",
  225. lis_2 = "3c000000RI",
  226. lus_2 = "3c000000RU",
  227. bc_3 = "40000000AAK",
  228. bcl_3 = "40000001AAK",
  229. bdnz_1 = "42000000K",
  230. bdz_1 = "42400000K",
  231. sc_0 = "44000000",
  232. b_1 = "48000000J",
  233. bl_1 = "48000001J",
  234. rlwimi_5 = "50000000RR~AAA.",
  235. rlwinm_5 = "54000000RR~AAA.",
  236. rlwnm_5 = "5c000000RR~RAA.",
  237. ori_3 = "60000000RR~U",
  238. nop_0 = "60000000",
  239. oris_3 = "64000000RR~U",
  240. xori_3 = "68000000RR~U",
  241. xoris_3 = "6c000000RR~U",
  242. ["andi._3"] = "70000000RR~U",
  243. ["andis._3"] = "74000000RR~U",
  244. lwz_2 = "80000000RD",
  245. lwzu_2 = "84000000RD",
  246. lbz_2 = "88000000RD",
  247. lbzu_2 = "8c000000RD",
  248. stw_2 = "90000000RD",
  249. stwu_2 = "94000000RD",
  250. stb_2 = "98000000RD",
  251. stbu_2 = "9c000000RD",
  252. lhz_2 = "a0000000RD",
  253. lhzu_2 = "a4000000RD",
  254. lha_2 = "a8000000RD",
  255. lhau_2 = "ac000000RD",
  256. sth_2 = "b0000000RD",
  257. sthu_2 = "b4000000RD",
  258. lmw_2 = "b8000000RD",
  259. stmw_2 = "bc000000RD",
  260. lfs_2 = "c0000000FD",
  261. lfsu_2 = "c4000000FD",
  262. lfd_2 = "c8000000FD",
  263. lfdu_2 = "cc000000FD",
  264. stfs_2 = "d0000000FD",
  265. stfsu_2 = "d4000000FD",
  266. stfd_2 = "d8000000FD",
  267. stfdu_2 = "dc000000FD",
  268. ld_2 = "e8000000RD", -- NYI: displacement must be divisible by 4.
  269. ldu_2 = "e8000001RD",
  270. lwa_2 = "e8000002RD",
  271. std_2 = "f8000000RD",
  272. stdu_2 = "f8000001RD",
  273. subi_3 = op_alias("addi_3", function(p) p[3] = "-("..p[3]..")" end),
  274. subis_3 = op_alias("addis_3", function(p) p[3] = "-("..p[3]..")" end),
  275. subic_3 = op_alias("addic_3", function(p) p[3] = "-("..p[3]..")" end),
  276. ["subic._3"] = op_alias("addic._3", function(p) p[3] = "-("..p[3]..")" end),
  277. rotlwi_3 = op_alias("rlwinm_5", function(p)
  278. p[4] = "0"; p[5] = "31"
  279. end),
  280. rotrwi_3 = op_alias("rlwinm_5", function(p)
  281. p[3] = "32-("..p[3]..")"; p[4] = "0"; p[5] = "31"
  282. end),
  283. rotlw_3 = op_alias("rlwnm_5", function(p)
  284. p[4] = "0"; p[5] = "31"
  285. end),
  286. slwi_3 = op_alias("rlwinm_5", function(p)
  287. p[5] = "31-("..p[3]..")"; p[4] = "0"
  288. end),
  289. srwi_3 = op_alias("rlwinm_5", function(p)
  290. p[4] = p[3]; p[3] = "32-("..p[3]..")"; p[5] = "31"
  291. end),
  292. clrlwi_3 = op_alias("rlwinm_5", function(p)
  293. p[4] = p[3]; p[3] = "0"; p[5] = "31"
  294. end),
  295. clrrwi_3 = op_alias("rlwinm_5", function(p)
  296. p[5] = "31-("..p[3]..")"; p[3] = "0"; p[4] = "0"
  297. end),
  298. -- Primary opcode 4:
  299. mulhhwu_3 = "10000010RRR.",
  300. machhwu_3 = "10000018RRR.",
  301. mulhhw_3 = "10000050RRR.",
  302. nmachhw_3 = "1000005cRRR.",
  303. machhwsu_3 = "10000098RRR.",
  304. machhws_3 = "100000d8RRR.",
  305. nmachhws_3 = "100000dcRRR.",
  306. mulchwu_3 = "10000110RRR.",
  307. macchwu_3 = "10000118RRR.",
  308. mulchw_3 = "10000150RRR.",
  309. macchw_3 = "10000158RRR.",
  310. nmacchw_3 = "1000015cRRR.",
  311. macchwsu_3 = "10000198RRR.",
  312. macchws_3 = "100001d8RRR.",
  313. nmacchws_3 = "100001dcRRR.",
  314. mullhw_3 = "10000350RRR.",
  315. maclhw_3 = "10000358RRR.",
  316. nmaclhw_3 = "1000035cRRR.",
  317. maclhwsu_3 = "10000398RRR.",
  318. maclhws_3 = "100003d8RRR.",
  319. nmaclhws_3 = "100003dcRRR.",
  320. machhwuo_3 = "10000418RRR.",
  321. nmachhwo_3 = "1000045cRRR.",
  322. machhwsuo_3 = "10000498RRR.",
  323. machhwso_3 = "100004d8RRR.",
  324. nmachhwso_3 = "100004dcRRR.",
  325. macchwuo_3 = "10000518RRR.",
  326. macchwo_3 = "10000558RRR.",
  327. nmacchwo_3 = "1000055cRRR.",
  328. macchwsuo_3 = "10000598RRR.",
  329. macchwso_3 = "100005d8RRR.",
  330. nmacchwso_3 = "100005dcRRR.",
  331. maclhwo_3 = "10000758RRR.",
  332. nmaclhwo_3 = "1000075cRRR.",
  333. maclhwsuo_3 = "10000798RRR.",
  334. maclhwso_3 = "100007d8RRR.",
  335. nmaclhwso_3 = "100007dcRRR.",
  336. vaddubm_3 = "10000000VVV",
  337. vmaxub_3 = "10000002VVV",
  338. vrlb_3 = "10000004VVV",
  339. vcmpequb_3 = "10000006VVV",
  340. vmuloub_3 = "10000008VVV",
  341. vaddfp_3 = "1000000aVVV",
  342. vmrghb_3 = "1000000cVVV",
  343. vpkuhum_3 = "1000000eVVV",
  344. vmhaddshs_4 = "10000020VVVV",
  345. vmhraddshs_4 = "10000021VVVV",
  346. vmladduhm_4 = "10000022VVVV",
  347. vmsumubm_4 = "10000024VVVV",
  348. vmsummbm_4 = "10000025VVVV",
  349. vmsumuhm_4 = "10000026VVVV",
  350. vmsumuhs_4 = "10000027VVVV",
  351. vmsumshm_4 = "10000028VVVV",
  352. vmsumshs_4 = "10000029VVVV",
  353. vsel_4 = "1000002aVVVV",
  354. vperm_4 = "1000002bVVVV",
  355. vsldoi_4 = "1000002cVVVP",
  356. vpermxor_4 = "1000002dVVVV",
  357. vmaddfp_4 = "1000002eVVVV~",
  358. vnmsubfp_4 = "1000002fVVVV~",
  359. vaddeuqm_4 = "1000003cVVVV",
  360. vaddecuq_4 = "1000003dVVVV",
  361. vsubeuqm_4 = "1000003eVVVV",
  362. vsubecuq_4 = "1000003fVVVV",
  363. vadduhm_3 = "10000040VVV",
  364. vmaxuh_3 = "10000042VVV",
  365. vrlh_3 = "10000044VVV",
  366. vcmpequh_3 = "10000046VVV",
  367. vmulouh_3 = "10000048VVV",
  368. vsubfp_3 = "1000004aVVV",
  369. vmrghh_3 = "1000004cVVV",
  370. vpkuwum_3 = "1000004eVVV",
  371. vadduwm_3 = "10000080VVV",
  372. vmaxuw_3 = "10000082VVV",
  373. vrlw_3 = "10000084VVV",
  374. vcmpequw_3 = "10000086VVV",
  375. vmulouw_3 = "10000088VVV",
  376. vmuluwm_3 = "10000089VVV",
  377. vmrghw_3 = "1000008cVVV",
  378. vpkuhus_3 = "1000008eVVV",
  379. vaddudm_3 = "100000c0VVV",
  380. vmaxud_3 = "100000c2VVV",
  381. vrld_3 = "100000c4VVV",
  382. vcmpeqfp_3 = "100000c6VVV",
  383. vcmpequd_3 = "100000c7VVV",
  384. vpkuwus_3 = "100000ceVVV",
  385. vadduqm_3 = "10000100VVV",
  386. vmaxsb_3 = "10000102VVV",
  387. vslb_3 = "10000104VVV",
  388. vmulosb_3 = "10000108VVV",
  389. vrefp_2 = "1000010aV-V",
  390. vmrglb_3 = "1000010cVVV",
  391. vpkshus_3 = "1000010eVVV",
  392. vaddcuq_3 = "10000140VVV",
  393. vmaxsh_3 = "10000142VVV",
  394. vslh_3 = "10000144VVV",
  395. vmulosh_3 = "10000148VVV",
  396. vrsqrtefp_2 = "1000014aV-V",
  397. vmrglh_3 = "1000014cVVV",
  398. vpkswus_3 = "1000014eVVV",
  399. vaddcuw_3 = "10000180VVV",
  400. vmaxsw_3 = "10000182VVV",
  401. vslw_3 = "10000184VVV",
  402. vmulosw_3 = "10000188VVV",
  403. vexptefp_2 = "1000018aV-V",
  404. vmrglw_3 = "1000018cVVV",
  405. vpkshss_3 = "1000018eVVV",
  406. vmaxsd_3 = "100001c2VVV",
  407. vsl_3 = "100001c4VVV",
  408. vcmpgefp_3 = "100001c6VVV",
  409. vlogefp_2 = "100001caV-V",
  410. vpkswss_3 = "100001ceVVV",
  411. vadduhs_3 = "10000240VVV",
  412. vminuh_3 = "10000242VVV",
  413. vsrh_3 = "10000244VVV",
  414. vcmpgtuh_3 = "10000246VVV",
  415. vmuleuh_3 = "10000248VVV",
  416. vrfiz_2 = "1000024aV-V",
  417. vsplth_3 = "1000024cVV3",
  418. vupkhsh_2 = "1000024eV-V",
  419. vminuw_3 = "10000282VVV",
  420. vminud_3 = "100002c2VVV",
  421. vcmpgtud_3 = "100002c7VVV",
  422. vrfim_2 = "100002caV-V",
  423. vcmpgtsb_3 = "10000306VVV",
  424. vcfux_3 = "1000030aVVA~",
  425. vaddshs_3 = "10000340VVV",
  426. vminsh_3 = "10000342VVV",
  427. vsrah_3 = "10000344VVV",
  428. vcmpgtsh_3 = "10000346VVV",
  429. vmulesh_3 = "10000348VVV",
  430. vcfsx_3 = "1000034aVVA~",
  431. vspltish_2 = "1000034cVS",
  432. vupkhpx_2 = "1000034eV-V",
  433. vaddsws_3 = "10000380VVV",
  434. vminsw_3 = "10000382VVV",
  435. vsraw_3 = "10000384VVV",
  436. vcmpgtsw_3 = "10000386VVV",
  437. vmulesw_3 = "10000388VVV",
  438. vctuxs_3 = "1000038aVVA~",
  439. vspltisw_2 = "1000038cVS",
  440. vminsd_3 = "100003c2VVV",
  441. vsrad_3 = "100003c4VVV",
  442. vcmpbfp_3 = "100003c6VVV",
  443. vcmpgtsd_3 = "100003c7VVV",
  444. vctsxs_3 = "100003caVVA~",
  445. vupklpx_2 = "100003ceV-V",
  446. vsububm_3 = "10000400VVV",
  447. ["bcdadd._4"] = "10000401VVVy.",
  448. vavgub_3 = "10000402VVV",
  449. vand_3 = "10000404VVV",
  450. ["vcmpequb._3"] = "10000406VVV",
  451. vmaxfp_3 = "1000040aVVV",
  452. vsubuhm_3 = "10000440VVV",
  453. ["bcdsub._4"] = "10000441VVVy.",
  454. vavguh_3 = "10000442VVV",
  455. vandc_3 = "10000444VVV",
  456. ["vcmpequh._3"] = "10000446VVV",
  457. vminfp_3 = "1000044aVVV",
  458. vpkudum_3 = "1000044eVVV",
  459. vsubuwm_3 = "10000480VVV",
  460. vavguw_3 = "10000482VVV",
  461. vor_3 = "10000484VVV",
  462. ["vcmpequw._3"] = "10000486VVV",
  463. vpmsumw_3 = "10000488VVV",
  464. ["vcmpeqfp._3"] = "100004c6VVV",
  465. ["vcmpequd._3"] = "100004c7VVV",
  466. vpkudus_3 = "100004ceVVV",
  467. vavgsb_3 = "10000502VVV",
  468. vavgsh_3 = "10000542VVV",
  469. vorc_3 = "10000544VVV",
  470. vbpermq_3 = "1000054cVVV",
  471. vpksdus_3 = "1000054eVVV",
  472. vavgsw_3 = "10000582VVV",
  473. vsld_3 = "100005c4VVV",
  474. ["vcmpgefp._3"] = "100005c6VVV",
  475. vpksdss_3 = "100005ceVVV",
  476. vsububs_3 = "10000600VVV",
  477. mfvscr_1 = "10000604V--",
  478. vsum4ubs_3 = "10000608VVV",
  479. vsubuhs_3 = "10000640VVV",
  480. mtvscr_1 = "10000644--V",
  481. ["vcmpgtuh._3"] = "10000646VVV",
  482. vsum4shs_3 = "10000648VVV",
  483. vupkhsw_2 = "1000064eV-V",
  484. vsubuws_3 = "10000680VVV",
  485. vshasigmaw_4 = "10000682VVYp",
  486. veqv_3 = "10000684VVV",
  487. vsum2sws_3 = "10000688VVV",
  488. vmrgow_3 = "1000068cVVV",
  489. vshasigmad_4 = "100006c2VVYp",
  490. vsrd_3 = "100006c4VVV",
  491. ["vcmpgtud._3"] = "100006c7VVV",
  492. vupklsw_2 = "100006ceV-V",
  493. vupkslw_2 = "100006ceV-V",
  494. vsubsbs_3 = "10000700VVV",
  495. vclzb_2 = "10000702V-V",
  496. vpopcntb_2 = "10000703V-V",
  497. ["vcmpgtsb._3"] = "10000706VVV",
  498. vsum4sbs_3 = "10000708VVV",
  499. vsubshs_3 = "10000740VVV",
  500. vclzh_2 = "10000742V-V",
  501. vpopcnth_2 = "10000743V-V",
  502. ["vcmpgtsh._3"] = "10000746VVV",
  503. vsubsws_3 = "10000780VVV",
  504. vclzw_2 = "10000782V-V",
  505. vpopcntw_2 = "10000783V-V",
  506. ["vcmpgtsw._3"] = "10000786VVV",
  507. vsumsws_3 = "10000788VVV",
  508. vmrgew_3 = "1000078cVVV",
  509. vclzd_2 = "100007c2V-V",
  510. vpopcntd_2 = "100007c3V-V",
  511. ["vcmpbfp._3"] = "100007c6VVV",
  512. ["vcmpgtsd._3"] = "100007c7VVV",
  513. -- Primary opcode 19:
  514. mcrf_2 = "4c000000XX",
  515. isync_0 = "4c00012c",
  516. crnor_3 = "4c000042CCC",
  517. crnot_2 = "4c000042CC=",
  518. crandc_3 = "4c000102CCC",
  519. crxor_3 = "4c000182CCC",
  520. crclr_1 = "4c000182C==",
  521. crnand_3 = "4c0001c2CCC",
  522. crand_3 = "4c000202CCC",
  523. creqv_3 = "4c000242CCC",
  524. crset_1 = "4c000242C==",
  525. crorc_3 = "4c000342CCC",
  526. cror_3 = "4c000382CCC",
  527. crmove_2 = "4c000382CC=",
  528. bclr_2 = "4c000020AA",
  529. bclrl_2 = "4c000021AA",
  530. bcctr_2 = "4c000420AA",
  531. bcctrl_2 = "4c000421AA",
  532. bctar_2 = "4c000460AA",
  533. bctarl_2 = "4c000461AA",
  534. blr_0 = "4e800020",
  535. blrl_0 = "4e800021",
  536. bctr_0 = "4e800420",
  537. bctrl_0 = "4e800421",
  538. -- Primary opcode 31:
  539. cmpw_3 = "7c000000XRR",
  540. cmpw_2 = "7c000000-RR",
  541. cmpd_3 = "7c200000XRR",
  542. cmpd_2 = "7c200000-RR",
  543. tw_3 = "7c000008ARR",
  544. lvsl_3 = "7c00000cVRR",
  545. subfc_3 = "7c000010RRR.",
  546. subc_3 = "7c000010RRR~.",
  547. mulhdu_3 = "7c000012RRR.",
  548. addc_3 = "7c000014RRR.",
  549. mulhwu_3 = "7c000016RRR.",
  550. isel_4 = "7c00001eRRRC",
  551. isellt_3 = "7c00001eRRR",
  552. iselgt_3 = "7c00005eRRR",
  553. iseleq_3 = "7c00009eRRR",
  554. mfcr_1 = "7c000026R",
  555. mfocrf_2 = "7c100026RG",
  556. mtcrf_2 = "7c000120GR",
  557. mtocrf_2 = "7c100120GR",
  558. lwarx_3 = "7c000028RR0R",
  559. ldx_3 = "7c00002aRR0R",
  560. lwzx_3 = "7c00002eRR0R",
  561. slw_3 = "7c000030RR~R.",
  562. cntlzw_2 = "7c000034RR~",
  563. sld_3 = "7c000036RR~R.",
  564. and_3 = "7c000038RR~R.",
  565. cmplw_3 = "7c000040XRR",
  566. cmplw_2 = "7c000040-RR",
  567. cmpld_3 = "7c200040XRR",
  568. cmpld_2 = "7c200040-RR",
  569. lvsr_3 = "7c00004cVRR",
  570. subf_3 = "7c000050RRR.",
  571. sub_3 = "7c000050RRR~.",
  572. lbarx_3 = "7c000068RR0R",
  573. ldux_3 = "7c00006aRR0R",
  574. dcbst_2 = "7c00006c-RR",
  575. lwzux_3 = "7c00006eRR0R",
  576. cntlzd_2 = "7c000074RR~",
  577. andc_3 = "7c000078RR~R.",
  578. td_3 = "7c000088ARR",
  579. lvewx_3 = "7c00008eVRR",
  580. mulhd_3 = "7c000092RRR.",
  581. addg6s_3 = "7c000094RRR",
  582. mulhw_3 = "7c000096RRR.",
  583. dlmzb_3 = "7c00009cRR~R.",
  584. ldarx_3 = "7c0000a8RR0R",
  585. dcbf_2 = "7c0000ac-RR",
  586. lbzx_3 = "7c0000aeRR0R",
  587. lvx_3 = "7c0000ceVRR",
  588. neg_2 = "7c0000d0RR.",
  589. lharx_3 = "7c0000e8RR0R",
  590. lbzux_3 = "7c0000eeRR0R",
  591. popcntb_2 = "7c0000f4RR~",
  592. not_2 = "7c0000f8RR~%.",
  593. nor_3 = "7c0000f8RR~R.",
  594. stvebx_3 = "7c00010eVRR",
  595. subfe_3 = "7c000110RRR.",
  596. sube_3 = "7c000110RRR~.",
  597. adde_3 = "7c000114RRR.",
  598. stdx_3 = "7c00012aRR0R",
  599. ["stwcx._3"] = "7c00012dRR0R.",
  600. stwx_3 = "7c00012eRR0R",
  601. prtyw_2 = "7c000134RR~",
  602. stvehx_3 = "7c00014eVRR",
  603. stdux_3 = "7c00016aRR0R",
  604. ["stqcx._3"] = "7c00016dR:R0R.",
  605. stwux_3 = "7c00016eRR0R",
  606. prtyd_2 = "7c000174RR~",
  607. stvewx_3 = "7c00018eVRR",
  608. subfze_2 = "7c000190RR.",
  609. addze_2 = "7c000194RR.",
  610. ["stdcx._3"] = "7c0001adRR0R.",
  611. stbx_3 = "7c0001aeRR0R",
  612. stvx_3 = "7c0001ceVRR",
  613. subfme_2 = "7c0001d0RR.",
  614. mulld_3 = "7c0001d2RRR.",
  615. addme_2 = "7c0001d4RR.",
  616. mullw_3 = "7c0001d6RRR.",
  617. dcbtst_2 = "7c0001ec-RR",
  618. stbux_3 = "7c0001eeRR0R",
  619. bpermd_3 = "7c0001f8RR~R",
  620. lvepxl_3 = "7c00020eVRR",
  621. add_3 = "7c000214RRR.",
  622. lqarx_3 = "7c000228R:R0R",
  623. dcbt_2 = "7c00022c-RR",
  624. lhzx_3 = "7c00022eRR0R",
  625. cdtbcd_2 = "7c000234RR~",
  626. eqv_3 = "7c000238RR~R.",
  627. lvepx_3 = "7c00024eVRR",
  628. eciwx_3 = "7c00026cRR0R",
  629. lhzux_3 = "7c00026eRR0R",
  630. cbcdtd_2 = "7c000274RR~",
  631. xor_3 = "7c000278RR~R.",
  632. mfspefscr_1 = "7c0082a6R",
  633. mfxer_1 = "7c0102a6R",
  634. mflr_1 = "7c0802a6R",
  635. mfctr_1 = "7c0902a6R",
  636. lwax_3 = "7c0002aaRR0R",
  637. lhax_3 = "7c0002aeRR0R",
  638. mftb_1 = "7c0c42e6R",
  639. mftbu_1 = "7c0d42e6R",
  640. lvxl_3 = "7c0002ceVRR",
  641. lwaux_3 = "7c0002eaRR0R",
  642. lhaux_3 = "7c0002eeRR0R",
  643. popcntw_2 = "7c0002f4RR~",
  644. divdeu_3 = "7c000312RRR.",
  645. divweu_3 = "7c000316RRR.",
  646. sthx_3 = "7c00032eRR0R",
  647. orc_3 = "7c000338RR~R.",
  648. ecowx_3 = "7c00036cRR0R",
  649. sthux_3 = "7c00036eRR0R",
  650. or_3 = "7c000378RR~R.",
  651. mr_2 = "7c000378RR~%.",
  652. divdu_3 = "7c000392RRR.",
  653. divwu_3 = "7c000396RRR.",
  654. mtspefscr_1 = "7c0083a6R",
  655. mtxer_1 = "7c0103a6R",
  656. mtlr_1 = "7c0803a6R",
  657. mtctr_1 = "7c0903a6R",
  658. dcbi_2 = "7c0003ac-RR",
  659. nand_3 = "7c0003b8RR~R.",
  660. dsn_2 = "7c0003c6-RR",
  661. stvxl_3 = "7c0003ceVRR",
  662. divd_3 = "7c0003d2RRR.",
  663. divw_3 = "7c0003d6RRR.",
  664. popcntd_2 = "7c0003f4RR~",
  665. cmpb_3 = "7c0003f8RR~R.",
  666. mcrxr_1 = "7c000400X",
  667. lbdx_3 = "7c000406RRR",
  668. subfco_3 = "7c000410RRR.",
  669. subco_3 = "7c000410RRR~.",
  670. addco_3 = "7c000414RRR.",
  671. ldbrx_3 = "7c000428RR0R",
  672. lswx_3 = "7c00042aRR0R",
  673. lwbrx_3 = "7c00042cRR0R",
  674. lfsx_3 = "7c00042eFR0R",
  675. srw_3 = "7c000430RR~R.",
  676. srd_3 = "7c000436RR~R.",
  677. lhdx_3 = "7c000446RRR",
  678. subfo_3 = "7c000450RRR.",
  679. subo_3 = "7c000450RRR~.",
  680. lfsux_3 = "7c00046eFR0R",
  681. lwdx_3 = "7c000486RRR",
  682. lswi_3 = "7c0004aaRR0A",
  683. sync_0 = "7c0004ac",
  684. lwsync_0 = "7c2004ac",
  685. ptesync_0 = "7c4004ac",
  686. lfdx_3 = "7c0004aeFR0R",
  687. lddx_3 = "7c0004c6RRR",
  688. nego_2 = "7c0004d0RR.",
  689. lfdux_3 = "7c0004eeFR0R",
  690. stbdx_3 = "7c000506RRR",
  691. subfeo_3 = "7c000510RRR.",
  692. subeo_3 = "7c000510RRR~.",
  693. addeo_3 = "7c000514RRR.",
  694. stdbrx_3 = "7c000528RR0R",
  695. stswx_3 = "7c00052aRR0R",
  696. stwbrx_3 = "7c00052cRR0R",
  697. stfsx_3 = "7c00052eFR0R",
  698. sthdx_3 = "7c000546RRR",
  699. ["stbcx._3"] = "7c00056dRRR",
  700. stfsux_3 = "7c00056eFR0R",
  701. stwdx_3 = "7c000586RRR",
  702. subfzeo_2 = "7c000590RR.",
  703. addzeo_2 = "7c000594RR.",
  704. stswi_3 = "7c0005aaRR0A",
  705. ["sthcx._3"] = "7c0005adRRR",
  706. stfdx_3 = "7c0005aeFR0R",
  707. stddx_3 = "7c0005c6RRR",
  708. subfmeo_2 = "7c0005d0RR.",
  709. mulldo_3 = "7c0005d2RRR.",
  710. addmeo_2 = "7c0005d4RR.",
  711. mullwo_3 = "7c0005d6RRR.",
  712. dcba_2 = "7c0005ec-RR",
  713. stfdux_3 = "7c0005eeFR0R",
  714. stvepxl_3 = "7c00060eVRR",
  715. addo_3 = "7c000614RRR.",
  716. lhbrx_3 = "7c00062cRR0R",
  717. lfdpx_3 = "7c00062eF:RR",
  718. sraw_3 = "7c000630RR~R.",
  719. srad_3 = "7c000634RR~R.",
  720. lfddx_3 = "7c000646FRR",
  721. stvepx_3 = "7c00064eVRR",
  722. srawi_3 = "7c000670RR~A.",
  723. sradi_3 = "7c000674RR~H.",
  724. eieio_0 = "7c0006ac",
  725. lfiwax_3 = "7c0006aeFR0R",
  726. divdeuo_3 = "7c000712RRR.",
  727. divweuo_3 = "7c000716RRR.",
  728. sthbrx_3 = "7c00072cRR0R",
  729. stfdpx_3 = "7c00072eF:RR",
  730. extsh_2 = "7c000734RR~.",
  731. stfddx_3 = "7c000746FRR",
  732. divdeo_3 = "7c000752RRR.",
  733. divweo_3 = "7c000756RRR.",
  734. extsb_2 = "7c000774RR~.",
  735. divduo_3 = "7c000792RRR.",
  736. divwou_3 = "7c000796RRR.",
  737. icbi_2 = "7c0007ac-RR",
  738. stfiwx_3 = "7c0007aeFR0R",
  739. extsw_2 = "7c0007b4RR~.",
  740. divdo_3 = "7c0007d2RRR.",
  741. divwo_3 = "7c0007d6RRR.",
  742. dcbz_2 = "7c0007ec-RR",
  743. ["tbegin._1"] = "7c00051d1",
  744. ["tbegin._0"] = "7c00051d",
  745. ["tend._1"] = "7c00055dY",
  746. ["tend._0"] = "7c00055d",
  747. ["tendall._0"] = "7e00055d",
  748. tcheck_1 = "7c00059cX",
  749. ["tsr._1"] = "7c0005dd1",
  750. ["tsuspend._0"] = "7c0005dd",
  751. ["tresume._0"] = "7c2005dd",
  752. ["tabortwc._3"] = "7c00061dARR",
  753. ["tabortdc._3"] = "7c00065dARR",
  754. ["tabortwci._3"] = "7c00069dARS",
  755. ["tabortdci._3"] = "7c0006ddARS",
  756. ["tabort._1"] = "7c00071d-R-",
  757. ["treclaim._1"] = "7c00075d-R",
  758. ["trechkpt._0"] = "7c0007dd",
  759. lxsiwzx_3 = "7c000018QRR",
  760. lxsiwax_3 = "7c000098QRR",
  761. mfvsrd_2 = "7c000066-Rq",
  762. mfvsrwz_2 = "7c0000e6-Rq",
  763. stxsiwx_3 = "7c000118QRR",
  764. mtvsrd_2 = "7c000166QR",
  765. mtvsrwa_2 = "7c0001a6QR",
  766. lxvdsx_3 = "7c000298QRR",
  767. lxsspx_3 = "7c000418QRR",
  768. lxsdx_3 = "7c000498QRR",
  769. stxsspx_3 = "7c000518QRR",
  770. stxsdx_3 = "7c000598QRR",
  771. lxvw4x_3 = "7c000618QRR",
  772. lxvd2x_3 = "7c000698QRR",
  773. stxvw4x_3 = "7c000718QRR",
  774. stxvd2x_3 = "7c000798QRR",
  775. -- Primary opcode 30:
  776. rldicl_4 = "78000000RR~HM.",
  777. rldicr_4 = "78000004RR~HM.",
  778. rldic_4 = "78000008RR~HM.",
  779. rldimi_4 = "7800000cRR~HM.",
  780. rldcl_4 = "78000010RR~RM.",
  781. rldcr_4 = "78000012RR~RM.",
  782. rotldi_3 = op_alias("rldicl_4", function(p)
  783. p[4] = "0"
  784. end),
  785. rotrdi_3 = op_alias("rldicl_4", function(p)
  786. p[3] = "64-("..p[3]..")"; p[4] = "0"
  787. end),
  788. rotld_3 = op_alias("rldcl_4", function(p)
  789. p[4] = "0"
  790. end),
  791. sldi_3 = op_alias("rldicr_4", function(p)
  792. p[4] = "63-("..p[3]..")"
  793. end),
  794. srdi_3 = op_alias("rldicl_4", function(p)
  795. p[4] = p[3]; p[3] = "64-("..p[3]..")"
  796. end),
  797. clrldi_3 = op_alias("rldicl_4", function(p)
  798. p[4] = p[3]; p[3] = "0"
  799. end),
  800. clrrdi_3 = op_alias("rldicr_4", function(p)
  801. p[4] = "63-("..p[3]..")"; p[3] = "0"
  802. end),
  803. -- Primary opcode 56:
  804. lq_2 = "e0000000R:D", -- NYI: displacement must be divisible by 8.
  805. -- Primary opcode 57:
  806. lfdp_2 = "e4000000F:D", -- NYI: displacement must be divisible by 4.
  807. -- Primary opcode 59:
  808. fdivs_3 = "ec000024FFF.",
  809. fsubs_3 = "ec000028FFF.",
  810. fadds_3 = "ec00002aFFF.",
  811. fsqrts_2 = "ec00002cF-F.",
  812. fres_2 = "ec000030F-F.",
  813. fmuls_3 = "ec000032FF-F.",
  814. frsqrtes_2 = "ec000034F-F.",
  815. fmsubs_4 = "ec000038FFFF~.",
  816. fmadds_4 = "ec00003aFFFF~.",
  817. fnmsubs_4 = "ec00003cFFFF~.",
  818. fnmadds_4 = "ec00003eFFFF~.",
  819. fcfids_2 = "ec00069cF-F.",
  820. fcfidus_2 = "ec00079cF-F.",
  821. dadd_3 = "ec000004FFF.",
  822. dqua_4 = "ec000006FFFZ.",
  823. dmul_3 = "ec000044FFF.",
  824. drrnd_4 = "ec000046FFFZ.",
  825. dscli_3 = "ec000084FF6.",
  826. dquai_4 = "ec000086SF~FZ.",
  827. dscri_3 = "ec0000c4FF6.",
  828. drintx_4 = "ec0000c61F~FZ.",
  829. dcmpo_3 = "ec000104XFF",
  830. dtstex_3 = "ec000144XFF",
  831. dtstdc_3 = "ec000184XF6",
  832. dtstdg_3 = "ec0001c4XF6",
  833. drintn_4 = "ec0001c61F~FZ.",
  834. dctdp_2 = "ec000204F-F.",
  835. dctfix_2 = "ec000244F-F.",
  836. ddedpd_3 = "ec000284ZF~F.",
  837. dxex_2 = "ec0002c4F-F.",
  838. dsub_3 = "ec000404FFF.",
  839. ddiv_3 = "ec000444FFF.",
  840. dcmpu_3 = "ec000504XFF",
  841. dtstsf_3 = "ec000544XFF",
  842. drsp_2 = "ec000604F-F.",
  843. dcffix_2 = "ec000644F-F.",
  844. denbcd_3 = "ec000684YF~F.",
  845. diex_3 = "ec0006c4FFF.",
  846. -- Primary opcode 60:
  847. xsaddsp_3 = "f0000000QQQ",
  848. xsmaddasp_3 = "f0000008QQQ",
  849. xxsldwi_4 = "f0000010QQQz",
  850. xsrsqrtesp_2 = "f0000028Q-Q",
  851. xssqrtsp_2 = "f000002cQ-Q",
  852. xxsel_4 = "f0000030QQQQ",
  853. xssubsp_3 = "f0000040QQQ",
  854. xsmaddmsp_3 = "f0000048QQQ",
  855. xxpermdi_4 = "f0000050QQQz",
  856. xsresp_2 = "f0000068Q-Q",
  857. xsmulsp_3 = "f0000080QQQ",
  858. xsmsubasp_3 = "f0000088QQQ",
  859. xxmrghw_3 = "f0000090QQQ",
  860. xsdivsp_3 = "f00000c0QQQ",
  861. xsmsubmsp_3 = "f00000c8QQQ",
  862. xsadddp_3 = "f0000100QQQ",
  863. xsmaddadp_3 = "f0000108QQQ",
  864. xscmpudp_3 = "f0000118XQQ",
  865. xscvdpuxws_2 = "f0000120Q-Q",
  866. xsrdpi_2 = "f0000124Q-Q",
  867. xsrsqrtedp_2 = "f0000128Q-Q",
  868. xssqrtdp_2 = "f000012cQ-Q",
  869. xssubdp_3 = "f0000140QQQ",
  870. xsmaddmdp_3 = "f0000148QQQ",
  871. xscmpodp_3 = "f0000158XQQ",
  872. xscvdpsxws_2 = "f0000160Q-Q",
  873. xsrdpiz_2 = "f0000164Q-Q",
  874. xsredp_2 = "f0000168Q-Q",
  875. xsmuldp_3 = "f0000180QQQ",
  876. xsmsubadp_3 = "f0000188QQQ",
  877. xxmrglw_3 = "f0000190QQQ",
  878. xsrdpip_2 = "f00001a4Q-Q",
  879. xstsqrtdp_2 = "f00001a8X-Q",
  880. xsrdpic_2 = "f00001acQ-Q",
  881. xsdivdp_3 = "f00001c0QQQ",
  882. xsmsubmdp_3 = "f00001c8QQQ",
  883. xsrdpim_2 = "f00001e4Q-Q",
  884. xstdivdp_3 = "f00001e8XQQ",
  885. xvaddsp_3 = "f0000200QQQ",
  886. xvmaddasp_3 = "f0000208QQQ",
  887. xvcmpeqsp_3 = "f0000218QQQ",
  888. xvcvspuxws_2 = "f0000220Q-Q",
  889. xvrspi_2 = "f0000224Q-Q",
  890. xvrsqrtesp_2 = "f0000228Q-Q",
  891. xvsqrtsp_2 = "f000022cQ-Q",
  892. xvsubsp_3 = "f0000240QQQ",
  893. xvmaddmsp_3 = "f0000248QQQ",
  894. xvcmpgtsp_3 = "f0000258QQQ",
  895. xvcvspsxws_2 = "f0000260Q-Q",
  896. xvrspiz_2 = "f0000264Q-Q",
  897. xvresp_2 = "f0000268Q-Q",
  898. xvmulsp_3 = "f0000280QQQ",
  899. xvmsubasp_3 = "f0000288QQQ",
  900. xxspltw_3 = "f0000290QQg~",
  901. xvcmpgesp_3 = "f0000298QQQ",
  902. xvcvuxwsp_2 = "f00002a0Q-Q",
  903. xvrspip_2 = "f00002a4Q-Q",
  904. xvtsqrtsp_2 = "f00002a8X-Q",
  905. xvrspic_2 = "f00002acQ-Q",
  906. xvdivsp_3 = "f00002c0QQQ",
  907. xvmsubmsp_3 = "f00002c8QQQ",
  908. xvcvsxwsp_2 = "f00002e0Q-Q",
  909. xvrspim_2 = "f00002e4Q-Q",
  910. xvtdivsp_3 = "f00002e8XQQ",
  911. xvadddp_3 = "f0000300QQQ",
  912. xvmaddadp_3 = "f0000308QQQ",
  913. xvcmpeqdp_3 = "f0000318QQQ",
  914. xvcvdpuxws_2 = "f0000320Q-Q",
  915. xvrdpi_2 = "f0000324Q-Q",
  916. xvrsqrtedp_2 = "f0000328Q-Q",
  917. xvsqrtdp_2 = "f000032cQ-Q",
  918. xvsubdp_3 = "f0000340QQQ",
  919. xvmaddmdp_3 = "f0000348QQQ",
  920. xvcmpgtdp_3 = "f0000358QQQ",
  921. xvcvdpsxws_2 = "f0000360Q-Q",
  922. xvrdpiz_2 = "f0000364Q-Q",
  923. xvredp_2 = "f0000368Q-Q",
  924. xvmuldp_3 = "f0000380QQQ",
  925. xvmsubadp_3 = "f0000388QQQ",
  926. xvcmpgedp_3 = "f0000398QQQ",
  927. xvcvuxwdp_2 = "f00003a0Q-Q",
  928. xvrdpip_2 = "f00003a4Q-Q",
  929. xvtsqrtdp_2 = "f00003a8X-Q",
  930. xvrdpic_2 = "f00003acQ-Q",
  931. xvdivdp_3 = "f00003c0QQQ",
  932. xvmsubmdp_3 = "f00003c8QQQ",
  933. xvcvsxwdp_2 = "f00003e0Q-Q",
  934. xvrdpim_2 = "f00003e4Q-Q",
  935. xvtdivdp_3 = "f00003e8XQQ",
  936. xsnmaddasp_3 = "f0000408QQQ",
  937. xxland_3 = "f0000410QQQ",
  938. xscvdpsp_2 = "f0000424Q-Q",
  939. xscvdpspn_2 = "f000042cQ-Q",
  940. xsnmaddmsp_3 = "f0000448QQQ",
  941. xxlandc_3 = "f0000450QQQ",
  942. xsrsp_2 = "f0000464Q-Q",
  943. xsnmsubasp_3 = "f0000488QQQ",
  944. xxlor_3 = "f0000490QQQ",
  945. xscvuxdsp_2 = "f00004a0Q-Q",
  946. xsnmsubmsp_3 = "f00004c8QQQ",
  947. xxlxor_3 = "f00004d0QQQ",
  948. xscvsxdsp_2 = "f00004e0Q-Q",
  949. xsmaxdp_3 = "f0000500QQQ",
  950. xsnmaddadp_3 = "f0000508QQQ",
  951. xxlnor_3 = "f0000510QQQ",
  952. xscvdpuxds_2 = "f0000520Q-Q",
  953. xscvspdp_2 = "f0000524Q-Q",
  954. xscvspdpn_2 = "f000052cQ-Q",
  955. xsmindp_3 = "f0000540QQQ",
  956. xsnmaddmdp_3 = "f0000548QQQ",
  957. xxlorc_3 = "f0000550QQQ",
  958. xscvdpsxds_2 = "f0000560Q-Q",
  959. xsabsdp_2 = "f0000564Q-Q",
  960. xscpsgndp_3 = "f0000580QQQ",
  961. xsnmsubadp_3 = "f0000588QQQ",
  962. xxlnand_3 = "f0000590QQQ",
  963. xscvuxddp_2 = "f00005a0Q-Q",
  964. xsnabsdp_2 = "f00005a4Q-Q",
  965. xsnmsubmdp_3 = "f00005c8QQQ",
  966. xxleqv_3 = "f00005d0QQQ",
  967. xscvsxddp_2 = "f00005e0Q-Q",
  968. xsnegdp_2 = "f00005e4Q-Q",
  969. xvmaxsp_3 = "f0000600QQQ",
  970. xvnmaddasp_3 = "f0000608QQQ",
  971. ["xvcmpeqsp._3"] = "f0000618QQQ",
  972. xvcvspuxds_2 = "f0000620Q-Q",
  973. xvcvdpsp_2 = "f0000624Q-Q",
  974. xvminsp_3 = "f0000640QQQ",
  975. xvnmaddmsp_3 = "f0000648QQQ",
  976. ["xvcmpgtsp._3"] = "f0000658QQQ",
  977. xvcvspsxds_2 = "f0000660Q-Q",
  978. xvabssp_2 = "f0000664Q-Q",
  979. xvcpsgnsp_3 = "f0000680QQQ",
  980. xvnmsubasp_3 = "f0000688QQQ",
  981. ["xvcmpgesp._3"] = "f0000698QQQ",
  982. xvcvuxdsp_2 = "f00006a0Q-Q",
  983. xvnabssp_2 = "f00006a4Q-Q",
  984. xvnmsubmsp_3 = "f00006c8QQQ",
  985. xvcvsxdsp_2 = "f00006e0Q-Q",
  986. xvnegsp_2 = "f00006e4Q-Q",
  987. xvmaxdp_3 = "f0000700QQQ",
  988. xvnmaddadp_3 = "f0000708QQQ",
  989. ["xvcmpeqdp._3"] = "f0000718QQQ",
  990. xvcvdpuxds_2 = "f0000720Q-Q",
  991. xvcvspdp_2 = "f0000724Q-Q",
  992. xvmindp_3 = "f0000740QQQ",
  993. xvnmaddmdp_3 = "f0000748QQQ",
  994. ["xvcmpgtdp._3"] = "f0000758QQQ",
  995. xvcvdpsxds_2 = "f0000760Q-Q",
  996. xvabsdp_2 = "f0000764Q-Q",
  997. xvcpsgndp_3 = "f0000780QQQ",
  998. xvnmsubadp_3 = "f0000788QQQ",
  999. ["xvcmpgedp._3"] = "f0000798QQQ",
  1000. xvcvuxddp_2 = "f00007a0Q-Q",
  1001. xvnabsdp_2 = "f00007a4Q-Q",
  1002. xvnmsubmdp_3 = "f00007c8QQQ",
  1003. xvcvsxddp_2 = "f00007e0Q-Q",
  1004. xvnegdp_2 = "f00007e4Q-Q",
  1005. -- Primary opcode 61:
  1006. stfdp_2 = "f4000000F:D", -- NYI: displacement must be divisible by 4.
  1007. -- Primary opcode 62:
  1008. stq_2 = "f8000002R:D", -- NYI: displacement must be divisible by 8.
  1009. -- Primary opcode 63:
  1010. fdiv_3 = "fc000024FFF.",
  1011. fsub_3 = "fc000028FFF.",
  1012. fadd_3 = "fc00002aFFF.",
  1013. fsqrt_2 = "fc00002cF-F.",
  1014. fsel_4 = "fc00002eFFFF~.",
  1015. fre_2 = "fc000030F-F.",
  1016. fmul_3 = "fc000032FF-F.",
  1017. frsqrte_2 = "fc000034F-F.",
  1018. fmsub_4 = "fc000038FFFF~.",
  1019. fmadd_4 = "fc00003aFFFF~.",
  1020. fnmsub_4 = "fc00003cFFFF~.",
  1021. fnmadd_4 = "fc00003eFFFF~.",
  1022. fcmpu_3 = "fc000000XFF",
  1023. fcpsgn_3 = "fc000010FFF.",
  1024. fcmpo_3 = "fc000040XFF",
  1025. mtfsb1_1 = "fc00004cA",
  1026. fneg_2 = "fc000050F-F.",
  1027. mcrfs_2 = "fc000080XX",
  1028. mtfsb0_1 = "fc00008cA",
  1029. fmr_2 = "fc000090F-F.",
  1030. frsp_2 = "fc000018F-F.",
  1031. fctiw_2 = "fc00001cF-F.",
  1032. fctiwz_2 = "fc00001eF-F.",
  1033. ftdiv_2 = "fc000100X-F.",
  1034. fctiwu_2 = "fc00011cF-F.",
  1035. fctiwuz_2 = "fc00011eF-F.",
  1036. mtfsfi_2 = "fc00010cAA", -- NYI: upshift.
  1037. fnabs_2 = "fc000110F-F.",
  1038. ftsqrt_2 = "fc000140X-F.",
  1039. fabs_2 = "fc000210F-F.",
  1040. frin_2 = "fc000310F-F.",
  1041. friz_2 = "fc000350F-F.",
  1042. frip_2 = "fc000390F-F.",
  1043. frim_2 = "fc0003d0F-F.",
  1044. mffs_1 = "fc00048eF.",
  1045. -- NYI: mtfsf, mtfsb0, mtfsb1.
  1046. fctid_2 = "fc00065cF-F.",
  1047. fctidz_2 = "fc00065eF-F.",
  1048. fmrgow_3 = "fc00068cFFF",
  1049. fcfid_2 = "fc00069cF-F.",
  1050. fctidu_2 = "fc00075cF-F.",
  1051. fctiduz_2 = "fc00075eF-F.",
  1052. fmrgew_3 = "fc00078cFFF",
  1053. fcfidu_2 = "fc00079cF-F.",
  1054. daddq_3 = "fc000004F:F:F:.",
  1055. dquaq_4 = "fc000006F:F:F:Z.",
  1056. dmulq_3 = "fc000044F:F:F:.",
  1057. drrndq_4 = "fc000046F:F:F:Z.",
  1058. dscliq_3 = "fc000084F:F:6.",
  1059. dquaiq_4 = "fc000086SF:~F:Z.",
  1060. dscriq_3 = "fc0000c4F:F:6.",
  1061. drintxq_4 = "fc0000c61F:~F:Z.",
  1062. dcmpoq_3 = "fc000104XF:F:",
  1063. dtstexq_3 = "fc000144XF:F:",
  1064. dtstdcq_3 = "fc000184XF:6",
  1065. dtstdgq_3 = "fc0001c4XF:6",
  1066. drintnq_4 = "fc0001c61F:~F:Z.",
  1067. dctqpq_2 = "fc000204F:-F:.",
  1068. dctfixq_2 = "fc000244F:-F:.",
  1069. ddedpdq_3 = "fc000284ZF:~F:.",
  1070. dxexq_2 = "fc0002c4F:-F:.",
  1071. dsubq_3 = "fc000404F:F:F:.",
  1072. ddivq_3 = "fc000444F:F:F:.",
  1073. dcmpuq_3 = "fc000504XF:F:",
  1074. dtstsfq_3 = "fc000544XF:F:",
  1075. drdpq_2 = "fc000604F:-F:.",
  1076. dcffixq_2 = "fc000644F:-F:.",
  1077. denbcdq_3 = "fc000684YF:~F:.",
  1078. diexq_3 = "fc0006c4F:FF:.",
  1079. -- Primary opcode 4, SPE APU extension:
  1080. evaddw_3 = "10000200RRR",
  1081. evaddiw_3 = "10000202RAR~",
  1082. evsubw_3 = "10000204RRR~",
  1083. evsubiw_3 = "10000206RAR~",
  1084. evabs_2 = "10000208RR",
  1085. evneg_2 = "10000209RR",
  1086. evextsb_2 = "1000020aRR",
  1087. evextsh_2 = "1000020bRR",
  1088. evrndw_2 = "1000020cRR",
  1089. evcntlzw_2 = "1000020dRR",
  1090. evcntlsw_2 = "1000020eRR",
  1091. brinc_3 = "1000020fRRR",
  1092. evand_3 = "10000211RRR",
  1093. evandc_3 = "10000212RRR",
  1094. evxor_3 = "10000216RRR",
  1095. evor_3 = "10000217RRR",
  1096. evmr_2 = "10000217RR=",
  1097. evnor_3 = "10000218RRR",
  1098. evnot_2 = "10000218RR=",
  1099. eveqv_3 = "10000219RRR",
  1100. evorc_3 = "1000021bRRR",
  1101. evnand_3 = "1000021eRRR",
  1102. evsrwu_3 = "10000220RRR",
  1103. evsrws_3 = "10000221RRR",
  1104. evsrwiu_3 = "10000222RRA",
  1105. evsrwis_3 = "10000223RRA",
  1106. evslw_3 = "10000224RRR",
  1107. evslwi_3 = "10000226RRA",
  1108. evrlw_3 = "10000228RRR",
  1109. evsplati_2 = "10000229RS",
  1110. evrlwi_3 = "1000022aRRA",
  1111. evsplatfi_2 = "1000022bRS",
  1112. evmergehi_3 = "1000022cRRR",
  1113. evmergelo_3 = "1000022dRRR",
  1114. evcmpgtu_3 = "10000230XRR",
  1115. evcmpgtu_2 = "10000230-RR",
  1116. evcmpgts_3 = "10000231XRR",
  1117. evcmpgts_2 = "10000231-RR",
  1118. evcmpltu_3 = "10000232XRR",
  1119. evcmpltu_2 = "10000232-RR",
  1120. evcmplts_3 = "10000233XRR",
  1121. evcmplts_2 = "10000233-RR",
  1122. evcmpeq_3 = "10000234XRR",
  1123. evcmpeq_2 = "10000234-RR",
  1124. evsel_4 = "10000278RRRW",
  1125. evsel_3 = "10000278RRR",
  1126. evfsadd_3 = "10000280RRR",
  1127. evfssub_3 = "10000281RRR",
  1128. evfsabs_2 = "10000284RR",
  1129. evfsnabs_2 = "10000285RR",
  1130. evfsneg_2 = "10000286RR",
  1131. evfsmul_3 = "10000288RRR",
  1132. evfsdiv_3 = "10000289RRR",
  1133. evfscmpgt_3 = "1000028cXRR",
  1134. evfscmpgt_2 = "1000028c-RR",
  1135. evfscmplt_3 = "1000028dXRR",
  1136. evfscmplt_2 = "1000028d-RR",
  1137. evfscmpeq_3 = "1000028eXRR",
  1138. evfscmpeq_2 = "1000028e-RR",
  1139. evfscfui_2 = "10000290R-R",
  1140. evfscfsi_2 = "10000291R-R",
  1141. evfscfuf_2 = "10000292R-R",
  1142. evfscfsf_2 = "10000293R-R",
  1143. evfsctui_2 = "10000294R-R",
  1144. evfsctsi_2 = "10000295R-R",
  1145. evfsctuf_2 = "10000296R-R",
  1146. evfsctsf_2 = "10000297R-R",
  1147. evfsctuiz_2 = "10000298R-R",
  1148. evfsctsiz_2 = "1000029aR-R",
  1149. evfststgt_3 = "1000029cXRR",
  1150. evfststgt_2 = "1000029c-RR",
  1151. evfststlt_3 = "1000029dXRR",
  1152. evfststlt_2 = "1000029d-RR",
  1153. evfststeq_3 = "1000029eXRR",
  1154. evfststeq_2 = "1000029e-RR",
  1155. efsadd_3 = "100002c0RRR",
  1156. efssub_3 = "100002c1RRR",
  1157. efsabs_2 = "100002c4RR",
  1158. efsnabs_2 = "100002c5RR",
  1159. efsneg_2 = "100002c6RR",
  1160. efsmul_3 = "100002c8RRR",
  1161. efsdiv_3 = "100002c9RRR",
  1162. efscmpgt_3 = "100002ccXRR",
  1163. efscmpgt_2 = "100002cc-RR",
  1164. efscmplt_3 = "100002cdXRR",
  1165. efscmplt_2 = "100002cd-RR",
  1166. efscmpeq_3 = "100002ceXRR",
  1167. efscmpeq_2 = "100002ce-RR",
  1168. efscfd_2 = "100002cfR-R",
  1169. efscfui_2 = "100002d0R-R",
  1170. efscfsi_2 = "100002d1R-R",
  1171. efscfuf_2 = "100002d2R-R",
  1172. efscfsf_2 = "100002d3R-R",
  1173. efsctui_2 = "100002d4R-R",
  1174. efsctsi_2 = "100002d5R-R",
  1175. efsctuf_2 = "100002d6R-R",
  1176. efsctsf_2 = "100002d7R-R",
  1177. efsctuiz_2 = "100002d8R-R",
  1178. efsctsiz_2 = "100002daR-R",
  1179. efststgt_3 = "100002dcXRR",
  1180. efststgt_2 = "100002dc-RR",
  1181. efststlt_3 = "100002ddXRR",
  1182. efststlt_2 = "100002dd-RR",
  1183. efststeq_3 = "100002deXRR",
  1184. efststeq_2 = "100002de-RR",
  1185. efdadd_3 = "100002e0RRR",
  1186. efdsub_3 = "100002e1RRR",
  1187. efdcfuid_2 = "100002e2R-R",
  1188. efdcfsid_2 = "100002e3R-R",
  1189. efdabs_2 = "100002e4RR",
  1190. efdnabs_2 = "100002e5RR",
  1191. efdneg_2 = "100002e6RR",
  1192. efdmul_3 = "100002e8RRR",
  1193. efddiv_3 = "100002e9RRR",
  1194. efdctuidz_2 = "100002eaR-R",
  1195. efdctsidz_2 = "100002ebR-R",
  1196. efdcmpgt_3 = "100002ecXRR",
  1197. efdcmpgt_2 = "100002ec-RR",
  1198. efdcmplt_3 = "100002edXRR",
  1199. efdcmplt_2 = "100002ed-RR",
  1200. efdcmpeq_3 = "100002eeXRR",
  1201. efdcmpeq_2 = "100002ee-RR",
  1202. efdcfs_2 = "100002efR-R",
  1203. efdcfui_2 = "100002f0R-R",
  1204. efdcfsi_2 = "100002f1R-R",
  1205. efdcfuf_2 = "100002f2R-R",
  1206. efdcfsf_2 = "100002f3R-R",
  1207. efdctui_2 = "100002f4R-R",
  1208. efdctsi_2 = "100002f5R-R",
  1209. efdctuf_2 = "100002f6R-R",
  1210. efdctsf_2 = "100002f7R-R",
  1211. efdctuiz_2 = "100002f8R-R",
  1212. efdctsiz_2 = "100002faR-R",
  1213. efdtstgt_3 = "100002fcXRR",
  1214. efdtstgt_2 = "100002fc-RR",
  1215. efdtstlt_3 = "100002fdXRR",
  1216. efdtstlt_2 = "100002fd-RR",
  1217. efdtsteq_3 = "100002feXRR",
  1218. efdtsteq_2 = "100002fe-RR",
  1219. evlddx_3 = "10000300RR0R",
  1220. evldd_2 = "10000301R8",
  1221. evldwx_3 = "10000302RR0R",
  1222. evldw_2 = "10000303R8",
  1223. evldhx_3 = "10000304RR0R",
  1224. evldh_2 = "10000305R8",
  1225. evlwhex_3 = "10000310RR0R",
  1226. evlwhe_2 = "10000311R4",
  1227. evlwhoux_3 = "10000314RR0R",
  1228. evlwhou_2 = "10000315R4",
  1229. evlwhosx_3 = "10000316RR0R",
  1230. evlwhos_2 = "10000317R4",
  1231. evstddx_3 = "10000320RR0R",
  1232. evstdd_2 = "10000321R8",
  1233. evstdwx_3 = "10000322RR0R",
  1234. evstdw_2 = "10000323R8",
  1235. evstdhx_3 = "10000324RR0R",
  1236. evstdh_2 = "10000325R8",
  1237. evstwhex_3 = "10000330RR0R",
  1238. evstwhe_2 = "10000331R4",
  1239. evstwhox_3 = "10000334RR0R",
  1240. evstwho_2 = "10000335R4",
  1241. evstwwex_3 = "10000338RR0R",
  1242. evstwwe_2 = "10000339R4",
  1243. evstwwox_3 = "1000033cRR0R",
  1244. evstwwo_2 = "1000033dR4",
  1245. evmhessf_3 = "10000403RRR",
  1246. evmhossf_3 = "10000407RRR",
  1247. evmheumi_3 = "10000408RRR",
  1248. evmhesmi_3 = "10000409RRR",
  1249. evmhesmf_3 = "1000040bRRR",
  1250. evmhoumi_3 = "1000040cRRR",
  1251. evmhosmi_3 = "1000040dRRR",
  1252. evmhosmf_3 = "1000040fRRR",
  1253. evmhessfa_3 = "10000423RRR",
  1254. evmhossfa_3 = "10000427RRR",
  1255. evmheumia_3 = "10000428RRR",
  1256. evmhesmia_3 = "10000429RRR",
  1257. evmhesmfa_3 = "1000042bRRR",
  1258. evmhoumia_3 = "1000042cRRR",
  1259. evmhosmia_3 = "1000042dRRR",
  1260. evmhosmfa_3 = "1000042fRRR",
  1261. evmwhssf_3 = "10000447RRR",
  1262. evmwlumi_3 = "10000448RRR",
  1263. evmwhumi_3 = "1000044cRRR",
  1264. evmwhsmi_3 = "1000044dRRR",
  1265. evmwhsmf_3 = "1000044fRRR",
  1266. evmwssf_3 = "10000453RRR",
  1267. evmwumi_3 = "10000458RRR",
  1268. evmwsmi_3 = "10000459RRR",
  1269. evmwsmf_3 = "1000045bRRR",
  1270. evmwhssfa_3 = "10000467RRR",
  1271. evmwlumia_3 = "10000468RRR",
  1272. evmwhumia_3 = "1000046cRRR",
  1273. evmwhsmia_3 = "1000046dRRR",
  1274. evmwhsmfa_3 = "1000046fRRR",
  1275. evmwssfa_3 = "10000473RRR",
  1276. evmwumia_3 = "10000478RRR",
  1277. evmwsmia_3 = "10000479RRR",
  1278. evmwsmfa_3 = "1000047bRRR",
  1279. evmra_2 = "100004c4RR",
  1280. evdivws_3 = "100004c6RRR",
  1281. evdivwu_3 = "100004c7RRR",
  1282. evmwssfaa_3 = "10000553RRR",
  1283. evmwumiaa_3 = "10000558RRR",
  1284. evmwsmiaa_3 = "10000559RRR",
  1285. evmwsmfaa_3 = "1000055bRRR",
  1286. evmwssfan_3 = "100005d3RRR",
  1287. evmwumian_3 = "100005d8RRR",
  1288. evmwsmian_3 = "100005d9RRR",
  1289. evmwsmfan_3 = "100005dbRRR",
  1290. evmergehilo_3 = "1000022eRRR",
  1291. evmergelohi_3 = "1000022fRRR",
  1292. evlhhesplatx_3 = "10000308RR0R",
  1293. evlhhesplat_2 = "10000309R2",
  1294. evlhhousplatx_3 = "1000030cRR0R",
  1295. evlhhousplat_2 = "1000030dR2",
  1296. evlhhossplatx_3 = "1000030eRR0R",
  1297. evlhhossplat_2 = "1000030fR2",
  1298. evlwwsplatx_3 = "10000318RR0R",
  1299. evlwwsplat_2 = "10000319R4",
  1300. evlwhsplatx_3 = "1000031cRR0R",
  1301. evlwhsplat_2 = "1000031dR4",
  1302. evaddusiaaw_2 = "100004c0RR",
  1303. evaddssiaaw_2 = "100004c1RR",
  1304. evsubfusiaaw_2 = "100004c2RR",
  1305. evsubfssiaaw_2 = "100004c3RR",
  1306. evaddumiaaw_2 = "100004c8RR",
  1307. evaddsmiaaw_2 = "100004c9RR",
  1308. evsubfumiaaw_2 = "100004caRR",
  1309. evsubfsmiaaw_2 = "100004cbRR",
  1310. evmheusiaaw_3 = "10000500RRR",
  1311. evmhessiaaw_3 = "10000501RRR",
  1312. evmhessfaaw_3 = "10000503RRR",
  1313. evmhousiaaw_3 = "10000504RRR",
  1314. evmhossiaaw_3 = "10000505RRR",
  1315. evmhossfaaw_3 = "10000507RRR",
  1316. evmheumiaaw_3 = "10000508RRR",
  1317. evmhesmiaaw_3 = "10000509RRR",
  1318. evmhesmfaaw_3 = "1000050bRRR",
  1319. evmhoumiaaw_3 = "1000050cRRR",
  1320. evmhosmiaaw_3 = "1000050dRRR",
  1321. evmhosmfaaw_3 = "1000050fRRR",
  1322. evmhegumiaa_3 = "10000528RRR",
  1323. evmhegsmiaa_3 = "10000529RRR",
  1324. evmhegsmfaa_3 = "1000052bRRR",
  1325. evmhogumiaa_3 = "1000052cRRR",
  1326. evmhogsmiaa_3 = "1000052dRRR",
  1327. evmhogsmfaa_3 = "1000052fRRR",
  1328. evmwlusiaaw_3 = "10000540RRR",
  1329. evmwlssiaaw_3 = "10000541RRR",
  1330. evmwlumiaaw_3 = "10000548RRR",
  1331. evmwlsmiaaw_3 = "10000549RRR",
  1332. evmheusianw_3 = "10000580RRR",
  1333. evmhessianw_3 = "10000581RRR",
  1334. evmhessfanw_3 = "10000583RRR",
  1335. evmhousianw_3 = "10000584RRR",
  1336. evmhossianw_3 = "10000585RRR",
  1337. evmhossfanw_3 = "10000587RRR",
  1338. evmheumianw_3 = "10000588RRR",
  1339. evmhesmianw_3 = "10000589RRR",
  1340. evmhesmfanw_3 = "1000058bRRR",
  1341. evmhoumianw_3 = "1000058cRRR",
  1342. evmhosmianw_3 = "1000058dRRR",
  1343. evmhosmfanw_3 = "1000058fRRR",
  1344. evmhegumian_3 = "100005a8RRR",
  1345. evmhegsmian_3 = "100005a9RRR",
  1346. evmhegsmfan_3 = "100005abRRR",
  1347. evmhogumian_3 = "100005acRRR",
  1348. evmhogsmian_3 = "100005adRRR",
  1349. evmhogsmfan_3 = "100005afRRR",
  1350. evmwlusianw_3 = "100005c0RRR",
  1351. evmwlssianw_3 = "100005c1RRR",
  1352. evmwlumianw_3 = "100005c8RRR",
  1353. evmwlsmianw_3 = "100005c9RRR",
  1354. -- NYI: Book E instructions.
  1355. }
  1356. -- Add mnemonics for "." variants.
  1357. do
  1358. local t = {}
  1359. for k,v in pairs(map_op) do
  1360. if type(v) == "string" and sub(v, -1) == "." then
  1361. local v2 = sub(v, 1, 7)..char(byte(v, 8)+1)..sub(v, 9, -2)
  1362. t[sub(k, 1, -3).."."..sub(k, -2)] = v2
  1363. end
  1364. end
  1365. for k,v in pairs(t) do
  1366. map_op[k] = v
  1367. end
  1368. end
  1369. -- Add more branch mnemonics.
  1370. for cond,c in pairs(map_cond) do
  1371. local b1 = "b"..cond
  1372. local c1 = shl(band(c, 3), 16) + (c < 4 and 0x01000000 or 0)
  1373. -- bX[l]
  1374. map_op[b1.."_1"] = tohex(0x40800000 + c1).."K"
  1375. map_op[b1.."y_1"] = tohex(0x40a00000 + c1).."K"
  1376. map_op[b1.."l_1"] = tohex(0x40800001 + c1).."K"
  1377. map_op[b1.."_2"] = tohex(0x40800000 + c1).."-XK"
  1378. map_op[b1.."y_2"] = tohex(0x40a00000 + c1).."-XK"
  1379. map_op[b1.."l_2"] = tohex(0x40800001 + c1).."-XK"
  1380. -- bXlr[l]
  1381. map_op[b1.."lr_0"] = tohex(0x4c800020 + c1)
  1382. map_op[b1.."lrl_0"] = tohex(0x4c800021 + c1)
  1383. map_op[b1.."ctr_0"] = tohex(0x4c800420 + c1)
  1384. map_op[b1.."ctrl_0"] = tohex(0x4c800421 + c1)
  1385. -- bXctr[l]
  1386. map_op[b1.."lr_1"] = tohex(0x4c800020 + c1).."-X"
  1387. map_op[b1.."lrl_1"] = tohex(0x4c800021 + c1).."-X"
  1388. map_op[b1.."ctr_1"] = tohex(0x4c800420 + c1).."-X"
  1389. map_op[b1.."ctrl_1"] = tohex(0x4c800421 + c1).."-X"
  1390. end
  1391. ------------------------------------------------------------------------------
  1392. local function parse_gpr(expr)
  1393. local tname, ovreg = match(expr, "^([%w_]+):(r[1-3]?[0-9])$")
  1394. local tp = map_type[tname or expr]
  1395. if tp then
  1396. local reg = ovreg or tp.reg
  1397. if not reg then
  1398. werror("type `"..(tname or expr).."' needs a register override")
  1399. end
  1400. expr = reg
  1401. end
  1402. local r = match(expr, "^r([1-3]?[0-9])$")
  1403. if r then
  1404. r = tonumber(r)
  1405. if r <= 31 then return r, tp end
  1406. end
  1407. werror("bad register name `"..expr.."'")
  1408. end
  1409. local function parse_fpr(expr)
  1410. local r = match(expr, "^f([1-3]?[0-9])$")
  1411. if r then
  1412. r = tonumber(r)
  1413. if r <= 31 then return r end
  1414. end
  1415. werror("bad register name `"..expr.."'")
  1416. end
  1417. local function parse_vr(expr)
  1418. local r = match(expr, "^v([1-3]?[0-9])$")
  1419. if r then
  1420. r = tonumber(r)
  1421. if r <= 31 then return r end
  1422. end
  1423. werror("bad register name `"..expr.."'")
  1424. end
  1425. local function parse_vs(expr)
  1426. local r = match(expr, "^vs([1-6]?[0-9])$")
  1427. if r then
  1428. r = tonumber(r)
  1429. if r <= 63 then return r end
  1430. end
  1431. werror("bad register name `"..expr.."'")
  1432. end
  1433. local function parse_cr(expr)
  1434. local r = match(expr, "^cr([0-7])$")
  1435. if r then return tonumber(r) end
  1436. werror("bad condition register name `"..expr.."'")
  1437. end
  1438. local function parse_cond(expr)
  1439. local r, cond = match(expr, "^4%*cr([0-7])%+(%w%w)$")
  1440. if r then
  1441. r = tonumber(r)
  1442. local c = map_cond[cond]
  1443. if c and c < 4 then return r*4+c end
  1444. end
  1445. werror("bad condition bit name `"..expr.."'")
  1446. end
  1447. local parse_ctx = {}
  1448. local loadenv = setfenv and function(s)
  1449. local code = loadstring(s, "")
  1450. if code then setfenv(code, parse_ctx) end
  1451. return code
  1452. end or function(s)
  1453. return load(s, "", nil, parse_ctx)
  1454. end
  1455. -- Try to parse simple arithmetic, too, since some basic ops are aliases.
  1456. local function parse_number(n)
  1457. local x = tonumber(n)
  1458. if x then return x end
  1459. local code = loadenv("return "..n)
  1460. if code then
  1461. local ok, y = pcall(code)
  1462. if ok then return y end
  1463. end
  1464. return nil
  1465. end
  1466. local function parse_imm(imm, bits, shift, scale, signed)
  1467. local n = parse_number(imm)
  1468. if n then
  1469. local m = sar(n, scale)
  1470. if shl(m, scale) == n then
  1471. if signed then
  1472. local s = sar(m, bits-1)
  1473. if s == 0 then return shl(m, shift)
  1474. elseif s == -1 then return shl(m + shl(1, bits), shift) end
  1475. else
  1476. if sar(m, bits) == 0 then return shl(m, shift) end
  1477. end
  1478. end
  1479. werror("out of range immediate `"..imm.."'")
  1480. elseif match(imm, "^[rfv]([1-3]?[0-9])$") or
  1481. match(imm, "^vs([1-6]?[0-9])$") or
  1482. match(imm, "^([%w_]+):(r[1-3]?[0-9])$") then
  1483. werror("expected immediate operand, got register")
  1484. else
  1485. waction("IMM", (signed and 32768 or 0)+scale*1024+bits*32+shift, imm)
  1486. return 0
  1487. end
  1488. end
  1489. local function parse_shiftmask(imm, isshift)
  1490. local n = parse_number(imm)
  1491. if n then
  1492. if shr(n, 6) == 0 then
  1493. local lsb = band(n, 31)
  1494. local msb = n - lsb
  1495. return isshift and (shl(lsb, 11)+shr(msb, 4)) or (shl(lsb, 6)+msb)
  1496. end
  1497. werror("out of range immediate `"..imm.."'")
  1498. elseif match(imm, "^r([1-3]?[0-9])$") or
  1499. match(imm, "^([%w_]+):(r[1-3]?[0-9])$") then
  1500. werror("expected immediate operand, got register")
  1501. else
  1502. waction("IMMSH", isshift and 1 or 0, imm)
  1503. return 0;
  1504. end
  1505. end
  1506. local function parse_disp(disp)
  1507. local imm, reg = match(disp, "^(.*)%(([%w_:]+)%)$")
  1508. if imm then
  1509. local r = parse_gpr(reg)
  1510. if r == 0 then werror("cannot use r0 in displacement") end
  1511. return shl(r, 16) + parse_imm(imm, 16, 0, 0, true)
  1512. end
  1513. local reg, tailr = match(disp, "^([%w_:]+)%s*(.*)$")
  1514. if reg and tailr ~= "" then
  1515. local r, tp = parse_gpr(reg)
  1516. if r == 0 then werror("cannot use r0 in displacement") end
  1517. if tp then
  1518. waction("IMM", 32768+16*32, format(tp.ctypefmt, tailr))
  1519. return shl(r, 16)
  1520. end
  1521. end
  1522. werror("bad displacement `"..disp.."'")
  1523. end
  1524. local function parse_u5disp(disp, scale)
  1525. local imm, reg = match(disp, "^(.*)%(([%w_:]+)%)$")
  1526. if imm then
  1527. local r = parse_gpr(reg)
  1528. if r == 0 then werror("cannot use r0 in displacement") end
  1529. return shl(r, 16) + parse_imm(imm, 5, 11, scale, false)
  1530. end
  1531. local reg, tailr = match(disp, "^([%w_:]+)%s*(.*)$")
  1532. if reg and tailr ~= "" then
  1533. local r, tp = parse_gpr(reg)
  1534. if r == 0 then werror("cannot use r0 in displacement") end
  1535. if tp then
  1536. waction("IMM", scale*1024+5*32+11, format(tp.ctypefmt, tailr))
  1537. return shl(r, 16)
  1538. end
  1539. end
  1540. werror("bad displacement `"..disp.."'")
  1541. end
  1542. local function parse_label(label, def)
  1543. local prefix = sub(label, 1, 2)
  1544. -- =>label (pc label reference)
  1545. if prefix == "=>" then
  1546. return "PC", 0, sub(label, 3)
  1547. end
  1548. -- ->name (global label reference)
  1549. if prefix == "->" then
  1550. return "LG", map_global[sub(label, 3)]
  1551. end
  1552. if def then
  1553. -- [1-9] (local label definition)
  1554. if match(label, "^[1-9]$") then
  1555. return "LG", 10+tonumber(label)
  1556. end
  1557. else
  1558. -- [<>][1-9] (local label reference)
  1559. local dir, lnum = match(label, "^([<>])([1-9])$")
  1560. if dir then -- Fwd: 1-9, Bkwd: 11-19.
  1561. return "LG", lnum + (dir == ">" and 0 or 10)
  1562. end
  1563. -- extern label (extern label reference)
  1564. local extname = match(label, "^extern%s+(%S+)$")
  1565. if extname then
  1566. return "EXT", map_extern[extname]
  1567. end
  1568. end
  1569. werror("bad label `"..label.."'")
  1570. end
  1571. ------------------------------------------------------------------------------
  1572. -- Handle opcodes defined with template strings.
  1573. op_template = function(params, template, nparams)
  1574. if not params then return sub(template, 9) end
  1575. local op = tonumber(sub(template, 1, 8), 16)
  1576. local n, rs = 1, 26
  1577. -- Limit number of section buffer positions used by a single dasm_put().
  1578. -- A single opcode needs a maximum of 3 positions (rlwinm).
  1579. if secpos+3 > maxsecpos then wflush() end
  1580. local pos = wpos()
  1581. -- Process each character.
  1582. for p in gmatch(sub(template, 9), ".") do
  1583. if p == "R" then
  1584. rs = rs - 5; op = op + shl(parse_gpr(params[n]), rs); n = n + 1
  1585. elseif p == "F" then
  1586. rs = rs - 5; op = op + shl(parse_fpr(params[n]), rs); n = n + 1
  1587. elseif p == "V" then
  1588. rs = rs - 5; op = op + shl(parse_vr(params[n]), rs); n = n + 1
  1589. elseif p == "Q" then
  1590. local vs = parse_vs(params[n]); n = n + 1; rs = rs - 5
  1591. local sh = rs == 6 and 2 or 3 + band(shr(rs, 1), 3)
  1592. op = op + shl(band(vs, 31), rs) + shr(band(vs, 32), sh)
  1593. elseif p == "q" then
  1594. local vs = parse_vs(params[n]); n = n + 1
  1595. op = op + shl(band(vs, 31), 21) + shr(band(vs, 32), 5)
  1596. elseif p == "A" then
  1597. rs = rs - 5; op = op + parse_imm(params[n], 5, rs, 0, false); n = n + 1
  1598. elseif p == "S" then
  1599. rs = rs - 5; op = op + parse_imm(params[n], 5, rs, 0, true); n = n + 1
  1600. elseif p == "I" then
  1601. op = op + parse_imm(params[n], 16, 0, 0, true); n = n + 1
  1602. elseif p == "U" then
  1603. op = op + parse_imm(params[n], 16, 0, 0, false); n = n + 1
  1604. elseif p == "D" then
  1605. op = op + parse_disp(params[n]); n = n + 1
  1606. elseif p == "2" then
  1607. op = op + parse_u5disp(params[n], 1); n = n + 1
  1608. elseif p == "4" then
  1609. op = op + parse_u5disp(params[n], 2); n = n + 1
  1610. elseif p == "8" then
  1611. op = op + parse_u5disp(params[n], 3); n = n + 1
  1612. elseif p == "C" then
  1613. rs = rs - 5; op = op + shl(parse_cond(params[n]), rs); n = n + 1
  1614. elseif p == "X" then
  1615. rs = rs - 5; op = op + shl(parse_cr(params[n]), rs+2); n = n + 1
  1616. elseif p == "1" then
  1617. rs = rs - 5; op = op + parse_imm(params[n], 1, rs, 0, false); n = n + 1
  1618. elseif p == "g" then
  1619. rs = rs - 5; op = op + parse_imm(params[n], 2, rs, 0, false); n = n + 1
  1620. elseif p == "3" then
  1621. rs = rs - 5; op = op + parse_imm(params[n], 3, rs, 0, false); n = n + 1
  1622. elseif p == "P" then
  1623. rs = rs - 5; op = op + parse_imm(params[n], 4, rs, 0, false); n = n + 1
  1624. elseif p == "p" then
  1625. op = op + parse_imm(params[n], 4, rs, 0, false); n = n + 1
  1626. elseif p == "6" then
  1627. rs = rs - 6; op = op + parse_imm(params[n], 6, rs, 0, false); n = n + 1
  1628. elseif p == "Y" then
  1629. rs = rs - 5; op = op + parse_imm(params[n], 1, rs+4, 0, false); n = n + 1
  1630. elseif p == "y" then
  1631. rs = rs - 5; op = op + parse_imm(params[n], 1, rs+3, 0, false); n = n + 1
  1632. elseif p == "Z" then
  1633. rs = rs - 5; op = op + parse_imm(params[n], 2, rs+3, 0, false); n = n + 1
  1634. elseif p == "z" then
  1635. rs = rs - 5; op = op + parse_imm(params[n], 2, rs+2, 0, false); n = n + 1
  1636. elseif p == "W" then
  1637. op = op + parse_cr(params[n]); n = n + 1
  1638. elseif p == "G" then
  1639. op = op + parse_imm(params[n], 8, 12, 0, false); n = n + 1
  1640. elseif p == "H" then
  1641. op = op + parse_shiftmask(params[n], true); n = n + 1
  1642. elseif p == "M" then
  1643. op = op + parse_shiftmask(params[n], false); n = n + 1
  1644. elseif p == "J" or p == "K" then
  1645. local mode, m, s = parse_label(params[n], false)
  1646. if p == "K" then m = m + 2048 end
  1647. waction("REL_"..mode, m, s, 1)
  1648. n = n + 1
  1649. elseif p == "0" then
  1650. if band(shr(op, rs), 31) == 0 then werror("cannot use r0") end
  1651. elseif p == "=" or p == "%" then
  1652. local t = band(shr(op, p == "%" and rs+5 or rs), 31)
  1653. rs = rs - 5
  1654. op = op + shl(t, rs)
  1655. elseif p == "~" then
  1656. local mm = shl(31, rs)
  1657. local lo = band(op, mm)
  1658. local hi = band(op, shl(mm, 5))
  1659. op = op - lo - hi + shl(lo, 5) + shr(hi, 5)
  1660. elseif p == ":" then
  1661. if band(shr(op, rs), 1) ~= 0 then werror("register pair expected") end
  1662. elseif p == "-" then
  1663. rs = rs - 5
  1664. elseif p == "." then
  1665. -- Ignored.
  1666. else
  1667. assert(false)
  1668. end
  1669. end
  1670. wputpos(pos, op)
  1671. end
  1672. map_op[".template__"] = op_template
  1673. ------------------------------------------------------------------------------
  1674. -- Pseudo-opcode to mark the position where the action list is to be emitted.
  1675. map_op[".actionlist_1"] = function(params)
  1676. if not params then return "cvar" end
  1677. local name = params[1] -- No syntax check. You get to keep the pieces.
  1678. wline(function(out) writeactions(out, name) end)
  1679. end
  1680. -- Pseudo-opcode to mark the position where the global enum is to be emitted.
  1681. map_op[".globals_1"] = function(params)
  1682. if not params then return "prefix" end
  1683. local prefix = params[1] -- No syntax check. You get to keep the pieces.
  1684. wline(function(out) writeglobals(out, prefix) end)
  1685. end
  1686. -- Pseudo-opcode to mark the position where the global names are to be emitted.
  1687. map_op[".globalnames_1"] = function(params)
  1688. if not params then return "cvar" end
  1689. local name = params[1] -- No syntax check. You get to keep the pieces.
  1690. wline(function(out) writeglobalnames(out, name) end)
  1691. end
  1692. -- Pseudo-opcode to mark the position where the extern names are to be emitted.
  1693. map_op[".externnames_1"] = function(params)
  1694. if not params then return "cvar" end
  1695. local name = params[1] -- No syntax check. You get to keep the pieces.
  1696. wline(function(out) writeexternnames(out, name) end)
  1697. end
  1698. ------------------------------------------------------------------------------
  1699. -- Label pseudo-opcode (converted from trailing colon form).
  1700. map_op[".label_1"] = function(params)
  1701. if not params then return "[1-9] | ->global | =>pcexpr" end
  1702. if secpos+1 > maxsecpos then wflush() end
  1703. local mode, n, s = parse_label(params[1], true)
  1704. if mode == "EXT" then werror("bad label definition") end
  1705. waction("LABEL_"..mode, n, s, 1)
  1706. end
  1707. ------------------------------------------------------------------------------
  1708. -- Pseudo-opcodes for data storage.
  1709. map_op[".long_*"] = function(params)
  1710. if not params then return "imm..." end
  1711. for _,p in ipairs(params) do
  1712. local n = tonumber(p)
  1713. if not n then werror("bad immediate `"..p.."'") end
  1714. if n < 0 then n = n + 2^32 end
  1715. wputw(n)
  1716. if secpos+2 > maxsecpos then wflush() end
  1717. end
  1718. end
  1719. -- Alignment pseudo-opcode.
  1720. map_op[".align_1"] = function(params)
  1721. if not params then return "numpow2" end
  1722. if secpos+1 > maxsecpos then wflush() end
  1723. local align = tonumber(params[1])
  1724. if align then
  1725. local x = align
  1726. -- Must be a power of 2 in the range (2 ... 256).
  1727. for i=1,8 do
  1728. x = x / 2
  1729. if x == 1 then
  1730. waction("ALIGN", align-1, nil, 1) -- Action byte is 2**n-1.
  1731. return
  1732. end
  1733. end
  1734. end
  1735. werror("bad alignment")
  1736. end
  1737. ------------------------------------------------------------------------------
  1738. -- Pseudo-opcode for (primitive) type definitions (map to C types).
  1739. map_op[".type_3"] = function(params, nparams)
  1740. if not params then
  1741. return nparams == 2 and "name, ctype" or "name, ctype, reg"
  1742. end
  1743. local name, ctype, reg = params[1], params[2], params[3]
  1744. if not match(name, "^[%a_][%w_]*$") then
  1745. werror("bad type name `"..name.."'")
  1746. end
  1747. local tp = map_type[name]
  1748. if tp then
  1749. werror("duplicate type `"..name.."'")
  1750. end
  1751. -- Add #type to defines. A bit unclean to put it in map_archdef.
  1752. map_archdef["#"..name] = "sizeof("..ctype..")"
  1753. -- Add new type and emit shortcut define.
  1754. local num = ctypenum + 1
  1755. map_type[name] = {
  1756. ctype = ctype,
  1757. ctypefmt = format("Dt%X(%%s)", num),
  1758. reg = reg,
  1759. }
  1760. wline(format("#define Dt%X(_V) (int)(ptrdiff_t)&(((%s *)0)_V)", num, ctype))
  1761. ctypenum = num
  1762. end
  1763. map_op[".type_2"] = map_op[".type_3"]
  1764. -- Dump type definitions.
  1765. local function dumptypes(out, lvl)
  1766. local t = {}
  1767. for name in pairs(map_type) do t[#t+1] = name end
  1768. sort(t)
  1769. out:write("Type definitions:\n")
  1770. for _,name in ipairs(t) do
  1771. local tp = map_type[name]
  1772. local reg = tp.reg or ""
  1773. out:write(format(" %-20s %-20s %s\n", name, tp.ctype, reg))
  1774. end
  1775. out:write("\n")
  1776. end
  1777. ------------------------------------------------------------------------------
  1778. -- Set the current section.
  1779. function _M.section(num)
  1780. waction("SECTION", num)
  1781. wflush(true) -- SECTION is a terminal action.
  1782. end
  1783. ------------------------------------------------------------------------------
  1784. -- Dump architecture description.
  1785. function _M.dumparch(out)
  1786. out:write(format("DynASM %s version %s, released %s\n\n",
  1787. _info.arch, _info.version, _info.release))
  1788. dumpactions(out)
  1789. end
  1790. -- Dump all user defined elements.
  1791. function _M.dumpdef(out, lvl)
  1792. dumptypes(out, lvl)
  1793. dumpglobals(out, lvl)
  1794. dumpexterns(out, lvl)
  1795. end
  1796. ------------------------------------------------------------------------------
  1797. -- Pass callbacks from/to the DynASM core.
  1798. function _M.passcb(wl, we, wf, ww)
  1799. wline, werror, wfatal, wwarn = wl, we, wf, ww
  1800. return wflush
  1801. end
  1802. -- Setup the arch-specific module.
  1803. function _M.setup(arch, opt)
  1804. g_arch, g_opt = arch, opt
  1805. end
  1806. -- Merge the core maps and the arch-specific maps.
  1807. function _M.mergemaps(map_coreop, map_def)
  1808. setmetatable(map_op, { __index = map_coreop })
  1809. setmetatable(map_def, { __index = map_archdef })
  1810. return map_op, map_def
  1811. end
  1812. return _M
  1813. ------------------------------------------------------------------------------