Ignore:
Timestamp:
Mar 15, 2010, 9:33:24 AM (15 years ago)
Author:
[email protected]
Message:

2010-03-15 Gabor Loki <[email protected]>

Reviewed by Gavin Barraclough.

Combine ctiTrampolines on ARM and Thumb-2
https://bugs.webkit.org/show_bug.cgi?id=36014

  • jit/JITStubs.cpp: (JSC::JITThunks::JITThunks):
File:
1 edited

Legend:

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

    r55833 r56000  
    240240#endif
    241241
    242 asm volatile (
    243 ".text" "\n"
    244 ".align 2" "\n"
    245 ".globl " SYMBOL_STRING(ctiTrampoline) "\n"
    246 HIDE_SYMBOL(ctiTrampoline) "\n"
    247 ".thumb" "\n"
    248 ".thumb_func " THUMB_FUNC_PARAM(ctiTrampoline) "\n"
    249 SYMBOL_STRING(ctiTrampoline) ":" "\n"
    250     "sub sp, sp, #0x3c" "\n"
    251     "str lr, [sp, #0x20]" "\n"
    252     "str r4, [sp, #0x24]" "\n"
    253     "str r5, [sp, #0x28]" "\n"
    254     "str r6, [sp, #0x2c]" "\n"
    255     "str r1, [sp, #0x30]" "\n"
    256     "str r2, [sp, #0x34]" "\n"
    257     "str r3, [sp, #0x38]" "\n"
    258     "cpy r5, r2" "\n"
    259     "mov r6, #512" "\n"
    260     "blx r0" "\n"
    261     "ldr r6, [sp, #0x2c]" "\n"
    262     "ldr r5, [sp, #0x28]" "\n"
    263     "ldr r4, [sp, #0x24]" "\n"
    264     "ldr lr, [sp, #0x20]" "\n"
    265     "add sp, sp, #0x3c" "\n"
    266     "bx lr" "\n"
    267 );
    268 
    269 asm volatile (
    270 ".text" "\n"
    271 ".align 2" "\n"
    272 ".globl " SYMBOL_STRING(ctiVMThrowTrampoline) "\n"
    273 HIDE_SYMBOL(ctiVMThrowTrampoline) "\n"
    274 ".thumb" "\n"
    275 ".thumb_func " THUMB_FUNC_PARAM(ctiVMThrowTrampoline) "\n"
    276 SYMBOL_STRING(ctiVMThrowTrampoline) ":" "\n"
    277     "cpy r0, sp" "\n"
    278     "bl " SYMBOL_STRING_RELOCATION(cti_vm_throw) "\n"
    279     "ldr r6, [sp, #0x2c]" "\n"
    280     "ldr r5, [sp, #0x28]" "\n"
    281     "ldr r4, [sp, #0x24]" "\n"
    282     "ldr lr, [sp, #0x20]" "\n"
    283     "add sp, sp, #0x3c" "\n"
    284     "bx lr" "\n"
    285 );
    286 
    287 asm volatile (
    288 ".text" "\n"
    289 ".align 2" "\n"
    290 ".globl " SYMBOL_STRING(ctiOpThrowNotCaught) "\n"
    291 ".thumb" "\n"
    292 ".thumb_func " THUMB_FUNC_PARAM(ctiOpThrowNotCaught) "\n"
    293 SYMBOL_STRING(ctiOpThrowNotCaught) ":" "\n"
    294     "ldr r6, [sp, #0x2c]" "\n"
    295     "ldr r5, [sp, #0x28]" "\n"
    296     "ldr r4, [sp, #0x24]" "\n"
    297     "ldr lr, [sp, #0x20]" "\n"
    298     "add sp, sp, #0x3c" "\n"
    299     "bx lr" "\n"
    300 );
     242#define THUNK_RETURN_ADDRESS_OFFSET      0x3C
     243#define PRESERVED_RETURN_ADDRESS_OFFSET  0x40
     244#define PRESERVED_R4_OFFSET              0x44
     245#define PRESERVED_R5_OFFSET              0x48
     246#define PRESERVED_R6_OFFSET              0x4C
     247#define REGISTER_FILE_OFFSET             0x50
     248#define CALLFRAME_OFFSET                 0x54
     249#define EXCEPTION_OFFSET                 0x58
     250#define ENABLE_PROFILER_REFERENCE_OFFSET 0x64
    301251
    302252#elif COMPILER(GCC) && CPU(ARM_TRADITIONAL)
    303253
    304 asm volatile (
    305 ".globl " SYMBOL_STRING(ctiTrampoline) "\n"
    306 SYMBOL_STRING(ctiTrampoline) ":" "\n"
    307     "stmdb sp!, {r1-r3}" "\n"
    308     "stmdb sp!, {r4-r8, lr}" "\n"
    309     "sub sp, sp, #68" "\n"
    310     "mov r4, r2" "\n"
    311     "mov r5, #512" "\n"
    312     // r0 contains the code
    313     "mov lr, pc" "\n"
    314     "mov pc, r0" "\n"
    315     "add sp, sp, #68" "\n"
    316     "ldmia sp!, {r4-r8, lr}" "\n"
    317     "add sp, sp, #12" "\n"
    318     "mov pc, lr" "\n"
    319 );
    320 
    321 asm volatile (
    322 ".globl " SYMBOL_STRING(ctiVMThrowTrampoline) "\n"
    323 SYMBOL_STRING(ctiVMThrowTrampoline) ":" "\n"
    324     "mov r0, sp" "\n"
    325     "bl " SYMBOL_STRING(cti_vm_throw) "\n"
    326 
    327 // Both has the same return sequence
    328 ".globl " SYMBOL_STRING(ctiOpThrowNotCaught) "\n"
    329 SYMBOL_STRING(ctiOpThrowNotCaught) ":" "\n"
    330     "add sp, sp, #68" "\n"
    331     "ldmia sp!, {r4-r8, lr}" "\n"
    332     "add sp, sp, #12" "\n"
    333     "mov pc, lr" "\n"
    334 );
     254#define THUNK_RETURN_ADDRESS_OFFSET 64
     255#define PRESERVEDR4_OFFSET          68
    335256
    336257#elif COMPILER(MSVC) && CPU(X86)
     
    545466#endif
    546467
    547 asm volatile (
    548 ".text" "\n"
    549 ".align 2" "\n"
    550 ".globl " SYMBOL_STRING(ctiTrampoline) "\n"
    551 HIDE_SYMBOL(ctiTrampoline) "\n"
    552 ".thumb" "\n"
    553 ".thumb_func " THUMB_FUNC_PARAM(ctiTrampoline) "\n"
    554 SYMBOL_STRING(ctiTrampoline) ":" "\n"
    555     "sub sp, sp, #0x40" "\n"
    556     "str lr, [sp, #0x20]" "\n"
    557     "str r4, [sp, #0x24]" "\n"
    558     "str r5, [sp, #0x28]" "\n"
    559     "str r6, [sp, #0x2c]" "\n"
    560     "str r1, [sp, #0x30]" "\n"
    561     "str r2, [sp, #0x34]" "\n"
    562     "str r3, [sp, #0x38]" "\n"
    563     "cpy r5, r2" "\n"
    564     "mov r6, #512" "\n"
    565     "blx r0" "\n"
    566     "ldr r6, [sp, #0x2c]" "\n"
    567     "ldr r5, [sp, #0x28]" "\n"
    568     "ldr r4, [sp, #0x24]" "\n"
    569     "ldr lr, [sp, #0x20]" "\n"
    570     "add sp, sp, #0x40" "\n"
    571     "bx lr" "\n"
    572 );
    573 
    574 asm volatile (
    575 ".text" "\n"
    576 ".align 2" "\n"
    577 ".globl " SYMBOL_STRING(ctiVMThrowTrampoline) "\n"
    578 HIDE_SYMBOL(ctiVMThrowTrampoline) "\n"
    579 ".thumb" "\n"
    580 ".thumb_func " THUMB_FUNC_PARAM(ctiVMThrowTrampoline) "\n"
    581 SYMBOL_STRING(ctiVMThrowTrampoline) ":" "\n"
    582     "cpy r0, sp" "\n"
    583     "bl " SYMBOL_STRING_RELOCATION(cti_vm_throw) "\n"
    584     "ldr r6, [sp, #0x2c]" "\n"
    585     "ldr r5, [sp, #0x28]" "\n"
    586     "ldr r4, [sp, #0x24]" "\n"
    587     "ldr lr, [sp, #0x20]" "\n"
    588     "add sp, sp, #0x40" "\n"
    589     "bx lr" "\n"
    590 );
    591 
    592 asm volatile (
    593 ".text" "\n"
    594 ".align 2" "\n"
    595 ".globl " SYMBOL_STRING(ctiOpThrowNotCaught) "\n"
    596 HIDE_SYMBOL(ctiOpThrowNotCaught) "\n"
    597 ".thumb" "\n"
    598 ".thumb_func " THUMB_FUNC_PARAM(ctiOpThrowNotCaught) "\n"
    599 SYMBOL_STRING(ctiOpThrowNotCaught) ":" "\n"
    600     "ldr r6, [sp, #0x2c]" "\n"
    601     "ldr r5, [sp, #0x28]" "\n"
    602     "ldr r4, [sp, #0x24]" "\n"
    603     "ldr lr, [sp, #0x20]" "\n"
    604     "add sp, sp, #0x40" "\n"
    605     "bx lr" "\n"
    606 );
     468#define THUNK_RETURN_ADDRESS_OFFSET      0x1C
     469#define PRESERVED_RETURN_ADDRESS_OFFSET  0x20
     470#define PRESERVED_R4_OFFSET              0x24
     471#define PRESERVED_R5_OFFSET              0x28
     472#define PRESERVED_R6_OFFSET              0x2C
     473#define REGISTER_FILE_OFFSET             0x30
     474#define CALLFRAME_OFFSET                 0x34
     475#define EXCEPTION_OFFSET                 0x38
     476#define ENABLE_PROFILER_REFERENCE_OFFSET 0x40
    607477
    608478#elif COMPILER(GCC) && CPU(ARM_TRADITIONAL)
    609479
    610 asm volatile (
    611 ".text\n"
    612 ".globl " SYMBOL_STRING(ctiTrampoline) "\n"
    613 HIDE_SYMBOL(ctiTrampoline) "\n"
    614 SYMBOL_STRING(ctiTrampoline) ":" "\n"
    615     "stmdb sp!, {r1-r3}" "\n"
    616     "stmdb sp!, {r4-r8, lr}" "\n"
    617     "sub sp, sp, #36" "\n"
    618     "mov r4, r2" "\n"
    619     "mov r5, #512" "\n"
    620     "mov lr, pc" "\n"
    621     "mov pc, r0" "\n"
    622     "add sp, sp, #36" "\n"
    623     "ldmia sp!, {r4-r8, lr}" "\n"
    624     "add sp, sp, #12" "\n"
    625     "mov pc, lr" "\n"
    626 );
    627 
    628 asm volatile (
    629 ".globl " SYMBOL_STRING(ctiVMThrowTrampoline) "\n"
    630 HIDE_SYMBOL(ctiVMThrowTrampoline) "\n"
    631 SYMBOL_STRING(ctiVMThrowTrampoline) ":" "\n"
    632     "mov r0, sp" "\n"
    633     "bl " SYMBOL_STRING_RELOCATION(cti_vm_throw) "\n"
    634 
    635 // Both has the same return sequence
    636 ".globl " SYMBOL_STRING(ctiOpThrowNotCaught) "\n"
    637 HIDE_SYMBOL(ctiOpThrowNotCaught) "\n"
    638 SYMBOL_STRING(ctiOpThrowNotCaught) ":" "\n"
    639     "add sp, sp, #36" "\n"
    640     "ldmia sp!, {r4-r8, lr}" "\n"
    641     "add sp, sp, #12" "\n"
    642     "mov pc, lr" "\n"
    643 );
     480#define THUNK_RETURN_ADDRESS_OFFSET 32
     481#define PRESERVEDR4_OFFSET          36
    644482
    645483#elif COMPILER(RVCT) && CPU(ARM_TRADITIONAL)
     
    751589#endif // USE(JSVALUE32_64)
    752590
     591#if COMPILER(GCC) && CPU(ARM_THUMB2)
     592
     593asm volatile(
     594".text" "\n"
     595".align 2" "\n"
     596".globl " SYMBOL_STRING(ctiTrampoline) "\n"
     597HIDE_SYMBOL(ctiTrampoline) "\n"
     598".thumb" "\n"
     599".thumb_func " THUMB_FUNC_PARAM(ctiTrampoline) "\n"
     600SYMBOL_STRING(ctiTrampoline) ":" "\n"
     601    "sub sp, sp, #" STRINGIZE_VALUE_OF(ENABLE_PROFILER_REFERENCE_OFFSET) "\n"
     602    "str lr, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_RETURN_ADDRESS_OFFSET) "]" "\n"
     603    "str r4, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R4_OFFSET) "]" "\n"
     604    "str r5, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R5_OFFSET) "]" "\n"
     605    "str r6, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R6_OFFSET) "]" "\n"
     606    "str r1, [sp, #" STRINGIZE_VALUE_OF(REGISTER_FILE_OFFSET) "]" "\n"
     607    "str r2, [sp, #" STRINGIZE_VALUE_OF(CALLFRAME_OFFSET) "]" "\n"
     608    "str r3, [sp, #" STRINGIZE_VALUE_OF(EXCEPTION_OFFSET) "]" "\n"
     609    "cpy r5, r2" "\n"
     610    "mov r6, #512" "\n"
     611    "blx r0" "\n"
     612    "ldr r6, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R6_OFFSET) "]" "\n"
     613    "ldr r5, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R5_OFFSET) "]" "\n"
     614    "ldr r4, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R4_OFFSET) "]" "\n"
     615    "ldr lr, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_RETURN_ADDRESS_OFFSET) "]" "\n"
     616    "add sp, sp, #" STRINGIZE_VALUE_OF(ENABLE_PROFILER_REFERENCE_OFFSET) "\n"
     617    "bx lr" "\n"
     618);
     619
     620asm volatile(
     621".text" "\n"
     622".align 2" "\n"
     623".globl " SYMBOL_STRING(ctiVMThrowTrampoline) "\n"
     624HIDE_SYMBOL(ctiVMThrowTrampoline) "\n"
     625".thumb" "\n"
     626".thumb_func " THUMB_FUNC_PARAM(ctiVMThrowTrampoline) "\n"
     627SYMBOL_STRING(ctiVMThrowTrampoline) ":" "\n"
     628    "cpy r0, sp" "\n"
     629    "bl " SYMBOL_STRING_RELOCATION(cti_vm_throw) "\n"
     630    "ldr r6, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R6_OFFSET) "]" "\n"
     631    "ldr r5, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R5_OFFSET) "]" "\n"
     632    "ldr r4, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R4_OFFSET) "]" "\n"
     633    "ldr lr, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_RETURN_ADDRESS_OFFSET) "]" "\n"
     634    "add sp, sp, #" STRINGIZE_VALUE_OF(ENABLE_PROFILER_REFERENCE_OFFSET) "\n"
     635    "bx lr" "\n"
     636);
     637
     638asm volatile(
     639".text" "\n"
     640".align 2" "\n"
     641".globl " SYMBOL_STRING(ctiOpThrowNotCaught) "\n"
     642HIDE_SYMBOL(ctiOpThrowNotCaught) "\n"
     643".thumb" "\n"
     644".thumb_func " THUMB_FUNC_PARAM(ctiOpThrowNotCaught) "\n"
     645SYMBOL_STRING(ctiOpThrowNotCaught) ":" "\n"
     646    "ldr r6, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R6_OFFSET) "]" "\n"
     647    "ldr r5, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R5_OFFSET) "]" "\n"
     648    "ldr r4, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R4_OFFSET) "]" "\n"
     649    "ldr lr, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_RETURN_ADDRESS_OFFSET) "]" "\n"
     650    "add sp, sp, #" STRINGIZE_VALUE_OF(ENABLE_PROFILER_REFERENCE_OFFSET) "\n"
     651    "bx lr" "\n"
     652);
     653
     654#elif COMPILER(GCC) && CPU(ARM_TRADITIONAL)
     655
     656asm volatile(
     657".globl " SYMBOL_STRING(ctiTrampoline) "\n"
     658HIDE_SYMBOL(ctiTrampoline) "\n"
     659SYMBOL_STRING(ctiTrampoline) ":" "\n"
     660    "stmdb sp!, {r1-r3}" "\n"
     661    "stmdb sp!, {r4-r8, lr}" "\n"
     662    "sub sp, sp, #" STRINGIZE_VALUE_OF(PRESERVEDR4_OFFSET) "\n"
     663    "mov r4, r2" "\n"
     664    "mov r5, #512" "\n"
     665    // r0 contains the code
     666    "mov lr, pc" "\n"
     667    "mov pc, r0" "\n"
     668    "add sp, sp, #" STRINGIZE_VALUE_OF(PRESERVEDR4_OFFSET) "\n"
     669    "ldmia sp!, {r4-r8, lr}" "\n"
     670    "add sp, sp, #12" "\n"
     671    "mov pc, lr" "\n"
     672);
     673
     674asm volatile(
     675".globl " SYMBOL_STRING(ctiVMThrowTrampoline) "\n"
     676HIDE_SYMBOL(ctiVMThrowTrampoline) "\n"
     677SYMBOL_STRING(ctiVMThrowTrampoline) ":" "\n"
     678    "mov r0, sp" "\n"
     679    "bl " SYMBOL_STRING(cti_vm_throw) "\n"
     680
     681// Both has the same return sequence
     682".globl " SYMBOL_STRING(ctiOpThrowNotCaught) "\n"
     683HIDE_SYMBOL(ctiOpThrowNotCaught) "\n"
     684SYMBOL_STRING(ctiOpThrowNotCaught) ":" "\n"
     685    "add sp, sp, #" STRINGIZE_VALUE_OF(PRESERVEDR4_OFFSET) "\n"
     686    "ldmia sp!, {r4-r8, lr}" "\n"
     687    "add sp, sp, #12" "\n"
     688    "mov pc, lr" "\n"
     689);
     690
     691#endif
     692
    753693#if ENABLE(OPCODE_SAMPLING)
    754694    #define CTI_SAMPLER stackFrame.globalData->interpreter->sampler()
     
    765705    // and the OBJECT_OFFSETOF macro does not appear constantish enough for it to be happy with its use in COMPILE_ASSERT
    766706    // macros.
    767     ASSERT(OBJECT_OFFSETOF(struct JITStackFrame, preservedReturnAddress) == 0x20);
    768     ASSERT(OBJECT_OFFSETOF(struct JITStackFrame, preservedR4) == 0x24);
    769     ASSERT(OBJECT_OFFSETOF(struct JITStackFrame, preservedR5) == 0x28);
    770     ASSERT(OBJECT_OFFSETOF(struct JITStackFrame, preservedR6) == 0x2c);
    771 
    772     ASSERT(OBJECT_OFFSETOF(struct JITStackFrame, registerFile) == 0x30);
    773     ASSERT(OBJECT_OFFSETOF(struct JITStackFrame, callFrame) == 0x34);
    774     ASSERT(OBJECT_OFFSETOF(struct JITStackFrame, exception) == 0x38);
     707    ASSERT(OBJECT_OFFSETOF(struct JITStackFrame, preservedReturnAddress) == PRESERVED_RETURN_ADDRESS_OFFSET);
     708    ASSERT(OBJECT_OFFSETOF(struct JITStackFrame, preservedR4) == PRESERVED_R4_OFFSET);
     709    ASSERT(OBJECT_OFFSETOF(struct JITStackFrame, preservedR5) == PRESERVED_R5_OFFSET);
     710    ASSERT(OBJECT_OFFSETOF(struct JITStackFrame, preservedR6) == PRESERVED_R6_OFFSET);
     711
     712    ASSERT(OBJECT_OFFSETOF(struct JITStackFrame, registerFile) == REGISTER_FILE_OFFSET);
     713    ASSERT(OBJECT_OFFSETOF(struct JITStackFrame, callFrame) == CALLFRAME_OFFSET);
     714    ASSERT(OBJECT_OFFSETOF(struct JITStackFrame, exception) == EXCEPTION_OFFSET);
    775715    // The fifth argument is the first item already on the stack.
    776     ASSERT(OBJECT_OFFSETOF(struct JITStackFrame, enabledProfilerReference) == 0x40);
    777 
    778     ASSERT(OBJECT_OFFSETOF(struct JITStackFrame, thunkReturnAddress) == 0x1C);
     716    ASSERT(OBJECT_OFFSETOF(struct JITStackFrame, enabledProfilerReference) == ENABLE_PROFILER_REFERENCE_OFFSET);
     717
     718    ASSERT(OBJECT_OFFSETOF(struct JITStackFrame, thunkReturnAddress) == THUNK_RETURN_ADDRESS_OFFSET);
     719
     720#elif CPU(ARM_TRADITIONAL)
     721
     722    ASSERT(OBJECT_OFFSETOF(struct JITStackFrame, thunkReturnAddress) == THUNK_RETURN_ADDRESS_OFFSET);
     723    ASSERT(OBJECT_OFFSETOF(struct JITStackFrame, preservedR4) == PRESERVEDR4_OFFSET);
     724
    779725#endif
    780726}
     
    1028974        ".thumb_func " THUMB_FUNC_PARAM(cti_##op) "\n" \
    1029975        SYMBOL_STRING(cti_##op) ":" "\n" \
    1030         "str lr, [sp, #0x1c]" "\n" \
     976        "str lr, [sp, #" STRINGIZE_VALUE_OF(THUNK_RETURN_ADDRESS_OFFSET) "]" "\n" \
    1031977        "bl " SYMBOL_STRING(JITStubThunked_##op) "\n" \
    1032         "ldr lr, [sp, #0x1c]" "\n" \
     978        "ldr lr, [sp, #" STRINGIZE_VALUE_OF(THUNK_RETURN_ADDRESS_OFFSET) "]" "\n" \
    1033979        "bx lr" "\n" \
    1034980        ); \
     
    1036982
    1037983#elif CPU(ARM_TRADITIONAL) && COMPILER(GCC)
    1038 
    1039 #if USE(JSVALUE32_64)
    1040 #define THUNK_RETURN_ADDRESS_OFFSET 64
    1041 #else
    1042 #define THUNK_RETURN_ADDRESS_OFFSET 32
    1043 #endif
    1044 
    1045 COMPILE_ASSERT(offsetof(struct JITStackFrame, thunkReturnAddress) == THUNK_RETURN_ADDRESS_OFFSET, JITStackFrame_thunkReturnAddress_offset_mismatch);
    1046984
    1047985#define DEFINE_STUB_FUNCTION(rtype, op) \
Note: See TracChangeset for help on using the changeset viewer.