tahoma2d/thirdparty/openblas/xianyi-OpenBLAS-e6e87a2/interface/rotmg.c
2016-03-24 02:47:04 +09:00

205 lines
2.9 KiB
C

#include "common.h"
#ifdef FUNCTION_PROFILE
#include "functable.h"
#endif
#define GAM 4096.e0
#define GAMSQ 16777216.e0
#define RGAMSQ 5.9604645e-8
#ifdef DOUBLE
#define ABS(x) fabs(x)
#else
#define ABS(x) fabsf(x)
#endif
#ifndef CBLAS
void NAME(FLOAT *dd1, FLOAT *dd2, FLOAT *dx1, FLOAT *DY1, FLOAT *dparam){
FLOAT dy1 = *DY1;
#else
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;
}