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 |