### GNU Mes --- Maxwell Equations of Software
### Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
###
### 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.
###
### 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.

# reduced instruction set: eax, ebx (some ecx for shift, edx for mul, div)
# 193 instructions

DEFINE add____$i32,%eax 05
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,%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(%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____%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____$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____$i8,%eax 83f8
DEFINE cmp____$i8,%ebx 81fb
DEFINE div___%ebx f7f3
DEFINE hlt f4
DEFINE idiv___%ebx f7fb
DEFINE int cd
DEFINE int____$0x80 cd80
DEFINE ja32  0f87
DEFINE jae32 0f83
DEFINE jb32  0f82
DEFINE jbe32 0f86
DEFINE je32 0f84
DEFINE je8 74
DEFINE jg32 0f8f
DEFINE jge32 0f8d
DEFINE jl32 0f8c
DEFINE jle32 0f8e
DEFINE jmp32 e9
DEFINE jmp____*%ebx ffe3
DEFINE jne32 0f85
DEFINE lahf 9f
DEFINE lea____0x32(%ebp),%eax 8d85
DEFINE lea____0x8(%ebp),%eax 8d45
DEFINE leave c9
DEFINE mov____$i32,%eax b8
DEFINE mov____$i32,%ebx bb
DEFINE mov____$i32,(%eax) c700
DEFINE mov____$i32,0x32 c705
DEFINE mov____$i32,0x8(%eax) c740
DEFINE mov____$i32,0x8(%ebp) c745
DEFINE mov____$i8,%al b0
DEFINE mov____$i8,%eax b0
DEFINE mov____%al,(%ebx) 8803
DEFINE mov____%al,0x32(%ebp) 8885
DEFINE mov____%al,0x8(%ebp) 8845
DEFINE mov____%ax,(%ebx) 668903
DEFINE mov____%ax,0x8(%ebp) 668945
DEFINE mov____%bx,%bx 6689db
DEFINE mov____%cl,(%ebx) 8a08
DEFINE mov____%cx,(%ebx) 668b08
DEFINE mov____%dl,(%eax) 8810
DEFINE mov____%dl,0x8(%eax) 8850
DEFINE mov____%eax,%ebx 89c3
DEFINE mov____%eax,%ecx 89c1
DEFINE mov____%eax,(%ebx) 8903
DEFINE mov____%eax,0x32 a3
DEFINE mov____%eax,0x32(%ebp) 8985
DEFINE mov____%eax,0x8(%ebp) 8945
DEFINE mov____%ebp,%eax 89e8
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____%ecx,(%ebx) 890b
DEFINE mov____%edi,%ebp 89fd
DEFINE mov____%edx,%eax 89d0
DEFINE mov____%edx,%ebx 89d3
DEFINE mov____%esp,%ebp 89e5
DEFINE mov____%esp,%edi 89e7
DEFINE mov____(%eax),%cl 8a08
DEFINE mov____(%eax),%cx 668b08
DEFINE mov____(%eax),%eax 8b00
DEFINE mov____(%eax),%ecx 8b08
DEFINE mov____(%ebx),%ebx 8b1b
DEFINE mov____0x32(%eax),%eax 8b80
DEFINE mov____0x32(%eax),%ebx 8b98
DEFINE mov____0x32(%ebp),%eax 8b85
DEFINE mov____0x32(%ebp),%ebx 8b9d
DEFINE mov____0x32,%eax a1
DEFINE mov____0x32,%ebx 8b1d
DEFINE mov____0x8(%eax),%eax 8b40
DEFINE mov____0x8(%eax),%ebx 8b58
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 movb___%bl,0x32 881d
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 movw___%bx,0x32 66891d
DEFINE movzbl_%al,%eax 0fb6c0
DEFINE movzbl_%bl,%ebx 0fb6db
DEFINE movzbl_(%eax),%eax 0fb600
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____%ebx f7e3
DEFINE mul_____%ebx f7e3
DEFINE nop 90
DEFINE not____%eax f7d0
DEFINE not____%ebx f7d3
DEFINE or_____%ebx,%eax 09d8
DEFINE pop____%eax 58
DEFINE pop____%ebx 5b
DEFINE pop____%ebp 5d
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
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____%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___%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____%edx,%edx 31d2


# 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
DEFINE SYS_read   03000000
DEFINE SYS_rmdir  28000000
DEFINE SYS_write  04000000
DEFINE SYS_open   05000000
DEFINE SYS_close  06000000
DEFINE SYS_waitpid 07000000
DEFINE SYS_unlink 0a000000
DEFINE SYS_execve 0b000000
DEFINE SYS_chmod  0f000000
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
