/* SIMD math library functions for both the PowerPC (PPU) and the SPU. Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the Sony Computer Entertainment Inc nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef ___SIMD_MATH_H___ #define ___SIMD_MATH_H___ #define __SIMD_MATH_HAVE_VECTOR_f4 0 #define __SIMD_MATH_HAVE_VECTOR_i4 0 #define __SIMD_MATH_HAVE_VECTOR_d2 0 #define __SIMD_MATH_HAVE_VECTOR_ll2 0 #ifdef __SPU__ /* SPU has vector float, vector double, vector {un,}signed long long, and vector {un,signed} int. */ #include #undef __SIMD_MATH_HAVE_VECTOR_f4 #define __SIMD_MATH_HAVE_VECTOR_f4 1 #undef __SIMD_MATH_HAVE_VECTOR_i4 #define __SIMD_MATH_HAVE_VECTOR_i4 1 #undef __SIMD_MATH_HAVE_VECTOR_d2 #define __SIMD_MATH_HAVE_VECTOR_d2 1 #undef __SIMD_MATH_HAVE_VECTOR_ll2 #define __SIMD_MATH_HAVE_VECTOR_ll2 1 #elif defined(__ALTIVEC__) #include /* PPU has vector float, and vector int. */ #undef __SIMD_MATH_HAVE_VECTOR_f4 #define __SIMD_MATH_HAVE_VECTOR_f4 1 #undef __SIMD_MATH_HAVE_VECTOR_i4 #define __SIMD_MATH_HAVE_VECTOR_i4 1 #else /* Just in case someone tries to include this in say a i686 build. */ #error "No functions defined" #endif #ifdef __cplusplus extern "C" { #endif /* Types */ #if __SIMD_MATH_HAVE_VECTOR_i4 typedef struct divi4_s { vector signed int quot; vector signed int rem; } divi4_t; #endif #if __SIMD_MATH_HAVE_VECTOR_i4 typedef struct divu4_s { vector unsigned int quot; vector unsigned int rem; } divu4_t; #endif #if __SIMD_MATH_HAVE_VECTOR_ll2 typedef struct lldivi2_s { vector signed long long quot; vector signed long long rem; } lldivi2_t; #endif #if __SIMD_MATH_HAVE_VECTOR_ll2 typedef struct lldivu2_s { vector unsigned long long quot; vector unsigned long long rem; } lldivu2_t; #endif #if __SIMD_MATH_HAVE_VECTOR_f4 && __SIMD_MATH_HAVE_VECTOR_ll2 typedef struct llroundf4_s { vector signed long long vll[2]; } llroundf4_t; #endif /* integer divide */ #if __SIMD_MATH_HAVE_VECTOR_i4 divi4_t divi4 (vector signed int, vector signed int); #endif #if __SIMD_MATH_HAVE_VECTOR_i4 divu4_t divu4 (vector unsigned int, vector unsigned int); #endif #if __SIMD_MATH_HAVE_VECTOR_ll2 lldivi2_t lldivi2 (vector signed long long, vector signed long long); #endif #if __SIMD_MATH_HAVE_VECTOR_ll2 lldivu2_t lldivu2 (vector unsigned long long, vector unsigned long long); #endif /* abs value */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float fabsf4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double fabsd2 (vector double); #endif #if __SIMD_MATH_HAVE_VECTOR_i4 vector signed int absi4 (vector signed int); #endif #if __SIMD_MATH_HAVE_VECTOR_ll2 vector signed long long llabsi2 (vector signed long long); #endif /* negate value */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float negatef4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double negated2 (vector double); #endif #if __SIMD_MATH_HAVE_VECTOR_i4 vector signed int negatei4 (vector signed int); #endif #if __SIMD_MATH_HAVE_VECTOR_ll2 vector signed long long negatell2 (vector signed long long); #endif /* trunc */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float truncf4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double trund2 (vector double); #endif /* floor */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float floorf4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double floord2 (vector double); #endif /* ceil */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float ceilf4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double ceild2 (vector double); #endif /* exp */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float expf4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double expd2 (vector double); #endif /* exp */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float exp2f4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double exp2d2 (vector double); #endif /* expm1 */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float expm1f4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double expm1d2 (vector double); #endif /* log */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float logf4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double logd2 (vector double); #endif /* log10 */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float log10f4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double log10d2 (vector double); #endif /* log1p */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float log1pf4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double log1pd2 (vector double); #endif /* pow */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float powf4 (vector float, vector float); #endif /* fma */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float fmaf4 (vector float, vector float, vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double fmad2 (vector double, vector double, vector double); #endif /* fmax */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float fmaxf4 (vector float, vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double fmaxd2 (vector double, vector double); #endif /* fmin */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float fminf4 (vector float, vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double fmind2 (vector double, vector double); #endif /* fdim */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float fdimf4 (vector float, vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double fdimd2 (vector double, vector double); #endif /* fmod */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float fmodf4 (vector float, vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double fmodd2 (vector double, vector double); #endif /* log2 */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float log2f4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double log2d2 (vector double); #endif /* logb */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float logbf4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double logbd2 (vector double); #endif /* ilogb */ #if __SIMD_MATH_HAVE_VECTOR_f4 && __SIMD_MATH_HAVE_VECTOR_i4 vector signed int ilogbf4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 && __SIMD_MATH_HAVE_VECTOR_ll2 vector signed long long ilogbd2 (vector double); #endif /* modf */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float modff4 (vector float, vector float *); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double modfd2 (vector double, vector double *); #endif /* sqrt */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float sqrtf4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double sqrtd2 (vector double); #endif /* hypot */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float hypotf4 (vector float, vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double hypotd2 (vector double, vector double); #endif /* cbrtf4 */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float cbrtf4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double cbrtd2 (vector double); #endif /* sin */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float sinf4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double sind2 (vector double); #endif /* asin */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float asinf4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double asind2 (vector double); #endif /* divide */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float divf4 (vector float, vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double divd2 (vector double, vector double); #endif /* remainder */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float remainderf4 (vector float, vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double remainderd2 (vector double, vector double); #endif #if __SIMD_MATH_HAVE_VECTOR_f4 && __SIMD_MATH_HAVE_VECTOR_i4 vector float remquof4(vector float x, vector float y, vector signed int *quo); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 && __SIMD_MATH_HAVE_VECTOR_ll2 vector double remquod2(vector double x, vector double y, vector signed long long *quo); #endif /* copysign */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float copysignf4 (vector float, vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double copysignd2 (vector double, vector double); #endif /* cos */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float cosf4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double cosd2 (vector double); #endif /* acos */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float acosf4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double acosd2 (vector double); #endif /* atan */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float atanf4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double atand2 (vector double); #endif /* atan2 */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float atan2f4 (vector float, vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double atan2d2 (vector double, vector double); #endif /* tan */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float tanf4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double tand2 (vector double); #endif /* sincos */ #if __SIMD_MATH_HAVE_VECTOR_f4 void sincosf4 (vector float, vector float *, vector float *); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 void sincosd2 (vector double, vector double *, vector double *); #endif /* recip */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float recipf4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double recipd2 (vector double); #endif /* rsqrt */ #if __SIMD_MATH_HAVE_VECTOR_f4 vector float rsqrtf4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double rsqrtd2 (vector double); #endif /* frexp */ #if __SIMD_MATH_HAVE_VECTOR_f4 && __SIMD_MATH_HAVE_VECTOR_i4 vector float frexpf4 (vector float, vector signed int *); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 && __SIMD_MATH_HAVE_VECTOR_ll2 vector double frexpd2 (vector double, vector signed long long *); #endif /* ldexp */ #if __SIMD_MATH_HAVE_VECTOR_f4 && __SIMD_MATH_HAVE_VECTOR_i4 vector float ldexpf4 (vector float, vector signed int ); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 && __SIMD_MATH_HAVE_VECTOR_ll2 vector double ldexpd2 (vector double, vector signed long long ); #endif #if __SIMD_MATH_HAVE_VECTOR_f4 && __SIMD_MATH_HAVE_VECTOR_i4 vector float scalbnf4(vector float x, vector signed int n); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 && __SIMD_MATH_HAVE_VECTOR_ll2 vector double scalbllnd2 (vector double, vector signed long long ); #endif /* isnan */ #if __SIMD_MATH_HAVE_VECTOR_f4 && __SIMD_MATH_HAVE_VECTOR_i4 vector unsigned int isnanf4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 && __SIMD_MATH_HAVE_VECTOR_ll2 vector unsigned long long isnand2 (vector double); #endif /* isinf */ #if __SIMD_MATH_HAVE_VECTOR_f4 && __SIMD_MATH_HAVE_VECTOR_i4 vector unsigned int isinff4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 && __SIMD_MATH_HAVE_VECTOR_ll2 vector unsigned long long isinfd2 (vector double); #endif /* isfinite */ #if __SIMD_MATH_HAVE_VECTOR_f4 && __SIMD_MATH_HAVE_VECTOR_i4 vector unsigned int isfinitef4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 && __SIMD_MATH_HAVE_VECTOR_ll2 vector unsigned long long isfinited2 (vector double); #endif /* isnormal */ #if __SIMD_MATH_HAVE_VECTOR_f4 && __SIMD_MATH_HAVE_VECTOR_i4 vector unsigned int isnormalf4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 && __SIMD_MATH_HAVE_VECTOR_ll2 vector unsigned long long isnormald2 (vector double); #endif /* isunordered */ #if __SIMD_MATH_HAVE_VECTOR_f4 && __SIMD_MATH_HAVE_VECTOR_i4 vector unsigned int isunorderedf4 (vector float, vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 && __SIMD_MATH_HAVE_VECTOR_ll2 vector unsigned long long isunorderedd2 (vector double, vector double); #endif /* is0denorm */ #if __SIMD_MATH_HAVE_VECTOR_f4 && __SIMD_MATH_HAVE_VECTOR_i4 vector unsigned int is0denormf4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 && __SIMD_MATH_HAVE_VECTOR_ll2 vector unsigned long long is0denormd2 (vector double); #endif /* signbit */ #if __SIMD_MATH_HAVE_VECTOR_f4 && __SIMD_MATH_HAVE_VECTOR_i4 vector unsigned int signbitf4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 && __SIMD_MATH_HAVE_VECTOR_ll2 vector unsigned long long signbitd2 (vector double); #endif /* isequal */ #if __SIMD_MATH_HAVE_VECTOR_f4 && __SIMD_MATH_HAVE_VECTOR_i4 vector unsigned int isequalf4 (vector float, vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 && __SIMD_MATH_HAVE_VECTOR_ll2 vector unsigned long long isequald2 (vector double, vector double); #endif /* islessgreater */ #if __SIMD_MATH_HAVE_VECTOR_f4 && __SIMD_MATH_HAVE_VECTOR_i4 vector unsigned int islessgreaterf4 (vector float, vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 && __SIMD_MATH_HAVE_VECTOR_ll2 vector unsigned long long islessgreaterd2 (vector double, vector double); #endif /* isless */ #if __SIMD_MATH_HAVE_VECTOR_f4 && __SIMD_MATH_HAVE_VECTOR_i4 vector unsigned int islessf4 (vector float, vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 && __SIMD_MATH_HAVE_VECTOR_ll2 vector unsigned long long islessd2 (vector double, vector double); #endif /* isgreater */ #if __SIMD_MATH_HAVE_VECTOR_f4 && __SIMD_MATH_HAVE_VECTOR_i4 vector unsigned int isgreaterf4 (vector float, vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 && __SIMD_MATH_HAVE_VECTOR_ll2 vector unsigned long long isgreaterd2 (vector double, vector double); #endif /* islessequal */ #if __SIMD_MATH_HAVE_VECTOR_f4 && __SIMD_MATH_HAVE_VECTOR_i4 vector unsigned int islessequalf4 (vector float, vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 && __SIMD_MATH_HAVE_VECTOR_ll2 vector unsigned long long islessequald2 (vector double, vector double); #endif /* isgreaterequal */ #if __SIMD_MATH_HAVE_VECTOR_f4 && __SIMD_MATH_HAVE_VECTOR_i4 vector unsigned int isgreaterequalf4 (vector float, vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 && __SIMD_MATH_HAVE_VECTOR_ll2 vector unsigned long long isgreaterequald2 (vector double, vector double); #endif /* fpclassify */ #if __SIMD_MATH_HAVE_VECTOR_f4 && __SIMD_MATH_HAVE_VECTOR_i4 vector signed int fpclassifyf4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 && __SIMD_MATH_HAVE_VECTOR_ll2 vector signed long long fpclassifyd2 (vector double); #endif /* round */ #if __SIMD_MATH_HAVE_VECTOR_d2 && __SIMD_MATH_HAVE_VECTOR_ll2 vector signed long long llroundd2 (vector double); #endif #if __SIMD_MATH_HAVE_VECTOR_f4 && __SIMD_MATH_HAVE_VECTOR_ll2 llroundf4_t llroundf4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_f4 && __SIMD_MATH_HAVE_VECTOR_ll2 llroundf4_t llrintf4 (vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 && __SIMD_MATH_HAVE_VECTOR_ll2 vector signed long long llrintd2 (vector double); #endif #if __SIMD_MATH_HAVE_VECTOR_f4 vector float roundf4(vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_f4 && __SIMD_MATH_HAVE_VECTOR_i4 vector signed int iroundf4(vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_f4 vector float rintf4(vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_f4 && __SIMD_MATH_HAVE_VECTOR_i4 vector signed int irintf4(vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double nextafterd2 (vector double, vector double); #endif #if __SIMD_MATH_HAVE_VECTOR_f4 vector float nextafterf4(vector float, vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double nearbyintd2 (vector double); #endif #if __SIMD_MATH_HAVE_VECTOR_f4 vector float nearbyintf4(vector float); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double truncd2 (vector double); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double roundd2 (vector double); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double rintd2 (vector double); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double ceild2(vector double); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double floord2(vector double); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double fmodd2(vector double, vector double); #endif #if __SIMD_MATH_HAVE_VECTOR_d2 vector double remainderd2(vector double, vector double); #endif #ifdef __cplusplus } #endif #endif