| 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 26 matching lines...) Expand all Loading... |
| 37 #include "runtime.h" | 37 #include "runtime.h" |
| 38 #include "stub-cache.h" | 38 #include "stub-cache.h" |
| 39 #include "codegen.h" | 39 #include "codegen.h" |
| 40 #include "runtime.h" | 40 #include "runtime.h" |
| 41 | 41 |
| 42 namespace v8 { | 42 namespace v8 { |
| 43 namespace internal { | 43 namespace internal { |
| 44 | 44 |
| 45 | 45 |
| 46 void FastNewClosureStub::InitializeInterfaceDescriptor( | 46 void FastNewClosureStub::InitializeInterfaceDescriptor( |
| 47 Isolate* isolate, | |
| 48 CodeStubInterfaceDescriptor* descriptor) { | 47 CodeStubInterfaceDescriptor* descriptor) { |
| 49 static Register registers[] = { ebx }; | 48 static Register registers[] = { ebx }; |
| 50 descriptor->register_param_count_ = 1; | 49 descriptor->register_param_count_ = 1; |
| 51 descriptor->register_params_ = registers; | 50 descriptor->register_params_ = registers; |
| 52 descriptor->deoptimization_handler_ = | 51 descriptor->deoptimization_handler_ = |
| 53 Runtime::FunctionForId(Runtime::kHiddenNewClosureFromStubFailure)->entry; | 52 Runtime::FunctionForId(Runtime::kHiddenNewClosureFromStubFailure)->entry; |
| 54 } | 53 } |
| 55 | 54 |
| 56 | 55 |
| 57 void FastNewContextStub::InitializeInterfaceDescriptor( | 56 void FastNewContextStub::InitializeInterfaceDescriptor( |
| 58 Isolate* isolate, | |
| 59 CodeStubInterfaceDescriptor* descriptor) { | 57 CodeStubInterfaceDescriptor* descriptor) { |
| 60 static Register registers[] = { edi }; | 58 static Register registers[] = { edi }; |
| 61 descriptor->register_param_count_ = 1; | 59 descriptor->register_param_count_ = 1; |
| 62 descriptor->register_params_ = registers; | 60 descriptor->register_params_ = registers; |
| 63 descriptor->deoptimization_handler_ = NULL; | 61 descriptor->deoptimization_handler_ = NULL; |
| 64 } | 62 } |
| 65 | 63 |
| 66 | 64 |
| 67 void ToNumberStub::InitializeInterfaceDescriptor( | 65 void ToNumberStub::InitializeInterfaceDescriptor( |
| 68 Isolate* isolate, | |
| 69 CodeStubInterfaceDescriptor* descriptor) { | 66 CodeStubInterfaceDescriptor* descriptor) { |
| 70 static Register registers[] = { eax }; | 67 static Register registers[] = { eax }; |
| 71 descriptor->register_param_count_ = 1; | 68 descriptor->register_param_count_ = 1; |
| 72 descriptor->register_params_ = registers; | 69 descriptor->register_params_ = registers; |
| 73 descriptor->deoptimization_handler_ = NULL; | 70 descriptor->deoptimization_handler_ = NULL; |
| 74 } | 71 } |
| 75 | 72 |
| 76 | 73 |
| 77 void NumberToStringStub::InitializeInterfaceDescriptor( | 74 void NumberToStringStub::InitializeInterfaceDescriptor( |
| 78 Isolate* isolate, | |
| 79 CodeStubInterfaceDescriptor* descriptor) { | 75 CodeStubInterfaceDescriptor* descriptor) { |
| 80 static Register registers[] = { eax }; | 76 static Register registers[] = { eax }; |
| 81 descriptor->register_param_count_ = 1; | 77 descriptor->register_param_count_ = 1; |
| 82 descriptor->register_params_ = registers; | 78 descriptor->register_params_ = registers; |
| 83 descriptor->deoptimization_handler_ = | 79 descriptor->deoptimization_handler_ = |
| 84 Runtime::FunctionForId(Runtime::kHiddenNumberToString)->entry; | 80 Runtime::FunctionForId(Runtime::kHiddenNumberToString)->entry; |
| 85 } | 81 } |
| 86 | 82 |
| 87 | 83 |
| 88 void FastCloneShallowArrayStub::InitializeInterfaceDescriptor( | 84 void FastCloneShallowArrayStub::InitializeInterfaceDescriptor( |
| 89 Isolate* isolate, | |
| 90 CodeStubInterfaceDescriptor* descriptor) { | 85 CodeStubInterfaceDescriptor* descriptor) { |
| 91 static Register registers[] = { eax, ebx, ecx }; | 86 static Register registers[] = { eax, ebx, ecx }; |
| 92 descriptor->register_param_count_ = 3; | 87 descriptor->register_param_count_ = 3; |
| 93 descriptor->register_params_ = registers; | 88 descriptor->register_params_ = registers; |
| 94 descriptor->deoptimization_handler_ = | 89 descriptor->deoptimization_handler_ = |
| 95 Runtime::FunctionForId( | 90 Runtime::FunctionForId( |
| 96 Runtime::kHiddenCreateArrayLiteralStubBailout)->entry; | 91 Runtime::kHiddenCreateArrayLiteralStubBailout)->entry; |
| 97 } | 92 } |
| 98 | 93 |
| 99 | 94 |
| 100 void FastCloneShallowObjectStub::InitializeInterfaceDescriptor( | 95 void FastCloneShallowObjectStub::InitializeInterfaceDescriptor( |
| 101 Isolate* isolate, | |
| 102 CodeStubInterfaceDescriptor* descriptor) { | 96 CodeStubInterfaceDescriptor* descriptor) { |
| 103 static Register registers[] = { eax, ebx, ecx, edx }; | 97 static Register registers[] = { eax, ebx, ecx, edx }; |
| 104 descriptor->register_param_count_ = 4; | 98 descriptor->register_param_count_ = 4; |
| 105 descriptor->register_params_ = registers; | 99 descriptor->register_params_ = registers; |
| 106 descriptor->deoptimization_handler_ = | 100 descriptor->deoptimization_handler_ = |
| 107 Runtime::FunctionForId(Runtime::kHiddenCreateObjectLiteral)->entry; | 101 Runtime::FunctionForId(Runtime::kHiddenCreateObjectLiteral)->entry; |
| 108 } | 102 } |
| 109 | 103 |
| 110 | 104 |
| 111 void CreateAllocationSiteStub::InitializeInterfaceDescriptor( | 105 void CreateAllocationSiteStub::InitializeInterfaceDescriptor( |
| 112 Isolate* isolate, | |
| 113 CodeStubInterfaceDescriptor* descriptor) { | 106 CodeStubInterfaceDescriptor* descriptor) { |
| 114 static Register registers[] = { ebx, edx }; | 107 static Register registers[] = { ebx, edx }; |
| 115 descriptor->register_param_count_ = 2; | 108 descriptor->register_param_count_ = 2; |
| 116 descriptor->register_params_ = registers; | 109 descriptor->register_params_ = registers; |
| 117 descriptor->deoptimization_handler_ = NULL; | 110 descriptor->deoptimization_handler_ = NULL; |
| 118 } | 111 } |
| 119 | 112 |
| 120 | 113 |
| 121 void KeyedLoadFastElementStub::InitializeInterfaceDescriptor( | 114 void KeyedLoadFastElementStub::InitializeInterfaceDescriptor( |
| 122 Isolate* isolate, | |
| 123 CodeStubInterfaceDescriptor* descriptor) { | 115 CodeStubInterfaceDescriptor* descriptor) { |
| 124 static Register registers[] = { edx, ecx }; | 116 static Register registers[] = { edx, ecx }; |
| 125 descriptor->register_param_count_ = 2; | 117 descriptor->register_param_count_ = 2; |
| 126 descriptor->register_params_ = registers; | 118 descriptor->register_params_ = registers; |
| 127 descriptor->deoptimization_handler_ = | 119 descriptor->deoptimization_handler_ = |
| 128 FUNCTION_ADDR(KeyedLoadIC_MissFromStubFailure); | 120 FUNCTION_ADDR(KeyedLoadIC_MissFromStubFailure); |
| 129 } | 121 } |
| 130 | 122 |
| 131 | 123 |
| 132 void KeyedLoadDictionaryElementStub::InitializeInterfaceDescriptor( | 124 void KeyedLoadDictionaryElementStub::InitializeInterfaceDescriptor( |
| 133 Isolate* isolate, | |
| 134 CodeStubInterfaceDescriptor* descriptor) { | 125 CodeStubInterfaceDescriptor* descriptor) { |
| 135 static Register registers[] = { edx, ecx }; | 126 static Register registers[] = { edx, ecx }; |
| 136 descriptor->register_param_count_ = 2; | 127 descriptor->register_param_count_ = 2; |
| 137 descriptor->register_params_ = registers; | 128 descriptor->register_params_ = registers; |
| 138 descriptor->deoptimization_handler_ = | 129 descriptor->deoptimization_handler_ = |
| 139 FUNCTION_ADDR(KeyedLoadIC_MissFromStubFailure); | 130 FUNCTION_ADDR(KeyedLoadIC_MissFromStubFailure); |
| 140 } | 131 } |
| 141 | 132 |
| 142 | 133 |
| 143 void RegExpConstructResultStub::InitializeInterfaceDescriptor( | 134 void RegExpConstructResultStub::InitializeInterfaceDescriptor( |
| 144 Isolate* isolate, | |
| 145 CodeStubInterfaceDescriptor* descriptor) { | 135 CodeStubInterfaceDescriptor* descriptor) { |
| 146 static Register registers[] = { ecx, ebx, eax }; | 136 static Register registers[] = { ecx, ebx, eax }; |
| 147 descriptor->register_param_count_ = 3; | 137 descriptor->register_param_count_ = 3; |
| 148 descriptor->register_params_ = registers; | 138 descriptor->register_params_ = registers; |
| 149 descriptor->deoptimization_handler_ = | 139 descriptor->deoptimization_handler_ = |
| 150 Runtime::FunctionForId(Runtime::kHiddenRegExpConstructResult)->entry; | 140 Runtime::FunctionForId(Runtime::kHiddenRegExpConstructResult)->entry; |
| 151 } | 141 } |
| 152 | 142 |
| 153 | 143 |
| 154 void LoadFieldStub::InitializeInterfaceDescriptor( | 144 void LoadFieldStub::InitializeInterfaceDescriptor( |
| 155 Isolate* isolate, | |
| 156 CodeStubInterfaceDescriptor* descriptor) { | 145 CodeStubInterfaceDescriptor* descriptor) { |
| 157 static Register registers[] = { edx }; | 146 static Register registers[] = { edx }; |
| 158 descriptor->register_param_count_ = 1; | 147 descriptor->register_param_count_ = 1; |
| 159 descriptor->register_params_ = registers; | 148 descriptor->register_params_ = registers; |
| 160 descriptor->deoptimization_handler_ = NULL; | 149 descriptor->deoptimization_handler_ = NULL; |
| 161 } | 150 } |
| 162 | 151 |
| 163 | 152 |
| 164 void KeyedLoadFieldStub::InitializeInterfaceDescriptor( | 153 void KeyedLoadFieldStub::InitializeInterfaceDescriptor( |
| 165 Isolate* isolate, | |
| 166 CodeStubInterfaceDescriptor* descriptor) { | 154 CodeStubInterfaceDescriptor* descriptor) { |
| 167 static Register registers[] = { edx }; | 155 static Register registers[] = { edx }; |
| 168 descriptor->register_param_count_ = 1; | 156 descriptor->register_param_count_ = 1; |
| 169 descriptor->register_params_ = registers; | 157 descriptor->register_params_ = registers; |
| 170 descriptor->deoptimization_handler_ = NULL; | 158 descriptor->deoptimization_handler_ = NULL; |
| 171 } | 159 } |
| 172 | 160 |
| 173 | 161 |
| 174 void StringLengthStub::InitializeInterfaceDescriptor( | 162 void StringLengthStub::InitializeInterfaceDescriptor( |
| 175 Isolate* isolate, | |
| 176 CodeStubInterfaceDescriptor* descriptor) { | 163 CodeStubInterfaceDescriptor* descriptor) { |
| 177 static Register registers[] = { edx, ecx }; | 164 static Register registers[] = { edx, ecx }; |
| 178 descriptor->register_param_count_ = 2; | 165 descriptor->register_param_count_ = 2; |
| 179 descriptor->register_params_ = registers; | 166 descriptor->register_params_ = registers; |
| 180 descriptor->deoptimization_handler_ = NULL; | 167 descriptor->deoptimization_handler_ = NULL; |
| 181 } | 168 } |
| 182 | 169 |
| 183 | 170 |
| 184 void KeyedStringLengthStub::InitializeInterfaceDescriptor( | 171 void KeyedStringLengthStub::InitializeInterfaceDescriptor( |
| 185 Isolate* isolate, | |
| 186 CodeStubInterfaceDescriptor* descriptor) { | 172 CodeStubInterfaceDescriptor* descriptor) { |
| 187 static Register registers[] = { edx, ecx }; | 173 static Register registers[] = { edx, ecx }; |
| 188 descriptor->register_param_count_ = 2; | 174 descriptor->register_param_count_ = 2; |
| 189 descriptor->register_params_ = registers; | 175 descriptor->register_params_ = registers; |
| 190 descriptor->deoptimization_handler_ = NULL; | 176 descriptor->deoptimization_handler_ = NULL; |
| 191 } | 177 } |
| 192 | 178 |
| 193 | 179 |
| 194 void KeyedStoreFastElementStub::InitializeInterfaceDescriptor( | 180 void KeyedStoreFastElementStub::InitializeInterfaceDescriptor( |
| 195 Isolate* isolate, | |
| 196 CodeStubInterfaceDescriptor* descriptor) { | 181 CodeStubInterfaceDescriptor* descriptor) { |
| 197 static Register registers[] = { edx, ecx, eax }; | 182 static Register registers[] = { edx, ecx, eax }; |
| 198 descriptor->register_param_count_ = 3; | 183 descriptor->register_param_count_ = 3; |
| 199 descriptor->register_params_ = registers; | 184 descriptor->register_params_ = registers; |
| 200 descriptor->deoptimization_handler_ = | 185 descriptor->deoptimization_handler_ = |
| 201 FUNCTION_ADDR(KeyedStoreIC_MissFromStubFailure); | 186 FUNCTION_ADDR(KeyedStoreIC_MissFromStubFailure); |
| 202 } | 187 } |
| 203 | 188 |
| 204 | 189 |
| 205 void TransitionElementsKindStub::InitializeInterfaceDescriptor( | 190 void TransitionElementsKindStub::InitializeInterfaceDescriptor( |
| 206 Isolate* isolate, | |
| 207 CodeStubInterfaceDescriptor* descriptor) { | 191 CodeStubInterfaceDescriptor* descriptor) { |
| 208 static Register registers[] = { eax, ebx }; | 192 static Register registers[] = { eax, ebx }; |
| 209 descriptor->register_param_count_ = 2; | 193 descriptor->register_param_count_ = 2; |
| 210 descriptor->register_params_ = registers; | 194 descriptor->register_params_ = registers; |
| 211 descriptor->deoptimization_handler_ = | 195 descriptor->deoptimization_handler_ = |
| 212 Runtime::FunctionForId(Runtime::kTransitionElementsKind)->entry; | 196 Runtime::FunctionForId(Runtime::kTransitionElementsKind)->entry; |
| 213 } | 197 } |
| 214 | 198 |
| 215 | 199 |
| 216 static void InitializeArrayConstructorDescriptor( | 200 static void InitializeArrayConstructorDescriptor( |
| (...skipping 19 matching lines...) Expand all Loading... |
| 236 } | 220 } |
| 237 | 221 |
| 238 descriptor->hint_stack_parameter_count_ = constant_stack_parameter_count; | 222 descriptor->hint_stack_parameter_count_ = constant_stack_parameter_count; |
| 239 descriptor->function_mode_ = JS_FUNCTION_STUB_MODE; | 223 descriptor->function_mode_ = JS_FUNCTION_STUB_MODE; |
| 240 descriptor->deoptimization_handler_ = | 224 descriptor->deoptimization_handler_ = |
| 241 Runtime::FunctionForId(Runtime::kHiddenArrayConstructor)->entry; | 225 Runtime::FunctionForId(Runtime::kHiddenArrayConstructor)->entry; |
| 242 } | 226 } |
| 243 | 227 |
| 244 | 228 |
| 245 static void InitializeInternalArrayConstructorDescriptor( | 229 static void InitializeInternalArrayConstructorDescriptor( |
| 246 Isolate* isolate, | |
| 247 CodeStubInterfaceDescriptor* descriptor, | 230 CodeStubInterfaceDescriptor* descriptor, |
| 248 int constant_stack_parameter_count) { | 231 int constant_stack_parameter_count) { |
| 249 // register state | 232 // register state |
| 250 // eax -- number of arguments | 233 // eax -- number of arguments |
| 251 // edi -- constructor function | 234 // edi -- constructor function |
| 252 static Register registers_variable_args[] = { edi, eax }; | 235 static Register registers_variable_args[] = { edi, eax }; |
| 253 static Register registers_no_args[] = { edi }; | 236 static Register registers_no_args[] = { edi }; |
| 254 | 237 |
| 255 if (constant_stack_parameter_count == 0) { | 238 if (constant_stack_parameter_count == 0) { |
| 256 descriptor->register_param_count_ = 1; | 239 descriptor->register_param_count_ = 1; |
| 257 descriptor->register_params_ = registers_no_args; | 240 descriptor->register_params_ = registers_no_args; |
| 258 } else { | 241 } else { |
| 259 // stack param count needs (constructor pointer, and single argument) | 242 // stack param count needs (constructor pointer, and single argument) |
| 260 descriptor->handler_arguments_mode_ = PASS_ARGUMENTS; | 243 descriptor->handler_arguments_mode_ = PASS_ARGUMENTS; |
| 261 descriptor->stack_parameter_count_ = eax; | 244 descriptor->stack_parameter_count_ = eax; |
| 262 descriptor->register_param_count_ = 2; | 245 descriptor->register_param_count_ = 2; |
| 263 descriptor->register_params_ = registers_variable_args; | 246 descriptor->register_params_ = registers_variable_args; |
| 264 } | 247 } |
| 265 | 248 |
| 266 descriptor->hint_stack_parameter_count_ = constant_stack_parameter_count; | 249 descriptor->hint_stack_parameter_count_ = constant_stack_parameter_count; |
| 267 descriptor->function_mode_ = JS_FUNCTION_STUB_MODE; | 250 descriptor->function_mode_ = JS_FUNCTION_STUB_MODE; |
| 268 descriptor->deoptimization_handler_ = | 251 descriptor->deoptimization_handler_ = |
| 269 Runtime::FunctionForId(Runtime::kHiddenInternalArrayConstructor)->entry; | 252 Runtime::FunctionForId(Runtime::kHiddenInternalArrayConstructor)->entry; |
| 270 } | 253 } |
| 271 | 254 |
| 272 | 255 |
| 273 void ArrayNoArgumentConstructorStub::InitializeInterfaceDescriptor( | 256 void ArrayNoArgumentConstructorStub::InitializeInterfaceDescriptor( |
| 274 Isolate* isolate, | |
| 275 CodeStubInterfaceDescriptor* descriptor) { | 257 CodeStubInterfaceDescriptor* descriptor) { |
| 276 InitializeArrayConstructorDescriptor(isolate, descriptor, 0); | 258 InitializeArrayConstructorDescriptor(isolate(), descriptor, 0); |
| 277 } | 259 } |
| 278 | 260 |
| 279 | 261 |
| 280 void ArraySingleArgumentConstructorStub::InitializeInterfaceDescriptor( | 262 void ArraySingleArgumentConstructorStub::InitializeInterfaceDescriptor( |
| 281 Isolate* isolate, | |
| 282 CodeStubInterfaceDescriptor* descriptor) { | 263 CodeStubInterfaceDescriptor* descriptor) { |
| 283 InitializeArrayConstructorDescriptor(isolate, descriptor, 1); | 264 InitializeArrayConstructorDescriptor(isolate(), descriptor, 1); |
| 284 } | 265 } |
| 285 | 266 |
| 286 | 267 |
| 287 void ArrayNArgumentsConstructorStub::InitializeInterfaceDescriptor( | 268 void ArrayNArgumentsConstructorStub::InitializeInterfaceDescriptor( |
| 288 Isolate* isolate, | |
| 289 CodeStubInterfaceDescriptor* descriptor) { | 269 CodeStubInterfaceDescriptor* descriptor) { |
| 290 InitializeArrayConstructorDescriptor(isolate, descriptor, -1); | 270 InitializeArrayConstructorDescriptor(isolate(), descriptor, -1); |
| 291 } | 271 } |
| 292 | 272 |
| 293 | 273 |
| 294 void InternalArrayNoArgumentConstructorStub::InitializeInterfaceDescriptor( | 274 void InternalArrayNoArgumentConstructorStub::InitializeInterfaceDescriptor( |
| 295 Isolate* isolate, | |
| 296 CodeStubInterfaceDescriptor* descriptor) { | 275 CodeStubInterfaceDescriptor* descriptor) { |
| 297 InitializeInternalArrayConstructorDescriptor(isolate, descriptor, 0); | 276 InitializeInternalArrayConstructorDescriptor(descriptor, 0); |
| 298 } | 277 } |
| 299 | 278 |
| 300 | 279 |
| 301 void InternalArraySingleArgumentConstructorStub::InitializeInterfaceDescriptor( | 280 void InternalArraySingleArgumentConstructorStub::InitializeInterfaceDescriptor( |
| 302 Isolate* isolate, | |
| 303 CodeStubInterfaceDescriptor* descriptor) { | 281 CodeStubInterfaceDescriptor* descriptor) { |
| 304 InitializeInternalArrayConstructorDescriptor(isolate, descriptor, 1); | 282 InitializeInternalArrayConstructorDescriptor(descriptor, 1); |
| 305 } | 283 } |
| 306 | 284 |
| 307 | 285 |
| 308 void InternalArrayNArgumentsConstructorStub::InitializeInterfaceDescriptor( | 286 void InternalArrayNArgumentsConstructorStub::InitializeInterfaceDescriptor( |
| 309 Isolate* isolate, | |
| 310 CodeStubInterfaceDescriptor* descriptor) { | 287 CodeStubInterfaceDescriptor* descriptor) { |
| 311 InitializeInternalArrayConstructorDescriptor(isolate, descriptor, -1); | 288 InitializeInternalArrayConstructorDescriptor(descriptor, -1); |
| 312 } | 289 } |
| 313 | 290 |
| 314 | 291 |
| 315 void CompareNilICStub::InitializeInterfaceDescriptor( | 292 void CompareNilICStub::InitializeInterfaceDescriptor( |
| 316 Isolate* isolate, | |
| 317 CodeStubInterfaceDescriptor* descriptor) { | 293 CodeStubInterfaceDescriptor* descriptor) { |
| 318 static Register registers[] = { eax }; | 294 static Register registers[] = { eax }; |
| 319 descriptor->register_param_count_ = 1; | 295 descriptor->register_param_count_ = 1; |
| 320 descriptor->register_params_ = registers; | 296 descriptor->register_params_ = registers; |
| 321 descriptor->deoptimization_handler_ = | 297 descriptor->deoptimization_handler_ = |
| 322 FUNCTION_ADDR(CompareNilIC_Miss); | 298 FUNCTION_ADDR(CompareNilIC_Miss); |
| 323 descriptor->SetMissHandler( | 299 descriptor->SetMissHandler( |
| 324 ExternalReference(IC_Utility(IC::kCompareNilIC_Miss), isolate)); | 300 ExternalReference(IC_Utility(IC::kCompareNilIC_Miss), isolate())); |
| 325 } | 301 } |
| 326 | 302 |
| 327 void ToBooleanStub::InitializeInterfaceDescriptor( | 303 void ToBooleanStub::InitializeInterfaceDescriptor( |
| 328 Isolate* isolate, | |
| 329 CodeStubInterfaceDescriptor* descriptor) { | 304 CodeStubInterfaceDescriptor* descriptor) { |
| 330 static Register registers[] = { eax }; | 305 static Register registers[] = { eax }; |
| 331 descriptor->register_param_count_ = 1; | 306 descriptor->register_param_count_ = 1; |
| 332 descriptor->register_params_ = registers; | 307 descriptor->register_params_ = registers; |
| 333 descriptor->deoptimization_handler_ = | 308 descriptor->deoptimization_handler_ = |
| 334 FUNCTION_ADDR(ToBooleanIC_Miss); | 309 FUNCTION_ADDR(ToBooleanIC_Miss); |
| 335 descriptor->SetMissHandler( | 310 descriptor->SetMissHandler( |
| 336 ExternalReference(IC_Utility(IC::kToBooleanIC_Miss), isolate)); | 311 ExternalReference(IC_Utility(IC::kToBooleanIC_Miss), isolate())); |
| 337 } | 312 } |
| 338 | 313 |
| 339 | 314 |
| 340 void StoreGlobalStub::InitializeInterfaceDescriptor( | 315 void StoreGlobalStub::InitializeInterfaceDescriptor( |
| 341 Isolate* isolate, | |
| 342 CodeStubInterfaceDescriptor* descriptor) { | 316 CodeStubInterfaceDescriptor* descriptor) { |
| 343 static Register registers[] = { edx, ecx, eax }; | 317 static Register registers[] = { edx, ecx, eax }; |
| 344 descriptor->register_param_count_ = 3; | 318 descriptor->register_param_count_ = 3; |
| 345 descriptor->register_params_ = registers; | 319 descriptor->register_params_ = registers; |
| 346 descriptor->deoptimization_handler_ = | 320 descriptor->deoptimization_handler_ = |
| 347 FUNCTION_ADDR(StoreIC_MissFromStubFailure); | 321 FUNCTION_ADDR(StoreIC_MissFromStubFailure); |
| 348 } | 322 } |
| 349 | 323 |
| 350 | 324 |
| 351 void ElementsTransitionAndStoreStub::InitializeInterfaceDescriptor( | 325 void ElementsTransitionAndStoreStub::InitializeInterfaceDescriptor( |
| 352 Isolate* isolate, | |
| 353 CodeStubInterfaceDescriptor* descriptor) { | 326 CodeStubInterfaceDescriptor* descriptor) { |
| 354 static Register registers[] = { eax, ebx, ecx, edx }; | 327 static Register registers[] = { eax, ebx, ecx, edx }; |
| 355 descriptor->register_param_count_ = 4; | 328 descriptor->register_param_count_ = 4; |
| 356 descriptor->register_params_ = registers; | 329 descriptor->register_params_ = registers; |
| 357 descriptor->deoptimization_handler_ = | 330 descriptor->deoptimization_handler_ = |
| 358 FUNCTION_ADDR(ElementsTransitionAndStoreIC_Miss); | 331 FUNCTION_ADDR(ElementsTransitionAndStoreIC_Miss); |
| 359 } | 332 } |
| 360 | 333 |
| 361 | 334 |
| 362 void BinaryOpICStub::InitializeInterfaceDescriptor( | 335 void BinaryOpICStub::InitializeInterfaceDescriptor( |
| 363 Isolate* isolate, | |
| 364 CodeStubInterfaceDescriptor* descriptor) { | 336 CodeStubInterfaceDescriptor* descriptor) { |
| 365 static Register registers[] = { edx, eax }; | 337 static Register registers[] = { edx, eax }; |
| 366 descriptor->register_param_count_ = 2; | 338 descriptor->register_param_count_ = 2; |
| 367 descriptor->register_params_ = registers; | 339 descriptor->register_params_ = registers; |
| 368 descriptor->deoptimization_handler_ = FUNCTION_ADDR(BinaryOpIC_Miss); | 340 descriptor->deoptimization_handler_ = FUNCTION_ADDR(BinaryOpIC_Miss); |
| 369 descriptor->SetMissHandler( | 341 descriptor->SetMissHandler( |
| 370 ExternalReference(IC_Utility(IC::kBinaryOpIC_Miss), isolate)); | 342 ExternalReference(IC_Utility(IC::kBinaryOpIC_Miss), isolate())); |
| 371 } | 343 } |
| 372 | 344 |
| 373 | 345 |
| 374 void BinaryOpWithAllocationSiteStub::InitializeInterfaceDescriptor( | 346 void BinaryOpWithAllocationSiteStub::InitializeInterfaceDescriptor( |
| 375 Isolate* isolate, | |
| 376 CodeStubInterfaceDescriptor* descriptor) { | 347 CodeStubInterfaceDescriptor* descriptor) { |
| 377 static Register registers[] = { ecx, edx, eax }; | 348 static Register registers[] = { ecx, edx, eax }; |
| 378 descriptor->register_param_count_ = 3; | 349 descriptor->register_param_count_ = 3; |
| 379 descriptor->register_params_ = registers; | 350 descriptor->register_params_ = registers; |
| 380 descriptor->deoptimization_handler_ = | 351 descriptor->deoptimization_handler_ = |
| 381 FUNCTION_ADDR(BinaryOpIC_MissWithAllocationSite); | 352 FUNCTION_ADDR(BinaryOpIC_MissWithAllocationSite); |
| 382 } | 353 } |
| 383 | 354 |
| 384 | 355 |
| 385 void StringAddStub::InitializeInterfaceDescriptor( | 356 void StringAddStub::InitializeInterfaceDescriptor( |
| 386 Isolate* isolate, | |
| 387 CodeStubInterfaceDescriptor* descriptor) { | 357 CodeStubInterfaceDescriptor* descriptor) { |
| 388 static Register registers[] = { edx, eax }; | 358 static Register registers[] = { edx, eax }; |
| 389 descriptor->register_param_count_ = 2; | 359 descriptor->register_param_count_ = 2; |
| 390 descriptor->register_params_ = registers; | 360 descriptor->register_params_ = registers; |
| 391 descriptor->deoptimization_handler_ = | 361 descriptor->deoptimization_handler_ = |
| 392 Runtime::FunctionForId(Runtime::kHiddenStringAdd)->entry; | 362 Runtime::FunctionForId(Runtime::kHiddenStringAdd)->entry; |
| 393 } | 363 } |
| 394 | 364 |
| 395 | 365 |
| 396 void CallDescriptors::InitializeForIsolate(Isolate* isolate) { | 366 void CallDescriptors::InitializeForIsolate(Isolate* isolate) { |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 477 } | 447 } |
| 478 | 448 |
| 479 | 449 |
| 480 #define __ ACCESS_MASM(masm) | 450 #define __ ACCESS_MASM(masm) |
| 481 | 451 |
| 482 | 452 |
| 483 void HydrogenCodeStub::GenerateLightweightMiss(MacroAssembler* masm) { | 453 void HydrogenCodeStub::GenerateLightweightMiss(MacroAssembler* masm) { |
| 484 // Update the static counter each time a new code stub is generated. | 454 // Update the static counter each time a new code stub is generated. |
| 485 isolate()->counters()->code_stubs()->Increment(); | 455 isolate()->counters()->code_stubs()->Increment(); |
| 486 | 456 |
| 487 CodeStubInterfaceDescriptor* descriptor = GetInterfaceDescriptor(isolate()); | 457 CodeStubInterfaceDescriptor* descriptor = GetInterfaceDescriptor(); |
| 488 int param_count = descriptor->register_param_count_; | 458 int param_count = descriptor->register_param_count_; |
| 489 { | 459 { |
| 490 // Call the runtime system in a fresh internal frame. | 460 // Call the runtime system in a fresh internal frame. |
| 491 FrameScope scope(masm, StackFrame::INTERNAL); | 461 FrameScope scope(masm, StackFrame::INTERNAL); |
| 492 ASSERT(descriptor->register_param_count_ == 0 || | 462 ASSERT(descriptor->register_param_count_ == 0 || |
| 493 eax.is(descriptor->register_params_[param_count - 1])); | 463 eax.is(descriptor->register_params_[param_count - 1])); |
| 494 // Push arguments | 464 // Push arguments |
| 495 for (int i = 0; i < param_count; ++i) { | 465 for (int i = 0; i < param_count; ++i) { |
| 496 __ push(descriptor->register_params_[i]); | 466 __ push(descriptor->register_params_[i]); |
| 497 } | 467 } |
| (...skipping 2058 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2556 } | 2526 } |
| 2557 } | 2527 } |
| 2558 | 2528 |
| 2559 | 2529 |
| 2560 void CodeStub::GenerateFPStubs(Isolate* isolate) { | 2530 void CodeStub::GenerateFPStubs(Isolate* isolate) { |
| 2561 if (CpuFeatures::IsSupported(SSE2)) { | 2531 if (CpuFeatures::IsSupported(SSE2)) { |
| 2562 CEntryStub save_doubles(isolate, 1, kSaveFPRegs); | 2532 CEntryStub save_doubles(isolate, 1, kSaveFPRegs); |
| 2563 // Stubs might already be in the snapshot, detect that and don't regenerate, | 2533 // Stubs might already be in the snapshot, detect that and don't regenerate, |
| 2564 // which would lead to code stub initialization state being messed up. | 2534 // which would lead to code stub initialization state being messed up. |
| 2565 Code* save_doubles_code; | 2535 Code* save_doubles_code; |
| 2566 if (!save_doubles.FindCodeInCache(&save_doubles_code, isolate)) { | 2536 if (!save_doubles.FindCodeInCache(&save_doubles_code)) { |
| 2567 save_doubles_code = *(save_doubles.GetCode(isolate)); | 2537 save_doubles_code = *(save_doubles.GetCode()); |
| 2568 } | 2538 } |
| 2569 isolate->set_fp_stubs_generated(true); | 2539 isolate->set_fp_stubs_generated(true); |
| 2570 } | 2540 } |
| 2571 } | 2541 } |
| 2572 | 2542 |
| 2573 | 2543 |
| 2574 void CEntryStub::GenerateAheadOfTime(Isolate* isolate) { | 2544 void CEntryStub::GenerateAheadOfTime(Isolate* isolate) { |
| 2575 CEntryStub stub(isolate, 1, kDontSaveFPRegs); | 2545 CEntryStub stub(isolate, 1, kDontSaveFPRegs); |
| 2576 stub.GetCode(isolate); | 2546 stub.GetCode(); |
| 2577 } | 2547 } |
| 2578 | 2548 |
| 2579 | 2549 |
| 2580 void CEntryStub::Generate(MacroAssembler* masm) { | 2550 void CEntryStub::Generate(MacroAssembler* masm) { |
| 2581 // eax: number of arguments including receiver | 2551 // eax: number of arguments including receiver |
| 2582 // ebx: pointer to C function (C callee-saved) | 2552 // ebx: pointer to C function (C callee-saved) |
| 2583 // ebp: frame pointer (restored after C call) | 2553 // ebp: frame pointer (restored after C call) |
| 2584 // esp: stack pointer (restored after C call) | 2554 // esp: stack pointer (restored after C call) |
| 2585 // esi: current context (C callee-saved) | 2555 // esi: current context (C callee-saved) |
| 2586 // edi: JS function of the caller (C callee-saved) | 2556 // edi: JS function of the caller (C callee-saved) |
| (...skipping 1184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3771 __ j(not_equal, &maybe_undefined1, Label::kNear); | 3741 __ j(not_equal, &maybe_undefined1, Label::kNear); |
| 3772 __ cmp(FieldOperand(edx, HeapObject::kMapOffset), | 3742 __ cmp(FieldOperand(edx, HeapObject::kMapOffset), |
| 3773 isolate()->factory()->heap_number_map()); | 3743 isolate()->factory()->heap_number_map()); |
| 3774 __ j(not_equal, &maybe_undefined2, Label::kNear); | 3744 __ j(not_equal, &maybe_undefined2, Label::kNear); |
| 3775 } | 3745 } |
| 3776 | 3746 |
| 3777 __ bind(&unordered); | 3747 __ bind(&unordered); |
| 3778 __ bind(&generic_stub); | 3748 __ bind(&generic_stub); |
| 3779 ICCompareStub stub(isolate(), op_, CompareIC::GENERIC, CompareIC::GENERIC, | 3749 ICCompareStub stub(isolate(), op_, CompareIC::GENERIC, CompareIC::GENERIC, |
| 3780 CompareIC::GENERIC); | 3750 CompareIC::GENERIC); |
| 3781 __ jmp(stub.GetCode(isolate()), RelocInfo::CODE_TARGET); | 3751 __ jmp(stub.GetCode(), RelocInfo::CODE_TARGET); |
| 3782 | 3752 |
| 3783 __ bind(&maybe_undefined1); | 3753 __ bind(&maybe_undefined1); |
| 3784 if (Token::IsOrderedRelationalCompareOp(op_)) { | 3754 if (Token::IsOrderedRelationalCompareOp(op_)) { |
| 3785 __ cmp(eax, Immediate(isolate()->factory()->undefined_value())); | 3755 __ cmp(eax, Immediate(isolate()->factory()->undefined_value())); |
| 3786 __ j(not_equal, &miss); | 3756 __ j(not_equal, &miss); |
| 3787 __ JumpIfSmi(edx, &unordered); | 3757 __ JumpIfSmi(edx, &unordered); |
| 3788 __ CmpObjectType(edx, HEAP_NUMBER_TYPE, ecx); | 3758 __ CmpObjectType(edx, HEAP_NUMBER_TYPE, ecx); |
| 3789 __ j(not_equal, &maybe_undefined2, Label::kNear); | 3759 __ j(not_equal, &maybe_undefined2, Label::kNear); |
| 3790 __ jmp(&unordered); | 3760 __ jmp(&unordered); |
| 3791 } | 3761 } |
| (...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4256 __ bind(¬_in_dictionary); | 4226 __ bind(¬_in_dictionary); |
| 4257 __ mov(result_, Immediate(0)); | 4227 __ mov(result_, Immediate(0)); |
| 4258 __ Drop(1); | 4228 __ Drop(1); |
| 4259 __ ret(2 * kPointerSize); | 4229 __ ret(2 * kPointerSize); |
| 4260 } | 4230 } |
| 4261 | 4231 |
| 4262 | 4232 |
| 4263 void StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime( | 4233 void StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime( |
| 4264 Isolate* isolate) { | 4234 Isolate* isolate) { |
| 4265 StoreBufferOverflowStub stub(isolate, kDontSaveFPRegs); | 4235 StoreBufferOverflowStub stub(isolate, kDontSaveFPRegs); |
| 4266 stub.GetCode(isolate); | 4236 stub.GetCode(); |
| 4267 if (CpuFeatures::IsSafeForSnapshot(SSE2)) { | 4237 if (CpuFeatures::IsSafeForSnapshot(SSE2)) { |
| 4268 StoreBufferOverflowStub stub2(isolate, kSaveFPRegs); | 4238 StoreBufferOverflowStub stub2(isolate, kSaveFPRegs); |
| 4269 stub2.GetCode(isolate); | 4239 stub2.GetCode(); |
| 4270 } | 4240 } |
| 4271 } | 4241 } |
| 4272 | 4242 |
| 4273 | 4243 |
| 4274 bool CodeStub::CanUseFPRegisters() { | 4244 bool CodeStub::CanUseFPRegisters() { |
| 4275 return CpuFeatures::IsSupported(SSE2); | 4245 return CpuFeatures::IsSupported(SSE2); |
| 4276 } | 4246 } |
| 4277 | 4247 |
| 4278 | 4248 |
| 4279 // Takes the input in 3 registers: address_ value_ and object_. A pointer to | 4249 // Takes the input in 3 registers: address_ value_ and object_. A pointer to |
| (...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4550 xmm0, | 4520 xmm0, |
| 4551 &slow_elements_from_double, | 4521 &slow_elements_from_double, |
| 4552 false); | 4522 false); |
| 4553 __ pop(edx); | 4523 __ pop(edx); |
| 4554 __ ret(0); | 4524 __ ret(0); |
| 4555 } | 4525 } |
| 4556 | 4526 |
| 4557 | 4527 |
| 4558 void StubFailureTrampolineStub::Generate(MacroAssembler* masm) { | 4528 void StubFailureTrampolineStub::Generate(MacroAssembler* masm) { |
| 4559 CEntryStub ces(isolate(), 1, fp_registers_ ? kSaveFPRegs : kDontSaveFPRegs); | 4529 CEntryStub ces(isolate(), 1, fp_registers_ ? kSaveFPRegs : kDontSaveFPRegs); |
| 4560 __ call(ces.GetCode(isolate()), RelocInfo::CODE_TARGET); | 4530 __ call(ces.GetCode(), RelocInfo::CODE_TARGET); |
| 4561 int parameter_count_offset = | 4531 int parameter_count_offset = |
| 4562 StubFailureTrampolineFrame::kCallerStackParameterCountFrameOffset; | 4532 StubFailureTrampolineFrame::kCallerStackParameterCountFrameOffset; |
| 4563 __ mov(ebx, MemOperand(ebp, parameter_count_offset)); | 4533 __ mov(ebx, MemOperand(ebp, parameter_count_offset)); |
| 4564 masm->LeaveFrame(StackFrame::STUB_FAILURE_TRAMPOLINE); | 4534 masm->LeaveFrame(StackFrame::STUB_FAILURE_TRAMPOLINE); |
| 4565 __ pop(ecx); | 4535 __ pop(ecx); |
| 4566 int additional_offset = function_mode_ == JS_FUNCTION_STUB_MODE | 4536 int additional_offset = function_mode_ == JS_FUNCTION_STUB_MODE |
| 4567 ? kPointerSize | 4537 ? kPointerSize |
| 4568 : 0; | 4538 : 0; |
| 4569 __ lea(esp, MemOperand(esp, ebx, times_pointer_size, additional_offset)); | 4539 __ lea(esp, MemOperand(esp, ebx, times_pointer_size, additional_offset)); |
| 4570 __ jmp(ecx); // Return to IC Miss stub, continuation still on stack. | 4540 __ jmp(ecx); // Return to IC Miss stub, continuation still on stack. |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4721 } | 4691 } |
| 4722 | 4692 |
| 4723 | 4693 |
| 4724 template<class T> | 4694 template<class T> |
| 4725 static void ArrayConstructorStubAheadOfTimeHelper(Isolate* isolate) { | 4695 static void ArrayConstructorStubAheadOfTimeHelper(Isolate* isolate) { |
| 4726 int to_index = GetSequenceIndexFromFastElementsKind( | 4696 int to_index = GetSequenceIndexFromFastElementsKind( |
| 4727 TERMINAL_FAST_ELEMENTS_KIND); | 4697 TERMINAL_FAST_ELEMENTS_KIND); |
| 4728 for (int i = 0; i <= to_index; ++i) { | 4698 for (int i = 0; i <= to_index; ++i) { |
| 4729 ElementsKind kind = GetFastElementsKindFromSequenceIndex(i); | 4699 ElementsKind kind = GetFastElementsKindFromSequenceIndex(i); |
| 4730 T stub(isolate, kind); | 4700 T stub(isolate, kind); |
| 4731 stub.GetCode(isolate); | 4701 stub.GetCode(); |
| 4732 if (AllocationSite::GetMode(kind) != DONT_TRACK_ALLOCATION_SITE) { | 4702 if (AllocationSite::GetMode(kind) != DONT_TRACK_ALLOCATION_SITE) { |
| 4733 T stub1(isolate, kind, DISABLE_ALLOCATION_SITES); | 4703 T stub1(isolate, kind, DISABLE_ALLOCATION_SITES); |
| 4734 stub1.GetCode(isolate); | 4704 stub1.GetCode(); |
| 4735 } | 4705 } |
| 4736 } | 4706 } |
| 4737 } | 4707 } |
| 4738 | 4708 |
| 4739 | 4709 |
| 4740 void ArrayConstructorStubBase::GenerateStubsAheadOfTime(Isolate* isolate) { | 4710 void ArrayConstructorStubBase::GenerateStubsAheadOfTime(Isolate* isolate) { |
| 4741 ArrayConstructorStubAheadOfTimeHelper<ArrayNoArgumentConstructorStub>( | 4711 ArrayConstructorStubAheadOfTimeHelper<ArrayNoArgumentConstructorStub>( |
| 4742 isolate); | 4712 isolate); |
| 4743 ArrayConstructorStubAheadOfTimeHelper<ArraySingleArgumentConstructorStub>( | 4713 ArrayConstructorStubAheadOfTimeHelper<ArraySingleArgumentConstructorStub>( |
| 4744 isolate); | 4714 isolate); |
| 4745 ArrayConstructorStubAheadOfTimeHelper<ArrayNArgumentsConstructorStub>( | 4715 ArrayConstructorStubAheadOfTimeHelper<ArrayNArgumentsConstructorStub>( |
| 4746 isolate); | 4716 isolate); |
| 4747 } | 4717 } |
| 4748 | 4718 |
| 4749 | 4719 |
| 4750 void InternalArrayConstructorStubBase::GenerateStubsAheadOfTime( | 4720 void InternalArrayConstructorStubBase::GenerateStubsAheadOfTime( |
| 4751 Isolate* isolate) { | 4721 Isolate* isolate) { |
| 4752 ElementsKind kinds[2] = { FAST_ELEMENTS, FAST_HOLEY_ELEMENTS }; | 4722 ElementsKind kinds[2] = { FAST_ELEMENTS, FAST_HOLEY_ELEMENTS }; |
| 4753 for (int i = 0; i < 2; i++) { | 4723 for (int i = 0; i < 2; i++) { |
| 4754 // For internal arrays we only need a few things | 4724 // For internal arrays we only need a few things |
| 4755 InternalArrayNoArgumentConstructorStub stubh1(isolate, kinds[i]); | 4725 InternalArrayNoArgumentConstructorStub stubh1(isolate, kinds[i]); |
| 4756 stubh1.GetCode(isolate); | 4726 stubh1.GetCode(); |
| 4757 InternalArraySingleArgumentConstructorStub stubh2(isolate, kinds[i]); | 4727 InternalArraySingleArgumentConstructorStub stubh2(isolate, kinds[i]); |
| 4758 stubh2.GetCode(isolate); | 4728 stubh2.GetCode(); |
| 4759 InternalArrayNArgumentsConstructorStub stubh3(isolate, kinds[i]); | 4729 InternalArrayNArgumentsConstructorStub stubh3(isolate, kinds[i]); |
| 4760 stubh3.GetCode(isolate); | 4730 stubh3.GetCode(); |
| 4761 } | 4731 } |
| 4762 } | 4732 } |
| 4763 | 4733 |
| 4764 | 4734 |
| 4765 void ArrayConstructorStub::GenerateDispatchToArrayStub( | 4735 void ArrayConstructorStub::GenerateDispatchToArrayStub( |
| 4766 MacroAssembler* masm, | 4736 MacroAssembler* masm, |
| 4767 AllocationSiteOverrideMode mode) { | 4737 AllocationSiteOverrideMode mode) { |
| 4768 if (argument_count_ == ANY) { | 4738 if (argument_count_ == ANY) { |
| 4769 Label not_zero_case, not_one_case; | 4739 Label not_zero_case, not_one_case; |
| 4770 __ test(eax, eax); | 4740 __ test(eax, eax); |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5074 Operand(ebp, 7 * kPointerSize), | 5044 Operand(ebp, 7 * kPointerSize), |
| 5075 NULL); | 5045 NULL); |
| 5076 } | 5046 } |
| 5077 | 5047 |
| 5078 | 5048 |
| 5079 #undef __ | 5049 #undef __ |
| 5080 | 5050 |
| 5081 } } // namespace v8::internal | 5051 } } // namespace v8::internal |
| 5082 | 5052 |
| 5083 #endif // V8_TARGET_ARCH_IA32 | 5053 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |