Changeset 138970 in webkit


Ignore:
Timestamp:
Jan 7, 2013 11:40:10 AM (11 years ago)
Author:
commit-queue@webkit.org
Message:

MIPS LLInt implementation.
https://bugs.webkit.org/show_bug.cgi?id=99706

Patch by Balazs Kilvady <kilvadyb@homejinni.com> on 2013-01-07
Reviewed by Filip Pizlo.

LLInt implementation for MIPS.

Source/JavaScriptCore:

  • assembler/MacroAssemblerMIPS.h:

(JSC::MacroAssemblerMIPS::jump):

  • dfg/DFGOperations.cpp:

(JSC):

  • jit/JITStubs.cpp:

(JSC):

  • jit/JITStubs.h:

(JITStackFrame):

  • llint/LLIntOfflineAsmConfig.h:
  • llint/LowLevelInterpreter.asm:
  • llint/LowLevelInterpreter32_64.asm:
  • offlineasm/backends.rb:
  • offlineasm/instructions.rb:
  • offlineasm/mips.rb: Added.

Source/WTF:

  • wtf/Platform.h:
Location:
trunk/Source
Files:
1 added
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r138957 r138970  
     12013-01-07  Balazs Kilvady  <kilvadyb@homejinni.com>
     2
     3        MIPS LLInt implementation.
     4        https://bugs.webkit.org/show_bug.cgi?id=99706
     5
     6        Reviewed by Filip Pizlo.
     7
     8        LLInt implementation for MIPS.
     9
     10        * assembler/MacroAssemblerMIPS.h:
     11        (JSC::MacroAssemblerMIPS::jump):
     12        * dfg/DFGOperations.cpp:
     13        (JSC):
     14        * jit/JITStubs.cpp:
     15        (JSC):
     16        * jit/JITStubs.h:
     17        (JITStackFrame):
     18        * llint/LLIntOfflineAsmConfig.h:
     19        * llint/LowLevelInterpreter.asm:
     20        * llint/LowLevelInterpreter32_64.asm:
     21        * offlineasm/backends.rb:
     22        * offlineasm/instructions.rb:
     23        * offlineasm/mips.rb: Added.
     24
    1252013-01-07  Mark Hahnenberg  <mhahnenberg@apple.com>
    226
  • trunk/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h

    r137919 r138970  
    13231323    void jump(RegisterID target)
    13241324    {
    1325         m_assembler.jr(target);
     1325        move(target, MIPSRegisters::t9);
     1326        m_assembler.jr(MIPSRegisters::t9);
    13261327        m_assembler.nop();
    13271328    }
  • trunk/Source/JavaScriptCore/dfg/DFGOperations.cpp

    r138201 r138970  
    4848#if ENABLE(JIT)
    4949
     50#if CPU(MIPS)
     51#if WTF_MIPS_PIC
     52#define LOAD_FUNCTION_TO_T9(function) \
     53        ".set noreorder" "\n" \
     54        ".cpload $25" "\n" \
     55        ".set reorder" "\n" \
     56        "la $t9, " LOCAL_REFERENCE(function) "\n"
     57#else
     58#define LOAD_FUNCTION_TO_T9(function) "" "\n"
     59#endif
     60#endif
     61
    5062#if ENABLE(DFG_JIT)
    5163
     
    199211    SYMBOL_STRING(function) ":" "\n" \
    200212        INSTRUCTION_STORE_RETURN_ADDRESS_EJCI "\n" \
     213        "b " LOCAL_REFERENCE(function) "WithReturnAddress" "\n" \
     214    );
     215
     216#elif COMPILER(GCC) && CPU(MIPS)
     217
     218#define FUNCTION_WRAPPER_WITH_RETURN_ADDRESS_E(function) \
     219    asm( \
     220    ".text" "\n" \
     221    ".globl " SYMBOL_STRING(function) "\n" \
     222    HIDE_SYMBOL(function) "\n" \
     223    SYMBOL_STRING(function) ":" "\n" \
     224    LOAD_FUNCTION_TO_T9(function##WithReturnAddress) \
     225        "move $a1, $ra" "\n" \
     226        "b " LOCAL_REFERENCE(function) "WithReturnAddress" "\n" \
     227    );
     228
     229#define FUNCTION_WRAPPER_WITH_RETURN_ADDRESS_ECI(function) \
     230    asm( \
     231    ".text" "\n" \
     232    ".globl " SYMBOL_STRING(function) "\n" \
     233    HIDE_SYMBOL(function) "\n" \
     234    SYMBOL_STRING(function) ":" "\n" \
     235    LOAD_FUNCTION_TO_T9(function##WithReturnAddress) \
     236        "move $a3, $ra" "\n" \
     237        "b " LOCAL_REFERENCE(function) "WithReturnAddress" "\n" \
     238    );
     239
     240#define FUNCTION_WRAPPER_WITH_RETURN_ADDRESS_EJI(function) \
     241    asm( \
     242    ".text" "\n" \
     243    ".globl " SYMBOL_STRING(function) "\n" \
     244    HIDE_SYMBOL(function) "\n" \
     245    SYMBOL_STRING(function) ":" "\n" \
     246    LOAD_FUNCTION_TO_T9(function##WithReturnAddress) \
     247        "sw $ra, 20($sp)" "\n" \
     248        "b " LOCAL_REFERENCE(function) "WithReturnAddress" "\n" \
     249    );
     250
     251#define FUNCTION_WRAPPER_WITH_RETURN_ADDRESS_EJCI(function) \
     252    asm( \
     253    ".text" "\n" \
     254    ".globl " SYMBOL_STRING(function) "\n" \
     255    HIDE_SYMBOL(function) "\n" \
     256    SYMBOL_STRING(function) ":" "\n" \
     257    LOAD_FUNCTION_TO_T9(function##WithReturnAddress) \
     258        "sw $ra, 24($sp)" "\n" \
    201259        "b " LOCAL_REFERENCE(function) "WithReturnAddress" "\n" \
    202260    );
     
    16391697    "b " LOCAL_REFERENCE(getHostCallReturnValueWithExecState) "\n"
    16401698);
     1699#elif COMPILER(GCC) && CPU(MIPS)
     1700asm(
     1701".text" "\n"
     1702".globl " SYMBOL_STRING(getHostCallReturnValue) "\n"
     1703HIDE_SYMBOL(getHostCallReturnValue) "\n"
     1704SYMBOL_STRING(getHostCallReturnValue) ":" "\n"
     1705    LOAD_FUNCTION_TO_T9(getHostCallReturnValueWithExecState)
     1706    "lw $s0, -40($s0)" "\n"
     1707    "move $a0, $s0" "\n"
     1708    "b " LOCAL_REFERENCE(getHostCallReturnValueWithExecState) "\n"
     1709);
    16411710#endif
    16421711
  • trunk/Source/JavaScriptCore/jit/JITStubs.cpp

    r138609 r138970  
    281281#define PRESERVED_S1_OFFSET         68
    282282#define PRESERVED_S2_OFFSET         72
    283 #define PRESERVED_RETURN_ADDRESS_OFFSET 76
    284 #define THUNK_RETURN_ADDRESS_OFFSET 80
    285 #define REGISTER_FILE_OFFSET        84
    286 #define GLOBAL_DATA_OFFSET         100
    287 #define STACK_LENGTH               104
     283#define PRESERVED_S3_OFFSET         76
     284#define PRESERVED_S4_OFFSET         80
     285#define PRESERVED_RETURN_ADDRESS_OFFSET 84
     286#define THUNK_RETURN_ADDRESS_OFFSET 88
     287#define REGISTER_FILE_OFFSET        92
     288#define GLOBAL_DATA_OFFSET         108
     289#define STACK_LENGTH               112
    288290#elif CPU(SH4)
    289291#define SYMBOL_STRING(name) #name
     
    452454    "addiu $29,$29,-" STRINGIZE_VALUE_OF(STACK_LENGTH) "\n"
    453455    "sw    $31," STRINGIZE_VALUE_OF(PRESERVED_RETURN_ADDRESS_OFFSET) "($29)" "\n"
     456    "sw    $20," STRINGIZE_VALUE_OF(PRESERVED_S4_OFFSET) "($29)" "\n"
     457    "sw    $19," STRINGIZE_VALUE_OF(PRESERVED_S3_OFFSET) "($29)" "\n"
    454458    "sw    $18," STRINGIZE_VALUE_OF(PRESERVED_S2_OFFSET) "($29)" "\n"
    455459    "sw    $17," STRINGIZE_VALUE_OF(PRESERVED_S1_OFFSET) "($29)" "\n"
     
    468472    "lw    $17," STRINGIZE_VALUE_OF(PRESERVED_S1_OFFSET) "($29)" "\n"
    469473    "lw    $18," STRINGIZE_VALUE_OF(PRESERVED_S2_OFFSET) "($29)" "\n"
     474    "lw    $19," STRINGIZE_VALUE_OF(PRESERVED_S3_OFFSET) "($29)" "\n"
     475    "lw    $20," STRINGIZE_VALUE_OF(PRESERVED_S4_OFFSET) "($29)" "\n"
    470476    "lw    $31," STRINGIZE_VALUE_OF(PRESERVED_RETURN_ADDRESS_OFFSET) "($29)" "\n"
    471477    "jr    $31" "\n"
     
    474480".set macro" "\n"
    475481".end " SYMBOL_STRING(ctiTrampoline) "\n"
     482".globl " SYMBOL_STRING(ctiTrampolineEnd) "\n"
     483HIDE_SYMBOL(ctiTrampolineEnd) "\n"
     484SYMBOL_STRING(ctiTrampolineEnd) ":" "\n"
    476485);
    477486
     
    486495SYMBOL_STRING(ctiVMThrowTrampoline) ":" "\n"
    487496#if WTF_MIPS_PIC
    488     "lw    $28," STRINGIZE_VALUE_OF(PRESERVED_GP_OFFSET) "($29)" "\n"
    489497".set macro" "\n"
     498".cpload $31" "\n"
    490499    "la    $25," SYMBOL_STRING(cti_vm_throw) "\n"
    491500".set nomacro" "\n"
     
    499508    "lw    $17," STRINGIZE_VALUE_OF(PRESERVED_S1_OFFSET) "($29)" "\n"
    500509    "lw    $18," STRINGIZE_VALUE_OF(PRESERVED_S2_OFFSET) "($29)" "\n"
     510    "lw    $19," STRINGIZE_VALUE_OF(PRESERVED_S3_OFFSET) "($29)" "\n"
     511    "lw    $20," STRINGIZE_VALUE_OF(PRESERVED_S4_OFFSET) "($29)" "\n"
    501512    "lw    $31," STRINGIZE_VALUE_OF(PRESERVED_RETURN_ADDRESS_OFFSET) "($29)" "\n"
    502513    "jr    $31" "\n"
     
    519530    "lw    $17," STRINGIZE_VALUE_OF(PRESERVED_S1_OFFSET) "($29)" "\n"
    520531    "lw    $18," STRINGIZE_VALUE_OF(PRESERVED_S2_OFFSET) "($29)" "\n"
     532    "lw    $19," STRINGIZE_VALUE_OF(PRESERVED_S3_OFFSET) "($29)" "\n"
     533    "lw    $20," STRINGIZE_VALUE_OF(PRESERVED_S4_OFFSET) "($29)" "\n"
    521534    "lw    $31," STRINGIZE_VALUE_OF(PRESERVED_RETURN_ADDRESS_OFFSET) "($29)" "\n"
    522535    "jr    $31" "\n"
     
    10681081        ".ent " SYMBOL_STRING(cti_##op) "\n" \
    10691082        SYMBOL_STRING(cti_##op) ":" "\n" \
    1070         "lw    $28," STRINGIZE_VALUE_OF(PRESERVED_GP_OFFSET) "($29)" "\n" \
     1083        ".set macro" "\n" \
     1084        ".cpload $25" "\n" \
    10711085        "sw    $31," STRINGIZE_VALUE_OF(THUNK_RETURN_ADDRESS_OFFSET) "($29)" "\n" \
    1072         ".set macro" "\n" \
    10731086        "la    $25," SYMBOL_STRING(JITStubThunked_##op) "\n" \
    10741087        ".set nomacro" "\n" \
  • trunk/Source/JavaScriptCore/jit/JITStubs.h

    r138609 r138970  
    219219    void* preservedS1;
    220220    void* preservedS2;
     221    void* preservedS3;
     222    void* preservedS4;
    221223    void* preservedReturnAddress;
    222224
  • trunk/Source/JavaScriptCore/llint/LLIntOfflineAsmConfig.h

    r131269 r138970  
    3939#define OFFLINE_ASM_X86_64 0
    4040#define OFFLINE_ASM_ARMv7s 0
     41#define OFFLINE_ASM_MIPS 0
    4142
    4243#else // !ENABLE(LLINT_C_LOOP)
     
    6667#else
    6768#define OFFLINE_ASM_X86_64 0
     69#endif
     70
     71#if CPU(MIPS)
     72#define OFFLINE_ASM_MIPS 1
     73#else
     74#define OFFLINE_ASM_MIPS 0
    6875#endif
    6976
     
    112119#endif
    113120
     121#if CPU(MIPS)
     122#ifdef WTF_MIPS_PIC
     123#define S(x) #x
     124#define SX(x) S(x)
     125#define OFFLINE_ASM_CPLOAD(reg) \
     126    ".set noreorder\n" \
     127    ".cpload " SX(reg) "\n" \
     128    ".set reorder\n"
     129#else
     130#define OFFLINE_ASM_CPLOAD(reg)
     131#endif
     132#endif
     133
    114134#endif // LLIntOfflineAsmConfig_h
  • trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.asm

    r133953 r138970  
    183183
    184184macro preserveReturnAddressAfterCall(destinationRegister)
    185     if C_LOOP
    186         # In our case, we're only preserving the bytecode vPC.
    187         move lr, destinationRegister
    188     elsif ARMv7
     185    if C_LOOP or ARMv7 or MIPS
     186        # In C_LOOP case, we're only preserving the bytecode vPC.
    189187        move lr, destinationRegister
    190188    elsif X86 or X86_64
     
    196194
    197195macro restoreReturnAddressBeforeReturn(sourceRegister)
    198     if C_LOOP
    199         # In our case, we're only restoring the bytecode vPC.
    200         move sourceRegister, lr
    201     elsif ARMv7
     196    if C_LOOP or ARMv7 or MIPS
     197        # In C_LOOP case, we're only restoring the bytecode vPC.
    202198        move sourceRegister, lr
    203199    elsif X86 or X86_64
  • trunk/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm

    r137937 r138970  
    114114        poke arg2, 1
    115115        call function
     116    elsif MIPS
     117        move arg1, a0
     118        move arg2, a1
     119        call function
    116120    elsif C_LOOP
    117121        cloopCallSlowPath function, arg1, arg2
     
    134138        poke arg3, 2
    135139        poke arg4, 3
     140        call function
     141    elsif MIPS
     142        move arg1, a0
     143        move arg2, a1
     144        move arg3, a2
     145        move arg4, a3
    136146        call function
    137147    elsif C_LOOP
     
    18291839        restoreReturnAddressBeforeReturn(t3)
    18301840        loadp JITStackFrame::globalData[sp], t3
     1841    elsif MIPS
     1842        loadp JITStackFrame::globalData[sp], t3
     1843        storep cfr, JSGlobalData::topCallFrame[t3]
     1844        move t0, t2
     1845        preserveReturnAddressAfterCall(t3)
     1846        storep t3, ReturnPC[cfr]
     1847        move cfr, t0
     1848        loadi Callee + PayloadOffset[cfr], t1
     1849        loadp JSFunction::m_executable[t1], t1
     1850        move t2, cfr
     1851        move t0, a0
     1852        call executableOffsetToFunction[t1]
     1853        restoreReturnAddressBeforeReturn(t3)
     1854        loadp JITStackFrame::globalData[sp], t3
    18311855    elsif C_LOOP
    18321856        loadp JITStackFrame::globalData[sp], t3
  • trunk/Source/JavaScriptCore/offlineasm/backends.rb

    r128815 r138970  
    2626require "ast"
    2727require "x86"
     28require "mips"
    2829require "cloop"
    2930
     
    3334     "X86_64",
    3435     "ARMv7",
     36     "MIPS",
    3537     "C_LOOP"
    3638    ]
     
    4648     "X86_64",
    4749     "ARMv7",
     50     "MIPS",
    4851     "C_LOOP"
    4952    ]
  • trunk/Source/JavaScriptCore/offlineasm/instructions.rb

    r133551 r138970  
    266266    ]
    267267
     268MIPS_INSTRUCTIONS =
     269    [
     270    "movz",
     271    "movn",
     272    "slt",
     273    "sltu",
     274    "pichdr",
     275    "pichdrra"
     276    ]
     277
    268278CXX_INSTRUCTIONS =
    269279    [
     
    282292    ]
    283293
    284 INSTRUCTIONS = MACRO_INSTRUCTIONS + X86_INSTRUCTIONS + ARMv7_INSTRUCTIONS + CXX_INSTRUCTIONS
     294INSTRUCTIONS = MACRO_INSTRUCTIONS + X86_INSTRUCTIONS + ARMv7_INSTRUCTIONS + MIPS_INSTRUCTIONS + CXX_INSTRUCTIONS
    285295
    286296INSTRUCTION_PATTERN = Regexp.new('\\A((' + INSTRUCTIONS.join(')|(') + '))\\Z')
  • trunk/Source/WTF/ChangeLog

    r138903 r138970  
     12013-01-07  Balazs Kilvady  <kilvadyb@homejinni.com>
     2
     3        MIPS LLInt implementation.
     4        https://bugs.webkit.org/show_bug.cgi?id=99706
     5
     6        Reviewed by Filip Pizlo.
     7
     8        LLInt implementation for MIPS.
     9
     10        * wtf/Platform.h:
     11
    1122013-01-05  Jonathan Liu  <net147@gmail.com>
    213
  • trunk/Source/WTF/wtf/Platform.h

    r137449 r138970  
    928928    && (OS(DARWIN) || OS(LINUX)) \
    929929    && (PLATFORM(MAC) || PLATFORM(IOS) || PLATFORM(GTK) || PLATFORM(QT)) \
    930     && (CPU(X86) || CPU(X86_64) || CPU(ARM_THUMB2))
     930    && (CPU(X86) || CPU(X86_64) || CPU(ARM_THUMB2) || CPU(MIPS))
    931931#define ENABLE_LLINT 1
    932932#endif
Note: See TracChangeset for help on using the changeset viewer.