a7b26bccf5cd6682b1626ba0f33af675d371df60
[mes.git] / lib / x86_64-mes / x86_64.M1
1 ### GNU Mes --- Maxwell Equations of Software
2 ### Copyright © 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: rax, rdi (some rcx for shift, rdx for mul, div)
20 # and r10 as i64 immediate helper
21 # 211 instructions
22
23 DEFINE add____$i32,%rax 4805
24 DEFINE add____$i32,%rbp 4881c5
25 DEFINE add____$i32,%rdi 4881c7
26 DEFINE add____$i32,(%rax) 8100
27 DEFINE add____$i32,0x32(%rbp) 8185
28 DEFINE add____$i8,%rax 4883c0
29 DEFINE add____$i8,%rdi 4883c7
30 DEFINE add____$i8,%rsp 4883c4
31 DEFINE add____$i8,(%rax) 8300
32 DEFINE add____$i8,(%rdi) 8307
33 DEFINE add____$i8,0x8(%rbp) 8345
34 DEFINE add____%r15,(%rax) 4c0138
35 DEFINE add____%r15,(%rdi) 4c013f
36 DEFINE add____%rax,%rax 4801c0
37 DEFINE add____%rbp,%rax 4801e8
38 DEFINE add____%rdi,%rax 4801f8
39 DEFINE add____%rdi,%rdi 4801ff
40 DEFINE addb___$i8,(%rax) 8000
41 DEFINE addb___$i8,(%rdi) 8007
42 DEFINE addl___$i32,(%rax) 8100
43 DEFINE addl___$i32,(%rdi) 8107
44 DEFINE addl___$i8,(%rax) 8300
45 DEFINE addl___$i8,(%rdi) 8307
46 DEFINE addw___$i8,(%rax) 668100
47 DEFINE addw___$i8,(%rdi) 668107
48 DEFINE and____$i32,%rdi 4881e7
49 DEFINE and____%r15,%rax 4c21f8
50 DEFINE and____%r15,%rdi 4c21ff
51 DEFINE and____%rdi,%rax 4821f8
52 DEFINE call32 e8
53 DEFINE call___*%rax ffd0
54 DEFINE call___*%rdi ffd7
55 DEFINE cmp____$i32,%rax 483d
56 DEFINE cmp____$i8,%rax 4883f8
57 DEFINE cmp____%r15,%rax 4c39f8
58 DEFINE cmp____%r15,%rdi 4c39ff
59 DEFINE cqto 4899
60 DEFINE hlt f4
61 DEFINE idiv___%rdi 48f7ff
62 DEFINE ja32  0f87
63 DEFINE jae32 0f83
64 DEFINE jb32  0f82
65 DEFINE jbe32 0f86
66 DEFINE je32 0f84
67 DEFINE je8 74
68 DEFINE jg32 0f8f
69 DEFINE jge32 0f8d
70 DEFINE jl32 0f8c
71 DEFINE jle32 0f8e
72 DEFINE jmp32 e9
73 DEFINE jmp____*%rbx ffe3
74 DEFINE jne32 0f85
75 DEFINE lahf 9f
76 DEFINE mov____$i32,%rax 48c7c0
77 DEFINE mov____$i32,%rdi 48c7c7
78 DEFINE mov____$i32,0x8(%rbp) c745
79 DEFINE mov____$i64,%r15 49bf
80 DEFINE mov____$i64,%rax 48a1
81 DEFINE mov____$i64,%rax 48b8
82 DEFINE mov____$i64,%rax 48b8
83 DEFINE mov____$i64,%rdi 48bf
84 DEFINE mov____%al,(%rdi) 8807
85 DEFINE mov____%al,0x32(%rbp) 8885
86 DEFINE mov____%al,0x8(%rbp) 8845
87 DEFINE mov____%ax,(%rdi) 668907
88 DEFINE mov____%ax,0x8(%rbp) 668945
89 DEFINE mov____%eax,%eax 89c0
90 DEFINE mov____%eax,%rax 89c0
91 DEFINE mov____%eax,(%rdi) 8907
92 DEFINE mov____%eax,0x32(%rbp)  8985
93 DEFINE mov____%eax,0x8(%rbp) 8945
94 DEFINE mov____%eax,0x8(%rbp) 8945
95 DEFINE mov____%edi,%edi 89ff
96 DEFINE mov____%edi,%rdi 89ff
97 DEFINE mov____%edi,0x32(%rbp) 89bd
98 DEFINE mov____%edi,0x8(%rbp) 897d
99 DEFINE mov____%esi,%eax 89f0
100 DEFINE mov____%esi,(%rdi) 8937
101 DEFINE mov____%r8,%rdi 4c89c7
102 DEFINE mov____%rax,%rax 4889c0
103 DEFINE mov____%rax,%rdi 4889c7
104 DEFINE mov____%rax,(%rdi) 488907
105 DEFINE mov____%rax,0x32 48890425
106 DEFINE mov____%rax,0x32(%rbp) 488985
107 DEFINE mov____%rax,0x8(%rbp) 488945
108 DEFINE mov____%rax,0x8(%rdi) 488947
109 DEFINE mov____%rbp,%rax 4889e8
110 DEFINE mov____%rbp,%rdi 4889ef
111 DEFINE mov____%rbp,%rsp 4889ec
112 DEFINE mov____%rbp,0x8(%rbp) 48896d
113 DEFINE mov____%rdi,%r8 4989f8
114 DEFINE mov____%rdi,%rax 4889f8
115 DEFINE mov____%rdi,%rcx 4889f9
116 DEFINE mov____%rdi,%rdi 4889ff
117 DEFINE mov____%rdi,0x32 48893c25
118 DEFINE mov____%rdi,0x32(%rbp) 4889bd
119 DEFINE mov____%rdi,0x8(%rbp) 48897d
120 DEFINE mov____%rdx,%rax 4889d0
121 DEFINE mov____%rdx,%rdi 4889d7
122 DEFINE mov____%rsi,(%rdi) 488937
123 DEFINE mov____%rsp,%rbp 4889e5
124 DEFINE mov____(%rax),%eax 8b00
125 DEFINE mov____(%rax),%esi 8b30
126 DEFINE mov____(%rax),%rax 488b00
127 DEFINE mov____(%rax),%rsi 488b30
128 DEFINE mov____(%rdi),%edi 8b3f
129 DEFINE mov____(%rdi),%rdi 488b3f
130 DEFINE mov____0x32(%rbp),%rax 488b85
131 DEFINE mov____0x32(%rbp),%rdi 488bbd
132 DEFINE mov____0x32,%rax 488b0425
133 DEFINE mov____0x32,%rdi 488b3c25
134 DEFINE mov____0x8(%rbp),%eax 8b45
135 DEFINE mov____0x8(%rbp),%r10 4c8b55
136 DEFINE mov____0x8(%rbp),%r8 4c8b45
137 DEFINE mov____0x8(%rbp),%rax 488b45
138 DEFINE mov____0x8(%rbp),%rbp 488b6d
139 DEFINE mov____0x8(%rbp),%rbx 488b5d
140 DEFINE mov____0x8(%rbp),%rcx 488b4d
141 DEFINE mov____0x8(%rbp),%rdi 488b7d
142 DEFINE mov____0x8(%rbp),%rdx 488b55
143 DEFINE mov____0x8(%rbp),%rsi 488b75
144 DEFINE mov____0x8(%rbp),%rsp 488b65
145 DEFINE mov____0x8(%rdi),%rax 488b47
146 DEFINE mov____0x8(%rdi),%rbp 488b6f
147 DEFINE mov____0x8(%rdi),%rsp 488b67
148 DEFINE movl___%eax,0x32 890425
149 DEFINE movl___%edi,0x32 893c25
150 DEFINE movl___%esi,(%rdi) 8937
151 DEFINE movl___(%rax),%esi 8b30
152 DEFINE movsbq_%al,%rax 480fbec0
153 DEFINE movsbq_%dil,%rdi 480fbeff
154 DEFINE movsbq_(%rax),%rax 480fbe00
155 DEFINE movsbq_(%rdi),%rdi 480fbe3f
156 DEFINE movslq_%eax,%rax 4863c0
157 DEFINE movslq_%edi,%rdi 4863ff
158 DEFINE movslq_(%rax),%rax 486300
159 DEFINE movslq_(%rdi),%rdi 48633f
160 DEFINE movswq_%ax,%rax 480fbfc0
161 DEFINE movswq_%di,%rdi 480fbfff
162 DEFINE movswq_(%rax),%rax 480fbf00
163 DEFINE movswq_(%rdi),%rdi 480fbf3f
164 DEFINE movw___%ax,0x32 66890425
165 DEFINE movw___%di,0x32 66893c25
166 DEFINE movz___(%rax),%rax 480fb600
167 DEFINE movzbq_%al,%rax 480fb6c0
168 DEFINE movzbq_%dil,%rdi 480fb6ff
169 DEFINE movzbq_(%rax),%rax 480fb600
170 DEFINE movzbq_(%rdi),%rdi 480fb63f
171 DEFINE movzlq_%eax,%rax 89c0
172 DEFINE movzlq_%edi,%rdi 89ff
173 DEFINE movzlq_(%rax),%rax 8b00
174 DEFINE movzlq_(%rdi),%rdi 8b3f
175 DEFINE movzwq_%ax,%rax 480fb7c0
176 DEFINE movzwq_%di,%rdi 480fb7ff
177 DEFINE movzwq_(%rax),%rax 480fb700
178 DEFINE movzwq_(%rdi),%rdi 480fb73f
179 DEFINE mul____%rdi 48f7e7
180 DEFINE nop 90
181 DEFINE not____%rax 48f7d0
182 DEFINE not____%rdi 48f7d7
183 DEFINE or_____%rdi,%rax 4809f8
184 DEFINE pop____%rax 58
185 DEFINE pop____%rbp 5d
186 DEFINE pop____%rdi 5f
187 DEFINE pop____%rdx 5a
188 DEFINE push___$i32 68
189 DEFINE push___%r15 4157
190 DEFINE push___%rax 50
191 DEFINE push___%rbp 55
192 DEFINE push___%rdi 57
193 DEFINE push___%rdx 52
194 DEFINE ret c3
195 DEFINE sahf 9e
196 DEFINE seta___%al 0f97c0
197 DEFINE seta___%dil 400f97c7
198 DEFINE setae__%al 0f93c0
199 DEFINE setae__%dil 400f93c7
200 DEFINE setb___%al 0f92c0
201 DEFINE setb___%dil 400f92c7
202 DEFINE setbe__%al 0f96c0
203 DEFINE setbe__%dil 400f96c7
204 DEFINE sete___%al 0f94c0
205 DEFINE sete___%dil 400f94c7
206 DEFINE setg___%al 0f9fc0
207 DEFINE setg___%dil 400f9fc7
208 DEFINE setge__%al 0f9dc0
209 DEFINE setge__%dil 400f9dc7
210 DEFINE setl___%al 0f9cc0
211 DEFINE setl___%dil 400f9cc7
212 DEFINE setle__%al 0f9ec0
213 DEFINE setle__%dil 400f9ec7
214 DEFINE setne__%al 0f95c0
215 DEFINE shl____$i8,%rax 48c1e0
216 DEFINE shl____$i8,%rdi 48c1e7
217 DEFINE shl____%cl,%rax 48d3e0
218 DEFINE shl____%cl,%rdi 48d3e7
219 DEFINE shr____%cl,%rax 48d3e8
220 DEFINE sub____$i32,%rbp 4881ed
221 DEFINE sub____$i32,%rsp 4881ec
222 DEFINE sub____%rdi,%rax 4829f8
223 DEFINE syscall 0f05
224 DEFINE test___%al,%al 84c0
225 DEFINE test___%rax,%rax 4885c0
226 DEFINE test___%rdi,%rdi 4885ff
227 DEFINE xchg___%rax,%rdi 4897
228 DEFINE xchg___%rax,(%rsp) 48870424
229 DEFINE xchg___%rdi,(%rsp) 48873c24
230 DEFINE xor____$i8,%ah 80f4
231 DEFINE xor____%rax,%rax 4831c0
232 DEFINE xor____%rdi,%rax 4831f8
233 DEFINE xor____%rdx,%rdx 4831d2
234
235
236 # Enough for all of Mes + Mes C Libray when using all registers, i.e.,
237 # non-reduced instruction set
238 #DEFINE add____$i32,%rdx 4881c2
239 #DEFINE add____$i32,%rsi 4881c6
240 #DEFINE add____$i8,%rcx 4883c1
241 #DEFINE add____$i8,%rdx 4883c2
242 #DEFINE add____$i8,%rsi 4883c6
243 #DEFINE add____$i8,(%rsi) 488306
244 #DEFINE add____%rdx,%rdx 4801d2
245 #DEFINE add____%rdx,%rsi 4801d6
246 #DEFINE add____%rsi,%rdi 4801f7
247 #DEFINE add____%rsi,%rsi 4801f6
248 #DEFINE addl___$i32,(%rsi) 8106
249 #DEFINE addl___$i8,(%rsi) 8306
250 #DEFINE and____$i32,%rsi 4881e6
251 #DEFINE idiv___%rcx 48f7f9
252 #DEFINE idiv___%rsi 48f7fe
253 #DEFINE mov____$i32,%r8 49c7c0
254 #DEFINE mov____$i32,%r9 49c7c1
255 #DEFINE mov____$i32,%rcx 48c7c1
256 #DEFINE mov____$i32,%rdx 48c7c2
257 #DEFINE mov____$i32,%rsi 48c7c6
258 #DEFINE mov____%dil,(%rsi) 40883e
259 #DEFINE mov____%edi,(%rsi) 893e
260 #DEFINE mov____%r8,%r8 4d89c0
261 #DEFINE mov____%r8,0x8(%rbp) 4c8945
262 #DEFINE mov____%r9,%r9 4d89c9
263 #DEFINE mov____%r9,%rdi 4c89cf
264 #DEFINE mov____%r9,0x8(%rbp) 4c894d
265 #DEFINE mov____%rax,%rbx 4889c3
266 #DEFINE mov____%rax,%rcx 4889c1
267 #DEFINE mov____%rax,%rdx 4889c2
268 #DEFINE mov____%rax,%rsi 4889c6
269 #DEFINE mov____%rbp,%rcx 4889e9
270 #DEFINE mov____%rbp,%rdx 4889ea
271 #DEFINE mov____%rbp,%rsi 4889ee
272 #DEFINE mov____%rcx,%rcx 4889c9
273 #DEFINE mov____%rcx,%rdi 4889cf
274 #DEFINE mov____%rcx,%rdx 4889ca
275 #DEFINE mov____%rcx,%rsi 4889ce
276 #DEFINE mov____%rcx,0x8(%rbp) 48894d
277 #DEFINE mov____%rdi,%rdx 4889fa
278 #DEFINE mov____%rdi,%rsi 4889fe
279 #DEFINE mov____%rdx,%rcx 4889d1
280 #DEFINE mov____%rdx,%rdx 4889d2
281 #DEFINE mov____%rdx,%rsi 4889d6
282 #DEFINE mov____%rdx,0x8(%rbp) 488955
283 #DEFINE mov____%rsi,%rax 4889f0
284 #DEFINE mov____%rsi,%rcx 4889f1
285 #DEFINE mov____%rsi,%rdi 4889f7
286 #DEFINE mov____%rsi,%rdx 4889f2
287 #DEFINE mov____%rsi,%rsi 4889f6
288 #DEFINE mov____%rsi,0x32 48893425
289 #DEFINE mov____%rsi,0x8(%rbp) 488975
290 #DEFINE mov____%rsi,0x8(%rdi) 488977
291 #DEFINE mov____(%rdx),%edx 8b12
292 #DEFINE mov____(%rdx),%rdx 488b12
293 #DEFINE mov____(%rsi),%rsi 488b36
294 #DEFINE mov____0x32(%rbp),%rcx 488b8d
295 #DEFINE mov____0x32(%rbp),%rdx 488b95
296 #DEFINE mov____0x32(%rbp),%rsi 488bb5
297 #DEFINE mov____0x32,%rcx 488b0c25
298 #DEFINE mov____0x32,%rdx 488b1425
299 #DEFINE mov____0x32,%rsi 488b3425
300 #DEFINE mov____0x8(%rax),%rsi 488b70
301 #DEFINE mov____0x8(%rdi),%rbx 488b5f
302 #DEFINE movsbq_%cl,%rcx 480fbec9
303 #DEFINE movsbq_%dl,%rdx 480fbed2
304 #DEFINE movsbq_%sil,%rsi 480fbef6
305 #DEFINE movslq_%ecx,%rcx 4863c9
306 #DEFINE movslq_%edx,%rdx 4863d2
307 #DEFINE movslq_%esi,%rsi 4863f6
308 #DEFINE movswq_%si,%rsi 480fbff6
309 #DEFINE movzbq_%dl,%rdx 480fb6d2
310 #DEFINE movzbq_%sil,%rsi 480fb6f6
311 #DEFINE movzbq_(%rsi),%rsi 480fb636
312 #DEFINE movzlq_(%rdx),%rdx 8b12
313 #DEFINE movzlq_(%rsi),%rsi 8b36
314 #DEFINE movzwq_(%rsi),%rsi 480fb736
315 #DEFINE mul____%rbx 48f7e3
316 #DEFINE mul____%rcx 48f7e1
317 #DEFINE mul____%rdx 48f7e2
318 #DEFINE mul____%rsi 48f7e6
319 #DEFINE or_____%rdx,%rsi 4809d6
320 #DEFINE or_____%rsi,%rdi 4809f7
321 #DEFINE pop____%rcx 59
322 #DEFINE pop____%rsi 5e
323 #DEFINE push___%rcx 51
324 #DEFINE push___%rsi 56
325 #DEFINE shl____$i8,%rsi 48c1e6
326 #DEFINE shl____%cl,%rsi 48d3e6
327 #DEFINE sub____$i32,%rsi 4881ee
328 #DEFINE sub____%rcx,%rdx 4829ca
329 #DEFINE sub____%rdx,%rsi 4829d6
330 #DEFINE sub____%rsi,%rdi 4829f7
331 #DEFINE test___%rdx,%rdx 4885d2
332 #DEFINE xchg___%rdi,%rsi 4887fe
333 #DEFINE xchg___%rdx,%rcx 4887d1
334 #DEFINE xchg___%rsi,%rdx 4887f2
335
336 DEFINE SYS_write 01000000
337 DEFINE SYS_exit  3c000000