File: neon_generate_lut.py

package info (click to toggle)
simdutf 7.7.1-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 7,244 kB
  • sloc: cpp: 60,074; ansic: 14,226; python: 3,364; sh: 321; makefile: 12
file content (101 lines) | stat: -rw-r--r-- 3,563 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
lut_lo = [0x0 for _ in range(16)]
lut_hi = [0x0 for _ in range(16)]

# uses (c & 0xf) for indexing lut_lo
# uses ((c >> 3) & 0xf) for indexing lut_hi
# bytes with c > 127 will have lut_hi mapped to 0 via vtbl1q_u8

# represent spaces by 0x1
# represent + (_) by 0x2
# represent / (-) by 0x4
# represent numbers by 0x8
# represent the partial row of upper alphabets with 0x10
# represent full valid row of upper alphabets with 0x20
# represent the partial row of lower alphabets with 0x40
# represent full valid row of lower alphabets with 0x80
# since '@' and 'P' both map to same lut_lo[0], use two different bits to separate them
lut_hi[0] = 0x0  # ['\x00', '\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x07']
lut_hi[1] = (
    0x1  # can have spaces ['\x08', '\t', '\n', '\x0b', '\x0c', '\r', '\x0e', '\x0f']
)
for z in range(16):
    if "\t\n\r\f".find(chr(z)) != -1:
        lut_lo[z & 0xF] = 0x1  # allowed

# invalid chars
lut_hi[2] = 0x0  # ['\x10', '\x11', '\x12', '\x13', '\x14', '\x15', '\x16', '\x17']
lut_hi[3] = 0x0  # ['\x18', '\x19', '\x1a', '\x1b', '\x1c', '\x1d', '\x1e', '\x1f']

lut_hi[4] = 0x1  # can have spaces [' ', '!', '"', '#', '$', '%', '&', "'"]
lut_lo[ord(" ") & 0xF] |= 0x1

lut_hi[5] = 0x6  # for + and / ['(', ')', '*', '+', ',', '-', '.', '/']

lut_lo[ord("+") & 0xF] |= 0x2
lut_lo[ord("/") & 0xF] |= 0x4

# 0x30 numbers
lut_hi[0x6] = 0x8  # ['0', '1', '2', '3', '4', '5', '6', '7']
lut_hi[0x7] = 0x8  # ['8', '9', ':', ';', '<', '=', '>', '?']
for z in range(0, 10):
    lut_lo[z] |= 0x8

# 0x40, 0x60 letters
lut_hi[0x8] = 0x10  # ['@', 'A', 'B', 'C', 'D', 'E', 'F', 'G']
lut_hi[0x9] = 0x20  # ['H', 'I', 'J', 'K', 'L', 'M', 'N', 'O']
lut_hi[10] = 0x20  # ['P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W']
lut_hi[11] = 0x10  # ['X', 'Y', 'Z', '[', '\\', ']', '^', '_']

lut_lo[ord("A") & 0xF] |= 0x10
lut_lo[ord("B") & 0xF] |= 0x10
lut_lo[ord("C") & 0xF] |= 0x10
lut_lo[ord("D") & 0xF] |= 0x10
lut_lo[ord("E") & 0xF] |= 0x10
lut_lo[ord("F") & 0xF] |= 0x10
lut_lo[ord("G") & 0xF] |= 0x10
lut_lo[ord("X") & 0xF] |= 0x10
lut_lo[ord("Y") & 0xF] |= 0x10
lut_lo[ord("Z") & 0xF] |= 0x10

lut_hi[12] = 0x40  # ['`', 'a', 'b', 'c', 'd', 'e', 'f', 'g']
lut_hi[13] = 0x80  # ['h', 'i', 'j', 'k', 'l', 'm', 'n', 'o']
lut_hi[14] = 0x80  # ['p', 'q', 'r', 's', 't', 'u', 'v', 'w']
lut_hi[15] = 0x40  # ['x', 'y', 'z', '{', '|', '}', '~', '\x7f']

lut_lo[ord("a") & 0xF] |= 0x40
lut_lo[ord("b") & 0xF] |= 0x40
lut_lo[ord("c") & 0xF] |= 0x40
lut_lo[ord("d") & 0xF] |= 0x40
lut_lo[ord("e") & 0xF] |= 0x40
lut_lo[ord("f") & 0xF] |= 0x40
lut_lo[ord("g") & 0xF] |= 0x40
lut_lo[ord("x") & 0xF] |= 0x40
lut_lo[ord("y") & 0xF] |= 0x40
lut_lo[ord("z") & 0xF] |= 0x40

for z in range(0, 16):
    lut_lo[z] |= 0x80 | 0x20

print("base64 regular lut_lo")
print(",".join([hex(c) for c in lut_lo]))
print("base64 regular lut_hi")
print(",".join([hex(c) for c in lut_hi]))

lut_lo[ord("-") & 0xF] |= 0x4
lut_lo[ord("+") & 0xF] &= ~0x2
lut_lo[ord("/") & 0xF] &= ~0x4
lut_lo[ord("_") & 0xF] |= 0x2
lut_hi[11] = 0x12  # can have _ as well ['X', 'Y', 'Z', '[', '\\', ']', '^', '_']
lut_hi[5] = 0x4  # for - ['(', ')', '*', '+', ',', '-', '.', '/']
print("base64 url lut_lo")
print(",".join([hex(c) for c in lut_lo]))
print("base64 url lut_hi")
print(",".join([hex(c) for c in lut_hi]))

lut_lo[ord("+") & 0xF] |= 0x2
lut_lo[ord("/") & 0xF] |= 0x4
lut_hi[5] = 0x6  # for +, - and / ['(', ')', '*', '+', ',', '-', '.', '/']
print("base64 hybrid lut_lo")
print(",".join([hex(c) for c in lut_lo]))
print("base64 hybrid lut_hi")
print(",".join([hex(c) for c in lut_hi]))