123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438 |
- # Rules to optimize BCC assembler output for 386
- # Many of these rules are very broken, ho hum.
- # Rules for loading a long constant
- xor ax,ax
- xor %[bx|si|di]1,%[bx|si|di]1
- =
- xor eax,eax
- xor eax,eax
- mov %[ebx|ecx|edx]1,eax
- =
- xor %1,%1
- xor ax,ax
- mov %[bx|si|di]*,%[*|#]0%1
- =
- mov eax,%0%1<<16
- mov ax,%[*|#]0%1
- xor %[bx|si|di]2,%[bx|si|di]2
- =
- mov eax,%0%1 & $0000FFFF
- mov ax,%0[%1]
- xor %[bx|si|di]2,%[bx|si|di]2
- =
- movzx eax,word ptr %0[%1]
- mov ax,%[si|di]1
- xor bx,bx
- =
- movzx eax,%1
- %[movzx|movsx]5 eax,%1
- mov %[ebx|ecx|edx]2,eax
- =
- %5 %2,%1
- %[movzx|movsx]5 %[ebx|ecx|edx]1,%2
- mov eax,%[#|*]0%3
- %[add|and|xor|or]4 eax,%[ebx|ecx|edx]1
- =
- %5 eax,%2
- %4 eax,%0%3
- mov ax,%0[%1]
- cwde
- =
- movsx eax,word ptr %0[%1]
- mov ax,%[si|di]1
- cwde
- =
- movsx eax,%1
- mov ax,%[#|*]3%1
- mov %[bx|si|di]*,%[#|*]4%2
- =
- mov eax,%4%2<<16 + %1
- # Rules for pushing variables and constants onto the stack
- push %![dword ptr]%1[%[bx|si|di|bp]3]
- push %![dword ptr]%(%1-2)[%[bx|si|di|bp]3]
- =
- push dword ptr %(%1-2)[%3]
- push [%1+2]
- push [%1]
- =
- push dword ptr [%1]
- push %[bx|si|di]*
- push ax
- =
- push eax
- mov eax,%[#|*]0%1
- push eax
- =
- push dword %0%1
- mov %1,%[eax|ebx|ecx|edx]2
- push dword ptr %1
- =
- mov %1,%2
- push %2
- # Rules for loading long variables
- mov ax,[%1]
- mov %[bx|si|di]*,[%1+2]
- =
- mov eax,[%1]
- mov ax,%1[%[bx|si|di|bp]3]
- mov %[bx|si|di]*,%(%1+2)[%[bx|si|di|bp]3]
- =
- mov eax,%1[%3]
- mov ax,#%1[bx]
- mov %[bx|si|di]*,#%1+2[bx]
- =
- mov eax,#%1[bx]
- mov [%1],ax
- mov [%1+2],%[bx|si|di]*
- =
- mov [%1],eax
- mov [%1+%3],ax
- mov [%1+%(%3+2)],%[bx|si|di]*
- =
- mov [%1+%3],eax
- mov %1[%[si|di|bp]3],ax
- mov %(%1+2)[%[si|di|bp]3],%[bx|si|di]*
- =
- mov %1[%3],eax
- mov #%1[bx],ax
- mov #%1+2[bx],%[bx|si|di]*
- =
- mov #%1[bx],eax
- mov eax,%[#|*]0%1
- mov %![dword ptr]%3[%2],eax
- =
- mov dword ptr %3[%2],%0%1
- xor ax,ax
- xor %[bx|si|di]3,%[bx|si|di]3
- mov %1[%[bx|bp]4],ax
- mov %(%1+2)[%[bx|bp]4],%[bx|si|di]3
- =
- mov dword ptr %1[%4],#0
- mov ax,%1
- mov %[bx|si|di]5,%2
- mov %3[%[bx|bp]6],ax
- mov %(%3+2)[%[bx|bp]6],%[bx|si|di]5
- =
- mov eax,dword ptr %1
- mov dword ptr %3[%6],eax
- # Long return values are in EAX, so we can skip dx
- mov dx,bx
- add sp,*%1
- =
- add sp,*%1
- # Rules for manipulating long values
- call %1
- mov bx,dx
- =
- call %1
- call l%[tstu|tst]*l
- =
- test eax,eax
- call l%[comu|com]*l
- =
- not eax
- mov eax,eax
- %1
- =
- %1
- mov %2,%[eax|ebx|ecx|edx]1
- mov %[eax|ebx|ecx|edx]1,%2
- =
- mov %2,%1
- cwd
- mov bx,dx
- =
- cwde
- mov %[ebx|ecx|edx]0,%1
- mov eax,%2
- %3 eax,%[ebc|ecx|edx]0
- =
- mov eax,%2
- %3 eax,%1
- %[movzx|movsx|mov]0 %[eax|ebx|ecx|edx]2,%4
- %[add|and|xor|sub|or]1 %[eax|ebx|ecx|edx]2,%6
- mov %6,%[eax|ebx|ecx|edx]2
- =
- %0 %2,%4
- %1 %6,%2
- mov eax,%[#|*]0%1
- cmp eax,%2
- %[jbe |jae |jne |jge |jle ]3 %4
- =
- cmp dword ptr %2,%0%1
- %=[jbe |jae |jne |jge |jle ][jae |jbe |jne |jle |jge ]3 %4
- mov eax,%[#|*]0%1
- cmp eax,%2
- %[jb |ja |je |jg |jl ]3 %4
- =
- cmp dword ptr %2,%0%1
- %=[jb |ja |je |jg |jl ][ja |jb |je |jl |jg ]3 %4
- mov eax,%1[%3]
- cmp eax,dword %[#|*]0%2
- =
- cmp dword ptr %1[%3],%0%2
- # Rules for calling the bcc library routines.
- push %1
- push %2
- mov eax,%3[bp]
- %4 eax,%(%3-4)[bp]
- add sp,*8
- =
- mov edx,%2
- mov eax,%1
- %4 eax,edx
- push %1
- mov eax,%2
- push eax
- mov eax,%3[bp]
- %4 eax,%(%3-4)[bp]
- add sp,*8
- =
- mov edx,%2
- mov eax,%1
- %4 eax,edx
- push %1
- xor eax,eax
- push eax
- mov eax,%2[bp]
- %3 eax,%(%2-4)[bp]
- add sp,*8
- =
- mov eax,%1
- %3 eax,#0
- push %1
- mov eax,%2
- %3 eax,%4[bp]
- add sp,*4
- =
- mov edx,%1
- mov eax,%2
- %3 eax,edx
- push %1
- mov eax,%2
- %3 eax,%4[bp]
- mov %2,eax
- add sp,*4
- =
- mov edx,%1
- %3 %2,edx
- push %1
- push %2
- mov eax,%3[bp]
- %4 eax,%(%3-4)[bp]
- lea sp,%(%3+4)[bp]
- =
- mov edx,%2
- mov eax,%1
- %4 eax,edx
- push %1
- mov eax,%2
- push eax
- mov eax,%3[bp]
- %4 eax,%(%3-4)[bp]
- lea sp,%(%3+4)[bp]
- =
- mov edx,%2
- mov eax,%1
- %4 eax,edx
- push %1
- xor eax,eax
- push eax
- mov eax,%2[bp]
- %3 eax,%(%2-4)[bp]
- lea sp,%(%2+4)[bp]
- =
- mov eax,%1
- %3 eax,#0
- push %1
- mov eax,%2
- %3 eax,%4[bp]
- lea sp,%(%4+4)[bp]
- =
- mov edx,%1
- mov eax,%2
- %3 eax,edx
- # Rules for calling the basic bcc library routines.
- mov di,#%2
- call l%3%[ul|l]*
- =
- %3 eax,[%2]
- mov di,*%2
- call lsll
- =
- lsl eax,*%2
- lea di,%2
- call l%3%[ul|l]*
- =
- %3 eax,%2
- mov di,%[si|di]1
- call l%3%[ul|l]*
- =
- %3 eax,[%1]
- mov di,%[ax|bx|cx|dx]1
- call l%3%[ul|l]*
- =
- mov di,%[ax|bx|cx|dx]1
- %3 eax,[di]
- # Rules for pushing short values
- mov %[ax|bx|cx|dx|si|di]2,%0[%1]
- push %[ax|bx|cx|dx|si|di]2
- =
- push word ptr %0[%1]
- mov %[ax|bx|cx|dx|si|di]2,%[#|*]0%1
- push %[ax|bx|cx|dx|si|di]2
- =
- push %0%1
- # Shifting rules
- %[shl|shr]2 %1,*1
- %[shl|shr]2 %1,*1
- =
- %2 %1,*2
- mov cl,*%1
- %[shl|shr]2 %3,cl
- =
- %2 %3,*%1
- mov dx,ax
- shl ax,*%1
- add ax,dx
- shl ax,*%2
- =
- mov dx,ax
- imul ax,*%(1<%1+1<%2)
- mov dx,ax
- imul ax,*%1
- add ax,dx
- =
- mov dx,ax
- imul ax,*%(%1+1)
- mov dx,ax
- imul ax,*%1
- shl ax,*%2
- =
- mov dx,ax
- imul ax,*%(%1<%2)
- mov ax,%![#|*]%4
- mov dx,ax
- imul ax,*%1
- %[add|and|xor|sub|or]2 ax,%![dx]%3
- =
- imul ax,%4,*%1
- %2 ax,%3
- mov ax,%![#|*]%4
- mov dx,ax
- imul ax,*%1
- push ax
- =
- imul ax,%4,*%1
- push ax
- imul ax,%2,%[#|*]0%1
- add ax,%3
- mov bx,ax
- =
- imul bx,%2,%0%1
- add bx,%3
- # Different rules
- %1 dword ptr %[eax|ebx|ecx|edx]3,*%2
- =
- %1 %3,*%2
- %1 dword ptr %[eax|ebx|ecx|edx]3,#%2
- =
- %1 %3,#%2
- eor %1,%2
- =
- xor %1,%2
- com %1
- =
- not %1
- xor bx,bx
- =
- and eax,#$0000FFFF
|