private QuantizeDel EmitQuantize()
{
Type[] args = { typeof(float[]) };
DynamicMethod quantizeMethod = new DynamicMethod("Quantize",
null, // no return type
args); // input array
ILGenerator il = quantizeMethod.GetILGenerator();
for (int i = 0; i < quantizationTable.Length; i++)
{
float mult = (float)quantizationTable[i];
// Sz Stack:
il.Emit(OpCodes.Ldarg_0); // 1 {arr}
il.Emit(OpCodes.Ldc_I4_S, (short)i); // 3 {arr,i}
il.Emit(OpCodes.Ldarg_0); // 1 {arr,i,arr}
il.Emit(OpCodes.Ldc_I4_S, (short)i); // 3 {arr,i,arr,i}
il.Emit(OpCodes.Ldelem_R4); // 1 {arr,i,arr[i]}
il.Emit(OpCodes.Ldc_R4, mult); // 5 {arr,i,arr[i],mult}
il.Emit(OpCodes.Mul); // 1 {arr,i,arr[i]*mult}
il.Emit(OpCodes.Stelem_R4); // 1 {}
}
il.Emit(OpCodes.Ret);
return (QuantizeDel)quantizeMethod.CreateDelegate(typeof(QuantizeDel));
}
#endif