~zooko/cryptopp/trunk

« back to all changes in this revision

Viewing changes to x64dll.asm

  • Committer: weidai
  • Date: 2009-03-02 02:39:17 UTC
  • Revision ID: svn-v4:57ff6487-cd31-0410-9ec3-f628ee90f5f0:trunk/c5:433
changes for 5.6: 
    - added AuthenticatedSymmetricCipher interface class and Filter wrappers
    - added CCM, GCM (with SSE2 assembly), CMAC, and SEED
    - improved AES speed on x86 and x64
    - removed WORD64_AVAILABLE; compiler 64-bit int support is now required

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
include ksamd64.inc
 
2
EXTERNDEF ?Te@rdtable@CryptoPP@@3PA_KA:FAR
 
3
EXTERNDEF ?g_cacheLineSize@CryptoPP@@3IA:FAR
 
4
.CODE
 
5
 
 
6
    ALIGN   8
 
7
Baseline_Add    PROC
 
8
        lea             rdx, [rdx+8*rcx]
 
9
        lea             r8, [r8+8*rcx]
 
10
        lea             r9, [r9+8*rcx]
 
11
        neg             rcx                                     ; rcx is negative index
 
12
        jz              $1@Baseline_Add
 
13
        mov             rax,[r8+8*rcx]
 
14
        add             rax,[r9+8*rcx]
 
15
        mov             [rdx+8*rcx],rax
 
16
$0@Baseline_Add:
 
17
        mov             rax,[r8+8*rcx+8]
 
18
        adc             rax,[r9+8*rcx+8]
 
19
        mov             [rdx+8*rcx+8],rax
 
20
        lea             rcx,[rcx+2]                     ; advance index, avoid inc which causes slowdown on Intel Core 2
 
21
        jrcxz   $1@Baseline_Add         ; loop until rcx overflows and becomes zero
 
22
        mov             rax,[r8+8*rcx]
 
23
        adc             rax,[r9+8*rcx]
 
24
        mov             [rdx+8*rcx],rax
 
25
        jmp             $0@Baseline_Add
 
26
$1@Baseline_Add:
 
27
        mov             rax, 0
 
28
        adc             rax, rax                        ; store carry into rax (return result register)
 
29
        ret
 
30
Baseline_Add ENDP
 
31
 
 
32
    ALIGN   8
 
33
Baseline_Sub    PROC
 
34
        lea             rdx, [rdx+8*rcx]
 
35
        lea             r8, [r8+8*rcx]
 
36
        lea             r9, [r9+8*rcx]
 
37
        neg             rcx                                     ; rcx is negative index
 
38
        jz              $1@Baseline_Sub
 
39
        mov             rax,[r8+8*rcx]
 
40
        sub             rax,[r9+8*rcx]
 
41
        mov             [rdx+8*rcx],rax
 
42
$0@Baseline_Sub:
 
43
        mov             rax,[r8+8*rcx+8]
 
44
        sbb             rax,[r9+8*rcx+8]
 
45
        mov             [rdx+8*rcx+8],rax
 
46
        lea             rcx,[rcx+2]                     ; advance index, avoid inc which causes slowdown on Intel Core 2
 
47
        jrcxz   $1@Baseline_Sub         ; loop until rcx overflows and becomes zero
 
48
        mov             rax,[r8+8*rcx]
 
49
        sbb             rax,[r9+8*rcx]
 
50
        mov             [rdx+8*rcx],rax
 
51
        jmp             $0@Baseline_Sub
 
52
$1@Baseline_Sub:
 
53
        mov             rax, 0
 
54
        adc             rax, rax                        ; store carry into rax (return result register)
 
55
 
 
56
        ret
 
57
Baseline_Sub ENDP
 
58
 
 
59
ALIGN   8
 
60
Rijndael_Enc_AdvancedProcessBlocks      PROC FRAME
 
61
rex_push_reg rsi
 
62
push_reg rdi
 
63
push_reg rbx
 
64
push_reg rbp
 
65
push_reg r12
 
66
.endprolog
 
67
mov r8, rcx
 
68
mov rsi, ?Te@rdtable@CryptoPP@@3PA_KA
 
69
mov rdi, QWORD PTR [?g_cacheLineSize@CryptoPP@@3IA]
 
70
mov rbp, [(r8+16*19)]
 
71
mov rax, 16
 
72
and rax, rbp
 
73
movdqa xmm3, XMMWORD PTR [rdx+16+rax]
 
74
movdqa [(r8+16*12)], xmm3
 
75
lea rax, [rdx+rax+2*16]
 
76
sub rax, rbp
 
77
label0:
 
78
movdqa xmm0, [rax+rbp]
 
79
movdqa XMMWORD PTR [(r8+0)+rbp], xmm0
 
80
add rbp, 16
 
81
cmp rbp, 16*12
 
82
jl label0
 
83
movdqa xmm4, [rax+rbp]
 
84
movdqa xmm1, [rdx]
 
85
mov r11d, [rdx+4*4]
 
86
mov ebx, [rdx+5*4]
 
87
mov ecx, [rdx+6*4]
 
88
mov edx, [rdx+7*4]
 
89
xor rax, rax
 
90
label9:
 
91
mov ebp, [rsi+rax]
 
92
add rax, rdi
 
93
mov ebp, [rsi+rax]
 
94
add rax, rdi
 
95
mov ebp, [rsi+rax]
 
96
add rax, rdi
 
97
mov ebp, [rsi+rax]
 
98
add rax, rdi
 
99
cmp rax, 2048
 
100
jl label9
 
101
lfence
 
102
test DWORD PTR [(r8+16*18+8)], 1
 
103
jz label8
 
104
mov rbp, [(r8+16*14)]
 
105
movdqa xmm2, [rbp]
 
106
pxor xmm2, xmm1
 
107
psrldq xmm1, 14
 
108
movd eax, xmm1
 
109
mov al, BYTE PTR [rbp+15]
 
110
mov r12d, eax
 
111
movd eax, xmm2
 
112
psrldq xmm2, 4
 
113
movd edi, xmm2
 
114
psrldq xmm2, 4
 
115
movzx ebp, al
 
116
xor r11d, DWORD PTR [rsi+8*rbp+(((0+3) MOD (4))+1)]
 
117
movzx ebp, ah
 
118
xor edx, DWORD PTR [rsi+8*rbp+(((1+3) MOD (4))+1)]
 
119
shr eax, 16
 
120
movzx ebp, al
 
121
xor ecx, DWORD PTR [rsi+8*rbp+(((2+3) MOD (4))+1)]
 
122
movzx ebp, ah
 
123
xor ebx, DWORD PTR [rsi+8*rbp+(((3+3) MOD (4))+1)]
 
124
mov eax, edi
 
125
movd edi, xmm2
 
126
psrldq xmm2, 4
 
127
movzx ebp, al
 
128
xor ebx, DWORD PTR [rsi+8*rbp+(((0+3) MOD (4))+1)]
 
129
movzx ebp, ah
 
130
xor r11d, DWORD PTR [rsi+8*rbp+(((1+3) MOD (4))+1)]
 
131
shr eax, 16
 
132
movzx ebp, al
 
133
xor edx, DWORD PTR [rsi+8*rbp+(((2+3) MOD (4))+1)]
 
134
movzx ebp, ah
 
135
xor ecx, DWORD PTR [rsi+8*rbp+(((3+3) MOD (4))+1)]
 
136
mov eax, edi
 
137
movd edi, xmm2
 
138
movzx ebp, al
 
139
xor ecx, DWORD PTR [rsi+8*rbp+(((0+3) MOD (4))+1)]
 
140
movzx ebp, ah
 
141
xor ebx, DWORD PTR [rsi+8*rbp+(((1+3) MOD (4))+1)]
 
142
shr eax, 16
 
143
movzx ebp, al
 
144
xor r11d, DWORD PTR [rsi+8*rbp+(((2+3) MOD (4))+1)]
 
145
movzx ebp, ah
 
146
xor edx, DWORD PTR [rsi+8*rbp+(((3+3) MOD (4))+1)]
 
147
mov eax, edi
 
148
movzx ebp, al
 
149
xor edx, DWORD PTR [rsi+8*rbp+(((0+3) MOD (4))+1)]
 
150
movzx ebp, ah
 
151
xor ecx, DWORD PTR [rsi+8*rbp+(((1+3) MOD (4))+1)]
 
152
shr eax, 16
 
153
movzx ebp, al
 
154
xor ebx, DWORD PTR [rsi+8*rbp+(((2+3) MOD (4))+1)]
 
155
psrldq xmm2, 3
 
156
mov eax, [(r8+16*12)+0*4]
 
157
mov edi, [(r8+16*12)+2*4]
 
158
mov r10d, [(r8+16*12)+3*4]
 
159
movzx ebp, cl
 
160
xor r10d, DWORD PTR [rsi+8*rbp+(((3+3) MOD (4))+1)]
 
161
movzx ebp, bl
 
162
xor edi, DWORD PTR [rsi+8*rbp+(((3+3) MOD (4))+1)]
 
163
movzx ebp, bh
 
164
xor r10d, DWORD PTR [rsi+8*rbp+(((2+3) MOD (4))+1)]
 
165
shr ebx, 16
 
166
movzx ebp, bl
 
167
xor eax, DWORD PTR [rsi+8*rbp+(((1+3) MOD (4))+1)]
 
168
movzx ebp, bh
 
169
mov ebx, DWORD PTR [rsi+8*rbp+(((0+3) MOD (4))+1)]
 
170
xor ebx, [(r8+16*12)+1*4]
 
171
movzx ebp, ch
 
172
xor eax, DWORD PTR [rsi+8*rbp+(((2+3) MOD (4))+1)]
 
173
shr ecx, 16
 
174
movzx ebp, dl
 
175
xor eax, DWORD PTR [rsi+8*rbp+(((3+3) MOD (4))+1)]
 
176
movzx ebp, dh
 
177
xor ebx, DWORD PTR [rsi+8*rbp+(((2+3) MOD (4))+1)]
 
178
shr edx, 16
 
179
movzx ebp, ch
 
180
xor edi, DWORD PTR [rsi+8*rbp+(((0+3) MOD (4))+1)]
 
181
movzx ebp, cl
 
182
xor ebx, DWORD PTR [rsi+8*rbp+(((1+3) MOD (4))+1)]
 
183
movzx ebp, dl
 
184
xor edi, DWORD PTR [rsi+8*rbp+(((1+3) MOD (4))+1)]
 
185
movzx ebp, dh
 
186
xor r10d, DWORD PTR [rsi+8*rbp+(((0+3) MOD (4))+1)]
 
187
movd ecx, xmm2
 
188
mov edx, r11d
 
189
mov [(r8+0)+3*4], r10d
 
190
mov [(r8+0)+0*4], eax
 
191
mov [(r8+0)+1*4], ebx
 
192
mov [(r8+0)+2*4], edi
 
193
jmp label5
 
194
label3:
 
195
mov r11d, [(r8+16*12)+0*4]
 
196
mov ebx, [(r8+16*12)+1*4]
 
197
mov ecx, [(r8+16*12)+2*4]
 
198
mov edx, [(r8+16*12)+3*4]
 
199
label8:
 
200
mov rax, [(r8+16*14)]
 
201
movdqu xmm2, [rax]
 
202
mov rbp, [(r8+16*14)+8]
 
203
movdqu xmm5, [rbp]
 
204
pxor xmm2, xmm1
 
205
pxor xmm2, xmm5
 
206
movd eax, xmm2
 
207
psrldq xmm2, 4
 
208
movd edi, xmm2
 
209
psrldq xmm2, 4
 
210
movzx ebp, al
 
211
xor r11d, DWORD PTR [rsi+8*rbp+(((0+3) MOD (4))+1)]
 
212
movzx ebp, ah
 
213
xor edx, DWORD PTR [rsi+8*rbp+(((1+3) MOD (4))+1)]
 
214
shr eax, 16
 
215
movzx ebp, al
 
216
xor ecx, DWORD PTR [rsi+8*rbp+(((2+3) MOD (4))+1)]
 
217
movzx ebp, ah
 
218
xor ebx, DWORD PTR [rsi+8*rbp+(((3+3) MOD (4))+1)]
 
219
mov eax, edi
 
220
movd edi, xmm2
 
221
psrldq xmm2, 4
 
222
movzx ebp, al
 
223
xor ebx, DWORD PTR [rsi+8*rbp+(((0+3) MOD (4))+1)]
 
224
movzx ebp, ah
 
225
xor r11d, DWORD PTR [rsi+8*rbp+(((1+3) MOD (4))+1)]
 
226
shr eax, 16
 
227
movzx ebp, al
 
228
xor edx, DWORD PTR [rsi+8*rbp+(((2+3) MOD (4))+1)]
 
229
movzx ebp, ah
 
230
xor ecx, DWORD PTR [rsi+8*rbp+(((3+3) MOD (4))+1)]
 
231
mov eax, edi
 
232
movd edi, xmm2
 
233
movzx ebp, al
 
234
xor ecx, DWORD PTR [rsi+8*rbp+(((0+3) MOD (4))+1)]
 
235
movzx ebp, ah
 
236
xor ebx, DWORD PTR [rsi+8*rbp+(((1+3) MOD (4))+1)]
 
237
shr eax, 16
 
238
movzx ebp, al
 
239
xor r11d, DWORD PTR [rsi+8*rbp+(((2+3) MOD (4))+1)]
 
240
movzx ebp, ah
 
241
xor edx, DWORD PTR [rsi+8*rbp+(((3+3) MOD (4))+1)]
 
242
mov eax, edi
 
243
movzx ebp, al
 
244
xor edx, DWORD PTR [rsi+8*rbp+(((0+3) MOD (4))+1)]
 
245
movzx ebp, ah
 
246
xor ecx, DWORD PTR [rsi+8*rbp+(((1+3) MOD (4))+1)]
 
247
shr eax, 16
 
248
movzx ebp, al
 
249
xor ebx, DWORD PTR [rsi+8*rbp+(((2+3) MOD (4))+1)]
 
250
movzx ebp, ah
 
251
xor r11d, DWORD PTR [rsi+8*rbp+(((3+3) MOD (4))+1)]
 
252
mov eax, r11d
 
253
add r8, [(r8+16*19)]
 
254
add r8, 4*16
 
255
jmp label2
 
256
label1:
 
257
mov ecx, r12d
 
258
mov edx, r11d
 
259
mov eax, [(r8+0)+0*4]
 
260
mov ebx, [(r8+0)+1*4]
 
261
xor cl, ch
 
262
and rcx, 255
 
263
label5:
 
264
add r12d, 1
 
265
xor edx, DWORD PTR [rsi+rcx*8+3]
 
266
movzx ebp, dl
 
267
xor ebx, DWORD PTR [rsi+8*rbp+(((3+3) MOD (4))+1)]
 
268
movzx ebp, dh
 
269
mov ecx, DWORD PTR [rsi+8*rbp+(((2+3) MOD (4))+1)]
 
270
shr edx, 16
 
271
xor ecx, [(r8+0)+2*4]
 
272
movzx ebp, dh
 
273
xor eax, DWORD PTR [rsi+8*rbp+(((0+3) MOD (4))+1)]
 
274
movzx ebp, dl
 
275
mov edx, DWORD PTR [rsi+8*rbp+(((1+3) MOD (4))+1)]
 
276
xor edx, [(r8+0)+3*4]
 
277
add r8, [(r8+16*19)]
 
278
add r8, 3*16
 
279
jmp label4
 
280
label2:
 
281
mov r10d, [(r8+0)-4*16+3*4]
 
282
mov edi, [(r8+0)-4*16+2*4]
 
283
movzx ebp, cl
 
284
xor r10d, DWORD PTR [rsi+8*rbp+(((3+3) MOD (4))+1)]
 
285
mov cl, al
 
286
movzx ebp, ah
 
287
xor edi, DWORD PTR [rsi+8*rbp+(((2+3) MOD (4))+1)]
 
288
shr eax, 16
 
289
movzx ebp, bl
 
290
xor edi, DWORD PTR [rsi+8*rbp+(((3+3) MOD (4))+1)]
 
291
movzx ebp, bh
 
292
xor r10d, DWORD PTR [rsi+8*rbp+(((2+3) MOD (4))+1)]
 
293
shr ebx, 16
 
294
movzx ebp, al
 
295
xor r10d, DWORD PTR [rsi+8*rbp+(((1+3) MOD (4))+1)]
 
296
movzx ebp, ah
 
297
mov eax, DWORD PTR [rsi+8*rbp+(((0+3) MOD (4))+1)]
 
298
movzx ebp, bl
 
299
xor eax, DWORD PTR [rsi+8*rbp+(((1+3) MOD (4))+1)]
 
300
movzx ebp, bh
 
301
mov ebx, DWORD PTR [rsi+8*rbp+(((0+3) MOD (4))+1)]
 
302
movzx ebp, ch
 
303
xor eax, DWORD PTR [rsi+8*rbp+(((2+3) MOD (4))+1)]
 
304
movzx ebp, cl
 
305
xor ebx, DWORD PTR [rsi+8*rbp+(((3+3) MOD (4))+1)]
 
306
shr ecx, 16
 
307
movzx ebp, dl
 
308
xor eax, DWORD PTR [rsi+8*rbp+(((3+3) MOD (4))+1)]
 
309
movzx ebp, dh
 
310
xor ebx, DWORD PTR [rsi+8*rbp+(((2+3) MOD (4))+1)]
 
311
shr edx, 16
 
312
movzx ebp, ch
 
313
xor edi, DWORD PTR [rsi+8*rbp+(((0+3) MOD (4))+1)]
 
314
movzx ebp, cl
 
315
xor ebx, DWORD PTR [rsi+8*rbp+(((1+3) MOD (4))+1)]
 
316
movzx ebp, dl
 
317
xor edi, DWORD PTR [rsi+8*rbp+(((1+3) MOD (4))+1)]
 
318
movzx ebp, dh
 
319
xor r10d, DWORD PTR [rsi+8*rbp+(((0+3) MOD (4))+1)]
 
320
mov ecx, edi
 
321
xor eax, [(r8+0)-4*16+0*4]
 
322
xor ebx, [(r8+0)-4*16+1*4]
 
323
mov edx, r10d
 
324
label4:
 
325
mov r10d, [(r8+0)-4*16+7*4]
 
326
mov edi, [(r8+0)-4*16+6*4]
 
327
movzx ebp, cl
 
328
xor r10d, DWORD PTR [rsi+8*rbp+(((3+3) MOD (4))+1)]
 
329
mov cl, al
 
330
movzx ebp, ah
 
331
xor edi, DWORD PTR [rsi+8*rbp+(((2+3) MOD (4))+1)]
 
332
shr eax, 16
 
333
movzx ebp, bl
 
334
xor edi, DWORD PTR [rsi+8*rbp+(((3+3) MOD (4))+1)]
 
335
movzx ebp, bh
 
336
xor r10d, DWORD PTR [rsi+8*rbp+(((2+3) MOD (4))+1)]
 
337
shr ebx, 16
 
338
movzx ebp, al
 
339
xor r10d, DWORD PTR [rsi+8*rbp+(((1+3) MOD (4))+1)]
 
340
movzx ebp, ah
 
341
mov eax, DWORD PTR [rsi+8*rbp+(((0+3) MOD (4))+1)]
 
342
movzx ebp, bl
 
343
xor eax, DWORD PTR [rsi+8*rbp+(((1+3) MOD (4))+1)]
 
344
movzx ebp, bh
 
345
mov ebx, DWORD PTR [rsi+8*rbp+(((0+3) MOD (4))+1)]
 
346
movzx ebp, ch
 
347
xor eax, DWORD PTR [rsi+8*rbp+(((2+3) MOD (4))+1)]
 
348
movzx ebp, cl
 
349
xor ebx, DWORD PTR [rsi+8*rbp+(((3+3) MOD (4))+1)]
 
350
shr ecx, 16
 
351
movzx ebp, dl
 
352
xor eax, DWORD PTR [rsi+8*rbp+(((3+3) MOD (4))+1)]
 
353
movzx ebp, dh
 
354
xor ebx, DWORD PTR [rsi+8*rbp+(((2+3) MOD (4))+1)]
 
355
shr edx, 16
 
356
movzx ebp, ch
 
357
xor edi, DWORD PTR [rsi+8*rbp+(((0+3) MOD (4))+1)]
 
358
movzx ebp, cl
 
359
xor ebx, DWORD PTR [rsi+8*rbp+(((1+3) MOD (4))+1)]
 
360
movzx ebp, dl
 
361
xor edi, DWORD PTR [rsi+8*rbp+(((1+3) MOD (4))+1)]
 
362
movzx ebp, dh
 
363
xor r10d, DWORD PTR [rsi+8*rbp+(((0+3) MOD (4))+1)]
 
364
mov ecx, edi
 
365
xor eax, [(r8+0)-4*16+4*4]
 
366
xor ebx, [(r8+0)-4*16+5*4]
 
367
mov edx, r10d
 
368
add r8, 32
 
369
test r8, 255
 
370
jnz label2
 
371
sub r8, 16*16
 
372
movzx ebp, ch
 
373
movzx edi, BYTE PTR [rsi+rbp*8+1]
 
374
movzx ebp, dl
 
375
xor edi, DWORD PTR [rsi+rbp*8+0]
 
376
mov WORD PTR [(r8+16*13)+2], di
 
377
movzx ebp, dh
 
378
movzx edi, BYTE PTR [rsi+rbp*8+1]
 
379
movzx ebp, al
 
380
xor edi, DWORD PTR [rsi+rbp*8+0]
 
381
mov WORD PTR [(r8+16*13)+6], di
 
382
shr edx, 16
 
383
movzx ebp, ah
 
384
movzx edi, BYTE PTR [rsi+rbp*8+1]
 
385
movzx ebp, bl
 
386
xor edi, DWORD PTR [rsi+rbp*8+0]
 
387
mov WORD PTR [(r8+16*13)+10], di
 
388
shr eax, 16
 
389
movzx ebp, bh
 
390
movzx edi, BYTE PTR [rsi+rbp*8+1]
 
391
movzx ebp, cl
 
392
xor edi, DWORD PTR [rsi+rbp*8+0]
 
393
mov WORD PTR [(r8+16*13)+14], di
 
394
shr ebx, 16
 
395
movzx ebp, dh
 
396
movzx edi, BYTE PTR [rsi+rbp*8+1]
 
397
movzx ebp, al
 
398
xor edi, DWORD PTR [rsi+rbp*8+0]
 
399
mov WORD PTR [(r8+16*13)+12], di
 
400
shr ecx, 16
 
401
movzx ebp, ah
 
402
movzx edi, BYTE PTR [rsi+rbp*8+1]
 
403
movzx ebp, bl
 
404
xor edi, DWORD PTR [rsi+rbp*8+0]
 
405
mov WORD PTR [(r8+16*13)+0], di
 
406
movzx ebp, bh
 
407
movzx edi, BYTE PTR [rsi+rbp*8+1]
 
408
movzx ebp, cl
 
409
xor edi, DWORD PTR [rsi+rbp*8+0]
 
410
mov WORD PTR [(r8+16*13)+4], di
 
411
movzx ebp, ch
 
412
movzx edi, BYTE PTR [rsi+rbp*8+1]
 
413
movzx ebp, dl
 
414
xor edi, DWORD PTR [rsi+rbp*8+0]
 
415
mov WORD PTR [(r8+16*13)+8], di
 
416
mov rax, [(r8+16*14)+16]
 
417
mov rbx, [(r8+16*14)+24]
 
418
mov rcx, [(r8+16*18+8)]
 
419
sub rcx, 16
 
420
movdqu xmm2, [rax]
 
421
pxor xmm2, xmm4
 
422
movdqa xmm0, [(r8+16*16)+16]
 
423
paddq xmm0, [(r8+16*14)+16]
 
424
movdqa [(r8+16*14)+16], xmm0
 
425
pxor xmm2, [(r8+16*13)]
 
426
movdqu [rbx], xmm2
 
427
jle label7
 
428
mov [(r8+16*18+8)], rcx
 
429
test rcx, 1
 
430
jnz label1
 
431
movdqa xmm0, [(r8+16*16)]
 
432
paddd xmm0, [(r8+16*14)]
 
433
movdqa [(r8+16*14)], xmm0
 
434
jmp label3
 
435
label7:
 
436
mov rbp, [(r8+16*18)]
 
437
pop r12
 
438
pop rbp
 
439
pop rbx
 
440
pop rdi
 
441
pop rsi
 
442
ret
 
443
Rijndael_Enc_AdvancedProcessBlocks ENDP
 
444
 
 
445
ALIGN   8
 
446
GCM_AuthenticateBlocks_2K       PROC FRAME
 
447
rex_push_reg rsi
 
448
push_reg rdi
 
449
push_reg rbx
 
450
.endprolog
 
451
mov rsi, r8
 
452
mov r11, r9
 
453
movdqa xmm0, [rsi]
 
454
label0:
 
455
movdqu xmm4, [rcx]
 
456
pxor xmm0, xmm4
 
457
movd ebx, xmm0
 
458
mov eax, 0f0f0f0f0h
 
459
and eax, ebx
 
460
shl ebx, 4
 
461
and ebx, 0f0f0f0f0h
 
462
movzx edi, ah
 
463
movdqa xmm5, XMMWORD PTR [rsi + 32 + 1024 + rdi]
 
464
movzx edi, al
 
465
movdqa xmm4, XMMWORD PTR [rsi + 32 + 1024 + rdi]
 
466
shr eax, 16
 
467
movzx edi, ah
 
468
movdqa xmm3, XMMWORD PTR [rsi + 32 + 1024 + rdi]
 
469
movzx edi, al
 
470
movdqa xmm2, XMMWORD PTR [rsi + 32 + 1024 + rdi]
 
471
psrldq xmm0, 4
 
472
movd eax, xmm0
 
473
and eax, 0f0f0f0f0h
 
474
movzx edi, bh
 
475
pxor xmm5, XMMWORD PTR [rsi + 32 + (1-1)*256 + rdi]
 
476
movzx edi, bl
 
477
pxor xmm4, XMMWORD PTR [rsi + 32 + (1-1)*256 + rdi]
 
478
shr ebx, 16
 
479
movzx edi, bh
 
480
pxor xmm3, XMMWORD PTR [rsi + 32 + (1-1)*256 + rdi]
 
481
movzx edi, bl
 
482
pxor xmm2, XMMWORD PTR [rsi + 32 + (1-1)*256 + rdi]
 
483
movd ebx, xmm0
 
484
shl ebx, 4
 
485
and ebx, 0f0f0f0f0h
 
486
movzx edi, ah
 
487
pxor xmm5, XMMWORD PTR [rsi + 32 + 1024 + 1*256 + rdi]
 
488
movzx edi, al
 
489
pxor xmm4, XMMWORD PTR [rsi + 32 + 1024 + 1*256 + rdi]
 
490
shr eax, 16
 
491
movzx edi, ah
 
492
pxor xmm3, XMMWORD PTR [rsi + 32 + 1024 + 1*256 + rdi]
 
493
movzx edi, al
 
494
pxor xmm2, XMMWORD PTR [rsi + 32 + 1024 + 1*256 + rdi]
 
495
psrldq xmm0, 4
 
496
movd eax, xmm0
 
497
and eax, 0f0f0f0f0h
 
498
movzx edi, bh
 
499
pxor xmm5, XMMWORD PTR [rsi + 32 + (2-1)*256 + rdi]
 
500
movzx edi, bl
 
501
pxor xmm4, XMMWORD PTR [rsi + 32 + (2-1)*256 + rdi]
 
502
shr ebx, 16
 
503
movzx edi, bh
 
504
pxor xmm3, XMMWORD PTR [rsi + 32 + (2-1)*256 + rdi]
 
505
movzx edi, bl
 
506
pxor xmm2, XMMWORD PTR [rsi + 32 + (2-1)*256 + rdi]
 
507
movd ebx, xmm0
 
508
shl ebx, 4
 
509
and ebx, 0f0f0f0f0h
 
510
movzx edi, ah
 
511
pxor xmm5, XMMWORD PTR [rsi + 32 + 1024 + 2*256 + rdi]
 
512
movzx edi, al
 
513
pxor xmm4, XMMWORD PTR [rsi + 32 + 1024 + 2*256 + rdi]
 
514
shr eax, 16
 
515
movzx edi, ah
 
516
pxor xmm3, XMMWORD PTR [rsi + 32 + 1024 + 2*256 + rdi]
 
517
movzx edi, al
 
518
pxor xmm2, XMMWORD PTR [rsi + 32 + 1024 + 2*256 + rdi]
 
519
psrldq xmm0, 4
 
520
movd eax, xmm0
 
521
and eax, 0f0f0f0f0h
 
522
movzx edi, bh
 
523
pxor xmm5, XMMWORD PTR [rsi + 32 + (3-1)*256 + rdi]
 
524
movzx edi, bl
 
525
pxor xmm4, XMMWORD PTR [rsi + 32 + (3-1)*256 + rdi]
 
526
shr ebx, 16
 
527
movzx edi, bh
 
528
pxor xmm3, XMMWORD PTR [rsi + 32 + (3-1)*256 + rdi]
 
529
movzx edi, bl
 
530
pxor xmm2, XMMWORD PTR [rsi + 32 + (3-1)*256 + rdi]
 
531
movd ebx, xmm0
 
532
shl ebx, 4
 
533
and ebx, 0f0f0f0f0h
 
534
movzx edi, ah
 
535
pxor xmm5, XMMWORD PTR [rsi + 32 + 1024 + 3*256 + rdi]
 
536
movzx edi, al
 
537
pxor xmm4, XMMWORD PTR [rsi + 32 + 1024 + 3*256 + rdi]
 
538
shr eax, 16
 
539
movzx edi, ah
 
540
pxor xmm3, XMMWORD PTR [rsi + 32 + 1024 + 3*256 + rdi]
 
541
movzx edi, al
 
542
pxor xmm2, XMMWORD PTR [rsi + 32 + 1024 + 3*256 + rdi]
 
543
movzx edi, bh
 
544
pxor xmm5, XMMWORD PTR [rsi + 32 + 3*256 + rdi]
 
545
movzx edi, bl
 
546
pxor xmm4, XMMWORD PTR [rsi + 32 + 3*256 + rdi]
 
547
shr ebx, 16
 
548
movzx edi, bh
 
549
pxor xmm3, XMMWORD PTR [rsi + 32 + 3*256 + rdi]
 
550
movzx edi, bl
 
551
pxor xmm2, XMMWORD PTR [rsi + 32 + 3*256 + rdi]
 
552
movdqa xmm0, xmm3
 
553
pslldq xmm3, 1
 
554
pxor xmm2, xmm3
 
555
movdqa xmm1, xmm2
 
556
pslldq xmm2, 1
 
557
pxor xmm5, xmm2
 
558
psrldq xmm0, 15
 
559
movd rdi, xmm0
 
560
movzx eax, WORD PTR [r11 + rdi*2]
 
561
shl eax, 8
 
562
movdqa xmm0, xmm5
 
563
pslldq xmm5, 1
 
564
pxor xmm4, xmm5
 
565
psrldq xmm1, 15
 
566
movd rdi, xmm1
 
567
xor ax, WORD PTR [r11 + rdi*2]
 
568
shl eax, 8
 
569
psrldq xmm0, 15
 
570
movd rdi, xmm0
 
571
xor ax, WORD PTR [r11 + rdi*2]
 
572
movd xmm0, eax
 
573
pxor xmm0, xmm4
 
574
add rcx, 16
 
575
sub rdx, 1
 
576
jnz label0
 
577
movdqa [rsi], xmm0
 
578
pop rbx
 
579
pop rdi
 
580
pop rsi
 
581
ret
 
582
GCM_AuthenticateBlocks_2K ENDP
 
583
 
 
584
ALIGN   8
 
585
GCM_AuthenticateBlocks_64K      PROC FRAME
 
586
rex_push_reg rsi
 
587
push_reg rdi
 
588
.endprolog
 
589
mov rsi, r8
 
590
movdqa xmm0, [rsi]
 
591
label1:
 
592
movdqu xmm1, [rcx]
 
593
pxor xmm1, xmm0
 
594
pxor xmm0, xmm0
 
595
movd eax, xmm1
 
596
psrldq xmm1, 4
 
597
movzx edi, al
 
598
add rdi, rdi
 
599
pxor xmm0, [rsi + 32 + (0*4+0)*256*16 + rdi*8]
 
600
movzx edi, ah
 
601
add rdi, rdi
 
602
pxor xmm0, [rsi + 32 + (0*4+1)*256*16 + rdi*8]
 
603
shr eax, 16
 
604
movzx edi, al
 
605
add rdi, rdi
 
606
pxor xmm0, [rsi + 32 + (0*4+2)*256*16 + rdi*8]
 
607
movzx edi, ah
 
608
add rdi, rdi
 
609
pxor xmm0, [rsi + 32 + (0*4+3)*256*16 + rdi*8]
 
610
movd eax, xmm1
 
611
psrldq xmm1, 4
 
612
movzx edi, al
 
613
add rdi, rdi
 
614
pxor xmm0, [rsi + 32 + (1*4+0)*256*16 + rdi*8]
 
615
movzx edi, ah
 
616
add rdi, rdi
 
617
pxor xmm0, [rsi + 32 + (1*4+1)*256*16 + rdi*8]
 
618
shr eax, 16
 
619
movzx edi, al
 
620
add rdi, rdi
 
621
pxor xmm0, [rsi + 32 + (1*4+2)*256*16 + rdi*8]
 
622
movzx edi, ah
 
623
add rdi, rdi
 
624
pxor xmm0, [rsi + 32 + (1*4+3)*256*16 + rdi*8]
 
625
movd eax, xmm1
 
626
psrldq xmm1, 4
 
627
movzx edi, al
 
628
add rdi, rdi
 
629
pxor xmm0, [rsi + 32 + (2*4+0)*256*16 + rdi*8]
 
630
movzx edi, ah
 
631
add rdi, rdi
 
632
pxor xmm0, [rsi + 32 + (2*4+1)*256*16 + rdi*8]
 
633
shr eax, 16
 
634
movzx edi, al
 
635
add rdi, rdi
 
636
pxor xmm0, [rsi + 32 + (2*4+2)*256*16 + rdi*8]
 
637
movzx edi, ah
 
638
add rdi, rdi
 
639
pxor xmm0, [rsi + 32 + (2*4+3)*256*16 + rdi*8]
 
640
movd eax, xmm1
 
641
psrldq xmm1, 4
 
642
movzx edi, al
 
643
add rdi, rdi
 
644
pxor xmm0, [rsi + 32 + (3*4+0)*256*16 + rdi*8]
 
645
movzx edi, ah
 
646
add rdi, rdi
 
647
pxor xmm0, [rsi + 32 + (3*4+1)*256*16 + rdi*8]
 
648
shr eax, 16
 
649
movzx edi, al
 
650
add rdi, rdi
 
651
pxor xmm0, [rsi + 32 + (3*4+2)*256*16 + rdi*8]
 
652
movzx edi, ah
 
653
add rdi, rdi
 
654
pxor xmm0, [rsi + 32 + (3*4+3)*256*16 + rdi*8]
 
655
add rcx, 16
 
656
sub rdx, 1
 
657
jnz label1
 
658
movdqa [rsi], xmm0
 
659
pop rdi
 
660
pop rsi
 
661
ret
 
662
GCM_AuthenticateBlocks_64K ENDP
 
663
 
 
664
_TEXT ENDS
 
665
END