mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 23:04:33 +00:00
Merge simd size and type extraction into checking whether a type is simd, as these always go together.
This commit is contained in:
parent
9a49ef38c7
commit
f8372df631
@ -935,9 +935,10 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! require_simd {
|
macro_rules! require_simd {
|
||||||
($ty: expr, $variant:ident) => {
|
($ty: expr, $variant:ident) => {{
|
||||||
require!($ty.is_simd(), InvalidMonomorphization::$variant { span, name, ty: $ty })
|
require!($ty.is_simd(), InvalidMonomorphization::$variant { span, name, ty: $ty });
|
||||||
};
|
$ty.simd_size_and_type(bx.tcx())
|
||||||
|
}};
|
||||||
}
|
}
|
||||||
|
|
||||||
let tcx = bx.tcx();
|
let tcx = bx.tcx();
|
||||||
@ -946,9 +947,7 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
|
|||||||
let arg_tys = sig.inputs();
|
let arg_tys = sig.inputs();
|
||||||
|
|
||||||
if name == sym::simd_select_bitmask {
|
if name == sym::simd_select_bitmask {
|
||||||
require_simd!(arg_tys[1], SimdArgument);
|
let (len, _) = require_simd!(arg_tys[1], SimdArgument);
|
||||||
|
|
||||||
let (len, _) = arg_tys[1].simd_size_and_type(bx.tcx());
|
|
||||||
|
|
||||||
let expected_int_bits = (len.max(8) - 1).next_power_of_two();
|
let expected_int_bits = (len.max(8) - 1).next_power_of_two();
|
||||||
let expected_bytes = len / 8 + ((len % 8 > 0) as u64);
|
let expected_bytes = len / 8 + ((len % 8 > 0) as u64);
|
||||||
@ -985,7 +984,7 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// every intrinsic below takes a SIMD vector as its first argument
|
// every intrinsic below takes a SIMD vector as its first argument
|
||||||
require_simd!(arg_tys[0], SimdInput);
|
let (in_len, in_elem) = require_simd!(arg_tys[0], SimdInput);
|
||||||
let in_ty = arg_tys[0];
|
let in_ty = arg_tys[0];
|
||||||
|
|
||||||
let comparison = match name {
|
let comparison = match name {
|
||||||
@ -998,11 +997,8 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
|
|||||||
_ => None,
|
_ => None,
|
||||||
};
|
};
|
||||||
|
|
||||||
let (in_len, in_elem) = arg_tys[0].simd_size_and_type(bx.tcx());
|
|
||||||
if let Some(cmp_op) = comparison {
|
if let Some(cmp_op) = comparison {
|
||||||
require_simd!(ret_ty, SimdReturn);
|
let (out_len, out_ty) = require_simd!(ret_ty, SimdReturn);
|
||||||
|
|
||||||
let (out_len, out_ty) = ret_ty.simd_size_and_type(bx.tcx());
|
|
||||||
|
|
||||||
require!(
|
require!(
|
||||||
in_len == out_len,
|
in_len == out_len,
|
||||||
@ -1038,8 +1034,7 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
|
|||||||
.unwrap_branch();
|
.unwrap_branch();
|
||||||
let n = idx.len() as u64;
|
let n = idx.len() as u64;
|
||||||
|
|
||||||
require_simd!(ret_ty, SimdReturn);
|
let (out_len, out_ty) = require_simd!(ret_ty, SimdReturn);
|
||||||
let (out_len, out_ty) = ret_ty.simd_size_and_type(bx.tcx());
|
|
||||||
require!(
|
require!(
|
||||||
out_len == n,
|
out_len == n,
|
||||||
InvalidMonomorphization::ReturnLength { span, name, in_len: n, ret_ty, out_len }
|
InvalidMonomorphization::ReturnLength { span, name, in_len: n, ret_ty, out_len }
|
||||||
@ -1096,8 +1091,7 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
|
|||||||
}),
|
}),
|
||||||
};
|
};
|
||||||
|
|
||||||
require_simd!(ret_ty, SimdReturn);
|
let (out_len, out_ty) = require_simd!(ret_ty, SimdReturn);
|
||||||
let (out_len, out_ty) = ret_ty.simd_size_and_type(bx.tcx());
|
|
||||||
require!(
|
require!(
|
||||||
out_len == n,
|
out_len == n,
|
||||||
InvalidMonomorphization::ReturnLength { span, name, in_len: n, ret_ty, out_len }
|
InvalidMonomorphization::ReturnLength { span, name, in_len: n, ret_ty, out_len }
|
||||||
@ -1176,8 +1170,7 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
|
|||||||
if name == sym::simd_select {
|
if name == sym::simd_select {
|
||||||
let m_elem_ty = in_elem;
|
let m_elem_ty = in_elem;
|
||||||
let m_len = in_len;
|
let m_len = in_len;
|
||||||
require_simd!(arg_tys[1], SimdArgument);
|
let (v_len, _) = require_simd!(arg_tys[1], SimdArgument);
|
||||||
let (v_len, _) = arg_tys[1].simd_size_and_type(bx.tcx());
|
|
||||||
require!(
|
require!(
|
||||||
m_len == v_len,
|
m_len == v_len,
|
||||||
InvalidMonomorphization::MismatchedLengths { span, name, m_len, v_len }
|
InvalidMonomorphization::MismatchedLengths { span, name, m_len, v_len }
|
||||||
@ -1395,14 +1388,16 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
|
|||||||
// * M: any integer width is supported, will be truncated to i1
|
// * M: any integer width is supported, will be truncated to i1
|
||||||
|
|
||||||
// All types must be simd vector types
|
// All types must be simd vector types
|
||||||
require_simd!(in_ty, SimdFirst);
|
|
||||||
require_simd!(arg_tys[1], SimdSecond);
|
// The second argument must be a simd vector with an element type that's a pointer
|
||||||
require_simd!(arg_tys[2], SimdThird);
|
// to the element type of the first argument
|
||||||
|
let (_, element_ty0) = require_simd!(in_ty, SimdFirst);
|
||||||
|
let (out_len, element_ty1) = require_simd!(arg_tys[1], SimdSecond);
|
||||||
|
// The element type of the third argument must be a signed integer type of any width:
|
||||||
|
let (out_len2, element_ty2) = require_simd!(arg_tys[2], SimdThird);
|
||||||
require_simd!(ret_ty, SimdReturn);
|
require_simd!(ret_ty, SimdReturn);
|
||||||
|
|
||||||
// Of the same length:
|
// Of the same length:
|
||||||
let (out_len, _) = arg_tys[1].simd_size_and_type(bx.tcx());
|
|
||||||
let (out_len2, _) = arg_tys[2].simd_size_and_type(bx.tcx());
|
|
||||||
require!(
|
require!(
|
||||||
in_len == out_len,
|
in_len == out_len,
|
||||||
InvalidMonomorphization::SecondArgumentLength {
|
InvalidMonomorphization::SecondArgumentLength {
|
||||||
@ -1432,11 +1427,6 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
|
|||||||
InvalidMonomorphization::ExpectedReturnType { span, name, in_ty, ret_ty }
|
InvalidMonomorphization::ExpectedReturnType { span, name, in_ty, ret_ty }
|
||||||
);
|
);
|
||||||
|
|
||||||
// The second argument must be a simd vector with an element type that's a pointer
|
|
||||||
// to the element type of the first argument
|
|
||||||
let (_, element_ty0) = arg_tys[0].simd_size_and_type(bx.tcx());
|
|
||||||
let (_, element_ty1) = arg_tys[1].simd_size_and_type(bx.tcx());
|
|
||||||
|
|
||||||
require!(
|
require!(
|
||||||
matches!(
|
matches!(
|
||||||
element_ty1.kind(),
|
element_ty1.kind(),
|
||||||
@ -1453,8 +1443,6 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
// The element type of the third argument must be a signed integer type of any width:
|
|
||||||
let (_, element_ty2) = arg_tys[2].simd_size_and_type(bx.tcx());
|
|
||||||
match element_ty2.kind() {
|
match element_ty2.kind() {
|
||||||
ty::Int(_) => (),
|
ty::Int(_) => (),
|
||||||
_ => {
|
_ => {
|
||||||
@ -1512,13 +1500,13 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
|
|||||||
// * M: any integer width is supported, will be truncated to i1
|
// * M: any integer width is supported, will be truncated to i1
|
||||||
|
|
||||||
// All types must be simd vector types
|
// All types must be simd vector types
|
||||||
require_simd!(in_ty, SimdFirst);
|
// The second argument must be a simd vector with an element type that's a pointer
|
||||||
require_simd!(arg_tys[1], SimdSecond);
|
// to the element type of the first argument
|
||||||
require_simd!(arg_tys[2], SimdThird);
|
let (_, element_ty0) = require_simd!(in_ty, SimdFirst);
|
||||||
|
let (element_len1, element_ty1) = require_simd!(arg_tys[1], SimdSecond);
|
||||||
|
let (element_len2, element_ty2) = require_simd!(arg_tys[2], SimdThird);
|
||||||
|
|
||||||
// Of the same length:
|
// Of the same length:
|
||||||
let (element_len1, _) = arg_tys[1].simd_size_and_type(bx.tcx());
|
|
||||||
let (element_len2, _) = arg_tys[2].simd_size_and_type(bx.tcx());
|
|
||||||
require!(
|
require!(
|
||||||
in_len == element_len1,
|
in_len == element_len1,
|
||||||
InvalidMonomorphization::SecondArgumentLength {
|
InvalidMonomorphization::SecondArgumentLength {
|
||||||
@ -1542,12 +1530,6 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
// The second argument must be a simd vector with an element type that's a pointer
|
|
||||||
// to the element type of the first argument
|
|
||||||
let (_, element_ty0) = arg_tys[0].simd_size_and_type(bx.tcx());
|
|
||||||
let (_, element_ty1) = arg_tys[1].simd_size_and_type(bx.tcx());
|
|
||||||
let (_, element_ty2) = arg_tys[2].simd_size_and_type(bx.tcx());
|
|
||||||
|
|
||||||
require!(
|
require!(
|
||||||
matches!(
|
matches!(
|
||||||
element_ty1.kind(),
|
element_ty1.kind(),
|
||||||
@ -1770,8 +1752,7 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
|
|||||||
bitwise_red!(simd_reduce_any: vector_reduce_or, true);
|
bitwise_red!(simd_reduce_any: vector_reduce_or, true);
|
||||||
|
|
||||||
if name == sym::simd_cast_ptr {
|
if name == sym::simd_cast_ptr {
|
||||||
require_simd!(ret_ty, SimdReturn);
|
let (out_len, out_elem) = require_simd!(ret_ty, SimdReturn);
|
||||||
let (out_len, out_elem) = ret_ty.simd_size_and_type(bx.tcx());
|
|
||||||
require!(
|
require!(
|
||||||
in_len == out_len,
|
in_len == out_len,
|
||||||
InvalidMonomorphization::ReturnLengthInputType {
|
InvalidMonomorphization::ReturnLengthInputType {
|
||||||
@ -1819,8 +1800,7 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if name == sym::simd_expose_addr {
|
if name == sym::simd_expose_addr {
|
||||||
require_simd!(ret_ty, SimdReturn);
|
let (out_len, out_elem) = require_simd!(ret_ty, SimdReturn);
|
||||||
let (out_len, out_elem) = ret_ty.simd_size_and_type(bx.tcx());
|
|
||||||
require!(
|
require!(
|
||||||
in_len == out_len,
|
in_len == out_len,
|
||||||
InvalidMonomorphization::ReturnLengthInputType {
|
InvalidMonomorphization::ReturnLengthInputType {
|
||||||
@ -1848,8 +1828,7 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if name == sym::simd_from_exposed_addr {
|
if name == sym::simd_from_exposed_addr {
|
||||||
require_simd!(ret_ty, SimdReturn);
|
let (out_len, out_elem) = require_simd!(ret_ty, SimdReturn);
|
||||||
let (out_len, out_elem) = ret_ty.simd_size_and_type(bx.tcx());
|
|
||||||
require!(
|
require!(
|
||||||
in_len == out_len,
|
in_len == out_len,
|
||||||
InvalidMonomorphization::ReturnLengthInputType {
|
InvalidMonomorphization::ReturnLengthInputType {
|
||||||
@ -1877,8 +1856,7 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if name == sym::simd_cast || name == sym::simd_as {
|
if name == sym::simd_cast || name == sym::simd_as {
|
||||||
require_simd!(ret_ty, SimdReturn);
|
let (out_len, out_elem) = require_simd!(ret_ty, SimdReturn);
|
||||||
let (out_len, out_elem) = ret_ty.simd_size_and_type(bx.tcx());
|
|
||||||
require!(
|
require!(
|
||||||
in_len == out_len,
|
in_len == out_len,
|
||||||
InvalidMonomorphization::ReturnLengthInputType {
|
InvalidMonomorphization::ReturnLengthInputType {
|
||||||
|
Loading…
Reference in New Issue
Block a user