Initial import of binutils 2.22 on the new vendor branch
[dragonfly.git] / sys / dev / crypto / aesni / aesencdec_i386.S
1 /*-
2  * Copyright (c) 2010 Konstantin Belousov <kib@FreeBSD.org>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  * $FreeBSD: src/sys/crypto/aesni/aesencdec_i386.S,v 1.1 2010/07/23 11:00:46 kib Exp $
27  */
28
29 #include <machine/asmacros.h>
30
31 ENTRY(aesni_enc)
32         .cfi_startproc
33         pushl   %ebp
34         .cfi_adjust_cfa_offset 4
35         movl    %esp,%ebp
36         movl    8(%ebp),%ecx    /* rounds */
37         movl    16(%ebp),%edx
38         movdqu  (%edx),%xmm0    /* from */
39         movl    24(%ebp),%eax   /* iv */
40         cmpl    $0,%eax
41         je      1f
42         movdqu  (%eax),%xmm1
43         pxor    %xmm1,%xmm0
44 1:
45         movl    12(%ebp),%eax   /* key */
46         pxor    (%eax),%xmm0
47 2:
48         addl    $0x10,%eax
49 //      aesenc  (%eax),%xmm0
50         .byte   0x66,0x0f,0x38,0xdc,0x00
51         loopne  2b
52         addl    $0x10,%eax
53 //      aesenclast (%eax),%xmm0
54         .byte   0x66,0x0f,0x38,0xdd,0x00
55         movl    20(%ebp),%eax
56         movdqu  %xmm0,(%eax)    /* to */
57         leave
58         .cfi_adjust_cfa_offset -4
59         retl
60         .cfi_endproc
61 END(aesni_enc)
62
63 ENTRY(aesni_dec)
64         .cfi_startproc
65         pushl   %ebp
66         .cfi_adjust_cfa_offset 4
67         movl    %esp,%ebp
68         movl    8(%ebp),%ecx    /* rounds */
69         movl    16(%ebp),%edx
70         movdqu  (%edx),%xmm0    /* from */
71         movl    12(%ebp),%eax   /* key */
72         pxor    (%eax),%xmm0
73 1:
74         addl    $0x10,%eax
75 //      aesdec  (%eax),%xmm0
76         .byte   0x66,0x0f,0x38,0xde,0x00
77         loopne  1b
78         addl    $0x10,%eax
79 //      aesdeclast (%eax),%xmm0
80         .byte   0x66,0x0f,0x38,0xdf,0x00
81         movl    24(%ebp),%eax
82         cmpl    $0,%eax         /* iv */
83         je      2f
84         movdqu  (%eax),%xmm1
85         pxor    %xmm1,%xmm0
86 2:
87         movl    20(%ebp),%eax
88         movdqu  %xmm0,(%eax)    /* to */
89         leave
90         .cfi_adjust_cfa_offset -4
91         retl
92         .cfi_endproc
93 END(aesni_dec)
94
95 ENTRY(aesni_decrypt_cbc)
96         .cfi_startproc
97         pushl   %ebp
98         .cfi_adjust_cfa_offset 4
99         movl    %esp,%ebp
100         pushl   %ebx
101         pushl   %esi
102         movl    12(%ebp),%eax   /* key */
103         movl    16(%ebp),%ecx   /* length */
104         shrl    $4,%ecx
105         movl    20(%ebp),%ebx   /* buf */
106         movl    24(%ebp),%esi
107         movdqu  (%esi),%xmm1    /* iv */
108         movl    8(%ebp),%esi    /* rounds */
109 1:
110         movdqu  (%ebx),%xmm0
111         movdqa  %xmm0,%xmm2
112         pxor    (%eax),%xmm0
113         cmpl    $12,%esi
114 //      aesdec  0x10(%eax),%xmm0
115         .byte   0x66,0x0f,0x38,0xde,0x40,0x10
116 //      aesdec  0x20(%eax),%xmm0
117         .byte   0x66,0x0f,0x38,0xde,0x40,0x20
118 //      aesdec  0x30(%eax),%xmm0
119         .byte   0x66,0x0f,0x38,0xde,0x40,0x30
120 //      aesdec  0x40(%eax),%xmm0
121         .byte   0x66,0x0f,0x38,0xde,0x40,0x40
122 //      aesdec  0x50(%eax),%xmm0
123         .byte   0x66,0x0f,0x38,0xde,0x40,0x50
124 //      aesdec  0x60(%eax),%xmm0
125         .byte   0x66,0x0f,0x38,0xde,0x40,0x60
126 //      aesdec  0x70(%eax),%xmm0
127         .byte   0x66,0x0f,0x38,0xde,0x40,0x70
128 //      aesdec  0x80(%eax),%xmm0
129         .byte   0x66,0x0f,0x38,0xde,0x80,0x80,0x00,0x00,0x00
130 //      aesdec  0x90(%eax),%xmm0
131         .byte   0x66,0x0f,0x38,0xde,0x80,0x90,0x00,0x00,0x00
132         jge     2f
133 //      aesdeclast 0xa0(%eax),%xmm0
134         .byte   0x66,0x0f,0x38,0xdf,0x80,0xa0,0x00,0x00,0x00
135         jmp     4f
136 2:
137 //      aesdec  0xa0(%eax),%xmm0
138         .byte   0x66,0x0f,0x38,0xde,0x80,0xa0,0x00,0x00,0x00
139 //      aesdec  0xb0(%eax),%xmm0
140         .byte   0x66,0x0f,0x38,0xde,0x80,0xb0,0x00,0x00,0x00
141         jg      3f
142 //      aesdeclast 0xc0(%eax),%xmm0
143         .byte   0x66,0x0f,0x38,0xdf,0x80,0xc0,0x00,0x00,0x00
144         jmp     4f
145 3:
146 //      aesdec  0xc0(%eax),%xmm0
147         .byte   0x66,0x0f,0x38,0xde,0x80,0xc0,0x00,0x00,0x00
148 //      aesdec  0xd0(%eax),%xmm0
149         .byte   0x66,0x0f,0x38,0xde,0x80,0xd0,0x00,0x00,0x00
150 //      aesdeclast 0xe0(%eax),%xmm0
151         .byte   0x66,0x0f,0x38,0xdf,0x80,0xe0,0x00,0x00,0x00
152 4:
153         pxor    %xmm1,%xmm0
154         movdqu  %xmm0,(%ebx)
155         movdqa  %xmm2,%xmm1
156         addl    $0x10,%ebx
157         decl    %ecx
158         jne     1b
159
160         popl    %esi
161         popl    %ebx
162         leave
163         .cfi_adjust_cfa_offset -4
164         retl
165         .cfi_endproc
166 END(aesni_decrypt_cbc)