OSDN Git Service

2010-04-06 Kai Tietz <kai.tietz@onevision.com>
[pf3gnuchains/gcc-fork.git] / gcc / config / i386 / cpuid.h
index ce406c5..a9d90a6 100644 (file)
@@ -1,45 +1,40 @@
 /*
- * Copyright (C) 2007, 2008 Free Software Foundation, Inc.
+ * Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
  *
  * This file 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) any
+ * Free Software Foundation; either version 3, or (at your option) any
  * later version.
  * 
- * In addition to the permissions in the GNU General Public License, the
- * Free Software Foundation gives you unlimited permission to link the
- * compiled version of this file with other programs, and to distribute
- * those programs without any restriction coming from the use of this
- * file.  (The General Public License restrictions do apply in other
- * respects; for example, they cover modification of the file, and
- * distribution when not linked into another program.)
- * 
  * This file is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of
  * 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 this program; see the file COPYING.  If not, write to
- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, 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 link this library with files
- *    compiled with GCC to produce an executable, this does not 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/>.
  */
 
 /* %ecx */
 #define bit_SSE3       (1 << 0)
 #define bit_PCLMUL     (1 << 1)
 #define bit_SSSE3      (1 << 9)
+#define bit_FMA                (1 << 12)
 #define bit_CMPXCHG16B (1 << 13)
 #define bit_SSE4_1     (1 << 19)
 #define bit_SSE4_2     (1 << 20)
+#define bit_MOVBE      (1 << 22)
 #define bit_POPCNT     (1 << 23)
 #define bit_AES                (1 << 25)
+#define bit_XSAVE      (1 << 26)
+#define bit_OSXSAVE    (1 << 27)
+#define bit_AVX                (1 << 28)
 
 /* %edx */
 #define bit_CMPXCHG8B  (1 << 8)
 /* Extended Features */
 /* %ecx */
 #define bit_LAHF_LM    (1 << 0)
+#define bit_ABM                (1 << 5)
 #define bit_SSE4a      (1 << 6)
-#define bit_SSE5       (1 << 11)
+#define bit_XOP         (1 << 11)
+#define bit_LWP        (1 << 15)
+#define bit_FMA4        (1 << 16)
 
 /* %edx */
 #define bit_LM         (1 << 29)
           "xchg{l}\t{%%}ebx, %1\n\t"                   \
           : "=a" (a), "=r" (b), "=c" (c), "=d" (d)     \
           : "0" (level))
+
+#define __cpuid_count(level, count, a, b, c, d)                \
+  __asm__ ("xchg{l}\t{%%}ebx, %1\n\t"                  \
+          "cpuid\n\t"                                  \
+          "xchg{l}\t{%%}ebx, %1\n\t"                   \
+          : "=a" (a), "=r" (b), "=c" (c), "=d" (d)     \
+          : "0" (level), "2" (count))
 #else
 /* Host GCCs older than 3.0 weren't supporting Intel asm syntax
    nor alternatives in i386 code.  */
           "xchgl\t%%ebx, %1\n\t"                       \
           : "=a" (a), "=r" (b), "=c" (c), "=d" (d)     \
           : "0" (level))
+
+#define __cpuid_count(level, count, a, b, c, d)                \
+  __asm__ ("xchgl\t%%ebx, %1\n\t"                      \
+          "cpuid\n\t"                                  \
+          "xchgl\t%%ebx, %1\n\t"                       \
+          : "=a" (a), "=r" (b), "=c" (c), "=d" (d)     \
+          : "0" (level), "2" (count))
 #endif
 #else
 #define __cpuid(level, a, b, c, d)                     \
   __asm__ ("cpuid\n\t"                                 \
           : "=a" (a), "=b" (b), "=c" (c), "=d" (d)     \
           : "0" (level))
+
+#define __cpuid_count(level, count, a, b, c, d)                \
+  __asm__ ("cpuid\n\t"                                 \
+          : "=a" (a), "=b" (b), "=c" (c), "=d" (d)     \
+          : "0" (level), "2" (count))
 #endif
 
 /* Return highest supported input value for cpuid instruction.  ext can
@@ -100,8 +117,8 @@ __get_cpuid_max (unsigned int __ext, unsigned int *__sig)
   unsigned int __eax, __ebx, __ecx, __edx;
 
 #ifndef __x86_64__
-#if __GNUC__ >= 3
   /* See if we can use cpuid.  On AMD64 we always can.  */
+#if __GNUC__ >= 3
   __asm__ ("pushf{l|d}\n\t"
           "pushf{l|d}\n\t"
           "pop{l}\t%0\n\t"