add reshaping algorithm for elements
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sat, 3 Nov 2018 14:00:57 +0000 (14:00 +0000)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sat, 3 Nov 2018 14:00:57 +0000 (14:00 +0000)
riscv/processor.cc
riscv/sv.h
riscv/sv_insn_redirect.cc

index eeb7c5ee169a182d9c8c3ad7d68573016be9d1af..f24784bec779b0cf8e35bff0b77251832db5073b 100644 (file)
@@ -140,6 +140,35 @@ void state_t::reset(reg_t max_isa)
     mcontrol[i].type = 2;
 }
 
+void sv_shape_t::setup_map()
+{
+    int order[3] = {};
+    int lims[3] = {xsz, ysz, zsz};
+    int idxs[3] = {0,0,0};
+
+    switch (permute) {
+        case SV_SHAPE_PERM_XYZ: order[0] = 0; order[1] = 1; order[2] = 2; break;
+        case SV_SHAPE_PERM_XZY: order[0] = 0; order[1] = 2; order[2] = 1; break;
+        case SV_SHAPE_PERM_YXZ: order[0] = 1; order[1] = 0; order[2] = 2; break;
+        case SV_SHAPE_PERM_YZX: order[0] = 1; order[1] = 2; order[2] = 0; break;
+        case SV_SHAPE_PERM_ZXY: order[0] = 2; order[1] = 0; order[2] = 1; break;
+        case SV_SHAPE_PERM_ZYX: order[0] = 2; order[1] = 1; order[2] = 0; break;
+    }
+    for (int i = 0; i < 128; i++)
+    {
+        uint8_t new_idx = idxs[0] + idxs[1] * xsz + idxs[2] * xsz * ysz;
+        map[i] = new_idx;
+        for (int j = 0; j < 3; j++)
+        {
+            idxs[order[j]] = idxs[order[j]] + 1;
+            if (idxs[order[j]] != lims[order[j]]) {
+                break;
+            }
+            idxs[order[i]] = 0;
+        }
+    }
+}
+
 int state_t::sv_csr_sz()
 {
     if (prv == PRV_M)
@@ -536,6 +565,7 @@ void processor_t::set_csr(int which, reg_t val)
                                    (get_field(val, (1<<15)) ? 0x2 : 0) |
                                    (get_field(val, (1<<23)) ? 0x4 : 0);
       state.shape[shapeidx].permute = get_field(val, SV_SHAPE_PERM);
+      state.shape[shapeidx].setup_map();
       break;
     }
 #endif
index 60e9b8dad1546117ac007a9e71c8e26abdbbfdde..fc06de1d0f9a4d4972a26af0d9dea71dc1757471 100644 (file)
@@ -82,6 +82,8 @@ typedef struct {
     int zsz;
     int offs;
     int permute;
+    uint8_t map[128];
+    void setup_map();
 } sv_shape_t;
 
 #define SV_REMAP_REGIDX0 (0x7f)
@@ -95,4 +97,11 @@ typedef struct {
 #define SV_SHAPE_ZDIM (0x7f<<16)
 #define SV_SHAPE_PERM (0x7<<24)
 
+#define SV_SHAPE_PERM_XYZ 0
+#define SV_SHAPE_PERM_XZY 1
+#define SV_SHAPE_PERM_YXZ 2
+#define SV_SHAPE_PERM_YZX 3
+#define SV_SHAPE_PERM_ZXY 4
+#define SV_SHAPE_PERM_ZYX 5
+
 #endif
index a4ca88a7d2b6f4d6ebaac8fd1b3afb4092c336eb..bb3dd26d224a0fa1db521337121aadd7c66b6627 100644 (file)
@@ -125,7 +125,7 @@ unsigned int sv_proc_t::remap(reg_spec_t const& spec)
     if (shape == NULL) {
         return offs;
     }
-    return offs; // XXX TODO
+    return (unsigned int)shape->map[offs] + shape->offs;
 }
 
 void (sv_proc_t::DO_WRITE_FREG)(reg_spec_t const& spec, sv_freg_t const& value)