Chromium Code Reviews| Index: src/ia32/macro-assembler-ia32.cc |
| =================================================================== |
| --- src/ia32/macro-assembler-ia32.cc (revision 5165) |
| +++ src/ia32/macro-assembler-ia32.cc (working copy) |
| @@ -377,6 +377,12 @@ |
| } |
| +void MacroAssembler::AbortIfSmi(Register object) { |
| + test(object, Immediate(kSmiTagMask)); |
| + Assert(not_equal, "Operand a smi"); |
| +} |
| + |
| + |
| void MacroAssembler::EnterFrame(StackFrame::Type type) { |
| push(ebp); |
| mov(ebp, Operand(esp)); |
| @@ -1497,6 +1503,45 @@ |
| } |
| +void MacroAssembler::JumpIfNotNumber(Register reg, |
| + TypeInfo info, |
| + Label* on_not_number) { |
| + if (FLAG_debug_code) AbortIfSmi(reg); |
| + if (!info.IsNumber()) { |
| + cmp(FieldOperand(reg, HeapObject::kMapOffset), |
| + Factory::heap_number_map()); |
| + j(not_equal, on_not_number); |
| + } |
| +} |
| + |
| + |
| +void MacroAssembler::JumpIfNotInt32(Register reg, |
| + Register scratch, |
| + TypeInfo info, |
| + Label* on_not_int32) { |
| + if (FLAG_debug_code) { |
| + AbortIfSmi(reg); |
| + AbortIfNotNumber(reg); |
| + } |
| + const uint32_t non_smi_exponent = |
| + (HeapNumber::kExponentBias + 30) << HeapNumber::kExponentShift; |
| + if (!info.IsInteger32()) { |
| + bool push_pop = scratch.is(no_reg); |
| + if (push_pop) { |
| + push(reg); |
| + scratch = reg; |
| + } |
| + mov(scratch, FieldOperand(reg, HeapNumber::kExponentOffset)); |
| + and_(scratch, HeapNumber::kExponentMask); |
| + cmp(scratch, non_smi_exponent); |
| + if (push_pop) { |
| + pop(reg); |
| + } |
| + j(greater, on_not_int32); |
|
Lasse Reichstein
2010/08/06 08:20:12
Is this faster than using SSE2 cvttsd2si and check
Erik Corry
2010/08/09 13:13:49
Done.
|
| + } |
| +} |
| + |
| + |
| void MacroAssembler::JumpIfInstanceTypeIsNotSequentialAscii( |
| Register instance_type, |
| Register scratch, |