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");
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);
}
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);