aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>2014-08-05 10:43:41 +0000
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>2014-08-05 10:43:41 +0000
commitd2937a2e3f9d5e3e69f7ef71da685f6583ebf924 (patch)
treef116d70f28b2289a3fedd91d0399dd25e0d7f8a3 /gcc
parentada5287e5505e44f570ae5c548afd5db221a5671 (diff)
downloadgcc-d2937a2e3f9d5e3e69f7ef71da685f6583ebf924.zip
gcc-d2937a2e3f9d5e3e69f7ef71da685f6583ebf924.tar.gz
gcc-d2937a2e3f9d5e3e69f7ef71da685f6583ebf924.tar.bz2
[AArch64] Implement some saturating math NEON intrinsics.
* config/aarch64/aarch64-simd.md (aarch64_sqdmulh_laneq<mode>): Use VSDQ_HSI mode iterator. (aarch64_sqrdmulh_laneq<mode>): Likewise. (aarch64_sq<r>dmulh_laneq<mode>_internal): New define_insn. * config/aarch64/aarch64-simd-builtins.def (sqdmulh_laneq): Use BUILTIN_VDQHS macro. (sqrdmulh_laneq): Likewise. * config/aarch64/arm_neon.h (vqdmlalh_laneq_s16): New intrinsic. (vqdmlals_laneq_s32): Likewise. (vqdmlslh_laneq_s16): Likewise. (vqdmlsls_laneq_s32): Likewise. (vqdmulhh_laneq_s16): Likewise. (vqdmulhs_laneq_s32): Likewise. (vqrdmulhh_laneq_s16): Likewise. (vqrdmulhs_laneq_s32): Likewise. * gcc.target/aarch64/simd/vqdmlalh_laneq_s16_1.c: New test. * gcc.target/aarch64/simd/vqdmlals_laneq_s32_1.c: Likewise. * gcc.target/aarch64/simd/vqdmlslh_laneq_s16_1.c: Likewise. * gcc.target/aarch64/simd/vqdmlsls_laneq_s32_1.c: Likewise. * gcc.target/aarch64/simd/vqdmulhh_laneq_s16_1.c: Likewise. * gcc.target/aarch64/simd/vqdmulhs_laneq_s32_1.c: Likewise. * gcc.target/aarch64/simd/vqrdmulhh_laneq_s16_1.c: Likewise. * gcc.target/aarch64/simd/vqrdmulhs_laneq_s32_1.c: Likewise. From-SVN: r213635
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog18
-rw-r--r--gcc/config/aarch64/aarch64-simd-builtins.def4
-rw-r--r--gcc/config/aarch64/aarch64-simd.md23
-rw-r--r--gcc/config/aarch64/arm_neon.h48
-rw-r--r--gcc/testsuite/ChangeLog11
-rw-r--r--gcc/testsuite/gcc.target/aarch64/simd/vqdmlalh_laneq_s16_1.c35
-rw-r--r--gcc/testsuite/gcc.target/aarch64/simd/vqdmlals_laneq_s32_1.c35
-rw-r--r--gcc/testsuite/gcc.target/aarch64/simd/vqdmlslh_laneq_s16_1.c35
-rw-r--r--gcc/testsuite/gcc.target/aarch64/simd/vqdmlsls_laneq_s32_1.c35
-rw-r--r--gcc/testsuite/gcc.target/aarch64/simd/vqdmulhh_laneq_s16_1.c33
-rw-r--r--gcc/testsuite/gcc.target/aarch64/simd/vqdmulhs_laneq_s32_1.c33
-rw-r--r--gcc/testsuite/gcc.target/aarch64/simd/vqrdmulhh_laneq_s16_1.c33
-rw-r--r--gcc/testsuite/gcc.target/aarch64/simd/vqrdmulhs_laneq_s32_1.c32
13 files changed, 369 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8d18b7a..491ff38 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,23 @@
2014-08-05 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
+ * config/aarch64/aarch64-simd.md (aarch64_sqdmulh_laneq<mode>):
+ Use VSDQ_HSI mode iterator.
+ (aarch64_sqrdmulh_laneq<mode>): Likewise.
+ (aarch64_sq<r>dmulh_laneq<mode>_internal): New define_insn.
+ * config/aarch64/aarch64-simd-builtins.def (sqdmulh_laneq):
+ Use BUILTIN_VDQHS macro.
+ (sqrdmulh_laneq): Likewise.
+ * config/aarch64/arm_neon.h (vqdmlalh_laneq_s16): New intrinsic.
+ (vqdmlals_laneq_s32): Likewise.
+ (vqdmlslh_laneq_s16): Likewise.
+ (vqdmlsls_laneq_s32): Likewise.
+ (vqdmulhh_laneq_s16): Likewise.
+ (vqdmulhs_laneq_s32): Likewise.
+ (vqrdmulhh_laneq_s16): Likewise.
+ (vqrdmulhs_laneq_s32): Likewise.
+
+2014-08-05 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
+
* config/aarch64/arm_neon.h (vmul_f64): New intrinsic.
(vmuld_laneq_f64): Likewise.
(vmuls_laneq_f32): Likewise.
diff --git a/gcc/config/aarch64/aarch64-simd-builtins.def b/gcc/config/aarch64/aarch64-simd-builtins.def
index 15cf4ca..4f3bd12 100644
--- a/gcc/config/aarch64/aarch64-simd-builtins.def
+++ b/gcc/config/aarch64/aarch64-simd-builtins.def
@@ -189,9 +189,9 @@
BUILTIN_VSDQ_HSI (BINOP, sqrdmulh, 0)
/* Implemented by aarch64_sq<r>dmulh_lane<q><mode>. */
BUILTIN_VDQHS (TERNOP, sqdmulh_lane, 0)
- BUILTIN_VDQHS (TERNOP, sqdmulh_laneq, 0)
+ BUILTIN_VSDQ_HSI (TERNOP, sqdmulh_laneq, 0)
BUILTIN_VDQHS (TERNOP, sqrdmulh_lane, 0)
- BUILTIN_VDQHS (TERNOP, sqrdmulh_laneq, 0)
+ BUILTIN_VSDQ_HSI (TERNOP, sqrdmulh_laneq, 0)
BUILTIN_SD_HSI (TERNOP, sqdmulh_lane, 0)
BUILTIN_SD_HSI (TERNOP, sqrdmulh_lane, 0)
diff --git a/gcc/config/aarch64/aarch64-simd.md b/gcc/config/aarch64/aarch64-simd.md
index 0d4b37e..f5fa4ae 100644
--- a/gcc/config/aarch64/aarch64-simd.md
+++ b/gcc/config/aarch64/aarch64-simd.md
@@ -2793,8 +2793,8 @@
)
(define_expand "aarch64_sqdmulh_laneq<mode>"
- [(match_operand:VDQHS 0 "register_operand" "")
- (match_operand:VDQHS 1 "register_operand" "")
+ [(match_operand:VSDQ_HSI 0 "register_operand" "")
+ (match_operand:VSDQ_HSI 1 "register_operand" "")
(match_operand:<VCONQ> 2 "register_operand" "")
(match_operand:SI 3 "immediate_operand" "")]
"TARGET_SIMD"
@@ -2810,8 +2810,8 @@
)
(define_expand "aarch64_sqrdmulh_laneq<mode>"
- [(match_operand:VDQHS 0 "register_operand" "")
- (match_operand:VDQHS 1 "register_operand" "")
+ [(match_operand:VSDQ_HSI 0 "register_operand" "")
+ (match_operand:VSDQ_HSI 1 "register_operand" "")
(match_operand:<VCONQ> 2 "register_operand" "")
(match_operand:SI 3 "immediate_operand" "")]
"TARGET_SIMD"
@@ -2890,6 +2890,21 @@
[(set_attr "type" "neon_sat_mul_<Vetype>_scalar<q>")]
)
+(define_insn "aarch64_sq<r>dmulh_laneq<mode>_internal"
+ [(set (match_operand:SD_HSI 0 "register_operand" "=w")
+ (unspec:SD_HSI
+ [(match_operand:SD_HSI 1 "register_operand" "w")
+ (vec_select:<VEL>
+ (match_operand:<VCONQ> 2 "register_operand" "<vwx>")
+ (parallel [(match_operand:SI 3 "immediate_operand" "i")]))]
+ VQDMULH))]
+ "TARGET_SIMD"
+ "*
+ operands[3] = GEN_INT (ENDIAN_LANE_N (<VCONQ>mode, INTVAL (operands[3])));
+ return \"sq<r>dmulh\\t%<v>0, %<v>1, %2.<v>[%3]\";"
+ [(set_attr "type" "neon_sat_mul_<Vetype>_scalar<q>")]
+)
+
;; vqdml[sa]l
(define_insn "aarch64_sqdml<SBINQOPS:as>l<mode>"
diff --git a/gcc/config/aarch64/arm_neon.h b/gcc/config/aarch64/arm_neon.h
index b5c1254..1289ce1 100644
--- a/gcc/config/aarch64/arm_neon.h
+++ b/gcc/config/aarch64/arm_neon.h
@@ -19445,6 +19445,12 @@ vqdmlalh_lane_s16 (int32x1_t __a, int16x1_t __b, int16x4_t __c, const int __d)
return __builtin_aarch64_sqdmlal_lanehi (__a, __b, __c, __d);
}
+__extension__ static __inline int32_t __attribute__ ((__always_inline__))
+vqdmlalh_laneq_s16 (int32_t __a, int16_t __b, int16x8_t __c, const int __d)
+{
+ return __builtin_aarch64_sqdmlal_laneqhi (__a, __b, __c, __d);
+}
+
__extension__ static __inline int64_t __attribute__ ((__always_inline__))
vqdmlals_s32 (int64_t __a, int32x1_t __b, int32x1_t __c)
{
@@ -19458,6 +19464,12 @@ vqdmlals_lane_s32 (int64x1_t __a, int32x1_t __b, int32x2_t __c, const int __d)
{__builtin_aarch64_sqdmlal_lanesi (__a[0], __b, __c, __d)};
}
+__extension__ static __inline int64_t __attribute__ ((__always_inline__))
+vqdmlals_laneq_s32 (int64_t __a, int32_t __b, int32x4_t __c, const int __d)
+{
+ return __builtin_aarch64_sqdmlal_laneqsi (__a, __b, __c, __d);
+}
+
/* vqdmlsl */
__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
@@ -19572,6 +19584,12 @@ vqdmlslh_lane_s16 (int32x1_t __a, int16x1_t __b, int16x4_t __c, const int __d)
return __builtin_aarch64_sqdmlsl_lanehi (__a, __b, __c, __d);
}
+__extension__ static __inline int32_t __attribute__ ((__always_inline__))
+vqdmlslh_laneq_s16 (int32_t __a, int16_t __b, int16x8_t __c, const int __d)
+{
+ return __builtin_aarch64_sqdmlsl_laneqhi (__a, __b, __c, __d);
+}
+
__extension__ static __inline int64_t __attribute__ ((__always_inline__))
vqdmlsls_s32 (int64_t __a, int32x1_t __b, int32x1_t __c)
{
@@ -19584,6 +19602,12 @@ vqdmlsls_lane_s32 (int64x1_t __a, int32x1_t __b, int32x2_t __c, const int __d)
return (int64x1_t) {__builtin_aarch64_sqdmlsl_lanesi (__a[0], __b, __c, __d)};
}
+__extension__ static __inline int64_t __attribute__ ((__always_inline__))
+vqdmlsls_laneq_s32 (int64_t __a, int32_t __b, int32x4_t __c, const int __d)
+{
+ return __builtin_aarch64_sqdmlsl_laneqsi (__a, __b, __c, __d);
+}
+
/* vqdmulh */
__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
@@ -19622,6 +19646,12 @@ vqdmulhh_lane_s16 (int16x1_t __a, int16x4_t __b, const int __c)
return __builtin_aarch64_sqdmulh_lanehi (__a, __b, __c);
}
+__extension__ static __inline int16_t __attribute__ ((__always_inline__))
+vqdmulhh_laneq_s16 (int16_t __a, int16x8_t __b, const int __c)
+{
+ return __builtin_aarch64_sqdmulh_laneqhi (__a, __b, __c);
+}
+
__extension__ static __inline int32x1_t __attribute__ ((__always_inline__))
vqdmulhs_s32 (int32x1_t __a, int32x1_t __b)
{
@@ -19634,6 +19664,12 @@ vqdmulhs_lane_s32 (int32x1_t __a, int32x2_t __b, const int __c)
return __builtin_aarch64_sqdmulh_lanesi (__a, __b, __c);
}
+__extension__ static __inline int32_t __attribute__ ((__always_inline__))
+vqdmulhs_laneq_s32 (int32_t __a, int32x4_t __b, const int __c)
+{
+ return __builtin_aarch64_sqdmulh_laneqsi (__a, __b, __c);
+}
+
/* vqdmull */
__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
@@ -19938,6 +19974,12 @@ vqrdmulhh_lane_s16 (int16x1_t __a, int16x4_t __b, const int __c)
return __builtin_aarch64_sqrdmulh_lanehi (__a, __b, __c);
}
+__extension__ static __inline int16_t __attribute__ ((__always_inline__))
+vqrdmulhh_laneq_s16 (int16_t __a, int16x8_t __b, const int __c)
+{
+ return __builtin_aarch64_sqrdmulh_laneqhi (__a, __b, __c);
+}
+
__extension__ static __inline int32x1_t __attribute__ ((__always_inline__))
vqrdmulhs_s32 (int32x1_t __a, int32x1_t __b)
{
@@ -19950,6 +19992,12 @@ vqrdmulhs_lane_s32 (int32x1_t __a, int32x2_t __b, const int __c)
return __builtin_aarch64_sqrdmulh_lanesi (__a, __b, __c);
}
+__extension__ static __inline int32_t __attribute__ ((__always_inline__))
+vqrdmulhs_laneq_s32 (int32_t __a, int32x4_t __b, const int __c)
+{
+ return __builtin_aarch64_sqrdmulh_laneqsi (__a, __b, __c);
+}
+
/* vqrshl */
__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8aa22a8..b218b0b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,16 @@
2014-08-05 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
+ * gcc.target/aarch64/simd/vqdmlalh_laneq_s16_1.c: New test.
+ * gcc.target/aarch64/simd/vqdmlals_laneq_s32_1.c: Likewise.
+ * gcc.target/aarch64/simd/vqdmlslh_laneq_s16_1.c: Likewise.
+ * gcc.target/aarch64/simd/vqdmlsls_laneq_s32_1.c: Likewise.
+ * gcc.target/aarch64/simd/vqdmulhh_laneq_s16_1.c: Likewise.
+ * gcc.target/aarch64/simd/vqdmulhs_laneq_s32_1.c: Likewise.
+ * gcc.target/aarch64/simd/vqrdmulhh_laneq_s16_1.c: Likewise.
+ * gcc.target/aarch64/simd/vqrdmulhs_laneq_s32_1.c: Likewise.
+
+2014-08-05 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
+
* gcc.target/aarch64/simd/vmul_f64_1.c: New test.
* gcc.target/aarch64/simd/vmul_n_f64_1.c: Likewise.
* gcc.target/aarch64/simd/vmuld_lane_f64_1.c: Likewise.
diff --git a/gcc/testsuite/gcc.target/aarch64/simd/vqdmlalh_laneq_s16_1.c b/gcc/testsuite/gcc.target/aarch64/simd/vqdmlalh_laneq_s16_1.c
new file mode 100644
index 0000000..7178e28
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/simd/vqdmlalh_laneq_s16_1.c
@@ -0,0 +1,35 @@
+/* Test the vqdmlalh_laneq_s16 AArch64 SIMD intrinsic. */
+
+/* { dg-do run } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+extern void abort (void);
+
+int
+main (void)
+{
+ int32_t arg1;
+ int16_t arg2;
+ int16x8_t arg3;
+ int32_t actual;
+ int32_t expected;
+
+ arg1 = 0x80000000;
+ arg2 = -24497;
+ arg3 = vcombine_s16 (vcreate_s16 (0x008a80007fff7fffULL),
+ vcreate_s16 (0xfffffa797fff8000ULL));
+
+ actual = vqdmlalh_laneq_s16 (arg1, arg2, arg3, 7);
+ expected = -2147434654;
+
+ if (expected != actual)
+ abort ();
+
+ return 0;
+}
+
+
+/* { dg-final { scan-assembler-times "sqdmlal\[ \t\]+\[sS\]\[0-9\]+, ?\[hH\]\[0-9\]+, ?\[vV\]\[0-9\]+\.\[hH\]\\\[7\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/simd/vqdmlals_laneq_s32_1.c b/gcc/testsuite/gcc.target/aarch64/simd/vqdmlals_laneq_s32_1.c
new file mode 100644
index 0000000..7c508e1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/simd/vqdmlals_laneq_s32_1.c
@@ -0,0 +1,35 @@
+/* Test the vqdmlals_laneq_s32 AArch64 SIMD intrinsic. */
+
+/* { dg-do run } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+extern void abort (void);
+
+int
+main (void)
+{
+ int64_t arg1;
+ int32_t arg2;
+ int32x4_t arg3;
+ int64_t actual;
+ int64_t expected;
+
+ arg1 = -9223182289494545592LL;
+ arg2 = 32768;
+ arg3 = vcombine_s32 (vcreate_s32 (0xffff7fff8000ffffULL),
+ vcreate_s32 (0x80000000ffff0000ULL));
+
+ actual = vqdmlals_laneq_s32 (arg1, arg2, arg3, 3);
+ expected = -9223323026982900920LL;
+
+ if (expected != actual)
+ abort ();
+
+ return 0;
+}
+
+
+/* { dg-final { scan-assembler-times "sqdmlal\[ \t\]+\[dD\]\[0-9\]+, ?\[sS\]\[0-9\]+, ?\[vV\]\[0-9\]+\.\[sS\]\\\[3\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/simd/vqdmlslh_laneq_s16_1.c b/gcc/testsuite/gcc.target/aarch64/simd/vqdmlslh_laneq_s16_1.c
new file mode 100644
index 0000000..46201e8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/simd/vqdmlslh_laneq_s16_1.c
@@ -0,0 +1,35 @@
+/* Test the vqdmlslh_laneq_s16 AArch64 SIMD intrinsic. */
+
+/* { dg-do run } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+extern void abort (void);
+
+int
+main (void)
+{
+ int32_t arg1;
+ int16_t arg2;
+ int16x8_t arg3;
+ int32_t actual;
+ int32_t expected;
+
+ arg1 = -2147450881;
+ arg2 = 32767;
+ arg3 = vcombine_s16 (vcreate_s16 (0x359d7fff00007fffULL),
+ vcreate_s16 (0xe678ffff00008000ULL));
+
+ actual = vqdmlslh_laneq_s16 (arg1, arg2, arg3, 4);
+ expected = -32769;
+
+ if (expected != actual)
+ abort ();
+
+ return 0;
+}
+
+
+/* { dg-final { scan-assembler-times "sqdmlsl\[ \t\]+\[sS\]\[0-9\]+, ?\[hH\]\[0-9\]+, ?\[vV\]\[0-9\]+\.\[hH\]\\\[4\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/simd/vqdmlsls_laneq_s32_1.c b/gcc/testsuite/gcc.target/aarch64/simd/vqdmlsls_laneq_s32_1.c
new file mode 100644
index 0000000..8644ac6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/simd/vqdmlsls_laneq_s32_1.c
@@ -0,0 +1,35 @@
+/* Test the vqdmlsls_laneq_s32 AArch64 SIMD intrinsic. */
+
+/* { dg-do run } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+extern void abort (void);
+
+int
+main (void)
+{
+ int64_t arg1;
+ int32_t arg2;
+ int32x4_t arg3;
+ int64_t actual;
+ int64_t expected;
+
+ arg1 = 140733193453567LL;
+ arg2 = 25544;
+ arg3 = vcombine_s32 (vcreate_s32 (0x417b8000ffff8397LL),
+ vcreate_s32 (0x7fffffff58488000LL));
+
+
+ actual = vqdmlsls_laneq_s32 (arg1, arg2, arg3, 3);
+ expected = 31022548895631LL;
+
+ if (expected != actual)
+ abort ();
+
+ return 0;
+}
+
+/* { dg-final { scan-assembler-times "sqdmlsl\[ \t\]+\[dD\]\[0-9\]+, ?\[sS\]\[0-9\]+, ?\[vV\]\[0-9\]+\.\[sS\]\\\[3\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/simd/vqdmulhh_laneq_s16_1.c b/gcc/testsuite/gcc.target/aarch64/simd/vqdmulhh_laneq_s16_1.c
new file mode 100644
index 0000000..0e72254
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/simd/vqdmulhh_laneq_s16_1.c
@@ -0,0 +1,33 @@
+/* Test the vqdmulhh_laneq_s16 AArch64 SIMD intrinsic. */
+
+/* { dg-do run } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+extern void abort (void);
+
+int
+main (void)
+{
+ int16_t arg1;
+ int16x8_t arg2;
+ int16_t actual;
+ int16_t expected;
+
+ arg1 = 268;
+ arg2 = vcombine_s16 (vcreate_s16 (0xffffffff00000000ULL),
+ vcreate_s16 (0x0000800018410000ULL));
+
+ actual = vqdmulhh_laneq_s16 (arg1, arg2, 7);
+ expected = 0;
+
+ if (expected != actual)
+ abort ();
+
+ return 0;
+}
+
+
+/* { dg-final { scan-assembler-times "sqdmulh\[ \t\]+\[hH\]\[0-9\]+, ?\[hH\]\[0-9\]+, ?\[vV\]\[0-9\]+\.\[hH\]\\\[7\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/simd/vqdmulhs_laneq_s32_1.c b/gcc/testsuite/gcc.target/aarch64/simd/vqdmulhs_laneq_s32_1.c
new file mode 100644
index 0000000..0c75c5a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/simd/vqdmulhs_laneq_s32_1.c
@@ -0,0 +1,33 @@
+/* Test the vqdmulhs_laneq_s32 AArch64 SIMD intrinsic. */
+
+/* { dg-do run } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+extern void abort (void);
+
+int
+main (void)
+{
+ int32_t arg1;
+ int32x4_t arg2;
+ int32_t actual;
+ int32_t expected;
+
+ arg1 = 0x80000000;
+ arg2 = vcombine_s32 (vcreate_s32 (0x950dffffc4f40000ULL),
+ vcreate_s32 (0x7fff8000274a8000ULL));
+
+ actual = vqdmulhs_laneq_s32 (arg1, arg2, 3);
+ expected = -2147450880;
+
+ if (expected != actual)
+ abort ();
+
+ return 0;
+}
+
+
+/* { dg-final { scan-assembler-times "sqdmulh\[ \t\]+\[sS\]\[0-9\]+, ?\[sS\]\[0-9\]+, ?\[vV\]\[0-9\]+\.\[sS\]\\\[3\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/simd/vqrdmulhh_laneq_s16_1.c b/gcc/testsuite/gcc.target/aarch64/simd/vqrdmulhh_laneq_s16_1.c
new file mode 100644
index 0000000..3c2a074
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/simd/vqrdmulhh_laneq_s16_1.c
@@ -0,0 +1,33 @@
+/* Test the vqrdmulhh_laneq_s16 AArch64 SIMD intrinsic. */
+
+/* { dg-do run } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+extern void abort (void);
+
+int
+main (void)
+{
+ int16_t arg1;
+ int16x8_t arg2;
+ int16_t actual;
+ int16_t expected;
+
+ arg1 = 0;
+ arg2 = vcombine_s16 (vcreate_s16 (0x7fffffffa7908000ULL),
+ vcreate_s16 (0x8000d2607fff0000ULL));
+
+ actual = vqrdmulhh_laneq_s16 (arg1, arg2, 7);
+ expected = 0;
+
+ if (expected != actual)
+ abort ();
+
+ return 0;
+}
+
+
+/* { dg-final { scan-assembler-times "sqrdmulh\[ \t\]+\[hH\]\[0-9\]+, ?\[hH\]\[0-9\]+, ?\[vV\]\[0-9\]+\.\[hH\]\\\[7\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/simd/vqrdmulhs_laneq_s32_1.c b/gcc/testsuite/gcc.target/aarch64/simd/vqrdmulhs_laneq_s32_1.c
new file mode 100644
index 0000000..7e66213
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/simd/vqrdmulhs_laneq_s32_1.c
@@ -0,0 +1,32 @@
+/* Test the vqrdmulhs_laneq_s32 AArch64 SIMD intrinsic. */
+
+/* { dg-do run } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+extern void abort (void);
+
+int
+main (void)
+{
+ int32_t arg1;
+ int32x4_t arg2;
+ int32_t actual;
+ int32_t expected;
+
+ arg1 = 32768;
+ arg2 = vcombine_s32 (vcreate_s32 (0x8000ffffffffcd5bULL),
+ vcreate_s32 (0x7fffffffffffffffULL));
+
+ actual = vqrdmulhs_laneq_s32 (arg1, arg2, 3);
+ expected = 32768;
+
+ if (expected != actual)
+ abort ();
+
+ return 0;
+}
+
+/* { dg-final { scan-assembler-times "sqrdmulh\[ \t\]+\[sS\]\[0-9\]+, ?\[sS\]\[0-9\]+, ?\[vV\]\[0-9\]+\.\[sS\]\\\[3\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */