diff options
author | Mike Pall <mike> | 2015-04-12 01:25:14 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2015-04-12 01:25:14 +0200 |
commit | b2a5cc82338aad90ca16fced8631ac1a634949e9 (patch) | |
tree | 2d1f358e6890228481c3c1200b76511b53b3b91c /dynasm/dasm_ppc.lua | |
parent | dec4acca9a2e06b565415d7be44506baa0a0fee0 (diff) | |
download | luajit-b2a5cc82338aad90ca16fced8631ac1a634949e9.tar.gz luajit-b2a5cc82338aad90ca16fced8631ac1a634949e9.tar.bz2 luajit-b2a5cc82338aad90ca16fced8631ac1a634949e9.zip |
DynASM/PPC: Add support for parameterized shifts/masks.
Diffstat (limited to 'dynasm/dasm_ppc.lua')
-rw-r--r-- | dynasm/dasm_ppc.lua | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/dynasm/dasm_ppc.lua b/dynasm/dasm_ppc.lua index 37447072..784223df 100644 --- a/dynasm/dasm_ppc.lua +++ b/dynasm/dasm_ppc.lua | |||
@@ -41,7 +41,7 @@ local wline, werror, wfatal, wwarn | |||
41 | local action_names = { | 41 | local action_names = { |
42 | "STOP", "SECTION", "ESC", "REL_EXT", | 42 | "STOP", "SECTION", "ESC", "REL_EXT", |
43 | "ALIGN", "REL_LG", "LABEL_LG", | 43 | "ALIGN", "REL_LG", "LABEL_LG", |
44 | "REL_PC", "LABEL_PC", "IMM", | 44 | "REL_PC", "LABEL_PC", "IMM", "IMMSH" |
45 | } | 45 | } |
46 | 46 | ||
47 | -- Maximum number of section buffer positions for dasm_put(). | 47 | -- Maximum number of section buffer positions for dasm_put(). |
@@ -1482,8 +1482,8 @@ local function parse_shiftmask(imm, isshift) | |||
1482 | local n = tonumber(imm) | 1482 | local n = tonumber(imm) |
1483 | if n then | 1483 | if n then |
1484 | if shr(n, 6) == 0 then | 1484 | if shr(n, 6) == 0 then |
1485 | local lsb = band(imm, 31) | 1485 | local lsb = band(n, 31) |
1486 | local msb = imm - lsb | 1486 | local msb = n - lsb |
1487 | return isshift and (shl(lsb, 11)+shr(msb, 4)) or (shl(lsb, 6)+msb) | 1487 | return isshift and (shl(lsb, 11)+shr(msb, 4)) or (shl(lsb, 6)+msb) |
1488 | end | 1488 | end |
1489 | werror("out of range immediate `"..imm.."'") | 1489 | werror("out of range immediate `"..imm.."'") |
@@ -1491,7 +1491,8 @@ local function parse_shiftmask(imm, isshift) | |||
1491 | match(imm, "^([%w_]+):(r[1-3]?[0-9])$") then | 1491 | match(imm, "^([%w_]+):(r[1-3]?[0-9])$") then |
1492 | werror("expected immediate operand, got register") | 1492 | werror("expected immediate operand, got register") |
1493 | else | 1493 | else |
1494 | werror("NYI: parameterized 64 bit shift/mask") | 1494 | waction("IMMSH", isshift and 1 or 0, imm) |
1495 | return 0; | ||
1495 | end | 1496 | end |
1496 | end | 1497 | end |
1497 | 1498 | ||