[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 1/1] target/ppc: add vmsumudm vmsumcud instructions
From: |
Richard Henderson |
Subject: |
Re: [PATCH 1/1] target/ppc: add vmsumudm vmsumcud instructions |
Date: |
Fri, 5 Jun 2020 23:04:13 -0700 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.8.0 |
On 6/4/20 10:14 PM, Lijun Pan wrote:
> +static void vmsumcudm(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b,
> + ppc_avr_t *c, bool ca)
> +{
> +#ifdef CONFIG_INT128
> + __uint128_t prod[2];
> + int i;
> +
> + for (i = 0; i < 2; i++) {
> + prod[i] = (__uint128_t)(a->VsrD(i)) * (__uint128_t)(b->VsrD(i));
> + }
> + if (ca)
> + r->u128 = (~prod[0] < prod[1]) + (~c->u128 < (prod[0] +
> prod[1]));
> + else
> + r->u128 = prod[0] + prod[1] + c->u128;
> +#else
> + uint64_t ah64, al64, bh64, bl64, ch64, cl64, rh64, rl64, th64, tl64,
> ca1, ca2;
> +
> + ch64 = c->VsrD(0);
> + cl64 = c->VsrD(1);
> + mulu64(&al64, &ah64, a->VsrD(0), b->VsrD(0));
> + mulu64(&bl64, &bh64, a->VsrD(1), b->VsrD(1));
> + addu128(ah64, al64, bh64, bl64, &rh64, &rl64, &ca1);
> + addu128(rh64, rl64, ch64, cl64, &th64, &tl64, &ca2);
> + if (ca) {
> + r->VsrD(0) = 0;
> + r->VsrD(1) = ca1 + ca2;
> + } else {
> + r->VsrD(0) = th64;
> + r->VsrD(1) = tl64;
> + }
> +#endif
> +}
I encourage you to enhance qemu/int128.h as needed, and not ifdef this.
r~