Expand INSERT_VECTOR_ELT to store vec, sp; store elt, sp+k; vec = load sp;

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@27274 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Evan Cheng 2006-03-31 01:27:51 +00:00
parent 79227e2906
commit eb0b461cf4

View File

@ -798,7 +798,30 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
// with a "move to register" or "extload into register" instruction, then
// permute it into place, if the idx is a constant and if the idx is
// supported by the target.
assert(0 && "INSERT_VECTOR_ELT expand not supported yet!");
SDOperand StackPtr = CreateStackTemporary(Tmp1.getValueType());
// Store the vector.
SDOperand Ch = DAG.getNode(ISD::STORE, MVT::Other, DAG.getEntryNode(),
Tmp1, StackPtr, DAG.getSrcValue(NULL));
// Truncate or zero extend offset to target pointer type.
MVT::ValueType IntPtr = TLI.getPointerTy();
if (Tmp3.getValueType() > IntPtr)
Tmp3 = DAG.getNode(ISD::TRUNCATE, IntPtr, Tmp3);
else
Tmp3 = DAG.getNode(ISD::ZERO_EXTEND, IntPtr, Tmp3);
// Add the offset to the index.
unsigned EltSize = MVT::getSizeInBits(Result.getValueType())/8;
Tmp3 = DAG.getNode(ISD::MUL, Tmp3.getValueType(), Tmp3,
DAG.getConstant(EltSize, Tmp3.getValueType()));
SDOperand StackPtr2 =
DAG.getNode(ISD::ADD, Tmp3.getValueType(), Tmp3, StackPtr);
// Store the scalar value.
Ch = DAG.getNode(ISD::STORE, MVT::Other, Ch,
Tmp2, StackPtr2, DAG.getSrcValue(NULL));
// Load the updated vector.
Result = DAG.getLoad(Result.getValueType(), Ch, StackPtr,
DAG.getSrcValue(NULL));
break;
}
}