remove duplicated code
This commit is contained in:
parent
ec098a72da
commit
c8fb614c51
49
Program.cs
49
Program.cs
|
|
@ -804,17 +804,10 @@ internal static class Compiler
|
||||||
methodGenerator.Emit(OpCodes.Stloc_0);
|
methodGenerator.Emit(OpCodes.Stloc_0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmitReadVariablesB(Operand b)
|
void EmitReadVariable(Operand v)
|
||||||
{
|
{
|
||||||
methodGenerator.Emit(OpCodes.Ldarg_0); // Span<T>
|
methodGenerator.Emit(OpCodes.Ldarg_0); // Span<T>
|
||||||
methodGenerator.Emit(OpCodes.Ldc_I4, b); // b
|
methodGenerator.Emit(OpCodes.Ldc_I4, v); // variable offset
|
||||||
methodGenerator.Emit(OpCodes.Call, typeof(Evaluation).GetMethod(nameof(Evaluation.Read))!.MakeGenericMethod(typeof(T)));
|
|
||||||
}
|
|
||||||
|
|
||||||
void EmitReadVariablesA(Operand a)
|
|
||||||
{
|
|
||||||
methodGenerator.Emit(OpCodes.Ldarg_0); // Span<T>
|
|
||||||
methodGenerator.Emit(OpCodes.Ldc_I4, a); // a
|
|
||||||
methodGenerator.Emit(OpCodes.Call, typeof(Evaluation).GetMethod(nameof(Evaluation.Read))!.MakeGenericMethod(typeof(T)));
|
methodGenerator.Emit(OpCodes.Call, typeof(Evaluation).GetMethod(nameof(Evaluation.Read))!.MakeGenericMethod(typeof(T)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -832,8 +825,8 @@ internal static class Compiler
|
||||||
|
|
||||||
case { OpCode: OpCode.Add, A: { IsConstant: false } a, B: { IsConstant: false } b }: // => Add(variables[a], variables[b]),
|
case { OpCode: OpCode.Add, A: { IsConstant: false } a, B: { IsConstant: false } b }: // => Add(variables[a], variables[b]),
|
||||||
|
|
||||||
EmitReadVariablesA(a);
|
EmitReadVariable(a);
|
||||||
EmitReadVariablesB(b);
|
EmitReadVariable(b);
|
||||||
EmitInvokeBinaryOperation(nameof(Evaluation.Add));
|
EmitInvokeBinaryOperation(nameof(Evaluation.Add));
|
||||||
EmitWrite(instruction.Out);
|
EmitWrite(instruction.Out);
|
||||||
break;
|
break;
|
||||||
|
|
@ -841,14 +834,14 @@ internal static class Compiler
|
||||||
case { OpCode: OpCode.Add, A.IsConstant: true, B: { IsConstant: false } b }: // => Add(EvaluateConstant<T>(instruction.C), variables[b]),
|
case { OpCode: OpCode.Add, A.IsConstant: true, B: { IsConstant: false } b }: // => Add(EvaluateConstant<T>(instruction.C), variables[b]),
|
||||||
|
|
||||||
EmitReadConstant(instruction.C);
|
EmitReadConstant(instruction.C);
|
||||||
EmitReadVariablesB(b);
|
EmitReadVariable(b);
|
||||||
EmitInvokeBinaryOperation(nameof(Evaluation.Add));
|
EmitInvokeBinaryOperation(nameof(Evaluation.Add));
|
||||||
EmitWrite(instruction.Out);
|
EmitWrite(instruction.Out);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case { OpCode: OpCode.Add, A: { IsConstant: false } a, B.IsConstant: true }: // => Add(variables[a], EvaluateConstant<T>(instruction.C)),
|
case { OpCode: OpCode.Add, A: { IsConstant: false } a, B.IsConstant: true }: // => Add(variables[a], EvaluateConstant<T>(instruction.C)),
|
||||||
|
|
||||||
EmitReadVariablesA(a);
|
EmitReadVariable(a);
|
||||||
EmitReadConstant(instruction.C);
|
EmitReadConstant(instruction.C);
|
||||||
EmitInvokeBinaryOperation(nameof(Evaluation.Add));
|
EmitInvokeBinaryOperation(nameof(Evaluation.Add));
|
||||||
EmitWrite(instruction.Out);
|
EmitWrite(instruction.Out);
|
||||||
|
|
@ -856,8 +849,8 @@ internal static class Compiler
|
||||||
|
|
||||||
case { OpCode: OpCode.Sub, A: { IsConstant: false } a, B: { IsConstant: false } b }: // => Sub(variables[a], variables[b]),
|
case { OpCode: OpCode.Sub, A: { IsConstant: false } a, B: { IsConstant: false } b }: // => Sub(variables[a], variables[b]),
|
||||||
|
|
||||||
EmitReadVariablesA(a);
|
EmitReadVariable(a);
|
||||||
EmitReadVariablesB(b);
|
EmitReadVariable(b);
|
||||||
EmitInvokeBinaryOperation(nameof(Evaluation.Sub));
|
EmitInvokeBinaryOperation(nameof(Evaluation.Sub));
|
||||||
EmitWrite(instruction.Out);
|
EmitWrite(instruction.Out);
|
||||||
break;
|
break;
|
||||||
|
|
@ -865,14 +858,14 @@ internal static class Compiler
|
||||||
case { OpCode: OpCode.Sub, A.IsConstant: true, B: { IsConstant: false } b }: // => Sub(EvaluateConstant<T>(instruction.C), variables[b]),
|
case { OpCode: OpCode.Sub, A.IsConstant: true, B: { IsConstant: false } b }: // => Sub(EvaluateConstant<T>(instruction.C), variables[b]),
|
||||||
|
|
||||||
EmitReadConstant(instruction.C);
|
EmitReadConstant(instruction.C);
|
||||||
EmitReadVariablesB(b);
|
EmitReadVariable(b);
|
||||||
EmitInvokeBinaryOperation(nameof(Evaluation.Sub));
|
EmitInvokeBinaryOperation(nameof(Evaluation.Sub));
|
||||||
EmitWrite(instruction.Out);
|
EmitWrite(instruction.Out);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case { OpCode: OpCode.Sub, A: { IsConstant: false } a, B.IsConstant: true }: // => Sub(variables[a], EvaluateConstant<T>(instruction.C)),
|
case { OpCode: OpCode.Sub, A: { IsConstant: false } a, B.IsConstant: true }: // => Sub(variables[a], EvaluateConstant<T>(instruction.C)),
|
||||||
|
|
||||||
EmitReadVariablesA(a);
|
EmitReadVariable(a);
|
||||||
EmitReadConstant(instruction.C);
|
EmitReadConstant(instruction.C);
|
||||||
EmitInvokeBinaryOperation(nameof(Evaluation.Sub));
|
EmitInvokeBinaryOperation(nameof(Evaluation.Sub));
|
||||||
EmitWrite(instruction.Out);
|
EmitWrite(instruction.Out);
|
||||||
|
|
@ -880,8 +873,8 @@ internal static class Compiler
|
||||||
|
|
||||||
case { OpCode: OpCode.Mul, A: { IsConstant: false } a, B: { IsConstant: false } b }: // => Mul(variables[a], variables[b]),
|
case { OpCode: OpCode.Mul, A: { IsConstant: false } a, B: { IsConstant: false } b }: // => Mul(variables[a], variables[b]),
|
||||||
|
|
||||||
EmitReadVariablesA(a);
|
EmitReadVariable(a);
|
||||||
EmitReadVariablesB(b);
|
EmitReadVariable(b);
|
||||||
EmitInvokeBinaryOperation(nameof(Evaluation.Mul));
|
EmitInvokeBinaryOperation(nameof(Evaluation.Mul));
|
||||||
EmitWrite(instruction.Out);
|
EmitWrite(instruction.Out);
|
||||||
break;
|
break;
|
||||||
|
|
@ -889,14 +882,14 @@ internal static class Compiler
|
||||||
case { OpCode: OpCode.Mul, A.IsConstant: true, B: { IsConstant: false } b }: // => Mul(EvaluateConstant<T>(instruction.C), variables[b]),
|
case { OpCode: OpCode.Mul, A.IsConstant: true, B: { IsConstant: false } b }: // => Mul(EvaluateConstant<T>(instruction.C), variables[b]),
|
||||||
|
|
||||||
EmitReadConstant(instruction.C);
|
EmitReadConstant(instruction.C);
|
||||||
EmitReadVariablesB(b);
|
EmitReadVariable(b);
|
||||||
EmitInvokeBinaryOperation(nameof(Evaluation.Mul));
|
EmitInvokeBinaryOperation(nameof(Evaluation.Mul));
|
||||||
EmitWrite(instruction.Out);
|
EmitWrite(instruction.Out);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case { OpCode: OpCode.Mul, A: { IsConstant: false } a, B.IsConstant: true }: // => Mul(variables[a], EvaluateConstant<T>(instruction.C)),
|
case { OpCode: OpCode.Mul, A: { IsConstant: false } a, B.IsConstant: true }: // => Mul(variables[a], EvaluateConstant<T>(instruction.C)),
|
||||||
|
|
||||||
EmitReadVariablesA(a);
|
EmitReadVariable(a);
|
||||||
EmitReadConstant(instruction.C);
|
EmitReadConstant(instruction.C);
|
||||||
EmitInvokeBinaryOperation(nameof(Evaluation.Mul));
|
EmitInvokeBinaryOperation(nameof(Evaluation.Mul));
|
||||||
EmitWrite(instruction.Out);
|
EmitWrite(instruction.Out);
|
||||||
|
|
@ -904,37 +897,37 @@ internal static class Compiler
|
||||||
|
|
||||||
case { OpCode: OpCode.Max, A: var a, B: var b }: // => Max(variables[a], variables[b]),
|
case { OpCode: OpCode.Max, A: var a, B: var b }: // => Max(variables[a], variables[b]),
|
||||||
|
|
||||||
EmitReadVariablesA(a);
|
EmitReadVariable(a);
|
||||||
EmitReadVariablesB(b);
|
EmitReadVariable(b);
|
||||||
EmitInvokeBinaryOperation(nameof(Evaluation.Max));
|
EmitInvokeBinaryOperation(nameof(Evaluation.Max));
|
||||||
EmitWrite(instruction.Out);
|
EmitWrite(instruction.Out);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case { OpCode: OpCode.Min, A: var a, B: var b }: // => Min(variables[a], variables[b]),
|
case { OpCode: OpCode.Min, A: var a, B: var b }: // => Min(variables[a], variables[b]),
|
||||||
|
|
||||||
EmitReadVariablesA(a);
|
EmitReadVariable(a);
|
||||||
EmitReadVariablesB(b);
|
EmitReadVariable(b);
|
||||||
EmitInvokeBinaryOperation(nameof(Evaluation.Min));
|
EmitInvokeBinaryOperation(nameof(Evaluation.Min));
|
||||||
EmitWrite(instruction.Out);
|
EmitWrite(instruction.Out);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case { OpCode: OpCode.Neg, A: var a }: // => Neg(variables[a]),
|
case { OpCode: OpCode.Neg, A: var a }: // => Neg(variables[a]),
|
||||||
|
|
||||||
EmitReadVariablesA(a);
|
EmitReadVariable(a);
|
||||||
EmitInvokeUnaryOperation(nameof(Evaluation.Neg));
|
EmitInvokeUnaryOperation(nameof(Evaluation.Neg));
|
||||||
EmitWrite(instruction.Out);
|
EmitWrite(instruction.Out);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case { OpCode: OpCode.Sqrt, A: var a }: // => SquareRoot(variables[a]),
|
case { OpCode: OpCode.Sqrt, A: var a }: // => SquareRoot(variables[a]),
|
||||||
|
|
||||||
EmitReadVariablesA(a);
|
EmitReadVariable(a);
|
||||||
EmitInvokeUnaryOperation(nameof(Evaluation.SquareRoot));
|
EmitInvokeUnaryOperation(nameof(Evaluation.SquareRoot));
|
||||||
EmitWrite(instruction.Out);
|
EmitWrite(instruction.Out);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case { OpCode: OpCode.Square, A: var a }: // => Square(variables[a]),
|
case { OpCode: OpCode.Square, A: var a }: // => Square(variables[a]),
|
||||||
|
|
||||||
EmitReadVariablesA(a);
|
EmitReadVariable(a);
|
||||||
EmitInvokeUnaryOperation(nameof(Evaluation.Square));
|
EmitInvokeUnaryOperation(nameof(Evaluation.Square));
|
||||||
EmitWrite(instruction.Out);
|
EmitWrite(instruction.Out);
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue