| Index: src/ia32/codegen-ia32.cc
 | 
| ===================================================================
 | 
| --- src/ia32/codegen-ia32.cc	(revision 3334)
 | 
| +++ src/ia32/codegen-ia32.cc	(working copy)
 | 
| @@ -4870,6 +4870,55 @@
 | 
|  }
 | 
|  
 | 
|  
 | 
| +void CodeGenerator::GenerateIsObject(ZoneList<Expression*>* args) {
 | 
| +  // This generates a fast version of:
 | 
| +  // (typeof(arg) === 'object' || %_ClassOf(arg) == 'RegExp')
 | 
| +  ASSERT(args->length() == 1);
 | 
| +  Load(args->at(0));
 | 
| +  Result obj = frame_->Pop();
 | 
| +  obj.ToRegister();
 | 
| +
 | 
| +  __ test(obj.reg(), Immediate(kSmiTagMask));
 | 
| +  destination()->false_target()->Branch(zero);
 | 
| +  __ cmp(obj.reg(), Factory::null_value());
 | 
| +  destination()->true_target()->Branch(equal);
 | 
| +
 | 
| +  Result map = allocator()->Allocate();
 | 
| +  ASSERT(map.is_valid());
 | 
| +  __ mov(map.reg(), FieldOperand(obj.reg(), HeapObject::kMapOffset));
 | 
| +  // Undetectable objects behave like undefined when tested with typeof.
 | 
| +  __ movzx_b(map.reg(), FieldOperand(map.reg(), Map::kBitFieldOffset));
 | 
| +  __ test(map.reg(), Immediate(1 << Map::kIsUndetectable));
 | 
| +  destination()->false_target()->Branch(not_zero);
 | 
| +  __ mov(map.reg(), FieldOperand(obj.reg(), HeapObject::kMapOffset));
 | 
| +  __ movzx_b(map.reg(), FieldOperand(map.reg(), Map::kInstanceTypeOffset));
 | 
| +  __ cmp(map.reg(), FIRST_JS_OBJECT_TYPE);
 | 
| +  destination()->false_target()->Branch(less);
 | 
| +  __ cmp(map.reg(), LAST_JS_OBJECT_TYPE);
 | 
| +  obj.Unuse();
 | 
| +  map.Unuse();
 | 
| +  destination()->Split(less_equal);
 | 
| +}
 | 
| +
 | 
| +
 | 
| +void CodeGenerator::GenerateIsFunction(ZoneList<Expression*>* args) {
 | 
| +  // This generates a fast version of:
 | 
| +  // (%_ClassOf(arg) === 'Function')
 | 
| +  ASSERT(args->length() == 1);
 | 
| +  Load(args->at(0));
 | 
| +  Result obj = frame_->Pop();
 | 
| +  obj.ToRegister();
 | 
| +  __ test(obj.reg(), Immediate(kSmiTagMask));
 | 
| +  destination()->false_target()->Branch(zero);
 | 
| +  Result temp = allocator()->Allocate();
 | 
| +  ASSERT(temp.is_valid());
 | 
| +  __ CmpObjectType(obj.reg(), JS_FUNCTION_TYPE, temp.reg());
 | 
| +  obj.Unuse();
 | 
| +  temp.Unuse();
 | 
| +  destination()->Split(equal);
 | 
| +}
 | 
| +
 | 
| +
 | 
|  void CodeGenerator::GenerateIsConstructCall(ZoneList<Expression*>* args) {
 | 
|    ASSERT(args->length() == 0);
 | 
|  
 | 
| 
 |