diff --git a/dynasm/dasm_ppc.lua b/dynasm/dasm_ppc.lua index dccf91f9..0511a4b5 100644 --- a/dynasm/dasm_ppc.lua +++ b/dynasm/dasm_ppc.lua @@ -246,10 +246,10 @@ local map_op = { cmpdi_2 = "2c200000-RI", addic_3 = "30000000RRI", ["addic._3"] = "34000000RRI", - addi_3 = "38000000RRI", + addi_3 = "38000000RR0I", li_2 = "38000000RI", la_2 = "38000000RD", - addis_3 = "3c000000RRI", + addis_3 = "3c000000RR0I", lis_2 = "3c000000RI", lus_2 = "3c000000RU", bc_3 = "40000000AAK", @@ -340,9 +340,9 @@ local map_op = { iseleq_3 = "7c00009eRRR", mfcr_1 = "7c000026R", -- NYI: mtcrf, mtocrf, mfocrf - lwarx_3 = "7c000028RRR", - ldx_3 = "7c00002aRRR", - lwzx_3 = "7c00002eRRR", + lwarx_3 = "7c000028RR0R", + ldx_3 = "7c00002aRR0R", + lwzx_3 = "7c00002eRR0R", slw_3 = "7c000030RR~R.", cntlzw_2 = "7c000034RR~", sld_3 = "7c000036RR~R.", @@ -353,63 +353,63 @@ local map_op = { cmpld_2 = "7c200040-RR", subf_3 = "7c000050RRR.", sub_3 = "7c000050RRR~.", - ldux_3 = "7c00006aRRR", + ldux_3 = "7c00006aRR0R", dcbst_2 = "7c00006c-RR", - lwzux_3 = "7c00006eRRR", + lwzux_3 = "7c00006eRR0R", cntlzd_2 = "7c000074RR~", andc_3 = "7c000078RR~R.", td_3 = "7c000088ARR", mulhd_3 = "7c000092RRR.", mulhw_3 = "7c000096RRR.", - ldarx_3 = "7c0000a8RRR", + ldarx_3 = "7c0000a8RR0R", dcbf_2 = "7c0000ac-RR", - lbzx_3 = "7c0000aeRRR", + lbzx_3 = "7c0000aeRR0R", neg_2 = "7c0000d0RR.", - lbzux_3 = "7c0000eeRRR", + lbzux_3 = "7c0000eeRR0R", popcntb_2 = "7c0000f4RR~", not_2 = "7c0000f8RR~%.", nor_3 = "7c0000f8RR~R.", subfe_3 = "7c000110RRR.", sube_3 = "7c000110RRR~.", adde_3 = "7c000114RRR.", - stdx_3 = "7c00012aRRR", - stwcx_3 = "7c00012cRRR.", - stwx_3 = "7c00012eRRR", + stdx_3 = "7c00012aRR0R", + stwcx_3 = "7c00012cRR0R.", + stwx_3 = "7c00012eRR0R", prtyw_2 = "7c000134RR~", - stdux_3 = "7c00016aRRR", - stwux_3 = "7c00016eRRR", + stdux_3 = "7c00016aRR0R", + stwux_3 = "7c00016eRR0R", prtyd_2 = "7c000174RR~", subfze_2 = "7c000190RR.", addze_2 = "7c000194RR.", - stdcx_3 = "7c0001acRRR.", - stbx_3 = "7c0001aeRRR", + stdcx_3 = "7c0001acRR0R.", + stbx_3 = "7c0001aeRR0R", subfme_2 = "7c0001d0RR.", mulld_3 = "7c0001d2RRR.", addme_2 = "7c0001d4RR.", mullw_3 = "7c0001d6RRR.", dcbtst_2 = "7c0001ec-RR", - stbux_3 = "7c0001eeRRR", + stbux_3 = "7c0001eeRR0R", add_3 = "7c000214RRR.", dcbt_2 = "7c00022c-RR", - lhzx_3 = "7c00022eRRR", + lhzx_3 = "7c00022eRR0R", eqv_3 = "7c000238RR~R.", - eciwx_3 = "7c00026cRRR", - lhzux_3 = "7c00026eRRR", + eciwx_3 = "7c00026cRR0R", + lhzux_3 = "7c00026eRR0R", xor_3 = "7c000278RR~R.", mfspefscr_1 = "7c0082a6R", mfxer_1 = "7c0102a6R", mflr_1 = "7c0802a6R", mfctr_1 = "7c0902a6R", - lwax_3 = "7c0002aaRRR", - lhax_3 = "7c0002aeRRR", + lwax_3 = "7c0002aaRR0R", + lhax_3 = "7c0002aeRR0R", mftb_1 = "7c0c42e6R", mftbu_1 = "7c0d42e6R", - lwaux_3 = "7c0002eaRRR", - lhaux_3 = "7c0002eeRRR", - sthx_3 = "7c00032eRRR", + lwaux_3 = "7c0002eaRR0R", + lhaux_3 = "7c0002eeRR0R", + sthx_3 = "7c00032eRR0R", orc_3 = "7c000338RR~R.", - ecowx_3 = "7c00036cRRR", - sthux_3 = "7c00036eRRR", + ecowx_3 = "7c00036cRR0R", + sthux_3 = "7c00036eRR0R", or_3 = "7c000378RR~R.", mr_2 = "7c000378RR~%.", divdu_3 = "7c000392RRR.", @@ -427,54 +427,54 @@ local map_op = { subfco_3 = "7c000410RRR.", subco_3 = "7c000410RRR~.", addco_3 = "7c000414RRR.", - ldbrx_3 = "7c000428RRR", - lswx_3 = "7c00042aRRR", - lwbrx_3 = "7c00042cRRR", - lfsx_3 = "7c00042eFRR", + ldbrx_3 = "7c000428RR0R", + lswx_3 = "7c00042aRR0R", + lwbrx_3 = "7c00042cRR0R", + lfsx_3 = "7c00042eFR0R", srw_3 = "7c000430RR~R.", srd_3 = "7c000436RR~R.", subfo_3 = "7c000450RRR.", subo_3 = "7c000450RRR~.", - lfsux_3 = "7c00046eFRR", - lswi_3 = "7c0004aaRRA", + lfsux_3 = "7c00046eFR0R", + lswi_3 = "7c0004aaRR0A", sync_0 = "7c0004ac", lwsync_0 = "7c2004ac", ptesync_0 = "7c4004ac", - lfdx_3 = "7c0004aeFRR", + lfdx_3 = "7c0004aeFR0R", nego_2 = "7c0004d0RR.", - lfdux_3 = "7c0004eeFRR", + lfdux_3 = "7c0004eeFR0R", subfeo_3 = "7c000510RRR.", subeo_3 = "7c000510RRR~.", addeo_3 = "7c000514RRR.", - stdbrx_3 = "7c000528RRR", - stswx_3 = "7c00052aRRR", - stwbrx_3 = "7c00052cRRR", - stfsx_3 = "7c00052eFRR", - stfsux_3 = "7c00056eFRR", + stdbrx_3 = "7c000528RR0R", + stswx_3 = "7c00052aRR0R", + stwbrx_3 = "7c00052cRR0R", + stfsx_3 = "7c00052eFR0R", + stfsux_3 = "7c00056eFR0R", subfzeo_2 = "7c000590RR.", addzeo_2 = "7c000594RR.", - stswi_3 = "7c0005aaRRA", - stfdx_3 = "7c0005aeFRR", + stswi_3 = "7c0005aaRR0A", + stfdx_3 = "7c0005aeFR0R", subfmeo_2 = "7c0005d0RR.", mulldo_3 = "7c0005d2RRR.", addmeo_2 = "7c0005d4RR.", mullwo_3 = "7c0005d6RRR.", dcba_2 = "7c0005ec-RR", - stfdux_3 = "7c0005eeFRR", + stfdux_3 = "7c0005eeFR0R", addo_3 = "7c000614RRR.", - lhbrx_3 = "7c00062cRRR", + lhbrx_3 = "7c00062cRR0R", sraw_3 = "7c000630RR~R.", srad_3 = "7c000634RR~R.", srawi_3 = "7c000670RR~A.", eieio_0 = "7c0006ac", - lfiwax_3 = "7c0006aeFRR", - sthbrx_3 = "7c00072cRRR", + lfiwax_3 = "7c0006aeFR0R", + sthbrx_3 = "7c00072cRR0R", extsh_2 = "7c000734RR~.", extsb_2 = "7c000774RR~.", divduo_3 = "7c000792RRR.", divwou_3 = "7c000796RRR.", icbi_2 = "7c0007ac-RR", - stfiwx_3 = "7c0007aeFRR", + stfiwx_3 = "7c0007aeFR0R", extsw_2 = "7c0007b4RR~.", divdo_3 = "7c0007d2RRR.", divwo_3 = "7c0007d6RRR.", @@ -670,31 +670,31 @@ local map_op = { efdtstlt_2 = "100002fd-RR", efdtsteq_3 = "100002feXRR", efdtsteq_2 = "100002fe-RR", - evlddx_3 = "10000300RRR", + evlddx_3 = "10000300RR0R", evldd_2 = "10000301R8", - evldwx_3 = "10000302RRR", + evldwx_3 = "10000302RR0R", evldw_2 = "10000303R8", - evldhx_3 = "10000304RRR", + evldhx_3 = "10000304RR0R", evldh_2 = "10000305R8", - evlwhex_3 = "10000310RRR", + evlwhex_3 = "10000310RR0R", evlwhe_2 = "10000311R4", - evlwhoux_3 = "10000314RRR", + evlwhoux_3 = "10000314RR0R", evlwhou_2 = "10000315R4", - evlwhosx_3 = "10000316RRR", + evlwhosx_3 = "10000316RR0R", evlwhos_2 = "10000317R4", - evstddx_3 = "10000320RRR", + evstddx_3 = "10000320RR0R", evstdd_2 = "10000321R8", - evstdwx_3 = "10000322RRR", + evstdwx_3 = "10000322RR0R", evstdw_2 = "10000323R8", - evstdhx_3 = "10000324RRR", + evstdhx_3 = "10000324RR0R", evstdh_2 = "10000325R8", - evstwhex_3 = "10000330RRR", + evstwhex_3 = "10000330RR0R", evstwhe_2 = "10000331R4", - evstwhox_3 = "10000334RRR", + evstwhox_3 = "10000334RR0R", evstwho_2 = "10000335R4", - evstwwex_3 = "10000338RRR", + evstwwex_3 = "10000338RR0R", evstwwe_2 = "10000339R4", - evstwwox_3 = "1000033cRRR", + evstwwox_3 = "1000033cRR0R", evstwwo_2 = "1000033dR4", evmhessf_3 = "10000403RRR", evmhossf_3 = "10000407RRR", @@ -743,15 +743,15 @@ local map_op = { evmwsmfan_3 = "100005dbRRR", evmergehilo_3 = "1000022eRRR", evmergelohi_3 = "1000022fRRR", - evlhhesplatx_3 = "10000308RRR", + evlhhesplatx_3 = "10000308RR0R", evlhhesplat_2 = "10000309R2", - evlhhousplatx_3 = "1000030cRRR", + evlhhousplatx_3 = "1000030cRR0R", evlhhousplat_2 = "1000030dR2", - evlhhossplatx_3 = "1000030eRRR", + evlhhossplatx_3 = "1000030eRR0R", evlhhossplat_2 = "1000030fR2", - evlwwsplatx_3 = "10000318RRR", + evlwwsplatx_3 = "10000318RR0R", evlwwsplat_2 = "10000319R4", - evlwhsplatx_3 = "1000031cRRR", + evlwhsplatx_3 = "1000031cRR0R", evlwhsplat_2 = "1000031dR4", evaddusiaaw_2 = "100004c0RR", evaddssiaaw_2 = "100004c1RR", @@ -1027,6 +1027,10 @@ map_op[".template__"] = function(params, template, nparams) if p == "K" then n = n + 2048 end waction("REL_"..mode, n, s, 1) n = n + 1 + elseif p == "0" then + local mm = 2^rs + local t = op % mm + if ((op - t) / mm) % 32 == 0 then werror("cannot use r0") end elseif p == "=" or p == "%" then local mm = 2^(rs + (p == "%" and 5 or 0)) local t = ((op - op % mm) / mm) % 32