Chromium Code Reviews| 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..dc3f7eb3290c926652108b7a84c9d381b4be6c92 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,45 @@ bool NaClBitcodeReader::ParseFunctionBody(Function *F) { |
| break; |
| } |
| + case naclbitc::FUNC_CODE_INST_EXTRACTELT: { // EXTRACTELT: [opty, opval, opval] |
|
Jim Stichnoth
2014/04/04 23:08:17
line longer than 80 chars...
jvoung (off chromium)
2014/04/04 23:20:21
no opty?
JF
2014/04/15 01:52:27
jvoung's comment made it go under 80, I nonetheles
JF
2014/04/15 01:52:27
Done.
|
| + 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 |