diff options
| author | Andy Sadler <andrewsadler122@gmail.com> | 2022-09-07 21:32:34 -0500 |
|---|---|---|
| committer | Andy Sadler <andrewsadler122@gmail.com> | 2022-09-09 10:07:36 -0500 |
| commit | d7d820fc47a5987566550ef9ede2ea18b0d1ff05 (patch) | |
| tree | 4f3a3dac2fe538619d76c74ab42a1a9e2fd26d2d /src | |
| parent | 2ecd620acb56c1f834bc4b7c50b2ac4fe8fac0c5 (diff) | |
| download | rust-d7d820fc47a5987566550ef9ede2ea18b0d1ff05.tar.gz rust-d7d820fc47a5987566550ef9ede2ea18b0d1ff05.zip | |
simd: impl extract_element for vector types
This fixes some tests that needed vector element extraction. Signed-off-by: Andy Sadler <andrewsadler122@gmail.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/builder.rs | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/src/builder.rs b/src/builder.rs index 52a4854aca3..95080e024fc 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -1059,8 +1059,19 @@ impl<'a, 'gcc, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'gcc, 'tcx> { unimplemented!(); } - fn extract_element(&mut self, _vec: RValue<'gcc>, _idx: RValue<'gcc>) -> RValue<'gcc> { - unimplemented!(); + #[cfg(feature="master")] + fn extract_element(&mut self, vec: RValue<'gcc>, idx: RValue<'gcc>) -> RValue<'gcc> { + self.context.new_vector_access(None, vec, idx).to_rvalue() + } + + #[cfg(not(feature="master"))] + fn extract_element(&mut self, vec: RValue<'gcc>, idx: RValue<'gcc>) -> RValue<'gcc> { + let vector_type = vec.get_type().unqualified().dyncast_vector().expect("Called extract_element on a non-vector type"); + let element_type = vector_type.get_element_type(); + let vec_num_units = vector_type.get_num_units(); + let array_type = self.context.new_array_type(None, element_type, vec_num_units as i32); + let array = self.context.new_bitcast(None, vec, array_type).to_rvalue(); + self.context.new_array_access(None, array, idx).to_rvalue() } fn vector_splat(&mut self, _num_elts: usize, _elt: RValue<'gcc>) -> RValue<'gcc> { |
