qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Peter Maydell <peter.maydell@linaro.org>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] [PULL 05/27] target/arm: Restructure disas_fp_int_conv
Date: Thu, 14 Feb 2019 19:05:41 +0000	[thread overview]
Message-ID: <20190214190603.25030-6-peter.maydell@linaro.org> (raw)
In-Reply-To: <20190214190603.25030-1-peter.maydell@linaro.org>

From: Richard Henderson <richard.henderson@linaro.org>

For opcodes 0-5, move some if conditions into the structure
of a switch statement.  For opcodes 6 & 7, decode everything
at once with a second switch.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-id: 20190206052857.5077-3-richard.henderson@linaro.org
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
 target/arm/translate-a64.c | 94 ++++++++++++++++++++------------------
 1 file changed, 49 insertions(+), 45 deletions(-)

diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
index e002251ac6f..2f849a6951d 100644
--- a/target/arm/translate-a64.c
+++ b/target/arm/translate-a64.c
@@ -6541,68 +6541,72 @@ static void disas_fp_int_conv(DisasContext *s, uint32_t insn)
     int type = extract32(insn, 22, 2);
     bool sbit = extract32(insn, 29, 1);
     bool sf = extract32(insn, 31, 1);
+    bool itof = false;
 
     if (sbit) {
-        unallocated_encoding(s);
-        return;
+        goto do_unallocated;
     }
 
-    if (opcode > 5) {
-        /* FMOV */
-        bool itof = opcode & 1;
-
-        if (rmode >= 2) {
-            unallocated_encoding(s);
-            return;
-        }
-
-        switch (sf << 3 | type << 1 | rmode) {
-        case 0x0: /* 32 bit */
-        case 0xa: /* 64 bit */
-        case 0xd: /* 64 bit to top half of quad */
-            break;
-        case 0x6: /* 16-bit float, 32-bit int */
-        case 0xe: /* 16-bit float, 64-bit int */
-            if (dc_isar_feature(aa64_fp16, s)) {
-                break;
-            }
-            /* fallthru */
-        default:
-            /* all other sf/type/rmode combinations are invalid */
-            unallocated_encoding(s);
-            return;
-        }
-
-        if (!fp_access_check(s)) {
-            return;
-        }
-        handle_fmov(s, rd, rn, type, itof);
-    } else {
-        /* actual FP conversions */
-        bool itof = extract32(opcode, 1, 1);
-
-        if (rmode != 0 && opcode > 1) {
-            unallocated_encoding(s);
-            return;
+    switch (opcode) {
+    case 2: /* SCVTF */
+    case 3: /* UCVTF */
+        itof = true;
+        /* fallthru */
+    case 4: /* FCVTAS */
+    case 5: /* FCVTAU */
+        if (rmode != 0) {
+            goto do_unallocated;
         }
+        /* fallthru */
+    case 0: /* FCVT[NPMZ]S */
+    case 1: /* FCVT[NPMZ]U */
         switch (type) {
         case 0: /* float32 */
         case 1: /* float64 */
             break;
         case 3: /* float16 */
-            if (dc_isar_feature(aa64_fp16, s)) {
-                break;
+            if (!dc_isar_feature(aa64_fp16, s)) {
+                goto do_unallocated;
             }
-            /* fallthru */
+            break;
         default:
-            unallocated_encoding(s);
-            return;
+            goto do_unallocated;
         }
-
         if (!fp_access_check(s)) {
             return;
         }
         handle_fpfpcvt(s, rd, rn, opcode, itof, rmode, 64, sf, type);
+        break;
+
+    default:
+        switch (sf << 7 | type << 5 | rmode << 3 | opcode) {
+        case 0b01100110: /* FMOV half <-> 32-bit int */
+        case 0b01100111:
+        case 0b11100110: /* FMOV half <-> 64-bit int */
+        case 0b11100111:
+            if (!dc_isar_feature(aa64_fp16, s)) {
+                goto do_unallocated;
+            }
+            /* fallthru */
+        case 0b00000110: /* FMOV 32-bit */
+        case 0b00000111:
+        case 0b10100110: /* FMOV 64-bit */
+        case 0b10100111:
+        case 0b11001110: /* FMOV top half of 128-bit */
+        case 0b11001111:
+            if (!fp_access_check(s)) {
+                return;
+            }
+            itof = opcode & 1;
+            handle_fmov(s, rd, rn, type, itof);
+            break;
+
+        default:
+        do_unallocated:
+            unallocated_encoding(s);
+            return;
+        }
+        break;
     }
 }
 
-- 
2.20.1

  parent reply	other threads:[~2019-02-14 19:06 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-14 19:05 [Qemu-devel] [PULL 00/27] target-arm queue Peter Maydell
2019-02-14 19:05 ` [Qemu-devel] [PULL 01/27] target/arm: Fix CRn to be 14 for PMEVTYPER/PMEVCNTR Peter Maydell
2019-02-14 19:05 ` [Qemu-devel] [PULL 02/27] target/arm: Implement HACR_EL2 Peter Maydell
2019-02-14 19:05 ` [Qemu-devel] [PULL 03/27] target/arm: Fix int128_make128 lo, hi order in paired_cmpxchg64_be Peter Maydell
2019-02-14 19:05 ` [Qemu-devel] [PULL 04/27] target/arm: Force result size into dp after operation Peter Maydell
2019-02-14 19:05 ` Peter Maydell [this message]
2019-02-14 19:05 ` [Qemu-devel] [PULL 06/27] target/arm: relax permission checks for HWCAP_CPUID registers Peter Maydell
2019-02-14 19:05 ` [Qemu-devel] [PULL 07/27] target/arm: expose CPUID registers to userspace Peter Maydell
2019-02-14 19:05 ` [Qemu-devel] [PULL 08/27] target/arm: expose MPIDR_EL1 " Peter Maydell
2019-02-14 19:05 ` [Qemu-devel] [PULL 09/27] target/arm: expose remaining CPUID registers as RAZ Peter Maydell
2019-02-14 19:05 ` [Qemu-devel] [PULL 10/27] linux-user/elfload: enable HWCAP_CPUID for AArch64 Peter Maydell
2019-02-14 19:05 ` [Qemu-devel] [PULL 11/27] arm: Allow system registers for KVM guests to be changed by QEMU code Peter Maydell
2019-02-21 14:20   ` Auger Eric
2019-02-21 14:23     ` Peter Maydell
2019-02-21 14:26     ` Peter Maydell
2019-02-21 14:55       ` Auger Eric
2019-03-08 15:53         ` Peter Maydell
2019-03-08 16:54           ` Auger Eric
2019-02-21 14:42     ` Alex Bennée
2019-02-26 16:53     ` Peter Maydell
2019-03-11 13:26     ` Peter Maydell
2019-03-11 14:54       ` Auger Eric
2019-03-11 14:55         ` Peter Maydell
2019-03-11 15:09           ` Auger Eric
2019-03-11 16:07             ` Peter Maydell
2019-02-14 19:05 ` [Qemu-devel] [PULL 12/27] MAINTAINERS: Remove Peter Crosthwaite from various entries Peter Maydell
2019-02-14 19:05 ` [Qemu-devel] [PULL 13/27] hw/intc/armv7m_nvic: Allow byte accesses to SHPR1 Peter Maydell
2019-02-14 19:05 ` [Qemu-devel] [PULL 14/27] hw/arm/armsse: Fix miswiring of expansion IRQs Peter Maydell
2019-02-14 19:05 ` [Qemu-devel] [PULL 15/27] target/arm: Rely on optimization within tcg_gen_gvec_or Peter Maydell
2019-02-14 19:05 ` [Qemu-devel] [PULL 16/27] target/arm: Use vector minmax expanders for aarch64 Peter Maydell
2019-02-14 19:05 ` [Qemu-devel] [PULL 17/27] target/arm: Use vector minmax expanders for aarch32 Peter Maydell
2019-02-14 19:05 ` [Qemu-devel] [PULL 18/27] target/arm: Use tcg integer min/max primitives for neon Peter Maydell
2019-02-14 19:05 ` [Qemu-devel] [PULL 19/27] target/arm: Remove neon min/max helpers Peter Maydell
2019-02-14 19:05 ` [Qemu-devel] [PULL 20/27] target/arm: Fix vfp_gdb_get/set_reg vs FPSCR Peter Maydell
2019-02-14 19:05 ` [Qemu-devel] [PULL 21/27] target/arm: Fix arm_cpu_dump_state " Peter Maydell
2019-02-14 19:05 ` [Qemu-devel] [PULL 22/27] target/arm: Split out flags setting from vfp compares Peter Maydell
2019-02-14 19:05 ` [Qemu-devel] [PULL 23/27] target/arm: Fix set of bits kept in xregs[ARM_VFP_FPSCR] Peter Maydell
2019-02-14 19:06 ` [Qemu-devel] [PULL 24/27] target/arm: Split out FPSCR.QC to a vector field Peter Maydell
2019-02-14 19:06 ` [Qemu-devel] [PULL 25/27] target/arm: Use vector operations for saturation Peter Maydell
2019-02-14 19:06 ` [Qemu-devel] [PULL 26/27] target/arm: Add missing clear_tail calls Peter Maydell
2019-02-14 19:06 ` [Qemu-devel] [PULL 27/27] gdbstub: Send a reply to the vKill packet Peter Maydell
2019-02-14 19:56 ` [Qemu-devel] [PULL 00/27] target-arm queue no-reply
2019-02-14 20:30 ` no-reply
2019-02-14 20:57 ` no-reply
2019-02-14 21:24 ` no-reply
2019-02-14 21:51 ` no-reply
2019-02-14 22:18 ` no-reply
2019-02-14 23:39 ` no-reply
2019-02-15  0:07 ` no-reply
2019-02-15  0:11 ` no-reply
2019-02-15  0:34 ` no-reply
2019-02-15  0:38 ` no-reply
2019-02-15  1:01 ` no-reply
2019-02-15  1:20 ` no-reply
2019-02-15  1:24 ` no-reply
2019-02-15  1:28 ` no-reply
2019-02-15  1:32 ` no-reply
2019-02-15  1:48 ` no-reply
2019-02-15  1:56 ` no-reply
2019-02-15  2:15 ` no-reply
2019-02-15  2:19 ` no-reply
2019-02-15  2:24 ` no-reply
2019-02-15  2:43 ` no-reply

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=20190214190603.25030-6-peter.maydell@linaro.org \
    --to=peter.maydell@linaro.org \
    --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).