-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfunc.asm
More file actions
164 lines (151 loc) · 4.41 KB
/
Copy pathfunc.asm
File metadata and controls
164 lines (151 loc) · 4.41 KB
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
.data
.code
;==============================================================
;DWORD to String 8 figs. aaaa|bbbb Remove Zeroes. Return ~Length.
;==============================================================
Int32ToChar_AVX2 proc
mov eax,edx ;remove zero's
mov r8d,3518437209
imul r8,rdx ;aaaabbbb
shr r8,45 ;aaaa
imul r9d,r8d,10000 ;aaaa0000
sub edx,r9d ;bbbb
lzcnt eax,eax
mov r10d,32
sub r10d,eax
imul eax,r10d,1233
shr eax,12
inc eax
mov r9d,8
cmp eax,r9d
cmovg eax,r9d
lea r10,[ITOC_ShufB_8+8]
sub r10,rax
vmovd xmm0,r8d ;a
vmovd xmm1,edx ;b
vpbroadcastd ymm0,xmm0
vpbroadcastd ymm1,xmm1
vmovdqu ymm2,ymmword ptr [ITOC_FastMod4]
vpmuludq ymm0,ymm0,ymm2
vpmuludq ymm1,ymm1,ymm2
vpbroadcastd ymm3,dword ptr [ITOC_Mul10]
vpmuludq ymm0,ymm0,ymm3 ;xxxx:a000
vpmuludq ymm1,ymm1,ymm3
vpslld ymm0,ymm0,8
vpor ymm0,ymm0,ymm1
vextracti128 xmm1,ymm0,1
vpslld xmm2,xmm0,16
vpor xmm0,xmm1,xmm2
vpbroadcastb xmm4,byte ptr [ASCII]
vpor xmm0,xmm0,xmm4
vpshufb xmm0,xmm0,xmmword ptr [r10]
vmovdqu xmmword ptr [rcx],xmm0
vzeroupper
ret
ITOC_FastMod4 QWORD 429497,4294968,42949673,429496730 ;4321
ITOC_Mul10 DWORD 10
ITOC_ShufB_8 BYTE 7,15,5,13,6,14,4,12,16 DUP(-1)
ASCII Byte 48
Int32ToChar_AVX2 endp
;-----------------------------------------------------------------------------------
;----------------------- String to Integer 64-bit ----------------------
;-----------------------------------------------------------------------------------
String_To_Int_AVX2 proc
vmovdqu ymm0,ymmword ptr [rcx]
vpbroadcastb ymm4, byte ptr [StrASCII]
vpbroadcastb ymm3,byte ptr [StrCmp9]
vpsubb ymm0,ymm0,ymm4
vpcmpeqd ymm2,ymm2,ymm2
vpcmpgtb ymm5,ymm3,ymm0
vpcmpgtb ymm4,ymm0,ymm2
vpand ymm4,ymm4,ymm5
vpand ymm0,ymm0,ymm4 ;"xx0012340xx1xx" -> "00111111100100"
vpmovmskb eax,ymm4 ;001111111100100
tzcnt edx,eax ;5
shrx eax,eax,edx ;111111100100
not eax ;111100011001110011111111111
tzcnt eax,eax ;16
add eax,edx ;shift l 20-eax = 18?
lea rcx,[StrConvShift]
lea rcx, [rcx + rax - 20]
vmovdqu ymm4, ymmword ptr [rcx] ;h
vmovdqu ymm5, ymmword ptr [rcx+16] ;l
vperm2i128 ymm1,ymm0,ymm0,010001b ;h,h
vinserti128 ymm2,ymm0,xmm0,1 ;l,l
vpshufb ymm3,ymm1,ymm4
vpshufb ymm0,ymm2,ymm5
vpor ymm0,ymm0,ymm3
vmovdqu ymm1,ymmword ptr [MulStr101B]
vmovdqu ymm2,ymmword ptr [MulStr101W]
vpmaddubsw ymm0,ymm0,ymm1 ;|ab,cd,ef,gh,ij,kl,mn,op|qr,st|
vpmaddwd ymm0,ymm0,ymm2 ;|abcd,0000,efgh,0000,ijkl,0000,mnop,0000|qrst,0000| save
vmovdqu xmm5,xmmword ptr [MulStr101D] ;|abcd,efgh,0000,0000,ijkl,mnop,0000,0000|
vpshufb xmm1,xmm0,xmmword ptr [StrConvShif16]
vpmaddwd xmm1,xmm1,xmm5 ;|00000000abcdefgh,00000000ijklmnop||
vpbroadcastd xmm2,dword ptr [Mul10000]
vpmuludq xmm1,xmm1,xmm2 ;|abcdefgh0000,ijklmnop0000|
vextracti128 xmm0,ymm0,1
vmovq rax,xmm1
imul rax,100000000
vpshufd xmm3,xmm1,00001110b
vpaddq xmm0,xmm0,xmm3
vmovq rdx,xmm0
add rax,rdx
ret
BYTE 32 DUP(-1)
StrConvShift:
BYTE 16 DUP(-1)
BYTE 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
BYTE 16 DUP(-1)
BYTE 32 DUP(-1)
StrCmp9 BYTE 10
StrASCII BYTE 48
Mul10000 DWORD 10000
MulStr101B BYTE 10 DUP(10,1),12 DUP(0)
MulStr101W WORD 5 DUP(100,1),6 DUP(0)
MulStr101D WORD 2 DUP(10000,1,0,0)
StrConvShif16 BYTE 0,1,4,5,4 DUP(-1),8,9,12,13,4 DUP(-1)
String_To_Int_AVX2 endp
;----------------------------------------------------------------------
;----------------------Convert wide to char. dst,src,count-----------------
;----------------------------------------------------------------------
Copy_Wide_Char proc ;rcx,rdx,r8
sub rsp,16
vmovdqu xmmword ptr [rsp],xmm6
xor eax,eax
mov r11d,'_'
mov r9d,r8d
shr r9d,4
jz Loop_ResASCII
vmovq xmm1,qword ptr [ShufB_W]
vpbroadcastb xmm2,byte ptr [ASCII_CMP]
vpbroadcastb xmm3,byte ptr [ASCII_CMP+1]
vpbroadcastb xmm4,byte ptr [ASCII_CMP+2]
Loop16:
vmovdqu xmm0,xmmword ptr [rdx+rax*2] ;8 wide
vpcmpgtb xmm5,xmm0,xmm2 ;>31
vpcmpgtb xmm6,xmm3,xmm0 ;<123
vpand xmm5,xmm5,xmm6
vpblendvb xmm0,xmm4,xmm0,xmm5
vpshufb xmm0,xmm0,xmm1 ;compress to qword
vmovq qword ptr [rcx+rax],xmm0
add eax,8
dec r9d
jnz Loop16
Loop_ResASCII:
mov r10b,byte ptr [rdx+rax*2]
mov r9d,r10d
sub r9d,32
cmp r9d,90
cmovg r10d,r11d
mov byte ptr [rcx+rax],r10b
inc eax
cmp eax,r8d
jl Loop_ResASCII
vmovdqu xmm6,xmmword ptr [rsp]
add rsp,16
ret
ShufB_W BYTE 0,2,4,6,8,10,12,14
ASCII_CMP BYTE 31,123,'_' ;ascii:[32,122] -> x-32 [0,90]
Copy_Wide_Char endp
end