00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 00011 00012 00013 #if defined(USE_DOUBLE_PRECISION) && defined(SSE2) 00014 00015 inline void _sse_mulABC_set_331(mdp_complex* a, mdp_complex* b, mdp_complex* c) 00016 { 00017 _sse_double_load_123(b[0],b[1],b[2]); 00018 _sse_double_su3_multiply(*((_sse_su3*) a)); 00019 _sse_double_store_up_123(c[0],c[1],c[2]); 00020 } 00021 inline void _sse_mulABC_add_331(mdp_complex* a, mdp_complex* b, mdp_complex* c) 00022 { 00023 _sse_double_load_123(b[0],b[1],b[2]); 00024 _sse_double_su3_multiply(*((_sse_su3*) a)); 00025 _sse_double_load_123(c[0],c[1],c[2]); 00026 _sse_double_vector_add(); 00027 _sse_double_store_123(c[0],c[1],c[2]); 00028 } 00029 inline void _sse_mulABC_sub_331(mdp_complex* a, mdp_complex* b, mdp_complex* c) 00030 { 00031 _sse_double_load_123(b[0],b[1],b[2]); 00032 _sse_double_su3_multiply(*((_sse_su3*) a)); 00033 _sse_double_load_123(c[0],c[1],c[2]); 00034 _sse_double_vector_sub(); 00035 _sse_double_store_123(c[0],c[1],c[2]); 00036 } 00037 00038 inline void _sse_mulAHBC_set_331(mdp_complex* a, mdp_complex* b, mdp_complex* c) 00039 { 00040 _sse_double_load_123(b[0],b[1],b[2]); 00041 _sse_double_su3_inverse_multiply(*((_sse_su3*) a)); 00042 _sse_double_store_up_123(c[0],c[1],c[2]); 00043 } 00044 inline void _sse_mulAHBC_add_331(mdp_complex* a, mdp_complex* b, mdp_complex* c) 00045 { 00046 _sse_double_load_123(b[0],b[1],b[2]); 00047 _sse_double_su3_inverse_multiply(*((_sse_su3*) a)); 00048 _sse_double_load_123(c[0],c[1],c[2]); 00049 _sse_double_vector_add(); 00050 _sse_double_store_123(c[0],c[1],c[2]); 00051 } 00052 inline void _sse_mulAHBC_sub_331(mdp_complex* a, mdp_complex* b, mdp_complex* c) 00053 { 00054 _sse_double_load_123(b[0],b[1],b[2]); 00055 _sse_double_su3_inverse_multiply(*((_sse_su3*) a)); 00056 _sse_double_load_123(c[0],c[1],c[2]); 00057 _sse_double_vector_sub(); 00058 _sse_double_store_123(c[0],c[1],c[2]); 00059 } 00060 00061 00062 inline void _sse_mulABC_set_333(mdp_complex* a, mdp_complex* b, mdp_complex* c) 00063 { 00064 _sse_double_load_123(b[0],b[3],b[6]); 00065 _sse_double_su3_multiply(*((_sse_su3*) a)); 00066 _sse_double_store_up_123(c[0],c[3],c[6]); 00067 _sse_double_load_123(b[1],b[4],b[7]); 00068 _sse_double_su3_multiply(*((_sse_su3*) a)); 00069 _sse_double_store_up_123(c[1],c[4],c[7]); 00070 _sse_double_load_123(b[2],b[5],b[8]); 00071 _sse_double_su3_multiply(*((_sse_su3*) a)); 00072 _sse_double_store_up_123(c[2],c[5],c[8]); 00073 } 00074 00075 inline void _sse_mulABC_add_333(mdp_complex* a, mdp_complex* b, mdp_complex* c) 00076 { 00077 _sse_double_load_123(b[0],b[3],b[6]); 00078 _sse_double_su3_multiply(*((_sse_su3*) a)); 00079 _sse_double_load_123(c[0],c[3],c[6]); 00080 _sse_double_vector_add(); 00081 _sse_double_store_123(c[0],c[3],c[6]); 00082 _sse_double_load_123(b[1],b[4],b[7]); 00083 _sse_double_su3_multiply(*((_sse_su3*) a)); 00084 _sse_double_load_123(c[1],c[4],c[7]); 00085 _sse_double_vector_add(); 00086 _sse_double_store_123(c[1],c[4],c[7]); 00087 _sse_double_load_123(b[2],b[5],b[8]); 00088 _sse_double_su3_multiply(*((_sse_su3*) a)); 00089 _sse_double_load_123(c[2],c[5],c[8]); 00090 _sse_double_vector_add(); 00091 _sse_double_store_123(c[2],c[5],c[8]); 00092 } 00093 00094 inline void _sse_mulABC_sub_333(mdp_complex* a, mdp_complex* b, mdp_complex* c) 00095 { 00096 _sse_double_load_123(b[0],b[3],b[6]); 00097 _sse_double_su3_multiply(*((_sse_su3*) a)); 00098 _sse_double_load_123(c[0],c[3],c[6]); 00099 _sse_double_vector_sub(); 00100 _sse_double_store_123(c[0],c[3],c[6]); 00101 _sse_double_load_123(b[1],b[4],b[7]); 00102 _sse_double_su3_multiply(*((_sse_su3*) a)); 00103 _sse_double_load_123(c[1],c[4],c[7]); 00104 _sse_double_vector_sub(); 00105 _sse_double_store_123(c[1],c[4],c[7]); 00106 _sse_double_load_123(b[2],b[5],b[8]); 00107 _sse_double_su3_multiply(*((_sse_su3*) a)); 00108 _sse_double_load_123(c[2],c[5],c[8]); 00109 _sse_double_vector_sub(); 00110 _sse_double_store_123(c[2],c[5],c[8]); 00111 } 00112 00113 inline void _sse_mulAHBC_set_333(mdp_complex* a, mdp_complex* b, mdp_complex* c) 00114 { 00115 _sse_double_load_123(b[0],b[3],b[6]); 00116 _sse_double_su3_inverse_multiply(*((_sse_su3*) a)); 00117 _sse_double_store_up_123(c[0],c[3],c[6]); 00118 _sse_double_load_123(b[1],b[4],b[7]); 00119 _sse_double_su3_inverse_multiply(*((_sse_su3*) a)); 00120 _sse_double_store_up_123(c[1],c[4],c[7]); 00121 _sse_double_load_123(b[2],b[5],b[8]); 00122 _sse_double_su3_inverse_multiply(*((_sse_su3*) a)); 00123 _sse_double_store_up_123(c[2],c[5],c[8]); 00124 } 00125 00126 inline void _sse_mulAHBC_add_333(mdp_complex* a, mdp_complex* b, mdp_complex* c) 00127 { 00128 _sse_double_load_123(b[0],b[3],b[6]); 00129 _sse_double_su3_inverse_multiply(*((_sse_su3*) a)); 00130 _sse_double_load_123(c[0],c[3],c[6]); 00131 _sse_double_vector_add(); 00132 _sse_double_store_123(c[0],c[3],c[6]); 00133 _sse_double_load_123(b[1],b[4],b[7]); 00134 _sse_double_su3_inverse_multiply(*((_sse_su3*) a)); 00135 _sse_double_load_123(c[1],c[4],c[7]); 00136 _sse_double_vector_add(); 00137 _sse_double_store_123(c[1],c[4],c[7]); 00138 _sse_double_load_123(b[2],b[5],b[8]); 00139 _sse_double_su3_inverse_multiply(*((_sse_su3*) a)); 00140 _sse_double_load_123(c[2],c[5],c[8]); 00141 _sse_double_vector_add(); 00142 _sse_double_store_123(c[2],c[5],c[8]); 00143 } 00144 00145 inline void _sse_mulAHBC_sub_333(mdp_complex* a, mdp_complex* b, mdp_complex* c) 00146 { 00147 _sse_double_load_123(b[0],b[3],b[6]); 00148 _sse_double_su3_inverse_multiply(*((_sse_su3*) a)); 00149 _sse_double_load_123(c[0],c[3],c[6]); 00150 _sse_double_vector_sub(); 00151 _sse_double_store_123(c[0],c[3],c[6]); 00152 _sse_double_load_123(b[1],b[4],b[7]); 00153 _sse_double_su3_inverse_multiply(*((_sse_su3*) a)); 00154 _sse_double_load_123(c[1],c[4],c[7]); 00155 _sse_double_vector_sub(); 00156 _sse_double_store_123(c[1],c[4],c[7]); 00157 _sse_double_load_123(b[2],b[5],b[8]); 00158 _sse_double_su3_inverse_multiply(*((_sse_su3*) a)); 00159 _sse_double_load_123(c[2],c[5],c[8]); 00160 _sse_double_vector_sub(); 00161 _sse_double_store_123(c[2],c[5],c[8]); 00162 } 00163 00164 00165 inline void _sse_mulABHC_set_333(mdp_complex* a, mdp_complex* b, mdp_complex* c) 00166 { 00167 static _sse_su3_vector v ALIGN16; 00168 v.c1=conj(b[0]); v.c2=conj(b[1]); v.c3=conj(b[2]); 00169 _sse_double_load(v); 00170 _sse_double_su3_multiply(*((_sse_su3*) a)); 00171 _sse_double_store_up_123(c[0],c[3],c[6]); 00172 00173 v.c1=conj(b[3]); v.c2=conj(b[4]); v.c3=conj(b[5]); 00174 _sse_double_load(v); 00175 _sse_double_su3_multiply(*((_sse_su3*) a)); 00176 _sse_double_store_up_123(c[1],c[4],c[7]); 00177 00178 v.c1=conj(b[6]); v.c2=conj(b[7]); v.c3=conj(b[8]); 00179 _sse_double_load(v); 00180 _sse_double_su3_multiply(*((_sse_su3*) a)); 00181 _sse_double_store_up_123(c[2],c[5],c[8]); 00182 } 00183 00184 inline void _sse_mulABHC_add_333(mdp_complex* a, mdp_complex* b, mdp_complex* c) 00185 { 00186 static _sse_su3_vector v ALIGN16; 00187 v.c1=conj(b[0]); v.c2=conj(b[1]); v.c3=conj(b[2]); 00188 _sse_double_load(v); 00189 _sse_double_su3_multiply(*((_sse_su3*) a)); 00190 _sse_double_load_123(c[0],c[3],c[6]); 00191 _sse_double_vector_add(); 00192 _sse_double_store_123(c[0],c[3],c[6]); 00193 00194 v.c1=conj(b[3]); v.c2=conj(b[4]); v.c3=conj(b[5]); 00195 _sse_double_load(v); 00196 _sse_double_su3_multiply(*((_sse_su3*) a)); 00197 _sse_double_load_123(c[1],c[4],c[7]); 00198 _sse_double_vector_add(); 00199 _sse_double_store_123(c[1],c[4],c[7]); 00200 00201 v.c1=conj(b[6]); v.c2=conj(b[7]); v.c3=conj(b[8]); 00202 _sse_double_load(v); 00203 _sse_double_su3_multiply(*((_sse_su3*) a)); 00204 _sse_double_load_123(c[2],c[5],c[8]); 00205 _sse_double_vector_add(); 00206 _sse_double_store_123(c[2],c[5],c[8]); 00207 } 00208 00209 inline void _sse_mulABHC_sub_333(mdp_complex* a, mdp_complex* b, mdp_complex* c) 00210 { 00211 static _sse_su3_vector v ALIGN16; 00212 v.c1=conj(b[0]); v.c2=conj(b[1]); v.c3=conj(b[2]); 00213 _sse_double_load(v); 00214 _sse_double_su3_multiply(*((_sse_su3*) a)); 00215 _sse_double_load_123(c[0],c[3],c[6]); 00216 _sse_double_vector_sub(); 00217 _sse_double_store_123(c[0],c[3],c[6]); 00218 00219 v.c1=conj(b[3]); v.c2=conj(b[4]); v.c3=conj(b[5]); 00220 _sse_double_load(v); 00221 _sse_double_su3_multiply(*((_sse_su3*) a)); 00222 _sse_double_load_123(c[1],c[4],c[7]); 00223 _sse_double_vector_sub(); 00224 _sse_double_store_123(c[1],c[4],c[7]); 00225 00226 v.c1=conj(b[6]); v.c2=conj(b[7]); v.c3=conj(b[8]); 00227 _sse_double_load(v); 00228 _sse_double_su3_multiply(*((_sse_su3*) a)); 00229 _sse_double_load_123(c[2],c[5],c[8]); 00230 _sse_double_vector_sub(); 00231 _sse_double_store_123(c[2],c[5],c[8]); 00232 } 00233 00234 inline void _sse_mulAbC_set_31(mdp_complex* a, mdp_complex b, mdp_complex* c) { 00235 00236 static _sse_double real, imag ALIGN16; 00237 real.c1=real.c2=b.real(); 00238 imag.c1=imag.c2=b.imag(); 00239 _sse_double_load_123(a[0],a[1],a[2]); 00240 _sse_double_vector_mul_complex(real,imag); 00241 _sse_double_store_up_123(c[0],c[1],c[2]); 00242 } 00243 00244 inline void _sse_mulAbC_add_31(mdp_complex* a, mdp_complex b, mdp_complex* c) 00245 { 00246 static _sse_double real, imag ALIGN16; 00247 real.c1=real.c2=b.real(); 00248 imag.c1=imag.c2=b.imag(); 00249 _sse_double_load_123(a[0],a[1],a[2]); 00250 _sse_double_vector_mul_complex(real, imag); 00251 _sse_double_load_123(c[0],c[1],c[2]); 00252 _sse_double_vector_add(); 00253 _sse_double_store_123(c[0],c[1],c[2]); 00254 } 00255 inline void _sse_mulAbC_sub_31(mdp_complex* a, mdp_complex b, mdp_complex* c) 00256 { 00257 static _sse_double real, imag ALIGN16; 00258 real.c1=real.c2=b.real(); 00259 imag.c1=imag.c2=b.imag(); 00260 _sse_double_load_123(a[0],a[1],a[2]); 00261 _sse_double_vector_mul_complex(real, imag); 00262 _sse_double_load_123(c[0],c[1],c[2]); 00263 _sse_double_vector_sub(); 00264 _sse_double_store_123(c[0],c[1],c[2]); 00265 } 00266 00267 inline void _sse_sumAC_set_31(mdp_complex* a, mdp_complex* c) 00268 { 00269 _sse_double_load_123(a[0],a[1],a[2]); 00270 _sse_double_store_123(c[0],c[1],c[2]); 00271 } 00272 inline void _sse_sumAC_add_31(mdp_complex* a, mdp_complex* c) 00273 { 00274 _sse_double_load_123(c[0],c[1],c[2]); 00275 _sse_double_load_up_123(a[0],a[1],a[2]); 00276 _sse_double_vector_add(); 00277 _sse_double_store_123(c[0],c[1],c[2]); 00278 } 00279 inline void _sse_sumAC_sub_31(mdp_complex* a, mdp_complex* c) 00280 { 00281 _sse_double_load_123(c[0],c[1],c[2]); 00282 _sse_double_load_up_123(a[0],a[1],a[2]); 00283 _sse_double_vector_sub(); 00284 _sse_double_store_123(c[0],c[1],c[2]); 00285 } 00286 00287 #endif