Back to index

tetex-bin  3.0
mfmpw32.c
Go to the documentation of this file.
00001 /* i386 assembly routines for inner loop fraction routines in Metafont
00002    and MetaPost. Included from texmfmp.c. By Wayne Sullivan
00003    <wgs@maths.ucd.ie>.  */
00004 
00005 /*
00006   Converted to inline assembler for Visual C++ [45].xx
00007   by Fabrice Popineau <Fabrice.Popineau@supelec.fr> */
00008 
00009 __declspec(naked) fraction __stdcall ztakefraction(integer p, integer q) {
00010 __asm {
00011         push ebp
00012        mov ebp,esp
00013         xor ecx,ecx
00014         mov eax, p
00015 ;        mov eax, [ebp+8]
00016         cmp eax, 0x80000000
00017         jz LL5
00018         imul q
00019         or edx,edx
00020         jns LL2
00021         neg edx
00022         neg eax
00023         sbb edx, ecx
00024         inc ecx
00025 LL2:
00026         add eax, 0x08000000
00027         adc edx, 0
00028         cmp edx, 0x07ffffff
00029         ja LL3
00030         shrd eax,edx,28
00031 LL1:
00032        jecxz LL4
00033         neg eax
00034 LL4:
00035         mov esp,ebp
00036         pop ebp
00037        ret 8
00038 LL5:     
00039        inc ecx
00040 LL3:     
00041        mov eax, 0x7fffffff
00042         mov aritherror, 1
00043         jmp LL1
00044 }
00045 }
00046 
00047 __declspec(naked) integer __stdcall ztakescaled(integer p, scaled q) {
00048 __asm {
00049         push ebp
00050        mov ebp,esp
00051 ;        mov eax, [ebp+8]
00052         xor ecx,ecx
00053        mov eax, p
00054         cmp eax, 0x80000000
00055         jz LL5
00056         imul q
00057         or edx,edx
00058         jns LL12
00059         neg edx
00060         neg eax
00061         sbb edx,ecx
00062         inc ecx
00063 LL12:
00064         add eax, 0x00008000
00065         adc edx, 0x0
00066         cmp edx, 0x00007fff
00067         ja LL3
00068         shrd eax,edx,16
00069 LL1:
00070         jecxz LL4
00071         neg eax
00072 LL4:
00073         mov esp,ebp
00074         pop ebp
00075        ret 8
00076 LL5:     
00077        inc ecx
00078 LL3:     
00079        mov eax, 0x7fffffff
00080         mov aritherror, 1
00081         jmp LL1
00082          }
00083 }
00084 
00085 __declspec(naked) scaled __stdcall zmakescaled(integer p, integer q) {
00086   __asm {
00087         mov cx, 16
00088         push ebp
00089         mov ebp,esp
00090         push ebx
00091 ;        mov edx, [ebp+8]
00092        mov edx, p
00093         xor eax,eax
00094         or edx,edx
00095         jns LL32
00096         inc ch
00097         neg edx
00098 LL32:
00099 ;        mov ebx, [ebp+12]
00100         mov ebx,q
00101         or ebx,ebx
00102         jns LL33
00103         dec ch
00104         neg ebx
00105         or ebx,ebx
00106         js LL34
00107 LL33:
00108         or edx,edx
00109         js LL34
00110         shrd eax,edx,cl
00111         shr edx,cl
00112         cmp edx,ebx
00113         jae LL34
00114         div ebx
00115         add edx,edx
00116         inc edx
00117         sub ebx,edx
00118         adc eax, 0
00119         jc LL34
00120         cmp eax, 0x7fffffff
00121         ja LL34
00122 LL31:    or ch,ch
00123         jz LL35
00124         neg eax
00125 LL35:
00126         pop ebx
00127         mov esp, ebp
00128         pop ebp
00129         ret 8
00130 LL34:    
00131         mov eax, 0x7fffffff
00132        mov aritherror, 1
00133         jmp LL31
00134   }
00135 }
00136 
00137 __declspec(naked) fraction __stdcall zmakefraction(integer p, integer q) {
00138   __asm {
00139         mov cx, 4
00140         push ebp
00141         mov ebp,esp
00142         push ebx
00143        mov edx, p
00144 ;        mov [ebp+8],edx
00145         xor eax,eax
00146         or edx,edx
00147         jns LL32
00148         inc ch
00149         neg edx
00150 LL32:
00151 ;        mov [ebp+12],ebx
00152         mov ebx, q
00153         or ebx,ebx
00154         jns LL33
00155         dec ch
00156         neg ebx
00157         or ebx,ebx
00158         js LL34
00159 LL33:
00160         or edx,edx
00161         js LL34
00162         shrd eax,edx, cl
00163         shr edx,cl
00164         cmp edx,ebx
00165         jae LL34
00166         div ebx
00167         add edx,edx
00168         inc edx
00169         sub ebx,edx
00170         adc eax, 0
00171         jc LL34
00172         cmp eax, 0x7fffffff
00173         ja LL34
00174 LL31:    or ch,ch
00175         jz LL35
00176         neg eax
00177 LL35:
00178         pop ebx
00179         mov esp, ebp
00180         pop ebp
00181         ret 8
00182 LL34:    
00183         mov eax, 0x7fffffff
00184         mov aritherror, 1
00185         jmp LL31
00186   }
00187 }
00188 
00189