summaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorjgreenhalgh <jgreenhalgh@138bc75d-0d04-0410-961f-82ee72b054a4>2015-01-28 10:08:57 +0000
committerjgreenhalgh <jgreenhalgh@138bc75d-0d04-0410-961f-82ee72b054a4>2015-01-28 10:08:57 +0000
commit260d579bfd5550f6f48e118ef745bcf19cd5bcb5 (patch)
treee9c6db6078e8cd30188cc138806e52646f4177e5 /gcc/config
parentac64c2700c1327e13d6ba142b1a7bba466a4e280 (diff)
downloadgcc-260d579bfd5550f6f48e118ef745bcf19cd5bcb5.tar.gz
[Patch AArch64] Make integer vabs intrinsics UNSPECs
gcc/ * config/aarch64/aarch64-simd.md (aarch64_abs<mode>): New. * config/aarch64/aarch64-simd-builtins.def (abs): Split by integer and floating point variants. * config/aarch64/iterators.md (unspec): Add UNSPEC_ABS. gcc/testsuite/ * gcc.target/aarch64/abs_2.c: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@220202 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config')
-rw-r--r--gcc/config/aarch64/aarch64-simd-builtins.def3
-rw-r--r--gcc/config/aarch64/aarch64-simd.md13
-rw-r--r--gcc/config/aarch64/iterators.md1
3 files changed, 16 insertions, 1 deletions
diff --git a/gcc/config/aarch64/aarch64-simd-builtins.def b/gcc/config/aarch64/aarch64-simd-builtins.def
index 1a1520c465b..2c52b27be71 100644
--- a/gcc/config/aarch64/aarch64-simd-builtins.def
+++ b/gcc/config/aarch64/aarch64-simd-builtins.def
@@ -358,7 +358,8 @@
/* Implemented by a mixture of abs2 patterns. Note the DImode builtin is
only ever used for the int64x1_t intrinsic, there is no scalar version. */
- BUILTIN_VALLDI (UNOP, abs, 2)
+ BUILTIN_VSDQ_I_DI (UNOP, abs, 0)
+ BUILTIN_VDQF (UNOP, abs, 2)
VAR1 (UNOP, vec_unpacks_hi_, 10, v4sf)
VAR1 (BINOP, float_truncate_hi_, 0, v4sf)
diff --git a/gcc/config/aarch64/aarch64-simd.md b/gcc/config/aarch64/aarch64-simd.md
index 17ac56c010f..055757036d5 100644
--- a/gcc/config/aarch64/aarch64-simd.md
+++ b/gcc/config/aarch64/aarch64-simd.md
@@ -384,6 +384,19 @@
[(set_attr "type" "neon_abs<q>")]
)
+;; The intrinsic version of integer ABS must not be allowed to
+;; combine with any operation with an integerated ABS step, such
+;; as SABD.
+(define_insn "aarch64_abs<mode>"
+ [(set (match_operand:VSDQ_I_DI 0 "register_operand" "=w")
+ (unspec:VSDQ_I_DI
+ [(match_operand:VSDQ_I_DI 1 "register_operand" "w")]
+ UNSPEC_ABS))]
+ "TARGET_SIMD"
+ "abs\t%<v>0<Vmtype>, %<v>1<Vmtype>"
+ [(set_attr "type" "neon_abs<q>")]
+)
+
(define_insn "abd<mode>_3"
[(set (match_operand:VDQ_BHSI 0 "register_operand" "=w")
(abs:VDQ_BHSI (minus:VDQ_BHSI
diff --git a/gcc/config/aarch64/iterators.md b/gcc/config/aarch64/iterators.md
index 65a2849155c..1fdff040d1a 100644
--- a/gcc/config/aarch64/iterators.md
+++ b/gcc/config/aarch64/iterators.md
@@ -184,6 +184,7 @@
[
UNSPEC_ASHIFT_SIGNED ; Used in aarch-simd.md.
UNSPEC_ASHIFT_UNSIGNED ; Used in aarch64-simd.md.
+ UNSPEC_ABS ; Used in aarch64-simd.md.
UNSPEC_FMAX ; Used in aarch64-simd.md.
UNSPEC_FMAXNMV ; Used in aarch64-simd.md.
UNSPEC_FMAXV ; Used in aarch64-simd.md.