]> git.feebdaed.xyz Git - 0xmirror/gcc.git/commit
aarch64: add multi-vector floating-point adjust exponent intrinsics
authorClaudio Bantaloukas <claudio.bantaloukas@arm.com>
Wed, 24 Dec 2025 11:41:26 +0000 (11:41 +0000)
committerClaudio Bantaloukas <claudio.bantaloukas@arm.com>
Wed, 24 Dec 2025 11:45:37 +0000 (11:45 +0000)
commit226d5fd59dc8ff0ba8cb07926d9a0e9ac277bad8
treef1a3e5a9d03e63a1ef2e417b1214ac1b79f21894
parentef533d234293585444d3fce7f4eea75699a25c20
aarch64: add multi-vector floating-point adjust exponent intrinsics

This patch adds the following intrinsics (all __arm_streaming only) along with
asm tests for them.

- FSCALE (multiple and single vector)
- svfloat16x2_t svscale[_single_f16_x2](svfloat16x2_t zd, svint16_t zm)
- svfloat32x2_t svscale[_single_f32_x2](svfloat32x2_t zd, svint32_t zm)
- svfloat64x2_t svscale[_single_f64_x2](svfloat64x2_t zd, svint64_t zm)
- svfloat16x4_t svscale[_single_f16_x4](svfloat16x4_t zd, svint16_t zm)
- svfloat32x4_t svscale[_single_f32_x4](svfloat32x4_t zd, svint32_t zm)
- svfloat64x4_t svscale[_single_f64_x4](svfloat64x4_t zd, svint64_t zm)

- FSCALE (multiple vectors)
- svfloat16x2_t svscale[_f16_x2](svfloat16x2_t zd, svint16x2_t zm)
- svfloat32x2_t svscale[_f32_x2](svfloat32x2_t zd, svint32x2_t zm)
- svfloat64x2_t svscale[_f64_x2](svfloat64x2_t zd, svint64x2_t zm)
- svfloat16x4_t svscale[_f16_x4](svfloat16x4_t zd, svint16x4_t zm)
- svfloat32x4_t svscale[_f32_x4](svfloat32x4_t zd, svint32x4_t zm)
- svfloat64x4_t svscale[_f64_x4](svfloat64x4_t zd, svint64x4_t zm)

Test structure is based on the urshl ones that have a similar structure in how
they treat arguments.

gcc/
* config/aarch64/aarch64-sve-builtins-base.cc (svscale_impl): Added new
class for dealing with all svscale functions (including sve)
(svscale): updated FUNCTION macro call to make use of new class.
* config/aarch64/aarch64-sve-builtins-sve2.def: (svscale):
Added new DEF_SVE_FUNCTION_GS call to enable recognition of new variant.
* config/aarch64/aarch64-sve2.md (@aarch64_sve_fscale<mode>): Added
new define_insn. (@aarch64_sve_single_fscale<mode>): Likewise.
* config/aarch64/iterators.md: (SVE_Fx24_NOBF): Added new iterator,
similar to SVE_Fx24 but without brainfloat.
(SVE_Fx24): Updated to make use of SVE_Fx24_NOBF.
(SVSCALE_SINGLE_INTARG): Added new mode_attr.
(SVSCALE_INTARG): Likewise.

gcc/testsuite/
* gcc.target/aarch64/sme2/acle-asm/scale_f16_x2.c: : Added test file.
* gcc.target/aarch64/sme2/acle-asm/scale_f16_x4.c: : Likewise.
* gcc.target/aarch64/sme2/acle-asm/scale_f32_x2.c: : Added test file.
* gcc.target/aarch64/sme2/acle-asm/scale_f32_x4.c: : Likewise.
* gcc.target/aarch64/sme2/acle-asm/scale_f64_x2.c: : Added test file.
* gcc.target/aarch64/sme2/acle-asm/scale_f64_x4.c: : Likewise.
gcc/config/aarch64/aarch64-sve-builtins-base.cc
gcc/config/aarch64/aarch64-sve-builtins-sve2.def
gcc/config/aarch64/aarch64-sve2.md
gcc/config/aarch64/iterators.md
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f16_x2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f16_x4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f32_x2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f32_x4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f64_x2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f64_x4.c [new file with mode: 0644]