| @@ -1,3 +1,37 @@ | |||||
| /*************************************************************************** | |||||
| Copyright (c) 2013, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. Redistributions in binary form must reproduce the above copyright | |||||
| notice, this list of conditions and the following disclaimer in | |||||
| the documentation and/or other materials provided with the | |||||
| distribution. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written permission. | |||||
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |||||
| AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |||||
| IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |||||
| ARE DISCLAIMED. IN NO EVENT SHALL THE OPENBLAS PROJECT OR CONTRIBUTORS BE | |||||
| LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |||||
| DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |||||
| SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |||||
| CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
| OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE | |||||
| USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||
| *****************************************************************************/ | |||||
| /************************************************************************************** | |||||
| * 2014/02/28 Saar | |||||
| * Test with lapack-3.5.0 : OK | |||||
| * | |||||
| **************************************************************************************/ | |||||
| #include "common.h" | #include "common.h" | ||||
| #ifdef FUNCTION_PROFILE | #ifdef FUNCTION_PROFILE | ||||
| #include "functable.h" | #include "functable.h" | ||||
| @@ -7,6 +41,8 @@ | |||||
| #define GAMSQ 16777216.e0 | #define GAMSQ 16777216.e0 | ||||
| #define RGAMSQ 5.9604645e-8 | #define RGAMSQ 5.9604645e-8 | ||||
| #define TWO 2.e0 | |||||
| #ifdef DOUBLE | #ifdef DOUBLE | ||||
| #define ABS(x) fabs(x) | #define ABS(x) fabs(x) | ||||
| #else | #else | ||||
| @@ -25,181 +61,168 @@ void CNAME(FLOAT *dd1, FLOAT *dd2, FLOAT *dx1, FLOAT dy1, FLOAT *dparam){ | |||||
| #endif | #endif | ||||
| FLOAT du, dp1, dp2, dq2, dq1, dh11, dh21, dh12, dh22; | |||||
| int igo, flag; | |||||
| FLOAT dtemp; | |||||
| #ifndef CBLAS | |||||
| PRINT_DEBUG_NAME; | |||||
| #else | |||||
| PRINT_DEBUG_CNAME; | |||||
| #endif | |||||
| dh11 = ZERO; | |||||
| dh12 = ZERO; | |||||
| dh21 = ZERO; | |||||
| dh22 = ZERO; | |||||
| if (*dd1 < ZERO) goto L60; | |||||
| dp2 = *dd2 * dy1; | |||||
| if (dp2 == ZERO) { | |||||
| flag = -2; | |||||
| goto L260; | |||||
| } | |||||
| dp1 = *dd1 * *dx1; | |||||
| dq2 = dp2 * dy1; | |||||
| dq1 = dp1 * *dx1; | |||||
| if (! (ABS(dq1) > ABS(dq2))) goto L40; | |||||
| dh21 = -(dy1) / *dx1; | |||||
| dh12 = dp2 / dp1; | |||||
| du = ONE - dh12 * dh21; | |||||
| if (du <= ZERO) goto L60; | |||||
| flag = 0; | |||||
| *dd1 /= du; | |||||
| *dd2 /= du; | |||||
| *dx1 *= du; | |||||
| goto L100; | |||||
| L40: | |||||
| if (dq2 < ZERO) goto L60; | |||||
| flag = 1; | |||||
| dh11 = dp1 / dp2; | |||||
| dh22 = *dx1 / dy1; | |||||
| du = ONE + dh11 * dh22; | |||||
| dtemp = *dd2 / du; | |||||
| *dd2 = *dd1 / du; | |||||
| *dd1 = dtemp; | |||||
| *dx1 = dy1 * du; | |||||
| goto L100; | |||||
| L60: | |||||
| flag = -1; | |||||
| dh11 = ZERO; | |||||
| dh12 = ZERO; | |||||
| dh21 = ZERO; | |||||
| dh22 = ZERO; | |||||
| *dd1 = ZERO; | |||||
| *dd2 = ZERO; | |||||
| *dx1 = ZERO; | |||||
| goto L220; | |||||
| L70: | |||||
| if (flag < 0) goto L90; | |||||
| if (flag > 0) goto L80; | |||||
| dh11 = ONE; | |||||
| dh22 = ONE; | |||||
| flag = -1; | |||||
| goto L90; | |||||
| L80: | |||||
| dh21 = -ONE; | |||||
| dh12 = ONE; | |||||
| flag = -1; | |||||
| L90: | |||||
| switch (igo) { | |||||
| case 0: goto L120; | |||||
| case 1: goto L150; | |||||
| case 2: goto L180; | |||||
| case 3: goto L210; | |||||
| } | |||||
| L100: | |||||
| if (!(*dd1 <= RGAMSQ)) goto L130; | |||||
| if (*dd1 == ZERO) goto L160; | |||||
| igo = 0; | |||||
| goto L70; | |||||
| L120: | |||||
| *dd1 *= GAM * GAM; | |||||
| *dx1 /= GAM; | |||||
| dh11 /= GAM; | |||||
| dh12 /= GAM; | |||||
| goto L100; | |||||
| L130: | |||||
| if (! (*dd1 >= GAMSQ)) { | |||||
| goto L160; | |||||
| } | |||||
| igo = 1; | |||||
| goto L70; | |||||
| L150: | |||||
| *dd1 /= GAM * GAM; | |||||
| *dx1 *= GAM; | |||||
| dh11 *= GAM; | |||||
| dh12 *= GAM; | |||||
| goto L130; | |||||
| L160: | |||||
| if (! (ABS(*dd2) <= RGAMSQ)) { | |||||
| goto L190; | |||||
| } | |||||
| if (*dd2 == ZERO) { | |||||
| goto L220; | |||||
| } | |||||
| igo = 2; | |||||
| goto L70; | |||||
| L180: | |||||
| /* Computing 2nd power */ | |||||
| *dd2 *= GAM * GAM; | |||||
| dh21 /= GAM; | |||||
| dh22 /= GAM; | |||||
| goto L160; | |||||
| L190: | |||||
| if (! (ABS(*dd2) >= GAMSQ)) { | |||||
| goto L220; | |||||
| } | |||||
| igo = 3; | |||||
| goto L70; | |||||
| L210: | |||||
| /* Computing 2nd power */ | |||||
| *dd2 /= GAM * GAM; | |||||
| dh21 *= GAM; | |||||
| dh22 *= GAM; | |||||
| goto L190; | |||||
| L220: | |||||
| if (flag < 0) { | |||||
| goto L250; | |||||
| } else if (flag == 0) { | |||||
| goto L230; | |||||
| } else { | |||||
| goto L240; | |||||
| } | |||||
| L230: | |||||
| dparam[2] = dh21; | |||||
| dparam[3] = dh12; | |||||
| goto L260; | |||||
| L240: | |||||
| dparam[2] = dh11; | |||||
| dparam[4] = dh22; | |||||
| goto L260; | |||||
| L250: | |||||
| dparam[1] = dh11; | |||||
| dparam[2] = dh21; | |||||
| dparam[3] = dh12; | |||||
| dparam[4] = dh22; | |||||
| L260: | |||||
| dparam[0] = (FLOAT) flag; | |||||
| return; | |||||
| FLOAT du, dp1, dp2, dq2, dq1, dh11, dh21, dh12, dh22, dflag, dtemp; | |||||
| if(*dd1 < ZERO) | |||||
| { | |||||
| dflag = -ONE; | |||||
| dh11 = ZERO; | |||||
| dh12 = ZERO; | |||||
| dh21 = ZERO; | |||||
| dh22 = ZERO; | |||||
| *dd1 = ZERO; | |||||
| *dd2 = ZERO; | |||||
| *dx1 = ZERO; | |||||
| } | |||||
| else | |||||
| { | |||||
| dp2 = *dd2 * dy1; | |||||
| if(dp2 == ZERO) | |||||
| { | |||||
| dflag = -TWO; | |||||
| dparam[0] = dflag; | |||||
| return; | |||||
| } | |||||
| dp1 = *dd1 * *dx1; | |||||
| dq2 = dp2 * dy1; | |||||
| dq1 = dp1 * *dx1; | |||||
| if(ABS(dq1) > ABS(dq2)) | |||||
| { | |||||
| dh21 = - dy1 / *dx1; | |||||
| dh12 = dp2 / dp1; | |||||
| du = ONE - dh12 * dh21; | |||||
| if(du > ZERO) | |||||
| { | |||||
| dflag = ZERO; | |||||
| *dd1 = *dd1 / du; | |||||
| *dd2 = *dd2 / du; | |||||
| *dx1 = *dx1 * du; | |||||
| } | |||||
| } | |||||
| else | |||||
| { | |||||
| if(dq2 < ZERO) | |||||
| { | |||||
| dflag = -ONE; | |||||
| dh11 = ZERO; | |||||
| dh12 = ZERO; | |||||
| dh21 = ZERO; | |||||
| dh22 = ZERO; | |||||
| *dd1 = ZERO; | |||||
| *dd2 = ZERO; | |||||
| *dx1 = ZERO; | |||||
| } | |||||
| else | |||||
| { | |||||
| dflag = ONE; | |||||
| dh11 = dp1 / dp2; | |||||
| dh22 = *dx1 / dy1; | |||||
| du = ONE + dh11 * dh22; | |||||
| dtemp = *dd2 / du; | |||||
| *dd2 = *dd1 / du; | |||||
| *dd1 = dtemp; | |||||
| *dx1 = dy1 * du; | |||||
| } | |||||
| } | |||||
| if(*dd1 != ZERO) | |||||
| { | |||||
| while( (*dd1 <= RGAMSQ) || (*dd1 >= GAMSQ) ) | |||||
| { | |||||
| if(dflag == ZERO) | |||||
| { | |||||
| dh11 = ONE; | |||||
| dh22 = ONE; | |||||
| dflag = -ONE; | |||||
| } | |||||
| else | |||||
| { | |||||
| dh21 = -ONE; | |||||
| dh12 = ONE; | |||||
| dflag = -ONE; | |||||
| } | |||||
| if( *dd1 <= RGAMSQ ) | |||||
| { | |||||
| *dd1 = *dd1 * (GAM * GAM); | |||||
| *dx1 = *dx1 / GAM; | |||||
| dh11 = dh11 / GAM; | |||||
| dh12 = dh12 / GAM; | |||||
| } | |||||
| else | |||||
| { | |||||
| *dd1 = *dd1 / (GAM * GAM); | |||||
| *dx1 = *dx1 * GAM; | |||||
| dh11 = dh11 * GAM; | |||||
| dh12 = dh12 * GAM; | |||||
| } | |||||
| } | |||||
| } | |||||
| if(*dd2 != ZERO) | |||||
| { | |||||
| while( (ABS(*dd2) <= RGAMSQ) || (ABS(*dd2) >= GAMSQ) ) | |||||
| { | |||||
| if(dflag == ZERO) | |||||
| { | |||||
| dh11 = ONE; | |||||
| dh22 = ONE; | |||||
| dflag = -ONE; | |||||
| } | |||||
| else | |||||
| { | |||||
| dh21 = -ONE; | |||||
| dh12 = ONE; | |||||
| dflag = -ONE; | |||||
| } | |||||
| if( ABS(*dd2) <= RGAMSQ ) | |||||
| { | |||||
| *dd2 = *dd2 * (GAM * GAM); | |||||
| dh21 = dh21 / GAM; | |||||
| dh22 = dh22 / GAM; | |||||
| } | |||||
| else | |||||
| { | |||||
| *dd2 = *dd2 / (GAM * GAM); | |||||
| dh21 = dh21 * GAM; | |||||
| dh22 = dh22 * GAM; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| if(dflag < ZERO) | |||||
| { | |||||
| dparam[1] = dh11; | |||||
| dparam[2] = dh21; | |||||
| dparam[3] = dh12; | |||||
| dparam[4] = dh22; | |||||
| } | |||||
| else | |||||
| { | |||||
| if(dflag == ZERO) | |||||
| { | |||||
| dparam[2] = dh21; | |||||
| dparam[3] = dh12; | |||||
| } | |||||
| else | |||||
| { | |||||
| dparam[1] = dh11; | |||||
| dparam[4] = dh22; | |||||
| } | |||||
| } | |||||
| dparam[0] = dflag; | |||||
| return; | |||||
| } | } | ||||