18#ifndef __DC_FMATH_BASE_H
19#define __DC_FMATH_BASE_H
32#define F_PI 3.1415926f
36 ({ float __value, __arg = (x), __scale = 10430.37835f; \
37 __asm__("fmul %2,%1\n\t" \
41 : "=f" (__value), "+&f" (__scale) \
43 : "fpul", "fr0", "fr1"); \
47 ({ float __value, __arg = (x), __scale = 10430.37835f; \
48 __asm__("fmul %2,%1\n\t" \
52 : "=f" (__value), "+&f" (__scale) \
54 : "fpul", "fr0", "fr1"); \
58 ({ float __value, __arg = (x), __scale = 10430.37835f; \
59 __asm__("fmul %2,%1\n\t" \
64 : "=f" (__value), "+&f" (__scale) \
66 : "fpul", "fr0", "fr1"); \
71 ({ float __value, __arg = (x); \
72 __asm__("lds %1,fpul\n\t" \
77 : "fpul", "fr0", "fr1"); \
81 ({ float __value, __arg = (x); \
82 __asm__("lds %1,fpul\n\t" \
87 : "fpul", "fr0", "fr1"); \
91 ({ float __value, __arg = (x); \
92 __asm__("lds %1,fpul\n\t" \
98 : "fpul", "fr0", "fr1"); \
101#define __fsincos(r, s, c) \
102 ({ register float __r __asm__("fr10") = r; \
103 register float __a __asm__("fr11") = 182.04444443f; \
104 __asm__("fmul fr11, fr10\n\t" \
105 "ftrc fr10, fpul\n\t" \
106 "fsca fpul, dr10\n\t" \
107 : "+f" (__r), "+f" (__a) \
108 : "0" (__r), "1" (__a) \
112#define __fsincosr(r, s, c) \
113 ({ register float __r __asm__("fr10") = r; \
114 register float __a __asm__("fr11") = 10430.37835f; \
115 __asm__("fmul fr11, fr10\n\t" \
116 "ftrc fr10, fpul\n\t" \
117 "fsca fpul, dr10\n\t" \
118 : "+f" (__r), "+f" (__a) \
119 : "0" (__r), "1" (__a) \
124 ({ float __arg = (x); \
125 __asm__("fsqrt %0\n\t" \
126 : "=f" (__arg) : "0" (__arg)); \
130 ({ float __arg = (x); \
131 __asm__("fsrra %0\n\t" \
132 : "=f" (__arg) : "0" (__arg)); \
136#define __fipr(x, y, z, w, a, b, c, d) ({ \
137 register float __x __asm__(KOS_FPARG(0)) = (x); \
138 register float __y __asm__(KOS_FPARG(1)) = (y); \
139 register float __z __asm__(KOS_FPARG(2)) = (z); \
140 register float __w __asm__(KOS_FPARG(3)) = (w); \
141 register float __a __asm__(KOS_FPARG(4)) = (a); \
142 register float __b __asm__(KOS_FPARG(5)) = (b); \
143 register float __c __asm__(KOS_FPARG(6)) = (c); \
144 register float __d __asm__(KOS_FPARG(7)) = (d); \
145 __asm__ __volatile__( \
147 : "+f" (KOS_SH4_SINGLE_ONLY ? __w : __z) \
148 : "f" (__x), "f" (__y), "f" (__z), "f" (__w), \
149 "f" (__a), "f" (__b), "f" (__c), "f" (__d) \
151 KOS_SH4_SINGLE_ONLY ? __w : __z; })
154#define __fipr_magnitude_sqr(x, y, z, w) ({ \
155 register float __x __asm__(KOS_FPARG(0)) = (x); \
156 register float __y __asm__(KOS_FPARG(1)) = (y); \
157 register float __z __asm__(KOS_FPARG(2)) = (z); \
158 register float __w __asm__(KOS_FPARG(3)) = (w); \
159 __asm__ __volatile__( \
161 : "+f" (KOS_SH4_SINGLE_ONLY ? __w : __z) \
162 : "f" (__x), "f" (__y), "f" (__z), "f" (__w) \
164 KOS_SH4_SINGLE_ONLY ? __w : __z; })
Macros for getting argument registers in inline assembly.
Various common macros used throughout the codebase.