| @@ -39,10 +39,19 @@ FLOAT CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x, FLOAT *y, BLASLONG inc_y) | |||||
| FLOAT x0, x1, x2, x3, y0, y1, y2, y3; | FLOAT x0, x1, x2, x3, y0, y1, y2, y3; | ||||
| v4f32 vx0, vx1, vx2, vx3, vx4, vx5, vx6, vx7; | v4f32 vx0, vx1, vx2, vx3, vx4, vx5, vx6, vx7; | ||||
| v4f32 vy0, vy1, vy2, vy3, vy4, vy5, vy6, vy7; | v4f32 vy0, vy1, vy2, vy3, vy4, vy5, vy6, vy7; | ||||
| #if defined(DSDOT) | |||||
| v2f64 dvx0, dvx1, dvx2, dvx3, dvx4, dvx5, dvx6, dvx7; | |||||
| v2f64 dvy0, dvy1, dvy2, dvy3, dvy4, dvy5, dvy6, dvy7; | |||||
| v2f64 dot0 = {0, 0}; | |||||
| v2f64 dot1 = {0, 0}; | |||||
| v2f64 dot2 = {0, 0}; | |||||
| v2f64 dot3 = {0, 0}; | |||||
| #else | |||||
| v4f32 dot0 = {0, 0, 0, 0}; | v4f32 dot0 = {0, 0, 0, 0}; | ||||
| v4f32 dot1 = {0, 0, 0, 0}; | v4f32 dot1 = {0, 0, 0, 0}; | ||||
| v4f32 dot2 = {0, 0, 0, 0}; | v4f32 dot2 = {0, 0, 0, 0}; | ||||
| v4f32 dot3 = {0, 0, 0, 0}; | v4f32 dot3 = {0, 0, 0, 0}; | ||||
| #endif | |||||
| if (n < 1) return (dot); | if (n < 1) return (dot); | ||||
| @@ -83,6 +92,61 @@ FLOAT CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x, FLOAT *y, BLASLONG inc_y) | |||||
| x_pref += 32; | x_pref += 32; | ||||
| y_pref += 32; | y_pref += 32; | ||||
| #if defined(DSDOT) | |||||
| /* Extend single precision to double precision */ | |||||
| dvy0 = __msa_fexupr_d(vy0); | |||||
| dvy1 = __msa_fexupr_d(vy1); | |||||
| dvy2 = __msa_fexupr_d(vy2); | |||||
| dvy3 = __msa_fexupr_d(vy3); | |||||
| dvy4 = __msa_fexupr_d(vy4); | |||||
| dvy5 = __msa_fexupr_d(vy5); | |||||
| dvy6 = __msa_fexupr_d(vy6); | |||||
| dvy7 = __msa_fexupr_d(vy7); | |||||
| vy0 = (v4f32)__msa_fexupl_d(vy0); | |||||
| vy1 = (v4f32)__msa_fexupl_d(vy1); | |||||
| vy2 = (v4f32)__msa_fexupl_d(vy2); | |||||
| vy3 = (v4f32)__msa_fexupl_d(vy3); | |||||
| vy4 = (v4f32)__msa_fexupl_d(vy4); | |||||
| vy5 = (v4f32)__msa_fexupl_d(vy5); | |||||
| vy6 = (v4f32)__msa_fexupl_d(vy6); | |||||
| vy7 = (v4f32)__msa_fexupl_d(vy7); | |||||
| dvx0 = __msa_fexupr_d(vx0); | |||||
| dvx1 = __msa_fexupr_d(vx1); | |||||
| dvx2 = __msa_fexupr_d(vx2); | |||||
| dvx3 = __msa_fexupr_d(vx3); | |||||
| dvx4 = __msa_fexupr_d(vx4); | |||||
| dvx5 = __msa_fexupr_d(vx5); | |||||
| dvx6 = __msa_fexupr_d(vx6); | |||||
| dvx7 = __msa_fexupr_d(vx7); | |||||
| vx0 = (v4f32)__msa_fexupl_d(vx0); | |||||
| vx1 = (v4f32)__msa_fexupl_d(vx1); | |||||
| vx2 = (v4f32)__msa_fexupl_d(vx2); | |||||
| vx3 = (v4f32)__msa_fexupl_d(vx3); | |||||
| vx4 = (v4f32)__msa_fexupl_d(vx4); | |||||
| vx5 = (v4f32)__msa_fexupl_d(vx5); | |||||
| vx6 = (v4f32)__msa_fexupl_d(vx6); | |||||
| vx7 = (v4f32)__msa_fexupl_d(vx7); | |||||
| dot0 += (dvy0 * dvx0); | |||||
| dot1 += (dvy1 * dvx1); | |||||
| dot2 += (dvy2 * dvx2); | |||||
| dot3 += (dvy3 * dvx3); | |||||
| dot0 += (dvy4 * dvx4); | |||||
| dot1 += (dvy5 * dvx5); | |||||
| dot2 += (dvy6 * dvx6); | |||||
| dot3 += (dvy7 * dvx7); | |||||
| dot0 += ((v2f64)vy0 * (v2f64)vx0); | |||||
| dot1 += ((v2f64)vy1 * (v2f64)vx1); | |||||
| dot2 += ((v2f64)vy2 * (v2f64)vx2); | |||||
| dot3 += ((v2f64)vy3 * (v2f64)vx3); | |||||
| dot0 += ((v2f64)vy4 * (v2f64)vx4); | |||||
| dot1 += ((v2f64)vy5 * (v2f64)vx5); | |||||
| dot2 += ((v2f64)vy6 * (v2f64)vx6); | |||||
| dot3 += ((v2f64)vy7 * (v2f64)vx7); | |||||
| #else | |||||
| dot0 += (vy0 * vx0); | dot0 += (vy0 * vx0); | ||||
| dot1 += (vy1 * vx1); | dot1 += (vy1 * vx1); | ||||
| dot2 += (vy2 * vx2); | dot2 += (vy2 * vx2); | ||||
| @@ -91,6 +155,7 @@ FLOAT CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x, FLOAT *y, BLASLONG inc_y) | |||||
| dot1 += (vy5 * vx5); | dot1 += (vy5 * vx5); | ||||
| dot2 += (vy6 * vx6); | dot2 += (vy6 * vx6); | ||||
| dot3 += (vy7 * vx7); | dot3 += (vy7 * vx7); | ||||
| #endif | |||||
| } | } | ||||
| if (n & 31) | if (n & 31) | ||||
| @@ -100,10 +165,41 @@ FLOAT CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x, FLOAT *y, BLASLONG inc_y) | |||||
| LD_SP4_INC(x, 4, vx0, vx1, vx2, vx3); | LD_SP4_INC(x, 4, vx0, vx1, vx2, vx3); | ||||
| LD_SP4_INC(y, 4, vy0, vy1, vy2, vy3); | LD_SP4_INC(y, 4, vy0, vy1, vy2, vy3); | ||||
| #if defined(DSDOT) | |||||
| dvy0 = __msa_fexupr_d(vy0); | |||||
| dvy1 = __msa_fexupr_d(vy1); | |||||
| dvy2 = __msa_fexupr_d(vy2); | |||||
| dvy3 = __msa_fexupr_d(vy3); | |||||
| vy0 = (v4f32)__msa_fexupl_d(vy0); | |||||
| vy1 = (v4f32)__msa_fexupl_d(vy1); | |||||
| vy2 = (v4f32)__msa_fexupl_d(vy2); | |||||
| vy3 = (v4f32)__msa_fexupl_d(vy3); | |||||
| dvx0 = __msa_fexupr_d(vx0); | |||||
| dvx1 = __msa_fexupr_d(vx1); | |||||
| dvx2 = __msa_fexupr_d(vx2); | |||||
| dvx3 = __msa_fexupr_d(vx3); | |||||
| vx0 = (v4f32)__msa_fexupl_d(vx0); | |||||
| vx1 = (v4f32)__msa_fexupl_d(vx1); | |||||
| vx2 = (v4f32)__msa_fexupl_d(vx2); | |||||
| vx3 = (v4f32)__msa_fexupl_d(vx3); | |||||
| dot0 += (dvy0 * dvx0); | |||||
| dot1 += (dvy1 * dvx1); | |||||
| dot2 += (dvy2 * dvx2); | |||||
| dot3 += (dvy3 * dvx3); | |||||
| dot0 += ((v2f64)vy0 * (v2f64)vx0); | |||||
| dot1 += ((v2f64)vy1 * (v2f64)vx1); | |||||
| dot2 += ((v2f64)vy2 * (v2f64)vx2); | |||||
| dot3 += ((v2f64)vy3 * (v2f64)vx3); | |||||
| #else | |||||
| dot0 += (vy0 * vx0); | dot0 += (vy0 * vx0); | ||||
| dot1 += (vy1 * vx1); | dot1 += (vy1 * vx1); | ||||
| dot2 += (vy2 * vx2); | dot2 += (vy2 * vx2); | ||||
| dot3 += (vy3 * vx3); | dot3 += (vy3 * vx3); | ||||
| #endif | |||||
| } | } | ||||
| if (n & 8) | if (n & 8) | ||||
| @@ -111,8 +207,27 @@ FLOAT CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x, FLOAT *y, BLASLONG inc_y) | |||||
| LD_SP2_INC(x, 4, vx0, vx1); | LD_SP2_INC(x, 4, vx0, vx1); | ||||
| LD_SP2_INC(y, 4, vy0, vy1); | LD_SP2_INC(y, 4, vy0, vy1); | ||||
| #if defined(DSDOT) | |||||
| dvy0 = __msa_fexupr_d(vy0); | |||||
| dvy1 = __msa_fexupr_d(vy1); | |||||
| vy0 = (v4f32)__msa_fexupl_d(vy0); | |||||
| vy1 = (v4f32)__msa_fexupl_d(vy1); | |||||
| dvx0 = __msa_fexupr_d(vx0); | |||||
| dvx1 = __msa_fexupr_d(vx1); | |||||
| vx0 = (v4f32)__msa_fexupl_d(vx0); | |||||
| vx1 = (v4f32)__msa_fexupl_d(vx1); | |||||
| dot0 += (dvy0 * dvx0); | |||||
| dot1 += (dvy1 * dvx1); | |||||
| dot0 += ((v2f64)vy0 * (v2f64)vx0); | |||||
| dot1 += ((v2f64)vy1 * (v2f64)vx1); | |||||
| #else | |||||
| dot0 += (vy0 * vx0); | dot0 += (vy0 * vx0); | ||||
| dot1 += (vy1 * vx1); | dot1 += (vy1 * vx1); | ||||
| #endif | |||||
| } | } | ||||
| if (n & 4) | if (n & 4) | ||||
| @@ -120,7 +235,16 @@ FLOAT CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x, FLOAT *y, BLASLONG inc_y) | |||||
| vx0 = LD_SP(x); x += 4; | vx0 = LD_SP(x); x += 4; | ||||
| vy0 = LD_SP(y); y += 4; | vy0 = LD_SP(y); y += 4; | ||||
| #if defined(DSDOT) | |||||
| dvy0 = __msa_fexupr_d(vy0); | |||||
| vy0 = (v4f32)__msa_fexupl_d(vy0); | |||||
| dvx0 = __msa_fexupr_d(vx0); | |||||
| vx0 = (v4f32)__msa_fexupl_d(vx0); | |||||
| dot0 += (dvy0 * dvx0); | |||||
| dot0 += ((v2f64)vy0 * (v2f64)vx0); | |||||
| #else | |||||
| dot0 += (vy0 * vx0); | dot0 += (vy0 * vx0); | ||||
| #endif | |||||
| } | } | ||||
| if (n & 2) | if (n & 2) | ||||
| @@ -128,8 +252,13 @@ FLOAT CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x, FLOAT *y, BLASLONG inc_y) | |||||
| LD_GP2_INC(x, 1, x0, x1); | LD_GP2_INC(x, 1, x0, x1); | ||||
| LD_GP2_INC(y, 1, y0, y1); | LD_GP2_INC(y, 1, y0, y1); | ||||
| #if defined(DSDOT) | |||||
| dot += ((double)y0 * (double)x0); | |||||
| dot += ((double)y1 * (double)x1); | |||||
| #else | |||||
| dot += (y0 * x0); | dot += (y0 * x0); | ||||
| dot += (y1 * x1); | dot += (y1 * x1); | ||||
| #endif | |||||
| } | } | ||||
| if (n & 1) | if (n & 1) | ||||
| @@ -137,7 +266,11 @@ FLOAT CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x, FLOAT *y, BLASLONG inc_y) | |||||
| x0 = *x; | x0 = *x; | ||||
| y0 = *y; | y0 = *y; | ||||
| #if defined(DSDOT) | |||||
| dot += ((double)y0 * (double)x0); | |||||
| #else | |||||
| dot += (y0 * x0); | dot += (y0 * x0); | ||||
| #endif | |||||
| } | } | ||||
| } | } | ||||
| @@ -145,8 +278,10 @@ FLOAT CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x, FLOAT *y, BLASLONG inc_y) | |||||
| dot += dot0[0]; | dot += dot0[0]; | ||||
| dot += dot0[1]; | dot += dot0[1]; | ||||
| #if !defined(DSDOT) | |||||
| dot += dot0[2]; | dot += dot0[2]; | ||||
| dot += dot0[3]; | dot += dot0[3]; | ||||
| #endif | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| @@ -155,10 +290,17 @@ FLOAT CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x, FLOAT *y, BLASLONG inc_y) | |||||
| LD_GP4_INC(x, inc_x, x0, x1, x2, x3); | LD_GP4_INC(x, inc_x, x0, x1, x2, x3); | ||||
| LD_GP4_INC(y, inc_y, y0, y1, y2, y3); | LD_GP4_INC(y, inc_y, y0, y1, y2, y3); | ||||
| #if defined(DSDOT) | |||||
| dot += ((double)y0 * (double)x0); | |||||
| dot += ((double)y1 * (double)x1); | |||||
| dot += ((double)y2 * (double)x2); | |||||
| dot += ((double)y3 * (double)x3); | |||||
| #else | |||||
| dot += (y0 * x0); | dot += (y0 * x0); | ||||
| dot += (y1 * x1); | dot += (y1 * x1); | ||||
| dot += (y2 * x2); | dot += (y2 * x2); | ||||
| dot += (y3 * x3); | dot += (y3 * x3); | ||||
| #endif | |||||
| } | } | ||||
| if (n & 2) | if (n & 2) | ||||
| @@ -166,8 +308,13 @@ FLOAT CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x, FLOAT *y, BLASLONG inc_y) | |||||
| LD_GP2_INC(x, inc_x, x0, x1); | LD_GP2_INC(x, inc_x, x0, x1); | ||||
| LD_GP2_INC(y, inc_y, y0, y1); | LD_GP2_INC(y, inc_y, y0, y1); | ||||
| #if defined(DSDOT) | |||||
| dot += ((double)y0 * (double)x0); | |||||
| dot += ((double)y1 * (double)x1); | |||||
| #else | |||||
| dot += (y0 * x0); | dot += (y0 * x0); | ||||
| dot += (y1 * x1); | dot += (y1 * x1); | ||||
| #endif | |||||
| } | } | ||||
| if (n & 1) | if (n & 1) | ||||
| @@ -175,7 +322,11 @@ FLOAT CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x, FLOAT *y, BLASLONG inc_y) | |||||
| x0 = *x; | x0 = *x; | ||||
| y0 = *y; | y0 = *y; | ||||
| #if defined(DSDOT) | |||||
| dot += ((double)y0 * (double)x0); | |||||
| #else | |||||
| dot += (y0 * x0); | dot += (y0 * x0); | ||||
| #endif | |||||
| } | } | ||||
| } | } | ||||