mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
[SDAG] Don't try to use FP_EXTEND/FP_ROUND for int<->fp promotions
The PowerPC backend has long promoted some floating-point vector operations (such as select) to integer vector operations. Unfortunately, this behavior was broken by r216555. When using FP_EXTEND/FP_ROUND for promotions, we must check that both the old and new types are floating-point types. Otherwise, we must use BITCAST as we did prior to r216555 for everything. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228969 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -390,7 +390,8 @@ SDValue VectorLegalizer::Promote(SDValue Op) {
|
||||
if (Op.getOperand(j)
|
||||
.getValueType()
|
||||
.getVectorElementType()
|
||||
.isFloatingPoint())
|
||||
.isFloatingPoint() &&
|
||||
NVT.isVector() && NVT.getVectorElementType().isFloatingPoint())
|
||||
Operands[j] = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Op.getOperand(j));
|
||||
else
|
||||
Operands[j] = DAG.getNode(ISD::BITCAST, dl, NVT, Op.getOperand(j));
|
||||
@@ -399,8 +400,9 @@ SDValue VectorLegalizer::Promote(SDValue Op) {
|
||||
}
|
||||
|
||||
Op = DAG.getNode(Op.getOpcode(), dl, NVT, Operands);
|
||||
if (VT.isFloatingPoint() ||
|
||||
(VT.isVector() && VT.getVectorElementType().isFloatingPoint()))
|
||||
if ((VT.isFloatingPoint() && NVT.isFloatingPoint()) ||
|
||||
(VT.isVector() && VT.getVectorElementType().isFloatingPoint() &&
|
||||
NVT.isVector() && NVT.getVectorElementType().isFloatingPoint()))
|
||||
return DAG.getNode(ISD::FP_ROUND, dl, VT, Op, DAG.getIntPtrConstant(0));
|
||||
else
|
||||
return DAG.getNode(ISD::BITCAST, dl, VT, Op);
|
||||
|
Reference in New Issue
Block a user