PPC JIT optimizations (System.Math instruction inlining) (#11964)
[mono-project.git] / mono / mini / m2n-gen.cs
blob423b19b7f39a7be15e12a2acc4816fe4bd161ec9
1 using System;
3 class EmitCtx
5 int iarg, farg;
7 public string Emit (char c) {
8 switch (c) {
9 case 'I':
10 iarg += 1;
11 return $"(int)margs->iargs [{iarg - 1}]";
12 case 'F':
13 farg += 1;
14 return $"*(float*)&margs->fargs [FIDX ({farg - 1})]";
15 case 'L':
16 iarg += 2;
17 return $"get_long_arg (margs, {iarg - 2})";
18 case 'D':
19 farg += 1;
20 return $"margs->fargs [FIDX ({farg - 1})]";
21 default:
22 throw new Exception ("IDK how to handle " + c);
27 class Driver {
28 static string[] cookies = new string[] {
29 "V",
30 "VI",
31 "VII",
32 "VIII",
33 "VIIII",
34 "VIIIII",
35 "VIIIIII",
36 "VIIIIIII",
37 "VIIIIIIII",
38 "VIIIIIIIII",
39 "VIIIIIIIIII",
40 "I",
41 "II",
42 "III",
43 "IIII",
44 "IIIII",
45 "IIIIII",
46 "IIIIIII",
47 "IIIIIIII",
48 "IIIIIIIII",
49 "IIIIIIIIII",
50 "IIIIIIIIIII",
51 "IIIIIIIIIIII",
52 "IIIIIIIIIIIII",
53 "IIIIIIIIIIIIII",
54 "IILIIII",
55 "IIF",
56 "IIFI",
57 "IIFF",
58 "IFFII",
59 "IIFII",
60 "IIFFI",
61 "IIFFF",
62 "IIFFFI",
63 "IIFFII",
64 "IIFIII",
65 "IIFFFFI",
66 "IIFFFFII",
67 "IIIF",
68 "IIIFI",
69 "IIIFII",
70 "IIIFIII",
71 "IIIIF",
72 "IIIIFI",
73 "IIIIFII",
74 "IIIIFIII",
75 "IIIFFFF",
76 "IIIFFFFF",
77 "IIFFFFFF",
78 "IIIFFFFFF",
79 "IIIIIIIF",
80 "IIIIIIIFF",
81 "IIFFFFFFFF",
82 "IIIFFFFFFFF",
83 "IIIIIIFII",
84 "IIIFFFFFFFFIII",
85 "IIIIIFFFFIIII",
86 "IFFFFFFI",
87 "IIFFIII",
88 "ILI",
89 "L",
90 "LL",
91 "LI",
92 "LIL",
93 "LILII",
94 "DD",
95 "DDI",
96 "DDD",
97 "VIF",
98 "VIFF",
99 "VIFFFF",
100 "VIFFFFFI",
101 "VIIFFI",
102 "FF",
103 "FFF",
104 "DI",
105 "FI",
106 "IIL",
107 "IILI",
108 "IILLLI",
109 "IDIII",
110 "LII",
111 "VID",
112 "VILLI",
114 "DID",
115 "DIDD",
116 "FIF",
117 "FIFF",
118 "LILL",
119 "VIL",
122 static string TypeToSigType (char c) {
123 switch (c) {
124 case 'V': return "void";
125 case 'I': return "int";
126 case 'L': return "gint64";
127 case 'F': return "float";
128 case 'D': return "double";
129 default:
130 throw new Exception ("Can't handle " + c);
134 static void Main () {
135 Console.WriteLine ("/*");
136 Console.WriteLine ("* DON'T EDIT THIS FILE");
137 Console.WriteLine ("* This file was generated by m2n-gen.cs - use it instead.");
138 Console.WriteLine ("*/");
139 foreach (var c in cookies) {
140 Console.WriteLine ("static void");
141 Console.WriteLine ($"wasm_invoke_{c.ToLower ()} (void *target_func, InterpMethodArguments *margs)");
142 Console.WriteLine ("{");
145 Console.Write ($"\ttypedef {TypeToSigType (c [0])} (*T)(");
146 for (int i = 1; i < c.Length; ++i) {
147 char p = c [i];
148 if (i > 1)
149 Console.Write (", ");
150 Console.Write ($"{TypeToSigType (p)} arg_{i - 1}");
152 if (c.Length == 1)
153 Console.Write ("void");
155 Console.WriteLine (");\n\tT func = (T)target_func;");
157 var ctx = new EmitCtx ();
159 Console.Write ("\t");
160 if (c [0] != 'V')
161 Console.Write ($"{TypeToSigType (c [0])} res = ");
163 Console.Write ("func (");
164 for (int i = 1; i < c.Length; ++i) {
165 char p = c [i];
166 if (i > 1)
167 Console.Write (", ");
168 Console.Write (ctx.Emit (p));
170 Console.WriteLine (");");
172 if (c [0] != 'V')
173 Console.WriteLine ($"\t*({TypeToSigType (c [0])}*)margs->retval = res;");
175 Console.WriteLine ("\n}\n");
178 Console.WriteLine ("static void\nicall_trampoline_dispatch (const char *cookie, void *target_func, InterpMethodArguments *margs)");
179 Console.WriteLine ("{");
180 for (int i = 0; i < cookies.Length; ++i) {
181 var c = cookies [i];
182 Console.Write ("\t");
183 if (i > 0)
184 Console.Write ("else ");
185 Console.WriteLine ($"if (!strcmp (\"{c}\", cookie))");
186 Console.WriteLine ($"\t\twasm_invoke_{c.ToLower ()} (target_func, margs);");
188 Console.WriteLine ("\telse {");
189 Console.WriteLine ("\t\tprintf (\"CANNOT HANDLE COOKIE %s\\n\", cookie);");
190 Console.WriteLine ("\t\tg_assert (0);");
191 Console.WriteLine ("\t}");
192 Console.WriteLine ("}");