diff --git a/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp
index 58692f5..dd92b76 100644
--- a/lib/CodeGen/CGExprScalar.cpp
+++ b/lib/CodeGen/CGExprScalar.cpp
@@ -2598,9 +2598,13 @@ VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) {
     }
   }
 
+  // Enable Vector Select
+  bool IsARM = (CGF.getContext().getTargetInfo().getTriple().getArch() ==
+                llvm::Triple::arm && !CGF.getContext().getLangOpts().OpenCL);
+
   // OpenCL: If the condition is a vector, we can treat this condition like
   // the select function.
-  if (CGF.getContext().getLangOpts().OpenCL 
+  if ((CGF.getContext().getLangOpts().OpenCL || IsARM)
       && condExpr->getType()->isVectorType()) {
     llvm::Value *CondV = CGF.EmitScalarExpr(condExpr);
     llvm::Value *LHS = Visit(lhsExpr);
@@ -2625,7 +2629,8 @@ VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) {
     llvm::Value *LHSTmp = LHS;
     bool wasCast = false;
     llvm::VectorType *rhsVTy = cast<llvm::VectorType>(RHS->getType());
-    if (rhsVTy->getElementType()->isFloatingPointTy()) {
+    if (rhsVTy->getElementType()->isFloatingPointTy() ||
+       (rhsVTy->getElementType()->isDoubleTy() && IsARM)) {
       RHSTmp = Builder.CreateBitCast(RHS, tmp2->getType());
       LHSTmp = Builder.CreateBitCast(LHS, tmp->getType());
       wasCast = true;
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 2706ae4..8e2b03d 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -4648,6 +4648,11 @@ static bool checkCondition(Sema &S, Expr *Cond) {
   // C99 6.5.15p2
   if (CondTy->isScalarType()) return false;
 
+  if ( !S.getLangOpts().OpenCL &&
+        S.Context.getTargetInfo().getTriple().getArch() == llvm::Triple::arm &&
+        CondTy->isVectorType() )
+    return false;
+
   // OpenCL: Sec 6.3.i says the condition is allowed to be a vector or scalar.
   if (S.getLangOpts().OpenCL && CondTy->isVectorType())
     return false;
