| Index: runtime/vm/intrinsifier_ia32.cc
|
| ===================================================================
|
| --- runtime/vm/intrinsifier_ia32.cc (revision 9596)
|
| +++ runtime/vm/intrinsifier_ia32.cc (working copy)
|
| @@ -804,7 +804,8 @@
|
| }
|
|
|
|
|
| -// This is called for Smi, Mint and Bigint receivers. Bigints are not handled.
|
| +// This is called for Smi, Mint and Bigint receivers. The right argument
|
| +// can be Smi, Mint, Bigint or double.
|
| bool Intrinsifier::Integer_equalToInteger(Assembler* assembler) {
|
| Label fall_through, true_label, check_for_mint;
|
| const Bool& bool_true = Bool::ZoneHandle(Bool::True());
|
| @@ -824,20 +825,19 @@
|
| __ LoadObject(EAX, bool_true);
|
| __ ret();
|
|
|
| - // At least one of the arguments was not Smi, inline code for Smi/Mint
|
| - // equality comparison.
|
| + // At least one of the arguments was not Smi.
|
| Label receiver_not_smi;
|
| __ Bind(&check_for_mint);
|
| __ movl(EAX, Address(ESP, + 2 * kWordSize)); // Receiver.
|
| __ testl(EAX, Immediate(kSmiTagMask));
|
| __ j(NOT_ZERO, &receiver_not_smi);
|
|
|
| - // Note that an instance of Mint never contains a value that can be
|
| + // Left (receiver) is Smi, return false if right is not Double.
|
| + // Note that an instance of Mint or Bigint never contains a value that can be
|
| // represented by Smi.
|
| - // Left is Smi, return false if right is Mint, otherwise fall through.
|
| __ movl(EAX, Address(ESP, + 1 * kWordSize)); // Right argument.
|
| - __ CompareClassId(EAX, kMint, EDI);
|
| - __ j(NOT_EQUAL, &fall_through);
|
| + __ CompareClassId(EAX, kDouble, EDI);
|
| + __ j(EQUAL, &fall_through);
|
| __ LoadObject(EAX, bool_false); // Smi == Mint -> false.
|
| __ ret();
|
|
|
| @@ -849,7 +849,7 @@
|
| __ movl(EAX, Address(ESP, + 1 * kWordSize)); // Right argument.
|
| __ testl(EAX, Immediate(kSmiTagMask));
|
| __ j(NOT_ZERO, &fall_through);
|
| - __ LoadObject(EAX, bool_false); // Smi == Mint -> false.
|
| + __ LoadObject(EAX, bool_false);
|
| __ ret();
|
| // TODO(srdjan): Implement Mint == Mint comparison.
|
|
|
| @@ -890,16 +890,13 @@
|
| }
|
|
|
|
|
| +// Argument is Smi (receiver).
|
| bool Intrinsifier::Smi_bitNegate(Assembler* assembler) {
|
| - Label fall_through;
|
| __ movl(EAX, Address(ESP, + 1 * kWordSize)); // Index.
|
| - __ testl(EAX, Immediate(kSmiTagMask));
|
| - __ j(NOT_ZERO, &fall_through, Assembler::kNearJump); // Non-smi.
|
| __ notl(EAX);
|
| __ andl(EAX, Immediate(~kSmiTagMask)); // Remove inverted smi-tag.
|
| __ ret();
|
| - __ Bind(&fall_through);
|
| - return false;
|
| + return true;
|
| }
|
|
|
|
|
| @@ -988,12 +985,12 @@
|
| }
|
|
|
|
|
| -// Expects EAX to contain right argument, left argument is on stack. Left
|
| -// argument is double, right argument is of unknown type.
|
| +// Expects left argument to be double (receiver). Right argument is unknown.
|
| +// Both arguments are on stack.
|
| static bool DoubleArithmeticOperations(Assembler* assembler, Token::Kind kind) {
|
| Label fall_through;
|
| TestLastArgumentIsDouble(assembler, &fall_through, &fall_through);
|
| - // Both arguments are double, right operand is in EAX, class in EBX.
|
| + // Both arguments are double, right operand is in EAX.
|
| __ movsd(XMM1, FieldAddress(EAX, Double::value_offset()));
|
| __ movl(EAX, Address(ESP, + 2 * kWordSize)); // Left argument.
|
| __ movsd(XMM0, FieldAddress(EAX, Double::value_offset()));
|
| @@ -1037,7 +1034,7 @@
|
| }
|
|
|
|
|
| -// Left is double right is integer (bigint or Smi)
|
| +// Left is double right is integer (Bigint, Mint or Smi)
|
| bool Intrinsifier::Double_mulFromInteger(Assembler* assembler) {
|
| Label fall_through;
|
| // Only Smi-s allowed.
|
|
|