436#else
437COMPILE_ASSERT(offsetof(struct JITStackFrame, callFrame) == 0x48, JITStackFrame_callFrame_offset_matches_ctiTrampoline);
438COMPILE_ASSERT(offsetof(struct JITStackFrame, code) == 0x40, JITStackFrame_code_offset_matches_ctiTrampoline);
439COMPILE_ASSERT(offsetof(struct JITStackFrame, savedRBX) == 0x58, JITStackFrame_stub_argument_space_matches_ctiTrampoline);
440
441asm (
442".text\n"
443".globl " SYMBOL_STRING(ctiTrampoline) "\n"
444HIDE_SYMBOL(ctiTrampoline) "\n"
445SYMBOL_STRING(ctiTrampoline) ":" "\n"
446 "pushq %rbp" "\n"
447 "movl %esp, %ebp" "\n"
448 "pushq %r12" "\n"
449 "pushq %r13" "\n"
450 "pushq %r14" "\n"
451 "pushq %r15" "\n"
452 "pushq %rbx" "\n"
453 // Form the JIT stubs area
454 "subl $0x58, %esp" "\n"
455 "movl %r9d, 0x54(%esp)" "\n"
456 "movl %r8d, 0x50(%esp)" "\n"
457 "movl %ecx, 0x4c(%esp)" "\n"
458 "movl %edx, 0x48(%esp)" "\n"
459 "movl %esi, 0x44(%esp)" "\n"
460 "movl %edi, 0x40(%esp)" "\n"
461 "movq $512, %r12" "\n"
462 "movq $0xFFFF000000000000, %r14" "\n"
463 "movq $0xFFFF000000000002, %r15" "\n"
464 "movl %edx, %r13d" "\n"
465 "call *%rdi" "\n"
466 "addl $0x58, %esp" "\n"
467 "popq %rbx" "\n"
468 "popq %r15" "\n"
469 "popq %r14" "\n"
470 "popq %r13" "\n"
471 "popq %r12" "\n"
472 "popq %rbp" "\n"
473 "ret" "\n"
474".globl " SYMBOL_STRING(ctiTrampolineEnd) "\n"
475HIDE_SYMBOL(ctiTrampolineEnd) "\n"
476SYMBOL_STRING(ctiTrampolineEnd) ":" "\n"
477);
478
479asm (
480".globl " SYMBOL_STRING(ctiVMThrowTrampoline) "\n"
481HIDE_SYMBOL(ctiVMThrowTrampoline) "\n"
482SYMBOL_STRING(ctiVMThrowTrampoline) ":" "\n"
483 "movl %esp, %edi" "\n"
484 "call " LOCAL_REFERENCE(cti_vm_throw) "\n"
485 "int3" "\n"
486);
487
488asm (
489".globl " SYMBOL_STRING(ctiOpThrowNotCaught) "\n"
490HIDE_SYMBOL(ctiOpThrowNotCaught) "\n"
491SYMBOL_STRING(ctiOpThrowNotCaught) ":" "\n"
492 "addl $0x58, %esp" "\n"
493 "popq %rbx" "\n"
494 "popq %r15" "\n"
495 "popq %r14" "\n"
496 "popq %r13" "\n"
497 "popq %r12" "\n"
498 "popq %rbp" "\n"
499 "ret" "\n"
500);
501#endif