Sanchayan Maity
2fcc51c2c1
While at it also add the libpthread static library amd m5op_x86 for matrix multiplication test code as well. Note that the splash2 benchmark code does not comply with gem5 coding guidelines. Academic guys never seem to follow 80 columns and no whitespace guideline :(.
305 lines
16 KiB
C
305 lines
16 KiB
C
/*************************************************************************/
|
|
/* */
|
|
/* Copyright (c) 1994 Stanford University */
|
|
/* */
|
|
/* All rights reserved. */
|
|
/* */
|
|
/* Permission is given to use, copy, and modify this software for any */
|
|
/* non-commercial purpose as long as this copyright notice is not */
|
|
/* removed. All other uses, including redistribution in whole or in */
|
|
/* part, are forbidden without prior written permission. */
|
|
/* */
|
|
/* This software is provided with absolutely no warranty and no */
|
|
/* support. */
|
|
/* */
|
|
/*************************************************************************/
|
|
|
|
/*
|
|
* VECTMATH.H: include file for vector/matrix operations.
|
|
*/
|
|
|
|
#ifndef _VECMATH_H_
|
|
#define _VECMATH_H_
|
|
|
|
|
|
|
|
#define NDIM 3L
|
|
|
|
typedef real vector[NDIM], matrix[NDIM][NDIM];
|
|
|
|
/*
|
|
* Vector operations.
|
|
*/
|
|
|
|
#define CLRV(v) /* CLeaR Vector */ \
|
|
{ \
|
|
register long _i; \
|
|
for (_i = 0; _i < NDIM; _i++) \
|
|
(v)[_i] = 0.0; \
|
|
}
|
|
|
|
#define UNITV(v,j) /* UNIT Vector */ \
|
|
{ \
|
|
register long _i; \
|
|
for (_i = 0; _i < NDIM; _i++) \
|
|
(v)[_i] = (_i == (j) ? 1.0 : 0.0); \
|
|
}
|
|
|
|
#define SETV(v,u) /* SET Vector */ \
|
|
{ \
|
|
register long _i; \
|
|
for (_i = 0; _i < NDIM; _i++) \
|
|
(v)[_i] = (u)[_i]; \
|
|
}
|
|
|
|
|
|
#define ADDV(v,u,w) /* ADD Vector */ \
|
|
{ \
|
|
register real *_vp = (v), *_up = (u), *_wp = (w); \
|
|
*_vp++ = (*_up++) + (*_wp++); \
|
|
*_vp++ = (*_up++) + (*_wp++); \
|
|
*_vp = (*_up ) + (*_wp ); \
|
|
}
|
|
|
|
#define SUBV(v,u,w) /* SUBtract Vector */ \
|
|
{ \
|
|
register real *_vp = (v), *_up = (u), *_wp = (w); \
|
|
*_vp++ = (*_up++) - (*_wp++); \
|
|
*_vp++ = (*_up++) - (*_wp++); \
|
|
*_vp = (*_up ) - (*_wp ); \
|
|
}
|
|
|
|
#define MULVS(v,u,s) /* MULtiply Vector by Scalar */ \
|
|
{ \
|
|
register real *_vp = (v), *_up = (u); \
|
|
*_vp++ = (*_up++) * (s); \
|
|
*_vp++ = (*_up++) * (s); \
|
|
*_vp = (*_up ) * (s); \
|
|
}
|
|
|
|
|
|
#define DIVVS(v,u,s) /* DIVide Vector by Scalar */ \
|
|
{ \
|
|
register long _i; \
|
|
for (_i = 0; _i < NDIM; _i++) \
|
|
(v)[_i] = (u)[_i] / (s); \
|
|
}
|
|
|
|
|
|
#define DOTVP(s,v,u) /* DOT Vector Product */ \
|
|
{ \
|
|
register real *_vp = (v), *_up = (u); \
|
|
(s) = (*_vp++) * (*_up++); \
|
|
(s) += (*_vp++) * (*_up++); \
|
|
(s) += (*_vp ) * (*_up ); \
|
|
}
|
|
|
|
|
|
#define ABSV(s,v) /* ABSolute value of a Vector */ \
|
|
{ \
|
|
double _tmp, sqrt(); \
|
|
register long _i; \
|
|
_tmp = 0.0; \
|
|
for (_i = 0; _i < NDIM; _i++) \
|
|
_tmp += (v)[_i] * (v)[_i]; \
|
|
(s) = sqrt(_tmp); \
|
|
}
|
|
|
|
#define DISTV(s,u,v) /* DISTance between Vectors */ \
|
|
{ \
|
|
double _tmp, sqrt(); \
|
|
register long _i; \
|
|
_tmp = 0.0; \
|
|
for (_i = 0; _i < NDIM; _i++) \
|
|
_tmp += ((u)[_i]-(v)[_i]) * ((u)[_i]-(v)[_i]); \
|
|
(s) = sqrt(_tmp); \
|
|
}
|
|
|
|
|
|
|
|
#define CROSSVP(v,u,w) /* CROSS Vector Product */ \
|
|
{ \
|
|
(v)[0] = (u)[1]*(w)[2] - (u)[2]*(w)[1]; \
|
|
(v)[1] = (u)[2]*(w)[0] - (u)[0]*(w)[2]; \
|
|
(v)[2] = (u)[0]*(w)[1] - (u)[1]*(w)[0]; \
|
|
}
|
|
|
|
|
|
#define INCADDV(v,u) /* INCrementally ADD Vector */ \
|
|
{ \
|
|
register long _i; \
|
|
for (_i = 0; _i < NDIM; _i++) \
|
|
(v)[_i] += (u)[_i]; \
|
|
}
|
|
|
|
#define INCSUBV(v,u) /* INCrementally SUBtract Vector */ \
|
|
{ \
|
|
register long _i; \
|
|
for (_i = 0; _i < NDIM; _i++) \
|
|
(v)[_i] -= (u)[_i]; \
|
|
}
|
|
|
|
#define INCMULVS(v,s) /* INCrementally MULtiply Vector by Scalar */ \
|
|
{ \
|
|
register long _i; \
|
|
for (_i = 0; _i < NDIM; _i++) \
|
|
(v)[_i] *= (s); \
|
|
}
|
|
|
|
#define INCDIVVS(v,s) /* INCrementally DIVide Vector by Scalar */ \
|
|
{ \
|
|
register long _i; \
|
|
for (_i = 0; _i < NDIM; _i++) \
|
|
(v)[_i] /= (s); \
|
|
}
|
|
|
|
/*
|
|
* Matrix operations.
|
|
*/
|
|
|
|
#define CLRM(p) /* CLeaR Matrix */ \
|
|
{ \
|
|
register long _i, _j; \
|
|
for (_i = 0; _i < NDIM; _i++) \
|
|
for (_j = 0; _j < NDIM; _j++) \
|
|
(p)[_i][_j] = 0.0; \
|
|
}
|
|
|
|
#define SETMI(p) /* SET Matrix to Identity */ \
|
|
{ \
|
|
register long _i, _j; \
|
|
for (_i = 0; _i < NDIM; _i++) \
|
|
for (_j = 0; _j < NDIM; _j++) \
|
|
(p)[_i][_j] = (_i == _j ? 1.0 : 0.0); \
|
|
}
|
|
|
|
#define SETM(p,q) /* SET Matrix */ \
|
|
{ \
|
|
register long _i, _j; \
|
|
for (_i = 0; _i < NDIM; _i++) \
|
|
for (_j = 0; _j < NDIM; _j++) \
|
|
(p)[_i][_j] = (q)[_i][_j]; \
|
|
}
|
|
|
|
#define TRANM(p,q) /* TRANspose Matrix */ \
|
|
{ \
|
|
register long _i, _j; \
|
|
for (_i = 0; _i < NDIM; _i++) \
|
|
for (_j = 0; _j < NDIM; _j++) \
|
|
(p)[_i][_j] = (q)[_j][_i]; \
|
|
}
|
|
|
|
#define ADDM(p,q,r) /* ADD Matrix */ \
|
|
{ \
|
|
register long _i, _j; \
|
|
for (_i = 0; _i < NDIM; _i++) \
|
|
for (_j = 0; _j < NDIM; _j++) \
|
|
(p)[_i][_j] = (q)[_i][_j] + (r)[_i][_j]; \
|
|
}
|
|
|
|
#define SUBM(p,q,r) /* SUBtract Matrix */ \
|
|
{ \
|
|
register long _i, _j; \
|
|
for (_i = 0; _i < NDIM; _i++) \
|
|
for (_j = 0; _j < NDIM; _j++) \
|
|
(p)[_i][_j] = (q)[_i][_j] - (r)[_i][_j]; \
|
|
}
|
|
|
|
#define MULM(p,q,r) /* Multiply Matrix */ \
|
|
{ \
|
|
register long _i, _j, _k; \
|
|
for (_i = 0; _i < NDIM; _i++) \
|
|
for (_j = 0; _j < NDIM; _j++) { \
|
|
(p)[_i][_j] = 0.0; \
|
|
for (_k = 0; _k < NDIM; _k++) \
|
|
(p)[_i][_j] += (q)[_i][_k] * (r)[_k][_j]; \
|
|
} \
|
|
}
|
|
|
|
#define MULMS(p,q,s) /* MULtiply Matrix by Scalar */ \
|
|
{ \
|
|
register long _i, _j; \
|
|
for (_i = 0; _i < NDIM; _i++) \
|
|
for (_j = 0; _j < NDIM; _j++) \
|
|
(p)[_i][_j] = (q)[_i][_j] * (s); \
|
|
}
|
|
|
|
#define DIVMS(p,q,s) /* DIVide Matrix by Scalar */ \
|
|
{ \
|
|
register long _i, _j; \
|
|
for (_i = 0; _i < NDIM; _i++) \
|
|
for (_j = 0; _j < NDIM; _j++) \
|
|
(p)[_i][_j] = (q)[_i][_j] / (s); \
|
|
}
|
|
|
|
#define MULMV(v,p,u) /* MULtiply Matrix by Vector */ \
|
|
{ \
|
|
register long _i, _j; \
|
|
for (_i = 0; _i < NDIM; _i++) { \
|
|
(v)[_i] = 0.0; \
|
|
for (_j = 0; _j < NDIM; _j++) \
|
|
(v)[_i] += (p)[_i][_j] * (u)[_j]; \
|
|
} \
|
|
}
|
|
|
|
#define OUTVP(p,v,u) /* OUTer Vector Product */ \
|
|
{ \
|
|
register long _i, _j; \
|
|
for (_i = 0; _i < NDIM; _i++) \
|
|
for (_j = 0; _j < NDIM; _j++) \
|
|
(p)[_i][_j] = (v)[_i] * (u)[_j]; \
|
|
}
|
|
|
|
#define TRACEM(s,p) /* TRACE of Matrix */ \
|
|
{ \
|
|
register long _i; \
|
|
(s) = 0.0; \
|
|
for (_i = 0.0; _i < NDIM; _i++) \
|
|
(s) += (p)[_i][_i]; \
|
|
}
|
|
|
|
/*
|
|
* Misc. impure operations.
|
|
*/
|
|
|
|
#define SETVS(v,s) /* SET Vector to Scalar */ \
|
|
{ \
|
|
register long _i; \
|
|
for (_i = 0; _i < NDIM; _i++) \
|
|
(v)[_i] = (s); \
|
|
}
|
|
|
|
#define ADDVS(v,u,s) /* ADD Vector and Scalar */ \
|
|
{ \
|
|
register long _i; \
|
|
for (_i = 0; _i < NDIM; _i++) \
|
|
(v)[_i] = (u)[_i] + (s); \
|
|
}
|
|
|
|
#define SETMS(p,s) /* SET Matrix to Scalar */ \
|
|
{ \
|
|
register long _i, _j; \
|
|
for (_i = 0; _i < NDIM; _i++) \
|
|
for (_j = 0; _j < NDIM; _j++) \
|
|
(p)[_i][_j] = (s); \
|
|
}
|
|
|
|
#define PRTV(name, vec) /* PRinT Vector */ \
|
|
{ \
|
|
fprintf(stdout,"%s = [%9.4f,%9.4f,%9.4f] ",name,vec[0],vec[1],vec[2]); \
|
|
}
|
|
#define PRIV(name, vec) /* PRint Integer Vector */ \
|
|
{ \
|
|
fprintf(stdout,"%s = [%d,%d,%d] ",name,vec[0],vec[1],vec[2]); \
|
|
}
|
|
#define PROV(name, vec) /* PRint Integer Vector */ \
|
|
{ \
|
|
fprintf(stdout,"%s = [%o,%o,%o] ",name,vec[0],vec[1],vec[2]); \
|
|
}
|
|
#define PRHV(name, vec) /* PRint Integer Vector */ \
|
|
{ \
|
|
fprintf(stdout,"%s = [%x,%x,%x] ",name,vec[0],vec[1],vec[2]); \
|
|
}
|
|
|
|
#endif
|
|
|