add support for a "standing" count value
[fleet.git] / src / edu / berkeley / fleet / ies44 / InstructionEncoder.java
index 8dc44b7..2efe2a6 100644 (file)
@@ -14,18 +14,19 @@ public abstract class InstructionEncoder {
     public static final int WIDTH_CODEBAG_SIZE     = 6;
     public static final int WIDTH_COUNTER_LITERAL  = 6;
 
-    public static final Mask FLAGS               = new Mask("...............000000................");
-    public static final Mask FLAGS_A             = new Mask("...............000000vvvvvvvv........");
-    public static final Mask FLAGS_B             = new Mask("...............000000........vvvvvvvv");
-    public static final Mask REPEAT_FROM_DATA    = new Mask("...............000001.........0......");
-    public static final Mask REPEAT_FROM_LITERAL = new Mask("...............000001.........1vvvvvv");
-    public static final Mask LOOP_FROM_DATA      = new Mask("...............000010.........0......");
-    public static final Mask LOOP_FROM_LITERAL   = new Mask("...............000010.........1vvvvvv");
-    public static final Mask TAKE_LOOP           = new Mask("...............000011................");
-    public static final Mask KILL                = new Mask("...............000100..........vvvvvv");
-    public static final Mask MASSACRE            = new Mask("...............000101................");
-    public static final Mask CLOG                = new Mask("...............000110................");
-    public static final Mask UNCLOG              = new Mask("...............000111................");
+    public static final Mask FLAGS                = new Mask("...............000000................");
+    public static final Mask FLAGS_A              = new Mask("...............000000vvvvvvvv........");
+    public static final Mask FLAGS_B              = new Mask("...............000000........vvvvvvvv");
+    public static final Mask REPEAT_FROM_DATA     = new Mask("...............000001........00......");
+    public static final Mask REPEAT_FROM_LITERAL  = new Mask("...............000001........10vvvvvv");
+    public static final Mask REPEAT_FROM_STANDING = new Mask("...............000001........11......");
+    public static final Mask LOOP_FROM_DATA       = new Mask("...............000010.........0......");
+    public static final Mask LOOP_FROM_LITERAL    = new Mask("...............000010.........1vvvvvv");
+    public static final Mask TAKE_LOOP            = new Mask("...............000011................");
+    public static final Mask KILL                 = new Mask("...............000100..........vvvvvv");
+    public static final Mask MASSACRE             = new Mask("...............000101................");
+    public static final Mask CLOG                 = new Mask("...............000110................");
+    public static final Mask UNCLOG               = new Mask("...............000111................");
 
     public static final Mask SK                  = new Mask("...........1.........................");
     public static final Mask DL                  = new Mask("............1........................");
@@ -94,11 +95,12 @@ public abstract class InstructionEncoder {
         if (P_B.get(inst)) predicate = Instruction.PredicatedInstruction.P_IF_B;
         if (P_Z.get(inst)) predicate = Instruction.PredicatedInstruction.P_IF_Z;
 
-        if (LOOP_FROM_LITERAL.get(inst))   return new Counter(name, predicate, (int)LOOP_FROM_LITERAL.getval(inst),   LOOP_COUNTER);
-        if (REPEAT_FROM_LITERAL.get(inst)) return new Counter(name, predicate, (int)REPEAT_FROM_LITERAL.getval(inst), REPEAT_COUNTER);
-        if (LOOP_FROM_DATA.get(inst))      return new Counter(name, predicate, DATA_LATCH, LOOP_COUNTER);
-        if (REPEAT_FROM_DATA.get(inst))    return new Counter(name, predicate, DATA_LATCH, REPEAT_COUNTER);
-        if (TAKE_LOOP.get(inst))           return new Counter(name, predicate, LOOP_COUNTER, DATA_LATCH);
+        if (LOOP_FROM_LITERAL.get(inst))    return new Counter(name, predicate, (int)LOOP_FROM_LITERAL.getval(inst),   LOOP_COUNTER);
+        if (REPEAT_FROM_LITERAL.get(inst))  return new Counter(name, predicate, (int)REPEAT_FROM_LITERAL.getval(inst), REPEAT_COUNTER);
+        if (LOOP_FROM_DATA.get(inst))       return new Counter(name, predicate, DATA_LATCH, LOOP_COUNTER);
+        if (REPEAT_FROM_DATA.get(inst))     return new Counter(name, predicate, DATA_LATCH, REPEAT_COUNTER);
+        if (REPEAT_FROM_STANDING.get(inst)) return new Counter(name, predicate, STANDING, REPEAT_COUNTER);
+        if (TAKE_LOOP.get(inst))            return new Counter(name, predicate, LOOP_COUNTER, DATA_LATCH);
 
         if (DL.get(inst))                  return new Instruction.DecrLoop(name, predicate);
 
@@ -193,8 +195,9 @@ public abstract class InstructionEncoder {
         } else if (d instanceof Instruction.Counter) {
             Instruction.Counter ic = (Instruction.Counter)d;
             if      (ic.dest == DATA_LATCH && ic.source == LOOP_COUNTER)   instr = TAKE_LOOP.set(instr);
-            else if (ic.dest == REPEAT_COUNTER && ic.source == DATA_LATCH) instr = REPEAT_FROM_DATA.set(instr);
             else if (ic.dest == LOOP_COUNTER && ic.source == DATA_LATCH)   instr = LOOP_FROM_DATA.set(instr);
+            else if (ic.dest == REPEAT_COUNTER && ic.source == DATA_LATCH) instr = REPEAT_FROM_DATA.set(instr);
+            else if (ic.dest == REPEAT_COUNTER && ic.source == STANDING)   instr = REPEAT_FROM_STANDING.set(instr);
             else if (ic.dest == REPEAT_COUNTER)                            instr = REPEAT_FROM_LITERAL.setval(REPEAT_FROM_LITERAL.set(instr), ic.source);
             else if (ic.dest == LOOP_COUNTER)                              instr = LOOP_FROM_LITERAL.setval(LOOP_FROM_LITERAL.set(instr), ic.source);
             else throw new RuntimeException();