os/ossrv/genericopenlibs/liboil/src/utf8/utf8_fast.c
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 /*
     2  * LIBOIL - Library of Optimized Inner Loops
     3  * Copyright (c) 2004 David A. Schleef <ds@schleef.org>
     4  * All rights reserved.
     5  *
     6  * Redistribution and use in source and binary forms, with or without
     7  * modification, are permitted provided that the following conditions
     8  * are met:
     9  * 1. Redistributions of source code must retain the above copyright
    10  *    notice, this list of conditions and the following disclaimer.
    11  * 2. Redistributions in binary form must reproduce the above copyright
    12  *    notice, this list of conditions and the following disclaimer in the
    13  *    documentation and/or other materials provided with the distribution.
    14  * 
    15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
    16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
    17  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    18  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
    19  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
    20  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    21  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
    23  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
    24  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    25  * POSSIBILITY OF SUCH DAMAGE.
    26  */
    27 //Portions Copyright (c)  2008-2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
    28 
    29 #ifdef HAVE_CONFIG_H
    30 #include "config.h"
    31 #endif
    32 
    33 #include <liboil/liboil.h>
    34 #include "liboil/utf8/utf8.h"
    35 
    36 
    37 #ifdef HAVE_UNALIGNED_ACCESS
    38 static void
    39 utf8_validate_fast (int32_t *d_1, uint8_t *s, int n)
    40 {
    41   int i;
    42   int extra_bytes;
    43   int mask;
    44 
    45   i=0;
    46   while (i<n) {
    47     if (i < n-3 && (*(uint32_t *)(s+i) & 0x80808080) == 0) {
    48       i+=4;
    49       continue;
    50     }
    51     if (s[i] < 128) {
    52       i++;
    53       continue;
    54     }
    55     if ((s[i] & 0xe0) == 0xc0) {
    56       extra_bytes = 1;
    57       mask = 0x7f;
    58     } else if ((s[i] & 0xf0) == 0xe0) {
    59       extra_bytes = 2;
    60       mask = 0x1f;
    61     } else if ((s[i] & 0xf8) == 0xf0) {
    62       extra_bytes = 3;
    63       mask = 0x0f;
    64     } else {
    65       goto error;
    66     }
    67     if (i + extra_bytes >= n) goto error;
    68     while(extra_bytes--) {
    69       i++;
    70       if ((s[i] & 0xc0) != 0x80) goto error;
    71     }
    72     i++;
    73   }
    74 
    75 error:
    76   d_1[0] = i;
    77 }
    78 OIL_DEFINE_IMPL (utf8_validate_fast, utf8_validate);
    79 #endif
    80 
    81 static void
    82 utf8_validate_fast2 (int32_t *d_1, uint8_t *s, int n)
    83 {
    84   int i;
    85   uint8_t x;
    86 
    87   i=0;
    88   while (i<n) {
    89     x = s[i];
    90     if (!(x & 0x80)) {
    91       i++;
    92       continue;
    93     }
    94     x <<= 1;
    95     if (!(x & 0x80)) {
    96       goto error;
    97     }
    98     x <<= 1;
    99     if (!(x & 0x80)) {
   100       if (i + 1 >= n) goto error;
   101       i++;
   102       if ((s[i] & 0xc0) != 0x80) goto error;
   103       i++;
   104       continue;
   105     }
   106     x <<= 1;
   107     if (!(x & 0x80)) {
   108       if (i + 2 >= n) goto error;
   109       i++;
   110       if ((s[i] & 0xc0) != 0x80) goto error;
   111       i++;
   112       if ((s[i] & 0xc0) != 0x80) goto error;
   113       i++;
   114       continue;
   115     }
   116     x <<= 1;
   117     if (!(x & 0x80)) {
   118       if (i + 3 >= n) goto error;
   119       i++;
   120       if ((s[i] & 0xc0) != 0x80) goto error;
   121       i++;
   122       if ((s[i] & 0xc0) != 0x80) goto error;
   123       i++;
   124       if ((s[i] & 0xc0) != 0x80) goto error;
   125       i++;
   126       continue;
   127     }
   128     goto error;
   129   }
   130 
   131 error:
   132   d_1[0] = i;
   133 }
   134 OIL_DEFINE_IMPL (utf8_validate_fast2, utf8_validate);
   135 
   136 #ifdef HAVE_UNALIGNED_ACCESS
   137 static void
   138 utf8_validate_fast3 (int32_t *d_1, uint8_t *s, int n)
   139 {
   140   int i;
   141   uint8_t x;
   142 
   143   i=0;
   144   while (i<n) {
   145     if (i < n-3 && (*(uint32_t *)(s+i) & 0x80808080) == 0) {
   146       i+=4;
   147       continue;
   148     }
   149     x = s[i];
   150     if (!(x & 0x80)) {
   151       i++;
   152       continue;
   153     }
   154     if (!(x & 0x40)) {
   155       goto error;
   156     }
   157     if (!(x & 0x20)) {
   158       if (i + 1 >= n) goto error;
   159       i++;
   160       if ((s[i] & 0xc0) != 0x80) goto error;
   161       i++;
   162       continue;
   163     }
   164     if (!(x & 0x10)) {
   165       if (i + 2 >= n) goto error;
   166       i++;
   167       if ((s[i] & 0xc0) != 0x80) goto error;
   168       i++;
   169       if ((s[i] & 0xc0) != 0x80) goto error;
   170       i++;
   171       continue;
   172     }
   173     if (!(x & 0x08)) {
   174       if (i + 3 >= n) goto error;
   175       i++;
   176       if ((s[i] & 0xc0) != 0x80) goto error;
   177       i++;
   178       if ((s[i] & 0xc0) != 0x80) goto error;
   179       i++;
   180       if ((s[i] & 0xc0) != 0x80) goto error;
   181       i++;
   182       continue;
   183     }
   184     goto error;
   185   }
   186 
   187 error:
   188   d_1[0] = i;
   189 }
   190 OIL_DEFINE_IMPL (utf8_validate_fast3, utf8_validate);
   191 #endif
   192 
   193 static uint8_t utf8_table[256] = {
   194   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   195   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   196   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   197   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   198   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   199   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   200   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   201   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   202   8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
   203   8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
   204   8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
   205   8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
   206   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
   207   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
   208   2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
   209   3, 3, 3, 3, 3, 3, 3, 3, 8, 8, 8, 8, 8, 8, 8, 8
   210 };
   211   
   212 static void
   213 utf8_validate_lookup (int32_t *d_1, uint8_t *s, int n)
   214 {
   215   int i;
   216   uint8_t x;
   217 
   218   i=0;
   219   while (i<n) {
   220     x = utf8_table[s[i]];
   221     if (x > 0) {
   222       if (x == 8 || i + x >= n) goto error;
   223       while (x>0) {
   224         i++;
   225         if ((s[i] & 0xc0) != 0x80) goto error;
   226         x--;
   227       }
   228     }
   229     i++;
   230   }
   231 
   232 error:
   233   d_1[0] = i;
   234 }
   235 OIL_DEFINE_IMPL (utf8_validate_lookup, utf8_validate);
   236 
   237 #if 0
   238 static void
   239 utf8_validate_asm1 (int32_t *d_1, uint8_t *s, int n)
   240 {
   241   uint8_t *tmp = s;
   242 
   243   asm (
   244       "1:\n"
   245       "  movb (%%eax), %%bl\n"
   246       "  testb %%bl, %%bl\n"
   247       //"  jns 3f\n"
   248       "  js 2f\n"
   249       "3:\n"
   250       "  addl $1, %%eax\n"
   251       "  subl $1, %%ecx\n"
   252       "  jne 1b\n"
   253       "2:\n"
   254     : "+a" (tmp), "+c" (n)
   255     :
   256     : "ebx" );
   257 
   258   d_1[0] = tmp - s;
   259 }
   260 OIL_DEFINE_IMPL (utf8_validate_asm1, utf8_validate);
   261 
   262 static void
   263 utf8_validate_asm2 (int32_t *d_1, uint8_t *s, int n)
   264 {
   265   uint8_t *tmp = s;
   266 
   267   asm (
   268       "1:\n"
   269       "  testl $0x80808080, (%%eax)\n"
   270       "  jne 2f\n"
   271       "  testl $0x80808080, 4(%%eax)\n"
   272       "  jne 2f\n"
   273       "  testl $0x80808080, 8(%%eax)\n"
   274       "  jne 2f\n"
   275       "  testl $0x80808080, 12(%%eax)\n"
   276       "  jne 2f\n"
   277       "  addl $16, %%eax\n"
   278       "  subl $16, %%ecx\n"
   279       "  jge 1b\n"
   280       "  jl 4f\n"
   281       "2:\n"
   282       "  movb (%%eax), %%bl\n"
   283       "  testb %%bl, %%bl\n"
   284       "  js 4f\n"
   285       "3:\n"
   286       "  addl $1, %%eax\n"
   287       "  subl $1, %%ecx\n"
   288       "  jne 1b\n"
   289       "4:\n"
   290     : "+a" (tmp), "+c" (n)
   291     :
   292     : "ebx" );
   293 
   294   d_1[0] = tmp - s;
   295 }
   296 OIL_DEFINE_IMPL (utf8_validate_asm2, utf8_validate);
   297 #endif
   298 
   299 
   300 #ifdef HAVE_UNALIGNED_ACCESS
   301 #ifdef	__SYMBIAN32__
   302  
   303 OilFunctionImpl* __oil_function_impl_utf8_validate_fast() {
   304 		return &_oil_function_impl_utf8_validate_fast;
   305 }
   306 #endif
   307 #endif
   308 
   309 #ifdef	__SYMBIAN32__
   310  
   311 OilFunctionImpl* __oil_function_impl_utf8_validate_fast2() {
   312 		return &_oil_function_impl_utf8_validate_fast2;
   313 }
   314 #endif
   315 
   316 #ifdef HAVE_UNALIGNED_ACCESS
   317 #ifdef	__SYMBIAN32__
   318  
   319 OilFunctionImpl* __oil_function_impl_utf8_validate_fast3() {
   320 		return &_oil_function_impl_utf8_validate_fast3;
   321 }
   322 #endif
   323 #endif
   324 
   325 #ifdef	__SYMBIAN32__
   326  
   327 OilFunctionImpl* __oil_function_impl_utf8_validate_lookup() {
   328 		return &_oil_function_impl_utf8_validate_lookup;
   329 }
   330 #endif
   331 
   332 #if 0
   333 #ifdef	__SYMBIAN32__
   334  
   335 OilFunctionImpl* __oil_function_impl_utf8_validate_asm1() {
   336 		return &_oil_function_impl_utf8_validate_asm1;
   337 }
   338 #endif
   339 
   340 
   341 #ifdef	__SYMBIAN32__
   342  
   343 OilFunctionImpl* __oil_function_impl_utf8_validate_asm2() {
   344 		return &_oil_function_impl_utf8_validate_asm2;
   345 }
   346 #endif
   347 #endif