KallistiOS
2.0.0
Main Page
Modules
Data Structures
Files
File List
Globals
All
Data Structures
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
kernel
arch
dreamcast
include
dc
fmath.h
Go to the documentation of this file.
1
/* KallistiOS 2.0.0
2
3
dc/fmath.h
4
(C)2001 Andrew Kieschnick
5
6
*/
7
8
#ifndef __DC_FMATH_H
9
#define __DC_FMATH_H
10
11
#include <sys/cdefs.h>
12
__BEGIN_DECLS
13
14
#include <
arch/types.h
>
15
16
/**
17
\file dc/fmath.h
18
\brief Inline functions for the DC's special math instructions
19
\author Andrew Kieschnick
20
*/
21
22
/** PI constant (if you don't want full math.h) */
23
#define F_PI 3.1415926f
24
25
/** \cond */
26
#define __fsin(x) \
27
({ float __value, __arg = (x), __scale = 10430.37835; \
28
asm( "fmul %2,%1\n\t" \
29
"ftrc %1,fpul\n\t" \
30
"fsca fpul,dr0\n\t" \
31
"fmov fr0,%0" \
32
: "=f" (__value), "+&f" (__scale) \
33
: "f" (__arg) \
34
: "fpul", "fr0", "fr1"); \
35
__value; })
36
37
#define __fcos(x) \
38
({ float __value, __arg = (x), __scale = 10430.37835; \
39
asm( "fmul %2,%1\n\t" \
40
"ftrc %1,fpul\n\t" \
41
"fsca fpul,dr0\n\t" \
42
"fmov fr1,%0" \
43
: "=f" (__value), "+&f" (__scale) \
44
: "f" (__arg) \
45
: "fpul", "fr0", "fr1"); \
46
__value; })
47
48
#define __ftan(x) \
49
({ float __value, __arg = (x), __scale = 10430.37835; \
50
asm( "fmul %2,%1\n\t" \
51
"ftrc %1,fpul\n\t" \
52
"fsca fpul,dr0\n\t" \
53
"fdiv fr1, fr0\n\t" \
54
"fmov fr0,%0" \
55
: "=f" (__value), "+&f" (__scale) \
56
: "f" (__arg) \
57
: "fpul", "fr0", "fr1"); \
58
__value; })
59
60
61
#define __fisin(x) \
62
({ float __value, __arg = (x); \
63
asm( "lds %1,fpul\n\t" \
64
"fsca fpul,dr0\n\t" \
65
"fmov fr0,%0" \
66
: "=f" (__value) \
67
: "r" (__arg) \
68
: "fpul", "fr0", "fr1"); \
69
__value; })
70
71
#define __ficos(x) \
72
({ float __value, __arg = (x); \
73
asm( "lds %1,fpul\n\t" \
74
"fsca fpul,dr0\n\t" \
75
"fmov fr1,%0" \
76
: "=f" (__value) \
77
: "r" (__arg) \
78
: "fpul", "fr0", "fr1"); \
79
__value; })
80
81
#define __fitan(x) \
82
({ float __value, __arg = (x); \
83
asm( "lds %1,fpul\n\t" \
84
"fsca fpul,dr0\n\t" \
85
"fdiv fr1, fr0\n\t" \
86
"fmov fr0,%0" \
87
: "=f" (__value) \
88
: "r" (__arg) \
89
: "fpul", "fr0", "fr1"); \
90
__value; })
91
92
93
#define __fsqrt(x) \
94
({ float __arg = (x); \
95
asm( "fsqrt %0\n\t" \
96
: "=f" (__arg) : "0" (__arg)); \
97
__arg; })
98
99
#define __frsqrt(x) \
100
({ float __arg = (x); \
101
asm( "fsrra %0\n\t" \
102
: "=f" (__arg) : "0" (__arg)); \
103
__arg; })
104
105
/* Floating point inner product (dot product) */
106
#define __fipr(x, y, z, w, a, b, c, d) ({ \
107
register float __x __asm__("fr0") = (x); \
108
register float __y __asm__("fr1") = (y); \
109
register float __z __asm__("fr2") = (z); \
110
register float __w __asm__("fr3") = (w); \
111
register float __a __asm__("fr4") = (a); \
112
register float __b __asm__("fr5") = (b); \
113
register float __c __asm__("fr6") = (c); \
114
register float __d __asm__("fr7") = (d); \
115
__asm__ __volatile__( \
116
"fipr fv4,fv0" \
117
: "+f" (__w) \
118
: "f" (__x), "f" (__y), "f" (__z), "f" (__w), \
119
"f" (__a), "f" (__b), "f" (__c), "f" (__d) \
120
); \
121
__w; })
122
123
/* Floating point inner product w/self (square of vector magnitude) */
124
#define __fipr_magnitude_sqr(x, y, z, w) ({ \
125
register float __x __asm__("fr4") = (x); \
126
register float __y __asm__("fr5") = (y); \
127
register float __z __asm__("fr6") = (z); \
128
register float __w __asm__("fr7") = (w); \
129
__asm__ __volatile__( \
130
"fipr fv4,fv4" \
131
: "+f" (__w) \
132
: "f" (__x), "f" (__y), "f" (__z), "f" (__w) \
133
); \
134
__w; })
135
136
/** \endcond */
137
138
/** \return v1 dot v2 (inner product) */
139
extern
inline
float
fipr
(
float
x,
float
y,
float
z,
float
w,
140
float
a,
float
b,
float
c,
float
d) {
141
return
__fipr(x, y, z, w, a, b, c, d);
142
}
143
144
/**
145
\brief Floating point inner product w/self (square of vector magnitude)
146
\return v1 dot v1 (square of magnitude)
147
*/
148
extern
inline
float
fipr_magnitude_sqr
(
float
x,
float
y,
float
z,
float
w) {
149
return
__fipr_magnitude_sqr(x, y, z, w);
150
}
151
152
/**
153
\brief Floating point sine
154
\param r a floating point number between 0 and 2*PI
155
\return sin(r), where r is [0..2*PI]
156
*/
157
extern
inline
float
fsin
(
float
r) {
158
return
__fsin(r);
159
}
160
161
/**
162
\brief Floating point cosine
163
\param r a floating point number between 0 and 2*PI
164
\return cos(r), where r is [0..2*PI]
165
*/
166
extern
inline
float
fcos
(
float
r) {
167
return
__fcos(r);
168
}
169
170
/**
171
\brief Floating point tangent
172
\param r a floating point number between 0 and 2*PI
173
\return tan(r), where r is [0..2*PI]
174
*/
175
extern
inline
float
ftan
(
float
r) {
176
return
__ftan(r);
177
}
178
179
/**
180
\brief Integer sine
181
\param d an integer between 0 and 65535
182
\return sin(d), where d is [0..65535]
183
*/
184
extern
inline
float
fisin
(
int
d) {
185
return
__fisin(d);
186
}
187
188
/**
189
\brief Integer cosine
190
\param d an integer between 0 and 65535
191
\return cos(d), where d is [0..65535]
192
*/
193
extern
inline
float
ficos
(
int
d) {
194
return
__ficos(d);
195
}
196
197
/**
198
\brief Integer tangent
199
\param d an integer between 0 and 65535
200
\return tan(d), where d is [0..65535]
201
*/
202
extern
inline
float
fitan
(
int
d) {
203
return
__fitan(d);
204
}
205
206
/**
207
\brief Floating point square root
208
\return sqrt(f)
209
*/
210
extern
inline
float
fsqrt
(
float
f) {
211
return
__fsqrt(f);
212
}
213
214
/**
215
\return 1.0f / sqrt(f)
216
*/
217
extern
inline
float
frsqrt
(
float
f) {
218
return
__frsqrt(f);
219
}
220
221
__END_DECLS
222
223
#endif
/* __DC_FMATH_H */
224
Generated by
1.8.1.1