diff options
| author | Mike Pall <mike> | 2022-06-02 13:48:04 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2022-06-02 13:48:04 +0200 |
| commit | 68bb11405ce8b6356cb90dac010b5c87b933bbab (patch) | |
| tree | b32fdd78289b4c3c8a59c90103d0916019d51a74 /dynasm | |
| parent | d4b6bb80ea3b26c4c65b568c1b808ee848f19221 (diff) | |
| download | luajit-68bb11405ce8b6356cb90dac010b5c87b933bbab.tar.gz luajit-68bb11405ce8b6356cb90dac010b5c87b933bbab.tar.bz2 luajit-68bb11405ce8b6356cb90dac010b5c87b933bbab.zip | |
DynASM/ARM64: Fix LSL/BFI* encoding with variable registers.
Thanks to Dmitry Stogov.
Diffstat (limited to 'dynasm')
| -rw-r--r-- | dynasm/dasm_arm64.lua | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/dynasm/dasm_arm64.lua b/dynasm/dasm_arm64.lua index 69c31db5..1f581ba0 100644 --- a/dynasm/dasm_arm64.lua +++ b/dynasm/dasm_arm64.lua | |||
| @@ -248,7 +248,7 @@ local map_cond = { | |||
| 248 | 248 | ||
| 249 | local parse_reg_type | 249 | local parse_reg_type |
| 250 | 250 | ||
| 251 | local function parse_reg(expr, shift) | 251 | local function parse_reg(expr, shift, no_vreg) |
| 252 | if not expr then werror("expected register name") end | 252 | if not expr then werror("expected register name") end |
| 253 | local tname, ovreg = match(expr, "^([%w_]+):(@?%l%d+)$") | 253 | local tname, ovreg = match(expr, "^([%w_]+):(@?%l%d+)$") |
| 254 | if not tname then | 254 | if not tname then |
| @@ -281,7 +281,7 @@ local function parse_reg(expr, shift) | |||
| 281 | elseif parse_reg_type ~= vrt then | 281 | elseif parse_reg_type ~= vrt then |
| 282 | werror("register size mismatch") | 282 | werror("register size mismatch") |
| 283 | end | 283 | end |
| 284 | if shift then waction("VREG", shift, vreg) end | 284 | if not no_vreg then waction("VREG", shift, vreg) end |
| 285 | return 0 | 285 | return 0 |
| 286 | end | 286 | end |
| 287 | werror("bad register name `"..expr.."'") | 287 | werror("bad register name `"..expr.."'") |
| @@ -638,7 +638,7 @@ local function alias_bfx(p) | |||
| 638 | end | 638 | end |
| 639 | 639 | ||
| 640 | local function alias_bfiz(p) | 640 | local function alias_bfiz(p) |
| 641 | parse_reg(p[1], 0) | 641 | parse_reg(p[1], 0, true) |
| 642 | if parse_reg_type == "w" then | 642 | if parse_reg_type == "w" then |
| 643 | p[3] = "#(32-("..p[3]:sub(2).."))%32" | 643 | p[3] = "#(32-("..p[3]:sub(2).."))%32" |
| 644 | p[4] = "#("..p[4]:sub(2)..")-1" | 644 | p[4] = "#("..p[4]:sub(2)..")-1" |
| @@ -649,7 +649,7 @@ local function alias_bfiz(p) | |||
| 649 | end | 649 | end |
| 650 | 650 | ||
| 651 | local alias_lslimm = op_alias("ubfm_4", function(p) | 651 | local alias_lslimm = op_alias("ubfm_4", function(p) |
| 652 | parse_reg(p[1], 0) | 652 | parse_reg(p[1], 0, true) |
| 653 | local sh = p[3]:sub(2) | 653 | local sh = p[3]:sub(2) |
| 654 | if parse_reg_type == "w" then | 654 | if parse_reg_type == "w" then |
| 655 | p[3] = "#(32-("..sh.."))%32" | 655 | p[3] = "#(32-("..sh.."))%32" |
