diff options
author | Mike Pall <mike> | 2024-08-15 00:22:47 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2024-08-15 00:22:47 +0200 |
commit | 6f834087d0553b68b61770c69109894bf3f375ef (patch) | |
tree | d5e9e28ab33d7308dba53827c17fd5cb9defebe8 /src/jit | |
parent | 2d54213e7ca9f276e080671dfcad2d26fbea2de4 (diff) | |
download | luajit-6f834087d0553b68b61770c69109894bf3f375ef.tar.gz luajit-6f834087d0553b68b61770c69109894bf3f375ef.tar.bz2 luajit-6f834087d0553b68b61770c69109894bf3f375ef.zip |
ARM64: Use movi to materialize FP constants.
Thanks to Peter Cawley. #1245
Diffstat (limited to 'src/jit')
-rw-r--r-- | src/jit/dis_arm64.lua | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/jit/dis_arm64.lua b/src/jit/dis_arm64.lua index 84677666..2741cd2e 100644 --- a/src/jit/dis_arm64.lua +++ b/src/jit/dis_arm64.lua | |||
@@ -658,6 +658,10 @@ local map_datafp = { -- Data processing, SIMD and FP. | |||
658 | } | 658 | } |
659 | } | 659 | } |
660 | } | 660 | } |
661 | }, | ||
662 | { -- 010 | ||
663 | shift = 0, mask = 0x81f8fc00, | ||
664 | [0x100e400] = "moviDdG" | ||
661 | } | 665 | } |
662 | } | 666 | } |
663 | 667 | ||
@@ -832,6 +836,20 @@ local function parse_fpimm8(op) | |||
832 | return sign * frac * 2^exp | 836 | return sign * frac * 2^exp |
833 | end | 837 | end |
834 | 838 | ||
839 | local function decode_fpmovi(op) | ||
840 | local lo = rshift(op, 5) | ||
841 | local hi = rshift(op, 9) | ||
842 | lo = bor(band(lo, 1) * 0xff, band(lo, 2) * 0x7f80, band(lo, 4) * 0x3fc000, | ||
843 | band(lo, 8) * 0x1fe00000) | ||
844 | hi = bor(band(hi, 1) * 0xff, band(hi, 0x80) * 0x1fe, | ||
845 | band(hi, 0x100) * 0xff00, band(hi, 0x200) * 0x7f8000) | ||
846 | if hi ~= 0 then | ||
847 | return fmt_hex32(hi)..tohex(lo) | ||
848 | else | ||
849 | return fmt_hex32(lo) | ||
850 | end | ||
851 | end | ||
852 | |||
835 | local function prefer_bfx(sf, uns, imms, immr) | 853 | local function prefer_bfx(sf, uns, imms, immr) |
836 | if imms < immr or imms == 31 or imms == 63 then | 854 | if imms < immr or imms == 31 or imms == 63 then |
837 | return false | 855 | return false |
@@ -1131,6 +1149,8 @@ local function disass_ins(ctx) | |||
1131 | x = 0 | 1149 | x = 0 |
1132 | elseif p == "F" then | 1150 | elseif p == "F" then |
1133 | x = parse_fpimm8(op) | 1151 | x = parse_fpimm8(op) |
1152 | elseif p == "G" then | ||
1153 | x = "#0x"..decode_fpmovi(op) | ||
1134 | elseif p == "g" or p == "f" or p == "x" or p == "w" or | 1154 | elseif p == "g" or p == "f" or p == "x" or p == "w" or |
1135 | p == "d" or p == "s" then | 1155 | p == "d" or p == "s" then |
1136 | -- These are handled in D/N/M/A. | 1156 | -- These are handled in D/N/M/A. |