master
  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.
 34static __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.
 54static __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.
 74static __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.
 94static __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.
111static __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 */