1
Fork 0

Rollup merge of #49466 - glandium:master, r=rkruppe

Use f{32,64}::to_bits for is_zero test in vec::SpecFromElem

vec::SpecFromElem provides an optimization to use calloc to fill a Vec
when the element given to fill the Vec is represented by 0.

For floats, the test for that currently used is `x == 0. &&
x.is_sign_positive()`. When compiled in a standalone function, rustc
generates the following assembly:

```
  xorps xmm1, xmm1
  ucomisd xmm0, xmm1
  setnp al
  sete cl
  and cl, al
  movq rax, xmm0
  test rax, rax
  setns al
  and al, cl
  ret
```

A simpler test telling us whether the value is represented by 0, is
`x.to_bits() == 0`, which rustc compiles to:

```
  movq rax, xmm0
  test rax, rax
  sete al
  ret
```

Not that the test is hot in any way, but it also makes it clearer what
the intent in the rust code is.
This commit is contained in:
kennytm 2018-03-30 01:31:16 +02:00 committed by GitHub
commit 361ddfeb13
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1599,8 +1599,8 @@ impl_spec_from_elem!(u64, |x| x == 0);
impl_spec_from_elem!(u128, |x| x == 0); impl_spec_from_elem!(u128, |x| x == 0);
impl_spec_from_elem!(usize, |x| x == 0); impl_spec_from_elem!(usize, |x| x == 0);
impl_spec_from_elem!(f32, |x: f32| x == 0. && x.is_sign_positive()); impl_spec_from_elem!(f32, |x: f32| x.to_bits() == 0);
impl_spec_from_elem!(f64, |x: f64| x == 0. && x.is_sign_positive()); impl_spec_from_elem!(f64, |x: f64| x.to_bits() == 0);
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Common trait implementations for Vec // Common trait implementations for Vec