View difference between Paste ID: tXtiJKuE and YDWg0Lsb
SHOW: | | - or go back to the newest paste.
1
#include <stdio.h>
2
#include <time.h>
3
#include <vector>
4
#include <string>
5
#include <algorithm>
6
#include <smmintrin.h>
7
#include <stdint.h>
8
#include <string.h>
9
#ifdef _MSC_VER
10
	#define ALIGN(n) __declspec(align(n))
11
#else
12
	#define ALIGN(n) __attribute__((aligned(n)))
13
#endif
14
15
typedef unsigned int UINT32;
16
17
//=============================================== original =================================================
18
19
inline UINT32 GetIP(const char *p)
20
{
21
    UINT32 dwIP=0,dwIP_Part=0;
22
    while(true)
23
    {
24
        if(p[0] == 0)
25
        {
26
            dwIP = (dwIP << 8) | dwIP_Part;
27
            break;
28
        }
29
        if(p[0]=='.') 
30
        {       
31
            dwIP = (dwIP << 8) | dwIP_Part;                     
32
            dwIP_Part = 0;
33
           p++;
34
        }
35
        dwIP_Part = (dwIP_Part*10)+(p[0]-'0');
36
        p++;
37
    }
38
    return dwIP;
39
}
40
41
//=============================================== stgatilov =================================================
42
43
__m128i shuffleTable[65536];    //can be reduced 256x times, see solution by @IwillnotexistIdonotexist below
44
void MyInit() {
45
    memset(shuffleTable, -1, sizeof(shuffleTable));
46
    int len[4];
47
    for (len[0] = 1; len[0] <= 3; len[0]++)
48
        for (len[1] = 1; len[1] <= 3; len[1]++)
49
            for (len[2] = 1; len[2] <= 3; len[2]++)
50
                for (len[3] = 1; len[3] <= 3; len[3]++) {
51
                    int slen = len[0] + len[1] + len[2] + len[3] + 4;
52
                    int rem = 16 - slen;
53
                    for (int rmask = 0; rmask < 1<<rem; rmask++) {
54
//                    { int rmask = (1<<rem)-1;    //note: only maximal rmask is possible if strings are zero-padded
55
                        int mask = 0;
56
                        char shuf[16] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
57
                        int pos = 0;
58
                        for (int i = 0; i < 4; i++) {
59
                            for (int j = 0; j < len[i]; j++) {
60
                                shuf[(3-i) * 4 + (len[i]-1-j)] = pos;
61
                                pos++;
62
                            }
63
                            mask ^= (1<<pos);
64
                            pos++;
65
                        }
66
                        mask ^= (rmask<<slen);
67
                        _mm_store_si128(&shuffleTable[mask], _mm_loadu_si128((__m128i*)shuf));
68
                    }
69
                }
70
}
71
inline UINT32 MyGetIP(const char *str) {
72
	__m128i input = _mm_lddqu_si128((const __m128i*)str);
73
//	for (int i = 0; i < 16; i++) printf("%c ", input.m128i_u8[i]); printf("\n");
74
	input = _mm_sub_epi8(input, _mm_set1_epi8('0'));
75
//	for (int i = 0; i < 16; i++) printf("%d ", int(input.m128i_u8[i])); printf("\n");
76
	__m128i cmp = input;
77
//	for (int i = 0; i < 16; i++) printf("%c", cmp.m128i_i8[i] < 0 ? 'X' : '.'); printf("\n");
78
	uint64_t mask = _mm_movemask_epi8(cmp);
79
//	printf("%d\n", mask);
80
	__m128i shuf = shuffleTable[mask];
81
//	for (int i = 0; i < 16; i++) printf("%d ", int(shuf.m128i_i8[i])); printf("\n");
82
	__m128i arr = _mm_shuffle_epi8(input, shuf);
83
//	for (int i = 0; i < 16; i++) printf("%d ", int(arr.m128i_u8[i])); printf("\n");
84
	__m128i coeffs = _mm_set_epi8(0, 100, 10, 1, 0, 100, 10, 1, 0, 100, 10, 1, 0, 100, 10, 1);
85
	__m128i prod = _mm_maddubs_epi16(coeffs, arr);
86
//	for (int i = 0; i < 8; i++) printf("%d ", int(prod.m128i_u16[i])); printf("\n");
87
	prod = _mm_hadd_epi16(prod, prod);
88
//	for (int i = 0; i < 4; i++) printf("%d ", int(prod.m128i_u16[i])); printf("\n");
89
	prod = _mm_shuffle_epi8(prod, _mm_set_epi8(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6, 4, 2, 0));
90
//	for (int i = 0; i < 4; i++) printf("%d ", int(prod.m128i_u8[i])); printf("\n");
91
	return _mm_extract_epi32(prod, 0);
92
//	return (UINT32(_mm_extract_epi16(prod, 1)) << 16) + UINT32(_mm_extract_epi16(prod, 0));
93
}
94
95
//==================================== @IwillnotexistIdonotexist ===============================================
96
//lookup table is compressed to 4Kb
97
//taken from http://pastebin.com/XJ7w9nq1
98
99
ALIGN(16) const char TBL[256][16] = {
100
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
101
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
102
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
103
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
104
	{ 10,   9,  -1,  -1,   7,   6,   5,  -1,   3,   2,  -1,  -1,   0,  -1,  -1,  -1},
105
	{ 10,   9,  -1,  -1,   7,   6,   5,  -1,   3,  -1,  -1,  -1,   1,   0,  -1,  -1},
106
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
107
	{ 11,  10,  -1,  -1,   8,   7,   6,  -1,   4,   3,   2,  -1,   0,  -1,  -1,  -1},
108
	{ 11,  10,  -1,  -1,   8,   7,   6,  -1,   4,   3,  -1,  -1,   1,   0,  -1,  -1},
109
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
110
	{ 11,  10,  -1,  -1,   8,   7,   6,  -1,   4,  -1,  -1,  -1,   2,   1,   0,  -1},
111
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
112
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
113
	{ 10,   9,  -1,  -1,   7,   6,  -1,  -1,   4,   3,   2,  -1,   0,  -1,  -1,  -1},
114
	{ 10,   9,  -1,  -1,   7,   6,  -1,  -1,   4,   3,  -1,  -1,   1,   0,  -1,  -1},
115
	{ 12,  11,  -1,  -1,   9,   8,   7,  -1,   5,   4,   3,  -1,   1,   0,  -1,  -1},
116
	{ 10,   9,  -1,  -1,   7,   6,  -1,  -1,   4,  -1,  -1,  -1,   2,   1,   0,  -1},
117
	{ 12,  11,  -1,  -1,   9,   8,   7,  -1,   5,   4,  -1,  -1,   2,   1,   0,  -1},
118
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
119
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
120
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
121
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
122
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
123
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
124
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
125
	{ 12,  11,  10,  -1,   8,  -1,  -1,  -1,   6,   5,   4,  -1,   2,   1,   0,  -1},
126
	{ 11,  10,  -1,  -1,   8,   7,  -1,  -1,   5,   4,   3,  -1,   1,   0,  -1,  -1},
127
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
128
	{ 11,  10,  -1,  -1,   8,   7,  -1,  -1,   5,   4,  -1,  -1,   2,   1,   0,  -1},
129
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
130
	{ 13,  12,  -1,  -1,  10,   9,   8,  -1,   6,   5,   4,  -1,   2,   1,   0,  -1},
131
	{ 10,   9,  -1,  -1,   7,  -1,  -1,  -1,   5,   4,   3,  -1,   1,   0,  -1,  -1},
132
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
133
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
134
	{ 10,   9,  -1,  -1,   7,  -1,  -1,  -1,   5,   4,  -1,  -1,   2,   1,   0,  -1},
135
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
136
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
137
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
138
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
139
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
140
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
141
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
142
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
143
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
144
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
145
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
146
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
147
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
148
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
149
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
150
	{  8,   7,   6,  -1,   4,  -1,  -1,  -1,   2,  -1,  -1,  -1,   0,  -1,  -1,  -1},
151
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
152
	{ 12,  11,  -1,  -1,   9,   8,  -1,  -1,   6,   5,   4,  -1,   2,   1,   0,  -1},
153
	{ 11,  -1,  -1,  -1,   9,   8,   7,  -1,   5,   4,   3,  -1,   1,   0,  -1,  -1},
154
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
155
	{ 11,  -1,  -1,  -1,   9,   8,   7,  -1,   5,   4,  -1,  -1,   2,   1,   0,  -1},
156
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
157
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
158
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
159
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
160
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
161
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
162
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
163
	{ 11,  10,  -1,  -1,   8,  -1,  -1,  -1,   6,   5,   4,  -1,   2,   1,   0,  -1},
164
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
165
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
166
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
167
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
168
	{  8,   7,  -1,  -1,   5,   4,  -1,  -1,   2,  -1,  -1,  -1,   0,  -1,  -1,  -1},
169
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
170
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
171
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
172
	{  8,   7,  -1,  -1,   5,  -1,  -1,  -1,   3,   2,  -1,  -1,   0,  -1,  -1,  -1},
173
	{  8,   7,  -1,  -1,   5,  -1,  -1,  -1,   3,  -1,  -1,  -1,   1,   0,  -1,  -1},
174
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
175
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
176
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
177
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
178
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
179
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
180
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
181
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
182
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
183
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
184
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
185
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
186
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
187
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
188
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
189
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
190
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
191
	{ 11,  -1,  -1,  -1,   9,   8,  -1,  -1,   6,   5,   4,  -1,   2,   1,   0,  -1},
192
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
193
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
194
	{  6,  -1,  -1,  -1,   4,  -1,  -1,  -1,   2,  -1,  -1,  -1,   0,  -1,  -1,  -1},
195
	{  9,   8,   7,  -1,   5,   4,  -1,  -1,   2,  -1,  -1,  -1,   0,  -1,  -1,  -1},
196
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
197
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
198
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
199
	{  9,   8,   7,  -1,   5,  -1,  -1,  -1,   3,   2,  -1,  -1,   0,  -1,  -1,  -1},
200
	{  9,   8,   7,  -1,   5,  -1,  -1,  -1,   3,  -1,  -1,  -1,   1,   0,  -1,  -1},
201
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
202
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
203
	{  8,  -1,  -1,  -1,   6,   5,   4,  -1,   2,  -1,  -1,  -1,   0,  -1,  -1,  -1},
204
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
205
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
206
	{ 12,  -1,  -1,  -1,  10,   9,   8,  -1,   6,   5,   4,  -1,   2,   1,   0,  -1},
207
	{  8,  -1,  -1,  -1,   6,   5,  -1,  -1,   3,   2,  -1,  -1,   0,  -1,  -1,  -1},
208
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
209
	{  8,  -1,  -1,  -1,   6,   5,  -1,  -1,   3,  -1,  -1,  -1,   1,   0,  -1,  -1},
210
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
211
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
212
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
213
	{ 11,  10,   9,  -1,   7,   6,   5,  -1,   3,   2,  -1,  -1,   0,  -1,  -1,  -1},
214
	{ 11,  10,   9,  -1,   7,   6,   5,  -1,   3,  -1,  -1,  -1,   1,   0,  -1,  -1},
215
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
216
	{  8,  -1,  -1,  -1,   6,  -1,  -1,  -1,   4,   3,   2,  -1,   0,  -1,  -1,  -1},
217
	{  8,  -1,  -1,  -1,   6,  -1,  -1,  -1,   4,   3,  -1,  -1,   1,   0,  -1,  -1},
218
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
219
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
220
	{  8,  -1,  -1,  -1,   6,  -1,  -1,  -1,   4,  -1,  -1,  -1,   2,   1,   0,  -1},
221
	{ 11,  10,   9,  -1,   7,   6,  -1,  -1,   4,   3,   2,  -1,   0,  -1,  -1,  -1},
222
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
223
	{ 11,  10,   9,  -1,   7,   6,  -1,  -1,   4,   3,  -1,  -1,   1,   0,  -1,  -1},
224
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
225
	{ 11,  10,   9,  -1,   7,   6,  -1,  -1,   4,  -1,  -1,  -1,   2,   1,   0,  -1},
226
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
227
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
228
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
229
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
230
	{  9,   8,  -1,  -1,   6,   5,   4,  -1,   2,  -1,  -1,  -1,   0,  -1,  -1,  -1},
231
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
232
	{ 14,  13,  12,  -1,  10,   9,   8,  -1,   6,   5,   4,  -1,   2,   1,   0,  -1},
233
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
234
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
235
	{  9,   8,  -1,  -1,   6,   5,  -1,  -1,   3,   2,  -1,  -1,   0,  -1,  -1,  -1},
236
	{  9,   8,  -1,  -1,   6,   5,  -1,  -1,   3,  -1,  -1,  -1,   1,   0,  -1,  -1},
237
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
238
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
239
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
240
	{ 11,  10,   9,  -1,   7,  -1,  -1,  -1,   5,   4,   3,  -1,   1,   0,  -1,  -1},
241
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
242
	{ 11,  10,   9,  -1,   7,  -1,  -1,  -1,   5,   4,  -1,  -1,   2,   1,   0,  -1},
243
	{  9,   8,  -1,  -1,   6,  -1,  -1,  -1,   4,   3,   2,  -1,   0,  -1,  -1,  -1},
244
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
245
	{  9,   8,  -1,  -1,   6,  -1,  -1,  -1,   4,   3,  -1,  -1,   1,   0,  -1,  -1},
246
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
247
	{  9,   8,  -1,  -1,   6,  -1,  -1,  -1,   4,  -1,  -1,  -1,   2,   1,   0,  -1},
248
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
249
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
250
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
251
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
252
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
253
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
254
	{ 10,  -1,  -1,  -1,   8,   7,   6,  -1,   4,   3,   2,  -1,   0,  -1,  -1,  -1},
255
	{ 10,  -1,  -1,  -1,   8,   7,   6,  -1,   4,   3,  -1,  -1,   1,   0,  -1,  -1},
256
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
257
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
258
	{ 10,  -1,  -1,  -1,   8,   7,   6,  -1,   4,  -1,  -1,  -1,   2,   1,   0,  -1},
259
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
260
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
261
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
262
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
263
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
264
	{  7,   6,  -1,  -1,   4,  -1,  -1,  -1,   2,  -1,  -1,  -1,   0,  -1,  -1,  -1},
265
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
266
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
267
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
268
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
269
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
270
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
271
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
272
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
273
	{ 10,  -1,  -1,  -1,   8,   7,  -1,  -1,   5,   4,   3,  -1,   1,   0,  -1,  -1},
274
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
275
	{ 10,  -1,  -1,  -1,   8,   7,  -1,  -1,   5,   4,  -1,  -1,   2,   1,   0,  -1},
276
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
277
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
278
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
279
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
280
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
281
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
282
	{  7,  -1,  -1,  -1,   5,   4,  -1,  -1,   2,  -1,  -1,  -1,   0,  -1,  -1,  -1},
283
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
284
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
285
	{ 10,   9,   8,  -1,   6,   5,   4,  -1,   2,  -1,  -1,  -1,   0,  -1,  -1,  -1},
286
	{  7,  -1,  -1,  -1,   5,  -1,  -1,  -1,   3,   2,  -1,  -1,   0,  -1,  -1,  -1},
287
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
288
	{  7,  -1,  -1,  -1,   5,  -1,  -1,  -1,   3,  -1,  -1,  -1,   1,   0,  -1,  -1},
289
	{ 10,   9,   8,  -1,   6,   5,  -1,  -1,   3,   2,  -1,  -1,   0,  -1,  -1,  -1},
290
	{ 10,   9,   8,  -1,   6,   5,  -1,  -1,   3,  -1,  -1,  -1,   1,   0,  -1,  -1},
291
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
292
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
293
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
294
	{ 13,  12,  11,  -1,   9,   8,   7,  -1,   5,   4,   3,  -1,   1,   0,  -1,  -1},
295
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
296
	{ 13,  12,  11,  -1,   9,   8,   7,  -1,   5,   4,  -1,  -1,   2,   1,   0,  -1},
297
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
298
	{ 10,   9,   8,  -1,   6,  -1,  -1,  -1,   4,   3,   2,  -1,   0,  -1,  -1,  -1},
299
	{ 10,   9,   8,  -1,   6,  -1,  -1,  -1,   4,   3,  -1,  -1,   1,   0,  -1,  -1},
300
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
301
	{ 10,   9,   8,  -1,   6,  -1,  -1,  -1,   4,  -1,  -1,  -1,   2,   1,   0,  -1},
302
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
303
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
304
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
305
	{  9,  -1,  -1,  -1,   7,   6,   5,  -1,   3,   2,  -1,  -1,   0,  -1,  -1,  -1},
306
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
307
	{  9,  -1,  -1,  -1,   7,   6,   5,  -1,   3,  -1,  -1,  -1,   1,   0,  -1,  -1},
308
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
309
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
310
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
311
	{ 10,  -1,  -1,  -1,   8,  -1,  -1,  -1,   6,   5,   4,  -1,   2,   1,   0,  -1},
312
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
313
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
314
	{  9,  -1,  -1,  -1,   7,   6,  -1,  -1,   4,   3,   2,  -1,   0,  -1,  -1,  -1},
315
	{  9,  -1,  -1,  -1,   7,   6,  -1,  -1,   4,   3,  -1,  -1,   1,   0,  -1,  -1},
316
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
317
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
318
	{  9,  -1,  -1,  -1,   7,   6,  -1,  -1,   4,  -1,  -1,  -1,   2,   1,   0,  -1},
319
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
320
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
321
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
322
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
323
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
324
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
325
	{ 12,  11,  10,  -1,   8,   7,   6,  -1,   4,   3,   2,  -1,   0,  -1,  -1,  -1},
326
	{ 12,  11,  10,  -1,   8,   7,   6,  -1,   4,   3,  -1,  -1,   1,   0,  -1,  -1},
327
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
328
	{ 12,  11,  10,  -1,   8,   7,   6,  -1,   4,  -1,  -1,  -1,   2,   1,   0,  -1},
329
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
330
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
331
	{ 13,  12,  11,  -1,   9,   8,  -1,  -1,   6,   5,   4,  -1,   2,   1,   0,  -1},
332
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
333
	{  9,  -1,  -1,  -1,   7,  -1,  -1,  -1,   5,   4,   3,  -1,   1,   0,  -1,  -1},
334
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
335
	{  9,  -1,  -1,  -1,   7,  -1,  -1,  -1,   5,   4,  -1,  -1,   2,   1,   0,  -1},
336
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
337
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
338
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
339
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
340
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
341
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
342
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
343
	{ 12,  11,  10,  -1,   8,   7,  -1,  -1,   5,   4,   3,  -1,   1,   0,  -1,  -1},
344
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
345
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
346
	{ 12,  11,  10,  -1,   8,   7,  -1,  -1,   5,   4,  -1,  -1,   2,   1,   0,  -1},
347
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
348
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
349
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
350
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
351
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
352
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
353
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
354
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
355
	{ -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1},
356
};
357
358
inline unsigned perfecthash(unsigned v){
359
	/* DEEP MAGIC BEGINS HERE. */
360-
	return (unsigned)_mm_crc32_u32(0,v*0x000020de)>>24;
360+
	return (unsigned)(v*0x008d981a)>>24;
361
}
362
363
inline UINT32 MyGetIP_comp(const char *str) {
364
  __m128i input = _mm_lddqu_si128((const __m128i*)str);   //"192.167.1.3"
365
  uint64_t zm = _mm_movemask_epi8(_mm_cmpeq_epi8(input, _mm_setzero_si128()));
366
  zm ^= (zm-1);                                           //(1<<12) - 1
367
  input = _mm_sub_epi8(input, _mm_set1_epi8('0'));        //1 9 2 254 1 6 7 254 1 254 3 208 245 0 8 40
368
  __m128i cmp = input;                                    //...X...X.X.XX...  (signs)
369
  uint64_t mask = _mm_movemask_epi8(cmp);                 //6792 - magic index
370
  mask &= zm;
371
  uint64_t hashmask = perfecthash(mask);
372
  __m128i shuf = ((const __m128i*)TBL)[hashmask];         //10 -1 -1 -1 8 -1 -1 -1 6 5 4 -1 2 1 0 -1 
373
  __m128i arr = _mm_shuffle_epi8(input, shuf);            //3 0 0 0 | 1 0 0 0 | 7 6 1 0 | 2 9 1 0 
374
  __m128i coeffs = _mm_set_epi8(0, 100, 10, 1, 0, 100, 10, 1, 0, 100, 10, 1, 0, 100, 10, 1);
375
  __m128i prod = _mm_maddubs_epi16(coeffs, arr);          //3 0 | 1 0 | 67 100 | 92 100 
376
  prod = _mm_hadd_epi16(prod, prod);                      //3 | 1 | 167 | 192 | ? | ? | ? | ?
377
  __m128i imm = _mm_set_epi8(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6, 4, 2, 0);
378
  prod = _mm_shuffle_epi8(prod, imm);                     //3 1 167 192 0 0 0 0 0 0 0 0 0 0 0 0
379
  return _mm_extract_epi32(prod, 0);
380
}
381
382
//========================================== TESTING =================================================
383
384
static const int CNT = 16<<10;
385
386
int main() {
387
  MyInit();
388
  printf("%08X\n", MyGetIP("192.167.1.3"));
389
390
  std::vector<std::string> samples;
391
  for (int i = 0; i < CNT; i++) {
392
    std::string str;
393
    for (int j = 0; j < 4; j++) {
394
      if (j) str += '.';
395
      int x = rand() % 256;
396
      char qq[16];
397
      sprintf(qq, "%d", x);
398
      str += qq;
399
    }
400
    samples.push_back(str);
401
402
//    printf("%s\n", samples[i].c_str());
403
	auto a = GetIP(samples.back().c_str());
404
	auto b = MyGetIP(samples.back().c_str());
405
  auto c = MyGetIP_comp(samples.back().c_str());
406
	if (a != b || a != c || b != c)
407
      printf("%s: %08X vs %08X vs %08X\n", samples[i].c_str(), a, b, c);
408
		
409
  }
410
411
412
{
413
  int start = clock();
414
  int sum = 0;
415
  for (int i = 0; i < 1<<27; i++) {
416
      const char *input = samples[(i+0) & (CNT-1)].c_str();
417
      sum += MyGetIP(input);
418
  }
419
  int elapsed = clock() - start;
420
  printf("Time = %0.3lf   (%d)\n", double(elapsed) / CLOCKS_PER_SEC, sum);
421
}
422
{
423
  int start = clock();
424
  int sum = 0;
425
  for (int i = 0; i < 1<<27; i++) {
426
      const char *input = samples[(i+0) & (CNT-1)].c_str();
427
      sum += MyGetIP_comp(input);
428
  }
429
  int elapsed = clock() - start;
430
  printf("Time = %0.3lf   (%d)\n", double(elapsed) / CLOCKS_PER_SEC, sum);
431
}
432
{
433
  int start = clock();
434
  int sum = 0;
435
  for (int i = 0; i < 1<<27; i++) {
436
      const char *input = samples[i & (CNT-1)].c_str();
437
      sum += GetIP(input);
438
  }
439
  int elapsed = clock() - start;
440
  printf("Time = %0.3lf   (%d)\n", double(elapsed) / CLOCKS_PER_SEC, sum);
441
}
442
443
  return 0;
444
}