[PATCH] aarch64: Reimplement vshrn_n* intrinsics using builtins
Kyrylo Tkachov
Kyrylo.Tkachov@arm.com
Thu Jan 28 11:43:55 GMT 2021
Hi all,
This patch reimplements the vshrn_n* intrinsics to use RTL builtins.
These perform a narrowing right shift.
Although the intrinsic generates the half-width mode (e.g. V8HI -> V8QI), the new pattern
generates a full 128-bit mode (V8HI -> V16QI) by representing the fill-with-zeroes semantics
of the SHRN instruction. The narrower (V8QI) result is extracted with a lowpart subreg.
I found this allows the RTL optimisers to do a better job at optimising redundant moves away
in frequently-occurring SHRN+SRHN2 pairs, like in:
uint8x16_t
foo (uint16x8_t in1, uint16x8_t in2)
{
uint8x8_t tmp = vshrn_n_u16 (in2, 7);
uint8x16_t tmp2 = vshrn_high_n_u16 (tmp, in1, 4);
return tmp2;
}
Bootstrapped and tested on aarch64-none-linux-gnu and aarch64_be-none-elf.
Pushing to trunk.
Thanks,
Kyrill
gcc/ChangeLog:
* config/aarch64/aarch64-simd-builtins.def (shrn): Define builtin.
* config/aarch64/aarch64-simd.md (aarch64_shrn<mode>_insn_le): Define.
(aarch64_shrn<mode>_insn_be): Likewise.
(aarch64_shrn<mode>): Likewise.
* config/aarch64/arm_neon.h (vshrn_n_s16): Reimplement using builtins.
(vshrn_n_s32): Likewise.
(vshrn_n_s64): Likewise.
(vshrn_n_u16): Likewise.
(vshrn_n_u32): Likewise.
(vshrn_n_u64): Likewise.
* config/aarch64/iterators.md (vn_mode): New mode attribute.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: vshrn.patch
Type: application/octet-stream
Size: 10432 bytes
Desc: vshrn.patch
URL: <https://gcc.gnu.org/pipermail/gcc-patches/attachments/20210128/2fcdccf7/attachment-0001.obj>
More information about the Gcc-patches
mailing list