use bitmasks to set literals
authoradam <adam@megacz.com>
Sun, 13 Apr 2008 02:25:06 +0000 (03:25 +0100)
committeradam <adam@megacz.com>
Sun, 13 Apr 2008 02:25:06 +0000 (03:25 +0100)
src/edu/berkeley/fleet/ies44/InstructionEncoder.java

index 13b1acf..2a726ee 100644 (file)
@@ -45,6 +45,10 @@ public abstract class InstructionEncoder {
     public static final Mask PATH_DATA           = new Mask(".........................01..........");
     public static final Mask PATH_NOCHANGE       = new Mask(".........................00..........");
 
+    public static final Mask TOP_HALF_LITERAL    = new Mask("vvvvvvvvvvvvvvvvvv...................");
+    public static final Mask BOT_HALF_LITERAL    = new Mask("..................vvvvvvvvvvvvvvvvvvv");
+    public static final Mask TOP_HALF_ONE        = new Mask("111111111111111111...................");
+    public static final Mask BOT_HALF_ONE        = new Mask("..................1111111111111111111");
     public static final Mask LITERAL_LO          = new Mask("...............010vvvvvvvvvvvvvvvvvvv");
     public static final Mask LITERAL_HI          = new Mask("...............011vvvvvvvvvvvvvvvvvvv");
     public static final Mask LITERAL             = new Mask("...............1..vvvvvvvvvvvvvvvvvvv");
@@ -112,10 +116,10 @@ public abstract class InstructionEncoder {
         if (LITERAL_HI.get(inst))  return new Instruction.HalfLiteral(name, dl, predicate, LITERAL_HI.getval(inst), 0, true);
         if (LITERAL.get(inst)) {
             long literal = LITERAL.getval(inst);
-            if      (LITERAL_LOW_ZERO.get(inst))  literal = literal << LITERAL_HIGH_ZERO.getWidth();
-            else if (LITERAL_LOW_ONE.get(inst))   literal = (literal << LITERAL_HIGH_ZERO.getWidth()) | ~(-1L << LITERAL_HIGH_ZERO.getWidth());
-            else if (LITERAL_HIGH_ZERO.get(inst)) literal = literal;
-            else if (LITERAL_HIGH_ONE.get(inst))  literal = literal | (-1L << LITERAL_HIGH_ZERO.getWidth());
+            if      (LITERAL_LOW_ZERO.get(inst))  literal = TOP_HALF_LITERAL.setval(0, literal);
+            else if (LITERAL_LOW_ONE.get(inst))   literal = BOT_HALF_ONE.set(TOP_HALF_LITERAL.setval(0, literal));
+            else if (LITERAL_HIGH_ZERO.get(inst)) literal = BOT_HALF_LITERAL.setval(0, literal);
+            else if (LITERAL_HIGH_ONE.get(inst))  literal = TOP_HALF_ONE.set(BOT_HALF_LITERAL.setval(0, literal));
             if ((literal & (1L<<(WIDTH_WORD-1))) != 0) literal |= (-1L << WIDTH_WORD);
             return new Instruction.Literal(name, dl, predicate, literal);
         }  
@@ -194,6 +198,8 @@ public abstract class InstructionEncoder {
             long literal = ((Instruction.Literal)d).literal;
             long allones = ~(-1L << WIDTH_WORD);
             il = literal = literal & allones;
+            long top_half = il >> LITERAL_HIGH_ZERO.getWidth();
+            long bot_half = il & ~(-1L << LITERAL_HIGH_ZERO.getWidth());
             if      (((il &  (-1L << 19)) & allones) == 0)       instr = LITERAL.setval(LITERAL_HIGH_ZERO.set(instr), il);
             else if (((il | ~(-1L << 19)) & allones) == allones) instr = LITERAL.setval(LITERAL_HIGH_ONE.set(instr),  il & ~(-1L<<19));
             else if (((il & ~(-1L << 19)) & allones) == 0)       instr = LITERAL.setval(LITERAL_LOW_ZERO.set(instr), il >> 19);