On Sun, Aug 25, 2024 at 9:41 PM Jeff Law <jeffreya...@gmail.com> wrote:

>
>
> On 7/26/24 12:06 PM, Mariam Arutunian wrote:
> >    If the target is ZBC or ZBKC, it uses clmul instruction for the CRC
> > calculation.
> > Otherwise, if the target is ZBKB, generates table-based CRC, but for
> > reversing inputs and the output uses bswap and brev8 instructions.
> >    Add new tests to check CRC generation for ZBC, ZBKC and ZBKB targets.
> >
> >       gcc/
> >
> >          * expr.cc (reflect): New function.
> >          (gf2n_poly_long_div_quotient): Likewise.
> >          * expr.h (reflect): New function declaration.
> >          (gf2n_poly_long_div_quotient): Likewise.
> >
> >       gcc/config/riscv/
> >
> >          * bitmanip.md (crc_rev<ANYI1:mode><ANYI:mode>4): New expander
> > for reversed CRC.
> >          (crc<SUBX1:mode><SUBX:mode>4): New expander for bit-forward CRC.
> >          (SUBX1, ANYI1): New iterators.
> >          * riscv-protos.h (generate_reflecting_code_using_brev): New
> > function declaration.
> >          (expand_crc_using_clmul): Likewise.
> >          (expand_reversed_crc_using_clmul): Likewise.
> >          * riscv.cc (generate_reflecting_code_using_brev): New function.
> >          (expand_crc_using_clmul): Likewise.
> >          (expand_reversed_crc_using_clmul): Likewise.
> >          * riscv.md (UNSPEC_CRC, UNSPEC_CRC_REV):  New unspecs.
> >
> >       gcc/testsuite/gcc.target/riscv/
> >
> >             * crc-1-zbc.c: New test.
> >             * crc-1-zbc.c: Likewise.
> >             * crc-10-zbc.c: Likewise.
> >             * crc-10-zbkc.c: Likewise.
> >             * crc-12-zbc.c: Likewise.
> >             * crc-12-zbkc.c: Likewise.
> >             * crc-13-zbc.c: Likewise.
> >             * crc-13-zbkc.c: Likewise.
> >             * crc-14-zbc.c: Likewise.
> >             * crc-14-zbkc.c: Likewise.
> >             * crc-17-zbc.c: Likewise.
> >             * crc-17-zbkc.c: Likewise.
> >             * crc-18-zbc.c: Likewise.
> >             * crc-18-zbkc.c: Likewise.
> >             * crc-21-zbc.c: Likewise.
> >             * crc-21-zbkc.c: Likewise.
> >             * crc-22-rv64-zbc.c: Likewise.
> >             * crc-22-rv64-zbkb.c: Likewise.
> >             * crc-22-rv64-zbkc.c: Likewise.
> >             * crc-23-zbc.c: Likewise.
> >             * crc-23-zbkc.c: Likewise.
> >             * crc-4-zbc.c: Likewise.
> >             * crc-4-zbkb.c: Likewise.
> >             * crc-4-zbkc.c: Likewise.
> >             * crc-5-zbc.c: Likewise.
> >             * crc-5-zbkb.c: Likewise.
> >             * crc-5-zbkc.c: Likewise.
> >             * crc-6-zbc.c: Likewise.
> >             * crc-6-zbkc.c: Likewise.
> >             * crc-7-zbc.c: Likewise.
> >             * crc-7-zbkc.c: Likewise.
> >             * crc-8-zbc.c: Likewise.
> >             * crc-8-zbkb.c: Likewise.
> >             * crc-8-zbkc.c: Likewise.
> >             * crc-9-zbc.c: Likewise.
> >             * crc-9-zbkc.c: Likewise.
> >             * crc-CCIT-data16-zbc.c: Likewise.
> >             * crc-CCIT-data16-zbkc.c: Likewise.
> >             * crc-CCIT-data8-zbc.c: Likewise.
> >             * crc-CCIT-data8-zbkc.c: Likewise.
> >             * crc-coremark-16bitdata-zbc.c: Likewise.
> >             * crc-coremark-16bitdata-zbkc.c: Likewise.
> >
> >     Signed-off-by: Mariam Arutunian <mariamarutun...@gmail.com
> > <mailto:mariamarutun...@gmail.com>>
> >
> >
> > 0003-RISC-V-Add-CRC-expander-to-generate-faster-CRC.patch
> >
> > diff --git a/gcc/config/riscv/bitmanip.md b/gcc/config/riscv/bitmanip.md
> > index 8769a6b818b..9683ac48ef6 100644
> > --- a/gcc/config/riscv/bitmanip.md
> > +++ b/gcc/config/riscv/bitmanip.md
> > @@ -973,3 +973,67 @@
> >     "TARGET_ZBC"
> >     "clmulr\t%0,%1,%2"
> >     [(set_attr "type" "clmul")])
> > +
> > +
> > +;; Iterator for hardware integer modes narrower than XLEN, same as SUBX
> > +(define_mode_iterator SUBX1 [QI HI (SI "TARGET_64BIT")])
> > +
> > +;; Iterator for hardware integer modes narrower than XLEN, same as ANYI
> > +(define_mode_iterator ANYI1 [QI HI SI (DI "TARGET_64BIT")])
> Might as well go ahead and put these into iterators.md.


Ok.


>
>

> > +
> > +;; Reversed CRC 8, 16, 32 for TARGET_64
> > +(define_expand "crc_rev<ANYI1:mode><ANYI:mode>4"
> > +     ;; return value (calculated CRC)
> > +  [(set (match_operand:ANYI 0 "register_operand" "=r")
> > +                   ;; initial CRC
> > +     (unspec:ANYI [(match_operand:ANYI 1 "register_operand" "r")
> > +                   ;; data
> > +                   (match_operand:ANYI1 2 "register_operand" "r")
> > +                   ;; polynomial without leading 1
> > +                   (match_operand:ANYI 3)]
> > +                   UNSPEC_CRC_REV))]
> > +  /* We don't support the case when data's size is bigger than CRC's
> size.  */
> > +  "(((TARGET_ZBKC || TARGET_ZBC) && <ANYI:MODE>mode < word_mode)
> > +    || TARGET_ZBKB) && <ANYI:MODE>mode >= <ANYI1:MODE>mode"
> This condition should get reformatted.   Ideally the condition should be
> fairly obvious, but it's fairly obfuscated here.
>
> I would expect that the TARGET_ZBKB likely belongs inside the
> conditional with the other TARGET tests.  Perhaps something like this:
>
> > "(TARGET_ZBKB || TARGET_ZBKC || TARGET_ZBC)
> >  && <ANYI:MODE>mode < word_mode
> >  && <ANYI:MODE>mode >= <ANYI1:MODE>mode"
>
> Or did you mean to allow ZBKB even if the quotient needs 65 bits?  If so
> the condition still needs adjustment, just a different adjustment.


Yes, in the case of ZBKB I generate table-based CRC, just use specific
instructions to reverse values.
Would it be okay if I just leave "<ANYI:MODE>mode >= <ANYI1:MODE>",
and then generate a standard table-based implementation in the body if none
of the conditions are met?

Or just write this way:
"(TARGET_ZBKB
  || ((TARGET_ZBKC || TARGET_ZBC) && <ANYI:MODE>mode < word_mode))
  && <ANYI:MODE>mode >= <ANYI1:MODE>mode"


>

> Otherwise this looks fine to me.  Were there any adjustments you were
> considering after working through the aarch64 expansion with Richard S?
>

Yes, I applied some of the changes I made in AArch64 here as well, where
possible and worked.
Also, in AArch64, I used force_reg in some cases, but here, I didn't
change, as you had told me to use riscv_expand_* instead of force_reg.

Thanks,
Mariam


> jeff
>
>
>

Reply via email to