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 */ 141