diff options
author | Mike Pall <mike> | 2012-06-12 16:47:25 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2012-06-12 16:47:25 +0200 |
commit | 6b605bd45544bfec2b51142dad881a557d50d28e (patch) | |
tree | 8b8a0c8449380731823b4b0237340a8e5e58007d /dynasm | |
parent | 0528bb7d028b0b9c8a1e988e40d31385cab4f2e8 (diff) | |
download | luajit-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.lua | 37 |
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 |
920 | end | 928 | end |
921 | 929 | ||
930 | local 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 | ||
945 | end | ||
946 | |||
922 | local function parse_disp(disp) | 947 | local 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 |