void EncodeInstruction(VCDiffInstructionType inst, int size, byte mode = 0) { if (lastOpcodeIndex >= 0) { int lastOp = instructionAndSizes[lastOpcodeIndex]; if (inst == VCDiffInstructionType.ADD && (table.inst1[lastOp] == CodeTable.A)) { //warning adding two in a row Console.WriteLine("Warning: performing two ADD instructions in a row."); } int compoundOp = CodeTable.kNoOpcode; if (size <= byte.MaxValue) { compoundOp = instrMap.LookSecondOpcode((byte)lastOp, (byte)inst, (byte)size, mode); if (compoundOp != CodeTable.kNoOpcode) { instructionAndSizes[lastOpcodeIndex] = (byte)compoundOp; lastOpcodeIndex = -1; return; } } compoundOp = instrMap.LookSecondOpcode((byte)lastOp, (byte)inst, (byte)0, mode); if (compoundOp != CodeTable.kNoOpcode) { instructionAndSizes[lastOpcodeIndex] = (byte)compoundOp; //append size to instructionAndSizes VarIntBE.AppendInt32(size, instructionAndSizes); lastOpcodeIndex = -1; } } int opcode = CodeTable.kNoOpcode; if (size <= byte.MaxValue) { opcode = instrMap.LookFirstOpcode((byte)inst, (byte)size, mode); if (opcode != CodeTable.kNoOpcode) { instructionAndSizes.Add((byte)opcode); lastOpcodeIndex = instructionAndSizes.Count - 1; return; } } opcode = instrMap.LookFirstOpcode((byte)inst, 0, mode); if (opcode == CodeTable.kNoOpcode) { return; } instructionAndSizes.Add((byte)opcode); lastOpcodeIndex = instructionAndSizes.Count - 1; VarIntBE.AppendInt32(size, instructionAndSizes); }
private void EncodeInstruction(VCDiffInstructionType inst, int size, byte mode = 0) { if (lastOpcodeIndex >= 0) { int lastOp = instructionAndSizes.GetBuffer()[lastOpcodeIndex]; int compoundOp; if (size <= byte.MaxValue) { compoundOp = instrMap.LookSecondOpcode((byte)lastOp, (byte)inst, (byte)size, mode); if (compoundOp != CodeTable.kNoOpcode) { instructionAndSizes.GetBuffer()[lastOpcodeIndex] = (byte)compoundOp; lastOpcodeIndex = -1; return; } } compoundOp = instrMap.LookSecondOpcode((byte)lastOp, (byte)inst, 0, mode); if (compoundOp != CodeTable.kNoOpcode) { instructionAndSizes.GetBuffer()[lastOpcodeIndex] = (byte)compoundOp; //append size to instructionAndSizes VarIntBE.AppendInt32(size, instructionAndSizes); lastOpcodeIndex = -1; } } int opcode; if (size <= byte.MaxValue) { opcode = instrMap.LookFirstOpcode((byte)inst, (byte)size, mode); if (opcode != CodeTable.kNoOpcode) { instructionAndSizes.WriteByte((byte)opcode); lastOpcodeIndex = (int)instructionAndSizes.Length - 1; return; } } opcode = instrMap.LookFirstOpcode((byte)inst, 0, mode); if (opcode == CodeTable.kNoOpcode) { return; } instructionAndSizes.WriteByte((byte)opcode); lastOpcodeIndex = (int)instructionAndSizes.Length - 1; VarIntBE.AppendInt32(size, instructionAndSizes); }