summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
authorJohn Brawn <john.brawn@arm.com>2018-04-04 10:12:53 +0000
committerJohn Brawn <john.brawn@arm.com>2018-04-04 10:12:53 +0000
commit21d9b33d62772c58267cc0aa725e35ac9a4661db (patch)
tree69182b737dd3fe85abed6b44c92f5649b7ebac96 /llvm/test
parent4d2740c6edc588796bc7ab4be66e73afd9aa8c4b (diff)
downloadbcm5719-llvm-21d9b33d62772c58267cc0aa725e35ac9a4661db.tar.gz
bcm5719-llvm-21d9b33d62772c58267cc0aa725e35ac9a4661db.zip
[AArch64] Add patterns matching (fabs (fsub x y)) to (fabd x y)
Differential Revision: https://reviews.llvm.org/D44573 llvm-svn: 329163
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/CodeGen/AArch64/arm64-vabs.ll53
-rw-r--r--llvm/test/CodeGen/AArch64/fp16_intrinsic_scalar_2op.ll11
-rw-r--r--llvm/test/CodeGen/AArch64/fp16_intrinsic_vector_2op.ll42
3 files changed, 106 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/AArch64/arm64-vabs.ll b/llvm/test/CodeGen/AArch64/arm64-vabs.ll
index 6b754b0a169..53669a15b9e 100644
--- a/llvm/test/CodeGen/AArch64/arm64-vabs.ll
+++ b/llvm/test/CodeGen/AArch64/arm64-vabs.ll
@@ -219,6 +219,40 @@ declare <2 x float> @llvm.aarch64.neon.fabd.v2f32(<2 x float>, <2 x float>) noun
declare <4 x float> @llvm.aarch64.neon.fabd.v4f32(<4 x float>, <4 x float>) nounwind readnone
declare <2 x double> @llvm.aarch64.neon.fabd.v2f64(<2 x double>, <2 x double>) nounwind readnone
+define <2 x float> @fabd_2s_from_fsub_fabs(<2 x float>* %A, <2 x float>* %B) nounwind {
+;CHECK-LABEL: fabd_2s_from_fsub_fabs:
+;CHECK: fabd.2s
+ %tmp1 = load <2 x float>, <2 x float>* %A
+ %tmp2 = load <2 x float>, <2 x float>* %B
+ %sub = fsub <2 x float> %tmp1, %tmp2
+ %abs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %sub)
+ ret <2 x float> %abs
+}
+
+define <4 x float> @fabd_4s_from_fsub_fabs(<4 x float>* %A, <4 x float>* %B) nounwind {
+;CHECK-LABEL: fabd_4s_from_fsub_fabs:
+;CHECK: fabd.4s
+ %tmp1 = load <4 x float>, <4 x float>* %A
+ %tmp2 = load <4 x float>, <4 x float>* %B
+ %sub = fsub <4 x float> %tmp1, %tmp2
+ %abs = call <4 x float> @llvm.fabs.v4f32(<4 x float> %sub)
+ ret <4 x float> %abs
+}
+
+define <2 x double> @fabd_2d_from_fsub_fabs(<2 x double>* %A, <2 x double>* %B) nounwind {
+;CHECK-LABEL: fabd_2d_from_fsub_fabs:
+;CHECK: fabd.2d
+ %tmp1 = load <2 x double>, <2 x double>* %A
+ %tmp2 = load <2 x double>, <2 x double>* %B
+ %sub = fsub <2 x double> %tmp1, %tmp2
+ %abs = call <2 x double> @llvm.fabs.v2f64(<2 x double> %sub)
+ ret <2 x double> %abs
+}
+
+declare <2 x float> @llvm.fabs.v2f32(<2 x float>) nounwind readnone
+declare <4 x float> @llvm.fabs.v4f32(<4 x float>) nounwind readnone
+declare <2 x double> @llvm.fabs.v2f64(<2 x double>) nounwind readnone
+
define <8 x i8> @sabd_8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
;CHECK-LABEL: sabd_8b:
;CHECK: sabd.8b
@@ -829,6 +863,25 @@ define double @fabdd(double %a, double %b) nounwind {
declare double @llvm.aarch64.sisd.fabd.f64(double, double) nounwind readnone
declare float @llvm.aarch64.sisd.fabd.f32(float, float) nounwind readnone
+define float @fabds_from_fsub_fabs(float %a, float %b) nounwind {
+; CHECK-LABEL: fabds_from_fsub_fabs:
+; CHECK: fabd s0, s0, s1
+ %sub = fsub float %a, %b
+ %abs = tail call float @llvm.fabs.f32(float %sub)
+ ret float %abs
+}
+
+define double @fabdd_from_fsub_fabs(double %a, double %b) nounwind {
+; CHECK-LABEL: fabdd_from_fsub_fabs:
+; CHECK: fabd d0, d0, d1
+ %sub = fsub double %a, %b
+ %abs = tail call double @llvm.fabs.f64(double %sub)
+ ret double %abs
+}
+
+declare float @llvm.fabs.f32(float) nounwind readnone
+declare double @llvm.fabs.f64(double) nounwind readnone
+
define <2 x i64> @uabdl_from_extract_dup(<4 x i32> %lhs, i32 %rhs) {
; CHECK-LABEL: uabdl_from_extract_dup:
; CHECK-NOT: ext.16b
diff --git a/llvm/test/CodeGen/AArch64/fp16_intrinsic_scalar_2op.ll b/llvm/test/CodeGen/AArch64/fp16_intrinsic_scalar_2op.ll
index 814b888d4a7..a25deae017f 100644
--- a/llvm/test/CodeGen/AArch64/fp16_intrinsic_scalar_2op.ll
+++ b/llvm/test/CodeGen/AArch64/fp16_intrinsic_scalar_2op.ll
@@ -6,6 +6,7 @@ declare half @llvm.aarch64.neon.fmin.f16(half, half)
declare half @llvm.aarch64.neon.frsqrts.f16(half, half)
declare half @llvm.aarch64.neon.frecps.f16(half, half)
declare half @llvm.aarch64.neon.fmulx.f16(half, half)
+declare half @llvm.fabs.f16(half)
define dso_local half @t_vabdh_f16(half %a, half %b) {
; CHECK-LABEL: t_vabdh_f16:
@@ -16,6 +17,16 @@ entry:
ret half %vabdh_f16
}
+define dso_local half @t_vabdh_f16_from_fsub_fabs(half %a, half %b) {
+; CHECK-LABEL: t_vabdh_f16_from_fsub_fabs:
+; CHECK: fabd h0, h0, h1
+; CHECK-NEXT: ret
+entry:
+ %sub = fsub half %a, %b
+ %abs = tail call half @llvm.fabs.f16(half %sub)
+ ret half %abs
+}
+
define dso_local i16 @t_vceqh_f16(half %a, half %b) {
; CHECK-LABEL: t_vceqh_f16:
; CHECK: fcmp h0, h1
diff --git a/llvm/test/CodeGen/AArch64/fp16_intrinsic_vector_2op.ll b/llvm/test/CodeGen/AArch64/fp16_intrinsic_vector_2op.ll
index f497eb88e75..1674d862792 100644
--- a/llvm/test/CodeGen/AArch64/fp16_intrinsic_vector_2op.ll
+++ b/llvm/test/CodeGen/AArch64/fp16_intrinsic_vector_2op.ll
@@ -6,6 +6,10 @@ declare <4 x half> @llvm.aarch64.neon.fminnmp.v4f16(<4 x half>, <4 x half>)
declare <8 x half> @llvm.aarch64.neon.fminnmp.v8f16(<8 x half>, <8 x half>)
declare <4 x half> @llvm.aarch64.neon.fmaxnmp.v4f16(<4 x half>, <4 x half>)
declare <8 x half> @llvm.aarch64.neon.fmaxnmp.v8f16(<8 x half>, <8 x half>)
+declare <4 x half> @llvm.aarch64.neon.fabd.v4f16(<4 x half>, <4 x half>)
+declare <8 x half> @llvm.aarch64.neon.fabd.v8f16(<8 x half>, <8 x half>)
+declare <4 x half> @llvm.fabs.v4f16(<4 x half>)
+declare <8 x half> @llvm.fabs.v8f16(<8 x half>)
define dso_local <4 x half> @t_vdiv_f16(<4 x half> %a, <4 x half> %b) {
; CHECK-LABEL: t_vdiv_f16:
@@ -78,3 +82,41 @@ entry:
%vpmaxnm2.i = tail call <8 x half> @llvm.aarch64.neon.fmaxnmp.v8f16(<8 x half> %a, <8 x half> %b)
ret <8 x half> %vpmaxnm2.i
}
+
+define dso_local <4 x half> @t_vabd_f16(<4 x half> %a, <4 x half> %b) {
+; CHECK-LABEL: t_vabd_f16:
+; CHECK: fabd v0.4h, v0.4h, v1.4h
+; CHECK-NEXT: ret
+entry:
+ %vabdh_f16 = tail call <4 x half> @llvm.aarch64.neon.fabd.v4f16(<4 x half> %a, <4 x half> %b)
+ ret <4 x half> %vabdh_f16
+}
+
+define dso_local <8 x half> @t_vabdq_f16(<8 x half> %a, <8 x half> %b) {
+; CHECK-LABEL: t_vabdq_f16:
+; CHECK: fabd v0.8h, v0.8h, v1.8h
+; CHECK-NEXT: ret
+entry:
+ %vabdh_f16 = tail call <8 x half> @llvm.aarch64.neon.fabd.v8f16(<8 x half> %a, <8 x half> %b)
+ ret <8 x half> %vabdh_f16
+}
+
+define dso_local <4 x half> @t_vabd_f16_from_fsub_fabs(<4 x half> %a, <4 x half> %b) {
+; CHECK-LABEL: t_vabd_f16_from_fsub_fabs:
+; CHECK: fabd v0.4h, v0.4h, v1.4h
+; CHECK-NEXT: ret
+entry:
+ %sub = fsub <4 x half> %a, %b
+ %abs = tail call <4 x half> @llvm.fabs.v4f16(<4 x half> %sub)
+ ret <4 x half> %abs
+}
+
+define dso_local <8 x half> @t_vabdq_f16_from_fsub_fabs(<8 x half> %a, <8 x half> %b) {
+; CHECK-LABEL: t_vabdq_f16_from_fsub_fabs:
+; CHECK: fabd v0.8h, v0.8h, v1.8h
+; CHECK-NEXT: ret
+entry:
+ %sub = fsub <8 x half> %a, %b
+ %abs = tail call <8 x half> @llvm.fabs.v8f16(<8 x half> %sub)
+ ret <8 x half> %abs
+}
OpenPOWER on IntegriCloud