2
0
Эх сурвалжийг харах

PPC: Distinguish slwi, srwi and rlwinm in disassembly.

Mike Pall 14 жил өмнө
parent
commit
e5f310eefa
1 өөрчлөгдсөн 18 нэмэгдсэн , 1 устгасан
  1. 18 1
      lib/dis_ppc.lua

+ 18 - 1
lib/dis_ppc.lua

@@ -35,6 +35,23 @@ local map_crops = {
   [150] = "isync",
 }
 
+local map_rlwinm = setmetatable({
+  shift = 0, mask = -1,
+},
+{ __index = function(t, x)
+    local rot = band(rshift(x, 11), 31)
+    local mb = band(rshift(x, 6), 31)
+    local me = band(rshift(x, 1), 31)
+    if mb == 0 and me == 31-rot then
+      return "slwiRR~A."
+    elseif me == 31 and mb == 32-rot then
+      return "srwiRR~-A."
+    else
+      return "rlwinmRR~AAA."
+    end
+  end
+})
+
 local map_rld = {
   shift = 2, mask = 7,
   [0] = "rldiclRR~HM.", "rldicrRR~HM.", "rldicRR~HM.", "rldimiRR~HM.",
@@ -342,7 +359,7 @@ local map_pri = {
   "subficRRI",	false,		"cmpl_iYLRU",	"cmp_iYLRI",
   "addicRRI",	"addic.RRI",	"addi|liRR0I",	"addis|lisRR0I",
   "b_KBJ",	"sc",		 "bKJ",		map_crops,
-  "rlwimiRR~AAA.", "rlwinmRR~AAA.", false,	"rlwnmRR~RAA.",
+  "rlwimiRR~AAA.", map_rlwinm,	false,		"rlwnmRR~RAA.",
   "oriNRR~U",	"orisRR~U",	"xoriRR~U",	"xorisRR~U",
   "andi.RR~U",	"andis.RR~U",	map_rld,	map_ext,
   "lwzRRD",	"lwzuRRD",	"lbzRRD",	"lbzuRRD",