add simd_arith_offset intrinsics
This commit is contained in:
parent
de392c7d31
commit
7f945b2b5b
3 changed files with 23 additions and 0 deletions
|
@ -1839,6 +1839,27 @@ unsupported {} from `{}` with element `{}` of size `{}` to `{}`"#,
|
||||||
simd_neg: Int => neg, Float => fneg;
|
simd_neg: Int => neg, Float => fneg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if name == sym::simd_arith_offset {
|
||||||
|
// This also checks that the first operand is a ptr type.
|
||||||
|
let pointee = in_elem.builtin_deref(true).unwrap_or_else(|| {
|
||||||
|
span_bug!(span, "must be called with a vector of pointer types as first argument")
|
||||||
|
});
|
||||||
|
let layout = bx.layout_of(pointee.ty);
|
||||||
|
let ptrs = args[0].immediate();
|
||||||
|
// The second argument must be a ptr-sized integer.
|
||||||
|
// (We don't care about the signedness, this is wrapping anyway.)
|
||||||
|
let (_offsets_len, offsets_elem) = arg_tys[1].simd_size_and_type(bx.tcx());
|
||||||
|
if !matches!(offsets_elem.kind(), ty::Int(ty::IntTy::Isize) | ty::Uint(ty::UintTy::Usize)) {
|
||||||
|
span_bug!(
|
||||||
|
span,
|
||||||
|
"must be called with a vector of pointer-sized integers as second argument"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
let offsets = args[1].immediate();
|
||||||
|
|
||||||
|
return Ok(bx.gep(bx.backend_type(layout), ptrs, &[offsets]));
|
||||||
|
}
|
||||||
|
|
||||||
if name == sym::simd_saturating_add || name == sym::simd_saturating_sub {
|
if name == sym::simd_saturating_add || name == sym::simd_saturating_sub {
|
||||||
let lhs = args[0].immediate();
|
let lhs = args[0].immediate();
|
||||||
let rhs = args[1].immediate();
|
let rhs = args[1].immediate();
|
||||||
|
|
|
@ -1245,6 +1245,7 @@ symbols! {
|
||||||
simd,
|
simd,
|
||||||
simd_add,
|
simd_add,
|
||||||
simd_and,
|
simd_and,
|
||||||
|
simd_arith_offset,
|
||||||
simd_as,
|
simd_as,
|
||||||
simd_bitmask,
|
simd_bitmask,
|
||||||
simd_cast,
|
simd_cast,
|
||||||
|
|
|
@ -437,6 +437,7 @@ pub fn check_platform_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>)
|
||||||
| sym::simd_fpow
|
| sym::simd_fpow
|
||||||
| sym::simd_saturating_add
|
| sym::simd_saturating_add
|
||||||
| sym::simd_saturating_sub => (1, vec![param(0), param(0)], param(0)),
|
| sym::simd_saturating_sub => (1, vec![param(0), param(0)], param(0)),
|
||||||
|
sym::simd_arith_offset => (2, vec![param(0), param(1)], param(0)),
|
||||||
sym::simd_neg
|
sym::simd_neg
|
||||||
| sym::simd_fsqrt
|
| sym::simd_fsqrt
|
||||||
| sym::simd_fsin
|
| sym::simd_fsin
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue