diff options
| author | Guillaume Gomez <guillaume1.gomez@gmail.com> | 2021-02-17 20:37:55 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-02-17 20:37:55 +0100 |
| commit | 253631d73fdb310a437edff1134caee904e28b94 (patch) | |
| tree | 3d409191546f08dc3bc596c7c158c3cb59fe3598 /library/std/src/sys/unix/stack_overflow.rs | |
| parent | ec007845cfe6a3c54aa44468df9ff2be05fe25b8 (diff) | |
| parent | d2ba68b24eba7e763b5e0937ab1ef6dcb5a09ca3 (diff) | |
| download | rust-253631d73fdb310a437edff1134caee904e28b94.tar.gz rust-253631d73fdb310a437edff1134caee904e28b94.zip | |
Rollup merge of #82094 - gilescope:to_digit_speedup2, r=m-ou-se
To digit simplification
I found out the other day that all the ascii digits have the first four bits as one would hope them to. (Eg. char `2` ends `0b0010`). There are two bits to indicate it's in the digit range ( `0b0011_0000`). If it is a true digit then all the higher bits aside from these two will be 0 (as ascii is the lowest part of the unicode u32 spectrum). So XORing with `0b11_0000` should mean we either get the number 0-9 or alternativly we get a larger number in the u32 space. If we get something that's not 0-9 then it will be discarded as it will be greater than the radix.
The code seems so fast though that there's quite a lot of noise in the benchmarks so it's not that easy to prove conclusively that it's faster as well as less instructions.
The non-fast path I was toying with as well wondering if we could do this as then we'd only have one return and less instructions still:
```
match self {
'a'..='z' => self as u32 - 'a' as u32 + 10,
'A'..='Z' => self as u32 - 'A' as u32 + 10,
_ => { radix = 10; self as u32 ^ ASCII_DIGIT_MASK},
}
```
Here's the [godbolt](https://godbolt.org/z/883c9n).
( H/T to ``@byteshadow`` for pointing out xor was what I needed)
Diffstat (limited to 'library/std/src/sys/unix/stack_overflow.rs')
0 files changed, 0 insertions, 0 deletions
