@@ -132,6 +132,35 @@ fn simd_pair_for_each_lane<'tcx>(
|
132 | 132 | } |
133 | 133 | } |
134 | 134 | |
| 135 | +fn simd_trio_for_each_lane<'tcx>( |
| 136 | +fx: &mut FunctionCx<'_, '_, 'tcx>, |
| 137 | +x: CValue<'tcx>, |
| 138 | +y: CValue<'tcx>, |
| 139 | +z: CValue<'tcx>, |
| 140 | +ret: CPlace<'tcx>, |
| 141 | +f: &dyn Fn(&mut FunctionCx<'_, '_, 'tcx>, Ty<'tcx>, Ty<'tcx>, Value, Value, Value) -> Value, |
| 142 | +) { |
| 143 | +assert_eq!(x.layout(), y.layout()); |
| 144 | +let layout = x.layout(); |
| 145 | + |
| 146 | +let (lane_count, lane_ty) = layout.ty.simd_size_and_type(fx.tcx); |
| 147 | +let lane_layout = fx.layout_of(lane_ty); |
| 148 | +let (ret_lane_count, ret_lane_ty) = ret.layout().ty.simd_size_and_type(fx.tcx); |
| 149 | +let ret_lane_layout = fx.layout_of(ret_lane_ty); |
| 150 | +assert_eq!(lane_count, ret_lane_count); |
| 151 | + |
| 152 | +for lane_idx in 0..lane_count { |
| 153 | +let x_lane = x.value_lane(fx, lane_idx).load_scalar(fx); |
| 154 | +let y_lane = y.value_lane(fx, lane_idx).load_scalar(fx); |
| 155 | +let z_lane = z.value_lane(fx, lane_idx).load_scalar(fx); |
| 156 | + |
| 157 | +let res_lane = f(fx, lane_layout.ty, ret_lane_layout.ty, x_lane, y_lane, z_lane); |
| 158 | +let res_lane = CValue::by_val(res_lane, ret_lane_layout); |
| 159 | + |
| 160 | + ret.place_lane(fx, lane_idx).write_cvalue(fx, res_lane); |
| 161 | +} |
| 162 | +} |
| 163 | + |
135 | 164 | fn simd_reduce<'tcx>( |
136 | 165 | fx: &mut FunctionCx<'_, '_, 'tcx>, |
137 | 166 | val: CValue<'tcx>, |
|