From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:56300) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1THP0U-0005g2-6A for qemu-devel@nongnu.org; Thu, 27 Sep 2012 21:04:42 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1THP0S-0000BH-WE for qemu-devel@nongnu.org; Thu, 27 Sep 2012 21:04:41 -0400 Received: from mail-pb0-f45.google.com ([209.85.160.45]:51541) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1THP0S-0000BD-Pm for qemu-devel@nongnu.org; Thu, 27 Sep 2012 21:04:40 -0400 Received: by pbbrp2 with SMTP id rp2so4390745pbb.4 for ; Thu, 27 Sep 2012 18:04:40 -0700 (PDT) Sender: Richard Henderson From: Richard Henderson Date: Thu, 27 Sep 2012 18:04:36 -0700 Message-Id: <1348794276-28238-1-git-send-email-rth@twiddle.net> In-Reply-To: <1348785610-23418-1-git-send-email-rth@twiddle.net> References: <1348785610-23418-1-git-send-email-rth@twiddle.net> Subject: [Qemu-devel] [PATCH 128/147] target-s390: Implement STORE ON CONDITION List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Alexander Graf Signed-off-by: Richard Henderson --- target-s390x/insn-data.def | 3 +++ target-s390x/translate.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/target-s390x/insn-data.def b/target-s390x/insn-data.def index 91ee055..00b95b6 100644 --- a/target-s390x/insn-data.def +++ b/target-s390x/insn-data.def @@ -601,6 +601,9 @@ C(0xe370, STHY, RXY_a, LD, r1_o, a2, 0, 0, st16, 0) /* STORE HALFWORD RELATIVE LONG */ C(0xc407, STHRL, RIL_b, GIE, r1_o, ri2, 0, 0, st16, 0) +/* STORE ON CONDITION */ + D(0xebf3, STOC, RSY_b, LOC, 0, 0, 0, 0, soc, 0, 0) + D(0xebe3, STOCG, RSY_b, LOC, 0, 0, 0, 0, soc, 0, 1) /* STORE REVERSED */ C(0xe33f, STRVH, RXY_a, Z, la2, r1_16u, new, m1_16, rev16, 0) C(0xe33e, STRV, RXY_a, Z, la2, r1_32u, new, m1_32, rev32, 0) diff --git a/target-s390x/translate.c b/target-s390x/translate.c index 130b88e..a0590f0 100644 --- a/target-s390x/translate.c +++ b/target-s390x/translate.c @@ -2747,6 +2747,35 @@ static ExitStatus op_sigp(DisasContext *s, DisasOps *o) } #endif +static ExitStatus op_soc(DisasContext *s, DisasOps *o) +{ + DisasCompare c; + TCGv_i64 a; + int lab, r1; + + disas_jcc(s, &c, get_field(s->fields, m3)); + + lab = gen_new_label(); + if (c.is_64) { + tcg_gen_brcond_i64(c.cond, c.u.s64.a, c.u.s64.b, lab); + } else { + tcg_gen_brcond_i32(c.cond, c.u.s32.a, c.u.s32.b, lab); + } + free_compare(&c); + + r1 = get_field(s->fields, r1); + a = get_address(s, 0, get_field(s->fields, b2), get_field(s->fields, d2)); + if (s->insn->data) { + tcg_gen_qemu_st64(regs[r1], a, get_mem_index(s)); + } else { + tcg_gen_qemu_st32(regs[r1], a, get_mem_index(s)); + } + tcg_temp_free_i64(a); + + gen_set_label(lab); + return NO_EXIT; +} + static ExitStatus op_sla(DisasContext *s, DisasOps *o) { uint64_t sign = 1ull << s->insn->data; -- 1.7.11.4