@@ -33,6 +33,7 @@ pub(super) fn codegen_simd_intrinsic_call<'tcx>(
33
33
} ) ;
34
34
} ;
35
35
36
+ // FIXME support float comparisons
36
37
simd_eq, ( c x, c y) {
37
38
validate_simd_type!( fx, intrinsic, span, x. layout( ) . ty) ;
38
39
simd_cmp!( fx, Equal ( x, y) -> ret) ;
@@ -113,7 +114,7 @@ pub(super) fn codegen_simd_intrinsic_call<'tcx>(
113
114
}
114
115
} ;
115
116
116
- simd_insert, ( c base, o idx, v _val ) {
117
+ simd_insert, ( c base, o idx, c val ) {
117
118
// FIXME validate
118
119
let idx_const = if let Some ( idx_const) = crate :: constant:: mir_operand_get_const_val( fx, idx) {
119
120
idx_const
@@ -132,13 +133,9 @@ pub(super) fn codegen_simd_intrinsic_call<'tcx>(
132
133
fx. tcx. sess. span_fatal( fx. mir. span, & format!( "[simd_insert] idx {} >= lane_count {}" , idx, lane_count) ) ;
133
134
}
134
135
135
- // FIXME implement this
136
- fx. tcx. sess. span_warn(
137
- fx. mir. span,
138
- "`simd_insert` is not yet implemented. Calling this function will panic." ,
139
- ) ;
140
- let val = crate :: trap:: trap_unimplemented_ret_value( fx, ret. layout( ) , "`simd_insert` is not yet implemented" ) ;
141
- ret. write_cvalue( fx, val) ;
136
+ ret. write_cvalue( fx, base) ;
137
+ let ret_lane = ret. place_field( fx, mir:: Field :: new( idx. try_into( ) . unwrap( ) ) ) ;
138
+ ret_lane. write_cvalue( fx, val) ;
142
139
} ;
143
140
144
141
simd_extract, ( c v, o idx) {
@@ -233,5 +230,12 @@ pub(super) fn codegen_simd_intrinsic_call<'tcx>(
233
230
validate_simd_type!( fx, intrinsic, span, x. layout( ) . ty) ;
234
231
simd_flt_binop!( fx, fmax( x, y) -> ret) ;
235
232
} ;
233
+
234
+ // simd_fabs
235
+ // simd_saturating_add
236
+ // simd_bitmask
237
+ // simd_select
238
+ // simd_reduce_add_{,un}ordered
239
+ // simd_rem
236
240
}
237
241
}
0 commit comments