Allow integer immediates for AArch64 fmov instructions.
authorTamar Christina <tamar.christina@arm.com>
Thu, 10 May 2018 15:24:58 +0000 (16:24 +0100)
committerTamar Christina <tamar.christina@arm.com>
Thu, 10 May 2018 15:43:28 +0000 (16:43 +0100)
This patch makes it possible to use an integer immediate with the fmov instructions
allowing you to simply write fmov d0, #2 instead of needing fmov d0, #2.0.

The parse double function already know to deal with this so we just need to list the
restriction put in place in parser.

The is considered a QoL improvement for hand assembly writers and allows more
code portability between assembler.

gas/

* config/tc-aarch64.c (parse_aarch64_imm_float): Remove restrictions.
* testsuite/gas/aarch64/diagnostic.s: Move fmov int test to..
* testsuite/gas/aarch64/fpmov.s: Here.
* testsuite/gas/aarch64/fpmov.d: Update results with fmov.
* testsuite/gas/aarch64/diagnostic.l: Remove fmov values.
* testsuite/gas/aarch64/sve-invalid.s: Update test files.
* testsuite/gas/aarch64/sve-invalid.l: Likewise

gas/ChangeLog
gas/config/tc-aarch64.c
gas/testsuite/gas/aarch64/diagnostic.l
gas/testsuite/gas/aarch64/diagnostic.s
gas/testsuite/gas/aarch64/fpmov.d
gas/testsuite/gas/aarch64/fpmov.s
gas/testsuite/gas/aarch64/sve-invalid.l
gas/testsuite/gas/aarch64/sve-invalid.s

index c1687b468dd74ab866bf5f88f91f5df49ca56041..56c0c24ece58ae6c5f646f8b3ee7737a7bb9ef65 100644 (file)
@@ -1,3 +1,13 @@
+2018-05-10  Tamar Christina  <tamar.christina@arm.com>
+
+       * config/tc-aarch64.c (parse_aarch64_imm_float): Remove restrictions.
+       * testsuite/gas/aarch64/diagnostic.s: Move fmov int test to..
+       * testsuite/gas/aarch64/fpmov.s: Here.
+       * testsuite/gas/aarch64/fpmov.d: Update results with fmov.
+       * testsuite/gas/aarch64/diagnostic.l: Remove fmov values.
+       * testsuite/gas/aarch64/sve-invalid.s: Update test files.
+       * testsuite/gas/aarch64/sve-invalid.l: Likewise
+
 2018-05-10  Tamar Christina  <tamar.christina@arm.com>
 
        * gas/config/tc-arm.c (do_neon_mov): Allow integer literal for float
index 02c92e3901a83c23aaf5d1cf86d615d98fd60bb1..e673e1271155526d4bda7d5d3aa6a856ecd466fb 100644 (file)
@@ -2279,7 +2279,6 @@ parse_aarch64_imm_float (char **ccp, int *immed, bfd_boolean dp_p,
   char *str = *ccp;
   char *fpnum;
   LITTLENUM_TYPE words[MAX_LITTLENUMS];
-  int found_fpchar = 0;
   int64_t val = 0;
   unsigned fpword = 0;
   bfd_boolean hex_p = FALSE;
@@ -2309,26 +2308,10 @@ parse_aarch64_imm_float (char **ccp, int *immed, bfd_boolean dp_p,
 
       hex_p = TRUE;
     }
-  else
-    {
-      if (reg_name_p (str, reg_type))
-       {
-         set_recoverable_error (_("immediate operand required"));
-         return FALSE;
-       }
-
-      /* We must not accidentally parse an integer as a floating-point number.
-        Make sure that the value we parse is not an integer by checking for
-        special characters '.' or 'e'.  */
-      for (; *fpnum != '\0' && *fpnum != ' ' && *fpnum != '\n'; fpnum++)
-       if (*fpnum == '.' || *fpnum == 'e' || *fpnum == 'E')
-         {
-           found_fpchar = 1;
-           break;
-         }
-
-      if (!found_fpchar)
-       return FALSE;
+  else if (reg_name_p (str, reg_type))
+   {
+     set_recoverable_error (_("immediate operand required"));
+     return FALSE;
     }
 
   if (! hex_p)
index cd3ce9931c5e8a435d737cc528f1b1095f055250..00bb512394b3c4570b21a358c23204b0e5c60bfb 100644 (file)
 [^:]*:256: Error: register element index out of range 0 to 15 at operand 1 -- `ld2 {v0\.b,v1\.b}\[-1\],\[x0\]'
 [^:]*:259: Error: register element index out of range 0 to 15 at operand 1 -- `ld2 {v0\.b,v1\.b}\[16\],\[x0\]'
 [^:]*:260: Error: register element index out of range 0 to 15 at operand 1 -- `ld2 {v0\.b,v1\.b}\[67\],\[x0\]'
-[^:]*:262: Error: invalid floating-point constant at operand 2 -- `fmov d0,#2'
-[^:]*:263: Error: invalid floating-point constant at operand 2 -- `fmov d0,#-2'
-[^:]*:264: Error: invalid floating-point constant at operand 2 -- `fmov s0,2'
-[^:]*:265: Error: invalid floating-point constant at operand 2 -- `fmov s0,-2'
 [^:]*:267: Error: integer 64-bit register expected at operand 2 -- `st2 {v0.4s,v1.4s},\[sp\],xzr'
 [^:]*:268: Error: integer or zero register expected at operand 2 -- `str x1,\[x2,sp\]'
 [^:]*:271: Error: relocation not allowed at operand 3 -- `ldnp x1,x2,\[x3,#:lo12:foo\]'
index 12e85040d36428f6c0ff4e09fa6daac2a6ede2cc..a62327dabb8abdbba2830dc3bc5d3e2cfc3acb41 100644 (file)
        ld2     {v0.b, v1.b}[16], [x0]
        ld2     {v0.b, v1.b}[67], [x0]
 
-       fmov    d0, #2
-       fmov    d0, #-2
-       fmov    s0, 2
-       fmov    s0, -2
+
+
+
+
 
        st2     {v0.4s, v1.4s}, [sp], xzr
        str     x1, [x2, sp]
index fb032c60e39366dbe7e3cf8bdf6afad768f6763a..21c16b71b1726768c5240e06b7fa06bdf803f0e9 100644 (file)
@@ -17,3 +17,7 @@ Disassembly of section .*:
   24:  1e69f000        fmov    d0, #2\.421875000000000000e-01
   28:  1e69f000        fmov    d0, #2\.421875000000000000e-01
   2c:  1e29f000        fmov    s0, #2\.421875000000000000e-01
+  30:  1e601000        fmov    d0, #2\.000000000000000000e\+00
+  34:  1e701000        fmov    d0, #-2\.000000000000000000e\+00
+  38:  1e201000        fmov    s0, #2\.000000000000000000e\+00
+  3c:  1e301000        fmov    s0, #-2\.000000000000000000e\+00
index ffc988173b31c117589e759e2af9d33f123e2b1e..0b0a63e2aca19c1795c36ee502d1c8f4a27f9011 100644 (file)
@@ -15,3 +15,8 @@
        fmov    d0, 0.2421875
        fmov    d0, 0x3fcf000000000000
        fmov    s0, 0x3e780000
+
+       fmov    d0, #2
+       fmov    d0, #-2
+       fmov    s0, 2
+       fmov    s0, -2
index 6e614c3f6ee1d2dd14ee8caa5b64efa95117063d..32b7952436f36ebbe45f775924779a237675d493 100644 (file)
 .*: Error: immediate out of range at operand 3 -- `bic z0\.d,z0\.d,#0xd'
 .*: Error: immediate zero expected at operand 4 -- `fcmeq p0\.s,p1/z,z2\.s,#1'
 .*: Error: immediate zero expected at operand 4 -- `fcmeq p0\.s,p1/z,z2\.s,#1\.0'
-.*: Error: invalid floating-point constant at operand 4 -- `fadd z0\.s,p1/m,z0\.s,#0'
+.*: Error: floating-point value must be 0\.5 or 1\.0 at operand 4 -- `fadd z0\.s,p1/m,z0\.s,#0'
 .*: Error: floating-point value must be 0\.5 or 1\.0 at operand 4 -- `fadd z0\.s,p1/m,z0\.s,#0\.0'
-.*: Error: invalid floating-point constant at operand 4 -- `fadd z0\.s,p1/m,z0\.s,#1'
 .*: Error: floating-point value must be 0\.5 or 1\.0 at operand 4 -- `fadd z0\.s,p1/m,z0\.s,#1\.5'
-.*: Error: invalid floating-point constant at operand 4 -- `fadd z0\.s,p1/m,z0\.s,#2'
+.*: Error: floating-point value must be 0\.5 or 1\.0 at operand 4 -- `fadd z0\.s,p1/m,z0\.s,#2'
 .*: Error: floating-point value must be 0\.5 or 1\.0 at operand 4 -- `fadd z0\.s,p1/m,z0\.s,#2\.0'
-.*: Error: invalid floating-point constant at operand 4 -- `fmul z0\.s,p1/m,z0\.s,#0'
+.*: Error: floating-point value must be 0\.5 or 2\.0 at operand 4 -- `fmul z0\.s,p1/m,z0\.s,#0'
 .*: Error: floating-point value must be 0\.5 or 2\.0 at operand 4 -- `fmul z0\.s,p1/m,z0\.s,#0\.0'
-.*: Error: invalid floating-point constant at operand 4 -- `fmul z0\.s,p1/m,z0\.s,#1'
+.*: Error: floating-point value must be 0\.5 or 2\.0 at operand 4 -- `fmul z0\.s,p1/m,z0\.s,#1'
 .*: Error: floating-point value must be 0\.5 or 2\.0 at operand 4 -- `fmul z0\.s,p1/m,z0\.s,#1\.0'
 .*: Error: floating-point value must be 0\.5 or 2\.0 at operand 4 -- `fmul z0\.s,p1/m,z0\.s,#1\.5'
-.*: Error: invalid floating-point constant at operand 4 -- `fmul z0\.s,p1/m,z0\.s,#2'
-.*: Error: invalid floating-point constant at operand 4 -- `fmax z0\.s,p1/m,z0\.s,#0'
 .*: Error: floating-point value must be 0\.0 or 1\.0 at operand 4 -- `fmax z0\.s,p1/m,z0\.s,#0\.5'
-.*: Error: invalid floating-point constant at operand 4 -- `fmax z0\.s,p1/m,z0\.s,#1'
 .*: Error: floating-point value must be 0\.0 or 1\.0 at operand 4 -- `fmax z0\.s,p1/m,z0\.s,#1\.5'
-.*: Error: invalid floating-point constant at operand 4 -- `fmax z0\.s,p1/m,z0\.s,#2'
+.*: Error: floating-point value must be 0\.0 or 1\.0 at operand 4 -- `fmax z0\.s,p1/m,z0\.s,#2'
 .*: Error: floating-point value must be 0\.0 or 1\.0 at operand 4 -- `fmax z0\.s,p1/m,z0\.s,#2\.0'
 .*: Error: operand 2 must be an enumeration value such as POW2 -- `ptrue p1\.b,vl0'
 .*: Error: operand 2 must be an enumeration value such as POW2 -- `ptrue p1\.b,vl255'
index 148dbc85ac2e2c7ce2e5c5ebe9b2c77ea7603d77..204721ee17a45d43b9de52b860cccca8f2386ca5 100644 (file)
        fadd    z0.s, p1/m, z0.s, #0
        fadd    z0.s, p1/m, z0.s, #0.0
        fadd    z0.s, p1/m, z0.s, #0.5                  // OK
-       fadd    z0.s, p1/m, z0.s, #1
+       fadd    z0.s, p1/m, z0.s, #1                    // OK
        fadd    z0.s, p1/m, z0.s, #1.0                  // OK
        fadd    z0.s, p1/m, z0.s, #1.5
        fadd    z0.s, p1/m, z0.s, #2
        fmul    z0.s, p1/m, z0.s, #0
        fmul    z0.s, p1/m, z0.s, #0.0
        fmul    z0.s, p1/m, z0.s, #0.5                  // OK
-       fmul    z0.s, p1/m, z0.s, #1
+       fmul    z0.s, p1/m, z0.s, #1                    // OK
        fmul    z0.s, p1/m, z0.s, #1.0
        fmul    z0.s, p1/m, z0.s, #1.5
-       fmul    z0.s, p1/m, z0.s, #2
+       fmul    z0.s, p1/m, z0.s, #2                    // OK
        fmul    z0.s, p1/m, z0.s, #2.0                  // OK
 
-       fmax    z0.s, p1/m, z0.s, #0
+       fmax    z0.s, p1/m, z0.s, #0                    // OK
        fmax    z0.s, p1/m, z0.s, #0.0                  // OK
        fmax    z0.s, p1/m, z0.s, #0.5
-       fmax    z0.s, p1/m, z0.s, #1
+       fmax    z0.s, p1/m, z0.s, #1                    // OK
        fmax    z0.s, p1/m, z0.s, #1.0                  // OK
        fmax    z0.s, p1/m, z0.s, #1.5
        fmax    z0.s, p1/m, z0.s, #2