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

Side by Side Diff: src/ppc/builtins-ppc.cc

Issue 2141723003: PPC/s390: [builtins] Construct builtin frame in String/Number ctors (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: fixed Load instr, don't have to update sp Created 4 years, 5 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
« no previous file with comments | « no previous file | src/ppc/macro-assembler-ppc.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #if V8_TARGET_ARCH_PPC 5 #if V8_TARGET_ARCH_PPC
6 6
7 #include "src/codegen.h" 7 #include "src/codegen.h"
8 #include "src/debug/debug.h" 8 #include "src/debug/debug.h"
9 #include "src/deoptimizer.h" 9 #include "src/deoptimizer.h"
10 #include "src/full-codegen/full-codegen.h" 10 #include "src/full-codegen/full-codegen.h"
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 // Load the double value of the parameter into d2, maybe converting the 165 // Load the double value of the parameter into d2, maybe converting the
166 // parameter to a number first using the ToNumber builtin if necessary. 166 // parameter to a number first using the ToNumber builtin if necessary.
167 Label convert, convert_smi, convert_number, done_convert; 167 Label convert, convert_smi, convert_number, done_convert;
168 __ bind(&convert); 168 __ bind(&convert);
169 __ JumpIfSmi(r5, &convert_smi); 169 __ JumpIfSmi(r5, &convert_smi);
170 __ LoadP(r6, FieldMemOperand(r5, HeapObject::kMapOffset)); 170 __ LoadP(r6, FieldMemOperand(r5, HeapObject::kMapOffset));
171 __ JumpIfRoot(r6, Heap::kHeapNumberMapRootIndex, &convert_number); 171 __ JumpIfRoot(r6, Heap::kHeapNumberMapRootIndex, &convert_number);
172 { 172 {
173 // Parameter is not a Number, use the ToNumber builtin to convert it. 173 // Parameter is not a Number, use the ToNumber builtin to convert it.
174 FrameScope scope(masm, StackFrame::MANUAL); 174 FrameScope scope(masm, StackFrame::MANUAL);
175 __ PushStandardFrame(r4);
176 __ SmiTag(r3); 175 __ SmiTag(r3);
177 __ SmiTag(r7); 176 __ SmiTag(r7);
178 __ Push(r3, r7, r8); 177 __ EnterBuiltinFrame(cp, r4, r3);
178 __ Push(r7, r8);
179 __ mr(r3, r5); 179 __ mr(r3, r5);
180 __ Call(masm->isolate()->builtins()->ToNumber(), RelocInfo::CODE_TARGET); 180 __ Call(masm->isolate()->builtins()->ToNumber(), RelocInfo::CODE_TARGET);
181 __ mr(r5, r3); 181 __ mr(r5, r3);
182 __ Pop(r3, r7, r8); 182 __ Pop(r7, r8);
183 __ LeaveBuiltinFrame(cp, r4, r3);
184 __ SmiUntag(r7);
185 __ SmiUntag(r3);
183 { 186 {
184 // Restore the double accumulator value (d1). 187 // Restore the double accumulator value (d1).
185 Label done_restore; 188 Label done_restore;
186 __ SmiToDouble(d1, r8); 189 __ SmiToDouble(d1, r8);
187 __ JumpIfSmi(r8, &done_restore); 190 __ JumpIfSmi(r8, &done_restore);
188 __ lfd(d1, FieldMemOperand(r8, HeapNumber::kValueOffset)); 191 __ lfd(d1, FieldMemOperand(r8, HeapNumber::kValueOffset));
189 __ bind(&done_restore); 192 __ bind(&done_restore);
190 } 193 }
191 __ SmiUntag(r7);
192 __ SmiUntag(r3);
193 // TODO(Jaideep): Add macro furtion for PopStandardFrame
194 if (FLAG_enable_embedded_constant_pool) {
195 __ Pop(r0, fp, kConstantPoolRegister, cp, r4);
196 } else {
197 __ Pop(r0, fp, cp, r4);
198 }
199 __ mtlr(r0);
200 } 194 }
201 __ b(&convert); 195 __ b(&convert);
202 __ bind(&convert_number); 196 __ bind(&convert_number);
203 __ lfd(d2, FieldMemOperand(r5, HeapNumber::kValueOffset)); 197 __ lfd(d2, FieldMemOperand(r5, HeapNumber::kValueOffset));
204 __ b(&done_convert); 198 __ b(&done_convert);
205 __ bind(&convert_smi); 199 __ bind(&convert_smi);
206 __ SmiToDouble(d2, r5); 200 __ SmiToDouble(d2, r5);
207 __ bind(&done_convert); 201 __ bind(&done_convert);
208 202
209 // Perform the actual comparison with the accumulator value on the left hand 203 // Perform the actual comparison with the accumulator value on the left hand
(...skipping 28 matching lines...) Expand all
238 __ Drop(r3); 232 __ Drop(r3);
239 __ mr(r3, r8); 233 __ mr(r3, r8);
240 __ Ret(); 234 __ Ret();
241 } 235 }
242 236
243 // static 237 // static
244 void Builtins::Generate_NumberConstructor(MacroAssembler* masm) { 238 void Builtins::Generate_NumberConstructor(MacroAssembler* masm) {
245 // ----------- S t a t e ------------- 239 // ----------- S t a t e -------------
246 // -- r3 : number of arguments 240 // -- r3 : number of arguments
247 // -- r4 : constructor function 241 // -- r4 : constructor function
242 // -- cp : context
248 // -- lr : return address 243 // -- lr : return address
249 // -- sp[(argc - n - 1) * 4] : arg[n] (zero based) 244 // -- sp[(argc - n - 1) * 4] : arg[n] (zero based)
250 // -- sp[argc * 4] : receiver 245 // -- sp[argc * 4] : receiver
251 // ----------------------------------- 246 // -----------------------------------
252 247
253 // 1. Load the first argument into r3 and get rid of the rest (including the 248 // 1. Load the first argument into r3.
254 // receiver).
255 Label no_arguments; 249 Label no_arguments;
256 { 250 {
251 __ mr(r5, r3); // Store argc in r5.
257 __ cmpi(r3, Operand::Zero()); 252 __ cmpi(r3, Operand::Zero());
258 __ beq(&no_arguments); 253 __ beq(&no_arguments);
259 __ subi(r3, r3, Operand(1)); 254 __ subi(r3, r3, Operand(1));
260 __ ShiftLeftImm(r3, r3, Operand(kPointerSizeLog2)); 255 __ ShiftLeftImm(r3, r3, Operand(kPointerSizeLog2));
261 __ LoadPUX(r3, MemOperand(sp, r3)); 256 __ LoadPX(r3, MemOperand(sp, r3));
262 __ Drop(2);
263 } 257 }
264 258
265 // 2a. Convert the first argument to a number. 259 // 2a. Convert the first argument to a number.
266 __ Jump(masm->isolate()->builtins()->ToNumber(), RelocInfo::CODE_TARGET); 260 {
261 FrameScope scope(masm, StackFrame::MANUAL);
262 __ SmiTag(r5);
263 __ EnterBuiltinFrame(cp, r4, r5);
264 __ Call(masm->isolate()->builtins()->ToNumber(), RelocInfo::CODE_TARGET);
265 __ LeaveBuiltinFrame(cp, r4, r5);
266 __ SmiUntag(r5);
267 }
268
269 {
270 // Drop all arguments including the receiver.
271 __ Drop(r5);
272 __ Ret(1);
273 }
267 274
268 // 2b. No arguments, return +0. 275 // 2b. No arguments, return +0.
269 __ bind(&no_arguments); 276 __ bind(&no_arguments);
270 __ LoadSmiLiteral(r3, Smi::FromInt(0)); 277 __ LoadSmiLiteral(r3, Smi::FromInt(0));
271 __ Ret(1); 278 __ Ret(1);
272 } 279 }
273 280
274 281
275 // static 282 // static
276 void Builtins::Generate_NumberConstructor_ConstructStub(MacroAssembler* masm) { 283 void Builtins::Generate_NumberConstructor_ConstructStub(MacroAssembler* masm) {
277 // ----------- S t a t e ------------- 284 // ----------- S t a t e -------------
278 // -- r3 : number of arguments 285 // -- r3 : number of arguments
279 // -- r4 : constructor function 286 // -- r4 : constructor function
280 // -- r6 : new target 287 // -- r6 : new target
288 // -- cp : context
281 // -- lr : return address 289 // -- lr : return address
282 // -- sp[(argc - n - 1) * 4] : arg[n] (zero based) 290 // -- sp[(argc - n - 1) * 4] : arg[n] (zero based)
283 // -- sp[argc * 4] : receiver 291 // -- sp[argc * 4] : receiver
284 // ----------------------------------- 292 // -----------------------------------
285 293
286 // 1. Make sure we operate in the context of the called function. 294 // 1. Make sure we operate in the context of the called function.
287 __ LoadP(cp, FieldMemOperand(r4, JSFunction::kContextOffset)); 295 __ LoadP(cp, FieldMemOperand(r4, JSFunction::kContextOffset));
288 296
289 // 2. Load the first argument into r5 and get rid of the rest (including the 297 // 2. Load the first argument into r5.
290 // receiver).
291 { 298 {
292 Label no_arguments, done; 299 Label no_arguments, done;
300 __ mr(r9, r3); // Store argc in r9.
293 __ cmpi(r3, Operand::Zero()); 301 __ cmpi(r3, Operand::Zero());
294 __ beq(&no_arguments); 302 __ beq(&no_arguments);
295 __ subi(r3, r3, Operand(1)); 303 __ subi(r3, r3, Operand(1));
296 __ ShiftLeftImm(r5, r3, Operand(kPointerSizeLog2)); 304 __ ShiftLeftImm(r5, r3, Operand(kPointerSizeLog2));
297 __ LoadPUX(r5, MemOperand(sp, r5)); 305 __ LoadPX(r5, MemOperand(sp, r5));
298 __ Drop(2);
299 __ b(&done); 306 __ b(&done);
300 __ bind(&no_arguments); 307 __ bind(&no_arguments);
301 __ LoadSmiLiteral(r5, Smi::FromInt(0)); 308 __ LoadSmiLiteral(r5, Smi::FromInt(0));
302 __ Drop(1);
303 __ bind(&done); 309 __ bind(&done);
304 } 310 }
305 311
306 // 3. Make sure r5 is a number. 312 // 3. Make sure r5 is a number.
307 { 313 {
308 Label done_convert; 314 Label done_convert;
309 __ JumpIfSmi(r5, &done_convert); 315 __ JumpIfSmi(r5, &done_convert);
310 __ CompareObjectType(r5, r7, r7, HEAP_NUMBER_TYPE); 316 __ CompareObjectType(r5, r7, r7, HEAP_NUMBER_TYPE);
311 __ beq(&done_convert); 317 __ beq(&done_convert);
312 { 318 {
313 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); 319 FrameScope scope(masm, StackFrame::MANUAL);
314 __ Push(r4, r6); 320 __ SmiTag(r9);
321 __ EnterBuiltinFrame(cp, r4, r9);
322 __ Push(r6);
315 __ mr(r3, r5); 323 __ mr(r3, r5);
316 __ Call(masm->isolate()->builtins()->ToNumber(), RelocInfo::CODE_TARGET); 324 __ Call(masm->isolate()->builtins()->ToNumber(), RelocInfo::CODE_TARGET);
317 __ mr(r5, r3); 325 __ mr(r5, r3);
318 __ Pop(r4, r6); 326 __ Pop(r6);
327 __ LeaveBuiltinFrame(cp, r4, r9);
328 __ SmiUntag(r9);
319 } 329 }
320 __ bind(&done_convert); 330 __ bind(&done_convert);
321 } 331 }
322 332
323 // 4. Check if new target and constructor differ. 333 // 4. Check if new target and constructor differ.
324 Label new_object; 334 Label drop_frame_and_ret, new_object;
325 __ cmp(r4, r6); 335 __ cmp(r4, r6);
326 __ bne(&new_object); 336 __ bne(&new_object);
327 337
328 // 5. Allocate a JSValue wrapper for the number. 338 // 5. Allocate a JSValue wrapper for the number.
329 __ AllocateJSValue(r3, r4, r5, r7, r8, &new_object); 339 __ AllocateJSValue(r3, r4, r5, r7, r8, &new_object);
330 __ Ret(); 340 __ b(&drop_frame_and_ret);
331 341
332 // 6. Fallback to the runtime to create new object. 342 // 6. Fallback to the runtime to create new object.
333 __ bind(&new_object); 343 __ bind(&new_object);
334 { 344 {
335 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); 345 FrameScope scope(masm, StackFrame::MANUAL);
346 __ SmiTag(r9);
347 __ EnterBuiltinFrame(cp, r4, r9);
336 __ Push(r5); // first argument 348 __ Push(r5); // first argument
337 FastNewObjectStub stub(masm->isolate()); 349 FastNewObjectStub stub(masm->isolate());
338 __ CallStub(&stub); 350 __ CallStub(&stub);
339 __ Pop(r5); 351 __ Pop(r5);
352 __ LeaveBuiltinFrame(cp, r4, r9);
353 __ SmiUntag(r9);
340 } 354 }
341 __ StoreP(r5, FieldMemOperand(r3, JSValue::kValueOffset), r0); 355 __ StoreP(r5, FieldMemOperand(r3, JSValue::kValueOffset), r0);
342 __ Ret(); 356
357 __ bind(&drop_frame_and_ret);
358 {
359 __ Drop(r9);
360 __ Ret(1);
361 }
343 } 362 }
344 363
345 364
346 // static 365 // static
347 void Builtins::Generate_StringConstructor(MacroAssembler* masm) { 366 void Builtins::Generate_StringConstructor(MacroAssembler* masm) {
348 // ----------- S t a t e ------------- 367 // ----------- S t a t e -------------
349 // -- r3 : number of arguments 368 // -- r3 : number of arguments
350 // -- r4 : constructor function 369 // -- r4 : constructor function
370 // -- cp : context
351 // -- lr : return address 371 // -- lr : return address
352 // -- sp[(argc - n - 1) * 4] : arg[n] (zero based) 372 // -- sp[(argc - n - 1) * 4] : arg[n] (zero based)
353 // -- sp[argc * 4] : receiver 373 // -- sp[argc * 4] : receiver
354 // ----------------------------------- 374 // -----------------------------------
355 375
356 // 1. Load the first argument into r3 and get rid of the rest (including the 376 // 1. Load the first argument into r3.
357 // receiver).
358 Label no_arguments; 377 Label no_arguments;
359 { 378 {
379 __ mr(r5, r3); // Store argc in r5.
360 __ cmpi(r3, Operand::Zero()); 380 __ cmpi(r3, Operand::Zero());
361 __ beq(&no_arguments); 381 __ beq(&no_arguments);
362 __ subi(r3, r3, Operand(1)); 382 __ subi(r3, r3, Operand(1));
363 __ ShiftLeftImm(r3, r3, Operand(kPointerSizeLog2)); 383 __ ShiftLeftImm(r3, r3, Operand(kPointerSizeLog2));
364 __ LoadPUX(r3, MemOperand(sp, r3)); 384 __ LoadPX(r3, MemOperand(sp, r3));
365 __ Drop(2);
366 } 385 }
367 386
368 // 2a. At least one argument, return r3 if it's a string, otherwise 387 // 2a. At least one argument, return r3 if it's a string, otherwise
369 // dispatch to appropriate conversion. 388 // dispatch to appropriate conversion.
370 Label to_string, symbol_descriptive_string; 389 Label drop_frame_and_ret, to_string, symbol_descriptive_string;
371 { 390 {
372 __ JumpIfSmi(r3, &to_string); 391 __ JumpIfSmi(r3, &to_string);
373 STATIC_ASSERT(FIRST_NONSTRING_TYPE == SYMBOL_TYPE); 392 STATIC_ASSERT(FIRST_NONSTRING_TYPE == SYMBOL_TYPE);
374 __ CompareObjectType(r3, r4, r4, FIRST_NONSTRING_TYPE); 393 __ CompareObjectType(r3, r6, r6, FIRST_NONSTRING_TYPE);
375 __ bgt(&to_string); 394 __ bgt(&to_string);
376 __ beq(&symbol_descriptive_string); 395 __ beq(&symbol_descriptive_string);
377 __ Ret(); 396 __ b(&drop_frame_and_ret);
378 } 397 }
379 398
380 // 2b. No arguments, return the empty string (and pop the receiver). 399 // 2b. No arguments, return the empty string (and pop the receiver).
381 __ bind(&no_arguments); 400 __ bind(&no_arguments);
382 { 401 {
383 __ LoadRoot(r3, Heap::kempty_stringRootIndex); 402 __ LoadRoot(r3, Heap::kempty_stringRootIndex);
384 __ Ret(1); 403 __ Ret(1);
385 } 404 }
386 405
387 // 3a. Convert r3 to a string. 406 // 3a. Convert r3 to a string.
388 __ bind(&to_string); 407 __ bind(&to_string);
389 { 408 {
409 FrameScope scope(masm, StackFrame::MANUAL);
390 ToStringStub stub(masm->isolate()); 410 ToStringStub stub(masm->isolate());
391 __ TailCallStub(&stub); 411 __ SmiTag(r5);
412 __ EnterBuiltinFrame(cp, r4, r5);
413 __ CallStub(&stub);
414 __ LeaveBuiltinFrame(cp, r4, r5);
415 __ SmiUntag(r5);
392 } 416 }
417 __ b(&drop_frame_and_ret);
393 418
394 // 3b. Convert symbol in r3 to a string. 419 // 3b. Convert symbol in r3 to a string.
395 __ bind(&symbol_descriptive_string); 420 __ bind(&symbol_descriptive_string);
396 { 421 {
422 __ Drop(r5);
423 __ Drop(1);
397 __ Push(r3); 424 __ Push(r3);
398 __ TailCallRuntime(Runtime::kSymbolDescriptiveString); 425 __ TailCallRuntime(Runtime::kSymbolDescriptiveString);
399 } 426 }
427
428 __ bind(&drop_frame_and_ret);
429 {
430 __ Drop(r5);
431 __ Ret(1);
432 }
400 } 433 }
401 434
402
403 // static 435 // static
404 void Builtins::Generate_StringConstructor_ConstructStub(MacroAssembler* masm) { 436 void Builtins::Generate_StringConstructor_ConstructStub(MacroAssembler* masm) {
405 // ----------- S t a t e ------------- 437 // ----------- S t a t e -------------
406 // -- r3 : number of arguments 438 // -- r3 : number of arguments
407 // -- r4 : constructor function 439 // -- r4 : constructor function
408 // -- r6 : new target 440 // -- r6 : new target
441 // -- cp : context
409 // -- lr : return address 442 // -- lr : return address
410 // -- sp[(argc - n - 1) * 4] : arg[n] (zero based) 443 // -- sp[(argc - n - 1) * 4] : arg[n] (zero based)
411 // -- sp[argc * 4] : receiver 444 // -- sp[argc * 4] : receiver
412 // ----------------------------------- 445 // -----------------------------------
413 446
414 // 1. Make sure we operate in the context of the called function. 447 // 1. Make sure we operate in the context of the called function.
415 __ LoadP(cp, FieldMemOperand(r4, JSFunction::kContextOffset)); 448 __ LoadP(cp, FieldMemOperand(r4, JSFunction::kContextOffset));
416 449
417 // 2. Load the first argument into r5 and get rid of the rest (including the 450 // 2. Load the first argument into r5.
418 // receiver).
419 { 451 {
420 Label no_arguments, done; 452 Label no_arguments, done;
453 __ mr(r9, r3); // Store argc in r9.
421 __ cmpi(r3, Operand::Zero()); 454 __ cmpi(r3, Operand::Zero());
422 __ beq(&no_arguments); 455 __ beq(&no_arguments);
423 __ subi(r3, r3, Operand(1)); 456 __ subi(r3, r3, Operand(1));
424 __ ShiftLeftImm(r5, r3, Operand(kPointerSizeLog2)); 457 __ ShiftLeftImm(r5, r3, Operand(kPointerSizeLog2));
425 __ LoadPUX(r5, MemOperand(sp, r5)); 458 __ LoadPX(r5, MemOperand(sp, r5));
426 __ Drop(2);
427 __ b(&done); 459 __ b(&done);
428 __ bind(&no_arguments); 460 __ bind(&no_arguments);
429 __ LoadRoot(r5, Heap::kempty_stringRootIndex); 461 __ LoadRoot(r5, Heap::kempty_stringRootIndex);
430 __ Drop(1);
431 __ bind(&done); 462 __ bind(&done);
432 } 463 }
433 464
434 // 3. Make sure r5 is a string. 465 // 3. Make sure r5 is a string.
435 { 466 {
436 Label convert, done_convert; 467 Label convert, done_convert;
437 __ JumpIfSmi(r5, &convert); 468 __ JumpIfSmi(r5, &convert);
438 __ CompareObjectType(r5, r7, r7, FIRST_NONSTRING_TYPE); 469 __ CompareObjectType(r5, r7, r7, FIRST_NONSTRING_TYPE);
439 __ blt(&done_convert); 470 __ blt(&done_convert);
440 __ bind(&convert); 471 __ bind(&convert);
441 { 472 {
442 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); 473 FrameScope scope(masm, StackFrame::MANUAL);
443 ToStringStub stub(masm->isolate()); 474 ToStringStub stub(masm->isolate());
444 __ Push(r4, r6); 475 __ SmiTag(r9);
476 __ EnterBuiltinFrame(cp, r4, r9);
477 __ Push(r6);
445 __ mr(r3, r5); 478 __ mr(r3, r5);
446 __ CallStub(&stub); 479 __ CallStub(&stub);
447 __ mr(r5, r3); 480 __ mr(r5, r3);
448 __ Pop(r4, r6); 481 __ Pop(r6);
482 __ LeaveBuiltinFrame(cp, r4, r9);
483 __ SmiUntag(r9);
449 } 484 }
450 __ bind(&done_convert); 485 __ bind(&done_convert);
451 } 486 }
452 487
453 // 4. Check if new target and constructor differ. 488 // 4. Check if new target and constructor differ.
454 Label new_object; 489 Label drop_frame_and_ret, new_object;
455 __ cmp(r4, r6); 490 __ cmp(r4, r6);
456 __ bne(&new_object); 491 __ bne(&new_object);
457 492
458 // 5. Allocate a JSValue wrapper for the string. 493 // 5. Allocate a JSValue wrapper for the string.
459 __ AllocateJSValue(r3, r4, r5, r7, r8, &new_object); 494 __ AllocateJSValue(r3, r4, r5, r7, r8, &new_object);
460 __ Ret(); 495 __ b(&drop_frame_and_ret);
461 496
462 // 6. Fallback to the runtime to create new object. 497 // 6. Fallback to the runtime to create new object.
463 __ bind(&new_object); 498 __ bind(&new_object);
464 { 499 {
465 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); 500 FrameScope scope(masm, StackFrame::MANUAL);
501 __ SmiTag(r9);
502 __ EnterBuiltinFrame(cp, r4, r9);
466 __ Push(r5); // first argument 503 __ Push(r5); // first argument
467 FastNewObjectStub stub(masm->isolate()); 504 FastNewObjectStub stub(masm->isolate());
468 __ CallStub(&stub); 505 __ CallStub(&stub);
469 __ Pop(r5); 506 __ Pop(r5);
507 __ LeaveBuiltinFrame(cp, r4, r9);
508 __ SmiUntag(r9);
470 } 509 }
471 __ StoreP(r5, FieldMemOperand(r3, JSValue::kValueOffset), r0); 510 __ StoreP(r5, FieldMemOperand(r3, JSValue::kValueOffset), r0);
472 __ Ret(); 511
512 __ bind(&drop_frame_and_ret);
513 {
514 __ Drop(r9);
515 __ Ret(1);
516 }
473 } 517 }
474 518
475 519
476 static void GenerateTailCallToSharedCode(MacroAssembler* masm) { 520 static void GenerateTailCallToSharedCode(MacroAssembler* masm) {
477 __ LoadP(ip, FieldMemOperand(r4, JSFunction::kSharedFunctionInfoOffset)); 521 __ LoadP(ip, FieldMemOperand(r4, JSFunction::kSharedFunctionInfoOffset));
478 __ LoadP(ip, FieldMemOperand(ip, SharedFunctionInfo::kCodeOffset)); 522 __ LoadP(ip, FieldMemOperand(ip, SharedFunctionInfo::kCodeOffset));
479 __ addi(ip, ip, Operand(Code::kHeaderSize - kHeapObjectTag)); 523 __ addi(ip, ip, Operand(Code::kHeaderSize - kHeapObjectTag));
480 __ JumpToJSEntry(ip); 524 __ JumpToJSEntry(ip);
481 } 525 }
482 526
(...skipping 1337 matching lines...) Expand 10 before | Expand all | Expand 10 after
1820 __ CallCFunction( 1864 __ CallCFunction(
1821 ExternalReference::get_date_field_function(masm->isolate()), 2); 1865 ExternalReference::get_date_field_function(masm->isolate()), 2);
1822 } 1866 }
1823 __ Ret(); 1867 __ Ret();
1824 1868
1825 // 3. Raise a TypeError if the receiver is not a date. 1869 // 3. Raise a TypeError if the receiver is not a date.
1826 __ bind(&receiver_not_date); 1870 __ bind(&receiver_not_date);
1827 { 1871 {
1828 FrameScope scope(masm, StackFrame::MANUAL); 1872 FrameScope scope(masm, StackFrame::MANUAL);
1829 __ push(r3); 1873 __ push(r3);
1830 __ PushStandardFrame(r4); 1874 __ LoadSmiLiteral(r3, Smi::FromInt(0));
1831 __ LoadSmiLiteral(r7, Smi::FromInt(0)); 1875 __ EnterBuiltinFrame(cp, r4, r3);
1832 __ push(r7);
1833 __ CallRuntime(Runtime::kThrowNotDateError); 1876 __ CallRuntime(Runtime::kThrowNotDateError);
1834 } 1877 }
1835 } 1878 }
1836 1879
1837 // static 1880 // static
1838 void Builtins::Generate_FunctionPrototypeApply(MacroAssembler* masm) { 1881 void Builtins::Generate_FunctionPrototypeApply(MacroAssembler* masm) {
1839 // ----------- S t a t e ------------- 1882 // ----------- S t a t e -------------
1840 // -- r3 : argc 1883 // -- r3 : argc
1841 // -- sp[0] : argArray 1884 // -- sp[0] : argArray
1842 // -- sp[4] : thisArg 1885 // -- sp[4] : thisArg
(...skipping 1160 matching lines...) Expand 10 before | Expand all | Expand 10 after
3003 __ bkpt(0); 3046 __ bkpt(0);
3004 } 3047 }
3005 } 3048 }
3006 3049
3007 3050
3008 #undef __ 3051 #undef __
3009 } // namespace internal 3052 } // namespace internal
3010 } // namespace v8 3053 } // namespace v8
3011 3054
3012 #endif // V8_TARGET_ARCH_PPC 3055 #endif // V8_TARGET_ARCH_PPC
OLDNEW
« no previous file with comments | « no previous file | src/ppc/macro-assembler-ppc.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698