Annotation of cf/mips64_ppc32_trans.h, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Cisco router simulation platform.
                      3:  * Copyright (c) 2006 Christophe Fillot ([email protected])
                      4:  *
                      5:  * JIT engine for 32-bit PowerPC architecture
                      6:  * Copyright (c) 2006, 2007 Zhe Fang ([email protected])
                      7:  */
                      8: 
                      9: #ifndef __MIPS64_PPC32_TRANS_H__
                     10: #define __MIPS64_PPC32_TRANS_H__
                     11: 
                     12: #include "utils.h"
                     13: #include "cpu.h"
                     14: #include "mips64_exec.h"
                     15: #include "dynamips.h"
                     16: #include "ppc-codegen.h"
                     17: 
                     18: #define JIT_SUPPORT 1
                     19: 
                     20: /* Manipulate bitmasks synchronically */
                     21: static forced_inline void atomic_or(m_uint32_t *v,m_uint32_t m)
                     22: {
                     23:    __asm__ __volatile__("lwarx  r0, 0, %0    \n"
                     24:                         "or     r0, r0, %1 \n"
                     25:                         "stwcx. r0, 0, %0    \n"
                     26:                         "bne-   $-12":"+p"(v): "r"(m): "r0", "memory");
                     27: }
                     28: 
                     29: static forced_inline void atomic_and(m_uint32_t *v,m_uint32_t m)
                     30: {
                     31:    __asm__ __volatile__("lwarx  r0, 0, %0    \n"
                     32:                         "and    r0, r0, %1 \n"
                     33:                         "stwcx. r0, 0, %0    \n"
                     34:                         "bne-   $-12":"+p"(v): "r"(m): "r0", "memory");
                     35: }
                     36: 
                     37: /* Made from ppc_patch in ppc-codegen.h */
                     38: #define ppc_emit_jump_code(code,target,lk)     do {\
                     39:  \
                     40:                /* prefer relative branches, they are more position independent (e.g. for AOT compilation). */\
                     41:                if ((target) - (code) >= 0){ \
                     42:                        if ((target) - (code) <= 33554431){ \
                     43:                                ppc_emit32 ((code), (18 << 26) | ((target) - (code)) | lk); \
                     44:                                break; \
                     45:                        } \
                     46:                } else { \
                     47:                        /* diff between 0 and -33554432 */ \
                     48:                        if ((target) - (code) >= -33554432){ \
                     49:                                ppc_emit32 ((code), (18 << 26) | (((target) - (code)) & ~0xfc000000) | lk); \
                     50:                                break; \
                     51:                        } \
                     52:                } \
                     53:  \
                     54:                if ((long)(target) >= 0){ \
                     55:                        if ((long)(target) <= 33554431){ \
                     56:                                ppc_emit32 ((code), (18 << 26) | (unsigned int)(target) | 2 | lk); \
                     57:                                break; \
                     58:                        } \
                     59:                } else { \
                     60:                        if ((long)(target) >= -33554432){ \
                     61:                                ppc_emit32 ((code), (18 << 26) | ((unsigned int)(target) & ~0xfc000000) | 2 | lk); \
                     62:                                break; \
                     63:                        } \
                     64:                } \
                     65:  \
                     66:                /* The last way... */ \
                     67:                ppc_lis ((code), ppc_r12, (unsigned int)(target) >> 16); \
                     68:                ppc_ori ((code), ppc_r12, ppc_r12, (unsigned int)(target) & 0xffff); \
                     69:                ppc_mtlr((code), ppc_r12); \
                     70:                ppc_bclrx((code), PPC_BR_ALWAYS, 0, lk); \
                     71: } while (0)
                     72: 
                     73: /* Here's a hack, see comments in mips64_set_jump for more info */
                     74: //#define mips64_jit_tcb_set_patch ppc_patch
                     75: #define mips64_jit_tcb_set_patch(a,b) ppc_emit_jump_code(a,b,0)
                     76: #define mips64_jit_tcb_set_jump(a,b)  ppc_emit_jump_code(a,b,0)
                     77: 
                     78: /* MIPS instruction array */
                     79: extern struct mips64_insn_tag mips64_insn_tags[];
                     80: 
                     81: #define PPC_STACK_DECREMENTER 114
                     82: 
                     83: /* Push epilog for a ppc instruction block */
                     84: static forced_inline void mips64_jit_tcb_push_epilog(mips64_jit_tcb_t *b)
                     85: {
                     86:    /* Restore link register */
                     87:    ppc_lwz(b->jit_ptr,ppc_r0,PPC_STACK_DECREMENTER+PPC_RET_ADDR_OFFSET,ppc_r1);
                     88:    ppc_mtlr(b->jit_ptr,ppc_r0);
                     89:    ppc_blr(b->jit_ptr);
                     90: }
                     91: 
                     92: /* Execute JIT code */
                     93: static forced_inline
                     94: void mips64_jit_tcb_exec(cpu_mips_t *cpu,mips64_jit_tcb_t *block)
                     95: {
                     96:    register insn_tblock_fptr jit_code __asm__("r12");
                     97:    m_uint32_t offset;
                     98: 
                     99:    offset = (cpu->pc & MIPS_MIN_PAGE_IMASK) >> 2;
                    100:    jit_code = (insn_tblock_fptr)block->jit_insn_ptr[offset];
                    101: 
                    102:    if (unlikely(!jit_code)) {
                    103:       mips64_exec_single_step(cpu,vmtoh32(block->mips_code[offset]));
                    104:       return;
                    105:    }
                    106: 
                    107:    /* Same as C call of jit_code(cpu_mips_t *cpu) except establish and
                    108:       destroy caller's stack frame here.
                    109:       r0, r3 - r10, r11, r12, ctr, xer, cr0 - cr5, cr6 - cr7 are volatile
                    110:       according to the ABI.
                    111:       CPU instance pointer passed through r3, also preserved onto stack.
                    112:     */
                    113:    __asm__ __volatile__(
                    114:                         "mtlr   r12                   \n"
                    115:                         "mr      r3,   %1             \n"
                    116:                         "lis     r0, hi16(jit_ret)    \n"
                    117:                         "ori     r0, r0, lo16(jit_ret)\n"
                    118:                         "stw     r3,   %2(r1)         \n"
                    119:                         "stw     r0,   %3(r1)         \n"
                    120:                         "stwu    r1,   %4(r1)         \n"
                    121:                         "blr                          \n"
                    122:                         "jit_ret:                     \n"
                    123:                         "lwz     r1,    0(r1)         \n"
                    124:                         :"+r"(jit_code):"r"(cpu),"i"(PPC_STACK_PARAM_OFFSET),
                    125:                         "i"(PPC_RET_ADDR_OFFSET),"i"(-PPC_STACK_DECREMENTER)
                    126:                         :"r0","r3","r4","r5","r6","r7","r8","r9","r10",
                    127:                         "r11",/*"r12",*/"lr","ctr","xer","cr0","cr1","cr5",
                    128:                         "cr6","cr7","memory");
                    129: }
                    130: 
                    131: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.