qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PULL 24/34] target-s390x: implement TRANSLATE AND TEST


From: Paolo Bonzini
Subject: Re: [Qemu-devel] [PULL 24/34] target-s390x: implement TRANSLATE AND TEST instruction
Date: Sat, 20 Jun 2015 23:06:07 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.6.0


On 05/06/2015 01:41, Alexander Graf wrote:
> From: Aurelien Jarno <address@hidden>
> 
> It is part of the basic zArchitecture instructions. Allow it to be call
> from EXECUTE.
> 
> Reviewed-by: Richard Henderson <address@hidden>
> Signed-off-by: Aurelien Jarno <address@hidden>
> Signed-off-by: Alexander Graf <address@hidden>
> ---
>  target-s390x/helper.h      |  1 +
>  target-s390x/insn-data.def |  2 ++
>  target-s390x/mem_helper.c  | 24 ++++++++++++++++++++++++
>  target-s390x/translate.c   | 10 ++++++++++
>  4 files changed, 37 insertions(+)
> 
> diff --git a/target-s390x/helper.h b/target-s390x/helper.h
> index cb0b421..48b015e 100644
> --- a/target-s390x/helper.h
> +++ b/target-s390x/helper.h
> @@ -77,6 +77,7 @@ DEF_HELPER_FLAGS_3(sqxb, TCG_CALL_NO_WG, i64, env, i64, i64)
>  DEF_HELPER_FLAGS_1(cvd, TCG_CALL_NO_RWG_SE, i64, s32)
>  DEF_HELPER_FLAGS_4(unpk, TCG_CALL_NO_WG, void, env, i32, i64, i64)
>  DEF_HELPER_FLAGS_4(tr, TCG_CALL_NO_WG, void, env, i32, i64, i64)
> +DEF_HELPER_4(trt, i32, env, i32, i64, i64)
>  DEF_HELPER_4(cksm, i64, env, i64, i64, i64)
>  DEF_HELPER_FLAGS_5(calc_cc, TCG_CALL_NO_RWG_SE, i32, env, i32, i64, i64, i64)
>  DEF_HELPER_FLAGS_2(sfpc, TCG_CALL_NO_RWG, void, env, i64)
> diff --git a/target-s390x/insn-data.def b/target-s390x/insn-data.def
> index a12939d..e401754 100644
> --- a/target-s390x/insn-data.def
> +++ b/target-s390x/insn-data.def
> @@ -759,6 +759,8 @@
>  
>  /* TRANSLATE */
>      C(0xdc00, TR,      SS_a,  Z,   la1, a2, 0, 0, tr, 0)
> +/* TRANSLATE AND TEST */
> +    C(0xdd00, TRT,     SS_a,  Z,   la1, a2, 0, 0, trt, 0)
>  
>  /* UNPACK */
>      /* Really format SS_b, but we pack both lengths into one argument
> diff --git a/target-s390x/mem_helper.c b/target-s390x/mem_helper.c
> index 0e8cd0f..e19e1aa 100644
> --- a/target-s390x/mem_helper.c
> +++ b/target-s390x/mem_helper.c
> @@ -509,6 +509,9 @@ uint32_t HELPER(ex)(CPUS390XState *env, uint32_t cc, 
> uint64_t v1,
>          case 0xc00:
>              helper_tr(env, l, get_address(env, 0, b1, d1),
>                        get_address(env, 0, b2, d2));

Missing break here.

Paolo

> +        case 0xd00:
> +            cc = helper_trt(env, l, get_address(env, 0, b1, d1),
> +                            get_address(env, 0, b2, d2));
>              break;
>          default:
>              goto abort;
> @@ -801,6 +804,27 @@ void HELPER(tr)(CPUS390XState *env, uint32_t len, 
> uint64_t array,
>      }
>  }
>  
> +uint32_t HELPER(trt)(CPUS390XState *env, uint32_t len, uint64_t array,
> +                     uint64_t trans)
> +{
> +    uint32_t cc = 0;
> +    int i;
> +
> +    for (i = 0; i <= len; i++) {
> +        uint8_t byte = cpu_ldub_data(env, array + i);
> +        uint8_t sbyte = cpu_ldub_data(env, trans + byte);
> +
> +        if (sbyte != 0) {
> +            env->regs[1] = array + i;
> +            env->regs[2] = (env->regs[2] & ~0xff) | sbyte;
> +            cc = (i == len) ? 2 : 1;
> +            break;
> +        }
> +    }
> +
> +    return cc;
> +}
> +
>  #if !defined(CONFIG_USER_ONLY)
>  void HELPER(lctlg)(CPUS390XState *env, uint32_t r1, uint64_t a2, uint32_t r3)
>  {
> diff --git a/target-s390x/translate.c b/target-s390x/translate.c
> index b0dbfe8..003598d 100644
> --- a/target-s390x/translate.c
> +++ b/target-s390x/translate.c
> @@ -3787,6 +3787,16 @@ static ExitStatus op_tr(DisasContext *s, DisasOps *o)
>      return NO_EXIT;
>  }
>  
> +static ExitStatus op_trt(DisasContext *s, DisasOps *o)
> +{
> +    TCGv_i32 l = tcg_const_i32(get_field(s->fields, l1));
> +    potential_page_fault(s);
> +    gen_helper_trt(cc_op, cpu_env, l, o->addr1, o->in2);
> +    tcg_temp_free_i32(l);
> +    set_cc_static(s);
> +    return NO_EXIT;
> +}
> +
>  static ExitStatus op_unpk(DisasContext *s, DisasOps *o)
>  {
>      TCGv_i32 l = tcg_const_i32(get_field(s->fields, l1));
> 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]