Musl uses hard-coded logic for iconv. This patch moves the logic out of C code, and implement a virtual machine for dynamically loading charsets at runtime and do conversion.
79 lines
1018 B
ArmAsm
79 lines
1018 B
ArmAsm
place64 @sicv_magic_v1
|
|
place64 utf8_boundary, utf8_boundary
|
|
|
|
utf8_boundary:
|
|
input8 &r0
|
|
load64 _0x80, &r1
|
|
lt &r0, &r1, &r2
|
|
eq &r2, &r255, &r2
|
|
jnz &r2, Lmultibyte
|
|
output8 &r0
|
|
ret &r255
|
|
|
|
Lmultibyte:
|
|
load64 _0xC0, &r1
|
|
load64 _0xFD, &r2
|
|
lt &r0, &r1, &r1
|
|
mt &r0, &r2, &r2
|
|
or &r1, &r2, &r1
|
|
eq &r1, &r255, &r1
|
|
jnz &r1, Lvalid_multibyte
|
|
load64 ERROR, &r1
|
|
ret &r1
|
|
|
|
Lvalid_multibyte:
|
|
output8 &r0
|
|
load64 _0xE0, &r1
|
|
lt &r0, &r1, &r1
|
|
eq &r1, &r255, &r1
|
|
input8 &r3
|
|
output8 &r3
|
|
jnz &r1, L3b
|
|
L2b:
|
|
ret &r255
|
|
L3b:
|
|
input8 &r3
|
|
output8 &r3
|
|
load64 _0xF0, &r1
|
|
lt &r0, &r1, &r1
|
|
eq &r1, &r255, &r1
|
|
jnz &r1, L4b
|
|
ret &r255
|
|
L4b:
|
|
input8 &r3
|
|
output8 &r3
|
|
load64 _0xF8, &r1
|
|
lt &r0, &r1, &r1
|
|
eq &r1, &r255, &r1
|
|
jnz &r1, L5b
|
|
ret &r255
|
|
L5b:
|
|
input8 &r3
|
|
output8 &r3
|
|
load64 _0xFC, &r1
|
|
lt &r0, &r1, &r1
|
|
eq &r1, &r255, &r1
|
|
jnz &r1, L6b
|
|
ret &r255
|
|
L6b:
|
|
input8 &r3
|
|
output8 &r3
|
|
ret &r255
|
|
|
|
ERROR:
|
|
place64 0xffffffffffffffff
|
|
_0x80:
|
|
place64 0x80
|
|
_0xC0:
|
|
place64 0xc0
|
|
_0xFD:
|
|
place64 0xfd
|
|
_0xE0:
|
|
place64 0xe0
|
|
_0xF0:
|
|
place64 0xf0
|
|
_0xF8:
|
|
place64 0xf8
|
|
_0xFC:
|
|
place64 0xfc
|