qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH 09/14] Add vcmp{eq, ge, gt, b}fp{, .} instructio


From: Aurelien Jarno
Subject: Re: [Qemu-devel] [PATCH 09/14] Add vcmp{eq, ge, gt, b}fp{, .} instructions
Date: Mon, 9 Feb 2009 17:51:57 +0100
User-agent: Mutt/1.5.18 (2008-05-17)

On Sun, Feb 08, 2009 at 02:40:03PM -0800, Nathan Froyd wrote:
> Use correct opcode for vcmpbfp{,.}.
> 
> Signed-off-by: Nathan Froyd <address@hidden>
> ---
>  target-ppc/helper.h    |    8 +++++
>  target-ppc/op_helper.c |   68 
> ++++++++++++++++++++++++++++++++++++++++++++++++
>  target-ppc/translate.c |    4 +++
>  3 files changed, 80 insertions(+), 0 deletions(-)

Thanks, applied.

> diff --git a/target-ppc/helper.h b/target-ppc/helper.h
> index af6c839..089955b 100644
> --- a/target-ppc/helper.h
> +++ b/target-ppc/helper.h
> @@ -132,6 +132,10 @@ DEF_HELPER_3(vcmpgtuw, void, avr, avr, avr)
>  DEF_HELPER_3(vcmpgtsb, void, avr, avr, avr)
>  DEF_HELPER_3(vcmpgtsh, void, avr, avr, avr)
>  DEF_HELPER_3(vcmpgtsw, void, avr, avr, avr)
> +DEF_HELPER_3(vcmpeqfp, void, avr, avr, avr)
> +DEF_HELPER_3(vcmpgefp, void, avr, avr, avr)
> +DEF_HELPER_3(vcmpgtfp, void, avr, avr, avr)
> +DEF_HELPER_3(vcmpbfp, void, avr, avr, avr)
>  DEF_HELPER_3(vcmpequb_dot, void, avr, avr, avr)
>  DEF_HELPER_3(vcmpequh_dot, void, avr, avr, avr)
>  DEF_HELPER_3(vcmpequw_dot, void, avr, avr, avr)
> @@ -141,6 +145,10 @@ DEF_HELPER_3(vcmpgtuw_dot, void, avr, avr, avr)
>  DEF_HELPER_3(vcmpgtsb_dot, void, avr, avr, avr)
>  DEF_HELPER_3(vcmpgtsh_dot, void, avr, avr, avr)
>  DEF_HELPER_3(vcmpgtsw_dot, void, avr, avr, avr)
> +DEF_HELPER_3(vcmpeqfp_dot, void, avr, avr, avr)
> +DEF_HELPER_3(vcmpgefp_dot, void, avr, avr, avr)
> +DEF_HELPER_3(vcmpgtfp_dot, void, avr, avr, avr)
> +DEF_HELPER_3(vcmpbfp_dot, void, avr, avr, avr)
>  DEF_HELPER_3(vmrglb, void, avr, avr, avr)
>  DEF_HELPER_3(vmrglh, void, avr, avr, avr)
>  DEF_HELPER_3(vmrglw, void, avr, avr, avr)
> diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
> index f59cd15..d40caf0 100644
> --- a/target-ppc/op_helper.c
> +++ b/target-ppc/op_helper.c
> @@ -2220,6 +2220,74 @@ VCMP(gtsw, >, s32)
>  #undef VCMP_DO
>  #undef VCMP
>  
> +#define VCMPFP_DO(suffix, compare, order, record)                       \
> +    void helper_vcmp##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
> +    {                                                                   \
> +        uint32_t ones = (uint32_t)-1;                                   \
> +        uint32_t all = ones;                                            \
> +        uint32_t none = 0;                                              \
> +        int i;                                                          \
> +        for (i = 0; i < ARRAY_SIZE(r->f); i++) {                        \
> +            uint32_t result;                                            \
> +            int rel = float32_compare_quiet(a->f[i], b->f[i], 
> &env->vec_status); \
> +            if (rel == float_relation_unordered) {                      \
> +                result = 0;                                             \
> +            } else if (rel compare order) {                             \
> +                result = ones;                                          \
> +            } else {                                                    \
> +                result = 0;                                             \
> +            }                                                           \
> +            r->u32[i] = result;                                         \
> +            all &= result;                                              \
> +            none |= result;                                             \
> +        }                                                               \
> +        if (record) {                                                   \
> +            env->crf[6] = ((all != 0) << 3) | ((none == 0) << 1);       \
> +        }                                                               \
> +    }
> +#define VCMPFP(suffix, compare, order)           \
> +    VCMPFP_DO(suffix, compare, order, 0)         \
> +    VCMPFP_DO(suffix##_dot, compare, order, 1)
> +VCMPFP(eqfp, ==, float_relation_equal)
> +VCMPFP(gefp, !=, float_relation_less)
> +VCMPFP(gtfp, ==, float_relation_greater)
> +#undef VCMPFP_DO
> +#undef VCMPFP
> +
> +static always_inline void vcmpbfp_internal (ppc_avr_t *r, ppc_avr_t *a,
> +                                            ppc_avr_t *b, int record)
> +{
> +    int i;
> +    int all_in = 0;
> +    for (i = 0; i < ARRAY_SIZE(r->f); i++) {
> +        int le_rel = float32_compare_quiet(a->f[i], b->f[i], 
> &env->vec_status);
> +        if (le_rel == float_relation_unordered) {
> +            r->u32[i] = 0xc0000000;
> +            /* ALL_IN does not need to be updated here.  */
> +        } else {
> +            float32 bneg = float32_chs(b->f[i]);
> +            int ge_rel = float32_compare_quiet(a->f[i], bneg, 
> &env->vec_status);
> +            int le = le_rel != float_relation_greater;
> +            int ge = ge_rel != float_relation_less;
> +            r->u32[i] = ((!le) << 31) | ((!ge) << 30);
> +            all_in |= (!le | !ge);
> +        }
> +    }
> +    if (record) {
> +        env->crf[6] = (all_in == 0) << 1;
> +    }
> +}
> +
> +void helper_vcmpbfp (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
> +{
> +    vcmpbfp_internal(r, a, b, 0);
> +}
> +
> +void helper_vcmpbfp_dot (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
> +{
> +    vcmpbfp_internal(r, a, b, 1);
> +}
> +
>  void helper_vmaddfp (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
>  {
>      int i;
> diff --git a/target-ppc/translate.c b/target-ppc/translate.c
> index 88426af..a722f65 100644
> --- a/target-ppc/translate.c
> +++ b/target-ppc/translate.c
> @@ -6430,6 +6430,10 @@ GEN_VXRFORM(vcmpgtsw, 3, 14)
>  GEN_VXRFORM(vcmpgtub, 3, 8)
>  GEN_VXRFORM(vcmpgtuh, 3, 9)
>  GEN_VXRFORM(vcmpgtuw, 3, 10)
> +GEN_VXRFORM(vcmpeqfp, 3, 3)
> +GEN_VXRFORM(vcmpgefp, 3, 7)
> +GEN_VXRFORM(vcmpgtfp, 3, 11)
> +GEN_VXRFORM(vcmpbfp, 3, 15)
>  
>  #define GEN_VXFORM_SIMM(name, opc2, opc3)                               \
>      GEN_HANDLER(name, 0x04, opc2, opc3, 0x00000000, PPC_ALTIVEC)        \
> -- 
> 1.6.0.5
> 
> 
> 
> 

-- 
Aurelien Jarno                          GPG: 1024D/F1BCDB73
address@hidden                 http://www.aurel32.net




reply via email to

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