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
This commit is contained in:
commit
7006047b2d
@ -309,6 +309,18 @@ impl<'a, 'gcc, 'tcx> IntrinsicCallMethods<'tcx> for Builder<'a, 'gcc, 'tcx> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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_") => {
|
_ if name_str.starts_with("simd_") => {
|
||||||
match generic_simd_intrinsic(self, name, callee_ty, args, ret_ty, llret_ty, span) {
|
match generic_simd_intrinsic(self, name, callee_ty, args, ret_ty, llret_ty, span) {
|
||||||
Ok(llval) => llval,
|
Ok(llval) => llval,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user