Skip to content

Commit 22c9623

Browse files
committed
Implement simd_reduce_{add,mul}_{,un}ordered
1 parent c3179bc commit 22c9623

File tree

1 file changed

+40
-4
lines changed

1 file changed

+40
-4
lines changed

src/intrinsics/simd.rs

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,9 @@ pub(super) fn codegen_simd_intrinsic_call<'tcx>(
107107

108108
for (out_idx, in_idx) in indexes.into_iter().enumerate() {
109109
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()))
111111
} 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()))
113113
};
114114
let out_lane = ret.place_field(fx, mir::Field::new(out_idx));
115115
out_lane.write_cvalue(fx, in_lane);
@@ -207,7 +207,7 @@ pub(super) fn codegen_simd_intrinsic_call<'tcx>(
207207
assert_eq!(lane_count, ret_lane_count);
208208

209209
for lane in 0..lane_count {
210-
let lane = mir::Field::new(lane.try_into().unwrap());
210+
let lane = mir::Field::new(lane.into());
211211
let a_lane = a.value_field(fx, lane).load_scalar(fx);
212212
let b_lane = b.value_field(fx, lane).load_scalar(fx);
213213
let c_lane = c.value_field(fx, lane).load_scalar(fx);
@@ -228,11 +228,47 @@ pub(super) fn codegen_simd_intrinsic_call<'tcx>(
228228
simd_flt_binop!(fx, fmax(x, y) -> ret);
229229
};
230230

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+
231267
// simd_fabs
232268
// simd_saturating_add
233269
// simd_bitmask
234270
// simd_select
235-
// simd_reduce_add_{,un}ordered
271+
// simd_reduce_{add,mul}_{,un}ordered
236272
// simd_rem
237273
}
238274
}

0 commit comments

Comments
 (0)