OLD | NEW |
1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 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 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 | 179 |
180 | 180 |
181 void VirtualFrame::PushTryHandler(HandlerType type) { | 181 void VirtualFrame::PushTryHandler(HandlerType type) { |
182 // Grow the expression stack by handler size less one (the return | 182 // Grow the expression stack by handler size less one (the return |
183 // address in lr is already counted by a call instruction). | 183 // address in lr is already counted by a call instruction). |
184 Adjust(kHandlerSize - 1); | 184 Adjust(kHandlerSize - 1); |
185 __ PushTryHandler(IN_JAVASCRIPT, type); | 185 __ PushTryHandler(IN_JAVASCRIPT, type); |
186 } | 186 } |
187 | 187 |
188 | 188 |
189 Result VirtualFrame::RawCallStub(CodeStub* stub) { | 189 void VirtualFrame::RawCallStub(CodeStub* stub) { |
190 ASSERT(cgen()->HasValidEntryRegisters()); | 190 ASSERT(cgen()->HasValidEntryRegisters()); |
191 __ CallStub(stub); | 191 __ CallStub(stub); |
192 Result result = cgen()->allocator()->Allocate(r0); | |
193 ASSERT(result.is_valid()); | |
194 return result; | |
195 } | 192 } |
196 | 193 |
197 | 194 |
198 Result VirtualFrame::CallStub(CodeStub* stub, Result* arg) { | 195 void VirtualFrame::CallStub(CodeStub* stub, Result* arg) { |
199 PrepareForCall(0, 0); | 196 PrepareForCall(0, 0); |
200 arg->Unuse(); | 197 arg->Unuse(); |
201 return RawCallStub(stub); | 198 RawCallStub(stub); |
202 } | 199 } |
203 | 200 |
204 | 201 |
205 Result VirtualFrame::CallStub(CodeStub* stub, Result* arg0, Result* arg1) { | 202 void VirtualFrame::CallStub(CodeStub* stub, Result* arg0, Result* arg1) { |
206 PrepareForCall(0, 0); | 203 PrepareForCall(0, 0); |
207 arg0->Unuse(); | 204 arg0->Unuse(); |
208 arg1->Unuse(); | 205 arg1->Unuse(); |
209 return RawCallStub(stub); | 206 RawCallStub(stub); |
210 } | 207 } |
211 | 208 |
212 | 209 |
213 Result VirtualFrame::CallRuntime(Runtime::Function* f, int arg_count) { | 210 void VirtualFrame::CallRuntime(Runtime::Function* f, int arg_count) { |
214 PrepareForCall(arg_count, arg_count); | 211 PrepareForCall(arg_count, arg_count); |
215 ASSERT(cgen()->HasValidEntryRegisters()); | 212 ASSERT(cgen()->HasValidEntryRegisters()); |
216 __ CallRuntime(f, arg_count); | 213 __ CallRuntime(f, arg_count); |
217 Result result = cgen()->allocator()->Allocate(r0); | |
218 ASSERT(result.is_valid()); | |
219 return result; | |
220 } | 214 } |
221 | 215 |
222 | 216 |
223 Result VirtualFrame::CallRuntime(Runtime::FunctionId id, int arg_count) { | 217 void VirtualFrame::CallRuntime(Runtime::FunctionId id, int arg_count) { |
224 PrepareForCall(arg_count, arg_count); | 218 PrepareForCall(arg_count, arg_count); |
225 ASSERT(cgen()->HasValidEntryRegisters()); | 219 ASSERT(cgen()->HasValidEntryRegisters()); |
226 __ CallRuntime(id, arg_count); | 220 __ CallRuntime(id, arg_count); |
227 Result result = cgen()->allocator()->Allocate(r0); | |
228 ASSERT(result.is_valid()); | |
229 return result; | |
230 } | 221 } |
231 | 222 |
232 | 223 |
233 Result VirtualFrame::InvokeBuiltin(Builtins::JavaScript id, | 224 void VirtualFrame::InvokeBuiltin(Builtins::JavaScript id, |
234 InvokeJSFlags flags, | 225 InvokeJSFlags flags, |
235 Result* arg_count_register, | 226 Result* arg_count_register, |
236 int arg_count) { | 227 int arg_count) { |
237 ASSERT(arg_count_register->reg().is(r0)); | 228 ASSERT(arg_count_register->reg().is(r0)); |
238 PrepareForCall(arg_count, arg_count); | 229 PrepareForCall(arg_count, arg_count); |
239 arg_count_register->Unuse(); | 230 arg_count_register->Unuse(); |
240 __ InvokeBuiltin(id, flags); | 231 __ InvokeBuiltin(id, flags); |
241 Result result = cgen()->allocator()->Allocate(r0); | |
242 return result; | |
243 } | 232 } |
244 | 233 |
245 | 234 |
246 Result VirtualFrame::RawCallCodeObject(Handle<Code> code, | 235 void VirtualFrame::RawCallCodeObject(Handle<Code> code, |
247 RelocInfo::Mode rmode) { | 236 RelocInfo::Mode rmode) { |
248 ASSERT(cgen()->HasValidEntryRegisters()); | 237 ASSERT(cgen()->HasValidEntryRegisters()); |
249 __ Call(code, rmode); | 238 __ Call(code, rmode); |
250 Result result = cgen()->allocator()->Allocate(r0); | |
251 ASSERT(result.is_valid()); | |
252 return result; | |
253 } | 239 } |
254 | 240 |
255 | 241 |
256 Result VirtualFrame::CallCodeObject(Handle<Code> code, | 242 void VirtualFrame::CallCodeObject(Handle<Code> code, |
257 RelocInfo::Mode rmode, | 243 RelocInfo::Mode rmode, |
258 int dropped_args) { | 244 int dropped_args) { |
259 int spilled_args = 0; | 245 int spilled_args = 0; |
260 switch (code->kind()) { | 246 switch (code->kind()) { |
261 case Code::CALL_IC: | 247 case Code::CALL_IC: |
262 spilled_args = dropped_args + 1; | 248 spilled_args = dropped_args + 1; |
263 break; | 249 break; |
264 case Code::FUNCTION: | 250 case Code::FUNCTION: |
265 spilled_args = dropped_args + 1; | 251 spilled_args = dropped_args + 1; |
266 break; | 252 break; |
267 case Code::KEYED_LOAD_IC: | 253 case Code::KEYED_LOAD_IC: |
268 ASSERT(dropped_args == 0); | 254 ASSERT(dropped_args == 0); |
269 spilled_args = 2; | 255 spilled_args = 2; |
270 break; | 256 break; |
271 default: | 257 default: |
272 // The other types of code objects are called with values | 258 // The other types of code objects are called with values |
273 // in specific registers, and are handled in functions with | 259 // in specific registers, and are handled in functions with |
274 // a different signature. | 260 // a different signature. |
275 UNREACHABLE(); | 261 UNREACHABLE(); |
276 break; | 262 break; |
277 } | 263 } |
278 PrepareForCall(spilled_args, dropped_args); | 264 PrepareForCall(spilled_args, dropped_args); |
279 return RawCallCodeObject(code, rmode); | 265 RawCallCodeObject(code, rmode); |
280 } | 266 } |
281 | 267 |
282 | 268 |
283 Result VirtualFrame::CallCodeObject(Handle<Code> code, | 269 void VirtualFrame::CallCodeObject(Handle<Code> code, |
284 RelocInfo::Mode rmode, | 270 RelocInfo::Mode rmode, |
285 Result* arg, | 271 Result* arg, |
286 int dropped_args) { | 272 int dropped_args) { |
287 int spilled_args = 0; | 273 int spilled_args = 0; |
288 switch (code->kind()) { | 274 switch (code->kind()) { |
289 case Code::LOAD_IC: | 275 case Code::LOAD_IC: |
290 ASSERT(arg->reg().is(r2)); | 276 ASSERT(arg->reg().is(r2)); |
291 ASSERT(dropped_args == 0); | 277 ASSERT(dropped_args == 0); |
292 spilled_args = 1; | 278 spilled_args = 1; |
293 break; | 279 break; |
294 case Code::KEYED_STORE_IC: | 280 case Code::KEYED_STORE_IC: |
295 ASSERT(arg->reg().is(r0)); | 281 ASSERT(arg->reg().is(r0)); |
296 ASSERT(dropped_args == 0); | 282 ASSERT(dropped_args == 0); |
297 spilled_args = 2; | 283 spilled_args = 2; |
298 break; | 284 break; |
299 default: | 285 default: |
300 // No other types of code objects are called with values | 286 // No other types of code objects are called with values |
301 // in exactly one register. | 287 // in exactly one register. |
302 UNREACHABLE(); | 288 UNREACHABLE(); |
303 break; | 289 break; |
304 } | 290 } |
305 PrepareForCall(spilled_args, dropped_args); | 291 PrepareForCall(spilled_args, dropped_args); |
306 arg->Unuse(); | 292 arg->Unuse(); |
307 return RawCallCodeObject(code, rmode); | 293 RawCallCodeObject(code, rmode); |
308 } | 294 } |
309 | 295 |
310 | 296 |
311 Result VirtualFrame::CallCodeObject(Handle<Code> code, | 297 void VirtualFrame::CallCodeObject(Handle<Code> code, |
312 RelocInfo::Mode rmode, | 298 RelocInfo::Mode rmode, |
313 Result* arg0, | 299 Result* arg0, |
314 Result* arg1, | 300 Result* arg1, |
315 int dropped_args) { | 301 int dropped_args) { |
316 int spilled_args = 1; | 302 int spilled_args = 1; |
317 switch (code->kind()) { | 303 switch (code->kind()) { |
318 case Code::STORE_IC: | 304 case Code::STORE_IC: |
319 ASSERT(arg0->reg().is(r0)); | 305 ASSERT(arg0->reg().is(r0)); |
320 ASSERT(arg1->reg().is(r2)); | 306 ASSERT(arg1->reg().is(r2)); |
321 ASSERT(dropped_args == 0); | 307 ASSERT(dropped_args == 0); |
322 spilled_args = 1; | 308 spilled_args = 1; |
323 break; | 309 break; |
324 case Code::BUILTIN: | 310 case Code::BUILTIN: |
325 ASSERT(*code == Builtins::builtin(Builtins::JSConstructCall)); | 311 ASSERT(*code == Builtins::builtin(Builtins::JSConstructCall)); |
326 ASSERT(arg0->reg().is(r0)); | 312 ASSERT(arg0->reg().is(r0)); |
327 ASSERT(arg1->reg().is(r1)); | 313 ASSERT(arg1->reg().is(r1)); |
328 spilled_args = dropped_args + 1; | 314 spilled_args = dropped_args + 1; |
329 break; | 315 break; |
330 default: | 316 default: |
331 // No other types of code objects are called with values | 317 // No other types of code objects are called with values |
332 // in exactly two registers. | 318 // in exactly two registers. |
333 UNREACHABLE(); | 319 UNREACHABLE(); |
334 break; | 320 break; |
335 } | 321 } |
336 PrepareForCall(spilled_args, dropped_args); | 322 PrepareForCall(spilled_args, dropped_args); |
337 arg0->Unuse(); | 323 arg0->Unuse(); |
338 arg1->Unuse(); | 324 arg1->Unuse(); |
339 return RawCallCodeObject(code, rmode); | 325 RawCallCodeObject(code, rmode); |
340 } | 326 } |
341 | 327 |
342 | 328 |
343 void VirtualFrame::Drop(int count) { | 329 void VirtualFrame::Drop(int count) { |
344 ASSERT(count >= 0); | 330 ASSERT(count >= 0); |
345 ASSERT(height() >= count); | 331 ASSERT(height() >= count); |
346 int num_virtual_elements = (element_count() - 1) - stack_pointer_; | 332 int num_virtual_elements = (element_count() - 1) - stack_pointer_; |
347 | 333 |
348 // Emit code to lower the stack pointer if necessary. | 334 // Emit code to lower the stack pointer if necessary. |
349 if (num_virtual_elements < count) { | 335 if (num_virtual_elements < count) { |
(...skipping 30 matching lines...) Expand all Loading... |
380 ASSERT(stack_pointer_ == element_count() - 1); | 366 ASSERT(stack_pointer_ == element_count() - 1); |
381 elements_.Add(FrameElement::MemoryElement()); | 367 elements_.Add(FrameElement::MemoryElement()); |
382 stack_pointer_++; | 368 stack_pointer_++; |
383 __ push(reg); | 369 __ push(reg); |
384 } | 370 } |
385 | 371 |
386 | 372 |
387 #undef __ | 373 #undef __ |
388 | 374 |
389 } } // namespace v8::internal | 375 } } // namespace v8::internal |
OLD | NEW |