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) { ...@@ -28,6 +28,12 @@ const char* getOperatorString(TOperator op) {
case EOpAddAssign: return "+="; case EOpAddAssign: return "+=";
case EOpSubAssign: return "-="; case EOpSubAssign: return "-=";
case EOpDivAssign: return "/="; case EOpDivAssign: return "/=";
case EOpIModAssign: return "%=";
case EOpBitShiftLeftAssign: return "<<=";
case EOpBitShiftRightAssign: return ">>=";
case EOpBitwiseAndAssign: return "&=";
case EOpBitwiseXorAssign: return "^=";
case EOpBitwiseOrAssign: return "|=";
// Fall-through. // Fall-through.
case EOpMulAssign: case EOpMulAssign:
...@@ -64,9 +70,16 @@ const char* getOperatorString(TOperator op) { ...@@ -64,9 +70,16 @@ const char* getOperatorString(TOperator op) {
case EOpLogicalOr: return "||"; case EOpLogicalOr: return "||";
case EOpLogicalXor: return "^^"; case EOpLogicalXor: return "^^";
case EOpLogicalAnd: 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 EOpNegative: return "-";
case EOpVectorLogicalNot: return "not"; case EOpVectorLogicalNot: return "not";
case EOpLogicalNot: return "!"; case EOpLogicalNot: return "!";
case EOpBitwiseNot: return "~";
case EOpPostIncrement: return "++"; case EOpPostIncrement: return "++";
case EOpPostDecrement: return "--"; case EOpPostDecrement: return "--";
case EOpPreIncrement: return "++"; case EOpPreIncrement: return "++";
...@@ -589,6 +602,12 @@ bool TIntermOperator::modifiesState() const ...@@ -589,6 +602,12 @@ bool TIntermOperator::modifiesState() const
case EOpMatrixTimesScalarAssign: case EOpMatrixTimesScalarAssign:
case EOpMatrixTimesMatrixAssign: case EOpMatrixTimesMatrixAssign:
case EOpDivAssign: case EOpDivAssign:
case EOpIModAssign:
case EOpBitShiftLeftAssign:
case EOpBitShiftRightAssign:
case EOpBitwiseAndAssign:
case EOpBitwiseXorAssign:
case EOpBitwiseOrAssign:
return true; return true;
default: default:
return false; return false;
...@@ -836,6 +855,12 @@ bool TIntermBinary::promote(TInfoSink& infoSink) ...@@ -836,6 +855,12 @@ bool TIntermBinary::promote(TInfoSink& infoSink)
case EOpAddAssign: case EOpAddAssign:
case EOpSubAssign: case EOpSubAssign:
case EOpDivAssign: case EOpDivAssign:
case EOpIModAssign:
case EOpBitShiftLeftAssign:
case EOpBitShiftRightAssign:
case EOpBitwiseAndAssign:
case EOpBitwiseXorAssign:
case EOpBitwiseOrAssign:
if ((left->isMatrix() && right->isVector()) || if ((left->isMatrix() && right->isVector()) ||
(left->isVector() && right->isMatrix())) (left->isVector() && right->isMatrix()))
return false; return false;
......
...@@ -765,6 +765,10 @@ unary_operator ...@@ -765,6 +765,10 @@ unary_operator
: PLUS { $$.line = $1.line; $$.op = EOpNull; } : PLUS { $$.line = $1.line; $$.op = EOpNull; }
| DASH { $$.line = $1.line; $$.op = EOpNegative; } | DASH { $$.line = $1.line; $$.op = EOpNegative; }
| BANG { $$.line = $1.line; $$.op = EOpLogicalNot; } | 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. // Grammar Note: No '*' or '&' unary ops. Pointers are not supported.
...@@ -788,6 +792,16 @@ multiplicative_expression ...@@ -788,6 +792,16 @@ multiplicative_expression
$$ = $1; $$ = $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 additive_expression
...@@ -812,6 +826,24 @@ additive_expression ...@@ -812,6 +826,24 @@ additive_expression
shift_expression shift_expression
: additive_expression { $$ = $1; } : 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 relational_expression
...@@ -884,14 +916,47 @@ equality_expression ...@@ -884,14 +916,47 @@ equality_expression
and_expression and_expression
: equality_expression { $$ = $1; } : 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 exclusive_or_expression
: and_expression { $$ = $1; } : 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 inclusive_or_expression
: exclusive_or_expression { $$ = $1; } : 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 logical_and_expression
...@@ -972,8 +1037,20 @@ assignment_operator ...@@ -972,8 +1037,20 @@ assignment_operator
: EQUAL { $$.line = $1.line; $$.op = EOpAssign; } : EQUAL { $$.line = $1.line; $$.op = EOpAssign; }
| MUL_ASSIGN { FRAG_VERT_ONLY("*=", $1.line); $$.line = $1.line; $$.op = EOpMulAssign; } | MUL_ASSIGN { FRAG_VERT_ONLY("*=", $1.line); $$.line = $1.line; $$.op = EOpMulAssign; }
| DIV_ASSIGN { FRAG_VERT_ONLY("/=", $1.line); $$.line = $1.line; $$.op = EOpDivAssign; } | 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; } | ADD_ASSIGN { $$.line = $1.line; $$.op = EOpAddAssign; }
| SUB_ASSIGN { $$.line = $1.line; $$.op = EOpSubAssign; } | 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 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) ...@@ -99,8 +99,14 @@ bool TOutputTraverser::visitBinary(Visit visit, TIntermBinary* node)
case EOpVectorTimesMatrixAssign: out << "matrix mult second child into first child"; break; case EOpVectorTimesMatrixAssign: out << "matrix mult second child into first child"; break;
case EOpVectorTimesScalarAssign: out << "vector scale 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 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 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 EOpIndexDirect: out << "direct index"; break;
case EOpIndexIndirect: out << "indirect index"; break; case EOpIndexIndirect: out << "indirect index"; break;
case EOpIndexDirectStruct: out << "direct index for structure"; break; case EOpIndexDirectStruct: out << "direct index for structure"; break;
...@@ -110,6 +116,12 @@ bool TOutputTraverser::visitBinary(Visit visit, TIntermBinary* node) ...@@ -110,6 +116,12 @@ bool TOutputTraverser::visitBinary(Visit visit, TIntermBinary* node)
case EOpSub: out << "subtract"; break; case EOpSub: out << "subtract"; break;
case EOpMul: out << "component-wise multiply"; break; case EOpMul: out << "component-wise multiply"; break;
case EOpDiv: out << "divide"; 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 EOpEqual: out << "Compare Equal"; break;
case EOpNotEqual: out << "Compare Not Equal"; break; case EOpNotEqual: out << "Compare Not Equal"; break;
case EOpLessThan: out << "Compare Less Than"; break; case EOpLessThan: out << "Compare Less Than"; break;
...@@ -146,6 +158,7 @@ bool TOutputTraverser::visitUnary(Visit visit, TIntermUnary* node) ...@@ -146,6 +158,7 @@ bool TOutputTraverser::visitUnary(Visit visit, TIntermUnary* node)
case EOpNegative: out << "Negate value"; break; case EOpNegative: out << "Negate value"; break;
case EOpVectorLogicalNot: case EOpVectorLogicalNot:
case EOpLogicalNot: out << "Negate conditional"; break; case EOpLogicalNot: out << "Negate conditional"; break;
case EOpBitwiseNot: out << "bit-wise not"; break;
case EOpPostIncrement: out << "Post-Increment"; break; case EOpPostIncrement: out << "Post-Increment"; break;
case EOpPostDecrement: out << "Post-Decrement"; break; case EOpPostDecrement: out << "Post-Decrement"; break;
......
...@@ -40,6 +40,7 @@ enum TOperator { ...@@ -40,6 +40,7 @@ enum TOperator {
EOpNegative, EOpNegative,
EOpLogicalNot, EOpLogicalNot,
EOpVectorLogicalNot, EOpVectorLogicalNot,
EOpBitwiseNot,
EOpPostIncrement, EOpPostIncrement,
EOpPostDecrement, EOpPostDecrement,
...@@ -78,6 +79,13 @@ enum TOperator { ...@@ -78,6 +79,13 @@ enum TOperator {
EOpLogicalXor, EOpLogicalXor,
EOpLogicalAnd, EOpLogicalAnd,
EOpIMod,
EOpBitShiftLeft,
EOpBitShiftRight,
EOpBitwiseAnd,
EOpBitwiseXor,
EOpBitwiseOr,
EOpIndexDirect, EOpIndexDirect,
EOpIndexIndirect, EOpIndexIndirect,
EOpIndexDirectStruct, EOpIndexDirectStruct,
...@@ -210,7 +218,13 @@ enum TOperator { ...@@ -210,7 +218,13 @@ enum TOperator {
EOpVectorTimesScalarAssign, EOpVectorTimesScalarAssign,
EOpMatrixTimesScalarAssign, EOpMatrixTimesScalarAssign,
EOpMatrixTimesMatrixAssign, EOpMatrixTimesMatrixAssign,
EOpDivAssign EOpDivAssign,
EOpIModAssign,
EOpBitShiftLeftAssign,
EOpBitShiftRightAssign,
EOpBitwiseAndAssign,
EOpBitwiseXorAssign,
EOpBitwiseOrAssign
}; };
extern const char* getOperatorString(TOperator op); 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