-
Notifications
You must be signed in to change notification settings - Fork 68
Add intrinsics for the new FP conversions introduced by the 2024 dpISA #407
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
4dbaa35 to
a4bc412
Compare
|
As these instructions operate only on scalar values should they be defined in the arm_acle.h header instead of arm_neon.h? |
|
Hi @ktkachov,
The new type for the converts are for FPRCVT. |
FEAT_FPRCVT adds 4 new variants for each FCVTAS, FCVTAU, FCVTMS, FCVTMU, FCVTNS, FCVTNU, FCVTPS, FCVTPU, FCVTZS, and FCVTZU instruction. 1) Half Precision to 32-bit 2) Half Precision to 64-bit 3) Single Precision to 64-bit 4) Double Precision to 32-bit For the Single Precision to 64-bit and Double Precision to 32-bit variants, this patch adds two new intrinsics, that reduce to - Single Precision to 64-bit : <INST> Dd,Sn - Double Precision to 32-bit : <INST> Sd,Dn The intrinsics for conversions from Half Precision are already defined. However they are documented as reducing to the incorrect instruction format; <INST> Hd,Hn, so this patch fixes them to be - Half Precision to 32-bit : <INST> Sd,Hn - Half Precision to 64-bit : <INST> Dd,Hn
04bd0d1 to
f080ec7
Compare
tools/intrinsic_db/advsimd.csv
Outdated
| uint32x2_t vcvta_u32_f32(float32x2_t a) a -> Vn.2S FCVTAU Vd.2S,Vn.2S Vd.2S -> result A32/A64 | ||
| uint32x4_t vcvtaq_u32_f32(float32x4_t a) a -> Vn.4S FCVTAU Vd.4S,Vn.4S Vd.4S -> result A32/A64 | ||
| int32_t vcvts_s32_f32(float32_t a) a -> Sn FCVTZS Sd,Sn Sd -> result A64 | ||
| int64_t vcvts_s64_f32(float32_t a) a -> Sn FCVTZS Dd,Sn Dd -> result A64 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is there a reason you didn't include GPR variants here ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
My reasoning was that the fact that there were no existing conversion intrinsics that lowered to GPRs (https://developer.arm.com/documentation/ddi0602/2025-06/SIMD-FP-Instructions/FCVTZS--scalar--integer---Floating-point-convert-to-signed-integer--rounding-toward-zero--scalar--) we would only need to implement the intrinsics that lower to Neon registers. Thinking a bit more I guess it is better to extend the proposal to intrinsics that lower to both GP and Neon registers?
…both GP/Neon registers
Lukacma
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
|
Im not sure why the comments about removing AArch32 versions were resolved, that still seems like an issue here |
|
@AlfieRichardsArm are you happy about the removal of AArch32 versions ? |
|
@Lukacma not really, Im still unclear why this is removing the AArch32 version of vcvth_s32_f16 and similar? |
| int32_t vcvth_s32_f16(float16_t a) a -> Hn FCVTZS Sd/Wd,Hn Sd/Wd -> result A64 | ||
| int64_t vcvth_s64_f16(float16_t a) a -> Hn FCVTZS Dd/Xd,Hn Dd/Xd -> result A64 | ||
| uint16_t vcvth_u16_f16(float16_t a) a -> Hn FCVTZU Hd,Hn Hd -> result A64 | ||
| uint32_t vcvth_u32_f16(float16_t a) a -> Hn FCVTZU Hd,Hn Hd -> result A32/A64 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It seems here the A32 variant is removed? Why is this? I dont think we should do that.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't know for sure, but from what I could find the only conversion instruction I could find in A32 is this one which operates on 32 bit values only. So maybe only intrinsics for this variant should exist in A32 and rest should be A64 only ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There are more conversion instructions here.
But regardless, if we currently support these intrinsics for AAarch32, and have done for some time, removing them is a breaking change that would need much wider discussion?
As I understand it, this extension adds support for existing conversions in AArch64 but allows the integer part to remain in the FP registers. It should have no effect on our AArch32 intrinsics so removing AArch32 intrinsics here seems wrong.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Okay. I don't think any compiler actually supports these intrinsics in aarch32 as their corresponding instructions don't exist, but I agree this change is unrelated to the core of the patch so I will remove it.
FEAT_FPRCVT adds 4 new variants for each FCVTAS, FCVTAU, FCVTMS, FCVTMU, FCVTNS, FCVTNU, FCVTPS, FCVTPU, FCVTZS, and FCVTZU instruction. 1) Half Precision to 32-bit
2) Half Precision to 64-bit
3) Single Precision to 64-bit
4) Double Precision to 32-bit
For the Single Precision to 64-bit and Double Precision to 32-bit variants, this patch adds two new intrinsics, that reduce to
The intrinsics for conversions from Half Precision are already defined. However they are documented as reducing to the incorrect instruction format; Hd,Hn, so this patch fixes them to be
name: Pull request
about: Technical issues, document format problems, bugs in scripts or feature proposal.
Thank you for submitting a pull request!
If this PR is about a bugfix:
Please use the bugfix label and make sure to go through the checklist below.
If this PR is about a proposal:
We are looking forward to evaluate your proposal, and if possible to
make it part of the Arm C Language Extension (ACLE) specifications.
We would like to encourage you reading through the contribution
guidelines, in particular the section on submitting
a proposal.
Please use the proposal label.
As for any pull request, please make sure to go through the below
checklist.
Checklist: (mark with
Xthose which apply)PR (do not bother creating the issue if all you want to do is
fixing the bug yourself).
SPDX-FileCopyrightTextlines on topof any file I have edited. Format is
SPDX-FileCopyrightText: Copyright {year} {entity or name} <{contact informations}>(Please update existing copyright lines if applicable. You can
specify year ranges with hyphen , as in
2017-2019, and usecommas to separate gaps, as in
2018-2020, 2022).Copyrightsection of the sources of thespecification I have edited (this will show up in the text
rendered in the PDF and other output format supported). The
format is the same described in the previous item.
tricky to set up on non-*nix machines). The sequence can be
found in the contribution
guidelines. Don't
worry if you cannot run these scripts on your machine, your
patch will be automatically checked in the Actions of the pull
request.
introduced in this PR in the section Changes for next
release of the section Change Control/Document history
of the document. Create Changes for next release if it does
not exist. Notice that changes that are not modifying the
content and rendering of the specifications (both HTML and PDF)
do not need to be listed.
correctness of the result in the PDF output (please refer to the
instructions on how to build the PDFs
locally).
draftversionis set totruein the YAML headerof the sources of the specifications I have modified.
in the README page of the project.