about summary refs log tree commit diff
path: root/src/test/codegen
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
commit1e978a3627bd65064164af3548c585fb25eef9d2 (patch)
treed36b93e40e37cd26a0f15a200435c511ed21c0bd /src/test/codegen
parenteaadb8947b850a025404082f6297766c4680a42a (diff)
parentca753124088c0d57ca6728ee093363cbc1db5274 (diff)
downloadrust-1e978a3627bd65064164af3548c585fb25eef9d2.tar.gz
rust-1e978a3627bd65064164af3548c585fb25eef9d2.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
Diffstat (limited to 'src/test/codegen')
-rw-r--r--src/test/codegen/intrinsics/mask.rs11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/test/codegen/intrinsics/mask.rs b/src/test/codegen/intrinsics/mask.rs
new file mode 100644
index 00000000000..2e984db1be5
--- /dev/null
+++ b/src/test/codegen/intrinsics/mask.rs
@@ -0,0 +1,11 @@
+#![crate_type = "lib"]
+#![feature(core_intrinsics)]
+
+// CHECK-LABEL: @mask_ptr
+// CHECK-SAME: [[WORD:i[0-9]+]] %mask
+#[no_mangle]
+pub fn mask_ptr(ptr: *const u16, mask: usize) -> *const u16 {
+    // CHECK: call
+    // CHECK-SAME: @llvm.ptrmask.{{p0|p0i8}}.[[WORD]]({{ptr|i8\*}} {{%ptr|%0}}, [[WORD]] %mask)
+    core::intrinsics::ptr_mask(ptr, mask)
+}