mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-15 22:28:18 +00:00
Fix pr11194. When promoting and splitting integers we need to use
ZExtPromotedInteger and SExtPromotedInteger based on the operation we legalize. SetCC return type needs to be legalized via PromoteTargetBoolean. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@142660 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -787,7 +787,17 @@ void DAGTypeLegalizer::SplitVecRes_UnaryOp(SDNode *N, SDValue &Lo,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TargetLowering::TypePromoteInteger: {
|
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(),
|
EVT InNVT = EVT::getVectorVT(*DAG.getContext(),
|
||||||
InOp.getValueType().getVectorElementType(),
|
InOp.getValueType().getVectorElementType(),
|
||||||
LoVT.getVectorNumElements());
|
LoVT.getVectorNumElements());
|
||||||
@@ -2189,8 +2199,7 @@ SDValue DAGTypeLegalizer::WidenVecOp_SETCC(SDNode *N) {
|
|||||||
SDValue CC = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl,
|
SDValue CC = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl,
|
||||||
ResVT, WideSETCC, DAG.getIntPtrConstant(0));
|
ResVT, WideSETCC, DAG.getIntPtrConstant(0));
|
||||||
|
|
||||||
// Convert the result mask to the correct kind.
|
return PromoteTargetBoolean(CC, N->getValueType(0));
|
||||||
return DAG.getAnyExtOrTrunc(CC, dl, N->getValueType(0));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
19
test/CodeGen/X86/2011-20-21-zext-ui2fp.ll
Normal file
19
test/CodeGen/X86/2011-20-21-zext-ui2fp.ll
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
; 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
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Reference in New Issue
Block a user