@@ -79,8 +79,10 @@ int CNAME(BLASLONG n, FLOAT alpha_r, FLOAT alpha_i, FLOAT *x, BLASLONG inc_x, FL
79
79
80
80
BLASLONG stride_x = inc_x2 * sizeof (FLOAT );
81
81
BLASLONG stride_y = inc_y2 * sizeof (FLOAT );
82
+ BLASLONG ix ;
82
83
FLOAT_V_T vx0 , vx1 , vy0 , vy1 ;
83
84
FLOAT_VX2_T vxx2 , vyx2 ;
85
+ FLOAT temp ;
84
86
85
87
if ( beta_r == 0.0 && beta_i == 0.0 )
86
88
{
@@ -125,53 +127,74 @@ int CNAME(BLASLONG n, FLOAT alpha_r, FLOAT alpha_i, FLOAT *x, BLASLONG inc_x, FL
125
127
126
128
if ( alpha_r == 0.0 && alpha_i == 0.0 )
127
129
{
128
- for (size_t vl ; n > 0 ; n -= vl , y += vl * inc_y2 )
129
- {
130
- vl = VSETVL (n );
131
-
132
- vyx2 = VLSSEG_FLOAT (y , stride_y , vl );
133
- vy0 = VGET_VX2 (vyx2 , 0 );
134
- vy1 = VGET_VX2 (vyx2 , 1 );
135
-
136
- v0 = VFMULVF_FLOAT (vy1 , beta_i , vl );
137
- v0 = VFMSACVF_FLOAT (v0 , beta_r , vy0 , vl );
138
-
139
- v1 = VFMULVF_FLOAT (vy1 , beta_r , vl );
140
- v1 = VFMACCVF_FLOAT (v1 , beta_i , vy0 , vl );
141
-
142
- v_x2 = VSET_VX2 (v_x2 , 0 , v0 );
143
- v_x2 = VSET_VX2 (v_x2 , 1 , v1 );
144
- VSSSEG_FLOAT (y , stride_y , v_x2 , vl );
130
+ if ( inc_y == 0 ) {
131
+ for (; n > 0 ; n -- )
132
+ {
133
+ temp = (beta_r * y [0 ] - beta_i * y [1 ]);
134
+ y [1 ] = (beta_r * y [1 ] + beta_i * y [0 ]);
135
+ y [0 ] = temp ;
136
+ }
137
+ } else {
138
+ for (size_t vl ; n > 0 ; n -= vl , y += vl * inc_y2 )
139
+ {
140
+ vl = VSETVL (n );
141
+
142
+ vyx2 = VLSSEG_FLOAT (y , stride_y , vl );
143
+ vy0 = VGET_VX2 (vyx2 , 0 );
144
+ vy1 = VGET_VX2 (vyx2 , 1 );
145
+
146
+ v0 = VFMULVF_FLOAT (vy1 , beta_i , vl );
147
+ v0 = VFMSACVF_FLOAT (v0 , beta_r , vy0 , vl );
148
+
149
+ v1 = VFMULVF_FLOAT (vy1 , beta_r , vl );
150
+ v1 = VFMACCVF_FLOAT (v1 , beta_i , vy0 , vl );
151
+
152
+ v_x2 = VSET_VX2 (v_x2 , 0 , v0 );
153
+ v_x2 = VSET_VX2 (v_x2 , 1 , v1 );
154
+ VSSSEG_FLOAT (y , stride_y , v_x2 , vl );
155
+ }
145
156
}
146
157
}
147
158
else
148
159
{
149
- for (size_t vl ; n > 0 ; n -= vl , x += vl * inc_x2 , y += vl * inc_y2 )
150
- {
151
- vl = VSETVL (n );
152
-
153
- vxx2 = VLSSEG_FLOAT (x , stride_x , vl );
154
- vyx2 = VLSSEG_FLOAT (y , stride_y , vl );
155
-
156
- vx0 = VGET_VX2 (vxx2 , 0 );
157
- vx1 = VGET_VX2 (vxx2 , 1 );
158
- vy0 = VGET_VX2 (vyx2 , 0 );
159
- vy1 = VGET_VX2 (vyx2 , 1 );
160
-
161
- v0 = VFMULVF_FLOAT (vx0 , alpha_r , vl );
162
- v0 = VFNMSACVF_FLOAT (v0 , alpha_i , vx1 , vl );
163
- v0 = VFMACCVF_FLOAT (v0 , beta_r , vy0 , vl );
164
- v0 = VFNMSACVF_FLOAT (v0 , beta_i , vy1 , vl );
165
-
166
- v1 = VFMULVF_FLOAT (vx1 , alpha_r , vl );
167
- v1 = VFMACCVF_FLOAT (v1 , alpha_i , vx0 , vl );
168
- v1 = VFMACCVF_FLOAT (v1 , beta_r , vy1 , vl );
169
- v1 = VFMACCVF_FLOAT (v1 , beta_i , vy0 , vl );
170
-
171
- v_x2 = VSET_VX2 (v_x2 , 0 , v0 );
172
- v_x2 = VSET_VX2 (v_x2 , 1 , v1 );
173
-
174
- VSSSEG_FLOAT (y , stride_y , v_x2 , vl );
160
+ if ( inc_y == 0 ) {
161
+ ix = 0 ;
162
+ for (; n > 0 ; n -- ) {
163
+ temp = (alpha_r * x [ix ] - alpha_i * x [ix + 1 ] ) +
164
+ (beta_r * y [0 ] - beta_i * y [1 ]);
165
+ y [1 ] = (alpha_r * x [ix + 1 ] + alpha_i * x [ix ]) +
166
+ (beta_r * y [1 ] + beta_i * y [0 ]);
167
+ y [0 ] = temp ;
168
+ ix += inc_x2 ;
169
+ }
170
+ } else {
171
+ for (size_t vl ; n > 0 ; n -= vl , x += vl * inc_x2 , y += vl * inc_y2 )
172
+ {
173
+ vl = VSETVL (n );
174
+
175
+ vxx2 = VLSSEG_FLOAT (x , stride_x , vl );
176
+ vyx2 = VLSSEG_FLOAT (y , stride_y , vl );
177
+
178
+ vx0 = VGET_VX2 (vxx2 , 0 );
179
+ vx1 = VGET_VX2 (vxx2 , 1 );
180
+ vy0 = VGET_VX2 (vyx2 , 0 );
181
+ vy1 = VGET_VX2 (vyx2 , 1 );
182
+
183
+ v0 = VFMULVF_FLOAT (vx0 , alpha_r , vl );
184
+ v0 = VFNMSACVF_FLOAT (v0 , alpha_i , vx1 , vl );
185
+ v0 = VFMACCVF_FLOAT (v0 , beta_r , vy0 , vl );
186
+ v0 = VFNMSACVF_FLOAT (v0 , beta_i , vy1 , vl );
187
+
188
+ v1 = VFMULVF_FLOAT (vx1 , alpha_r , vl );
189
+ v1 = VFMACCVF_FLOAT (v1 , alpha_i , vx0 , vl );
190
+ v1 = VFMACCVF_FLOAT (v1 , beta_r , vy1 , vl );
191
+ v1 = VFMACCVF_FLOAT (v1 , beta_i , vy0 , vl );
192
+
193
+ v_x2 = VSET_VX2 (v_x2 , 0 , v0 );
194
+ v_x2 = VSET_VX2 (v_x2 , 1 , v1 );
195
+
196
+ VSSSEG_FLOAT (y , stride_y , v_x2 , vl );
197
+ }
175
198
}
176
199
}
177
200
}
0 commit comments