| Index: src/PNaClTranslator.cpp
|
| diff --git a/src/PNaClTranslator.cpp b/src/PNaClTranslator.cpp
|
| index e0edc613145ffe6e407ee9a7f98a2093f72b0e95..124ed894f34fd72da298a1c43b253227479e7179 100644
|
| --- a/src/PNaClTranslator.cpp
|
| +++ b/src/PNaClTranslator.cpp
|
| @@ -1510,10 +1510,6 @@ private:
|
| return VectorIndexValid;
|
| }
|
|
|
| - // Reports that the given binary Opcode, for the given type Ty,
|
| - // is not understood.
|
| - void ReportInvalidBinopOpcode(unsigned Opcode, Ice::Type Ty);
|
| -
|
| // Returns true if the Str begins with Prefix.
|
| bool isStringPrefix(Ice::IceString &Str, Ice::IceString &Prefix) {
|
| const size_t PrefixSize = Prefix.size();
|
| @@ -1531,73 +1527,78 @@ private:
|
| // opcode. Returns true if able to convert, false otherwise.
|
| bool convertBinopOpcode(unsigned Opcode, Ice::Type Ty,
|
| Ice::InstArithmetic::OpKind &Op) {
|
| - Instruction::BinaryOps LLVMOpcode;
|
| - if (!naclbitc::DecodeBinaryOpcode(Opcode, Context->convertToLLVMType(Ty),
|
| - LLVMOpcode)) {
|
| - ReportInvalidBinopOpcode(Opcode, Ty);
|
| - // TODO(kschimpf) Remove error recovery once implementation complete.
|
| - Op = Ice::InstArithmetic::Add;
|
| - return false;
|
| - }
|
| - switch (LLVMOpcode) {
|
| + switch (Opcode) {
|
| default: {
|
| - ReportInvalidBinopOpcode(Opcode, Ty);
|
| + std::string Buffer;
|
| + raw_string_ostream StrBuf(Buffer);
|
| + StrBuf << "Binary opcode " << Opcode << "not understood for type " << Ty;
|
| + Error(StrBuf.str());
|
| // TODO(kschimpf) Remove error recovery once implementation complete.
|
| Op = Ice::InstArithmetic::Add;
|
| return false;
|
| }
|
| - case Instruction::Add:
|
| - Op = Ice::InstArithmetic::Add;
|
| - return isValidIntegerArithOp(Op, Ty);
|
| - case Instruction::FAdd:
|
| - Op = Ice::InstArithmetic::Fadd;
|
| - return isValidFloatingArithOp(Op, Ty);
|
| - case Instruction::Sub:
|
| - Op = Ice::InstArithmetic::Sub;
|
| - return isValidIntegerArithOp(Op, Ty);
|
| - case Instruction::FSub:
|
| - Op = Ice::InstArithmetic::Fsub;
|
| - return isValidFloatingArithOp(Op, Ty);
|
| - case Instruction::Mul:
|
| - Op = Ice::InstArithmetic::Mul;
|
| - return isValidIntegerArithOp(Op, Ty);
|
| - case Instruction::FMul:
|
| - Op = Ice::InstArithmetic::Fmul;
|
| - return isValidFloatingArithOp(Op, Ty);
|
| - case Instruction::UDiv:
|
| + case naclbitc::BINOP_ADD:
|
| + if (Ice::isIntegerType(Ty)) {
|
| + Op = Ice::InstArithmetic::Add;
|
| + return isValidIntegerArithOp(Op, Ty);
|
| + } else {
|
| + Op = Ice::InstArithmetic::Fadd;
|
| + return isValidFloatingArithOp(Op, Ty);
|
| + }
|
| + case naclbitc::BINOP_SUB:
|
| + if (Ice::isIntegerType(Ty)) {
|
| + Op = Ice::InstArithmetic::Sub;
|
| + return isValidIntegerArithOp(Op, Ty);
|
| + } else {
|
| + Op = Ice::InstArithmetic::Fsub;
|
| + return isValidFloatingArithOp(Op, Ty);
|
| + }
|
| + case naclbitc::BINOP_MUL:
|
| + if (Ice::isIntegerType(Ty)) {
|
| + Op = Ice::InstArithmetic::Mul;
|
| + return isValidIntegerArithOp(Op, Ty);
|
| + } else {
|
| + Op = Ice::InstArithmetic::Fmul;
|
| + return isValidFloatingArithOp(Op, Ty);
|
| + }
|
| + case naclbitc::BINOP_UDIV:
|
| Op = Ice::InstArithmetic::Udiv;
|
| return isValidIntegerArithOp(Op, Ty);
|
| - case Instruction::SDiv:
|
| - Op = Ice::InstArithmetic::Sdiv;
|
| - return isValidIntegerArithOp(Op, Ty);
|
| - case Instruction::FDiv:
|
| - Op = Ice::InstArithmetic::Fdiv;
|
| - return isValidFloatingArithOp(Op, Ty);
|
| - case Instruction::URem:
|
| + case naclbitc::BINOP_SDIV:
|
| + if (Ice::isIntegerType(Ty)) {
|
| + Op = Ice::InstArithmetic::Sdiv;
|
| + return isValidIntegerArithOp(Op, Ty);
|
| + } else {
|
| + Op = Ice::InstArithmetic::Fdiv;
|
| + return isValidFloatingArithOp(Op, Ty);
|
| + }
|
| + case naclbitc::BINOP_UREM:
|
| Op = Ice::InstArithmetic::Urem;
|
| return isValidIntegerArithOp(Op, Ty);
|
| - case Instruction::SRem:
|
| - Op = Ice::InstArithmetic::Srem;
|
| - return isValidIntegerArithOp(Op, Ty);
|
| - case Instruction::FRem:
|
| - Op = Ice::InstArithmetic::Frem;
|
| - return isValidFloatingArithOp(Op, Ty);
|
| - case Instruction::Shl:
|
| + case naclbitc::BINOP_SREM:
|
| + if (Ice::isIntegerType(Ty)) {
|
| + Op = Ice::InstArithmetic::Srem;
|
| + return isValidIntegerArithOp(Op, Ty);
|
| + } else {
|
| + Op = Ice::InstArithmetic::Frem;
|
| + return isValidFloatingArithOp(Op, Ty);
|
| + }
|
| + case naclbitc::BINOP_SHL:
|
| Op = Ice::InstArithmetic::Shl;
|
| return isValidIntegerArithOp(Op, Ty);
|
| - case Instruction::LShr:
|
| + case naclbitc::BINOP_LSHR:
|
| Op = Ice::InstArithmetic::Lshr;
|
| return isValidIntegerArithOp(Op, Ty);
|
| - case Instruction::AShr:
|
| + case naclbitc::BINOP_ASHR:
|
| Op = Ice::InstArithmetic::Ashr;
|
| return isValidIntegerArithOp(Op, Ty);
|
| - case Instruction::And:
|
| + case naclbitc::BINOP_AND:
|
| Op = Ice::InstArithmetic::And;
|
| return isValidIntegerLogicalOp(Op, Ty);
|
| - case Instruction::Or:
|
| + case naclbitc::BINOP_OR:
|
| Op = Ice::InstArithmetic::Or;
|
| return isValidIntegerLogicalOp(Op, Ty);
|
| - case Instruction::Xor:
|
| + case naclbitc::BINOP_XOR:
|
| Op = Ice::InstArithmetic::Xor;
|
| return isValidIntegerLogicalOp(Op, Ty);
|
| }
|
| @@ -1764,13 +1765,6 @@ private:
|
| }
|
| };
|
|
|
| -void FunctionParser::ReportInvalidBinopOpcode(unsigned Opcode, Ice::Type Ty) {
|
| - std::string Buffer;
|
| - raw_string_ostream StrBuf(Buffer);
|
| - StrBuf << "Binary opcode " << Opcode << "not understood for type " << Ty;
|
| - Error(StrBuf.str());
|
| -}
|
| -
|
| void FunctionParser::ExitBlock() {
|
| if (isIRGenerationDisabled()) {
|
| popTimerIfTimingEachFunction();
|
| @@ -1868,8 +1862,10 @@ void FunctionParser::ProcessRecord() {
|
| }
|
|
|
| Ice::InstArithmetic::OpKind Opcode;
|
| - if (!convertBinopOpcode(Values[2], Type1, Opcode))
|
| + if (!convertBinopOpcode(Values[2], Type1, Opcode)) {
|
| + appendErrorInstruction(Type1);
|
| return;
|
| + }
|
| CurrentNode->appendInst(Ice::InstArithmetic::create(
|
| Func, Opcode, getNextInstVar(Type1), Op1, Op2));
|
| return;
|
|
|