From nobody Mon Feb 9 22:39:12 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487022866409411.6228573763975; Mon, 13 Feb 2017 13:54:26 -0800 (PST) Received: from localhost ([::1]:59750 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdOZl-0005nI-6b for importer@patchew.org; Mon, 13 Feb 2017 16:54:25 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45629) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdO90-00059D-L0 for qemu-devel@nongnu.org; Mon, 13 Feb 2017 16:26:48 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdO8w-0001cr-2f for qemu-devel@nongnu.org; Mon, 13 Feb 2017 16:26:46 -0500 Received: from mail-qk0-x242.google.com ([2607:f8b0:400d:c09::242]:34999) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cdO8v-0001cc-V6 for qemu-devel@nongnu.org; Mon, 13 Feb 2017 16:26:42 -0500 Received: by mail-qk0-x242.google.com with SMTP id u25so16699117qki.2 for ; Mon, 13 Feb 2017 13:26:41 -0800 (PST) Received: from bigtime.twiddle.net.com ([1.129.9.91]) by smtp.gmail.com with ESMTPSA id h40sm8311480qtb.6.2017.02.13.13.26.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 13 Feb 2017 13:26:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=y2RzOjsWSCB0/sq9Mgd4iFB+/JjU8kczz3FmmfZk0Gk=; b=FYP19PP0JIid13QG6uem0nAQtzpFypglT+hCYn9xfOBk9FkxrX8qPXoBnJpsfYsr5O a2wtokEUfRdf2/KUBp32hoTfgjhbUTNnHhI1AE4iHrXU/2DcHb7C+nS2M8iTLiw7BEOj LGdvQSqL3s21nIpcwHgeYsQIu0PD05edgc+PV692VE8QcRAH0bCwgJ8m8EVyctG6QNsg HlyFFHtLM/OuIQ2VnvZ3CQy4GNN2Ej/DtG8DeZw7UpV2XNzzjAc5PosKY4uNlE5ILOkD cYQSw1u/MCoP1XBF5dTCMhotl+qYf7wMeer5mqBz1IEzz70O3Wo4z+eDjYlzUBTFYf9D bk9A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=y2RzOjsWSCB0/sq9Mgd4iFB+/JjU8kczz3FmmfZk0Gk=; b=ZKftQhvQE37aW71i8rrYEe7LH9NMEVlaB61LL6vIWeX6eaE9eLnGxIMFu757AenS6v pcw3iew3nZ0PDsHQIBBmjs7DWmNoK6ftyirOJT66Fou3fwRjtcGWf0/dVNgNLFbkdnjp jQKmIm/+jglA5HUmlT+7hUjMuhfTB7XryoDyjJbG9F5bdnt2Q9DObRvwkEgIaF3RhL6o tXCtLlaqpUefdS69s1s7weKroIFRS5kIkcRk1L3h607PdNKueOm5aS0ASokDf5ui9fww pD4WKU+4eMwthF+TT11XiK5QvoOR/JYcscuudNBQYI/ro4ZKRI6gynXaam3jEmfTbFD9 YGvA== X-Gm-Message-State: AMke39kK7B1bVd3FEAPL/ccVIJjNK8imnBLjkc5VLBQIay2cNlnetStrRJ2ry2APu4A/6w== X-Received: by 10.55.123.129 with SMTP id w123mr23374910qkc.20.1487021201388; Mon, 13 Feb 2017 13:26:41 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Tue, 14 Feb 2017 08:25:31 +1100 Message-Id: <20170213212536.31871-20-rth@twiddle.net> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170213212536.31871-1-rth@twiddle.net> References: <20170213212536.31871-1-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2607:f8b0:400d:c09::242 Subject: [Qemu-devel] [PULL 19/24] target/openrisc: Implement muld, muldu, macu, msbu 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: peter.maydell@linaro.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Reviewed-by: Bastian Koppelmann Signed-off-by: Richard Henderson --- target/openrisc/translate.c | 108 ++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 108 insertions(+) diff --git a/target/openrisc/translate.c b/target/openrisc/translate.c index 82b8bec..ce9672e 100644 --- a/target/openrisc/translate.c +++ b/target/openrisc/translate.c @@ -362,6 +362,56 @@ static void gen_divu(DisasContext *dc, TCGv dest, TCGv= srca, TCGv srcb) gen_ove_cy(dc); } =20 +static void gen_muld(DisasContext *dc, TCGv srca, TCGv srcb) +{ + TCGv_i64 t1 =3D tcg_temp_new_i64(); + TCGv_i64 t2 =3D tcg_temp_new_i64(); + + tcg_gen_ext_tl_i64(t1, srca); + tcg_gen_ext_tl_i64(t2, srcb); + if (TARGET_LONG_BITS =3D=3D 32) { + tcg_gen_mul_i64(cpu_mac, t1, t2); + tcg_gen_movi_tl(cpu_sr_ov, 0); + } else { + TCGv_i64 high =3D tcg_temp_new_i64(); + + tcg_gen_muls2_i64(cpu_mac, high, t1, t2); + tcg_gen_sari_i64(t1, cpu_mac, 63); + tcg_gen_setcond_i64(TCG_COND_NE, t1, t1, high); + tcg_temp_free_i64(high); + tcg_gen_trunc_i64_tl(cpu_sr_ov, t1); + tcg_gen_neg_tl(cpu_sr_ov, cpu_sr_ov); + + gen_ove_ov(dc); + } + tcg_temp_free_i64(t1); + tcg_temp_free_i64(t2); +} + +static void gen_muldu(DisasContext *dc, TCGv srca, TCGv srcb) +{ + TCGv_i64 t1 =3D tcg_temp_new_i64(); + TCGv_i64 t2 =3D tcg_temp_new_i64(); + + tcg_gen_extu_tl_i64(t1, srca); + tcg_gen_extu_tl_i64(t2, srcb); + if (TARGET_LONG_BITS =3D=3D 32) { + tcg_gen_mul_i64(cpu_mac, t1, t2); + tcg_gen_movi_tl(cpu_sr_cy, 0); + } else { + TCGv_i64 high =3D tcg_temp_new_i64(); + + tcg_gen_mulu2_i64(cpu_mac, high, t1, t2); + tcg_gen_setcondi_i64(TCG_COND_NE, high, high, 0); + tcg_gen_trunc_i64_tl(cpu_sr_cy, high); + tcg_temp_free_i64(high); + + gen_ove_cy(dc); + } + tcg_temp_free_i64(t1); + tcg_temp_free_i64(t2); +} + static void gen_mac(DisasContext *dc, TCGv srca, TCGv srcb) { TCGv_i64 t1 =3D tcg_temp_new_i64(); @@ -388,6 +438,25 @@ static void gen_mac(DisasContext *dc, TCGv srca, TCGv = srcb) gen_ove_ov(dc); } =20 +static void gen_macu(DisasContext *dc, TCGv srca, TCGv srcb) +{ + TCGv_i64 t1 =3D tcg_temp_new_i64(); + TCGv_i64 t2 =3D tcg_temp_new_i64(); + + tcg_gen_extu_tl_i64(t1, srca); + tcg_gen_extu_tl_i64(t2, srcb); + tcg_gen_mul_i64(t1, t1, t2); + tcg_temp_free_i64(t2); + + /* Note that overflow is only computed during addition stage. */ + tcg_gen_add_i64(cpu_mac, cpu_mac, t1); + tcg_gen_setcond_i64(TCG_COND_LTU, t1, cpu_mac, t1); + tcg_gen_trunc_i64_tl(cpu_sr_cy, t1); + tcg_temp_free_i64(t1); + + gen_ove_cy(dc); +} + static void gen_msb(DisasContext *dc, TCGv srca, TCGv srcb) { TCGv_i64 t1 =3D tcg_temp_new_i64(); @@ -414,6 +483,25 @@ static void gen_msb(DisasContext *dc, TCGv srca, TCGv = srcb) gen_ove_ov(dc); } =20 +static void gen_msbu(DisasContext *dc, TCGv srca, TCGv srcb) +{ + TCGv_i64 t1 =3D tcg_temp_new_i64(); + TCGv_i64 t2 =3D tcg_temp_new_i64(); + + tcg_gen_extu_tl_i64(t1, srca); + tcg_gen_extu_tl_i64(t2, srcb); + tcg_gen_mul_i64(t1, t1, t2); + + /* Note that overflow is only computed during subtraction stage. */ + tcg_gen_setcond_i64(TCG_COND_LTU, t2, cpu_mac, t1); + tcg_gen_sub_i64(cpu_mac, cpu_mac, t1); + tcg_gen_trunc_i64_tl(cpu_sr_cy, t2); + tcg_temp_free_i64(t2); + tcg_temp_free_i64(t1); + + gen_ove_cy(dc); +} + static void gen_lwa(DisasContext *dc, TCGv rd, TCGv ra, int32_t ofs) { TCGv ea =3D tcg_temp_new(); @@ -590,6 +678,11 @@ static void dec_calc(DisasContext *dc, uint32_t insn) gen_mul(dc, cpu_R[rd], cpu_R[ra], cpu_R[rb]); return; =20 + case 0x7: /* l.muld */ + LOG_DIS("l.muld r%d, r%d\n", ra, rb); + gen_muld(dc, cpu_R[ra], cpu_R[rb]); + break; + case 0x9: /* l.div */ LOG_DIS("l.div r%d, r%d, r%d\n", rd, ra, rb); gen_div(dc, cpu_R[rd], cpu_R[ra], cpu_R[rb]); @@ -604,6 +697,11 @@ static void dec_calc(DisasContext *dc, uint32_t insn) LOG_DIS("l.mulu r%d, r%d, r%d\n", rd, ra, rb); gen_mulu(dc, cpu_R[rd], cpu_R[ra], cpu_R[rb]); return; + + case 0xc: /* l.muldu */ + LOG_DIS("l.muldu r%d, r%d\n", ra, rb); + gen_muldu(dc, cpu_R[ra], cpu_R[rb]); + return; } break; } @@ -916,6 +1014,16 @@ static void dec_mac(DisasContext *dc, uint32_t insn) gen_msb(dc, cpu_R[ra], cpu_R[rb]); break; =20 + case 0x0003: /* l.macu */ + LOG_DIS("l.macu r%d, r%d\n", ra, rb); + gen_macu(dc, cpu_R[ra], cpu_R[rb]); + break; + + case 0x0004: /* l.msbu */ + LOG_DIS("l.msbu r%d, r%d\n", ra, rb); + gen_msbu(dc, cpu_R[ra], cpu_R[rb]); + break; + default: gen_illegal_exception(dc); break; --=20 2.9.3