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);
}
public final long valmask;
public final int valmaskmin;
-
public String verilog(String var) {
return "(("+var+" & "+mask+")=="+val+")";
}
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;