mirror of
https://github.com/LuaJIT/LuaJIT.git
synced 2025-02-07 15:14:08 +00:00
DynASM/PPC: Add missing PPC64 instructions and various extensions.
Contributed by Caio Souza Oliveira.
This commit is contained in:
parent
3f19b34242
commit
3e1703895a
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** DynASM PPC encoding engine.
|
||||
** DynASM PPC/PPC64 encoding engine.
|
||||
** Copyright (C) 2005-2015 Mike Pall. All rights reserved.
|
||||
** Released under the MIT license. See dynasm.lua for full copyright notice.
|
||||
*/
|
||||
|
@ -1,8 +1,10 @@
|
||||
------------------------------------------------------------------------------
|
||||
-- DynASM PPC module.
|
||||
-- DynASM PPC/PPC64 module.
|
||||
--
|
||||
-- Copyright (C) 2005-2015 Mike Pall. All rights reserved.
|
||||
-- See dynasm.lua for full copyright notice.
|
||||
--
|
||||
-- Support for various extensions contributed by Caio Souza Oliveira.
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
-- Module information:
|
||||
@ -11,7 +13,7 @@ local _info = {
|
||||
description = "DynASM PPC module",
|
||||
version = "1.3.0",
|
||||
vernum = 10300,
|
||||
release = "2011-05-05",
|
||||
release = "2015-01-14",
|
||||
author = "Mike Pall",
|
||||
license = "MIT",
|
||||
}
|
||||
@ -297,6 +299,223 @@ local map_op = {
|
||||
std_2 = "f8000000RD",
|
||||
stdu_2 = "f8000001RD",
|
||||
|
||||
-- Primary opcode 4:
|
||||
mulhhwu_3 = "10000010RRR.",
|
||||
machhwu_3 = "10000018RRR.",
|
||||
mulhhw_3 = "10000050RRR.",
|
||||
nmachhw_3 = "1000005cRRR.",
|
||||
machhwsu_3 = "10000098RRR.",
|
||||
machhws_3 = "100000d8RRR.",
|
||||
nmachhws_3 = "100000dcRRR.",
|
||||
mulchwu_3 = "10000110RRR.",
|
||||
macchwu_3 = "10000118RRR.",
|
||||
mulchw_3 = "10000150RRR.",
|
||||
macchw_3 = "10000158RRR.",
|
||||
nmacchw_3 = "1000015cRRR.",
|
||||
macchwsu_3 = "10000198RRR.",
|
||||
macchws_3 = "100001d8RRR.",
|
||||
nmacchws_3 = "100001dcRRR.",
|
||||
mullhw_3 = "10000350RRR.",
|
||||
maclhw_3 = "10000358RRR.",
|
||||
nmaclhw_3 = "1000035cRRR.",
|
||||
maclhwsu_3 = "10000398RRR.",
|
||||
maclhws_3 = "100003d8RRR.",
|
||||
nmaclhws_3 = "100003dcRRR.",
|
||||
machhwuo_3 = "10000418RRR.",
|
||||
nmachhwo_3 = "1000045cRRR.",
|
||||
machhwsuo_3 = "10000498RRR.",
|
||||
machhwso_3 = "100004d8RRR.",
|
||||
nmachhwso_3 = "100004dcRRR.",
|
||||
macchwuo_3 = "10000518RRR.",
|
||||
macchwo_3 = "10000558RRR.",
|
||||
nmacchwo_3 = "1000055cRRR.",
|
||||
macchwsuo_3 = "10000598RRR.",
|
||||
macchwso_3 = "100005d8RRR.",
|
||||
nmacchwso_3 = "100005dcRRR.",
|
||||
maclhwo_3 = "10000758RRR.",
|
||||
nmaclhwo_3 = "1000075cRRR.",
|
||||
maclhwsuo_3 = "10000798RRR.",
|
||||
maclhwso_3 = "100007d8RRR.",
|
||||
nmaclhwso_3 = "100007dcRRR.",
|
||||
|
||||
vaddubm_3 = "10000000VVV",
|
||||
vmaxub_3 = "10000002VVV",
|
||||
vrlb_3 = "10000004VVV",
|
||||
vcmpequb_3 = "10000006VVV",
|
||||
vmuloub_3 = "10000008VVV",
|
||||
vaddfp_3 = "1000000aVVV",
|
||||
vmrghb_3 = "1000000cVVV",
|
||||
vpkuhum_3 = "1000000eVVV",
|
||||
vmhaddshs_4 = "10000020VVVV",
|
||||
vmhraddshs_4 = "10000021VVVV",
|
||||
vmladduhm_4 = "10000022VVVV",
|
||||
vmsumubm_4 = "10000024VVVV",
|
||||
vmsummbm_4 = "10000025VVVV",
|
||||
vmsumuhm_4 = "10000026VVVV",
|
||||
vmsumuhs_4 = "10000027VVVV",
|
||||
vmsumshm_4 = "10000028VVVV",
|
||||
vmsumshs_4 = "10000029VVVV",
|
||||
vsel_4 = "1000002aVVVV",
|
||||
vperm_4 = "1000002bVVVV",
|
||||
vsldoi_4 = "1000002cVVVP",
|
||||
vpermxor_4 = "1000002dVVVV",
|
||||
vmaddfp_4 = "1000002eVVVV~",
|
||||
vnmsubfp_4 = "1000002fVVVV~",
|
||||
vaddeuqm_4 = "1000003cVVVV",
|
||||
vaddecuq_4 = "1000003dVVVV",
|
||||
vsubeuqm_4 = "1000003eVVVV",
|
||||
vsubecuq_4 = "1000003fVVVV",
|
||||
vadduhm_3 = "10000040VVV",
|
||||
vmaxuh_3 = "10000042VVV",
|
||||
vrlh_3 = "10000044VVV",
|
||||
vcmpequh_3 = "10000046VVV",
|
||||
vmulouh_3 = "10000048VVV",
|
||||
vsubfp_3 = "1000004aVVV",
|
||||
vmrghh_3 = "1000004cVVV",
|
||||
vpkuwum_3 = "1000004eVVV",
|
||||
vadduwm_3 = "10000080VVV",
|
||||
vmaxuw_3 = "10000082VVV",
|
||||
vrlw_3 = "10000084VVV",
|
||||
vcmpequw_3 = "10000086VVV",
|
||||
vmulouw_3 = "10000088VVV",
|
||||
vmuluwm_3 = "10000089VVV",
|
||||
vmrghw_3 = "1000008cVVV",
|
||||
vpkuhus_3 = "1000008eVVV",
|
||||
vaddudm_3 = "100000c0VVV",
|
||||
vmaxud_3 = "100000c2VVV",
|
||||
vrld_3 = "100000c4VVV",
|
||||
vcmpeqfp_3 = "100000c6VVV",
|
||||
vcmpequd_3 = "100000c7VVV",
|
||||
vpkuwus_3 = "100000ceVVV",
|
||||
vadduqm_3 = "10000100VVV",
|
||||
vmaxsb_3 = "10000102VVV",
|
||||
vslb_3 = "10000104VVV",
|
||||
vmulosb_3 = "10000108VVV",
|
||||
vrefp_2 = "1000010aV-V",
|
||||
vmrglb_3 = "1000010cVVV",
|
||||
vpkshus_3 = "1000010eVVV",
|
||||
vaddcuq_3 = "10000140VVV",
|
||||
vmaxsh_3 = "10000142VVV",
|
||||
vslh_3 = "10000144VVV",
|
||||
vmulosh_3 = "10000148VVV",
|
||||
vrsqrtefp_2 = "1000014aV-V",
|
||||
vmrglh_3 = "1000014cVVV",
|
||||
vpkswus_3 = "1000014eVVV",
|
||||
vaddcuw_3 = "10000180VVV",
|
||||
vmaxsw_3 = "10000182VVV",
|
||||
vslw_3 = "10000184VVV",
|
||||
vmulosw_3 = "10000188VVV",
|
||||
vexptefp_2 = "1000018aV-V",
|
||||
vmrglw_3 = "1000018cVVV",
|
||||
vpkshss_3 = "1000018eVVV",
|
||||
vmaxsd_3 = "100001c2VVV",
|
||||
vsl_3 = "100001c4VVV",
|
||||
vcmpgefp_3 = "100001c6VVV",
|
||||
vlogefp_2 = "100001caV-V",
|
||||
vpkswss_3 = "100001ceVVV",
|
||||
vadduhs_3 = "10000240VVV",
|
||||
vminuh_3 = "10000242VVV",
|
||||
vsrh_3 = "10000244VVV",
|
||||
vcmpgtuh_3 = "10000246VVV",
|
||||
vmuleuh_3 = "10000248VVV",
|
||||
vrfiz_2 = "1000024aV-V",
|
||||
vsplth_3 = "1000024cVV3",
|
||||
vupkhsh_2 = "1000024eV-V",
|
||||
vminuw_3 = "10000282VVV",
|
||||
vminud_3 = "100002c2VVV",
|
||||
vcmpgtud_3 = "100002c7VVV",
|
||||
vrfim_2 = "100002caV-V",
|
||||
vcmpgtsb_3 = "10000306VVV",
|
||||
vcfux_3 = "1000030aVVA~",
|
||||
vaddshs_3 = "10000340VVV",
|
||||
vminsh_3 = "10000342VVV",
|
||||
vsrah_3 = "10000344VVV",
|
||||
vcmpgtsh_3 = "10000346VVV",
|
||||
vmulesh_3 = "10000348VVV",
|
||||
vcfsx_3 = "1000034aVVA~",
|
||||
vspltish_2 = "1000034cVS",
|
||||
vupkhpx_2 = "1000034eV-V",
|
||||
vaddsws_3 = "10000380VVV",
|
||||
vminsw_3 = "10000382VVV",
|
||||
vsraw_3 = "10000384VVV",
|
||||
vcmpgtsw_3 = "10000386VVV",
|
||||
vmulesw_3 = "10000388VVV",
|
||||
vctuxs_3 = "1000038aVVA~",
|
||||
vspltisw_2 = "1000038cVS",
|
||||
vminsd_3 = "100003c2VVV",
|
||||
vsrad_3 = "100003c4VVV",
|
||||
vcmpbfp_3 = "100003c6VVV",
|
||||
vcmpgtsd_3 = "100003c7VVV",
|
||||
vctsxs_3 = "100003caVVA~",
|
||||
vupklpx_2 = "100003ceV-V",
|
||||
vsububm_3 = "10000400VVV",
|
||||
["bcdadd._4"] = "10000401VVVy.",
|
||||
vavgub_3 = "10000402VVV",
|
||||
vand_3 = "10000404VVV",
|
||||
["vcmpequb._3"] = "10000406VVV",
|
||||
vmaxfp_3 = "1000040aVVV",
|
||||
vsubuhm_3 = "10000440VVV",
|
||||
["bcdsub._4"] = "10000441VVVy.",
|
||||
vavguh_3 = "10000442VVV",
|
||||
vandc_3 = "10000444VVV",
|
||||
["vcmpequh._3"] = "10000446VVV",
|
||||
vminfp_3 = "1000044aVVV",
|
||||
vpkudum_3 = "1000044eVVV",
|
||||
vsubuwm_3 = "10000480VVV",
|
||||
vavguw_3 = "10000482VVV",
|
||||
vor_3 = "10000484VVV",
|
||||
["vcmpequw._3"] = "10000486VVV",
|
||||
vpmsumw_3 = "10000488VVV",
|
||||
["vcmpeqfp._3"] = "100004c6VVV",
|
||||
["vcmpequd._3"] = "100004c7VVV",
|
||||
vpkudus_3 = "100004ceVVV",
|
||||
vavgsb_3 = "10000502VVV",
|
||||
vavgsh_3 = "10000542VVV",
|
||||
vorc_3 = "10000544VVV",
|
||||
vbpermq_3 = "1000054cVVV",
|
||||
vpksdus_3 = "1000054eVVV",
|
||||
vavgsw_3 = "10000582VVV",
|
||||
vsld_3 = "100005c4VVV",
|
||||
["vcmpgefp._3"] = "100005c6VVV",
|
||||
vpksdss_3 = "100005ceVVV",
|
||||
vsububs_3 = "10000600VVV",
|
||||
mfvscr_1 = "10000604V--",
|
||||
vsum4ubs_3 = "10000608VVV",
|
||||
vsubuhs_3 = "10000640VVV",
|
||||
mtvscr_1 = "10000644--V",
|
||||
["vcmpgtuh._3"] = "10000646VVV",
|
||||
vsum4shs_3 = "10000648VVV",
|
||||
vupkhsw_2 = "1000064eV-V",
|
||||
vsubuws_3 = "10000680VVV",
|
||||
vshasigmaw_4 = "10000682VVYp",
|
||||
veqv_3 = "10000684VVV",
|
||||
vsum2sws_3 = "10000688VVV",
|
||||
vmrgow_3 = "1000068cVVV",
|
||||
vshasigmad_4 = "100006c2VVYp",
|
||||
vsrd_3 = "100006c4VVV",
|
||||
["vcmpgtud._3"] = "100006c7VVV",
|
||||
vupklsw_2 = "100006ceV-V",
|
||||
vupkslw_2 = "100006ceV-V",
|
||||
vsubsbs_3 = "10000700VVV",
|
||||
vclzb_2 = "10000702V-V",
|
||||
vpopcntb_2 = "10000703V-V",
|
||||
["vcmpgtsb._3"] = "10000706VVV",
|
||||
vsum4sbs_3 = "10000708VVV",
|
||||
vsubshs_3 = "10000740VVV",
|
||||
vclzh_2 = "10000742V-V",
|
||||
vpopcnth_2 = "10000743V-V",
|
||||
["vcmpgtsh._3"] = "10000746VVV",
|
||||
vsubsws_3 = "10000780VVV",
|
||||
vclzw_2 = "10000782V-V",
|
||||
vpopcntw_2 = "10000783V-V",
|
||||
["vcmpgtsw._3"] = "10000786VVV",
|
||||
vsumsws_3 = "10000788VVV",
|
||||
vmrgew_3 = "1000078cVVV",
|
||||
vclzd_2 = "100007c2V-V",
|
||||
vpopcntd_2 = "100007c3V-V",
|
||||
["vcmpbfp._3"] = "100007c6VVV",
|
||||
["vcmpgtsd._3"] = "100007c7VVV",
|
||||
|
||||
-- Primary opcode 19:
|
||||
mcrf_2 = "4c000000XX",
|
||||
isync_0 = "4c00012c",
|
||||
@ -316,6 +535,8 @@ local map_op = {
|
||||
bclrl_2 = "4c000021AA",
|
||||
bcctr_2 = "4c000420AA",
|
||||
bcctrl_2 = "4c000421AA",
|
||||
bctar_2 = "4c000460AA",
|
||||
bctarl_2 = "4c000461AA",
|
||||
blr_0 = "4e800020",
|
||||
blrl_0 = "4e800021",
|
||||
bctr_0 = "4e800420",
|
||||
@ -327,6 +548,7 @@ local map_op = {
|
||||
cmpd_3 = "7c200000XRR",
|
||||
cmpd_2 = "7c200000-RR",
|
||||
tw_3 = "7c000008ARR",
|
||||
lvsl_3 = "7c00000cVRR",
|
||||
subfc_3 = "7c000010RRR.",
|
||||
subc_3 = "7c000010RRR~.",
|
||||
mulhdu_3 = "7c000012RRR.",
|
||||
@ -351,50 +573,68 @@ local map_op = {
|
||||
cmplw_2 = "7c000040-RR",
|
||||
cmpld_3 = "7c200040XRR",
|
||||
cmpld_2 = "7c200040-RR",
|
||||
lvsr_3 = "7c00004cVRR",
|
||||
subf_3 = "7c000050RRR.",
|
||||
sub_3 = "7c000050RRR~.",
|
||||
lbarx_3 = "7c000068RR0R",
|
||||
ldux_3 = "7c00006aRR0R",
|
||||
dcbst_2 = "7c00006c-RR",
|
||||
lwzux_3 = "7c00006eRR0R",
|
||||
cntlzd_2 = "7c000074RR~",
|
||||
andc_3 = "7c000078RR~R.",
|
||||
td_3 = "7c000088ARR",
|
||||
lvewx_3 = "7c00008eVRR",
|
||||
mulhd_3 = "7c000092RRR.",
|
||||
addg6s_3 = "7c000094RRR",
|
||||
mulhw_3 = "7c000096RRR.",
|
||||
dlmzb_3 = "7c00009cRR~R.",
|
||||
ldarx_3 = "7c0000a8RR0R",
|
||||
dcbf_2 = "7c0000ac-RR",
|
||||
lbzx_3 = "7c0000aeRR0R",
|
||||
lvx_3 = "7c0000ceVRR",
|
||||
neg_2 = "7c0000d0RR.",
|
||||
lharx_3 = "7c0000e8RR0R",
|
||||
lbzux_3 = "7c0000eeRR0R",
|
||||
popcntb_2 = "7c0000f4RR~",
|
||||
not_2 = "7c0000f8RR~%.",
|
||||
nor_3 = "7c0000f8RR~R.",
|
||||
stvebx_3 = "7c00010eVRR",
|
||||
subfe_3 = "7c000110RRR.",
|
||||
sube_3 = "7c000110RRR~.",
|
||||
adde_3 = "7c000114RRR.",
|
||||
stdx_3 = "7c00012aRR0R",
|
||||
stwcx_3 = "7c00012cRR0R.",
|
||||
["stwcx._3"] = "7c00012dRR0R.",
|
||||
stwx_3 = "7c00012eRR0R",
|
||||
prtyw_2 = "7c000134RR~",
|
||||
stvehx_3 = "7c00014eVRR",
|
||||
stdux_3 = "7c00016aRR0R",
|
||||
["stqcx._3"] = "7c00016dR:R0R.",
|
||||
stwux_3 = "7c00016eRR0R",
|
||||
prtyd_2 = "7c000174RR~",
|
||||
stvewx_3 = "7c00018eVRR",
|
||||
subfze_2 = "7c000190RR.",
|
||||
addze_2 = "7c000194RR.",
|
||||
stdcx_3 = "7c0001acRR0R.",
|
||||
["stdcx._3"] = "7c0001adRR0R.",
|
||||
stbx_3 = "7c0001aeRR0R",
|
||||
stvx_3 = "7c0001ceVRR",
|
||||
subfme_2 = "7c0001d0RR.",
|
||||
mulld_3 = "7c0001d2RRR.",
|
||||
addme_2 = "7c0001d4RR.",
|
||||
mullw_3 = "7c0001d6RRR.",
|
||||
dcbtst_2 = "7c0001ec-RR",
|
||||
stbux_3 = "7c0001eeRR0R",
|
||||
bpermd_3 = "7c0001f8RR~R",
|
||||
lvepxl_3 = "7c00020eVRR",
|
||||
add_3 = "7c000214RRR.",
|
||||
lqarx_3 = "7c000228R:R0R",
|
||||
dcbt_2 = "7c00022c-RR",
|
||||
lhzx_3 = "7c00022eRR0R",
|
||||
cdtbcd_2 = "7c000234RR~",
|
||||
eqv_3 = "7c000238RR~R.",
|
||||
lvepx_3 = "7c00024eVRR",
|
||||
eciwx_3 = "7c00026cRR0R",
|
||||
lhzux_3 = "7c00026eRR0R",
|
||||
cbcdtd_2 = "7c000274RR~",
|
||||
xor_3 = "7c000278RR~R.",
|
||||
mfspefscr_1 = "7c0082a6R",
|
||||
mfxer_1 = "7c0102a6R",
|
||||
@ -404,8 +644,12 @@ local map_op = {
|
||||
lhax_3 = "7c0002aeRR0R",
|
||||
mftb_1 = "7c0c42e6R",
|
||||
mftbu_1 = "7c0d42e6R",
|
||||
lvxl_3 = "7c0002ceVRR",
|
||||
lwaux_3 = "7c0002eaRR0R",
|
||||
lhaux_3 = "7c0002eeRR0R",
|
||||
popcntw_2 = "7c0002f4RR~",
|
||||
divdeu_3 = "7c000312RRR.",
|
||||
divweu_3 = "7c000316RRR.",
|
||||
sthx_3 = "7c00032eRR0R",
|
||||
orc_3 = "7c000338RR~R.",
|
||||
ecowx_3 = "7c00036cRR0R",
|
||||
@ -420,10 +664,14 @@ local map_op = {
|
||||
mtctr_1 = "7c0903a6R",
|
||||
dcbi_2 = "7c0003ac-RR",
|
||||
nand_3 = "7c0003b8RR~R.",
|
||||
dsn_2 = "7c0003c6-RR",
|
||||
stvxl_3 = "7c0003ceVRR",
|
||||
divd_3 = "7c0003d2RRR.",
|
||||
divw_3 = "7c0003d6RRR.",
|
||||
popcntd_2 = "7c0003f4RR~",
|
||||
cmpb_3 = "7c0003f8RR~R.",
|
||||
mcrxr_1 = "7c000400X",
|
||||
lbdx_3 = "7c000406RRR",
|
||||
subfco_3 = "7c000410RRR.",
|
||||
subco_3 = "7c000410RRR~.",
|
||||
addco_3 = "7c000414RRR.",
|
||||
@ -433,16 +681,20 @@ local map_op = {
|
||||
lfsx_3 = "7c00042eFR0R",
|
||||
srw_3 = "7c000430RR~R.",
|
||||
srd_3 = "7c000436RR~R.",
|
||||
lhdx_3 = "7c000446RRR",
|
||||
subfo_3 = "7c000450RRR.",
|
||||
subo_3 = "7c000450RRR~.",
|
||||
lfsux_3 = "7c00046eFR0R",
|
||||
lwdx_3 = "7c000486RRR",
|
||||
lswi_3 = "7c0004aaRR0A",
|
||||
sync_0 = "7c0004ac",
|
||||
lwsync_0 = "7c2004ac",
|
||||
ptesync_0 = "7c4004ac",
|
||||
lfdx_3 = "7c0004aeFR0R",
|
||||
lddx_3 = "7c0004c6RRR",
|
||||
nego_2 = "7c0004d0RR.",
|
||||
lfdux_3 = "7c0004eeFR0R",
|
||||
stbdx_3 = "7c000506RRR",
|
||||
subfeo_3 = "7c000510RRR.",
|
||||
subeo_3 = "7c000510RRR~.",
|
||||
addeo_3 = "7c000514RRR.",
|
||||
@ -450,27 +702,42 @@ local map_op = {
|
||||
stswx_3 = "7c00052aRR0R",
|
||||
stwbrx_3 = "7c00052cRR0R",
|
||||
stfsx_3 = "7c00052eFR0R",
|
||||
sthdx_3 = "7c000546RRR",
|
||||
["stbcx._3"] = "7c00056dRRR",
|
||||
stfsux_3 = "7c00056eFR0R",
|
||||
stwdx_3 = "7c000586RRR",
|
||||
subfzeo_2 = "7c000590RR.",
|
||||
addzeo_2 = "7c000594RR.",
|
||||
stswi_3 = "7c0005aaRR0A",
|
||||
["sthcx._3"] = "7c0005adRRR",
|
||||
stfdx_3 = "7c0005aeFR0R",
|
||||
stddx_3 = "7c0005c6RRR",
|
||||
subfmeo_2 = "7c0005d0RR.",
|
||||
mulldo_3 = "7c0005d2RRR.",
|
||||
addmeo_2 = "7c0005d4RR.",
|
||||
mullwo_3 = "7c0005d6RRR.",
|
||||
dcba_2 = "7c0005ec-RR",
|
||||
stfdux_3 = "7c0005eeFR0R",
|
||||
stvepxl_3 = "7c00060eVRR",
|
||||
addo_3 = "7c000614RRR.",
|
||||
lhbrx_3 = "7c00062cRR0R",
|
||||
lfdpx_3 = "7c00062eF:RR",
|
||||
sraw_3 = "7c000630RR~R.",
|
||||
srad_3 = "7c000634RR~R.",
|
||||
lfddx_3 = "7c000646FRR",
|
||||
stvepx_3 = "7c00064eVRR",
|
||||
srawi_3 = "7c000670RR~A.",
|
||||
sradi_3 = "7c000674RR~H.",
|
||||
eieio_0 = "7c0006ac",
|
||||
lfiwax_3 = "7c0006aeFR0R",
|
||||
divdeuo_3 = "7c000712RRR.",
|
||||
divweuo_3 = "7c000716RRR.",
|
||||
sthbrx_3 = "7c00072cRR0R",
|
||||
stfdpx_3 = "7c00072eF:RR",
|
||||
extsh_2 = "7c000734RR~.",
|
||||
stfddx_3 = "7c000746FRR",
|
||||
divdeo_3 = "7c000752RRR.",
|
||||
divweo_3 = "7c000756RRR.",
|
||||
extsb_2 = "7c000774RR~.",
|
||||
divduo_3 = "7c000792RRR.",
|
||||
divwou_3 = "7c000796RRR.",
|
||||
@ -481,6 +748,40 @@ local map_op = {
|
||||
divwo_3 = "7c0007d6RRR.",
|
||||
dcbz_2 = "7c0007ec-RR",
|
||||
|
||||
["tbegin._1"] = "7c00051d1",
|
||||
["tbegin._0"] = "7c00051d",
|
||||
["tend._1"] = "7c00055dY",
|
||||
["tend._0"] = "7c00055d",
|
||||
["tendall._0"] = "7e00055d",
|
||||
tcheck_1 = "7c00059cX",
|
||||
["tsr._1"] = "7c0005dd1",
|
||||
["tsuspend._0"] = "7c0005dd",
|
||||
["tresume._0"] = "7c2005dd",
|
||||
["tabortwc._3"] = "7c00061dARR",
|
||||
["tabortdc._3"] = "7c00065dARR",
|
||||
["tabortwci._3"] = "7c00069dARS",
|
||||
["tabortdci._3"] = "7c0006ddARS",
|
||||
["tabort._1"] = "7c00071d-R-",
|
||||
["treclaim._1"] = "7c00075d-R",
|
||||
["trechkpt._0"] = "7c0007dd",
|
||||
|
||||
lxsiwzx_3 = "7c000018QRR",
|
||||
lxsiwax_3 = "7c000098QRR",
|
||||
mfvsrd_2 = "7c000066-Rq",
|
||||
mfvsrwz_2 = "7c0000e6-Rq",
|
||||
stxsiwx_3 = "7c000118QRR",
|
||||
mtvsrd_2 = "7c000166QR",
|
||||
mtvsrwa_2 = "7c0001a6QR",
|
||||
lxvdsx_3 = "7c000298QRR",
|
||||
lxsspx_3 = "7c000418QRR",
|
||||
lxsdx_3 = "7c000498QRR",
|
||||
stxsspx_3 = "7c000518QRR",
|
||||
stxsdx_3 = "7c000598QRR",
|
||||
lxvw4x_3 = "7c000618QRR",
|
||||
lxvd2x_3 = "7c000698QRR",
|
||||
stxvw4x_3 = "7c000718QRR",
|
||||
stxvd2x_3 = "7c000798QRR",
|
||||
|
||||
-- Primary opcode 30:
|
||||
rldicl_4 = "78000000RR~HM.",
|
||||
rldicr_4 = "78000004RR~HM.",
|
||||
@ -489,6 +790,12 @@ local map_op = {
|
||||
rldcl_4 = "78000010RR~RM.",
|
||||
rldcr_4 = "78000012RR~RM.",
|
||||
|
||||
-- Primary opcode 56:
|
||||
lq_2 = "e0000000R:D", -- NYI: displacement must be divisible by 8.
|
||||
|
||||
-- Primary opcode 57:
|
||||
lfdp_2 = "e4000000F:D", -- NYI: displacement must be divisible by 4.
|
||||
|
||||
-- Primary opcode 59:
|
||||
fdivs_3 = "ec000024FFF.",
|
||||
fsubs_3 = "ec000028FFF.",
|
||||
@ -501,6 +808,200 @@ local map_op = {
|
||||
fmadds_4 = "ec00003aFFFF~.",
|
||||
fnmsubs_4 = "ec00003cFFFF~.",
|
||||
fnmadds_4 = "ec00003eFFFF~.",
|
||||
fcfids_2 = "ec00069cF-F.",
|
||||
fcfidus_2 = "ec00079cF-F.",
|
||||
|
||||
dadd_3 = "ec000004FFF.",
|
||||
dqua_4 = "ec000006FFFZ.",
|
||||
dmul_3 = "ec000044FFF.",
|
||||
drrnd_4 = "ec000046FFFZ.",
|
||||
dscli_3 = "ec000084FF6.",
|
||||
dquai_4 = "ec000086SF~FZ.",
|
||||
dscri_3 = "ec0000c4FF6.",
|
||||
drintx_4 = "ec0000c61F~FZ.",
|
||||
dcmpo_3 = "ec000104XFF",
|
||||
dtstex_3 = "ec000144XFF",
|
||||
dtstdc_3 = "ec000184XF6",
|
||||
dtstdg_3 = "ec0001c4XF6",
|
||||
drintn_4 = "ec0001c61F~FZ.",
|
||||
dctdp_2 = "ec000204F-F.",
|
||||
dctfix_2 = "ec000244F-F.",
|
||||
ddedpd_3 = "ec000284ZF~F.",
|
||||
dxex_2 = "ec0002c4F-F.",
|
||||
dsub_3 = "ec000404FFF.",
|
||||
ddiv_3 = "ec000444FFF.",
|
||||
dcmpu_3 = "ec000504XFF",
|
||||
dtstsf_3 = "ec000544XFF",
|
||||
drsp_2 = "ec000604F-F.",
|
||||
dcffix_2 = "ec000644F-F.",
|
||||
denbcd_3 = "ec000684YF~F.",
|
||||
diex_3 = "ec0006c4FFF.",
|
||||
|
||||
-- Primary opcode 60:
|
||||
xsaddsp_3 = "f0000000QQQ",
|
||||
xsmaddasp_3 = "f0000008QQQ",
|
||||
xxsldwi_4 = "f0000010QQQz",
|
||||
xsrsqrtesp_2 = "f0000028Q-Q",
|
||||
xssqrtsp_2 = "f000002cQ-Q",
|
||||
xxsel_4 = "f0000030QQQQ",
|
||||
xssubsp_3 = "f0000040QQQ",
|
||||
xsmaddmsp_3 = "f0000048QQQ",
|
||||
xxpermdi_4 = "f0000050QQQz",
|
||||
xsresp_2 = "f0000068Q-Q",
|
||||
xsmulsp_3 = "f0000080QQQ",
|
||||
xsmsubasp_3 = "f0000088QQQ",
|
||||
xxmrghw_3 = "f0000090QQQ",
|
||||
xsdivsp_3 = "f00000c0QQQ",
|
||||
xsmsubmsp_3 = "f00000c8QQQ",
|
||||
xsadddp_3 = "f0000100QQQ",
|
||||
xsmaddadp_3 = "f0000108QQQ",
|
||||
xscmpudp_3 = "f0000118XQQ",
|
||||
xscvdpuxws_2 = "f0000120Q-Q",
|
||||
xsrdpi_2 = "f0000124Q-Q",
|
||||
xsrsqrtedp_2 = "f0000128Q-Q",
|
||||
xssqrtdp_2 = "f000012cQ-Q",
|
||||
xssubdp_3 = "f0000140QQQ",
|
||||
xsmaddmdp_3 = "f0000148QQQ",
|
||||
xscmpodp_3 = "f0000158XQQ",
|
||||
xscvdpsxws_2 = "f0000160Q-Q",
|
||||
xsrdpiz_2 = "f0000164Q-Q",
|
||||
xsredp_2 = "f0000168Q-Q",
|
||||
xsmuldp_3 = "f0000180QQQ",
|
||||
xsmsubadp_3 = "f0000188QQQ",
|
||||
xxmrglw_3 = "f0000190QQQ",
|
||||
xsrdpip_2 = "f00001a4Q-Q",
|
||||
xstsqrtdp_2 = "f00001a8X-Q",
|
||||
xsrdpic_2 = "f00001acQ-Q",
|
||||
xsdivdp_3 = "f00001c0QQQ",
|
||||
xsmsubmdp_3 = "f00001c8QQQ",
|
||||
xsrdpim_2 = "f00001e4Q-Q",
|
||||
xstdivdp_3 = "f00001e8XQQ",
|
||||
xvaddsp_3 = "f0000200QQQ",
|
||||
xvmaddasp_3 = "f0000208QQQ",
|
||||
xvcmpeqsp_3 = "f0000218QQQ",
|
||||
xvcvspuxws_2 = "f0000220Q-Q",
|
||||
xvrspi_2 = "f0000224Q-Q",
|
||||
xvrsqrtesp_2 = "f0000228Q-Q",
|
||||
xvsqrtsp_2 = "f000022cQ-Q",
|
||||
xvsubsp_3 = "f0000240QQQ",
|
||||
xvmaddmsp_3 = "f0000248QQQ",
|
||||
xvcmpgtsp_3 = "f0000258QQQ",
|
||||
xvcvspsxws_2 = "f0000260Q-Q",
|
||||
xvrspiz_2 = "f0000264Q-Q",
|
||||
xvresp_2 = "f0000268Q-Q",
|
||||
xvmulsp_3 = "f0000280QQQ",
|
||||
xvmsubasp_3 = "f0000288QQQ",
|
||||
xxspltw_3 = "f0000290QQg~",
|
||||
xvcmpgesp_3 = "f0000298QQQ",
|
||||
xvcvuxwsp_2 = "f00002a0Q-Q",
|
||||
xvrspip_2 = "f00002a4Q-Q",
|
||||
xvtsqrtsp_2 = "f00002a8X-Q",
|
||||
xvrspic_2 = "f00002acQ-Q",
|
||||
xvdivsp_3 = "f00002c0QQQ",
|
||||
xvmsubmsp_3 = "f00002c8QQQ",
|
||||
xvcvsxwsp_2 = "f00002e0Q-Q",
|
||||
xvrspim_2 = "f00002e4Q-Q",
|
||||
xvtdivsp_3 = "f00002e8XQQ",
|
||||
xvadddp_3 = "f0000300QQQ",
|
||||
xvmaddadp_3 = "f0000308QQQ",
|
||||
xvcmpeqdp_3 = "f0000318QQQ",
|
||||
xvcvdpuxws_2 = "f0000320Q-Q",
|
||||
xvrdpi_2 = "f0000324Q-Q",
|
||||
xvrsqrtedp_2 = "f0000328Q-Q",
|
||||
xvsqrtdp_2 = "f000032cQ-Q",
|
||||
xvsubdp_3 = "f0000340QQQ",
|
||||
xvmaddmdp_3 = "f0000348QQQ",
|
||||
xvcmpgtdp_3 = "f0000358QQQ",
|
||||
xvcvdpsxws_2 = "f0000360Q-Q",
|
||||
xvrdpiz_2 = "f0000364Q-Q",
|
||||
xvredp_2 = "f0000368Q-Q",
|
||||
xvmuldp_3 = "f0000380QQQ",
|
||||
xvmsubadp_3 = "f0000388QQQ",
|
||||
xvcmpgedp_3 = "f0000398QQQ",
|
||||
xvcvuxwdp_2 = "f00003a0Q-Q",
|
||||
xvrdpip_2 = "f00003a4Q-Q",
|
||||
xvtsqrtdp_2 = "f00003a8X-Q",
|
||||
xvrdpic_2 = "f00003acQ-Q",
|
||||
xvdivdp_3 = "f00003c0QQQ",
|
||||
xvmsubmdp_3 = "f00003c8QQQ",
|
||||
xvcvsxwdp_2 = "f00003e0Q-Q",
|
||||
xvrdpim_2 = "f00003e4Q-Q",
|
||||
xvtdivdp_3 = "f00003e8XQQ",
|
||||
xsnmaddasp_3 = "f0000408QQQ",
|
||||
xxland_3 = "f0000410QQQ",
|
||||
xscvdpsp_2 = "f0000424Q-Q",
|
||||
xscvdpspn_2 = "f000042cQ-Q",
|
||||
xsnmaddmsp_3 = "f0000448QQQ",
|
||||
xxlandc_3 = "f0000450QQQ",
|
||||
xsrsp_2 = "f0000464Q-Q",
|
||||
xsnmsubasp_3 = "f0000488QQQ",
|
||||
xxlor_3 = "f0000490QQQ",
|
||||
xscvuxdsp_2 = "f00004a0Q-Q",
|
||||
xsnmsubmsp_3 = "f00004c8QQQ",
|
||||
xxlxor_3 = "f00004d0QQQ",
|
||||
xscvsxdsp_2 = "f00004e0Q-Q",
|
||||
xsmaxdp_3 = "f0000500QQQ",
|
||||
xsnmaddadp_3 = "f0000508QQQ",
|
||||
xxlnor_3 = "f0000510QQQ",
|
||||
xscvdpuxds_2 = "f0000520Q-Q",
|
||||
xscvspdp_2 = "f0000524Q-Q",
|
||||
xscvspdpn_2 = "f000052cQ-Q",
|
||||
xsmindp_3 = "f0000540QQQ",
|
||||
xsnmaddmdp_3 = "f0000548QQQ",
|
||||
xxlorc_3 = "f0000550QQQ",
|
||||
xscvdpsxds_2 = "f0000560Q-Q",
|
||||
xsabsdp_2 = "f0000564Q-Q",
|
||||
xscpsgndp_3 = "f0000580QQQ",
|
||||
xsnmsubadp_3 = "f0000588QQQ",
|
||||
xxlnand_3 = "f0000590QQQ",
|
||||
xscvuxddp_2 = "f00005a0Q-Q",
|
||||
xsnabsdp_2 = "f00005a4Q-Q",
|
||||
xsnmsubmdp_3 = "f00005c8QQQ",
|
||||
xxleqv_3 = "f00005d0QQQ",
|
||||
xscvsxddp_2 = "f00005e0Q-Q",
|
||||
xsnegdp_2 = "f00005e4Q-Q",
|
||||
xvmaxsp_3 = "f0000600QQQ",
|
||||
xvnmaddasp_3 = "f0000608QQQ",
|
||||
["xvcmpeqsp._3"] = "f0000618QQQ",
|
||||
xvcvspuxds_2 = "f0000620Q-Q",
|
||||
xvcvdpsp_2 = "f0000624Q-Q",
|
||||
xvminsp_3 = "f0000640QQQ",
|
||||
xvnmaddmsp_3 = "f0000648QQQ",
|
||||
["xvcmpgtsp._3"] = "f0000658QQQ",
|
||||
xvcvspsxds_2 = "f0000660Q-Q",
|
||||
xvabssp_2 = "f0000664Q-Q",
|
||||
xvcpsgnsp_3 = "f0000680QQQ",
|
||||
xvnmsubasp_3 = "f0000688QQQ",
|
||||
["xvcmpgesp._3"] = "f0000698QQQ",
|
||||
xvcvuxdsp_2 = "f00006a0Q-Q",
|
||||
xvnabssp_2 = "f00006a4Q-Q",
|
||||
xvnmsubmsp_3 = "f00006c8QQQ",
|
||||
xvcvsxdsp_2 = "f00006e0Q-Q",
|
||||
xvnegsp_2 = "f00006e4Q-Q",
|
||||
xvmaxdp_3 = "f0000700QQQ",
|
||||
xvnmaddadp_3 = "f0000708QQQ",
|
||||
["xvcmpeqdp._3"] = "f0000718QQQ",
|
||||
xvcvdpuxds_2 = "f0000720Q-Q",
|
||||
xvcvspdp_2 = "f0000724Q-Q",
|
||||
xvmindp_3 = "f0000740QQQ",
|
||||
xvnmaddmdp_3 = "f0000748QQQ",
|
||||
["xvcmpgtdp._3"] = "f0000758QQQ",
|
||||
xvcvdpsxds_2 = "f0000760Q-Q",
|
||||
xvabsdp_2 = "f0000764Q-Q",
|
||||
xvcpsgndp_3 = "f0000780QQQ",
|
||||
xvnmsubadp_3 = "f0000788QQQ",
|
||||
["xvcmpgedp._3"] = "f0000798QQQ",
|
||||
xvcvuxddp_2 = "f00007a0Q-Q",
|
||||
xvnabsdp_2 = "f00007a4Q-Q",
|
||||
xvnmsubmdp_3 = "f00007c8QQQ",
|
||||
xvcvsxddp_2 = "f00007e0Q-Q",
|
||||
xvnegdp_2 = "f00007e4Q-Q",
|
||||
|
||||
-- Primary opcode 61:
|
||||
stfdp_2 = "f4000000F:D", -- NYI: displacement must be divisible by 4.
|
||||
|
||||
-- Primary opcode 62:
|
||||
stq_2 = "f8000002R:D", -- NYI: displacement must be divisible by 8.
|
||||
|
||||
-- Primary opcode 63:
|
||||
fdiv_3 = "fc000024FFF.",
|
||||
@ -526,8 +1027,12 @@ local map_op = {
|
||||
frsp_2 = "fc000018F-F.",
|
||||
fctiw_2 = "fc00001cF-F.",
|
||||
fctiwz_2 = "fc00001eF-F.",
|
||||
ftdiv_2 = "fc000100X-F.",
|
||||
fctiwu_2 = "fc00011cF-F.",
|
||||
fctiwuz_2 = "fc00011eF-F.",
|
||||
mtfsfi_2 = "fc00010cAA", -- NYI: upshift.
|
||||
fnabs_2 = "fc000110F-F.",
|
||||
ftsqrt_2 = "fc000140X-F.",
|
||||
fabs_2 = "fc000210F-F.",
|
||||
frin_2 = "fc000310F-F.",
|
||||
friz_2 = "fc000350F-F.",
|
||||
@ -537,7 +1042,38 @@ local map_op = {
|
||||
-- NYI: mtfsf, mtfsb0, mtfsb1.
|
||||
fctid_2 = "fc00065cF-F.",
|
||||
fctidz_2 = "fc00065eF-F.",
|
||||
fmrgow_3 = "fc00068cFFF",
|
||||
fcfid_2 = "fc00069cF-F.",
|
||||
fctidu_2 = "fc00075cF-F.",
|
||||
fctiduz_2 = "fc00075eF-F.",
|
||||
fmrgew_3 = "fc00078cFFF",
|
||||
fcfidu_2 = "fc00079cF-F.",
|
||||
|
||||
daddq_3 = "fc000004F:F:F:.",
|
||||
dquaq_4 = "fc000006F:F:F:Z.",
|
||||
dmulq_3 = "fc000044F:F:F:.",
|
||||
drrndq_4 = "fc000046F:F:F:Z.",
|
||||
dscliq_3 = "fc000084F:F:6.",
|
||||
dquaiq_4 = "fc000086SF:~F:Z.",
|
||||
dscriq_3 = "fc0000c4F:F:6.",
|
||||
drintxq_4 = "fc0000c61F:~F:Z.",
|
||||
dcmpoq_3 = "fc000104XF:F:",
|
||||
dtstexq_3 = "fc000144XF:F:",
|
||||
dtstdcq_3 = "fc000184XF:6",
|
||||
dtstdgq_3 = "fc0001c4XF:6",
|
||||
drintnq_4 = "fc0001c61F:~F:Z.",
|
||||
dctqpq_2 = "fc000204F:-F:.",
|
||||
dctfixq_2 = "fc000244F:-F:.",
|
||||
ddedpdq_3 = "fc000284ZF:~F:.",
|
||||
dxexq_2 = "fc0002c4F:-F:.",
|
||||
dsubq_3 = "fc000404F:F:F:.",
|
||||
ddivq_3 = "fc000444F:F:F:.",
|
||||
dcmpuq_3 = "fc000504XF:F:",
|
||||
dtstsfq_3 = "fc000544XF:F:",
|
||||
drdpq_2 = "fc000604F:-F:.",
|
||||
dcffixq_2 = "fc000644F:-F:.",
|
||||
denbcdq_3 = "fc000684YF:~F:.",
|
||||
diexq_3 = "fc0006c4F:FF:.",
|
||||
|
||||
-- Primary opcode 4, SPE APU extension:
|
||||
evaddw_3 = "10000200RRR",
|
||||
@ -884,6 +1420,24 @@ local function parse_fpr(expr)
|
||||
werror("bad register name `"..expr.."'")
|
||||
end
|
||||
|
||||
local function parse_vr(expr)
|
||||
local r = match(expr, "^v([1-3]?[0-9])$")
|
||||
if r then
|
||||
r = tonumber(r)
|
||||
if r <= 31 then return r end
|
||||
end
|
||||
werror("bad register name `"..expr.."'")
|
||||
end
|
||||
|
||||
local function parse_vs(expr)
|
||||
local r = match(expr, "^vs([1-6]?[0-9])$")
|
||||
if r then
|
||||
r = tonumber(r)
|
||||
if r <= 63 then return r end
|
||||
end
|
||||
werror("bad register name `"..expr.."'")
|
||||
end
|
||||
|
||||
local function parse_cr(expr)
|
||||
local r = match(expr, "^cr([0-7])$")
|
||||
if r then return tonumber(r) end
|
||||
@ -914,7 +1468,8 @@ local function parse_imm(imm, bits, shift, scale, signed)
|
||||
end
|
||||
end
|
||||
werror("out of range immediate `"..imm.."'")
|
||||
elseif match(imm, "^r([1-3]?[0-9])$") or
|
||||
elseif match(imm, "^[rfv]([1-3]?[0-9])$") or
|
||||
match(imm, "^vs([1-6]?[0-9])$") or
|
||||
match(imm, "^([%w_]+):(r[1-3]?[0-9])$") then
|
||||
werror("expected immediate operand, got register")
|
||||
else
|
||||
@ -1027,6 +1582,15 @@ map_op[".template__"] = function(params, template, nparams)
|
||||
rs = rs - 5; op = op + shl(parse_gpr(params[n]), rs); n = n + 1
|
||||
elseif p == "F" then
|
||||
rs = rs - 5; op = op + shl(parse_fpr(params[n]), rs); n = n + 1
|
||||
elseif p == "V" then
|
||||
rs = rs - 5; op = op + shl(parse_vr(params[n]), rs); n = n + 1
|
||||
elseif p == "Q" then
|
||||
local vs = parse_vs(params[n]); n = n + 1; rs = rs - 5
|
||||
local sh = rs == 6 and 2 or 3 + band(shr(rs, 1), 3)
|
||||
op = op + shl(band(vs, 31), rs) + shr(band(vs, 32), sh)
|
||||
elseif p == "q" then
|
||||
local vs = parse_vs(params[n]); n = n + 1
|
||||
op = op + shl(band(vs, 31), 21) + shr(band(vs, 32), 5)
|
||||
elseif p == "A" then
|
||||
rs = rs - 5; op = op + parse_imm(params[n], 5, rs, 0, false); n = n + 1
|
||||
elseif p == "S" then
|
||||
@ -1047,6 +1611,26 @@ map_op[".template__"] = function(params, template, nparams)
|
||||
rs = rs - 5; op = op + shl(parse_cond(params[n]), rs); n = n + 1
|
||||
elseif p == "X" then
|
||||
rs = rs - 5; op = op + shl(parse_cr(params[n]), rs+2); n = n + 1
|
||||
elseif p == "1" then
|
||||
rs = rs - 5; op = op + parse_imm(params[n], 1, rs, 0, false); n = n + 1
|
||||
elseif p == "g" then
|
||||
rs = rs - 5; op = op + parse_imm(params[n], 2, rs, 0, false); n = n + 1
|
||||
elseif p == "3" then
|
||||
rs = rs - 5; op = op + parse_imm(params[n], 3, rs, 0, false); n = n + 1
|
||||
elseif p == "P" then
|
||||
rs = rs - 5; op = op + parse_imm(params[n], 4, rs, 0, false); n = n + 1
|
||||
elseif p == "p" then
|
||||
op = op + parse_imm(params[n], 4, rs, 0, false); n = n + 1
|
||||
elseif p == "6" then
|
||||
rs = rs - 6; op = op + parse_imm(params[n], 6, rs, 0, false); n = n + 1
|
||||
elseif p == "Y" then
|
||||
rs = rs - 5; op = op + parse_imm(params[n], 1, rs+4, 0, false); n = n + 1
|
||||
elseif p == "y" then
|
||||
rs = rs - 5; op = op + parse_imm(params[n], 1, rs+3, 0, false); n = n + 1
|
||||
elseif p == "Z" then
|
||||
rs = rs - 5; op = op + parse_imm(params[n], 2, rs+3, 0, false); n = n + 1
|
||||
elseif p == "z" then
|
||||
rs = rs - 5; op = op + parse_imm(params[n], 2, rs+2, 0, false); n = n + 1
|
||||
elseif p == "W" then
|
||||
op = op + parse_cr(params[n]); n = n + 1
|
||||
elseif p == "G" then
|
||||
@ -1071,6 +1655,8 @@ map_op[".template__"] = function(params, template, nparams)
|
||||
local lo = band(op, mm)
|
||||
local hi = band(op, shl(mm, 5))
|
||||
op = op - lo - hi + shl(lo, 5) + shr(hi, 5)
|
||||
elseif p == ":" then
|
||||
if band(shr(op, rs), 1) ~= 0 then werror("register pair expected") end
|
||||
elseif p == "-" then
|
||||
rs = rs - 5
|
||||
elseif p == "." then
|
||||
|
Loading…
Reference in New Issue
Block a user