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/mbrtoc32.cpp b/libc/bionic/mbrtoc32.cpp
index 644e542..21603a1 100644
--- a/libc/bionic/mbrtoc32.cpp
+++ b/libc/bionic/mbrtoc32.cpp
@@ -55,7 +55,7 @@
}
uint8_t ch;
- if (mbsinit(state) && (((ch = static_cast<uint8_t>(*s)) & ~0x7f) == 0)) {
+ if (mbstate_is_initial(state) && (((ch = static_cast<uint8_t>(*s)) & ~0x7f) == 0)) {
// Fast path for plain ASCII characters.
if (pc32 != nullptr) {
*pc32 = ch;
@@ -105,7 +105,7 @@
size_t bytes_wanted = length - bytes_so_far;
size_t i;
for (i = 0; i < MIN(bytes_wanted, n); i++) {
- if (!mbsinit(state) && ((*s & 0xc0) != 0x80)) {
+ if (!mbstate_is_initial(state) && ((*s & 0xc0) != 0x80)) {
// Malformed input; bad characters in the middle of a character.
return mbstate_reset_and_return_illegal(EILSEQ, state);
}