Browse Source

PPC: Teach DynASM to reject r0 for some operands.

Mike Pall 15 years ago
parent
commit
cd6a45760a
1 changed files with 70 additions and 66 deletions
  1. 70 66
      dynasm/dasm_ppc.lua

+ 70 - 66
dynasm/dasm_ppc.lua

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