From: adam Date: Sun, 13 Apr 2008 02:25:06 +0000 (+0100) Subject: use bitmasks to set literals X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=e7b5272e9949d812cb749d61ceac49c88f7a01b4;p=fleet.git use bitmasks to set literals --- diff --git a/src/edu/berkeley/fleet/ies44/InstructionEncoder.java b/src/edu/berkeley/fleet/ies44/InstructionEncoder.java index 13b1acf..2a726ee 100644 --- a/src/edu/berkeley/fleet/ies44/InstructionEncoder.java +++ b/src/edu/berkeley/fleet/ies44/InstructionEncoder.java @@ -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);