Max 5 API Reference
00001 #include "jit.common.h" 00002 #include "jit.op.h" 00003 #include "jit.altivec.h" 00004 00005 /************************************************************************* 00006 // 00007 // AX 00008 // z = ax + y 00009 // 00010 // vecdata = a (float64 *, 2 elements if complex) 00011 // in1 = x 00012 // in2 = y 00013 // out = z 00014 // needs to use double precision else too much roundoff error 00015 // to do gaussian elimination 00016 // 00017 **************************************************************************/ 00018 void jit_op_vector_ax_float32(long n, void *vecdata, t_jit_op_info *in1, t_jit_op_info *in2, t_jit_op_info *out) 00019 { 00020 float *ip1,*op; 00021 double a=1; 00022 long is1,os; 00023 00024 ip1 = ((float *)in1->p); 00025 op = ((float *)out->p); 00026 is1 = in1->stride; 00027 os = out->stride; 00028 00029 if (vecdata) { 00030 a = *((double *)vecdata); 00031 } 00032 00033 if ((is1==1)&&(os==1)) { 00034 FAST_DEC_SETUP(n); 00035 FAST_INC_SETUP(op); 00036 FAST_INC_SETUP(ip1); 00037 00038 while (FAST_DEC(n)) { 00039 FAST_INC_DEREF(op) = ((double)a*(double)FAST_INC_DEREF(ip1)); 00040 } 00041 } else { 00042 FAST_DEC_SETUP(n); 00043 while (FAST_DEC(n)) { 00044 *op = (double)a*(double)(*ip1); 00045 op += os; ip1 += is1; 00046 } 00047 } 00048 } 00049 00050 void jit_op_vector_ax_float32_complex(long n, void *vecdata, t_jit_op_info *in1, t_jit_op_info *in2, t_jit_op_info *out) 00051 { 00052 float *ip1,*op; 00053 double a=1,b=0,c,d; 00054 long is1,os; 00055 00056 ip1 = ((float *)in1->p); 00057 op = ((float *)out->p); 00058 is1 = in1->stride; 00059 os = out->stride; 00060 00061 if (vecdata) { 00062 a = ((double *)vecdata)[0]; 00063 b = ((double *)vecdata)[1]; 00064 } 00065 00066 FAST_DEC_SETUP(n); 00067 while (FAST_DEC(n)) { 00068 c = ip1[0]; 00069 d = ip1[1]; 00070 op[0] = a*c - b*d; 00071 op[1] = a*d + b*c; 00072 op += os; ip1 += is1; 00073 } 00074 } 00075 00076 void jit_op_vector_ax_float64(long n, void *vecdata, t_jit_op_info *in1, t_jit_op_info *in2, t_jit_op_info *out) 00077 { 00078 double *ip1,*ip2,*op,a=1; 00079 long is1,is2,os; 00080 00081 ip1 = ((double *)in1->p); 00082 op = ((double *)out->p); 00083 is1 = in1->stride; 00084 os = out->stride; 00085 00086 if (vecdata) { 00087 a = *((double *)vecdata); 00088 } 00089 00090 if ((is1==1)&&(os==1)) { 00091 FAST_DEC_SETUP(n); 00092 FAST_INC_SETUP(op); 00093 FAST_INC_SETUP(ip1); 00094 00095 while (FAST_DEC(n)) { 00096 FAST_INC_DEREF(op) = (a*FAST_INC_DEREF(ip1)); 00097 } 00098 } else { 00099 FAST_DEC_SETUP(n); 00100 while (FAST_DEC(n)) { 00101 *op = a*(*ip1); 00102 op += os; ip1 += is1; 00103 } 00104 } 00105 } 00106 00107 void jit_op_vector_ax_float64_complex(long n, void *vecdata, t_jit_op_info *in1, t_jit_op_info *in2, t_jit_op_info *out) 00108 { 00109 double *ip1,*op; 00110 double a=1,b=0,c,d; 00111 long is1,os; 00112 00113 ip1 = ((double *)in1->p); 00114 op = ((double *)out->p); 00115 is1 = in1->stride; 00116 os = out->stride; 00117 00118 if (vecdata) { 00119 a = ((double *)vecdata)[0]; 00120 b = ((double *)vecdata)[1]; 00121 } 00122 00123 FAST_DEC_SETUP(n); 00124 while (FAST_DEC(n)) { 00125 c = ip1[0]; 00126 d = ip1[1]; 00127 op[0] = a*c - b*d; 00128 op[1] = a*d + b*c; 00129 op += os; ip1 += is1; 00130 } 00131 } 00132 00133 00134 /************************************************************************* 00135 // 00136 // AXPY 00137 // z = ax + y 00138 // 00139 // vecdata = a (float64 *, 2 elements if complex) 00140 // in1 = x 00141 // in2 = y 00142 // out = z 00143 // needs to use double precision else too much roundoff error 00144 // to do gaussian elimination 00145 // 00146 **************************************************************************/ 00147 void jit_op_vector_axpy_float32(long n, void *vecdata, t_jit_op_info *in1, t_jit_op_info *in2, t_jit_op_info *out) 00148 { 00149 float *ip1,*ip2,*op; 00150 double a=1; 00151 long is1,is2,os; 00152 00153 ip1 = ((float *)in1->p); 00154 ip2 = ((float *)in2->p); 00155 op = ((float *)out->p); 00156 is1 = in1->stride; 00157 is2 = in2->stride; 00158 os = out->stride; 00159 00160 if (vecdata) { 00161 a = *((double *)vecdata); 00162 } 00163 00164 if ((is1==1)&&(is2==1)&&(os==1)) { 00165 FAST_DEC_SETUP(n); 00166 FAST_INC_SETUP(op); 00167 FAST_INC_SETUP(ip1); 00168 FAST_INC_SETUP(ip2); 00169 00170 while (FAST_DEC(n)) { 00171 FAST_INC_DEREF(op) = ((double)a*(double)FAST_INC_DEREF(ip1)) + (double)FAST_INC_DEREF(ip2); 00172 } 00173 } else { 00174 FAST_DEC_SETUP(n); 00175 while (FAST_DEC(n)) { 00176 *op = (double)a*(double)(*ip1)+(double)(*ip2); 00177 op += os; ip1 += is1; ip2 += is2; 00178 } 00179 } 00180 } 00181 00182 void jit_op_vector_axpy_float32_complex(long n, void *vecdata, t_jit_op_info *in1, t_jit_op_info *in2, t_jit_op_info *out) 00183 { 00184 float *ip1,*ip2,*op; 00185 double a=1,b=0,c,d; 00186 long is1,is2,os; 00187 00188 ip1 = ((float *)in1->p); 00189 ip2 = ((float *)in2->p); 00190 op = ((float *)out->p); 00191 is1 = in1->stride; 00192 is2 = in2->stride; 00193 os = out->stride; 00194 00195 if (vecdata) { 00196 a = ((double *)vecdata)[0]; 00197 b = ((double *)vecdata)[1]; 00198 } 00199 00200 FAST_DEC_SETUP(n); 00201 while (FAST_DEC(n)) { 00202 c = ip1[0]; 00203 d = ip1[1]; 00204 op[0] = a*c - b*d + (double)ip2[0]; 00205 op[1] = a*d + b*c + (double)ip2[1]; 00206 op += os; ip1 += is1; ip2 += is2; 00207 } 00208 } 00209 00210 void jit_op_vector_axpy_float64(long n, void *vecdata, t_jit_op_info *in1, t_jit_op_info *in2, t_jit_op_info *out) 00211 { 00212 double *ip1,*ip2,*op,a=1; 00213 long is1,is2,os; 00214 00215 ip1 = ((double *)in1->p); 00216 ip2 = ((double *)in2->p); 00217 op = ((double *)out->p); 00218 is1 = in1->stride; 00219 is2 = in2->stride; 00220 os = out->stride; 00221 00222 if (vecdata) { 00223 a = *((double *)vecdata); 00224 } 00225 00226 if ((is1==1)&&(is2==1)&&(os==1)) { 00227 FAST_DEC_SETUP(n); 00228 FAST_INC_SETUP(op); 00229 FAST_INC_SETUP(ip1); 00230 FAST_INC_SETUP(ip2); 00231 00232 while (FAST_DEC(n)) { 00233 FAST_INC_DEREF(op) = (a*FAST_INC_DEREF(ip1)) + FAST_INC_DEREF(ip2); 00234 } 00235 } else { 00236 FAST_DEC_SETUP(n); 00237 while (FAST_DEC(n)) { 00238 *op = a*(*ip1)+(*ip2); 00239 op += os; ip1 += is1; ip2 += is2; 00240 } 00241 } 00242 } 00243 00244 void jit_op_vector_axpy_float64_complex(long n, void *vecdata, t_jit_op_info *in1, t_jit_op_info *in2, t_jit_op_info *out) 00245 { 00246 double *ip1,*ip2,*op; 00247 double a=1,b=0,c,d; 00248 long is1,is2,os; 00249 00250 ip1 = ((double *)in1->p); 00251 ip2 = ((double *)in2->p); 00252 op = ((double *)out->p); 00253 is1 = in1->stride; 00254 is2 = in2->stride; 00255 os = out->stride; 00256 00257 if (vecdata) { 00258 a = ((double *)vecdata)[0]; 00259 b = ((double *)vecdata)[1]; 00260 } 00261 00262 FAST_DEC_SETUP(n); 00263 while (FAST_DEC(n)) { 00264 c = ip1[0]; 00265 d = ip1[1]; 00266 op[0] = a*c - b*d + ip2[0]; 00267 op[1] = a*d + b*c + ip2[1]; 00268 op += os; ip1 += is1; ip2 += is2; 00269 } 00270 } 00271 00272 /************************************************************************* 00273 // 00274 // DOTPROD 00275 // a = dotproduct(x,y) 00276 // 00277 // vecdata = a (float64 *, 2 elements if complex) 00278 // in1 = x 00279 // in2 = y 00280 // out = ignored 00281 // 00282 **************************************************************************/ 00283 00284 void jit_op_vector_dotprod_float32(long n, void *vecdata, t_jit_op_info *in1, t_jit_op_info *in2, t_jit_op_info *out) 00285 { 00286 float *ip1,*ip2; 00287 double *a; 00288 long is1,is2; 00289 00290 ip1 = ((float *)in1->p); 00291 ip2 = ((float *)in2->p); 00292 is1 = in1->stride; 00293 is2 = in2->stride; 00294 a = (double *)vecdata; 00295 *a = 0; 00296 00297 ++n; 00298 while (--n) { 00299 *a += (double)(*ip1)*(double)(*ip2); 00300 ip1 += is1; ip2 += is2; 00301 } 00302 } 00303 00304 void jit_op_vector_dotprod_float32_complex(long n, void *vecdata, t_jit_op_info *in1, t_jit_op_info *in2, t_jit_op_info *out) 00305 { 00306 float *ip1,*ip2; 00307 double *a,*b; 00308 long is1,is2; 00309 00310 ip1 = ((float *)in1->p); 00311 ip2 = ((float *)in2->p); 00312 is1 = in1->stride; 00313 is2 = in2->stride; 00314 a = (double *)vecdata; 00315 b = (double *)vecdata+1; 00316 *a = *b = 0; 00317 00318 ++n; 00319 while (--n) { 00320 *a += (double)(ip1[0])*(double)(ip2[0]) - (double)(ip1[1])*(double)(ip2[1]); 00321 *b += (double)(ip1[0])*(double)(ip2[1]) + (double)(ip1[1])*(double)(ip2[0]); 00322 ip1 += is1; ip2 += is2; 00323 } 00324 } 00325 00326 void jit_op_vector_dotprod_float64(long n, void *vecdata, t_jit_op_info *in1, t_jit_op_info *in2, t_jit_op_info *out) 00327 { 00328 double *ip1,*ip2; 00329 double *a; 00330 long is1,is2; 00331 00332 ip1 = ((double *)in1->p); 00333 ip2 = ((double *)in2->p); 00334 is1 = in1->stride; 00335 is2 = in2->stride; 00336 a = (double *)vecdata; 00337 *a = 0; 00338 00339 ++n; 00340 while (--n) { 00341 *a += (double)(*ip1)*(double)(*ip2); 00342 ip1 += is1; ip2 += is2; 00343 } 00344 } 00345 00346 void jit_op_vector_dotprod_float64_complex(long n, void *vecdata, t_jit_op_info *in1, t_jit_op_info *in2, t_jit_op_info *out) 00347 { 00348 double *ip1,*ip2; 00349 double *a,*b; 00350 long is1,is2; 00351 00352 ip1 = ((double *)in1->p); 00353 ip2 = ((double *)in2->p); 00354 is1 = in1->stride; 00355 is2 = in2->stride; 00356 a = (double *)vecdata; 00357 b = (double *)vecdata+1; 00358 *a = *b = 0; 00359 00360 ++n; 00361 while (--n) { 00362 *a += (double)(ip1[0])*(double)(ip2[0]) - (double)(ip1[1])*(double)(ip2[1]); 00363 *b += (double)(ip1[0])*(double)(ip2[1]) + (double)(ip1[1])*(double)(ip2[0]); 00364 ip1 += is1; ip2 += is2; 00365 } 00366 } 00367 00368 00369 /************************************************************************* 00370 // 00371 // SWAP 00372 // tmp = x; x = y; y = x; 00373 // 00374 // vecdata = ignored 00375 // in1 = x 00376 // in2 = y 00377 // out = ignored 00378 // 00379 **************************************************************************/ 00380 00381 void jit_op_vector_swap_float32(long n, void *vecdata, t_jit_op_info *in1, t_jit_op_info *in2, t_jit_op_info *out) 00382 { 00383 float *ip1,*ip2,tmp; 00384 long is1,is2; 00385 00386 ip1 = ((float *)in1->p); 00387 ip2 = ((float *)in2->p); 00388 is1 = in1->stride; 00389 is2 = in2->stride; 00390 00391 if ((is1==1)&&(is2==1)) { 00392 FAST_DEC_SETUP(n); 00393 while (FAST_DEC(n)) { 00394 tmp = *ip1; 00395 *ip1++ = *ip2; 00396 *ip2++ = tmp; 00397 } 00398 } else { 00399 FAST_DEC_SETUP(n); 00400 while (FAST_DEC(n)) { 00401 tmp = *ip1; 00402 *ip1 = *ip2; 00403 *ip2 = tmp; 00404 ip1 += is1; ip2 += is2; 00405 } 00406 } 00407 } 00408 00409 void jit_op_vector_swap_float32_complex(long n, void *vecdata, t_jit_op_info *in1, t_jit_op_info *in2, t_jit_op_info *out) 00410 { 00411 float *ip1,*ip2,tmp; 00412 long is1,is2; 00413 00414 ip1 = ((float *)in1->p); 00415 ip2 = ((float *)in2->p); 00416 is1 = in1->stride; 00417 is2 = in2->stride; 00418 00419 FAST_DEC_SETUP(n); 00420 while (FAST_DEC(n)) { 00421 //real 00422 tmp = ip1[0]; 00423 ip1[0] = ip2[0]; 00424 ip2[0] = tmp; 00425 //imag 00426 tmp = ip1[1]; 00427 ip1[1] = ip2[1]; 00428 ip2[1] = tmp; 00429 ip1 += is1; ip2 += is2; 00430 } 00431 } 00432 00433 void jit_op_vector_swap_float64(long n, void *vecdata, t_jit_op_info *in1, t_jit_op_info *in2, t_jit_op_info *out) 00434 { 00435 double *ip1,*ip2,tmp; 00436 long is1,is2; 00437 00438 ip1 = ((double *)in1->p); 00439 ip2 = ((double *)in2->p); 00440 is1 = in1->stride; 00441 is2 = in2->stride; 00442 00443 if ((is1==1)&&(is2==1)) { 00444 FAST_DEC_SETUP(n); 00445 while (FAST_DEC(n)) { 00446 tmp = *ip1; 00447 *ip1++ = *ip2; 00448 *ip2++ = tmp; 00449 } 00450 } else { 00451 FAST_DEC_SETUP(n); 00452 while (FAST_DEC(n)) { 00453 tmp = *ip1; 00454 *ip1 = *ip2; 00455 *ip2 = tmp; 00456 ip1 += is1; ip2 += is2; 00457 } 00458 } 00459 } 00460 00461 void jit_op_vector_swap_float64_complex(long n, void *vecdata, t_jit_op_info *in1, t_jit_op_info *in2, t_jit_op_info *out) 00462 { 00463 double *ip1,*ip2,tmp; 00464 long is1,is2; 00465 00466 ip1 = ((double *)in1->p); 00467 ip2 = ((double *)in2->p); 00468 is1 = in1->stride; 00469 is2 = in2->stride; 00470 00471 FAST_DEC_SETUP(n); 00472 while (FAST_DEC(n)) { 00473 //real 00474 tmp = ip1[0]; 00475 ip1[0] = ip2[0]; 00476 ip2[0] = tmp; 00477 //imag 00478 tmp = ip1[1]; 00479 ip1[1] = ip2[1]; 00480 ip2[1] = tmp; 00481 ip1 += is1; ip2 += is2; 00482 } 00483 }
Copyright © 2008, Cycling '74