]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
i386: Improve SImode constant - __builtin_clzll for -mno-lzcnt
authorH.J. Lu <hjl.tools@gmail.com>
Sun, 1 Aug 2021 16:55:33 +0000 (09:55 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Sun, 1 Aug 2021 20:32:55 +0000 (13:32 -0700)
Add a zero_extend patten for bsr_rex64_1 and use it to split SImode
constant - __builtin_clzll to avoid unncessary zero_extend.

gcc/

PR target/78103
* config/i386/i386.md (bsr_rex64_1_zext): New.
(combine splitter for constant - clzll): Replace gen_bsr_rex64_1
with gen_bsr_rex64_1_zext.

gcc/testsuite/

PR target/78103
* gcc.target/i386/pr78103-2.c: Also scan incl.
* gcc.target/i386/pr78103-3.c: Scan leal|addl|incl for x32.  Also
scan incq.

gcc/config/i386/i386.md
gcc/testsuite/gcc.target/i386/pr78103-2.c
gcc/testsuite/gcc.target/i386/pr78103-3.c

index c9787d73262a4bb891e1023f0180451acda83e30..0c23ddb8d1f41afde123334ee9178e8fc846b101 100644 (file)
    (set_attr "znver1_decode" "vector")
    (set_attr "mode" "DI")])
 
+(define_insn "bsr_rex64_1_zext"
+  [(set (match_operand:DI 0 "register_operand" "=r")
+       (zero_extend:DI
+         (minus:SI (const_int 63)
+                   (subreg:SI
+                     (clz:DI (match_operand:DI 1 "nonimmediate_operand" "rm"))
+                     0))))
+   (clobber (reg:CC FLAGS_REG))]
+  "!TARGET_LZCNT && TARGET_64BIT"
+  "bsr{q}\t{%1, %0|%0, %1}"
+  [(set_attr "type" "alu1")
+   (set_attr "prefix_0f" "1")
+   (set_attr "znver1_decode" "vector")
+   (set_attr "mode" "DI")])
+
 (define_insn "bsr"
   [(set (reg:CCZ FLAGS_REG)
        (compare:CCZ (match_operand:SI 1 "nonimmediate_operand" "rm")
   operands[5] = lowpart_subreg (SImode, operands[3], DImode);
   if (INTVAL (operands[2]) == 63)
     {
-      emit_insn (gen_bsr_rex64_1 (operands[3], operands[1]));
+      emit_insn (gen_bsr_rex64_1_zext (operands[3], operands[1]));
       emit_move_insn (operands[0], operands[5]);
       DONE;
     }
index b35233829261c61ed66e82a563eb023ee0f10b2c..30f7f98f60a41cc571df1a245809189c28540d30 100644 (file)
@@ -4,7 +4,7 @@
 /* { dg-final { scan-assembler-not {\mmovl\M} } } */
 /* { dg-final { scan-assembler-not {\mxor[lq]\M} } } */
 /* { dg-final { scan-assembler-not {\msubl\M} } } */
-/* { dg-final { scan-assembler {\m(leal|addl)\M} } } */
+/* { dg-final { scan-assembler {\m(leal|addl|incl)\M} } } */
 
 unsigned int
 foo (unsigned int x)
index 49a36eccf4d1672a81887941c6a3012c9ef15621..b8d82312a0ed10a4ce0c2ab60e5779a3c20c1cb4 100644 (file)
@@ -5,7 +5,8 @@
 /* { dg-final { scan-assembler-not {\mmovslq\M} } } */
 /* { dg-final { scan-assembler-not {\mxor[lq]\M} } } */
 /* { dg-final { scan-assembler-not {\msubq\M} } } */
-/* { dg-final { scan-assembler {\m(leaq|addq)\M} } } */
+/* { dg-final { scan-assembler {\m(leaq|addq|incq)\M} { target { ! x32 } } } } */
+/* { dg-final { scan-assembler {\m(leal|addl|incl)\M} { target x32 } } } */
 
 unsigned long long
 foo (unsigned int x)