rollup merge of #20079: SimonSapin/string_push_ascii_fast_path
rollup merge of #20079: SimonSapin/string_push_ascii_fast_path

`String::push(&mut self, ch: char)` currently has a single code path that calls `Char::encode_utf8`. This adds a fast path for ASCII `char`s, which are represented as a single byte in UTF-8.

Benchmarks of stage1 libcollections at the intermediate commit show that the fast path very significantly improves the performance of repeatedly pushing an ASCII `char`, but does not significantly affect the performance for a non-ASCII `char` (where the fast path is not taken).

```
bench_push_char_one_byte                  59552 ns/iter (+/- 2132) = 167 MB/s
bench_push_char_one_byte_with_fast_path    6563 ns/iter (+/- 658) = 1523 MB/s
bench_push_char_two_bytes                 71520 ns/iter (+/- 3541) = 279 MB/s
bench_push_char_two_bytes_with_slow_path  71452 ns/iter (+/- 4202) = 279 MB/s
bench_push_str_one_byte                   38910 ns/iter (+/- 2477) = 257 MB/s
```

A benchmark of pushing a one-byte-long `&str` is added for comparison, but its performance [has varied a lot lately](https://github.com/rust-lang/rust/pull/19640#issuecomment-67741561). (When the input is fixed, `s.push_str("x")` could be used just as well as `s.push('x')`.)

defuz/rust,pshc/rust,gifnksm/rust,AerialX/rust,nwin/rust,l0kod/rust,GBGamer/rust,zachwick/rust,krzysz00/rust,andars/rust,untitaker/rust,GBGamer/rust,kimroen/rust,dwillmer/rust,pshc/rust,jashank/rust,jashank/rust,rohitjoshi/rust,krzysz00/rust,XMPPwocky/rust,AerialX/rust,zaeleus/rust,dwillmer/rust,kimroen/rust,XMPPwocky/rust,bombless/rust,hauleth/rust,richo/rust,dinfuehr/rust,andars/rust,hauleth/rust,krzysz00/rust,ktossell/rust,untitaker/rust,aidancully/rust,cllns/rust,jashank/rust,AerialX/rust-rt-minimal,avdi/rust,pshc/rust,l0kod/rust,krzysz00/rust,zaeleus/rust,andars/rust,AerialX/rust-rt-minimal,omasanori/rust,philyoon/rust,robertg/rust,carols10cents/rust,robertg/rust,sae-bom/rust,ruud-v-a/rust,nwin/rust,pshc/rust,pelmers/rust,vhbit/rust,mahkoh/rust,untitaker/rust,ejjeong/rust,ruud-v-a/rust,kwantam/rust,vhbit/rust,zubron/rust,rohitjoshi/rust,TheNeikos/rust,mihneadb/rust,rohitjoshi/rust,philyoon/rust,mdinger/rust,cllns/rust,l0kod/rust,jashank/rust,GBGamer/rust,jroesch/rust,jroesch/rust,carols10cents/rust,pelmers/rust,graydon/rust,AerialX/rust-rt-minimal,jashank/rust,untitaker/rust,GBGamer/rust,vhbit/rust,AerialX/rust,bombless/rust-docs-chinese,kimroen/rust,zachwick/rust,cllns/rust,ruud-v-a/rust,defuz/rust,ebfull/rust,aneeshusa/rust,richo/rust,philyoon/rust,mvdnes/rust,reem/rust,cllns/rust,mahkoh/rust,rprichard/rust,zubron/rust,mahkoh/rust,kwantam/rust,zaeleus/rust,pshc/rust,miniupnp/rust,jroesch/rust,ktossell/rust,XMPPwocky/rust,omasanori/rust,zubron/rust,dwillmer/rust,mihneadb/rust,bombless/rust,mihneadb/rust,TheNeikos/rust,mvdnes/rust,zaeleus/rust,carols10cents/rust,carols10cents/rust,ejjeong/rust,kimroen/rust,ruud-v-a/rust,pelmers/rust,KokaKiwi/rust,mvdnes/rust,pshc/rust,miniupnp/rust,AerialX/rust,graydon/rust,ktossell/rust,XMPPwocky/rust,bombless/rust,dinfuehr/rust,ebfull/rust,jroesch/rust,l0kod/rust,victorvde/rust,TheNeikos/rust,bombless/rust,KokaKiwi/rust,kwantam/rust,rohitjoshi/rust,dwillmer/rust,mvdnes/rust,reem/rust,ebfull/rust,robertg/rust,ejjeong/rust,ruud-v-a/rust,richo/rust,KokaKiwi/rust,mdinger/rust,ktossell/rust,sae-bom/rust,AerialX/rust-rt-minimal,reem/rust,rprichard/rust,mahkoh/rust,AerialX/rust-rt-minimal,victorvde/rust,andars/rust,zubron/rust,nwin/rust,dwillmer/rust,vhbit/rust,KokaKiwi/rust,mdinger/rust,mihneadb/rust,aepsil0n/rust,untitaker/rust,graydon/rust,sae-bom/rust,kwantam/rust,l0kod/rust,ejjeong/rust,dinfuehr/rust,aepsil0n/rust,andars/rust,jroesch/rust,victorvde/rust,zubron/rust,avdi/rust,untitaker/rust,pelmers/rust,dinfuehr/rust,ruud-v-a/rust,l0kod/rust,gifnksm/rust,miniupnp/rust,nwin/rust,nwin/rust,ebfull/rust,kwantam/rust,rprichard/rust,seanrivera/rust,seanrivera/rust,rprichard/rust,omasanori/rust,omasanori/rust,omasanori/rust,pelmers/rust,miniupnp/rust,aidancully/rust,kimroen/rust,ktossell/rust,gifnksm/rust,KokaKiwi/rust,jashank/rust,GBGamer/rust,ejjeong/rust,gifnksm/rust,dinfuehr/rust,zaeleus/rust,dwillmer/rust,reem/rust,carols10cents/rust,nwin/rust,mihneadb/rust,KokaKiwi/rust,jroesch/rust,gifnksm/rust,dwillmer/rust,rprichard/rust,GBGamer/rust,ktossell/rust,bombless/rust,pshc/rust,seanrivera/rust,miniupnp/rust,jroesch/rust,ktossell/rust,zachwick/rust,defuz/rust,dinfuehr/rust,kimroen/rust,defuz/rust,GBGamer/rust,jashank/rust,kwantam/rust,aidancully/rust,mihneadb/rust,victorvde/rust,mvdnes/rust,philyoon/rust,TheNeikos/rust,aidancully/rust,l0kod/rust,l0kod/rust,vhbit/rust,zubron/rust,nwin/rust,graydon/rust,aneeshusa/rust,reem/rust,mvdnes/rust,graydon/rust,philyoon/rust,aidancully/rust,seanrivera/rust,aneeshusa/rust,mdinger/rust,aepsil0n/rust,aepsil0n/rust,AerialX/rust,robertg/rust,zubron/rust,miniupnp/rust,bombless/rust,seanrivera/rust,robertg/rust,richo/rust,zaeleus/rust,AerialX/rust-rt-minimal,rohitjoshi/rust,rprichard/rust,cllns/rust,seanrivera/rust,philyoon/rust,zubron/rust,GBGamer/rust,dwillmer/rust,richo/rust,jroesch/rust,avdi/rust,avdi/rust,ejjeong/rust,avdi/rust,XMPPwocky/rust,mdinger/rust,jashank/rust,miniupnp/rust,mahkoh/rust,robertg/rust,mdinger/rust,aepsil0n/rust,victorvde/rust,zachwick/rust,AerialX/rust,TheNeikos/rust,defuz/rust,mahkoh/rust,sae-bom/rust,richo/rust,hauleth/rust,cllns/rust,pelmers/rust,hauleth/rust,sae-bom/rust,aepsil0n/rust,gifnksm/rust,aidancully/rust,zachwick/rust,miniupnp/rust,aneeshusa/rust,avdi/rust,hauleth/rust,zachwick/rust,vhbit/rust,aneeshusa/rust,nwin/rust,sae-bom/rust,vhbit/rust,vhbit/rust,TheNeikos/rust,krzysz00/rust,ebfull/rust,graydon/rust,hauleth/rust,XMPPwocky/rust,aneeshusa/rust,kimroen/rust,ebfull/rust,carols10cents/rust,victorvde/rust,omasanori/rust,krzysz00/rust,reem/rust,pshc/rust,rohitjoshi/rust,defuz/rust,andars/rust