PPC: Teach DynASM to reject r0 for some operands.

This commit is contained in:
Mike Pall 2010-09-13 21:11:51 +02:00
parent 32bfececc5
commit cd6a45760a

View File

@ -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