Index: llvm/lib/Target/ARM/ARMISelLowering.cpp =================================================================== --- llvm/lib/Target/ARM/ARMISelLowering.cpp +++ llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -10724,6 +10724,7 @@ return BB; } + case ARM::VMOVDcc: case ARM::tMOVCCr_pseudo: { // To "insert" a SELECT_CC instruction, we actually have to insert the // diamond control-flow pattern. The incoming instruction knows the @@ -10761,8 +10762,9 @@ BB->addSuccessor(copy0MBB); BB->addSuccessor(sinkMBB); - BuildMI(BB, dl, TII->get(ARM::tBcc)) - .addMBB(sinkMBB) + + BuildMI(BB, dl, + Subtarget->isThumb() ? TII->get(ARM::tBcc) : TII->get(ARM::Bcc)) .addMBB(sinkMBB) .addImm(MI.getOperand(3).getImm()) .addReg(MI.getOperand(4).getReg()); Index: llvm/lib/Target/ARM/ARMInstrVFP.td =================================================================== --- llvm/lib/Target/ARM/ARMInstrVFP.td +++ llvm/lib/Target/ARM/ARMInstrVFP.td @@ -2320,11 +2320,13 @@ // let hasSideEffects = 0 in { +let usesCustomInserter = 1 in { def VMOVDcc : PseudoInst<(outs DPR:$Dd), (ins DPR:$Dn, DPR:$Dm, cmovpred:$p), IIC_fpUNA64, [(set (f64 DPR:$Dd), (ARMcmov DPR:$Dn, DPR:$Dm, cmovpred:$p))]>, RegConstraint<"$Dn = $Dd">, Requires<[HasFPRegs64]>; +} def VMOVScc : PseudoInst<(outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm, cmovpred:$p), IIC_fpUNA32, Index: llvm/test/CodeGen/ARM/select.ll =================================================================== --- llvm/test/CodeGen/ARM/select.ll +++ llvm/test/CodeGen/ARM/select.ll @@ -65,7 +65,7 @@ ;CHECK: movmi ;CHECK: movpl ;CHECK-VFP-LABEL: f7: -;CHECK-VFP: vmovmi +;CHECK-VFP: vldrmi %tmp = fcmp olt double %a, 1.234e+00 %tmp1 = select i1 %tmp, double -1.000e+00, double %b ret double %tmp1 @@ -153,3 +153,19 @@ } declare { i32, i1 } @llvm.smul.with.overflow.i32(i32, i32) + +@ff = dso_local local_unnamed_addr global double 0x7FEFFFFFFFFFFFFF, align 8 +@xx = dso_local local_unnamed_addr global i32 16777216, align 4 + +; CHECK-VFP-LABEL: f13: +define double @f13() { +; CHECK-VFP: %bb.1 +; CHECK-VFP-NEXT: vadd +entry: + %0 = load double, double* @ff, align 8 + %1 = load i32, i32* @xx, align 4 + %cmp = icmp slt i32 %1, 1048576 + %mul = fmul double %0, 2.000000e+00 + %spec.select = select i1 %cmp, double %mul, double %0 + ret double %spec.select +} Index: llvm/test/CodeGen/Thumb2/float-ops.ll =================================================================== --- llvm/test/CodeGen/Thumb2/float-ops.ll +++ llvm/test/CodeGen/Thumb2/float-ops.ll @@ -288,8 +288,7 @@ ; SP-DAG: movne [[BHI]], [[AHI]] ; SP: vmov d0, [[BLO]], [[BHI]] ; DP: lsls r0, r0, #31 -; VFP4-DP: vmovne.f64 d1, d0 -; VFP4-DP: vmov.f64 d0, d1 +; VFP4-DP: vmoveq.f64 d0, d1 ; FP-ARMV8: vseleq.f64 d0, d1, d0 %1 = select i1 %c, double %a, double %b ret double %1