[X86][SSE] Added missing stack folding test for SQRTSD and SQRTSS instructions.
[oota-llvm.git] / test / CodeGen / X86 / sse-align-12.ll
index 731d429608cd4fae74b979bad7d87d646a432496..9441cc0002fbe86382aa9e75947058d35e0f0948 100644 (file)
@@ -1,12 +1,12 @@
-; RUN: llvm-as < %s | llc -march=x86-64 | grep unpck | wc -l | grep 2
-; RUN: llvm-as < %s | llc -march=x86-64 | grep shuf  | wc -l | grep 2
-; RUN: llvm-as < %s | llc -march=x86-64 | grep ps    | wc -l | grep 4
-; RUN: llvm-as < %s | llc -march=x86-64 | grep pd    | wc -l | grep 4
-; RUN: llvm-as < %s | llc -march=x86-64 | grep movup | wc -l | grep 4
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -march=x86-64 -mcpu=nehalem | FileCheck %s
 
-define <4 x float> @a(<4 x float>* %y)
-{
-  %x = load <4 x float>* %y, align 4
+define <4 x float> @a(<4 x float>* %y) nounwind {
+; CHECK-LABEL: a:
+; CHECK:       # BB#0:
+; CHECK-NEXT:    movups (%rdi), %xmm0
+; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,2,1,0]
+; CHECK-NEXT:    retq
+  %x = load <4 x float>, <4 x float>* %y, align 4
   %a = extractelement <4 x float> %x, i32 0
   %b = extractelement <4 x float> %x, i32 1
   %c = extractelement <4 x float> %x, i32 2
@@ -17,9 +17,14 @@ define <4 x float> @a(<4 x float>* %y)
   %s = insertelement <4 x float> %r, float %a, i32 3
   ret <4 x float> %s
 }
-define <4 x float> @b(<4 x float>* %y, <4 x float> %z)
-{
-  %x = load <4 x float>* %y, align 4
+
+define <4 x float> @b(<4 x float>* %y, <4 x float> %z) nounwind {
+; CHECK-LABEL: b:
+; CHECK:       # BB#0:
+; CHECK-NEXT:    movups (%rdi), %xmm1
+; CHECK-NEXT:    unpckhps {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
+; CHECK-NEXT:    retq
+  %x = load <4 x float>, <4 x float>* %y, align 4
   %a = extractelement <4 x float> %x, i32 2
   %b = extractelement <4 x float> %x, i32 3
   %c = extractelement <4 x float> %z, i32 2
@@ -30,18 +35,28 @@ define <4 x float> @b(<4 x float>* %y, <4 x float> %z)
   %s = insertelement <4 x float> %r, float %b, i32 3
   ret <4 x float> %s
 }
-define <2 x double> @c(<2 x double>* %y)
-{
-  %x = load <2 x double>* %y, align 8
+
+define <2 x double> @c(<2 x double>* %y) nounwind {
+; CHECK-LABEL: c:
+; CHECK:       # BB#0:
+; CHECK-NEXT:    movupd (%rdi), %xmm0
+; CHECK-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1,0]
+; CHECK-NEXT:    retq
+  %x = load <2 x double>, <2 x double>* %y, align 8
   %a = extractelement <2 x double> %x, i32 0
   %c = extractelement <2 x double> %x, i32 1
   %p = insertelement <2 x double> undef, double %c, i32 0
   %r = insertelement <2 x double> %p, double %a, i32 1
   ret <2 x double> %r
 }
-define <2 x double> @d(<2 x double>* %y, <2 x double> %z)
-{
-  %x = load <2 x double>* %y, align 8
+
+define <2 x double> @d(<2 x double>* %y, <2 x double> %z) nounwind {
+; CHECK-LABEL: d:
+; CHECK:       # BB#0:
+; CHECK-NEXT:    movupd (%rdi), %xmm1
+; CHECK-NEXT:    unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1]
+; CHECK-NEXT:    retq
+  %x = load <2 x double>, <2 x double>* %y, align 8
   %a = extractelement <2 x double> %x, i32 1
   %c = extractelement <2 x double> %z, i32 1
   %p = insertelement <2 x double> undef, double %c, i32 0