| Index: lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp
|
| diff --git a/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp b/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp
|
| index 7332761b3e1c88b41f3355efea479d1e41ed2d25..24f926c3ca5184ca67b1cda0f8b005ec49299b7a 100644
|
| --- a/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp
|
| +++ b/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp
|
| @@ -369,6 +369,15 @@ bool NaClBitcodeReader::ParseTypeTableBody() {
|
| ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]);
|
| break;
|
| }
|
| + case naclbitc::TYPE_CODE_VECTOR: { // VECTOR: [numelts, eltty]
|
| + if (Record.size() != 2)
|
| + return Error("Invalid VECTOR type record");
|
| + if ((ResultTy = getTypeByID(Record[1])))
|
| + ResultTy = VectorType::get(ResultTy, Record[0]);
|
| + else
|
| + return Error("invalid type in vector type");
|
| + break;
|
| + }
|
| }
|
|
|
| if (NumRecords >= TypeList.size())
|
| @@ -1158,6 +1167,43 @@ bool NaClBitcodeReader::ParseFunctionBody(Function *F) {
|
| break;
|
| }
|
|
|
| + case naclbitc::FUNC_CODE_INST_EXTRACTELT: { // EXTRACTELT: [opval, opval]
|
| + unsigned OpNum = 0;
|
| + Value *Vec, *Idx;
|
| + if (popValue(Record, &OpNum, NextValueNo, &Vec) ||
|
| + popValue(Record, &OpNum, NextValueNo, &Idx) || OpNum != Record.size())
|
| + return Error("Invalid EXTRACTELEMENT record");
|
| +
|
| + // expect i32
|
| + if (Idx->getType() != Type::getInt32Ty(Context))
|
| + return Error("Invalid EXTRACTELEMENT index type");
|
| +
|
| + I = ExtractElementInst::Create(Vec, Idx);
|
| + break;
|
| + }
|
| +
|
| + case naclbitc::FUNC_CODE_INST_INSERTELT: { // INSERTELT: [opval,opval,opval]
|
| + unsigned OpNum = 0;
|
| + Value *Vec, *Elt, *Idx;
|
| + if (popValue(Record, &OpNum, NextValueNo, &Vec) ||
|
| + popValue(Record, &OpNum, NextValueNo, &Elt) ||
|
| + popValue(Record, &OpNum, NextValueNo, &Idx) || OpNum != Record.size())
|
| + return Error("Invalid INSERTELEMENT record");
|
| +
|
| + // expect vector type
|
| + if (!isa<VectorType>(Vec->getType()))
|
| + return Error("Invalid INSERTELEMENT vector type");
|
| + // match vector and element types
|
| + if (cast<VectorType>(Vec->getType())->getElementType() != Elt->getType())
|
| + return Error("Mismatched INSERTELEMENT vector and element type");
|
| + // expect i32
|
| + if (Idx->getType() != Type::getInt32Ty(Context))
|
| + return Error("Invalid INSERTELEMENT index type");
|
| +
|
| + I = InsertElementInst::Create(Vec, Elt, Idx);
|
| + break;
|
| + }
|
| +
|
| case naclbitc::FUNC_CODE_INST_CMP2: { // CMP2: [opval, opval, pred]
|
| // FCmp/ICmp returning bool or vector of bool
|
|
|
|
|