mescc: Support negative divide.
[mes.git] / lib / x86-mes / x86.M1
index 277c04d8b434174a436d22f9bf63b296c9ebcd69..6c5bdad0dee9351bf789cc0d7f1300048c47d37a 100644 (file)
@@ -1,56 +1,58 @@
-### Mes --- Maxwell Equations of Software
-### Copyright © 2017 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+### GNU Mes --- Maxwell Equations of Software
+### Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
 ###
-### This file is part of Mes.
+### This file is part of GNU Mes.
 ###
 ### Mes is free software# you can redistribute it and/or modify it
 ### under the terms of the GNU General Public License as published by
 ### the Free Software Foundation# either version 3 of the License, or (at
 ### your option) any later version.
 ###
-### Mes is distributed in the hope that it will be useful, but
+### GNU Mes is distributed in the hope that it will be useful, but
 ### WITHOUT ANY WARRANTY# without even the implied warranty of
 ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ### GNU General Public License for more details.
 ###
 ### You should have received a copy of the GNU General Public License
-### along with Mes.  If not, see <http://www.gnu.org/licenses/>.
+### along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
 
+# reduced instruction set: eax, ebx (some ecx for shift, edx for mul, div)
+# 185 instructions
 
 DEFINE add____$i32,%eax 05
-DEFINE add____$i32,%ecx 81c1
-DEFINE add____$i32,%edx 81c2
+DEFINE add____$i32,%ebx 81c3
 DEFINE add____$i32,(%eax) 8100
+DEFINE add____$i32,(%ebx) 8103
 DEFINE add____$i32,0x32(%eax) 8180
 DEFINE add____$i32,0x32(%ebp) 8185
 DEFINE add____$i8,%eax 83c0
-DEFINE add____$i8,%edx 83c2
+DEFINE add____$i8,%ebx 83c3
 DEFINE add____$i8,%esp 83c4
 DEFINE add____$i8,(%eax) 8300
+DEFINE add____$i8,(%ebx) 8303
 DEFINE add____$i8,0x32 8305
 DEFINE add____$i8,0x32(%eax) 8380
-DEFINE add____$i8,0x32(%eax) 8380
 DEFINE add____$i8,0x32(%ebp) 8385
 DEFINE add____$i8,0x8(%eax) 8340
 DEFINE add____$i8,0x8(%ebp) 8345
 DEFINE add____%eax,%eax 01c0
 DEFINE add____%ebp,%eax 01e8
-DEFINE add____%edx,%eax 01d0
-DEFINE add____%edx,%eax 01d0
+DEFINE add____%ebx,%eax 01d8
+DEFINE add____%ebx,%ebx 01db
+DEFINE addb___$i8,(%eax) 8000
+DEFINE addb___$i8,(%ebx) 8003
+DEFINE addw___$i8,(%eax) 668100
+DEFINE addw___$i8,(%ebx) 668103
 DEFINE and____$i32,%eax 25
-DEFINE and____%edx,%eax 21d0
-DEFINE and____(%edx),%eax 2302
+DEFINE and____$i32,%ebx 81e3
+DEFINE and____%ebx,%eax 21d8
 DEFINE call32 e8
 DEFINE call___*%eax ffd0
+DEFINE call___*%ebx ffd3
+DEFINE cltd 99
 DEFINE cmp____$0x32,%eax 3d
 DEFINE cmp____$i32,%eax 3d
-DEFINE cmp____$i32,0x32(%ebp) 81bd
-DEFINE cmp____$i32,0x8(%ebp) 817d
 DEFINE cmp____$i8,%eax 83f8
-DEFINE cmp____$i8,0x32(%ebp) 83bd
-DEFINE cmp____$i8,0x8(%ebp) 837d
-DEFINE cmp____%al,%dl 38c2
-DEFINE cmp____%edx,%eax 39d0
 DEFINE hlt f4
 DEFINE idiv___%ebx f7fb
 DEFINE int cd
@@ -70,103 +72,90 @@ DEFINE jmp____*%ebx ffe3
 DEFINE jne32 0f85
 DEFINE lahf 9f
 DEFINE lea____0x32(%ebp),%eax 8d85
-DEFINE lea____0x32(%ebp),%edx 8d95
 DEFINE lea____0x8(%ebp),%eax 8d45
-DEFINE lea____0x8(%ebp),%edx 8d55
 DEFINE leave c9
 DEFINE mov____$i32,%eax b8
 DEFINE mov____$i32,%ebx bb
-DEFINE mov____$i32,%ecx b9
-DEFINE mov____$i32,%edx ba
 DEFINE mov____$i32,(%eax) c700
 DEFINE mov____$i32,0x32 c705
 DEFINE mov____$i32,0x8(%eax) c740
 DEFINE mov____$i32,0x8(%ebp) c745
-DEFINE mov____%al,(%edx) 8802
-DEFINE mov____%al,0x8(%edx) 8842
-DEFINE mov____%ax,(%edx) 668902
-DEFINE mov____%ax,0x32(%edx) 668982
-DEFINE mov____%ax,0x8(%edx) 668942
+DEFINE mov____%al,(%ebx) 8803
+DEFINE mov____%al,0x8(%ebp) 8845
+DEFINE mov____%ax,(%ebx) 668903
+DEFINE mov____%ax,0x8(%ebp) 668945
 DEFINE mov____%dl,(%eax) 8810
 DEFINE mov____%dl,0x8(%eax) 8850
 DEFINE mov____%eax,%ebx 89c3
-DEFINE mov____%eax,%edx 89c2
-DEFINE mov____%eax,(%ecx) 8901
-DEFINE mov____%eax,(%edx) 8902
+DEFINE mov____%eax,%ecx 89c1
+DEFINE mov____%eax,(%ebx) 8903
 DEFINE mov____%eax,0x32 a3
 DEFINE mov____%eax,0x32(%ebp) 8985
-DEFINE mov____%eax,0x32(%edx) 8982
 DEFINE mov____%eax,0x8(%ebp) 8945
-DEFINE mov____%eax,0x8(%edx) 8942
 DEFINE mov____%ebp,%eax 89e8
-DEFINE mov____%ebp,%ecx 89e9
-DEFINE mov____%ebp,%edx 89ea
+DEFINE mov____%ebp,%ebx 89eb
+DEFINE mov____%ebx,%eax 89d8
+DEFINE mov____%ebx,%ecx 89d9
 DEFINE mov____%ebx,0x32 891d
 DEFINE mov____%ebx,0x32(%ebp) 899d
 DEFINE mov____%ebx,0x8(%ebp) 895d
-DEFINE mov____%ebx,0x8(%edx) 895a
-DEFINE mov____%ecx,(%eax) 8908
-DEFINE mov____%ecx,(%edx) 890a
-DEFINE mov____%ecx,0x32(%ebp) 898d
-DEFINE mov____%ecx,0x8(%ebp) 894d
+DEFINE mov____%ecx,(%ebx) 890b
 DEFINE mov____%edx,%eax 89d0
 DEFINE mov____%edx,%ebx 89d3
-DEFINE mov____%edx,%ecx 89d1
-DEFINE mov____%edx,(%eax) 8910
-DEFINE mov____%edx,0x32(%ebp) 8995
-DEFINE mov____%edx,0x8(%ebp) 8955
 DEFINE mov____%esp,%ebp 89e5
 DEFINE mov____(%eax),%eax 8b00
 DEFINE mov____(%eax),%ecx 8b08
-DEFINE mov____(%edx),%eax 8b02
-DEFINE mov____(%edx),%ecx 8b0a
-DEFINE mov____(%edx),%edx 8b12
+DEFINE mov____(%ebx),%ebx 8b1b
 DEFINE mov____0x32(%eax),%eax 8b80
 DEFINE mov____0x32(%eax),%ebx 8b98
-DEFINE mov____0x32(%eax),%ecx 8b88
-DEFINE mov____0x32(%ebp),%eax 8b85
 DEFINE mov____0x32(%ebp),%eax 8b85
 DEFINE mov____0x32(%ebp),%ebx 8b9d
-DEFINE mov____0x32(%ebp),%ecx 8b8d
-DEFINE mov____0x32(%ebp),%edx 8b95
-DEFINE mov____0x32(%ebp),%edx 8b95
 DEFINE mov____0x32,%eax a1
-DEFINE mov____0x32,%edx 8b15
+DEFINE mov____0x32,%ebx 8b1d
 DEFINE mov____0x8(%eax),%eax 8b40
 DEFINE mov____0x8(%eax),%ebx 8b58
-DEFINE mov____0x8(%eax),%ecx 8b48
 DEFINE mov____0x8(%ebp),%eax 8b45
 DEFINE mov____0x8(%ebp),%ebp 8b6d
 DEFINE mov____0x8(%ebp),%ebx 8b5d
 DEFINE mov____0x8(%ebp),%ecx 8b4d
+DEFINE mov____0x8(%ebp),%edi 8b7d
 DEFINE mov____0x8(%ebp),%edx 8b55
+DEFINE mov____0x8(%ebp),%esi 8b75
 DEFINE mov____0x8(%ebp),%esp 8b65
+DEFINE movb___%al,0x32 a2
 DEFINE movsbl_%al,%eax 0fbec0
+DEFINE movsbl_%bl,%ebx 0fbedb
 DEFINE movswl_%ax,%eax 0fbfc0
+DEFINE movswl_%bx,%ebx 0fbfdb
+DEFINE movw___%ax,0x32 66a3
 DEFINE movzbl_%al,%eax 0fb6c0
-DEFINE movzbl_%al,%eax 0fb6c0
-DEFINE movzbl_%dl,%edx 0fb6d2
+DEFINE movzbl_%bl,%ebx 0fb6db
+DEFINE movzbl_%bl,%ebx 0fb6db
 DEFINE movzbl_(%eax),%eax 0fb600
-DEFINE movzbl_(%eax),%edx 0fb610
-DEFINE movzbl_(%edx),%edx 0fb612
+DEFINE movzbl_(%ebx),%ebx 0fb61b
 DEFINE movzbl_0x32(%eax),%eax 0fb680
 DEFINE movzbl_0x8(%eax),%eax 0fb640
 DEFINE movzbl_0x8(%ebp),%eax 0fb645
 DEFINE movzwl_%ax,%eax 0fb7c0
+DEFINE movzwl_%bx,%ebx 0fb7db
 DEFINE movzwl_(%eax),%eax 0fb700
+DEFINE movzwl_(%ebx),%ebx 0fb71b
 DEFINE movzwl_0x32(%eax),%eax 0fb780
 DEFINE movzwl_0x32(%ebp),%eax 0fb785
 DEFINE movzwl_0x8(%eax),%eax 0fb740
-DEFINE mul____%edx f7e2
+DEFINE mul____%ebx f7e3
+DEFINE mul_____%ebx f7e3
 DEFINE nop 90
 DEFINE not____%eax f7d0
-DEFINE or_____%edx,%eax 09d0
-DEFINE or_____(%edx),%eax 0b02
+DEFINE not____%ebx f7d3
+DEFINE or_____%ebx,%eax 09d8
 DEFINE pop____%eax 58
+DEFINE pop____%ebx 5b
 DEFINE pop____%edx 5a
 DEFINE push___$i32 68
 DEFINE push___%eax 50
 DEFINE push___%ebp 55
+DEFINE push___%ebx 53
 DEFINE push___%edx 52
 DEFINE push___(%eax) ff30
 DEFINE push___0x32(%ebp) ffb5
@@ -174,45 +163,155 @@ DEFINE push___0x8(%ebp) ff75
 DEFINE ret c3
 DEFINE sahf 9e
 DEFINE seta___%al 0f97c0
+DEFINE seta___%bl 0f97c3
 DEFINE setae__%al 0f93c0
+DEFINE setae__%bl 0f93c3
 DEFINE setb___%al 0f92c0
+DEFINE setb___%bl 0f92c3
 DEFINE setbe__%al 0f96c0
+DEFINE setbe__%bl 0f96c3
 DEFINE sete___%al 0f94c0
+DEFINE sete___%bl 0f94c3
 DEFINE setg___%al 0f9fc0
+DEFINE setg___%bl 0f9fc3
 DEFINE setge__%al 0f9dc0
+DEFINE setge__%bl 0f9dc3
 DEFINE setl___%al 0f9cc0
+DEFINE setl___%bl 0f9cc3
 DEFINE setle__%al 0f9ec0
+DEFINE setle__%bl 0f9ec3
 DEFINE setne__%al 0f95c0
+DEFINE setne__%bl 0f95c3
 DEFINE shl____$i8,%eax c1e0
+DEFINE shl____$i8,%ebx c1e3
 DEFINE shl____%cl,%eax d3e0
+DEFINE shl____%cl,%ebx d3e3
 DEFINE shr____%cl,%eax d3e8
+DEFINE sub____$8,%esp 83ec
+DEFINE sub____$i32,%esp 81ec
 DEFINE sub____%al,%dl 28d0
 DEFINE sub____%dl,%al 28c2
-DEFINE sub____%eax,%edx 29c2
-DEFINE sub____%edx,%eax 29d0
-DEFINE sub____%edx,%eax 29d0
-DEFINE sub____%esp,$i32 81ec
-DEFINE sub____%esp,$i8 83ec
+DEFINE sub____%ebx,%eax 29d8
 DEFINE test___%al,%al 84c0
 DEFINE test___%eax,%eax 85c0
+DEFINE test___%ebx,%ebx 85db
+DEFINE xchg___%eax,%ebx 93
+DEFINE xchg___%eax,(%esp) 870424
 DEFINE xchg___%eax,(%esp) 870424
+DEFINE xchg___%ebx,(%esp) 871c24
 DEFINE xor____$i32,%eax 35
 DEFINE xor____$i8,%ah 80f4
 DEFINE xor____%eax,%eax 31c0
+DEFINE xor____%ebx,%eax 31d8
 DEFINE xor____%ebx,%ebx 31db
-DEFINE xor____%ecx,%ecx 31c9
-DEFINE xor____%edx,%eax 31d0
 DEFINE xor____%edx,%edx 31d2
 
-# Deprecated.  Remove after 0.14 release.
-DEFINE mov____%al,0x32(%ebp) 8885
-DEFINE mov____%al,0x8(%ebp) 8845
-DEFINE mov____%ax,0x32(%ebp) 668985
-DEFINE mov____%ax,0x8(%ebp) 668945
-DEFINE movzbl_0x32(%ebp),%eax 0fb685
-DEFINE movzbl_0x8(%ebp),%edx 0fb655
-DEFINE movzwl_0x8(%ebp),%eax 0fb745
-DEFINE movzwl_0x8(%ebp),%eax 0fb745
+
+# Enough for all of Mes + Mes C Libray when using all registers, i.e.,
+# non-reduced instruction set
+#DEFINE add____$i32,%ecx 81c1
+#DEFINE add____$i32,%edx 81c2
+#DEFINE add____$i32,%esi 81c6
+#DEFINE add____$i8,%ecx 83c1
+#DEFINE add____$i8,%edx 83c2
+#DEFINE add____$i8,%esi 83c6
+#DEFINE add____$i8,(%ecx) 8301
+#DEFINE add____$i8,(%edx) 8302
+#DEFINE add____%ecx,%ebx 01cb
+#DEFINE add____%ecx,%ecx 01c9
+#DEFINE add____%edx,%eax 01d0
+#DEFINE add____%edx,%ecx 01d1
+#DEFINE add____%edx,%edx 01d2
+#DEFINE add____%esi,%edx 01f2
+#DEFINE and____$i32,%ecx 81e1
+#DEFINE and____$i32,%edx 81e2
+#DEFINE and____%edx,%eax 21d0
+#DEFINE and____(%edx),%eax 2302
+#DEFINE cmp____%edx,%eax 39d0
+#DEFINE idiv___%ecx f7f9
+#DEFINE lea____0x32(%ebp),%edx 8d95
+#DEFINE lea____0x8(%ebp),%edx 8d55
+#DEFINE mov____$i32,%ecx b9
+#DEFINE mov____$i32,%edx ba
+#DEFINE mov____$i32,%esi be
+#DEFINE mov____%al,(%edx) 8802
+#DEFINE mov____%al,0x8(%edx) 8842
+#DEFINE mov____%ax,(%edx) 668902
+#DEFINE mov____%ax,0x32(%edx) 668982
+#DEFINE mov____%ax,0x8(%edx) 668942
+#DEFINE mov____%bl,(%ecx) 8819
+#DEFINE mov____%eax,%edx 89c2
+#DEFINE mov____%eax,%esi 89c6
+#DEFINE mov____%eax,(%ecx) 8901
+#DEFINE mov____%eax,(%edx) 8902
+#DEFINE mov____%eax,0x32(%edx) 8982
+#DEFINE mov____%eax,0x8(%edx) 8942
+#DEFINE mov____%ebp,%ecx 89e9
+#DEFINE mov____%ebp,%edx 89ea
+#DEFINE mov____%ebp,%esi 89ee
+#DEFINE mov____%ebx,(%ecx) 8919
+#DEFINE mov____%ebx,0x8(%edx) 895a
+#DEFINE mov____%ecx,%eax 89c8
+#DEFINE mov____%ecx,%ecx 89c9
+#DEFINE mov____%ecx,%edx 89ca
+#DEFINE mov____%ecx,(%eax) 8908
+#DEFINE mov____%ecx,(%edx) 890a
+#DEFINE mov____%ecx,0x32(%ebp) 898d
+#DEFINE mov____%ecx,0x8(%ebp) 894d
+#DEFINE mov____%edi,%ebx 89fb
+#DEFINE mov____%edx,%ecx 89d1
+#DEFINE mov____%edx,(%eax) 8910
+#DEFINE mov____%edx,0x32(%ebp) 8995
+#DEFINE mov____%edx,0x8(%ebp) 8955
+#DEFINE mov____%esi,%eax 89f0
+#DEFINE mov____%esi,%ebx 89f3
+#DEFINE mov____(%ecx),%ecx 8b09
+#DEFINE mov____(%edx),%eax 8b02
+#DEFINE mov____(%edx),%ecx 8b0a
+#DEFINE mov____(%edx),%edx 8b12
+#DEFINE mov____0x32(%eax),%ecx 8b88
+#DEFINE mov____0x32(%ebp),%ecx 8b8d
+#DEFINE mov____0x32(%ebp),%edx 8b95
+#DEFINE mov____0x32,%ecx 8b0d
+#DEFINE mov____0x32,%edx 8b15
+#DEFINE mov____0x8(%eax),%ecx 8b48
+#DEFINE movsbl_%cl,%ecx 0fbec9
+#DEFINE movsbl_%dl,%edx 0fbed2
+#DEFINE movswl_%cx,%ecx 0fbfc9
+#DEFINE movzbl_%cl,%ecx 0fb6c9
+#DEFINE movzbl_%dl,%edx 0fb6d2
+#DEFINE movzbl_(%eax),%edx 0fb610
+#DEFINE movzbl_(%ecx),%ecx 0fb609
+#DEFINE movzbl_(%edx),%edx 0fb612
+#DEFINE movzwl_(%ecx),%ecx 0fb709
+#DEFINE mul____%ecx f7e1
+#DEFINE mul____%edi f7e7
+#DEFINE mul____%edx f7e2
+#DEFINE mul____%esi f7e6
+#DEFINE or_____%ecx,%ebx 09cb
+#DEFINE or_____%edx,%eax 09d0
+#DEFINE or_____(%edx),%eax 0b02
+#DEFINE pop____%ecx 59
+#DEFINE pop____%edi 5f
+#DEFINE push___%ecx 51
+#DEFINE push___%edi 57
+#DEFINE push___%esi 56
+#DEFINE shl____$i8,%ecx c1e1
+#DEFINE shl____$i8,%edx c1e2
+#DEFINE shl____%cl,%ecx d3e1
+#DEFINE sub____%eax,%edx 29c2
+#DEFINE sub____%ecx,%ebx 29cb
+#DEFINE sub____%edx,%eax 29d0
+#DEFINE sub____%edx,%ecx 29d1
+#DEFINE xchg___%ebx,%ecx 87d9
+#DEFINE xchg___%ecx,%edx 87ca
+#DEFINE xor____%ecx,%ecx 31c9
+#DEFINE xor____%edx,%eax 31d0
+
+
+# deprecated, remove after 0.18
+DEFINE sub____%esp,$i32 81ec
+DEFINE sub____%esp,$i8 83ec
 
 DEFINE SYS_exit   01000000
 DEFINE SYS_fork   02000000
@@ -229,5 +328,6 @@ DEFINE SYS_lseek  13000000
 DEFINE SYS_access 21000000
 DEFINE SYS_brk    2d000000
 DEFINE SYS_ioctl  36000000
+DEFINE SYS_stat   6a000000
 DEFINE SYS_fsync  76000000
 DEFINE SYS_getcwd b7000000