On 24 March 2011 15:58, Alexander Graf <ag...@suse.de> wrote:
> diff --git a/target-s390x/translate.c b/target-s390x/translate.c

> +typedef struct DisasContext DisasContext;
> +struct DisasContext {
> +    uint64_t pc;
> +    int is_jmp;
> +    enum cc_op cc_op;
> +    CPUS390XState *env;
> +    struct TranslationBlock *tb;
> +};

I don't think anything actually uses dc->env, does it?
(I like the way that almost none of the translate.c code
gets a CPUState pointer, makes it hard to accidentally write
buggy code that relies on things not in the tb_flags.)

> +static char cpu_reg_names[10*3 + 6*4];

I can see code ins390x_translate_init() which sets this up, but
I can't see anything which uses it?

> +#if 0  /* reads four when it should read only 3 */
> +    case 2:

Is there any point having #if'd out broken code?
Either fix it and enable it, or just have a comment
to the effect that we could have optimised versions
for cases 2, 4, 5, 6 but currently do not.

> +    case 0x4:  /* LMG      R1,R3,D2(B2)     [RSE] */
> +    case 0x24: /* STMG     R1,R3,D2(B2)     [RSE] */
> +    case 0x26: /* STMH     R1,R3,D2(B2)     [RSE] */
> +    case 0x96: /* LMH      R1,R3,D2(B2)     [RSE] */
> +        /* Apparently, unrolling lmg/stmg of any size gains performance -
> +           even for very long ones... */

Doesn't this take you over MAX_OP_PER_INSTR for some cases?

> +            tmp2 = tcg_const_i64((((uint64_t)i2) << 48) | 
> 0x0000ffffffffffffULL);

This line is over 80 chars, as are a handful of others in this file.

> +    case 0xa: /* SVC    I         [RR] */
> +        insn = ld_code2(s->pc);
> +        debug_insn(insn);
> +        i = insn & 0xff;
> +#ifdef CONFIG_USER_ONLY
> +        s->pc += 2;
> +#endif
> +        update_psw_addr(s);
> +        gen_op_calc_cc(s);

Why do we only need to update s->pc if CONFIG_USER_ONLY?
Not saying it's wrong, but it could use an explanatory comment...

-- PMM

Reply via email to