return new Instruction.Executable(name, dest, count, tokenIn, dataIn, latch, dataOutDest,
dataOut, tokenOut, requeue);
}
-
+ /*
case 1: {
Destination name = getDestByAddr(getField(WIDTH_WORD-3, WIDTH_WORD-3-WIDTH_DEST_ADDR+1, inst));
long offset = getSignedField(WIDTH_WORD-3-WIDTH_DEST_ADDR, WIDTH_CODEBAG_SIZE, instr);
long size = getSignedField(WIDTH_CODEBAG_SIZE-1, 0, instr);
return new Instruction.Literal.CodeBagDescriptor(name, offset, size);
}
-
+ */
case 2: {
Destination name = getDestByAddr(getField(WIDTH_WORD-3, WIDTH_WORD-3-WIDTH_PUMP_ADDR+1, inst));
return new Instruction.Literal.Absolute(name, getSignedField(WIDTH_WORD-3-WIDTH_PUMP_ADDR, 0, instr));
d = new Instruction.Executable(k.pump, null, k.count, k.killOnlyStandingInstructions,
false, true, false, false, false, false);
}
+
+ if (d instanceof Instruction.Literal.CodeBagDescriptor) {
+ Instruction.Literal.CodeBagDescriptor lc = (Instruction.Literal.CodeBagDescriptor)d;
+ d = new Instruction.LocalLiteral(lc.pump, ((lc.offset << WIDTH_CODEBAG_SIZE)) | lc.size);
+ }
+
if (d instanceof Instruction.LocalLiteral) {
Instruction.LocalLiteral inst = (Instruction.LocalLiteral)d;
- instr |= putField(OFFSET_PUMP_ADDR+WIDTH_PUMP_ADDR-1, OFFSET_PUMP_ADDR, getBoxInstAddr(inst.pump));
- instr |= putField(OFFSET_TI, OFFSET_TI, 1);
- instr |= putField(OFFSET_TO, OFFSET_TO, 1);
- instr |= putField(OFFSET_LITERAL+WIDTH_LITERAL-1, OFFSET_LITERAL, inst.literal);
+ if (inst.pump != null) {
+ instr |= putField(OFFSET_PUMP_ADDR+WIDTH_PUMP_ADDR-1, OFFSET_PUMP_ADDR, getBoxInstAddr(inst.pump));
+ instr |= putField(OFFSET_TI, OFFSET_TI, 1);
+ instr |= putField(OFFSET_TO, OFFSET_TO, 1);
+ instr |= putField(OFFSET_LITERAL+WIDTH_LITERAL-1, OFFSET_LITERAL, inst.literal);
+ } else {
+ instr = inst.literal;
+ }
} else if (d instanceof Instruction.Executable) {
Instruction.Executable inst = (Instruction.Executable)d;
instr |= putField(OFFSET_TO, OFFSET_TO, (inst.dataOutDest||inst.tokenOut)?1:0);
instr |= putField(OFFSET_RQ, OFFSET_RQ, inst.requeue?1:0);
- } else if (d instanceof Instruction.Literal.CodeBagDescriptor) {
- Instruction.Literal.CodeBagDescriptor lc = (Instruction.Literal.CodeBagDescriptor)d;
- instr = putField(WIDTH_WORD-1, WIDTH_WORD-2, 1);
- if (lc.dest != null) instr |= putField(WIDTH_WORD-3, WIDTH_WORD-3-WIDTH_DEST_ADDR+1, getDestAddr(lc.dest));
- instr |= putSignedField(WIDTH_WORD-3-WIDTH_DEST_ADDR, WIDTH_CODEBAG_SIZE, lc.offset);
- instr |= putField(WIDTH_CODEBAG_SIZE-1, 0, lc.size);
-
- } else if (d instanceof Instruction.Literal.Absolute) {
- Instruction.Literal.Absolute ld = (Instruction.Literal.Absolute)d;
- instr = putField(WIDTH_WORD-1, WIDTH_WORD-2, 2);
- instr |= putField(WIDTH_WORD-3, WIDTH_WORD-3-WIDTH_DEST_ADDR+1, getDestAddr(ld.dest));
- instr |= putSignedField(WIDTH_WORD-3-WIDTH_DEST_ADDR, 0, ld.value);
-
- } else if (d instanceof Instruction.Literal.Relative) {
- Instruction.Literal.Relative lr = (Instruction.Literal.Relative)d;
- instr = putField(WIDTH_WORD-1, WIDTH_WORD-2, 3);
- instr |= putField(WIDTH_WORD-3, WIDTH_WORD-3-WIDTH_DEST_ADDR+1, getDestAddr(lr.dest));
- instr |= putSignedField(WIDTH_WORD-3-WIDTH_DEST_ADDR, 0, lr.offset);
-
}
return instr;
}