diff --git a/src/processor/postfix_evaluator-inl.h b/src/processor/postfix_evaluator-inl.h index b24f092c..22faf7b2 100644 --- a/src/processor/postfix_evaluator-inl.h +++ b/src/processor/postfix_evaluator-inl.h @@ -83,7 +83,8 @@ bool PostfixEvaluator::EvaluateInternal( BINARY_OP_SUBTRACT, BINARY_OP_MULTIPLY, BINARY_OP_DIVIDE_QUOTIENT, - BINARY_OP_DIVIDE_MODULUS + BINARY_OP_DIVIDE_MODULUS, + BINARY_OP_ALIGN }; BinaryOperation operation = BINARY_OP_NONE; @@ -97,6 +98,8 @@ bool PostfixEvaluator::EvaluateInternal( operation = BINARY_OP_DIVIDE_QUOTIENT; else if (token == "%") operation = BINARY_OP_DIVIDE_MODULUS; + else if (token == "@") + operation = BINARY_OP_ALIGN; if (operation != BINARY_OP_NONE) { // Get the operands. @@ -126,6 +129,10 @@ bool PostfixEvaluator::EvaluateInternal( case BINARY_OP_DIVIDE_MODULUS: result = operand1 % operand2; break; + case BINARY_OP_ALIGN: + result = + operand1 & (reinterpret_cast(-1) ^ (operand2 - 1)); + break; case BINARY_OP_NONE: // This will not happen, but compilers will want a default or // BINARY_OP_NONE case. diff --git a/src/processor/postfix_evaluator.h b/src/processor/postfix_evaluator.h index 24807551..35f79f76 100644 --- a/src/processor/postfix_evaluator.h +++ b/src/processor/postfix_evaluator.h @@ -44,10 +44,12 @@ // either literal values suitable for ValueType, or constants or variables, // which reference the dictionary. The supported binary operators are + // (addition), - (subtraction), * (multiplication), / (quotient of division), -// and % (modulus of division). The unary ^ (dereference) operator is also -// provided. These operators allow any operand to be either a literal -// value, constant, or variable. Assignment (=) of any type of operand into -// a variable is also supported. +// % (modulus of division), and @ (data alignment). The alignment operator (@) +// accepts a value and an alignment size, and produces a result that is a +// multiple of the alignment size by truncating the input value. +// The unary ^ (dereference) operator is also provided. These operators +// allow any operand to be either a literal value, constant, or variable. +// Assignment (=) of any type of operand into a variable is also supported. // // The dictionary is provided as a map with string keys. Keys beginning // with the '$' character are treated as variables. All other keys are diff --git a/src/processor/postfix_evaluator_unittest.cc b/src/processor/postfix_evaluator_unittest.cc index 0c2d8ece..427ee505 100644 --- a/src/processor/postfix_evaluator_unittest.cc +++ b/src/processor/postfix_evaluator_unittest.cc @@ -148,7 +148,8 @@ static bool RunTests() { { "$rSub 9 6 - =", true }, // $rSub = 9 - 6 = 3 { "$rDivQ 9 6 / =", true }, // $rDivQ = 9 / 6 = 1 { "$rDivM 9 6 % =", true }, // $rDivM = 9 % 6 = 3 - { "$rDeref 9 ^ =", true } // $rDeref = ^9 = 10 (FakeMemoryRegion) + { "$rDeref 9 ^ =", true }, // $rDeref = ^9 = 10 (FakeMemoryRegion) + { "$rAlign 36 8 @ =", true }, // $rAlign = 36 @ 8 }; map validate_data_0; validate_data_0["$rAdd"] = 8; @@ -158,6 +159,7 @@ static bool RunTests() { validate_data_0["$rDivQ"] = 1; validate_data_0["$rDivM"] = 3; validate_data_0["$rDeref"] = 10; + validate_data_0["$rAlign"] = 32; // The second test set simulates a couple of MSVC program strings. // The data is fudged a little bit because the tests use FakeMemoryRegion