From: Richard Henderson <richard.henderson@linaro.org>
To: David Hildenbrand <david@redhat.com>, qemu-devel@nongnu.org
Cc: qemu-s390x@nongnu.org, Cornelia Huck <cohuck@redhat.com>,
Thomas Huth <thuth@redhat.com>,
Richard Henderson <rth@twiddle.net>
Subject: Re: [Qemu-devel] [PATCH v1 1/5] s390x/tcg: Implement VECTOR FIND ANY ELEMENT EQUAL
Date: Fri, 17 May 2019 09:16:40 -0700 [thread overview]
Message-ID: <b3611279-15c4-f9b7-2a91-051ac6431b2c@linaro.org> (raw)
In-Reply-To: <20190515203112.506-2-david@redhat.com>
On 5/15/19 1:31 PM, David Hildenbrand wrote:
> +#define DEF_VFAE(BITS) \
> +static int vfae##BITS(void *v1, const void *v2, const void *v3, uint8_t m5)
First, because this *is* complicated stuff, can we find a way to use inline
functions instead of an undebuggable macro for this? Perhaps a different set
of wrappers than s390_vec_read_element##BITS, which always return uint32_t, so
that they have a constant signature?
> + if (zs && !data) {
> + if (cc == 3) {
> + first_byte = i * (BITS / 8);
> + cc = 0; /* match for zero */
> + } else if (cc != 0) {
> + cc = 2; /* matching elements before match for zero */
> + }
> + if (!rt) {
> + break;
> + }
> + }
So here we are computing the second intermediate result.
> + /* try to match with any other element from the other vector */
> + for (j = 0; j < (128 / BITS); j++) {
> + if (data == s390_vec_read_element##BITS(v3, j)) {
> + any_equal = true;
> + break;
> + }
> + }
And here the first intermediate result,
> + /* invert the result if requested */
> + any_equal = in ^ any_equal;
... inverted, if requested,
> + if (cc == 3 && any_equal) {
> + first_byte = i * (BITS / 8);
> + cc = 1; /* matching elements, no match for zero */
> + if (!zs && !rt) {
> + break;
> + }
> + }
> + /* indicate bit vector if requested */
> + if (rt && any_equal) {
> + s390_vec_write_element##BITS(&tmp, i, (uint##BITS##_t)-1ull);
> + }
... writing out (some of) the results of the first intermediate result.
> + }
> + if (!rt) {
> + s390_vec_write_element8(&tmp, 7, first_byte);
> + }
... writing out the rest of the first intermediate result.
I wonder if it wouldn't be clearer, within the loop, to do
if (any_equal) {
if (cc == 3) {
first_byte = ...;
cc = 1;
}
if (rt) {
write element -1;
} else if (!zs) {
break;
}
}
I also think that, if we create a bunch more of these wrappers:
> +DEF_VFAE_HELPER(8)
> +DEF_VFAE_HELPER(16)
> +DEF_VFAE_HELPER(32)
then RT and ZS can be passed in as constant parameters to the above, and then
the compiler will fold away all of the stuff that's not needed for each
different case. Which, I think, is significant. These are practically
different instructions with the different modifiers.
r~
next prev parent reply other threads:[~2019-05-17 16:19 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-15 20:31 [Qemu-devel] [PATCH v1 0/5] s390x/tcg: Vector Instruction Support Part 3 David Hildenbrand
2019-05-15 20:31 ` [Qemu-devel] [PATCH v1 1/5] s390x/tcg: Implement VECTOR FIND ANY ELEMENT EQUAL David Hildenbrand
2019-05-17 16:16 ` Richard Henderson [this message]
2019-05-20 9:51 ` David Hildenbrand
2019-05-22 11:01 ` David Hildenbrand
2019-05-22 11:09 ` Richard Henderson
2019-05-22 11:16 ` David Hildenbrand
2019-05-22 15:59 ` Richard Henderson
2019-05-22 18:16 ` David Hildenbrand
2019-05-22 18:46 ` Richard Henderson
2019-05-23 7:50 ` David Hildenbrand
2019-05-23 12:27 ` Richard Henderson
2019-05-23 12:34 ` David Hildenbrand
2019-05-23 12:59 ` David Hildenbrand
2019-05-23 13:50 ` Richard Henderson
2019-05-23 10:58 ` Alex Bennée
2019-05-15 20:31 ` [Qemu-devel] [PATCH v1 2/5] s390x/tcg: Implement VECTOR FIND " David Hildenbrand
2019-05-17 16:47 ` Richard Henderson
2019-05-17 17:42 ` Richard Henderson
2019-05-20 9:17 ` David Hildenbrand
2019-05-15 20:31 ` [Qemu-devel] [PATCH v1 3/5] s390x/tcg: Implement VECTOR FIND ELEMENT NOT EQUAL David Hildenbrand
2019-05-17 17:56 ` Richard Henderson
2019-05-20 9:48 ` David Hildenbrand
2019-05-15 20:31 ` [Qemu-devel] [PATCH v1 4/5] s390x/tcg: Implement VECTOR ISOLATE STRING David Hildenbrand
2019-05-17 18:20 ` Richard Henderson
2019-05-15 20:31 ` [Qemu-devel] [PATCH v1 5/5] s390x/tcg: Implement VECTOR STRING RANGE COMPARE David Hildenbrand
2019-05-17 18:37 ` Richard Henderson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=b3611279-15c4-f9b7-2a91-051ac6431b2c@linaro.org \
--to=richard.henderson@linaro.org \
--cc=cohuck@redhat.com \
--cc=david@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-s390x@nongnu.org \
--cc=rth@twiddle.net \
--cc=thuth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).