clean up literal-setting code
authoradam <adam@megacz.com>
Sun, 13 Apr 2008 02:33:21 +0000 (03:33 +0100)
committeradam <adam@megacz.com>
Sun, 13 Apr 2008 02:33:21 +0000 (03:33 +0100)
src/edu/berkeley/fleet/ies44/InstructionEncoder.java

index c533f7c..c064487 100644 (file)
@@ -194,15 +194,11 @@ public abstract class InstructionEncoder {
 
         } else if (d instanceof Instruction.Literal) {
             long il = ((Instruction.Literal)d).literal;
-            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);
-            else if (((il |  (-1L << 19)) & allones) == allones) instr = LITERAL.setval(LITERAL_LOW_ONE.set(instr),  (il >> 19));
+            if      (TOP_HALF_ONE.get(il))           instr = LITERAL_LO.setval(LITERAL_HIGH_ONE.set(instr),  BOT_HALF_LITERAL.getval(il));
+            else if (TOP_HALF_LITERAL.getval(il)==0) instr = LITERAL_LO.setval(LITERAL_HIGH_ZERO.set(instr), BOT_HALF_LITERAL.getval(il));
+            else if (BOT_HALF_ONE.get(il))           instr = LITERAL_HI.setval(LITERAL_LOW_ONE.set(instr),   TOP_HALF_LITERAL.getval(il));
+            else if (BOT_HALF_LITERAL.getval(il)==0) instr = LITERAL_HI.setval(LITERAL_LOW_ZERO.set(instr),  TOP_HALF_LITERAL.getval(il));
+            else throw new RuntimeException("literal cannot be encoded using a single instruction");
             
         } else if (d instanceof Instruction.HalfLiteral) {
             Instruction.HalfLiteral inst = (Instruction.HalfLiteral)d;