-/* Copyright (C) 2008 Free Software Foundation, Inc.
+/* Copyright (C) 2008-2020 Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
+ the Free Software Foundation; either version 3, or (at your option)
any later version.
GCC is distributed in the hope that it will be useful,
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with GCC; see the file COPYING. If not, write to
- the Free Software Foundation, 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
+ Under Section 7 of GPL version 3, you are granted additional
+ permissions described in the GCC Runtime Library Exception, version
+ 3.1, as published by the Free Software Foundation.
-/* As a special exception, if you include this header file into source
- files compiled by GCC, this header file does not by itself cause
- the resulting executable to be covered by the GNU General Public
- License. This exception does not however invalidate any other
- reasons why the executable file might be covered by the GNU General
- Public License. */
+ You should have received a copy of the GNU General Public License and
+ a copy of the GCC Runtime Library Exception along with this program;
+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+ <http://www.gnu.org/licenses/>. */
/* Implemented from the specification included in the Intel C++ Compiler
User Guide and Reference, version 10.1. */
/* We need definitions from the SSE2 header file. */
#include <emmintrin.h>
-#if !defined (__AES__) && !defined (__PCLMUL__)
-# error "AES/PCLMUL instructions not enabled"
-#else
-
/* AES */
-#ifdef __AES__
+#if !defined(__AES__) || !defined(__SSE2__)
+#pragma GCC push_options
+#pragma GCC target("aes,sse2")
+#define __DISABLE_AES__
+#endif /* __AES__ */
+
/* Performs 1 round of AES decryption of the first m128i using
the second m128i as a round key. */
extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
((__m128i) __builtin_ia32_aeskeygenassist128 ((__v2di)(__m128i)(X), \
(int)(C)))
#endif
-#endif /* __AES__ */
+
+#ifdef __DISABLE_AES__
+#undef __DISABLE_AES__
+#pragma GCC pop_options
+#endif /* __DISABLE_AES__ */
/* PCLMUL */
-#ifdef __PCLMUL__
+#if !defined(__PCLMUL__) || !defined(__SSE2__)
+#pragma GCC push_options
+#pragma GCC target("pclmul,sse2")
+#define __DISABLE_PCLMUL__
+#endif /* __PCLMUL__ */
+
/* Performs carry-less integer multiplication of 64-bit halves of
128-bit input operands. The third parameter inducates which 64-bit
haves of the input parameters v1 and v2 should be used. It must be
((__m128i) __builtin_ia32_pclmulqdq128 ((__v2di)(__m128i)(X), \
(__v2di)(__m128i)(Y), (int)(I)))
#endif
-#endif /* __PCLMUL__ */
-#endif /* __AES__/__PCLMUL__ */
+#ifdef __DISABLE_PCLMUL__
+#undef __DISABLE_PCLMUL__
+#pragma GCC pop_options
+#endif /* __DISABLE_PCLMUL__ */
#endif /* _WMMINTRIN_H_INCLUDED */