diff --git a/dynasm/dasm_s390x.lua b/dynasm/dasm_s390x.lua index 3542e7ee..e39a27f1 100644 --- a/dynasm/dasm_s390x.lua +++ b/dynasm/dasm_s390x.lua @@ -652,311 +652,565 @@ end) -- Template strings for ARM instructions. map_op = { - -- Basic data processing instructions. - --add - ar = "0000000000001a00", --RR - ay = "0000e3000000005a", --RXY-a - ag = "0000e30000000008", - agr = "00000000b9080000", --RRE - agf = "0000e30000000018", - agfr = "00000000b9180000", - agbr = "00000000b34a0000", - adbr = "00000000b31a0000", - aebr = "00000000b30a0000", - ah = "000000004a000000", --RXa - ahy = "0000e3000000007a", - afi = "0000c20900000000", --RIL-a --pls check if this is correct - agfi = "0000c20800000000", - aih = "0000cc0800000000", - al = "000000005e000000", - alr = "0000000000001e00", - aly = "0000e3000000005e", -- RXY-a - alg = "0000e3000000000a", - algr = "00000000b90a0000", - algf = "0000e3000000001a", - algfr = "00000000b91a0000", - alfi = "0000c20b00000000", - algfi = "0000c20a00000000", - alc = "0000e30000000098", - alcr = "00000000b9980000", -- RRE - alcg = "0000e30000000088", - alcgr = "00000000b9880000", - alsih = "0000cc0a00000000", - alsihn ="0000cc0b00000000", - axr = "0000000000003600", -- RR - ad = "000000006a000000", -- Rx-a - adr = "0000000000002a00", - ae = "000000007a000000", - aer = "0000000000003a00", - aw = "000000006e000000", - awr = "0000000000002e00", - au = "000000007e000000", - aur = "0000000000003e00", - --- and - n = "0000000054000000", - nr = "0000000000001400", - ny = "0000e30000000054", -- RXY-a - ng = "0000e30000000080", - ngr = "00000000b9800000", - nihf = "0000c00a00000000", --RIL-a - nihl = "0000c00b00000000", - - --branch related instrcutions - bal = "0000000045000000", --RX-a - balr = "0000000000005000", --RR - bas = "000000004d000000", - basr = "0000000000000d00", -- this has leading zero in the instrcution opcode: 0d, need to take into consideration - bassm = "0000000000000c00", - bsm = "0000000000000b00", - bc = "0000000047000000", - bcr = "0000000000000700", - bct = "0000000046000000", - bctr = "0000000000000600", - bctg = "0000e30000000046", - bctgr = "00000000b9460000", - bxh = "0000000086000000", --RS-a - bxhg = "0000eb0000000044", - bxle = "0000000087000000", - bxleg = "0000eb0000000045", -- RSY-a - --bras = "000000000a750000RI-b", - brasl = "0000c00500000000", --RIL-b - --brc = "000000000a740000RI-c", - brcl = "0000c00400000000", --RIL-c - --brct = "000000000a760000RI-b", - --brctg = "000000000a770000RI-b", - brcth = "0000cc0600000000", - --brxh = "0000000000840000RSI", - --brxhg = "00000000ec440000RIE-e", - --brxle = "0000000000850000RSI", - --brxlg = "00000000ec450000RIE-e", - - ----subtraction (basic operation) - sub = "00000000005b0000RX-a" - sr = "00000000001b0000RR" - srk = "00000000b9f90000RRF-a" - sy = "00000000e35b0000RXY-a" - sg = "00000000e3090000RXY-a" - sgr = "00000000b9090000RRE" - sgrk = "00000000b9e90000RRF-a" - sgf = "00000000e3190000RXY-a" - sgfr = "00000000b9190000RRE" - sh = "00000000004b0000RX-a" - shy = "00000000e37b0000RXY-a" - shhhr = "00000000b9c90000RRF-a" - shhlr = "00000000b9d90000RX-a" - sl = "00000000005f0000RX-a" - slr = "00000000001f0000RR" - slrk = "00000000b9f80000RR" - sly = "00000000e35f0000RXY-a", - slg = "00000000e30b0000RXY-a", - slgr = "00000000b9080000RRE", - slgrk = "00000000b9eb0000RRF-a", - slgf = "00000000e3180000RXY-a", - slgfr = "00000000b91b0000RRE", - slhhhr = "00000000b9cb0000RRF-a", - slhhlr = "00000000b9db0000RRF-a", - slfi = "000000000c250000RIL-a", - slgfi = "000000000c240000RIL-a", - slb = "00000000e3990000RXY-a", - slbr = "00000000b9990000RRE" , - slbg = "00000000e3890000RXY-a", - slbgr = "00000000b9890000RXY-a", - - cmp_2 = "0000000000590000RX-a|0000000000190000RR|00000000e3590000RXY-a", - cmp_3 = "00000000e3200000RXY-a|00000000b9200000RRE|00000000e3300000RXY-a| 00000000b9300000RRE", - - div_2 = "00000000005d0000RX-a|00000000001d0000RR|00000000e3970000RXY-a|00000000b9970000RRE", - div_3 ="00000000e3870000RXY-a|00000000b9870000RRE", - div_sing ="00000000e30d0000RXY-a|00000000b90d0000RRE|00000000e31d0000RXY-a|00000000b91d0000RRE", - - eor_2 = "0000000000570000RX-a|0000000000170000RR|00000000b9f70000RRF-a|00000000e3570000RXY-a", - eor_3 = "00000000e3820000RXY-a|00000000b9820000RRE|00000000b9e70000RRF-a| - eor_c = "0000000000d70000SS-a", - eor_i = "0000000000970000SI| 00000000eb570000|000000000c060000a|000000000c070000RIL-a", - - -- load instruction to be added and the following instructions need to be changed (are not s390x related) - - neg_2 = "4b0003e0DMg", - neg_3 = "4b0003e0DMSg", - negs_2 = "6b0003e0DMg", - negs_3 = "6b0003e0DMSg", - adc_3 = "1a000000DNMg", - adcs_3 = "3a000000DNMg", - sbc_3 = "5a000000DNMg", - sbcs_3 = "7a000000DNMg", - ngc_2 = "5a0003e0DMg", - ngcs_2 = "7a0003e0DMg", - and_3 = "0a000000DNMg|12000000pDNig", - and_4 = "0a000000DNMSg", - orr_3 = "2a000000DNMg|32000000pDNig", - orr_4 = "2a000000DNMSg", - eor_3 = "4a000000DNMg|52000000pDNig", - eor_4 = "4a000000DNMSg", - ands_3 = "6a000000DNMg|72000000DNig", - ands_4 = "6a000000DNMSg", - tst_2 = "6a00001fNMg|7200001fNig", - tst_3 = "6a00001fNMSg", - bic_3 = "0a200000DNMg", - bic_4 = "0a200000DNMSg", - orn_3 = "2a200000DNMg", - orn_4 = "2a200000DNMSg", - eon_3 = "4a200000DNMg", - eon_4 = "4a200000DNMSg", - bics_3 = "6a200000DNMg", - bics_4 = "6a200000DNMSg", - movn_2 = "12800000DWg", - movn_3 = "12800000DWRg", - movz_2 = "52800000DWg", - movz_3 = "52800000DWRg", - movk_2 = "72800000DWg", - movk_3 = "72800000DWRg", - -- TODO: this doesn't cover all valid immediates for mov reg, #imm. - mov_2 = "2a0003e0DMg|52800000DW|320003e0pDig|11000000pDpNg", - mov_3 = "2a0003e0DMSg", - mvn_2 = "2a2003e0DMg", - mvn_3 = "2a2003e0DMSg", - adr_2 = "10000000DBx", - adrp_2 = "90000000DBx", - csel_4 = "1a800000DNMCg", - csinc_4 = "1a800400DNMCg", - csinv_4 = "5a800000DNMCg", - csneg_4 = "5a800400DNMCg", - cset_2 = "1a9f07e0Dcg", - csetm_2 = "5a9f03e0Dcg", - cinc_3 = "1a800400DNmcg", - cinv_3 = "5a800000DNmcg", - cneg_3 = "5a800400DNmcg", - ccmn_4 = "3a400000NMVCg|3a400800N5VCg", - ccmp_4 = "7a400000NMVCg|7a400800N5VCg", - madd_4 = "1b000000DNMAg", - msub_4 = "1b008000DNMAg", - mul_3 = "1b007c00DNMg", - mneg_3 = "1b00fc00DNMg", - smaddl_4 = "9b200000DxNMwAx", - smsubl_4 = "9b208000DxNMwAx", - smull_3 = "9b207c00DxNMw", - smnegl_3 = "9b20fc00DxNMw", - smulh_3 = "9b407c00DNMx", - umaddl_4 = "9ba00000DxNMwAx", - umsubl_4 = "9ba08000DxNMwAx", - umull_3 = "9ba07c00DxNMw", - umnegl_3 = "9ba0fc00DxNMw", - umulh_3 = "9bc07c00DNMx", - udiv_3 = "1ac00800DNMg", - sdiv_3 = "1ac00c00DNMg", - -- Bit operations. - sbfm_4 = "13000000DN12w|93400000DN12x", - bfm_4 = "33000000DN12w|b3400000DN12x", - ubfm_4 = "53000000DN12w|d3400000DN12x", - extr_4 = "13800000DNM2w|93c00000DNM2x", - sxtb_2 = "13001c00DNw|93401c00DNx", - sxth_2 = "13003c00DNw|93403c00DNx", - sxtw_2 = "93407c00DxNw", - uxtb_2 = "53001c00DNw", - uxth_2 = "53003c00DNw", - sbfx_4 = op_alias("sbfm_4", alias_bfx), - bfxil_4 = op_alias("bfm_4", alias_bfx), - ubfx_4 = op_alias("ubfm_4", alias_bfx), - sbfiz_4 = op_alias("sbfm_4", alias_bfiz), - bfi_4 = op_alias("bfm_4", alias_bfiz), - ubfiz_4 = op_alias("ubfm_4", alias_bfiz), - lsl_3 = function(params, nparams) - if params and params[3]:byte() == 35 then - return alias_lslimm(params, nparams) - else - return op_template(params, "1ac02000DNMg", nparams) - end - end, - lsr_3 = "1ac02400DNMg|53007c00DN1w|d340fc00DN1x", - asr_3 = "1ac02800DNMg|13007c00DN1w|9340fc00DN1x", - ror_3 = "1ac02c00DNMg|13800000DNm2w|93c00000DNm2x", - clz_2 = "5ac01000DNg", - cls_2 = "5ac01400DNg", - rbit_2 = "5ac00000DNg", - rev_2 = "5ac00800DNw|dac00c00DNx", - rev16_2 = "5ac00400DNg", - rev32_2 = "dac00800DNx", - -- Loads and stores. - ["strb_*"] = "38000000DwL", - ["ldrb_*"] = "38400000DwL", - ["ldrsb_*"] = "38c00000DwL|38800000DxL", - ["strh_*"] = "78000000DwL", - ["ldrh_*"] = "78400000DwL", - ["ldrsh_*"] = "78c00000DwL|78800000DxL", - ["str_*"] = "b8000000DwL|f8000000DxL|bc000000DsL|fc000000DdL", - ["ldr_*"] = "18000000DwB|58000000DxB|1c000000DsB|5c000000DdB|b8400000DwL|f8400000DxL|bc400000DsL|fc400000DdL", - ["ldrsw_*"] = "98000000DxB|b8800000DxL", - -- NOTE: ldur etc. are handled by ldr et al. - ["stp_*"] = "28000000DAwP|a8000000DAxP|2c000000DAsP|6c000000DAdP", - ["ldp_*"] = "28400000DAwP|a8400000DAxP|2c400000DAsP|6c400000DAdP", - ["ldpsw_*"] = "68400000DAxP", - -- Branches. - b_1 = "14000000B", - bl_1 = "94000000B", - blr_1 = "d63f0000Nx", - br_1 = "d61f0000Nx", - ret_0 = "d65f03c0", - ret_1 = "d65f0000Nx", - -- b.cond is added below. - cbz_2 = "34000000DBg", - cbnz_2 = "35000000DBg", - tbz_3 = "36000000DTBw|36000000DTBx", - tbnz_3 = "37000000DTBw|37000000DTBx", - -- Miscellaneous instructions. - -- TODO: hlt, hvc, smc, svc, eret, dcps[123], drps, mrs, msr - -- TODO: sys, sysl, ic, dc, at, tlbi - -- TODO: hint, yield, wfe, wfi, sev, sevl - -- TODO: clrex, dsb, dmb, isb - nop_0 = "d503201f", - brk_0 = "d4200000", - brk_1 = "d4200000W", - -- Floating point instructions. - fmov_2 = "1e204000DNf|1e260000DwNs|1e270000DsNw|9e660000DxNd|9e670000DdNx|1e201000DFf", - fabs_2 = "1e20c000DNf", - fneg_2 = "1e214000DNf", - fsqrt_2 = "1e21c000DNf", - fcvt_2 = "1e22c000DdNs|1e624000DsNd", - -- TODO: half-precision and fixed-point conversions. - fcvtas_2 = "1e240000DwNs|9e240000DxNs|1e640000DwNd|9e640000DxNd", - fcvtau_2 = "1e250000DwNs|9e250000DxNs|1e650000DwNd|9e650000DxNd", - fcvtms_2 = "1e300000DwNs|9e300000DxNs|1e700000DwNd|9e700000DxNd", - fcvtmu_2 = "1e310000DwNs|9e310000DxNs|1e710000DwNd|9e710000DxNd", - fcvtns_2 = "1e200000DwNs|9e200000DxNs|1e600000DwNd|9e600000DxNd", - fcvtnu_2 = "1e210000DwNs|9e210000DxNs|1e610000DwNd|9e610000DxNd", - fcvtps_2 = "1e280000DwNs|9e280000DxNs|1e680000DwNd|9e680000DxNd", - fcvtpu_2 = "1e290000DwNs|9e290000DxNs|1e690000DwNd|9e690000DxNd", - fcvtzs_2 = "1e380000DwNs|9e380000DxNs|1e780000DwNd|9e780000DxNd", - fcvtzu_2 = "1e390000DwNs|9e390000DxNs|1e790000DwNd|9e790000DxNd", - scvtf_2 = "1e220000DsNw|9e220000DsNx|1e620000DdNw|9e620000DdNx", - ucvtf_2 = "1e230000DsNw|9e230000DsNx|1e630000DdNw|9e630000DdNx", - frintn_2 = "1e244000DNf", - frintp_2 = "1e24c000DNf", - frintm_2 = "1e254000DNf", - frintz_2 = "1e25c000DNf", - frinta_2 = "1e264000DNf", - frintx_2 = "1e274000DNf", - frinti_2 = "1e27c000DNf", - fadd_3 = "1e202800DNMf", - fsub_3 = "1e203800DNMf", - fmul_3 = "1e200800DNMf", - fnmul_3 = "1e208800DNMf", - fdiv_3 = "1e201800DNMf", - fmadd_4 = "1f000000DNMAf", - fmsub_4 = "1f008000DNMAf", - fnmadd_4 = "1f200000DNMAf", - fnmsub_4 = "1f208000DNMAf", - fmax_3 = "1e204800DNMf", - fmaxnm_3 = "1e206800DNMf", - fmin_3 = "1e205800DNMf", - fminnm_3 = "1e207800DNMf", - fcmp_2 = "1e202000NMf|1e202008NZf", - fcmpe_2 = "1e202010NMf|1e202018NZf", - fccmp_4 = "1e200400NMVCf", - fccmpe_4 = "1e200410NMVCf", - fcsel_4 = "1e200c00DNMCf", - -- TODO: crc32*, aes*, sha*, pmull - -- TODO: SIMD instructions. + a = "000000005a000000j", +ar = "0000000000001a00g", +ay = "0000e3000000005ak", +ag = "0000e30000000008k", +agr = "00000000b9080000h", +agf = "0000e30000000018k", +agfr = "00000000b9180000h", +axbr = "00000000b34a0000h", +adbr = "00000000b31a0000h", +aebr = "00000000b30a0000h", +ah = "000000004a000000j", +ahy = "0000e3000000007ak", +afi = "0000c20900000000l", +agfi = "0000c20800000000l", +aih = "0000cc0800000000l", +al = "000000005e000000j", +alr = "0000000000001e00g", +aly = "0000e3000000005ek", +alg = "0000e3000000000ak", +algr = "00000000b90a0000h", +algf = "0000e3000000001ak", +algfr = "00000000b91a0000h", +alfi = "0000c20b00000000l", +algfi = "0000c20a00000000l", +alc = "0000e30000000098k", +alcr = "00000000b9980000h", +alcg = "0000e30000000088k", +alcgr = "00000000b9880000h", +alsih = "0000cc0a00000000l", +alsihn = "0000cc0b00000000l", +axr = "0000000000003600g", +ad = "000000006a000000j", +adr = "0000000000002a00g", +ae = "000000007a000000j", +aer = "0000000000003a00g", +aw = "000000006e000000j", +awr = "0000000000002e00g", +au = "000000007e000000j", +aur = "0000000000003e00g", +n = "0000000054000000j", +nr = "0000000000001400g", +ny = "0000e30000000054k", +ng = "0000e30000000080k", +ngr = "00000000b9800000h", +nihf = "0000c00a00000000l", +nilf = "0000c00b00000000l", +bal = "0000000045000000j", +balr = "000000000000500g", +bas = "000000004d000000j", +basr = "0000000000000d00g", +bassm = "0000000000000c00g", +bsa = "00000000b25a0000h", +bsm = "0000000000000b00g", +bakr = "00000000b2400000h", +bsg = "00000000b2580000h", +bc = "0000000047000000j", +bcr = "000000000000700g", +bct = "0000000046000000j", +bctr = "000000000000600g", +bctg = "0000e30000000046k", +bctgr = "00000000b9460000h", +bxh = "0000000086000000m", +bxhg = "0000eb0000000044n", +bxle = "0000000087000000m", +bxleg = "0000eb0000000045n", +brasl = "0000c00500000000l", +brcl = "0000c00400000000l", +brcth = "0000cc0600000000l", +cksm = "00000000b2410000h", +km = "00000000b92e0000h", +kmf = "00000000b92a0000h", +kmc = "00000000b92f0000h", +kmo = "00000000b92b0000h", +c = "0000000059000000j", +cr = "0000000000001900g", +cy = "0000e30000000059k", +cg = "0000e30000000020k", +cgr = "00000000b9200000h", +cgf = "0000e30000000030k", +cgfr = "00000000b9300000h", +cxbr = "00000000b3490000h", +cxtr = "00000000b3ec0000h", +cxr = "00000000b3690000h", +cdbr = "00000000b3190000h", +cdtr = "00000000b3e40000h", +cd = "0000000069000000j", +cdr = "0000000000002900g", +cebr = "00000000b3090000h", +ce = "0000000079000000j", +cer = "0000000000003900g", +kxbr = "00000000b3480000h", +kxtr = "00000000b3e80000h", +kdbr = "00000000b3180000h", +kdtr = "00000000b3e00000h", +kebr = "00000000b3080000h", +cs = "00000000ba000000m", +csy = "0000eb0000000014n", +csg = "0000eb0000000030n", +csp = "00000000b2500000h", +cspg = "00000000b98a0000h", +cextr = "00000000b3fc0000h", +cedtr = "00000000b3f40000h", +cds = "00000000bb000000m", +cdsy = "0000eb0000000031n", +cdsg = "0000eb000000003en", +ch = "0000000049000000j", +chy = "0000e30000000079k", +cgh = "0000e30000000034k", +chrl = "0000c60500000000l", +cghrl = "0000c60400000000l", +chf = "0000e300000000cdk", +chhr = "00000000b9cd0000h", +chlr = "00000000b9dd0000h", +cfi = "0000c20d00000000l", +cgfi = "0000c20c00000000l", +cih = "0000cc0d00000000l", +cl = "0000000055000000j", +clr = "0000000000001500g", +cly = "0000e30000000055k", +clg = "0000e30000000021k", +clgr = "00000000b9210000h", +clgf = "0000e30000000031k", +clgfr = "00000000b9310000h", +clmh = "0000eb0000000020n", +clm = "00000000bd000000m", +clmy = "0000eb0000000021n", +clhf = "0000e300000000cfk", +clhhr = "00000000b9cf0000h", +clhlr = "00000000b9df0000h", +clfi = "0000c20f00000000l", +clgfi = "0000c20e00000000l", +clih = "0000cc0f00000000l", +clcl = "0000000000000f00g", +clcle = "00000000a9000000m", +clclu = "0000eb000000008fn", +clrl = "0000c60f00000000l", +clhrl = "0000c60700000000l", +clgrl = "0000c60a00000000l", +clghrl = "0000c60600000000l", +clgfrl = "0000c60e00000000l", +clst = "00000000b25d0000h", +crl = "0000c60d00000000l", +cgrl = "0000c60800000000l", +cgfrl = "0000c60c00000000l", + cuse = "00000000b2570000h", +cmpsc = "00000000b2630000h", +kimd = "00000000b93e0000h", +klmd = "00000000b93f0000h", +kmac = "00000000b91e0000h", +thdr = "00000000b3590000h", +thder = "00000000b3580000h", +cxfbr = "00000000b3960000h", +cxftr = "00000000b9590000h", +cxfr = "00000000b3b60000h", +cdfbr = "00000000b3950000h", +cdftr = "00000000b9510000h", +cdfr = "00000000b3b50000h", +cefbr = "00000000b3940000h", +cefr = "00000000b3b40000h", +cxgbr = "00000000b3a60000h", +cxgtr = "00000000b3f90000h", +cxgr = "00000000b3c60000h", +cdgbr = "00000000b3a50000h", +cdgtr = "00000000b3f10000h", +cdgr = "00000000b3c50000h", +cegbr = "00000000b3a40000h", +cegr = "00000000b3c40000h", +cxstr = "00000000b3fb0000h", +cdstr = "00000000b3f30000h", +cxutr = "00000000b3fa0000h", +cdutr = "00000000b3f20000h", +cvb = "000000004f000000j", +cvby = "0000e30000000006k", +cvbg = "0000e3000000000ek", +cvd = "000000004e000000j", +cvdy = "0000e30000000026k", +cvdg = "0000e3000000002ek", +cuxtr = "00000000b3ea0000h", +cudtr = "00000000b3e20000h", +cu42 = "00000000b9b30000h", +cu41 = "00000000b9b20000h", +cpya = "00000000b24d0000h", +d = "000000005d000000j", +dr = "0000000000001d00g", +dxbr = "00000000b34d0000h", +dxr = "00000000b22d0000h", +ddbr = "00000000b31d0000h", +dd = "000000006d000000j", +ddr = "0000000000002d00g", +debr = "00000000b30d0000h", +de = "000000007d000000j", +der = "0000000000003d00g", +dl = "0000e30000000097k", +dlr = "00000000b9970000h", +dlg = "0000e30000000087k", +dlgr = "00000000b9870000h", +dsg = "0000e3000000000dk", +dsgr = "00000000b90d0000h", +dsgf = "0000e3000000001dk", +dsgfr = "00000000b91d0000h", +x = "0000000057000000j", +xr = "0000000000001700g", +xy = "0000e30000000057k", +xg = "0000e30000000082k", +xgr = "00000000b9820000h", +xihf = "0000c00600000000l", +xilf = "0000c00700000000l", +ex = "0000000044000000j", +exrl = "0000c60000000000l", +ear = "00000000b24f0000h", +esea = "00000000b99d0000h", +eextr = "00000000b3ed0000h", +eedtr = "00000000b3e50000h", +ecag = "0000eb000000004cn", +efpc = "00000000b38c0000h", +epar = "00000000b2260000h", +epair = "00000000b99a0000h", +epsw = "00000000b98d0000h", +esar = "00000000b2270000h", +esair = "00000000b99b0000h", +esxtr = "00000000b3ef0000h", +esdtr = "00000000b3e70000h", +ereg = "00000000b2490000h", +eregg = "00000000b90e0000h", +esta = "00000000b24a0000h", +flogr = "00000000b9830000h", +hdr = "0000000000002400g", +her = "0000000000003400g", +iac = "00000000b2240000h", +ic = "0000000043000000j", +icy = "0000e30000000073k", +icmh = "0000eb0000000080n", +icm = "00000000bf000000m", +icmy = "0000eb0000000081n", +iihf = "0000c00800000000l", +iilf = "0000c00900000000l", +ipm = "00000000b2220000h", +iske = "00000000b2290000h", +ivsk = "00000000b2230000h", +l = "0000000058000000j", +lr = "0000000000001800g", +ly = "0000e30000000058k", +lg = "0000e30000000004k", +lgr = "00000000b9040000h", +lgf = "0000e30000000014k", +lgfr = "00000000b9140000h", +lxr = "00000000b3650000h", +ld = "0000000068000000j", +ldr = "0000000000002800g", +ldy = "0000ed0000000065k", +le = "0000000078000000j", +ler = "0000000000003800g", + ley = "0000ed0000000064k", +lam = "000000009a000000m", +lamy = "0000eb000000009an", +la = "0000000041000000j", +lay = "0000e30000000071k", +lae = "0000000051000000j", +laey = "0000e30000000075k", +larl = "0000c00000000000l", +laa = "0000eb00000000f8n", +laag = "0000eb00000000e8n", +laal = "0000eb00000000fan", +laalg = "0000eb00000000ean", +lan = "0000eb00000000f4n", +lang = "0000eb00000000e4n", +lax = "0000eb00000000f7n", +laxg = "0000eb00000000e7n", +lao = "0000eb00000000f6n", +laog = "0000eb00000000e6n", +lt = "0000e30000000012k", +ltr = "0000000000001200g", +ltg = "0000e30000000002k", +ltgr = "00000000b9020000h", +ltgf = "0000e30000000032k", +ltgfr = "00000000b9120000h", +ltxbr = "00000000b3420000h", +ltxtr = "00000000b3de0000h", +ltxr = "00000000b3620000h", +ltdbr = "00000000b3120000h", +ltdtr = "00000000b3d60000h", +ltdr = "0000000000002200g", +ltebr = "00000000b3020000h", +lter = "0000000000003200g", +lb = "0000e30000000076k", +lbr = "00000000b9260000h", +lgb = "0000e30000000077k", +lgbr = "00000000b9060000h", + lbh = "0000e300000000c0k", +lcr = "0000000000001300g", +lcgr = "00000000b9030000h", +lcgfr = "00000000b9130000h", +lcxbr = "00000000b3430000h", +lcxr = "00000000b3630000h", +lcdbr = "00000000b3130000h", +lcdr = "0000000000002300g", +lcdfr = "00000000b3730000h", +lcebr = "00000000b3030000h", +lcer = "0000000000003300g", +lctl = "00000000b7000000m", +lctlg = "0000eb000000002fn", +fixr = "00000000b3670000h", +fidr = "00000000b37f0000h", +fier = "00000000b3770000h", +ldgr = "00000000b3c10000h", +lgdr = "00000000b3cd0000h", +lh = "0000000048000000j", +lhr = "00000000b9270000h", +lhy = "0000e30000000078k", +lgh = "0000e30000000015k", +lghr = "00000000b9070000h", +lhh = "0000e300000000c4k", +lhrl = "0000c40500000000l", +lghrl = "0000c40400000000l", +lfh = "0000e300000000cak", +lgfi = "0000c00100000000l", +lxdbr = "00000000b3050000h", +lxdr = "00000000b3250000h", +lxebr = "00000000b3060000h", +lxer = "00000000b3260000h", +ldebr = "00000000b3040000h", +lder = "00000000b3240000h", +llgf = "0000e30000000016k", +llgfr = "00000000b9160000h", +llc = "0000e30000000094k", +llcr = "00000000b9940000h", +llgc = "0000e30000000090k", +llgcr = "00000000b9840000h", +llch = "0000e300000000c2k", +llh = "0000e30000000095k", +llhr = "00000000b9950000h", +llgh = "0000e30000000091k", +llghr = "00000000b9850000h", +llhh = "0000e300000000c6k", +llhrl = "0000c40200000000l", +llghrl = "0000c40600000000l", +llihf = "0000c00e00000000l", +llilf = "0000c00f00000000l", +llgfrl = "0000c40e00000000l", +llgt = "0000e30000000017k", +llgtr = "00000000b9170000h", +lm = "0000000098000000m", +lmy = "0000eb0000000098n", +lmg = "0000eb0000000004n", +lmh = "0000eb0000000096n", +lnr = "0000000000001100g", +lngr = "00000000b9010000h", +lngfr = "00000000b9110000h", +lnxbr = "00000000b3410000h", +lnxr = "00000000b3610000h", +lndbr = "00000000b3110000h", +lndr = "0000000000002100g", +lndfr = "00000000b3710000h", +lnebr = "00000000b3010000h", +lner = "0000000000003100g", +loc = "0000eb00000000f2n", +locg = "0000eb00000000e2n", +lpq = "0000e3000000008fk", +lpr = "0000000000001000g", +lpgr = "00000000b9000000h", +lpgfr = "00000000b9100000h", +lpxbr = "00000000b3400000h", +lpxr = "00000000b3600000h", +lpdbr = "00000000b3100000h", +lpdr = "0000000000002000g", +lpdfr = "00000000b3700000h", +lpebr = "00000000b3000000h", +lper = "0000000000003000g", +lra = "00000000b1000000j", +lray = "0000e30000000013k", +lrag = "0000e30000000003k", +lrl = "0000c40d00000000l", +lgrl = "0000c40800000000l", +lgfrl = "0000c40c00000000l", +lrvh = "0000e3000000001fk", +lrv = "0000e3000000001ek", +lrvr = "00000000b91f0000h", +lrvg = "0000e3000000000fk", +lrvgr = "00000000b90f0000h", +ldxbr = "00000000b3450000h", +ldxr = "0000000000002500g", +lrdr = "0000000000002500g", +lexbr = "00000000b3460000h", +lexr = "00000000b3660000h", +ledbr = "00000000b3440000h", +ledr = "0000000000003500g", +lrer = "0000000000003500g", +lura = "00000000b24b0000h", +lurag = "00000000b9050000h", +lzxr = "00000000b3760000h", +lzdr = "00000000b3750000h", +lzer = "00000000b3740000h", +msta = "00000000b2470000h", +mvcl = "0000000000000e00g", +mvcle = "00000000a8000000m", +mvclu = "0000eb000000008en", +mvpg = "00000000b2540000h", +mvst = "00000000b2550000h", +m = "000000005c000000j", +mfy = "0000e3000000005ck", +mr = "0000000000001c00g", +mxbr = "00000000b34c0000h", +mxr = "0000000000002600g", +mdbr = "00000000b31c0000h", +md = "000000006c000000j", +mdr = "0000000000002c00g", +mxdbr = "00000000b3070000h", +mxd = "0000000067000000j", +mxdr = "0000000000002700g", +meebr = "00000000b3170000h", +meer = "00000000b3370000h", +mdebr = "00000000b30c0000h", +mde = "000000007c000000j", +mder = "0000000000003c00g", +me = "000000007c000000j", +mer = "0000000000003c00g", +mh = "000000004c000000j", +mhy = "0000e3000000007ck", +mlg = "0000e30000000086k", +mlgr = "00000000b9860000h", +ml = "0000e30000000096k", +mlr = "00000000b9960000h", +ms = "0000000071000000j", +msr = "00000000b2520000h", +msy = "0000e30000000051k", +msg = "0000e3000000000ck", +msgr = "00000000b90c0000h", +msgf = "0000e3000000001ck", +msgfr = "00000000b91c0000h", +msfi = "0000c20100000000l", +msgfi = "0000c20000000000l", +o = "0000000056000000j", +or = "0000000000001600g", +oy = "0000e30000000056k", +og = "0000e30000000081k", +ogr = "00000000b9810000h", +oihf = "0000c00c00000000l", +oilf = "0000c00d00000000l", +pgin = "00000000b22e0000h", +pgout = "00000000b22f0000h", +pcc = "00000000b92c0000h", +pckmo = "00000000b9280000h", +pfmf = "00000000b9af0000h", +ptf = "00000000b9a20000h", +popcnt = "00000000b9e10000h", +pfd = "0000e30000000036k", +pfdrl = "0000c60200000000l", +pt = "00000000b2280000h", +pti = "00000000b99e0000h", +palb = "00000000b2480000h", +rrbe = "00000000b22a0000h", +rrbm = "00000000b9ae0000h", +rll = "0000eb000000001dn", +rllg = "0000eb000000001cn", +srst = "00000000b25e0000h", +srstu = "00000000b9be0000h", +sar = "00000000b24e0000h", +sfpc = "00000000b3840000h", +sfasr = "00000000b3850000h", +spm = "000000000000400g", +ssar = "00000000b2250000h", +ssair = "00000000b99f0000h", +slda = "000000008f000000m", +sldl = "000000008d000000m", +sla = "000000008b000000m", +slak = "0000eb00000000ddn", +slag = "0000eb000000000bn", +sll = "0000000089000000m", +sllk = "0000eb00000000dfn", +sllg = "0000eb000000000dn", +srda = "000000008e000000m", +srdl = "000000008c000000m", +sra = "000000008a000000m", +srak = "0000eb00000000dcn", +srag = "0000eb000000000an", +srl = "0000000088000000m", +srlk = "0000eb00000000den", +srlg = "0000eb000000000cn", +sqxbr = "00000000b3160000h", +sqxr = "00000000b3360000h", +sqdbr = "00000000b3150000h", +sqdr = "00000000b2440000h", +sqebr = "00000000b3140000h", +sqer = "00000000b2450000h", +st = "0000000050000000j", +sty = "0000e30000000050k", +stg = "0000e30000000024k", +std = "0000000060000000j", +stdy = "0000ed0000000067k", +ste = "0000000070000000j", +stey = "0000ed0000000066k", +stam = "000000009b000000m", +stamy = "0000eb000000009bn", +stc = "0000000042000000j", +stcy = "0000e30000000072k", +stch = "0000e300000000c3k", +stcmh = "0000eb000000002cn", +stcm = "00000000be000000m", +stcmy = "0000eb000000002dn", +stctl = "00000000b6000000m", +stctg = "0000eb0000000025n", +sth = "0000000040000000j", +sthy = "0000e30000000070k", +sthh = "0000e300000000c7k", +sthrl = "0000c40700000000l", +stfh = "0000e300000000cbk", +stm = "0000000090000000m", +stmy = "0000eb0000000090n", +stmg = "0000eb0000000024n", +stmh = "0000eb0000000026n", +stoc = "0000eb00000000f3n", +stocg = "0000eb00000000e3n", +stpq = "0000e3000000008ek", +strl = "0000c40f00000000l", +stgrl = "0000c40b00000000l", +strvh = "0000e3000000003fk", +strv = "0000e3000000003ek", +strvg = "0000e3000000002fk", +stura = "00000000b2460000h", +sturg = "00000000b9250000h", +s = "000000005b000000j", +sr = "0000000000001b00g", +sy = "0000e3000000005bk", +sg = "0000e30000000009k", +sgr = "00000000b9090000h", +sgf = "0000e30000000019k", +sgfr = "00000000b9190000h", +sxbr = "00000000b34b0000h", +sdbr = "00000000b31b0000h", +sebr = "00000000b30b0000h", +sh = "000000004b000000j", +shy = "0000e3000000007bk", +sl = "000000005f000000j", +slr = "0000000000001f00g", +sly = "0000e3000000005fk", +slg = "0000e3000000000bk", +slgr = "00000000b90b0000h", +slgf = "0000e3000000001bk", +slgfr = "00000000b91b0000h", +slfi = "0000c20500000000l", +slgfi = "0000c20400000000l", +slb = "0000e30000000099k", +slbr = "00000000b9990000h", +slbg = "0000e30000000089k", +slbgr = "00000000b9890000h", +sxr = "0000000000003700g", +sd = "000000006b000000j", +sdr = "0000000000002b00g", +se = "000000007b000000j", +ser = "0000000000003b00g", +su = "000000007f000000j", +sur = "0000000000003f00g", +sw = "000000006f000000j", +swr = "0000000000002f00g", +tar = "00000000b24c0000h", +tb = "00000000b22c0000h", +trace = "0000000099000000m", +tracg = "0000eb000000000fn", +tre = "00000000b2a50000h", } for cond,c in pairs(map_cond) do map_op["b"..cond.."_1"] = tohex(0x54000000+c).."B" @@ -964,87 +1218,30 @@ end ------------------------------------------------------------------------------ -- Handle opcodes defined with template strings. local function parse_template(params, template, nparams, pos) - local op = tonumber(sub(template, 1, 12), 16) -- 13-16 ignored since those are trailing zeros added after the instruction + local op = tonumber(sub(template, 1, 16), 16) -- -- 00000000005a0000 converts to 90 local n,rs = 1,26 parse_reg_type = false -- Process each character. (if its RX-a==> 1st iteration gets R, 2nd==X and so on) for p in gmatch(sub(template, 17), ".") do - local q = params[n] - if p == "R" then - op = op + parse_reg(q); n = n + 1 - elseif p == "N" then - op = op + shl(parse_reg(q), 5); n = n + 1 - elseif p == "M" then - op = op + shl(parse_reg(q), 16); n = n + 1 - elseif p == "A" then - op = op + shl(parse_reg(q), 10); n = n + 1 + local pr1,pr2,pr3 + if p == "g" then + pr1,pr2=param[n],param[n+1] + op = op + parse_reg(pr1)+parse_reg(pr2); n = n + 1 -- not sure if we will require n later, so keeping it as it is now + elseif p == "h" then + + elseif p == "j" then + + elseif p == "k" then + + elseif p == "l" then + elseif p == "m" then - op = op + shl(parse_reg(params[n-1]), 16) - elseif p == "p" then - if q == "sp" then params[n] = "@x31" end - elseif p == "g" then - if parse_reg_type == "x" then - op = op + 0x80000000 - elseif parse_reg_type ~= "w" then - werror("bad register type") + + elseif p == "n" then + end - parse_reg_type = false - elseif p == "f" then - if parse_reg_type == "d" then - op = op + 0x00400000 - elseif parse_reg_type ~= "s" then - werror("bad register type") - end - parse_reg_type = false - elseif p == "x" or p == "w" or p == "d" or p == "s" then - if parse_reg_type ~= p then - werror("register size mismatch") - end - parse_reg_type = false - elseif p == "L" then - op = parse_load(params, nparams, n, op) - elseif p == "P" then - op = parse_load_pair(params, nparams, n, op) - elseif p == "B" then - local mode, v, s = parse_label(q, false); n = n + 1 - local m = branch_type(op) - waction("REL_"..mode, v+m, s, 1) - elseif p == "I" then - op = op + parse_imm12(q); n = n + 1 - elseif p == "i" then - op = op + parse_imm13(q); n = n + 1 - elseif p == "W" then - op = op + parse_imm(q, 16, 5, 0, false); n = n + 1 - elseif p == "T" then - op = op + parse_imm6(q); n = n + 1 - elseif p == "1" then - op = op + parse_imm(q, 6, 16, 0, false); n = n + 1 - elseif p == "2" then - op = op + parse_imm(q, 6, 10, 0, false); n = n + 1 - elseif p == "5" then - op = op + parse_imm(q, 5, 16, 0, false); n = n + 1 - elseif p == "V" then - op = op + parse_imm(q, 4, 0, 0, false); n = n + 1 - elseif p == "F" then - op = op + parse_fpimm(q); n = n + 1 - elseif p == "Z" then - if q ~= "#0" and q ~= "#0.0" then werror("expected zero immediate") end - n = n + 1 - elseif p == "S" then - op = op + parse_shift(q); n = n + 1 - elseif p == "X" then - op = op + parse_extend(q); n = n + 1 - elseif p == "R" then - op = op + parse_lslx16(q); n = n + 1 - elseif p == "C" then - op = op + parse_cond(q, 0); n = n + 1 - elseif p == "c" then - op = op + parse_cond(q, 1); n = n + 1 - else - assert(false) - end end wputpos(pos, op) end