瀏覽代碼

DynASM/PPC: Add missing 64 bit rotates and mtocrf/mfocrf.

Mike Pall 13 年之前
父節點
當前提交
6b605bd455
共有 1 個文件被更改,包括 33 次插入4 次删除
  1. 33 4
      dynasm/dasm_ppc.lua

+ 33 - 4
dynasm/dasm_ppc.lua

@@ -339,8 +339,9 @@ local map_op = {
   iselgt_3 =	"7c00005eRRR",
   iseleq_3 =	"7c00009eRRR",
   mfcr_1 =	"7c000026R",
+  mfocrf_2 =	"7c100026RG",
   mtcrf_2 =	"7c000120GR",
-  -- NYI: mtocrf, mfocrf
+  mtocrf_2 =	"7c100120GR",
   lwarx_3 =	"7c000028RR0R",
   ldx_3 =	"7c00002aRR0R",
   lwzx_3 =	"7c00002eRR0R",
@@ -467,6 +468,7 @@ local map_op = {
   sraw_3 =	"7c000630RR~R.",
   srad_3 =	"7c000634RR~R.",
   srawi_3 =	"7c000670RR~A.",
+  sradi_3 =	"7c000674RR~H.",
   eieio_0 =	"7c0006ac",
   lfiwax_3 =	"7c0006aeFR0R",
   sthbrx_3 =	"7c00072cRR0R",
@@ -481,6 +483,14 @@ local map_op = {
   divwo_3 =	"7c0007d6RRR.",
   dcbz_2 =	"7c0007ec-RR",
 
+  -- Primary opcode 30:
+  rldicl_4 =	"78000000RR~HM.",
+  rldicr_4 =	"78000004RR~HM.",
+  rldic_4 =	"78000008RR~HM.",
+  rldimi_4 =	"7800000cRR~HM.",
+  rldcl_4 =	"78000010RR~RM.",
+  rldcr_4 =	"78000012RR~RM.",
+
   -- Primary opcode 59:
   fdivs_3 =	"ec000024FFF.",
   fsubs_3 =	"ec000028FFF.",
@@ -807,9 +817,7 @@ local map_op = {
   evmwlumianw_3 =	"100005c8RRR",
   evmwlsmianw_3 =	"100005c9RRR",
 
-  -- NYI: some 64 bit PowerPC and Book E instructions:
-  --   rldicl, rldicr, rldic, rldimi, rldcl, rldcr, sradi, 64 bit ext. add/sub,
-  --   extended addressing branches, cache management, loads and stores
+  -- NYI: Book E instructions.
 }
 
 -- Add mnemonics for "." variants.
@@ -919,6 +927,23 @@ local function parse_imm(imm, bits, shift, scale, signed)
   end
 end
 
+local function parse_shiftmask(imm, isshift)
+  local n = tonumber(imm)
+  if n then
+    if n % 1 == 0 and n >= 0 and n <= 63 then
+      local lsb = imm % 32
+      local msb = imm - lsb
+      return isshift and (lsb*2048+msb/16) or (lsb*64+msb)
+    end
+    werror("out of range immediate `"..imm.."'")
+  elseif match(imm, "^r([1-3]?[0-9])$") or
+	 match(imm, "^([%w_]+):(r[1-3]?[0-9])$") then
+    werror("expected immediate operand, got register")
+  else
+    werror("NYI: parameterized 64 bit shift/mask")
+  end
+end
+
 local function parse_disp(disp)
   local imm, reg = match(disp, "^(.*)%(([%w_:]+)%)$")
   if imm then
@@ -1030,6 +1055,10 @@ map_op[".template__"] = function(params, template, nparams)
       op = op + parse_cr(params[n]); n = n + 1
     elseif p == "G" then
       op = op + parse_imm(params[n], 8, 12, 0, false); n = n + 1
+    elseif p == "H" then
+      op = op + parse_shiftmask(params[n], true); n = n + 1
+    elseif p == "M" then
+      op = op + parse_shiftmask(params[n], false); n = n + 1
     elseif p == "J" or p == "K" then
       local mode, n, s = parse_label(params[n], false)
       if p == "K" then n = n + 2048 end