|
Lines 440-453
MacroAssemblerCodeRef arityFixup(VM* vm)
Source/JavaScriptCore/jit/ThunkGenerators.cpp_sec1
|
| 440 |
{ |
440 |
{ |
| 441 |
JSInterfaceJIT jit(vm); |
441 |
JSInterfaceJIT jit(vm); |
| 442 |
|
442 |
|
| 443 |
// We enter with fixup count in regT0 |
443 |
// We enter with fixup count in regT0 and the return thunk in regT5. We use |
|
|
444 |
// VM::currentReturnThunkPC instead of regT5 on X86-32. |
| 444 |
#if USE(JSVALUE64) |
445 |
#if USE(JSVALUE64) |
| 445 |
# if CPU(X86_64) |
446 |
# if CPU(X86_64) |
| 446 |
jit.pop(JSInterfaceJIT::regT4); |
447 |
jit.pop(JSInterfaceJIT::regT4); |
| 447 |
# endif |
448 |
# endif |
|
|
449 |
jit.add32(JSInterfaceJIT::TrustedImm32(1), JSInterfaceJIT::regT0); |
| 448 |
jit.neg64(JSInterfaceJIT::regT0); |
450 |
jit.neg64(JSInterfaceJIT::regT0); |
| 449 |
jit.move(JSInterfaceJIT::callFrameRegister, JSInterfaceJIT::regT3); |
451 |
jit.move(JSInterfaceJIT::callFrameRegister, JSInterfaceJIT::regT3); |
| 450 |
jit.load32(JSInterfaceJIT::Address(JSInterfaceJIT::callFrameRegister, JSStack::ArgumentCount * 8), JSInterfaceJIT::regT2); |
452 |
jit.load32(JSInterfaceJIT::Address(JSInterfaceJIT::callFrameRegister, JSStack::ArgumentCount * sizeof(Register)), JSInterfaceJIT::regT2); |
| 451 |
jit.add32(JSInterfaceJIT::TrustedImm32(JSStack::CallFrameHeaderSize), JSInterfaceJIT::regT2); |
453 |
jit.add32(JSInterfaceJIT::TrustedImm32(JSStack::CallFrameHeaderSize), JSInterfaceJIT::regT2); |
| 452 |
|
454 |
|
| 453 |
// Move current frame down regT0 number of slots |
455 |
// Move current frame down regT0 number of slots |
|
Lines 457-474
MacroAssemblerCodeRef arityFixup(VM* vm)
Source/JavaScriptCore/jit/ThunkGenerators.cpp_sec2
|
| 457 |
jit.addPtr(JSInterfaceJIT::TrustedImm32(8), JSInterfaceJIT::regT3); |
459 |
jit.addPtr(JSInterfaceJIT::TrustedImm32(8), JSInterfaceJIT::regT3); |
| 458 |
jit.branchSub32(MacroAssembler::NonZero, JSInterfaceJIT::TrustedImm32(1), JSInterfaceJIT::regT2).linkTo(copyLoop, &jit); |
460 |
jit.branchSub32(MacroAssembler::NonZero, JSInterfaceJIT::TrustedImm32(1), JSInterfaceJIT::regT2).linkTo(copyLoop, &jit); |
| 459 |
|
461 |
|
| 460 |
// Fill in regT0 missing arg slots with undefined |
462 |
// Fill in regT0 - 1 missing arg slots with undefined |
| 461 |
jit.move(JSInterfaceJIT::regT0, JSInterfaceJIT::regT2); |
463 |
jit.move(JSInterfaceJIT::regT0, JSInterfaceJIT::regT2); |
| 462 |
jit.move(JSInterfaceJIT::TrustedImm64(ValueUndefined), JSInterfaceJIT::regT1); |
464 |
jit.move(JSInterfaceJIT::TrustedImm64(ValueUndefined), JSInterfaceJIT::regT1); |
|
|
465 |
jit.add32(JSInterfaceJIT::TrustedImm32(1), JSInterfaceJIT::regT2); |
| 463 |
JSInterfaceJIT::Label fillUndefinedLoop(jit.label()); |
466 |
JSInterfaceJIT::Label fillUndefinedLoop(jit.label()); |
| 464 |
jit.store64(JSInterfaceJIT::regT1, MacroAssembler::BaseIndex(JSInterfaceJIT::regT3, JSInterfaceJIT::regT0, JSInterfaceJIT::TimesEight)); |
467 |
jit.store64(JSInterfaceJIT::regT1, MacroAssembler::BaseIndex(JSInterfaceJIT::regT3, JSInterfaceJIT::regT0, JSInterfaceJIT::TimesEight)); |
| 465 |
jit.addPtr(JSInterfaceJIT::TrustedImm32(8), JSInterfaceJIT::regT3); |
468 |
jit.addPtr(JSInterfaceJIT::TrustedImm32(8), JSInterfaceJIT::regT3); |
| 466 |
jit.branchAdd32(MacroAssembler::NonZero, JSInterfaceJIT::TrustedImm32(1), JSInterfaceJIT::regT2).linkTo(fillUndefinedLoop, &jit); |
469 |
jit.branchAdd32(MacroAssembler::NonZero, JSInterfaceJIT::TrustedImm32(1), JSInterfaceJIT::regT2).linkTo(fillUndefinedLoop, &jit); |
| 467 |
|
470 |
|
| 468 |
// Adjust call frame register and stack pointer to account for missing args |
471 |
// Adjust call frame register and stack pointer to account for missing args |
| 469 |
jit.lshift64(JSInterfaceJIT::TrustedImm32(3), JSInterfaceJIT::regT0); |
472 |
jit.lshift64(JSInterfaceJIT::TrustedImm32(3), JSInterfaceJIT::regT1); |
| 470 |
jit.addPtr(JSInterfaceJIT::regT0, JSInterfaceJIT::callFrameRegister); |
473 |
jit.addPtr(JSInterfaceJIT::regT1, JSInterfaceJIT::callFrameRegister); |
| 471 |
jit.addPtr(JSInterfaceJIT::regT0, JSInterfaceJIT::stackPointerRegister); |
474 |
jit.addPtr(JSInterfaceJIT::regT1, JSInterfaceJIT::stackPointerRegister); |
|
|
475 |
|
| 476 |
// Save the original return PC. |
| 477 |
jit.loadPtr(JSInterfaceJIT::Address(JSInterfaceJIT::callFrameRegister, CallFrame::returnPCOffset()), GPRInfo::regT1); |
| 478 |
jit.storePtr(GPRInfo::regT1, MacroAssembler::BaseIndex(JSInterfaceJIT::regT3, JSInterfaceJIT::regT0, JSInterfaceJIT::TimesEight)); |
| 479 |
|
| 480 |
// Install the new return PC. |
| 481 |
jit.storePtr(GPRInfo::regT5, JSInterfaceJIT::Address(JSInterfaceJIT::callFrameRegister, CallFrame::returnPCOffset())); |
| 472 |
|
482 |
|
| 473 |
# if CPU(X86_64) |
483 |
# if CPU(X86_64) |
| 474 |
jit.push(JSInterfaceJIT::regT4); |
484 |
jit.push(JSInterfaceJIT::regT4); |