move D-Immediate rewriting in ISACaller into separate function
[openpower-isa.git] / src / openpower / decoder / isa / svshape.py
index 6f3fc176e8b8f9b5cb2b8e3d9fcde2c79ec083c1..5530b28de0ed0a5c8f139bc35156a04173b10d31 100644 (file)
@@ -22,8 +22,9 @@ from openpower.util import log
 
 
 class SVSHAPE(SelectableInt):
-    def __init__(self, value):
+    def __init__(self, value, gpr=None):
         SelectableInt.__init__(self, value, 32)
+        self.gpr = gpr # for Indexed mode
         offs = 0
         # set up sub-fields from Record layout
         self.fsi = {}
@@ -37,6 +38,9 @@ class SVSHAPE(SelectableInt):
             log("SVSHAPE setup field", field, offs, end)
             offs = end
 
+    def copy(self):
+        return SVSHAPE(self.value, self.gpr)
+
     def is_indexed(self):
         "REMAP Indexed Mode"
         return self.mode == 0b00 and self.submode2 in [0b110, 0b111]
@@ -53,7 +57,7 @@ class SVSHAPE(SelectableInt):
     def order(self):
         permute = self.fsi['permute'].asint(msb0=True)
         if self.is_indexed():
-            permute -= 0b110 # xyz or yxz
+            permute = (permute-0b110)*2 # xyz or yxz
         return SVP64SHAPE.order(permute)
 
     @order.setter
@@ -144,8 +148,19 @@ class SVSHAPE(SelectableInt):
     def offset(self, value):
         self.fsi['offset'].eq(value)
 
+    def postprocess(self, idx, step):
+        if self.mode != 0b00 or not self.is_indexed():
+            return idx
+        if self.gpr is None:
+            return idx
+        if self.xdimsz == 1 and self.ydimsz == 1:
+            idx = step # no Index remapping
+        remap = self.gpr(self.svgpr+idx).value # TODO: elwidths
+        log ("indexed_iterator", self.svgpr, idx, remap)
+        return remap
+
     def get_iterator(self):
-        log ("SVSHAPE get_iterator", self.mode, self.ydimsz)
+        log ("SVSHAPE get_iterator", self.mode, self.ydimsz, self.is_indexed())
         if self.mode == 0b00:
             iterate_fn = iterate_indices
         elif self.mode in [0b01, 0b11]:
@@ -161,11 +176,32 @@ class SVSHAPE(SelectableInt):
             elif self.ydimsz in [6, 14, 15]:
                 iterate_fn = iterate_dct_inner_halfswap_loadstore
         # create a **NEW** iterator each time this is called
-        return iterate_fn(deepcopy(self))
+        return iterate_fn(self.copy())
 
 
 if __name__ == '__main__':
     os.environ['SILENCELOG'] = "1"
+    xdim = 3
+    ydim = 2000
+    zdim = 1
+    SVSHAPE0 = SVSHAPE(0)
+    SVSHAPE0.lims = [xdim, ydim, zdim]
+    SVSHAPE0.submode2 = 0b110 # yx indexed
+    SVSHAPE0.mode = 0b00
+    SVSHAPE0.skip = 0b00
+    SVSHAPE0.offset = 0       # experiment with different offset, here
+    SVSHAPE0.invxyz = [0,0,1] # xy inversion (indices 0,1) , skip if desired (2)
+
+    VL = 6 # xdim * ydim * zdim
+
+    print ("Matrix Indexed Mode", SVSHAPE0.order, SVSHAPE0.invxyz)
+    for idx, new_idx in enumerate(SVSHAPE0.get_iterator()):
+        if idx >= VL:
+            break
+        print ("%d->%s" % (idx, repr(new_idx)))
+
+    print ("")
+
     xdim = 3
     ydim = 2
     zdim = 1
@@ -175,7 +211,7 @@ if __name__ == '__main__':
     SVSHAPE0.mode = 0b00
     SVSHAPE0.skip = 0b00
     SVSHAPE0.offset = 0       # experiment with different offset, here
-    SVSHAPE0.invxyz = [0,0,0] # inversion if desired
+    SVSHAPE0.invxyz = [0,1,0] # inversion if desired
 
     VL = xdim * ydim * zdim
 
@@ -183,7 +219,7 @@ if __name__ == '__main__':
     for idx, new_idx in enumerate(SVSHAPE0.get_iterator()):
         if idx >= VL:
             break
-        print ("%d->%d" % (idx, new_idx))
+        print ("%d->%s" % (idx, repr(new_idx)))
 
     print ("")
     print ("FFT Mode")
@@ -236,7 +272,7 @@ if __name__ == '__main__':
                                           iterate_indices(SVSHAPE2))):
         if idx >= VL:
             break
-        schedule.append((jl, jh, k))
+        schedule.append((jl[0], jh[0], k[0]))
 
     # ok now pretty-print the results, with some debug output
     size = 2