/** shifts an immediate into the low-order bits of the data latch */
public static class Shift extends Instruction {
- public final BitVector immediate;
- public Shift(Dock dock, BitVector immediate) { this(dock, Predicate.Default, immediate); }
- public Shift(Dock dock, Predicate predicate, BitVector immediate) {
+ public final DeferredBitVector immediate;
+ public Shift(Dock dock, DeferredBitVector immediate) { this(dock, Predicate.Default, immediate); }
+ public Shift(final Dock dock, Predicate predicate, final DeferredBitVector arg) {
super(dock, predicate);
- this.immediate = immediate;
- this.immediate.setImmutable();
- if (immediate.length() != dock.getShip().getFleet().getShiftWidth())
- throw new RuntimeException("attempt to create a Shift instruction with a "+immediate.length()+
- "-bit immediate on a Fleet that uses "+dock.getShip().getFleet().getShiftWidth()+
- "-bit shift instructions");
+ this.immediate = new DeferredBitVector() {
+ public BitVector getBitVector() {
+ BitVector ret = arg.getBitVector();
+ if (ret.length() != dock.getShip().getFleet().getShiftWidth())
+ throw new RuntimeException("attempt to create a Shift instruction with a "+ret.length()+
+ "-bit immediate on a Fleet that uses "+dock.getShip().getFleet().getShiftWidth()+
+ "-bit shift instructions");
+ return ret;
+ }
+ };
}
- public String toString() { return super.toString()+"shift "+immediate; }
+ public String toString() { return super.toString()+"shift "+immediate.getBitVector(); }
}
/** a flush instruction */
Instruction.Shift shift = (Instruction.Shift)instructions.peek();
for(int i=dataLatch.length()-1; i>=getShip().getFleet().getShiftWidth(); i--)
dataLatch.set(i, dataLatch.get(i-getShip().getFleet().getShiftWidth()));
+ BitVector shift_immediate = shift.immediate.getBitVector();
for(int i=getShip().getFleet().getShiftWidth()-1; i>=0; i--)
- dataLatch.set(i, shift.immediate.get(i));
+ dataLatch.set(i, shift_immediate.get(i));
break;
} else if (instructions.peek() instanceof Instruction.Set) {
} else if (d instanceof Shift) {
Shift shift = (Shift)d;
instr = SHIFT.set(instr);
- instr = SHIFT.setval(instr, shift.immediate);
+ instr = SHIFT.setval(instr, shift.immediate.getBitVector());
} else if (d instanceof Flush) {
instr = FLUSH.set(instr);