181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch/*
281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * Copyright (C) 2011 Apple Inc. All rights reserved.
381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch *
581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * Redistribution and use in source and binary forms, with or without
681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * modification, are permitted provided that the following conditions
781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * are met:
881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * 1. Redistributions of source code must retain the above copyright
981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch *    notice, this list of conditions and the following disclaimer.
1081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * 2. Redistributions in binary form must reproduce the above copyright
1181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch *    notice, this list of conditions and the following disclaimer in the
1281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch *    documentation and/or other materials provided with the distribution.
1381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch *
1481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
1581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
1881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
1981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
2081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
2181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
2281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch */
2681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
2781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#ifndef TextCodecASCIIFastPath_h
2881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#define TextCodecASCIIFastPath_h
2981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
3081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <stdint.h>
3181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
3281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochnamespace WebCore {
3381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
3481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// Assuming that a pointer is the size of a "machine word", then
3581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// uintptr_t is an integer type that is also a machine word.
3681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochtypedef uintptr_t MachineWord;
3781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
3881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// This constant has type uintptr_t since we will use it to align
3981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// pointers. Not because MachineWord is uintptr_t.
4081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochconst uintptr_t machineWordAlignmentMask = sizeof(MachineWord) - 1;
4181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
4281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochtemplate<size_t size> struct NonASCIIMask;
4381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochtemplate<> struct NonASCIIMask<4> {
4481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    static unsigned value() { return 0x80808080U; }
4581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch};
4681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochtemplate<> struct NonASCIIMask<8> {
4781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    static unsigned long long value() { return 0x8080808080808080ULL; }
4881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch};
4981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
5081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochtemplate<size_t size> struct UCharByteFiller;
5181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochtemplate<> struct UCharByteFiller<4> {
5281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    static void copy(UChar* destination, const uint8_t* source)
5381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    {
5481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        destination[0] = source[0];
5581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        destination[1] = source[1];
5681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        destination[2] = source[2];
5781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        destination[3] = source[3];
5881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
5981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch};
6081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochtemplate<> struct UCharByteFiller<8> {
6181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    static void copy(UChar* destination, const uint8_t* source)
6281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    {
6381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        destination[0] = source[0];
6481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        destination[1] = source[1];
6581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        destination[2] = source[2];
6681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        destination[3] = source[3];
6781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        destination[4] = source[4];
6881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        destination[5] = source[5];
6981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        destination[6] = source[6];
7081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        destination[7] = source[7];
7181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
7281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch};
7381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
7481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochinline bool isAllASCII(MachineWord word)
7581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
7681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return !(word & NonASCIIMask<sizeof(MachineWord)>::value());
7781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
7881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
7981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochinline void copyASCIIMachineWord(UChar* destination, const uint8_t* source)
8081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
8181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    UCharByteFiller<sizeof(MachineWord)>::copy(destination, source);
8281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
8381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
8481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochinline bool isAlignedToMachineWord(const void* pointer)
8581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
8681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return !(reinterpret_cast<uintptr_t>(pointer) & machineWordAlignmentMask);
8781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
8881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
8981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochtemplate<typename T> inline T* alignToMachineWord(T* pointer)
9081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
9181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return reinterpret_cast<T*>(reinterpret_cast<uintptr_t>(pointer) & ~machineWordAlignmentMask);
9281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
9381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
9481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} // namespace WebCore
9581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
9681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif // TextCodecASCIIFastPath_h
97