![]() |
pl-nk v0.4.5
Plonk|Plink|Plank are a set of cross-platform C/C++ frameworks for audio software development
|
00001 /* 00002 ------------------------------------------------------------------------------- 00003 This file is part of the Plink, Plonk, Plank libraries 00004 by Martin Robinson 00005 00006 http://code.google.com/p/pl-nk/ 00007 00008 Copyright University of the West of England, Bristol 2011-14 00009 All rights reserved. 00010 00011 Redistribution and use in source and binary forms, with or without 00012 modification, are permitted provided that the following conditions are met: 00013 00014 * Redistributions of source code must retain the above copyright 00015 notice, this list of conditions and the following disclaimer. 00016 * Redistributions in binary form must reproduce the above copyright 00017 notice, this list of conditions and the following disclaimer in the 00018 documentation and/or other materials provided with the distribution. 00019 * Neither the name of University of the West of England, Bristol nor 00020 the names of its contributors may be used to endorse or promote products 00021 derived from this software without specific prior written permission. 00022 00023 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 00024 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 00025 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 00026 DISCLAIMED. IN NO EVENT SHALL UNIVERSITY OF THE WEST OF ENGLAND, BRISTOL BE 00027 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 00028 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 00029 GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 00030 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00031 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 00032 OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00033 00034 This software makes use of third party libraries. For more information see: 00035 doc/license.txt included in the distribution. 00036 ------------------------------------------------------------------------------- 00037 */ 00038 00039 #ifndef PLANK_VECTORS_H 00040 #define PLANK_VECTORS_H 00041 00042 #include "../plank_Maths.h" 00043 00051 #define PLANK_VECTOR_NAMEINTERNAL(OP,TYPECODE,SUFFIX) pl_Vector##OP##TYPECODE##SUFFIX 00052 00053 #define PLANK_VECTORUNARYOP_NAME(OP,TYPECODE) PLANK_VECTOR_NAMEINTERNAL(OP,TYPECODE,_NN) 00054 00055 #define PLANK_VECTORUNARYOP_DEFINE(OP,TYPECODE) \ 00056 \ 00062 static inline void PLANK_VECTORUNARYOP_NAME(OP,TYPECODE) (Plank##TYPECODE *result, const Plank##TYPECODE* a, PlankUL N) {\ 00063 PlankUL i; for (i = 0; i < N; PLANK_INC(i)) { result[i] = pl_##OP##TYPECODE (a[i]); }\ 00064 } 00065 00066 #define PLANK_VECTORBINARYOPVECTOR_NAME(OP,TYPECODE) PLANK_VECTOR_NAMEINTERNAL(OP,TYPECODE,_NNN) 00067 #define PLANK_VECTORBINARYOPSCALAR_NAME(OP,TYPECODE) PLANK_VECTOR_NAMEINTERNAL(OP,TYPECODE,_NN1) 00068 #define PLANK_SCALARBINARYOPVECTOR_NAME(OP,TYPECODE) PLANK_VECTOR_NAMEINTERNAL(OP,TYPECODE,_N1N) 00069 00070 #define PLANK_VECTORBINARYOPVECTOR_DEFINE(OP,TYPECODE) \ 00071 \ 00078 static inline void PLANK_VECTORBINARYOPVECTOR_NAME(OP,TYPECODE) (Plank##TYPECODE *result, const Plank##TYPECODE* a, const Plank##TYPECODE* b, PlankUL N) {\ 00079 PlankUL i; for (i = 0; i < N; PLANK_INC(i)) { result[i] = pl_##OP##TYPECODE (a[i], b[i]); }\ 00080 } 00081 00082 #define PLANK_VECTORBINARYOPSCALAR_DEFINE(OP,TYPECODE) \ 00083 \ 00090 static inline void PLANK_VECTORBINARYOPSCALAR_NAME(OP,TYPECODE) (Plank##TYPECODE *result, const Plank##TYPECODE* a, Plank##TYPECODE b, PlankUL N) {\ 00091 PlankUL i; for (i = 0; i < N; PLANK_INC(i)) { result[i] = pl_##OP##TYPECODE (a[i], b); }\ 00092 } 00093 00094 #define PLANK_SCALARBINARYOPVECTOR_DEFINE(OP,TYPECODE) \ 00095 \ 00102 static inline void PLANK_SCALARBINARYOPVECTOR_NAME(OP,TYPECODE) (Plank##TYPECODE *result, Plank##TYPECODE a, const Plank##TYPECODE* b, PlankUL N) {\ 00103 PlankUL i; for (i = 0; i < N; PLANK_INC(i)) { result[i] = pl_##OP##TYPECODE (a, b[i]); }\ 00104 } 00105 00106 00107 #define PLANK_VECTORBINARYOP_DEFINE(OP,TYPECODE) \ 00108 PLANK_VECTORBINARYOPVECTOR_DEFINE(OP,TYPECODE)\ 00109 PLANK_VECTORBINARYOPSCALAR_DEFINE(OP,TYPECODE)\ 00110 PLANK_SCALARBINARYOPVECTOR_DEFINE(OP,TYPECODE) 00111 00112 #define PLANK_VECTORMULADD_NAME(TYPECODE) PLANK_VECTOR_NAMEINTERNAL(MulAdd,TYPECODE,_NNNN) 00113 #define PLANK_VECTORMULADDINPLACE_NAME(TYPECODE) PLANK_VECTOR_NAMEINTERNAL(MulAdd,TYPECODE,_NNN) 00114 #define PLANK_VECTORMULSCALARADD_NAME(TYPECODE) PLANK_VECTOR_NAMEINTERNAL(MulAdd,TYPECODE,_NNN1) 00115 #define PLANK_VECTORSCALARMULSCALARADD_NAME(TYPECODE) PLANK_VECTOR_NAMEINTERNAL(MulAdd,TYPECODE,_NN11) 00116 #define PLANK_VECTORSCALARMULADD_NAME(TYPECODE) PLANK_VECTOR_NAMEINTERNAL(MulAdd,TYPECODE,_NN1N) 00117 #define PLANK_VECTORADDVECTORMUL_NAME(TYPECODE) PLANK_VECTOR_NAMEINTERNAL(AddMul,TYPECODE,_1NN) 00118 00119 00120 #define PLANK_VECTORMULADD_DEFINE(TYPECODE) \ 00121 \ 00128 static inline void PLANK_VECTORMULADD_NAME(TYPECODE) (Plank##TYPECODE *result, const Plank##TYPECODE* input, const Plank##TYPECODE* mul, const Plank##TYPECODE* add, PlankUL N) {\ 00129 PlankUL i; for (i = 0; i < N; PLANK_INC(i)) { result[i] = pl_Add##TYPECODE (pl_Mul##TYPECODE (input[i], mul[i]), add[i]); }\ 00130 } 00131 00132 00133 #define PLANK_VECTORMULADDINPLACE_DEFINE(TYPECODE) \ 00134 \ 00140 static inline void PLANK_VECTORMULADDINPLACE_NAME(TYPECODE) (Plank##TYPECODE *io, const Plank##TYPECODE* mul, const Plank##TYPECODE* add, PlankUL N) {\ 00141 PlankUL i; for (i = 0; i < N; PLANK_INC(i)) { io[i] = pl_Add##TYPECODE (pl_Mul##TYPECODE (io[i], mul[i]), add[i]); }\ 00142 } 00143 00144 #define PLANK_VECTORMULSCALARADD_DEFINE(TYPECODE) \ 00145 \ 00151 static inline void PLANK_VECTORMULSCALARADD_NAME(TYPECODE) (Plank##TYPECODE *result, const Plank##TYPECODE* input, const Plank##TYPECODE* mul, Plank##TYPECODE add, PlankUL N) {\ 00152 PlankUL i; for (i = 0; i < N; PLANK_INC(i)) { result[i] = pl_Add##TYPECODE (pl_Mul##TYPECODE (input[i], mul[i]), add); }\ 00153 } 00154 00155 #define PLANK_VECTORSCALARMULSCALARADD_DEFINE(TYPECODE) \ 00156 \ 00162 static inline void PLANK_VECTORSCALARMULSCALARADD_NAME(TYPECODE) (Plank##TYPECODE *result, const Plank##TYPECODE* input, Plank##TYPECODE mul, Plank##TYPECODE add, PlankUL N) {\ 00163 PlankUL i; for (i = 0; i < N; PLANK_INC(i)) { result[i] = pl_Add##TYPECODE (pl_Mul##TYPECODE (input[i], mul), add); }\ 00164 } 00165 00166 #define PLANK_VECTORSCALARMULADD_DEFINE(TYPECODE) \ 00167 \ 00173 static inline void PLANK_VECTORSCALARMULADD_NAME(TYPECODE) (Plank##TYPECODE *result, const Plank##TYPECODE* input, Plank##TYPECODE mul, const Plank##TYPECODE* add, PlankUL N) {\ 00174 PlankUL i; for (i = 0; i < N; PLANK_INC(i)) { result[i] = pl_Add##TYPECODE (pl_Mul##TYPECODE (input[i], mul), add[i]); }\ 00175 } 00176 00177 #define PLANK_VECTORADDVECTORMUL_DEFINE(TYPECODE)\ 00178 static inline void PLANK_VECTORADDVECTORMUL_NAME(TYPECODE) (Plank##TYPECODE *result, const Plank##TYPECODE* a, const Plank##TYPECODE* b, PlankUL N) {\ 00179 PlankUL i;\ 00180 *result = (Plank##TYPECODE)0;\ 00181 for (i = 0; i < N; PLANK_INC(i)) { *result = pl_Add##TYPECODE (pl_Mul##TYPECODE (a[i], b[i]), *result); }\ 00182 } 00183 00184 00185 00186 #define PLANK_VECTORZMUL_NAME(TYPECODE) PLANK_VECTOR_NAMEINTERNAL(ZMul,TYPECODE,_ZNNNNN) 00187 00188 #define PLANK_VECTORZMUL_DEFINE(TYPECODE) \ 00189 \ 00197 static inline void PLANK_VECTORZMUL_NAME(TYPECODE) (Plank##TYPECODE *resultReal, Plank##TYPECODE *resultImag,\ 00198 const Plank##TYPECODE* leftReal, const Plank##TYPECODE* leftImag,\ 00199 const Plank##TYPECODE* rightReal, const Plank##TYPECODE* rightImag,\ 00200 PlankUL N) {\ 00201 PlankUL i;\ 00202 for (i = 0; i < N; PLANK_INC(i)) {\ 00203 resultReal[i] = leftReal[i] * rightReal[i] - leftImag[i] * rightImag[i];\ 00204 resultImag[i] = leftReal[i] * rightImag[i] + leftImag[i] * rightReal[i];\ 00205 }\ 00206 } 00207 00208 #define PLANK_VECTORFILL_NAME(TYPECODE) PLANK_VECTOR_NAMEINTERNAL(Fill,TYPECODE,_N1) 00209 00210 #define PLANK_VECTORFILL_DEFINE(TYPECODE) \ 00211 \ 00212 static inline void PLANK_VECTORFILL_NAME(TYPECODE) (Plank##TYPECODE *result, Plank##TYPECODE value, PlankUL N) {\ 00213 PlankUL i; for (i = 0; i < N; PLANK_INC(i)) { result[i] = value; }\ 00214 } 00215 00216 #define PLANK_VECTORCLEAR_NAME(TYPECODE) PLANK_VECTOR_NAMEINTERNAL(Clear,TYPECODE,_N) 00217 00218 #define PLANK_VECTORCLEAR_DEFINE(TYPECODE) \ 00219 \ 00220 static inline void PLANK_VECTORCLEAR_NAME(TYPECODE) (Plank##TYPECODE *result, PlankUL N) {\ 00221 PlankUL i; for (i = 0; i < N; PLANK_INC(i)) { result[i] = (Plank##TYPECODE)0; }\ 00222 } 00223 00224 #define PLANK_VECTORRAMP_NAME(TYPECODE) PLANK_VECTOR_NAMEINTERNAL(Ramp,TYPECODE,_N11) 00225 00226 #define PLANK_VECTORRAMP_DEFINE(TYPECODE) \ 00227 \ 00229 static inline void PLANK_VECTORRAMP_NAME(TYPECODE) (Plank##TYPECODE *result, Plank##TYPECODE a, Plank##TYPECODE b, PlankUL N) {\ 00230 PlankUL i; for (i = 0; i < N; PLANK_INC(i)) { result[i] = a; a = a + b; }\ 00231 } 00232 00233 #define PLANK_VECTORLINE_NAME(TYPECODE) PLANK_VECTOR_NAMEINTERNAL(Line,TYPECODE,_N11) 00234 00235 #define PLANK_VECTORLINE_DEFINE(TYPECODE) \ 00236 \ 00238 static inline void PLANK_VECTORLINE_NAME(TYPECODE) (Plank##TYPECODE *result, Plank##TYPECODE a, Plank##TYPECODE b, PlankUL N) {\ 00239 PLANK_VECTORRAMP_NAME(TYPECODE) (result, a, (b - a) / (Plank##TYPECODE)(N - 1), N);\ 00240 } 00241 00242 #define PLANK_VECTORLOOKUP_NAME(TYPECODE) PLANK_VECTOR_NAMEINTERNAL(Lookup,TYPECODE,_NnN) 00243 00244 #define PLANK_VECTORLOOKUP_DEFINE(TYPECODE) \ 00245 \ 00252 static inline void PLANK_VECTORLOOKUP_NAME(TYPECODE) (Plank##TYPECODE *result, Plank##TYPECODE *table, PlankUL n, Plank##TYPECODE *index, PlankUL N) {\ 00253 PlankUL i; PLANK_UNUSED(n); for (i = 0; i < N; PLANK_INC(i)) { result[i] = pl_Lookup##TYPECODE (table, index[i]); }\ 00254 } 00255 00256 00257 #define PLANK_VECTORCONVERT_NAME(DSTTYPECODE,SRCTYPECODE)\ 00258 PLANK_VECTOR_NAMEINTERNAL(Convert,SRCTYPECODE##2##DSTTYPECODE,_NN) 00259 00260 #define PLANK_VECTORCONVERTROUND_NAME(DSTTYPECODE,SRCTYPECODE)\ 00261 PLANK_VECTOR_NAMEINTERNAL(ConvertRound,SRCTYPECODE##2##DSTTYPECODE,_NN) 00262 00263 00264 #define PLANK_VECTORCONVERT_DEFINE(DSTTYPECODE,SRCTYPECODE) \ 00265 \ 00266 static inline void PLANK_VECTORCONVERT_NAME(DSTTYPECODE,SRCTYPECODE) (Plank##DSTTYPECODE *result, const Plank##SRCTYPECODE* a, PlankUL N) {\ 00267 PlankUL i; for (i = 0; i < N; PLANK_INC(i)) { result[i] = (Plank##DSTTYPECODE)a[i]; }\ 00268 } 00269 00270 #define PLANK_VECTORCONVERTROUNDF_DEFINE(SRCTYPECODE) \ 00271 \ 00272 static inline void PLANK_VECTORCONVERTROUND_NAME(F,SRCTYPECODE) (PlankF *result, const Plank##SRCTYPECODE* a, PlankUL N) {\ 00273 PlankUL i; for (i = 0; i < N; PLANK_INC(i)) { result[i] = (PlankF)a[i] + 0.5f; }\ 00274 } 00275 00276 #define PLANK_VECTORCONVERTROUNDD_DEFINE(SRCTYPECODE) \ 00277 \ 00278 static inline void PLANK_VECTORCONVERTROUND_NAME(D,SRCTYPECODE) (PlankD *result, const Plank##SRCTYPECODE* a, PlankUL N) {\ 00279 PlankUL i; for (i = 0; i < N; PLANK_INC(i)) { result[i] = (PlankD)a[i] + 0.5; }\ 00280 } 00281 00282 #define PLANK_VECTORCONVERTERS_DEFINE\ 00283 PLANK_VECTORCONVERT_DEFINE(I,C)\ 00284 PLANK_VECTORCONVERT_DEFINE(S,C)\ 00285 PLANK_VECTORCONVERT_DEFINE(F,C)\ 00286 PLANK_VECTORCONVERT_DEFINE(D,C)\ 00287 PLANK_VECTORCONVERT_DEFINE(LL,C)\ 00288 PLANK_VECTORCONVERT_DEFINE(C,I)\ 00289 PLANK_VECTORCONVERT_DEFINE(S,I)\ 00290 PLANK_VECTORCONVERT_DEFINE(F,I)\ 00291 PLANK_VECTORCONVERT_DEFINE(D,I)\ 00292 PLANK_VECTORCONVERT_DEFINE(LL,I)\ 00293 PLANK_VECTORCONVERT_DEFINE(C,S)\ 00294 PLANK_VECTORCONVERT_DEFINE(I,S)\ 00295 PLANK_VECTORCONVERT_DEFINE(F,S)\ 00296 PLANK_VECTORCONVERT_DEFINE(D,S)\ 00297 PLANK_VECTORCONVERT_DEFINE(LL,S)\ 00298 PLANK_VECTORCONVERT_DEFINE(C,F)\ 00299 PLANK_VECTORCONVERT_DEFINE(I,F)\ 00300 PLANK_VECTORCONVERT_DEFINE(S,F)\ 00301 PLANK_VECTORCONVERT_DEFINE(D,F)\ 00302 PLANK_VECTORCONVERT_DEFINE(LL,F)\ 00303 PLANK_VECTORCONVERT_DEFINE(C,D)\ 00304 PLANK_VECTORCONVERT_DEFINE(I,D)\ 00305 PLANK_VECTORCONVERT_DEFINE(S,D)\ 00306 PLANK_VECTORCONVERT_DEFINE(F,D)\ 00307 PLANK_VECTORCONVERT_DEFINE(LL,D)\ 00308 PLANK_VECTORCONVERT_DEFINE(C,LL)\ 00309 PLANK_VECTORCONVERT_DEFINE(I,LL)\ 00310 PLANK_VECTORCONVERT_DEFINE(S,LL)\ 00311 PLANK_VECTORCONVERT_DEFINE(F,LL)\ 00312 PLANK_VECTORCONVERT_DEFINE(D,LL) 00313 00314 #define PLANK_VECTORCONVERTERSROUND_DEFINE\ 00315 PLANK_VECTORCONVERTROUNDF_DEFINE(C)\ 00316 PLANK_VECTORCONVERTROUNDF_DEFINE(I)\ 00317 PLANK_VECTORCONVERTROUNDF_DEFINE(S)\ 00318 PLANK_VECTORCONVERTROUNDF_DEFINE(LL)\ 00319 PLANK_VECTORCONVERTROUNDD_DEFINE(C)\ 00320 PLANK_VECTORCONVERTROUNDD_DEFINE(I)\ 00321 PLANK_VECTORCONVERTROUNDD_DEFINE(S)\ 00322 PLANK_VECTORCONVERTROUNDD_DEFINE(LL) 00323 00324 // int and float support available 00325 #define PLANK_VECTOR_OPS_COMMON(TYPECODE)\ 00326 PLANK_VECTORFILL_DEFINE(TYPECODE)\ 00327 PLANK_VECTORCLEAR_DEFINE(TYPECODE)\ 00328 PLANK_VECTORRAMP_DEFINE(TYPECODE)\ 00329 PLANK_VECTORLINE_DEFINE(TYPECODE)\ 00330 \ 00331 PLANK_VECTORUNARYOP_DEFINE(Move,TYPECODE)\ 00332 PLANK_VECTORUNARYOP_DEFINE(Inc,TYPECODE)\ 00333 PLANK_VECTORUNARYOP_DEFINE(Dec,TYPECODE)\ 00334 PLANK_VECTORUNARYOP_DEFINE(Neg,TYPECODE)\ 00335 PLANK_VECTORUNARYOP_DEFINE(Abs,TYPECODE)\ 00336 PLANK_VECTORUNARYOP_DEFINE(Squared,TYPECODE)\ 00337 PLANK_VECTORUNARYOP_DEFINE(Cubed,TYPECODE)\ 00338 PLANK_VECTORUNARYOP_DEFINE(Sign,TYPECODE)\ 00339 \ 00340 PLANK_VECTORBINARYOP_DEFINE(Add,TYPECODE)\ 00341 PLANK_VECTORBINARYOP_DEFINE(Sub,TYPECODE)\ 00342 PLANK_VECTORBINARYOP_DEFINE(Mul,TYPECODE)\ 00343 PLANK_VECTORBINARYOP_DEFINE(Div,TYPECODE)\ 00344 PLANK_VECTORBINARYOP_DEFINE(Mod,TYPECODE)\ 00345 PLANK_VECTORBINARYOP_DEFINE(Min,TYPECODE)\ 00346 PLANK_VECTORBINARYOP_DEFINE(Max,TYPECODE)\ 00347 \ 00348 PLANK_VECTORBINARYOP_DEFINE(IsEqualTo,TYPECODE)\ 00349 PLANK_VECTORBINARYOP_DEFINE(IsNotEqualTo,TYPECODE)\ 00350 PLANK_VECTORBINARYOP_DEFINE(IsGreaterThan,TYPECODE)\ 00351 PLANK_VECTORBINARYOP_DEFINE(IsGreaterThanOrEqualTo,TYPECODE)\ 00352 PLANK_VECTORBINARYOP_DEFINE(IsLessThan,TYPECODE)\ 00353 PLANK_VECTORBINARYOP_DEFINE(IsLessThanOrEqualTo,TYPECODE)\ 00354 \ 00355 PLANK_VECTORBINARYOP_DEFINE(SumSqr,TYPECODE)\ 00356 PLANK_VECTORBINARYOP_DEFINE(DifSqr,TYPECODE)\ 00357 PLANK_VECTORBINARYOP_DEFINE(SqrSum,TYPECODE)\ 00358 PLANK_VECTORBINARYOP_DEFINE(SqrDif,TYPECODE)\ 00359 PLANK_VECTORBINARYOP_DEFINE(AbsDif,TYPECODE)\ 00360 PLANK_VECTORBINARYOP_DEFINE(Thresh,TYPECODE)\ 00361 \ 00362 PLANK_VECTORMULADD_DEFINE(TYPECODE)\ 00363 PLANK_VECTORMULADDINPLACE_DEFINE(TYPECODE)\ 00364 PLANK_VECTORMULSCALARADD_DEFINE(TYPECODE)\ 00365 PLANK_VECTORSCALARMULSCALARADD_DEFINE(TYPECODE)\ 00366 PLANK_VECTORSCALARMULADD_DEFINE(TYPECODE)\ 00367 PLANK_VECTORADDVECTORMUL_DEFINE(TYPECODE)\ 00368 \ 00369 PLANK_VECTORLOOKUP_DEFINE(TYPECODE) 00370 00371 // extra ops for float/double (+fixed?) only 00372 #define PLANK_VECTOR_OPS_ALL(TYPECODE)\ 00373 PLANK_VECTOR_OPS_COMMON(TYPECODE)\ 00374 \ 00375 PLANK_VECTORUNARYOP_DEFINE(Log2,TYPECODE)\ 00376 PLANK_VECTORUNARYOP_DEFINE(Reciprocal,TYPECODE)\ 00377 PLANK_VECTORUNARYOP_DEFINE(Sin,TYPECODE)\ 00378 PLANK_VECTORUNARYOP_DEFINE(Cos,TYPECODE)\ 00379 PLANK_VECTORUNARYOP_DEFINE(Tan,TYPECODE)\ 00380 PLANK_VECTORUNARYOP_DEFINE(Asin,TYPECODE)\ 00381 PLANK_VECTORUNARYOP_DEFINE(Acos,TYPECODE)\ 00382 PLANK_VECTORUNARYOP_DEFINE(Atan,TYPECODE)\ 00383 PLANK_VECTORUNARYOP_DEFINE(Sinh,TYPECODE)\ 00384 PLANK_VECTORUNARYOP_DEFINE(Cosh,TYPECODE)\ 00385 PLANK_VECTORUNARYOP_DEFINE(Tanh,TYPECODE)\ 00386 PLANK_VECTORUNARYOP_DEFINE(Sqrt,TYPECODE)\ 00387 PLANK_VECTORUNARYOP_DEFINE(Log,TYPECODE)\ 00388 PLANK_VECTORUNARYOP_DEFINE(Log10,TYPECODE)\ 00389 PLANK_VECTORUNARYOP_DEFINE(Exp,TYPECODE)\ 00390 PLANK_VECTORUNARYOP_DEFINE(Ceil,TYPECODE)\ 00391 PLANK_VECTORUNARYOP_DEFINE(Floor,TYPECODE)\ 00392 PLANK_VECTORUNARYOP_DEFINE(Frac,TYPECODE)\ 00393 PLANK_VECTORUNARYOP_DEFINE(M2F,TYPECODE)\ 00394 PLANK_VECTORUNARYOP_DEFINE(F2M,TYPECODE)\ 00395 PLANK_VECTORUNARYOP_DEFINE(A2dB,TYPECODE)\ 00396 PLANK_VECTORUNARYOP_DEFINE(dB2A,TYPECODE)\ 00397 PLANK_VECTORUNARYOP_DEFINE(D2R,TYPECODE)\ 00398 PLANK_VECTORUNARYOP_DEFINE(R2D,TYPECODE)\ 00399 PLANK_VECTORUNARYOP_DEFINE(Distort,TYPECODE)\ 00400 PLANK_VECTORUNARYOP_DEFINE(Zap,TYPECODE)\ 00401 \ 00402 PLANK_VECTORBINARYOP_DEFINE(Pow,TYPECODE)\ 00403 PLANK_VECTORBINARYOP_DEFINE(Hypot,TYPECODE)\ 00404 PLANK_VECTORBINARYOP_DEFINE(Atan2,TYPECODE) 00405 00407 00408 #if defined(PLANK_VEC_VDSP) //&& !DOXYGEN 00409 #include "plank_vDSP.h" 00410 #elif defined(PLANK_VEC_OTHERLIB) //etc! 00411 #include "some other vector lib" // must define PLANK_VEC_CUSTOM 00412 #endif 00413 00414 #if !defined(PLANK_VEC_CUSTOM) || DOXYGEN 00415 00438 PLANK_VECTOR_OPS_ALL(F) 00439 PLANK_VECTOR_OPS_ALL(D) 00440 PLANK_VECTOR_OPS_COMMON(S) 00441 PLANK_VECTOR_OPS_COMMON(I) 00442 PLANK_VECTOR_OPS_COMMON(LL) 00443 PLANK_VECTORCONVERTERS_DEFINE 00444 PLANK_VECTORCONVERTERSROUND_DEFINE 00445 00446 PLANK_VECTORZMUL_DEFINE(F) 00447 PLANK_VECTORZMUL_DEFINE(D) 00448 00449 #define PLANK_SIMDF_LENGTH 1 00450 #define PLANK_SIMDF_SIZE 4 00451 #define PLANK_SIMDF_SHIFT 0 00452 #define PLANK_SIMDF_MASK 0 00453 typedef PlankF PlankVF; 00454 00455 #define PLANK_SIMDD_LENGTH 1 00456 #define PLANK_SIMDD_SIZE 8 00457 #define PLANK_SIMDD_SHIFT 0 00458 #define PLANK_SIMDD_MASK 0 00459 typedef PlankD PlankVD; 00460 00461 #define PLANK_SIMDI_LENGTH 1 00462 #define PLANK_SIMDI_SIZE 4 00463 #define PLANK_SIMDI_SHIFT 0 00464 #define PLANK_SIMDI_MASK 0 00465 typedef PlankI PlankVI; 00466 00467 #define PLANK_SIMDS_LENGTH 1 00468 #define PLANK_SIMDS_SIZE 2 00469 #define PLANK_SIMDS_SHIFT 0 00470 #define PLANK_SIMDS_MASK 0 00471 typedef PlankS PlankVS; 00472 00473 #define PLANK_SIMDLL_LENGTH 1 // vector 1 LongLong 00474 #define PLANK_SIMDLL_SIZE 8 00475 #define PLANK_SIMDLL_SHIFT 0 // no shift 00476 #define PLANK_SIMDLL_MASK 0 // no remainder 00477 typedef PlankLL PlankVLL; 00478 00480 00481 #endif // PLANK_VEC_CUSTOM 00482 00485 static inline void pl_VectorSwapEndianUS (PlankUS* data, PlankUL N) 00486 { 00487 PlankUL i; 00488 00489 for (i = 0; i < N; PLANK_INC (i), PLANK_INC (data)) 00490 pl_SwapEndianUS (data); 00491 } 00492 00495 static inline void pl_VectorSwapEndianS (PlankS* data, PlankUL N) 00496 { 00497 pl_VectorSwapEndianUS ((PlankUS*)data, N); 00498 } 00499 00502 static inline void pl_VectorSwapEndianUI24 (PlankUI24* data, PlankUL N) 00503 { 00504 PlankUL i; 00505 00506 for (i = 0; i < N; PLANK_INC (i), PLANK_INC (data)) 00507 pl_SwapEndianUI24 (data); 00508 } 00509 00512 static inline void pl_VectorSwapEndianI24 (PlankI24* data, PlankUL N) 00513 { 00514 pl_VectorSwapEndianUI24 ((PlankUI24*)data, N); 00515 } 00516 00519 static inline void pl_VectorSwapEndianUI (PlankUI* data, PlankUL N) 00520 { 00521 PlankUL i; 00522 00523 for (i = 0; i < N; PLANK_INC (i), PLANK_INC (data)) 00524 pl_SwapEndianUI (data); 00525 } 00526 00529 static inline void pl_VectorSwapEndianI (PlankI* data, PlankUL N) 00530 { 00531 pl_VectorSwapEndianUI ((PlankUI*)data, N); 00532 } 00533 00536 static inline void pl_VectorSwapEndianUL (PlankUL* data, PlankUL N) 00537 { 00538 PlankUL i; 00539 00540 for (i = 0; i < N; PLANK_INC (i), PLANK_INC (data)) 00541 pl_SwapEndianUL (data); 00542 } 00543 00546 static inline void pl_VectorSwapEndianL (PlankL* data, PlankUL N) 00547 { 00548 pl_VectorSwapEndianUL ((PlankUL*)data, N); 00549 } 00550 00553 static inline void pl_VectorSwapEndianULL (PlankULL* data, PlankUL N) 00554 { 00555 PlankUL i; 00556 00557 for (i = 0; i < N; PLANK_INC (i), PLANK_INC (data)) 00558 pl_SwapEndianULL (data); 00559 } 00560 00563 static inline void pl_VectorSwapEndianLL (PlankLL* data, PlankUL N) 00564 { 00565 pl_VectorSwapEndianULL ((PlankULL*)data, N); 00566 } 00567 00568 00569 #endif // PLANK_VECTORS_H 00570