Update to 2.0.0 tree from current Fremantle build
[opencv] / 3rdparty / lapack / ddot.c
1 #include "clapack.h"
2
3 doublereal ddot_(integer *n, doublereal *dx, integer *incx, doublereal *dy, 
4         integer *incy)
5 {
6     /* System generated locals */
7     integer i__1;
8     doublereal ret_val;
9
10     /* Local variables */
11     integer i__, m, ix, iy, mp1;
12     doublereal dtemp;
13
14 /*     .. Scalar Arguments .. */
15 /*     .. */
16 /*     .. Array Arguments .. */
17 /*     .. */
18
19 /*  Purpose */
20 /*  ======= */
21
22 /*     forms the dot product of two vectors. */
23 /*     uses unrolled loops for increments equal to one. */
24 /*     jack dongarra, linpack, 3/11/78. */
25 /*     modified 12/3/93, array(1) declarations changed to array(*) */
26
27
28 /*     .. Local Scalars .. */
29 /*     .. */
30 /*     .. Intrinsic Functions .. */
31 /*     .. */
32     /* Parameter adjustments */
33     --dy;
34     --dx;
35
36     /* Function Body */
37     ret_val = 0.;
38     dtemp = 0.;
39     if (*n <= 0) {
40         return ret_val;
41     }
42     if (*incx == 1 && *incy == 1) {
43         goto L20;
44     }
45
46 /*        code for unequal increments or equal increments */
47 /*          not equal to 1 */
48
49     ix = 1;
50     iy = 1;
51     if (*incx < 0) {
52         ix = (-(*n) + 1) * *incx + 1;
53     }
54     if (*incy < 0) {
55         iy = (-(*n) + 1) * *incy + 1;
56     }
57     i__1 = *n;
58     for (i__ = 1; i__ <= i__1; ++i__) {
59         dtemp += dx[ix] * dy[iy];
60         ix += *incx;
61         iy += *incy;
62 /* L10: */
63     }
64     ret_val = dtemp;
65     return ret_val;
66
67 /*        code for both increments equal to 1 */
68
69
70 /*        clean-up loop */
71
72 L20:
73     m = *n % 5;
74     if (m == 0) {
75         goto L40;
76     }
77     i__1 = m;
78     for (i__ = 1; i__ <= i__1; ++i__) {
79         dtemp += dx[i__] * dy[i__];
80 /* L30: */
81     }
82     if (*n < 5) {
83         goto L60;
84     }
85 L40:
86     mp1 = m + 1;
87     i__1 = *n;
88     for (i__ = mp1; i__ <= i__1; i__ += 5) {
89         dtemp = dtemp + dx[i__] * dy[i__] + dx[i__ + 1] * dy[i__ + 1] + dx[
90                 i__ + 2] * dy[i__ + 2] + dx[i__ + 3] * dy[i__ + 3] + dx[i__ + 
91                 4] * dy[i__ + 4];
92 /* L50: */
93     }
94 L60:
95     ret_val = dtemp;
96     return ret_val;
97 } /* ddot_ */