[AArch64][SVE 16/32] Use specific insert/extract methods for fpimm
authorRichard Sandiford <richard.sandiford@arm.com>
Wed, 21 Sep 2016 15:51:24 +0000 (16:51 +0100)
committerRichard Sandiford <richard.sandiford@arm.com>
Wed, 21 Sep 2016 15:51:24 +0000 (16:51 +0100)
FPIMM used the normal "imm" insert/extract methods, with a specific
test for FPIMM in the extract method.  SVE needs to use the same
extractors, so rather than add extra checks for specific operand types,
it seemed cleaner to use a separate insert/extract method.

opcodes/
* aarch64-tbl.h (AARCH64_OPERNADS): Use fpimm rather than imm
for FPIMM.
* aarch64-asm.h (ins_fpimm): New inserter.
* aarch64-asm.c (aarch64_ins_fpimm): New function.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis.h (ext_fpimm): New extractor.
* aarch64-dis.c (aarch64_ext_imm): Remove fpimm test.
(aarch64_ext_fpimm): New function.
* aarch64-dis-2.c: Regenerate.

opcodes/ChangeLog
opcodes/aarch64-asm-2.c
opcodes/aarch64-asm.c
opcodes/aarch64-asm.h
opcodes/aarch64-dis-2.c
opcodes/aarch64-dis.c
opcodes/aarch64-dis.h
opcodes/aarch64-tbl.h

index fd241168424eeb33c4c1383be9ad38fa9ea1ea0e..672c1b5be7495f91981fd40a664392a2a06f85f6 100644 (file)
@@ -1,3 +1,15 @@
+2016-09-21  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * aarch64-tbl.h (AARCH64_OPERNADS): Use fpimm rather than imm
+       for FPIMM.
+       * aarch64-asm.h (ins_fpimm): New inserter.
+       * aarch64-asm.c (aarch64_ins_fpimm): New function.
+       * aarch64-asm-2.c: Regenerate.
+       * aarch64-dis.h (ext_fpimm): New extractor.
+       * aarch64-dis.c (aarch64_ext_imm): Remove fpimm test.
+       (aarch64_ext_fpimm): New function.
+       * aarch64-dis-2.c: Regenerate.
+
 2016-09-21  Richard Sandiford  <richard.sandiford@arm.com>
 
        * aarch64-asm.c: Include libiberty.h.
index 605bf08c0ae8591aafd026f2e3b2cf7c15cc1b42..439dd3d0e80b75833e8bc9d3a746b7bd69e1633f 100644 (file)
@@ -500,7 +500,6 @@ aarch64_insert_operand (const aarch64_operand *self,
     case 34:
       return aarch64_ins_ldst_elemlist (self, info, code, inst);
     case 37:
-    case 46:
     case 47:
     case 48:
     case 49:
@@ -525,6 +524,8 @@ aarch64_insert_operand (const aarch64_operand *self,
     case 41:
     case 42:
       return aarch64_ins_advsimd_imm_modified (self, info, code, inst);
+    case 46:
+      return aarch64_ins_fpimm (self, info, code, inst);
     case 59:
       return aarch64_ins_limm (self, info, code, inst);
     case 60:
index 3b0a38373fcb8416a5ca942fffa82ea5e52702cb..f291495992ee9b3c9253927c742050effc5c3dcb 100644 (file)
@@ -417,6 +417,16 @@ aarch64_ins_advsimd_imm_modified (const aarch64_operand *self ATTRIBUTE_UNUSED,
   return NULL;
 }
 
+/* Insert fields for an 8-bit floating-point immediate.  */
+const char *
+aarch64_ins_fpimm (const aarch64_operand *self, const aarch64_opnd_info *info,
+                  aarch64_insn *code,
+                  const aarch64_inst *inst ATTRIBUTE_UNUSED)
+{
+  insert_all_fields (self, code, info->imm.value);
+  return NULL;
+}
+
 /* Insert #<fbits> for the immediate operand in fp fix-point instructions,
    e.g.  SCVTF <Dd>, <Wn>, #<fbits>.  */
 const char *
index ad9183d1e1055c569ce683402661cb2e237c6d08..3211aff99b4c5dd2267f4744053f464fa2f800eb 100644 (file)
@@ -50,6 +50,7 @@ AARCH64_DECL_OPD_INSERTER (ins_advsimd_imm_shift);
 AARCH64_DECL_OPD_INSERTER (ins_imm);
 AARCH64_DECL_OPD_INSERTER (ins_imm_half);
 AARCH64_DECL_OPD_INSERTER (ins_advsimd_imm_modified);
+AARCH64_DECL_OPD_INSERTER (ins_fpimm);
 AARCH64_DECL_OPD_INSERTER (ins_fbits);
 AARCH64_DECL_OPD_INSERTER (ins_aimm);
 AARCH64_DECL_OPD_INSERTER (ins_limm);
index 8e85dbf2e27c66831dab69f940c8bbd1ca4d9dd5..a86a84ddd596aed46ce9d14bf6e90176c2bffec0 100644 (file)
@@ -10450,7 +10450,6 @@ aarch64_extract_operand (const aarch64_operand *self,
     case 34:
       return aarch64_ext_ldst_elemlist (self, info, code, inst);
     case 37:
-    case 46:
     case 47:
     case 48:
     case 49:
@@ -10478,6 +10477,8 @@ aarch64_extract_operand (const aarch64_operand *self,
       return aarch64_ext_advsimd_imm_modified (self, info, code, inst);
     case 43:
       return aarch64_ext_shll_imm (self, info, code, inst);
+    case 46:
+      return aarch64_ext_fpimm (self, info, code, inst);
     case 59:
       return aarch64_ext_limm (self, info, code, inst);
     case 60:
index 67daa663172dee55452a88ab5fd3150ad0f9ef33..4c3b521d0de9f73f5944c7469fe71c2d8997ae19 100644 (file)
@@ -598,9 +598,6 @@ aarch64_ext_imm (const aarch64_operand *self, aarch64_opnd_info *info,
 
   imm = extract_all_fields (self, code);
 
-  if (info->type == AARCH64_OPND_FPIMM)
-    info->imm.is_fp = 1;
-
   if (operand_need_sign_extension (self))
     imm = sign_extend (imm, get_operand_fields_width (self) - 1);
 
@@ -695,6 +692,17 @@ aarch64_ext_advsimd_imm_modified (const aarch64_operand *self ATTRIBUTE_UNUSED,
   return 1;
 }
 
+/* Decode an 8-bit floating-point immediate.  */
+int
+aarch64_ext_fpimm (const aarch64_operand *self, aarch64_opnd_info *info,
+                  const aarch64_insn code,
+                  const aarch64_inst *inst ATTRIBUTE_UNUSED)
+{
+  info->imm.value = extract_all_fields (self, code);
+  info->imm.is_fp = 1;
+  return 1;
+}
+
 /* Decode scale for e.g. SCVTF <Dd>, <Wn>, #<fbits>.  */
 int
 aarch64_ext_fbits (const aarch64_operand *self ATTRIBUTE_UNUSED,
index 9be5d7f1d414b2cafe1abac9b8e23e4e5d85388d..1f101571b6f275ea625fdb30732ef3c3a075a8b6 100644 (file)
@@ -72,6 +72,7 @@ AARCH64_DECL_OPD_EXTRACTOR (ext_shll_imm);
 AARCH64_DECL_OPD_EXTRACTOR (ext_imm);
 AARCH64_DECL_OPD_EXTRACTOR (ext_imm_half);
 AARCH64_DECL_OPD_EXTRACTOR (ext_advsimd_imm_modified);
+AARCH64_DECL_OPD_EXTRACTOR (ext_fpimm);
 AARCH64_DECL_OPD_EXTRACTOR (ext_fbits);
 AARCH64_DECL_OPD_EXTRACTOR (ext_aimm);
 AARCH64_DECL_OPD_EXTRACTOR (ext_limm);
index b82678ff6a347ab7053153fcdbb3be4a0fdc56e2..9a831e4ffe1aba16b4d9d2cf95432d7c21b10c21 100644 (file)
@@ -2738,7 +2738,7 @@ struct aarch64_opcode aarch64_opcode_table[] =
       "an immediate shift amount of 8, 16 or 32")                      \
     X(IMMEDIATE, 0, 0, "IMM0", 0, F(), "0")                            \
     X(IMMEDIATE, 0, 0, "FPIMM0", 0, F(), "0.0")                                \
-    Y(IMMEDIATE, imm, "FPIMM", 0, F(FLD_imm8),                         \
+    Y(IMMEDIATE, fpimm, "FPIMM", 0, F(FLD_imm8),                       \
       "an 8-bit floating-point constant")                              \
     Y(IMMEDIATE, imm, "IMMR", 0, F(FLD_immr),                          \
       "the right rotate amount")                                       \