+2016-09-21  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * config/tc-aarch64.c (parse_aarch64_imm_float): Report a specific
+       low-severity error for registers.
+       (parse_operands): Report an invalid floating point constant for
+       if parsing an FPIMM8 fails, and if no better error has been
+       recorded.
+       * testsuite/gas/aarch64/diagnostic.s,
+       testsuite/gas/aarch64/diagnostic.l: Add tests for integer operands
+       to FMOV.
+
 2016-09-21  Richard Sandiford  <richard.sandiford@arm.com>
 
        * config/tc-aarch64.c (aarch64_double_precision_fmovable): Rename
 
     }
   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'.  */
               it is probably not worth the effort to support it.  */
            if (!(res1 = parse_aarch64_imm_float (&str, &qfloat, FALSE,
                                                  imm_reg_type))
-               && !(res2 = parse_constant_immediate (&str, &val,
-                                                     imm_reg_type)))
+               && (error_p ()
+                   || !(res2 = parse_constant_immediate (&str, &val,
+                                                         imm_reg_type))))
              goto failure;
            if ((res1 && qfloat == 0) || (res2 && val == 0))
              {
            bfd_boolean dp_p
              = (aarch64_get_qualifier_esize (inst.base.operands[0].qualifier)
                 == 8);
-           if (! parse_aarch64_imm_float (&str, &qfloat, dp_p, imm_reg_type))
-             goto failure;
-           if (qfloat == 0)
+           if (!parse_aarch64_imm_float (&str, &qfloat, dp_p, imm_reg_type)
+               || qfloat == 0)
              {
-               set_fatal_syntax_error (_("invalid floating-point constant"));
+               if (!error_p ())
+                 set_fatal_syntax_error (_("invalid floating-point"
+                                           " constant"));
                goto failure;
              }
            inst.base.operands[i].imm.value = encode_imm_float_bits (qfloat);
 
 [^:]*:255: Error: register element index out of range 0 to 15 at operand 1 -- `ld2 {v0\.b,v1\.b}\[-1\],\[x0\]'
 [^:]*:258: Error: register element index out of range 0 to 15 at operand 1 -- `ld2 {v0\.b,v1\.b}\[16\],\[x0\]'
 [^:]*:259: Error: register element index out of range 0 to 15 at operand 1 -- `ld2 {v0\.b,v1\.b}\[67\],\[x0\]'
+[^:]*:261: Error: invalid floating-point constant at operand 2 -- `fmov d0,#2'
+[^:]*:262: Error: invalid floating-point constant at operand 2 -- `fmov d0,#-2'
+[^:]*:263: Error: invalid floating-point constant at operand 2 -- `fmov s0,2'
+[^:]*:264: Error: invalid floating-point constant at operand 2 -- `fmov s0,-2'
 
        ld2     {v0.b, v1.b}[15], [x0]
        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