From patchwork Thu Jan 4 16:42:49 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Vivier X-Patchwork-Id: 855722 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 3zCDQv0jzmz9s7G for ; Fri, 5 Jan 2018 03:53:59 +1100 (AEDT) Received: from localhost ([::1]:50238 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eX8mD-0001oi-67 for incoming@patchwork.ozlabs.org; Thu, 04 Jan 2018 11:53:57 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55437) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eX8be-0007cA-Od for qemu-devel@nongnu.org; Thu, 04 Jan 2018 11:43:08 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eX8bc-0003ew-TO for qemu-devel@nongnu.org; Thu, 04 Jan 2018 11:43:02 -0500 Received: from mout.kundenserver.de ([212.227.126.135]:53387) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eX8bc-0003cO-Fh for qemu-devel@nongnu.org; Thu, 04 Jan 2018 11:43:00 -0500 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue003 [212.227.15.167]) with ESMTPSA (Nemesis) id 0MNyIR-1eZ2Ph3iV1-007SDE; Thu, 04 Jan 2018 17:42:59 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Thu, 4 Jan 2018 17:42:49 +0100 Message-Id: <20180104164251.26494-16-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180104164251.26494-1-laurent@vivier.eu> References: <20180104164251.26494-1-laurent@vivier.eu> X-Provags-ID: V03:K0:Pib3V+dC3az0vFKk9nRgaqYMR03FjrtcsWRYrcdcsrhKxOiOpmd 6ZzoxZr+v8UTsv2DuHk9WeRLHLbvem1s/P3wcvDshjXqAe6Atc2VlHV5U2untOlpDT2a/a4 p42oyEJRZmR3M9EFVJLfyckLxZX91Pt/5s5bxC6cCoJTqB3awZcYQ9UuGT9xHc6EvzxgTEb KkAVyVya8BrQqpS+vAo4Q== X-UI-Out-Filterresults: notjunk:1; V01:K0:l6kBbbrGHsE=:vFFHZtxFNjyeHNVsTuIfKh hGw2EHQ9a5T5rFpErPqKy5azcNM1mws//xB2Mbwj0vFz2ceky1ITjInPjnPCECbVIgrhJK6Q8 FTHuv2cVnOp+DkenbZzwai18vfIy9f9ZB2Ye3P97KUYiLnxiJ/wI9r8be7D5m5ug9KJVyN9H8 HhShWCKLrTpYAG6N57BmAHt/S9cIBkB3rKqOo4K7EUXwLdraMPiCCcg0v9gIzvVp8d/KKynnx +OJf4v7MSm774hKH9r2aqNqHVnDW/dWiEBPLtAEhpgCdKKqTwk6fHHGh9T8XNQsHyCH9XqlVy rmcccLSnWcfdswkNnaifhcHy2RnHn2CjW8SflpulHEMX3amsmP7JFTnbByIUqDA1/slAOQo3r zsCmJjvoMpMiTIyJfkSmgjJDQKsHYYMKx9cw49rwrRYT0SpIOCuq9gKSLNXlz8Xrd55kSCtbS fI7d6uz3fxwsfzrJuojp503jJe5hNf7eRPM6Hft3d2QijQJKRqjXITo6rmU7eocsjKqRC8lt+ tGhYxO37x05XIA7uHUZeVVJY3HKWnn0I1J7gYQuKLa8mkoRcmP206wA1FzDHQ092kpEWY26Ci KXEhKBCqqKoneoCtlFyB9pHyRX2KRu9QwvEnZTWv5IGpG9wXs5TX1ljelufoOGF9H1ZRoS671 mHnYlBdj4DjQ9nERcKfpiaua2M1g6SY2X2KBKqeI2hDRad3RktgwlmXTvEwWgoKMdfRaCCf3i TY9jqhJcA2PFIwCZgAhRgSiT6yWv3bD5PelmMTxB8jpAK+LWiQi85gU3ymA= X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 212.227.126.135 Subject: [Qemu-devel] [PULL 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: 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 Message-Id: <20180104012913.30763-16-laurent@vivier.eu> --- 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); }