blob: 3010b38711e676e08e0aaba6289a5ac0b2e6fe5b [file] [log] [blame]
Logan Chien2833ffb2018-10-09 10:03:24 +08001/*===---- __wmmintrin_aes.h - AES intrinsics -------------------------------===
2 *
Logan Chiendf4f7662019-09-04 16:45:23 -07003 * 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
Logan Chien2833ffb2018-10-09 10:03:24 +08006 *
7 *===-----------------------------------------------------------------------===
8 */
Logan Chien2833ffb2018-10-09 10:03:24 +08009
Logan Chien55afb0a2018-10-15 10:42:14 +080010#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
Logan Chien2833ffb2018-10-09 10:03:24 +080016
17/* Define the default attributes for the functions in this file. */
Logan Chien55afb0a2018-10-15 10:42:14 +080018#define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("aes"), __min_vector_width__(128)))
Logan Chien2833ffb2018-10-09 10:03:24 +080019
Logan Chien55afb0a2018-10-15 10:42:14 +080020/// Performs a single round of AES encryption using the Equivalent
Logan Chien2833ffb2018-10-09 10:03:24 +080021/// 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///
Logan Chien55afb0a2018-10-15 10:42:14 +080027/// This intrinsic corresponds to the <c> VAESENC </c> instruction.
Logan Chien2833ffb2018-10-09 10:03:24 +080028///
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
Logan Chien55afb0a2018-10-15 10:42:14 +080040/// Performs the final round of AES encryption using the Equivalent
Logan Chien2833ffb2018-10-09 10:03:24 +080041/// 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///
Logan Chien55afb0a2018-10-15 10:42:14 +080047/// This intrinsic corresponds to the <c> VAESENCLAST </c> instruction.
Logan Chien2833ffb2018-10-09 10:03:24 +080048///
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
Logan Chien55afb0a2018-10-15 10:42:14 +080060/// Performs a single round of AES decryption using the Equivalent
Logan Chien2833ffb2018-10-09 10:03:24 +080061/// 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///
Logan Chien55afb0a2018-10-15 10:42:14 +080067/// This intrinsic corresponds to the <c> VAESDEC </c> instruction.
Logan Chien2833ffb2018-10-09 10:03:24 +080068///
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
Logan Chien55afb0a2018-10-15 10:42:14 +080080/// Performs the final round of AES decryption using the Equivalent
Logan Chien2833ffb2018-10-09 10:03:24 +080081/// 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///
Logan Chien55afb0a2018-10-15 10:42:14 +080087/// This intrinsic corresponds to the <c> VAESDECLAST </c> instruction.
Logan Chien2833ffb2018-10-09 10:03:24 +080088///
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
Logan Chien55afb0a2018-10-15 10:42:14 +0800100/// Applies the AES InvMixColumns() transformation to an expanded key
Logan Chien2833ffb2018-10-09 10:03:24 +0800101/// contained in the source operand, and writes the result to the
102/// destination.
103///
104/// \headerfile <x86intrin.h>
105///
Logan Chien55afb0a2018-10-15 10:42:14 +0800106/// This intrinsic corresponds to the <c> VAESIMC </c> instruction.
Logan Chien2833ffb2018-10-09 10:03:24 +0800107///
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
Logan Chien55afb0a2018-10-15 10:42:14 +0800117/// Generates a round key for AES encryption, operating on 128-bit data
Logan Chien2833ffb2018-10-09 10:03:24 +0800118/// 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///
Logan Chien55afb0a2018-10-15 10:42:14 +0800128/// This intrinsic corresponds to the <c> AESKEYGENASSIST </c> instruction.
Logan Chien2833ffb2018-10-09 10:03:24 +0800129///
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) \
Pirama Arumuga Nainar494f6452021-12-02 10:42:14 -0800136 ((__m128i)__builtin_ia32_aeskeygenassist128((__v2di)(__m128i)(C), (int)(R)))
Logan Chien2833ffb2018-10-09 10:03:24 +0800137
138#undef __DEFAULT_FN_ATTRS
139
Logan Chien55afb0a2018-10-15 10:42:14 +0800140#endif /* __WMMINTRIN_AES_H */