Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

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