tcg/mips: implement goto_ptr
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> Message-Id: <20170430145254.25616-2-aurelien@aurel32.net> Signed-off-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
		
							parent
							
								
									085c648bef
								
							
						
					
					
						commit
						5786e0683c
					
				| 
						 | 
				
			
			@ -130,7 +130,7 @@ extern bool use_mips32r2_instructions;
 | 
			
		|||
#define TCG_TARGET_HAS_muluh_i32        1
 | 
			
		||||
#define TCG_TARGET_HAS_mulsh_i32        1
 | 
			
		||||
#define TCG_TARGET_HAS_bswap32_i32      1
 | 
			
		||||
#define TCG_TARGET_HAS_goto_ptr         0
 | 
			
		||||
#define TCG_TARGET_HAS_goto_ptr         1
 | 
			
		||||
 | 
			
		||||
#if TCG_TARGET_REG_BITS == 64
 | 
			
		||||
#define TCG_TARGET_HAS_add2_i32         0
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1747,6 +1747,11 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
 | 
			
		|||
        tcg_out_nop(s);
 | 
			
		||||
        s->tb_jmp_reset_offset[a0] = tcg_current_code_size(s);
 | 
			
		||||
        break;
 | 
			
		||||
    case INDEX_op_goto_ptr:
 | 
			
		||||
        /* jmp to the given host address (could be epilogue) */
 | 
			
		||||
        tcg_out_opc_reg(s, OPC_JR, 0, a0, 0);
 | 
			
		||||
        tcg_out_nop(s);
 | 
			
		||||
        break;
 | 
			
		||||
    case INDEX_op_br:
 | 
			
		||||
        tcg_out_brcond(s, TCG_COND_EQ, TCG_REG_ZERO, TCG_REG_ZERO,
 | 
			
		||||
                       arg_label(a0));
 | 
			
		||||
| 
						 | 
				
			
			@ -2160,6 +2165,7 @@ static const TCGTargetOpDef mips_op_defs[] = {
 | 
			
		|||
    { INDEX_op_exit_tb, { } },
 | 
			
		||||
    { INDEX_op_goto_tb, { } },
 | 
			
		||||
    { INDEX_op_br, { } },
 | 
			
		||||
    { INDEX_op_goto_ptr, { "r" } },
 | 
			
		||||
 | 
			
		||||
    { INDEX_op_ld8u_i32, { "r", "r" } },
 | 
			
		||||
    { INDEX_op_ld8s_i32, { "r", "r" } },
 | 
			
		||||
| 
						 | 
				
			
			@ -2451,6 +2457,13 @@ static void tcg_target_qemu_prologue(TCGContext *s)
 | 
			
		|||
    /* delay slot */
 | 
			
		||||
    tcg_out_mov(s, TCG_TYPE_PTR, TCG_AREG0, tcg_target_call_iarg_regs[0]);
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * Return path for goto_ptr. Set return value to 0, a-la exit_tb,
 | 
			
		||||
     * and fall through to the rest of the epilogue.
 | 
			
		||||
     */
 | 
			
		||||
    s->code_gen_epilogue = s->code_ptr;
 | 
			
		||||
    tcg_out_mov(s, TCG_TYPE_REG, TCG_REG_V0, TCG_REG_ZERO);
 | 
			
		||||
 | 
			
		||||
    /* TB epilogue */
 | 
			
		||||
    tb_ret_addr = s->code_ptr;
 | 
			
		||||
    for (i = 0; i < ARRAY_SIZE(tcg_target_callee_save_regs); i++) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue