The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
/*
x86_64/amd64 not-threaded, 
PL_op in %rax, &PL_op in %rbx, &PL_sig_pending in %rcx

  55                   	push   %rbp
  48 89 e5             	mov    %rsp,%rbp
  53                    push   %rbx
  51                    push   %rcx
  31 c0			xor    %eax, %eax
  48 89 1d xx xx xx xx  mov    PL_op@GOTPCREL(%rip),%rbx
  48 89 1e xx xx xx xx  mov    PL_sig_pending@GOTPCREL(%rip),%rcx

  e8 xx xx xx xx       	call   Perl_pp_enter@PLT
  48 98                	cltq
  48 89 03 		mov    %rax,(%rbx)

  e8 xx xx xx xx       	call   Perl_pp_nextstate@PLT
  48 98                	cltq
  48 89 03 		mov    %rax,(%rbx)

  48 83 ?? 00          	cmpq   $0x0,(%rcx)
  74 0a                	je     +10 (L2)
  31 c0                	xor    %eax,%eax
  e8 xx xx xx xx        call   Perl_despatch_signals@PLT
  31 c0                	xor    %eax,%eax
L2:
  e8 xx xx xx xx       	call   Perl_pp_print@PLT
  48 98                	cltq
  48 89 03 		mov    %rax,(%rbx)

  e8 xx xx xx xx       	call   Perl_pp_leave@PLT
  48 98                	cltq
  48 89 03 		mov    %rax,(%rbx)

  5?                   	pop    %rcx
  5b                   	pop    %rbx
  c9                   	leaveq 
  c3                   	retq   

Dump of assembler code from 0x1127000 to 0x1127058:
0x0000000001127000:     push   %rbp
0x0000000001127001:     mov    %rsp,%rbp
0x0000000001127004:     sub    $0x8,%rsp
0x0000000001127008:     push   %rbx
0x0000000001127009:     mov    -0x8963b0(%rip),%rbx        # 0x890c60 <PL_op>
0x0000000001127010:     push   %rcx
0x0000000001127011:     mov    -0x8969f3(%rip),%ecx        # 0x890624 <PL_sig_pending>
0x0000000001127017:     callq  0x4ce3f0 <Perl_pp_enter>
0x000000000112701c:     mov    %eax,(%rbx)
0x000000000112701e:     callq  0x4d18a0 <Perl_pp_nextstate>
0x0000000001127023:     mov    %eax,(%rbx)
0x0000000001127025:     callq  0x4d5e20 <Perl_pp_pushmark>
0x000000000112702a:     mov    %eax,(%rbx)
0x000000000112702c:     callq  0x4cb010 <Perl_pp_const>
0x0000000001127031:     mov    %eax,(%rbx)
0x0000000001127033:     callq  0x4da5f0 <Perl_pp_print>
0x0000000001127038:     mov    %eax,(%rbx)
0x000000000112703a:     callq  0x4cfc90 <Perl_pp_leave>
0x000000000112703f:     mov    %eax,(%rbx)
0x0000000001127041:     pop    %rcx
0x0000000001127042:     pop    %rbx
0x0000000001127043:     add    $0x8,%rsp
0x0000000001127047:     leaveq
0x0000000001127048:     retq

*/

T_CHARARR amd64_prolog[] = {
    push_rbp,
    mov_rsp_rbp,
    /*push_rbx,*/
#ifdef HAVE_DISPATCH
    push_rcx,
#endif
    push_r12, 		/* op->next */
    sub_x_rsp(8)/*,
    mov_mem_rbx, fourbyte*/
#ifdef HAVE_DISPATCH	/* &PL_sig_pending */
    ,mov_mem_ecx, fourbyte
#endif
};

unsigned char *push_prolog(unsigned char *code) {
    T_CHARARR prolog1[] = {
	push_rbp,
        mov_rsp_rbp,
	/*push_rbx,*/
#ifdef HAVE_DISPATCH
	push_rcx,
#endif
        push_r12,
	sub_x_rsp(8)/*,
        mov_mem_rbx*/
    };
    PUSHc(prolog1);
    /*PUSHrel(&PL_op);*/
#ifdef HAVE_DISPATCH
    T_CHARARR prolog2[] = {
	mov_mem_ecx};
    PUSHc(prolog2);
    PUSHrel(&PL_sig_pending);
#endif
    return code;
}
T_CHARARR amd64_epilog[] = {
    add_x_esp(8),
    pop_r12,
#ifdef HAVE_DISPATCH
    pop_rcx,
#endif
    /*pop_rbx,*/
    leave,
    ret};

T_CHARARR amd64_call[]  = {
    /*0xb8,0x00,0x00,0x00,0x00,*/ /* mox $0,%eax */
    0xe8}; /* callq PL_op->op_ppaddr@PLT */
T_CHARARR amd64_jmp[]   = {0xff,0x25}; /* jmp *$PL_op->op_ppaddr */
T_CHARARR amd64_save_plop[]  = {
    /*mov_eax_rebx*/    /* fails on amd64 */
    mov_rax_memr	/* mov    %rax,memrel #save new PL_op */
};      
T_CHARARR amd64_nop[]        = {0x90};      /* pad */
T_CHARARR amd64_nop2[]       = {0x90,0x90};      /* jmp pad */
T_CHARARR amd64_dispatch_getsig[] = {
    mov_mem_rcx};
T_CHARARR amd64_dispatch[] = {
    test_ecx_ecx,
    je(5)};

T_CHARARR maybranch_plop[] = {
    mov_mem_r12, fourbyte
    /*,mov_eax_8ebp*/
};
unsigned char *push_maybranch_plop(unsigned char *code, OP* next) {
    T_CHARARR maybranch_plop1[] = {
	mov_mem_r12};
    /*T_CHARARR maybranch_plop2[] = {
	mov_eax_8ebp};*/
    PUSHc(maybranch_plop1);
    PUSHabs(next);
    /*PUSHc(maybranch_plop2);*/
    return code;
}
T_CHARARR maybranch_check[] = {
    cmp_rax_r12,
    je(0)
};
unsigned char *
push_maybranch_check(unsigned char *code, int next) {
    unsigned char maybranch_check[] = {
	cmp_rax_r12,
	je_0};
    if (abs(next) > 128) {
        printf("ERROR: je overflow %d > 128\n", next);
    } else {
        PUSHc(maybranch_check);
        PUSHbyte(next);
    }
    return code;
}

T_CHARARR gotorel[] = {
    0xe9, fourbyte
};
unsigned char *
push_gotorel(unsigned char *code, U32 label) {
    unsigned char gotorel[] = {
	0xe9};
    PUSHc(gotorel);
    PUSHabs(&label);
    return code;
}

# define PROLOG 	amd64_prolog
# define CALL	 	amd64_call
# define JMP	 	amd64_jmp
# define NOP 	        amd64_nop
# define SAVE_PLOP	amd64_save_plop
# define DISPATCH_GETSIG amd64_dispatch_getsig
# define DISPATCH       amd64_dispatch
# define EPILOG         amd64_epilog
# define MAYBRANCH_PLOP maybranch_plop
# define GOTOREL        gotorel

/*
 * Local variables:
 *   c-basic-offset: 4
 * End:
 * vim: expandtab shiftwidth=4:
 */