All of lore.kernel.org
 help / color / mirror / Atom feed
From: Michael Roth <mdroth@linux.vnet.ibm.com>
To: qemu-devel@nongnu.org
Cc: qemu-stable@nongnu.org, Richard Henderson <rth@twiddle.net>
Subject: [Qemu-devel] [PATCH 51/81] tcg/aarch64: Fix tcg_out_movi
Date: Mon, 20 Mar 2017 18:08:15 -0500	[thread overview]
Message-ID: <1490051325-3770-52-git-send-email-mdroth@linux.vnet.ibm.com> (raw)
In-Reply-To: <1490051325-3770-1-git-send-email-mdroth@linux.vnet.ibm.com>

From: Richard Henderson <rth@twiddle.net>

There were some patterns, like 0x0000_ffff_ffff_00ff, for which we
would select to begin a multi-insn sequence with MOVN, but would
fail to set the 0x0000 lane back from 0xffff.

Signed-off-by: Richard Henderson <rth@twiddle.net>
Message-Id: <20161207180727.6286-3-rth@twiddle.net>
(cherry picked from commit 8cf9a3d3f7a4b95f33e0bda5416b9c93ec887dd3)
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
---
 tcg/aarch64/tcg-target.inc.c | 57 +++++++++++++++++++-------------------------
 1 file changed, 24 insertions(+), 33 deletions(-)

diff --git a/tcg/aarch64/tcg-target.inc.c b/tcg/aarch64/tcg-target.inc.c
index 6c68681..2d7cc35 100644
--- a/tcg/aarch64/tcg-target.inc.c
+++ b/tcg/aarch64/tcg-target.inc.c
@@ -581,11 +581,9 @@ static void tcg_out_logicali(TCGContext *s, AArch64Insn insn, TCGType ext,
 static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg rd,
                          tcg_target_long value)
 {
-    AArch64Insn insn;
     int i, wantinv, shift;
     tcg_target_long svalue = value;
     tcg_target_long ivalue = ~value;
-    tcg_target_long imask;
 
     /* For 32-bit values, discard potential garbage in value.  For 64-bit
        values within [2**31, 2**32-1], we can create smaller sequences by
@@ -631,42 +629,35 @@ static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg rd,
 
     /* Would it take fewer insns to begin with MOVN?  For the value and its
        inverse, count the number of 16-bit lanes that are 0.  */
-    for (i = wantinv = imask = 0; i < 64; i += 16) {
+    for (i = wantinv = 0; i < 64; i += 16) {
         tcg_target_long mask = 0xffffull << i;
-        if ((value & mask) == 0) {
-            wantinv -= 1;
-        }
-        if ((ivalue & mask) == 0) {
-            wantinv += 1;
-            imask |= mask;
-        }
+        wantinv -= ((value & mask) == 0);
+        wantinv += ((ivalue & mask) == 0);
     }
 
-    /* If we had more 0xffff than 0x0000, invert VALUE and use MOVN.  */
-    insn = I3405_MOVZ;
-    if (wantinv > 0) {
-        value = ivalue;
-        insn = I3405_MOVN;
-    }
-
-    /* Find the lowest lane that is not 0x0000.  */
-    shift = ctz64(value) & (63 & -16);
-    tcg_out_insn_3405(s, insn, type, rd, value >> shift, shift);
-
-    if (wantinv > 0) {
-        /* Re-invert the value, so MOVK sees non-inverted bits.  */
-        value = ~value;
-        /* Clear out all the 0xffff lanes.  */
-        value ^= imask;
-    }
-    /* Clear out the lane that we just set.  */
-    value &= ~(0xffffUL << shift);
-
-    /* Iterate until all lanes have been set, and thus cleared from VALUE.  */
-    while (value) {
+    if (wantinv <= 0) {
+        /* Find the lowest lane that is not 0x0000.  */
         shift = ctz64(value) & (63 & -16);
-        tcg_out_insn(s, 3405, MOVK, type, rd, value >> shift, shift);
+        tcg_out_insn(s, 3405, MOVZ, type, rd, value >> shift, shift);
+        /* Clear out the lane that we just set.  */
         value &= ~(0xffffUL << shift);
+        /* Iterate until all non-zero lanes have been processed.  */
+        while (value) {
+            shift = ctz64(value) & (63 & -16);
+            tcg_out_insn(s, 3405, MOVK, type, rd, value >> shift, shift);
+            value &= ~(0xffffUL << shift);
+        }
+    } else {
+        /* Like above, but with the inverted value and MOVN to start.  */
+        shift = ctz64(ivalue) & (63 & -16);
+        tcg_out_insn(s, 3405, MOVN, type, rd, ivalue >> shift, shift);
+        ivalue &= ~(0xffffUL << shift);
+        while (ivalue) {
+            shift = ctz64(ivalue) & (63 & -16);
+            /* Provide MOVK with the non-inverted value.  */
+            tcg_out_insn(s, 3405, MOVK, type, rd, ~(ivalue >> shift), shift);
+            ivalue &= ~(0xffffUL << shift);
+        }
     }
 }
 
-- 
2.7.4

  parent reply	other threads:[~2017-03-20 23:09 UTC|newest]

Thread overview: 96+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-20 23:07 [Qemu-devel] [PATCH 00/81] Patch Round-up for stable 2.8.1, freeze on 2017-03-27 Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 01/81] 9pfs: local: move xattr security ops to 9p-xattr.c Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 02/81] 9pfs: remove side-effects in local_init() Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 03/81] 9pfs: remove side-effects in local_open() and local_opendir() Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 04/81] 9pfs: introduce relative_openat_nofollow() helper Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 05/81] 9pfs: local: keep a file descriptor on the shared folder Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 06/81] 9pfs: local: open/opendir: don't follow symlinks Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 07/81] 9pfs: local: lgetxattr: " Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 08/81] 9pfs: local: llistxattr: " Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 09/81] 9pfs: local: lsetxattr: " Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 10/81] 9pfs: local: lremovexattr: " Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 11/81] 9pfs: local: unlinkat: " Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 12/81] 9pfs: local: remove: " Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 13/81] 9pfs: local: utimensat: " Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 14/81] 9pfs: local: statfs: " Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 15/81] 9pfs: local: truncate: " Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 16/81] 9pfs: local: readlink: " Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 17/81] 9pfs: local: lstat: " Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 18/81] 9pfs: local: renameat: " Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 19/81] 9pfs: local: rename: use renameat Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 20/81] 9pfs: local: improve error handling in link op Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 21/81] 9pfs: local: link: don't follow symlinks Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 22/81] 9pfs: local: chmod: " Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 23/81] 9pfs: local: chown: " Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 24/81] 9pfs: local: symlink: " Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 25/81] 9pfs: local: mknod: " Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 26/81] 9pfs: local: mkdir: " Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 27/81] 9pfs: local: open2: " Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 28/81] 9pfs: local: drop unused code Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 29/81] 9pfs: fix bogus fd check in local_remove() Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 30/81] 9pfs: fix fd leak in local_opendir() Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 31/81] 9pfs: fail local_statfs() earlier Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 32/81] 9pfs: don't use AT_EMPTY_PATH in local_set_cred_passthrough() Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 33/81] 9pfs: fix O_PATH build break with older glibc versions Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 34/81] 9pfs: fix vulnerability in openat_dir() and local_unlinkat_common() Michael Roth
2017-03-20 23:07 ` [Qemu-devel] [PATCH 35/81] machine: Convert abstract typename on compat_props to subclass names Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 36/81] balloon: Don't balloon roms Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 37/81] pci: fix error message for express slots Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 38/81] virtio: fix vq->inuse recalc after migr Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 39/81] 9pfs: fix crash when fsdev is missing Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 40/81] pc: fix crash in rtc_set_memory() if initial cpu is marked as hotplugged Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 41/81] ui/gtk: fix crash at startup when no console is available Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 42/81] scsi-block: fix direction of BYTCHK test for VERIFY commands Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 43/81] ui/vnc: Fix problem with sending too many bytes as server name Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 44/81] qemu-thread: fix qemu_thread_set_name() race in qemu_thread_create() Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 45/81] virtio-crypto: fix possible integer and heap overflow Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 46/81] exec: Add missing rcu_read_unlock Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 47/81] display: cirrus: ignore source pitch value as needed in blit_is_unsafe Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 48/81] x86: ioapic: fix fail migration when irqchip=split Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 49/81] char: fix ctrl-a b not working Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 50/81] tcg/aarch64: Fix addsub2 for 0+C Michael Roth
2017-03-20 23:08 ` Michael Roth [this message]
2017-03-20 23:08 ` [Qemu-devel] [PATCH 52/81] ui: use evdev keymap when running under wayland Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 53/81] virtio: fix up max size checks Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 54/81] block/iscsi: avoid data corruption with cache=writeback Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 55/81] s390x/kvm: fix cmma reset for KVM Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 56/81] cirrus: fix oob access issue (CVE-2017-2615) Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 57/81] cpu-exec: fix icount out-of-bounds access Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 58/81] ahci: advertise HOST_CAP_64 Michael Roth
2017-03-22 13:11   ` John Snow
2017-03-20 23:08 ` [Qemu-devel] [PATCH 59/81] target/s390x: use "qemu" cpu model in user mode Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 60/81] s390x/kvm: fix small race reboot vs. cmma Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 61/81] block/nfs: fix NULL pointer dereference in URI parsing Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 62/81] block/nfs: fix naming of runtime opts Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 63/81] sd: sdhci: check data length during dma_memory_read Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 64/81] vnc: do not disconnect on EAGAIN Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 65/81] target-ppc, tcg: fix usermode segfault with pthread_create() Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 66/81] block/vmdk: Fix the endian problem of buf_len and lba Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 67/81] target/sparc: Restore ldstub of odd asis Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 68/81] apic: reset apic_delivered global variable on machine reset Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 69/81] target-i386: correctly propagate retaddr into SVM helpers Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 70/81] qga: ignore EBUSY when freezing a filesystem Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 71/81] hmp: fix block_set_io_throttle Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 72/81] cirrus: add blit_is_unsafe call to cirrus_bitblt_cputovideo (CVE-2017-2620) Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 73/81] eth: Extend vlan stripping functions Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 74/81] NetRxPkt: Fix memory corruption on VLAN header stripping Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 75/81] NetRxPkt: Do not try to pull more data than present Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 76/81] NetRxPkt: Account buffer with ETH header in IOV length Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 77/81] e1000e: correctly tear down MSI-X memory regions Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 78/81] scsi: mptsas: fix the wrong reading size in fetch request Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 79/81] virtio-pci: reset modern vq meta data Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 80/81] s390x/css: reassign subchannel if schid is changed after migration Michael Roth
2017-03-20 23:08 ` [Qemu-devel] [PATCH 81/81] thread-pool: add missing qemu_bh_cancel in completion function Michael Roth
2017-03-21  0:47 ` [Qemu-devel] [PATCH 00/81] Patch Round-up for stable 2.8.1, freeze on 2017-03-27 Eric Blake
2017-03-21  1:31 ` Richard Henderson
2017-03-21  9:13 ` [Qemu-devel] [Qemu-stable] " Greg Kurz
2017-03-21 16:26   ` Greg Kurz
2017-03-22 14:31 ` [Qemu-devel] " Christian Borntraeger
2017-04-05  2:01 ` [Qemu-devel] [Qemu-stable] " Gonglei (Arei)
2017-04-05  4:08   ` Michael Roth
2017-04-05  4:51     ` Gonglei (Arei)
2017-04-05  5:21       ` Michael Roth
2017-04-05  5:52         ` Gonglei (Arei)
2017-04-05  6:16           ` Michael Roth
2017-04-05  6:22             ` Gonglei (Arei)
2017-04-06  2:32             ` Gonglei (Arei)

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=1490051325-3770-52-git-send-email-mdroth@linux.vnet.ibm.com \
    --to=mdroth@linux.vnet.ibm.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-stable@nongnu.org \
    --cc=rth@twiddle.net \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.