aboutsummaryrefslogtreecommitdiff
path: root/dynasm
diff options
context:
space:
mode:
authorMike Pall <mike>2012-06-12 16:47:25 +0200
committerMike Pall <mike>2012-06-12 16:47:25 +0200
commit6b605bd45544bfec2b51142dad881a557d50d28e (patch)
tree8b8a0c8449380731823b4b0237340a8e5e58007d /dynasm
parent0528bb7d028b0b9c8a1e988e40d31385cab4f2e8 (diff)
downloadluajit-6b605bd45544bfec2b51142dad881a557d50d28e.tar.gz
luajit-6b605bd45544bfec2b51142dad881a557d50d28e.tar.bz2
luajit-6b605bd45544bfec2b51142dad881a557d50d28e.zip
DynASM/PPC: Add missing 64 bit rotates and mtocrf/mfocrf.
Diffstat (limited to 'dynasm')
-rw-r--r--dynasm/dasm_ppc.lua37
1 files changed, 33 insertions, 4 deletions
diff --git a/dynasm/dasm_ppc.lua b/dynasm/dasm_ppc.lua
index dc2af69e..7d64d81c 100644
--- a/dynasm/dasm_ppc.lua
+++ b/dynasm/dasm_ppc.lua
@@ -339,8 +339,9 @@ local map_op = {
339 iselgt_3 = "7c00005eRRR", 339 iselgt_3 = "7c00005eRRR",
340 iseleq_3 = "7c00009eRRR", 340 iseleq_3 = "7c00009eRRR",
341 mfcr_1 = "7c000026R", 341 mfcr_1 = "7c000026R",
342 mfocrf_2 = "7c100026RG",
342 mtcrf_2 = "7c000120GR", 343 mtcrf_2 = "7c000120GR",
343 -- NYI: mtocrf, mfocrf 344 mtocrf_2 = "7c100120GR",
344 lwarx_3 = "7c000028RR0R", 345 lwarx_3 = "7c000028RR0R",
345 ldx_3 = "7c00002aRR0R", 346 ldx_3 = "7c00002aRR0R",
346 lwzx_3 = "7c00002eRR0R", 347 lwzx_3 = "7c00002eRR0R",
@@ -467,6 +468,7 @@ local map_op = {
467 sraw_3 = "7c000630RR~R.", 468 sraw_3 = "7c000630RR~R.",
468 srad_3 = "7c000634RR~R.", 469 srad_3 = "7c000634RR~R.",
469 srawi_3 = "7c000670RR~A.", 470 srawi_3 = "7c000670RR~A.",
471 sradi_3 = "7c000674RR~H.",
470 eieio_0 = "7c0006ac", 472 eieio_0 = "7c0006ac",
471 lfiwax_3 = "7c0006aeFR0R", 473 lfiwax_3 = "7c0006aeFR0R",
472 sthbrx_3 = "7c00072cRR0R", 474 sthbrx_3 = "7c00072cRR0R",
@@ -481,6 +483,14 @@ local map_op = {
481 divwo_3 = "7c0007d6RRR.", 483 divwo_3 = "7c0007d6RRR.",
482 dcbz_2 = "7c0007ec-RR", 484 dcbz_2 = "7c0007ec-RR",
483 485
486 -- Primary opcode 30:
487 rldicl_4 = "78000000RR~HM.",
488 rldicr_4 = "78000004RR~HM.",
489 rldic_4 = "78000008RR~HM.",
490 rldimi_4 = "7800000cRR~HM.",
491 rldcl_4 = "78000010RR~RM.",
492 rldcr_4 = "78000012RR~RM.",
493
484 -- Primary opcode 59: 494 -- Primary opcode 59:
485 fdivs_3 = "ec000024FFF.", 495 fdivs_3 = "ec000024FFF.",
486 fsubs_3 = "ec000028FFF.", 496 fsubs_3 = "ec000028FFF.",
@@ -807,9 +817,7 @@ local map_op = {
807 evmwlumianw_3 = "100005c8RRR", 817 evmwlumianw_3 = "100005c8RRR",
808 evmwlsmianw_3 = "100005c9RRR", 818 evmwlsmianw_3 = "100005c9RRR",
809 819
810 -- NYI: some 64 bit PowerPC and Book E instructions: 820 -- NYI: Book E instructions.
811 -- rldicl, rldicr, rldic, rldimi, rldcl, rldcr, sradi, 64 bit ext. add/sub,
812 -- extended addressing branches, cache management, loads and stores
813} 821}
814 822
815-- Add mnemonics for "." variants. 823-- Add mnemonics for "." variants.
@@ -919,6 +927,23 @@ local function parse_imm(imm, bits, shift, scale, signed)
919 end 927 end
920end 928end
921 929
930local function parse_shiftmask(imm, isshift)
931 local n = tonumber(imm)
932 if n then
933 if n % 1 == 0 and n >= 0 and n <= 63 then
934 local lsb = imm % 32
935 local msb = imm - lsb
936 return isshift and (lsb*2048+msb/16) or (lsb*64+msb)
937 end
938 werror("out of range immediate `"..imm.."'")
939 elseif match(imm, "^r([1-3]?[0-9])$") or
940 match(imm, "^([%w_]+):(r[1-3]?[0-9])$") then
941 werror("expected immediate operand, got register")
942 else
943 werror("NYI: parameterized 64 bit shift/mask")
944 end
945end
946
922local function parse_disp(disp) 947local function parse_disp(disp)
923 local imm, reg = match(disp, "^(.*)%(([%w_:]+)%)$") 948 local imm, reg = match(disp, "^(.*)%(([%w_:]+)%)$")
924 if imm then 949 if imm then
@@ -1030,6 +1055,10 @@ map_op[".template__"] = function(params, template, nparams)
1030 op = op + parse_cr(params[n]); n = n + 1 1055 op = op + parse_cr(params[n]); n = n + 1
1031 elseif p == "G" then 1056 elseif p == "G" then
1032 op = op + parse_imm(params[n], 8, 12, 0, false); n = n + 1 1057 op = op + parse_imm(params[n], 8, 12, 0, false); n = n + 1
1058 elseif p == "H" then
1059 op = op + parse_shiftmask(params[n], true); n = n + 1
1060 elseif p == "M" then
1061 op = op + parse_shiftmask(params[n], false); n = n + 1
1033 elseif p == "J" or p == "K" then 1062 elseif p == "J" or p == "K" then
1034 local mode, n, s = parse_label(params[n], false) 1063 local mode, n, s = parse_label(params[n], false)
1035 if p == "K" then n = n + 2048 end 1064 if p == "K" then n = n + 2048 end