From d0ae3caca5828675335d3b19ab5dd987e7369b23 Mon Sep 17 00:00:00 2001 From: Tim Blechmann Date: Wed, 14 Jul 2004 16:21:44 +0000 Subject: This commit was generated by cvs2svn to compensate for changes in r1857, which included commits to RCS files with non-trunk default branches. svn path=/trunk/externals/tb/; revision=1858 --- sc4pd/headers/common/SC_Altivec.h | 118 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 sc4pd/headers/common/SC_Altivec.h (limited to 'sc4pd/headers/common/SC_Altivec.h') diff --git a/sc4pd/headers/common/SC_Altivec.h b/sc4pd/headers/common/SC_Altivec.h new file mode 100644 index 0000000..8ae3f66 --- /dev/null +++ b/sc4pd/headers/common/SC_Altivec.h @@ -0,0 +1,118 @@ +/* + SuperCollider real time audio synthesis system + Copyright (c) 2003 James McCartney. All rights reserved. + http://www.audiosynth.com + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _SC_Altivec_ +#define _SC_Altivec_ + +#if defined(SC_LINUX) && defined(__ALTIVEC__) +# include +#endif + +#if __VEC__ + +typedef vector signed int vint32; +typedef vector unsigned int vuint32; +typedef vector float vfloat32; + +// Since gcc 3.3 vector initializers are surrounded by brackets. +#if defined(__GNUC__) && (__GNUC__ >= 3) && (__GNUC_MINOR__ >= 3) +# define vinit(x) { x, x, x, x } +#else +# define vinit(x) ( x ) +#endif + +//#define vload(x) (*vtempptr = (x), vec_splat(vtemp,0)) +#define define_vtemp vfloat32 vtemp; float *vtempptr = (float*)&vtemp; +#define define_vones vfloat32 vones = vec_ctf(vec_splat_s32(1),0); +#define define_vzero vfloat32 vzero = (vfloat32)vec_splat_s32(0); +#define vi0123 (vec_unpackh(vec_unpackh((vector signed char)vec_lvsl(0,(int*)0)))) +#define v0123 (vec_ctf(vec_unpackh(vec_unpackh((vector signed char)vec_lvsl(0,(int*)0))), 0)) +#define v0123_4ths (vec_ctf(vec_unpackh(vec_unpackh((vector signed char)vec_lvsl(0,(int*)0))), 2)) +#define vstart(x, vslope) (vec_madd(vslope, v0123_4ths, vload(x))) + +#define vec_not(a) (vtemp = (a); vec_nor(vtemp, vtemp)) +#define vec_cmplt(a, b) (vec_cmpgt(b, a)) +#define vec_cmple(a, b) (vec_cmpge(b, a)) +#define vec_mul(a, b) (vec_madd(a, b, vzero)) +#define vec_2sComp(x) (vec_sub(vec_sub (x, x), x)) + +#define USEVEC (ft->mAltivecAvailable && !(BUFLENGTH & 3)) + +typedef union vec_union { + int32 i[4]; + float32 f[4]; + vint32 vi; + vfloat32 vf; +} vec_union; + +inline vfloat32 vload( float f ) +{ + vec_union temp; + temp.f[0] = f; + return vec_splat( vec_lde( 0, temp.f ), 0 ); +} + +inline vint32 vload( int32 i ) +{ + vec_union temp; + temp.i[0] = i; + return vec_splat( vec_lde( 0, temp.i ), 0 ); +} + +inline vint32 vload( int32 a, int32 b, int32 c, int32 d ) +{ + vec_union temp; + temp.i[0] = a; + temp.i[1] = b; + temp.i[2] = c; + temp.i[3] = d; + return temp.vi; +} + +inline vector float vec_float_1( void ) +{ + return vec_ctf( vec_splat_u32(1), 0); +} + +inline vector float vec_reciprocal( vector float v ) +{ + vector float reciprocal = vec_re( v ); + return vec_madd( reciprocal, vec_nmsub( reciprocal, v, vec_float_1()), reciprocal ); //Newton Rapheson refinement +} + +#define vec_div(a, b) vec_mul(a, vec_reciprocal(b)) + +// seed = ((seed & mask) << shift1) ^ (((seed << shift2) ^ seed) >> shift3); + +#define define_trshifts \ + vuint32 trmask = ((vuint32)(0xFFFFFFFE,0xFFFFFFF8,0xFFFFFFF0,0)); \ + vuint32 trshift1 = ((vuint32)(12, 14, 7, 0)); \ + vuint32 trshift2 = ((vuint32)(13, 2, 3, 0)); \ + vuint32 trshift3 = ((vuint32)(19, 25, 11, 0)); + +inline vuint32 trands(vuint32 seed, vuint32 trmask, vuint32 shift1, vuint32 shift2, vuint32 shift3) +{ + return vec_xor(vec_sl(vec_and(seed, trmask),shift1), vec_sr(vec_xor(vec_sl(seed,shift2),seed),shift3)); +} + +#endif +#endif + + -- cgit v1.2.1