1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
5 #if defined(DEBUG) || defined(SMGEN_COMPILE)
8 // The array of state-machine-opcode names
10 const char* const smOpcodeNames[] = {
11 #define SMOPDEF(smname, string) string,
12 #include "smopcode.def"
17 // The code sequences the state machine will look for.
20 const SM_OPCODE s_CodeSeqs[][MAX_CODE_SEQUENCE_LENGTH] = {
22 #define SMOPDEF(smname, string) {smname, CODE_SEQUENCE_END},
23 // ==== Single opcode states ====
24 #include "smopcode.def"
27 // ==== Legel prefixed opcode sequences ====
28 {SM_CONSTRAINED, SM_CALLVIRT, CODE_SEQUENCE_END},
30 // ==== Interesting patterns ====
32 // Fetching of object field
33 {SM_LDARG_0, SM_LDFLD, CODE_SEQUENCE_END},
34 {SM_LDARG_1, SM_LDFLD, CODE_SEQUENCE_END},
35 {SM_LDARG_2, SM_LDFLD, CODE_SEQUENCE_END},
36 {SM_LDARG_3, SM_LDFLD, CODE_SEQUENCE_END},
38 // Fetching of struct field
39 {SM_LDARGA_S, SM_LDFLD, CODE_SEQUENCE_END},
40 {SM_LDLOCA_S, SM_LDFLD, CODE_SEQUENCE_END},
42 // Fetching of struct field from a normed struct
43 {SM_LDARGA_S_NORMED, SM_LDFLD, CODE_SEQUENCE_END},
44 {SM_LDLOCA_S_NORMED, SM_LDFLD, CODE_SEQUENCE_END},
46 // stloc/ldloc --> dup
47 {SM_STLOC_0, SM_LDLOC_0, CODE_SEQUENCE_END},
48 {SM_STLOC_1, SM_LDLOC_1, CODE_SEQUENCE_END},
49 {SM_STLOC_2, SM_LDLOC_2, CODE_SEQUENCE_END},
50 {SM_STLOC_3, SM_LDLOC_3, CODE_SEQUENCE_END},
53 {SM_LDC_R4, SM_ADD, CODE_SEQUENCE_END},
54 {SM_LDC_R4, SM_SUB, CODE_SEQUENCE_END},
55 {SM_LDC_R4, SM_MUL, CODE_SEQUENCE_END},
56 {SM_LDC_R4, SM_DIV, CODE_SEQUENCE_END},
58 {SM_LDC_R8, SM_ADD, CODE_SEQUENCE_END},
59 {SM_LDC_R8, SM_SUB, CODE_SEQUENCE_END},
60 {SM_LDC_R8, SM_MUL, CODE_SEQUENCE_END},
61 {SM_LDC_R8, SM_DIV, CODE_SEQUENCE_END},
63 {SM_CONV_R4, SM_ADD, CODE_SEQUENCE_END},
64 {SM_CONV_R4, SM_SUB, CODE_SEQUENCE_END},
65 {SM_CONV_R4, SM_MUL, CODE_SEQUENCE_END},
66 {SM_CONV_R4, SM_DIV, CODE_SEQUENCE_END},
68 // {SM_CONV_R8, SM_ADD, CODE_SEQUENCE_END}, // Removed since it collides with ldelem.r8 in
70 // {SM_CONV_R8, SM_SUB, CODE_SEQUENCE_END}, // Just remove the SM_SUB as well.
71 {SM_CONV_R8, SM_MUL, CODE_SEQUENCE_END},
72 {SM_CONV_R8, SM_DIV, CODE_SEQUENCE_END},
74 /* Constant init constructor:
77 L_0010: stfld float64 raytracer.Vec::x
80 {SM_LDARG_0, SM_LDC_I4_0, SM_STFLD, CODE_SEQUENCE_END},
81 {SM_LDARG_0, SM_LDC_R4, SM_STFLD, CODE_SEQUENCE_END},
82 {SM_LDARG_0, SM_LDC_R8, SM_STFLD, CODE_SEQUENCE_END},
87 L_0008: ldfld float64 raytracer.Vec::x
88 L_000d: stfld float64 raytracer.Vec::x
91 {SM_LDARG_0, SM_LDARG_1, SM_LDFLD, SM_STFLD, CODE_SEQUENCE_END},
96 private void CtorClosed(object target, IntPtr methodPtr)
100 this.ThrowNullThisInDelegateToInstance();
102 base._target = target;
103 base._methodPtr = methodPtr;
107 .method private hidebysig instance void CtorClosed(object target, native int methodPtr) cil managed
109 .custom instance void System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor()
112 L_0001: brtrue.s L_0009
114 L_0004: call instance void System.MulticastDelegate::ThrowNullThisInDelegateToInstance()
118 L_000b: stfld object System.Delegate::_target
122 L_0012: stfld native int System.Delegate::_methodPtr
128 {SM_LDARG_0, SM_LDARG_1, SM_STFLD, CODE_SEQUENCE_END},
129 {SM_LDARG_0, SM_LDARG_2, SM_STFLD, CODE_SEQUENCE_END},
130 {SM_LDARG_0, SM_LDARG_3, SM_STFLD, CODE_SEQUENCE_END},
136 L_0002: ldfld float64 raytracer.Vec::x
139 L_0009: stfld float64 raytracer.Vec::x
142 {SM_LDARG_0, SM_DUP, SM_LDFLD, SM_LDARG_1, SM_ADD, SM_STFLD, CODE_SEQUENCE_END},
143 {SM_LDARG_0, SM_DUP, SM_LDFLD, SM_LDARG_1, SM_SUB, SM_STFLD, CODE_SEQUENCE_END},
144 {SM_LDARG_0, SM_DUP, SM_LDFLD, SM_LDARG_1, SM_MUL, SM_STFLD, CODE_SEQUENCE_END},
145 {SM_LDARG_0, SM_DUP, SM_LDFLD, SM_LDARG_1, SM_DIV, SM_STFLD, CODE_SEQUENCE_END},
149 L_0001: ldfld float64 raytracer.Vec::x
151 L_0007: ldfld float64 raytracer.Vec::x
155 {SM_LDARG_0, SM_LDFLD, SM_LDARG_1, SM_LDFLD, SM_ADD, CODE_SEQUENCE_END},
156 {SM_LDARG_0, SM_LDFLD, SM_LDARG_1, SM_LDFLD, SM_SUB, CODE_SEQUENCE_END},
157 // No need for mul and div since there is no mathemetical meaning of it.
159 {SM_LDARGA_S, SM_LDFLD, SM_LDARGA_S, SM_LDFLD, SM_ADD, CODE_SEQUENCE_END},
160 {SM_LDARGA_S, SM_LDFLD, SM_LDARGA_S, SM_LDFLD, SM_SUB, CODE_SEQUENCE_END},
161 // No need for mul and div since there is no mathemetical meaning of it.
164 {CODE_SEQUENCE_END}};
166 #endif // defined(DEBUG) || defined(SMGEN_COMPILE)