i386.c (ix86_expand_builtin): Generate SImode target register for null target.
authorUros Bizjak <ubizjak@gmail.com>
Thu, 10 May 2018 20:59:18 +0000 (22:59 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Thu, 10 May 2018 20:59:18 +0000 (22:59 +0200)
* config/i386/i386.c (ix86_expand_builtin) <case IX86_BUILTIN_RDPID>:
Generate SImode target register for null target.
<case IX86_BUILTIN_XGETBV>: Ditto.
<case IX86_BUILTIN_XSETBV>: Optimize LSHIFTRT generation.
* config/i386/xsaveintrin.h (_xgetbv): Add missing return.

testsuite/ChangeLog:

* gcc.target/i386/xgetsetbv.c: Check also variable arguments.

From-SVN: r260135

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/config/i386/xsaveintrin.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/xgetsetbv.c

index 64ec271e7cce6715eed97823963df1448b407d1a..821655a3145f291c809a72e015f045c06c155ca8 100644 (file)
@@ -1,3 +1,11 @@
+2018-05-10  Uros Bizjak  <ubizjak@gmail.com>
+
+       * config/i386/i386.c (ix86_expand_builtin) <case IX86_BUILTIN_RDPID>:
+       Generate SImode target register for null target.
+       <case IX86_BUILTIN_XGETBV>: Ditto.
+       <case IX86_BUILTIN_XSETBV>: Optimize LSHIFTRT generation.
+       * config/i386/xsaveintrin.h (_xgetbv): Add missing return.
+
 2018-05-10  Carl Love  <cel@us.ibm.com>
 
        * config/rs6000/rs6000.md (prefetch): Generate ISA 2.06 instructions
index 70e87fb8f67ae6234f6a85dd1121fa9f8a11779d..526e7d162c6e93732e7414ac282f7fbfbdc64638 100644 (file)
@@ -37085,7 +37085,7 @@ ix86_expand_builtin (tree exp, rtx target, rtx subtarget,
 
     case IX86_BUILTIN_RDPID:
 
-      op0 = gen_reg_rtx (TARGET_64BIT ? DImode : SImode);
+      op0 = gen_reg_rtx (word_mode);
 
       if (TARGET_64BIT)
        {
@@ -37094,18 +37094,16 @@ ix86_expand_builtin (tree exp, rtx target, rtx subtarget,
        }
       else
        insn = gen_rdpid (op0);
+
       emit_insn (insn);
 
-      if (target == 0)
-       {
-         /* mode is VOIDmode if __builtin_rdpid has been called
-            without lhs.  */
-         if (mode == VOIDmode)
-           return target;
-         target = gen_reg_rtx (mode);
-       }
+      if (target == 0
+         || !register_operand (target, SImode))
+       target = gen_reg_rtx (SImode);
+
       emit_move_insn (target, op0);
       return target;
+
     case IX86_BUILTIN_RDPMC:
     case IX86_BUILTIN_RDTSC:
     case IX86_BUILTIN_RDTSCP:
@@ -37164,14 +37162,9 @@ ix86_expand_builtin (tree exp, rtx target, rtx subtarget,
          emit_move_insn (gen_rtx_MEM (SImode, op4), op2);
        }
 
-      if (target == 0)
-       {
-         /* mode is VOIDmode if __builtin_rd* has been called
-            without lhs.  */
-         if (mode == VOIDmode)
-           return target;
-         target = gen_reg_rtx (mode);
-       }
+      if (target == 0
+         || !register_operand (target, DImode))
+        target = gen_reg_rtx (DImode);
 
       if (TARGET_64BIT)
        {
@@ -37260,25 +37253,23 @@ ix86_expand_builtin (tree exp, rtx target, rtx subtarget,
       if (!REG_P (op0))
        op0 = copy_to_mode_reg (SImode, op0);
 
+      op1 = force_reg (DImode, op1);
+
       if (TARGET_64BIT)
        {
          op2 = expand_simple_binop (DImode, LSHIFTRT, op1, GEN_INT (32),
                                     NULL, 1, OPTAB_DIRECT);
 
+         icode = CODE_FOR_xsetbv_rex64;
+
          op2 = gen_lowpart (SImode, op2);
          op1 = gen_lowpart (SImode, op1);
-         if (!REG_P (op1))
-           op1 = copy_to_mode_reg (SImode, op1);
-         if (!REG_P (op2))
-           op2 = copy_to_mode_reg (SImode, op2);
-         icode = CODE_FOR_xsetbv_rex64;
          pat = GEN_FCN (icode) (op0, op1, op2);
        }
       else
        {
-         if (!REG_P (op1))
-           op1 = copy_to_mode_reg (DImode, op1);
          icode = CODE_FOR_xsetbv;
+
          pat = GEN_FCN (icode) (op0, op1);
        }
       if (pat)
index 705936e91b57b28893d99353d03b3b35067575ff..3f6c80b9ba1089051217b14f12446b6c968e51ea 100644 (file)
@@ -59,7 +59,7 @@ extern __inline long long
 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
 _xgetbv (unsigned int __A)
 {
-  __builtin_ia32_xgetbv (__A);
+  return __builtin_ia32_xgetbv (__A);
 }
 
 #ifdef __x86_64__
index 89f64404b3f5abd3d4982174398dd22106dc87d0..6d906667a217b01f35410e24c04568ae11f9b624 100644 (file)
@@ -1,3 +1,7 @@
+2018-05-10  Uros Bizjak  <ubizjak@gmail.com>
+
+       * gcc.target/i386/xgetsetbv.c: Check also variable arguments.
+
 2018-05-10  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/85662
index 9a9af1bb48fd83881fb575ebad6c895f1f5f4721..9ef487caf62e9f0e9e0baa34068a36e255d0b7dc 100644 (file)
@@ -1,12 +1,26 @@
 /* { dg-do compile } */
 /* { dg-options "-O2 -mxsave" } */
-/* { dg-final { scan-assembler "xgetbv" } } */
-/* { dg-final { scan-assembler "xsetbv" } } */
+/* { dg-final { scan-assembler-times "xgetbv" 3 } } */
+/* { dg-final { scan-assembler-times "xsetbv" 3 } } */
 
 #include <x86intrin.h>
 
-unsigned int
-xgetsetbv (void)
+unsigned long long
+foo (unsigned x, unsigned y)
+{
+ _xsetbv (x, y);
+  return _xgetbv (x);
+}
+
+unsigned long long
+bar (unsigned x, unsigned long long y)
+{
+ _xsetbv (x, y);
+  return _xgetbv (x);
+}
+
+unsigned long long
+baz (void)
 {
  _xsetbv (0, 0);
   return _xgetbv (0);