All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v2] Adding support for LPD and LPDG instructions
@ 2017-02-27 11:22 Eric Bischoff
  2017-02-27 11:22 ` [Qemu-devel] [PATCH] " Eric Bischoff
  0 siblings, 1 reply; 12+ messages in thread
From: Eric Bischoff @ 2017-02-27 11:22 UTC (permalink / raw)
  To: Richard Henderson, Alexander Graf
  Cc: Michal Marek, QEmu developers, Miroslav Benes

Second version of the patch, setting CC to zero.
I am not too satisfied, I had to create a cout_zero() helper, but
I could not find a better solution.

^ permalink raw reply	[flat|nested] 12+ messages in thread
* [Qemu-devel] [PATCH] Adding support for LPD and LPDG instructions
@ 2017-02-28 12:01 Eric Bischoff
  2017-02-28 17:57 ` Richard Henderson
  2017-02-28 23:10 ` Richard Henderson
  0 siblings, 2 replies; 12+ messages in thread
From: Eric Bischoff @ 2017-02-28 12:01 UTC (permalink / raw)
  To: Richard Henderson, Alexander Graf
  Cc: Michal Marek, Miroslav Benes, QEmu developers, Eric Bischoff

From: Eric Bischoff <ebischoff@nerim.net>

LPD = LOAD PAIR DISJOINT
Fourth patch
---
 target/s390x/insn-data.def |  4 ++-
 target/s390x/translate.c   | 63 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 66 insertions(+), 1 deletion(-)

diff --git a/target/s390x/insn-data.def b/target/s390x/insn-data.def
index 075ff59..72d1017 100644
--- a/target/s390x/insn-data.def
+++ b/target/s390x/insn-data.def
@@ -504,7 +504,9 @@
     C(0xb9e2, LOCGR,   RRF_c, LOC, r1, r2, r1, 0, loc, 0)
     C(0xebf2, LOC,     RSY_b, LOC, r1, m2_32u, new, r1_32, loc, 0)
     C(0xebe2, LOCG,    RSY_b, LOC, r1, m2_64, r1, 0, loc, 0)
-/* LOAD PAIR DISJOINT TODO */
+/* LOAD PAIR DISJOINT */
+    C(0xc804, LPD,     SSF,   ILA, 0, 0, 0, r3_P32, lpd32, 0)
+    C(0xc805, LPDG,    SSF,   ILA, 0, 0, 0, r3_P64, lpd64, 0)
 /* LOAD POSITIVE */
     C(0x1000, LPR,     RR_a,  Z,   0, r2_32s, new, r1_32, abs, abs32)
     C(0xb900, LPGR,    RRE,   Z,   0, r2, r1, 0, abs, abs64)
diff --git a/target/s390x/translate.c b/target/s390x/translate.c
index 01c6217..239d12b 100644
--- a/target/s390x/translate.c
+++ b/target/s390x/translate.c
@@ -2558,6 +2558,7 @@ static ExitStatus op_lctlg(DisasContext *s, DisasOps *o)
     tcg_temp_free_i32(r3);
     return NO_EXIT;
 }
+
 static ExitStatus op_lra(DisasContext *s, DisasOps *o)
 {
     check_privileged(s);
@@ -2750,6 +2751,52 @@ static ExitStatus op_lm64(DisasContext *s, DisasOps *o)
     return NO_EXIT;
 }
 
+static ExitStatus op_lpd32(DisasContext *s, DisasOps *o)
+{
+    TCGv_i64 a1, a2;
+
+    /* In a parallel context, stop the world and single step.  */
+    if (parallel_cpus) {
+        potential_page_fault(s);
+        gen_helper_exit_atomic(cpu_env);
+        return EXIT_NORETURN;
+    }
+
+    /* In a serial context, perform the two loads and indicate
+       that we performed them while interlocked.  */
+    a1 = get_address(s, 0, get_field(s->fields, b1), get_field(s->fields, d1));
+    a2 = get_address(s, 0, get_field(s->fields, b2), get_field(s->fields, d2));
+    o->out = tcg_temp_new_i64();
+    tcg_gen_qemu_ld32s(o->out, a1, get_mem_index(s));
+    o->out2 = tcg_temp_new_i64();
+    tcg_gen_qemu_ld32s(o->out2, a2, get_mem_index(s));
+    gen_op_movi_cc(s, 0);
+    return NO_EXIT;
+}
+
+static ExitStatus op_lpd64(DisasContext *s, DisasOps *o)
+{
+    TCGv_i64 a1, a2;
+
+    /* In a parallel context, stop the world and single step.  */
+    if (parallel_cpus) {
+        potential_page_fault(s);
+        gen_helper_exit_atomic(cpu_env);
+        return EXIT_NORETURN;
+    }
+
+    /* In a serial context, perform the two loads and indicate
+       that we performed them while interlocked.  */
+    a1 = get_address(s, 0, get_field(s->fields, b1), get_field(s->fields, d1));
+    a2 = get_address(s, 0, get_field(s->fields, b2), get_field(s->fields, d2));
+    o->out = tcg_temp_new_i64();
+    tcg_gen_qemu_ld64(o->out, a1, get_mem_index(s));
+    o->out2 = tcg_temp_new_i64();
+    tcg_gen_qemu_ld64(o->out2, a2, get_mem_index(s));
+    gen_op_movi_cc(s, 0);
+    return NO_EXIT;
+}
+
 #ifndef CONFIG_USER_ONLY
 static ExitStatus op_lura(DisasContext *s, DisasOps *o)
 {
@@ -4420,6 +4467,22 @@ static void wout_r1_D32(DisasContext *s, DisasFields *f, DisasOps *o)
 }
 #define SPEC_wout_r1_D32 SPEC_r1_even
 
+static void wout_r3_P32(DisasContext *s, DisasFields *f, DisasOps *o)
+{
+    int r3 = get_field(f, r3);
+    store_reg32_i64(r3, o->out);
+    store_reg32_i64(r3 + 1, o->out2);
+}
+#define SPEC_wout_r3_P32 SPEC_r3_even
+
+static void wout_r3_P64(DisasContext *s, DisasFields *f, DisasOps *o)
+{
+    int r3 = get_field(f, r3);
+    store_reg(r3, o->out);
+    store_reg(r3 + 1, o->out2);
+}
+#define SPEC_wout_r3_P64 SPEC_r3_even
+
 static void wout_e1(DisasContext *s, DisasFields *f, DisasOps *o)
 {
     store_freg32_i64(get_field(f, r1), o->out);
-- 
2.10.2

^ permalink raw reply related	[flat|nested] 12+ messages in thread
* [Qemu-devel] [PATCHv3] Adding support for LPD and LPDG instructions
@ 2017-02-28 11:35 Eric Bischoff
  2017-02-28 11:35 ` [Qemu-devel] [PATCH] " Eric Bischoff
  0 siblings, 1 reply; 12+ messages in thread
From: Eric Bischoff @ 2017-02-28 11:35 UTC (permalink / raw)
  To: Richard Henderson, Alexander Graf
  Cc: Michal Marek, Miroslav Benes, QEmu developers

Third patch, trying to do real interlocking

^ permalink raw reply	[flat|nested] 12+ messages in thread
[parent not found: <20170223115805.16688-1-ebischoff@suse.com>]
* [Qemu-devel] (no subject)
@ 2017-02-24 13:19 Eric Bischoff
  2017-02-24 13:19 ` [Qemu-devel] [PATCH] Adding support for LPD and LPDG instructions Eric Bischoff
  0 siblings, 1 reply; 12+ messages in thread
From: Eric Bischoff @ 2017-02-24 13:19 UTC (permalink / raw)
  To: qemu-devel

(forgot to CC the list, already sent to Richard Henderson and Alexander Graf)

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

end of thread, other threads:[~2017-02-28 23:10 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-02-27 11:22 [Qemu-devel] [PATCH v2] Adding support for LPD and LPDG instructions Eric Bischoff
2017-02-27 11:22 ` [Qemu-devel] [PATCH] " Eric Bischoff
2017-02-27 19:10   ` Richard Henderson
2017-02-28  8:58     ` Éric Bischoff
  -- strict thread matches above, loose matches on Subject: below --
2017-02-28 12:01 Eric Bischoff
2017-02-28 17:57 ` Richard Henderson
2017-02-28 23:10 ` Richard Henderson
2017-02-28 11:35 [Qemu-devel] [PATCHv3] " Eric Bischoff
2017-02-28 11:35 ` [Qemu-devel] [PATCH] " Eric Bischoff
2017-02-28 11:42   ` no-reply
     [not found] <20170223115805.16688-1-ebischoff@suse.com>
     [not found] ` <20170223115805.16688-2-ebischoff@suse.com>
     [not found]   ` <a26cf735-bbb6-5be7-7575-198ec55a3ecc@twiddle.net>
2017-02-26 16:10     ` Éric Bischoff
2017-02-27 10:48       ` Éric Bischoff
2017-02-24 13:19 [Qemu-devel] (no subject) Eric Bischoff
2017-02-24 13:19 ` [Qemu-devel] [PATCH] Adding support for LPD and LPDG instructions Eric Bischoff

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.