00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00020 #ifndef SHLIBARITHIMPL_HPP
00021 #define SHLIBARITHIMPL_HPP
00022
00023 #include "ShLibArith.hpp"
00024 #include "ShInstructions.hpp"
00025
00026 namespace SH {
00027
00028 template<int N, typename T1, typename T2>
00029 ShGeneric<N, CT1T2>
00030 operator+(const ShGeneric<N, T1>& left, const ShGeneric<N, T2>& right)
00031 {
00032 ShAttrib<N, SH_TEMP, CT1T2> t;
00033 shADD(t, left, right);
00034 return t;
00035 }
00036 template<int N, typename T1, typename T2>
00037 ShGeneric<N, CT1T2>
00038 operator+(const ShGeneric<N, T1>& left, const ShGeneric<1, T2>& right)
00039 {
00040 ShAttrib<N, SH_TEMP, CT1T2> t;
00041 shADD(t, left, right);
00042 return t;
00043 }
00044 template<int N, typename T1, typename T2>
00045 ShGeneric<N, CT1T2>
00046 operator+(const ShGeneric<1, T1>& left, const ShGeneric<N, T2>& right)
00047 {
00048 ShAttrib<N, SH_TEMP, CT1T2> t;
00049 shADD(t, left, right);
00050 return t;
00051 }
00052 template<typename T1, typename T2>
00053 ShGeneric<1, CT1T2>
00054 operator+(const ShGeneric<1, T1>& left, const ShGeneric<1, T2>& right)
00055 {
00056 ShAttrib<1, SH_TEMP, CT1T2> t;
00057 shADD(t, left, right);
00058 return t;
00059 }
00060 SH_SHLIB_CONST_SCALAR_OP(operator+);
00061 SH_SHLIB_CONST_N_OP_BOTH(operator+);
00062
00063 template<int N, typename T1, typename T2>
00064 ShGeneric<N, CT1T2>
00065 operator-(const ShGeneric<N, T1>& left, const ShGeneric<N, T2>& right)
00066 {
00067 ShAttrib<N, SH_TEMP, CT1T2> t;
00068 shADD(t, left, -right);
00069 return t;
00070 }
00071 template<int N, typename T1, typename T2>
00072 ShGeneric<N, CT1T2>
00073 operator-(const ShGeneric<N, T1>& left, const ShGeneric<1, T2>& right)
00074 {
00075 ShAttrib<N, SH_TEMP, CT1T2> t;
00076 shADD(t, left, -right);
00077 return t;
00078 }
00079 template<int N, typename T1, typename T2>
00080 ShGeneric<N, CT1T2>
00081 operator-(const ShGeneric<1, T1>& left, const ShGeneric<N, T2>& right)
00082 {
00083 ShAttrib<N, SH_TEMP, CT1T2> t;
00084 shADD(t, left, -right);
00085 return t;
00086 }
00087 template<typename T1, typename T2>
00088 ShGeneric<1, CT1T2>
00089 operator-(const ShGeneric<1, T1>& left, const ShGeneric<1, T2>& right)
00090 {
00091 ShAttrib<1, SH_TEMP, CT1T2> t;
00092 shADD(t, left, -right);
00093 return t;
00094 }
00095 SH_SHLIB_CONST_SCALAR_OP(operator-);
00096 SH_SHLIB_CONST_N_OP_BOTH(operator-);
00097
00098 template<int N, typename T1, typename T2>
00099 ShGeneric<N, CT1T2>
00100 operator*(const ShGeneric<N, T1>& left, const ShGeneric<N, T2>& right)
00101 {
00102 ShAttrib<N, SH_TEMP, CT1T2> t;
00103 shMUL(t, left, right);
00104 return t;
00105 }
00106 template<int N, typename T1, typename T2>
00107 ShGeneric<N, CT1T2>
00108 operator*(const ShGeneric<1, T1>& left, const ShGeneric<N, T2>& right)
00109 {
00110 ShAttrib<N, SH_TEMP, CT1T2> t;
00111 shMUL(t, left, right);
00112 return t;
00113 }
00114 template<int N, typename T1, typename T2>
00115 ShGeneric<N, CT1T2>
00116 operator*(const ShGeneric<N, T1>& left, const ShGeneric<1, T2>& right)
00117 {
00118 ShAttrib<N, SH_TEMP, CT1T2> t;
00119 shMUL(t, left, right);
00120 return t;
00121 }
00122 template<typename T1, typename T2>
00123 ShGeneric<1, CT1T2>
00124 operator*(const ShGeneric<1, T1>& left, const ShGeneric<1, T2>& right)
00125 {
00126 ShAttrib<1, SH_TEMP, CT1T2> t;
00127 shMUL(t, left, right);
00128 return t;
00129 }
00130 SH_SHLIB_CONST_SCALAR_OP(operator*);
00131 SH_SHLIB_CONST_N_OP_BOTH(operator*);
00132
00133 template<int N, typename T1, typename T2>
00134 ShGeneric<N, CT1T2>
00135 operator/(const ShGeneric<N, T1>& left, const ShGeneric<N, T2>& right)
00136 {
00137 ShAttrib<N, SH_TEMP, CT1T2> t;
00138 shDIV(t, left, right);
00139 return t;
00140 }
00141 template<int N, typename T1, typename T2>
00142 ShGeneric<N, CT1T2>
00143 operator/(const ShGeneric<N, T1>& left, const ShGeneric<1, T2>& right)
00144 {
00145 ShAttrib<N, SH_TEMP, CT1T2> t;
00146 shDIV(t, left, right);
00147 return t;
00148 }
00149 template<int N, typename T1, typename T2>
00150 ShGeneric<N, CT1T2>
00151 operator/(const ShGeneric<1, T1>& left, const ShGeneric<N, T2>& right)
00152 {
00153 ShAttrib<N, SH_TEMP, CT1T2> t;
00154 shDIV(t, left, right);
00155 return t;
00156 }
00157 template<typename T1, typename T2>
00158 ShGeneric<1, CT1T2>
00159 operator/(const ShGeneric<1, T1>& left, const ShGeneric<1, T2>& right)
00160 {
00161 ShAttrib<1, SH_TEMP, CT1T2> t;
00162 shDIV(t, left, right);
00163 return t;
00164 }
00165 SH_SHLIB_CONST_SCALAR_OP(operator/);
00166 SH_SHLIB_CONST_N_OP_LEFT(operator/);
00167
00168 template<int N, typename T>
00169 ShGeneric<N, T> exp(const ShGeneric<N, T>& var)
00170 {
00171 ShAttrib<N, SH_TEMP, T> t;
00172 shEXP(t, var);
00173 return t;
00174 }
00175
00176 template<int N, typename T>
00177 ShGeneric<N, T> exp2(const ShGeneric<N, T>& var)
00178 {
00179 ShAttrib<N, SH_TEMP, T> t;
00180 shEXP2(t, var);
00181 return t;
00182 }
00183
00184 template<int N, typename T>
00185 ShGeneric<N, T> exp10(const ShGeneric<N, T>& var)
00186 {
00187 ShAttrib<N, SH_TEMP, T> t;
00188 shEXP10(t, var);
00189 return t;
00190 }
00191
00192 template<int N, typename T>
00193 ShGeneric<N, T> expm1(const ShGeneric<N, T>& var)
00194 {
00195 return exp(var - 1.0);
00196 }
00197
00198 template<int N, typename T>
00199 ShGeneric<N, T> log(const ShGeneric<N, T>& var)
00200 {
00201 ShAttrib<N, SH_TEMP, T> t;
00202 shLOG(t, var);
00203 return t;
00204 }
00205
00206 template<int N, typename T>
00207 ShGeneric<N, T> log2(const ShGeneric<N, T>& var)
00208 {
00209 ShAttrib<N, SH_TEMP, T> t;
00210 shLOG2(t, var);
00211 return t;
00212 }
00213
00214 template<int N, typename T>
00215 ShGeneric<N, T> log10(const ShGeneric<N, T>& var)
00216 {
00217 ShAttrib<N, SH_TEMP, T> t;
00218 shLOG10(t, var);
00219 return t;
00220 }
00221
00222 template<int N, typename T>
00223 ShGeneric<N, T> logp1(const ShGeneric<N, T>& var)
00224 {
00225 return log(var + 1.0);
00226 }
00227
00228 template<int N, typename T1, typename T2>
00229 ShGeneric<N, CT1T2> pow(const ShGeneric<N, T1>& left, const ShGeneric<N, T2>& right)
00230 {
00231 ShAttrib<N, SH_TEMP, CT1T2> t;
00232 shPOW(t, left, right);
00233 return t;
00234 }
00235 template<int N, typename T1, typename T2>
00236 ShGeneric<N, CT1T2> pow(const ShGeneric<N, T1>& left, const ShGeneric<1, T2>& right)
00237 {
00238 ShAttrib<N, SH_TEMP, CT1T2> t;
00239 shPOW(t, left, right);
00240 return t;
00241 }
00242 template<int N, typename T1, typename T2>
00243 ShGeneric<N, CT1T2> pow(const ShGeneric<1, T1>& left, const ShGeneric<N, T2>& right)
00244 {
00245 ShAttrib<N, SH_TEMP, CT1T2> t;
00246 shPOW(t, left, right);
00247 return t;
00248 }
00249 template<typename T1, typename T2>
00250 ShGeneric<1, CT1T2> pow(const ShGeneric<1, T1>& left, const ShGeneric<1, T2>& right)
00251 {
00252 ShAttrib<1, SH_TEMP, CT1T2> t;
00253 shPOW(t, left, right);
00254 return t;
00255 }
00256 SH_SHLIB_CONST_SCALAR_OP(pow);
00257 SH_SHLIB_CONST_N_OP_RIGHT(pow);
00258
00259 template<int N, typename T1, typename T2, typename T3>
00260 ShGeneric<N, CT1T2T3> mad(const ShGeneric<N, T1>& m1, const ShGeneric<N, T2>& m2,
00261 const ShGeneric<N, T3>& a)
00262 {
00263 ShAttrib<N, SH_TEMP, CT1T2T3> t;
00264 shMAD(t, m1, m2, a);
00265 return t;
00266 }
00267 template<int N, typename T1, typename T2, typename T3>
00268 ShGeneric<N, CT1T2T3> mad(const ShGeneric<N, T1>& m1, const ShGeneric<1, T2>& m2,
00269 const ShGeneric<N, T3>& a)
00270 {
00271 ShAttrib<N, SH_TEMP, CT1T2T3> t;
00272 shMAD(t, m1, m2, a);
00273 return t;
00274 }
00275 template<int N, typename T1, typename T2, typename T3>
00276 ShGeneric<N, CT1T2T3> mad(const ShGeneric<1, T1>& m1, const ShGeneric<N, T2>& m2,
00277 const ShGeneric<N, T3>& a)
00278 {
00279 ShAttrib<N, SH_TEMP, CT1T2T3> t;
00280 shMAD(t, m1, m2, a);
00281 return t;
00282 }
00283 template<typename T1, typename T2, typename T3>
00284 ShGeneric<1, CT1T2T3> mad(const ShGeneric<1, T1>& m1, const ShGeneric<1, T2>& m2,
00285 const ShGeneric<1, T3>& a)
00286 {
00287 ShAttrib<1, SH_TEMP, CT1T2T3> t;
00288 shMAD(t, m1, m2, a);
00289 return t;
00290 }
00291
00292 template<int N, typename T1, typename T2>
00293 ShGeneric<N, CT1T2>
00294 mad(const CT1T2& m1, const ShGeneric<N, T1>& m2, const ShGeneric<N, T2>& a)
00295 {
00296 ShAttrib<N, SH_TEMP, CT1T2> t;
00297 shMAD(t, ShAttrib<1, SH_CONST, CT1T2>(m1), m2, a);
00298 return t;
00299 }
00300
00301 template<int N, typename T1, typename T2>
00302 ShGeneric<N, CT1T2>
00303 mad(const ShGeneric<N, T1>& m1, const CT1T2& m2, const ShGeneric<N, T2>& a)
00304 {
00305 ShAttrib<N, SH_TEMP, CT1T2> t;
00306 shMAD(t, m1, ShAttrib<1, SH_CONST, CT1T2>(m2), a);
00307 return t;
00308 }
00309
00310 template<int N, typename T>
00311 ShGeneric<N, T> rcp(const ShGeneric<N, T>& var)
00312 {
00313 ShAttrib<N, SH_TEMP, T> t;
00314 shRCP(t, var);
00315 return t;
00316 }
00317
00318 template<int N, typename T>
00319 ShGeneric<N, T> sqrt(const ShGeneric<N, T>& var)
00320 {
00321 ShAttrib<N, SH_TEMP, T> t;
00322 shSQRT(t, var);
00323 return t;
00324 }
00325
00326 template<int N, typename T>
00327 ShGeneric<N, T> rsqrt(const ShGeneric<N, T>& var)
00328 {
00329 ShAttrib<N, SH_TEMP, T> t;
00330 shRSQ(t, var);
00331 return t;
00332 }
00333
00334 template<int N, typename T>
00335 ShGeneric<N, T> cbrt(const ShGeneric<N, T>& var)
00336 {
00337 ShAttrib<N, SH_TEMP, T> t;
00338 shCBRT(t, var);
00339 return t;
00340 }
00341
00342 template<int N, typename T1, typename T2, typename T3>
00343 ShGeneric<N, CT1T2T3> lerp(const ShGeneric<N, T1>& f, const ShGeneric<N, T2>& a,
00344 const ShGeneric<N, T3>& b)
00345 {
00346 ShAttrib<N, SH_TEMP, CT1T2T3> t;
00347 shLRP(t, f, a, b);
00348 return t;
00349 }
00350
00351 template<int N, typename T1, typename T2, typename T3>
00352 ShGeneric<N, CT1T2T3> lerp(const ShGeneric<1, T1>& f, const ShGeneric<N, T2>& a,
00353 const ShGeneric<N, T3>& b)
00354 {
00355 ShAttrib<N, SH_TEMP, CT1T2T3> t;
00356 shLRP(t, f, a, b);
00357 return t;
00358 }
00359
00360 template<typename T1, typename T2, typename T3>
00361 ShGeneric<1, CT1T2T3> lerp(const ShGeneric<1, T1>& f, const ShGeneric<1, T2>& a,
00362 const ShGeneric<1, T3>& b)
00363 {
00364 ShAttrib<1, SH_TEMP, CT1T2T3> t;
00365 shLRP(t, f, a, b);
00366 return t;
00367 }
00368
00369 template<int N, typename T1, typename T2>
00370 ShGeneric<N, CT1T2> lerp(const CT1T2& f, const ShGeneric<N, T1>& a, const ShGeneric<N, T2>& b)
00371 {
00372 ShAttrib<N, SH_TEMP, CT1T2> t;
00373 shLRP(t, ShAttrib<1, SH_CONST, CT1T2>(f), a, b);
00374 return t;
00375 }
00376
00377 template<int N, typename T>
00378 ShGeneric<1, T> sum(const ShGeneric<N, T>& var)
00379 {
00380 ShAttrib<1, SH_TEMP, T> t;
00381 shCSUM(t, var);
00382 return t;
00383 }
00384
00385 template<int N, typename T>
00386 ShGeneric<1, T> prod(const ShGeneric<N, T>& var)
00387 {
00388 ShAttrib<1, SH_TEMP, T> t;
00389 shCMUL(t, var);
00390 return t;
00391 }
00392
00393
00394 }
00395
00396 #endif