| Index: runtime/vm/intrinsifier_ia32.cc
|
| diff --git a/runtime/vm/intrinsifier_ia32.cc b/runtime/vm/intrinsifier_ia32.cc
|
| index 4e2a8e9f34136f7c39aa396f8ce09c303d8e95e4..44dd318073f8b05c216b91d3fa41994dc42e395a 100644
|
| --- a/runtime/vm/intrinsifier_ia32.cc
|
| +++ b/runtime/vm/intrinsifier_ia32.cc
|
| @@ -1441,10 +1441,11 @@ void Intrinsifier::Double_lessEqualThan(Assembler* assembler) {
|
| // Expects left argument to be double (receiver). Right argument is unknown.
|
| // Both arguments are on stack.
|
| static void DoubleArithmeticOperations(Assembler* assembler, Token::Kind kind) {
|
| - Label fall_through;
|
| - TestLastArgumentIsDouble(assembler, &fall_through, &fall_through);
|
| + Label fall_through, is_smi, double_op;
|
| + TestLastArgumentIsDouble(assembler, &is_smi, &fall_through);
|
| // Both arguments are double, right operand is in EAX.
|
| __ movsd(XMM1, FieldAddress(EAX, Double::value_offset()));
|
| + __ Bind(&double_op);
|
| __ movl(EAX, Address(ESP, + 2 * kWordSize)); // Left argument.
|
| __ movsd(XMM0, FieldAddress(EAX, Double::value_offset()));
|
| switch (kind) {
|
| @@ -1463,6 +1464,10 @@ static void DoubleArithmeticOperations(Assembler* assembler, Token::Kind kind) {
|
| EBX);
|
| __ movsd(FieldAddress(EAX, Double::value_offset()), XMM0);
|
| __ ret();
|
| + __ Bind(&is_smi);
|
| + __ SmiUntag(EAX);
|
| + __ cvtsi2sd(XMM1, EAX);
|
| + __ jmp(&double_op);
|
| __ Bind(&fall_through);
|
| }
|
|
|
|
|