From patchwork Thu Sep 8 22:31:52 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Rolnik X-Patchwork-Id: 9322245 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 0195560231 for ; Thu, 8 Sep 2016 22:44:03 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D7C1129A32 for ; Thu, 8 Sep 2016 22:44:02 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id CC4D129A36; Thu, 8 Sep 2016 22:44:02 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 5027829A35 for ; Thu, 8 Sep 2016 22:44:02 +0000 (UTC) Received: from localhost ([::1]:54485 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bi837-0003ay-B5 for patchwork-qemu-devel@patchwork.kernel.org; Thu, 08 Sep 2016 18:44:01 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44633) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bi7sL-0003B1-BX for qemu-devel@nongnu.org; Thu, 08 Sep 2016 18:32:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bi7sJ-0000is-89 for qemu-devel@nongnu.org; Thu, 08 Sep 2016 18:32:52 -0400 Received: from mail-wm0-x244.google.com ([2a00:1450:400c:c09::244]:32924) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bi7sI-0000ij-UM for qemu-devel@nongnu.org; Thu, 08 Sep 2016 18:32:51 -0400 Received: by mail-wm0-x244.google.com with SMTP id b187so209255wme.0 for ; Thu, 08 Sep 2016 15:32:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=beULGZQaC9ATLvTJy2OiHpvKgXURCod4ESC7xBYc1Ow=; b=sRs+QYX2eo/HCzlXR289gqaKwtWnEQkXCHrLFczS87ximenotSvmAWY4n/lxgr4y4E cgx/8C2JCmtLQo80FtPWOFmUi6gEArAA+17F+eV5PpvbwBwFtH13T2o59VcMDUeGGTWM zEkQIjHbcnHmBTFH4rLFtWaoqVY3mR5ZTt+wywe35hFlC2Gl/w139TzuQ2Kcny2Ss3Gu 08TJK4KwRd/BLRAED5OF3BR6FQz5rllU6xiTP1Gmo4Lo1Ua6q2Zy3EEm+B859RlhIDL2 wZUaa5P0YYPE3RlxPqpFb2QY9bQwkiO00GWn+7s2LgzXK4C0xJ9q5dFLt+J5uDmxU15Q GvlQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=beULGZQaC9ATLvTJy2OiHpvKgXURCod4ESC7xBYc1Ow=; b=McD3klwX82uq3WVySrj7oS2QKG+oSrvJnyaMC5CmZqT6IzdHOpDYLr9LBitJ8/6TTw hkhb5Ph3YDr3FL3GDXXBFMOyWsme8UCT/u1anIOEB2QsanlM9clU4kqc0YneY+ENHatu JJGrrv7XrZ2wzySBvEqqI1ag7hz44YF0pHw8lCxjIHNLr2antHja6e1yUAt37ZISOYqB gSv1xD0nDlXrD5haiIWNEyJmb4rUqr3y2VRoV1DXJErhqdqqkiqKKLCuHGlmlEFcBmOc ww0LZNU02jtmtldCW4JzIhG2lCSfhmsThfdVd1/QBvoGPd8r7Sk1ZxMxVAp841DJdqib MzgA== X-Gm-Message-State: AE9vXwM0vRHEO2QjaKTExujjJ3y7HUlVfICG64GIpND6Hq7HCpF+Oevkf21lqx/aLE64oQ== X-Received: by 10.28.52.2 with SMTP id b2mr2319578wma.109.1473373970096; Thu, 08 Sep 2016 15:32:50 -0700 (PDT) Received: from a0999b0126e1.ant.amazon.com ([94.230.86.12]) by smtp.gmail.com with ESMTPSA id d8sm276298wmi.0.2016.09.08.15.32.49 (version=TLS1 cipher=AES128-SHA bits=128/128); Thu, 08 Sep 2016 15:32:49 -0700 (PDT) From: Michael Rolnik To: qemu-devel@nongnu.org Date: Fri, 9 Sep 2016 01:31:52 +0300 Message-Id: <1473373930-31547-12-git-send-email-mrolnik@gmail.com> X-Mailer: git-send-email 2.4.9 (Apple Git-60) In-Reply-To: <1473373930-31547-1-git-send-email-mrolnik@gmail.com> References: <1473373930-31547-1-git-send-email-mrolnik@gmail.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a00:1450:400c:c09::244 Subject: [Qemu-devel] [PATCH RFC v1 11/29] target-arc: BCLR, BMSK, BSET, BTST, BXOR 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: Michael Rolnik Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP Signed-off-by: Michael Rolnik --- target-arc/translate-inst.c | 139 ++++++++++++++++++++++++++++++++++++++++++++ target-arc/translate-inst.h | 6 ++ 2 files changed, 145 insertions(+) diff --git a/target-arc/translate-inst.c b/target-arc/translate-inst.c index 2a579f8..91b7037 100644 --- a/target-arc/translate-inst.c +++ b/target-arc/translate-inst.c @@ -1169,3 +1169,142 @@ int arc_gen_PUSH(DisasCtxt *ctx, TCGv src1) return BS_NONE; } +/* + BCLR +*/ +int arc_gen_BCLR(DisasCtxt *ctx, TCGv dest, TCGv src1, TCGv src2) +{ + TCGv rslt = dest; + + if (TCGV_EQUAL(dest, src1) || TCGV_EQUAL(dest, src2)) { + rslt = tcg_temp_new_i32(); + } + + tcg_gen_andi_tl(rslt, src2, 0x3f); + tcg_gen_shr_tl(rslt, ctx->one, rslt); + tcg_gen_andc_tl(rslt, src1, rslt); /* rslt = src1 & ~(1 << src2) */ + + if (ctx->opt.f) { + tcg_gen_setcond_tl(TCG_COND_EQ, cpu_Zf, rslt, ctx->zero); + tcg_gen_shri_tl(cpu_Nf, rslt, 31); + } + + if (!TCGV_EQUAL(dest, rslt)) { + tcg_gen_mov_tl(dest, rslt); + tcg_temp_free_i32(rslt); + } + + return BS_NONE; +} + +/* + BMSK +*/ +int arc_gen_BMSK(DisasCtxt *ctx, TCGv dest, TCGv src1, TCGv src2) +{ + TCGv rslt = dest; + TCGv mask = tcg_temp_new_i32(); + + if (TCGV_EQUAL(dest, src1) || TCGV_EQUAL(dest, src2)) { + rslt = tcg_temp_new_i32(); + } + + tcg_gen_andi_tl(mask, src2, 0x3f); + tcg_gen_add_tl(mask, mask, ctx->one); + tcg_gen_shr_tl(mask, ctx->one, mask); + tcg_gen_sub_tl(mask, mask, ctx->one); + + tcg_gen_and_tl(rslt, src1, mask); + + if (ctx->opt.f) { + tcg_gen_setcond_tl(TCG_COND_EQ, cpu_Zf, rslt, ctx->zero); + tcg_gen_shri_tl(cpu_Nf, rslt, 31); + } + + if (!TCGV_EQUAL(dest, rslt)) { + tcg_gen_mov_tl(dest, rslt); + tcg_temp_free_i32(rslt); + } + + tcg_temp_free_i32(mask); + + return BS_NONE; +} + +/* + BSET +*/ +int arc_gen_BSET(DisasCtxt *ctx, TCGv dest, TCGv src1, TCGv src2) +{ + TCGv rslt = dest; + + if (TCGV_EQUAL(dest, src1) || TCGV_EQUAL(dest, src2)) { + rslt = tcg_temp_new_i32(); + } + + tcg_gen_andi_tl(rslt, src2, 0x3f); + tcg_gen_shr_tl(rslt, ctx->one, rslt); + tcg_gen_or_tl(rslt, src1, rslt); /* rslt = src1 | (1 << src2) */ + + if (ctx->opt.f) { + tcg_gen_setcond_tl(TCG_COND_EQ, cpu_Zf, rslt, ctx->zero); + tcg_gen_shri_tl(cpu_Nf, rslt, 31); + } + + if (!TCGV_EQUAL(dest, rslt)) { + tcg_gen_mov_tl(dest, rslt); + tcg_temp_free_i32(rslt); + } + + return BS_NONE; +} + +/* + BTST +*/ +int arc_gen_BTST(DisasCtxt *ctx, TCGv src1, TCGv src2) +{ + TCGv rslt = tcg_temp_new_i32(); + + tcg_gen_andi_tl(rslt, src2, 0x3f); + tcg_gen_shr_tl(rslt, ctx->one, rslt); + tcg_gen_and_tl(rslt, src1, rslt); /* rslt = src1 & (1 << src2) */ + + if (ctx->opt.f) { + tcg_gen_setcond_tl(TCG_COND_EQ, cpu_Zf, rslt, ctx->zero); + tcg_gen_shri_tl(cpu_Nf, rslt, 31); + } + + tcg_temp_free_i32(rslt); + + return BS_NONE; +} + +/* + BXOR +*/ +int arc_gen_BXOR(DisasCtxt *ctx, TCGv dest, TCGv src1, TCGv src2) +{ + TCGv rslt = dest; + + if (TCGV_EQUAL(dest, src1) || TCGV_EQUAL(dest, src2)) { + rslt = tcg_temp_new_i32(); + } + + tcg_gen_andi_tl(rslt, src2, 0x3f); + tcg_gen_shr_tl(rslt, ctx->one, rslt); + tcg_gen_xor_tl(rslt, src1, rslt); /* rslt = src1 ^ (1 << src2) */ + + if (ctx->opt.f) { + tcg_gen_setcond_tl(TCG_COND_EQ, cpu_Zf, rslt, ctx->zero); + tcg_gen_shri_tl(cpu_Nf, rslt, 31); + } + + if (!TCGV_EQUAL(dest, rslt)) { + tcg_gen_mov_tl(dest, rslt); + tcg_temp_free_i32(rslt); + } + + return BS_NONE; +} + diff --git a/target-arc/translate-inst.h b/target-arc/translate-inst.h index d088a43..88cae1c 100644 --- a/target-arc/translate-inst.h +++ b/target-arc/translate-inst.h @@ -78,3 +78,9 @@ int arc_gen_NOT(DisasCtxt *c, TCGv dest, TCGv src1); int arc_gen_POP(DisasCtxt *c, TCGv src1); int arc_gen_PUSH(DisasCtxt *c, TCGv src1); +int arc_gen_BCLR(DisasCtxt *c, TCGv dest, TCGv src1, TCGv src2); +int arc_gen_BMSK(DisasCtxt *c, TCGv dest, TCGv src1, TCGv src2); +int arc_gen_BSET(DisasCtxt *c, TCGv dest, TCGv src1, TCGv src2); +int arc_gen_BTST(DisasCtxt *c, TCGv src1, TCGv src2); +int arc_gen_BXOR(DisasCtxt *c, TCGv dest, TCGv src1, TCGv src2); +