about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorAndy Sadler <andrewsadler122@gmail.com>2022-09-07 21:32:34 -0500
committerAndy Sadler <andrewsadler122@gmail.com>2022-09-09 10:07:36 -0500
commitd7d820fc47a5987566550ef9ede2ea18b0d1ff05 (patch)
tree4f3a3dac2fe538619d76c74ab42a1a9e2fd26d2d /src
parent2ecd620acb56c1f834bc4b7c50b2ac4fe8fac0c5 (diff)
downloadrust-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.rs15
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> {