From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:55949) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1THOyQ-0003pw-MX for qemu-devel@nongnu.org; Thu, 27 Sep 2012 21:02:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1THOyP-0008NP-Ig for qemu-devel@nongnu.org; Thu, 27 Sep 2012 21:02:34 -0400 Received: from mail-pb0-f45.google.com ([209.85.160.45]:50231) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1THOyP-0008NL-Cf for qemu-devel@nongnu.org; Thu, 27 Sep 2012 21:02:33 -0400 Received: by pbbrp2 with SMTP id rp2so4388721pbb.4 for ; Thu, 27 Sep 2012 18:02:32 -0700 (PDT) Sender: Richard Henderson From: Richard Henderson Date: Thu, 27 Sep 2012 18:02:29 -0700 Message-Id: <1348794149-28151-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 126/147] target-s390: Implement COMPARE AND TRAP 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 | 11 +++++++++++ target-s390x/translate.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/target-s390x/insn-data.def b/target-s390x/insn-data.def index 5c19aef..b739d70 100644 --- a/target-s390x/insn-data.def +++ b/target-s390x/insn-data.def @@ -198,6 +198,17 @@ C(0xeb31, CDSY, RSY_a, LD, r1_D32, a2, new, r1_D32, cds, 0) C(0xeb3e, CDSG, RSY_a, Z, 0, a2, 0, 0, cdsg, 0) +/* COMPARE AND TRAP */ + D(0xb972, CRT, RRF_c, GIE, r1_32s, r2_32s, 0, 0, ct, 0, 0) + D(0xb960, CGRT, RRF_c, GIE, r1_o, r2_o, 0, 0, ct, 0, 0) + D(0xec72, CIT, RIE_a, GIE, r1_32s, i2, 0, 0, ct, 0, 0) + D(0xec70, CGIT, RIE_a, GIE, r1_o, i2, 0, 0, ct, 0, 0) +/* COMPARE LOGICAL AND TRAP */ + D(0xb973, CLRT, RRF_c, GIE, r1_32u, r2_32u, 0, 0, ct, 0, 1) + D(0xb961, CLGRT, RRF_c, GIE, r1_o, r2_o, 0, 0, ct, 0, 1) + D(0xec73, CLFIT, RIE_a, GIE, r1_32u, i2_32u, 0, 0, ct, 0, 1) + D(0xec71, CLGIT, RIE_a, GIE, r1_o, i2_32u, 0, 0, ct, 0, 0) + /* CONVERT TO DECIMAL */ C(0x4e00, CVD, RX_a, Z, r1_o, a2, 0, 0, cvd, 0) C(0xe326, CVDY, RXY_a, LD, r1_o, a2, 0, 0, cvd, 0) diff --git a/target-s390x/translate.c b/target-s390x/translate.c index 4489126..0c9df96 100644 --- a/target-s390x/translate.c +++ b/target-s390x/translate.c @@ -1705,6 +1705,35 @@ static ExitStatus op_cvd(DisasContext *s, DisasOps *o) return NO_EXIT; } +static ExitStatus op_ct(DisasContext *s, DisasOps *o) +{ + int m3 = get_field(s->fields, m3); + int lab = gen_new_label(); + TCGv_i32 t; + TCGCond c; + + /* Bit 3 of the m3 field is reserved and should be zero. + Choose to ignore it wrt the ltgt_cond table above. */ + c = tcg_invert_cond(ltgt_cond[m3 & 14]); + if (s->insn->data) { + c = tcg_unsigned_cond(c); + } + tcg_gen_brcond_i64(c, o->in1, o->in2, lab); + + /* Set DXC to 0xff. */ + t = tcg_temp_new_i32(); + tcg_gen_ld_i32(t, cpu_env, offsetof(CPUS390XState, fpc)); + tcg_gen_ori_i32(t, t, 0xff00); + tcg_gen_st_i32(t, cpu_env, offsetof(CPUS390XState, fpc)); + tcg_temp_free_i32(t); + + /* Trap. */ + gen_program_exception(s, PGM_DATA); + + gen_set_label(lab); + return NO_EXIT; +} + #ifndef CONFIG_USER_ONLY static ExitStatus op_diag(DisasContext *s, DisasOps *o) { -- 1.7.11.4