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