On Mon, Oct 12, 2026 at 6:13 PM Shreesh Adiga
<[email protected]> wrote:
>
>
>
> On Mon, Oct 12, 2026 at 1:59 PM Uros Bizjak <[email protected]> wrote:
>>
>> On Sat, Oct 10, 2026 at 6:52 PM Shreesh Adiga
>> <[email protected]> wrote:
>> >
>> > From: Mariam Arutunian <[email protected]>
>> >
>> > This patch introduces pclmul expanders for the i386 backend,
>> > dedicated to generating optimized code for CRC computations.
>> >
>> > Expander 1: Bit-Forward CRC (crc<SWI1248x:mode><SWI124:mode>4)
>> > For targets that support both pclmulqdq instruction (TARGET_PCLMUL) and are
>> > 64-bit (TARGET_64BIT),
>> > the expander will generate code that uses the pclmulqdq instruction for CRC
>> > computation.
>> >
>> > Expander 2: Bit-Reversed CRC (crc_rev<SWI1248x:mode><SWI124:mode>4)
>> > If the target does not support crc32 but supports pclmulqdq, it then uses
>> > the pclmulqdq instruction for bit-reversed CRC computation.
>> >
>> > This makes the x86 backend similar to aarch64 which uses pmull.
>> >
>> > gcc/ChangeLog:
>> >
>> >         * config/i386/i386-expand.cc (ix86_expand_crc_using_pclmul): New
>> >         function that implements pclmul expansion for Bit-Forward CRC
>> >         computation.
>> >         (ix86_expand_reversed_crc_using_pclmul): New function that
>> >         implements pclmul expansion for Bit-Reversed CRC computation.
>> >         * config/i386/i386-protos.h (ix86_expand_crc_using_pclmul): New
>> >         extern function declaration.
>> >         (ix86_expand_reversed_crc_using_pclmul): Likewise.
>> >         * config/i386/i386.md (crc_rev<SWI124:mode>si4): Removed older
>> >         expansion for Bit-Reversed CRC.
>> >         (crc<SWI1248x:mode><SWI124:mode>4): Added new expander for
>> >         Bit-Forward CRC.
>> >         (crc_rev<SWI1248x:mode><SWI124:mode>4): Added new expander for
>> >         Bit-Reversed CRC which extends previous CRC32 expansion.
>> >
>> > gcc/testsuite/ChangeLog:
>> >
>> >         * gcc.target/i386/crc-1-pclmul.c: New test.
>> >         * gcc.target/i386/crc-10-pclmul.c: New test.
>> >         * gcc.target/i386/crc-12-pclmul.c: New test.
>> >         * gcc.target/i386/crc-13-pclmul.c: New test.
>> >         * gcc.target/i386/crc-14-pclmul.c: New test.
>> >         * gcc.target/i386/crc-17-pclmul.c: New test.
>> >         * gcc.target/i386/crc-18-pclmul.c: New test.
>> >         * gcc.target/i386/crc-21-pclmul.c: New test.
>> >         * gcc.target/i386/crc-22-pclmul.c: New test.
>> >         * gcc.target/i386/crc-23-pclmul.c: New test.
>> >         * gcc.target/i386/crc-4-pclmul.c: New test.
>> >         * gcc.target/i386/crc-5-pclmul.c: New test.
>> >         * gcc.target/i386/crc-6-pclmul.c: New test.
>> >         * gcc.target/i386/crc-7-pclmul.c: New test.
>> >         * gcc.target/i386/crc-8-pclmul.c: New test.
>> >         * gcc.target/i386/crc-9-pclmul.c: New test.
>> >         * gcc.target/i386/crc-CCIT-data16-pclmul.c: New test.
>> >         * gcc.target/i386/crc-CCIT-data8-pclmul.c: New test.
>> >         * gcc.target/i386/crc-coremark-16bitdata-pclmul.c: New test.
>> >         * gcc.target/i386/crc-crc32-data16.c: New test.
>> >         * gcc.target/i386/crc-crc32-data32.c: New test.
>> >         * gcc.target/i386/crc-crc32-data8.c: New test.
>> >
>> > Co-authored-by: Shreesh Adiga <[email protected]>
>> > Signed-off-by: Mariam Arutunian <[email protected]>
>> > Signed-off-by: Shreesh Adiga <[email protected]>
>> > ---
>> > Changes in v2:
>> >  Replaced movabs + movq of quotient and polynomial with a single
>> >  16 byte load and operate on different lanes of it with pclmul
>> >  selector argument.
>> >  Formatted i386.md changes to remove constraint and comments
>> >  after operand as per suggestion.
>> >  Added missing newline in the tests.
>> >
>> >  gcc/config/i386/i386-expand.cc                | 131 ++++++++++++++++++
>> >  gcc/config/i386/i386-protos.h                 |   3 +
>> >  gcc/config/i386/i386.md                       |  46 ++++--
>> >  gcc/testsuite/gcc.target/i386/crc-1-pclmul.c  |   8 ++
>> >  gcc/testsuite/gcc.target/i386/crc-10-pclmul.c |   8 ++
>> >  gcc/testsuite/gcc.target/i386/crc-12-pclmul.c |   9 ++
>> >  gcc/testsuite/gcc.target/i386/crc-13-pclmul.c |   8 ++
>> >  gcc/testsuite/gcc.target/i386/crc-14-pclmul.c |   8 ++
>> >  gcc/testsuite/gcc.target/i386/crc-17-pclmul.c |   8 ++
>> >  gcc/testsuite/gcc.target/i386/crc-18-pclmul.c |   8 ++
>> >  gcc/testsuite/gcc.target/i386/crc-21-pclmul.c |   8 ++
>> >  gcc/testsuite/gcc.target/i386/crc-22-pclmul.c |   8 ++
>> >  gcc/testsuite/gcc.target/i386/crc-23-pclmul.c |   8 ++
>> >  gcc/testsuite/gcc.target/i386/crc-4-pclmul.c  |   8 ++
>> >  gcc/testsuite/gcc.target/i386/crc-5-pclmul.c  |   9 ++
>> >  gcc/testsuite/gcc.target/i386/crc-6-pclmul.c  |   8 ++
>> >  gcc/testsuite/gcc.target/i386/crc-7-pclmul.c  |   8 ++
>> >  gcc/testsuite/gcc.target/i386/crc-8-pclmul.c  |   8 ++
>> >  gcc/testsuite/gcc.target/i386/crc-9-pclmul.c  |   8 ++
>> >  .../gcc.target/i386/crc-CCIT-data16-pclmul.c  |   9 ++
>> >  .../gcc.target/i386/crc-CCIT-data8-pclmul.c   |   9 ++
>> >  .../i386/crc-coremark-16bitdata-pclmul.c      |   9 ++
>> >  .../gcc.target/i386/crc-crc32-data16.c        |  53 +++++++
>> >  .../gcc.target/i386/crc-crc32-data32.c        |  53 +++++++
>> >  .../gcc.target/i386/crc-crc32-data8.c         |  53 +++++++
>> >  25 files changed, 483 insertions(+), 13 deletions(-)
>> >  create mode 100644 gcc/testsuite/gcc.target/i386/crc-1-pclmul.c
>> >  create mode 100644 gcc/testsuite/gcc.target/i386/crc-10-pclmul.c
>> >  create mode 100644 gcc/testsuite/gcc.target/i386/crc-12-pclmul.c
>> >  create mode 100644 gcc/testsuite/gcc.target/i386/crc-13-pclmul.c
>> >  create mode 100644 gcc/testsuite/gcc.target/i386/crc-14-pclmul.c
>> >  create mode 100644 gcc/testsuite/gcc.target/i386/crc-17-pclmul.c
>> >  create mode 100644 gcc/testsuite/gcc.target/i386/crc-18-pclmul.c
>> >  create mode 100644 gcc/testsuite/gcc.target/i386/crc-21-pclmul.c
>> >  create mode 100644 gcc/testsuite/gcc.target/i386/crc-22-pclmul.c
>> >  create mode 100644 gcc/testsuite/gcc.target/i386/crc-23-pclmul.c
>> >  create mode 100644 gcc/testsuite/gcc.target/i386/crc-4-pclmul.c
>> >  create mode 100644 gcc/testsuite/gcc.target/i386/crc-5-pclmul.c
>> >  create mode 100644 gcc/testsuite/gcc.target/i386/crc-6-pclmul.c
>> >  create mode 100644 gcc/testsuite/gcc.target/i386/crc-7-pclmul.c
>> >  create mode 100644 gcc/testsuite/gcc.target/i386/crc-8-pclmul.c
>> >  create mode 100644 gcc/testsuite/gcc.target/i386/crc-9-pclmul.c
>> >  create mode 100644 gcc/testsuite/gcc.target/i386/crc-CCIT-data16-pclmul.c
>> >  create mode 100644 gcc/testsuite/gcc.target/i386/crc-CCIT-data8-pclmul.c
>> >  create mode 100644 
>> > gcc/testsuite/gcc.target/i386/crc-coremark-16bitdata-pclmul.c
>> >  create mode 100644 gcc/testsuite/gcc.target/i386/crc-crc32-data16.c
>> >  create mode 100644 gcc/testsuite/gcc.target/i386/crc-crc32-data32.c
>> >  create mode 100644 gcc/testsuite/gcc.target/i386/crc-crc32-data8.c

[...]

>> > +   (match_operand:SWI124   3 "const_int_operand")]   ;; polynomial
>> > +  "TARGET_64BIT && TARGET_PCLMUL
>> > +   && <SWI124:MODE>mode >= <SWI1248x:MODE>mode"
>> > +{
>> > +   ix86_expand_crc_using_pclmul (<SWI124:MODE>mode, <SWI1248x:MODE>mode,
>> > +                                operands);
>> > +   DONE;
>> > +})
>> > +
>> > +;; Reversed CRC
>> > +(define_expand "crc_rev<SWI1248x:mode><SWI124:mode>4"
>> > +  [(match_operand:SWI124   0 "register_operand")      ;; return value 
>> > (CRC)
>> > +   (match_operand:SWI124   1 "register_operand")      ;; initial CRC
>> > +   (match_operand:SWI1248x 2 "register_operand")      ;; data
>>
>> ... also here.
>>
>> > +   (match_operand:SWI124   3 "const_int_operand")]    ;; polynomial
>> > +  "<SWI124:MODE>mode >= <SWI1248x:MODE>mode"
>>
>> Hongtao already raised the issue with too broad insn constraint here.
>>
>
> Maybe I don't fully understand this concern, but given that the else part 
> works
> using generic C code, is there any major problem? Shouldn't the 
> "expand_reversed_crc_table_based"
> work on all the x86 configurations since it just uses lookup table rather 
> than any specific instructions?

Oh, I was too fixated on insn constraint and didn't notice an "else"
to a generic part. This approach is not customary in i386.md; if we
want generic expansion, just use insn constraint to disable the
pattern. So, please follow Hongtao's advice and use correct insn
conditions.

>>
>> > +  {
>> > +    /* If it is iSCSI polynomial (0x1EDC6F41), generate crc32 
>> > instruction.  */
>> > +    if (TARGET_CRC32 && INTVAL (operands[3]) == 0x1EDC6F41
>> > +       && <SWI124:MODE>mode == SImode)
>> > +      emit_insn (gen_sse4_2_crc32<SWI1248x:mode> (operands[0], 
>> > operands[1],
>> > +                                                 operands[2]));
>> > +    else if (TARGET_64BIT && TARGET_PCLMUL)
>> > +      ix86_expand_reversed_crc_using_pclmul (<SWI124:MODE>mode,
>> > +                                            <SWI1248x:MODE>mode, 
>> > operands);
>> > +    else
>> > +      expand_reversed_crc_table_based (operands[0], operands[1], 
>> > operands[2],
>> > +                                      operands[3], <SWI1248x:MODE>mode);
>> >    DONE;
>> >  })
>> >
>> > diff --git a/gcc/testsuite/gcc.target/i386/crc-1-pclmul.c 
>> > b/gcc/testsuite/gcc.target/i386/crc-1-pclmul.c
>> > new file mode 100644
>> > index 00000000000..f423c08cf07
>> > --- /dev/null
>> > +++ b/gcc/testsuite/gcc.target/i386/crc-1-pclmul.c
>> > @@ -0,0 +1,8 @@
>> > +/* { dg-do run } */
>>
>> Please note that runtime tests require:
>>
>> /* { dg-require-effective-target pclmul } */
>>
>> and some of them:
>>
>> /* { dg-do run { target { ! ia32 } } } */
>>
>> You can quickly check for possible ia32 failures in
>> {gcc,c++}.target/i386 by running:
>>
>> make -j$(nproc) -k check RUNTESTFLAGS="--target_board=unix\{,-m32\}
>> i386.exp=crc*.c"
>>
>
> Indeed it looks like there are multiple ia32 failures as they're looking for 
> pclmulqdq which is not generated as the i386.md file is gating it with 
> TARGET_64BIT.
> I just tried with removal of TARGET_64BIT and it seems to be compiling fine 
> with -m32 and ASM looks okay with the tests passing.
> Therefore I think it is okay for including 32-bit targets as well.
>
> Thanks,
> Shreesh
>
>>
>> Uros.
>>
>> > +/* { dg-options "-mpclmul -O2 -fdump-rtl-dfinish -fdump-tree-crc 
>> > -fdisable-tree-phiopt2 -fdisable-tree-phiopt3" } */
>> > +
>> > +#include "../../gcc.dg/torture/crc-1.c"
>> > +
>> > +/* { dg-final { scan-tree-dump "calculates CRC!" "crc"} } */
>> > +/* { dg-final { scan-tree-dump-times "Couldn't generate faster CRC code." 
>> > 0 "crc"} } */
>> > +/* { dg-final { scan-rtl-dump "pclmulqdq" "dfinish"} } */
>> > diff --git a/gcc/testsuite/gcc.target/i386/crc-10-pclmul.c 
>> > b/gcc/testsuite/gcc.target/i386/crc-10-pclmul.c
>> > new file mode 100644
>> > index 00000000000..39bfd386d9c
>> > --- /dev/null
>> > +++ b/gcc/testsuite/gcc.target/i386/crc-10-pclmul.c
>> > @@ -0,0 +1,8 @@
>> > +/* { dg-do run } */
>> > +/* { dg-options "-mpclmul -O2 -fdump-rtl-dfinish -fdump-tree-crc" } */
>> > +
>> > +#include "../../gcc.dg/torture/crc-10.c"
>> > +
>> > +/* { dg-final { scan-tree-dump "calculates CRC!" "crc"} } */
>> > +/* { dg-final { scan-tree-dump-times "Couldn't generate faster CRC code." 
>> > 0 "crc"} } */
>> > +/* { dg-final { scan-rtl-dump "pclmulqdq" "dfinish"} } */
>> > diff --git a/gcc/testsuite/gcc.target/i386/crc-12-pclmul.c 
>> > b/gcc/testsuite/gcc.target/i386/crc-12-pclmul.c
>> > new file mode 100644
>> > index 00000000000..1ac9a6bf56d
>> > --- /dev/null
>> > +++ b/gcc/testsuite/gcc.target/i386/crc-12-pclmul.c
>> > @@ -0,0 +1,9 @@
>> > +/* { dg-do run } */
>> > +/* { dg-options "-mpclmul -O2 -fdump-rtl-dfinish -fdump-tree-crc 
>> > -fdisable-tree-phiopt2 -fdisable-tree-phiopt3" } */
>> > +/* { dg-skip-if "" { *-*-* } { "-flto"} } */
>> > +
>> > +#include "../../gcc.dg/torture/crc-12.c"
>> > +
>> > +/* { dg-final { scan-tree-dump "calculates CRC!" "crc"} } */
>> > +/* { dg-final { scan-tree-dump-times "Couldn't generate faster CRC code." 
>> > 0 "crc"} } */
>> > +/* { dg-final { scan-rtl-dump "pclmulqdq" "dfinish"} } */
>> > diff --git a/gcc/testsuite/gcc.target/i386/crc-13-pclmul.c 
>> > b/gcc/testsuite/gcc.target/i386/crc-13-pclmul.c
>> > new file mode 100644
>> > index 00000000000..c290539fad3
>> > --- /dev/null
>> > +++ b/gcc/testsuite/gcc.target/i386/crc-13-pclmul.c
>> > @@ -0,0 +1,8 @@
>> > +/* { dg-do run } */
>> > +/* { dg-options "-mpclmul -O2 -fdump-rtl-dfinish -fdump-tree-crc" } */
>> > +
>> > +#include "../../gcc.dg/torture/crc-13.c"
>> > +
>> > +/* { dg-final { scan-tree-dump "calculates CRC!" "crc"} } */
>> > +/* { dg-final { scan-tree-dump-times "Couldn't generate faster CRC code." 
>> > 0 "crc"} } */
>> > +/* { dg-final { scan-rtl-dump "pclmulqdq" "dfinish"} } */
>> > diff --git a/gcc/testsuite/gcc.target/i386/crc-14-pclmul.c 
>> > b/gcc/testsuite/gcc.target/i386/crc-14-pclmul.c
>> > new file mode 100644
>> > index 00000000000..cc62ee471c7
>> > --- /dev/null
>> > +++ b/gcc/testsuite/gcc.target/i386/crc-14-pclmul.c
>> > @@ -0,0 +1,8 @@
>> > +/* { dg-do run } */
>> > +/* { dg-options "-mpclmul -O2 -fdump-rtl-dfinish -fdump-tree-crc" } */
>> > +
>> > +#include "../../gcc.dg/torture/crc-14.c"
>> > +
>> > +/* { dg-final { scan-tree-dump "calculates CRC!" "crc"} } */
>> > +/* { dg-final { scan-tree-dump-times "Couldn't generate faster CRC code." 
>> > 0 "crc"} } */
>> > +/* { dg-final { scan-rtl-dump "pclmulqdq" "dfinish"} } */
>> > diff --git a/gcc/testsuite/gcc.target/i386/crc-17-pclmul.c 
>> > b/gcc/testsuite/gcc.target/i386/crc-17-pclmul.c
>> > new file mode 100644
>> > index 00000000000..660bff55e1b
>> > --- /dev/null
>> > +++ b/gcc/testsuite/gcc.target/i386/crc-17-pclmul.c
>> > @@ -0,0 +1,8 @@
>> > +/* { dg-do run } */
>> > +/* { dg-options "-mpclmul -O2 -fdump-rtl-dfinish -fdump-tree-crc" } */
>> > +
>> > +#include "../../gcc.dg/torture/crc-17.c"
>> > +
>> > +/* { dg-final { scan-tree-dump "calculates CRC!" "crc"} } */
>> > +/* { dg-final { scan-tree-dump-times "Couldn't generate faster CRC code." 
>> > 0 "crc"} } */
>> > +/* { dg-final { scan-rtl-dump "pclmulqdq" "dfinish"} } */
>> > diff --git a/gcc/testsuite/gcc.target/i386/crc-18-pclmul.c 
>> > b/gcc/testsuite/gcc.target/i386/crc-18-pclmul.c
>> > new file mode 100644
>> > index 00000000000..e54392b32a9
>> > --- /dev/null
>> > +++ b/gcc/testsuite/gcc.target/i386/crc-18-pclmul.c
>> > @@ -0,0 +1,8 @@
>> > +/* { dg-do run } */
>> > +/* { dg-options "-mpclmul -O2 -fdump-rtl-dfinish -fdump-tree-crc" } */
>> > +
>> > +#include "../../gcc.dg/torture/crc-18.c"
>> > +
>> > +/* { dg-final { scan-tree-dump "calculates CRC!" "crc"} } */
>> > +/* { dg-final { scan-tree-dump-times "Couldn't generate faster CRC code." 
>> > 0 "crc"} } */
>> > +/* { dg-final { scan-rtl-dump "pclmulqdq" "dfinish"} } */
>> > diff --git a/gcc/testsuite/gcc.target/i386/crc-21-pclmul.c 
>> > b/gcc/testsuite/gcc.target/i386/crc-21-pclmul.c
>> > new file mode 100644
>> > index 00000000000..4db1504cd49
>> > --- /dev/null
>> > +++ b/gcc/testsuite/gcc.target/i386/crc-21-pclmul.c
>> > @@ -0,0 +1,8 @@
>> > +/* { dg-do run } */
>> > +/* { dg-options "-mpclmul -O2 -fdump-rtl-dfinish -fdump-tree-crc" } */
>> > +
>> > +#include "../../gcc.dg/torture/crc-21.c"
>> > +
>> > +/* { dg-final { scan-tree-dump "calculates CRC!" "crc"} } */
>> > +/* { dg-final { scan-tree-dump-times "Couldn't generate faster CRC code." 
>> > 0 "crc"} } */
>> > +/* { dg-final { scan-rtl-dump "pclmulqdq" "dfinish"} } */
>> > diff --git a/gcc/testsuite/gcc.target/i386/crc-22-pclmul.c 
>> > b/gcc/testsuite/gcc.target/i386/crc-22-pclmul.c
>> > new file mode 100644
>> > index 00000000000..d0f27d96069
>> > --- /dev/null
>> > +++ b/gcc/testsuite/gcc.target/i386/crc-22-pclmul.c
>> > @@ -0,0 +1,8 @@
>> > +/* { dg-do run } */
>> > +/* { dg-options "-mpclmul -O2 -fdump-rtl-dfinish -fdump-tree-crc" } */
>> > +
>> > +#include "../../gcc.dg/torture/crc-22.c"
>> > +
>> > +/* { dg-final { scan-tree-dump "calculates CRC!" "crc"} } */
>> > +/* { dg-final { scan-tree-dump-times "Couldn't generate faster CRC code." 
>> > 0 "crc"} } */
>> > +/* { dg-final { scan-rtl-dump "pclmulqdq" "dfinish"} } */
>> > diff --git a/gcc/testsuite/gcc.target/i386/crc-23-pclmul.c 
>> > b/gcc/testsuite/gcc.target/i386/crc-23-pclmul.c
>> > new file mode 100644
>> > index 00000000000..666f3620597
>> > --- /dev/null
>> > +++ b/gcc/testsuite/gcc.target/i386/crc-23-pclmul.c
>> > @@ -0,0 +1,8 @@
>> > +/* { dg-do run } */
>> > +/* { dg-options "-mpclmul -O2 -fdump-rtl-dfinish -fdump-tree-crc" } */
>> > +
>> > +#include "../../gcc.dg/torture/crc-23.c"
>> > +
>> > +/* { dg-final { scan-tree-dump "calculates CRC!" "crc"} } */
>> > +/* { dg-final { scan-tree-dump-times "Couldn't generate faster CRC code." 
>> > 0 "crc"} } */
>> > +/* { dg-final { scan-rtl-dump "pclmulqdq" "dfinish"} } */
>> > diff --git a/gcc/testsuite/gcc.target/i386/crc-4-pclmul.c 
>> > b/gcc/testsuite/gcc.target/i386/crc-4-pclmul.c
>> > new file mode 100644
>> > index 00000000000..398ecaa4aba
>> > --- /dev/null
>> > +++ b/gcc/testsuite/gcc.target/i386/crc-4-pclmul.c
>> > @@ -0,0 +1,8 @@
>> > +/* { dg-do run } */
>> > +/* { dg-options "-mpclmul -O2 -fdump-rtl-dfinish -fdump-tree-crc" } */
>> > +
>> > +#include "../../gcc.dg/torture/crc-4.c"
>> > +
>> > +/* { dg-final { scan-tree-dump "calculates CRC!" "crc"} } */
>> > +/* { dg-final { scan-tree-dump-times "Couldn't generate faster CRC code." 
>> > 0 "crc"} } */
>> > +/* { dg-final { scan-rtl-dump "pclmulqdq" "dfinish"} } */
>> > diff --git a/gcc/testsuite/gcc.target/i386/crc-5-pclmul.c 
>> > b/gcc/testsuite/gcc.target/i386/crc-5-pclmul.c
>> > new file mode 100644
>> > index 00000000000..4b487fefd95
>> > --- /dev/null
>> > +++ b/gcc/testsuite/gcc.target/i386/crc-5-pclmul.c
>> > @@ -0,0 +1,9 @@
>> > +/* { dg-do run } */
>> > +/* { dg-options "-mpclmul -O2 -w -fdump-rtl-dfinish -fdump-tree-crc" } */
>> > +/* { dg-skip-if "" { *-*-* } { "-flto"} } */
>> > +
>> > +#include "../../gcc.dg/torture/crc-5.c"
>> > +
>> > +/* { dg-final { scan-tree-dump "calculates CRC!" "crc"} } */
>> > +/* { dg-final { scan-tree-dump-times "Couldn't generate faster CRC code." 
>> > 0 "crc"} } */
>> > +/* { dg-final { scan-rtl-dump "pclmulqdq" "dfinish"} } */
>> > diff --git a/gcc/testsuite/gcc.target/i386/crc-6-pclmul.c 
>> > b/gcc/testsuite/gcc.target/i386/crc-6-pclmul.c
>> > new file mode 100644
>> > index 00000000000..614423039d4
>> > --- /dev/null
>> > +++ b/gcc/testsuite/gcc.target/i386/crc-6-pclmul.c
>> > @@ -0,0 +1,8 @@
>> > +/* { dg-do run } */
>> > +/* { dg-options "-mpclmul -O2 -fdump-rtl-dfinish -fdump-tree-crc" } */
>> > +
>> > +#include "../../gcc.dg/torture/crc-6.c"
>> > +
>> > +/* { dg-final { scan-tree-dump "calculates CRC!" "crc"} } */
>> > +/* { dg-final { scan-tree-dump-times "Couldn't generate faster CRC code." 
>> > 0 "crc"} } */
>> > +/* { dg-final { scan-rtl-dump "pclmulqdq" "dfinish"} } */
>> > diff --git a/gcc/testsuite/gcc.target/i386/crc-7-pclmul.c 
>> > b/gcc/testsuite/gcc.target/i386/crc-7-pclmul.c
>> > new file mode 100644
>> > index 00000000000..3e5cc75338e
>> > --- /dev/null
>> > +++ b/gcc/testsuite/gcc.target/i386/crc-7-pclmul.c
>> > @@ -0,0 +1,8 @@
>> > +/* { dg-do run } */
>> > +/* { dg-options "-mpclmul -O2 -fdump-rtl-dfinish -fdump-tree-crc" } */
>> > +
>> > +#include "../../gcc.dg/torture/crc-7.c"
>> > +
>> > +/* { dg-final { scan-tree-dump "calculates CRC!" "crc"} } */
>> > +/* { dg-final { scan-tree-dump-times "Couldn't generate faster CRC code." 
>> > 0 "crc"} } */
>> > +/* { dg-final { scan-rtl-dump "pclmulqdq" "dfinish"} } */
>> > diff --git a/gcc/testsuite/gcc.target/i386/crc-8-pclmul.c 
>> > b/gcc/testsuite/gcc.target/i386/crc-8-pclmul.c
>> > new file mode 100644
>> > index 00000000000..4b1145553fc
>> > --- /dev/null
>> > +++ b/gcc/testsuite/gcc.target/i386/crc-8-pclmul.c
>> > @@ -0,0 +1,8 @@
>> > +/* { dg-do run } */
>> > +/* { dg-options "-mpclmul -O2 -fdump-rtl-dfinish -fdump-tree-crc" } */
>> > +
>> > +#include "../../gcc.dg/torture/crc-8.c"
>> > +
>> > +/* { dg-final { scan-tree-dump "calculates CRC!" "crc"} } */
>> > +/* { dg-final { scan-tree-dump-times "Couldn't generate faster CRC code." 
>> > 0 "crc"} } */
>> > +/* { dg-final { scan-rtl-dump "pclmulqdq" "dfinish"} } */
>> > diff --git a/gcc/testsuite/gcc.target/i386/crc-9-pclmul.c 
>> > b/gcc/testsuite/gcc.target/i386/crc-9-pclmul.c
>> > new file mode 100644
>> > index 00000000000..204d6c84d47
>> > --- /dev/null
>> > +++ b/gcc/testsuite/gcc.target/i386/crc-9-pclmul.c
>> > @@ -0,0 +1,8 @@
>> > +/* { dg-do run } */
>> > +/* { dg-options "-mpclmul -O2 -fdump-rtl-dfinish -fdump-tree-crc" } */
>> > +
>> > +#include "../../gcc.dg/torture/crc-9.c"
>> > +
>> > +/* { dg-final { scan-tree-dump "calculates CRC!" "crc"} } */
>> > +/* { dg-final { scan-tree-dump-times "Couldn't generate faster CRC code." 
>> > 0 "crc"} } */
>> > +/* { dg-final { scan-rtl-dump "pclmulqdq" "dfinish"} } */
>> > diff --git a/gcc/testsuite/gcc.target/i386/crc-CCIT-data16-pclmul.c 
>> > b/gcc/testsuite/gcc.target/i386/crc-CCIT-data16-pclmul.c
>> > new file mode 100644
>> > index 00000000000..1676eb5265b
>> > --- /dev/null
>> > +++ b/gcc/testsuite/gcc.target/i386/crc-CCIT-data16-pclmul.c
>> > @@ -0,0 +1,9 @@
>> > +/* { dg-do run } */
>> > +/* { dg-options "-w -mpclmul -O2 -fdump-rtl-dfinish -fdump-tree-crc" } */
>> > +/* { dg-skip-if "" { *-*-* } { "-flto"} } */
>> > +
>> > +#include "../../gcc.dg/torture/crc-CCIT-data16.c"
>> > +
>> > +/* { dg-final { scan-tree-dump "calculates CRC!" "crc"} } */
>> > +/* { dg-final { scan-tree-dump-times "Couldn't generate faster CRC code." 
>> > 0 "crc"} } */
>> > +/* { dg-final { scan-rtl-dump "pclmulqdq" "dfinish"} } */
>> > diff --git a/gcc/testsuite/gcc.target/i386/crc-CCIT-data8-pclmul.c 
>> > b/gcc/testsuite/gcc.target/i386/crc-CCIT-data8-pclmul.c
>> > new file mode 100644
>> > index 00000000000..241181f89e2
>> > --- /dev/null
>> > +++ b/gcc/testsuite/gcc.target/i386/crc-CCIT-data8-pclmul.c
>> > @@ -0,0 +1,9 @@
>> > +/* { dg-do run } */
>> > +/* { dg-options "-w -mpclmul -O2 -fdump-rtl-dfinish -fdump-tree-crc" } */
>> > +/* { dg-skip-if "" { *-*-* } { "-flto" } } */
>> > +
>> > +#include "../../gcc.dg/torture/crc-CCIT-data8.c"
>> > +
>> > +/* { dg-final { scan-tree-dump "calculates CRC!" "crc"} } */
>> > +/* { dg-final { scan-tree-dump-times "Couldn't generate faster CRC code." 
>> > 0 "crc"} } */
>> > +/* { dg-final { scan-rtl-dump "pclmulqdq" "dfinish"} } */
>> > diff --git a/gcc/testsuite/gcc.target/i386/crc-coremark-16bitdata-pclmul.c 
>> > b/gcc/testsuite/gcc.target/i386/crc-coremark-16bitdata-pclmul.c
>> > new file mode 100644
>> > index 00000000000..c64d17e30fd
>> > --- /dev/null
>> > +++ b/gcc/testsuite/gcc.target/i386/crc-coremark-16bitdata-pclmul.c
>> > @@ -0,0 +1,9 @@
>> > +/* { dg-do run } */
>> > +/* { dg-options "-w -mpclmul -O2 -fdump-rtl-dfinish -fdump-tree-crc" } */
>> > +/* { dg-skip-if "" { *-*-* } { "-flto"} } */
>> > +
>> > +#include "../../gcc.dg/torture/crc-coremark16-data16.c"
>> > +
>> > +/* { dg-final { scan-tree-dump "calculates CRC!" "crc"} } */
>> > +/* { dg-final { scan-tree-dump-times "Couldn't generate faster CRC code." 
>> > 0 "crc"} } */
>> > +/* { dg-final { scan-rtl-dump "pclmulqdq" "dfinish"} } */
>> > diff --git a/gcc/testsuite/gcc.target/i386/crc-crc32-data16.c 
>> > b/gcc/testsuite/gcc.target/i386/crc-crc32-data16.c
>> > new file mode 100644
>> > index 00000000000..49ab5f31ef0
>> > --- /dev/null
>> > +++ b/gcc/testsuite/gcc.target/i386/crc-crc32-data16.c
>> > @@ -0,0 +1,53 @@
>> > +/* { dg-do run } */
>> > +/* { dg-options "-mcrc32 -O2 -fdump-rtl-dfinish -fdump-tree-crc" } */

You will have to use sse4 effective target (in the same way as pclmul
effective target). The tests that use -mcrc32 should be skipped on
targets that don't have support to compile sse4 instructions. See
gcc.target/i386/sse4_2-crc32l.c

Other than that, runtime tests lack runtime checks for appropriate ISA
(pclmul or crc32/sse4.2) support. Tests will fail on older processors.
There are several examples in gcc.target/i386, e.g.: pclmulqdq.c and
sse4_2-crc32l.c

Uros.

Reply via email to