Changeset 50981 in webkit for trunk/JavaScriptCore/jit


Ignore:
Timestamp:
Nov 13, 2009, 4:44:42 PM (16 years ago)
Author:
[email protected]
Message:

https://bugs.webkit.org/show_bug.cgi?id=31050

Patch by Zoltan Herczeg <[email protected]> on 2009-11-14
Reviewed by Gavin Barraclough.

Adding JSVALUE32_64 support for ARM (but not turning it
on by default). All optimizations must be disabled, since
this patch is only the first of a series of patches.

During the work, a lot of x86 specific code revealed and
made platform independent.
See revisions: 50531 50541 50593 50594 50595

  • assembler/ARMAssembler.h:

(JSC::ARMAssembler::):
(JSC::ARMAssembler::fdivd_r):

  • assembler/MacroAssemblerARM.h:

(JSC::MacroAssemblerARM::lshift32):
(JSC::MacroAssemblerARM::neg32):
(JSC::MacroAssemblerARM::rshift32):
(JSC::MacroAssemblerARM::branchOr32):
(JSC::MacroAssemblerARM::set8):
(JSC::MacroAssemblerARM::setTest8):
(JSC::MacroAssemblerARM::loadDouble):
(JSC::MacroAssemblerARM::divDouble):
(JSC::MacroAssemblerARM::convertInt32ToDouble):
(JSC::MacroAssemblerARM::zeroDouble):

  • jit/JIT.cpp:
  • jit/JIT.h:
  • jit/JITOpcodes.cpp:

(JSC::JIT::privateCompileCTIMachineTrampolines):

  • jit/JITStubs.cpp:
  • wtf/StdLibExtras.h:
Location:
trunk/JavaScriptCore/jit
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/jit/JIT.cpp

    r50254 r50981  
    3838#include "Interpreter.h"
    3939#include "JITInlineMethods.h"
    40 #include "JITStubs.h"
    4140#include "JITStubCall.h"
    4241#include "JSArray.h"
  • trunk/JavaScriptCore/jit/JIT.h

    r50255 r50981  
    466466        static const int patchOffsetMethodCheckProtoStruct = 18;
    467467        static const int patchOffsetMethodCheckPutFunction = 29;
     468#elif PLATFORM(ARM_TRADITIONAL)
     469// patchOffset... values should go here; JIT optimizations currently not supported on ARM with JSVALUE32_64.
    468470#else
    469471#error "JSVALUE32_64 not supported on this platform."
  • trunk/JavaScriptCore/jit/JITOpcodes.cpp

    r50540 r50981  
    139139    jump(regT0);
    140140
    141 #if PLATFORM(X86)
     141#if PLATFORM(X86) || PLATFORM(ARM_TRADITIONAL)
    142142    Label nativeCallThunk = align();
    143143    preserveReturnAddressAfterCall(regT0);
     
    150150    emitPutToCallFrameHeader(regT1, RegisterFile::ScopeChain);
    151151   
     152#if PLATFORM(X86)
    152153    emitGetFromCallFrameHeader32(RegisterFile::ArgumentCount, regT0);
    153154
     
    248249    // so pull them off now
    249250    addPtr(Imm32(NativeCallFrameSize - sizeof(NativeFunctionCalleeSignature)), stackPointerRegister);
     251
     252#elif PLATFORM(ARM_TRADITIONAL)
     253    emitGetFromCallFrameHeader32(RegisterFile::ArgumentCount, regT0);
     254
     255    // Allocate stack space for our arglist
     256    COMPILE_ASSERT((sizeof(ArgList) & 0x7) == 0 && sizeof(JSValue) == 8 && sizeof(Register) == 8, ArgList_should_by_8byte_aligned);
     257    subPtr(Imm32(sizeof(ArgList)), stackPointerRegister);
     258
     259    // Set up arguments
     260    subPtr(Imm32(1), regT0); // Don't include 'this' in argcount
     261
     262    // Push argcount
     263    storePtr(regT0, Address(stackPointerRegister, OBJECT_OFFSETOF(ArgList, m_argCount)));
     264
     265    // Calculate the start of the callframe header, and store in regT1
     266    move(callFrameRegister, regT1);
     267    sub32(Imm32(RegisterFile::CallFrameHeaderSize * (int32_t)sizeof(Register)), regT1);
     268
     269    // Calculate start of arguments as callframe header - sizeof(Register) * argcount (regT1)
     270    mul32(Imm32(sizeof(Register)), regT0, regT0);
     271    subPtr(regT0, regT1);
     272
     273    // push pointer to arguments
     274    storePtr(regT1, Address(stackPointerRegister, OBJECT_OFFSETOF(ArgList, m_args)));
     275
     276    // Argument passing method:
     277    // r0 - points to return value
     278    // r1 - callFrame
     279    // r2 - callee
     280    // stack: this(JSValue) and a pointer to ArgList
     281
     282    move(stackPointerRegister, regT3);
     283    subPtr(Imm32(8), stackPointerRegister);
     284    move(stackPointerRegister, regT0);
     285    subPtr(Imm32(8 + 4 + 4 /* padding */), stackPointerRegister);
     286
     287    // Setup arg4:
     288    storePtr(regT3, Address(stackPointerRegister, 8));
     289
     290    // Setup arg3
     291    // regT1 currently points to the first argument, regT1-sizeof(Register) points to 'this'
     292    load32(Address(regT1, -(int32_t)sizeof(void*) * 2), regT3);
     293    storePtr(regT3, Address(stackPointerRegister, 0));
     294    load32(Address(regT1, -(int32_t)sizeof(void*)), regT3);
     295    storePtr(regT3, Address(stackPointerRegister, 4));
     296
     297    // Setup arg2:
     298    emitGetFromCallFrameHeaderPtr(RegisterFile::Callee, regT2);
     299
     300    // Setup arg1:
     301    move(callFrameRegister, regT1);
     302
     303    call(Address(regT2, OBJECT_OFFSETOF(JSFunction, m_data)));
     304
     305    // Load return value
     306    load32(Address(stackPointerRegister, 16), regT0);
     307    load32(Address(stackPointerRegister, 20), regT1);
     308
     309    addPtr(Imm32(sizeof(ArgList) + 16 + 8), stackPointerRegister);
     310#endif
    250311
    251312    // Check for an exception
  • trunk/JavaScriptCore/jit/JITStubs.cpp

    r50874 r50981  
    5757#include "Register.h"
    5858#include "SamplingTool.h"
     59#include <wtf/StdLibExtras.h>
    5960#include <stdarg.h>
    6061#include <stdio.h>
     
    269270    "add sp, sp, #0x3c" "\n"
    270271    "bx lr" "\n"
     272);
     273
     274#elif COMPILER(GCC) && PLATFORM(ARM_TRADITIONAL)
     275
     276asm volatile (
     277".globl " SYMBOL_STRING(ctiTrampoline) "\n"
     278SYMBOL_STRING(ctiTrampoline) ":" "\n"
     279    "stmdb sp!, {r1-r3}" "\n"
     280    "stmdb sp!, {r4-r8, lr}" "\n"
     281    "sub sp, sp, #68" "\n"
     282    "mov r4, r2" "\n"
     283    "mov r5, #512" "\n"
     284    // r0 contains the code
     285    "mov lr, pc" "\n"
     286    "mov pc, r0" "\n"
     287    "add sp, sp, #68" "\n"
     288    "ldmia sp!, {r4-r8, lr}" "\n"
     289    "add sp, sp, #12" "\n"
     290    "mov pc, lr" "\n"
     291);
     292
     293asm volatile (
     294".globl " SYMBOL_STRING(ctiVMThrowTrampoline) "\n"
     295SYMBOL_STRING(ctiVMThrowTrampoline) ":" "\n"
     296    "mov r0, sp" "\n"
     297    "bl " SYMBOL_STRING(cti_vm_throw) "\n"
     298
     299// Both has the same return sequence
     300".globl " SYMBOL_STRING(ctiOpThrowNotCaught) "\n"
     301SYMBOL_STRING(ctiOpThrowNotCaught) ":" "\n"
     302    "add sp, sp, #68" "\n"
     303    "ldmia sp!, {r4-r8, lr}" "\n"
     304    "add sp, sp, #12" "\n"
     305    "mov pc, lr" "\n"
    271306);
    272307
     
    907942#elif PLATFORM(ARM_TRADITIONAL) && COMPILER(GCC)
    908943
     944#if USE(JSVALUE32_64)
     945#define THUNK_RETURN_ADDRESS_OFFSET 64
     946#else
     947#define THUNK_RETURN_ADDRESS_OFFSET 32
     948#endif
     949
     950COMPILE_ASSERT(offsetof(struct JITStackFrame, thunkReturnAddress) == THUNK_RETURN_ADDRESS_OFFSET, JITStackFrame_thunkReturnAddress_offset_mismatch);
     951
    909952#define DEFINE_STUB_FUNCTION(rtype, op) \
    910953    extern "C" { \
     
    914957        ".globl " SYMBOL_STRING(cti_##op) "\n" \
    915958        SYMBOL_STRING(cti_##op) ":" "\n" \
    916         "str lr, [sp, #32]" "\n" \
     959        "str lr, [sp, #" STRINGIZE_VALUE_OF(THUNK_RETURN_ADDRESS_OFFSET) "]" "\n" \
    917960        "bl " SYMBOL_STRING(JITStubThunked_##op) "\n" \
    918         "ldr lr, [sp, #32]" "\n" \
     961        "ldr lr, [sp, #" STRINGIZE_VALUE_OF(THUNK_RETURN_ADDRESS_OFFSET) "]" "\n" \
    919962        "mov pc, lr" "\n" \
    920963        ); \
Note: See TracChangeset for help on using the changeset viewer.