ShLibArithImpl.hpp

00001 // Sh: A GPU metaprogramming language.
00002 //
00003 // Copyright 2003-2005 Serious Hack Inc.
00004 // 
00005 // This library is free software; you can redistribute it and/or
00006 // modify it under the terms of the GNU Lesser General Public
00007 // License as published by the Free Software Foundation; either
00008 // version 2.1 of the License, or (at your option) any later version.
00009 //
00010 // This library is distributed in the hope that it will be useful,
00011 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00012 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013 // Lesser General Public License for more details.
00014 //
00015 // You should have received a copy of the GNU Lesser General Public
00016 // License along with this library; if not, write to the Free Software
00017 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
00018 // MA  02110-1301, USA
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

Generated on Wed Nov 9 15:29:33 2005 for Sh by  doxygen 1.4.5