Ignore:
Timestamp:
Feb 9, 2009, 5:28:15 PM (16 years ago)
Author:
[email protected]
Message:

2009-02-09 Gavin Barraclough <[email protected]>

Reviewed by Oliver Hunt.

A more sensible register allocation for x86-64.

When WREC was ported to x86-64 it stuck with the same register allocation as x86.
This requires registers to be reordered on entry into WREC generated code, since
argument passing is different on x86-64 and x86 (regparm(3)). This patch switches
x86-64 to use a native register allocation, that does not require argument registers
to be reordered.

  • wrec/WRECGenerator.cpp: (JSC::WREC::Generator::generateEnter): (JSC::WREC::Generator::generateReturnSuccess): (JSC::WREC::Generator::generateReturnFailure):
  • wrec/WRECGenerator.h:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/wrec/WRECGenerator.cpp

    r40562 r40799  
    4141void Generator::generateEnter()
    4242{
    43 #if PLATFORM(X86_64)
    44     // On x86-64 edi and esi are caller preserved, so nothing to do here.
    45     // The four arguments have been passed in the registers %rdi, %rsi,
    46     // %rdx, %rcx - shuffle these into the expected locations.
    47     move(X86::edi, input); // (arg 1) edi -> eax
    48     move(X86::ecx, output); // (arg 4) ecx -> edi
    49     move(X86::edx, length); // (arg 3) edx -> ecx
    50     move(X86::esi, index); // (arg 2) esi -> edx
    51 
    52 #else
     43#if PLATFORM(X86)
    5344    // On x86 edi & esi are callee preserved registers.
    5445    push(X86::edi);
     
    7263void Generator::generateReturnSuccess()
    7364{
     65    ASSERT(returnRegister != index);
     66    ASSERT(returnRegister != output);
     67
    7468    // Set return value.
    75     pop(X86::eax); // match begin
    76     store32(X86::eax, output);
     69    pop(returnRegister); // match begin
     70    store32(returnRegister, output);
    7771    store32(index, Address(output, 4)); // match end
    7872   
    7973    // Restore callee save registers.
    80 #if !PLATFORM(X86_64)
     74#if PLATFORM(X86)
    8175    pop(X86::esi);
    8276    pop(X86::edi);
     
    115109{
    116110    pop();
    117     move(Imm32(-1), X86::eax);
    118 #if !PLATFORM(X86_64)
     111    move(Imm32(-1), returnRegister);
     112
     113#if PLATFORM(X86)
    119114    pop(X86::esi);
    120115    pop(X86::edi);
Note: See TracChangeset for help on using the changeset viewer.