break;
}
case TargetLowering::TypePromoteInteger: {
- SDValue InOp = GetPromotedInteger(N->getOperand(0));
+ SDValue InOp;
+ if (N->getOpcode() == ISD::SIGN_EXTEND ||
+ N->getOpcode() == ISD::SINT_TO_FP) {
+ InOp = SExtPromotedInteger(N->getOperand(0));
+ } else if (
+ N->getOpcode() == ISD::ZERO_EXTEND ||
+ N->getOpcode() == ISD::UINT_TO_FP) {
+ InOp = ZExtPromotedInteger(N->getOperand(0));
+ } else {
+ InOp = GetPromotedInteger(N->getOperand(0));
+ }
EVT InNVT = EVT::getVectorVT(*DAG.getContext(),
InOp.getValueType().getVectorElementType(),
LoVT.getVectorNumElements());
SDValue CC = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl,
ResVT, WideSETCC, DAG.getIntPtrConstant(0));
- // Convert the result mask to the correct kind.
- return DAG.getAnyExtOrTrunc(CC, dl, N->getValueType(0));
+ return PromoteTargetBoolean(CC, N->getValueType(0));
}
--- /dev/null
+; RUN: llc < %s -march=x86-64 -mcpu=corei7 | FileCheck %s
+target triple = "x86_64-unknown-linux-gnu"
+
+; Check that the booleans are converted using zext and not via sext.
+; 0x1 means that we only look at the first bit.
+
+;CHECK: 0x1
+;CHECK: ui_to_fp_conv
+;CHECK: ret
+define void @ui_to_fp_conv(<8 x float> * nocapture %aFOO, <8 x float>* nocapture %RET) nounwind {
+allocas:
+ %bincmp = fcmp olt <8 x float> <float 1.000000e+00, float 1.000000e+00, float 3.000000e+00, float 3.000000e+00, float 3.000000e+00, float 3.000000e+00, float 3.000000e+00, float 3.000000e+00> , <float 3.000000e+00, float 3.000000e+00, float 3.000000e+00, float 3.000000e+00, float 3.000000e+00, float 3.000000e+00, float 3.000000e+00, float 3.000000e+00>
+ %bool2float = uitofp <8 x i1> %bincmp to <8 x float>
+ store <8 x float> %bool2float, <8 x float>* %RET, align 4
+ ret void
+}
+
+
+