@Override
    public void evaluateLabels(Map<String, Integer> labelValues, int position)
        throws TokenCompileError {
        data.evaluateLabels(labelValues, position);
        int dest = data.getUnresolvedWord();

        int delta = dest - position;
        // Q: If the instruction's size might be 2 words, then why are
        // we only correcting by 1 word? A: The first operand, PC, is
        // read before the second word causes PC to increment.
        if(realInstruction != null)
            delta--;

        if(delta > 0) {
            realInstruction = new Instruction(Opcode.get(OpcodeType.ADD));
            realInstruction.setValueA(new Value(ValueType.PC));
            realInstruction.setValueB(new Value(ValueType.LITERAL, new UnresolvedData(null, delta)));
        } else if(delta < 0) {
            realInstruction = new Instruction(Opcode.get(OpcodeType.SUB));
            realInstruction.setValueA(new Value(ValueType.PC));
            realInstruction.setValueB(new Value(ValueType.LITERAL, new UnresolvedData(null, -delta)));
        } else /* if(delta == 0) */ {
            // JMP to the next instruction is NOP so don't do
            // anything.
            assert(delta == 0);
            realInstruction = null;
        }
    }