00001 00002 #include <basix/int.hpp> 00003 #include <basix/vector.hpp> 00004 #include <algebramix/vector_unrolled.hpp> 00005 #include <algebramix/vector_simd.hpp> 00006 #include <basix/glue.hpp> 00007 00008 #define int_literal(x) as_int (as_string (x)) 00009 00010 namespace mmx { 00011 static vector<generic> 00012 GLUE_1 (const vector<generic> &arg_1) { 00013 return -arg_1; 00014 } 00015 00016 static vector<generic> 00017 GLUE_2 (const vector<generic> &arg_1) { 00018 return square (arg_1); 00019 } 00020 00021 static vector<generic> 00022 GLUE_3 (const vector<generic> &arg_1, const vector<generic> &arg_2) { 00023 return arg_1 + arg_2; 00024 } 00025 00026 static vector<generic> 00027 GLUE_4 (const vector<generic> &arg_1, const vector<generic> &arg_2) { 00028 return arg_1 - arg_2; 00029 } 00030 00031 static vector<generic> 00032 GLUE_5 (const vector<generic> &arg_1, const vector<generic> &arg_2) { 00033 return arg_1 * arg_2; 00034 } 00035 00036 static generic 00037 GLUE_6 (const vector<generic> &arg_1, const vector<generic> &arg_2) { 00038 return dot (arg_1, arg_2); 00039 } 00040 00041 static generic 00042 GLUE_7 (const vector<generic> &arg_1) { 00043 return big_mul (arg_1); 00044 } 00045 00046 static generic 00047 GLUE_8 (const vector<generic> &arg_1) { 00048 return big_add (arg_1); 00049 } 00050 00051 static bool 00052 GLUE_9 (const vector<generic> &arg_1, const vector<generic> &arg_2) { 00053 return arg_1 == arg_2; 00054 } 00055 00056 static bool 00057 GLUE_10 (const vector<generic> &arg_1, const vector<generic> &arg_2) { 00058 return arg_1 != arg_2; 00059 } 00060 00061 static vector<generic> 00062 GLUE_11 (const vector<generic> &arg_1) { 00063 return invert (arg_1); 00064 } 00065 00066 static vector<generic> 00067 GLUE_12 (const vector<generic> &arg_1, const vector<generic> &arg_2) { 00068 return arg_1 / arg_2; 00069 } 00070 00071 static bool 00072 GLUE_13 (const vector<generic> &arg_1, const vector<generic> &arg_2) { 00073 return arg_1 <= arg_2; 00074 } 00075 00076 static bool 00077 GLUE_14 (const vector<generic> &arg_1, const vector<generic> &arg_2) { 00078 return arg_1 >= arg_2; 00079 } 00080 00081 static bool 00082 GLUE_15 (const vector<generic> &arg_1, const vector<generic> &arg_2) { 00083 return arg_1 < arg_2; 00084 } 00085 00086 static bool 00087 GLUE_16 (const vector<generic> &arg_1, const vector<generic> &arg_2) { 00088 return arg_1 > arg_2; 00089 } 00090 00091 static vector<generic> 00092 GLUE_17 (const vector<generic> &arg_1, const vector<generic> &arg_2) { 00093 return inf (arg_1, arg_2); 00094 } 00095 00096 static vector<generic> 00097 GLUE_18 (const vector<generic> &arg_1, const vector<generic> &arg_2) { 00098 return sup (arg_1, arg_2); 00099 } 00100 00101 static vector<generic> 00102 GLUE_19 (const vector<generic> &arg_1, const vector<generic> &arg_2) { 00103 return pow (arg_1, arg_2); 00104 } 00105 00106 static vector<generic> 00107 GLUE_20 (const vector<generic> &arg_1) { 00108 return sqrt (arg_1); 00109 } 00110 00111 static vector<generic> 00112 GLUE_21 (const vector<generic> &arg_1) { 00113 return exp (arg_1); 00114 } 00115 00116 static vector<generic> 00117 GLUE_22 (const vector<generic> &arg_1) { 00118 return log (arg_1); 00119 } 00120 00121 static vector<generic> 00122 GLUE_23 (const vector<generic> &arg_1) { 00123 return cos (arg_1); 00124 } 00125 00126 static vector<generic> 00127 GLUE_24 (const vector<generic> &arg_1) { 00128 return sin (arg_1); 00129 } 00130 00131 static vector<generic> 00132 GLUE_25 (const vector<generic> &arg_1) { 00133 return tan (arg_1); 00134 } 00135 00136 static vector<generic> 00137 GLUE_26 (const vector<generic> &arg_1) { 00138 return acos (arg_1); 00139 } 00140 00141 static vector<generic> 00142 GLUE_27 (const vector<generic> &arg_1) { 00143 return asin (arg_1); 00144 } 00145 00146 static vector<generic> 00147 GLUE_28 (const vector<generic> &arg_1) { 00148 return atan (arg_1); 00149 } 00150 00151 static vector<generic> 00152 GLUE_29 (const vector<generic> &arg_1) { 00153 return derive (arg_1); 00154 } 00155 00156 static vector<generic> 00157 GLUE_30 (const vector<generic> &arg_1) { 00158 return integrate (arg_1); 00159 } 00160 00161 void 00162 glue_vector_generic () { 00163 static bool done = false; 00164 if (done) return; 00165 done = true; 00166 call_glue (string ("glue_basix_vector_generic")); 00167 define ("-", GLUE_1); 00168 define ("square", GLUE_2); 00169 define ("+", GLUE_3); 00170 define ("-", GLUE_4); 00171 define ("*", GLUE_5); 00172 define ("dot", GLUE_6); 00173 define ("big_mul", GLUE_7); 00174 define ("big_add", GLUE_8); 00175 define ("=", GLUE_9); 00176 define ("!=", GLUE_10); 00177 define ("invert", GLUE_11); 00178 define ("/", GLUE_12); 00179 define ("<=", GLUE_13); 00180 define (">=", GLUE_14); 00181 define ("<", GLUE_15); 00182 define (">", GLUE_16); 00183 define ("inf", GLUE_17); 00184 define ("sup", GLUE_18); 00185 define ("^", GLUE_19); 00186 define ("sqrt", GLUE_20); 00187 define ("exp", GLUE_21); 00188 define ("log", GLUE_22); 00189 define ("cos", GLUE_23); 00190 define ("sin", GLUE_24); 00191 define ("tan", GLUE_25); 00192 define ("arccos", GLUE_26); 00193 define ("arcsin", GLUE_27); 00194 define ("arctan", GLUE_28); 00195 define ("derive", GLUE_29); 00196 define ("integrate", GLUE_30); 00197 } 00198 }