From patchwork Thu Jan 4 01:29:11 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Vivier X-Patchwork-Id: 855337 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zBrLb2YZJz9s72 for ; Thu, 4 Jan 2018 12:48:55 +1100 (AEDT) Received: from localhost ([::1]:44959 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eWueL-0006E5-C2 for incoming@patchwork.ozlabs.org; Wed, 03 Jan 2018 20:48:53 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58474) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eWuLX-0000vg-AG for qemu-devel@nongnu.org; Wed, 03 Jan 2018 20:29:30 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eWuLW-0007Ea-9r for qemu-devel@nongnu.org; Wed, 03 Jan 2018 20:29:27 -0500 Received: from mout.kundenserver.de ([217.72.192.73]:59349) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eWuLV-0007D7-VP for qemu-devel@nongnu.org; Wed, 03 Jan 2018 20:29:26 -0500 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue105 [212.227.15.183]) with ESMTPSA (Nemesis) id 0MF4A7-1eiErx421L-00GGOH; Thu, 04 Jan 2018 02:29:23 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Thu, 4 Jan 2018 02:29:11 +0100 Message-Id: <20180104012913.30763-16-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180104012913.30763-1-laurent@vivier.eu> References: <20180104012913.30763-1-laurent@vivier.eu> X-Provags-ID: V03:K0:bY0Z27urLKDDnVBWmAclk1ycG5AQdcyMoVVjUckAwmSyT8VARg3 4OE040tN4JeDMRPjmVLa1VS7XaNstSelYk/9nR5/1SQRmOySwkaKM6yDFvT4ASj7RN5XVcS 4i7uu9m0xbG0F1ULPytL93z8LQcfv5/uXm6ImVlZQOlVsloTJkH3KOECArvuRbqwR0pvzZi MchCjbUAaGJW1ZcQMdp+Q== X-UI-Out-Filterresults: notjunk:1; V01:K0:uqB/WKQeoAk=:9IfvZfAkch6j85+thQRiAV bdhKOApyfwMrivO7sThSL+hOIc9yl5z13yozJ25CumnkRv+QnFrmLYLZS4N0s9IhdLA3ivhT1 W0dloodTry0SUgWfPJkTsCz1/zGz1pc3etbys3/9I3QkDPLLeZfl0Ss+8IGxVyE1FXTJyfaCI 537bxPmWh3XSI5ZCJ3JIpD2HN9DfpTLnnB/OX/friH2CJrxcUaKHnt602yhoOroCIBdLzD1xM mCzjYUaXK2NvqA/PgoglxeY1IivJxo4fdnxGWkT+uULUR9mrhO5COM5istNIQiK/QjjBUYhzf USEmALygUUUZsLBiC3eS6eTAXaq6N/lQv4LC3pGjuIORiiMtkrf7QKpp3ACMztczP0lSVX3aT mPnOjVT00Jk8qxy1sFF4b8krIXSc8qqlYYsAlzJj/Tx5voUplobJs93GrZ4tVXYtM12RATyP/ MSBOTJ8rV5zdDUqDqM9qsmo5Hyin7qmsYy8AOwu4TPSI5Ol9YAgSBagmHK4KwcICz/ZOkfes8 Xo//bBsPumz0T2KMKeQPWo5RY4+9b15/2xqlkvLTtebK3f5TrIQaSymOmTaPV+0LefAvRXv5E GBT0KIFAPV144+jPUJjfUYb8fQ7iKSml06xvFEWVRe1XPH7OivQdcjtx+EhdMv5dnnbB2naPj l0R4HUrBYS5hoBamUKO0GRwMreMvFULV8of+xiFpzeubN/LuX+Jn9qzNYD2UDWUQW+HO23YYM 8Av1lXbYhesclS9BCIRoWkW2S/40D4QRSUPr8w== X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 217.72.192.73 Subject: [Qemu-devel] [PATCH v7 15/17] target/m68k: add andi/ori/eori to SR/CCR X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Thomas Huth , Richard Henderson , Laurent Vivier Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Signed-off-by: Laurent Vivier Reviewed-by: Richard Henderson --- target/m68k/translate.c | 53 ++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 46 insertions(+), 7 deletions(-) diff --git a/target/m68k/translate.c b/target/m68k/translate.c index 8f23cade04..499aaa2f3d 100644 --- a/target/m68k/translate.c +++ b/target/m68k/translate.c @@ -2201,6 +2201,7 @@ DISAS_INSN(arith_im) TCGv dest; TCGv addr; int opsize; + bool with_SR = ((insn & 0x3f) == 0x3c); op = (insn >> 9) & 7; opsize = insn_opsize(insn); @@ -2217,32 +2218,73 @@ DISAS_INSN(arith_im) default: abort(); } - SRC_EA(env, src1, opsize, 1, (op == 6) ? NULL : &addr); + + if (with_SR) { + /* SR/CCR can only be used with andi/eori/ori */ + if (op == 2 || op == 3 || op == 6) { + disas_undef(env, s, insn); + return; + } + switch (opsize) { + case OS_BYTE: + src1 = gen_get_ccr(s); + break; + case OS_WORD: + if (IS_USER(s)) { + gen_exception(s, s->insn_pc, EXCP_PRIVILEGE); + return; + } + src1 = gen_get_sr(s); + break; + case OS_LONG: + disas_undef(env, s, insn); + return; + } + } else { + SRC_EA(env, src1, opsize, 1, (op == 6) ? NULL : &addr); + } dest = tcg_temp_new(); switch (op) { case 0: /* ori */ tcg_gen_or_i32(dest, src1, im); - gen_logic_cc(s, dest, opsize); + if (with_SR) { + gen_set_sr(s, dest, opsize == OS_BYTE); + } else { + DEST_EA(env, insn, opsize, dest, &addr); + gen_logic_cc(s, dest, opsize); + } break; case 1: /* andi */ tcg_gen_and_i32(dest, src1, im); - gen_logic_cc(s, dest, opsize); + if (with_SR) { + gen_set_sr(s, dest, opsize == OS_BYTE); + } else { + DEST_EA(env, insn, opsize, dest, &addr); + gen_logic_cc(s, dest, opsize); + } break; case 2: /* subi */ tcg_gen_setcond_i32(TCG_COND_LTU, QREG_CC_X, src1, im); tcg_gen_sub_i32(dest, src1, im); gen_update_cc_add(dest, im, opsize); set_cc_op(s, CC_OP_SUBB + opsize); + DEST_EA(env, insn, opsize, dest, &addr); break; case 3: /* addi */ tcg_gen_add_i32(dest, src1, im); gen_update_cc_add(dest, im, opsize); tcg_gen_setcond_i32(TCG_COND_LTU, QREG_CC_X, dest, im); set_cc_op(s, CC_OP_ADDB + opsize); + DEST_EA(env, insn, opsize, dest, &addr); break; case 5: /* eori */ tcg_gen_xor_i32(dest, src1, im); - gen_logic_cc(s, dest, opsize); + if (with_SR) { + gen_set_sr(s, dest, opsize == OS_BYTE); + } else { + DEST_EA(env, insn, opsize, dest, &addr); + gen_logic_cc(s, dest, opsize); + } break; case 6: /* cmpi */ gen_update_cc_cmp(s, src1, im, opsize); @@ -2251,9 +2293,6 @@ DISAS_INSN(arith_im) abort(); } tcg_temp_free(im); - if (op != 6) { - DEST_EA(env, insn, opsize, dest, &addr); - } tcg_temp_free(dest); }