summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/PowerPC/copysignl.ll
diff options
context:
space:
mode:
authorHal Finkel <hfinkel@anl.gov>2013-08-19 06:55:37 +0000
committerHal Finkel <hfinkel@anl.gov>2013-08-19 06:55:37 +0000
commite4eb78188ca10aa9910ca8676148ec782191d639 (patch)
treecd1124cb186968666eb5e411062b21d7a8312d2d /llvm/test/CodeGen/PowerPC/copysignl.ll
parent2b3ba7480edac3f4e9eddde5db31482aaaf70d4e (diff)
downloadbcm5719-llvm-e4eb78188ca10aa9910ca8676148ec782191d639.tar.gz
bcm5719-llvm-e4eb78188ca10aa9910ca8676148ec782191d639.zip
Add ExpandFloatOp_FCOPYSIGN to handle ppcf128-related expansions
We had previously been asserting when faced with a FCOPYSIGN f64, ppcf128 node because there was no way to expand the FCOPYSIGN node. Because ppcf128 is the sum of two doubles, and the first double must have the larger magnitude, we can take the sign from the first double. As a result, in addition to fixing the crash, this is also an optimization. llvm-svn: 188655
Diffstat (limited to 'llvm/test/CodeGen/PowerPC/copysignl.ll')
-rw-r--r--llvm/test/CodeGen/PowerPC/copysignl.ll67
1 files changed, 67 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/PowerPC/copysignl.ll b/llvm/test/CodeGen/PowerPC/copysignl.ll
new file mode 100644
index 00000000000..4b801b791d6
--- /dev/null
+++ b/llvm/test/CodeGen/PowerPC/copysignl.ll
@@ -0,0 +1,67 @@
+; RUN: llc -mcpu=pwr7 -mtriple=powerpc64-unknown-linux-gnu < %s | FileCheck %s
+target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64"
+target triple = "powerpc64-unknown-linux-gnu"
+
+define double @foo_d_ll(ppc_fp128 %a, ppc_fp128 %b) #0 {
+entry:
+ %call = tail call ppc_fp128 @copysignl(ppc_fp128 %a, ppc_fp128 %b) #0
+ %conv = fptrunc ppc_fp128 %call to double
+ ret double %conv
+
+; CHECK-LABEL: @foo_d_ll
+; CHECK: fcpsgn 1, 3, 1
+; CHECK: blr
+}
+
+declare ppc_fp128 @copysignl(ppc_fp128, ppc_fp128) #0
+
+define double @foo_dl(double %a, ppc_fp128 %b) #0 {
+entry:
+ %conv = fptrunc ppc_fp128 %b to double
+ %call = tail call double @copysign(double %a, double %conv) #0
+ ret double %call
+
+; CHECK-LABEL: @foo_dl
+; CHECK: fcpsgn 1, 2, 1
+; CHECK: blr
+}
+
+declare double @copysign(double, double) #0
+
+define ppc_fp128 @foo_ll(double %a, ppc_fp128 %b) #0 {
+entry:
+ %conv = fpext double %a to ppc_fp128
+ %call = tail call ppc_fp128 @copysignl(ppc_fp128 %conv, ppc_fp128 %b) #0
+ ret ppc_fp128 %call
+
+; CHECK-LABEL: @foo_ll
+; CHECK: bl copysignl
+; CHECK: blr
+}
+
+define ppc_fp128 @foo_ld(double %a, double %b) #0 {
+entry:
+ %conv = fpext double %a to ppc_fp128
+ %conv1 = fpext double %b to ppc_fp128
+ %call = tail call ppc_fp128 @copysignl(ppc_fp128 %conv, ppc_fp128 %conv1) #0
+ ret ppc_fp128 %call
+
+; CHECK-LABEL: @foo_ld
+; CHECK: bl copysignl
+; CHECK: blr
+}
+
+define ppc_fp128 @foo_lf(double %a, float %b) #0 {
+entry:
+ %conv = fpext double %a to ppc_fp128
+ %conv1 = fpext float %b to ppc_fp128
+ %call = tail call ppc_fp128 @copysignl(ppc_fp128 %conv, ppc_fp128 %conv1) #0
+ ret ppc_fp128 %call
+
+; CHECK-LABEL: @foo_lf
+; CHECK: bl copysignl
+; CHECK: blr
+}
+
+attributes #0 = { nounwind readnone }
+
OpenPOWER on IntegriCloud