Loading...
Searching...
No Matches
vectools.h
Go to the documentation of this file.
1/*
2 * SimQA: Copyright (C) Jakob Schiotz 1996, 1997
3 *
4 * IBM POWER2 optimized vector library:
5 * Header files for all the vectorized functions
6 */
7
8/* XXX Added extern"C" to everything? */
9
10#ifndef VECTOOLS_H
11#define VECTOOLS_H
12
13#ifdef _MSC_VER
14// XXX Need to disable under Microsoft console and _WIN32: what is the analog
15// for _MICROSOFT
16#pragma warning(disable : 4068) // turns off spurious Windows pragma warnings
17#endif // _MSC_VER
18
19/* res[] = a[] * b + c */
20inline void vec_mul_scal_add_scal(double res[], const double a[],
21 const double b, const double c, int n) {
22 for (int i = 0; i < n; i++)
23 res[i] = a[i] * b + c;
24}
25
26/* r[] = a[] * b[offset[]] + c[offset[]] */
27inline void vec_mul_indir_add_indir(double res[], const double a[],
28 const double b[], const double c[],
29 const int offset[], int n) {
30 for (int i = 0; i < n; i++)
31 res[i] = a[i] * b[offset[i]] + c[offset[i]];
32}
33
34/* res[] = a[] * b[] */
35inline void vec_mul(double res[], const double a[], const double b[], int n) {
36 for (int i = 0; i < n; i++)
37 res[i] = a[i] * b[i];
38}
39
40/* res[] = a[] * b */
41inline void vec_mul_scal(double res[], const double a[], double b, int n) {
42 for (int i = 0; i < n; i++)
43 res[i] = a[i] * b;
44}
45
46/* r[] = a[] * b[offset[]] */
47inline void vec_mul_indir(double res[], const double a[], const double b[],
48 const int offset[], int n) {
49 for (int i = 0; i < n; i++)
50 res[i] = a[i] * b[offset[i]];
51}
52
53/* res[] = res[] * a[] + b * c[] */
54inline void vec_eq_self_mul_addscal_mul(double res[], const double a[],
55 double b, const double c[], int n) {
56 for (int i = 0; i < n; i++)
57 res[i] = res[i] * a[i] + b * c[i];
58}
59
60/* r[] = r[] * a[] * b[offset[]] */
61inline void vec_self_mul_mul_indir(double res[], const double a[],
62 const double b[], const int offset[],
63 int n) {
64 for (int i = 0; i < n; i++)
65 res[i] = res[i] * a[i] * b[offset[i]];
66}
67
68/* res[] = (a[] - a[] * a[]) * b */
69inline void vec_diffweight(double res[], const double a[], double b, int n) {
70 for (int i = 0; i < n; i++)
71 res[i] = (a[i] - a[i] * a[i]) * b;
72}
73
74/* res[] = (a[] * b + c[]) * d[] */
75inline void vec_mul_scal_add_mul(double res[], const double a[], double b,
76 const double c[], const double d[], int n) {
77 for (int i = 0; i < n; i++)
78 res[i] = (a[i] * b + c[i]) * d[i];
79}
80
81/* r[] = (a[] * b[offset[]] + c[offset[]]) * d[] */
82inline void vec_mul_indir_add_indir_mul(double res[], const double a[],
83 const double b[], const double c[],
84 const double d[], const int offset[],
85 int n) {
86 for (int i = 0; i < n; i++)
87 res[i] = (a[i] * b[offset[i]] + c[offset[i]]) * d[i];
88}
89
90/* r[] = a[] * b[offset[]] + c[] * d[offset[]] */
91inline void vec_dbl_mul_indir_add(double res[], const double a[],
92 const double b[], const double c[],
93 const double d[], const int offset[], int n) {
94 for (int i = 0; i < n; i++)
95 res[i] = a[i] * b[offset[i]] + c[i] * d[offset[i]];
96}
97
98/* res[] = (d[offset[]] * a[] + e[offset[]]) * b[] + f[offset[]] * c[] */
99inline void vec_dEds(double res[], const double a[], const double b[],
100 const double c[], const double d[], const double e[],
101 const double f[], const int offset[], int n) {
102 for (int i = 0; i < n; i++)
103 res[i] = (d[offset[i]] * a[i] + e[offset[i]]) * b[i] + f[offset[i]] * c[i];
104}
105
106/* r[] = a[] * (b[] * c[] * d + e[] * f + g[] * h[] * x + y[] * z) */
107/* Note that sometimes b==g and e==y !!!!! */
108inline void vec_df(double *res, const double *a, const double *b,
109 const double *c, double d, const double *e, double f,
110 const double *g, const double *h, double x, const double *y,
111 double z, int n) {
112 for (int i = 0; i < n; i++)
113 res[i] = a[i] * (b[i] * c[i] * d + e[i] * f + g[i] * h[i] * x + y[i] * z);
114}
115
116/* r[] = a[] + b */
117inline void vec_add_scal(double res[], const double a[], double b, int n) {
118 for (int i = 0; i < n; i++)
119 res[i] = a[i] + b;
120}
121
122#endif // VECTOOLS_H
void vec_mul_indir_add_indir_mul(double res[], const double a[], const double b[], const double c[], const double d[], const int offset[], int n)
Definition vectools.h:82
void vec_mul_indir_add_indir(double res[], const double a[], const double b[], const double c[], const int offset[], int n)
Definition vectools.h:27
void vec_diffweight(double res[], const double a[], double b, int n)
Definition vectools.h:69
void vec_mul(double res[], const double a[], const double b[], int n)
Definition vectools.h:35
void vec_mul_scal_add_scal(double res[], const double a[], const double b, const double c, int n)
Definition vectools.h:20
void vec_mul_scal(double res[], const double a[], double b, int n)
Definition vectools.h:41
void vec_dEds(double res[], const double a[], const double b[], const double c[], const double d[], const double e[], const double f[], const int offset[], int n)
Definition vectools.h:99
void vec_df(double *res, const double *a, const double *b, const double *c, double d, const double *e, double f, const double *g, const double *h, double x, const double *y, double z, int n)
Definition vectools.h:108
void vec_mul_indir(double res[], const double a[], const double b[], const int offset[], int n)
Definition vectools.h:47
void vec_self_mul_mul_indir(double res[], const double a[], const double b[], const int offset[], int n)
Definition vectools.h:61
void vec_mul_scal_add_mul(double res[], const double a[], double b, const double c[], const double d[], int n)
Definition vectools.h:75
void vec_dbl_mul_indir_add(double res[], const double a[], const double b[], const double c[], const double d[], const int offset[], int n)
Definition vectools.h:91
void vec_eq_self_mul_addscal_mul(double res[], const double a[], double b, const double c[], int n)
Definition vectools.h:54
void vec_add_scal(double res[], const double a[], double b, int n)
Definition vectools.h:117