@@ -29,29 +29,33 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
29
#include <math.h>
30
30
31
31
#if !defined(DOUBLE )
32
- #define RVV_EFLOAT RVV_E32
33
- #define RVV_M RVV_M8
34
- #define FLOAT_V_T float32xm8_t
35
- #define VLEV_FLOAT vlev_float32xm8
36
- #define VLSEV_FLOAT vlsev_float32xm8
37
- #define VFREDMAXVS_FLOAT vfredmaxvs_float32xm8
38
- #define MASK_T e32xm8_t
39
- #define VMFLTVF_FLOAT vmfltvf_e32xm8_float32xm8
40
- #define VFMVVF_FLOAT vfmvvf_float32xm8
41
- #define VFRSUBVF_MASK_FLOAT vfrsubvf_mask_float32xm8
42
- #define VFMAXVV_FLOAT vfmaxvv_float32xm8
32
+ #define VSETVL (n ) vsetvl_e32m8(n)
33
+ #define VSETVL_MAX vsetvlmax_e32m1()
34
+ #define FLOAT_V_T vfloat32m8_t
35
+ #define FLOAT_V_T_M1 vfloat32m1_t
36
+ #define VLEV_FLOAT vle_v_f32m8
37
+ #define VLSEV_FLOAT vlse_v_f32m8
38
+ #define VFREDMAXVS_FLOAT vfredmax_vs_f32m8_f32m1
39
+ #define MASK_T vbool4_t
40
+ #define VMFLTVF_FLOAT vmflt_vf_f32m8_b4
41
+ #define VFMVVF_FLOAT vfmv_v_f_f32m8
42
+ #define VFMVVF_FLOAT_M1 vfmv_v_f_f32m1
43
+ #define VFRSUBVF_MASK_FLOAT vfrsub_vf_f32m8_m
44
+ #define VFMAXVV_FLOAT vfmax_vv_f32m8
43
45
#else
44
- #define RVV_EFLOAT RVV_E64
45
- #define RVV_M RVV_M8
46
- #define FLOAT_V_T float64xm8_t
47
- #define VLEV_FLOAT vlev_float64xm8
48
- #define VLSEV_FLOAT vlsev_float64xm8
49
- #define VFREDMAXVS_FLOAT vfredmaxvs_float64xm8
50
- #define MASK_T e64xm8_t
51
- #define VMFLTVF_FLOAT vmfltvf_e64xm8_float64xm8
52
- #define VFMVVF_FLOAT vfmvvf_float64xm8
53
- #define VFRSUBVF_MASK_FLOAT vfrsubvf_mask_float64xm8
54
- #define VFMAXVV_FLOAT vfmaxvv_float64xm8
46
+ #define VSETVL (n ) vsetvl_e64m8(n)
47
+ #define VSETVL_MAX vsetvlmax_e64m1()
48
+ #define FLOAT_V_T vfloat64m8_t
49
+ #define FLOAT_V_T_M1 vfloat64m1_t
50
+ #define VLEV_FLOAT vle_v_f64m8
51
+ #define VLSEV_FLOAT vlse_v_f64m8
52
+ #define VFREDMAXVS_FLOAT vfredmax_vs_f64m8_f64m1
53
+ #define MASK_T vbool8_t
54
+ #define VMFLTVF_FLOAT vmflt_vf_f64m8_b8
55
+ #define VFMVVF_FLOAT vfmv_v_f_f64m8
56
+ #define VFMVVF_FLOAT_M1 vfmv_v_f_f64m1
57
+ #define VFRSUBVF_MASK_FLOAT vfrsub_vf_f64m8_m
58
+ #define VFMAXVV_FLOAT vfmax_vv_f64m8
55
59
#endif
56
60
57
61
FLOAT CNAME (BLASLONG n , FLOAT * x , BLASLONG inc_x )
@@ -62,19 +66,25 @@ FLOAT CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x)
62
66
if (n <= 0 || inc_x <= 0 ) return (maxf );
63
67
unsigned int gvl = 0 ;
64
68
FLOAT_V_T v0 , v1 , v_max ;
69
+ FLOAT_V_T_M1 v_res , v_zero ;
70
+ gvl = VSETVL_MAX ;
71
+ v_res = VFMVVF_FLOAT_M1 (0 , gvl );
72
+ v_zero = VFMVVF_FLOAT_M1 (0 , gvl );
65
73
66
74
MASK_T mask0 , mask1 ;
67
75
FLOAT zero = 0.0 ;
68
76
if (inc_x == 1 ){
69
- gvl = vsetvli ( n , RVV_EFLOAT , RVV_M );
77
+ gvl = VSETVL ( n );
70
78
if (gvl <= n /2 ){
71
79
v_max = VFMVVF_FLOAT (0 , gvl );
72
80
for (i = 0 ,j = 0 ; i < n /(gvl * 2 ); i ++ ){
73
81
v0 = VLEV_FLOAT (& x [j ], gvl );
82
+ v1 = VLEV_FLOAT (& x [j + gvl ], gvl );
74
83
mask0 = VMFLTVF_FLOAT (v0 , 0 , gvl );
75
84
//v0 = VFRSUBVF_MASK_FLOAT(v0, 0, mask0, gvl);
76
85
#if defined(DOUBLE )
77
86
asm volatile (
87
+ "vsetvli zero, zero, e8, m1\n\t"
78
88
"vor.vv v0, %1, %1\n\t"
79
89
"vsetvli x0, %3, e64,m8 \n\t"
80
90
"vfrsub.vf %0, %0, %2, v0.t \n\t"
@@ -83,6 +93,7 @@ asm volatile(
83
93
:"v0" );
84
94
#else
85
95
asm volatile (
96
+ "vsetvli zero, zero, e8, m1\n\t"
86
97
"vor.vv v0, %1, %1\n\t"
87
98
"vsetvli x0, %3, e32,m8 \n\t"
88
99
"vfrsub.vf %0, %0, %2, v0.t \n\t"
@@ -98,6 +109,7 @@ asm volatile(
98
109
//v1 = VFRSUBVF_MASK_FLOAT(v1, 0, mask1, gvl);
99
110
#if defined(DOUBLE )
100
111
asm volatile (
112
+ "vsetvli zero, zero, e8, m1\n\t"
101
113
"vor.vv v0, %1, %1\n\t"
102
114
"vsetvli x0, %3, e64,m8 \n\t"
103
115
"vfrsub.vf %0, %0, %2, v0.t \n\t"
@@ -106,6 +118,7 @@ asm volatile(
106
118
:"v0" );
107
119
#else
108
120
asm volatile (
121
+ "vsetvli zero, zero, e8, m1\n\t"
109
122
"vor.vv v0, %1, %1\n\t"
110
123
"vsetvli x0, %3, e32,m8 \n\t"
111
124
"vfrsub.vf %0, %0, %2, v0.t \n\t"
@@ -117,17 +130,17 @@ asm volatile(
117
130
v_max = VFMAXVV_FLOAT (v_max , v1 , gvl );
118
131
j += gvl * 2 ;
119
132
}
120
- v0 = VFMVVF_FLOAT (0 , gvl );
121
- v0 = VFREDMAXVS_FLOAT (v_max , v0 , gvl );
122
- maxf = v0 [0 ];
133
+ v_res = VFREDMAXVS_FLOAT (v_res , v_max , v_zero , gvl );
134
+ maxf = v_res [0 ];
123
135
}
124
136
for (;j < n ;){
125
- gvl = vsetvli (n - j , RVV_EFLOAT , RVV_M );
137
+ gvl = VSETVL (n - j );
126
138
v0 = VLEV_FLOAT (& x [j ], gvl );
127
139
mask0 = VMFLTVF_FLOAT (v0 , 0 , gvl );
128
140
//v0 = VFRSUBVF_MASK_FLOAT(v0, 0, mask0, gvl);
129
141
#if defined(DOUBLE )
130
142
asm volatile (
143
+ "vsetvli zero, zero, e8, m1\n\t"
131
144
"vor.vv v0, %1, %1\n\t"
132
145
"vsetvli x0, %3, e64,m8 \n\t"
133
146
"vfrsub.vf %0, %0, %2, v0.t \n\t"
@@ -136,6 +149,7 @@ asm volatile(
136
149
:"v0" );
137
150
#else
138
151
asm volatile (
152
+ "vsetvli zero, zero, e8, m1\n\t"
139
153
"vor.vv v0, %1, %1\n\t"
140
154
"vsetvli x0, %3, e32,m8 \n\t"
141
155
"vfrsub.vf %0, %0, %2, v0.t \n\t"
@@ -144,14 +158,13 @@ asm volatile(
144
158
:"v0" );
145
159
#endif
146
160
147
- v1 = VFMVVF_FLOAT (0 , gvl );
148
- v0 = VFREDMAXVS_FLOAT (v0 , v1 , gvl );
149
- if (v0 [0 ] > maxf )
150
- maxf = v0 [0 ];
161
+ v_res = VFREDMAXVS_FLOAT (v_res , v0 , v_zero , gvl );
162
+ if (v_res [0 ] > maxf )
163
+ maxf = v_res [0 ];
151
164
j += gvl ;
152
165
}
153
166
}else {
154
- gvl = vsetvli ( n , RVV_EFLOAT , RVV_M );
167
+ gvl = VSETVL ( n );
155
168
BLASLONG stride_x = inc_x * sizeof (FLOAT );
156
169
if (gvl <= n /2 ){
157
170
BLASLONG inc_xv = inc_x * gvl ;
@@ -162,6 +175,7 @@ asm volatile(
162
175
//v0 = VFRSUBVF_MASK_FLOAT(v0, 0, mask0, gvl);
163
176
#if defined(DOUBLE )
164
177
asm volatile (
178
+ "vsetvli zero, zero, e8, m1\n\t"
165
179
"vor.vv v0, %1, %1\n\t"
166
180
"vsetvli x0, %3, e64,m8 \n\t"
167
181
"vfrsub.vf %0, %0, %2, v0.t \n\t"
@@ -170,6 +184,7 @@ asm volatile(
170
184
:"v0" );
171
185
#else
172
186
asm volatile (
187
+ "vsetvli zero, zero, e8, m1\n\t"
173
188
"vor.vv v0, %1, %1\n\t"
174
189
"vsetvli x0, %3, e32,m8 \n\t"
175
190
"vfrsub.vf %0, %0, %2, v0.t \n\t"
@@ -185,6 +200,7 @@ asm volatile(
185
200
//v1 = VFRSUBVF_MASK_FLOAT(v1, 0, mask1, gvl);
186
201
#if defined(DOUBLE )
187
202
asm volatile (
203
+ "vsetvli zero, zero, e8, m1\n\t"
188
204
"vor.vv v0, %1, %1\n\t"
189
205
"vsetvli x0, %3, e64,m8 \n\t"
190
206
"vfrsub.vf %0, %0, %2, v0.t \n\t"
@@ -193,6 +209,7 @@ asm volatile(
193
209
:"v0" );
194
210
#else
195
211
asm volatile (
212
+ "vsetvli zero, zero, e8, m1\n\t"
196
213
"vor.vv v0, %1, %1\n\t"
197
214
"vsetvli x0, %3, e32,m8 \n\t"
198
215
"vfrsub.vf %0, %0, %2, v0.t \n\t"
@@ -205,17 +222,17 @@ asm volatile(
205
222
j += gvl * 2 ;
206
223
ix += inc_xv * 2 ;
207
224
}
208
- v0 = VFMVVF_FLOAT (0 , gvl );
209
- v0 = VFREDMAXVS_FLOAT (v_max , v0 , gvl );
210
- maxf = v0 [0 ];
225
+ v_res = VFREDMAXVS_FLOAT (v_res , v_max , v_zero , gvl );
226
+ maxf = v_res [0 ];
211
227
}
212
228
for (;j < n ;){
213
- gvl = vsetvli (n - j , RVV_EFLOAT , RVV_M );
229
+ gvl = VSETVL (n - j );
214
230
v0 = VLSEV_FLOAT (& x [j * inc_x ], stride_x , gvl );
215
231
mask0 = VMFLTVF_FLOAT (v0 , 0 , gvl );
216
232
//v0 = VFRSUBVF_MASK_FLOAT(v0, 0, mask0, gvl);
217
233
#if defined(DOUBLE )
218
234
asm volatile (
235
+ "vsetvli zero, zero, e8, m1\n\t"
219
236
"vor.vv v0, %1, %1\n\t"
220
237
"vsetvli x0, %3, e64,m8 \n\t"
221
238
"vfrsub.vf %0, %0, %2, v0.t \n\t"
@@ -224,6 +241,7 @@ asm volatile(
224
241
:"v0" );
225
242
#else
226
243
asm volatile (
244
+ "vsetvli zero, zero, e8, m1\n\t"
227
245
"vor.vv v0, %1, %1\n\t"
228
246
"vsetvli x0, %3, e32,m8 \n\t"
229
247
"vfrsub.vf %0, %0, %2, v0.t \n\t"
@@ -232,10 +250,9 @@ asm volatile(
232
250
:"v0" );
233
251
#endif
234
252
235
- v1 = VFMVVF_FLOAT (0 , gvl );
236
- v0 = VFREDMAXVS_FLOAT (v0 , v1 , gvl );
237
- if (v0 [0 ] > maxf )
238
- maxf = v0 [0 ];
253
+ v_res = VFREDMAXVS_FLOAT (v_res , v0 , v_zero , gvl );
254
+ if (v_res [0 ] > maxf )
255
+ maxf = v_res [0 ];
239
256
j += gvl ;
240
257
}
241
258
}
0 commit comments