| @@ -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" | |||
| #ifdef FUNCTION_PROFILE | |||
| #include "functable.h" | |||
| @@ -7,6 +41,8 @@ | |||
| #define GAMSQ 16777216.e0 | |||
| #define RGAMSQ 5.9604645e-8 | |||
| #define TWO 2.e0 | |||
| #ifdef DOUBLE | |||
| #define ABS(x) fabs(x) | |||
| #else | |||
| @@ -25,181 +61,168 @@ void CNAME(FLOAT *dd1, FLOAT *dd2, FLOAT *dx1, FLOAT dy1, FLOAT *dparam){ | |||
| #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; | |||
| } | |||