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