Rollup merge of #137953 - RalfJung:simd-intrinsic-masks, r=WaffleLapkin
simd intrinsics with mask: accept unsigned integer masks, and fix some of the errors It's not clear at all why the mask would have to be signed, it is anyway interpreted bitwise. The backend should just make sure that works no matter the surface-level type; our LLVM backend already does this correctly. The note of "the mask may be widened, which only has the correct behavior for signed integers" explains... nothing? Why can't the code do the widening correctly? If necessary, just cast to the signed type first... Also while we are at it, fix the errors. For simd_masked_load/store, the errors talked about the "third argument" but they meant the first argument (the mask is the first argument there). They also used the wrong type for `expected_element`. I have extremely low confidence in the GCC part of this PR. See [discussion on Zulip](https://rust-lang.zulipchat.com/#narrow/channel/257879-project-portable-simd/topic/On.20the.20sign.20of.20masks)
This commit is contained in:
commit
d15c603173
18 changed files with 119 additions and 148 deletions
|
@ -447,9 +447,14 @@ pub fn generic_simd_intrinsic<'a, 'gcc, 'tcx>(
|
||||||
m_len == v_len,
|
m_len == v_len,
|
||||||
InvalidMonomorphization::MismatchedLengths { span, name, m_len, v_len }
|
InvalidMonomorphization::MismatchedLengths { span, name, m_len, v_len }
|
||||||
);
|
);
|
||||||
|
// TODO: also support unsigned integers.
|
||||||
match *m_elem_ty.kind() {
|
match *m_elem_ty.kind() {
|
||||||
ty::Int(_) => {}
|
ty::Int(_) => {}
|
||||||
_ => return_error!(InvalidMonomorphization::MaskType { span, name, ty: m_elem_ty }),
|
_ => return_error!(InvalidMonomorphization::MaskWrongElementType {
|
||||||
|
span,
|
||||||
|
name,
|
||||||
|
ty: m_elem_ty
|
||||||
|
}),
|
||||||
}
|
}
|
||||||
return Ok(bx.vector_select(args[0].immediate(), args[1].immediate(), args[2].immediate()));
|
return Ok(bx.vector_select(args[0].immediate(), args[1].immediate(), args[2].immediate()));
|
||||||
}
|
}
|
||||||
|
@ -991,19 +996,15 @@ pub fn generic_simd_intrinsic<'a, 'gcc, 'tcx>(
|
||||||
assert_eq!(pointer_count - 1, ptr_count(element_ty0));
|
assert_eq!(pointer_count - 1, ptr_count(element_ty0));
|
||||||
assert_eq!(underlying_ty, non_ptr(element_ty0));
|
assert_eq!(underlying_ty, non_ptr(element_ty0));
|
||||||
|
|
||||||
// The element type of the third argument must be a signed integer type of any width:
|
// The element type of the third argument must be an integer type of any width:
|
||||||
|
// TODO: also support unsigned integers.
|
||||||
let (_, element_ty2) = arg_tys[2].simd_size_and_type(bx.tcx());
|
let (_, element_ty2) = arg_tys[2].simd_size_and_type(bx.tcx());
|
||||||
match *element_ty2.kind() {
|
match *element_ty2.kind() {
|
||||||
ty::Int(_) => (),
|
ty::Int(_) => (),
|
||||||
_ => {
|
_ => {
|
||||||
require!(
|
require!(
|
||||||
false,
|
false,
|
||||||
InvalidMonomorphization::ThirdArgElementType {
|
InvalidMonomorphization::MaskWrongElementType { span, name, ty: element_ty2 }
|
||||||
span,
|
|
||||||
name,
|
|
||||||
expected_element: element_ty2,
|
|
||||||
third_arg: arg_tys[2]
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1109,17 +1110,13 @@ pub fn generic_simd_intrinsic<'a, 'gcc, 'tcx>(
|
||||||
assert_eq!(underlying_ty, non_ptr(element_ty0));
|
assert_eq!(underlying_ty, non_ptr(element_ty0));
|
||||||
|
|
||||||
// The element type of the third argument must be a signed integer type of any width:
|
// The element type of the third argument must be a signed integer type of any width:
|
||||||
|
// TODO: also support unsigned integers.
|
||||||
match *element_ty2.kind() {
|
match *element_ty2.kind() {
|
||||||
ty::Int(_) => (),
|
ty::Int(_) => (),
|
||||||
_ => {
|
_ => {
|
||||||
require!(
|
require!(
|
||||||
false,
|
false,
|
||||||
InvalidMonomorphization::ThirdArgElementType {
|
InvalidMonomorphization::MaskWrongElementType { span, name, ty: element_ty2 }
|
||||||
span,
|
|
||||||
name,
|
|
||||||
expected_element: element_ty2,
|
|
||||||
third_arg: arg_tys[2]
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1184,18 +1184,6 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
|
||||||
}};
|
}};
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the bitwidth of the `$ty` argument if it is an `Int` type.
|
|
||||||
macro_rules! require_int_ty {
|
|
||||||
($ty: expr, $diag: expr) => {
|
|
||||||
match $ty {
|
|
||||||
ty::Int(i) => i.bit_width().unwrap_or_else(|| bx.data_layout().pointer_size.bits()),
|
|
||||||
_ => {
|
|
||||||
return_error!($diag);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns the bitwidth of the `$ty` argument if it is an `Int` or `Uint` type.
|
/// Returns the bitwidth of the `$ty` argument if it is an `Int` or `Uint` type.
|
||||||
macro_rules! require_int_or_uint_ty {
|
macro_rules! require_int_or_uint_ty {
|
||||||
($ty: expr, $diag: expr) => {
|
($ty: expr, $diag: expr) => {
|
||||||
|
@ -1485,9 +1473,9 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
|
||||||
m_len == v_len,
|
m_len == v_len,
|
||||||
InvalidMonomorphization::MismatchedLengths { span, name, m_len, v_len }
|
InvalidMonomorphization::MismatchedLengths { span, name, m_len, v_len }
|
||||||
);
|
);
|
||||||
let in_elem_bitwidth = require_int_ty!(
|
let in_elem_bitwidth = require_int_or_uint_ty!(
|
||||||
m_elem_ty.kind(),
|
m_elem_ty.kind(),
|
||||||
InvalidMonomorphization::MaskType { span, name, ty: m_elem_ty }
|
InvalidMonomorphization::MaskWrongElementType { span, name, ty: m_elem_ty }
|
||||||
);
|
);
|
||||||
let m_i1s = vector_mask_to_bitmask(bx, args[0].immediate(), in_elem_bitwidth, m_len);
|
let m_i1s = vector_mask_to_bitmask(bx, args[0].immediate(), in_elem_bitwidth, m_len);
|
||||||
return Ok(bx.select(m_i1s, args[1].immediate(), args[2].immediate()));
|
return Ok(bx.select(m_i1s, args[1].immediate(), args[2].immediate()));
|
||||||
|
@ -1508,7 +1496,7 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
|
||||||
// Integer vector <i{in_bitwidth} x in_len>:
|
// Integer vector <i{in_bitwidth} x in_len>:
|
||||||
let in_elem_bitwidth = require_int_or_uint_ty!(
|
let in_elem_bitwidth = require_int_or_uint_ty!(
|
||||||
in_elem.kind(),
|
in_elem.kind(),
|
||||||
InvalidMonomorphization::VectorArgument { span, name, in_ty, in_elem }
|
InvalidMonomorphization::MaskWrongElementType { span, name, ty: in_elem }
|
||||||
);
|
);
|
||||||
|
|
||||||
let i1xn = vector_mask_to_bitmask(bx, args[0].immediate(), in_elem_bitwidth, in_len);
|
let i1xn = vector_mask_to_bitmask(bx, args[0].immediate(), in_elem_bitwidth, in_len);
|
||||||
|
@ -1732,14 +1720,9 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
let mask_elem_bitwidth = require_int_ty!(
|
let mask_elem_bitwidth = require_int_or_uint_ty!(
|
||||||
element_ty2.kind(),
|
element_ty2.kind(),
|
||||||
InvalidMonomorphization::ThirdArgElementType {
|
InvalidMonomorphization::MaskWrongElementType { span, name, ty: element_ty2 }
|
||||||
span,
|
|
||||||
name,
|
|
||||||
expected_element: element_ty2,
|
|
||||||
third_arg: arg_tys[2]
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
|
|
||||||
// Alignment of T, must be a constant integer value:
|
// Alignment of T, must be a constant integer value:
|
||||||
|
@ -1834,14 +1817,9 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
let m_elem_bitwidth = require_int_ty!(
|
let m_elem_bitwidth = require_int_or_uint_ty!(
|
||||||
mask_elem.kind(),
|
mask_elem.kind(),
|
||||||
InvalidMonomorphization::ThirdArgElementType {
|
InvalidMonomorphization::MaskWrongElementType { span, name, ty: mask_elem }
|
||||||
span,
|
|
||||||
name,
|
|
||||||
expected_element: values_elem,
|
|
||||||
third_arg: mask_ty,
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
|
|
||||||
let mask = vector_mask_to_bitmask(bx, args[0].immediate(), m_elem_bitwidth, mask_len);
|
let mask = vector_mask_to_bitmask(bx, args[0].immediate(), m_elem_bitwidth, mask_len);
|
||||||
|
@ -1924,14 +1902,9 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
let m_elem_bitwidth = require_int_ty!(
|
let m_elem_bitwidth = require_int_or_uint_ty!(
|
||||||
mask_elem.kind(),
|
mask_elem.kind(),
|
||||||
InvalidMonomorphization::ThirdArgElementType {
|
InvalidMonomorphization::MaskWrongElementType { span, name, ty: mask_elem }
|
||||||
span,
|
|
||||||
name,
|
|
||||||
expected_element: values_elem,
|
|
||||||
third_arg: mask_ty,
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
|
|
||||||
let mask = vector_mask_to_bitmask(bx, args[0].immediate(), m_elem_bitwidth, mask_len);
|
let mask = vector_mask_to_bitmask(bx, args[0].immediate(), m_elem_bitwidth, mask_len);
|
||||||
|
@ -2019,15 +1992,10 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
// The element type of the third argument must be a signed integer type of any width:
|
// The element type of the third argument must be an integer type of any width:
|
||||||
let mask_elem_bitwidth = require_int_ty!(
|
let mask_elem_bitwidth = require_int_or_uint_ty!(
|
||||||
element_ty2.kind(),
|
element_ty2.kind(),
|
||||||
InvalidMonomorphization::ThirdArgElementType {
|
InvalidMonomorphization::MaskWrongElementType { span, name, ty: element_ty2 }
|
||||||
span,
|
|
||||||
name,
|
|
||||||
expected_element: element_ty2,
|
|
||||||
third_arg: arg_tys[2]
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
|
|
||||||
// Alignment of T, must be a constant integer value:
|
// Alignment of T, must be a constant integer value:
|
||||||
|
|
|
@ -125,8 +125,7 @@ codegen_ssa_invalid_monomorphization_inserted_type = invalid monomorphization of
|
||||||
|
|
||||||
codegen_ssa_invalid_monomorphization_invalid_bitmask = invalid monomorphization of `{$name}` intrinsic: invalid bitmask `{$mask_ty}`, expected `u{$expected_int_bits}` or `[u8; {$expected_bytes}]`
|
codegen_ssa_invalid_monomorphization_invalid_bitmask = invalid monomorphization of `{$name}` intrinsic: invalid bitmask `{$mask_ty}`, expected `u{$expected_int_bits}` or `[u8; {$expected_bytes}]`
|
||||||
|
|
||||||
codegen_ssa_invalid_monomorphization_mask_type = invalid monomorphization of `{$name}` intrinsic: found mask element type is `{$ty}`, expected a signed integer type
|
codegen_ssa_invalid_monomorphization_mask_wrong_element_type = invalid monomorphization of `{$name}` intrinsic: expected mask element type to be an integer, found `{$ty}`
|
||||||
.note = the mask may be widened, which only has the correct behavior for signed integers
|
|
||||||
|
|
||||||
codegen_ssa_invalid_monomorphization_mismatched_lengths = invalid monomorphization of `{$name}` intrinsic: mismatched lengths: mask length `{$m_len}` != other vector length `{$v_len}`
|
codegen_ssa_invalid_monomorphization_mismatched_lengths = invalid monomorphization of `{$name}` intrinsic: mismatched lengths: mask length `{$m_len}` != other vector length `{$v_len}`
|
||||||
|
|
||||||
|
@ -158,8 +157,6 @@ codegen_ssa_invalid_monomorphization_simd_shuffle = invalid monomorphization of
|
||||||
|
|
||||||
codegen_ssa_invalid_monomorphization_simd_third = invalid monomorphization of `{$name}` intrinsic: expected SIMD third type, found non-SIMD `{$ty}`
|
codegen_ssa_invalid_monomorphization_simd_third = invalid monomorphization of `{$name}` intrinsic: expected SIMD third type, found non-SIMD `{$ty}`
|
||||||
|
|
||||||
codegen_ssa_invalid_monomorphization_third_arg_element_type = invalid monomorphization of `{$name}` intrinsic: expected element type `{$expected_element}` of third argument `{$third_arg}` to be a signed integer type
|
|
||||||
|
|
||||||
codegen_ssa_invalid_monomorphization_third_argument_length = invalid monomorphization of `{$name}` intrinsic: expected third argument with length {$in_len} (same as input type `{$in_ty}`), found `{$arg_ty}` with length {$out_len}
|
codegen_ssa_invalid_monomorphization_third_argument_length = invalid monomorphization of `{$name}` intrinsic: expected third argument with length {$in_len} (same as input type `{$in_ty}`), found `{$arg_ty}` with length {$out_len}
|
||||||
|
|
||||||
codegen_ssa_invalid_monomorphization_unrecognized_intrinsic = invalid monomorphization of `{$name}` intrinsic: unrecognized intrinsic `{$name}`
|
codegen_ssa_invalid_monomorphization_unrecognized_intrinsic = invalid monomorphization of `{$name}` intrinsic: unrecognized intrinsic `{$name}`
|
||||||
|
@ -172,8 +169,6 @@ codegen_ssa_invalid_monomorphization_unsupported_symbol = invalid monomorphizati
|
||||||
|
|
||||||
codegen_ssa_invalid_monomorphization_unsupported_symbol_of_size = invalid monomorphization of `{$name}` intrinsic: unsupported {$symbol} from `{$in_ty}` with element `{$in_elem}` of size `{$size}` to `{$ret_ty}`
|
codegen_ssa_invalid_monomorphization_unsupported_symbol_of_size = invalid monomorphization of `{$name}` intrinsic: unsupported {$symbol} from `{$in_ty}` with element `{$in_elem}` of size `{$size}` to `{$ret_ty}`
|
||||||
|
|
||||||
codegen_ssa_invalid_monomorphization_vector_argument = invalid monomorphization of `{$name}` intrinsic: vector argument `{$in_ty}`'s element type `{$in_elem}`, expected integer element type
|
|
||||||
|
|
||||||
codegen_ssa_invalid_no_sanitize = invalid argument for `no_sanitize`
|
codegen_ssa_invalid_no_sanitize = invalid argument for `no_sanitize`
|
||||||
.note = expected one of: `address`, `cfi`, `hwaddress`, `kcfi`, `memory`, `memtag`, `shadow-call-stack`, or `thread`
|
.note = expected one of: `address`, `cfi`, `hwaddress`, `kcfi`, `memory`, `memtag`, `shadow-call-stack`, or `thread`
|
||||||
|
|
||||||
|
|
|
@ -1037,24 +1037,14 @@ pub enum InvalidMonomorphization<'tcx> {
|
||||||
v_len: u64,
|
v_len: u64,
|
||||||
},
|
},
|
||||||
|
|
||||||
#[diag(codegen_ssa_invalid_monomorphization_mask_type, code = E0511)]
|
#[diag(codegen_ssa_invalid_monomorphization_mask_wrong_element_type, code = E0511)]
|
||||||
#[note]
|
MaskWrongElementType {
|
||||||
MaskType {
|
|
||||||
#[primary_span]
|
#[primary_span]
|
||||||
span: Span,
|
span: Span,
|
||||||
name: Symbol,
|
name: Symbol,
|
||||||
ty: Ty<'tcx>,
|
ty: Ty<'tcx>,
|
||||||
},
|
},
|
||||||
|
|
||||||
#[diag(codegen_ssa_invalid_monomorphization_vector_argument, code = E0511)]
|
|
||||||
VectorArgument {
|
|
||||||
#[primary_span]
|
|
||||||
span: Span,
|
|
||||||
name: Symbol,
|
|
||||||
in_ty: Ty<'tcx>,
|
|
||||||
in_elem: Ty<'tcx>,
|
|
||||||
},
|
|
||||||
|
|
||||||
#[diag(codegen_ssa_invalid_monomorphization_cannot_return, code = E0511)]
|
#[diag(codegen_ssa_invalid_monomorphization_cannot_return, code = E0511)]
|
||||||
CannotReturn {
|
CannotReturn {
|
||||||
#[primary_span]
|
#[primary_span]
|
||||||
|
@ -1077,15 +1067,6 @@ pub enum InvalidMonomorphization<'tcx> {
|
||||||
mutability: ExpectedPointerMutability,
|
mutability: ExpectedPointerMutability,
|
||||||
},
|
},
|
||||||
|
|
||||||
#[diag(codegen_ssa_invalid_monomorphization_third_arg_element_type, code = E0511)]
|
|
||||||
ThirdArgElementType {
|
|
||||||
#[primary_span]
|
|
||||||
span: Span,
|
|
||||||
name: Symbol,
|
|
||||||
expected_element: Ty<'tcx>,
|
|
||||||
third_arg: Ty<'tcx>,
|
|
||||||
},
|
|
||||||
|
|
||||||
#[diag(codegen_ssa_invalid_monomorphization_unsupported_symbol_of_size, code = E0511)]
|
#[diag(codegen_ssa_invalid_monomorphization_unsupported_symbol_of_size, code = E0511)]
|
||||||
UnsupportedSymbolOfSize {
|
UnsupportedSymbolOfSize {
|
||||||
#[primary_span]
|
#[primary_span]
|
||||||
|
|
|
@ -304,7 +304,7 @@ pub unsafe fn simd_shuffle<T, U, V>(x: T, y: T, idx: U) -> V;
|
||||||
///
|
///
|
||||||
/// `U` must be a vector of pointers to the element type of `T`, with the same length as `T`.
|
/// `U` must be a vector of pointers to the element type of `T`, with the same length as `T`.
|
||||||
///
|
///
|
||||||
/// `V` must be a vector of signed integers with the same length as `T` (but any element size).
|
/// `V` must be a vector of integers with the same length as `T` (but any element size).
|
||||||
///
|
///
|
||||||
/// For each pointer in `ptr`, if the corresponding value in `mask` is `!0`, read the pointer.
|
/// For each pointer in `ptr`, if the corresponding value in `mask` is `!0`, read the pointer.
|
||||||
/// Otherwise if the corresponding value in `mask` is `0`, return the corresponding value from
|
/// Otherwise if the corresponding value in `mask` is `0`, return the corresponding value from
|
||||||
|
@ -325,7 +325,7 @@ pub unsafe fn simd_gather<T, U, V>(val: T, ptr: U, mask: V) -> T;
|
||||||
///
|
///
|
||||||
/// `U` must be a vector of pointers to the element type of `T`, with the same length as `T`.
|
/// `U` must be a vector of pointers to the element type of `T`, with the same length as `T`.
|
||||||
///
|
///
|
||||||
/// `V` must be a vector of signed integers with the same length as `T` (but any element size).
|
/// `V` must be a vector of integers with the same length as `T` (but any element size).
|
||||||
///
|
///
|
||||||
/// For each pointer in `ptr`, if the corresponding value in `mask` is `!0`, write the
|
/// For each pointer in `ptr`, if the corresponding value in `mask` is `!0`, write the
|
||||||
/// corresponding value in `val` to the pointer.
|
/// corresponding value in `val` to the pointer.
|
||||||
|
@ -349,7 +349,7 @@ pub unsafe fn simd_scatter<T, U, V>(val: T, ptr: U, mask: V);
|
||||||
///
|
///
|
||||||
/// `U` must be a pointer to the element type of `T`
|
/// `U` must be a pointer to the element type of `T`
|
||||||
///
|
///
|
||||||
/// `V` must be a vector of signed integers with the same length as `T` (but any element size).
|
/// `V` must be a vector of integers with the same length as `T` (but any element size).
|
||||||
///
|
///
|
||||||
/// For each element, if the corresponding value in `mask` is `!0`, read the corresponding
|
/// For each element, if the corresponding value in `mask` is `!0`, read the corresponding
|
||||||
/// pointer offset from `ptr`.
|
/// pointer offset from `ptr`.
|
||||||
|
@ -372,7 +372,7 @@ pub unsafe fn simd_masked_load<V, U, T>(mask: V, ptr: U, val: T) -> T;
|
||||||
///
|
///
|
||||||
/// `U` must be a pointer to the element type of `T`
|
/// `U` must be a pointer to the element type of `T`
|
||||||
///
|
///
|
||||||
/// `V` must be a vector of signed integers with the same length as `T` (but any element size).
|
/// `V` must be a vector of integers with the same length as `T` (but any element size).
|
||||||
///
|
///
|
||||||
/// For each element, if the corresponding value in `mask` is `!0`, write the corresponding
|
/// For each element, if the corresponding value in `mask` is `!0`, write the corresponding
|
||||||
/// value in `val` to the pointer offset from `ptr`.
|
/// value in `val` to the pointer offset from `ptr`.
|
||||||
|
@ -556,7 +556,7 @@ pub unsafe fn simd_bitmask<T, U>(x: T) -> U;
|
||||||
///
|
///
|
||||||
/// `T` must be a vector.
|
/// `T` must be a vector.
|
||||||
///
|
///
|
||||||
/// `M` must be a signed integer vector with the same length as `T` (but any element size).
|
/// `M` must be an integer vector with the same length as `T` (but any element size).
|
||||||
///
|
///
|
||||||
/// For each element, if the corresponding value in `mask` is `!0`, select the element from
|
/// For each element, if the corresponding value in `mask` is `!0`, select the element from
|
||||||
/// `if_true`. If the corresponding value in `mask` is `0`, select the element from
|
/// `if_true`. If the corresponding value in `mask` is `0`, select the element from
|
||||||
|
|
|
@ -1382,6 +1382,11 @@ pub(crate) fn bool_to_simd_element(b: bool, size: Size) -> Scalar {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn simd_element_to_bool(elem: ImmTy<'_>) -> InterpResult<'_, bool> {
|
pub(crate) fn simd_element_to_bool(elem: ImmTy<'_>) -> InterpResult<'_, bool> {
|
||||||
|
assert!(
|
||||||
|
matches!(elem.layout.ty.kind(), ty::Int(_) | ty::Uint(_)),
|
||||||
|
"SIMD mask element type must be an integer, but this is `{}`",
|
||||||
|
elem.layout.ty
|
||||||
|
);
|
||||||
let val = elem.to_scalar().to_int(elem.layout.size)?;
|
let val = elem.to_scalar().to_int(elem.layout.size)?;
|
||||||
interp_ok(match val {
|
interp_ok(match val {
|
||||||
0 => false,
|
0 => false,
|
||||||
|
|
|
@ -29,6 +29,19 @@ pub unsafe fn gather_f32x2(
|
||||||
simd_gather(values, pointers, mask)
|
simd_gather(values, pointers, mask)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CHECK-LABEL: @gather_f32x2_unsigned
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe fn gather_f32x2_unsigned(
|
||||||
|
pointers: Vec2<*const f32>,
|
||||||
|
mask: Vec2<u32>,
|
||||||
|
values: Vec2<f32>,
|
||||||
|
) -> Vec2<f32> {
|
||||||
|
// CHECK: [[A:%[0-9]+]] = lshr <2 x i32> {{.*}}, {{<i32 31, i32 31>|splat \(i32 31\)}}
|
||||||
|
// CHECK: [[B:%[0-9]+]] = trunc <2 x i32> [[A]] to <2 x i1>
|
||||||
|
// CHECK: call <2 x float> @llvm.masked.gather.v2f32.v2p0(<2 x ptr> {{.*}}, i32 {{.*}}, <2 x i1> [[B]], <2 x float> {{.*}})
|
||||||
|
simd_gather(values, pointers, mask)
|
||||||
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @gather_pf32x2
|
// CHECK-LABEL: @gather_pf32x2
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn gather_pf32x2(
|
pub unsafe fn gather_pf32x2(
|
||||||
|
|
|
@ -23,6 +23,19 @@ pub unsafe fn load_f32x2(mask: Vec2<i32>, pointer: *const f32, values: Vec2<f32>
|
||||||
simd_masked_load(mask, pointer, values)
|
simd_masked_load(mask, pointer, values)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CHECK-LABEL: @load_f32x2_unsigned
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe fn load_f32x2_unsigned(
|
||||||
|
mask: Vec2<u32>,
|
||||||
|
pointer: *const f32,
|
||||||
|
values: Vec2<f32>,
|
||||||
|
) -> Vec2<f32> {
|
||||||
|
// CHECK: [[A:%[0-9]+]] = lshr <2 x i32> {{.*}}, {{<i32 31, i32 31>|splat \(i32 31\)}}
|
||||||
|
// CHECK: [[B:%[0-9]+]] = trunc <2 x i32> [[A]] to <2 x i1>
|
||||||
|
// CHECK: call <2 x float> @llvm.masked.load.v2f32.p0(ptr {{.*}}, i32 4, <2 x i1> [[B]], <2 x float> {{.*}})
|
||||||
|
simd_masked_load(mask, pointer, values)
|
||||||
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @load_pf32x4
|
// CHECK-LABEL: @load_pf32x4
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn load_pf32x4(
|
pub unsafe fn load_pf32x4(
|
||||||
|
|
|
@ -23,6 +23,15 @@ pub unsafe fn store_f32x2(mask: Vec2<i32>, pointer: *mut f32, values: Vec2<f32>)
|
||||||
simd_masked_store(mask, pointer, values)
|
simd_masked_store(mask, pointer, values)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CHECK-LABEL: @store_f32x2_unsigned
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe fn store_f32x2_unsigned(mask: Vec2<u32>, pointer: *mut f32, values: Vec2<f32>) {
|
||||||
|
// CHECK: [[A:%[0-9]+]] = lshr <2 x i32> {{.*}}, {{<i32 31, i32 31>|splat \(i32 31\)}}
|
||||||
|
// CHECK: [[B:%[0-9]+]] = trunc <2 x i32> [[A]] to <2 x i1>
|
||||||
|
// CHECK: call void @llvm.masked.store.v2f32.p0(<2 x float> {{.*}}, ptr {{.*}}, i32 4, <2 x i1> [[B]])
|
||||||
|
simd_masked_store(mask, pointer, values)
|
||||||
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @store_pf32x4
|
// CHECK-LABEL: @store_pf32x4
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn store_pf32x4(mask: Vec4<i32>, pointer: *mut *const f32, values: Vec4<*const f32>) {
|
pub unsafe fn store_pf32x4(mask: Vec4<i32>, pointer: *mut *const f32, values: Vec4<*const f32>) {
|
||||||
|
|
|
@ -25,6 +25,15 @@ pub unsafe fn scatter_f32x2(pointers: Vec2<*mut f32>, mask: Vec2<i32>, values: V
|
||||||
simd_scatter(values, pointers, mask)
|
simd_scatter(values, pointers, mask)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CHECK-LABEL: @scatter_f32x2_unsigned
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe fn scatter_f32x2_unsigned(pointers: Vec2<*mut f32>, mask: Vec2<u32>, values: Vec2<f32>) {
|
||||||
|
// CHECK: [[A:%[0-9]+]] = lshr <2 x i32> {{.*}}, {{<i32 31, i32 31>|splat \(i32 31\)}}
|
||||||
|
// CHECK: [[B:%[0-9]+]] = trunc <2 x i32> [[A]] to <2 x i1>
|
||||||
|
// CHECK: call void @llvm.masked.scatter.v2f32.v2p0(<2 x float> {{.*}}, <2 x ptr> {{.*}}, i32 {{.*}}, <2 x i1> [[B]]
|
||||||
|
simd_scatter(values, pointers, mask)
|
||||||
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @scatter_pf32x2
|
// CHECK-LABEL: @scatter_pf32x2
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn scatter_pf32x2(
|
pub unsafe fn scatter_pf32x2(
|
||||||
|
|
|
@ -22,6 +22,10 @@ pub struct b8x4(pub [i8; 4]);
|
||||||
#[derive(Copy, Clone, PartialEq, Debug)]
|
#[derive(Copy, Clone, PartialEq, Debug)]
|
||||||
pub struct i32x4([i32; 4]);
|
pub struct i32x4([i32; 4]);
|
||||||
|
|
||||||
|
#[repr(simd)]
|
||||||
|
#[derive(Copy, Clone, PartialEq, Debug)]
|
||||||
|
pub struct u32x4([u32; 4]);
|
||||||
|
|
||||||
// CHECK-LABEL: @select_m8
|
// CHECK-LABEL: @select_m8
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn select_m8(m: b8x4, a: f32x4, b: f32x4) -> f32x4 {
|
pub unsafe fn select_m8(m: b8x4, a: f32x4, b: f32x4) -> f32x4 {
|
||||||
|
@ -40,6 +44,15 @@ pub unsafe fn select_m32(m: i32x4, a: f32x4, b: f32x4) -> f32x4 {
|
||||||
simd_select(m, a, b)
|
simd_select(m, a, b)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CHECK-LABEL: @select_m32_unsigned
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe fn select_m32_unsigned(m: u32x4, a: f32x4, b: f32x4) -> f32x4 {
|
||||||
|
// CHECK: [[A:%[0-9]+]] = lshr <4 x i32> %{{.*}}, {{<i32 31, i32 31, i32 31, i32 31>|splat \(i32 31\)}}
|
||||||
|
// CHECK: [[B:%[0-9]+]] = trunc <4 x i32> [[A]] to <4 x i1>
|
||||||
|
// CHECK: select <4 x i1> [[B]]
|
||||||
|
simd_select(m, a, b)
|
||||||
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @select_bitmask
|
// CHECK-LABEL: @select_bitmask
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn select_bitmask(m: i8, a: f32x8, b: f32x8) -> f32x8 {
|
pub unsafe fn select_bitmask(m: i8, a: f32x8, b: f32x8) -> f32x8 {
|
||||||
|
|
|
@ -20,7 +20,6 @@ fn main() {
|
||||||
let s_strided = x4([0_f32, 2., -3., 6.]);
|
let s_strided = x4([0_f32, 2., -3., 6.]);
|
||||||
|
|
||||||
let mask = x4([-1_i32, -1, 0, -1]);
|
let mask = x4([-1_i32, -1, 0, -1]);
|
||||||
let umask = x4([0u16; 4]);
|
|
||||||
let fmask = x4([0_f32; 4]);
|
let fmask = x4([0_f32; 4]);
|
||||||
|
|
||||||
let pointer = x.as_mut_ptr();
|
let pointer = x.as_mut_ptr();
|
||||||
|
@ -31,11 +30,8 @@ fn main() {
|
||||||
simd_gather(default, mask, mask);
|
simd_gather(default, mask, mask);
|
||||||
//~^ ERROR expected element type `i32` of second argument `x4<i32>` to be a pointer to the element type `f32`
|
//~^ ERROR expected element type `i32` of second argument `x4<i32>` to be a pointer to the element type `f32`
|
||||||
|
|
||||||
simd_gather(default, pointers, umask);
|
|
||||||
//~^ ERROR expected element type `u16` of third argument `x4<u16>` to be a signed integer type
|
|
||||||
|
|
||||||
simd_gather(default, pointers, fmask);
|
simd_gather(default, pointers, fmask);
|
||||||
//~^ ERROR expected element type `f32` of third argument `x4<f32>` to be a signed integer type
|
//~^ ERROR expected mask element type to be an integer, found `f32`
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
|
@ -43,10 +39,7 @@ fn main() {
|
||||||
simd_scatter(values, mask, mask);
|
simd_scatter(values, mask, mask);
|
||||||
//~^ ERROR expected element type `i32` of second argument `x4<i32>` to be a pointer to the element type `f32` of the first argument `x4<f32>`, found `i32` != `*mut f32`
|
//~^ ERROR expected element type `i32` of second argument `x4<i32>` to be a pointer to the element type `f32` of the first argument `x4<f32>`, found `i32` != `*mut f32`
|
||||||
|
|
||||||
simd_scatter(values, pointers, umask);
|
|
||||||
//~^ ERROR expected element type `u16` of third argument `x4<u16>` to be a signed integer type
|
|
||||||
|
|
||||||
simd_scatter(values, pointers, fmask);
|
simd_scatter(values, pointers, fmask);
|
||||||
//~^ ERROR expected element type `f32` of third argument `x4<f32>` to be a signed integer type
|
//~^ ERROR expected mask element type to be an integer, found `f32`
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,39 +1,27 @@
|
||||||
error[E0511]: invalid monomorphization of `simd_gather` intrinsic: expected element type `i32` of second argument `x4<i32>` to be a pointer to the element type `f32` of the first argument `x4<f32>`, found `i32` != `*_ f32`
|
error[E0511]: invalid monomorphization of `simd_gather` intrinsic: expected element type `i32` of second argument `x4<i32>` to be a pointer to the element type `f32` of the first argument `x4<f32>`, found `i32` != `*_ f32`
|
||||||
--> $DIR/generic-gather.rs:31:9
|
--> $DIR/generic-gather-scatter.rs:30:9
|
||||||
|
|
|
|
||||||
LL | simd_gather(default, mask, mask);
|
LL | simd_gather(default, mask, mask);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error[E0511]: invalid monomorphization of `simd_gather` intrinsic: expected element type `u16` of third argument `x4<u16>` to be a signed integer type
|
error[E0511]: invalid monomorphization of `simd_gather` intrinsic: expected mask element type to be an integer, found `f32`
|
||||||
--> $DIR/generic-gather.rs:34:9
|
--> $DIR/generic-gather-scatter.rs:33:9
|
||||||
|
|
|
||||||
LL | simd_gather(default, pointers, umask);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
error[E0511]: invalid monomorphization of `simd_gather` intrinsic: expected element type `f32` of third argument `x4<f32>` to be a signed integer type
|
|
||||||
--> $DIR/generic-gather.rs:37:9
|
|
||||||
|
|
|
|
||||||
LL | simd_gather(default, pointers, fmask);
|
LL | simd_gather(default, pointers, fmask);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error[E0511]: invalid monomorphization of `simd_scatter` intrinsic: expected element type `i32` of second argument `x4<i32>` to be a pointer to the element type `f32` of the first argument `x4<f32>`, found `i32` != `*mut f32`
|
error[E0511]: invalid monomorphization of `simd_scatter` intrinsic: expected element type `i32` of second argument `x4<i32>` to be a pointer to the element type `f32` of the first argument `x4<f32>`, found `i32` != `*mut f32`
|
||||||
--> $DIR/generic-gather.rs:43:9
|
--> $DIR/generic-gather-scatter.rs:39:9
|
||||||
|
|
|
|
||||||
LL | simd_scatter(values, mask, mask);
|
LL | simd_scatter(values, mask, mask);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error[E0511]: invalid monomorphization of `simd_scatter` intrinsic: expected element type `u16` of third argument `x4<u16>` to be a signed integer type
|
error[E0511]: invalid monomorphization of `simd_scatter` intrinsic: expected mask element type to be an integer, found `f32`
|
||||||
--> $DIR/generic-gather.rs:46:9
|
--> $DIR/generic-gather-scatter.rs:42:9
|
||||||
|
|
|
||||||
LL | simd_scatter(values, pointers, umask);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
error[E0511]: invalid monomorphization of `simd_scatter` intrinsic: expected element type `f32` of third argument `x4<f32>` to be a signed integer type
|
|
||||||
--> $DIR/generic-gather.rs:49:9
|
|
||||||
|
|
|
|
||||||
LL | simd_scatter(values, pointers, fmask);
|
LL | simd_scatter(values, pointers, fmask);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: aborting due to 6 previous errors
|
error: aborting due to 4 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0511`.
|
For more information about this error, try `rustc --explain E0511`.
|
|
@ -36,11 +36,8 @@ fn main() {
|
||||||
simd_select(m8, x, x);
|
simd_select(m8, x, x);
|
||||||
//~^ ERROR mismatched lengths: mask length `8` != other vector length `4`
|
//~^ ERROR mismatched lengths: mask length `8` != other vector length `4`
|
||||||
|
|
||||||
simd_select(x, x, x);
|
|
||||||
//~^ ERROR mask element type is `u32`, expected a signed integer type
|
|
||||||
|
|
||||||
simd_select(z, z, z);
|
simd_select(z, z, z);
|
||||||
//~^ ERROR mask element type is `f32`, expected a signed integer type
|
//~^ ERROR expected mask element type to be an integer, found `f32`
|
||||||
|
|
||||||
simd_select(m4, 0u32, 1u32);
|
simd_select(m4, 0u32, 1u32);
|
||||||
//~^ ERROR found non-SIMD `u32`
|
//~^ ERROR found non-SIMD `u32`
|
||||||
|
|
|
@ -4,52 +4,42 @@ error[E0511]: invalid monomorphization of `simd_select` intrinsic: mismatched le
|
||||||
LL | simd_select(m8, x, x);
|
LL | simd_select(m8, x, x);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error[E0511]: invalid monomorphization of `simd_select` intrinsic: found mask element type is `u32`, expected a signed integer type
|
error[E0511]: invalid monomorphization of `simd_select` intrinsic: expected mask element type to be an integer, found `f32`
|
||||||
--> $DIR/generic-select.rs:39:9
|
--> $DIR/generic-select.rs:39:9
|
||||||
|
|
|
|
||||||
LL | simd_select(x, x, x);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: the mask may be widened, which only has the correct behavior for signed integers
|
|
||||||
|
|
||||||
error[E0511]: invalid monomorphization of `simd_select` intrinsic: found mask element type is `f32`, expected a signed integer type
|
|
||||||
--> $DIR/generic-select.rs:42:9
|
|
||||||
|
|
|
||||||
LL | simd_select(z, z, z);
|
LL | simd_select(z, z, z);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
= note: the mask may be widened, which only has the correct behavior for signed integers
|
|
||||||
|
|
||||||
error[E0511]: invalid monomorphization of `simd_select` intrinsic: expected SIMD argument type, found non-SIMD `u32`
|
error[E0511]: invalid monomorphization of `simd_select` intrinsic: expected SIMD argument type, found non-SIMD `u32`
|
||||||
--> $DIR/generic-select.rs:45:9
|
--> $DIR/generic-select.rs:42:9
|
||||||
|
|
|
|
||||||
LL | simd_select(m4, 0u32, 1u32);
|
LL | simd_select(m4, 0u32, 1u32);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error[E0511]: invalid monomorphization of `simd_select_bitmask` intrinsic: invalid bitmask `u16`, expected `u8` or `[u8; 1]`
|
error[E0511]: invalid monomorphization of `simd_select_bitmask` intrinsic: invalid bitmask `u16`, expected `u8` or `[u8; 1]`
|
||||||
--> $DIR/generic-select.rs:48:9
|
--> $DIR/generic-select.rs:45:9
|
||||||
|
|
|
|
||||||
LL | simd_select_bitmask(0u16, x, x);
|
LL | simd_select_bitmask(0u16, x, x);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error[E0511]: invalid monomorphization of `simd_select_bitmask` intrinsic: expected SIMD argument type, found non-SIMD `u32`
|
error[E0511]: invalid monomorphization of `simd_select_bitmask` intrinsic: expected SIMD argument type, found non-SIMD `u32`
|
||||||
--> $DIR/generic-select.rs:51:9
|
--> $DIR/generic-select.rs:48:9
|
||||||
|
|
|
|
||||||
LL | simd_select_bitmask(0u8, 1u32, 2u32);
|
LL | simd_select_bitmask(0u8, 1u32, 2u32);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error[E0511]: invalid monomorphization of `simd_select_bitmask` intrinsic: invalid bitmask `f32`, expected `u8` or `[u8; 1]`
|
error[E0511]: invalid monomorphization of `simd_select_bitmask` intrinsic: invalid bitmask `f32`, expected `u8` or `[u8; 1]`
|
||||||
--> $DIR/generic-select.rs:54:9
|
--> $DIR/generic-select.rs:51:9
|
||||||
|
|
|
|
||||||
LL | simd_select_bitmask(0.0f32, x, x);
|
LL | simd_select_bitmask(0.0f32, x, x);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error[E0511]: invalid monomorphization of `simd_select_bitmask` intrinsic: invalid bitmask `&str`, expected `u8` or `[u8; 1]`
|
error[E0511]: invalid monomorphization of `simd_select_bitmask` intrinsic: invalid bitmask `&str`, expected `u8` or `[u8; 1]`
|
||||||
--> $DIR/generic-select.rs:57:9
|
--> $DIR/generic-select.rs:54:9
|
||||||
|
|
|
|
||||||
LL | simd_select_bitmask("x", x, x);
|
LL | simd_select_bitmask("x", x, x);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: aborting due to 8 previous errors
|
error: aborting due to 7 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0511`.
|
For more information about this error, try `rustc --explain E0511`.
|
||||||
|
|
|
@ -21,8 +21,8 @@ fn main() {
|
||||||
simd_masked_load(Simd::<i8, 4>([-1, 0, -1, -1]), arr.as_ptr(), Simd::<u32, 4>([9; 4]));
|
simd_masked_load(Simd::<i8, 4>([-1, 0, -1, -1]), arr.as_ptr(), Simd::<u32, 4>([9; 4]));
|
||||||
//~^ ERROR expected element type `u32` of second argument `*const u8` to be a pointer to the element type `u32` of the first argument `Simd<u32, 4>`, found `u32` != `*_ u32`
|
//~^ ERROR expected element type `u32` of second argument `*const u8` to be a pointer to the element type `u32` of the first argument `Simd<u32, 4>`, found `u32` != `*_ u32`
|
||||||
|
|
||||||
simd_masked_load(Simd::<u8, 4>([1, 0, 1, 1]), arr.as_ptr(), default);
|
simd_masked_load(Simd::<f32, 4>([1.0, 0.0, 1.0, 1.0]), arr.as_ptr(), default);
|
||||||
//~^ ERROR expected element type `u8` of third argument `Simd<u8, 4>` to be a signed integer type
|
//~^ ERROR expected mask element type to be an integer, found `f32`
|
||||||
|
|
||||||
simd_masked_store(Simd([-1i8; 4]), arr.as_ptr(), Simd([5u32; 4]));
|
simd_masked_store(Simd([-1i8; 4]), arr.as_ptr(), Simd([5u32; 4]));
|
||||||
//~^ ERROR expected element type `u32` of second argument `*const u8` to be a pointer to the element type `u32` of the first argument `Simd<u32, 4>`, found `u32` != `*mut u32`
|
//~^ ERROR expected element type `u32` of second argument `*const u8` to be a pointer to the element type `u32` of the first argument `Simd<u32, 4>`, found `u32` != `*mut u32`
|
||||||
|
@ -33,7 +33,7 @@ fn main() {
|
||||||
simd_masked_store(Simd([-1i8; 4]), arr.as_mut_ptr(), Simd([5u8; 2]));
|
simd_masked_store(Simd([-1i8; 4]), arr.as_mut_ptr(), Simd([5u8; 2]));
|
||||||
//~^ ERROR expected third argument with length 4 (same as input type `Simd<i8, 4>`), found `Simd<u8, 2>` with length 2
|
//~^ ERROR expected third argument with length 4 (same as input type `Simd<i8, 4>`), found `Simd<u8, 2>` with length 2
|
||||||
|
|
||||||
simd_masked_store(Simd([1u32; 4]), arr.as_mut_ptr(), Simd([5u8; 4]));
|
simd_masked_store(Simd([1f32; 4]), arr.as_mut_ptr(), Simd([5u8; 4]));
|
||||||
//~^ ERROR expected element type `u8` of third argument `Simd<u32, 4>` to be a signed integer type
|
//~^ ERROR expected mask element type to be an integer, found `f32`
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,11 +16,11 @@ error[E0511]: invalid monomorphization of `simd_masked_load` intrinsic: expected
|
||||||
LL | simd_masked_load(Simd::<i8, 4>([-1, 0, -1, -1]), arr.as_ptr(), Simd::<u32, 4>([9; 4]));
|
LL | simd_masked_load(Simd::<i8, 4>([-1, 0, -1, -1]), arr.as_ptr(), Simd::<u32, 4>([9; 4]));
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error[E0511]: invalid monomorphization of `simd_masked_load` intrinsic: expected element type `u8` of third argument `Simd<u8, 4>` to be a signed integer type
|
error[E0511]: invalid monomorphization of `simd_masked_load` intrinsic: expected mask element type to be an integer, found `f32`
|
||||||
--> $DIR/masked-load-store-build-fail.rs:24:9
|
--> $DIR/masked-load-store-build-fail.rs:24:9
|
||||||
|
|
|
|
||||||
LL | simd_masked_load(Simd::<u8, 4>([1, 0, 1, 1]), arr.as_ptr(), default);
|
LL | simd_masked_load(Simd::<f32, 4>([1.0, 0.0, 1.0, 1.0]), arr.as_ptr(), default);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error[E0511]: invalid monomorphization of `simd_masked_store` intrinsic: expected element type `u32` of second argument `*const u8` to be a pointer to the element type `u32` of the first argument `Simd<u32, 4>`, found `u32` != `*mut u32`
|
error[E0511]: invalid monomorphization of `simd_masked_store` intrinsic: expected element type `u32` of second argument `*const u8` to be a pointer to the element type `u32` of the first argument `Simd<u32, 4>`, found `u32` != `*mut u32`
|
||||||
--> $DIR/masked-load-store-build-fail.rs:27:9
|
--> $DIR/masked-load-store-build-fail.rs:27:9
|
||||||
|
@ -40,10 +40,10 @@ error[E0511]: invalid monomorphization of `simd_masked_store` intrinsic: expecte
|
||||||
LL | simd_masked_store(Simd([-1i8; 4]), arr.as_mut_ptr(), Simd([5u8; 2]));
|
LL | simd_masked_store(Simd([-1i8; 4]), arr.as_mut_ptr(), Simd([5u8; 2]));
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error[E0511]: invalid monomorphization of `simd_masked_store` intrinsic: expected element type `u8` of third argument `Simd<u32, 4>` to be a signed integer type
|
error[E0511]: invalid monomorphization of `simd_masked_store` intrinsic: expected mask element type to be an integer, found `f32`
|
||||||
--> $DIR/masked-load-store-build-fail.rs:36:9
|
--> $DIR/masked-load-store-build-fail.rs:36:9
|
||||||
|
|
|
|
||||||
LL | simd_masked_store(Simd([1u32; 4]), arr.as_mut_ptr(), Simd([5u8; 4]));
|
LL | simd_masked_store(Simd([1f32; 4]), arr.as_mut_ptr(), Simd([5u8; 4]));
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: aborting due to 8 previous errors
|
error: aborting due to 8 previous errors
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue