update instruction encoding, remove ability to predicate directly on C-flag
authoradam <adam@megacz.com>
Thu, 21 Aug 2008 10:27:18 +0000 (11:27 +0100)
committeradam <adam@megacz.com>
Thu, 21 Aug 2008 10:27:18 +0000 (11:27 +0100)
src/edu/berkeley/fleet/two/FleetTwoFleet.java

index 454b73b..1ee63ea 100644 (file)
@@ -29,9 +29,9 @@ public abstract class FleetTwoFleet extends Fleet {
     public static final Mask P_A                        = new Mask(".............001.....................");
     public static final Mask P_NOT_B                    = new Mask(".............010.....................");
     public static final Mask P_B                        = new Mask(".............011.....................");
-    public static final Mask P_NOT_C                    = new Mask(".............100.....................");
-    public static final Mask P_C                        = new Mask(".............101.....................");
-    public static final Mask P_OLC                      = new Mask(".............110.....................");
+    public static final Mask P_UNUSED                   = new Mask(".............100.....................");
+    public static final Mask P_OLC_ZERO                 = new Mask(".............101.....................");
+    public static final Mask P_OLC_NONZERO              = new Mask(".............110.....................");
     public static final Mask P_ALWAYS                   = new Mask(".............111.....................");
 
     public static final Mask SHIFT                      = new Mask("................00vvvvvvvvvvvvvvvvvvv");
@@ -48,22 +48,20 @@ public abstract class FleetTwoFleet extends Fleet {
     public static final Mask PATH_DATA                  = new Mask(".......................01............");
     public static final Mask PATH_NOCHANGE              = new Mask(".......................00............");
 
-    public static final Mask SET                        = new Mask("................10...................");
+    public static final Mask SET_OLC_FROM_IMMEDIATE     = new Mask("................101000100......vvvvvv");
+    public static final Mask SET_OLC_FROM_DATA_LATCH    = new Mask("................101000010............");
+    public static final Mask SET_OLC_FROM_OLC_MINUS_ONE = new Mask("................101000001............");
 
-    public static final Mask SET_OLC_FROM_IMMEDIATE     = new Mask("................1010000100.....vvvvvv");
-    public static final Mask SET_OLC_FROM_DATA_LATCH    = new Mask("................1010000010...........");
-    public static final Mask SET_OLC_FROM_OLC_MINUS_ONE = new Mask("................1010000001...........");
+    public static final Mask SET_ILC_FROM_IMMEDIATE     = new Mask("................10010010......0vvvvvv");
+    public static final Mask SET_ILC_FROM_INFINITY      = new Mask("................10010010......1......");
+    public static final Mask SET_ILC_FROM_DATA_LATCH    = new Mask("................10010001.............");
 
-    public static final Mask SET_ILC_FROM_IMMEDIATE     = new Mask("................1001000100.....vvvvvv");
-    public static final Mask SET_ILC_FROM_INFINITY      = new Mask("................1001000010...........");
-    public static final Mask SET_ILC_FROM_DATA_LATCH    = new Mask("................1001000001...........");
+    public static final Mask SET_IMMEDIATE              = new Mask("................100010.vvvvvvvvvvvvvv");
+    public static final Mask SET_IMMEDIATE_EXTEND       = new Mask("................100010v..............");
 
-    public static final Mask SET_IMMEDIATE                = new Mask("................1000100.vvvvvvvvvvvvv");
-    public static final Mask SET_IMMEDIATE_EXTEND         = new Mask("................1000100v.............");
-
-    public static final Mask SET_FLAGS                  = new Mask("................1000010..............");
-    public static final Mask SET_FLAGS_A                = new Mask("................1000010..vvvvvv......");
-    public static final Mask SET_FLAGS_B                = new Mask("................1000010........vvvvvv");
+    public static final Mask SET_FLAGS                  = new Mask("................100001...............");
+    public static final Mask SET_FLAGS_A                = new Mask("................100001...vvvvvv......");
+    public static final Mask SET_FLAGS_B                = new Mask("................100001.........vvvvvv");
     public static final Mask SET_FLAGS_VALUE_A          = new Mask("1.....");
     public static final Mask SET_FLAGS_VALUE_NOT_A      = new Mask(".1....");
     public static final Mask SET_FLAGS_VALUE_B          = new Mask("..1...");
@@ -136,13 +134,12 @@ public abstract class FleetTwoFleet extends Fleet {
 
         Predicate predicate = Default;
         if (P_ALWAYS.get(inst)) predicate = IgnoreOLC;
-        if (P_OLC.get(inst))    predicate = Default;
+        if (P_OLC_ZERO.get(inst))    throw new RuntimeException("not yet supported");
+        if (P_OLC_NONZERO.get(inst))    predicate = Default;
         if (P_A.get(inst))      predicate = FlagA;
         if (P_B.get(inst))      predicate = FlagB;
-        if (P_C.get(inst))      predicate = FlagC;
         if (P_NOT_A.get(inst))  predicate = NotFlagA;
         if (P_NOT_B.get(inst))  predicate = NotFlagB;
-        if (P_NOT_C.get(inst))  predicate = NotFlagC;
 
         boolean looping = !OS.get(inst);
         if (SHIFT.get(inst))                return new Shift(dock, looping, predicate, new BitVector(dock.getShip().getFleet().getWordWidth()).set(SHIFT.getval(inst)));
@@ -213,13 +210,11 @@ public abstract class FleetTwoFleet extends Fleet {
         if (!pi.looping) instr = OS.set(instr);
         switch(pi.predicate) {
             case IgnoreOLC:         instr = P_ALWAYS.set(instr); break;
-            case Default: instr = P_OLC.set(instr); break;
+            case Default: instr = P_OLC_NONZERO.set(instr); break;
             case FlagA:      instr = P_A.set(instr);      break;
             case FlagB:      instr = P_B.set(instr);      break;
-            case FlagC:      instr = P_C.set(instr);      break;
             case NotFlagA:  instr = P_NOT_A.set(instr);      break;
             case NotFlagB:  instr = P_NOT_B.set(instr);      break;
-            case NotFlagC:  instr = P_NOT_C.set(instr);      break;
         }
 
         if (d instanceof Tail) {