From: cupertinomiranda@gmail.com
To: qemu-devel@nongnu.org
Cc: shahab@synopsys.com, linux-snps-arc@lists.infradead.org,
claziss@synopsys.com, cmiranda@synopsys.com
Subject: [PATCH 21/27] arcv3: TCG instruction generator changes
Date: Mon, 5 Apr 2021 15:31:32 +0100 [thread overview]
Message-ID: <20210405143138.17016-22-cupertinomiranda@gmail.com> (raw)
In-Reply-To: <20210405143138.17016-1-cupertinomiranda@gmail.com>
From: Cupertino Miranda <cmiranda@synopsys.com>
---
target/arc/translate.c | 180 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 180 insertions(+)
diff --git a/target/arc/translate.c b/target/arc/translate.c
index 1712fcc9c3..6b2102394f 100644
--- a/target/arc/translate.c
+++ b/target/arc/translate.c
@@ -303,6 +303,15 @@ static bool read_and_decode_context(DisasContext *ctx,
cpu_ldl_code(ctx->env,
ctx->cpc + length));
length += 4;
+#ifdef TARGET_ARCV3
+ } else if(ctx->insn.signed_limm_p) {
+ ctx->insn.limm = ARRANGE_ENDIAN(true,
+ cpu_ldl_code (ctx->env,
+ ctx->cpc + length));
+ if(ctx->insn.limm & 0x80000000)
+ ctx->insn.limm += 0xffffffff00000000;
+ length += 4;
+#endif
} else {
ctx->insn.limm = 0;
}
@@ -747,7 +756,14 @@ arc_gen_SR(DisasCtxt *ctx, TCGv src2, TCGv src1)
{
int ret = DISAS_NEXT;
+#ifdef TARGET_ARCV2
+ writeAuxReg(src2, src1);
+#elif TARGET_ARCV3
+ TCGv temp = tcg_temp_local_new();
+ tcg_gen_andi_tl(temp, src1, 0xffffffff);
writeAuxReg(src2, src1);
+ tcg_temp_free(temp);
+#endif
return ret;
}
int
@@ -770,6 +786,169 @@ arc_gen_SYNC(DisasCtxt *ctx)
}
+#ifdef TARGET_ARCV3
+/*
+ * The mpyl instruction is a 64x64 signed multipler that produces
+ * a 64-bit product (the lower 64-bit of the actual prodcut).
+ */
+int
+arc_gen_MPYL(DisasCtxt *ctx, TCGv a, TCGv b, TCGv c)
+{
+ if ((getFFlag () == true)) {
+ arc_gen_excp(ctx, EXCP_INST_ERROR, 0, 0);
+ return DISAS_NEXT;
+ }
+
+ TCGLabel *done = gen_new_label();
+
+ if (ctx->insn.cc) {
+ TCGv cc = tcg_temp_local_new();
+ arc_gen_verifyCCFlag(ctx, cc);
+ tcg_gen_brcondi_tl(TCG_COND_NE, cc, 1, done);
+ tcg_temp_free(cc);
+ }
+
+ TCGv_i64 lo = tcg_temp_local_new_i64();
+ TCGv_i64 hi = tcg_temp_local_new_i64();
+
+ tcg_gen_muls2_i64(lo, hi, b, c);
+ tcg_gen_mov_tl(a, lo);
+
+ tcg_temp_free_i64(hi);
+ tcg_temp_free_i64(lo);
+ gen_set_label(done);
+
+ return DISAS_NEXT;
+}
+
+/*
+ * The mpyml instruction is a 64x64 signed multipler that produces
+ * a 64-bit product (the higher 64-bit of the actual prodcut).
+ */
+int
+arc_gen_MPYML(DisasCtxt *ctx, TCGv a, TCGv b, TCGv c)
+{
+ if ((getFFlag () == true)) {
+ arc_gen_excp(ctx, EXCP_INST_ERROR, 0, 0);
+ return DISAS_NEXT;
+ }
+
+ TCGLabel *done = gen_new_label();
+
+ if (ctx->insn.cc) {
+ TCGv cc = tcg_temp_local_new();
+ arc_gen_verifyCCFlag(ctx, cc);
+ tcg_gen_brcondi_tl(TCG_COND_NE, cc, 1, done);
+ tcg_temp_free(cc);
+ }
+
+ TCGv lo = tcg_temp_local_new();
+ TCGv hi = tcg_temp_local_new();
+ tcg_gen_muls2_i64(lo, hi, b, c);
+ tcg_gen_mov_tl(a, hi);
+
+ tcg_temp_free(hi);
+ tcg_temp_free(lo);
+ gen_set_label(done);
+
+ return DISAS_NEXT;
+}
+
+/*
+ * The mpymul instruction is a 64x64 unsigned multipler that produces
+ * a 64-bit product (the higher 64-bit of the actual prodcut).
+ */
+int
+arc_gen_MPYMUL(DisasCtxt *ctx, TCGv a, TCGv b, TCGv c)
+{
+ if ((getFFlag () == true)) {
+ arc_gen_excp(ctx, EXCP_INST_ERROR, 0, 0);
+ return DISAS_NEXT;
+ }
+
+ TCGLabel *done = gen_new_label();
+
+ if (ctx->insn.cc) {
+ TCGv cc = tcg_temp_local_new();
+ arc_gen_verifyCCFlag(ctx, cc);
+ tcg_gen_brcondi_tl(TCG_COND_NE, cc, 1, done);
+ tcg_temp_free(cc);
+ }
+
+ TCGv lo = tcg_temp_local_new();
+ TCGv hi = tcg_temp_local_new();
+
+ tcg_gen_mulu2_i64(lo, hi, b, c);
+ tcg_gen_mov_tl(a, hi);
+
+ tcg_temp_free(hi);
+ tcg_temp_free(lo);
+ gen_set_label(done);
+
+ return DISAS_NEXT;
+}
+
+/*
+ * The mpymsul instruction is a 64x64 signedxunsigned multipler that
+ * produces * a 64-bit product (the higher 64-bit of the actual prodcut).
+ */
+int
+arc_gen_MPYMSUL(DisasCtxt *ctx, TCGv a, TCGv b, TCGv c)
+{
+ if ((getFFlag () == true)) {
+ arc_gen_excp(ctx, EXCP_INST_ERROR, 0, 0);
+ return DISAS_NEXT;
+ }
+
+ TCGLabel *done = gen_new_label();
+
+ if (ctx->insn.cc) {
+ TCGv cc = tcg_temp_local_new();
+ arc_gen_verifyCCFlag(ctx, cc);
+ tcg_gen_brcondi_tl(TCG_COND_NE, cc, 1, done);
+ tcg_temp_free(cc);
+ }
+
+ TCGv lo = tcg_temp_local_new();
+ TCGv hi = tcg_temp_local_new();
+ tcg_gen_mulsu2_tl(lo, hi, b, c);
+ tcg_gen_mov_tl(a, hi);
+
+ tcg_temp_free(hi);
+ tcg_temp_free(lo);
+ gen_set_label(done);
+
+ return DISAS_NEXT;
+}
+
+/*
+ * a = b + (c << 32)
+ */
+int
+arc_gen_ADDHL(DisasCtxt *ctx, TCGv a, TCGv b, TCGv c)
+{
+ TCGLabel *done = gen_new_label();
+
+ if (ctx->insn.cc) {
+ TCGv cc = tcg_temp_local_new();
+ arc_gen_verifyCCFlag(ctx, cc);
+ tcg_gen_brcondi_tl(TCG_COND_NE, cc, 1, done);
+ tcg_temp_free(cc);
+ }
+
+ TCGv shifted = tcg_temp_local_new();
+ tcg_gen_shli_tl(shifted, c, 32);
+ tcg_gen_add_tl(a, b, shifted);
+
+ tcg_temp_free(shifted);
+ gen_set_label(done);
+
+ return DISAS_NEXT;
+}
+
+#endif
+#ifdef TARGET_ARCV2
+
/*
* Function to add boiler plate code for conditional execution.
* It will add tcg_gen codes only if there is a condition to
@@ -1208,6 +1387,7 @@ arc_gen_VSUB4H(DisasCtxt *ctx, TCGv dest, TCGv_i32 b, TCGv_i32 c)
}
return DISAS_NEXT;
}
+#endif
int
arc_gen_SWI(DisasCtxt *ctx, TCGv a)
--
2.20.1
next prev parent reply other threads:[~2021-04-05 14:47 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-04-05 14:31 *** ARC port for review *** cupertinomiranda
2021-04-05 14:31 ` [PATCH 01/27] arc: Add initial core cpu files cupertinomiranda
2021-04-07 0:47 ` Richard Henderson
2021-04-05 14:31 ` [PATCH 02/27] arc: Decoder code cupertinomiranda
2021-04-07 1:25 ` Richard Henderson
2021-04-05 14:31 ` [PATCH 03/27] arc: Opcode definitions table cupertinomiranda
2021-04-05 14:31 ` [PATCH 04/27] arc: TCG and decoder glue code and helpers cupertinomiranda
2021-04-07 2:37 ` Richard Henderson
2021-04-05 14:31 ` [PATCH 05/27] arc: TCG instruction generator and hand-definitions cupertinomiranda
2021-04-07 3:52 ` Richard Henderson
2021-04-07 16:47 ` Richard Henderson
2021-04-05 14:31 ` [PATCH 06/27] arc: semfunc.c tcg code generator cupertinomiranda
2021-04-07 17:14 ` Richard Henderson
2021-04-07 18:33 ` Peter Maydell
2021-04-05 14:31 ` [PATCH 07/27] arc: TCG instruction definitions cupertinomiranda
2021-04-07 19:38 ` Richard Henderson
2021-04-08 0:20 ` Richard Henderson
2021-04-12 14:27 ` Cupertino Miranda
2021-04-05 14:31 ` [PATCH 08/27] arc: Add BCR and AUX registers implementation cupertinomiranda
2021-04-05 14:31 ` [PATCH 09/27] arc: Add IRQ and timer subsystem support cupertinomiranda
2021-04-05 14:31 ` [PATCH 10/27] arc: Add memory management unit (MMU) support cupertinomiranda
2021-04-05 14:31 ` [PATCH 11/27] arc: Add memory protection unit (MPU) support cupertinomiranda
2021-04-05 14:31 ` [PATCH 12/27] arc: Add gdbstub and XML for debugging support cupertinomiranda
2021-04-05 14:31 ` [PATCH 13/27] arc: Add Synopsys ARC emulation boards cupertinomiranda
2021-04-05 14:31 ` [PATCH 14/27] arc: Add support for ARCv2 cupertinomiranda
2021-04-07 20:30 ` Richard Henderson
2021-04-05 14:31 ` [PATCH 15/27] tests/tcg: ARC: Add TCG instruction definition tests cupertinomiranda
2021-04-07 20:38 ` Richard Henderson
2021-04-05 14:31 ` [PATCH 16/27] tests/acceptance: ARC: Add linux boot testing cupertinomiranda
2021-04-07 20:40 ` Richard Henderson
2021-04-05 14:31 ` [PATCH 17/27] arcv3: Core cpu file changes cupertinomiranda
2021-04-05 14:31 ` [PATCH 18/27] arcv3: Decoder code cupertinomiranda
2021-04-07 23:07 ` Richard Henderson
2021-04-05 14:31 ` [PATCH 19/27] arcv3: Opcode definition table cupertinomiranda
2021-04-05 14:31 ` [PATCH 20/27] arcv3: TCG, decoder glue code and helper changes cupertinomiranda
2021-04-07 23:36 ` Richard Henderson
2021-04-05 14:31 ` cupertinomiranda [this message]
2021-04-07 23:43 ` [PATCH 21/27] arcv3: TCG instruction generator changes Richard Henderson
2021-04-05 14:31 ` [PATCH 22/27] arcv3: TCG instruction definitions cupertinomiranda
2021-04-07 23:48 ` Richard Henderson
2021-04-05 14:31 ` [PATCH 23/27] arcv3: BCR and AUX register changes cupertinomiranda
2021-04-05 14:31 ` [PATCH 24/27] arcv3: IRQ changes and new MMUv6 WIP cupertinomiranda
2021-04-05 14:31 ` [PATCH 25/27] arcv3: gdbstub changes and new XML files cupertinomiranda
2021-04-05 14:31 ` [PATCH 26/27] arcv3: board changes cupertinomiranda
2021-04-05 14:31 ` [PATCH 27/27] arcv3: Add support for ARCv3 cupertinomiranda
2021-04-06 23:47 ` *** ARC port for review *** Richard Henderson
2021-04-12 14:25 ` Cupertino Miranda
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210405143138.17016-22-cupertinomiranda@gmail.com \
--to=cupertinomiranda@gmail.com \
--cc=claziss@synopsys.com \
--cc=cmiranda@synopsys.com \
--cc=linux-snps-arc@lists.infradead.org \
--cc=qemu-devel@nongnu.org \
--cc=shahab@synopsys.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).