blob: b44d398de0714fb62533a0ac00df9ecbbbeb85eb [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001#ifndef _FIXP_ARITH_H
2#define _FIXP_ARITH_H
3
4/*
5 * $$
6 *
7 * Simplistic fixed-point arithmetics.
8 * Hmm, I'm probably duplicating some code :(
9 *
10 * Copyright (c) 2002 Johann Deneux
11 */
12
13/*
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 2 of the License, or
17 * (at your option) any later version.
18 *
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with this program; if not, write to the Free Software
26 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 *
28 * Should you need to contact me, the author, you can do so by
29 * e-mail - mail your message to <deneux@ifrance.com>
30 */
31
32#include <linux/types.h>
33
34// The type representing fixed-point values
35typedef s16 fixp_t;
36
37#define FRAC_N 8
38#define FRAC_MASK ((1<<FRAC_N)-1)
39
40// Not to be used directly. Use fixp_{cos,sin}
Arjan van de Ven4c4c9432005-11-29 09:43:42 +010041static const fixp_t cos_table[45] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -070042 0x0100, 0x00FF, 0x00FF, 0x00FE, 0x00FD, 0x00FC, 0x00FA, 0x00F8,
43 0x00F6, 0x00F3, 0x00F0, 0x00ED, 0x00E9, 0x00E6, 0x00E2, 0x00DD,
44 0x00D9, 0x00D4, 0x00CF, 0x00C9, 0x00C4, 0x00BE, 0x00B8, 0x00B1,
45 0x00AB, 0x00A4, 0x009D, 0x0096, 0x008F, 0x0087, 0x0080, 0x0078,
46 0x0070, 0x0068, 0x005F, 0x0057, 0x004F, 0x0046, 0x003D, 0x0035,
47 0x002C, 0x0023, 0x001A, 0x0011, 0x0008
48};
49
50
51/* a: 123 -> 123.0 */
52static inline fixp_t fixp_new(s16 a)
53{
54 return a<<FRAC_N;
55}
56
57/* a: 0xFFFF -> -1.0
58 0x8000 -> 1.0
59 0x0000 -> 0.0
60*/
61static inline fixp_t fixp_new16(s16 a)
62{
63 return ((s32)a)>>(16-FRAC_N);
64}
65
66static inline fixp_t fixp_cos(unsigned int degrees)
67{
68 int quadrant = (degrees / 90) & 3;
69 unsigned int i = degrees % 90;
70
71 if (quadrant == 1 || quadrant == 3) {
72 i = 89 - i;
73 }
74
75 i >>= 1;
76
77 return (quadrant == 1 || quadrant == 2)? -cos_table[i] : cos_table[i];
78}
79
80static inline fixp_t fixp_sin(unsigned int degrees)
81{
82 return -fixp_cos(degrees + 90);
83}
84
85static inline fixp_t fixp_mult(fixp_t a, fixp_t b)
86{
87 return ((s32)(a*b))>>FRAC_N;
88}
89
90#endif