Rollup merge of #142078 - sayantn:more-intrinsics, r=workingjubilee
Add SIMD funnel shift and round-to-even intrinsics
This PR adds 3 new SIMD intrinsics
- `simd_funnel_shl` - funnel shift left
- `simd_funnel_shr` - funnel shift right
- `simd_round_ties_even` (vector version of `round_ties_even_fN`)
TODO (future PR): implement `simd_fsh{l,r}` in miri, cg_gcc and cg_clif (it is surprisingly hard to implement without branches, the common tricks that rotate uses doesn't work because we have 2 elements now. e.g, the `-n&31` trick used by cg_gcc to implement rotate doesn't work with this because then `fshl(a, b, 0)` will be `a | b`)
[#t-compiler > More SIMD intrinsics](https://rust-lang.zulipchat.com/#narrow/channel/131828-t-compiler/topic/More.20SIMD.20intrinsics/with/522130286)
`@rustbot` label T-compiler T-libs A-intrinsics F-core_intrinsics
r? `@workingjubilee`
This commit is contained in:
commit
66ad1f2abf
12 changed files with 217 additions and 28 deletions
|
|
@ -36,6 +36,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
|
|||
| "ceil"
|
||||
| "floor"
|
||||
| "round"
|
||||
| "round_ties_even"
|
||||
| "trunc"
|
||||
| "fsqrt"
|
||||
| "fsin"
|
||||
|
|
@ -71,6 +72,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
|
|||
"ceil" => Op::Round(rustc_apfloat::Round::TowardPositive),
|
||||
"floor" => Op::Round(rustc_apfloat::Round::TowardNegative),
|
||||
"round" => Op::Round(rustc_apfloat::Round::NearestTiesToAway),
|
||||
"round_ties_even" => Op::Round(rustc_apfloat::Round::NearestTiesToEven),
|
||||
"trunc" => Op::Round(rustc_apfloat::Round::TowardZero),
|
||||
"ctlz" => Op::Numeric(sym::ctlz),
|
||||
"ctpop" => Op::Numeric(sym::ctpop),
|
||||
|
|
|
|||
|
|
@ -569,6 +569,10 @@ fn simd_round() {
|
|||
f32x4::from_array([0.9, 1.001, 2.0, -4.5]).round(),
|
||||
f32x4::from_array([1.0, 1.0, 2.0, -5.0])
|
||||
);
|
||||
assert_eq!(
|
||||
unsafe { intrinsics::simd_round_ties_even(f32x4::from_array([0.9, 1.001, 2.0, -4.5])) },
|
||||
f32x4::from_array([1.0, 1.0, 2.0, -4.0])
|
||||
);
|
||||
assert_eq!(
|
||||
f32x4::from_array([0.9, 1.001, 2.0, -4.5]).trunc(),
|
||||
f32x4::from_array([0.0, 1.0, 2.0, -4.0])
|
||||
|
|
@ -586,6 +590,10 @@ fn simd_round() {
|
|||
f64x4::from_array([0.9, 1.001, 2.0, -4.5]).round(),
|
||||
f64x4::from_array([1.0, 1.0, 2.0, -5.0])
|
||||
);
|
||||
assert_eq!(
|
||||
unsafe { intrinsics::simd_round_ties_even(f64x4::from_array([0.9, 1.001, 2.0, -4.5])) },
|
||||
f64x4::from_array([1.0, 1.0, 2.0, -4.0])
|
||||
);
|
||||
assert_eq!(
|
||||
f64x4::from_array([0.9, 1.001, 2.0, -4.5]).trunc(),
|
||||
f64x4::from_array([0.0, 1.0, 2.0, -4.0])
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue