about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2022-08-28 01:34:47 +0000
committerbors <bors@rust-lang.org>2022-08-28 01:34:47 +0000
commitf48af912ea9a9726ff851a3e4a809e1d2daeb0ba (patch)
tree554e0315662fce79d79de33fc05cb3def7d3392a
parent1239a022ca6f7696825ca2158a3953fc85819fa4 (diff)
parent5f357c2c51e5663f5c75b389c3fb3501753ac3be (diff)
downloadrust-f48af912ea9a9726ff851a3e4a809e1d2daeb0ba.tar.gz
rust-f48af912ea9a9726ff851a3e4a809e1d2daeb0ba.zip
Auto merge of #96946 - WaffleLapkin:ptr_mask, r=scottmcm
Add pointer masking convenience functions

This PR adds the following public API:
```rust
impl<T: ?Sized> *const T {
    fn mask(self, mask: usize) -> *const T;
}

impl<T: ?Sized> *mut T {
    fn mask(self, mask: usize) -> *const T;
}

// mod intrinsics
fn mask<T>(ptr: *const T, mask: usize) -> *const T
```
This is equivalent to `ptr.map_addr(|a| a & mask)` but also uses a cool llvm intrinsic.

Proposed in https://github.com/rust-lang/rust/pull/95643#issuecomment-1121562352

cc `@Gankra` `@scottmcm` `@RalfJung`

r? rust-lang/libs-api
-rw-r--r--src/intrinsics/mod.rs7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/intrinsics/mod.rs b/src/intrinsics/mod.rs
index ef3d5ccea8a..95239f415a9 100644
--- a/src/intrinsics/mod.rs
+++ b/src/intrinsics/mod.rs
@@ -577,6 +577,13 @@ fn codegen_regular_intrinsic_call<'tcx>(
             ret.write_cvalue(fx, CValue::by_val(res, base.layout()));
         }
 
+        sym::ptr_mask => {
+            intrinsic_args!(fx, args => (ptr, mask); intrinsic);
+            let ptr = ptr.load_scalar(fx);
+            let mask = mask.load_scalar(fx);
+            fx.bcx.ins().band(ptr, mask);
+        }
+
         sym::transmute => {
             intrinsic_args!(fx, args => (from); intrinsic);