1*bed243d3SAndroid Build Coastguard Worker /*===----------------- keylockerintrin.h - KL Intrinsics -------------------===
2*bed243d3SAndroid Build Coastguard Worker *
3*bed243d3SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a copy
4*bed243d3SAndroid Build Coastguard Worker * of this software and associated documentation files (the "Software"), to deal
5*bed243d3SAndroid Build Coastguard Worker * in the Software without restriction, including without limitation the rights
6*bed243d3SAndroid Build Coastguard Worker * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7*bed243d3SAndroid Build Coastguard Worker * copies of the Software, and to permit persons to whom the Software is
8*bed243d3SAndroid Build Coastguard Worker * furnished to do so, subject to the following conditions:
9*bed243d3SAndroid Build Coastguard Worker *
10*bed243d3SAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included in
11*bed243d3SAndroid Build Coastguard Worker * all copies or substantial portions of the Software.
12*bed243d3SAndroid Build Coastguard Worker *
13*bed243d3SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14*bed243d3SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15*bed243d3SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16*bed243d3SAndroid Build Coastguard Worker * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17*bed243d3SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18*bed243d3SAndroid Build Coastguard Worker * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19*bed243d3SAndroid Build Coastguard Worker * THE SOFTWARE.
20*bed243d3SAndroid Build Coastguard Worker *
21*bed243d3SAndroid Build Coastguard Worker *===-----------------------------------------------------------------------===
22*bed243d3SAndroid Build Coastguard Worker */
23*bed243d3SAndroid Build Coastguard Worker
24*bed243d3SAndroid Build Coastguard Worker #ifndef __IMMINTRIN_H
25*bed243d3SAndroid Build Coastguard Worker #error "Never use <keylockerintrin.h> directly; include <immintrin.h> instead."
26*bed243d3SAndroid Build Coastguard Worker #endif
27*bed243d3SAndroid Build Coastguard Worker
28*bed243d3SAndroid Build Coastguard Worker #ifndef _KEYLOCKERINTRIN_H
29*bed243d3SAndroid Build Coastguard Worker #define _KEYLOCKERINTRIN_H
30*bed243d3SAndroid Build Coastguard Worker
31*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
32*bed243d3SAndroid Build Coastguard Worker defined(__KL__)
33*bed243d3SAndroid Build Coastguard Worker
34*bed243d3SAndroid Build Coastguard Worker /* Define the default attributes for the functions in this file. */
35*bed243d3SAndroid Build Coastguard Worker #define __DEFAULT_FN_ATTRS \
36*bed243d3SAndroid Build Coastguard Worker __attribute__((__always_inline__, __nodebug__, __target__("kl"),\
37*bed243d3SAndroid Build Coastguard Worker __min_vector_width__(128)))
38*bed243d3SAndroid Build Coastguard Worker
39*bed243d3SAndroid Build Coastguard Worker /// Load internal wrapping key from __intkey, __enkey_lo and __enkey_hi. __ctl
40*bed243d3SAndroid Build Coastguard Worker /// will assigned to EAX, whch specifies the KeySource and whether backing up
41*bed243d3SAndroid Build Coastguard Worker /// the key is permitted. The 256-bit encryption key is loaded from the two
42*bed243d3SAndroid Build Coastguard Worker /// explicit operands (__enkey_lo and __enkey_hi). The 128-bit integrity key is
43*bed243d3SAndroid Build Coastguard Worker /// loaded from the implicit operand XMM0 which assigned by __intkey.
44*bed243d3SAndroid Build Coastguard Worker ///
45*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
46*bed243d3SAndroid Build Coastguard Worker ///
47*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the <c> LOADIWKEY </c> instructions.
48*bed243d3SAndroid Build Coastguard Worker ///
49*bed243d3SAndroid Build Coastguard Worker /// \code{.operation}
50*bed243d3SAndroid Build Coastguard Worker /// IF CPL > 0 // LOADKWKEY only allowed at ring 0 (supervisor mode)
51*bed243d3SAndroid Build Coastguard Worker /// GP (0)
52*bed243d3SAndroid Build Coastguard Worker /// FI
53*bed243d3SAndroid Build Coastguard Worker /// IF “LOADIWKEY exiting” VM execution control set
54*bed243d3SAndroid Build Coastguard Worker /// VMexit
55*bed243d3SAndroid Build Coastguard Worker /// FI
56*bed243d3SAndroid Build Coastguard Worker /// IF __ctl[4:1] > 1 // Reserved KeySource encoding used
57*bed243d3SAndroid Build Coastguard Worker /// GP (0)
58*bed243d3SAndroid Build Coastguard Worker /// FI
59*bed243d3SAndroid Build Coastguard Worker /// IF __ctl[31:5] != 0 // Reserved bit in __ctl is set
60*bed243d3SAndroid Build Coastguard Worker /// GP (0)
61*bed243d3SAndroid Build Coastguard Worker /// FI
62*bed243d3SAndroid Build Coastguard Worker /// IF __ctl[0] AND (CPUID.19H.ECX[0] == 0) // NoBackup is not supported on this part
63*bed243d3SAndroid Build Coastguard Worker /// GP (0)
64*bed243d3SAndroid Build Coastguard Worker /// FI
65*bed243d3SAndroid Build Coastguard Worker /// IF (__ctl[4:1] == 1) AND (CPUID.19H.ECX[1] == 0) // KeySource of 1 is not supported on this part
66*bed243d3SAndroid Build Coastguard Worker /// GP (0)
67*bed243d3SAndroid Build Coastguard Worker /// FI
68*bed243d3SAndroid Build Coastguard Worker /// IF (__ctl[4:1] == 0) // KeySource of 0.
69*bed243d3SAndroid Build Coastguard Worker /// IWKey.Encryption Key[127:0] := __enkey_hi[127:0]:
70*bed243d3SAndroid Build Coastguard Worker /// IWKey.Encryption Key[255:128] := __enkey_lo[127:0]
71*bed243d3SAndroid Build Coastguard Worker /// IWKey.IntegrityKey[127:0] := __intkey[127:0]
72*bed243d3SAndroid Build Coastguard Worker /// IWKey.NoBackup := __ctl[0]
73*bed243d3SAndroid Build Coastguard Worker /// IWKey.KeySource := __ctl[4:1]
74*bed243d3SAndroid Build Coastguard Worker /// ZF := 0
75*bed243d3SAndroid Build Coastguard Worker /// ELSE // KeySource of 1. See RDSEED definition for details of randomness
76*bed243d3SAndroid Build Coastguard Worker /// IF HW_NRND_GEN.ready == 1 // Full-entropy random data from RDSEED was received
77*bed243d3SAndroid Build Coastguard Worker /// IWKey.Encryption Key[127:0] := __enkey_hi[127:0] XOR HW_NRND_GEN.data[127:0]
78*bed243d3SAndroid Build Coastguard Worker /// IWKey.Encryption Key[255:128] := __enkey_lo[127:0] XOR HW_NRND_GEN.data[255:128]
79*bed243d3SAndroid Build Coastguard Worker /// IWKey.Encryption Key[255:0] := __enkey_hi[127:0]:__enkey_lo[127:0] XOR HW_NRND_GEN.data[255:0]
80*bed243d3SAndroid Build Coastguard Worker /// IWKey.IntegrityKey[127:0] := __intkey[127:0] XOR HW_NRND_GEN.data[383:256]
81*bed243d3SAndroid Build Coastguard Worker /// IWKey.NoBackup := __ctl[0]
82*bed243d3SAndroid Build Coastguard Worker /// IWKey.KeySource := __ctl[4:1]
83*bed243d3SAndroid Build Coastguard Worker /// ZF := 0
84*bed243d3SAndroid Build Coastguard Worker /// ELSE // Random data was not returned from RDSEED. IWKey was not loaded
85*bed243d3SAndroid Build Coastguard Worker /// ZF := 1
86*bed243d3SAndroid Build Coastguard Worker /// FI
87*bed243d3SAndroid Build Coastguard Worker /// FI
88*bed243d3SAndroid Build Coastguard Worker /// dst := ZF
89*bed243d3SAndroid Build Coastguard Worker /// OF := 0
90*bed243d3SAndroid Build Coastguard Worker /// SF := 0
91*bed243d3SAndroid Build Coastguard Worker /// AF := 0
92*bed243d3SAndroid Build Coastguard Worker /// PF := 0
93*bed243d3SAndroid Build Coastguard Worker /// CF := 0
94*bed243d3SAndroid Build Coastguard Worker /// \endcode
95*bed243d3SAndroid Build Coastguard Worker static __inline__ void __DEFAULT_FN_ATTRS
_mm_loadiwkey(unsigned int __ctl,__m128i __intkey,__m128i __enkey_lo,__m128i __enkey_hi)96*bed243d3SAndroid Build Coastguard Worker _mm_loadiwkey (unsigned int __ctl, __m128i __intkey,
97*bed243d3SAndroid Build Coastguard Worker __m128i __enkey_lo, __m128i __enkey_hi) {
98*bed243d3SAndroid Build Coastguard Worker __builtin_ia32_loadiwkey (__intkey, __enkey_lo, __enkey_hi, __ctl);
99*bed243d3SAndroid Build Coastguard Worker }
100*bed243d3SAndroid Build Coastguard Worker
101*bed243d3SAndroid Build Coastguard Worker /// Wrap a 128-bit AES key from __key into a key handle and output in
102*bed243d3SAndroid Build Coastguard Worker /// ((__m128i*)__h) to ((__m128i*)__h) + 2 and a 32-bit value as return.
103*bed243d3SAndroid Build Coastguard Worker /// The explicit source operand __htype specifies handle restrictions.
104*bed243d3SAndroid Build Coastguard Worker ///
105*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
106*bed243d3SAndroid Build Coastguard Worker ///
107*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the <c> ENCODEKEY128 </c> instructions.
108*bed243d3SAndroid Build Coastguard Worker ///
109*bed243d3SAndroid Build Coastguard Worker /// \code{.operation}
110*bed243d3SAndroid Build Coastguard Worker /// InputKey[127:0] := __key[127:0]
111*bed243d3SAndroid Build Coastguard Worker /// KeyMetadata[2:0] := __htype[2:0]
112*bed243d3SAndroid Build Coastguard Worker /// KeyMetadata[23:3] := 0 // Reserved for future usage
113*bed243d3SAndroid Build Coastguard Worker /// KeyMetadata[27:24] := 0 // KeyType is AES-128 (value of 0)
114*bed243d3SAndroid Build Coastguard Worker /// KeyMetadata[127:28] := 0 // Reserved for future usage
115*bed243d3SAndroid Build Coastguard Worker /// Handle[383:0] := WrapKey128(InputKey[127:0], KeyMetadata[127:0],
116*bed243d3SAndroid Build Coastguard Worker /// IWKey.Integrity Key[127:0], IWKey.Encryption Key[255:0])
117*bed243d3SAndroid Build Coastguard Worker /// dst[0] := IWKey.NoBackup
118*bed243d3SAndroid Build Coastguard Worker /// dst[4:1] := IWKey.KeySource[3:0]
119*bed243d3SAndroid Build Coastguard Worker /// dst[31:5] := 0
120*bed243d3SAndroid Build Coastguard Worker /// MEM[__h+127:__h] := Handle[127:0] // AAD
121*bed243d3SAndroid Build Coastguard Worker /// MEM[__h+255:__h+128] := Handle[255:128] // Integrity Tag
122*bed243d3SAndroid Build Coastguard Worker /// MEM[__h+383:__h+256] := Handle[383:256] // CipherText
123*bed243d3SAndroid Build Coastguard Worker /// OF := 0
124*bed243d3SAndroid Build Coastguard Worker /// SF := 0
125*bed243d3SAndroid Build Coastguard Worker /// ZF := 0
126*bed243d3SAndroid Build Coastguard Worker /// AF := 0
127*bed243d3SAndroid Build Coastguard Worker /// PF := 0
128*bed243d3SAndroid Build Coastguard Worker /// CF := 0
129*bed243d3SAndroid Build Coastguard Worker /// \endcode
130*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned int __DEFAULT_FN_ATTRS
_mm_encodekey128_u32(unsigned int __htype,__m128i __key,void * __h)131*bed243d3SAndroid Build Coastguard Worker _mm_encodekey128_u32(unsigned int __htype, __m128i __key, void *__h) {
132*bed243d3SAndroid Build Coastguard Worker return __builtin_ia32_encodekey128_u32(__htype, (__v2di)__key, __h);
133*bed243d3SAndroid Build Coastguard Worker }
134*bed243d3SAndroid Build Coastguard Worker
135*bed243d3SAndroid Build Coastguard Worker /// Wrap a 256-bit AES key from __key_hi:__key_lo into a key handle, then
136*bed243d3SAndroid Build Coastguard Worker /// output handle in ((__m128i*)__h) to ((__m128i*)__h) + 3 and
137*bed243d3SAndroid Build Coastguard Worker /// a 32-bit value as return.
138*bed243d3SAndroid Build Coastguard Worker /// The explicit source operand __htype specifies handle restrictions.
139*bed243d3SAndroid Build Coastguard Worker ///
140*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
141*bed243d3SAndroid Build Coastguard Worker ///
142*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the <c> ENCODEKEY256 </c> instructions.
143*bed243d3SAndroid Build Coastguard Worker ///
144*bed243d3SAndroid Build Coastguard Worker /// \code{.operation}
145*bed243d3SAndroid Build Coastguard Worker /// InputKey[127:0] := __key_lo[127:0]
146*bed243d3SAndroid Build Coastguard Worker /// InputKey[255:128] := __key_hi[255:128]
147*bed243d3SAndroid Build Coastguard Worker /// KeyMetadata[2:0] := __htype[2:0]
148*bed243d3SAndroid Build Coastguard Worker /// KeyMetadata[23:3] := 0 // Reserved for future usage
149*bed243d3SAndroid Build Coastguard Worker /// KeyMetadata[27:24] := 1 // KeyType is AES-256 (value of 1)
150*bed243d3SAndroid Build Coastguard Worker /// KeyMetadata[127:28] := 0 // Reserved for future usage
151*bed243d3SAndroid Build Coastguard Worker /// Handle[511:0] := WrapKey256(InputKey[255:0], KeyMetadata[127:0],
152*bed243d3SAndroid Build Coastguard Worker /// IWKey.Integrity Key[127:0], IWKey.Encryption Key[255:0])
153*bed243d3SAndroid Build Coastguard Worker /// dst[0] := IWKey.NoBackup
154*bed243d3SAndroid Build Coastguard Worker /// dst[4:1] := IWKey.KeySource[3:0]
155*bed243d3SAndroid Build Coastguard Worker /// dst[31:5] := 0
156*bed243d3SAndroid Build Coastguard Worker /// MEM[__h+127:__h] := Handle[127:0] // AAD
157*bed243d3SAndroid Build Coastguard Worker /// MEM[__h+255:__h+128] := Handle[255:128] // Tag
158*bed243d3SAndroid Build Coastguard Worker /// MEM[__h+383:__h+256] := Handle[383:256] // CipherText[127:0]
159*bed243d3SAndroid Build Coastguard Worker /// MEM[__h+511:__h+384] := Handle[511:384] // CipherText[255:128]
160*bed243d3SAndroid Build Coastguard Worker /// OF := 0
161*bed243d3SAndroid Build Coastguard Worker /// SF := 0
162*bed243d3SAndroid Build Coastguard Worker /// ZF := 0
163*bed243d3SAndroid Build Coastguard Worker /// AF := 0
164*bed243d3SAndroid Build Coastguard Worker /// PF := 0
165*bed243d3SAndroid Build Coastguard Worker /// CF := 0
166*bed243d3SAndroid Build Coastguard Worker /// \endcode
167*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned int __DEFAULT_FN_ATTRS
_mm_encodekey256_u32(unsigned int __htype,__m128i __key_lo,__m128i __key_hi,void * __h)168*bed243d3SAndroid Build Coastguard Worker _mm_encodekey256_u32(unsigned int __htype, __m128i __key_lo, __m128i __key_hi,
169*bed243d3SAndroid Build Coastguard Worker void *__h) {
170*bed243d3SAndroid Build Coastguard Worker return __builtin_ia32_encodekey256_u32(__htype, (__v2di)__key_lo,
171*bed243d3SAndroid Build Coastguard Worker (__v2di)__key_hi, __h);
172*bed243d3SAndroid Build Coastguard Worker }
173*bed243d3SAndroid Build Coastguard Worker
174*bed243d3SAndroid Build Coastguard Worker /// The AESENC128KL performs 10 rounds of AES to encrypt the __idata using
175*bed243d3SAndroid Build Coastguard Worker /// the 128-bit key in the handle from the __h. It stores the result in the
176*bed243d3SAndroid Build Coastguard Worker /// __odata. And return the affected ZF flag status.
177*bed243d3SAndroid Build Coastguard Worker ///
178*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
179*bed243d3SAndroid Build Coastguard Worker ///
180*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the <c> AESENC128KL </c> instructions.
181*bed243d3SAndroid Build Coastguard Worker ///
182*bed243d3SAndroid Build Coastguard Worker /// \code{.operation}
183*bed243d3SAndroid Build Coastguard Worker /// Handle[383:0] := MEM[__h+383:__h] // Load is not guaranteed to be atomic.
184*bed243d3SAndroid Build Coastguard Worker /// IllegalHandle := ( HandleReservedBitSet (Handle[383:0]) ||
185*bed243d3SAndroid Build Coastguard Worker /// (Handle[127:0] AND (CPL > 0)) ||
186*bed243d3SAndroid Build Coastguard Worker /// Handle[383:256] ||
187*bed243d3SAndroid Build Coastguard Worker /// HandleKeyType (Handle[383:0]) != HANDLE_KEY_TYPE_AES128 )
188*bed243d3SAndroid Build Coastguard Worker /// IF (IllegalHandle)
189*bed243d3SAndroid Build Coastguard Worker /// ZF := 1
190*bed243d3SAndroid Build Coastguard Worker /// ELSE
191*bed243d3SAndroid Build Coastguard Worker /// (UnwrappedKey, Authentic) := UnwrapKeyAndAuthenticate384 (Handle[383:0], IWKey)
192*bed243d3SAndroid Build Coastguard Worker /// IF (Authentic == 0)
193*bed243d3SAndroid Build Coastguard Worker /// ZF := 1
194*bed243d3SAndroid Build Coastguard Worker /// ELSE
195*bed243d3SAndroid Build Coastguard Worker /// MEM[__odata+127:__odata] := AES128Encrypt (__idata[127:0], UnwrappedKey)
196*bed243d3SAndroid Build Coastguard Worker /// ZF := 0
197*bed243d3SAndroid Build Coastguard Worker /// FI
198*bed243d3SAndroid Build Coastguard Worker /// FI
199*bed243d3SAndroid Build Coastguard Worker /// dst := ZF
200*bed243d3SAndroid Build Coastguard Worker /// OF := 0
201*bed243d3SAndroid Build Coastguard Worker /// SF := 0
202*bed243d3SAndroid Build Coastguard Worker /// AF := 0
203*bed243d3SAndroid Build Coastguard Worker /// PF := 0
204*bed243d3SAndroid Build Coastguard Worker /// CF := 0
205*bed243d3SAndroid Build Coastguard Worker /// \endcode
206*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned char __DEFAULT_FN_ATTRS
_mm_aesenc128kl_u8(__m128i * __odata,__m128i __idata,const void * __h)207*bed243d3SAndroid Build Coastguard Worker _mm_aesenc128kl_u8(__m128i* __odata, __m128i __idata, const void *__h) {
208*bed243d3SAndroid Build Coastguard Worker return __builtin_ia32_aesenc128kl_u8((__v2di *)__odata, (__v2di)__idata, __h);
209*bed243d3SAndroid Build Coastguard Worker }
210*bed243d3SAndroid Build Coastguard Worker
211*bed243d3SAndroid Build Coastguard Worker /// The AESENC256KL performs 14 rounds of AES to encrypt the __idata using
212*bed243d3SAndroid Build Coastguard Worker /// the 256-bit key in the handle from the __h. It stores the result in the
213*bed243d3SAndroid Build Coastguard Worker /// __odata. And return the affected ZF flag status.
214*bed243d3SAndroid Build Coastguard Worker ///
215*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
216*bed243d3SAndroid Build Coastguard Worker ///
217*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the <c> AESENC256KL </c> instructions.
218*bed243d3SAndroid Build Coastguard Worker ///
219*bed243d3SAndroid Build Coastguard Worker /// \code{.operation}
220*bed243d3SAndroid Build Coastguard Worker /// Handle[511:0] := MEM[__h+511:__h] // Load is not guaranteed to be atomic.
221*bed243d3SAndroid Build Coastguard Worker /// IllegalHandle := ( HandleReservedBitSet (Handle[511:0]) ||
222*bed243d3SAndroid Build Coastguard Worker /// (Handle[127:0] AND (CPL > 0)) ||
223*bed243d3SAndroid Build Coastguard Worker /// Handle[255:128] ||
224*bed243d3SAndroid Build Coastguard Worker /// HandleKeyType (Handle[511:0]) != HANDLE_KEY_TYPE_AES256 )
225*bed243d3SAndroid Build Coastguard Worker /// IF (IllegalHandle)
226*bed243d3SAndroid Build Coastguard Worker /// ZF := 1
227*bed243d3SAndroid Build Coastguard Worker /// MEM[__odata+127:__odata] := 0
228*bed243d3SAndroid Build Coastguard Worker /// ELSE
229*bed243d3SAndroid Build Coastguard Worker /// (UnwrappedKey, Authentic) := UnwrapKeyAndAuthenticate512 (Handle[511:0], IWKey)
230*bed243d3SAndroid Build Coastguard Worker /// IF (Authentic == 0)
231*bed243d3SAndroid Build Coastguard Worker /// ZF := 1
232*bed243d3SAndroid Build Coastguard Worker /// MEM[__odata+127:__odata] := 0
233*bed243d3SAndroid Build Coastguard Worker /// ELSE
234*bed243d3SAndroid Build Coastguard Worker /// MEM[__odata+127:__odata] := AES256Encrypt (__idata[127:0], UnwrappedKey)
235*bed243d3SAndroid Build Coastguard Worker /// ZF := 0
236*bed243d3SAndroid Build Coastguard Worker /// FI
237*bed243d3SAndroid Build Coastguard Worker /// FI
238*bed243d3SAndroid Build Coastguard Worker /// dst := ZF
239*bed243d3SAndroid Build Coastguard Worker /// OF := 0
240*bed243d3SAndroid Build Coastguard Worker /// SF := 0
241*bed243d3SAndroid Build Coastguard Worker /// AF := 0
242*bed243d3SAndroid Build Coastguard Worker /// PF := 0
243*bed243d3SAndroid Build Coastguard Worker /// CF := 0
244*bed243d3SAndroid Build Coastguard Worker /// \endcode
245*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned char __DEFAULT_FN_ATTRS
_mm_aesenc256kl_u8(__m128i * __odata,__m128i __idata,const void * __h)246*bed243d3SAndroid Build Coastguard Worker _mm_aesenc256kl_u8(__m128i* __odata, __m128i __idata, const void *__h) {
247*bed243d3SAndroid Build Coastguard Worker return __builtin_ia32_aesenc256kl_u8((__v2di *)__odata, (__v2di)__idata, __h);
248*bed243d3SAndroid Build Coastguard Worker }
249*bed243d3SAndroid Build Coastguard Worker
250*bed243d3SAndroid Build Coastguard Worker /// The AESDEC128KL performs 10 rounds of AES to decrypt the __idata using
251*bed243d3SAndroid Build Coastguard Worker /// the 128-bit key in the handle from the __h. It stores the result in the
252*bed243d3SAndroid Build Coastguard Worker /// __odata. And return the affected ZF flag status.
253*bed243d3SAndroid Build Coastguard Worker ///
254*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
255*bed243d3SAndroid Build Coastguard Worker ///
256*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the <c> AESDEC128KL </c> instructions.
257*bed243d3SAndroid Build Coastguard Worker ///
258*bed243d3SAndroid Build Coastguard Worker /// \code{.operation}
259*bed243d3SAndroid Build Coastguard Worker /// Handle[383:0] := MEM[__h+383:__h] // Load is not guaranteed to be atomic.
260*bed243d3SAndroid Build Coastguard Worker /// IllegalHandle := (HandleReservedBitSet (Handle[383:0]) ||
261*bed243d3SAndroid Build Coastguard Worker /// (Handle[127:0] AND (CPL > 0)) ||
262*bed243d3SAndroid Build Coastguard Worker /// Handle[383:256] ||
263*bed243d3SAndroid Build Coastguard Worker /// HandleKeyType (Handle[383:0]) != HANDLE_KEY_TYPE_AES128)
264*bed243d3SAndroid Build Coastguard Worker /// IF (IllegalHandle)
265*bed243d3SAndroid Build Coastguard Worker /// ZF := 1
266*bed243d3SAndroid Build Coastguard Worker /// MEM[__odata+127:__odata] := 0
267*bed243d3SAndroid Build Coastguard Worker /// ELSE
268*bed243d3SAndroid Build Coastguard Worker /// (UnwrappedKey, Authentic) := UnwrapKeyAndAuthenticate384 (Handle[383:0], IWKey)
269*bed243d3SAndroid Build Coastguard Worker /// IF (Authentic == 0)
270*bed243d3SAndroid Build Coastguard Worker /// ZF := 1
271*bed243d3SAndroid Build Coastguard Worker /// MEM[__odata+127:__odata] := 0
272*bed243d3SAndroid Build Coastguard Worker /// ELSE
273*bed243d3SAndroid Build Coastguard Worker /// MEM[__odata+127:__odata] := AES128Decrypt (__idata[127:0], UnwrappedKey)
274*bed243d3SAndroid Build Coastguard Worker /// ZF := 0
275*bed243d3SAndroid Build Coastguard Worker /// FI
276*bed243d3SAndroid Build Coastguard Worker /// FI
277*bed243d3SAndroid Build Coastguard Worker /// dst := ZF
278*bed243d3SAndroid Build Coastguard Worker /// OF := 0
279*bed243d3SAndroid Build Coastguard Worker /// SF := 0
280*bed243d3SAndroid Build Coastguard Worker /// AF := 0
281*bed243d3SAndroid Build Coastguard Worker /// PF := 0
282*bed243d3SAndroid Build Coastguard Worker /// CF := 0
283*bed243d3SAndroid Build Coastguard Worker /// \endcode
284*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned char __DEFAULT_FN_ATTRS
_mm_aesdec128kl_u8(__m128i * __odata,__m128i __idata,const void * __h)285*bed243d3SAndroid Build Coastguard Worker _mm_aesdec128kl_u8(__m128i* __odata, __m128i __idata, const void *__h) {
286*bed243d3SAndroid Build Coastguard Worker return __builtin_ia32_aesdec128kl_u8((__v2di *)__odata, (__v2di)__idata, __h);
287*bed243d3SAndroid Build Coastguard Worker }
288*bed243d3SAndroid Build Coastguard Worker
289*bed243d3SAndroid Build Coastguard Worker /// The AESDEC256KL performs 10 rounds of AES to decrypt the __idata using
290*bed243d3SAndroid Build Coastguard Worker /// the 256-bit key in the handle from the __h. It stores the result in the
291*bed243d3SAndroid Build Coastguard Worker /// __odata. And return the affected ZF flag status.
292*bed243d3SAndroid Build Coastguard Worker ///
293*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
294*bed243d3SAndroid Build Coastguard Worker ///
295*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the <c> AESDEC256KL </c> instructions.
296*bed243d3SAndroid Build Coastguard Worker ///
297*bed243d3SAndroid Build Coastguard Worker /// \code{.operation}
298*bed243d3SAndroid Build Coastguard Worker /// Handle[511:0] := MEM[__h+511:__h]
299*bed243d3SAndroid Build Coastguard Worker /// IllegalHandle := (HandleReservedBitSet (Handle[511:0]) ||
300*bed243d3SAndroid Build Coastguard Worker /// (Handle[127:0] AND (CPL > 0)) ||
301*bed243d3SAndroid Build Coastguard Worker /// Handle[383:256] ||
302*bed243d3SAndroid Build Coastguard Worker /// HandleKeyType (Handle[511:0]) != HANDLE_KEY_TYPE_AES256)
303*bed243d3SAndroid Build Coastguard Worker /// IF (IllegalHandle)
304*bed243d3SAndroid Build Coastguard Worker /// ZF := 1
305*bed243d3SAndroid Build Coastguard Worker /// MEM[__odata+127:__odata] := 0
306*bed243d3SAndroid Build Coastguard Worker /// ELSE
307*bed243d3SAndroid Build Coastguard Worker /// (UnwrappedKey, Authentic) := UnwrapKeyAndAuthenticate512 (Handle[511:0], IWKey)
308*bed243d3SAndroid Build Coastguard Worker /// IF (Authentic == 0)
309*bed243d3SAndroid Build Coastguard Worker /// ZF := 1
310*bed243d3SAndroid Build Coastguard Worker /// MEM[__odata+127:__odata] := 0
311*bed243d3SAndroid Build Coastguard Worker /// ELSE
312*bed243d3SAndroid Build Coastguard Worker /// MEM[__odata+127:__odata] := AES256Decrypt (__idata[127:0], UnwrappedKey)
313*bed243d3SAndroid Build Coastguard Worker /// ZF := 0
314*bed243d3SAndroid Build Coastguard Worker /// FI
315*bed243d3SAndroid Build Coastguard Worker /// FI
316*bed243d3SAndroid Build Coastguard Worker /// dst := ZF
317*bed243d3SAndroid Build Coastguard Worker /// OF := 0
318*bed243d3SAndroid Build Coastguard Worker /// SF := 0
319*bed243d3SAndroid Build Coastguard Worker /// AF := 0
320*bed243d3SAndroid Build Coastguard Worker /// PF := 0
321*bed243d3SAndroid Build Coastguard Worker /// CF := 0
322*bed243d3SAndroid Build Coastguard Worker /// \endcode
323*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned char __DEFAULT_FN_ATTRS
_mm_aesdec256kl_u8(__m128i * __odata,__m128i __idata,const void * __h)324*bed243d3SAndroid Build Coastguard Worker _mm_aesdec256kl_u8(__m128i* __odata, __m128i __idata, const void *__h) {
325*bed243d3SAndroid Build Coastguard Worker return __builtin_ia32_aesdec256kl_u8((__v2di *)__odata, (__v2di)__idata, __h);
326*bed243d3SAndroid Build Coastguard Worker }
327*bed243d3SAndroid Build Coastguard Worker
328*bed243d3SAndroid Build Coastguard Worker #undef __DEFAULT_FN_ATTRS
329*bed243d3SAndroid Build Coastguard Worker
330*bed243d3SAndroid Build Coastguard Worker #endif /* !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) \
331*bed243d3SAndroid Build Coastguard Worker || defined(__KL__) */
332*bed243d3SAndroid Build Coastguard Worker
333*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
334*bed243d3SAndroid Build Coastguard Worker defined(__WIDEKL__)
335*bed243d3SAndroid Build Coastguard Worker
336*bed243d3SAndroid Build Coastguard Worker /* Define the default attributes for the functions in this file. */
337*bed243d3SAndroid Build Coastguard Worker #define __DEFAULT_FN_ATTRS \
338*bed243d3SAndroid Build Coastguard Worker __attribute__((__always_inline__, __nodebug__, __target__("kl,widekl"),\
339*bed243d3SAndroid Build Coastguard Worker __min_vector_width__(128)))
340*bed243d3SAndroid Build Coastguard Worker
341*bed243d3SAndroid Build Coastguard Worker /// Encrypt __idata[0] to __idata[7] using 128-bit AES key indicated by handle
342*bed243d3SAndroid Build Coastguard Worker /// at __h and store each resultant block back from __odata to __odata+7. And
343*bed243d3SAndroid Build Coastguard Worker /// return the affected ZF flag status.
344*bed243d3SAndroid Build Coastguard Worker ///
345*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
346*bed243d3SAndroid Build Coastguard Worker ///
347*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the <c> AESENCWIDE128KL </c> instructions.
348*bed243d3SAndroid Build Coastguard Worker ///
349*bed243d3SAndroid Build Coastguard Worker /// \code{.operation}
350*bed243d3SAndroid Build Coastguard Worker /// Handle := MEM[__h+383:__h]
351*bed243d3SAndroid Build Coastguard Worker /// IllegalHandle := ( HandleReservedBitSet (Handle[383:0]) ||
352*bed243d3SAndroid Build Coastguard Worker /// (Handle[127:0] AND (CPL > 0)) ||
353*bed243d3SAndroid Build Coastguard Worker /// Handle[255:128] ||
354*bed243d3SAndroid Build Coastguard Worker /// HandleKeyType (Handle[383:0]) != HANDLE_KEY_TYPE_AES128 )
355*bed243d3SAndroid Build Coastguard Worker /// IF (IllegalHandle)
356*bed243d3SAndroid Build Coastguard Worker /// ZF := 1
357*bed243d3SAndroid Build Coastguard Worker /// FOR i := 0 to 7
358*bed243d3SAndroid Build Coastguard Worker /// __odata[i] := 0
359*bed243d3SAndroid Build Coastguard Worker /// ENDFOR
360*bed243d3SAndroid Build Coastguard Worker /// ELSE
361*bed243d3SAndroid Build Coastguard Worker /// (UnwrappedKey, Authentic) := UnwrapKeyAndAuthenticate384 (Handle[383:0], IWKey)
362*bed243d3SAndroid Build Coastguard Worker /// IF Authentic == 0
363*bed243d3SAndroid Build Coastguard Worker /// ZF := 1
364*bed243d3SAndroid Build Coastguard Worker /// FOR i := 0 to 7
365*bed243d3SAndroid Build Coastguard Worker /// __odata[i] := 0
366*bed243d3SAndroid Build Coastguard Worker /// ENDFOR
367*bed243d3SAndroid Build Coastguard Worker /// ELSE
368*bed243d3SAndroid Build Coastguard Worker /// FOR i := 0 to 7
369*bed243d3SAndroid Build Coastguard Worker /// __odata[i] := AES128Encrypt (__idata[i], UnwrappedKey)
370*bed243d3SAndroid Build Coastguard Worker /// ENDFOR
371*bed243d3SAndroid Build Coastguard Worker /// ZF := 0
372*bed243d3SAndroid Build Coastguard Worker /// FI
373*bed243d3SAndroid Build Coastguard Worker /// FI
374*bed243d3SAndroid Build Coastguard Worker /// dst := ZF
375*bed243d3SAndroid Build Coastguard Worker /// OF := 0
376*bed243d3SAndroid Build Coastguard Worker /// SF := 0
377*bed243d3SAndroid Build Coastguard Worker /// AF := 0
378*bed243d3SAndroid Build Coastguard Worker /// PF := 0
379*bed243d3SAndroid Build Coastguard Worker /// CF := 0
380*bed243d3SAndroid Build Coastguard Worker /// \endcode
381*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned char __DEFAULT_FN_ATTRS
_mm_aesencwide128kl_u8(__m128i __odata[8],const __m128i __idata[8],const void * __h)382*bed243d3SAndroid Build Coastguard Worker _mm_aesencwide128kl_u8(__m128i __odata[8], const __m128i __idata[8], const void* __h) {
383*bed243d3SAndroid Build Coastguard Worker return __builtin_ia32_aesencwide128kl_u8((__v2di *)__odata,
384*bed243d3SAndroid Build Coastguard Worker (const __v2di *)__idata, __h);
385*bed243d3SAndroid Build Coastguard Worker }
386*bed243d3SAndroid Build Coastguard Worker
387*bed243d3SAndroid Build Coastguard Worker /// Encrypt __idata[0] to __idata[7] using 256-bit AES key indicated by handle
388*bed243d3SAndroid Build Coastguard Worker /// at __h and store each resultant block back from __odata to __odata+7. And
389*bed243d3SAndroid Build Coastguard Worker /// return the affected ZF flag status.
390*bed243d3SAndroid Build Coastguard Worker ///
391*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
392*bed243d3SAndroid Build Coastguard Worker ///
393*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the <c> AESENCWIDE256KL </c> instructions.
394*bed243d3SAndroid Build Coastguard Worker ///
395*bed243d3SAndroid Build Coastguard Worker /// \code{.operation}
396*bed243d3SAndroid Build Coastguard Worker /// Handle[511:0] := MEM[__h+511:__h]
397*bed243d3SAndroid Build Coastguard Worker /// IllegalHandle := ( HandleReservedBitSet (Handle[511:0]) ||
398*bed243d3SAndroid Build Coastguard Worker /// (Handle[127:0] AND (CPL > 0)) ||
399*bed243d3SAndroid Build Coastguard Worker /// Handle[255:128] ||
400*bed243d3SAndroid Build Coastguard Worker /// HandleKeyType (Handle[511:0]) != HANDLE_KEY_TYPE_AES512 )
401*bed243d3SAndroid Build Coastguard Worker /// IF (IllegalHandle)
402*bed243d3SAndroid Build Coastguard Worker /// ZF := 1
403*bed243d3SAndroid Build Coastguard Worker /// FOR i := 0 to 7
404*bed243d3SAndroid Build Coastguard Worker /// __odata[i] := 0
405*bed243d3SAndroid Build Coastguard Worker /// ENDFOR
406*bed243d3SAndroid Build Coastguard Worker /// ELSE
407*bed243d3SAndroid Build Coastguard Worker /// (UnwrappedKey, Authentic) := UnwrapKeyAndAuthenticate512 (Handle[511:0], IWKey)
408*bed243d3SAndroid Build Coastguard Worker /// IF Authentic == 0
409*bed243d3SAndroid Build Coastguard Worker /// ZF := 1
410*bed243d3SAndroid Build Coastguard Worker /// FOR i := 0 to 7
411*bed243d3SAndroid Build Coastguard Worker /// __odata[i] := 0
412*bed243d3SAndroid Build Coastguard Worker /// ENDFOR
413*bed243d3SAndroid Build Coastguard Worker /// ELSE
414*bed243d3SAndroid Build Coastguard Worker /// FOR i := 0 to 7
415*bed243d3SAndroid Build Coastguard Worker /// __odata[i] := AES256Encrypt (__idata[i], UnwrappedKey)
416*bed243d3SAndroid Build Coastguard Worker /// ENDFOR
417*bed243d3SAndroid Build Coastguard Worker /// ZF := 0
418*bed243d3SAndroid Build Coastguard Worker /// FI
419*bed243d3SAndroid Build Coastguard Worker /// FI
420*bed243d3SAndroid Build Coastguard Worker /// dst := ZF
421*bed243d3SAndroid Build Coastguard Worker /// OF := 0
422*bed243d3SAndroid Build Coastguard Worker /// SF := 0
423*bed243d3SAndroid Build Coastguard Worker /// AF := 0
424*bed243d3SAndroid Build Coastguard Worker /// PF := 0
425*bed243d3SAndroid Build Coastguard Worker /// CF := 0
426*bed243d3SAndroid Build Coastguard Worker /// \endcode
427*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned char __DEFAULT_FN_ATTRS
_mm_aesencwide256kl_u8(__m128i __odata[8],const __m128i __idata[8],const void * __h)428*bed243d3SAndroid Build Coastguard Worker _mm_aesencwide256kl_u8(__m128i __odata[8], const __m128i __idata[8], const void* __h) {
429*bed243d3SAndroid Build Coastguard Worker return __builtin_ia32_aesencwide256kl_u8((__v2di *)__odata,
430*bed243d3SAndroid Build Coastguard Worker (const __v2di *)__idata, __h);
431*bed243d3SAndroid Build Coastguard Worker }
432*bed243d3SAndroid Build Coastguard Worker
433*bed243d3SAndroid Build Coastguard Worker /// Decrypt __idata[0] to __idata[7] using 128-bit AES key indicated by handle
434*bed243d3SAndroid Build Coastguard Worker /// at __h and store each resultant block back from __odata to __odata+7. And
435*bed243d3SAndroid Build Coastguard Worker /// return the affected ZF flag status.
436*bed243d3SAndroid Build Coastguard Worker ///
437*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
438*bed243d3SAndroid Build Coastguard Worker ///
439*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the <c> AESDECWIDE128KL </c> instructions.
440*bed243d3SAndroid Build Coastguard Worker ///
441*bed243d3SAndroid Build Coastguard Worker /// \code{.operation}
442*bed243d3SAndroid Build Coastguard Worker /// Handle[383:0] := MEM[__h+383:__h]
443*bed243d3SAndroid Build Coastguard Worker /// IllegalHandle := ( HandleReservedBitSet (Handle[383:0]) ||
444*bed243d3SAndroid Build Coastguard Worker /// (Handle[127:0] AND (CPL > 0)) ||
445*bed243d3SAndroid Build Coastguard Worker /// Handle[255:128] ||
446*bed243d3SAndroid Build Coastguard Worker /// HandleKeyType (Handle) != HANDLE_KEY_TYPE_AES128 )
447*bed243d3SAndroid Build Coastguard Worker /// IF (IllegalHandle)
448*bed243d3SAndroid Build Coastguard Worker /// ZF := 1
449*bed243d3SAndroid Build Coastguard Worker /// FOR i := 0 to 7
450*bed243d3SAndroid Build Coastguard Worker /// __odata[i] := 0
451*bed243d3SAndroid Build Coastguard Worker /// ENDFOR
452*bed243d3SAndroid Build Coastguard Worker /// ELSE
453*bed243d3SAndroid Build Coastguard Worker /// (UnwrappedKey, Authentic) := UnwrapKeyAndAuthenticate384 (Handle[383:0], IWKey)
454*bed243d3SAndroid Build Coastguard Worker /// IF Authentic == 0
455*bed243d3SAndroid Build Coastguard Worker /// ZF := 1
456*bed243d3SAndroid Build Coastguard Worker /// FOR i := 0 to 7
457*bed243d3SAndroid Build Coastguard Worker /// __odata[i] := 0
458*bed243d3SAndroid Build Coastguard Worker /// ENDFOR
459*bed243d3SAndroid Build Coastguard Worker /// ELSE
460*bed243d3SAndroid Build Coastguard Worker /// FOR i := 0 to 7
461*bed243d3SAndroid Build Coastguard Worker /// __odata[i] := AES128Decrypt (__idata[i], UnwrappedKey)
462*bed243d3SAndroid Build Coastguard Worker /// ENDFOR
463*bed243d3SAndroid Build Coastguard Worker /// ZF := 0
464*bed243d3SAndroid Build Coastguard Worker /// FI
465*bed243d3SAndroid Build Coastguard Worker /// FI
466*bed243d3SAndroid Build Coastguard Worker /// dst := ZF
467*bed243d3SAndroid Build Coastguard Worker /// OF := 0
468*bed243d3SAndroid Build Coastguard Worker /// SF := 0
469*bed243d3SAndroid Build Coastguard Worker /// AF := 0
470*bed243d3SAndroid Build Coastguard Worker /// PF := 0
471*bed243d3SAndroid Build Coastguard Worker /// CF := 0
472*bed243d3SAndroid Build Coastguard Worker /// \endcode
473*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned char __DEFAULT_FN_ATTRS
_mm_aesdecwide128kl_u8(__m128i __odata[8],const __m128i __idata[8],const void * __h)474*bed243d3SAndroid Build Coastguard Worker _mm_aesdecwide128kl_u8(__m128i __odata[8], const __m128i __idata[8], const void* __h) {
475*bed243d3SAndroid Build Coastguard Worker return __builtin_ia32_aesdecwide128kl_u8((__v2di *)__odata,
476*bed243d3SAndroid Build Coastguard Worker (const __v2di *)__idata, __h);
477*bed243d3SAndroid Build Coastguard Worker }
478*bed243d3SAndroid Build Coastguard Worker
479*bed243d3SAndroid Build Coastguard Worker /// Decrypt __idata[0] to __idata[7] using 256-bit AES key indicated by handle
480*bed243d3SAndroid Build Coastguard Worker /// at __h and store each resultant block back from __odata to __odata+7. And
481*bed243d3SAndroid Build Coastguard Worker /// return the affected ZF flag status.
482*bed243d3SAndroid Build Coastguard Worker ///
483*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
484*bed243d3SAndroid Build Coastguard Worker ///
485*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the <c> AESDECWIDE256KL </c> instructions.
486*bed243d3SAndroid Build Coastguard Worker ///
487*bed243d3SAndroid Build Coastguard Worker /// \code{.operation}
488*bed243d3SAndroid Build Coastguard Worker /// Handle[511:0] := MEM[__h+511:__h]
489*bed243d3SAndroid Build Coastguard Worker /// IllegalHandle = ( HandleReservedBitSet (Handle[511:0]) ||
490*bed243d3SAndroid Build Coastguard Worker /// (Handle[127:0] AND (CPL > 0)) ||
491*bed243d3SAndroid Build Coastguard Worker /// Handle[255:128] ||
492*bed243d3SAndroid Build Coastguard Worker /// HandleKeyType (Handle) != HANDLE_KEY_TYPE_AES512 )
493*bed243d3SAndroid Build Coastguard Worker /// If (IllegalHandle)
494*bed243d3SAndroid Build Coastguard Worker /// ZF := 1
495*bed243d3SAndroid Build Coastguard Worker /// FOR i := 0 to 7
496*bed243d3SAndroid Build Coastguard Worker /// __odata[i] := 0
497*bed243d3SAndroid Build Coastguard Worker /// ENDFOR
498*bed243d3SAndroid Build Coastguard Worker /// ELSE
499*bed243d3SAndroid Build Coastguard Worker /// (UnwrappedKey, Authentic) := UnwrapKeyAndAuthenticate512 (Handle[511:0], IWKey)
500*bed243d3SAndroid Build Coastguard Worker /// IF Authentic == 0
501*bed243d3SAndroid Build Coastguard Worker /// ZF := 1
502*bed243d3SAndroid Build Coastguard Worker /// FOR i := 0 to 7
503*bed243d3SAndroid Build Coastguard Worker /// __odata[i] := 0
504*bed243d3SAndroid Build Coastguard Worker /// ENDFOR
505*bed243d3SAndroid Build Coastguard Worker /// ELSE
506*bed243d3SAndroid Build Coastguard Worker /// FOR i := 0 to 7
507*bed243d3SAndroid Build Coastguard Worker /// __odata[i] := AES256Decrypt (__idata[i], UnwrappedKey)
508*bed243d3SAndroid Build Coastguard Worker /// ENDFOR
509*bed243d3SAndroid Build Coastguard Worker /// ZF := 0
510*bed243d3SAndroid Build Coastguard Worker /// FI
511*bed243d3SAndroid Build Coastguard Worker /// FI
512*bed243d3SAndroid Build Coastguard Worker /// dst := ZF
513*bed243d3SAndroid Build Coastguard Worker /// OF := 0
514*bed243d3SAndroid Build Coastguard Worker /// SF := 0
515*bed243d3SAndroid Build Coastguard Worker /// AF := 0
516*bed243d3SAndroid Build Coastguard Worker /// PF := 0
517*bed243d3SAndroid Build Coastguard Worker /// CF := 0
518*bed243d3SAndroid Build Coastguard Worker /// \endcode
519*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned char __DEFAULT_FN_ATTRS
_mm_aesdecwide256kl_u8(__m128i __odata[8],const __m128i __idata[8],const void * __h)520*bed243d3SAndroid Build Coastguard Worker _mm_aesdecwide256kl_u8(__m128i __odata[8], const __m128i __idata[8], const void* __h) {
521*bed243d3SAndroid Build Coastguard Worker return __builtin_ia32_aesdecwide256kl_u8((__v2di *)__odata,
522*bed243d3SAndroid Build Coastguard Worker (const __v2di *)__idata, __h);
523*bed243d3SAndroid Build Coastguard Worker }
524*bed243d3SAndroid Build Coastguard Worker
525*bed243d3SAndroid Build Coastguard Worker #undef __DEFAULT_FN_ATTRS
526*bed243d3SAndroid Build Coastguard Worker
527*bed243d3SAndroid Build Coastguard Worker #endif /* !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) \
528*bed243d3SAndroid Build Coastguard Worker || defined(__WIDEKL__) */
529*bed243d3SAndroid Build Coastguard Worker
530*bed243d3SAndroid Build Coastguard Worker #endif /* _KEYLOCKERINTRIN_H */
531