From: Mans Rullgard <mans@mansr.com>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH] target-arm: implement ARMv8 VSEL instruction
Date: Tue, 18 Jun 2013 15:30:48 +0100 [thread overview]
Message-ID: <1371565848-9297-1-git-send-email-mans@mansr.com> (raw)
This adds support for the VSEL instruction introduced in ARMv8.
It resides along with other new VFP instructions under the CDP2
encoding which was previously unused.
Signed-off-by: Mans Rullgard <mans@mansr.com>
---
Basic testing performed but not every combination.
---
target-arm/translate.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 49 insertions(+), 2 deletions(-)
diff --git a/target-arm/translate.c b/target-arm/translate.c
index f7089b2..eb9423b 100644
--- a/target-arm/translate.c
+++ b/target-arm/translate.c
@@ -2546,6 +2546,40 @@ static TCGv_i32 gen_load_and_replicate(DisasContext *s, TCGv_i32 addr, int size)
return tmp;
}
+static int disas_v8vfp_insn(CPUARMState *env, DisasContext *s, uint32_t insn)
+{
+ uint32_t rd, rn, rm;
+ int dp = (insn >> 8) & 1;
+
+ if (dp) {
+ VFP_DREG_D(rd, insn);
+ VFP_DREG_N(rn, insn);
+ VFP_DREG_M(rm, insn);
+ } else {
+ rd = VFP_SREG_D(insn);
+ rn = VFP_SREG_N(insn);
+ rm = VFP_SREG_M(insn);
+ }
+
+ if (((insn >> 23) & 1) == 0) {
+ /* vsel */
+ int cc = (insn >> 20) & 3;
+ int cond = (cc << 2) | (((cc << 1) ^ cc) & 2);
+ int pass_label = gen_new_label();
+
+ gen_mov_F0_vreg(dp, rn);
+ gen_mov_vreg_F0(dp, rd);
+ gen_test_cc(cond, pass_label);
+ gen_mov_F0_vreg(dp, rm);
+ gen_mov_vreg_F0(dp, rd);
+ gen_set_label(pass_label);
+
+ return 0;
+ }
+
+ return 1;
+}
+
/* Disassemble a VFP instruction. Returns nonzero if an error occurred
(ie. an undefined instruction). */
static int disas_vfp_insn(CPUARMState * env, DisasContext *s, uint32_t insn)
@@ -2568,6 +2602,11 @@ static int disas_vfp_insn(CPUARMState * env, DisasContext *s, uint32_t insn)
&& rn != ARM_VFP_MVFR1 && rn != ARM_VFP_MVFR0)
return 1;
}
+ if (((insn >> 28) & 0xf) == 0xf) {
+ if (!arm_feature(env, ARM_FEATURE_V8))
+ return 1;
+ return disas_v8vfp_insn(env, s, insn);
+ }
dp = ((insn & 0xf00) == 0xb00);
switch ((insn >> 24) & 0xf) {
case 0xe:
@@ -6241,6 +6280,10 @@ static int disas_coproc_insn(CPUARMState * env, DisasContext *s, uint32_t insn)
/* cdp */
return 1;
}
+ if (((insn >> 28) & 0xf) == 0xf) {
+ /* cdp2 */
+ return 1;
+ }
crm = insn & 0xf;
if (is64) {
@@ -6699,6 +6742,12 @@ static void disas_arm_insn(CPUARMState * env, DisasContext *s)
}
return; /* v7MP: Unallocated memory hint: must NOP */
}
+ if ((insn & 0x0f000010) == 0x0e000000) {
+ /* cdp2 */
+ if (disas_coproc_insn(env, s, insn))
+ goto illegal_op;
+ return;
+ }
if ((insn & 0x0ffffdff) == 0x01010000) {
ARCH(6);
@@ -8684,8 +8733,6 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
if (disas_neon_data_insn(env, s, insn))
goto illegal_op;
} else {
- if (insn & (1 << 28))
- goto illegal_op;
if (disas_coproc_insn (env, s, insn))
goto illegal_op;
}
--
1.8.2.1
next reply other threads:[~2013-06-18 14:54 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-06-18 14:30 Mans Rullgard [this message]
2013-06-20 19:23 ` [Qemu-devel] [PATCH] target-arm: implement ARMv8 VSEL instruction Peter Maydell
2013-06-20 23:25 ` Måns Rullgård
2013-07-02 12:56 ` Peter Maydell
-- strict thread matches above, loose matches on Subject: below --
2013-10-03 9:58 [Qemu-devel] [PATCH] target-arm: Implement " Will Newton
2013-10-03 11:31 ` Alex Bennée
2013-10-03 12:11 ` Peter Maydell
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=1371565848-9297-1-git-send-email-mans@mansr.com \
--to=mans@mansr.com \
--cc=qemu-devel@nongnu.org \
/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).