@@ -107,9 +107,9 @@ pub(super) fn codegen_simd_intrinsic_call<'tcx>(
107
107
108
108
for ( out_idx, in_idx) in indexes. into_iter( ) . enumerate( ) {
109
109
let in_lane = if in_idx < lane_count {
110
- x. value_field( fx, mir:: Field :: new( in_idx. try_into ( ) . unwrap ( ) ) )
110
+ x. value_field( fx, mir:: Field :: new( in_idx. into ( ) ) )
111
111
} else {
112
- y. value_field( fx, mir:: Field :: new( ( in_idx - lane_count) . try_into ( ) . unwrap ( ) ) )
112
+ y. value_field( fx, mir:: Field :: new( ( in_idx - lane_count) . into ( ) ) )
113
113
} ;
114
114
let out_lane = ret. place_field( fx, mir:: Field :: new( out_idx) ) ;
115
115
out_lane. write_cvalue( fx, in_lane) ;
@@ -207,7 +207,7 @@ pub(super) fn codegen_simd_intrinsic_call<'tcx>(
207
207
assert_eq!( lane_count, ret_lane_count) ;
208
208
209
209
for lane in 0 ..lane_count {
210
- let lane = mir:: Field :: new( lane. try_into ( ) . unwrap ( ) ) ;
210
+ let lane = mir:: Field :: new( lane. into ( ) ) ;
211
211
let a_lane = a. value_field( fx, lane) . load_scalar( fx) ;
212
212
let b_lane = b. value_field( fx, lane) . load_scalar( fx) ;
213
213
let c_lane = c. value_field( fx, lane) . load_scalar( fx) ;
@@ -228,11 +228,47 @@ pub(super) fn codegen_simd_intrinsic_call<'tcx>(
228
228
simd_flt_binop!( fx, fmax( x, y) -> ret) ;
229
229
} ;
230
230
231
+ simd_reduce_add_ordered | simd_reduce_add_unordered, ( c v) {
232
+ validate_simd_type!( fx, intrinsic, span, v. layout( ) . ty) ;
233
+ let ( lane_layout, lane_count) = lane_type_and_count( fx. tcx, v. layout( ) ) ;
234
+ assert_eq!( lane_layout. ty, ret. layout( ) . ty) ;
235
+
236
+ let mut res_val = v. value_field( fx, mir:: Field :: new( 0 ) ) . load_scalar( fx) ;
237
+ for lane_idx in 1 ..lane_count {
238
+ let lane = v. value_field( fx, mir:: Field :: new( lane_idx. into( ) ) ) . load_scalar( fx) ;
239
+ res_val = if lane_layout. ty. is_floating_point( ) {
240
+ fx. bcx. ins( ) . fadd( res_val, lane)
241
+ } else {
242
+ fx. bcx. ins( ) . iadd( res_val, lane)
243
+ } ;
244
+ }
245
+ let res = CValue :: by_val( res_val, lane_layout) ;
246
+ ret. write_cvalue( fx, res) ;
247
+ } ;
248
+
249
+ simd_reduce_mul_ordered | simd_reduce_mul_unordered, ( c v) {
250
+ validate_simd_type!( fx, intrinsic, span, v. layout( ) . ty) ;
251
+ let ( lane_layout, lane_count) = lane_type_and_count( fx. tcx, v. layout( ) ) ;
252
+ assert_eq!( lane_layout. ty, ret. layout( ) . ty) ;
253
+
254
+ let mut res_val = v. value_field( fx, mir:: Field :: new( 0 ) ) . load_scalar( fx) ;
255
+ for lane_idx in 1 ..lane_count {
256
+ let lane = v. value_field( fx, mir:: Field :: new( lane_idx. into( ) ) ) . load_scalar( fx) ;
257
+ res_val = if lane_layout. ty. is_floating_point( ) {
258
+ fx. bcx. ins( ) . fmul( res_val, lane)
259
+ } else {
260
+ fx. bcx. ins( ) . imul( res_val, lane)
261
+ } ;
262
+ }
263
+ let res = CValue :: by_val( res_val, lane_layout) ;
264
+ ret. write_cvalue( fx, res) ;
265
+ } ;
266
+
231
267
// simd_fabs
232
268
// simd_saturating_add
233
269
// simd_bitmask
234
270
// simd_select
235
- // simd_reduce_add_ {,un}ordered
271
+ // simd_reduce_{add,mul}_ {,un}ordered
236
272
// simd_rem
237
273
}
238
274
}
0 commit comments