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

Side by Side Diff: src/x64/code-stubs-x64.cc

Issue 255543003: CodeStubs contain their corresponding Isolate* now. (part 2) (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 8 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
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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 22 matching lines...) Expand all
33 #include "code-stubs.h" 33 #include "code-stubs.h"
34 #include "regexp-macro-assembler.h" 34 #include "regexp-macro-assembler.h"
35 #include "stub-cache.h" 35 #include "stub-cache.h"
36 #include "runtime.h" 36 #include "runtime.h"
37 37
38 namespace v8 { 38 namespace v8 {
39 namespace internal { 39 namespace internal {
40 40
41 41
42 void FastNewClosureStub::InitializeInterfaceDescriptor( 42 void FastNewClosureStub::InitializeInterfaceDescriptor(
43 Isolate* isolate,
44 CodeStubInterfaceDescriptor* descriptor) { 43 CodeStubInterfaceDescriptor* descriptor) {
45 static Register registers[] = { rbx }; 44 static Register registers[] = { rbx };
46 descriptor->register_param_count_ = 1; 45 descriptor->register_param_count_ = 1;
47 descriptor->register_params_ = registers; 46 descriptor->register_params_ = registers;
48 descriptor->deoptimization_handler_ = 47 descriptor->deoptimization_handler_ =
49 Runtime::FunctionForId(Runtime::kHiddenNewClosureFromStubFailure)->entry; 48 Runtime::FunctionForId(Runtime::kHiddenNewClosureFromStubFailure)->entry;
50 } 49 }
51 50
52 51
53 void FastNewContextStub::InitializeInterfaceDescriptor( 52 void FastNewContextStub::InitializeInterfaceDescriptor(
54 Isolate* isolate,
55 CodeStubInterfaceDescriptor* descriptor) { 53 CodeStubInterfaceDescriptor* descriptor) {
56 static Register registers[] = { rdi }; 54 static Register registers[] = { rdi };
57 descriptor->register_param_count_ = 1; 55 descriptor->register_param_count_ = 1;
58 descriptor->register_params_ = registers; 56 descriptor->register_params_ = registers;
59 descriptor->deoptimization_handler_ = NULL; 57 descriptor->deoptimization_handler_ = NULL;
60 } 58 }
61 59
62 60
63 void ToNumberStub::InitializeInterfaceDescriptor( 61 void ToNumberStub::InitializeInterfaceDescriptor(
64 Isolate* isolate,
65 CodeStubInterfaceDescriptor* descriptor) { 62 CodeStubInterfaceDescriptor* descriptor) {
66 static Register registers[] = { rax }; 63 static Register registers[] = { rax };
67 descriptor->register_param_count_ = 1; 64 descriptor->register_param_count_ = 1;
68 descriptor->register_params_ = registers; 65 descriptor->register_params_ = registers;
69 descriptor->deoptimization_handler_ = NULL; 66 descriptor->deoptimization_handler_ = NULL;
70 } 67 }
71 68
72 69
73 void NumberToStringStub::InitializeInterfaceDescriptor( 70 void NumberToStringStub::InitializeInterfaceDescriptor(
74 Isolate* isolate,
75 CodeStubInterfaceDescriptor* descriptor) { 71 CodeStubInterfaceDescriptor* descriptor) {
76 static Register registers[] = { rax }; 72 static Register registers[] = { rax };
77 descriptor->register_param_count_ = 1; 73 descriptor->register_param_count_ = 1;
78 descriptor->register_params_ = registers; 74 descriptor->register_params_ = registers;
79 descriptor->deoptimization_handler_ = 75 descriptor->deoptimization_handler_ =
80 Runtime::FunctionForId(Runtime::kHiddenNumberToString)->entry; 76 Runtime::FunctionForId(Runtime::kHiddenNumberToString)->entry;
81 } 77 }
82 78
83 79
84 void FastCloneShallowArrayStub::InitializeInterfaceDescriptor( 80 void FastCloneShallowArrayStub::InitializeInterfaceDescriptor(
85 Isolate* isolate,
86 CodeStubInterfaceDescriptor* descriptor) { 81 CodeStubInterfaceDescriptor* descriptor) {
87 static Register registers[] = { rax, rbx, rcx }; 82 static Register registers[] = { rax, rbx, rcx };
88 descriptor->register_param_count_ = 3; 83 descriptor->register_param_count_ = 3;
89 descriptor->register_params_ = registers; 84 descriptor->register_params_ = registers;
90 descriptor->deoptimization_handler_ = 85 descriptor->deoptimization_handler_ =
91 Runtime::FunctionForId( 86 Runtime::FunctionForId(
92 Runtime::kHiddenCreateArrayLiteralStubBailout)->entry; 87 Runtime::kHiddenCreateArrayLiteralStubBailout)->entry;
93 } 88 }
94 89
95 90
96 void FastCloneShallowObjectStub::InitializeInterfaceDescriptor( 91 void FastCloneShallowObjectStub::InitializeInterfaceDescriptor(
97 Isolate* isolate,
98 CodeStubInterfaceDescriptor* descriptor) { 92 CodeStubInterfaceDescriptor* descriptor) {
99 static Register registers[] = { rax, rbx, rcx, rdx }; 93 static Register registers[] = { rax, rbx, rcx, rdx };
100 descriptor->register_param_count_ = 4; 94 descriptor->register_param_count_ = 4;
101 descriptor->register_params_ = registers; 95 descriptor->register_params_ = registers;
102 descriptor->deoptimization_handler_ = 96 descriptor->deoptimization_handler_ =
103 Runtime::FunctionForId(Runtime::kHiddenCreateObjectLiteral)->entry; 97 Runtime::FunctionForId(Runtime::kHiddenCreateObjectLiteral)->entry;
104 } 98 }
105 99
106 100
107 void CreateAllocationSiteStub::InitializeInterfaceDescriptor( 101 void CreateAllocationSiteStub::InitializeInterfaceDescriptor(
108 Isolate* isolate,
109 CodeStubInterfaceDescriptor* descriptor) { 102 CodeStubInterfaceDescriptor* descriptor) {
110 static Register registers[] = { rbx, rdx }; 103 static Register registers[] = { rbx, rdx };
111 descriptor->register_param_count_ = 2; 104 descriptor->register_param_count_ = 2;
112 descriptor->register_params_ = registers; 105 descriptor->register_params_ = registers;
113 descriptor->deoptimization_handler_ = NULL; 106 descriptor->deoptimization_handler_ = NULL;
114 } 107 }
115 108
116 109
117 void KeyedLoadFastElementStub::InitializeInterfaceDescriptor( 110 void KeyedLoadFastElementStub::InitializeInterfaceDescriptor(
118 Isolate* isolate,
119 CodeStubInterfaceDescriptor* descriptor) { 111 CodeStubInterfaceDescriptor* descriptor) {
120 static Register registers[] = { rdx, rax }; 112 static Register registers[] = { rdx, rax };
121 descriptor->register_param_count_ = 2; 113 descriptor->register_param_count_ = 2;
122 descriptor->register_params_ = registers; 114 descriptor->register_params_ = registers;
123 descriptor->deoptimization_handler_ = 115 descriptor->deoptimization_handler_ =
124 FUNCTION_ADDR(KeyedLoadIC_MissFromStubFailure); 116 FUNCTION_ADDR(KeyedLoadIC_MissFromStubFailure);
125 } 117 }
126 118
127 119
128 void KeyedLoadDictionaryElementStub::InitializeInterfaceDescriptor( 120 void KeyedLoadDictionaryElementStub::InitializeInterfaceDescriptor(
129 Isolate* isolate,
130 CodeStubInterfaceDescriptor* descriptor) { 121 CodeStubInterfaceDescriptor* descriptor) {
131 static Register registers[] = { rdx, rax }; 122 static Register registers[] = { rdx, rax };
132 descriptor->register_param_count_ = 2; 123 descriptor->register_param_count_ = 2;
133 descriptor->register_params_ = registers; 124 descriptor->register_params_ = registers;
134 descriptor->deoptimization_handler_ = 125 descriptor->deoptimization_handler_ =
135 FUNCTION_ADDR(KeyedLoadIC_MissFromStubFailure); 126 FUNCTION_ADDR(KeyedLoadIC_MissFromStubFailure);
136 } 127 }
137 128
138 129
139 void RegExpConstructResultStub::InitializeInterfaceDescriptor( 130 void RegExpConstructResultStub::InitializeInterfaceDescriptor(
140 Isolate* isolate,
141 CodeStubInterfaceDescriptor* descriptor) { 131 CodeStubInterfaceDescriptor* descriptor) {
142 static Register registers[] = { rcx, rbx, rax }; 132 static Register registers[] = { rcx, rbx, rax };
143 descriptor->register_param_count_ = 3; 133 descriptor->register_param_count_ = 3;
144 descriptor->register_params_ = registers; 134 descriptor->register_params_ = registers;
145 descriptor->deoptimization_handler_ = 135 descriptor->deoptimization_handler_ =
146 Runtime::FunctionForId(Runtime::kHiddenRegExpConstructResult)->entry; 136 Runtime::FunctionForId(Runtime::kHiddenRegExpConstructResult)->entry;
147 } 137 }
148 138
149 139
150 void LoadFieldStub::InitializeInterfaceDescriptor( 140 void LoadFieldStub::InitializeInterfaceDescriptor(
151 Isolate* isolate,
152 CodeStubInterfaceDescriptor* descriptor) { 141 CodeStubInterfaceDescriptor* descriptor) {
153 static Register registers[] = { rax }; 142 static Register registers[] = { rax };
154 descriptor->register_param_count_ = 1; 143 descriptor->register_param_count_ = 1;
155 descriptor->register_params_ = registers; 144 descriptor->register_params_ = registers;
156 descriptor->deoptimization_handler_ = NULL; 145 descriptor->deoptimization_handler_ = NULL;
157 } 146 }
158 147
159 148
160 void KeyedLoadFieldStub::InitializeInterfaceDescriptor( 149 void KeyedLoadFieldStub::InitializeInterfaceDescriptor(
161 Isolate* isolate,
162 CodeStubInterfaceDescriptor* descriptor) { 150 CodeStubInterfaceDescriptor* descriptor) {
163 static Register registers[] = { rdx }; 151 static Register registers[] = { rdx };
164 descriptor->register_param_count_ = 1; 152 descriptor->register_param_count_ = 1;
165 descriptor->register_params_ = registers; 153 descriptor->register_params_ = registers;
166 descriptor->deoptimization_handler_ = NULL; 154 descriptor->deoptimization_handler_ = NULL;
167 } 155 }
168 156
169 157
170 void StringLengthStub::InitializeInterfaceDescriptor( 158 void StringLengthStub::InitializeInterfaceDescriptor(
171 Isolate* isolate,
172 CodeStubInterfaceDescriptor* descriptor) { 159 CodeStubInterfaceDescriptor* descriptor) {
173 static Register registers[] = { rax, rcx }; 160 static Register registers[] = { rax, rcx };
174 descriptor->register_param_count_ = 2; 161 descriptor->register_param_count_ = 2;
175 descriptor->register_params_ = registers; 162 descriptor->register_params_ = registers;
176 descriptor->deoptimization_handler_ = NULL; 163 descriptor->deoptimization_handler_ = NULL;
177 } 164 }
178 165
179 166
180 void KeyedStringLengthStub::InitializeInterfaceDescriptor( 167 void KeyedStringLengthStub::InitializeInterfaceDescriptor(
181 Isolate* isolate,
182 CodeStubInterfaceDescriptor* descriptor) { 168 CodeStubInterfaceDescriptor* descriptor) {
183 static Register registers[] = { rdx, rax }; 169 static Register registers[] = { rdx, rax };
184 descriptor->register_param_count_ = 2; 170 descriptor->register_param_count_ = 2;
185 descriptor->register_params_ = registers; 171 descriptor->register_params_ = registers;
186 descriptor->deoptimization_handler_ = NULL; 172 descriptor->deoptimization_handler_ = NULL;
187 } 173 }
188 174
189 175
190 void KeyedStoreFastElementStub::InitializeInterfaceDescriptor( 176 void KeyedStoreFastElementStub::InitializeInterfaceDescriptor(
191 Isolate* isolate,
192 CodeStubInterfaceDescriptor* descriptor) { 177 CodeStubInterfaceDescriptor* descriptor) {
193 static Register registers[] = { rdx, rcx, rax }; 178 static Register registers[] = { rdx, rcx, rax };
194 descriptor->register_param_count_ = 3; 179 descriptor->register_param_count_ = 3;
195 descriptor->register_params_ = registers; 180 descriptor->register_params_ = registers;
196 descriptor->deoptimization_handler_ = 181 descriptor->deoptimization_handler_ =
197 FUNCTION_ADDR(KeyedStoreIC_MissFromStubFailure); 182 FUNCTION_ADDR(KeyedStoreIC_MissFromStubFailure);
198 } 183 }
199 184
200 185
201 void TransitionElementsKindStub::InitializeInterfaceDescriptor( 186 void TransitionElementsKindStub::InitializeInterfaceDescriptor(
202 Isolate* isolate,
203 CodeStubInterfaceDescriptor* descriptor) { 187 CodeStubInterfaceDescriptor* descriptor) {
204 static Register registers[] = { rax, rbx }; 188 static Register registers[] = { rax, rbx };
205 descriptor->register_param_count_ = 2; 189 descriptor->register_param_count_ = 2;
206 descriptor->register_params_ = registers; 190 descriptor->register_params_ = registers;
207 descriptor->deoptimization_handler_ = 191 descriptor->deoptimization_handler_ =
208 Runtime::FunctionForId(Runtime::kTransitionElementsKind)->entry; 192 Runtime::FunctionForId(Runtime::kTransitionElementsKind)->entry;
209 } 193 }
210 194
211 195
212 static void InitializeArrayConstructorDescriptor( 196 static void InitializeArrayConstructorDescriptor(
213 Isolate* isolate,
214 CodeStubInterfaceDescriptor* descriptor, 197 CodeStubInterfaceDescriptor* descriptor,
215 int constant_stack_parameter_count) { 198 int constant_stack_parameter_count) {
216 // register state 199 // register state
217 // rax -- number of arguments 200 // rax -- number of arguments
218 // rdi -- function 201 // rdi -- function
219 // rbx -- allocation site with elements kind 202 // rbx -- allocation site with elements kind
220 static Register registers_variable_args[] = { rdi, rbx, rax }; 203 static Register registers_variable_args[] = { rdi, rbx, rax };
221 static Register registers_no_args[] = { rdi, rbx }; 204 static Register registers_no_args[] = { rdi, rbx };
222 205
223 if (constant_stack_parameter_count == 0) { 206 if (constant_stack_parameter_count == 0) {
224 descriptor->register_param_count_ = 2; 207 descriptor->register_param_count_ = 2;
225 descriptor->register_params_ = registers_no_args; 208 descriptor->register_params_ = registers_no_args;
226 } else { 209 } else {
227 // stack param count needs (constructor pointer, and single argument) 210 // stack param count needs (constructor pointer, and single argument)
228 descriptor->handler_arguments_mode_ = PASS_ARGUMENTS; 211 descriptor->handler_arguments_mode_ = PASS_ARGUMENTS;
229 descriptor->stack_parameter_count_ = rax; 212 descriptor->stack_parameter_count_ = rax;
230 descriptor->register_param_count_ = 3; 213 descriptor->register_param_count_ = 3;
231 descriptor->register_params_ = registers_variable_args; 214 descriptor->register_params_ = registers_variable_args;
232 } 215 }
233 216
234 descriptor->hint_stack_parameter_count_ = constant_stack_parameter_count; 217 descriptor->hint_stack_parameter_count_ = constant_stack_parameter_count;
235 descriptor->function_mode_ = JS_FUNCTION_STUB_MODE; 218 descriptor->function_mode_ = JS_FUNCTION_STUB_MODE;
236 descriptor->deoptimization_handler_ = 219 descriptor->deoptimization_handler_ =
237 Runtime::FunctionForId(Runtime::kHiddenArrayConstructor)->entry; 220 Runtime::FunctionForId(Runtime::kHiddenArrayConstructor)->entry;
238 } 221 }
239 222
240 223
241 static void InitializeInternalArrayConstructorDescriptor( 224 static void InitializeInternalArrayConstructorDescriptor(
242 Isolate* isolate,
243 CodeStubInterfaceDescriptor* descriptor, 225 CodeStubInterfaceDescriptor* descriptor,
244 int constant_stack_parameter_count) { 226 int constant_stack_parameter_count) {
245 // register state 227 // register state
246 // rax -- number of arguments 228 // rax -- number of arguments
247 // rdi -- constructor function 229 // rdi -- constructor function
248 static Register registers_variable_args[] = { rdi, rax }; 230 static Register registers_variable_args[] = { rdi, rax };
249 static Register registers_no_args[] = { rdi }; 231 static Register registers_no_args[] = { rdi };
250 232
251 if (constant_stack_parameter_count == 0) { 233 if (constant_stack_parameter_count == 0) {
252 descriptor->register_param_count_ = 1; 234 descriptor->register_param_count_ = 1;
253 descriptor->register_params_ = registers_no_args; 235 descriptor->register_params_ = registers_no_args;
254 } else { 236 } else {
255 // stack param count needs (constructor pointer, and single argument) 237 // stack param count needs (constructor pointer, and single argument)
256 descriptor->handler_arguments_mode_ = PASS_ARGUMENTS; 238 descriptor->handler_arguments_mode_ = PASS_ARGUMENTS;
257 descriptor->stack_parameter_count_ = rax; 239 descriptor->stack_parameter_count_ = rax;
258 descriptor->register_param_count_ = 2; 240 descriptor->register_param_count_ = 2;
259 descriptor->register_params_ = registers_variable_args; 241 descriptor->register_params_ = registers_variable_args;
260 } 242 }
261 243
262 descriptor->hint_stack_parameter_count_ = constant_stack_parameter_count; 244 descriptor->hint_stack_parameter_count_ = constant_stack_parameter_count;
263 descriptor->function_mode_ = JS_FUNCTION_STUB_MODE; 245 descriptor->function_mode_ = JS_FUNCTION_STUB_MODE;
264 descriptor->deoptimization_handler_ = 246 descriptor->deoptimization_handler_ =
265 Runtime::FunctionForId(Runtime::kHiddenInternalArrayConstructor)->entry; 247 Runtime::FunctionForId(Runtime::kHiddenInternalArrayConstructor)->entry;
266 } 248 }
267 249
268 250
269 void ArrayNoArgumentConstructorStub::InitializeInterfaceDescriptor( 251 void ArrayNoArgumentConstructorStub::InitializeInterfaceDescriptor(
270 Isolate* isolate,
271 CodeStubInterfaceDescriptor* descriptor) { 252 CodeStubInterfaceDescriptor* descriptor) {
272 InitializeArrayConstructorDescriptor(isolate, descriptor, 0); 253 InitializeArrayConstructorDescriptor(descriptor, 0);
273 } 254 }
274 255
275 256
276 void ArraySingleArgumentConstructorStub::InitializeInterfaceDescriptor( 257 void ArraySingleArgumentConstructorStub::InitializeInterfaceDescriptor(
277 Isolate* isolate,
278 CodeStubInterfaceDescriptor* descriptor) { 258 CodeStubInterfaceDescriptor* descriptor) {
279 InitializeArrayConstructorDescriptor(isolate, descriptor, 1); 259 InitializeArrayConstructorDescriptor(descriptor, 1);
280 } 260 }
281 261
282 262
283 void ArrayNArgumentsConstructorStub::InitializeInterfaceDescriptor( 263 void ArrayNArgumentsConstructorStub::InitializeInterfaceDescriptor(
284 Isolate* isolate,
285 CodeStubInterfaceDescriptor* descriptor) { 264 CodeStubInterfaceDescriptor* descriptor) {
286 InitializeArrayConstructorDescriptor(isolate, descriptor, -1); 265 InitializeArrayConstructorDescriptor(descriptor, -1);
287 } 266 }
288 267
289 268
290 void InternalArrayNoArgumentConstructorStub::InitializeInterfaceDescriptor( 269 void InternalArrayNoArgumentConstructorStub::InitializeInterfaceDescriptor(
291 Isolate* isolate,
292 CodeStubInterfaceDescriptor* descriptor) { 270 CodeStubInterfaceDescriptor* descriptor) {
293 InitializeInternalArrayConstructorDescriptor(isolate, descriptor, 0); 271 InitializeInternalArrayConstructorDescriptor(descriptor, 0);
294 } 272 }
295 273
296 274
297 void InternalArraySingleArgumentConstructorStub::InitializeInterfaceDescriptor( 275 void InternalArraySingleArgumentConstructorStub::InitializeInterfaceDescriptor(
298 Isolate* isolate,
299 CodeStubInterfaceDescriptor* descriptor) { 276 CodeStubInterfaceDescriptor* descriptor) {
300 InitializeInternalArrayConstructorDescriptor(isolate, descriptor, 1); 277 InitializeInternalArrayConstructorDescriptor(descriptor, 1);
301 } 278 }
302 279
303 280
304 void InternalArrayNArgumentsConstructorStub::InitializeInterfaceDescriptor( 281 void InternalArrayNArgumentsConstructorStub::InitializeInterfaceDescriptor(
305 Isolate* isolate,
306 CodeStubInterfaceDescriptor* descriptor) { 282 CodeStubInterfaceDescriptor* descriptor) {
307 InitializeInternalArrayConstructorDescriptor(isolate, descriptor, -1); 283 InitializeInternalArrayConstructorDescriptor(descriptor, -1);
308 } 284 }
309 285
310 286
311 void CompareNilICStub::InitializeInterfaceDescriptor( 287 void CompareNilICStub::InitializeInterfaceDescriptor(
312 Isolate* isolate,
313 CodeStubInterfaceDescriptor* descriptor) { 288 CodeStubInterfaceDescriptor* descriptor) {
314 static Register registers[] = { rax }; 289 static Register registers[] = { rax };
315 descriptor->register_param_count_ = 1; 290 descriptor->register_param_count_ = 1;
316 descriptor->register_params_ = registers; 291 descriptor->register_params_ = registers;
317 descriptor->deoptimization_handler_ = 292 descriptor->deoptimization_handler_ =
318 FUNCTION_ADDR(CompareNilIC_Miss); 293 FUNCTION_ADDR(CompareNilIC_Miss);
319 descriptor->SetMissHandler( 294 descriptor->SetMissHandler(
320 ExternalReference(IC_Utility(IC::kCompareNilIC_Miss), isolate)); 295 ExternalReference(IC_Utility(IC::kCompareNilIC_Miss), isolate()));
321 } 296 }
322 297
323 298
324 void ToBooleanStub::InitializeInterfaceDescriptor( 299 void ToBooleanStub::InitializeInterfaceDescriptor(
325 Isolate* isolate,
326 CodeStubInterfaceDescriptor* descriptor) { 300 CodeStubInterfaceDescriptor* descriptor) {
327 static Register registers[] = { rax }; 301 static Register registers[] = { rax };
328 descriptor->register_param_count_ = 1; 302 descriptor->register_param_count_ = 1;
329 descriptor->register_params_ = registers; 303 descriptor->register_params_ = registers;
330 descriptor->deoptimization_handler_ = 304 descriptor->deoptimization_handler_ =
331 FUNCTION_ADDR(ToBooleanIC_Miss); 305 FUNCTION_ADDR(ToBooleanIC_Miss);
332 descriptor->SetMissHandler( 306 descriptor->SetMissHandler(
333 ExternalReference(IC_Utility(IC::kToBooleanIC_Miss), isolate)); 307 ExternalReference(IC_Utility(IC::kToBooleanIC_Miss), isolate()));
334 } 308 }
335 309
336 310
337 void StoreGlobalStub::InitializeInterfaceDescriptor( 311 void StoreGlobalStub::InitializeInterfaceDescriptor(
338 Isolate* isolate,
339 CodeStubInterfaceDescriptor* descriptor) { 312 CodeStubInterfaceDescriptor* descriptor) {
340 static Register registers[] = { rdx, rcx, rax }; 313 static Register registers[] = { rdx, rcx, rax };
341 descriptor->register_param_count_ = 3; 314 descriptor->register_param_count_ = 3;
342 descriptor->register_params_ = registers; 315 descriptor->register_params_ = registers;
343 descriptor->deoptimization_handler_ = 316 descriptor->deoptimization_handler_ =
344 FUNCTION_ADDR(StoreIC_MissFromStubFailure); 317 FUNCTION_ADDR(StoreIC_MissFromStubFailure);
345 } 318 }
346 319
347 320
348 void ElementsTransitionAndStoreStub::InitializeInterfaceDescriptor( 321 void ElementsTransitionAndStoreStub::InitializeInterfaceDescriptor(
349 Isolate* isolate,
350 CodeStubInterfaceDescriptor* descriptor) { 322 CodeStubInterfaceDescriptor* descriptor) {
351 static Register registers[] = { rax, rbx, rcx, rdx }; 323 static Register registers[] = { rax, rbx, rcx, rdx };
352 descriptor->register_param_count_ = 4; 324 descriptor->register_param_count_ = 4;
353 descriptor->register_params_ = registers; 325 descriptor->register_params_ = registers;
354 descriptor->deoptimization_handler_ = 326 descriptor->deoptimization_handler_ =
355 FUNCTION_ADDR(ElementsTransitionAndStoreIC_Miss); 327 FUNCTION_ADDR(ElementsTransitionAndStoreIC_Miss);
356 } 328 }
357 329
358 330
359 void BinaryOpICStub::InitializeInterfaceDescriptor( 331 void BinaryOpICStub::InitializeInterfaceDescriptor(
360 Isolate* isolate,
361 CodeStubInterfaceDescriptor* descriptor) { 332 CodeStubInterfaceDescriptor* descriptor) {
362 static Register registers[] = { rdx, rax }; 333 static Register registers[] = { rdx, rax };
363 descriptor->register_param_count_ = 2; 334 descriptor->register_param_count_ = 2;
364 descriptor->register_params_ = registers; 335 descriptor->register_params_ = registers;
365 descriptor->deoptimization_handler_ = FUNCTION_ADDR(BinaryOpIC_Miss); 336 descriptor->deoptimization_handler_ = FUNCTION_ADDR(BinaryOpIC_Miss);
366 descriptor->SetMissHandler( 337 descriptor->SetMissHandler(
367 ExternalReference(IC_Utility(IC::kBinaryOpIC_Miss), isolate)); 338 ExternalReference(IC_Utility(IC::kBinaryOpIC_Miss), isolate()));
368 } 339 }
369 340
370 341
371 void BinaryOpWithAllocationSiteStub::InitializeInterfaceDescriptor( 342 void BinaryOpWithAllocationSiteStub::InitializeInterfaceDescriptor(
372 Isolate* isolate,
373 CodeStubInterfaceDescriptor* descriptor) { 343 CodeStubInterfaceDescriptor* descriptor) {
374 static Register registers[] = { rcx, rdx, rax }; 344 static Register registers[] = { rcx, rdx, rax };
375 descriptor->register_param_count_ = 3; 345 descriptor->register_param_count_ = 3;
376 descriptor->register_params_ = registers; 346 descriptor->register_params_ = registers;
377 descriptor->deoptimization_handler_ = 347 descriptor->deoptimization_handler_ =
378 FUNCTION_ADDR(BinaryOpIC_MissWithAllocationSite); 348 FUNCTION_ADDR(BinaryOpIC_MissWithAllocationSite);
379 } 349 }
380 350
381 351
382 void StringAddStub::InitializeInterfaceDescriptor( 352 void StringAddStub::InitializeInterfaceDescriptor(
383 Isolate* isolate,
384 CodeStubInterfaceDescriptor* descriptor) { 353 CodeStubInterfaceDescriptor* descriptor) {
385 static Register registers[] = { rdx, rax }; 354 static Register registers[] = { rdx, rax };
386 descriptor->register_param_count_ = 2; 355 descriptor->register_param_count_ = 2;
387 descriptor->register_params_ = registers; 356 descriptor->register_params_ = registers;
388 descriptor->deoptimization_handler_ = 357 descriptor->deoptimization_handler_ =
389 Runtime::FunctionForId(Runtime::kHiddenStringAdd)->entry; 358 Runtime::FunctionForId(Runtime::kHiddenStringAdd)->entry;
390 } 359 }
391 360
392 361
393 void CallDescriptors::InitializeForIsolate(Isolate* isolate) { 362 void CallDescriptors::InitializeForIsolate(Isolate* isolate) {
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
474 } 443 }
475 444
476 445
477 #define __ ACCESS_MASM(masm) 446 #define __ ACCESS_MASM(masm)
478 447
479 448
480 void HydrogenCodeStub::GenerateLightweightMiss(MacroAssembler* masm) { 449 void HydrogenCodeStub::GenerateLightweightMiss(MacroAssembler* masm) {
481 // Update the static counter each time a new code stub is generated. 450 // Update the static counter each time a new code stub is generated.
482 isolate()->counters()->code_stubs()->Increment(); 451 isolate()->counters()->code_stubs()->Increment();
483 452
484 CodeStubInterfaceDescriptor* descriptor = GetInterfaceDescriptor(isolate()); 453 CodeStubInterfaceDescriptor* descriptor = GetInterfaceDescriptor();
485 int param_count = descriptor->register_param_count_; 454 int param_count = descriptor->register_param_count_;
486 { 455 {
487 // Call the runtime system in a fresh internal frame. 456 // Call the runtime system in a fresh internal frame.
488 FrameScope scope(masm, StackFrame::INTERNAL); 457 FrameScope scope(masm, StackFrame::INTERNAL);
489 ASSERT(descriptor->register_param_count_ == 0 || 458 ASSERT(descriptor->register_param_count_ == 0 ||
490 rax.is(descriptor->register_params_[param_count - 1])); 459 rax.is(descriptor->register_params_[param_count - 1]));
491 // Push arguments 460 // Push arguments
492 for (int i = 0; i < param_count; ++i) { 461 for (int i = 0; i < param_count; ++i) {
493 __ Push(descriptor->register_params_[i]); 462 __ Push(descriptor->register_params_[i]);
494 } 463 }
(...skipping 1897 matching lines...) Expand 10 before | Expand all | Expand 10 after
2392 BinaryOpICWithAllocationSiteStub::GenerateAheadOfTime(isolate); 2361 BinaryOpICWithAllocationSiteStub::GenerateAheadOfTime(isolate);
2393 } 2362 }
2394 2363
2395 2364
2396 void CodeStub::GenerateFPStubs(Isolate* isolate) { 2365 void CodeStub::GenerateFPStubs(Isolate* isolate) {
2397 } 2366 }
2398 2367
2399 2368
2400 void CEntryStub::GenerateAheadOfTime(Isolate* isolate) { 2369 void CEntryStub::GenerateAheadOfTime(Isolate* isolate) {
2401 CEntryStub stub(isolate, 1, kDontSaveFPRegs); 2370 CEntryStub stub(isolate, 1, kDontSaveFPRegs);
2402 stub.GetCode(isolate); 2371 stub.GetCode();
2403 CEntryStub save_doubles(isolate, 1, kSaveFPRegs); 2372 CEntryStub save_doubles(isolate, 1, kSaveFPRegs);
2404 save_doubles.GetCode(isolate); 2373 save_doubles.GetCode();
2405 } 2374 }
2406 2375
2407 2376
2408 void CEntryStub::Generate(MacroAssembler* masm) { 2377 void CEntryStub::Generate(MacroAssembler* masm) {
2409 // rax: number of arguments including receiver 2378 // rax: number of arguments including receiver
2410 // rbx: pointer to C function (C callee-saved) 2379 // rbx: pointer to C function (C callee-saved)
2411 // rbp: frame pointer of calling JS frame (restored after C call) 2380 // rbp: frame pointer of calling JS frame (restored after C call)
2412 // rsp: stack pointer (restored after C call) 2381 // rsp: stack pointer (restored after C call)
2413 // rsi: current context (restored) 2382 // rsi: current context (restored)
2414 2383
(...skipping 1225 matching lines...) Expand 10 before | Expand all | Expand 10 after
3640 __ movl(rax, Immediate(0)); 3609 __ movl(rax, Immediate(0));
3641 __ movl(rcx, Immediate(0)); 3610 __ movl(rcx, Immediate(0));
3642 __ setcc(above, rax); // Add one to zero if carry clear and not equal. 3611 __ setcc(above, rax); // Add one to zero if carry clear and not equal.
3643 __ sbbp(rax, rcx); // Subtract one if below (aka. carry set). 3612 __ sbbp(rax, rcx); // Subtract one if below (aka. carry set).
3644 __ ret(0); 3613 __ ret(0);
3645 3614
3646 __ bind(&unordered); 3615 __ bind(&unordered);
3647 __ bind(&generic_stub); 3616 __ bind(&generic_stub);
3648 ICCompareStub stub(isolate(), op_, CompareIC::GENERIC, CompareIC::GENERIC, 3617 ICCompareStub stub(isolate(), op_, CompareIC::GENERIC, CompareIC::GENERIC,
3649 CompareIC::GENERIC); 3618 CompareIC::GENERIC);
3650 __ jmp(stub.GetCode(isolate()), RelocInfo::CODE_TARGET); 3619 __ jmp(stub.GetCode(), RelocInfo::CODE_TARGET);
3651 3620
3652 __ bind(&maybe_undefined1); 3621 __ bind(&maybe_undefined1);
3653 if (Token::IsOrderedRelationalCompareOp(op_)) { 3622 if (Token::IsOrderedRelationalCompareOp(op_)) {
3654 __ Cmp(rax, isolate()->factory()->undefined_value()); 3623 __ Cmp(rax, isolate()->factory()->undefined_value());
3655 __ j(not_equal, &miss); 3624 __ j(not_equal, &miss);
3656 __ JumpIfSmi(rdx, &unordered); 3625 __ JumpIfSmi(rdx, &unordered);
3657 __ CmpObjectType(rdx, HEAP_NUMBER_TYPE, rcx); 3626 __ CmpObjectType(rdx, HEAP_NUMBER_TYPE, rcx);
3658 __ j(not_equal, &maybe_undefined2, Label::kNear); 3627 __ j(not_equal, &maybe_undefined2, Label::kNear);
3659 __ jmp(&unordered); 3628 __ jmp(&unordered);
3660 } 3629 }
(...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after
4110 __ bind(&not_in_dictionary); 4079 __ bind(&not_in_dictionary);
4111 __ movp(scratch, Immediate(0)); 4080 __ movp(scratch, Immediate(0));
4112 __ Drop(1); 4081 __ Drop(1);
4113 __ ret(2 * kPointerSize); 4082 __ ret(2 * kPointerSize);
4114 } 4083 }
4115 4084
4116 4085
4117 void StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime( 4086 void StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime(
4118 Isolate* isolate) { 4087 Isolate* isolate) {
4119 StoreBufferOverflowStub stub1(isolate, kDontSaveFPRegs); 4088 StoreBufferOverflowStub stub1(isolate, kDontSaveFPRegs);
4120 stub1.GetCode(isolate); 4089 stub1.GetCode();
4121 StoreBufferOverflowStub stub2(isolate, kSaveFPRegs); 4090 StoreBufferOverflowStub stub2(isolate, kSaveFPRegs);
4122 stub2.GetCode(isolate); 4091 stub2.GetCode();
4123 } 4092 }
4124 4093
4125 4094
4126 bool CodeStub::CanUseFPRegisters() { 4095 bool CodeStub::CanUseFPRegisters() {
4127 return true; // Always have SSE2 on x64. 4096 return true; // Always have SSE2 on x64.
4128 } 4097 }
4129 4098
4130 4099
4131 // Takes the input in 3 registers: address_ value_ and object_. A pointer to 4100 // Takes the input in 3 registers: address_ value_ and object_. A pointer to
4132 // the value has just been written into the object, now this stub makes sure 4101 // the value has just been written into the object, now this stub makes sure
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after
4396 r9, 4365 r9,
4397 r11, 4366 r11,
4398 xmm0, 4367 xmm0,
4399 &slow_elements); 4368 &slow_elements);
4400 __ ret(0); 4369 __ ret(0);
4401 } 4370 }
4402 4371
4403 4372
4404 void StubFailureTrampolineStub::Generate(MacroAssembler* masm) { 4373 void StubFailureTrampolineStub::Generate(MacroAssembler* masm) {
4405 CEntryStub ces(isolate(), 1, fp_registers_ ? kSaveFPRegs : kDontSaveFPRegs); 4374 CEntryStub ces(isolate(), 1, fp_registers_ ? kSaveFPRegs : kDontSaveFPRegs);
4406 __ Call(ces.GetCode(isolate()), RelocInfo::CODE_TARGET); 4375 __ Call(ces.GetCode(), RelocInfo::CODE_TARGET);
4407 int parameter_count_offset = 4376 int parameter_count_offset =
4408 StubFailureTrampolineFrame::kCallerStackParameterCountFrameOffset; 4377 StubFailureTrampolineFrame::kCallerStackParameterCountFrameOffset;
4409 __ movp(rbx, MemOperand(rbp, parameter_count_offset)); 4378 __ movp(rbx, MemOperand(rbp, parameter_count_offset));
4410 masm->LeaveFrame(StackFrame::STUB_FAILURE_TRAMPOLINE); 4379 masm->LeaveFrame(StackFrame::STUB_FAILURE_TRAMPOLINE);
4411 __ PopReturnAddressTo(rcx); 4380 __ PopReturnAddressTo(rcx);
4412 int additional_offset = function_mode_ == JS_FUNCTION_STUB_MODE 4381 int additional_offset = function_mode_ == JS_FUNCTION_STUB_MODE
4413 ? kPointerSize 4382 ? kPointerSize
4414 : 0; 4383 : 0;
4415 __ leap(rsp, MemOperand(rsp, rbx, times_pointer_size, additional_offset)); 4384 __ leap(rsp, MemOperand(rsp, rbx, times_pointer_size, additional_offset));
4416 __ jmp(rcx); // Return to IC Miss stub, continuation still on stack. 4385 __ jmp(rcx); // Return to IC Miss stub, continuation still on stack.
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
4575 } 4544 }
4576 4545
4577 4546
4578 template<class T> 4547 template<class T>
4579 static void ArrayConstructorStubAheadOfTimeHelper(Isolate* isolate) { 4548 static void ArrayConstructorStubAheadOfTimeHelper(Isolate* isolate) {
4580 int to_index = GetSequenceIndexFromFastElementsKind( 4549 int to_index = GetSequenceIndexFromFastElementsKind(
4581 TERMINAL_FAST_ELEMENTS_KIND); 4550 TERMINAL_FAST_ELEMENTS_KIND);
4582 for (int i = 0; i <= to_index; ++i) { 4551 for (int i = 0; i <= to_index; ++i) {
4583 ElementsKind kind = GetFastElementsKindFromSequenceIndex(i); 4552 ElementsKind kind = GetFastElementsKindFromSequenceIndex(i);
4584 T stub(isolate, kind); 4553 T stub(isolate, kind);
4585 stub.GetCode(isolate); 4554 stub.GetCode();
4586 if (AllocationSite::GetMode(kind) != DONT_TRACK_ALLOCATION_SITE) { 4555 if (AllocationSite::GetMode(kind) != DONT_TRACK_ALLOCATION_SITE) {
4587 T stub1(isolate, kind, DISABLE_ALLOCATION_SITES); 4556 T stub1(isolate, kind, DISABLE_ALLOCATION_SITES);
4588 stub1.GetCode(isolate); 4557 stub1.GetCode();
4589 } 4558 }
4590 } 4559 }
4591 } 4560 }
4592 4561
4593 4562
4594 void ArrayConstructorStubBase::GenerateStubsAheadOfTime(Isolate* isolate) { 4563 void ArrayConstructorStubBase::GenerateStubsAheadOfTime(Isolate* isolate) {
4595 ArrayConstructorStubAheadOfTimeHelper<ArrayNoArgumentConstructorStub>( 4564 ArrayConstructorStubAheadOfTimeHelper<ArrayNoArgumentConstructorStub>(
4596 isolate); 4565 isolate);
4597 ArrayConstructorStubAheadOfTimeHelper<ArraySingleArgumentConstructorStub>( 4566 ArrayConstructorStubAheadOfTimeHelper<ArraySingleArgumentConstructorStub>(
4598 isolate); 4567 isolate);
4599 ArrayConstructorStubAheadOfTimeHelper<ArrayNArgumentsConstructorStub>( 4568 ArrayConstructorStubAheadOfTimeHelper<ArrayNArgumentsConstructorStub>(
4600 isolate); 4569 isolate);
4601 } 4570 }
4602 4571
4603 4572
4604 void InternalArrayConstructorStubBase::GenerateStubsAheadOfTime( 4573 void InternalArrayConstructorStubBase::GenerateStubsAheadOfTime(
4605 Isolate* isolate) { 4574 Isolate* isolate) {
4606 ElementsKind kinds[2] = { FAST_ELEMENTS, FAST_HOLEY_ELEMENTS }; 4575 ElementsKind kinds[2] = { FAST_ELEMENTS, FAST_HOLEY_ELEMENTS };
4607 for (int i = 0; i < 2; i++) { 4576 for (int i = 0; i < 2; i++) {
4608 // For internal arrays we only need a few things 4577 // For internal arrays we only need a few things
4609 InternalArrayNoArgumentConstructorStub stubh1(isolate, kinds[i]); 4578 InternalArrayNoArgumentConstructorStub stubh1(isolate, kinds[i]);
4610 stubh1.GetCode(isolate); 4579 stubh1.GetCode();
4611 InternalArraySingleArgumentConstructorStub stubh2(isolate, kinds[i]); 4580 InternalArraySingleArgumentConstructorStub stubh2(isolate, kinds[i]);
4612 stubh2.GetCode(isolate); 4581 stubh2.GetCode();
4613 InternalArrayNArgumentsConstructorStub stubh3(isolate, kinds[i]); 4582 InternalArrayNArgumentsConstructorStub stubh3(isolate, kinds[i]);
4614 stubh3.GetCode(isolate); 4583 stubh3.GetCode();
4615 } 4584 }
4616 } 4585 }
4617 4586
4618 4587
4619 void ArrayConstructorStub::GenerateDispatchToArrayStub( 4588 void ArrayConstructorStub::GenerateDispatchToArrayStub(
4620 MacroAssembler* masm, 4589 MacroAssembler* masm,
4621 AllocationSiteOverrideMode mode) { 4590 AllocationSiteOverrideMode mode) {
4622 if (argument_count_ == ANY) { 4591 if (argument_count_ == ANY) {
4623 Label not_zero_case, not_one_case; 4592 Label not_zero_case, not_one_case;
4624 __ testp(rax, rax); 4593 __ testp(rax, rax);
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after
4951 return_value_operand, 4920 return_value_operand,
4952 NULL); 4921 NULL);
4953 } 4922 }
4954 4923
4955 4924
4956 #undef __ 4925 #undef __
4957 4926
4958 } } // namespace v8::internal 4927 } } // namespace v8::internal
4959 4928
4960 #endif // V8_TARGET_ARCH_X64 4929 #endif // V8_TARGET_ARCH_X64
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698