Files
sisungo ef7d225be7 feat: use the vm model for iconv
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.
2026-02-19 09:29:41 +08:00

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