Enable __builtin_roundeven[f] by adding roundeven as an alias to the existing frintn support.
Bootstrap OK and passes regress. ChangeLog: 2021-06-18 Wilco Dijkstra <wdijk...@arm.com> PR target/100966 * config/aarch64/aarch64.md (UNSPEC_FRINTR): Add. * config/aarch64/aarch64.c (aarch64_frint_unspec_p): Add UNSPEC_FRINTR. (aarch64_rtx_cost): Likewise. * config/aarch64/iterators.md (FRINT): Add UNSPEC_FRINTR. (frint_pattern): Likewise. (frint_suffix): Likewise. gcc/testsuite PR target/100966 * gcc.target/aarch64/frint.x: Add roundeven tests. * gcc.target/aarch64/frint_double.c: Likewise. * gcc.target/aarch64/frint_float.c: Likewise. --- diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index f4d264bbc817153b330bac9ab423bf561689ebf2..63bd49d475433c04faa89bb380a9d17e4ad4bc6c 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -12253,6 +12253,7 @@ aarch64_frint_unspec_p (unsigned int u) case UNSPEC_FRINTM: case UNSPEC_FRINTA: case UNSPEC_FRINTN: + case UNSPEC_FRINTR: case UNSPEC_FRINTX: case UNSPEC_FRINTI: return true; @@ -13648,6 +13649,7 @@ cost_plus: || uns_code == UNSPEC_FRINTM || uns_code == UNSPEC_FRINTN || uns_code == UNSPEC_FRINTP + || uns_code == UNSPEC_FRINTR || uns_code == UNSPEC_FRINTZ) x = XVECEXP (x, 0, 0); } diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md index 30effca6f3562f6870a6cc8097750e63bb0d424d..70e46f28259640a273d444a2b963246ed9a91109 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -167,6 +167,7 @@ (define_c_enum "unspec" [ UNSPEC_FRINTM UNSPEC_FRINTN UNSPEC_FRINTP + UNSPEC_FRINTR UNSPEC_FRINTX UNSPEC_FRINTZ UNSPEC_GOTSMALLPIC diff --git a/gcc/config/aarch64/iterators.md b/gcc/config/aarch64/iterators.md index cac33ae812b382cd55611b0da8a6e9eac3a513c4..1542661c6d101ed53c6e1c8683cbca32baefebbd 100644 --- a/gcc/config/aarch64/iterators.md +++ b/gcc/config/aarch64/iterators.md @@ -2291,7 +2291,7 @@ (define_int_iterator REVERSE [UNSPEC_REV64 UNSPEC_REV32 UNSPEC_REV16]) (define_int_iterator FRINT [UNSPEC_FRINTZ UNSPEC_FRINTP UNSPEC_FRINTM UNSPEC_FRINTN UNSPEC_FRINTI UNSPEC_FRINTX - UNSPEC_FRINTA]) + UNSPEC_FRINTA UNSPEC_FRINTR ]) (define_int_iterator FCVT [UNSPEC_FRINTZ UNSPEC_FRINTP UNSPEC_FRINTM UNSPEC_FRINTA UNSPEC_FRINTN]) @@ -3079,13 +3079,14 @@ (define_int_attr frint_pattern [(UNSPEC_FRINTZ "btrunc") (UNSPEC_FRINTI "nearbyint") (UNSPEC_FRINTX "rint") (UNSPEC_FRINTA "round") - (UNSPEC_FRINTN "frintn")]) + (UNSPEC_FRINTN "frintn") + (UNSPEC_FRINTR "roundeven")]) ;; frint suffix for floating-point rounding instructions. (define_int_attr frint_suffix [(UNSPEC_FRINTZ "z") (UNSPEC_FRINTP "p") (UNSPEC_FRINTM "m") (UNSPEC_FRINTI "i") (UNSPEC_FRINTX "x") (UNSPEC_FRINTA "a") - (UNSPEC_FRINTN "n")]) + (UNSPEC_FRINTN "n") (UNSPEC_FRINTR "n")]) (define_int_attr fcvt_pattern [(UNSPEC_FRINTZ "btrunc") (UNSPEC_FRINTA "round") (UNSPEC_FRINTP "ceil") (UNSPEC_FRINTM "floor") diff --git a/gcc/testsuite/gcc.target/aarch64/frint.x b/gcc/testsuite/gcc.target/aarch64/frint.x index 1403740686ea3927d2c39eb2466ef8cc67e223b2..d598a25ff21b8feeca6a96de79848b2fbde7f31e 100644 --- a/gcc/testsuite/gcc.target/aarch64/frint.x +++ b/gcc/testsuite/gcc.target/aarch64/frint.x @@ -4,6 +4,7 @@ extern GPF SUFFIX(floor) (GPF); extern GPF SUFFIX(nearbyint) (GPF); extern GPF SUFFIX(rint) (GPF); extern GPF SUFFIX(round) (GPF); +extern GPF SUFFIX(roundeven) (GPF); GPF test1a (GPF x) { @@ -64,3 +65,14 @@ GPF test6b (GPF x) { return SUFFIX(round)(x); } + +GPF test7a (GPF x) +{ + return SUFFIX(__builtin_roundeven)(x); +} + +GPF test7b (GPF x) +{ + return SUFFIX(roundeven)(x); +} + diff --git a/gcc/testsuite/gcc.target/aarch64/frint_double.c b/gcc/testsuite/gcc.target/aarch64/frint_double.c index 96139496ca454cebd41d31e8b018dab7ffa33a3f..1d28eb09e11842802ab632a7696de4407263f8ce 100644 --- a/gcc/testsuite/gcc.target/aarch64/frint_double.c +++ b/gcc/testsuite/gcc.target/aarch64/frint_double.c @@ -12,3 +12,4 @@ /* { dg-final { scan-assembler-times "frinti\td\[0-9\]" 2 } } */ /* { dg-final { scan-assembler-times "frintx\td\[0-9\]" 2 } } */ /* { dg-final { scan-assembler-times "frinta\td\[0-9\]" 2 } } */ +/* { dg-final { scan-assembler-times "frintn\td\[0-9\]" 2 } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/frint_float.c b/gcc/testsuite/gcc.target/aarch64/frint_float.c index 493ec37f940a6e8cb01ea7e324073fa22099636c..530cf975db3d52c30bce43d0c40229b2b375cdea 100644 --- a/gcc/testsuite/gcc.target/aarch64/frint_float.c +++ b/gcc/testsuite/gcc.target/aarch64/frint_float.c @@ -12,3 +12,4 @@ /* { dg-final { scan-assembler-times "frinti\ts\[0-9\]" 2 } } */ /* { dg-final { scan-assembler-times "frintx\ts\[0-9\]" 2 } } */ /* { dg-final { scan-assembler-times "frinta\ts\[0-9\]" 2 } } */ +/* { dg-final { scan-assembler-times "frintn\ts\[0-9\]" 2 } } */