| OLD | NEW | 
|---|
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. | 
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without | 
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are | 
| 4 // met: | 4 // met: | 
| 5 // | 5 // | 
| 6 //     * Redistributions of source code must retain the above copyright | 6 //     * Redistributions of source code must retain the above copyright | 
| 7 //       notice, this list of conditions and the following disclaimer. | 7 //       notice, this list of conditions and the following disclaimer. | 
| 8 //     * Redistributions in binary form must reproduce the above | 8 //     * Redistributions in binary form must reproduce the above | 
| 9 //       copyright notice, this list of conditions and the following | 9 //       copyright notice, this list of conditions and the following | 
| 10 //       disclaimer in the documentation and/or other materials provided | 10 //       disclaimer in the documentation and/or other materials provided | 
| (...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 275     __ lw(dst, FieldMemOperand(dst, offset)); | 275     __ lw(dst, FieldMemOperand(dst, offset)); | 
| 276   } | 276   } | 
| 277 } | 277 } | 
| 278 | 278 | 
| 279 | 279 | 
| 280 void StubCompiler::GenerateLoadArrayLength(MacroAssembler* masm, | 280 void StubCompiler::GenerateLoadArrayLength(MacroAssembler* masm, | 
| 281                                            Register receiver, | 281                                            Register receiver, | 
| 282                                            Register scratch, | 282                                            Register scratch, | 
| 283                                            Label* miss_label) { | 283                                            Label* miss_label) { | 
| 284   // Check that the receiver isn't a smi. | 284   // Check that the receiver isn't a smi. | 
| 285   __ And(scratch, receiver, Operand(kSmiTagMask)); | 285   __ JumpIfSmi(receiver, miss_label); | 
| 286   __ Branch(miss_label, eq, scratch, Operand(zero_reg)); |  | 
| 287 | 286 | 
| 288   // Check that the object is a JS array. | 287   // Check that the object is a JS array. | 
| 289   __ GetObjectType(receiver, scratch, scratch); | 288   __ GetObjectType(receiver, scratch, scratch); | 
| 290   __ Branch(miss_label, ne, scratch, Operand(JS_ARRAY_TYPE)); | 289   __ Branch(miss_label, ne, scratch, Operand(JS_ARRAY_TYPE)); | 
| 291 | 290 | 
| 292   // Load length directly from the JS array. | 291   // Load length directly from the JS array. | 
| 293   __ lw(v0, FieldMemOperand(receiver, JSArray::kLengthOffset)); | 292   __ lw(v0, FieldMemOperand(receiver, JSArray::kLengthOffset)); | 
| 294   __ Ret(); | 293   __ Ret(); | 
| 295 } | 294 } | 
| 296 | 295 | 
| (...skipping 796 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1093 void StubCompiler::GenerateLoadField(Handle<JSObject> object, | 1092 void StubCompiler::GenerateLoadField(Handle<JSObject> object, | 
| 1094                                      Handle<JSObject> holder, | 1093                                      Handle<JSObject> holder, | 
| 1095                                      Register receiver, | 1094                                      Register receiver, | 
| 1096                                      Register scratch1, | 1095                                      Register scratch1, | 
| 1097                                      Register scratch2, | 1096                                      Register scratch2, | 
| 1098                                      Register scratch3, | 1097                                      Register scratch3, | 
| 1099                                      int index, | 1098                                      int index, | 
| 1100                                      Handle<String> name, | 1099                                      Handle<String> name, | 
| 1101                                      Label* miss) { | 1100                                      Label* miss) { | 
| 1102   // Check that the receiver isn't a smi. | 1101   // Check that the receiver isn't a smi. | 
| 1103   __ And(scratch1, receiver, Operand(kSmiTagMask)); | 1102   __ JumpIfSmi(receiver, miss); | 
| 1104   __ Branch(miss, eq, scratch1, Operand(zero_reg)); |  | 
| 1105 | 1103 | 
| 1106   // Check that the maps haven't changed. | 1104   // Check that the maps haven't changed. | 
| 1107   Register reg = CheckPrototypes( | 1105   Register reg = CheckPrototypes( | 
| 1108       object, receiver, holder, scratch1, scratch2, scratch3, name, miss); | 1106       object, receiver, holder, scratch1, scratch2, scratch3, name, miss); | 
| 1109   GenerateFastPropertyLoad(masm(), v0, reg, holder, index); | 1107   GenerateFastPropertyLoad(masm(), v0, reg, holder, index); | 
| 1110   __ Ret(); | 1108   __ Ret(); | 
| 1111 } | 1109 } | 
| 1112 | 1110 | 
| 1113 | 1111 | 
| 1114 void StubCompiler::GenerateLoadConstant(Handle<JSObject> object, | 1112 void StubCompiler::GenerateLoadConstant(Handle<JSObject> object, | 
| (...skipping 1142 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2257   Label miss; | 2255   Label miss; | 
| 2258 | 2256 | 
| 2259   GenerateNameCheck(name, &miss); | 2257   GenerateNameCheck(name, &miss); | 
| 2260 | 2258 | 
| 2261   // Get the receiver from the stack. | 2259   // Get the receiver from the stack. | 
| 2262   const int argc = arguments().immediate(); | 2260   const int argc = arguments().immediate(); | 
| 2263   __ lw(a1, MemOperand(sp, argc * kPointerSize)); | 2261   __ lw(a1, MemOperand(sp, argc * kPointerSize)); | 
| 2264 | 2262 | 
| 2265   // Check that the receiver isn't a smi. | 2263   // Check that the receiver isn't a smi. | 
| 2266   if (check != NUMBER_CHECK) { | 2264   if (check != NUMBER_CHECK) { | 
| 2267     __ And(t1, a1, Operand(kSmiTagMask)); | 2265     __ JumpIfSmi(a1, &miss); | 
| 2268     __ Branch(&miss, eq, t1, Operand(zero_reg)); |  | 
| 2269   } | 2266   } | 
| 2270 | 2267 | 
| 2271   // Make sure that it's okay not to patch the on stack receiver | 2268   // Make sure that it's okay not to patch the on stack receiver | 
| 2272   // unless we're doing a receiver map check. | 2269   // unless we're doing a receiver map check. | 
| 2273   ASSERT(!object->IsGlobalObject() || check == RECEIVER_MAP_CHECK); | 2270   ASSERT(!object->IsGlobalObject() || check == RECEIVER_MAP_CHECK); | 
| 2274   switch (check) { | 2271   switch (check) { | 
| 2275     case RECEIVER_MAP_CHECK: | 2272     case RECEIVER_MAP_CHECK: | 
| 2276       __ IncrementCounter(masm()->isolate()->counters()->call_const(), | 2273       __ IncrementCounter(masm()->isolate()->counters()->call_const(), | 
| 2277           1, a0, a3); | 2274           1, a0, a3); | 
| 2278 | 2275 | 
| (...skipping 24 matching lines...) Expand all  Loading... | 
| 2303         // Calling non-strict non-builtins with a value as the receiver | 2300         // Calling non-strict non-builtins with a value as the receiver | 
| 2304         // requires boxing. | 2301         // requires boxing. | 
| 2305         __ jmp(&miss); | 2302         __ jmp(&miss); | 
| 2306       } | 2303       } | 
| 2307       break; | 2304       break; | 
| 2308 | 2305 | 
| 2309     case NUMBER_CHECK: | 2306     case NUMBER_CHECK: | 
| 2310       if (function->IsBuiltin() || function->shared()->strict_mode()) { | 2307       if (function->IsBuiltin() || function->shared()->strict_mode()) { | 
| 2311       Label fast; | 2308       Label fast; | 
| 2312         // Check that the object is a smi or a heap number. | 2309         // Check that the object is a smi or a heap number. | 
| 2313         __ And(t1, a1, Operand(kSmiTagMask)); | 2310         __ JumpIfSmi(a1, &fast); | 
| 2314         __ Branch(&fast, eq, t1, Operand(zero_reg)); |  | 
| 2315         __ GetObjectType(a1, a0, a0); | 2311         __ GetObjectType(a1, a0, a0); | 
| 2316         __ Branch(&miss, ne, a0, Operand(HEAP_NUMBER_TYPE)); | 2312         __ Branch(&miss, ne, a0, Operand(HEAP_NUMBER_TYPE)); | 
| 2317         __ bind(&fast); | 2313         __ bind(&fast); | 
| 2318         // Check that the maps starting from the prototype haven't changed. | 2314         // Check that the maps starting from the prototype haven't changed. | 
| 2319         GenerateDirectLoadGlobalFunctionPrototype( | 2315         GenerateDirectLoadGlobalFunctionPrototype( | 
| 2320             masm(), Context::NUMBER_FUNCTION_INDEX, a0, &miss); | 2316             masm(), Context::NUMBER_FUNCTION_INDEX, a0, &miss); | 
| 2321         CheckPrototypes( | 2317         CheckPrototypes( | 
| 2322             Handle<JSObject>(JSObject::cast(object->GetPrototype())), | 2318             Handle<JSObject>(JSObject::cast(object->GetPrototype())), | 
| 2323             a0, holder, a3, a1, t0, name, &miss); | 2319             a0, holder, a3, a1, t0, name, &miss); | 
| 2324       } else { | 2320       } else { | 
| (...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2768   //  -- a0    : receiver | 2764   //  -- a0    : receiver | 
| 2769   //  -- a2    : name | 2765   //  -- a2    : name | 
| 2770   //  -- ra    : return address | 2766   //  -- ra    : return address | 
| 2771   // ----------------------------------- | 2767   // ----------------------------------- | 
| 2772   Label miss; | 2768   Label miss; | 
| 2773 | 2769 | 
| 2774   // If the object is the holder then we know that it's a global | 2770   // If the object is the holder then we know that it's a global | 
| 2775   // object which can only happen for contextual calls. In this case, | 2771   // object which can only happen for contextual calls. In this case, | 
| 2776   // the receiver cannot be a smi. | 2772   // the receiver cannot be a smi. | 
| 2777   if (!object.is_identical_to(holder)) { | 2773   if (!object.is_identical_to(holder)) { | 
| 2778     __ And(t0, a0, Operand(kSmiTagMask)); | 2774     __ JumpIfSmi(a0, &miss); | 
| 2779     __ Branch(&miss, eq, t0, Operand(zero_reg)); |  | 
| 2780   } | 2775   } | 
| 2781 | 2776 | 
| 2782   // Check that the map of the global has not changed. | 2777   // Check that the map of the global has not changed. | 
| 2783   CheckPrototypes(object, a0, holder, a3, t0, a1, name, &miss); | 2778   CheckPrototypes(object, a0, holder, a3, t0, a1, name, &miss); | 
| 2784 | 2779 | 
| 2785   // Get the value from the cell. | 2780   // Get the value from the cell. | 
| 2786   __ li(a3, Operand(cell)); | 2781   __ li(a3, Operand(cell)); | 
| 2787   __ lw(t0, FieldMemOperand(a3, JSGlobalPropertyCell::kValueOffset)); | 2782   __ lw(t0, FieldMemOperand(a3, JSGlobalPropertyCell::kValueOffset)); | 
| 2788 | 2783 | 
| 2789   // Check for deleted property if property can actually be deleted. | 2784   // Check for deleted property if property can actually be deleted. | 
| (...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3129   // code for the function thereby hitting the break points. | 3124   // code for the function thereby hitting the break points. | 
| 3130   __ lw(t5, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset)); | 3125   __ lw(t5, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset)); | 
| 3131   __ lw(a2, FieldMemOperand(t5, SharedFunctionInfo::kDebugInfoOffset)); | 3126   __ lw(a2, FieldMemOperand(t5, SharedFunctionInfo::kDebugInfoOffset)); | 
| 3132   __ Branch(&generic_stub_call, ne, a2, Operand(t7)); | 3127   __ Branch(&generic_stub_call, ne, a2, Operand(t7)); | 
| 3133 #endif | 3128 #endif | 
| 3134 | 3129 | 
| 3135   // Load the initial map and verify that it is in fact a map. | 3130   // Load the initial map and verify that it is in fact a map. | 
| 3136   // a1: constructor function | 3131   // a1: constructor function | 
| 3137   // t7: undefined | 3132   // t7: undefined | 
| 3138   __ lw(a2, FieldMemOperand(a1, JSFunction::kPrototypeOrInitialMapOffset)); | 3133   __ lw(a2, FieldMemOperand(a1, JSFunction::kPrototypeOrInitialMapOffset)); | 
| 3139   __ And(t0, a2, Operand(kSmiTagMask)); | 3134   __ JumpIfSmi(a2, &generic_stub_call); | 
| 3140   __ Branch(&generic_stub_call, eq, t0, Operand(zero_reg)); |  | 
| 3141   __ GetObjectType(a2, a3, t0); | 3135   __ GetObjectType(a2, a3, t0); | 
| 3142   __ Branch(&generic_stub_call, ne, t0, Operand(MAP_TYPE)); | 3136   __ Branch(&generic_stub_call, ne, t0, Operand(MAP_TYPE)); | 
| 3143 | 3137 | 
| 3144 #ifdef DEBUG | 3138 #ifdef DEBUG | 
| 3145   // Cannot construct functions this way. | 3139   // Cannot construct functions this way. | 
| 3146   // a0: argc | 3140   // a0: argc | 
| 3147   // a1: constructor function | 3141   // a1: constructor function | 
| 3148   // a2: initial map | 3142   // a2: initial map | 
| 3149   // t7: undefined | 3143   // t7: undefined | 
| 3150   __ lbu(a3, FieldMemOperand(a2, Map::kInstanceTypeOffset)); | 3144   __ lbu(a3, FieldMemOperand(a2, Map::kInstanceTypeOffset)); | 
| (...skipping 1172 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4323   Handle<Code> ic_miss = masm->isolate()->builtins()->KeyedStoreIC_Miss(); | 4317   Handle<Code> ic_miss = masm->isolate()->builtins()->KeyedStoreIC_Miss(); | 
| 4324   __ Jump(ic_miss, RelocInfo::CODE_TARGET); | 4318   __ Jump(ic_miss, RelocInfo::CODE_TARGET); | 
| 4325 } | 4319 } | 
| 4326 | 4320 | 
| 4327 | 4321 | 
| 4328 #undef __ | 4322 #undef __ | 
| 4329 | 4323 | 
| 4330 } }  // namespace v8::internal | 4324 } }  // namespace v8::internal | 
| 4331 | 4325 | 
| 4332 #endif  // V8_TARGET_ARCH_MIPS | 4326 #endif  // V8_TARGET_ARCH_MIPS | 
| OLD | NEW | 
|---|