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); |
} |