blob: 0205e9f45c8607398ed32a9b4879bce58c6c07e1 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
#ifndef MATHLINE_H
#define MATHLINE_H
#include <math.h>
#define f2i(a, b) a = lrintf(b)
/*
Fixed Point Multiply.
16.16 * 16.16 -> 16.16
or
16.16 * 0.32 -> 0.32
A proper version of this function ought to read
16.16 * 16.16 -> 32.16
but this would require a __int64 result
Algorithm:
Take the mid 32 bits of the 64 bit result
*/
/*
These functions have been checked for suitability for
a Pentium and look as if they would work adequately.
Might be worth a more detailed look at optimising
them though.
*/
static __inline int MUL_FIXED(int a, int b)
{
/*
int retval;
_asm
{
mov eax,a
imul b
shrd eax,edx,16
mov retval,eax
}
*/
#if defined(ASM386)
int retval;
__asm__("imull %2 \n\t"
"shrdl $16, %%edx, %%eax \n\t"
: "=a" (retval)
: "0" (a), "m" (b)
: "%edx", "cc"
);
return retval;
#else
__int64 aa = (__int64) a;
__int64 bb = (__int64) b;
__int64 cc = aa * bb;
return (int) ((cc >> 16) & 0xffffffff);
#endif
}
#endif
|