Optimize the mbs fast path slightly.
From a logcat profile:
```
|--95.06%-- convertPrintable(char*, char const*, unsigned long)
| |--13.95%-- [hit in function]
| |
| |--35.96%-- mbrtoc32
| | |--82.72%-- [hit in function]
| | |
| | |--11.07%-- mbsinit
| | |
| | |--5.96%-- @plt
```
I think we'd assumed that mbsinit() would be inlined, but since these
functions aren't all in wchar.cpp it wasn't being. This change moves the
implementation into a (more clearly named) inline function so we can
trivially reclaim that 11%+6%.
Benchmarks before:
```
-------------------------------------------------------------------
Benchmark Time CPU Iterations
-------------------------------------------------------------------
BM_stdlib_mbrtowc_1 8.03 ns 7.95 ns 87144997
BM_stdlib_mbrtowc_2 22.0 ns 21.8 ns 32002437
BM_stdlib_mbrtowc_3 30.0 ns 29.7 ns 23517699
BM_stdlib_mbrtowc_4 37.4 ns 37.1 ns 18895204
BM_stdlib_mbstowcs_ascii 792373 ns 782484 ns 890 bytes_per_second=609.389M/s
BM_stdlib_mbstowcs_wide 15836785 ns 15678316 ns 44 bytes_per_second=30.4138M/s
```
Benchmarks after:
```
-------------------------------------------------------------------
Benchmark Time CPU Iterations
-------------------------------------------------------------------
BM_stdlib_mbrtowc_1 5.76 ns 5.72 ns 121863813
BM_stdlib_mbrtowc_2 17.1 ns 16.9 ns 41487260
BM_stdlib_mbrtowc_3 24.2 ns 24.0 ns 29141629
BM_stdlib_mbrtowc_4 30.3 ns 30.1 ns 23229291
BM_stdlib_mbstowcs_ascii 783506 ns 775389 ns 903 bytes_per_second=614.965M/s
BM_stdlib_mbstowcs_wide 12787003 ns 12672642 ns 55 bytes_per_second=37.6273M/s
```
Bug: http://b/206523398
Test: treehugger
Change-Id: If8c6c39880096ddd2cbd323c68dca82e9849ace6
diff --git a/libc/bionic/wchar.cpp b/libc/bionic/wchar.cpp
index dabe824..bd9a45e 100644
--- a/libc/bionic/wchar.cpp
+++ b/libc/bionic/wchar.cpp
@@ -54,7 +54,7 @@
//
int mbsinit(const mbstate_t* ps) {
- return (ps == nullptr || (*(reinterpret_cast<const uint32_t*>(ps->__seq)) == 0));
+ return ps == nullptr || mbstate_is_initial(ps);
}
size_t mbrtowc(wchar_t* pwc, const char* s, size_t n, mbstate_t* ps) {
@@ -148,7 +148,7 @@
static mbstate_t __private_state;
mbstate_t* state = (ps == nullptr) ? &__private_state : ps;
- if (!mbsinit(state)) {
+ if (!mbstate_is_initial(state)) {
return mbstate_reset_and_return_illegal(EILSEQ, state);
}