Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(675)

Side by Side Diff: src/arm/stub-cache-arm.cc

Issue 8383033: Handlify simple functions of [keyed] load stub compiler. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Address comments Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | src/ia32/stub-cache-ia32.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 507 matching lines...) Expand 10 before | Expand all | Expand 10 after
518 } 518 }
519 519
520 // Return the value (register r0). 520 // Return the value (register r0).
521 __ bind(&exit); 521 __ bind(&exit);
522 __ Ret(); 522 __ Ret();
523 } 523 }
524 524
525 525
526 void StubCompiler::GenerateLoadMiss(MacroAssembler* masm, Code::Kind kind) { 526 void StubCompiler::GenerateLoadMiss(MacroAssembler* masm, Code::Kind kind) {
527 ASSERT(kind == Code::LOAD_IC || kind == Code::KEYED_LOAD_IC); 527 ASSERT(kind == Code::LOAD_IC || kind == Code::KEYED_LOAD_IC);
528 Code* code = NULL; 528 Handle<Code> code = (kind == Code::LOAD_IC)
529 if (kind == Code::LOAD_IC) { 529 ? masm->isolate()->builtins()->LoadIC_Miss()
530 code = masm->isolate()->builtins()->builtin(Builtins::kLoadIC_Miss); 530 : masm->isolate()->builtins()->KeyedLoadIC_Miss();
531 } else { 531 __ Jump(code, RelocInfo::CODE_TARGET);
532 code = masm->isolate()->builtins()->builtin(Builtins::kKeyedLoadIC_Miss);
533 }
534
535 Handle<Code> ic(code);
536 __ Jump(ic, RelocInfo::CODE_TARGET);
537 } 532 }
538 533
539 534
540 static void GenerateCallFunction(MacroAssembler* masm, 535 static void GenerateCallFunction(MacroAssembler* masm,
541 Handle<Object> object, 536 Handle<Object> object,
542 const ParameterCount& arguments, 537 const ParameterCount& arguments,
543 Label* miss, 538 Label* miss,
544 Code::ExtraICState extra_ic_state) { 539 Code::ExtraICState extra_ic_state) {
545 // ----------- S t a t e ------------- 540 // ----------- S t a t e -------------
546 // -- r0: receiver 541 // -- r0: receiver
(...skipping 821 matching lines...) Expand 10 before | Expand all | Expand 10 after
1368 name, 1363 name,
1369 scratch1, 1364 scratch1,
1370 miss); 1365 miss);
1371 if (result->IsFailure()) set_failure(Failure::cast(result)); 1366 if (result->IsFailure()) set_failure(Failure::cast(result));
1372 1367
1373 // Return the register containing the holder. 1368 // Return the register containing the holder.
1374 return reg; 1369 return reg;
1375 } 1370 }
1376 1371
1377 1372
1378 void StubCompiler::GenerateLoadField(JSObject* object, 1373 void StubCompiler::GenerateLoadField(Handle<JSObject> object,
1379 JSObject* holder, 1374 Handle<JSObject> holder,
1380 Register receiver, 1375 Register receiver,
1381 Register scratch1, 1376 Register scratch1,
1382 Register scratch2, 1377 Register scratch2,
1383 Register scratch3, 1378 Register scratch3,
1384 int index, 1379 int index,
1385 String* name, 1380 Handle<String> name,
1386 Label* miss) { 1381 Label* miss) {
1387 // Check that the receiver isn't a smi. 1382 // Check that the receiver isn't a smi.
1388 __ JumpIfSmi(receiver, miss); 1383 __ JumpIfSmi(receiver, miss);
1389 1384
1390 // Check that the maps haven't changed. 1385 // Check that the maps haven't changed.
1391 Register reg = 1386 Register reg = CheckPrototypes(
1392 CheckPrototypes(object, receiver, holder, scratch1, scratch2, scratch3, 1387 object, receiver, holder, scratch1, scratch2, scratch3, name, miss);
1393 name, miss); 1388 GenerateFastPropertyLoad(masm(), r0, reg, holder, index);
1394 GenerateFastPropertyLoad(masm(), r0, reg, Handle<JSObject>(holder), index);
1395 __ Ret(); 1389 __ Ret();
1396 } 1390 }
1397 1391
1398 1392
1399 void StubCompiler::GenerateLoadConstant(JSObject* object, 1393 void StubCompiler::GenerateLoadConstant(Handle<JSObject> object,
1400 JSObject* holder, 1394 Handle<JSObject> holder,
1401 Register receiver, 1395 Register receiver,
1402 Register scratch1, 1396 Register scratch1,
1403 Register scratch2, 1397 Register scratch2,
1404 Register scratch3, 1398 Register scratch3,
1405 Object* value, 1399 Handle<Object> value,
1406 String* name, 1400 Handle<String> name,
1407 Label* miss) { 1401 Label* miss) {
1408 // Check that the receiver isn't a smi. 1402 // Check that the receiver isn't a smi.
1409 __ JumpIfSmi(receiver, miss); 1403 __ JumpIfSmi(receiver, miss);
1410 1404
1411 // Check that the maps haven't changed. 1405 // Check that the maps haven't changed.
1412 CheckPrototypes(object, receiver, holder, scratch1, scratch2, scratch3, name, 1406 CheckPrototypes(
1413 miss); 1407 object, receiver, holder, scratch1, scratch2, scratch3, name, miss);
1414 1408
1415 // Return the constant value. 1409 // Return the constant value.
1416 __ mov(r0, Operand(Handle<Object>(value))); 1410 __ mov(r0, Operand(value));
1417 __ Ret(); 1411 __ Ret();
1418 } 1412 }
1419 1413
1420 1414
1421 MaybeObject* StubCompiler::GenerateLoadCallback(JSObject* object, 1415 MaybeObject* StubCompiler::GenerateLoadCallback(JSObject* object,
1422 JSObject* holder, 1416 JSObject* holder,
1423 Register receiver, 1417 Register receiver,
1424 Register name_reg, 1418 Register name_reg,
1425 Register scratch1, 1419 Register scratch1,
1426 Register scratch2, 1420 Register scratch2,
(...skipping 1569 matching lines...) Expand 10 before | Expand all | Expand 10 after
2996 __ bind(&miss); 2990 __ bind(&miss);
2997 __ IncrementCounter(counters->named_store_global_inline_miss(), 1, r4, r3); 2991 __ IncrementCounter(counters->named_store_global_inline_miss(), 1, r4, r3);
2998 Handle<Code> ic = masm()->isolate()->builtins()->StoreIC_Miss(); 2992 Handle<Code> ic = masm()->isolate()->builtins()->StoreIC_Miss();
2999 __ Jump(ic, RelocInfo::CODE_TARGET); 2993 __ Jump(ic, RelocInfo::CODE_TARGET);
3000 2994
3001 // Return the generated code. 2995 // Return the generated code.
3002 return GetCode(NORMAL, name); 2996 return GetCode(NORMAL, name);
3003 } 2997 }
3004 2998
3005 2999
3006 MaybeObject* LoadStubCompiler::CompileLoadNonexistent(String* name, 3000 Handle<Code> LoadStubCompiler::CompileLoadNonexistent(Handle<String> name,
3007 JSObject* object, 3001 Handle<JSObject> object,
3008 JSObject* last) { 3002 Handle<JSObject> last) {
3009 // ----------- S t a t e ------------- 3003 // ----------- S t a t e -------------
3010 // -- r0 : receiver 3004 // -- r0 : receiver
3011 // -- lr : return address 3005 // -- lr : return address
3012 // ----------------------------------- 3006 // -----------------------------------
3013 Label miss; 3007 Label miss;
3014 3008
3015 // Check that receiver is not a smi. 3009 // Check that receiver is not a smi.
3016 __ JumpIfSmi(r0, &miss); 3010 __ JumpIfSmi(r0, &miss);
3017 3011
3018 // Check the maps of the full prototype chain. 3012 // Check the maps of the full prototype chain.
3019 CheckPrototypes(object, r0, last, r3, r1, r4, name, &miss); 3013 CheckPrototypes(object, r0, last, r3, r1, r4, name, &miss);
3020 3014
3021 // If the last object in the prototype chain is a global object, 3015 // If the last object in the prototype chain is a global object,
3022 // check that the global property cell is empty. 3016 // check that the global property cell is empty.
3023 if (last->IsGlobalObject()) { 3017 if (last->IsGlobalObject()) {
3024 MaybeObject* cell = TryGenerateCheckPropertyCell(masm(), 3018 GenerateCheckPropertyCell(
3025 GlobalObject::cast(last), 3019 masm(), Handle<GlobalObject>::cast(last), name, r1, &miss);
3026 name,
3027 r1,
3028 &miss);
3029 if (cell->IsFailure()) {
3030 miss.Unuse();
3031 return cell;
3032 }
3033 } 3020 }
3034 3021
3035 // Return undefined if maps of the full prototype chain are still the 3022 // Return undefined if maps of the full prototype chain are still the
3036 // same and no global property with this name contains a value. 3023 // same and no global property with this name contains a value.
3037 __ LoadRoot(r0, Heap::kUndefinedValueRootIndex); 3024 __ LoadRoot(r0, Heap::kUndefinedValueRootIndex);
3038 __ Ret(); 3025 __ Ret();
3039 3026
3040 __ bind(&miss); 3027 __ bind(&miss);
3041 GenerateLoadMiss(masm(), Code::LOAD_IC); 3028 GenerateLoadMiss(masm(), Code::LOAD_IC);
3042 3029
3043 // Return the generated code. 3030 // Return the generated code.
3044 return GetCode(NONEXISTENT, heap()->empty_string()); 3031 return GetCode(NONEXISTENT, factory()->empty_string());
3045 } 3032 }
3046 3033
3047 3034
3048 MaybeObject* LoadStubCompiler::CompileLoadField(JSObject* object, 3035 Handle<Code> LoadStubCompiler::CompileLoadField(Handle<JSObject> object,
3049 JSObject* holder, 3036 Handle<JSObject> holder,
3050 int index, 3037 int index,
3051 String* name) { 3038 Handle<String> name) {
3052 // ----------- S t a t e ------------- 3039 // ----------- S t a t e -------------
3053 // -- r0 : receiver 3040 // -- r0 : receiver
3054 // -- r2 : name 3041 // -- r2 : name
3055 // -- lr : return address 3042 // -- lr : return address
3056 // ----------------------------------- 3043 // -----------------------------------
3057 Label miss; 3044 Label miss;
3058 3045
3059 GenerateLoadField(object, holder, r0, r3, r1, r4, index, name, &miss); 3046 GenerateLoadField(object, holder, r0, r3, r1, r4, index, name, &miss);
3060 __ bind(&miss); 3047 __ bind(&miss);
3061 GenerateLoadMiss(masm(), Code::LOAD_IC); 3048 GenerateLoadMiss(masm(), Code::LOAD_IC);
(...skipping 18 matching lines...) Expand all
3080 callback, name, &miss); 3067 callback, name, &miss);
3081 if (result->IsFailure()) { 3068 if (result->IsFailure()) {
3082 miss.Unuse(); 3069 miss.Unuse();
3083 return result; 3070 return result;
3084 } 3071 }
3085 3072
3086 __ bind(&miss); 3073 __ bind(&miss);
3087 GenerateLoadMiss(masm(), Code::LOAD_IC); 3074 GenerateLoadMiss(masm(), Code::LOAD_IC);
3088 3075
3089 // Return the generated code. 3076 // Return the generated code.
3090 return GetCode(CALLBACKS, name); 3077 return TryGetCode(CALLBACKS, name);
3091 } 3078 }
3092 3079
3093 3080
3094 MaybeObject* LoadStubCompiler::CompileLoadConstant(JSObject* object, 3081 Handle<Code> LoadStubCompiler::CompileLoadConstant(Handle<JSObject> object,
3095 JSObject* holder, 3082 Handle<JSObject> holder,
3096 Object* value, 3083 Handle<Object> value,
3097 String* name) { 3084 Handle<String> name) {
3098 // ----------- S t a t e ------------- 3085 // ----------- S t a t e -------------
3099 // -- r0 : receiver 3086 // -- r0 : receiver
3100 // -- r2 : name 3087 // -- r2 : name
3101 // -- lr : return address 3088 // -- lr : return address
3102 // ----------------------------------- 3089 // -----------------------------------
3103 Label miss; 3090 Label miss;
3104 3091
3105 GenerateLoadConstant(object, holder, r0, r3, r1, r4, value, name, &miss); 3092 GenerateLoadConstant(object, holder, r0, r3, r1, r4, value, name, &miss);
3106 __ bind(&miss); 3093 __ bind(&miss);
3107 GenerateLoadMiss(masm(), Code::LOAD_IC); 3094 GenerateLoadMiss(masm(), Code::LOAD_IC);
(...skipping 22 matching lines...) Expand all
3130 r2, 3117 r2,
3131 r3, 3118 r3,
3132 r1, 3119 r1,
3133 r4, 3120 r4,
3134 name, 3121 name,
3135 &miss); 3122 &miss);
3136 __ bind(&miss); 3123 __ bind(&miss);
3137 GenerateLoadMiss(masm(), Code::LOAD_IC); 3124 GenerateLoadMiss(masm(), Code::LOAD_IC);
3138 3125
3139 // Return the generated code. 3126 // Return the generated code.
3140 return GetCode(INTERCEPTOR, name); 3127 return TryGetCode(INTERCEPTOR, name);
3141 } 3128 }
3142 3129
3143 3130
3144 MaybeObject* LoadStubCompiler::CompileLoadGlobal(JSObject* object, 3131 MaybeObject* LoadStubCompiler::CompileLoadGlobal(JSObject* object,
3145 GlobalObject* holder, 3132 GlobalObject* holder,
3146 JSGlobalPropertyCell* cell, 3133 JSGlobalPropertyCell* cell,
3147 String* name, 3134 String* name,
3148 bool is_dont_delete) { 3135 bool is_dont_delete) {
3149 // ----------- S t a t e ------------- 3136 // ----------- S t a t e -------------
3150 // -- r0 : receiver 3137 // -- r0 : receiver
(...skipping 26 matching lines...) Expand all
3177 __ mov(r0, r4); 3164 __ mov(r0, r4);
3178 Counters* counters = masm()->isolate()->counters(); 3165 Counters* counters = masm()->isolate()->counters();
3179 __ IncrementCounter(counters->named_load_global_stub(), 1, r1, r3); 3166 __ IncrementCounter(counters->named_load_global_stub(), 1, r1, r3);
3180 __ Ret(); 3167 __ Ret();
3181 3168
3182 __ bind(&miss); 3169 __ bind(&miss);
3183 __ IncrementCounter(counters->named_load_global_stub_miss(), 1, r1, r3); 3170 __ IncrementCounter(counters->named_load_global_stub_miss(), 1, r1, r3);
3184 GenerateLoadMiss(masm(), Code::LOAD_IC); 3171 GenerateLoadMiss(masm(), Code::LOAD_IC);
3185 3172
3186 // Return the generated code. 3173 // Return the generated code.
3187 return GetCode(NORMAL, name); 3174 return TryGetCode(NORMAL, name);
3188 } 3175 }
3189 3176
3190 3177
3191 MaybeObject* KeyedLoadStubCompiler::CompileLoadField(String* name, 3178 Handle<Code> KeyedLoadStubCompiler::CompileLoadField(Handle<String> name,
3192 JSObject* receiver, 3179 Handle<JSObject> receiver,
3193 JSObject* holder, 3180 Handle<JSObject> holder,
3194 int index) { 3181 int index) {
3195 // ----------- S t a t e ------------- 3182 // ----------- S t a t e -------------
3196 // -- lr : return address 3183 // -- lr : return address
3197 // -- r0 : key 3184 // -- r0 : key
3198 // -- r1 : receiver 3185 // -- r1 : receiver
3199 // ----------------------------------- 3186 // -----------------------------------
3200 Label miss; 3187 Label miss;
3201 3188
3202 // Check the key is the cached one. 3189 // Check the key is the cached one.
3203 __ cmp(r0, Operand(Handle<String>(name))); 3190 __ cmp(r0, Operand(name));
3204 __ b(ne, &miss); 3191 __ b(ne, &miss);
3205 3192
3206 GenerateLoadField(receiver, holder, r1, r2, r3, r4, index, name, &miss); 3193 GenerateLoadField(receiver, holder, r1, r2, r3, r4, index, name, &miss);
3207 __ bind(&miss); 3194 __ bind(&miss);
3208 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); 3195 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
3209 3196
3210 return GetCode(FIELD, name); 3197 return GetCode(FIELD, name);
3211 } 3198 }
3212 3199
3213 3200
(...skipping 16 matching lines...) Expand all
3230 MaybeObject* result = GenerateLoadCallback(receiver, holder, r1, r0, r2, r3, 3217 MaybeObject* result = GenerateLoadCallback(receiver, holder, r1, r0, r2, r3,
3231 r4, callback, name, &miss); 3218 r4, callback, name, &miss);
3232 if (result->IsFailure()) { 3219 if (result->IsFailure()) {
3233 miss.Unuse(); 3220 miss.Unuse();
3234 return result; 3221 return result;
3235 } 3222 }
3236 3223
3237 __ bind(&miss); 3224 __ bind(&miss);
3238 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); 3225 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
3239 3226
3240 return GetCode(CALLBACKS, name); 3227 return TryGetCode(CALLBACKS, name);
3241 } 3228 }
3242 3229
3243 3230
3244 MaybeObject* KeyedLoadStubCompiler::CompileLoadConstant(String* name, 3231 Handle<Code> KeyedLoadStubCompiler::CompileLoadConstant(
3245 JSObject* receiver, 3232 Handle<String> name,
3246 JSObject* holder, 3233 Handle<JSObject> receiver,
3247 Object* value) { 3234 Handle<JSObject> holder,
3235 Handle<Object> value) {
3248 // ----------- S t a t e ------------- 3236 // ----------- S t a t e -------------
3249 // -- lr : return address 3237 // -- lr : return address
3250 // -- r0 : key 3238 // -- r0 : key
3251 // -- r1 : receiver 3239 // -- r1 : receiver
3252 // ----------------------------------- 3240 // -----------------------------------
3253 Label miss; 3241 Label miss;
3254 3242
3255 // Check the key is the cached one. 3243 // Check the key is the cached one.
3256 __ cmp(r0, Operand(Handle<String>(name))); 3244 __ cmp(r0, Operand(name));
3257 __ b(ne, &miss); 3245 __ b(ne, &miss);
3258 3246
3259 GenerateLoadConstant(receiver, holder, r1, r2, r3, r4, value, name, &miss); 3247 GenerateLoadConstant(receiver, holder, r1, r2, r3, r4, value, name, &miss);
3260 __ bind(&miss); 3248 __ bind(&miss);
3261 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); 3249 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
3262 3250
3263 // Return the generated code. 3251 // Return the generated code.
3264 return GetCode(CONSTANT_FUNCTION, name); 3252 return GetCode(CONSTANT_FUNCTION, name);
3265 } 3253 }
3266 3254
(...skipping 20 matching lines...) Expand all
3287 r1, 3275 r1,
3288 r0, 3276 r0,
3289 r2, 3277 r2,
3290 r3, 3278 r3,
3291 r4, 3279 r4,
3292 name, 3280 name,
3293 &miss); 3281 &miss);
3294 __ bind(&miss); 3282 __ bind(&miss);
3295 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); 3283 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
3296 3284
3297 return GetCode(INTERCEPTOR, name); 3285 return TryGetCode(INTERCEPTOR, name);
3298 } 3286 }
3299 3287
3300 3288
3301 MaybeObject* KeyedLoadStubCompiler::CompileLoadArrayLength(String* name) { 3289 Handle<Code> KeyedLoadStubCompiler::CompileLoadArrayLength(
3290 Handle<String> name) {
3302 // ----------- S t a t e ------------- 3291 // ----------- S t a t e -------------
3303 // -- lr : return address 3292 // -- lr : return address
3304 // -- r0 : key 3293 // -- r0 : key
3305 // -- r1 : receiver 3294 // -- r1 : receiver
3306 // ----------------------------------- 3295 // -----------------------------------
3307 Label miss; 3296 Label miss;
3308 3297
3309 // Check the key is the cached one. 3298 // Check the key is the cached one.
3310 __ cmp(r0, Operand(Handle<String>(name))); 3299 __ cmp(r0, Operand(name));
3311 __ b(ne, &miss); 3300 __ b(ne, &miss);
3312 3301
3313 GenerateLoadArrayLength(masm(), r1, r2, &miss); 3302 GenerateLoadArrayLength(masm(), r1, r2, &miss);
3314 __ bind(&miss); 3303 __ bind(&miss);
3315 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); 3304 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
3316 3305
3317 return GetCode(CALLBACKS, name); 3306 return GetCode(CALLBACKS, name);
3318 } 3307 }
3319 3308
3320 3309
3321 MaybeObject* KeyedLoadStubCompiler::CompileLoadStringLength(String* name) { 3310 Handle<Code> KeyedLoadStubCompiler::CompileLoadStringLength(
3311 Handle<String> name) {
3322 // ----------- S t a t e ------------- 3312 // ----------- S t a t e -------------
3323 // -- lr : return address 3313 // -- lr : return address
3324 // -- r0 : key 3314 // -- r0 : key
3325 // -- r1 : receiver 3315 // -- r1 : receiver
3326 // ----------------------------------- 3316 // -----------------------------------
3327 Label miss; 3317 Label miss;
3328 3318
3329 Counters* counters = masm()->isolate()->counters(); 3319 Counters* counters = masm()->isolate()->counters();
3330 __ IncrementCounter(counters->keyed_load_string_length(), 1, r2, r3); 3320 __ IncrementCounter(counters->keyed_load_string_length(), 1, r2, r3);
3331 3321
3332 // Check the key is the cached one. 3322 // Check the key is the cached one.
3333 __ cmp(r0, Operand(Handle<String>(name))); 3323 __ cmp(r0, Operand(name));
3334 __ b(ne, &miss); 3324 __ b(ne, &miss);
3335 3325
3336 GenerateLoadStringLength(masm(), r1, r2, r3, &miss, true); 3326 GenerateLoadStringLength(masm(), r1, r2, r3, &miss, true);
3337 __ bind(&miss); 3327 __ bind(&miss);
3338 __ DecrementCounter(counters->keyed_load_string_length(), 1, r2, r3); 3328 __ DecrementCounter(counters->keyed_load_string_length(), 1, r2, r3);
3339 3329
3340 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); 3330 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
3341 3331
3342 return GetCode(CALLBACKS, name); 3332 return GetCode(CALLBACKS, name);
3343 } 3333 }
3344 3334
3345 3335
3346 MaybeObject* KeyedLoadStubCompiler::CompileLoadFunctionPrototype(String* name) { 3336 Handle<Code> KeyedLoadStubCompiler::CompileLoadFunctionPrototype(
3337 Handle<String> name) {
3347 // ----------- S t a t e ------------- 3338 // ----------- S t a t e -------------
3348 // -- lr : return address 3339 // -- lr : return address
3349 // -- r0 : key 3340 // -- r0 : key
3350 // -- r1 : receiver 3341 // -- r1 : receiver
3351 // ----------------------------------- 3342 // -----------------------------------
3352 Label miss; 3343 Label miss;
3353 3344
3354 Counters* counters = masm()->isolate()->counters(); 3345 Counters* counters = masm()->isolate()->counters();
3355 __ IncrementCounter(counters->keyed_load_function_prototype(), 1, r2, r3); 3346 __ IncrementCounter(counters->keyed_load_function_prototype(), 1, r2, r3);
3356 3347
3357 // Check the name hasn't changed. 3348 // Check the name hasn't changed.
3358 __ cmp(r0, Operand(Handle<String>(name))); 3349 __ cmp(r0, Operand(name));
3359 __ b(ne, &miss); 3350 __ b(ne, &miss);
3360 3351
3361 GenerateLoadFunctionPrototype(masm(), r1, r2, r3, &miss); 3352 GenerateLoadFunctionPrototype(masm(), r1, r2, r3, &miss);
3362 __ bind(&miss); 3353 __ bind(&miss);
3363 __ DecrementCounter(counters->keyed_load_function_prototype(), 1, r2, r3); 3354 __ DecrementCounter(counters->keyed_load_function_prototype(), 1, r2, r3);
3364 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); 3355 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
3365 3356
3366 return GetCode(CALLBACKS, name); 3357 return GetCode(CALLBACKS, name);
3367 } 3358 }
3368 3359
(...skipping 11 matching lines...) Expand all
3380 __ DispatchMap(r1, 3371 __ DispatchMap(r1,
3381 r2, 3372 r2,
3382 Handle<Map>(receiver_map), 3373 Handle<Map>(receiver_map),
3383 Handle<Code>(stub), 3374 Handle<Code>(stub),
3384 DO_SMI_CHECK); 3375 DO_SMI_CHECK);
3385 3376
3386 Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Miss(); 3377 Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Miss();
3387 __ Jump(ic, RelocInfo::CODE_TARGET); 3378 __ Jump(ic, RelocInfo::CODE_TARGET);
3388 3379
3389 // Return the generated code. 3380 // Return the generated code.
3390 return GetCode(NORMAL, NULL); 3381 return TryGetCode(NORMAL, NULL);
3391 } 3382 }
3392 3383
3393 3384
3394 MaybeObject* KeyedLoadStubCompiler::CompileLoadPolymorphic( 3385 MaybeObject* KeyedLoadStubCompiler::CompileLoadPolymorphic(
3395 MapList* receiver_maps, 3386 MapList* receiver_maps,
3396 CodeList* handler_ics) { 3387 CodeList* handler_ics) {
3397 // ----------- S t a t e ------------- 3388 // ----------- S t a t e -------------
3398 // -- lr : return address 3389 // -- lr : return address
3399 // -- r0 : key 3390 // -- r0 : key
3400 // -- r1 : receiver 3391 // -- r1 : receiver
3401 // ----------------------------------- 3392 // -----------------------------------
3402 Label miss; 3393 Label miss;
3403 __ JumpIfSmi(r1, &miss); 3394 __ JumpIfSmi(r1, &miss);
3404 3395
3405 int receiver_count = receiver_maps->length(); 3396 int receiver_count = receiver_maps->length();
3406 __ ldr(r2, FieldMemOperand(r1, HeapObject::kMapOffset)); 3397 __ ldr(r2, FieldMemOperand(r1, HeapObject::kMapOffset));
3407 for (int current = 0; current < receiver_count; ++current) { 3398 for (int current = 0; current < receiver_count; ++current) {
3408 Handle<Map> map(receiver_maps->at(current)); 3399 Handle<Map> map(receiver_maps->at(current));
3409 Handle<Code> code(handler_ics->at(current)); 3400 Handle<Code> code(handler_ics->at(current));
3410 __ mov(ip, Operand(map)); 3401 __ mov(ip, Operand(map));
3411 __ cmp(r2, ip); 3402 __ cmp(r2, ip);
3412 __ Jump(code, RelocInfo::CODE_TARGET, eq); 3403 __ Jump(code, RelocInfo::CODE_TARGET, eq);
3413 } 3404 }
3414 3405
3415 __ bind(&miss); 3406 __ bind(&miss);
3416 Handle<Code> miss_ic = isolate()->builtins()->KeyedLoadIC_Miss(); 3407 Handle<Code> miss_ic = isolate()->builtins()->KeyedLoadIC_Miss();
3417 __ Jump(miss_ic, RelocInfo::CODE_TARGET, al); 3408 __ Jump(miss_ic, RelocInfo::CODE_TARGET, al);
3418 3409
3419 // Return the generated code. 3410 // Return the generated code.
3420 return GetCode(NORMAL, NULL, MEGAMORPHIC); 3411 return TryGetCode(NORMAL, NULL, MEGAMORPHIC);
3421 } 3412 }
3422 3413
3423 3414
3424 MaybeObject* KeyedStoreStubCompiler::CompileStoreField(JSObject* object, 3415 MaybeObject* KeyedStoreStubCompiler::CompileStoreField(JSObject* object,
3425 int index, 3416 int index,
3426 Map* transition, 3417 Map* transition,
3427 String* name) { 3418 String* name) {
3428 // ----------- S t a t e ------------- 3419 // ----------- S t a t e -------------
3429 // -- r0 : value 3420 // -- r0 : value
3430 // -- r1 : name 3421 // -- r1 : name
(...skipping 1242 matching lines...) Expand 10 before | Expand all | Expand 10 after
4673 Handle<Code> ic_miss = masm->isolate()->builtins()->KeyedStoreIC_Miss(); 4664 Handle<Code> ic_miss = masm->isolate()->builtins()->KeyedStoreIC_Miss();
4674 __ Jump(ic_miss, RelocInfo::CODE_TARGET); 4665 __ Jump(ic_miss, RelocInfo::CODE_TARGET);
4675 } 4666 }
4676 4667
4677 4668
4678 #undef __ 4669 #undef __
4679 4670
4680 } } // namespace v8::internal 4671 } } // namespace v8::internal
4681 4672
4682 #endif // V8_TARGET_ARCH_ARM 4673 #endif // V8_TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « no previous file | src/ia32/stub-cache-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698