summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
authorChih-Hung Hsieh <chh@google.com>2017-04-18 20:15:18 +0000
committerChih-Hung Hsieh <chh@google.com>2017-04-18 20:15:18 +0000
commit877923a87f52931bcefc98dedf1d10383a31b7d5 (patch)
tree5e5c386a88c0b9e2378f9c6d4c80b8e0388aa336 /llvm/test
parenteffa539495f76a6cc09a16a5c43179e4953de65d (diff)
downloadbcm5719-llvm-877923a87f52931bcefc98dedf1d10383a31b7d5.tar.gz
bcm5719-llvm-877923a87f52931bcefc98dedf1d10383a31b7d5.zip
[X86] Keep EXTRACT_VECTOR_ELT result type as f128 for Android x86_64.
Android x86_64 target uses f128 type and stores f128 values in %xmm* registers. SoftenFloatRes_EXTRACT_VECTOR_ELT should not convert result value from f128 to i128. Differential Revision: http://reviews.llvm.org/D32102 llvm-svn: 300583
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/CodeGen/X86/extract-store.ll37
-rw-r--r--llvm/test/CodeGen/X86/fp128-extract.ll22
2 files changed, 59 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/X86/extract-store.ll b/llvm/test/CodeGen/X86/extract-store.ll
index 1751f03731d..5286a1b635d 100644
--- a/llvm/test/CodeGen/X86/extract-store.ll
+++ b/llvm/test/CodeGen/X86/extract-store.ll
@@ -5,6 +5,10 @@
; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=X64 --check-prefix=SSE-X64 --check-prefix=SSE41-X64
; RUN: llc < %s -mtriple=i686-unknown -mattr=+avx | FileCheck %s --check-prefix=X32 --check-prefix=AVX-X32
; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx | FileCheck %s --check-prefix=X64 --check-prefix=AVX-X64
+; RUN: llc < %s -O2 -mtriple=x86_64-linux-android -mattr=+mmx -enable-legalize-types-checking \
+; RUN: | FileCheck %s --check-prefix=X64 --check-prefix=SSE-X64 --check-prefix=SSE-F128
+; RUN: llc < %s -O2 -mtriple=x86_64-linux-gnu -mattr=+mmx -enable-legalize-types-checking \
+; RUN: | FileCheck %s --check-prefix=X64 --check-prefix=SSE-X64 --check-prefix=SSE-F128
define void @extract_i8_0(i8* nocapture %dst, <16 x i8> %foo) nounwind {
; SSE2-X32-LABEL: extract_i8_0:
@@ -458,6 +462,26 @@ define void @extract_f64_1(double* nocapture %dst, <2 x double> %foo) nounwind {
ret void
}
+define void @extract_f128_0(fp128* nocapture %dst, <2 x fp128> %foo) nounwind {
+; SSE-F128-LABEL: extract_f128_0:
+; SSE-F128: # BB#0:
+; SSE-F128-NEXT: movaps %xmm0, (%rdi)
+; SSE-F128-NEXT: retq
+ %vecext = extractelement <2 x fp128> %foo, i32 0
+ store fp128 %vecext, fp128* %dst, align 1
+ ret void
+}
+
+define void @extract_f128_1(fp128* nocapture %dst, <2 x fp128> %foo) nounwind {
+; SSE-F128-LABEL: extract_f128_1:
+; SSE-F128: # BB#0:
+; SSE-F128-NEXT: movaps %xmm1, (%rdi)
+; SSE-F128-NEXT: retq
+ %vecext = extractelement <2 x fp128> %foo, i32 1
+ store fp128 %vecext, fp128* %dst, align 1
+ ret void
+}
+
define void @extract_i8_undef(i8* nocapture %dst, <16 x i8> %foo) nounwind {
; X32-LABEL: extract_i8_undef:
; X32: # BB#0:
@@ -535,3 +559,16 @@ define void @extract_f64_undef(double* nocapture %dst, <2 x double> %foo) nounwi
store double %vecext, double* %dst, align 1
ret void
}
+
+define void @extract_f128_undef(fp128* nocapture %dst, <2 x fp128> %foo) nounwind {
+; X32-LABEL: extract_f128_undef:
+; X32: # BB#0:
+; X32-NEXT: retl
+;
+; X64-LABEL: extract_f128_undef:
+; X64: # BB#0:
+; X64-NEXT: retq
+ %vecext = extractelement <2 x fp128> %foo, i32 2 ; undef
+ store fp128 %vecext, fp128* %dst, align 1
+ ret void
+}
diff --git a/llvm/test/CodeGen/X86/fp128-extract.ll b/llvm/test/CodeGen/X86/fp128-extract.ll
new file mode 100644
index 00000000000..5006ac898c7
--- /dev/null
+++ b/llvm/test/CodeGen/X86/fp128-extract.ll
@@ -0,0 +1,22 @@
+; RUN: llc < %s -O2 -mtriple=x86_64-linux-android -mattr=+mmx \
+; RUN: -enable-legalize-types-checking | FileCheck %s
+; RUN: llc < %s -O2 -mtriple=x86_64-linux-gnu -mattr=+mmx \
+; RUN: -enable-legalize-types-checking | FileCheck %s
+
+; Test the softened result of extractelement op code.
+define fp128 @TestExtract(<2 x double> %x) {
+entry:
+ ; Simplified instruction pattern from the output of llvm before r289042,
+ ; for a boost function ...::insert<...>::traverse<...>().
+ %a = fpext <2 x double> %x to <2 x fp128>
+ %0 = extractelement <2 x fp128> %a, i32 0
+ %1 = extractelement <2 x fp128> %a, i32 1
+ %2 = fmul fp128 %0, %1
+ ret fp128 %2
+; CHECK-LABEL: TestExtract:
+; CHECK: movaps %xmm0, (%rsp)
+; CHECK: callq __extenddftf2
+; CHECK: callq __extenddftf2
+; CHECK: callq __multf3
+; CHECK: retq
+}
OpenPOWER on IntegriCloud