From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59552) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VR3aR-0004Fb-0z for qemu-devel@nongnu.org; Tue, 01 Oct 2013 13:18:20 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VR3aK-0000EN-FN for qemu-devel@nongnu.org; Tue, 01 Oct 2013 13:18:14 -0400 Received: from mail-qa0-x22c.google.com ([2607:f8b0:400d:c00::22c]:55886) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VR3aK-0000EJ-AP for qemu-devel@nongnu.org; Tue, 01 Oct 2013 13:18:08 -0400 Received: by mail-qa0-f44.google.com with SMTP id j7so3594600qaq.10 for ; Tue, 01 Oct 2013 10:18:07 -0700 (PDT) Sender: Richard Henderson From: Richard Henderson Date: Tue, 1 Oct 2013 10:17:20 -0700 Message-Id: <1380647845-16793-5-git-send-email-rth@twiddle.net> In-Reply-To: <1380647845-16793-1-git-send-email-rth@twiddle.net> References: <1380647845-16793-1-git-send-email-rth@twiddle.net> Subject: [Qemu-devel] [PATCH v2 4/9] target-s390: Implement EPSW List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: agraf@suse.de Signed-off-by: Richard Henderson --- target-s390x/insn-data.def | 2 ++ target-s390x/translate.c | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/target-s390x/insn-data.def b/target-s390x/insn-data.def index c528eb4..48850ff 100644 --- a/target-s390x/insn-data.def +++ b/target-s390x/insn-data.def @@ -287,6 +287,8 @@ C(0xb24f, EAR, RRE, Z, 0, 0, new, r1_32, ear, 0) /* EXTRACT FPC */ C(0xb38c, EFPC, RRE, Z, 0, 0, new, r1_32, efpc, 0) +/* EXTRACT PSW */ + C(0xb98d, EPSW, RRE, Z, 0, 0, 0, 0, epsw, 0) /* FIND LEFTMOST ONE */ C(0xb983, FLOGR, RRE, EI, 0, r2_o, r1_P, 0, flogr, 0) diff --git a/target-s390x/translate.c b/target-s390x/translate.c index f8732bb..c1ea060 100644 --- a/target-s390x/translate.c +++ b/target-s390x/translate.c @@ -2036,6 +2036,24 @@ static ExitStatus op_efpc(DisasContext *s, DisasOps *o) return NO_EXIT; } +static ExitStatus op_epsw(DisasContext *s, DisasOps *o) +{ + int r1 = get_field(s->fields, r1); + int r2 = get_field(s->fields, r2); + TCGv_i64 t = tcg_temp_new_i64(); + + /* Note the "subsequently" in the PoO, which implies a defined result + if r1 == r2. Thus we cannot defer these writes to an output hook. */ + tcg_gen_shri_i64(t, psw_mask, 32); + store_reg32_i64(r1, t); + if (r2 != 0) { + store_reg32_i64(r2, psw_mask); + } + + tcg_temp_free_i64(t); + return NO_EXIT; +} + static ExitStatus op_ex(DisasContext *s, DisasOps *o) { /* ??? Perhaps a better way to implement EXECUTE is to set a bit in -- 1.8.1.4