00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00020 #ifndef SHEVALIMPL_HPP
00021 #define SHEVALIMPL_HPP
00022
00023 #include <numeric>
00024 #include "ShEval.hpp"
00025 #include "ShVariant.hpp"
00026 #include "ShDebug.hpp"
00027 #include "ShError.hpp"
00028
00029 namespace SH {
00030
00031 template<ShOperation OP, typename T>
00032 void ShRegularOp<OP, T>::operator()(
00033 ShVariant* dest, const ShVariant* a, const ShVariant* b, const ShVariant* c) const
00034 {
00035 ShDataVariant<T, SH_HOST>* destVec;
00036 const ShDataVariant<T, SH_HOST> *aVec, *bVec, *cVec;
00037
00038 SH_DEBUG_ASSERT(dest && a);
00039 destVec = variant_cast<T, SH_HOST>(dest);
00040 aVec = variant_cast<T, SH_HOST>(a);
00041
00042 if(b) bVec = variant_cast<T, SH_HOST>(b);
00043 else bVec = 0;
00044
00045 if(c) cVec = variant_cast<T, SH_HOST>(c);
00046 else cVec = 0;
00047
00048 ShRegularOpChooser<OP, T>::Op::doop(destVec, aVec, bVec, cVec);
00049 }
00050
00051 template<typename T>
00052 void _shInitFloatOps() {
00053 ShEval* eval = ShEval::instance();
00054 const ShValueType V = ShStorageTypeInfo<T>::value_type;
00055
00056 eval->addOp(SH_OP_ABS, new ShRegularOp<SH_OP_ABS, T>(), V, V);
00057 eval->addOp(SH_OP_ACOS, new ShRegularOp<SH_OP_ACOS, T>(), V, V);
00058 eval->addOp(SH_OP_ACOSH, new ShRegularOp<SH_OP_ACOSH, T>(), V, V);
00059 eval->addOp(SH_OP_ASIN, new ShRegularOp<SH_OP_ASIN, T>(), V, V);
00060 eval->addOp(SH_OP_ASINH, new ShRegularOp<SH_OP_ASINH, T>(), V, V);
00061 eval->addOp(SH_OP_ASN, new ShRegularOp<SH_OP_ASN, T>(), V, V);
00062 eval->addOp(SH_OP_ATAN, new ShRegularOp<SH_OP_ATAN, T>(), V, V);
00063 eval->addOp(SH_OP_ATANH, new ShRegularOp<SH_OP_ATANH, T>(), V, V);
00064 eval->addOp(SH_OP_CBRT, new ShRegularOp<SH_OP_CBRT, T>(), V, V);
00065 eval->addOp(SH_OP_CEIL, new ShRegularOp<SH_OP_CEIL, T>(), V, V);
00066 eval->addOp(SH_OP_COS, new ShRegularOp<SH_OP_COS, T>(), V, V);
00067 eval->addOp(SH_OP_COSH, new ShRegularOp<SH_OP_COSH, T>(), V, V);
00068 eval->addOp(SH_OP_CSUM, new ShRegularOp<SH_OP_CSUM, T>(), V, V);
00069 eval->addOp(SH_OP_CMUL, new ShRegularOp<SH_OP_CMUL, T>(), V, V);
00070 eval->addOp(SH_OP_EXP, new ShRegularOp<SH_OP_EXP, T>(), V, V);
00071 eval->addOp(SH_OP_EXP2, new ShRegularOp<SH_OP_EXP2, T>(), V, V);
00072 eval->addOp(SH_OP_EXP10, new ShRegularOp<SH_OP_EXP10, T>(), V, V);
00073 eval->addOp(SH_OP_FLR, new ShRegularOp<SH_OP_FLR, T>(), V, V);
00074 eval->addOp(SH_OP_FRAC, new ShRegularOp<SH_OP_FRAC, T>(), V, V);
00075 eval->addOp(SH_OP_HASH, new ShRegularOp<SH_OP_HASH, T>(), V, V);
00076 eval->addOp(SH_OP_LOG, new ShRegularOp<SH_OP_LOG, T>(), V, V);
00077 eval->addOp(SH_OP_LOG2, new ShRegularOp<SH_OP_LOG2, T>(), V, V);
00078 eval->addOp(SH_OP_LOG10, new ShRegularOp<SH_OP_LOG10, T>(), V, V);
00079
00080 eval->addOp(SH_OP_NOISE, new ShRegularOp<SH_OP_NOISE, T>(), V, V);
00081 eval->addOp(SH_OP_NORM, new ShRegularOp<SH_OP_NORM, T>(), V, V);
00082 eval->addOp(SH_OP_RCP, new ShRegularOp<SH_OP_RCP, T>(), V, V);
00083 eval->addOp(SH_OP_RND, new ShRegularOp<SH_OP_RND, T>(), V, V);
00084 eval->addOp(SH_OP_RSQ, new ShRegularOp<SH_OP_RSQ, T>(), V, V);
00085 eval->addOp(SH_OP_SIN, new ShRegularOp<SH_OP_SIN, T>(), V, V);
00086 eval->addOp(SH_OP_SINH, new ShRegularOp<SH_OP_SINH, T>(), V, V);
00087 eval->addOp(SH_OP_SGN, new ShRegularOp<SH_OP_SGN, T>(), V, V);
00088 eval->addOp(SH_OP_SQRT, new ShRegularOp<SH_OP_SQRT, T>(), V, V);
00089 eval->addOp(SH_OP_TAN, new ShRegularOp<SH_OP_TAN, T>(), V, V);
00090 eval->addOp(SH_OP_TANH, new ShRegularOp<SH_OP_TANH, T>(), V, V);
00091
00092 eval->addOp(SH_OP_ADD, new ShRegularOp<SH_OP_ADD, T>(), V, V, V);
00093 eval->addOp(SH_OP_ATAN2, new ShRegularOp<SH_OP_ATAN2, T>(), V, V, V);
00094 eval->addOp(SH_OP_DIV, new ShRegularOp<SH_OP_DIV, T>(), V, V, V);
00095 eval->addOp(SH_OP_DOT, new ShRegularOp<SH_OP_DOT, T>(), V, V, V);
00096 eval->addOp(SH_OP_MAX, new ShRegularOp<SH_OP_MAX, T>(), V, V, V);
00097 eval->addOp(SH_OP_MIN, new ShRegularOp<SH_OP_MIN, T>(), V, V, V);
00098 eval->addOp(SH_OP_MOD, new ShRegularOp<SH_OP_MOD, T>(), V, V, V);
00099 eval->addOp(SH_OP_MUL, new ShRegularOp<SH_OP_MUL, T>(), V, V, V);
00100 eval->addOp(SH_OP_POW, new ShRegularOp<SH_OP_POW, T>(), V, V, V);
00101 eval->addOp(SH_OP_SEQ, new ShRegularOp<SH_OP_SEQ, T>(), V, V, V);
00102 eval->addOp(SH_OP_SGE, new ShRegularOp<SH_OP_SGE, T>(), V, V, V);
00103 eval->addOp(SH_OP_SGT, new ShRegularOp<SH_OP_SGT, T>(), V, V, V);
00104 eval->addOp(SH_OP_SLE, new ShRegularOp<SH_OP_SLE, T>(), V, V, V);
00105 eval->addOp(SH_OP_SLT, new ShRegularOp<SH_OP_SLT, T>(), V, V, V);
00106 eval->addOp(SH_OP_SNE, new ShRegularOp<SH_OP_SNE, T>(), V, V, V);
00107 eval->addOp(SH_OP_XPD, new ShRegularOp<SH_OP_XPD, T>(), V, V, V);
00108
00109 eval->addOp(SH_OP_LIT, new ShRegularOp<SH_OP_LIT, T>(), V, V);
00110 eval->addOp(SH_OP_LRP, new ShRegularOp<SH_OP_LRP, T>(), V, V, V, V);
00111 eval->addOp(SH_OP_MAD, new ShRegularOp<SH_OP_MAD, T>(), V, V, V, V);
00112 eval->addOp(SH_OP_COND, new ShRegularOp<SH_OP_COND, T>(), V, V, V, V);
00113 }
00114
00115 template<typename T>
00116 void _shInitIntOps() {
00117 ShEval* eval = ShEval::instance();
00118 const ShValueType V = ShStorageTypeInfo<T>::value_type;
00119
00120
00121 eval->addOp(SH_OP_ABS, new ShRegularOp<SH_OP_ABS, T>(), V, V);
00122 eval->addOp(SH_OP_ASN, new ShRegularOp<SH_OP_ASN, T>(), V, V);
00123
00124 eval->addOp(SH_OP_CSUM, new ShRegularOp<SH_OP_CSUM, T>(), V, V);
00125 eval->addOp(SH_OP_CMUL, new ShRegularOp<SH_OP_CMUL, T>(), V, V);
00126 eval->addOp(SH_OP_SGN, new ShRegularOp<SH_OP_SGN, T>(), V, V);
00127
00128 eval->addOp(SH_OP_ADD, new ShRegularOp<SH_OP_ADD, T>(), V, V, V);
00129 eval->addOp(SH_OP_DIV, new ShRegularOp<SH_OP_DIV, T>(), V, V, V);
00130 eval->addOp(SH_OP_DOT, new ShRegularOp<SH_OP_DOT, T>(), V, V, V);
00131 eval->addOp(SH_OP_MAX, new ShRegularOp<SH_OP_MAX, T>(), V, V, V);
00132 eval->addOp(SH_OP_MIN, new ShRegularOp<SH_OP_MIN, T>(), V, V, V);
00133 eval->addOp(SH_OP_MOD, new ShRegularOp<SH_OP_MOD, T>(), V, V, V);
00134 eval->addOp(SH_OP_MUL, new ShRegularOp<SH_OP_MUL, T>(), V, V, V);
00135 eval->addOp(SH_OP_POW, new ShRegularOp<SH_OP_POW, T>(), V, V, V);
00136 eval->addOp(SH_OP_SEQ, new ShRegularOp<SH_OP_SEQ, T>(), V, V, V);
00137 eval->addOp(SH_OP_SGE, new ShRegularOp<SH_OP_SGE, T>(), V, V, V);
00138 eval->addOp(SH_OP_SGT, new ShRegularOp<SH_OP_SGT, T>(), V, V, V);
00139 eval->addOp(SH_OP_SLE, new ShRegularOp<SH_OP_SLE, T>(), V, V, V);
00140 eval->addOp(SH_OP_SLT, new ShRegularOp<SH_OP_SLT, T>(), V, V, V);
00141 eval->addOp(SH_OP_SNE, new ShRegularOp<SH_OP_SNE, T>(), V, V, V);
00142 eval->addOp(SH_OP_XPD, new ShRegularOp<SH_OP_XPD, T>(), V, V, V);
00143
00144 eval->addOp(SH_OP_LRP, new ShRegularOp<SH_OP_LRP, T>(), V, V, V, V);
00145 eval->addOp(SH_OP_MAD, new ShRegularOp<SH_OP_MAD, T>(), V, V, V, V);
00146 eval->addOp(SH_OP_COND, new ShRegularOp<SH_OP_COND, T>(), V, V, V, V);
00147
00148
00149 eval->addOp(SH_OP_CEIL, new ShRegularOp<SH_OP_ASN, T>(), V, V);
00150 eval->addOp(SH_OP_FLR, new ShRegularOp<SH_OP_ASN, T>(), V, V);
00151 eval->addOp(SH_OP_FRAC, new ShRegularOp<SH_OP_ASN, T>(), V, V);
00152 eval->addOp(SH_OP_RND, new ShRegularOp<SH_OP_ASN, T>(), V, V);
00153
00154
00155
00156 }
00157
00158 }
00159
00160 #endif