{"id":465182,"date":"2025-06-30T15:00:12","date_gmt":"2025-06-30T15:00:12","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=465182"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=465182","title":{"rendered":"<span>\u0423\u0441\u043a\u043e\u0440\u044f\u0435\u043c \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e UTF-8 \u0432 10 \u0440\u0430\u0437 (&gt;10 \u0413\u0411\/\u0441): \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 Lemire-Keiser \u043d\u0430 Go \u0441 ARM NEON<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>UTF-8\u00a0\u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f\u00a0\u2014 \u043e\u0434\u043d\u0430 \u0438\u0437\u00a0\u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u0438\u00a0\u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u00a0\u0442\u0435\u043a\u0441\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u0440\u0430\u0437 \u0432\u00a0\u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u0432\u00a0\u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445. \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u00a0Go, \u0445\u043e\u0442\u044c \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0430\u044f, \u0434\u0430\u043b\u0435\u043a\u0430 \u043e\u0442\u00a0\u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u00a0\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0412\u00a0\u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a\u00a0\u043c\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e UTF-8\u00a0\u0432 10\u00a0\u0440\u0430\u0437, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f SIMD\u2011\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 ARM NEON \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0438\u0437\u00a0\u0441\u0442\u0430\u0442\u044c\u0438 \u00ab<a href=\"https:\/\/arxiv.org\/pdf\/2010.03\u00a0090\" rel=\"noopener noreferrer nofollow\">Validating UTF-8\u00a0In Less Than One Instruction Per Byte<\/a>\u00bb \u0414\u0436\u043e\u043d\u0430 \u041a\u0435\u0439\u0437\u0435\u0440\u0430 \u0438 \u0414\u044d\u043d\u0438\u0435\u043b\u0430 \u041b\u0435\u043c\u0438\u0440\u0430.<\/p>\n<h2>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438<\/h2>\n<p>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f <code>utf8.Valid()<\/code> \u0432 Go \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439:<\/p>\n<ul>\n<li>\n<p>\u041c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b <\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 <\/p>\n<\/li>\n<li>\n<p>\u041a\u044d\u0448-\u043f\u0440\u043e\u043c\u0430\u0445\u0438 lookup \u0442\u0430\u0431\u043b\u0438\u0446 <\/p>\n<\/li>\n<li>\n<p>\u0418\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0433\u0440\u0430\u043d\u0438\u0446 <\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0418\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 stdlib \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442:<\/strong><\/p>\n<ul>\n<li>\n<p>\u041d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 4 \u041a\u0411 &#8212; 256 \u041c\u0411: <strong>~1.2-1.3 \u0413\u0411\/\u0441<\/strong><\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/li>\n<li>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435: \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438 branch misprediction<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u0430\u0445 (256 \u041c\u0411): \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0434\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u044f \u0434\u043e <strong>~1.25 \u0413\u0411\/\u0441<\/strong><\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442, \u0447\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0430\u043b\u0435\u043a\u0430 \u043e\u0442 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0435\u043b\u0430 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043f\u0430\u043c\u044f\u0442\u0438, \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438<\/p>\n<h2>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c Lemire-Keiser<\/h2>\n<p><strong>\u041a\u043e\u043d\u0446\u0435\u043f\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0441\u043d\u043e\u0432\u0430<\/strong><\/p>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c <a href=\"https:\/\/arxiv.org\/pdf\/2010.03090\" rel=\"noopener noreferrer nofollow\">Lemire-Keiser<\/a> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0440\u0430\u0434\u0438\u043a\u0430\u043b\u044c\u043d\u043e \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 UTF-8, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 <strong>\u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<\/strong> \u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 &#171;\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0431\u0435\u0437 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0439&#187;. \u041a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u0438\u0434\u0435\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e <strong>\u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 UTF-8 \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u044b\u0435 \u0434\u0432\u0430 \u0431\u0430\u0439\u0442\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/strong>.<\/p>\n<h4>\u0421\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0431\u0448\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c:<\/h4>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/ruvds\/articles\/551060\/\" rel=\"noopener noreferrer nofollow\">\u0412\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f UTF-8 \u043c\u0435\u043d\u044c\u0448\u0435 \u0447\u0435\u043c \u0437\u0430 \u043e\u0434\u043d\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u043d\u0430 \u0431\u0430\u0439\u0442<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/lemire.me\/blog\/2020\/10\/20\/ridiculously-fast-unicode-utf-8-validation\/\" rel=\"noopener noreferrer nofollow\">Ridiculously fast unicode (UTF-8) validation<\/a><\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0441\u043d\u043e\u0432\u0430<\/strong><\/p>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u0430\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 <strong>\u0442\u0435\u043e\u0440\u0438\u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u0432<\/strong> \u0438 <strong>\u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043c\u0430\u0441\u043a\u0430\u0445<\/strong>. \u041a\u0430\u0436\u0434\u0430\u044f \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0445 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u0431\u0430\u0439\u0442\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0432 \u043e\u0434\u043d\u0443 \u0438\u0437 12 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439:<\/p>\n<ol>\n<li>\n<p><strong>ASCII<\/strong> (00000000&#8230;01111111)<\/p>\n<\/li>\n<li>\n<p><strong>Continuation Low<\/strong> (10|000000&#8230;001111)  <\/p>\n<\/li>\n<li>\n<p><strong>Continuation<\/strong> (10|010000&#8230;001111)<\/p>\n<\/li>\n<li>\n<p><strong>Continuation High<\/strong> (10|100000&#8230;111111)<\/p>\n<\/li>\n<li>\n<p><strong>2-Byte Start<\/strong> (110|00010&#8230;11111)<\/p>\n<\/li>\n<li>\n<p><strong>3-Byte Start Low<\/strong> (1110|0000)<\/p>\n<\/li>\n<li>\n<p><strong>3-Byte Start<\/strong> (1110|0001&#8230;1100, 1110|1110&#8230;1111)<\/p>\n<\/li>\n<li>\n<p><strong>3-Byte Surrogate<\/strong> (1110|1101)<\/p>\n<\/li>\n<li>\n<p><strong>4-Byte Start Low<\/strong> (11110|000)<\/p>\n<\/li>\n<li>\n<p><strong>4-Byte Start<\/strong> (11110|001&#8230;011)<\/p>\n<\/li>\n<li>\n<p><strong>4-Byte Start High<\/strong> (11110|100)<\/p>\n<\/li>\n<li>\n<p><strong>Invalid<\/strong> (\u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435)<\/p>\n<\/li>\n<\/ol>\n<p>Lookup \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442 <strong>\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<\/strong> f: {0..255} \u2192 {0..255}, \u0433\u0434\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u0431\u0438\u0442\u043e\u0432\u0443\u044e \u043c\u0430\u0441\u043a\u0443 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u043a \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c \u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<h2>\u041c\u043e\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 Go \u0441 ARM NEON<\/h2>\n<pre><code class=\"vhdl\">\/\/go:build !purego  #include \"textflag.h\"  \/\/ func validateNEON(p []byte) bool \/\/ \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 UTF-8 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c ARM64 NEON SIMD \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 TEXT \u00b7Valid(SB),NOSPLIT,$0-25     \/\/ \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0437 \u0441\u0442\u0435\u043a\u0430     MOVD    s_base+0(FP), R10      \/\/ \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 R10     MOVD    s_len+8(FP), R11       \/\/ \u0414\u043b\u0438\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 R11     CBZ     R11, valid             \/\/ \u0415\u0441\u043b\u0438 \u0434\u043b\u0438\u043d\u0430 = 0, \u0441\u0442\u0440\u043e\u043a\u0430 \u0432\u0430\u043b\u0438\u0434\u043d\u0430     CMP     $16, R11                    BLT     small                  \/\/ \u0415\u0441\u043b\u0438 \u0434\u043b\u0438\u043d\u0430 &lt; 16 \u0431\u0430\u0439\u0442, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e      \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u0441\u043a\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 ASCII \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 (\u0431\u0438\u0442 7 = 1 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043d\u0435-ASCII)     VMOVQ   $0x8080808080808080, $0x8080808080808080, V0  ascii_loop:     \/\/ \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 ASCII \u0441\u0438\u043c\u0432\u043e\u043b\u044b (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0447\u0438\u0441\u0442\u043e ASCII \u0441\u0442\u0440\u043e\u043a)     CMP     $16, R11     BLT     small                  \/\/ \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c &lt; 16 \u0431\u0430\u0439\u0442, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043e\u0441\u0442\u0430\u0442\u043a\u0430      VLD1    (R10), [V1.B16]        \/\/ \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c 16 \u0431\u0430\u0439\u0442 \u0432 SIMD \u0440\u0435\u0433\u0438\u0441\u0442\u0440 V1     VCMTST  V1.B16, V0.B16, V2.B16 \/\/ \u0422\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u0431\u0438\u0442\u044b 0x80 (\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043d\u0435-ASCII)     VMOV    V2.D[0], R2            \/\/ \u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u044b\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b     VMOV    V2.D[1], R3     ORR     R2, R3, R2             \/\/ \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b     CBNZ    R2, stop_ascii         \/\/ \u0415\u0441\u043b\u0438 \u043d\u0430\u0439\u0434\u0435\u043d \u043d\u0435-ASCII \u0441\u0438\u043c\u0432\u043e\u043b, \u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0430\u0435\u043c ASCII \u0446\u0438\u043a\u043b      ADD     $16, R10               \/\/ \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0431\u043b\u043e\u043a\u0443     SUB     $16, R11               \/\/ \u0423\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u0431\u0430\u0439\u0442     B       ascii_loop             \/\/ \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c ASCII \u0446\u0438\u043a\u043b  stop_ascii:     \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u0434\u043b\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u041c\u0443\u043b\u044b (Lemire) \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 UTF-8     \/\/ \u042d\u0442\u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 lookup \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445 \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 UTF-8     VMOVQ   $0x0202020202020202, $0x4915012180808080, V11  \/\/ Lookup \u0442\u0430\u0431\u043b\u0438\u0446\u0430 1     VMOVQ   $0xcbcbcb8b8383a3e7, $0xcbcbdbcbcbcbcbcb, V13  \/\/ Lookup \u0442\u0430\u0431\u043b\u0438\u0446\u0430 2       VMOVQ   $0x0101010101010101, $0x01010101babaaee6, V15  \/\/ Lookup \u0442\u0430\u0431\u043b\u0438\u0446\u0430 3     VMOVQ   $0x0F0F0F0F0F0F0F0F, $0x0F0F0F0F0F0F0F0F, V18  \/\/ \u041c\u0430\u0441\u043a\u0430 \u0434\u043b\u044f \u043c\u043b\u0430\u0434\u0448\u0438\u0445 4 \u0431\u0438\u0442     VMOVQ   $0x0707070707070707, $0x0707070707070707, V12  \/\/ \u041c\u0430\u0441\u043a\u0430 0x07     VMOVQ   $0xFFFFFFFFFFFFFFFF, $0xFFFFFFFFFFFFFFFF, V14  \/\/ \u041c\u0430\u0441\u043a\u0430 \u0432\u0441\u0435\u0445 \u0435\u0434\u0438\u043d\u0438\u0446     VMOVQ   $0x7F7F7F7F7F7F7F7F, $0x7F7F7F7F7F7F7F7F, V16  \/\/ \u041c\u0430\u0441\u043a\u0430 0x7F     VMOVQ   $0xDFDFDFDFDFDFDFDF, $0xDFDFDFDFDFDFDFDF, V17  \/\/ \u041c\u0430\u0441\u043a\u0430 0xDF     VMOVQ   $0x0808080808080808, $0x0808080808080808, V19  \/\/ \u041c\u0430\u0441\u043a\u0430 0x08     VMOVQ   $0x8080808080808080, $0x8080808080808080, V20  \/\/ \u041c\u0430\u0441\u043a\u0430 0x80     VMOVQ   $0x0000000000000000, $0x0000000000000000, V30  \/\/ \u041d\u0443\u043b\u0435\u0432\u043e\u0439 \u0432\u0435\u043a\u0442\u043e\u0440     VMOVQ   $0x0000000000000000, $0x0000000000000000, V3   \/\/ \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0431\u043b\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445  aligned_loop:     \/\/ \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0438\u043a\u043b \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 UTF-8 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u041c\u0443\u043b\u044b     VLD1.P  16(R10), [V4.B16]      \/\/ \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c 16 \u0431\u0430\u0439\u0442 \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c          \/\/ \u0421\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0431\u0430\u0439\u0442\u0430\u043c\u0438     VEXT    $15, V4.B16, V3.B16, V5.B16  \/\/ \u0411\u0435\u0440\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0431\u0430\u0439\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430 + \u0442\u0435\u043a\u0443\u0449\u0438\u0439     VUSHR   $4, V5.B16, V6.B16     \/\/ \u0421\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u043d\u0430 4 \u0431\u0438\u0442\u0430 \u0432\u043f\u0440\u0430\u0432\u043e (\u0441\u0442\u0430\u0440\u0448\u0438\u0435 4 \u0431\u0438\u0442\u0430)     VTBL    V6.B16, [V11.B16], V6.B16    \/\/ Lookup \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435     VAND    V5.B16, V18.B16, V7.B16      \/\/ \u0412\u044b\u0434\u0435\u043b\u044f\u0435\u043c \u043c\u043b\u0430\u0434\u0448\u0438\u0435 4 \u0431\u0438\u0442\u0430     VTBL    V7.B16, [V13.B16], V7.B16    \/\/ Lookup \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435     VUSHR   $4, V4.B16, V8.B16     \/\/ \u0421\u0442\u0430\u0440\u0448\u0438\u0435 4 \u0431\u0438\u0442\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430     VTBL    V8.B16, [V15.B16], V8.B16    \/\/ Lookup \u0432 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435          \/\/ \u041a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b lookup'\u043e\u0432     VAND    V6.B16, V7.B16, V9.B16     VAND    V9.B16, V8.B16, V10.B16          \/\/ \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0434\u043b\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 UTF-8     VEXT    $14, V4.B16, V3.B16, V5.B16  \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 -2     VUSHR   $5, V5.B16, V6.B16     \/\/ \u0421\u0434\u0432\u0438\u0433 \u043d\u0430 5 \u0431\u0438\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0442\u0430\u0440\u0448\u0438\u0445 \u0431\u0438\u0442\u043e\u0432     VCMEQ   V12.B16, V6.B16, V6.B16      \/\/ \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 0x07          VEXT    $13, V4.B16, V3.B16, V5.B16  \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 -3     VUSHR   $4, V5.B16, V9.B16     \/\/ \u0421\u0434\u0432\u0438\u0433 \u043d\u0430 4 \u0431\u0438\u0442\u0430     VCMEQ   V18.B16, V9.B16, V9.B16      \/\/ \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 0x0F     VORR    V6.B16, V9.B16, V9.B16       \/\/ \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432          \/\/ \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u0438     VAND    V9.B16, V20.B16, V9.B16      \/\/ \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043c\u0430\u0441\u043a\u0443 0x80     VSUB    V9.B16, V10.B16, V9.B16      \/\/ \u0412\u044b\u0447\u0438\u0442\u0430\u0435\u043c \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430     VMOV    V9.D[0], R1            \/\/ \u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u044b\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b     VMOV    V9.D[1], R2     ORR     R1, R2, R1             \/\/ \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430     CBNZ    R1, no_valid           \/\/ \u0415\u0441\u043b\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0435 \u043d\u043e\u043b\u044c, \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u0430          VMOV    V4.B16, V3.B16         \/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0431\u043b\u043e\u043a \u043a\u0430\u043a \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439     SUB     $16, R11, R11          \/\/ \u0423\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u0431\u0430\u0439\u0442     CMP     $16, R11                     BGE     aligned_loop           \/\/ \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c &gt;= 16 \u0431\u0430\u0439\u0442, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0446\u0438\u043a\u043b      B small_no_const               \/\/ \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043e\u0441\u0442\u0430\u0442\u043a\u0430  small:     \/\/ \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0441\u0442\u0440\u043e\u043a (&lt; 16 \u0431\u0430\u0439\u0442)     CBZ     R11, valid             \/\/ \u0415\u0441\u043b\u0438 \u0431\u0430\u0439\u0442 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c, \u0441\u0442\u0440\u043e\u043a\u0430 \u0432\u0430\u043b\u0438\u0434\u043d\u0430  tail_loop:     \/\/ \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0431\u0430\u0439\u0442\u0443 \u0434\u043b\u044f \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u0441\u0442\u0440\u043e\u043a     MOVBU   (R10), R2              \/\/ \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043e\u0434\u0438\u043d \u0431\u0430\u0439\u0442     AND     $0x80, R2              \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u0442\u0430\u0440\u0448\u0438\u0439 \u0431\u0438\u0442     CBNZ    R2, check_utf8         \/\/ \u0415\u0441\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d, \u043d\u0443\u0436\u043d\u0430 \u043f\u043e\u043b\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 UTF-8     ADD     $1, R10                \/\/ \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0431\u0430\u0439\u0442\u0443     SUB     $1, R11                \/\/ \u0423\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a     CBNZ    R11, tail_loop         \/\/ \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u043f\u043e\u043a\u0430 \u0435\u0441\u0442\u044c \u0431\u0430\u0439\u0442\u044b     B       valid                  \/\/ \u0412\u0441\u0435 \u0431\u0430\u0439\u0442\u044b ASCII - \u0441\u0442\u0440\u043e\u043a\u0430 \u0432\u0430\u043b\u0438\u0434\u043d\u0430  check_utf8:     \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u0434\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 UTF-8     \/\/ (\u0442\u0435 \u0436\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u0447\u0442\u043e \u0438 \u0432\u044b\u0448\u0435)     VMOVQ   $0x0202020202020202, $0x4915012180808080, V11     VMOVQ   $0xcbcbcb8b8383a3e7, $0xcbcbdbcbcbcbcbcb, V13     VMOVQ   $0x0101010101010101, $0x01010101babaaee6, V15     VMOVQ   $0x0F0F0F0F0F0F0F0F, $0x0F0F0F0F0F0F0F0F, V18     VMOVQ   $0x0707070707070707, $0x0707070707070707, V12     VMOVQ   $0xFFFFFFFFFFFFFFFF, $0xFFFFFFFFFFFFFFFF, V14     VMOVQ   $0x7F7F7F7F7F7F7F7F, $0x7F7F7F7F7F7F7F7F, V16     VMOVQ   $0xDFDFDFDFDFDFDFDF, $0xDFDFDFDFDFDFDFDF, V17     VMOVQ   $0x0808080808080808, $0x0808080808080808, V19     VMOVQ   $0x8080808080808080, $0x8080808080808080, V20     VMOVQ   $0x0000000000000000, $0x0000000000000000, V30     VMOVQ   $0x0000000000000000, $0x0000000000000000, V3  small_no_const:     \/\/ \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0441\u0442\u0430\u0442\u043a\u0430 &lt; 16 \u0431\u0430\u0439\u0442     SUB $16, R10, R10              \/\/ \u041e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u0441\u044f \u043d\u0430 16 \u0431\u0430\u0439\u0442 \u043d\u0430\u0437\u0430\u0434     ADD R11, R10, R10              \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u0431\u0430\u0439\u0442     VLD1.P  16(R10), [V4.B16]      \/\/ \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c 16 \u0431\u0430\u0439\u0442 (\u0432\u043a\u043b\u044e\u0447\u0430\u044f \"\u043c\u0443\u0441\u043e\u0440\")      \/\/ \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043b\u0438\u0448\u043d\u0438\u0445 \u0431\u0430\u0439\u0442     ADR  shift_table, R2           \/\/ \u0410\u0434\u0440\u0435\u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432     MOVW R11, R3                   \/\/ \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 \u0431\u0430\u0439\u0442     LSL $2,  R3                    \/\/ \u0423\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u043d\u0430 4 (\u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438)     ADD R3, R2                     \/\/ \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0430\u0434\u0440\u0435\u0441 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430     B (R2)                         \/\/ \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443  shift_table:     \/\/ \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 0-15 \u0431\u0430\u0439\u0442     B do_shift_0                   \/\/ 0 \u0431\u0430\u0439\u0442 - \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c ASCII \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438     B do_shift_1                   \/\/ 1 \u0431\u0430\u0439\u0442 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439     B do_shift_2                   \/\/ 2 \u0431\u0430\u0439\u0442\u0430 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445     B do_shift_3                   \/\/ 3 \u0431\u0430\u0439\u0442\u0430 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445     B do_shift_4                   \/\/ 4 \u0431\u0430\u0439\u0442\u0430 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445     B do_shift_5                   \/\/ 5 \u0431\u0430\u0439\u0442 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445     B do_shift_6                   \/\/ 6 \u0431\u0430\u0439\u0442 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445     B do_shift_7                   \/\/ 7 \u0431\u0430\u0439\u0442 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445     B do_shift_8                   \/\/ 8 \u0431\u0430\u0439\u0442 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445     B do_shift_9                   \/\/ 9 \u0431\u0430\u0439\u0442 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445     B do_shift_10                  \/\/ 10 \u0431\u0430\u0439\u0442 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445     B do_shift_11                  \/\/ 11 \u0431\u0430\u0439\u0442 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445     B do_shift_12                  \/\/ 12 \u0431\u0430\u0439\u0442 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445     B do_shift_13                  \/\/ 13 \u0431\u0430\u0439\u0442 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445     B do_shift_14                  \/\/ 14 \u0431\u0430\u0439\u0442 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445     B do_shift_15                  \/\/ 15 \u0431\u0430\u0439\u0442 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445  do_shift_0:     \/\/ 0 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 \u0431\u0430\u0439\u0442 - \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0432\u0435\u043a\u0442\u043e\u0440 ASCII \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438 'a' (0x61)     VMOVQ   $0x6161616161616161, $0x6161616161616161, V4     B end_swith do_shift_1:     \/\/ 1 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 \u0431\u0430\u0439\u0442 - \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u043d\u0430 15 \u043f\u043e\u0437\u0438\u0446\u0438\u0439 (\u043c\u0430\u0441\u043a\u0438\u0440\u0443\u0435\u043c 15 \u0431\u0430\u0439\u0442)     VEXT    $15, V30.B16, V4.B16, V4.B16     B end_swith do_shift_2:     \/\/ 2 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 \u0431\u0430\u0439\u0442\u0430 - \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u043d\u0430 14 \u043f\u043e\u0437\u0438\u0446\u0438\u0439     VEXT    $14, V30.B16, V4.B16, V4.B16     B end_swith do_shift_3:     \/\/ 3 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 \u0431\u0430\u0439\u0442\u0430 - \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u043d\u0430 13 \u043f\u043e\u0437\u0438\u0446\u0438\u0439     VEXT    $13, V30.B16, V4.B16, V4.B16     B end_swith do_shift_4:     \/\/ 4 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 \u0431\u0430\u0439\u0442\u0430 - \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u043d\u0430 12 \u043f\u043e\u0437\u0438\u0446\u0438\u0439     VEXT    $12, V30.B16, V4.B16, V4.B16     B end_swith do_shift_5:     \/\/ 5 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 \u0431\u0430\u0439\u0442 - \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u043d\u0430 11 \u043f\u043e\u0437\u0438\u0446\u0438\u0439     VEXT    $11, V30.B16, V4.B16, V4.B16     B end_swith do_shift_6:     \/\/ 6 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 \u0431\u0430\u0439\u0442 - \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u043d\u0430 10 \u043f\u043e\u0437\u0438\u0446\u0438\u0439     VEXT    $10, V30.B16, V4.B16, V4.B16     B end_swith do_shift_7:     \/\/ 7 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 \u0431\u0430\u0439\u0442 - \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u043d\u0430 9 \u043f\u043e\u0437\u0438\u0446\u0438\u0439     VEXT    $9, V30.B16, V4.B16, V4.B16     B end_swith do_shift_8:     \/\/ 8 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 \u0431\u0430\u0439\u0442 - \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u043d\u0430 8 \u043f\u043e\u0437\u0438\u0446\u0438\u0439     VEXT    $8, V30.B16, V4.B16, V4.B16     B end_swith do_shift_9:     \/\/ 9 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 \u0431\u0430\u0439\u0442 - \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u043d\u0430 7 \u043f\u043e\u0437\u0438\u0446\u0438\u0439     VEXT    $7, V30.B16, V4.B16, V4.B16     B end_swith do_shift_10:     \/\/ 10 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 \u0431\u0430\u0439\u0442 - \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u043d\u0430 6 \u043f\u043e\u0437\u0438\u0446\u0438\u0439     VEXT    $6, V30.B16, V4.B16, V4.B16     B end_swith do_shift_11:     \/\/ 11 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 \u0431\u0430\u0439\u0442 - \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u043d\u0430 5 \u043f\u043e\u0437\u0438\u0446\u0438\u0439     VEXT    $5, V30.B16, V4.B16, V4.B16     B end_swith do_shift_12:     \/\/ 12 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 \u0431\u0430\u0439\u0442 - \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u043d\u0430 4 \u043f\u043e\u0437\u0438\u0446\u0438\u0438     VEXT    $4, V30.B16, V4.B16, V4.B16     B end_swith do_shift_13:     \/\/ 13 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 \u0431\u0430\u0439\u0442 - \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u043d\u0430 3 \u043f\u043e\u0437\u0438\u0446\u0438\u0438     VEXT    $3, V30.B16, V4.B16, V4.B16     B end_swith do_shift_14:     \/\/ 14 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 \u0431\u0430\u0439\u0442 - \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u043d\u0430 2 \u043f\u043e\u0437\u0438\u0446\u0438\u0438     VEXT    $2, V30.B16, V4.B16, V4.B16     B end_swith do_shift_15:     \/\/ 15 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 \u0431\u0430\u0439\u0442 - \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u043d\u0430 1 \u043f\u043e\u0437\u0438\u0446\u0438\u044e     VEXT    $1, V30.B16, V4.B16, V4.B16     B end_swith  end_swith:     \/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0442\u0443 \u0436\u0435 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e UTF-8, \u0447\u0442\u043e \u0438 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435     VEXT    $15, V4.B16, V3.B16, V5.B16   \/\/ \u0410\u043d\u0430\u043b\u0438\u0437 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0431\u0430\u0439\u0442\u0430\u043c\u0438     VUSHR   $4, V5.B16, V6.B16            \/\/ \u0421\u0442\u0430\u0440\u0448\u0438\u0435 4 \u0431\u0438\u0442\u0430     VTBL    V6.B16, [V11.B16], V6.B16     \/\/ Lookup \u0442\u0430\u0431\u043b\u0438\u0446\u0430 1     VAND    V5.B16, V18.B16, V7.B16       \/\/ \u041c\u043b\u0430\u0434\u0448\u0438\u0435 4 \u0431\u0438\u0442\u0430     VTBL    V7.B16, [V13.B16], V7.B16     \/\/ Lookup \u0442\u0430\u0431\u043b\u0438\u0446\u0430 2     VUSHR   $4, V4.B16, V8.B16            \/\/ \u0421\u0442\u0430\u0440\u0448\u0438\u0435 4 \u0431\u0438\u0442\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0431\u0430\u0439\u0442     VTBL    V8.B16, [V15.B16], V8.B16     \/\/ Lookup \u0442\u0430\u0431\u043b\u0438\u0446\u0430 3     VAND    V6.B16, V7.B16, V9.B16        \/\/ \u041a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432     VAND    V9.B16, V8.B16, V10.B16      \/\/ \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438     VEXT    $14, V4.B16, V3.B16, V5.B16   \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 -2     VUSHR   $5, V5.B16, V6.B16     VCMEQ   V12.B16, V6.B16, V6.B16      VEXT    $13, V4.B16, V3.B16, V5.B16   \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 -3     VUSHR   $4, V5.B16, V9.B16     VCMEQ   V18.B16, V9.B16, V9.B16     VORR    V6.B16, V9.B16, V9.B16      \/\/ \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f     VAND    V9.B16, V20.B16, V9.B16     VSUB    V9.B16, V10.B16, V9.B16     VMOV    V9.D[0], R1                   \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442     VMOV    V9.D[1], R2     ORR     R1, R2, R1     CBNZ    R1, no_valid                  \/\/ \u0415\u0441\u043b\u0438 \u043d\u0435 \u043d\u043e\u043b\u044c, \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u0430  valid:     \/\/ \u0421\u0442\u0440\u043e\u043a\u0430 \u0432\u0430\u043b\u0438\u0434\u043d\u0430 - \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c true (1)     MOVD    $1, R0     MOVD    R0, ret+24(FP)     RET  no_valid:     \/\/ \u0421\u0442\u0440\u043e\u043a\u0430 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u0430 - \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c false (0)     MOVD    $0, R0     MOVD    R0, ret+24(FP)     RET <\/code><\/pre>\n<h2>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432<\/h2>\n<p><strong>\u0422\u0435\u0441\u0442\u043e\u0432\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430<\/strong><\/p>\n<ul>\n<li>\n<p><strong>\u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440<\/strong>: Apple M1 Pro (ARM64)<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430<\/strong>: macOS (darwin)<\/p>\n<\/li>\n<li>\n<p><strong>Go \u0432\u0435\u0440\u0441\u0438\u044f<\/strong>: 1.24.4<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438<\/strong>:<\/p>\n<ul>\n<li>\n<p><strong>Stdlib<\/strong> \u2014 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f <code>utf8.Valid()<\/code> \u0438\u0437 Go<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/sugawarayuuta\/charcoal\" rel=\"noopener noreferrer nofollow\"><strong>charcoal<\/strong><\/a> \u2014 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0431\u0435\u0437 SIMD<\/p>\n<\/li>\n<li>\n<p><strong>SIMD<\/strong> \u2014 \u043c\u043e\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441 ARM NEON<\/p>\n<\/li>\n<\/ul>\n<h3>\u041c\u0430\u043b\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 (10 \u0431\u0430\u0439\u0442)<\/h3>\n<p>\u042f\u043f\u043e\u043d\u0441\u043a\u0438\u0439 \u0442\u0435\u043a\u0441\u0442 (UTF-8):<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"138\" width=\"138\">\n<p align=\"left\">Stdlib<\/p>\n<\/td>\n<td data-colwidth=\"167\" width=\"167\">\n<p align=\"left\">27.78 ns\/op<\/p>\n<\/td>\n<td>\n<p align=\"left\">1079.80 MB\/s<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"138\" width=\"138\">\n<p align=\"left\">charcoal<\/p>\n<\/td>\n<td data-colwidth=\"167\" width=\"167\">\n<p align=\"left\">14.88 ns\/op<\/p>\n<\/td>\n<td>\n<p align=\"left\">2036.79 MB\/s <\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"138\" width=\"138\">\n<p align=\"left\">SIMD<\/p>\n<\/td>\n<td data-colwidth=\"167\" width=\"167\">\n<p align=\"left\">5.922 ns\/op<\/p>\n<\/td>\n<td>\n<p align=\"left\">5065.75 MB\/s  (4.7x \u0431\u044b\u0441\u0442\u0440\u0435\u0435 stdlib)<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3>\u0421\u0440\u0435\u0434\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u044b (1 \u041a\u0411)<\/h3>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"138\" width=\"138\">\n<p align=\"left\">Stdlib<\/p>\n<\/td>\n<td data-colwidth=\"167\" width=\"167\">\n<p align=\"left\">893.5 ns\/op<\/p>\n<\/td>\n<td>\n<p align=\"left\">1146.01 MB\/s<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"138\" width=\"138\">\n<p align=\"left\">charcoal<\/p>\n<\/td>\n<td data-colwidth=\"167\" width=\"167\">\n<p align=\"left\">421.7 ns\/op<\/p>\n<\/td>\n<td>\n<p align=\"left\">2428.44 MB\/s<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"138\" width=\"138\">\n<p align=\"left\">SIMD<\/p>\n<\/td>\n<td data-colwidth=\"167\" width=\"167\">\n<p align=\"left\">106.2 ns\/op<\/p>\n<\/td>\n<td>\n<p align=\"left\">9641.60 MB\/s    (8.4x \u0431\u044b\u0441\u0442\u0440\u0435\u0435 stdlib)<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3>\u0411\u043e\u043b\u044c\u0448\u0438\u0435 \u0444\u0430\u0439\u043b\u044b (1 \u041c\u0411)<\/h3>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"138\" width=\"138\">\n<p align=\"left\">Stdlib<\/p>\n<\/td>\n<td data-colwidth=\"167\" width=\"167\">\n<p align=\"left\">916612 ns\/op<\/p>\n<\/td>\n<td>\n<p align=\"left\">1143.97 MB\/s<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"138\" width=\"138\">\n<p align=\"left\">charcoal<\/p>\n<\/td>\n<td data-colwidth=\"167\" width=\"167\">\n<p align=\"left\">416901 ns\/op<\/p>\n<\/td>\n<td>\n<p align=\"left\">2515.17 MB\/s<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"138\" width=\"138\">\n<p align=\"left\">SIMD<\/p>\n<\/td>\n<td data-colwidth=\"167\" width=\"167\">\n<p align=\"left\">102415 ns\/op<\/p>\n<\/td>\n<td>\n<p align=\"left\">10238.46 MB\/s   (9.0x \u0431\u044b\u0441\u0442\u0440\u0435\u0435 stdlib)<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><strong>\u0414\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445<\/strong><\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/td>\n<td data-colwidth=\"125\" width=\"125\">\n<p align=\"left\">Stdlib (MB\/s)<\/p>\n<\/td>\n<td>\n<p align=\"left\">charcoal (MB\/s)<\/p>\n<\/td>\n<td data-colwidth=\"144\" width=\"144\">\n<p align=\"left\">SIMD (MB\/s)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0423\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 SIMD\/Stdlib<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">4 \u041a\u0411<\/p>\n<\/td>\n<td data-colwidth=\"125\" width=\"125\">\n<p align=\"left\">1280.09<\/p>\n<\/td>\n<td>\n<p align=\"left\">1645.04<\/p>\n<\/td>\n<td data-colwidth=\"144\" width=\"144\">\n<p align=\"left\">10030.39<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>7.8x<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">32 \u041a\u0411<\/p>\n<\/td>\n<td data-colwidth=\"125\" width=\"125\">\n<p align=\"left\">1283.78<\/p>\n<\/td>\n<td>\n<p align=\"left\">1658.71<\/p>\n<\/td>\n<td data-colwidth=\"144\" width=\"144\">\n<p align=\"left\">10239.46<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>8.0x<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">64 \u041a\u0411<\/p>\n<\/td>\n<td data-colwidth=\"125\" width=\"125\">\n<p align=\"left\">1282.96<\/p>\n<\/td>\n<td>\n<p align=\"left\">1660.01<\/p>\n<\/td>\n<td data-colwidth=\"144\" width=\"144\">\n<p align=\"left\">10260.09<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>8.0x<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">256 \u041a\u0411 <\/p>\n<\/td>\n<td data-colwidth=\"125\" width=\"125\">\n<p align=\"left\">1253.47<\/p>\n<\/td>\n<td>\n<p align=\"left\">1646.61<\/p>\n<\/td>\n<td data-colwidth=\"144\" width=\"144\">\n<p align=\"left\">10268.56<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>8.2x<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">4 \u041c\u0411<\/p>\n<\/td>\n<td data-colwidth=\"125\" width=\"125\">\n<p align=\"left\">1218.62<\/p>\n<\/td>\n<td>\n<p align=\"left\">1609.69<\/p>\n<\/td>\n<td data-colwidth=\"144\" width=\"144\">\n<p align=\"left\">10262.59<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>8.4x<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">32 \u041c\u0411<\/p>\n<\/td>\n<td data-colwidth=\"125\" width=\"125\">\n<p align=\"left\">1248.65<\/p>\n<\/td>\n<td>\n<p align=\"left\">1648.06<\/p>\n<\/td>\n<td data-colwidth=\"144\" width=\"144\">\n<p align=\"left\">10233.27<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>8.2x<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">128 \u041c\u0411<\/p>\n<\/td>\n<td data-colwidth=\"125\" width=\"125\">\n<p align=\"left\">1244.03<\/p>\n<\/td>\n<td>\n<p align=\"left\">1624.76<\/p>\n<\/td>\n<td data-colwidth=\"144\" width=\"144\">\n<p align=\"left\">10220.27<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>8.2x<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">256 \u041c\u0411<\/p>\n<\/td>\n<td data-colwidth=\"125\" width=\"125\">\n<p align=\"left\">1250.01<\/p>\n<\/td>\n<td>\n<p align=\"left\">1644.33<\/p>\n<\/td>\n<td data-colwidth=\"144\" width=\"144\">\n<p align=\"left\">9319.34<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>7.5x<\/strong><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><strong>\u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/strong>: &gt;10 \u0413\u0411\/\u0441 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0430\u0435\u0442\u0441\u044f \u043a \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 DDR4<\/p>\n<p><strong>\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435<\/strong><\/p>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0430 \u0434\u043b\u044f:<\/p>\n<ul>\n<li>\n<p><strong>JSON-\u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432<\/strong>: \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 JSON-\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/p>\n<\/li>\n<li>\n<p> <strong>\u0411\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445<\/strong>: \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u043f\u0440\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/li>\n<\/ul>\n<h4>Rust simdutf8::basic::from_utf8<\/h4>\n<p>\u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <a href=\"https:\/\/crates.io\/crates\/simdutf8\" rel=\"noopener noreferrer nofollow\"><code>simdutf8<\/code><\/a> \u0434\u043b\u044f Rust, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 <strong>\u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/strong> \u043d\u0430 ARM64 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445:<\/p>\n<p>\u041d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 (&gt;1 \u041c\u0411)**: ~10 \u0413\u0411\/\u0441<\/p>\n<p><strong>\u041f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u044b \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f:<\/strong><\/p>\n<p>&#8212; \u041f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 x86-64 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c AVX2\/AVX-512<\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 GitHub: <a href=\"https:\/\/github.com\/AndreyyTs\/utf8simd\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/AndreyyTs\/utf8simd<\/a><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/923242\/\"> https:\/\/habr.com\/ru\/articles\/923242\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>UTF-8\u00a0\u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f\u00a0\u2014 \u043e\u0434\u043d\u0430 \u0438\u0437\u00a0\u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u0438\u00a0\u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u00a0\u0442\u0435\u043a\u0441\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u0440\u0430\u0437 \u0432\u00a0\u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u0432\u00a0\u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445. \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u00a0Go, \u0445\u043e\u0442\u044c \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0430\u044f, \u0434\u0430\u043b\u0435\u043a\u0430 \u043e\u0442\u00a0\u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u00a0\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0412\u00a0\u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a\u00a0\u043c\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e UTF-8\u00a0\u0432 10\u00a0\u0440\u0430\u0437, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f SIMD\u2011\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 ARM NEON \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0438\u0437\u00a0\u0441\u0442\u0430\u0442\u044c\u0438 \u00ab<a href=\"https:\/\/arxiv.org\/pdf\/2010.03\u00a0090\" rel=\"noopener noreferrer nofollow\">>Validating UTF-8\u00a0In Less Than One Instruction Per Byte<\/a>\u00bb \u0414\u0436\u043e\u043d\u0430 \u041a\u0435\u0439\u0437\u0435\u0440\u0430 \u0438 \u0414\u044d\u043d\u0438\u0435\u043b\u0430 \u041b\u0435\u043c\u0438\u0440\u0430.<\/p>\n<h2>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438<\/h2>\n<p>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f <code>utf8.Valid()<\/code> \u0432 Go \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439:<\/p>\n<ul>\n<li>\n<p>\u041c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b <\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 <\/p>\n<\/li>\n<li>\n<p>\u041a\u044d\u0448-\u043f\u0440\u043e\u043c\u0430\u0445\u0438 lookup \u0442\u0430\u0431\u043b\u0438\u0446 <\/p>\n<\/li>\n<li>\n<p>\u0418\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0433\u0440\u0430\u043d\u0438\u0446 <\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0418\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 stdlib \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442:<\/strong><\/p>\n<ul>\n<li>\n<p>\u041d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 4 \u041a\u0411 &#8212; 256 \u041c\u0411: <strong>~1.2-1.3 \u0413\u0411\/\u0441<\/strong><\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/li>\n<li>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435: \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438 branch misprediction<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u0430\u0445 (256 \u041c\u0411): \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0434\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u044f \u0434\u043e <strong>~1.25 \u0413\u0411\/\u0441<\/strong><\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442, \u0447\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0430\u043b\u0435\u043a\u0430 \u043e\u0442 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0435\u043b\u0430 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043f\u0430\u043c\u044f\u0442\u0438, \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438<\/p>\n<h2>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c Lemire-Keiser<\/h2>\n<p><strong>\u041a\u043e\u043d\u0446\u0435\u043f\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0441\u043d\u043e\u0432\u0430<\/strong><\/p>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c <a href=\"https:\/\/arxiv.org\/pdf\/2010.03090\" rel=\"noopener noreferrer nofollow\">Lemire-Keiser<\/a> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0440\u0430\u0434\u0438\u043a\u0430\u043b\u044c\u043d\u043e \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 UTF-8, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 <strong>\u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<\/strong> \u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 &#171;\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0431\u0435\u0437 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0439&#187;. \u041a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u0438\u0434\u0435\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e <strong>\u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 UTF-8 \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u044b\u0435 \u0434\u0432\u0430 \u0431\u0430\u0439\u0442\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/strong>.<\/p>\n<h4>\u0421\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0431\u0448\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c:<\/h4>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/ruvds\/articles\/551060\/\" rel=\"noopener noreferrer nofollow\">\u0412\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f UTF-8 \u043c\u0435\u043d\u044c\u0448\u0435 \u0447\u0435\u043c \u0437\u0430 \u043e\u0434\u043d\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u043d\u0430 \u0431\u0430\u0439\u0442<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/lemire.me\/blog\/2020\/10\/20\/ridiculously-fast-unicode-utf-8-validation\/\" rel=\"noopener noreferrer nofollow\">Ridiculously fast unicode (UTF-8) validation<\/a><\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0441\u043d\u043e\u0432\u0430<\/strong><\/p>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u0430\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 <strong>\u0442\u0435\u043e\u0440\u0438\u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u0432<\/strong> \u0438 <strong>\u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043c\u0430\u0441\u043a\u0430\u0445<\/strong>. \u041a\u0430\u0436\u0434\u0430\u044f \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0445 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u0431\u0430\u0439\u0442\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0432 \u043e\u0434\u043d\u0443 \u0438\u0437 12 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439:<\/p>\n<ol>\n<li>\n<p><strong>ASCII<\/strong> (00000000&#8230;01111111)<\/p>\n<\/li>\n<li>\n<p><strong>Continuation Low<\/strong> (10|000000&#8230;001111)  <\/p>\n<\/li>\n<li>\n<p><strong>Continuation<\/strong> (10|010000&#8230;001111)<\/p>\n<\/li>\n<li>\n<p><strong>Continuation High<\/strong> (10|100000&#8230;111111)<\/p>\n<\/li>\n<li>\n<p><strong>2-Byte Start<\/strong> (110|00010&#8230;11111)<\/p>\n<\/li>\n<li>\n<p><strong>3-Byte Start Low<\/strong> (1110|0000)<\/p>\n<\/li>\n<li>\n<p><strong>3-Byte Start<\/strong> (1110|0001&#8230;1100, 1110|1110&#8230;1111)<\/p>\n<\/li>\n<li>\n<p><strong>3-Byte Surrogate<\/strong> (1110|1101)<\/p>\n<\/li>\n<li>\n<p><strong>4-Byte Start Low<\/strong> (11110|000)<\/p>\n<\/li>\n<li>\n<p><strong>4-Byte Start<\/strong> (11110|001&#8230;011)<\/p>\n<\/li>\n<li>\n<p><strong>4-Byte Start High<\/strong> (11110|100)<\/p>\n<\/li>\n<li>\n<p><strong>Invalid<\/strong> (\u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435)<\/p>\n<\/li>\n<\/ol>\n<p>Lookup \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442 <strong>\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<\/strong> f: {0..255} \u2192 {0..255}, \u0433\u0434\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u0431\u0438\u0442\u043e\u0432\u0443\u044e \u043c\u0430\u0441\u043a\u0443 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u043a \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c \u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<h2>\u041c\u043e\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 Go \u0441 ARM NEON<\/h2>\n<pre><code class=\"vhdl\">\/\/go:build !purego  #include \"textflag.h\"  \/\/ func validateNEON(p []byte) bool \/\/ \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 UTF-8 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c ARM64 NEON SIMD \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 TEXT \u00b7Valid(SB),NOSPLIT,$0-25     \/\/ \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0437 \u0441\u0442\u0435\u043a\u0430     MOVD    s_base+0(FP), R10      \/\/ \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 R10     MOVD    s_len+8(FP), R11       \/\/ \u0414\u043b\u0438\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 R11     CBZ     R11, valid             \/\/ \u0415\u0441\u043b\u0438 \u0434\u043b\u0438\u043d\u0430 = 0, \u0441\u0442\u0440\u043e\u043a\u0430 \u0432\u0430\u043b\u0438\u0434\u043d\u0430     CMP     $16, R11                    BLT     small                  \/\/ \u0415\u0441\u043b\u0438 \u0434\u043b\u0438\u043d\u0430 &lt; 16 \u0431\u0430\u0439\u0442, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e      \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u0441\u043a\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 ASCII \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 (\u0431\u0438\u0442 7 = 1 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043d\u0435-ASCII)     VMOVQ   $0x8080808080808080, $0x8080808080808080, V0  ascii_loop:     \/\/ \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 ASCII \u0441\u0438\u043c\u0432\u043e\u043b\u044b (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0447\u0438\u0441\u0442\u043e ASCII \u0441\u0442\u0440\u043e\u043a)     CMP     $16, R11     BLT     small                  \/\/ \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c &lt; 16 \u0431\u0430\u0439\u0442, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043e\u0441\u0442\u0430\u0442\u043a\u0430      VLD1    (R10), [V1.B16]        \/\/ \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c 16 \u0431\u0430\u0439\u0442 \u0432 SIMD \u0440\u0435\u0433\u0438\u0441\u0442\u0440 V1     VCMTST  V1.B16, V0.B16, V2.B16 \/\/ \u0422\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u0431\u0438\u0442\u044b 0x80 (\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043d\u0435-ASCII)     VMOV    V2.D[0], R2            \/\/ \u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u044b\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b     VMOV    V2.D[1], R3     ORR     R2, R3, R2             \/\/ \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b     CBNZ    R2, stop_ascii         \/\/ \u0415\u0441\u043b\u0438 \u043d\u0430\u0439\u0434\u0435\u043d \u043d\u0435-ASCII \u0441\u0438\u043c\u0432\u043e\u043b, \u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0430\u0435\u043c ASCII \u0446\u0438\u043a\u043b      ADD     $16, R10               \/\/ \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0431\u043b\u043e\u043a\u0443     SUB     $16, R11               \/\/ \u0423\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u0431\u0430\u0439\u0442     B       ascii_loop             \/\/ \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c ASCII \u0446\u0438\u043a\u043b  stop_ascii:     \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u0434\u043b\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u041c\u0443\u043b\u044b (Lemire) \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 UTF-8     \/\/ \u042d\u0442\u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 lookup \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445 \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 UTF-8     VMOVQ   $0x0202020202020202, $0x4915012180808080, V11  \/\/ Lookup \u0442\u0430\u0431\u043b\u0438\u0446\u0430 1     VMOVQ   $0xcbcbcb8b8383a3e7, $0xcbcbdbcbcbcbcbcb, V13  \/\/ Lookup \u0442\u0430\u0431\u043b\u0438\u0446\u0430 2       VMOVQ   $0x0101010101010101, $0x01010101babaaee6, V15  \/\/ Lookup \u0442\u0430\u0431\u043b\u0438\u0446\u0430 3     VMOVQ   $0x0F0F0F0F0F0F0F0F, $0x0F0F0F0F0F0F0F0F, V18  \/\/ \u041c\u0430\u0441\u043a\u0430 \u0434\u043b\u044f \u043c\u043b\u0430\u0434\u0448\u0438\u0445 4 \u0431\u0438\u0442     VMOVQ   $0x0707070707070707, $0x0707070707070707, V12  \/\/ \u041c\u0430\u0441\u043a\u0430 0x07     VMOVQ   $0xFFFFFFFFFFFFFFFF, $0xFFFFFFFFFFFFFFFF, V14  \/\/ \u041c\u0430\u0441\u043a\u0430 \u0432\u0441\u0435\u0445 \u0435\u0434\u0438\u043d\u0438\u0446     VMOVQ   $0x7F7F7F7F7F7F7F7F, $0x7F7F7F7F7F7F7F7F, V16  \/\/ \u041c\u0430\u0441\u043a\u0430 0x7F     VMOVQ   $0xDFDFDFDFDFDFDFDF, $0xDFDFDFDFDFDFDFDF, V17  \/\/ \u041c\u0430\u0441\u043a\u0430 0xDF     VMOVQ   $0x0808080808080808, $0x0808080808080808, V19  \/\/ \u041c\u0430\u0441\u043a\u0430 0x08     VMOVQ   $0x8080808080808080, $0x8080808080808080, V20  \/\/ \u041c\u0430\u0441\u043a\u0430 0x80     VMOVQ   $0x0000000000000000, $0x0000000000000000, V30  \/\/ \u041d\u0443\u043b\u0435\u0432\u043e\u0439 \u0432\u0435\u043a\u0442\u043e\u0440     VMOVQ   $0x0000000000000000, $0x0000000000000000, V3   \/\/ \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0431\u043b\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445  aligned_loop:     \/\/ \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0438\u043a\u043b \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 UTF-8 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u041c\u0443\u043b\u044b     VLD1.P  16(R10), [V4.B16]      \/\/ \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c 16 \u0431\u0430\u0439\u0442 \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c          \/\/ \u0421\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0431\u0430\u0439\u0442\u0430\u043c\u0438     VEXT    $15, V4.B16, V3.B16, V5.B16  \/\/ \u0411\u0435\u0440\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0431\u0430\u0439\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430 + \u0442\u0435\u043a\u0443\u0449\u0438\u0439     VUSHR   $4, V5.B16, V6.B16     \/\/ \u0421\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u043d\u0430 4 \u0431\u0438\u0442\u0430 \u0432\u043f\u0440\u0430\u0432\u043e (\u0441\u0442\u0430\u0440\u0448\u0438\u0435 4 \u0431\u0438\u0442\u0430)     VTBL    V6.B16, [V11.B16], V6.B16    \/\/ Lookup \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435     VAND    V5.B16, V18.B16, V7.B16      \/\/ \u0412\u044b\u0434\u0435\u043b\u044f\u0435\u043c \u043c\u043b\u0430\u0434\u0448\u0438\u0435 4 \u0431\u0438\u0442\u0430     VTBL    V7.B16, [V13.B16], V7.B16    \/\/ Lookup \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435     VUSHR   $4, V4.B16, V8.B16     \/\/ \u0421\u0442\u0430\u0440\u0448\u0438\u0435 4 \u0431\u0438\u0442\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430     VTBL    V8.B16, [V15.B16], V8.B16    \/\/ Lookup \u0432 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435          \/\/ \u041a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b lookup'\u043e\u0432     VAND    V6.B16, V7.B16, V9.B16     VAND    V9.B16, V8.B16, V10.B16          \/\/ \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0434\u043b\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 UTF-8     VEXT    $14, V4.B16, V3.B16, V5.B16  \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 -2     VUSHR   $5, V5.B16, V6.B16     \/\/ \u0421\u0434\u0432\u0438\u0433 \u043d\u0430 5 \u0431\u0438\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0442\u0430\u0440\u0448\u0438\u0445 \u0431\u0438\u0442\u043e\u0432     VCMEQ   V12.B16, V6.B16, V6.B16      \/\/ \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 0x07          VEXT    $13, V4.B16, V3.B16, V5.B16  \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 -3     VUSHR   $4, V5.B16, V9.B16     \/\/ \u0421\u0434\u0432\u0438\u0433 \u043d\u0430 4 \u0431\u0438\u0442\u0430     VCMEQ   V18.B16, V9.B16, V9.B16      \/\/ \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 0x0F     VORR    V6.B16, V9.B16, V9.B16       \/\/ \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432          \/\/ \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u0438     VAND    V9.B16, V20.B16, V9.B16      \/\/ \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043c\u0430\u0441\u043a\u0443 0x80     VSUB    V9.B16, V10.B16, V9.B16      \/\/ \u0412\u044b\u0447\u0438\u0442\u0430\u0435\u043c \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430     VMOV    V9.D[0], R1            \/\/ \u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u044b\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b     VMOV    V9.D[1], R2     ORR     R1, R2, R1             \/\/ \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430     CBNZ    R1, no_valid           \/\/ \u0415\u0441\u043b\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0435 \u043d\u043e\u043b\u044c, \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u0430          VMOV    V4.B16, V3.B16         \/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0431\u043b\u043e\u043a \u043a\u0430\u043a \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439     SUB     $16, R11, R11          \/\/ \u0423\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u0431\u0430\u0439\u0442     CMP     $16, R11                     BGE     aligned_loop           \/\/ \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c &gt;= 16 \u0431\u0430\u0439\u0442, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0446\u0438\u043a\u043b      B small_no_const               \/\/ \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043e\u0441\u0442\u0430\u0442\u043a\u0430  small:     \/\/ \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0441\u0442\u0440\u043e\u043a (&lt; 16 \u0431\u0430\u0439\u0442)     CBZ     R11, valid             \/\/ \u0415\u0441\u043b\u0438 \u0431\u0430\u0439\u0442 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c, \u0441\u0442\u0440\u043e\u043a\u0430 \u0432\u0430\u043b\u0438\u0434\u043d\u0430  tail_loop:     \/\/ \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0431\u0430\u0439\u0442\u0443 \u0434\u043b\u044f \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u0441\u0442\u0440\u043e\u043a     MOVBU   (R10), R2              \/\/ \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043e\u0434\u0438\u043d \u0431\u0430\u0439\u0442     AND     $0x80, R2              \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u0442\u0430\u0440\u0448\u0438\u0439 \u0431\u0438\u0442     CBNZ    R2, check_utf8         \/\/ \u0415\u0441\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d, \u043d\u0443\u0436\u043d\u0430 \u043f\u043e\u043b\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 UTF-8     ADD     $1, R10                \/\/ \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0431\u0430\u0439\u0442\u0443     SUB     $1, R11                \/\/ \u0423\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a     CBNZ    R11, tail_loop         \/\/ \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u043f\u043e\u043a\u0430 \u0435\u0441\u0442\u044c \u0431\u0430\u0439\u0442\u044b     B       valid                  \/\/ \u0412\u0441\u0435 \u0431\u0430\u0439\u0442\u044b ASCII - \u0441\u0442\u0440\u043e\u043a\u0430 \u0432\u0430\u043b\u0438\u0434\u043d\u0430  check_utf8:     \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u0434\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 UTF-8     \/\/ (\u0442\u0435 \u0436\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u0447\u0442\u043e \u0438 \u0432\u044b\u0448\u0435)     VMOVQ   $0x0202020202020202, $0x4915012180808080, V11     VMOVQ   $0xcbcbcb8b8383a3e7, $0xcbcbdbcbcbcbcbcb, V13     VMOVQ   $0x0101010101010101, $0x01010101babaaee6, V15     VMOVQ   $0x0F0F0F0F0F0F0F0F, $0x0F0F0F0F0F0F0F0F, V18     VMOVQ   $0x0707070707070707, $0x0707070707070707, V12     VMOVQ   $0xFFFFFFFFFFFFFFFF, $0xFFFFFFFFFFFFFFFF, V14     VMOVQ   $0x7F7F7F7F7F7F7F7F, $0x7F7F7F7F7F7F7F7F, V16     VMOVQ   $0xDFDFDFDFDFDFDFDF, $0xDFDFDFDFDFDFDFDF, V17     VMOVQ   $0x0808080808080808, $0x0808080808080808, V19     VMOVQ   $0x8080808080808080, $0x8080808080808080, V20     VMOVQ   $0x0000000000000000, $0x0000000000000000, V30     VMOVQ   $0x0000000000000000, $0x0000000000000000, V3  small_no_const:     \/\/ \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0441\u0442\u0430\u0442\u043a\u0430 &lt; 16 \u0431\u0430\u0439\u0442     SUB $16, R10, R10              \/\/ \u041e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u0441\u044f \u043d\u0430 16 \u0431\u0430\u0439\u0442 \u043d\u0430\u0437\u0430\u0434     ADD R11, R10, R10              \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u0431\u0430\u0439\u0442     VLD1.P  16(R10), [V4.B16]      \/\/ \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c 16 \u0431\u0430\u0439\u0442 (\u0432\u043a\u043b\u044e\u0447\u0430\u044f \"\u043c\u0443\u0441\u043e\u0440\")      \/\/ \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043b\u0438\u0448\u043d\u0438\u0445 \u0431\u0430\u0439\u0442     ADR  shift_table, R2           \/\/ \u0410\u0434\u0440\u0435\u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432     MOVW R11, R3                   \/\/ \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 \u0431\u0430\u0439\u0442     LSL $2,  R3                    \/\/ \u0423\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u043d\u0430 4 (\u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438)     ADD R3, R2                     \/\/ \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0430\u0434\u0440\u0435\u0441 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430     B (R2)                         \/\/ \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443  shift_table:     \/\/ \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 0-15 \u0431\u0430\u0439\u0442     B do_shift_0                   \/\/ 0 \u0431\u0430\u0439\u0442 - \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c ASCII \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438     B do_shift_1                   \/\/ 1 \u0431\u0430\u0439\u0442 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439     B do_shift_2                   \/\/ 2 \u0431\u0430\u0439\u0442\u0430 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445     B do_shift_3                   \/\/ 3 \u0431\u0430\u0439\u0442\u0430 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445     B do_shift_4<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-465182","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/465182","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=465182"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/465182\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=465182"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=465182"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=465182"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}