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 |
