33 #pragma warning(disable:4035 4704)
35 #define MulDivRN MulDiv
40 INLINE ::i32 MulDiv32(::i32 a,::i32 b,::i32 ca)
42 _asm mov eax,dword
ptr a
43 _asm mov ebx,dword
ptr b
44 _asm mov ecx,dword
ptr ca
47 _asm shld edx, eax, 16
51 INLINE ::u32 MulDivRN(::u32 a,::u32 b,::u32 ca)
53 _asm mov eax,dword
ptr a
54 _asm mov ebx,dword
ptr b
55 _asm mov ecx,dword
ptr ca
62 _asm shld edx, eax, 16
66 INLINE ::u32 MulDivRU(::u32 a,::u32 b,::u32 ca)
68 _asm mov eax,dword
ptr a
69 _asm mov ebx,dword
ptr b
70 _asm mov ecx,dword
ptr ca
77 _asm shld edx, eax, 16
81 INLINE ::u32 MulDivRD(::u32 a,::u32 b,::u32 ca)
83 _asm mov eax,dword
ptr a
84 _asm mov ebx,dword
ptr b
85 _asm mov ecx,dword
ptr ca
88 _asm shld edx, eax, 16
93 #pragma warning(default:4035 4704)
98 #define MulDivRN MulDiv
109 INLINE ::i32 MulDiv32( ::i32 a, ::i32 b, ::i32 ca )
111 return (::i32)(((::i64)a * (::i64)b) / (::i64)ca);
115 INLINE ::u32 MulDivRD( ::u32 a, ::u32 b, ::u32 ca )
117 return (::i32)(((::u64)a * (::u64)b) / (::u64)ca);
121 INLINE ::u32 MulDivRN( ::u32 a, ::u32 b, ::u32 ca )
123 return (::u32)(((::u64)a * (::u64)b) / (::u64)ca);
127 INLINE ::u32 MulDivRU( ::u32 a, ::u32 b, ::u32 ca )
129 return (::i32)((((::u64) a * (::i64)b) + ca -1) / (::i64)ca);
135#elif defined(LINUX) || defined(__APPLE__) || defined(__ANDROID__) || defined(FREEBSD) || defined(OPENBSD)
137inline ::i32 MulDiv32(::i32 a, ::i32 b, ::i32 ca)
139 return (::i32) (((::i64) a * (::i64) b) / (::i64) ca);
142inline ::u32 MulDivRD(::u32 a, ::u32 b, ::u32 ca)
144 return (::u32) (((::u64) a * (::u64) b) / (::u64) ca);
147inline ::u32 MulDivRN( ::u32 a, ::u32 b, ::u32 ca )
149 return (::u32) ((((::u64) a * (::u64) b)+(::u64)ca/2) / (::u64)ca );
153inline ::u32 MulDivRU( ::u32 a, ::u32 b, ::u32 ca )
155 return (::u32) ((((::u64) a * (::u64) b)+(::u64)ca-1) / (::u64)ca );
167 #pragma warning(disable:4035 4704)
174 inline ::i32 MulDiv32(::i32 a,::i32 b,::i32 ca)
176 _asm _emit 0x66 _asm mov ax,::u16
ptr a
177 _asm _emit 0x66 _asm mov bx,::u16
ptr b
178 _asm _emit 0x66 _asm mov cx,::u16
ptr ca
179 _asm _emit 0x66 _asm imul bx
180 _asm _emit 0x66 _asm idiv cx
189 INLINE ::u32 MulDivRN(::u32 a,::u32 b,::u32 ca)
191 _asm _emit 0x66 _asm mov ax,::u16
ptr a
192 _asm _emit 0x66 _asm mov bx,::u16
ptr b
193 _asm _emit 0x66 _asm mov cx,::u16
ptr ca
194 _asm _emit 0x66 _asm mul bx
195 _asm _emit 0x66 _asm mov bx,cx
196 _asm _emit 0x66 _asm shr bx,1
197 _asm _emit 0x66 _asm add ax,bx
198 _asm _emit 0x66 _asm adc Δx,0
199 _asm _emit 0x66 _asm div cx
208 INLINE ::u32 MulDivRU(::u32 a,::u32 b,::u32 ca)
210 _asm _emit 0x66 _asm mov ax,::u16
ptr a
211 _asm _emit 0x66 _asm mov bx,::u16
ptr b
212 _asm _emit 0x66 _asm mov cx,::u16
ptr ca
213 _asm _emit 0x66 _asm mul bx
214 _asm _emit 0x66 _asm mov bx,cx
215 _asm _emit 0x66 _asm dec bx
216 _asm _emit 0x66 _asm add ax,bx
217 _asm _emit 0x66 _asm adc Δx,0
218 _asm _emit 0x66 _asm div cx
228 INLINE ::u32 MulDivRD(::u32 a,::u32 b,::u32 ca)
230 _asm _emit 0x66 _asm mov ax,::u16
ptr a
231 _asm _emit 0x66 _asm mov bx,::u16
ptr b
232 _asm _emit 0x66 _asm mov cx,::u16
ptr ca
233 _asm _emit 0x66 _asm mul bx
234 _asm _emit 0x66 _asm div cx
243 #pragma warning(default:4035 4704)
253#define muldivrd32 MulDivRD
254#define muldivru32 MulDivRU