Index: src/ia32/code-stubs-ia32.cc |
diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc |
index 3c02872652980e3e48b43bb0ff6e65ea60f33c37..323ee22df5601eb31b1adcd2e22b387736a0bb57 100644 |
--- a/src/ia32/code-stubs-ia32.cc |
+++ b/src/ia32/code-stubs-ia32.cc |
@@ -746,15 +746,24 @@ void TypeRecordingUnaryOpStub::GenerateHeapNumberCodeBitNot( |
__ bind(&try_float); |
if (mode_ == UNARY_NO_OVERWRITE) { |
Label slow_allocate_heapnumber, heapnumber_allocated; |
+ __ mov(ebx, eax); |
__ AllocateHeapNumber(eax, edx, edi, &slow_allocate_heapnumber); |
__ jmp(&heapnumber_allocated); |
__ bind(&slow_allocate_heapnumber); |
__ EnterInternalFrame(); |
- __ push(ecx); |
+ // Push the original HeapNumber on the stack. The integer value can't |
+ // be stored since it's untagged and not in the smi range (so we can't |
+ // smi-tag it). We'll recalculate the value after the GC instead. |
+ __ push(ebx); |
__ CallRuntime(Runtime::kNumberAlloc, 0); |
- __ pop(ecx); |
+ // New HeapNumber is in eax. |
+ __ pop(edx); |
__ LeaveInternalFrame(); |
+ // IntegerConvert uses ebx and edi as scratch registers. |
+ // This conversion won't go slow-case. |
+ IntegerConvert(masm, edx, CpuFeatures::IsSupported(SSE3), slow); |
+ __ not_(ecx); |
__ bind(&heapnumber_allocated); |
} |