]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
DynASM/ARM64: Fix LSL/BFI* encoding with variable registers.
authorMike Pall <mike>
Thu, 2 Jun 2022 11:48:04 +0000 (13:48 +0200)
committerMike Pall <mike>
Thu, 2 Jun 2022 11:48:04 +0000 (13:48 +0200)
Thanks to Dmitry Stogov.

dynasm/dasm_arm64.lua

index 69c31db50c42ca3f0a5be0bd226f239c9743761b..1f581ba057d11854131e4cd2fb4e30fee086cfe8 100644 (file)
@@ -248,7 +248,7 @@ local map_cond = {
 
 local parse_reg_type
 
-local function parse_reg(expr, shift)
+local function parse_reg(expr, shift, no_vreg)
   if not expr then werror("expected register name") end
   local tname, ovreg = match(expr, "^([%w_]+):(@?%l%d+)$")
   if not tname then
@@ -281,7 +281,7 @@ local function parse_reg(expr, shift)
     elseif parse_reg_type ~= vrt then
       werror("register size mismatch")
     end
-    if shift then waction("VREG", shift, vreg) end
+    if not no_vreg then waction("VREG", shift, vreg) end
     return 0
   end
   werror("bad register name `"..expr.."'")
@@ -638,7 +638,7 @@ local function alias_bfx(p)
 end
 
 local function alias_bfiz(p)
-  parse_reg(p[1], 0)
+  parse_reg(p[1], 0, true)
   if parse_reg_type == "w" then
     p[3] = "#(32-("..p[3]:sub(2).."))%32"
     p[4] = "#("..p[4]:sub(2)..")-1"
@@ -649,7 +649,7 @@ local function alias_bfiz(p)
 end
 
 local alias_lslimm = op_alias("ubfm_4", function(p)
-  parse_reg(p[1], 0)
+  parse_reg(p[1], 0, true)
   local sh = p[3]:sub(2)
   if parse_reg_type == "w" then
     p[3] = "#(32-("..sh.."))%32"