]> git.ipfire.org Git - thirdparty/gcc.git/commit
aarch64: Implement new expander for efficient CRC computation.
authorMariam Arutunian <mariamarutunian@gmail.com>
Mon, 9 Dec 2024 22:41:41 +0000 (22:41 +0000)
committerRichard Sandiford <richard.sandiford@arm.com>
Mon, 9 Dec 2024 22:41:41 +0000 (22:41 +0000)
commita193f5333295a96021f98b3dfde2941d69f06d8b
tree3912181247096978d183bf7390a40ad6a9f08fa8
parentbe2062be9a629ae18a0c87c6b9cbe1885978417e
aarch64: Implement new expander for efficient CRC computation.

This patch introduces two new expanders for the aarch64 backend,
dedicated to generate optimized code for CRC computations.
The new expanders are designed to leverage specific hardware capabilities
to achieve faster CRC calculations,
particularly using the crc32, crc32c and pmull instructions when supported
by the target architecture.

Expander 1: Bit-Forward CRC (crc<ALLI:mode><ALLX:mode>4)
For targets that support pmul instruction (TARGET_AES),
the expander will generate code that uses the pmull (crypto_pmulldi)
instruction for CRC computation.

Expander 2: Bit-Reversed CRC (crc_rev<ALLI:mode><ALLX:mode>4)
The expander first checks if the target supports the CRC32* instruction set
(TARGET_CRC32)
and the polynomial in use is 0x1EDC6F41 (iSCSI) or 0x04C11DB7 (HDLC). If
the conditions are met,
it emits calls to the corresponding crc32* instruction (depending on the
data size and the polynomial).
If the target does not support crc32* but supports pmull, it then uses the
pmull (crypto_pmulldi) instruction for bit-reversed CRC computation.
Otherwise table-based CRC is generated.

gcc/

* config/aarch64/aarch64-protos.h (aarch64_expand_crc_using_pmull): New
extern function declaration.
(aarch64_expand_reversed_crc_using_pmull):  Likewise.
* config/aarch64/aarch64.cc (aarch64_expand_crc_using_pmull): New
function.
(aarch64_expand_reversed_crc_using_pmull):  Likewise.
* config/aarch64/aarch64.md (crc_rev<ALLI:mode><ALLX:mode>4): New
expander for reversed CRC.
(crc<ALLI:mode><ALLX:mode>4): New expander for bit-forward CRC.
* config/aarch64/iterators.md (crc_data_type): New mode attribute.

gcc/testsuite/

* gcc.target/aarch64/crc-1-pmul.c: New test.
* gcc.target/aarch64/crc-10-pmul.c: Likewise.
* gcc.target/aarch64/crc-12-pmul.c: Likewise.
* gcc.target/aarch64/crc-13-pmul.c: Likewise.
* gcc.target/aarch64/crc-14-pmul.c: Likewise.
* gcc.target/aarch64/crc-17-pmul.c: Likewise.
* gcc.target/aarch64/crc-18-pmul.c: Likewise.
* gcc.target/aarch64/crc-21-pmul.c: Likewise.
* gcc.target/aarch64/crc-22-pmul.c: Likewise.
* gcc.target/aarch64/crc-23-pmul.c: Likewise.
* gcc.target/aarch64/crc-4-pmul.c: Likewise.
* gcc.target/aarch64/crc-5-pmul.c: Likewise.
* gcc.target/aarch64/crc-6-pmul.c: Likewise.
* gcc.target/aarch64/crc-7-pmul.c: Likewise.
* gcc.target/aarch64/crc-8-pmul.c: Likewise.
* gcc.target/aarch64/crc-9-pmul.c: Likewise.
* gcc.target/aarch64/crc-CCIT-data16-pmul.c: Likewise.
* gcc.target/aarch64/crc-CCIT-data8-pmul.c: Likewise.
* gcc.target/aarch64/crc-coremark-16bitdata-pmul.c: Likewise.
* gcc.target/aarch64/crc-crc32-data16.c: Likewise.
* gcc.target/aarch64/crc-crc32-data32.c: Likewise.
* gcc.target/aarch64/crc-crc32-data8.c: Likewise.
* gcc.target/aarch64/crc-crc32c-data16.c: Likewise.
* gcc.target/aarch64/crc-crc32c-data32.c: Likewise.
* gcc.target/aarch64/crc-crc32c-data8.c: Likewise.

Signed-off-by: Mariam Arutunian <mariamarutunian@gmail.com>
Co-authored-by: Richard Sandiford <richard.sandiford@arm.com>
29 files changed:
gcc/config/aarch64/aarch64-protos.h
gcc/config/aarch64/aarch64.cc
gcc/config/aarch64/aarch64.md
gcc/config/aarch64/iterators.md
gcc/testsuite/gcc.target/aarch64/crc-1-pmul.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/crc-10-pmul.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/crc-12-pmul.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/crc-13-pmul.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/crc-14-pmul.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/crc-17-pmul.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/crc-18-pmul.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/crc-21-pmul.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/crc-22-pmul.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/crc-23-pmul.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/crc-4-pmul.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/crc-5-pmul.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/crc-6-pmul.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/crc-7-pmul.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/crc-8-pmul.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/crc-9-pmul.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/crc-CCIT-data16-pmul.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/crc-CCIT-data8-pmul.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/crc-coremark-16bitdata-pmul.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/crc-crc32-data16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/crc-crc32-data32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/crc-crc32-data8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/crc-crc32c-data16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/crc-crc32c-data32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/crc-crc32c-data8.c [new file with mode: 0644]