tcg: Add TCGType parameter to tcg_target_const_match
Most 64-bit targets need to be able to ignore the high bits of a TCG_TYPE_I32 value. Suggested-by: Stuart Brady <sdb@zubnet.me.uk> Signed-off-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
		
							parent
							
								
									d998e555d2
								
							
						
					
					
						commit
						f6c6afc1d4
					
				| 
						 | 
				
			
			@ -180,7 +180,7 @@ static inline bool is_limm(uint64_t val)
 | 
			
		|||
    return (val & (val - 1)) == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int tcg_target_const_match(tcg_target_long val,
 | 
			
		||||
static int tcg_target_const_match(tcg_target_long val, TCGType type,
 | 
			
		||||
                                  const TCGArgConstraint *arg_ct)
 | 
			
		||||
{
 | 
			
		||||
    int ct = arg_ct->ct;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -261,7 +261,7 @@ static inline int check_fit_imm(uint32_t imm)
 | 
			
		|||
 * mov operand2:     values represented with x << (2 * y), x < 0x100
 | 
			
		||||
 * add, sub, eor...: ditto
 | 
			
		||||
 */
 | 
			
		||||
static inline int tcg_target_const_match(tcg_target_long val,
 | 
			
		||||
static inline int tcg_target_const_match(tcg_target_long val, TCGType type,
 | 
			
		||||
                                         const TCGArgConstraint *arg_ct)
 | 
			
		||||
{
 | 
			
		||||
    int ct;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -257,7 +257,7 @@ static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
/* test if a constant matches the constraint */
 | 
			
		||||
static inline int tcg_target_const_match(tcg_target_long val,
 | 
			
		||||
static inline int tcg_target_const_match(tcg_target_long val, TCGType type,
 | 
			
		||||
                                         const TCGArgConstraint *arg_ct)
 | 
			
		||||
{
 | 
			
		||||
    int ct = arg_ct->ct;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -832,7 +832,7 @@ static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
/* test if a constant matches the constraint */
 | 
			
		||||
static inline int tcg_target_const_match(tcg_target_long val,
 | 
			
		||||
static inline int tcg_target_const_match(tcg_target_long val, TCGType type,
 | 
			
		||||
                                         const TCGArgConstraint *arg_ct)
 | 
			
		||||
{
 | 
			
		||||
    int ct;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -253,7 +253,7 @@ static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
/* test if a constant matches the constraint */
 | 
			
		||||
static inline int tcg_target_const_match(tcg_target_long val,
 | 
			
		||||
static inline int tcg_target_const_match(tcg_target_long val, TCGType type,
 | 
			
		||||
                                         const TCGArgConstraint *arg_ct)
 | 
			
		||||
{
 | 
			
		||||
    int ct;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -298,7 +298,7 @@ static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
/* test if a constant matches the constraint */
 | 
			
		||||
static int tcg_target_const_match(tcg_target_long val,
 | 
			
		||||
static int tcg_target_const_match(tcg_target_long val, TCGType type,
 | 
			
		||||
                                  const TCGArgConstraint *arg_ct)
 | 
			
		||||
{
 | 
			
		||||
    int ct;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -290,7 +290,7 @@ static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
/* test if a constant matches the constraint */
 | 
			
		||||
static int tcg_target_const_match(tcg_target_long val,
 | 
			
		||||
static int tcg_target_const_match(tcg_target_long val, TCGType type,
 | 
			
		||||
                                  const TCGArgConstraint *arg_ct)
 | 
			
		||||
{
 | 
			
		||||
    int ct = arg_ct->ct;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -515,7 +515,7 @@ static int tcg_match_cmpi(int ct, tcg_target_long val)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
/* Test if a constant matches the constraint. */
 | 
			
		||||
static int tcg_target_const_match(tcg_target_long val,
 | 
			
		||||
static int tcg_target_const_match(tcg_target_long val, TCGType type,
 | 
			
		||||
                                  const TCGArgConstraint *arg_ct)
 | 
			
		||||
{
 | 
			
		||||
    int ct = arg_ct->ct;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -327,7 +327,7 @@ static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
/* test if a constant matches the constraint */
 | 
			
		||||
static inline int tcg_target_const_match(tcg_target_long val,
 | 
			
		||||
static inline int tcg_target_const_match(tcg_target_long val, TCGType type,
 | 
			
		||||
                                         const TCGArgConstraint *arg_ct)
 | 
			
		||||
{
 | 
			
		||||
    int ct = arg_ct->ct;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -101,7 +101,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args,
 | 
			
		|||
                       const int *const_args);
 | 
			
		||||
static void tcg_out_st(TCGContext *s, TCGType type, TCGReg arg, TCGReg arg1,
 | 
			
		||||
                       intptr_t arg2);
 | 
			
		||||
static int tcg_target_const_match(tcg_target_long val,
 | 
			
		||||
static int tcg_target_const_match(tcg_target_long val, TCGType type,
 | 
			
		||||
                                  const TCGArgConstraint *arg_ct);
 | 
			
		||||
static void tcg_out_tb_init(TCGContext *s);
 | 
			
		||||
static void tcg_out_tb_finalize(TCGContext *s);
 | 
			
		||||
| 
						 | 
				
			
			@ -2121,7 +2121,7 @@ static void tcg_reg_alloc_op(TCGContext *s,
 | 
			
		|||
            ts->mem_coherent = 1;
 | 
			
		||||
            s->reg_to_temp[reg] = arg;
 | 
			
		||||
        } else if (ts->val_type == TEMP_VAL_CONST) {
 | 
			
		||||
            if (tcg_target_const_match(ts->val, arg_ct)) {
 | 
			
		||||
            if (tcg_target_const_match(ts->val, ts->type, arg_ct)) {
 | 
			
		||||
                /* constant is OK for instruction */
 | 
			
		||||
                const_args[i] = 1;
 | 
			
		||||
                new_args[i] = ts->val;
 | 
			
		||||
| 
						 | 
				
			
			@ -2365,7 +2365,7 @@ static int tcg_reg_alloc_call(TCGContext *s, const TCGOpDef *def,
 | 
			
		|||
        func_arg = reg;
 | 
			
		||||
        tcg_regset_set_reg(allocated_regs, reg);
 | 
			
		||||
    } else if (ts->val_type == TEMP_VAL_CONST) {
 | 
			
		||||
        if (tcg_target_const_match(func_addr, arg_ct)) {
 | 
			
		||||
        if (tcg_target_const_match(func_addr, ts->type, arg_ct)) {
 | 
			
		||||
            const_func_arg = 1;
 | 
			
		||||
            func_arg = func_addr;
 | 
			
		||||
        } else {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -859,7 +859,7 @@ static void tcg_out_st(TCGContext *s, TCGType type, TCGReg arg, TCGReg arg1,
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
/* Test if a constant matches the constraint. */
 | 
			
		||||
static int tcg_target_const_match(tcg_target_long val,
 | 
			
		||||
static int tcg_target_const_match(tcg_target_long val, TCGType type,
 | 
			
		||||
                                  const TCGArgConstraint *arg_ct)
 | 
			
		||||
{
 | 
			
		||||
    /* No need to return 0 or 1, 0 or != 0 is good enough. */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue