got sv.bc working for pospopcount
[openpower-isa.git] / src / openpower / sv / sv_analysis.py
index 5b39295e9576f104130d0e1cbc4d3c6a5405e6a1..21778ad02d78c4f7ef5b6df93e096f4abbe365ad 100644 (file)
@@ -226,7 +226,7 @@ class Format(enum.Enum):
                   "(value=%x, width=%x) */" % (value, width)
 
         def declaration_vhdl(value, width):
-            yield "    type sv_%s _rom_array_t is " \
+            yield "    type sv_%s_rom_array_t is " \
                 "array(0 to %d) of sv_decode_rom_t;" % (value, width)
 
         for value in values:
@@ -430,10 +430,9 @@ def extra_classifier(insn_name, value, name, res, regs):
         res['1'] = 's:RA'  # RA: Rsrc1_EXTRA3
 
     elif value == 'LDSTRM-2P-1S2D':
-        res['Etype'] = 'EXTRA2'  # RM EXTRA2 type
-        res['0'] = dRT    # RT: Rdest_EXTRA3
-        res['1'] = 'd:RA'  # RA: Rdest2_EXTRA2
-        res['2'] = 's:RA'  # RA: Rsrc1_EXTRA2
+        res['Etype'] = 'EXTRA3'  # RM EXTRA2 type
+        res['0'] = dRT          # RT: Rdest_EXTRA3
+        res['1'] = 'd:RA;s:RA'  # RA: Rdest2_EXTRA3
 
     elif value == 'LDSTRM-2P-2S':
         # stw, std, sth, stb
@@ -443,20 +442,18 @@ def extra_classifier(insn_name, value, name, res, regs):
 
     elif value == 'LDSTRM-2P-2S1D':
         if 'st' in insn_name and 'x' not in insn_name:  # stwu/stbu etc
-            res['Etype'] = 'EXTRA2'  # RM EXTRA2 type
-            res['0'] = 'd:RA'  # RA: Rdest1_EXTRA2
-            res['1'] = sRS    # RS: Rdsrc1_EXTRA2
-            res['2'] = 's:RA'  # RA: Rsrc2_EXTRA2
+            res['Etype'] = 'EXTRA3'  # RM EXTRA2 type
+            res['0'] = 'd:RA;s:RA'  # RA: Rdest_EXTRA3 /  Rsrc_EXTRA3
+            res['1'] = sRS    # RS: Rdsrc1_EXTRA3
         elif 'st' in insn_name and 'x' in insn_name:  # stwux
-            res['Etype'] = 'EXTRA2'  # RM EXTRA2 type
-            res['0'] = 'd:RA'  # RA: Rdest1_EXTRA2
-            # RS: Rdest2_EXTRA2, RA: Rsrc1_EXTRA2
-            res['1'] = "%s;%s" % (sRS, 's:RA')
-            res['2'] = 's:RB'  # RB: Rsrc2_EXTRA2
+            res['Etype'] = 'EXTRA3'  # RM EXTRA2 type
+            # RS: Rdest2_EXTRA2, RA: Rsrc1_EXTRA2 / Rdest
+            res['0'] = "%s;s:RA;d:RA" % (sRS)
+            res['1'] = 's:RB'  # RB: Rsrc2_EXTRA2
         elif 'u' in insn_name:  # ldux etc.
             res['Etype'] = 'EXTRA2'  # RM EXTRA2 type
             res['0'] = dRT    # RT: Rdest1_EXTRA2
-            res['1'] = 'd:RA'  # RA: Rdest2_EXTRA2
+            res['1'] = 's:RA;d:RA'  # RA: Rdest2_EXTRA2
             res['2'] = 's:RB'  # RB: Rsrc1_EXTRA2
         else:
             res['Etype'] = 'EXTRA2'  # RM EXTRA2 type
@@ -481,6 +478,10 @@ def extra_classifier(insn_name, value, name, res, regs):
         if insn_name == 'mtspr':
             res['0'] = 'd:SPR'  # SPR: Rdest1_EXTRA3
             res['1'] = 's:RS'  # RS: Rsrc1_EXTRA3
+        elif insn_name == 'rlwinm':
+            # weird one, RA is a dest but not in bits 6:10
+            res['0'] = 'd:RA;d:CR0'  # RA: Rdest1_EXTRA3
+            res['1'] = 's:RS'  # RS: Rsrc1_EXTRA3
         elif insn_name == 'mfspr':
             res['0'] = 'd:RS'  # RS: Rdest1_EXTRA3
             res['1'] = 's:SPR'  # SPR: Rsrc1_EXTRA3
@@ -490,6 +491,9 @@ def extra_classifier(insn_name, value, name, res, regs):
         elif 'mfcr' in insn_name or 'mfocrf' in insn_name:
             res['0'] = 'd:RT'  # RT: Rdest1_EXTRA3
             res['1'] = 's:CR'  # CR: Rsrc1_EXTRA3
+        elif regs == ['', '', '', 'RT', 'BI', '']:
+            res['0'] = 'd:RT'  # RT: Rdest1_EXTRA3
+            res['1'] = 's:BI'  # BI: Rsrc1_EXTRA3
         elif insn_name == 'setb':
             res['0'] = 'd:RT'  # RT: Rdest1_EXTRA3
             res['1'] = 's:BFA'  # BFA: Rsrc1_EXTRA3
@@ -521,6 +525,15 @@ def extra_classifier(insn_name, value, name, res, regs):
         elif regs == ['', 'FRB', '', 'FRT', '', 'CR1']:
             res['0'] = 'd:FRT;d:CR1'  # FRT,CR1: Rdest1_EXTRA3
             res['1'] = 's:FRB'  # FRB: Rsrc1_EXTRA3
+        elif regs == ['', 'RB', '', 'FRT', '', 'CR1']:
+            res['0'] = 'd:FRT;d:CR1'  # FRT,CR1: Rdest1_EXTRA3
+            res['1'] = 's:RB'  # RB: Rsrc1_EXTRA3
+        elif regs == ['', 'RB', '', 'FRT', '', '']:
+            res['0'] = 'd:FRT'  # FRT: Rdest1_EXTRA3
+            res['1'] = 's:RB'  # RB: Rsrc1_EXTRA3
+        elif regs == ['', 'FRB', '', 'RT', '', 'CR0']:
+            res['0'] = 'd:RT;d:CR0'  # RT,CR0: Rdest1_EXTRA3
+            res['1'] = 's:FRB'  # FRB: Rsrc1_EXTRA3
         elif insn_name == 'fishmv':
             # an overwrite instruction
             res['0'] = 'd:FRS'  # FRS: Rdest1_EXTRA3
@@ -529,8 +542,7 @@ def extra_classifier(insn_name, value, name, res, regs):
             res['0'] = 'd:RT'  # RT: Rdest1_EXTRA3
             res['1'] = 's:RA'  # RS: Rsrc1_EXTRA3
         else:
-            res['0'] = 'TODO'
-            print("regs TODO", insn_name, regs)
+            raise NotImplementedError(insn_name)
 
     elif value == 'RM-1P-2S1D':
         res['Etype'] = 'EXTRA3'  # RM EXTRA3 type
@@ -559,6 +571,10 @@ def extra_classifier(insn_name, value, name, res, regs):
             res['0'] = 'd:FRT;d:CR1'  # FRT,CR1: Rdest1_EXTRA3
             res['1'] = 's:FRA'  # FRA: Rsrc1_EXTRA3
             res['2'] = 's:RB'  # RB: Rsrc1_EXTRA3
+        elif regs == ['RS', 'RB', '', 'RA', '', '']:
+            res['0'] = 'd:RA'  # RA: Rdest1_EXTRA3
+            res['1'] = 's:RS'  # RS: Rsrc1_EXTRA3
+            res['2'] = 's:RB'  # RB: Rsrc1_EXTRA3
         elif name == '2R-1W' or insn_name == 'cmpb':  # cmpb
             if insn_name in ['bpermd', 'cmpb']:
                 res['0'] = 'd:RA'  # RA: Rdest1_EXTRA3
@@ -584,8 +600,12 @@ def extra_classifier(insn_name, value, name, res, regs):
             res['0'] = 'd:RA;d:CR0'  # RA,CR0: Rdest1_EXTRA3
             res['1'] = 's:RA'  # RA: Rsrc1_EXTRA3
             res['2'] = 's:RS'  # RS: Rsrc1_EXTRA3
+        elif regs == ['RA', '', 'RB', 'RT', '', '']:  # maddsubrs
+            res['0'] = 's:RT;d:RT'  # RT: Rdest1_EXTRA2
+            res['1'] = 's:RA'  # RA: Rsrc1_EXTRA2
+            res['2'] = 's:RB'  # RT: Rsrc2_EXTRA2
         else:
-            res['0'] = 'TODO'
+            raise NotImplementedError(insn_name)
 
     elif value == 'RM-2P-2S1D':
         res['Etype'] = 'EXTRA2'  # RM EXTRA2 type
@@ -594,15 +614,14 @@ def extra_classifier(insn_name, value, name, res, regs):
             res['1'] = 's:RS'  # RS: Rsrc1_EXTRA2
             res['2'] = 's:CR'  # CR: Rsrc2_EXTRA2
         else:
-            res['0'] = 'TODO'
+            raise NotImplementedError(insn_name)
 
     elif value == 'RM-1P-3S1D':
         res['Etype'] = 'EXTRA2'  # RM EXTRA2 type
         if regs == ['FRT', 'FRB', 'FRA', 'FRT', '', 'CR1']:  # ffmadds/fdmadds
-            res['0'] = 'd:FRT;d:CR1'  # FRT,CR1: Rdest1_EXTRA2
-            res['1'] = 's:FRT'  # FRT: Rsrc1_EXTRA2
-            res['2'] = 's:FRB'  # FRB: Rsrc2_EXTRA2
-            res['3'] = 's:FRA'  # FRA: Rsrc3_EXTRA2
+            res['0'] = 's:FRT;d:FRT;d:CR1'  # FRT,CR1: Rdest1_EXTRA2
+            res['1'] = 's:FRB'  # FRB: Rsrc1_EXTRA2
+            res['2'] = 's:FRA'  # FRA: Rsrc2_EXTRA2
         elif regs == ['RA', 'RB', 'RC', 'RT', '', '']:  # madd*
             res['0'] = 'd:RT'  # RT,CR0: Rdest1_EXTRA2
             res['1'] = 's:RA'  # RA: Rsrc1_EXTRA2
@@ -614,15 +633,9 @@ def extra_classifier(insn_name, value, name, res, regs):
             res['2'] = 's:RB'  # RT: Rsrc2_EXTRA2
             res['3'] = 's:RC'  # RT: Rsrc3_EXTRA2
         elif regs == ['RA', 'RB', 'RT', 'RT', '', 'CR0']:  # overwrite 3-in
-            res['0'] = 'd:RT;d:CR0'  # RT,CR0: Rdest1_EXTRA2
-            res['1'] = 's:RA'  # RA: Rsrc1_EXTRA2
-            res['2'] = 's:RB'  # RT: Rsrc2_EXTRA2
-            res['3'] = 's:RT'  # RT: Rsrc3_EXTRA2
-        elif regs == ['RA', 'RB', 'RT', 'RT', '', '']:  # maddsubrs
-            res['0'] = 'd:RT'  # RT: Rdest1_EXTRA2
+            res['0'] = 's:RT;d:RT;d:CR0'  # RT,CR0: Rdest1_EXTRA2
             res['1'] = 's:RA'  # RA: Rsrc1_EXTRA2
             res['2'] = 's:RB'  # RT: Rsrc2_EXTRA2
-            res['3'] = 's:RT'  # RT: Rsrc3_EXTRA2
         elif insn_name == 'isel':
             res['0'] = 'd:RT'  # RT: Rdest1_EXTRA2
             res['1'] = 's:RA'  # RA: Rsrc1_EXTRA2
@@ -647,6 +660,19 @@ def extra_classifier(insn_name, value, name, res, regs):
         if insn_name.startswith('bc'):
             res['0'] = 's:BI'  # BI: Rsrc1_EXTRA3
 
+    elif value == 'RM-1P-1S':
+        pass  # FIXME
+
+    elif value == 'non-SV':
+        return
+
+    else:
+        raise NotImplementedError(insn_name)
+
+    #if insn_name.startswith("rlw"):
+    #    print("regs ", value, insn_name, regs, res)
+
+
 
 def process_csvs(format):
 
@@ -667,6 +693,7 @@ def process_csvs(format):
               '2R-1W-CRo': 'RM-1P-2S1D',
               '2R': 'non-SV',
               '2R-1W': 'RM-1P-2S1D',
+              '2R-1W-imm': 'RM-1P-2S1D',
               '1R-CRio': 'RM-2P-2S1D',
               '2R-CRio': 'RM-1P-2S1D',
               '2R-CRo': 'RM-1P-2S1D',
@@ -695,6 +722,8 @@ def process_csvs(format):
               'LDST-3R': 'LDSTRM-2P-3S',
               'LDST-3R-CRo': 'LDSTRM-2P-3S',  # st*x
               'LDST-3R-1W': 'LDSTRM-2P-2S1D',  # st*x
+              'LDST-2R': 'non-SV',  # dcbz -- TODO: any vectorizable?
+              'CRo': 'non-SV',  # mtfsb1 -- TODO: any vectorizable?
               }
     print("# map to old SV Prefix")
     print('')
@@ -781,6 +810,9 @@ def process_csvs(format):
             condition = row[3]
             insn = insns[(insn_name, condition)]
 
+            #if insn_name == 'rlwinm':
+            #    print ("upd rlwinm", insn)
+
             # start constructing svp64 CSV row
             res = OrderedDict()
             res['insn'] = insn_name