2006-07-27 Arjan van de Ven <arjan@linux.intel.com>
authorcgf <cgf@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 27 Jul 2006 23:12:08 +0000 (23:12 +0000)
committercgf <cgf@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 27 Jul 2006 23:12:08 +0000 (23:12 +0000)
* config/i386/i386.md (stack_tls_protect_set_di) Use %gs rather than
%fs for -mcmodel=kernel.
(stack_tls_protect_test_di): Likewise.

* testsuite/gcc.target/i386/stack-prot-kernel.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@115782 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/i386/i386.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/stack-prot-kernel.c [new file with mode: 0644]

index 40420e0..9a2580c 100644 (file)
@@ -1,3 +1,9 @@
+2006-07-27  Arjan van de Ven <arjan@linux.intel.com>
+
+       * config/i386/i386.md (stack_tls_protect_set_di) Use %gs rather than
+       %fs for -mcmodel=kernel.
+       (stack_tls_protect_test_di): Likewise.
+
 2006-07-27  Carlos O'Donell  <carlos@codesourcery.com>
 
        * Makefile.in: Use mkinstalldirs.
index 00e06ba..4808853 100644 (file)
    (set (match_scratch:DI 2 "=&r") (const_int 0))
    (clobber (reg:CC FLAGS_REG))]
   "TARGET_64BIT"
-  "mov{q}\t{%%fs:%P1, %2|%2, QWORD PTR %%fs:%P1}\;mov{q}\t{%2, %0|%0, %2}\;xor{l}\t%k2, %k2"
+  {
+     /* The kernel uses a different segment register for performance reasons; a
+        system call would not have to trash the userspace segment register,
+        which would be expensive */
+     if (ix86_cmodel != CM_KERNEL)
+        return "mov{q}\t{%%fs:%P1, %2|%2, QWORD PTR %%fs:%P1}\;mov{q}\t{%2, %0|%0, %2}\;xor{l}\t%k2, %k2";
+     else
+        return "mov{q}\t{%%gs:%P1, %2|%2, QWORD PTR %%gs:%P1}\;mov{q}\t{%2, %0|%0, %2}\;xor{l}\t%k2, %k2";
+  }
   [(set_attr "type" "multi")])
 
 (define_expand "stack_protect_test"
                    UNSPEC_SP_TLS_TEST))
    (clobber (match_scratch:DI 3 "=r"))]
   "TARGET_64BIT"
-  "mov{q}\t{%1, %3|%3, %1}\;xor{q}\t{%%fs:%P2, %3|%3, QWORD PTR %%fs:%P2}"
+  {
+     /* The kernel uses a different segment register for performance reasons; a
+        system call would not have to trash the userspace segment register,
+        which would be expensive */
+     if (ix86_cmodel != CM_KERNEL)
+        return "mov{q}\t{%1, %3|%3, %1}\;xor{q}\t{%%fs:%P2, %3|%3, QWORD PTR %%fs:%P2}";
+     else
+        return "mov{q}\t{%1, %3|%3, %1}\;xor{q}\t{%%gs:%P2, %3|%3, QWORD PTR %%gs:%P2}";
+  }
   [(set_attr "type" "multi")])
 
 (include "sse.md")
index cc0bc14..4cfaccf 100644 (file)
@@ -1,3 +1,7 @@
+2006-07-27  Arjan van de Ven <arjan@linux.intel.com>
+
+       * gcc.target/i386/stack-prot-kernel.c: New test.
+
 2006-07-27  Roger Sayle  <roger@eyesopen.com>
 
        * gcc.dg/builtins-55.c: New test case.
diff --git a/gcc/testsuite/gcc.target/i386/stack-prot-kernel.c b/gcc/testsuite/gcc.target/i386/stack-prot-kernel.c
new file mode 100644 (file)
index 0000000..94fdf4f
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do compile { target lp64 } } */
+/* { dg-options "-O2 -fstack-protector-all -mcmodel=kernel" } */
+
+void test1 (int x)
+{
+  char p[40];
+  int i;
+  for (i=0; i<40; i++)
+       p[i] = x;
+}
+
+/* { dg-final { scan-assembler-not "%fs" } } */