mescc: x86_64 support: Refactor to abstracted assembly, add x86_64.
[mes.git] / lib / x86-mes / x86.M1
1 ### GNU Mes --- Maxwell Equations of Software
2 ### Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
3 ###
4 ### This file is part of GNU Mes.
5 ###
6 ### Mes is free software# you can redistribute it and/or modify it
7 ### under the terms of the GNU General Public License as published by
8 ### the Free Software Foundation# either version 3 of the License, or (at
9 ### your option) any later version.
10 ###
11 ### GNU Mes is distributed in the hope that it will be useful, but
12 ### WITHOUT ANY WARRANTY# without even the implied warranty of
13 ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 ### GNU General Public License for more details.
15 ###
16 ### You should have received a copy of the GNU General Public License
17 ### along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
18
19 # reduced instruction set: eax, ebx (some ecx for shift, edx for mul, div)
20 # 182 instructions
21 DEFINE add____$i32,%eax 05
22 DEFINE add____$i32,%ebx 81c3
23 DEFINE add____$i32,(%eax) 8100
24 DEFINE add____$i32,(%ebx) 8103
25 DEFINE add____$i32,0x32(%eax) 8180
26 DEFINE add____$i32,0x32(%ebp) 8185
27 DEFINE add____$i8,%eax 83c0
28 DEFINE add____$i8,%ebx 83c3
29 DEFINE add____$i8,%esp 83c4
30 DEFINE add____$i8,(%eax) 8300
31 DEFINE add____$i8,(%ebx) 8303
32 DEFINE add____$i8,0x32 8305
33 DEFINE add____$i8,0x32(%eax) 8380
34 DEFINE add____$i8,0x32(%ebp) 8385
35 DEFINE add____$i8,0x8(%eax) 8340
36 DEFINE add____$i8,0x8(%ebp) 8345
37 DEFINE add____%eax,%eax 01c0
38 DEFINE add____%ebp,%eax 01e8
39 DEFINE add____%ebx,%eax 01d8
40 DEFINE add____%ebx,%ebx 01db
41 DEFINE addb___$i8,(%eax) 8000
42 DEFINE addb___$i8,(%ebx) 8003
43 DEFINE addw___$i8,(%eax) 668100
44 DEFINE addw___$i8,(%ebx) 668103
45 DEFINE and____$i32,%eax 25
46 DEFINE and____$i32,%ebx 81e3
47 DEFINE and____%ebx,%eax 21d8
48 DEFINE call32 e8
49 DEFINE call___*%eax ffd0
50 DEFINE call___*%ebx ffd3
51 DEFINE cmp____$0x32,%eax 3d
52 DEFINE cmp____$i32,%eax 3d
53 DEFINE cmp____$i8,%eax 83f8
54 DEFINE hlt f4
55 DEFINE idiv___%ebx f7fb
56 DEFINE int cd
57 DEFINE int____$0x80 cd80
58 DEFINE ja32  0f87
59 DEFINE jae32 0f83
60 DEFINE jb32  0f82
61 DEFINE jbe32 0f86
62 DEFINE je32 0f84
63 DEFINE je8 74
64 DEFINE jg32 0f8f
65 DEFINE jge32 0f8d
66 DEFINE jl32 0f8c
67 DEFINE jle32 0f8e
68 DEFINE jmp32 e9
69 DEFINE jmp____*%ebx ffe3
70 DEFINE jne32 0f85
71 DEFINE lahf 9f
72 DEFINE lea____0x32(%ebp),%eax 8d85
73 DEFINE lea____0x8(%ebp),%eax 8d45
74 DEFINE leave c9
75 DEFINE mov____$i32,%eax b8
76 DEFINE mov____$i32,%ebx bb
77 DEFINE mov____$i32,(%eax) c700
78 DEFINE mov____$i32,0x32 c705
79 DEFINE mov____$i32,0x8(%eax) c740
80 DEFINE mov____$i32,0x8(%ebp) c745
81 DEFINE mov____%al,(%ebx) 8803
82 DEFINE mov____%al,0x8(%ebp) 8845
83 DEFINE mov____%ax,(%ebx) 668903
84 DEFINE mov____%ax,0x8(%ebp) 668945
85 DEFINE mov____%dl,(%eax) 8810
86 DEFINE mov____%dl,0x8(%eax) 8850
87 DEFINE mov____%eax,%ebx 89c3
88 DEFINE mov____%eax,%ecx 89c1
89 DEFINE mov____%eax,(%ebx) 8903
90 DEFINE mov____%eax,0x32 a3
91 DEFINE mov____%eax,0x32(%ebp) 8985
92 DEFINE mov____%eax,0x8(%ebp) 8945
93 DEFINE mov____%ebp,%eax 89e8
94 DEFINE mov____%ebp,%ebx 89eb
95 DEFINE mov____%ebx,%eax 89d8
96 DEFINE mov____%ebx,%ecx 89d9
97 DEFINE mov____%ebx,0x32 891d
98 DEFINE mov____%ebx,0x32(%ebp) 899d
99 DEFINE mov____%ebx,0x8(%ebp) 895d
100 DEFINE mov____%ecx,(%ebx) 890b
101 DEFINE mov____%edx,%eax 89d0
102 DEFINE mov____%edx,%ebx 89d3
103 DEFINE mov____%esp,%ebp 89e5
104 DEFINE mov____(%eax),%eax 8b00
105 DEFINE mov____(%eax),%ecx 8b08
106 DEFINE mov____(%ebx),%ebx 8b1b
107 DEFINE mov____0x32(%eax),%eax 8b80
108 DEFINE mov____0x32(%eax),%ebx 8b98
109 DEFINE mov____0x32(%ebp),%eax 8b85
110 DEFINE mov____0x32(%ebp),%ebx 8b9d
111 DEFINE mov____0x32,%eax a1
112 DEFINE mov____0x32,%ebx 8b1d
113 DEFINE mov____0x8(%eax),%eax 8b40
114 DEFINE mov____0x8(%eax),%ebx 8b58
115 DEFINE mov____0x8(%ebp),%eax 8b45
116 DEFINE mov____0x8(%ebp),%ebp 8b6d
117 DEFINE mov____0x8(%ebp),%ebx 8b5d
118 DEFINE mov____0x8(%ebp),%ecx 8b4d
119 DEFINE mov____0x8(%ebp),%edi 8b7d
120 DEFINE mov____0x8(%ebp),%edx 8b55
121 DEFINE mov____0x8(%ebp),%esi 8b75
122 DEFINE mov____0x8(%ebp),%esp 8b65
123 DEFINE movsbl_%al,%eax 0fbec0
124 DEFINE movsbl_%bl,%ebx 0fbedb
125 DEFINE movswl_%ax,%eax 0fbfc0
126 DEFINE movswl_%bx,%ebx 0fbfdb
127 DEFINE movzbl_%al,%eax 0fb6c0
128 DEFINE movzbl_%bl,%ebx 0fb6db
129 DEFINE movzbl_(%eax),%eax 0fb600
130 DEFINE movzbl_(%ebx),%ebx 0fb61b
131 DEFINE movzbl_0x32(%eax),%eax 0fb680
132 DEFINE movzbl_0x8(%eax),%eax 0fb640
133 DEFINE movzbl_0x8(%ebp),%eax 0fb645
134 DEFINE movzwl_%ax,%eax 0fb7c0
135 DEFINE movzwl_(%eax),%eax 0fb700
136 DEFINE movzwl_(%ebx),%ebx 0fb71b
137 DEFINE movzwl_0x32(%eax),%eax 0fb780
138 DEFINE movzwl_0x32(%ebp),%eax 0fb785
139 DEFINE movzwl_0x8(%eax),%eax 0fb740
140 DEFINE mul____%ebx f7e3
141 DEFINE mul_____%ebx f7e3
142 DEFINE nop 90
143 DEFINE not____%eax f7d0
144 DEFINE not____%ebx f7d3
145 DEFINE or_____%ebx,%eax 09d8
146 DEFINE pop____%eax 58
147 DEFINE pop____%ebx 5b
148 DEFINE pop____%edx 5a
149 DEFINE push___$i32 68
150 DEFINE push___%eax 50
151 DEFINE push___%ebp 55
152 DEFINE push___%ebx 53
153 DEFINE push___%edx 52
154 DEFINE push___(%eax) ff30
155 DEFINE push___0x32(%ebp) ffb5
156 DEFINE push___0x8(%ebp) ff75
157 DEFINE ret c3
158 DEFINE sahf 9e
159 DEFINE seta___%al 0f97c0
160 DEFINE seta___%bl 0f97c3
161 DEFINE setae__%al 0f93c0
162 DEFINE setae__%bl 0f93c3
163 DEFINE setb___%al 0f92c0
164 DEFINE setb___%bl 0f92c3
165 DEFINE setbe__%al 0f96c0
166 DEFINE setbe__%bl 0f96c3
167 DEFINE sete___%al 0f94c0
168 DEFINE sete___%bl 0f94c3
169 DEFINE setg___%al 0f9fc0
170 DEFINE setg___%bl 0f9fc3
171 DEFINE setge__%al 0f9dc0
172 DEFINE setge__%bl 0f9dc3
173 DEFINE setl___%al 0f9cc0
174 DEFINE setl___%bl 0f9cc3
175 DEFINE setle__%al 0f9ec0
176 DEFINE setle__%bl 0f9ec3
177 DEFINE setne__%al 0f95c0
178 DEFINE setne__%bl 0f95c3
179 DEFINE shl____$i8,%eax c1e0
180 DEFINE shl____$i8,%ebx c1e3
181 DEFINE shl____%cl,%eax d3e0
182 DEFINE shl____%cl,%ebx d3e3
183 DEFINE shr____%cl,%eax d3e8
184 DEFINE sub____$8,%esp 83ec
185 DEFINE sub____$i32,%esp 81ec
186 DEFINE sub____%al,%dl 28d0
187 DEFINE sub____%dl,%al 28c2
188 DEFINE sub____%ebx,%eax 29d8
189 DEFINE test___%al,%al 84c0
190 DEFINE test___%eax,%eax 85c0
191 DEFINE test___%ebx,%ebx 85db
192 DEFINE xchg___%eax,%ebx 93
193 DEFINE xchg___%eax,(%esp) 870424
194 DEFINE xchg___%eax,(%esp) 870424
195 DEFINE xchg___%ebx,(%esp) 871c24
196 DEFINE xor____$i32,%eax 35
197 DEFINE xor____$i8,%ah 80f4
198 DEFINE xor____%eax,%eax 31c0
199 DEFINE xor____%ebx,%eax 31d8
200 DEFINE xor____%ebx,%ebx 31db
201 DEFINE xor____%edx,%edx 31d2
202
203
204 # Enough for all of Mes + Mes C Libray when using all registers, i.e.,
205 # non-reduced instruction set
206 #DEFINE add____$i32,%ecx 81c1
207 #DEFINE add____$i32,%edx 81c2
208 #DEFINE add____$i32,%esi 81c6
209 #DEFINE add____$i8,%ecx 83c1
210 #DEFINE add____$i8,%edx 83c2
211 #DEFINE add____$i8,%esi 83c6
212 #DEFINE add____$i8,(%ecx) 8301
213 #DEFINE add____$i8,(%edx) 8302
214 #DEFINE add____%ecx,%ebx 01cb
215 #DEFINE add____%ecx,%ecx 01c9
216 #DEFINE add____%edx,%eax 01d0
217 #DEFINE add____%edx,%ecx 01d1
218 #DEFINE add____%edx,%edx 01d2
219 #DEFINE add____%esi,%edx 01f2
220 #DEFINE and____$i32,%ecx 81e1
221 #DEFINE and____$i32,%edx 81e2
222 #DEFINE and____%edx,%eax 21d0
223 #DEFINE and____(%edx),%eax 2302
224 #DEFINE cmp____%edx,%eax 39d0
225 #DEFINE idiv___%ecx f7f9
226 #DEFINE lea____0x32(%ebp),%edx 8d95
227 #DEFINE lea____0x8(%ebp),%edx 8d55
228 #DEFINE mov____$i32,%ecx b9
229 #DEFINE mov____$i32,%edx ba
230 #DEFINE mov____$i32,%esi be
231 #DEFINE mov____%al,(%edx) 8802
232 #DEFINE mov____%al,0x8(%edx) 8842
233 #DEFINE mov____%ax,(%edx) 668902
234 #DEFINE mov____%ax,0x32(%edx) 668982
235 #DEFINE mov____%ax,0x8(%edx) 668942
236 #DEFINE mov____%bl,(%ecx) 8819
237 #DEFINE mov____%eax,%edx 89c2
238 #DEFINE mov____%eax,%esi 89c6
239 #DEFINE mov____%eax,(%ecx) 8901
240 #DEFINE mov____%eax,(%edx) 8902
241 #DEFINE mov____%eax,0x32(%edx) 8982
242 #DEFINE mov____%eax,0x8(%edx) 8942
243 #DEFINE mov____%ebp,%ecx 89e9
244 #DEFINE mov____%ebp,%edx 89ea
245 #DEFINE mov____%ebp,%esi 89ee
246 #DEFINE mov____%ebx,(%ecx) 8919
247 #DEFINE mov____%ebx,0x8(%edx) 895a
248 #DEFINE mov____%ecx,%eax 89c8
249 #DEFINE mov____%ecx,%ecx 89c9
250 #DEFINE mov____%ecx,%edx 89ca
251 #DEFINE mov____%ecx,(%eax) 8908
252 #DEFINE mov____%ecx,(%edx) 890a
253 #DEFINE mov____%ecx,0x32(%ebp) 898d
254 #DEFINE mov____%ecx,0x8(%ebp) 894d
255 #DEFINE mov____%edi,%ebx 89fb
256 #DEFINE mov____%edx,%ecx 89d1
257 #DEFINE mov____%edx,(%eax) 8910
258 #DEFINE mov____%edx,0x32(%ebp) 8995
259 #DEFINE mov____%edx,0x8(%ebp) 8955
260 #DEFINE mov____%esi,%eax 89f0
261 #DEFINE mov____%esi,%ebx 89f3
262 #DEFINE mov____(%ecx),%ecx 8b09
263 #DEFINE mov____(%edx),%eax 8b02
264 #DEFINE mov____(%edx),%ecx 8b0a
265 #DEFINE mov____(%edx),%edx 8b12
266 #DEFINE mov____0x32(%eax),%ecx 8b88
267 #DEFINE mov____0x32(%ebp),%ecx 8b8d
268 #DEFINE mov____0x32(%ebp),%edx 8b95
269 #DEFINE mov____0x32,%ecx 8b0d
270 #DEFINE mov____0x32,%edx 8b15
271 #DEFINE mov____0x8(%eax),%ecx 8b48
272 #DEFINE movsbl_%cl,%ecx 0fbec9
273 #DEFINE movsbl_%dl,%edx 0fbed2
274 #DEFINE movswl_%cx,%ecx 0fbfc9
275 #DEFINE movzbl_%cl,%ecx 0fb6c9
276 #DEFINE movzbl_%dl,%edx 0fb6d2
277 #DEFINE movzbl_(%eax),%edx 0fb610
278 #DEFINE movzbl_(%ecx),%ecx 0fb609
279 #DEFINE movzbl_(%edx),%edx 0fb612
280 #DEFINE movzwl_(%ecx),%ecx 0fb709
281 #DEFINE mul____%ecx f7e1
282 #DEFINE mul____%edi f7e7
283 #DEFINE mul____%edx f7e2
284 #DEFINE mul____%esi f7e6
285 #DEFINE or_____%ecx,%ebx 09cb
286 #DEFINE or_____%edx,%eax 09d0
287 #DEFINE or_____(%edx),%eax 0b02
288 #DEFINE pop____%ecx 59
289 #DEFINE pop____%edi 5f
290 #DEFINE push___%ecx 51
291 #DEFINE push___%edi 57
292 #DEFINE push___%esi 56
293 #DEFINE shl____$i8,%ecx c1e1
294 #DEFINE shl____$i8,%edx c1e2
295 #DEFINE shl____%cl,%ecx d3e1
296 #DEFINE sub____%eax,%edx 29c2
297 #DEFINE sub____%ecx,%ebx 29cb
298 #DEFINE sub____%edx,%eax 29d0
299 #DEFINE sub____%edx,%ecx 29d1
300 #DEFINE xchg___%ebx,%ecx 87d9
301 #DEFINE xchg___%ecx,%edx 87ca
302 #DEFINE xor____%ecx,%ecx 31c9
303 #DEFINE xor____%edx,%eax 31d0
304
305
306
307
308 # deprecated, remove after 0.18
309 DEFINE sub____%esp,$i32 81ec
310 DEFINE sub____%esp,$i8 83ec
311
312 DEFINE SYS_exit   01000000
313 DEFINE SYS_fork   02000000
314 DEFINE SYS_read   03000000
315 DEFINE SYS_rmdir  28000000
316 DEFINE SYS_write  04000000
317 DEFINE SYS_open   05000000
318 DEFINE SYS_close  06000000
319 DEFINE SYS_waitpid 07000000
320 DEFINE SYS_unlink 0a000000
321 DEFINE SYS_execve 0b000000
322 DEFINE SYS_chmod  0f000000
323 DEFINE SYS_lseek  13000000
324 DEFINE SYS_access 21000000
325 DEFINE SYS_brk    2d000000
326 DEFINE SYS_ioctl  36000000
327 DEFINE SYS_stat   6a000000
328 DEFINE SYS_fsync  76000000
329 DEFINE SYS_getcwd b7000000