Auto merge of #135760 - scottmcm:disjoint-bitor, r=WaffleLapkin
Add `unchecked_disjoint_bitor` per ACP373 Following the names from libs-api in https://github.com/rust-lang/libs-team/issues/373#issuecomment-2085686057 Includes a fallback implementation so this doesn't have to update cg_clif or cg_gcc, and overrides it in cg_llvm to use `or disjoint`, which [is available in LLVM 18](https://releases.llvm.org/18.1.0/docs/LangRef.html#or-instruction) so hopefully we don't need any version checks.
This commit is contained in:
commit
3f33b30e19
14 changed files with 205 additions and 4 deletions
|
@ -225,6 +225,11 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||
args[1].val.unaligned_volatile_store(bx, dst);
|
||||
return Ok(());
|
||||
}
|
||||
sym::disjoint_bitor => {
|
||||
let a = args[0].immediate();
|
||||
let b = args[1].immediate();
|
||||
bx.or_disjoint(a, b)
|
||||
}
|
||||
sym::exact_div => {
|
||||
let ty = arg_tys[0];
|
||||
match int_type_width_signed(ty, bx.tcx()) {
|
||||
|
|
|
@ -167,6 +167,11 @@ pub trait BuilderMethods<'a, 'tcx>:
|
|||
fn unchecked_umul(&mut self, lhs: Self::Value, rhs: Self::Value) -> Self::Value;
|
||||
fn and(&mut self, lhs: Self::Value, rhs: Self::Value) -> Self::Value;
|
||||
fn or(&mut self, lhs: Self::Value, rhs: Self::Value) -> Self::Value;
|
||||
/// Defaults to [`Self::or`], but guarantees `(lhs & rhs) == 0` so some backends
|
||||
/// can emit something more helpful for optimizations.
|
||||
fn or_disjoint(&mut self, lhs: Self::Value, rhs: Self::Value) -> Self::Value {
|
||||
self.or(lhs, rhs)
|
||||
}
|
||||
fn xor(&mut self, lhs: Self::Value, rhs: Self::Value) -> Self::Value;
|
||||
fn neg(&mut self, v: Self::Value) -> Self::Value;
|
||||
fn fneg(&mut self, v: Self::Value) -> Self::Value;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue