qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Richard Henderson <richard.henderson@linaro.org>
To: qemu-devel@nongnu.org
Cc: alex.bennee@linaro.org, david@redhat.com
Subject: [Qemu-devel] [PATCH v3 12/31] tcg/i386: Implement tcg_out_dupm_vec
Date: Fri,  3 May 2019 22:52:41 -0700	[thread overview]
Message-ID: <20190504055300.18426-13-richard.henderson@linaro.org> (raw)
In-Reply-To: <20190504055300.18426-1-richard.henderson@linaro.org>

At the same time, improve tcg_out_dupi_vec wrt broadcast
from the constant pool.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 tcg/i386/tcg-target.inc.c | 57 +++++++++++++++++++++++++++++----------
 1 file changed, 43 insertions(+), 14 deletions(-)

diff --git a/tcg/i386/tcg-target.inc.c b/tcg/i386/tcg-target.inc.c
index f04933bc19..f4bd00e24f 100644
--- a/tcg/i386/tcg-target.inc.c
+++ b/tcg/i386/tcg-target.inc.c
@@ -358,7 +358,6 @@ static inline int tcg_target_const_match(tcg_target_long val, TCGType type,
 #define OPC_MOVBE_MyGy  (0xf1 | P_EXT38)
 #define OPC_MOVD_VyEy   (0x6e | P_EXT | P_DATA16)
 #define OPC_MOVD_EyVy   (0x7e | P_EXT | P_DATA16)
-#define OPC_MOVDDUP     (0x12 | P_EXT | P_SIMDF2)
 #define OPC_MOVDQA_VxWx (0x6f | P_EXT | P_DATA16)
 #define OPC_MOVDQA_WxVx (0x7f | P_EXT | P_DATA16)
 #define OPC_MOVDQU_VxWx (0x6f | P_EXT | P_SIMDF3)
@@ -458,6 +457,10 @@ static inline int tcg_target_const_match(tcg_target_long val, TCGType type,
 #define OPC_UD2         (0x0b | P_EXT)
 #define OPC_VPBLENDD    (0x02 | P_EXT3A | P_DATA16)
 #define OPC_VPBLENDVB   (0x4c | P_EXT3A | P_DATA16)
+#define OPC_VPINSRB     (0x20 | P_EXT3A | P_DATA16)
+#define OPC_VPINSRW     (0xc4 | P_EXT | P_DATA16)
+#define OPC_VBROADCASTSS (0x18 | P_EXT38 | P_DATA16)
+#define OPC_VBROADCASTSD (0x19 | P_EXT38 | P_DATA16)
 #define OPC_VPBROADCASTB (0x78 | P_EXT38 | P_DATA16)
 #define OPC_VPBROADCASTW (0x79 | P_EXT38 | P_DATA16)
 #define OPC_VPBROADCASTD (0x58 | P_EXT38 | P_DATA16)
@@ -855,16 +858,17 @@ static bool tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg)
     return true;
 }
 
+static const int avx2_dup_insn[4] = {
+    OPC_VPBROADCASTB, OPC_VPBROADCASTW,
+    OPC_VPBROADCASTD, OPC_VPBROADCASTQ,
+};
+
 static bool tcg_out_dup_vec(TCGContext *s, TCGType type, unsigned vece,
                             TCGReg r, TCGReg a)
 {
     if (have_avx2) {
-        static const int dup_insn[4] = {
-            OPC_VPBROADCASTB, OPC_VPBROADCASTW,
-            OPC_VPBROADCASTD, OPC_VPBROADCASTQ,
-        };
         int vex_l = (type == TCG_TYPE_V256 ? P_VEXL : 0);
-        tcg_out_vex_modrm(s, dup_insn[vece] + vex_l, r, 0, a);
+        tcg_out_vex_modrm(s, avx2_dup_insn[vece] + vex_l, r, 0, a);
     } else {
         switch (vece) {
         case MO_8:
@@ -894,10 +898,35 @@ static bool tcg_out_dup_vec(TCGContext *s, TCGType type, unsigned vece,
 static bool tcg_out_dupm_vec(TCGContext *s, TCGType type, unsigned vece,
                              TCGReg r, TCGReg base, intptr_t offset)
 {
-    return false;
+    if (have_avx2) {
+        int vex_l = (type == TCG_TYPE_V256 ? P_VEXL : 0);
+        tcg_out_vex_modrm_offset(s, avx2_dup_insn[vece] + vex_l,
+                                 r, 0, base, offset);
+    } else {
+        switch (vece) {
+        case MO_64:
+            tcg_out_vex_modrm_offset(s, OPC_VBROADCASTSD, r, 0, base, offset);
+            break;
+        case MO_32:
+            tcg_out_vex_modrm_offset(s, OPC_VBROADCASTSS, r, 0, base, offset);
+            break;
+        case MO_16:
+            tcg_out_vex_modrm_offset(s, OPC_VPINSRW, r, r, base, offset);
+            tcg_out8(s, 0); /* imm8 */
+            tcg_out_dup_vec(s, type, vece, r, r);
+            break;
+        case MO_8:
+            tcg_out_vex_modrm_offset(s, OPC_VPINSRB, r, r, base, offset);
+            tcg_out8(s, 0); /* imm8 */
+            tcg_out_dup_vec(s, type, vece, r, r);
+            break;
+        default:
+            g_assert_not_reached();
+        }
+    }
+    return true;
 }
 
-
 static void tcg_out_dupi_vec(TCGContext *s, TCGType type,
                              TCGReg ret, tcg_target_long arg)
 {
@@ -918,16 +947,16 @@ static void tcg_out_dupi_vec(TCGContext *s, TCGType type,
         } else if (have_avx2) {
             tcg_out_vex_modrm_pool(s, OPC_VPBROADCASTQ + vex_l, ret);
         } else {
-            tcg_out_vex_modrm_pool(s, OPC_MOVDDUP, ret);
+            tcg_out_vex_modrm_pool(s, OPC_VBROADCASTSD, ret);
         }
         new_pool_label(s, arg, R_386_PC32, s->code_ptr - 4, -4);
-    } else if (have_avx2) {
-        tcg_out_vex_modrm_pool(s, OPC_VPBROADCASTD + vex_l, ret);
-        new_pool_label(s, arg, R_386_32, s->code_ptr - 4, 0);
     } else {
-        tcg_out_vex_modrm_pool(s, OPC_MOVD_VyEy, ret);
+        if (have_avx2) {
+            tcg_out_vex_modrm_pool(s, OPC_VBROADCASTSD + vex_l, ret);
+        } else {
+            tcg_out_vex_modrm_pool(s, OPC_VBROADCASTSS, ret);
+        }
         new_pool_label(s, arg, R_386_32, s->code_ptr - 4, 0);
-        tcg_out_dup_vec(s, type, MO_32, ret, ret);
     }
 }
 
-- 
2.17.1

  parent reply	other threads:[~2019-05-04  5:53 UTC|newest]

Thread overview: 65+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-05-04  5:52 [Qemu-devel] [PATCH v3 00/31] tcg vector improvements Richard Henderson
2019-05-04  5:52 ` Richard Henderson
2019-05-04  5:52 ` [Qemu-devel] [PATCH v3 01/31] tcg: Implement tcg_gen_gvec_3i() Richard Henderson
2019-05-04  5:52   ` Richard Henderson
2019-05-04  5:52 ` [Qemu-devel] [PATCH v3 02/31] tcg: Do not recreate INDEX_op_neg_vec unless supported Richard Henderson
2019-05-04  5:52   ` Richard Henderson
2019-05-04  5:52 ` [Qemu-devel] [PATCH v3 03/31] tcg: Allow add_vec, sub_vec, neg_vec, not_vec to be expanded Richard Henderson
2019-05-04  5:52   ` Richard Henderson
2019-05-04  5:52 ` [Qemu-devel] [PATCH v3 04/31] tcg: Specify optional vector requirements with a list Richard Henderson
2019-05-04  5:52   ` Richard Henderson
2019-05-04  5:52 ` [Qemu-devel] [PATCH v3 05/31] tcg: Assert fixed_reg is read-only Richard Henderson
2019-05-04  5:52   ` Richard Henderson
2019-05-04  5:52 ` [Qemu-devel] [PATCH v3 06/31] tcg/arm: Use tcg_out_mov_reg in tcg_out_mov Richard Henderson
2019-05-04  5:52   ` Richard Henderson
2019-05-04  5:52 ` [Qemu-devel] [PATCH v3 07/31] tcg: Return bool success from tcg_out_mov Richard Henderson
2019-05-04  5:52   ` Richard Henderson
2019-05-04  5:52 ` [Qemu-devel] [PATCH v3 08/31] tcg: Support cross-class moves without instruction support Richard Henderson
2019-05-04  5:52   ` Richard Henderson
2019-05-04  5:52 ` [Qemu-devel] [PATCH v3 09/31] tcg: Promote tcg_out_{dup, dupi}_vec to backend interface Richard Henderson
2019-05-04  5:52   ` Richard Henderson
2019-05-04  5:52 ` [Qemu-devel] [PATCH v3 10/31] tcg: Manually expand INDEX_op_dup_vec Richard Henderson
2019-05-04  5:52   ` Richard Henderson
2019-05-04  5:52 ` [Qemu-devel] [PATCH v3 11/31] tcg: Add tcg_out_dupm_vec to the backend interface Richard Henderson
2019-05-04  5:52   ` Richard Henderson
2019-05-04  5:52 ` Richard Henderson [this message]
2019-05-04  5:52   ` [Qemu-devel] [PATCH v3 12/31] tcg/i386: Implement tcg_out_dupm_vec Richard Henderson
2019-05-04  5:52 ` [Qemu-devel] [PATCH v3 13/31] tcg/aarch64: " Richard Henderson
2019-05-04  5:52   ` Richard Henderson
2019-05-04  5:52 ` [Qemu-devel] [PATCH v3 14/31] tcg: Add INDEX_op_dupm_vec Richard Henderson
2019-05-04  5:52   ` Richard Henderson
2019-05-04  5:52 ` [Qemu-devel] [PATCH v3 15/31] tcg: Add gvec expanders for variable shift Richard Henderson
2019-05-04  5:52   ` Richard Henderson
2019-05-04  5:52 ` [Qemu-devel] [PATCH v3 16/31] tcg/i386: Support vector variable shift opcodes Richard Henderson
2019-05-04  5:52   ` Richard Henderson
2019-05-04  5:52 ` [Qemu-devel] [PATCH v3 17/31] tcg/aarch64: " Richard Henderson
2019-05-04  5:52   ` Richard Henderson
2019-05-04  5:52 ` [Qemu-devel] [PATCH v3 18/31] tcg: Add gvec expanders for vector shift by scalar Richard Henderson
2019-05-04  5:52   ` Richard Henderson
2019-05-04  5:52 ` [Qemu-devel] [PATCH v3 19/31] tcg/i386: Support vector scalar shift opcodes Richard Henderson
2019-05-04  5:52   ` Richard Henderson
2019-05-04  5:52 ` [Qemu-devel] [PATCH v3 20/31] tcg: Add support for integer absolute value Richard Henderson
2019-05-04  5:52   ` Richard Henderson
2019-05-04  5:52 ` [Qemu-devel] [PATCH v3 21/31] tcg: Add support for vector " Richard Henderson
2019-05-04  5:52   ` Richard Henderson
2019-05-04  5:52 ` [Qemu-devel] [PATCH v3 22/31] tcg/i386: Support " Richard Henderson
2019-05-04  5:52   ` Richard Henderson
2019-05-04  5:52 ` [Qemu-devel] [PATCH v3 23/31] tcg/aarch64: " Richard Henderson
2019-05-04  5:52   ` Richard Henderson
2019-05-04  5:52 ` [Qemu-devel] [PATCH v3 24/31] target/arm: Use tcg_gen_abs_i64 and tcg_gen_gvec_abs Richard Henderson
2019-05-04  5:52   ` Richard Henderson
2019-05-04  5:52 ` [Qemu-devel] [PATCH v3 25/31] target/cris: Use tcg_gen_abs_tl Richard Henderson
2019-05-04  5:52   ` Richard Henderson
2019-05-08 19:54   ` David Hildenbrand
2019-05-04  5:52 ` [Qemu-devel] [PATCH v3 26/31] target/ppc: Use tcg_gen_abs_i32 Richard Henderson
2019-05-04  5:52   ` Richard Henderson
2019-05-04  5:52 ` [Qemu-devel] [PATCH v3 27/31] target/ppc: Use tcg_gen_abs_tl Richard Henderson
2019-05-04  5:52   ` Richard Henderson
2019-05-04  5:52 ` [Qemu-devel] [PATCH v3 28/31] target/s390x: Use tcg_gen_abs_i64 Richard Henderson
2019-05-04  5:52   ` Richard Henderson
2019-05-04  5:52 ` [Qemu-devel] [PATCH v3 29/31] target/tricore: Use tcg_gen_abs_tl Richard Henderson
2019-05-04  5:52   ` Richard Henderson
2019-05-04  5:52 ` [Qemu-devel] [PATCH v3 30/31] target/xtensa: Use tcg_gen_abs_i32 Richard Henderson
2019-05-04  5:52   ` Richard Henderson
2019-05-04  5:53 ` [Qemu-devel] [PATCH v3 31/31] tcg/aarch64: Do not advertise minmax for MO_64 Richard Henderson
2019-05-04  5:53   ` 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=20190504055300.18426-13-richard.henderson@linaro.org \
    --to=richard.henderson@linaro.org \
    --cc=alex.bennee@linaro.org \
    --cc=david@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /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).