Commit 1780905e by Alexis Hetu Committed by Alexis Hétu

Adding bitwise operators to parser

Added ~, %, &, |, ^, <<, >>, %=, &=, |=, ^=, <<=, >>= to the parser and related enums. Change-Id: Ic95b2362ec3a066ea5285b195bdcda9b6853fd3f Reviewed-on: https://swiftshader-review.googlesource.com/3120Reviewed-by: 's avatarNicolas Capens <capn@google.com> Tested-by: 's avatarAlexis Hétu <sugoi@google.com>
parent 8a93710a
......@@ -28,6 +28,12 @@ const char* getOperatorString(TOperator op) {
case EOpAddAssign: return "+=";
case EOpSubAssign: return "-=";
case EOpDivAssign: return "/=";
case EOpIModAssign: return "%=";
case EOpBitShiftLeftAssign: return "<<=";
case EOpBitShiftRightAssign: return ">>=";
case EOpBitwiseAndAssign: return "&=";
case EOpBitwiseXorAssign: return "^=";
case EOpBitwiseOrAssign: return "|=";
// Fall-through.
case EOpMulAssign:
......@@ -64,9 +70,16 @@ const char* getOperatorString(TOperator op) {
case EOpLogicalOr: return "||";
case EOpLogicalXor: return "^^";
case EOpLogicalAnd: return "&&";
case EOpIMod: return "%";
case EOpBitShiftLeft: return "<<";
case EOpBitShiftRight: return ">>";
case EOpBitwiseAnd: return "&";
case EOpBitwiseXor: return "^";
case EOpBitwiseOr: return "|";
case EOpNegative: return "-";
case EOpVectorLogicalNot: return "not";
case EOpLogicalNot: return "!";
case EOpBitwiseNot: return "~";
case EOpPostIncrement: return "++";
case EOpPostDecrement: return "--";
case EOpPreIncrement: return "++";
......@@ -589,6 +602,12 @@ bool TIntermOperator::modifiesState() const
case EOpMatrixTimesScalarAssign:
case EOpMatrixTimesMatrixAssign:
case EOpDivAssign:
case EOpIModAssign:
case EOpBitShiftLeftAssign:
case EOpBitShiftRightAssign:
case EOpBitwiseAndAssign:
case EOpBitwiseXorAssign:
case EOpBitwiseOrAssign:
return true;
default:
return false;
......@@ -836,6 +855,12 @@ bool TIntermBinary::promote(TInfoSink& infoSink)
case EOpAddAssign:
case EOpSubAssign:
case EOpDivAssign:
case EOpIModAssign:
case EOpBitShiftLeftAssign:
case EOpBitShiftRightAssign:
case EOpBitwiseAndAssign:
case EOpBitwiseXorAssign:
case EOpBitwiseOrAssign:
if ((left->isMatrix() && right->isVector()) ||
(left->isVector() && right->isMatrix()))
return false;
......
......@@ -765,6 +765,10 @@ unary_operator
: PLUS { $$.line = $1.line; $$.op = EOpNull; }
| DASH { $$.line = $1.line; $$.op = EOpNegative; }
| BANG { $$.line = $1.line; $$.op = EOpLogicalNot; }
| TILDE {
ES3_ONLY("~", $1.line);
$$.line = $1.line; $$.op = EOpBitwiseNot;
}
;
// Grammar Note: No '*' or '&' unary ops. Pointers are not supported.
......@@ -788,6 +792,16 @@ multiplicative_expression
$$ = $1;
}
}
| multiplicative_expression PERCENT unary_expression {
FRAG_VERT_ONLY("%", $2.line);
ES3_ONLY("%", $2.line);
$$ = context->intermediate.addBinaryMath(EOpIMod, $1, $3, $2.line);
if ($$ == 0) {
context->binaryOpError($2.line, "%", $1->getCompleteString(), $3->getCompleteString());
context->recover();
$$ = $1;
}
}
;
additive_expression
......@@ -812,6 +826,24 @@ additive_expression
shift_expression
: additive_expression { $$ = $1; }
| shift_expression LEFT_OP additive_expression {
ES3_ONLY("<<", $2.line);
context->intermediate.addBinaryMath(EOpBitShiftLeft, $1, $3, $2.line);
if ($$ == 0) {
context->binaryOpError($2.line, "<<", $1->getCompleteString(), $3->getCompleteString());
context->recover();
$$ = $1;
}
}
| shift_expression RIGHT_OP additive_expression {
ES3_ONLY(">>", $2.line);
context->intermediate.addBinaryMath(EOpBitShiftRight, $1, $3, $2.line);
if ($$ == 0) {
context->binaryOpError($2.line, ">>", $1->getCompleteString(), $3->getCompleteString());
context->recover();
$$ = $1;
}
}
;
relational_expression
......@@ -884,14 +916,47 @@ equality_expression
and_expression
: equality_expression { $$ = $1; }
| and_expression AMPERSAND equality_expression {
ES3_ONLY("&", $2.line);
$$ = context->intermediate.addBinaryMath(EOpBitwiseAnd, $1, $3, $2.line);
if ($$ == 0) {
context->binaryOpError($2.line, "&", $1->getCompleteString(), $3->getCompleteString());
context->recover();
ConstantUnion *unionArray = new ConstantUnion[1];
unionArray->setBConst(false);
$$ = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConstExpr), $2.line);
}
}
;
exclusive_or_expression
: and_expression { $$ = $1; }
| exclusive_or_expression CARET and_expression {
ES3_ONLY("^", $2.line);
$$ = context->intermediate.addBinaryMath(EOpBitwiseXor, $1, $3, $2.line);
if ($$ == 0) {
context->binaryOpError($2.line, "^", $1->getCompleteString(), $3->getCompleteString());
context->recover();
ConstantUnion *unionArray = new ConstantUnion[1];
unionArray->setBConst(false);
$$ = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConstExpr), $2.line);
}
}
;
inclusive_or_expression
: exclusive_or_expression { $$ = $1; }
| inclusive_or_expression VERTICAL_BAR exclusive_or_expression {
ES3_ONLY("|", $2.line);
$$ = context->intermediate.addBinaryMath(EOpBitwiseOr, $1, $3, $2.line);
if ($$ == 0) {
context->binaryOpError($2.line, "|", $1->getCompleteString(), $3->getCompleteString());
context->recover();
ConstantUnion *unionArray = new ConstantUnion[1];
unionArray->setBConst(false);
$$ = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConstExpr), $2.line);
}
}
;
logical_and_expression
......@@ -972,8 +1037,20 @@ assignment_operator
: EQUAL { $$.line = $1.line; $$.op = EOpAssign; }
| MUL_ASSIGN { FRAG_VERT_ONLY("*=", $1.line); $$.line = $1.line; $$.op = EOpMulAssign; }
| DIV_ASSIGN { FRAG_VERT_ONLY("/=", $1.line); $$.line = $1.line; $$.op = EOpDivAssign; }
| MOD_ASSIGN { ES3_ONLY("%=", $1.line);
FRAG_VERT_ONLY("%=", $1.line); $$.line = $1.line; $$.op = EOpIModAssign; }
| ADD_ASSIGN { $$.line = $1.line; $$.op = EOpAddAssign; }
| SUB_ASSIGN { $$.line = $1.line; $$.op = EOpSubAssign; }
| LEFT_ASSIGN { ES3_ONLY("<<=", $1.line);
FRAG_VERT_ONLY("<<=", $1.line); $$.line = $1.line; $$.op = EOpBitShiftLeftAssign; }
| RIGHT_ASSIGN { ES3_ONLY(">>=", $1.line);
FRAG_VERT_ONLY(">>=", $1.line); $$.line = $1.line; $$.op = EOpBitShiftRightAssign; }
| AND_ASSIGN { ES3_ONLY("&=", $1.line);
FRAG_VERT_ONLY("&=", $1.line); $$.line = $1.line; $$.op = EOpBitwiseAndAssign; }
| XOR_ASSIGN { ES3_ONLY("^=", $1.line);
FRAG_VERT_ONLY("^=", $1.line); $$.line = $1.line; $$.op = EOpBitwiseXorAssign; }
| OR_ASSIGN { ES3_ONLY("|=", $1.line);
FRAG_VERT_ONLY("|=", $1.line); $$.line = $1.line; $$.op = EOpBitwiseOrAssign; }
;
expression
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -99,8 +99,14 @@ bool TOutputTraverser::visitBinary(Visit visit, TIntermBinary* node)
case EOpVectorTimesMatrixAssign: out << "matrix mult second child into first child"; break;
case EOpVectorTimesScalarAssign: out << "vector scale second child into first child"; break;
case EOpMatrixTimesScalarAssign: out << "matrix scale second child into first child"; break;
case EOpMatrixTimesMatrixAssign: out << "matrix mult second child into first child"; break;
case EOpMatrixTimesMatrixAssign: out << "matrix mult second child into first child"; break;
case EOpDivAssign: out << "divide second child into first child"; break;
case EOpIModAssign: out << "modulo second child into first child"; break;
case EOpBitShiftLeftAssign: out << "bit-wise shift first child left by second child"; break;
case EOpBitShiftRightAssign: out << "bit-wise shift first child right by second child"; break;
case EOpBitwiseAndAssign: out << "bit-wise and second child into first child"; break;
case EOpBitwiseXorAssign: out << "bit-wise xor second child into first child"; break;
case EOpBitwiseOrAssign: out << "bit-wise or second child into first child"; break;
case EOpIndexDirect: out << "direct index"; break;
case EOpIndexIndirect: out << "indirect index"; break;
case EOpIndexDirectStruct: out << "direct index for structure"; break;
......@@ -110,6 +116,12 @@ bool TOutputTraverser::visitBinary(Visit visit, TIntermBinary* node)
case EOpSub: out << "subtract"; break;
case EOpMul: out << "component-wise multiply"; break;
case EOpDiv: out << "divide"; break;
case EOpIMod: out << "modulo"; break;
case EOpBitShiftLeft: out << "bit-wise shift left"; break;
case EOpBitShiftRight: out << "bit-wise shift right"; break;
case EOpBitwiseAnd: out << "bit-wise and"; break;
case EOpBitwiseXor: out << "bit-wise xor"; break;
case EOpBitwiseOr: out << "bit-wise or"; break;
case EOpEqual: out << "Compare Equal"; break;
case EOpNotEqual: out << "Compare Not Equal"; break;
case EOpLessThan: out << "Compare Less Than"; break;
......@@ -146,6 +158,7 @@ bool TOutputTraverser::visitUnary(Visit visit, TIntermUnary* node)
case EOpNegative: out << "Negate value"; break;
case EOpVectorLogicalNot:
case EOpLogicalNot: out << "Negate conditional"; break;
case EOpBitwiseNot: out << "bit-wise not"; break;
case EOpPostIncrement: out << "Post-Increment"; break;
case EOpPostDecrement: out << "Post-Decrement"; break;
......
......@@ -40,6 +40,7 @@ enum TOperator {
EOpNegative,
EOpLogicalNot,
EOpVectorLogicalNot,
EOpBitwiseNot,
EOpPostIncrement,
EOpPostDecrement,
......@@ -78,6 +79,13 @@ enum TOperator {
EOpLogicalXor,
EOpLogicalAnd,
EOpIMod,
EOpBitShiftLeft,
EOpBitShiftRight,
EOpBitwiseAnd,
EOpBitwiseXor,
EOpBitwiseOr,
EOpIndexDirect,
EOpIndexIndirect,
EOpIndexDirectStruct,
......@@ -210,7 +218,13 @@ enum TOperator {
EOpVectorTimesScalarAssign,
EOpMatrixTimesScalarAssign,
EOpMatrixTimesMatrixAssign,
EOpDivAssign
EOpDivAssign,
EOpIModAssign,
EOpBitShiftLeftAssign,
EOpBitShiftRightAssign,
EOpBitwiseAndAssign,
EOpBitwiseXorAssign,
EOpBitwiseOrAssign
};
extern const char* getOperatorString(TOperator op);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment