|
@@ -42,24 +42,27 @@ FLOAT CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x) |
|
|
n *= inc_x; |
|
|
n *= inc_x; |
|
|
if (inc_x == 1) |
|
|
if (inc_x == 1) |
|
|
{ |
|
|
{ |
|
|
#if V_SIMD |
|
|
|
|
|
|
|
|
#if V_SIMD && (!defined(DOUBLE) || (defined(DOUBLE) && V_SIMD_F64 && V_SIMD > 128)) |
|
|
#ifdef DOUBLE |
|
|
#ifdef DOUBLE |
|
|
const int vstep = v_nlanes_f64; |
|
|
const int vstep = v_nlanes_f64; |
|
|
const int unrollx2 = n & (-vstep * 2); |
|
|
|
|
|
|
|
|
const int unrollx4 = n & (-vstep * 4); |
|
|
const int unrollx = n & -vstep; |
|
|
const int unrollx = n & -vstep; |
|
|
v_f64 vsum0 = v_zero_f64(); |
|
|
v_f64 vsum0 = v_zero_f64(); |
|
|
v_f64 vsum1 = v_zero_f64(); |
|
|
v_f64 vsum1 = v_zero_f64(); |
|
|
while (i < unrollx2) |
|
|
|
|
|
|
|
|
v_f64 vsum2 = v_zero_f64(); |
|
|
|
|
|
v_f64 vsum3 = v_zero_f64(); |
|
|
|
|
|
for (; i < unrollx4; i += vstep * 4) |
|
|
{ |
|
|
{ |
|
|
vsum0 = v_add_f64(vsum0, v_loadu_f64(x)); |
|
|
|
|
|
vsum1 = v_add_f64(vsum1, v_loadu_f64(x + vstep)); |
|
|
|
|
|
i += vstep * 2; |
|
|
|
|
|
|
|
|
vsum0 = v_add_f64(vsum0, v_loadu_f64(x + i)); |
|
|
|
|
|
vsum1 = v_add_f64(vsum1, v_loadu_f64(x + i + vstep)); |
|
|
|
|
|
vsum2 = v_add_f64(vsum2, v_loadu_f64(x + i + vstep * 2)); |
|
|
|
|
|
vsum3 = v_add_f64(vsum3, v_loadu_f64(x + i + vstep * 3)); |
|
|
} |
|
|
} |
|
|
vsum0 = v_add_f64(vsum0, vsum1); |
|
|
|
|
|
while (i < unrollx) |
|
|
|
|
|
|
|
|
vsum0 = v_add_f64( |
|
|
|
|
|
v_add_f64(vsum0, vsum1), v_add_f64(vsum2, vsum3)); |
|
|
|
|
|
for (; i < unrollx; i += vstep) |
|
|
{ |
|
|
{ |
|
|
vsum0 = v_add_f64(vsum0, v_loadu_f64(x + i)); |
|
|
vsum0 = v_add_f64(vsum0, v_loadu_f64(x + i)); |
|
|
i += vstep; |
|
|
|
|
|
} |
|
|
} |
|
|
sumf = v_sum_f64(vsum0); |
|
|
sumf = v_sum_f64(vsum0); |
|
|
#else |
|
|
#else |
|
@@ -70,20 +73,18 @@ FLOAT CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x) |
|
|
v_f32 vsum1 = v_zero_f32(); |
|
|
v_f32 vsum1 = v_zero_f32(); |
|
|
v_f32 vsum2 = v_zero_f32(); |
|
|
v_f32 vsum2 = v_zero_f32(); |
|
|
v_f32 vsum3 = v_zero_f32(); |
|
|
v_f32 vsum3 = v_zero_f32(); |
|
|
while (i < unrollx4) |
|
|
|
|
|
|
|
|
for (; i < unrollx4; i += vstep * 4) |
|
|
{ |
|
|
{ |
|
|
vsum0 = v_add_f32(vsum0, v_loadu_f32(x)); |
|
|
|
|
|
vsum1 = v_add_f32(vsum1, v_loadu_f32(x + vstep)); |
|
|
|
|
|
vsum2 = v_add_f32(vsum2, v_loadu_f32(x + vstep * 2)); |
|
|
|
|
|
vsum3 = v_add_f32(vsum3, v_loadu_f32(x + vstep * 3)); |
|
|
|
|
|
i += vstep * 4; |
|
|
|
|
|
|
|
|
vsum0 = v_add_f32(vsum0, v_loadu_f32(x + i)); |
|
|
|
|
|
vsum1 = v_add_f32(vsum1, v_loadu_f32(x + i + vstep)); |
|
|
|
|
|
vsum2 = v_add_f32(vsum2, v_loadu_f32(x + i + vstep * 2)); |
|
|
|
|
|
vsum3 = v_add_f32(vsum3, v_loadu_f32(x + i + vstep * 3)); |
|
|
} |
|
|
} |
|
|
vsum0 = v_add_f32( |
|
|
vsum0 = v_add_f32( |
|
|
v_add_f32(vsum0, vsum1), v_add_f32(vsum2, vsum3)); |
|
|
v_add_f32(vsum0, vsum1), v_add_f32(vsum2, vsum3)); |
|
|
while (i < unrollx) |
|
|
|
|
|
|
|
|
for (; i < unrollx; i += vstep) |
|
|
{ |
|
|
{ |
|
|
vsum0 = v_add_f32(vsum0, v_loadu_f32(x + i)); |
|
|
vsum0 = v_add_f32(vsum0, v_loadu_f32(x + i)); |
|
|
i += vstep; |
|
|
|
|
|
} |
|
|
} |
|
|
sumf = v_sum_f32(vsum0); |
|
|
sumf = v_sum_f32(vsum0); |
|
|
#endif |
|
|
#endif |
|
|