about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMaybe Waffle <waffle.lapkin@gmail.com>2022-05-13 17:08:44 +0400
committerMaybe Waffle <waffle.lapkin@gmail.com>2022-08-21 05:27:14 +0400
commit1acc3b45e3c83423e12154a6c893941b2bb4ef7a (patch)
treed25ce86ee2587d20835c2bad33f898cc5e8e2ed6
parent34d33f2299b30103a7cc640013e4d75fcdd77d1b (diff)
downloadrust-1acc3b45e3c83423e12154a6c893941b2bb4ef7a.tar.gz
rust-1acc3b45e3c83423e12154a6c893941b2bb4ef7a.zip
Fix `ptr_mask` impl in cg gcc
-rw-r--r--src/intrinsic/mod.rs12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/intrinsic/mod.rs b/src/intrinsic/mod.rs
index b0e7e5e1dd0..beb9a800144 100644
--- a/src/intrinsic/mod.rs
+++ b/src/intrinsic/mod.rs
@@ -309,8 +309,18 @@ impl<'a, 'gcc, 'tcx> IntrinsicCallMethods<'tcx> for Builder<'a, 'gcc, 'tcx> {
                     return;
                 }
 
-                sym::ptr_mask => self.and(args[0].immediate(), args[1].immediate()),
+                sym::ptr_mask => {
+                    let usize_type = self.context.new_type::<usize>();
+                    let void_ptr_type = self.context.new_type::<*const ()>();
 
+                    let ptr = args[0].immediate();
+                    let mask = args[1].immediate();
+
+                    let addr = self.bitcast(ptr, usize_type);
+                    let masked = self.and(addr, mask);
+                    self.bitcast(masked, void_ptr_type)
+                },
+                
                 _ if name_str.starts_with("simd_") => {
                     match generic_simd_intrinsic(self, name, callee_ty, args, ret_ty, llret_ty, span) {
                         Ok(llval) => llval,