OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 2947 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2958 __ bind(&miss); | 2958 __ bind(&miss); |
2959 Handle<Code> miss_ic = isolate()->builtins()->KeyedStoreIC_Miss(); | 2959 Handle<Code> miss_ic = isolate()->builtins()->KeyedStoreIC_Miss(); |
2960 __ jmp(miss_ic, RelocInfo::CODE_TARGET); | 2960 __ jmp(miss_ic, RelocInfo::CODE_TARGET); |
2961 | 2961 |
2962 // Return the generated code. | 2962 // Return the generated code. |
2963 return GetCode(Code::NORMAL, factory()->empty_string(), POLYMORPHIC); | 2963 return GetCode(Code::NORMAL, factory()->empty_string(), POLYMORPHIC); |
2964 } | 2964 } |
2965 | 2965 |
2966 | 2966 |
2967 Handle<Code> LoadStubCompiler::CompileLoadNonexistent( | 2967 Handle<Code> LoadStubCompiler::CompileLoadNonexistent( |
2968 Handle<String> name, | |
2969 Handle<JSObject> object, | 2968 Handle<JSObject> object, |
2970 Handle<JSObject> last, | 2969 Handle<JSObject> last, |
| 2970 Handle<String> name, |
2971 Handle<GlobalObject> global) { | 2971 Handle<GlobalObject> global) { |
2972 // ----------- S t a t e ------------- | 2972 // ----------- S t a t e ------------- |
2973 // -- ecx : name | 2973 // -- ecx : name |
2974 // -- edx : receiver | 2974 // -- edx : receiver |
2975 // -- esp[0] : return address | 2975 // -- esp[0] : return address |
2976 // ----------------------------------- | 2976 // ----------------------------------- |
2977 Label miss; | 2977 Label miss; |
2978 | 2978 |
2979 // Check that the receiver isn't a smi. | 2979 // Check that the receiver isn't a smi. |
2980 __ JumpIfSmi(edx, &miss); | 2980 __ JumpIfSmi(edx, &miss); |
(...skipping 25 matching lines...) Expand all Loading... |
3006 __ ret(0); | 3006 __ ret(0); |
3007 | 3007 |
3008 __ bind(&miss); | 3008 __ bind(&miss); |
3009 GenerateLoadMiss(masm(), Code::LOAD_IC); | 3009 GenerateLoadMiss(masm(), Code::LOAD_IC); |
3010 | 3010 |
3011 // Return the generated code. | 3011 // Return the generated code. |
3012 return GetCode(Code::NONEXISTENT, factory()->empty_string()); | 3012 return GetCode(Code::NONEXISTENT, factory()->empty_string()); |
3013 } | 3013 } |
3014 | 3014 |
3015 | 3015 |
3016 Handle<Code> LoadStubCompiler::CompileLoadField(Handle<JSObject> object, | 3016 Register* LoadStubCompiler::registers() { |
3017 Handle<JSObject> holder, | 3017 // receiver, name, scratch1, scratch2, scratch3, scratch4. |
3018 PropertyIndex index, | 3018 static Register registers[] = { edx, ecx, ebx, eax, edi, no_reg }; |
3019 Handle<String> name) { | 3019 return registers; |
3020 // ----------- S t a t e ------------- | |
3021 // -- ecx : name | |
3022 // -- edx : receiver | |
3023 // -- esp[0] : return address | |
3024 // ----------------------------------- | |
3025 Label miss; | |
3026 | |
3027 GenerateLoadField(object, holder, edx, ebx, eax, edi, index, name, &miss); | |
3028 __ bind(&miss); | |
3029 GenerateLoadMiss(masm(), Code::LOAD_IC); | |
3030 | |
3031 // Return the generated code. | |
3032 return GetCode(Code::FIELD, name); | |
3033 } | 3020 } |
3034 | 3021 |
3035 | 3022 |
3036 Handle<Code> LoadStubCompiler::CompileLoadCallback( | 3023 Register* KeyedLoadStubCompiler::registers() { |
3037 Handle<String> name, | 3024 // receiver, name, scratch1, scratch2, scratch3, scratch4. |
3038 Handle<JSObject> object, | 3025 static Register registers[] = { edx, ecx, ebx, eax, edi, no_reg }; |
3039 Handle<JSObject> holder, | 3026 return registers; |
3040 Handle<AccessorInfo> callback) { | |
3041 // ----------- S t a t e ------------- | |
3042 // -- ecx : name | |
3043 // -- edx : receiver | |
3044 // -- esp[0] : return address | |
3045 // ----------------------------------- | |
3046 Label miss; | |
3047 | |
3048 GenerateLoadCallback(object, holder, edx, ecx, ebx, eax, edi, no_reg, | |
3049 callback, name, &miss); | |
3050 __ bind(&miss); | |
3051 GenerateLoadMiss(masm(), Code::LOAD_IC); | |
3052 | |
3053 // Return the generated code. | |
3054 return GetCode(Code::CALLBACKS, name); | |
3055 } | 3027 } |
3056 | 3028 |
3057 | 3029 |
| 3030 void KeyedLoadStubCompiler::GenerateNameCheck(Handle<String> name, |
| 3031 Register name_reg, |
| 3032 Label* miss) { |
| 3033 __ cmp(name_reg, Immediate(name)); |
| 3034 __ j(not_equal, miss); |
| 3035 } |
| 3036 |
| 3037 |
3058 #undef __ | 3038 #undef __ |
3059 #define __ ACCESS_MASM(masm) | 3039 #define __ ACCESS_MASM(masm) |
3060 | 3040 |
3061 | 3041 |
3062 void LoadStubCompiler::GenerateLoadViaGetter(MacroAssembler* masm, | 3042 void LoadStubCompiler::GenerateLoadViaGetter(MacroAssembler* masm, |
3063 Handle<JSFunction> getter) { | 3043 Handle<JSFunction> getter) { |
3064 // ----------- S t a t e ------------- | 3044 // ----------- S t a t e ------------- |
3065 // -- ecx : name | 3045 // -- ecx : name |
3066 // -- edx : receiver | 3046 // -- edx : receiver |
3067 // -- esp[0] : return address | 3047 // -- esp[0] : return address |
(...skipping 18 matching lines...) Expand all Loading... |
3086 } | 3066 } |
3087 __ ret(0); | 3067 __ ret(0); |
3088 } | 3068 } |
3089 | 3069 |
3090 | 3070 |
3091 #undef __ | 3071 #undef __ |
3092 #define __ ACCESS_MASM(masm()) | 3072 #define __ ACCESS_MASM(masm()) |
3093 | 3073 |
3094 | 3074 |
3095 Handle<Code> LoadStubCompiler::CompileLoadViaGetter( | 3075 Handle<Code> LoadStubCompiler::CompileLoadViaGetter( |
3096 Handle<String> name, | |
3097 Handle<JSObject> receiver, | 3076 Handle<JSObject> receiver, |
3098 Handle<JSObject> holder, | 3077 Handle<JSObject> holder, |
| 3078 Handle<String> name, |
3099 Handle<JSFunction> getter) { | 3079 Handle<JSFunction> getter) { |
3100 // ----------- S t a t e ------------- | 3080 // ----------- S t a t e ------------- |
3101 // -- ecx : name | 3081 // -- ecx : name |
3102 // -- edx : receiver | 3082 // -- edx : receiver |
3103 // -- esp[0] : return address | 3083 // -- esp[0] : return address |
3104 // ----------------------------------- | 3084 // ----------------------------------- |
3105 Label miss; | 3085 Label miss; |
3106 | 3086 |
3107 // Check that the maps haven't changed. | 3087 // Check that the maps haven't changed. |
3108 __ JumpIfSmi(edx, &miss); | 3088 __ JumpIfSmi(edx, &miss); |
3109 CheckPrototypes(receiver, edx, holder, ebx, eax, edi, name, &miss); | 3089 CheckPrototypes(receiver, edx, holder, ebx, eax, edi, name, &miss); |
3110 | 3090 |
3111 GenerateLoadViaGetter(masm(), getter); | 3091 GenerateLoadViaGetter(masm(), getter); |
3112 | 3092 |
3113 __ bind(&miss); | 3093 __ bind(&miss); |
3114 GenerateLoadMiss(masm(), Code::LOAD_IC); | 3094 GenerateLoadMiss(masm(), Code::LOAD_IC); |
3115 | 3095 |
3116 // Return the generated code. | 3096 // Return the generated code. |
3117 return GetCode(Code::CALLBACKS, name); | 3097 return GetCode(Code::CALLBACKS, name); |
3118 } | 3098 } |
3119 | 3099 |
3120 | 3100 |
3121 Handle<Code> LoadStubCompiler::CompileLoadConstant(Handle<JSObject> object, | |
3122 Handle<JSObject> holder, | |
3123 Handle<JSFunction> value, | |
3124 Handle<String> name) { | |
3125 // ----------- S t a t e ------------- | |
3126 // -- ecx : name | |
3127 // -- edx : receiver | |
3128 // -- esp[0] : return address | |
3129 // ----------------------------------- | |
3130 Label miss; | |
3131 | |
3132 GenerateLoadConstant(object, holder, edx, ebx, eax, edi, value, name, &miss); | |
3133 __ bind(&miss); | |
3134 GenerateLoadMiss(masm(), Code::LOAD_IC); | |
3135 | |
3136 // Return the generated code. | |
3137 return GetCode(Code::CONSTANT_FUNCTION, name); | |
3138 } | |
3139 | |
3140 | |
3141 Handle<Code> LoadStubCompiler::CompileLoadInterceptor(Handle<JSObject> receiver, | |
3142 Handle<JSObject> holder, | |
3143 Handle<String> name) { | |
3144 // ----------- S t a t e ------------- | |
3145 // -- ecx : name | |
3146 // -- edx : receiver | |
3147 // -- esp[0] : return address | |
3148 // ----------------------------------- | |
3149 Label miss; | |
3150 | |
3151 LookupResult lookup(isolate()); | |
3152 LookupPostInterceptor(holder, name, &lookup); | |
3153 | |
3154 // TODO(368): Compile in the whole chain: all the interceptors in | |
3155 // prototypes and ultimate answer. | |
3156 GenerateLoadInterceptor(receiver, holder, &lookup, edx, ecx, eax, ebx, edi, | |
3157 name, &miss); | |
3158 | |
3159 __ bind(&miss); | |
3160 GenerateLoadMiss(masm(), Code::LOAD_IC); | |
3161 | |
3162 // Return the generated code. | |
3163 return GetCode(Code::INTERCEPTOR, name); | |
3164 } | |
3165 | |
3166 | |
3167 Handle<Code> LoadStubCompiler::CompileLoadGlobal( | 3101 Handle<Code> LoadStubCompiler::CompileLoadGlobal( |
3168 Handle<JSObject> object, | 3102 Handle<JSObject> object, |
3169 Handle<GlobalObject> holder, | 3103 Handle<GlobalObject> holder, |
3170 Handle<JSGlobalPropertyCell> cell, | 3104 Handle<JSGlobalPropertyCell> cell, |
3171 Handle<String> name, | 3105 Handle<String> name, |
3172 bool is_dont_delete) { | 3106 bool is_dont_delete) { |
3173 // ----------- S t a t e ------------- | 3107 // ----------- S t a t e ------------- |
3174 // -- ecx : name | 3108 // -- ecx : name |
3175 // -- edx : receiver | 3109 // -- edx : receiver |
3176 // -- esp[0] : return address | 3110 // -- esp[0] : return address |
(...skipping 28 matching lines...) Expand all Loading... |
3205 | 3139 |
3206 __ bind(&miss); | 3140 __ bind(&miss); |
3207 __ IncrementCounter(counters->named_load_global_stub_miss(), 1); | 3141 __ IncrementCounter(counters->named_load_global_stub_miss(), 1); |
3208 GenerateLoadMiss(masm(), Code::LOAD_IC); | 3142 GenerateLoadMiss(masm(), Code::LOAD_IC); |
3209 | 3143 |
3210 // Return the generated code. | 3144 // Return the generated code. |
3211 return GetCode(Code::NORMAL, name); | 3145 return GetCode(Code::NORMAL, name); |
3212 } | 3146 } |
3213 | 3147 |
3214 | 3148 |
3215 Handle<Code> KeyedLoadStubCompiler::CompileLoadField(Handle<String> name, | |
3216 Handle<JSObject> receiver, | |
3217 Handle<JSObject> holder, | |
3218 PropertyIndex index) { | |
3219 // ----------- S t a t e ------------- | |
3220 // -- ecx : key | |
3221 // -- edx : receiver | |
3222 // -- esp[0] : return address | |
3223 // ----------------------------------- | |
3224 Label miss; | |
3225 | |
3226 Counters* counters = isolate()->counters(); | |
3227 __ IncrementCounter(counters->keyed_load_field(), 1); | |
3228 | |
3229 // Check that the name has not changed. | |
3230 __ cmp(ecx, Immediate(name)); | |
3231 __ j(not_equal, &miss); | |
3232 | |
3233 GenerateLoadField(receiver, holder, edx, ebx, eax, edi, index, name, &miss); | |
3234 | |
3235 __ bind(&miss); | |
3236 __ DecrementCounter(counters->keyed_load_field(), 1); | |
3237 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); | |
3238 | |
3239 // Return the generated code. | |
3240 return GetCode(Code::FIELD, name); | |
3241 } | |
3242 | |
3243 | |
3244 Handle<Code> KeyedLoadStubCompiler::CompileLoadCallback( | |
3245 Handle<String> name, | |
3246 Handle<JSObject> receiver, | |
3247 Handle<JSObject> holder, | |
3248 Handle<AccessorInfo> callback) { | |
3249 // ----------- S t a t e ------------- | |
3250 // -- ecx : key | |
3251 // -- edx : receiver | |
3252 // -- esp[0] : return address | |
3253 // ----------------------------------- | |
3254 Label miss; | |
3255 | |
3256 Counters* counters = isolate()->counters(); | |
3257 __ IncrementCounter(counters->keyed_load_callback(), 1); | |
3258 | |
3259 // Check that the name has not changed. | |
3260 __ cmp(ecx, Immediate(name)); | |
3261 __ j(not_equal, &miss); | |
3262 | |
3263 GenerateLoadCallback(receiver, holder, edx, ecx, ebx, eax, edi, no_reg, | |
3264 callback, name, &miss); | |
3265 | |
3266 __ bind(&miss); | |
3267 __ DecrementCounter(counters->keyed_load_callback(), 1); | |
3268 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); | |
3269 | |
3270 // Return the generated code. | |
3271 return GetCode(Code::CALLBACKS, name); | |
3272 } | |
3273 | |
3274 | |
3275 Handle<Code> KeyedLoadStubCompiler::CompileLoadConstant( | |
3276 Handle<String> name, | |
3277 Handle<JSObject> receiver, | |
3278 Handle<JSObject> holder, | |
3279 Handle<JSFunction> value) { | |
3280 // ----------- S t a t e ------------- | |
3281 // -- ecx : key | |
3282 // -- edx : receiver | |
3283 // -- esp[0] : return address | |
3284 // ----------------------------------- | |
3285 Label miss; | |
3286 | |
3287 Counters* counters = isolate()->counters(); | |
3288 __ IncrementCounter(counters->keyed_load_constant_function(), 1); | |
3289 | |
3290 // Check that the name has not changed. | |
3291 __ cmp(ecx, Immediate(name)); | |
3292 __ j(not_equal, &miss); | |
3293 | |
3294 GenerateLoadConstant( | |
3295 receiver, holder, edx, ebx, eax, edi, value, name, &miss); | |
3296 __ bind(&miss); | |
3297 __ DecrementCounter(counters->keyed_load_constant_function(), 1); | |
3298 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); | |
3299 | |
3300 // Return the generated code. | |
3301 return GetCode(Code::CONSTANT_FUNCTION, name); | |
3302 } | |
3303 | |
3304 | |
3305 Handle<Code> KeyedLoadStubCompiler::CompileLoadInterceptor( | |
3306 Handle<JSObject> receiver, | |
3307 Handle<JSObject> holder, | |
3308 Handle<String> name) { | |
3309 // ----------- S t a t e ------------- | |
3310 // -- ecx : key | |
3311 // -- edx : receiver | |
3312 // -- esp[0] : return address | |
3313 // ----------------------------------- | |
3314 Label miss; | |
3315 | |
3316 Counters* counters = isolate()->counters(); | |
3317 __ IncrementCounter(counters->keyed_load_interceptor(), 1); | |
3318 | |
3319 // Check that the name has not changed. | |
3320 __ cmp(ecx, Immediate(name)); | |
3321 __ j(not_equal, &miss); | |
3322 | |
3323 LookupResult lookup(isolate()); | |
3324 LookupPostInterceptor(holder, name, &lookup); | |
3325 GenerateLoadInterceptor(receiver, holder, &lookup, edx, ecx, eax, ebx, edi, | |
3326 name, &miss); | |
3327 __ bind(&miss); | |
3328 __ DecrementCounter(counters->keyed_load_interceptor(), 1); | |
3329 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); | |
3330 | |
3331 // Return the generated code. | |
3332 return GetCode(Code::INTERCEPTOR, name); | |
3333 } | |
3334 | |
3335 | |
3336 Handle<Code> KeyedLoadStubCompiler::CompileLoadElement( | 3149 Handle<Code> KeyedLoadStubCompiler::CompileLoadElement( |
3337 Handle<Map> receiver_map) { | 3150 Handle<Map> receiver_map) { |
3338 // ----------- S t a t e ------------- | 3151 // ----------- S t a t e ------------- |
3339 // -- ecx : key | 3152 // -- ecx : key |
3340 // -- edx : receiver | 3153 // -- edx : receiver |
3341 // -- esp[0] : return address | 3154 // -- esp[0] : return address |
3342 // ----------------------------------- | 3155 // ----------------------------------- |
3343 | 3156 |
3344 ElementsKind elements_kind = receiver_map->elements_kind(); | 3157 ElementsKind elements_kind = receiver_map->elements_kind(); |
3345 if (receiver_map->has_fast_elements() || | 3158 if (receiver_map->has_fast_elements() || |
(...skipping 758 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4104 __ jmp(ic_slow, RelocInfo::CODE_TARGET); | 3917 __ jmp(ic_slow, RelocInfo::CODE_TARGET); |
4105 } | 3918 } |
4106 } | 3919 } |
4107 | 3920 |
4108 | 3921 |
4109 #undef __ | 3922 #undef __ |
4110 | 3923 |
4111 } } // namespace v8::internal | 3924 } } // namespace v8::internal |
4112 | 3925 |
4113 #endif // V8_TARGET_ARCH_IA32 | 3926 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |