power_insn: bind records to operands
[openpower-isa.git] / src / openpower / sv / sv_analysis.py
index 8cc0833db6c6ece9416668dcb1110006b0b92611..332a0b2db0abb03b54be0608f0c993825a75e5b9 100644 (file)
@@ -314,13 +314,21 @@ def read_csvs():
                 continue  # skip pseudo-alias lxxxbr
             if insn_name in ['mcrxr', 'mcrxrx', 'darn']:
                 continue
-            if insn_name in ['bctar', 'bcctr']:
+            if insn_name in ['bctar', 'bcctr']:  # for now. TODO
                 continue
             if 'rfid' in insn_name:
                 continue
-            if 'addpcis' in insn_name: # skip for now
+            if 'addpcis' in insn_name:  # skip for now
                 continue
 
+            # sv.bc is being classified as 2P-2S-1D by mistake due to SPRs
+            if insn_name.startswith('bc'):
+                # whoops: remove out reg (SPRs CTR etc)
+                row['in1'] = 'NONE'
+                row['in2'] = 'NONE'
+                row['in3'] = 'NONE'
+                row['out'] = 'NONE'
+
             insns[(insn_name, condition)] = row  # accumulate csv data
             insn_to_csv[insn_name] = csvname_  # CSV file name by instruction
             dkey = create_key(row)
@@ -344,7 +352,7 @@ def read_csvs():
     primarykeys.sort()
 
     return (csvs, csvs_svp64, primarykeys, bykey, insn_to_csv, insns,
-           dictkeys, immediates)
+            dictkeys, immediates)
 
 
 def regs_profile(insn, res):
@@ -412,7 +420,7 @@ def extra_classifier(insn_name, value, name, res, regs):
     #     if regs == ['RA', '', '', 'RT', '', '']:
     # is in the order in1  in2  in3 out1 out2 Rc=1
 
-    #********
+    # ********
     # start with LD/ST
 
     if value == 'LDSTRM-2P-1S1D':
@@ -458,13 +466,13 @@ def extra_classifier(insn_name, value, name, res, regs):
     elif value == 'LDSTRM-2P-3S':
         res['Etype'] = 'EXTRA2'  # RM EXTRA2 type
         if 'cx' in insn_name:
-            res['0'] = "%s;%s" % (sRS, dCR) # RS: Rsrc1_EXTRA2 CR0: dest
+            res['0'] = "%s;%s" % (sRS, dCR)  # RS: Rsrc1_EXTRA2 CR0: dest
         else:
             res['0'] = sRS  # RS: Rsrc1_EXTRA2
         res['1'] = 's:RA'  # RA: Rsrc2_EXTRA2
         res['2'] = 's:RB'  # RA: Rsrc3_EXTRA2
 
-    #**********
+    # **********
     # now begins,arithmetic
 
     elif value == 'RM-2P-1S1D':
@@ -512,9 +520,6 @@ 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 insn_name.startswith('bc'):
-            res['0'] = 'd:BI'  # BI: Rdest1_EXTRA3
-            res['1'] = 's:BI'  # BI: Rsrc1_EXTRA3
         elif insn_name == 'fishmv':
             # an overwrite instruction
             res['0'] = 'd:FRS'  # FRS: Rdest1_EXTRA3
@@ -592,7 +597,17 @@ def extra_classifier(insn_name, value, name, res, regs):
 
     elif value == 'RM-1P-3S1D':
         res['Etype'] = 'EXTRA2'  # RM EXTRA2 type
-        if regs == ['RA', 'RB', 'RT', 'RT', '', 'CR0']:
+        if regs == ['RA', 'RB', 'RC', 'RT', '', '']:  # madd*
+            res['0'] = 'd:RT'  # RT,CR0: Rdest1_EXTRA2
+            res['1'] = 's:RA'  # RA: Rsrc1_EXTRA2
+            res['2'] = 's:RB'  # RT: Rsrc2_EXTRA2
+            res['3'] = 's:RC'  # RT: Rsrc3_EXTRA2
+        elif regs == ['RA', 'RB', 'RC', 'RT', '', 'CR0']:  # pcdec
+            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: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
@@ -602,7 +617,7 @@ def extra_classifier(insn_name, value, name, res, regs):
             res['1'] = 's:RA'  # RA: Rsrc1_EXTRA2
             res['2'] = 's:RB'  # RT: Rsrc2_EXTRA2
             res['3'] = 's:BC'  # BC: Rsrc3_EXTRA2
-        else:
+        else:  # fmadd*
             res['0'] = 'd:FRT;d:CR1'  # FRT, CR1: Rdest1_EXTRA2
             res['1'] = 's:FRA'  # FRA: Rsrc1_EXTRA2
             res['2'] = 's:FRB'  # FRB: Rsrc2_EXTRA2
@@ -615,6 +630,12 @@ def extra_classifier(insn_name, value, name, res, regs):
         if insn_name == 'fmvis':
             res['0'] = 'd:FRS'  # FRS: Rdest1_EXTRA3
 
+    # HACK! thos should be RM-1P-1S butvthere is a bug with sv.bc
+    elif value == 'RM-2P-1S':
+        res['Etype'] = 'EXTRA3'  # RM EXTRA3 type
+        if insn_name.startswith('bc'):
+            res['0'] = 's:BI'  # BI: Rsrc1_EXTRA3
+
 
 def process_csvs(format):
 
@@ -625,10 +646,11 @@ def process_csvs(format):
     print('')
 
     (csvs, csvs_svp64, primarykeys, bykey, insn_to_csv, insns,
-           dictkeys, immediates) = read_csvs()
+     dictkeys, immediates) = read_csvs()
 
     # mapping to old SVPrefix "Forms"
     mapsto = {'3R-1W-CRo': 'RM-1P-3S1D',
+              '3R-1W': 'RM-1P-3S1D',
               '2R-1W-CRio': 'RM-1P-2S1D',
               '2R-1W-CRi': 'RM-1P-3S1D',
               '2R-1W-CRo': 'RM-1P-2S1D',
@@ -650,7 +672,7 @@ def process_csvs(format):
               '1W-CRi': 'RM-2P-1S1D',
               'CRio': 'RM-2P-1S1D',
               'CR=2R1W': 'RM-1P-2S1D',
-              'CRi': 'non-SV',
+              'CRi': 'RM-2P-1S',  # HACK, bc here, it should be 1P
               'imm': 'non-SV',
               '': 'non-SV',
               'LDST-2R-imm': 'LDSTRM-2P-2S',
@@ -766,16 +788,16 @@ def process_csvs(format):
 
             # set the SVP64 mode to NORMAL, LDST, BRANCH or CR
             crops = ['mfcr', 'mfocrf', 'mtcrf', 'mtocrf',
-                    ]
+                     ]
             mode = 'NORMAL'
             if value.startswith('LDST'):
-                if 'x' in insn_name: # Indexed detection
+                if 'x' in insn_name:  # Indexed detection
                     mode = 'LDST_IDX'
                 else:
                     mode = 'LDST_IMM'
             elif insn_name.startswith('bc'):
                 mode = 'BRANCH'
-            elif insn_name.startswith('cr') or insn_name in crops:
+            elif insn_name.startswith('cmp') or insn_name.startswith('cr') or insn_name in crops:
                 mode = 'CROP'
             res['mode'] = mode
 
@@ -791,8 +813,8 @@ def process_csvs(format):
             # MASK_SRC
             vstripped = value.replace("LDST", "")
             if vstripped in ['RM-2P-1S1D', 'RM-2P-2S',
-                         'RM-2P-2S1D', 'RM-2P-1S2D', 'RM-2P-3S',
-                        ]:
+                             'RM-2P-2S1D', 'RM-2P-1S2D', 'RM-2P-3S',
+                             ]:
                 res['SM'] = 'EN'
             else:
                 res['SM'] = 'NO'
@@ -817,8 +839,8 @@ def process_csvs(format):
         if value == '-':
             continue
             from time import sleep
-            print ("WARNING, filename '-' should NOT exist. instrs missing")
-            print ("TODO: fix this (and put in the bugreport number here)")
+            print("WARNING, filename '-' should NOT exist. instrs missing")
+            print("TODO: fix this (and put in the bugreport number here)")
             sleep(2)
         # print out svp64 tables by category
         print("## %s" % value)