zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

__wmmintrin_aes.h (5269B) - Raw


      1 /*===---- __wmmintrin_aes.h - AES intrinsics -------------------------------===
      2  *
      3  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4  * See https://llvm.org/LICENSE.txt for license information.
      5  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6  *
      7  *===-----------------------------------------------------------------------===
      8  */
      9 
     10 #ifndef __WMMINTRIN_H
     11 #error "Never use <__wmmintrin_aes.h> directly; include <wmmintrin.h> instead."
     12 #endif
     13 
     14 #ifndef __WMMINTRIN_AES_H
     15 #define __WMMINTRIN_AES_H
     16 
     17 /* Define the default attributes for the functions in this file. */
     18 #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("aes"), __min_vector_width__(128)))
     19 
     20 /// Performs a single round of AES encryption using the Equivalent
     21 ///    Inverse Cipher, transforming the state value from the first source
     22 ///    operand using a 128-bit round key value contained in the second source
     23 ///    operand, and writes the result to the destination.
     24 ///
     25 /// \headerfile <x86intrin.h>
     26 ///
     27 /// This intrinsic corresponds to the <c> VAESENC </c> instruction.
     28 ///
     29 /// \param __V
     30 ///    A 128-bit integer vector containing the state value.
     31 /// \param __R
     32 ///    A 128-bit integer vector containing the round key value.
     33 /// \returns A 128-bit integer vector containing the encrypted value.
     34 static __inline__ __m128i __DEFAULT_FN_ATTRS
     35 _mm_aesenc_si128(__m128i __V, __m128i __R)
     36 {
     37   return (__m128i)__builtin_ia32_aesenc128((__v2di)__V, (__v2di)__R);
     38 }
     39 
     40 /// Performs the final round of AES encryption using the Equivalent
     41 ///    Inverse Cipher, transforming the state value from the first source
     42 ///    operand using a 128-bit round key value contained in the second source
     43 ///    operand, and writes the result to the destination.
     44 ///
     45 /// \headerfile <x86intrin.h>
     46 ///
     47 /// This intrinsic corresponds to the <c> VAESENCLAST </c> instruction.
     48 ///
     49 /// \param __V
     50 ///    A 128-bit integer vector containing the state value.
     51 /// \param __R
     52 ///    A 128-bit integer vector containing the round key value.
     53 /// \returns A 128-bit integer vector containing the encrypted value.
     54 static __inline__ __m128i __DEFAULT_FN_ATTRS
     55 _mm_aesenclast_si128(__m128i __V, __m128i __R)
     56 {
     57   return (__m128i)__builtin_ia32_aesenclast128((__v2di)__V, (__v2di)__R);
     58 }
     59 
     60 /// Performs a single round of AES decryption using the Equivalent
     61 ///    Inverse Cipher, transforming the state value from the first source
     62 ///    operand using a 128-bit round key value contained in the second source
     63 ///    operand, and writes the result to the destination.
     64 ///
     65 /// \headerfile <x86intrin.h>
     66 ///
     67 /// This intrinsic corresponds to the <c> VAESDEC </c> instruction.
     68 ///
     69 /// \param __V
     70 ///    A 128-bit integer vector containing the state value.
     71 /// \param __R
     72 ///    A 128-bit integer vector containing the round key value.
     73 /// \returns A 128-bit integer vector containing the decrypted value.
     74 static __inline__ __m128i __DEFAULT_FN_ATTRS
     75 _mm_aesdec_si128(__m128i __V, __m128i __R)
     76 {
     77   return (__m128i)__builtin_ia32_aesdec128((__v2di)__V, (__v2di)__R);
     78 }
     79 
     80 /// Performs the final round of AES decryption using the Equivalent
     81 ///    Inverse Cipher, transforming the state value from the first source
     82 ///    operand using a 128-bit round key value contained in the second source
     83 ///    operand, and writes the result to the destination.
     84 ///
     85 /// \headerfile <x86intrin.h>
     86 ///
     87 /// This intrinsic corresponds to the <c> VAESDECLAST </c> instruction.
     88 ///
     89 /// \param __V
     90 ///    A 128-bit integer vector containing the state value.
     91 /// \param __R
     92 ///    A 128-bit integer vector containing the round key value.
     93 /// \returns A 128-bit integer vector containing the decrypted value.
     94 static __inline__ __m128i __DEFAULT_FN_ATTRS
     95 _mm_aesdeclast_si128(__m128i __V, __m128i __R)
     96 {
     97   return (__m128i)__builtin_ia32_aesdeclast128((__v2di)__V, (__v2di)__R);
     98 }
     99 
    100 /// Applies the AES InvMixColumns() transformation to an expanded key
    101 ///    contained in the source operand, and writes the result to the
    102 ///    destination.
    103 ///
    104 /// \headerfile <x86intrin.h>
    105 ///
    106 /// This intrinsic corresponds to the <c> VAESIMC </c> instruction.
    107 ///
    108 /// \param __V
    109 ///    A 128-bit integer vector containing the expanded key.
    110 /// \returns A 128-bit integer vector containing the transformed value.
    111 static __inline__ __m128i __DEFAULT_FN_ATTRS
    112 _mm_aesimc_si128(__m128i __V)
    113 {
    114   return (__m128i)__builtin_ia32_aesimc128((__v2di)__V);
    115 }
    116 
    117 /// Generates a round key for AES encryption, operating on 128-bit data
    118 ///    specified in the first source operand and using an 8-bit round constant
    119 ///    specified by the second source operand, and writes the result to the
    120 ///    destination.
    121 ///
    122 /// \headerfile <x86intrin.h>
    123 ///
    124 /// \code
    125 /// __m128i _mm_aeskeygenassist_si128(__m128i C, const int R);
    126 /// \endcode
    127 ///
    128 /// This intrinsic corresponds to the <c> AESKEYGENASSIST </c> instruction.
    129 ///
    130 /// \param C
    131 ///    A 128-bit integer vector that is used to generate the AES encryption key.
    132 /// \param R
    133 ///    An 8-bit round constant used to generate the AES encryption key.
    134 /// \returns A 128-bit round key for AES encryption.
    135 #define _mm_aeskeygenassist_si128(C, R) \
    136   ((__m128i)__builtin_ia32_aeskeygenassist128((__v2di)(__m128i)(C), (int)(R)))
    137 
    138 #undef __DEFAULT_FN_ATTRS
    139 
    140 #endif  /* __WMMINTRIN_AES_H */