From 0659ce6ffb54bcdc6232b6d4ba6b580cbef427c9 Mon Sep 17 00:00:00 2001 From: James Greenhalgh Date: Mon, 29 Apr 2013 10:17:51 +0000 Subject: [PATCH] [AArch64] Map frint intrinsics to standard pattern names directly. gcc/ * config/aarch64/aarch64-builtins.c (aarch64_builtin_vectorized_function): Fold to standard pattern names. * config/aarch64/aarch64-simd-builtins.def (frintn): New. (frintz): Rename to... (btrunc): ...this. (frintp): Rename to... (ceil): ...this. (frintm): Rename to... (floor): ...this. (frinti): Rename to... (nearbyint): ...this. (frintx): Rename to... (rint): ...this. (frinta): Rename to... (round): ...this. * config/aarch64/aarch64-simd.md (aarch64_frint): Delete. (2): Convert to insn. * config/aarch64/aarch64.md (unspec): Add UNSPEC_FRINTN. * config/aarch64/iterators.md (FRINT): Add UNSPEC_FRINTN. (frint_pattern): Likewise. (frint_suffix): Likewise. From-SVN: r198394 --- gcc/ChangeLog | 25 ++++++++++++++++++++ gcc/config/aarch64/aarch64-builtins.c | 10 ++++---- gcc/config/aarch64/aarch64-simd-builtins.def | 15 ++++++------ gcc/config/aarch64/aarch64-simd.md | 13 +++------- gcc/config/aarch64/aarch64.md | 1 + gcc/config/aarch64/iterators.md | 9 ++++--- 6 files changed, 48 insertions(+), 25 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 83f1c1ac4a3..ae287824002 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,28 @@ +2013-04-29 James Greenhalgh + + * config/aarch64/aarch64-builtins.c + (aarch64_builtin_vectorized_function): Fold to standard pattern names. + * config/aarch64/aarch64-simd-builtins.def (frintn): New. + (frintz): Rename to... + (btrunc): ...this. + (frintp): Rename to... + (ceil): ...this. + (frintm): Rename to... + (floor): ...this. + (frinti): Rename to... + (nearbyint): ...this. + (frintx): Rename to... + (rint): ...this. + (frinta): Rename to... + (round): ...this. + * config/aarch64/aarch64-simd.md + (aarch64_frint): Delete. + (2): Convert to insn. + * config/aarch64/aarch64.md (unspec): Add UNSPEC_FRINTN. + * config/aarch64/iterators.md (FRINT): Add UNSPEC_FRINTN. + (frint_pattern): Likewise. + (frint_suffix): Likewise. + 2013-04-29 Richard Biener PR tree-optimization/57081 diff --git a/gcc/config/aarch64/aarch64-builtins.c b/gcc/config/aarch64/aarch64-builtins.c index 2851e2b1014..08bfe01aa82 100644 --- a/gcc/config/aarch64/aarch64-builtins.c +++ b/gcc/config/aarch64/aarch64-builtins.c @@ -1224,19 +1224,19 @@ aarch64_builtin_vectorized_function (tree fndecl, tree type_out, tree type_in) && in_mode == N##Fmode && in_n == C) case BUILT_IN_FLOOR: case BUILT_IN_FLOORF: - return AARCH64_FIND_FRINT_VARIANT (frintm); + return AARCH64_FIND_FRINT_VARIANT (floor); case BUILT_IN_CEIL: case BUILT_IN_CEILF: - return AARCH64_FIND_FRINT_VARIANT (frintp); + return AARCH64_FIND_FRINT_VARIANT (ceil); case BUILT_IN_TRUNC: case BUILT_IN_TRUNCF: - return AARCH64_FIND_FRINT_VARIANT (frintz); + return AARCH64_FIND_FRINT_VARIANT (btrunc); case BUILT_IN_ROUND: case BUILT_IN_ROUNDF: - return AARCH64_FIND_FRINT_VARIANT (frinta); + return AARCH64_FIND_FRINT_VARIANT (round); case BUILT_IN_NEARBYINT: case BUILT_IN_NEARBYINTF: - return AARCH64_FIND_FRINT_VARIANT (frinti); + return AARCH64_FIND_FRINT_VARIANT (nearbyint); case BUILT_IN_SQRT: case BUILT_IN_SQRTF: return AARCH64_FIND_FRINT_VARIANT (sqrt); diff --git a/gcc/config/aarch64/aarch64-simd-builtins.def b/gcc/config/aarch64/aarch64-simd-builtins.def index a06a6fb2974..6b414663c65 100644 --- a/gcc/config/aarch64/aarch64-simd-builtins.def +++ b/gcc/config/aarch64/aarch64-simd-builtins.def @@ -247,13 +247,14 @@ BUILTIN_VDQ_BHSI (BINOP, umax, 3) BUILTIN_VDQ_BHSI (BINOP, umin, 3) - /* Implemented by aarch64_frint. */ - BUILTIN_VDQF (UNOP, frintz, 0) - BUILTIN_VDQF (UNOP, frintp, 0) - BUILTIN_VDQF (UNOP, frintm, 0) - BUILTIN_VDQF (UNOP, frinti, 0) - BUILTIN_VDQF (UNOP, frintx, 0) - BUILTIN_VDQF (UNOP, frinta, 0) + /* Implemented by 2. */ + BUILTIN_VDQF (UNOP, btrunc, 2) + BUILTIN_VDQF (UNOP, ceil, 2) + BUILTIN_VDQF (UNOP, floor, 2) + BUILTIN_VDQF (UNOP, nearbyint, 2) + BUILTIN_VDQF (UNOP, rint, 2) + BUILTIN_VDQF (UNOP, round, 2) + BUILTIN_VDQF (UNOP, frintn, 2) /* Implemented by aarch64_fcvt. */ BUILTIN_VDQF (UNOP, fcvtzs, 0) diff --git a/gcc/config/aarch64/aarch64-simd.md b/gcc/config/aarch64/aarch64-simd.md index 5862d264132..5f14cc61710 100644 --- a/gcc/config/aarch64/aarch64-simd.md +++ b/gcc/config/aarch64/aarch64-simd.md @@ -1232,7 +1232,9 @@ (set_attr "simd_mode" "")] ) -(define_insn "aarch64_frint" +;; Vector versions of the floating-point frint patterns. +;; Expands to btrunc, ceil, floor, nearbyint, rint, round. +(define_insn "2" [(set (match_operand:VDQF 0 "register_operand" "=w") (unspec:VDQF [(match_operand:VDQF 1 "register_operand" "w")] FRINT))] @@ -1242,15 +1244,6 @@ (set_attr "simd_mode" "")] ) -;; Vector versions of the floating-point frint patterns. -;; Expands to btrunc, ceil, floor, nearbyint, rint, round. -(define_expand "2" - [(set (match_operand:VDQF 0 "register_operand") - (unspec:VDQF [(match_operand:VDQF 1 "register_operand")] - FRINT))] - "TARGET_SIMD" - {}) - (define_insn "aarch64_fcvt" [(set (match_operand: 0 "register_operand" "=w") (FIXUORS: (unspec: diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md index 2d83054f7a4..963c9cad52f 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -74,6 +74,7 @@ UNSPEC_FRINTA UNSPEC_FRINTI UNSPEC_FRINTM + UNSPEC_FRINTN UNSPEC_FRINTP UNSPEC_FRINTX UNSPEC_FRINTZ diff --git a/gcc/config/aarch64/iterators.md b/gcc/config/aarch64/iterators.md index 58a2a9ed458..a2ad8664868 100644 --- a/gcc/config/aarch64/iterators.md +++ b/gcc/config/aarch64/iterators.md @@ -692,7 +692,8 @@ UNSPEC_UZP1 UNSPEC_UZP2]) (define_int_iterator FRINT [UNSPEC_FRINTZ UNSPEC_FRINTP UNSPEC_FRINTM - UNSPEC_FRINTI UNSPEC_FRINTX UNSPEC_FRINTA]) + UNSPEC_FRINTN UNSPEC_FRINTI UNSPEC_FRINTX + UNSPEC_FRINTA]) (define_int_iterator FCVT [UNSPEC_FRINTZ UNSPEC_FRINTP UNSPEC_FRINTM UNSPEC_FRINTA]) @@ -787,12 +788,14 @@ (UNSPEC_FRINTM "floor") (UNSPEC_FRINTI "nearbyint") (UNSPEC_FRINTX "rint") - (UNSPEC_FRINTA "round")]) + (UNSPEC_FRINTA "round") + (UNSPEC_FRINTN "frintn")]) ;; 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_FRINTX "x") (UNSPEC_FRINTA "a") + (UNSPEC_FRINTN "n")]) (define_int_attr fcvt_pattern [(UNSPEC_FRINTZ "btrunc") (UNSPEC_FRINTA "round") (UNSPEC_FRINTP "ceil") (UNSPEC_FRINTM "floor")]) -- 2.30.2