On Thu, 11 Nov 2021, Andre Vieira (lists) wrote: > Hi, > > This patch introduces two IFN's FTRUNC32 and FTRUNC64, the corresponding > optabs and mappings. It also creates a backend pattern to implement them for > aarch64 and a match.pd pattern to idiom recognize these. > These IFN's (and optabs) represent a truncation towards zero, as if performed > by first casting it to a signed integer of 32 or 64 bits and then back to the > same floating point type/mode. > > The match.pd pattern choses to use these, when supported, regardless of > trapping math, since these new patterns mimic the original behavior of > truncating through an integer. > > I didn't think any of the existing IFN's represented these. I know it's a bit > late in stage 1, but I thought this might be OK given it's only used by a > single target and should have very little impact on anything else. > > Bootstrapped on aarch64-none-linux. > > OK for trunk?
On the RTL side ftrunc32/ftrunc64 would probably be better a conversion optab (with two modes), so not +OPTAB_D (ftrunc32_optab, "ftrunc$asi2") +OPTAB_D (ftrunc64_optab, "ftrunc$adi2") but OPTAB_CD (ftrunc_shrt_optab, "ftrunc$a$I$b2") or so? I know that gets somewhat awkward for the internal function, but IMHO we shouldn't tie our hands because of that? Richard. > gcc/ChangeLog: > > * config/aarch64/aarch64.md (ftrunc<mode><frintnz_mode>2): New > pattern. > * config/aarch64/iterators.md (FRINTZ): New iterator. > * doc/md.texi: New entry for ftrunc pattern name. > * internal-fn.def (FTRUNC32): New IFN. > (FTRUNC64): Likewise. > * match.pd: Add to the existing TRUNC pattern match. > * optabs.def (OPTAB_D): New entries for ftrunc. > > gcc/testsuite/ChangeLog: > > * gcc.target/aarch64/merge_trunc1.c: Adapted to skip if frintNz > instruction available. > * lib/target-supports.exp: Added arm_v8_5a_frintnzx_ok target. > * gcc.target/aarch64/frintnz.c: New test. > > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Ivo Totev; HRB 36809 (AG Nuernberg)