[Top][All Lists]
[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
- Re: [Qemu-devel] [PATCH 09/14] Add vcmp{eq,ge,gt,b}fp{,.} instructions, Aurelien Jarno, 2009/02/04
- Re: [Qemu-devel] [PATCH 09/14] Add vcmp{eq, ge, gt, b}fp{, .} instructions, Nathan Froyd, 2009/02/08
- Re: [Qemu-devel] [PATCH 09/14] Add vcmp{eq, ge, gt, b}fp{, .} instructions,
Aurelien Jarno <=