1
+ /***************************************************************************
2
+ Copyright (c) 2013, The OpenBLAS Project
3
+ All rights reserved.
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are
6
+ met:
7
+ 1. Redistributions of source code must retain the above copyright
8
+ notice, this list of conditions and the following disclaimer.
9
+ 2. Redistributions in binary form must reproduce the above copyright
10
+ notice, this list of conditions and the following disclaimer in
11
+ the documentation and/or other materials provided with the
12
+ distribution.
13
+ 3. Neither the name of the OpenBLAS project nor the names of
14
+ its contributors may be used to endorse or promote products
15
+ derived from this software without specific prior written permission.
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
+ ARE DISCLAIMED. IN NO EVENT SHALL THE OPENBLAS PROJECT OR CONTRIBUTORS BE
20
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
25
+ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
+ *****************************************************************************/
27
+
28
+ /**************************************************************************************
29
+ * 2014/02/28 Saar
30
+ * Test with lapack-3.5.0 : OK
31
+ *
32
+ **************************************************************************************/
33
+
34
+
1
35
#include "common.h"
2
36
#ifdef FUNCTION_PROFILE
3
37
#include "functable.h"
7
41
#define GAMSQ 16777216.e0
8
42
#define RGAMSQ 5.9604645e-8
9
43
44
+ #define TWO 2.e0
45
+
10
46
#ifdef DOUBLE
11
47
#define ABS (x ) fabs(x)
12
48
#else
@@ -25,181 +61,168 @@ void CNAME(FLOAT *dd1, FLOAT *dd2, FLOAT *dx1, FLOAT dy1, FLOAT *dparam){
25
61
26
62
#endif
27
63
28
- FLOAT du , dp1 , dp2 , dq2 , dq1 , dh11 , dh21 , dh12 , dh22 ;
29
- int igo , flag ;
30
- FLOAT dtemp ;
31
-
32
- #ifndef CBLAS
33
- PRINT_DEBUG_NAME ;
34
- #else
35
- PRINT_DEBUG_CNAME ;
36
- #endif
37
-
38
- dh11 = ZERO ;
39
- dh12 = ZERO ;
40
- dh21 = ZERO ;
41
- dh22 = ZERO ;
42
-
43
- if (* dd1 < ZERO ) goto L60 ;
44
-
45
- dp2 = * dd2 * dy1 ;
46
-
47
- if (dp2 == ZERO ) {
48
- flag = -2 ;
49
- goto L260 ;
50
- }
51
-
52
- dp1 = * dd1 * * dx1 ;
53
- dq2 = dp2 * dy1 ;
54
- dq1 = dp1 * * dx1 ;
55
-
56
- if (! (ABS (dq1 ) > ABS (dq2 ))) goto L40 ;
57
-
58
- dh21 = - (dy1 ) / * dx1 ;
59
- dh12 = dp2 / dp1 ;
60
-
61
- du = ONE - dh12 * dh21 ;
62
-
63
- if (du <= ZERO ) goto L60 ;
64
-
65
- flag = 0 ;
66
- * dd1 /= du ;
67
- * dd2 /= du ;
68
- * dx1 *= du ;
69
-
70
- goto L100 ;
71
-
72
- L40 :
73
- if (dq2 < ZERO ) goto L60 ;
74
-
75
- flag = 1 ;
76
- dh11 = dp1 / dp2 ;
77
- dh22 = * dx1 / dy1 ;
78
- du = ONE + dh11 * dh22 ;
79
- dtemp = * dd2 / du ;
80
- * dd2 = * dd1 / du ;
81
- * dd1 = dtemp ;
82
- * dx1 = dy1 * du ;
83
- goto L100 ;
84
-
85
- L60 :
86
- flag = -1 ;
87
- dh11 = ZERO ;
88
- dh12 = ZERO ;
89
- dh21 = ZERO ;
90
- dh22 = ZERO ;
91
-
92
- * dd1 = ZERO ;
93
- * dd2 = ZERO ;
94
- * dx1 = ZERO ;
95
- goto L220 ;
96
-
97
-
98
- L70 :
99
- if (flag < 0 ) goto L90 ;
100
-
101
- if (flag > 0 ) goto L80 ;
102
-
103
- dh11 = ONE ;
104
- dh22 = ONE ;
105
- flag = -1 ;
106
- goto L90 ;
107
-
108
- L80 :
109
- dh21 = - ONE ;
110
- dh12 = ONE ;
111
- flag = -1 ;
112
-
113
- L90 :
114
- switch (igo ) {
115
- case 0 : goto L120 ;
116
- case 1 : goto L150 ;
117
- case 2 : goto L180 ;
118
- case 3 : goto L210 ;
119
- }
120
-
121
- L100 :
122
- if (!(* dd1 <= RGAMSQ )) goto L130 ;
123
- if (* dd1 == ZERO ) goto L160 ;
124
- igo = 0 ;
125
- goto L70 ;
126
-
127
- L120 :
128
- * dd1 *= GAM * GAM ;
129
- * dx1 /= GAM ;
130
- dh11 /= GAM ;
131
- dh12 /= GAM ;
132
- goto L100 ;
133
-
134
- L130 :
135
- if (! (* dd1 >= GAMSQ )) {
136
- goto L160 ;
137
- }
138
- igo = 1 ;
139
- goto L70 ;
140
-
141
- L150 :
142
- * dd1 /= GAM * GAM ;
143
- * dx1 *= GAM ;
144
- dh11 *= GAM ;
145
- dh12 *= GAM ;
146
- goto L130 ;
147
-
148
- L160 :
149
- if (! (ABS (* dd2 ) <= RGAMSQ )) {
150
- goto L190 ;
151
- }
152
- if (* dd2 == ZERO ) {
153
- goto L220 ;
154
- }
155
- igo = 2 ;
156
- goto L70 ;
157
-
158
- L180 :
159
- /* Computing 2nd power */
160
- * dd2 *= GAM * GAM ;
161
- dh21 /= GAM ;
162
- dh22 /= GAM ;
163
- goto L160 ;
164
-
165
- L190 :
166
- if (! (ABS (* dd2 ) >= GAMSQ )) {
167
- goto L220 ;
168
- }
169
- igo = 3 ;
170
- goto L70 ;
171
-
172
- L210 :
173
- /* Computing 2nd power */
174
- * dd2 /= GAM * GAM ;
175
- dh21 *= GAM ;
176
- dh22 *= GAM ;
177
- goto L190 ;
178
-
179
- L220 :
180
- if (flag < 0 ) {
181
- goto L250 ;
182
- } else if (flag == 0 ) {
183
- goto L230 ;
184
- } else {
185
- goto L240 ;
186
- }
187
- L230 :
188
- dparam [2 ] = dh21 ;
189
- dparam [3 ] = dh12 ;
190
- goto L260 ;
191
- L240 :
192
- dparam [2 ] = dh11 ;
193
- dparam [4 ] = dh22 ;
194
- goto L260 ;
195
- L250 :
196
- dparam [1 ] = dh11 ;
197
- dparam [2 ] = dh21 ;
198
- dparam [3 ] = dh12 ;
199
- dparam [4 ] = dh22 ;
200
- L260 :
201
- dparam [0 ] = (FLOAT ) flag ;
202
- return ;
64
+ FLOAT du , dp1 , dp2 , dq2 , dq1 , dh11 , dh21 , dh12 , dh22 , dflag , dtemp ;
65
+
66
+ if (* dd1 < ZERO )
67
+ {
68
+ dflag = - ONE ;
69
+ dh11 = ZERO ;
70
+ dh12 = ZERO ;
71
+ dh21 = ZERO ;
72
+ dh22 = ZERO ;
73
+
74
+ * dd1 = ZERO ;
75
+ * dd2 = ZERO ;
76
+ * dx1 = ZERO ;
77
+ }
78
+ else
79
+ {
80
+ dp2 = * dd2 * dy1 ;
81
+ if (dp2 == ZERO )
82
+ {
83
+ dflag = - TWO ;
84
+ dparam [0 ] = dflag ;
85
+ return ;
86
+ }
87
+ dp1 = * dd1 * * dx1 ;
88
+ dq2 = dp2 * dy1 ;
89
+ dq1 = dp1 * * dx1 ;
90
+ if (ABS (dq1 ) > ABS (dq2 ))
91
+ {
92
+ dh21 = - dy1 / * dx1 ;
93
+ dh12 = dp2 / dp1 ;
94
+
95
+ du = ONE - dh12 * dh21 ;
96
+ if (du > ZERO )
97
+ {
98
+ dflag = ZERO ;
99
+ * dd1 = * dd1 / du ;
100
+ * dd2 = * dd2 / du ;
101
+ * dx1 = * dx1 * du ;
102
+
103
+ }
104
+ }
105
+ else
106
+ {
107
+ if (dq2 < ZERO )
108
+ {
109
+ dflag = - ONE ;
110
+
111
+ dh11 = ZERO ;
112
+ dh12 = ZERO ;
113
+ dh21 = ZERO ;
114
+ dh22 = ZERO ;
115
+
116
+ * dd1 = ZERO ;
117
+ * dd2 = ZERO ;
118
+ * dx1 = ZERO ;
119
+ }
120
+ else
121
+ {
122
+ dflag = ONE ;
123
+
124
+ dh11 = dp1 / dp2 ;
125
+ dh22 = * dx1 / dy1 ;
126
+ du = ONE + dh11 * dh22 ;
127
+ dtemp = * dd2 / du ;
128
+
129
+ * dd2 = * dd1 / du ;
130
+ * dd1 = dtemp ;
131
+ * dx1 = dy1 * du ;
132
+ }
133
+ }
134
+
135
+
136
+ if (* dd1 != ZERO )
137
+ {
138
+ while ( (* dd1 <= RGAMSQ ) || (* dd1 >= GAMSQ ) )
139
+ {
140
+ if (dflag == ZERO )
141
+ {
142
+ dh11 = ONE ;
143
+ dh22 = ONE ;
144
+ dflag = - ONE ;
145
+ }
146
+ else
147
+ {
148
+ dh21 = - ONE ;
149
+ dh12 = ONE ;
150
+ dflag = - ONE ;
151
+ }
152
+ if ( * dd1 <= RGAMSQ )
153
+ {
154
+ * dd1 = * dd1 * (GAM * GAM );
155
+ * dx1 = * dx1 / GAM ;
156
+ dh11 = dh11 / GAM ;
157
+ dh12 = dh12 / GAM ;
158
+ }
159
+ else
160
+ {
161
+ * dd1 = * dd1 / (GAM * GAM );
162
+ * dx1 = * dx1 * GAM ;
163
+ dh11 = dh11 * GAM ;
164
+ dh12 = dh12 * GAM ;
165
+ }
166
+ }
167
+ }
168
+
169
+ if (* dd2 != ZERO )
170
+ {
171
+ while ( (ABS (* dd2 ) <= RGAMSQ ) || (ABS (* dd2 ) >= GAMSQ ) )
172
+ {
173
+ if (dflag == ZERO )
174
+ {
175
+ dh11 = ONE ;
176
+ dh22 = ONE ;
177
+ dflag = - ONE ;
178
+ }
179
+ else
180
+ {
181
+ dh21 = - ONE ;
182
+ dh12 = ONE ;
183
+ dflag = - ONE ;
184
+ }
185
+ if ( ABS (* dd2 ) <= RGAMSQ )
186
+ {
187
+ * dd2 = * dd2 * (GAM * GAM );
188
+ dh21 = dh21 / GAM ;
189
+ dh22 = dh22 / GAM ;
190
+ }
191
+ else
192
+ {
193
+ * dd2 = * dd2 / (GAM * GAM );
194
+ dh21 = dh21 * GAM ;
195
+ dh22 = dh22 * GAM ;
196
+ }
197
+ }
198
+ }
199
+
200
+ }
201
+
202
+ if (dflag < ZERO )
203
+ {
204
+ dparam [1 ] = dh11 ;
205
+ dparam [2 ] = dh21 ;
206
+ dparam [3 ] = dh12 ;
207
+ dparam [4 ] = dh22 ;
208
+ }
209
+ else
210
+ {
211
+ if (dflag == ZERO )
212
+ {
213
+ dparam [2 ] = dh21 ;
214
+ dparam [3 ] = dh12 ;
215
+ }
216
+ else
217
+ {
218
+ dparam [1 ] = dh11 ;
219
+ dparam [4 ] = dh22 ;
220
+ }
221
+ }
222
+
223
+
224
+ dparam [0 ] = dflag ;
225
+ return ;
203
226
}
204
227
205
228
0 commit comments