| Index: runtime/lib/integers.cc
|
| diff --git a/runtime/lib/integers.cc b/runtime/lib/integers.cc
|
| index 5e3287c187a26b667034f5ce8da7cac642b055d4..7bb041e8089140d78068dd8ae106d85600fbe1a9 100644
|
| --- a/runtime/lib/integers.cc
|
| +++ b/runtime/lib/integers.cc
|
| @@ -17,66 +17,6 @@ DEFINE_FLAG(bool, trace_intrinsified_natives, false,
|
|
|
| // Smi natives.
|
|
|
| -static bool Are64bitOperands(const Integer& op1, const Integer& op2) {
|
| - return !op1.IsBigint() && !op2.IsBigint();
|
| -}
|
| -
|
| -
|
| -static RawInteger* IntegerBitOperation(Token::Kind kind,
|
| - const Integer& op1_int,
|
| - const Integer& op2_int) {
|
| - if (op1_int.IsSmi() && op2_int.IsSmi()) {
|
| - Smi& op1 = Smi::Handle();
|
| - Smi& op2 = Smi::Handle();
|
| - op1 ^= op1_int.raw();
|
| - op2 ^= op2_int.raw();
|
| - intptr_t result = 0;
|
| - switch (kind) {
|
| - case Token::kBIT_AND:
|
| - result = op1.Value() & op2.Value();
|
| - break;
|
| - case Token::kBIT_OR:
|
| - result = op1.Value() | op2.Value();
|
| - break;
|
| - case Token::kBIT_XOR:
|
| - result = op1.Value() ^ op2.Value();
|
| - break;
|
| - default:
|
| - UNIMPLEMENTED();
|
| - }
|
| - ASSERT(Smi::IsValid(result));
|
| - return Smi::New(result);
|
| - } else if (Are64bitOperands(op1_int, op2_int)) {
|
| - int64_t a = op1_int.AsInt64Value();
|
| - int64_t b = op2_int.AsInt64Value();
|
| - switch (kind) {
|
| - case Token::kBIT_AND:
|
| - return Integer::New(a & b);
|
| - case Token::kBIT_OR:
|
| - return Integer::New(a | b);
|
| - case Token::kBIT_XOR:
|
| - return Integer::New(a ^ b);
|
| - default:
|
| - UNIMPLEMENTED();
|
| - }
|
| - } else {
|
| - Bigint& op1 = Bigint::Handle(op1_int.AsBigint());
|
| - Bigint& op2 = Bigint::Handle(op2_int.AsBigint());
|
| - switch (kind) {
|
| - case Token::kBIT_AND:
|
| - return BigintOperations::BitAnd(op1, op2);
|
| - case Token::kBIT_OR:
|
| - return BigintOperations::BitOr(op1, op2);
|
| - case Token::kBIT_XOR:
|
| - return BigintOperations::BitXor(op1, op2);
|
| - default:
|
| - UNIMPLEMENTED();
|
| - }
|
| - }
|
| - return Integer::null();
|
| -}
|
| -
|
| -
|
| // Returns false if integer is in wrong representation, e.g., as is a Bigint
|
| // when it could have been a Smi.
|
| static bool CheckInteger(const Integer& i) {
|
| @@ -104,8 +44,8 @@ DEFINE_NATIVE_ENTRY(Integer_bitAndFromInteger, 2) {
|
| OS::Print("Integer_bitAndFromInteger %s & %s\n",
|
| right.ToCString(), left.ToCString());
|
| }
|
| - Integer& result = Integer::Handle(
|
| - IntegerBitOperation(Token::kBIT_AND, left, right));
|
| + Integer& result =
|
| + Integer::Handle(left.BitOp(Token::kBIT_AND, right));
|
| return result.AsInteger();
|
| }
|
|
|
| @@ -119,8 +59,8 @@ DEFINE_NATIVE_ENTRY(Integer_bitOrFromInteger, 2) {
|
| OS::Print("Integer_bitOrFromInteger %s | %s\n",
|
| left.ToCString(), right.ToCString());
|
| }
|
| - Integer& result = Integer::Handle(
|
| - IntegerBitOperation(Token::kBIT_OR, left, right));
|
| + Integer& result =
|
| + Integer::Handle(left.BitOp(Token::kBIT_OR, right));
|
| return result.AsInteger();
|
| }
|
|
|
| @@ -134,8 +74,8 @@ DEFINE_NATIVE_ENTRY(Integer_bitXorFromInteger, 2) {
|
| OS::Print("Integer_bitXorFromInteger %s ^ %s\n",
|
| left.ToCString(), right.ToCString());
|
| }
|
| - Integer& result = Integer::Handle(
|
| - IntegerBitOperation(Token::kBIT_XOR, left, right));
|
| + Integer& result =
|
| + Integer::Handle(left.BitOp(Token::kBIT_XOR, right));
|
| return result.AsInteger();
|
| }
|
|
|
| @@ -149,7 +89,7 @@ DEFINE_NATIVE_ENTRY(Integer_addFromInteger, 2) {
|
| OS::Print("Integer_addFromInteger %s + %s\n",
|
| left_int.ToCString(), right_int.ToCString());
|
| }
|
| - return left_int.BinaryOp(Token::kADD, right_int);
|
| + return left_int.ArithmeticOp(Token::kADD, right_int);
|
| }
|
|
|
|
|
| @@ -162,7 +102,7 @@ DEFINE_NATIVE_ENTRY(Integer_subFromInteger, 2) {
|
| OS::Print("Integer_subFromInteger %s - %s\n",
|
| left_int.ToCString(), right_int.ToCString());
|
| }
|
| - return left_int.BinaryOp(Token::kSUB, right_int);
|
| + return left_int.ArithmeticOp(Token::kSUB, right_int);
|
| }
|
|
|
|
|
| @@ -175,7 +115,7 @@ DEFINE_NATIVE_ENTRY(Integer_mulFromInteger, 2) {
|
| OS::Print("Integer_mulFromInteger %s * %s\n",
|
| left_int.ToCString(), right_int.ToCString());
|
| }
|
| - return left_int.BinaryOp(Token::kMUL, right_int);
|
| + return left_int.ArithmeticOp(Token::kMUL, right_int);
|
| }
|
|
|
|
|
| @@ -185,7 +125,7 @@ DEFINE_NATIVE_ENTRY(Integer_truncDivFromInteger, 2) {
|
| ASSERT(CheckInteger(right_int));
|
| ASSERT(CheckInteger(left_int));
|
| ASSERT(!right_int.IsZero());
|
| - return left_int.BinaryOp(Token::kTRUNCDIV, right_int);
|
| + return left_int.ArithmeticOp(Token::kTRUNCDIV, right_int);
|
| }
|
|
|
|
|
| @@ -202,7 +142,7 @@ DEFINE_NATIVE_ENTRY(Integer_moduloFromInteger, 2) {
|
| // Should have been caught before calling into runtime.
|
| UNIMPLEMENTED();
|
| }
|
| - return left_int.BinaryOp(Token::kMOD, right_int);
|
| + return left_int.ArithmeticOp(Token::kMOD, right_int);
|
| }
|
|
|
|
|
| @@ -232,58 +172,6 @@ DEFINE_NATIVE_ENTRY(Integer_equalToInteger, 2) {
|
| }
|
|
|
|
|
| -static int HighestBit(int64_t v) {
|
| - uint64_t t = static_cast<uint64_t>((v > 0) ? v : -v);
|
| - int count = 0;
|
| - while ((t >>= 1) != 0) {
|
| - count++;
|
| - }
|
| - return count;
|
| -}
|
| -
|
| -
|
| -// TODO(srdjan): Clarify handling of negative right operand in a shift op.
|
| -static RawInteger* SmiShiftOperation(Token::Kind kind,
|
| - const Smi& left,
|
| - const Smi& right) {
|
| - intptr_t result = 0;
|
| - const intptr_t left_value = left.Value();
|
| - const intptr_t right_value = right.Value();
|
| - ASSERT(right_value >= 0);
|
| - switch (kind) {
|
| - case Token::kSHL: {
|
| - if ((left_value == 0) || (right_value == 0)) {
|
| - return left.raw();
|
| - }
|
| - { // Check for overflow.
|
| - int cnt = HighestBit(left_value);
|
| - if ((cnt + right_value) >= Smi::kBits) {
|
| - if ((cnt + right_value) >= Mint::kBits) {
|
| - return BigintOperations::ShiftLeft(
|
| - Bigint::Handle(left.AsBigint()), right_value);
|
| - } else {
|
| - int64_t left_64 = left_value;
|
| - return Integer::New(left_64 << right_value);
|
| - }
|
| - }
|
| - }
|
| - result = left_value << right_value;
|
| - break;
|
| - }
|
| - case Token::kSHR: {
|
| - const intptr_t shift_amount =
|
| - (right_value >= kBitsPerWord) ? (kBitsPerWord - 1) : right_value;
|
| - result = left_value >> shift_amount;
|
| - break;
|
| - }
|
| - default:
|
| - UNIMPLEMENTED();
|
| - }
|
| - ASSERT(Smi::IsValid(result));
|
| - return Smi::New(result);
|
| -}
|
| -
|
| -
|
| static RawInteger* ShiftOperationHelper(Token::Kind kind,
|
| const Integer& value,
|
| const Smi& amount) {
|
| @@ -295,12 +183,12 @@ static RawInteger* ShiftOperationHelper(Token::Kind kind,
|
| if (value.IsSmi()) {
|
| Smi& smi_value = Smi::Handle();
|
| smi_value ^= value.raw();
|
| - return SmiShiftOperation(kind, smi_value, amount);
|
| + return smi_value.ShiftOp(kind, amount);
|
| }
|
| Bigint& big_value = Bigint::Handle();
|
| if (value.IsMint()) {
|
| const int64_t mint_value = value.AsInt64Value();
|
| - const int count = HighestBit(mint_value);
|
| + const int count = Utils::HighestBit(mint_value);
|
| if ((count + amount.Value()) < Mint::kBits) {
|
| switch (kind) {
|
| case Token::kSHL:
|
|
|