mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 19:52:54 +01:00
Fix integer cast code to handle vector types.
llvm-svn: 91362
This commit is contained in:
parent
44a8b5decd
commit
57dc006590
@ -5196,7 +5196,7 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) {
|
||||
// SimplifyDemandedBits, which only works if the value has a single use.
|
||||
if (SimplifyDemandedBits(Value,
|
||||
APInt::getLowBitsSet(
|
||||
Value.getValueSizeInBits(),
|
||||
Value.getValueType().getScalarType().getSizeInBits(),
|
||||
ST->getMemoryVT().getSizeInBits())))
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
|
@ -2354,6 +2354,10 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL,
|
||||
assert(VT.isFloatingPoint() &&
|
||||
Operand.getValueType().isFloatingPoint() && "Invalid FP cast!");
|
||||
if (Operand.getValueType() == VT) return Operand; // noop conversion.
|
||||
assert((!VT.isVector() ||
|
||||
VT.getVectorNumElements() ==
|
||||
Operand.getValueType().getVectorNumElements()) &&
|
||||
"Vector element count mismatch!");
|
||||
if (Operand.getOpcode() == ISD::UNDEF)
|
||||
return getUNDEF(VT);
|
||||
break;
|
||||
@ -2361,8 +2365,12 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL,
|
||||
assert(VT.isInteger() && Operand.getValueType().isInteger() &&
|
||||
"Invalid SIGN_EXTEND!");
|
||||
if (Operand.getValueType() == VT) return Operand; // noop extension
|
||||
assert(Operand.getValueType().bitsLT(VT)
|
||||
&& "Invalid sext node, dst < src!");
|
||||
assert(Operand.getValueType().getScalarType().bitsLT(VT.getScalarType()) &&
|
||||
"Invalid sext node, dst < src!");
|
||||
assert((!VT.isVector() ||
|
||||
VT.getVectorNumElements() ==
|
||||
Operand.getValueType().getVectorNumElements()) &&
|
||||
"Vector element count mismatch!");
|
||||
if (OpOpcode == ISD::SIGN_EXTEND || OpOpcode == ISD::ZERO_EXTEND)
|
||||
return getNode(OpOpcode, DL, VT, Operand.getNode()->getOperand(0));
|
||||
break;
|
||||
@ -2370,8 +2378,12 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL,
|
||||
assert(VT.isInteger() && Operand.getValueType().isInteger() &&
|
||||
"Invalid ZERO_EXTEND!");
|
||||
if (Operand.getValueType() == VT) return Operand; // noop extension
|
||||
assert(Operand.getValueType().bitsLT(VT)
|
||||
&& "Invalid zext node, dst < src!");
|
||||
assert(Operand.getValueType().getScalarType().bitsLT(VT.getScalarType()) &&
|
||||
"Invalid zext node, dst < src!");
|
||||
assert((!VT.isVector() ||
|
||||
VT.getVectorNumElements() ==
|
||||
Operand.getValueType().getVectorNumElements()) &&
|
||||
"Vector element count mismatch!");
|
||||
if (OpOpcode == ISD::ZERO_EXTEND) // (zext (zext x)) -> (zext x)
|
||||
return getNode(ISD::ZERO_EXTEND, DL, VT,
|
||||
Operand.getNode()->getOperand(0));
|
||||
@ -2380,8 +2392,12 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL,
|
||||
assert(VT.isInteger() && Operand.getValueType().isInteger() &&
|
||||
"Invalid ANY_EXTEND!");
|
||||
if (Operand.getValueType() == VT) return Operand; // noop extension
|
||||
assert(Operand.getValueType().bitsLT(VT)
|
||||
&& "Invalid anyext node, dst < src!");
|
||||
assert(Operand.getValueType().getScalarType().bitsLT(VT.getScalarType()) &&
|
||||
"Invalid anyext node, dst < src!");
|
||||
assert((!VT.isVector() ||
|
||||
VT.getVectorNumElements() ==
|
||||
Operand.getValueType().getVectorNumElements()) &&
|
||||
"Vector element count mismatch!");
|
||||
if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND)
|
||||
// (ext (zext x)) -> (zext x) and (ext (sext x)) -> (sext x)
|
||||
return getNode(OpOpcode, DL, VT, Operand.getNode()->getOperand(0));
|
||||
@ -2390,14 +2406,19 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL,
|
||||
assert(VT.isInteger() && Operand.getValueType().isInteger() &&
|
||||
"Invalid TRUNCATE!");
|
||||
if (Operand.getValueType() == VT) return Operand; // noop truncate
|
||||
assert(Operand.getValueType().bitsGT(VT)
|
||||
&& "Invalid truncate node, src < dst!");
|
||||
assert(Operand.getValueType().getScalarType().bitsGT(VT.getScalarType()) &&
|
||||
"Invalid truncate node, src < dst!");
|
||||
assert((!VT.isVector() ||
|
||||
VT.getVectorNumElements() ==
|
||||
Operand.getValueType().getVectorNumElements()) &&
|
||||
"Vector element count mismatch!");
|
||||
if (OpOpcode == ISD::TRUNCATE)
|
||||
return getNode(ISD::TRUNCATE, DL, VT, Operand.getNode()->getOperand(0));
|
||||
else if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
|
||||
OpOpcode == ISD::ANY_EXTEND) {
|
||||
// If the source is smaller than the dest, we still need an extend.
|
||||
if (Operand.getNode()->getOperand(0).getValueType().bitsLT(VT))
|
||||
if (Operand.getNode()->getOperand(0).getValueType().getScalarType()
|
||||
.bitsLT(VT.getScalarType()))
|
||||
return getNode(OpOpcode, DL, VT, Operand.getNode()->getOperand(0));
|
||||
else if (Operand.getNode()->getOperand(0).getValueType().bitsGT(VT))
|
||||
return getNode(ISD::TRUNCATE, DL, VT, Operand.getNode()->getOperand(0));
|
||||
@ -3743,16 +3764,15 @@ SelectionDAG::getLoad(ISD::MemIndexedMode AM, DebugLoc dl,
|
||||
assert(VT == MemVT && "Non-extending load from different memory type!");
|
||||
} else {
|
||||
// Extending load.
|
||||
if (VT.isVector())
|
||||
assert(MemVT.getVectorNumElements() == VT.getVectorNumElements() &&
|
||||
"Invalid vector extload!");
|
||||
else
|
||||
assert(MemVT.bitsLT(VT) &&
|
||||
"Should only be an extending load, not truncating!");
|
||||
assert((ExtType == ISD::EXTLOAD || VT.isInteger()) &&
|
||||
"Cannot sign/zero extend a FP/Vector load!");
|
||||
assert(MemVT.getScalarType().bitsLT(VT.getScalarType()) &&
|
||||
"Should only be an extending load, not truncating!");
|
||||
assert(VT.isInteger() == MemVT.isInteger() &&
|
||||
"Cannot convert from FP to Int or Int -> FP!");
|
||||
assert(VT.isVector() == MemVT.isVector() &&
|
||||
"Cannot use trunc store to convert to or from a vector!");
|
||||
assert((!VT.isVector() ||
|
||||
VT.getVectorNumElements() == MemVT.getVectorNumElements()) &&
|
||||
"Cannot use trunc store to change the number of vector elements!");
|
||||
}
|
||||
|
||||
bool Indexed = AM != ISD::UNINDEXED;
|
||||
@ -3885,10 +3905,15 @@ SDValue SelectionDAG::getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val,
|
||||
if (VT == SVT)
|
||||
return getStore(Chain, dl, Val, Ptr, MMO);
|
||||
|
||||
assert(VT.bitsGT(SVT) && "Not a truncation?");
|
||||
assert(SVT.getScalarType().bitsLT(VT.getScalarType()) &&
|
||||
"Should only be a truncating store, not extending!");
|
||||
assert(VT.isInteger() == SVT.isInteger() &&
|
||||
"Can't do FP-INT conversion!");
|
||||
|
||||
assert(VT.isVector() == SVT.isVector() &&
|
||||
"Cannot use trunc store to convert to or from a vector!");
|
||||
assert((!VT.isVector() ||
|
||||
VT.getVectorNumElements() == SVT.getVectorNumElements()) &&
|
||||
"Cannot use trunc store to change the number of vector elements!");
|
||||
|
||||
SDVTList VTs = getVTList(MVT::Other);
|
||||
SDValue Undef = getUNDEF(Ptr.getValueType());
|
||||
|
@ -596,6 +596,17 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)
|
||||
setOperationAction(ISD::UINT_TO_FP, (MVT::SimpleValueType)VT, Expand);
|
||||
setOperationAction(ISD::SINT_TO_FP, (MVT::SimpleValueType)VT, Expand);
|
||||
setOperationAction(ISD::SIGN_EXTEND_INREG, (MVT::SimpleValueType)VT,Expand);
|
||||
setOperationAction(ISD::TRUNCATE, (MVT::SimpleValueType)VT, Expand);
|
||||
setOperationAction(ISD::SIGN_EXTEND, (MVT::SimpleValueType)VT, Expand);
|
||||
setOperationAction(ISD::ZERO_EXTEND, (MVT::SimpleValueType)VT, Expand);
|
||||
setOperationAction(ISD::ANY_EXTEND, (MVT::SimpleValueType)VT, Expand);
|
||||
for (unsigned InnerVT = (unsigned)MVT::FIRST_VECTOR_VALUETYPE;
|
||||
InnerVT <= (unsigned)MVT::LAST_VECTOR_VALUETYPE; ++InnerVT)
|
||||
setTruncStoreAction((MVT::SimpleValueType)VT,
|
||||
(MVT::SimpleValueType)InnerVT, Expand);
|
||||
setLoadExtAction(ISD::SEXTLOAD, (MVT::SimpleValueType)VT, Expand);
|
||||
setLoadExtAction(ISD::ZEXTLOAD, (MVT::SimpleValueType)VT, Expand);
|
||||
setLoadExtAction(ISD::EXTLOAD, (MVT::SimpleValueType)VT, Expand);
|
||||
}
|
||||
|
||||
// FIXME: In order to prevent SSE instructions being expanded to MMX ones
|
||||
@ -672,8 +683,6 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)
|
||||
|
||||
setOperationAction(ISD::INSERT_VECTOR_ELT, MVT::v4i16, Custom);
|
||||
|
||||
setTruncStoreAction(MVT::v8i16, MVT::v8i8, Expand);
|
||||
setOperationAction(ISD::TRUNCATE, MVT::v8i8, Expand);
|
||||
setOperationAction(ISD::SELECT, MVT::v8i8, Promote);
|
||||
setOperationAction(ISD::SELECT, MVT::v4i16, Promote);
|
||||
setOperationAction(ISD::SELECT, MVT::v2i32, Promote);
|
||||
|
13
test/CodeGen/X86/vec-trunc-store.ll
Normal file
13
test/CodeGen/X86/vec-trunc-store.ll
Normal file
@ -0,0 +1,13 @@
|
||||
; RUN: llc < %s -march=x86-64 -disable-mmx | grep punpcklwd | count 2
|
||||
|
||||
define void @foo() nounwind {
|
||||
%cti69 = trunc <8 x i32> undef to <8 x i16> ; <<8 x i16>> [#uses=1]
|
||||
store <8 x i16> %cti69, <8 x i16>* undef
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @bar() nounwind {
|
||||
%cti44 = trunc <4 x i32> undef to <4 x i16> ; <<4 x i16>> [#uses=1]
|
||||
store <4 x i16> %cti44, <4 x i16>* undef
|
||||
ret void
|
||||
}
|
Loading…
Reference in New Issue
Block a user