remove magic constant 19 from literal encodings
authoradam <adam@megacz.com>
Sun, 13 Apr 2008 02:14:38 +0000 (03:14 +0100)
committeradam <adam@megacz.com>
Sun, 13 Apr 2008 02:14:38 +0000 (03:14 +0100)
src/edu/berkeley/fleet/ies44/InstructionEncoder.java
src/edu/berkeley/fleet/util/Mask.java

index 2fc3386..13b1acf 100644 (file)
@@ -112,10 +112,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 << 19;
-            else if (LITERAL_LOW_ONE.get(inst))   literal = (literal << 19) | ~(-1L << 19);
+            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 << 19);
+            else if (LITERAL_HIGH_ONE.get(inst))  literal = literal | (-1L << LITERAL_HIGH_ZERO.getWidth());
             if ((literal & (1L<<(WIDTH_WORD-1))) != 0) literal |= (-1L << WIDTH_WORD);
             return new Instruction.Literal(name, dl, predicate, literal);
         }  
index f75c4be..4ed743c 100644 (file)
@@ -10,7 +10,6 @@ public class Mask {
     public final long valmask;
     public final int valmaskmin;
 
-
     public String verilog(String var) {
         return "(("+var+" & "+mask+")=="+val+")";
     }
@@ -32,6 +31,16 @@ public class Mask {
         return (in & mask) == val;
     }
 
+    public int getWidth() {
+        int ret = 0;
+        long m = 1;
+        for(int i=0; i<64; i++) {
+            if ((valmask & m)!=0) ret++;
+            m = m << 1;
+        }
+        return ret;
+    }
+
     public Mask(String s) {
         long mask = 0;
         long valmask = 0;