qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PULL 0/2] target-alpha cmpbge improvements
@ 2015-09-02 19:58 Richard Henderson
  2015-09-02 19:58 ` [Qemu-devel] [PULL 1/2] target-alpha: Rewrite helper_cmpbge using bit tests Richard Henderson
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Richard Henderson @ 2015-09-02 19:58 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell

Fixed version of the patch set posted 17 August.
Please pull.


r~


The following changes since commit 074a9925e1cfd659d5376dcaccd1436d3840e611:

  Merge remote-tracking branch 'remotes/cody/tags/block-pull-request' into staging (2015-08-14 16:52:34 +0100)

are available in the git repository at:

  git://github.com/rth7680/qemu.git tags/pull-axp-20150902

for you to fetch changes up to 112e4518f0d38fc3c52e55c7d7e77b66a295ec2b:

  target-alpha: Special case cmpbge with zero (2015-08-18 09:11:12 -0700)

----------------------------------------------------------------
cmpbge emulation improvements

----------------------------------------------------------------
Richard Henderson (2):
      target-alpha: Rewrite helper_cmpbge using bit tests
      target-alpha: Special case cmpbge with zero

 target-alpha/helper.h     |  1 +
 target-alpha/int_helper.c | 51 ++++++++++++++++++++++++++++++++++++-----------
 target-alpha/translate.c  |  7 ++++++-
 3 files changed, 46 insertions(+), 13 deletions(-)

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [Qemu-devel] [PULL 1/2] target-alpha: Rewrite helper_cmpbge using bit tests
  2015-09-02 19:58 [Qemu-devel] [PULL 0/2] target-alpha cmpbge improvements Richard Henderson
@ 2015-09-02 19:58 ` Richard Henderson
  2015-09-02 19:58 ` [Qemu-devel] [PULL 2/2] target-alpha: Special case cmpbge with zero Richard Henderson
  2015-09-03 12:05 ` [Qemu-devel] [PULL 0/2] target-alpha cmpbge improvements Peter Maydell
  2 siblings, 0 replies; 4+ messages in thread
From: Richard Henderson @ 2015-09-02 19:58 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell

Not quite as good as using a proper host vector compare,
but certainly better than a loop.

Signed-off-by: Richard Henderson <rth@twiddle.net>
---
 target-alpha/int_helper.c | 39 ++++++++++++++++++++++++++-------------
 1 file changed, 26 insertions(+), 13 deletions(-)

diff --git a/target-alpha/int_helper.c b/target-alpha/int_helper.c
index 74f38cb..4a6e955 100644
--- a/target-alpha/int_helper.c
+++ b/target-alpha/int_helper.c
@@ -58,20 +58,33 @@ uint64_t helper_zap(uint64_t val, uint64_t mask)
     return helper_zapnot(val, ~mask);
 }
 
-uint64_t helper_cmpbge(uint64_t op1, uint64_t op2)
+uint64_t helper_cmpbge(uint64_t a, uint64_t b)
 {
-    uint8_t opa, opb, res;
-    int i;
-
-    res = 0;
-    for (i = 0; i < 8; i++) {
-        opa = op1 >> (i * 8);
-        opb = op2 >> (i * 8);
-        if (opa >= opb) {
-            res |= 1 << i;
-        }
-    }
-    return res;
+    uint64_t mask = 0x00ff00ff00ff00ffULL;
+    uint64_t test = 0x0100010001000100ULL;
+    uint64_t al, ah, bl, bh, cl, ch;
+
+    /* Separate the bytes to avoid false positives.  */
+    al = a & mask;
+    bl = b & mask;
+    ah = (a >> 8) & mask;
+    bh = (b >> 8) & mask;
+
+    /* "Compare".  If a byte in B is greater than a byte in A,
+       it will clear the test bit.  */
+    cl = ((al | test) - bl) & test;
+    ch = ((ah | test) - bh) & test;
+
+    /* Fold all of the test bits into a contiguous set.  */
+    /* ch=.......a...............c...............e...............g........ */
+    /* cl=.......b...............d...............f...............h........ */
+    cl += ch << 1;
+    /* cl=......ab..............cd..............ef..............gh........ */
+    cl |= cl << 14;
+    /* cl=......abcd............cdef............efgh............gh........ */
+    cl |= cl << 28;
+    /* cl=......abcdefgh........cdefgh..........efgh............gh........ */
+    return cl >> 50;
 }
 
 uint64_t helper_minub8(uint64_t op1, uint64_t op2)
-- 
2.4.3

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [Qemu-devel] [PULL 2/2] target-alpha: Special case cmpbge with zero
  2015-09-02 19:58 [Qemu-devel] [PULL 0/2] target-alpha cmpbge improvements Richard Henderson
  2015-09-02 19:58 ` [Qemu-devel] [PULL 1/2] target-alpha: Rewrite helper_cmpbge using bit tests Richard Henderson
@ 2015-09-02 19:58 ` Richard Henderson
  2015-09-03 12:05 ` [Qemu-devel] [PULL 0/2] target-alpha cmpbge improvements Peter Maydell
  2 siblings, 0 replies; 4+ messages in thread
From: Richard Henderson @ 2015-09-02 19:58 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell

Knowing the comparator is zero leads to a simpler operation.

Signed-off-by: Richard Henderson <rth@twiddle.net>
---
 target-alpha/helper.h     |  1 +
 target-alpha/int_helper.c | 14 ++++++++++++++
 target-alpha/translate.c  |  7 ++++++-
 3 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/target-alpha/helper.h b/target-alpha/helper.h
index d221f0d..83cbe2a 100644
--- a/target-alpha/helper.h
+++ b/target-alpha/helper.h
@@ -10,6 +10,7 @@ DEF_HELPER_FLAGS_1(cttz, TCG_CALL_NO_RWG_SE, i64, i64)
 DEF_HELPER_FLAGS_2(zap, TCG_CALL_NO_RWG_SE, i64, i64, i64)
 DEF_HELPER_FLAGS_2(zapnot, TCG_CALL_NO_RWG_SE, i64, i64, i64)
 
+DEF_HELPER_FLAGS_1(cmpbe0, TCG_CALL_NO_RWG_SE, i64, i64)
 DEF_HELPER_FLAGS_2(cmpbge, TCG_CALL_NO_RWG_SE, i64, i64, i64)
 
 DEF_HELPER_FLAGS_2(minub8, TCG_CALL_NO_RWG_SE, i64, i64, i64)
diff --git a/target-alpha/int_helper.c b/target-alpha/int_helper.c
index 4a6e955..d7f4774 100644
--- a/target-alpha/int_helper.c
+++ b/target-alpha/int_helper.c
@@ -58,6 +58,20 @@ uint64_t helper_zap(uint64_t val, uint64_t mask)
     return helper_zapnot(val, ~mask);
 }
 
+uint64_t helper_cmpbe0(uint64_t a)
+{
+    uint64_t m = 0x7f7f7f7f7f7f7f7fULL;
+    uint64_t c = ~(((a & m) + m) | a | m);
+    /* a.......b.......c.......d.......e.......f.......g.......h....... */
+    c |= c << 7;
+    /* ab......bc......cd......de......ef......fg......gh......h....... */
+    c |= c << 14;
+    /* abcd....bcde....cdef....defg....efgh....fgh.....gh......h....... */
+    c |= c << 28;
+    /* abcdefghbcdefgh.cdefgh..defgh...efgh....fgh.....gh......h....... */
+    return c >> 56;
+}
+
 uint64_t helper_cmpbge(uint64_t a, uint64_t b)
 {
     uint64_t mask = 0x00ff00ff00ff00ffULL;
diff --git a/target-alpha/translate.c b/target-alpha/translate.c
index 81d4ff8..b766ae3 100644
--- a/target-alpha/translate.c
+++ b/target-alpha/translate.c
@@ -1507,7 +1507,12 @@ static ExitStatus translate_one(DisasContext *ctx, uint32_t insn)
             break;
         case 0x0F:
             /* CMPBGE */
-            gen_helper_cmpbge(vc, va, vb);
+            if (ra == 31) {
+                /* Special case 0 >= X as X == 0.  */
+                gen_helper_cmpbe0(vc, vb);
+            } else {
+                gen_helper_cmpbge(vc, va, vb);
+            }
             break;
         case 0x12:
             /* S8ADDL */
-- 
2.4.3

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] [PULL 0/2] target-alpha cmpbge improvements
  2015-09-02 19:58 [Qemu-devel] [PULL 0/2] target-alpha cmpbge improvements Richard Henderson
  2015-09-02 19:58 ` [Qemu-devel] [PULL 1/2] target-alpha: Rewrite helper_cmpbge using bit tests Richard Henderson
  2015-09-02 19:58 ` [Qemu-devel] [PULL 2/2] target-alpha: Special case cmpbge with zero Richard Henderson
@ 2015-09-03 12:05 ` Peter Maydell
  2 siblings, 0 replies; 4+ messages in thread
From: Peter Maydell @ 2015-09-03 12:05 UTC (permalink / raw)
  To: Richard Henderson; +Cc: QEMU Developers

On 2 September 2015 at 20:58, Richard Henderson <rth@twiddle.net> wrote:
> Fixed version of the patch set posted 17 August.
> Please pull.
>
>
> r~
>
>
> The following changes since commit 074a9925e1cfd659d5376dcaccd1436d3840e611:
>
>   Merge remote-tracking branch 'remotes/cody/tags/block-pull-request' into staging (2015-08-14 16:52:34 +0100)
>
> are available in the git repository at:
>
>   git://github.com/rth7680/qemu.git tags/pull-axp-20150902
>
> for you to fetch changes up to 112e4518f0d38fc3c52e55c7d7e77b66a295ec2b:
>
>   target-alpha: Special case cmpbge with zero (2015-08-18 09:11:12 -0700)
>
> ----------------------------------------------------------------
> cmpbge emulation improvements
>
> ----------------------------------------------------------------
> Richard Henderson (2):
>       target-alpha: Rewrite helper_cmpbge using bit tests
>       target-alpha: Special case cmpbge with zero

Applied, thanks.

-- PMM

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2015-09-03 12:06 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-09-02 19:58 [Qemu-devel] [PULL 0/2] target-alpha cmpbge improvements Richard Henderson
2015-09-02 19:58 ` [Qemu-devel] [PULL 1/2] target-alpha: Rewrite helper_cmpbge using bit tests Richard Henderson
2015-09-02 19:58 ` [Qemu-devel] [PULL 2/2] target-alpha: Special case cmpbge with zero Richard Henderson
2015-09-03 12:05 ` [Qemu-devel] [PULL 0/2] target-alpha cmpbge improvements Peter Maydell

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).