summaryrefslogtreecommitdiff
path: root/dynasm/dasm_mips.lua
diff options
context:
space:
mode:
authorMike Pall <mike>2012-07-08 16:25:38 +0200
committerMike Pall <mike>2012-07-08 16:27:18 +0200
commitc00ffcb870cd51849ee2a0f1bf1862ac965026b7 (patch)
treee9af978c9883e709b1b5e5a845ce8ef5b6d0c490 /dynasm/dasm_mips.lua
parente3dec0438d50dbdf0184078d4e0233e399725787 (diff)
downloadluajit2-c00ffcb870cd51849ee2a0f1bf1862ac965026b7.tar.gz
Change DynASM bit operations to use Lua BitOp.
Diffstat (limited to 'dynasm/dasm_mips.lua')
-rw-r--r--dynasm/dasm_mips.lua44
1 files changed, 19 insertions, 25 deletions
diff --git a/dynasm/dasm_mips.lua b/dynasm/dasm_mips.lua
index aa33f0cc..c387d292 100644
--- a/dynasm/dasm_mips.lua
+++ b/dynasm/dasm_mips.lua
@@ -26,6 +26,8 @@ local _s = string
local sub, format, byte, char = _s.sub, _s.format, _s.byte, _s.char
local match, gmatch = _s.match, _s.gmatch
local concat, sort = table.concat, table.sort
+local bit = bit or require("bit")
+local band, shl, sar, tohex = bit.band, bit.lshift, bit.arshift, bit.tohex
-- Inherited tables and callbacks.
local g_opt, g_arch
@@ -60,11 +62,6 @@ local secpos = 1
------------------------------------------------------------------------------
--- Return 8 digit hex number.
-local function tohex(x)
- return sub(format("%08x", x), -8) -- Avoid 64 bit portability problem in Lua.
-end
-
-- Dump action names and numbers.
local function dumpactions(out)
out:write("DynASM encoding engine action codes:\n")
@@ -639,16 +636,14 @@ end
local function parse_imm(imm, bits, shift, scale, signed)
local n = tonumber(imm)
if n then
- if n % 2^scale == 0 then
- n = n / 2^scale
+ local m = sar(n, scale)
+ if shl(m, scale) == n then
if signed then
- if n >= 0 then
- if n < 2^(bits-1) then return n*2^shift end
- else
- if n >= -(2^(bits-1))-1 then return (n+2^bits)*2^shift end
- end
+ local s = sar(m, bits-1)
+ if s == 0 then return shl(m, shift)
+ elseif s == -1 then return shl(m + shl(1, bits), shift) end
else
- if n >= 0 and n <= 2^bits-1 then return n*2^shift end
+ if sar(m, bits) == 0 then return shl(m, shift) end
end
end
werror("out of range immediate `"..imm.."'")
@@ -664,7 +659,7 @@ end
local function parse_disp(disp)
local imm, reg = match(disp, "^(.*)%(([%w_:]+)%)$")
if imm then
- local r = parse_gpr(reg)*2^21
+ local r = shl(parse_gpr(reg), 21)
local extname = match(imm, "^extern%s+(%S+)$")
if extname then
waction("REL_EXT", map_extern[extname], nil, 1)
@@ -678,7 +673,7 @@ local function parse_disp(disp)
local r, tp = parse_gpr(reg)
if tp then
waction("IMM", 32768+16*32, format(tp.ctypefmt, tailr))
- return r*2^21
+ return shl(r, 21)
end
end
werror("bad displacement `"..disp.."'")
@@ -689,7 +684,7 @@ local function parse_index(idx)
if rt then
rt = parse_gpr(rt)
rs = parse_gpr(rs)
- return rt*2^16 + rs*2^21
+ return shl(rt, 16) + shl(rs, 21)
end
werror("bad index `"..idx.."'")
end
@@ -740,19 +735,19 @@ map_op[".template__"] = function(params, template, nparams)
-- Process each character.
for p in gmatch(sub(template, 9), ".") do
if p == "D" then
- op = op + parse_gpr(params[n]) * 2^11; n = n + 1
+ op = op + shl(parse_gpr(params[n]), 11); n = n + 1
elseif p == "T" then
- op = op + parse_gpr(params[n]) * 2^16; n = n + 1
+ op = op + shl(parse_gpr(params[n]), 16); n = n + 1
elseif p == "S" then
- op = op + parse_gpr(params[n]) * 2^21; n = n + 1
+ op = op + shl(parse_gpr(params[n]), 21); n = n + 1
elseif p == "F" then
- op = op + parse_fpr(params[n]) * 2^6; n = n + 1
+ op = op + shl(parse_fpr(params[n]), 6); n = n + 1
elseif p == "G" then
- op = op + parse_fpr(params[n]) * 2^11; n = n + 1
+ op = op + shl(parse_fpr(params[n]), 11); n = n + 1
elseif p == "H" then
- op = op + parse_fpr(params[n]) * 2^16; n = n + 1
+ op = op + shl(parse_fpr(params[n]), 16); n = n + 1
elseif p == "R" then
- op = op + parse_fpr(params[n]) * 2^21; n = n + 1
+ op = op + shl(parse_fpr(params[n]), 21); n = n + 1
elseif p == "I" then
op = op + parse_imm(params[n], 16, 0, 0, true); n = n + 1
elseif p == "U" then
@@ -783,8 +778,7 @@ map_op[".template__"] = function(params, template, nparams)
elseif p == "Z" then
op = op + parse_imm(params[n], 10, 6, 0, false); n = n + 1
elseif p == "=" then
- local d = ((op - op % 2^11) / 2^11) % 32
- op = op + d * 2^16 -- Copy D to T for clz, clo.
+ op = op + shl(band(op, 0xf800), 5) -- Copy D to T for clz, clo.
else
assert(false)
end