[AArch64] Reject -0.0 as an 8-bit FP immediate

parse_aarch64_imm_float was accepting -0.0 even though that's not
a valid immediate for any instruction.  The FPIMM0 caller rejected
it, but the FPIMM one would silently treat it as -2.0.

This patch rejects -0.0 and adds testcases to illegal.[sd].

Before the patch, the final error emitted for illegal.s was:

        Error: cannot do 16-byte relocation

which was matched by:

        [^:]*:569: Error: .*

The error was reported against the last line of the file rather than
the instruction that required the reloc.  Adding more instructions
meant that the line number also changed.

Reporting against the wrong line isn't good from a QoI perspective
but isn't what I'm trying to fix here.  Until it's fixed, I thought
it would be better to adjust the match to be against an end-of-file
comment rather than against whatever the last instruction happens to be.

gas/
	* config/tc-aarch64.c (parse_aarch64_imm_float): Reject -0.0.
	* testsuite/gas/aarch64/illegal.s, testsuite/gas/aarch64/illegal.l:
	Add tests for -0.0.  Add an end-of-file comment.
This commit is contained in:
Richard Sandiford 2016-08-11 09:14:45 +01:00
parent d93d1c80b3
commit dbd8770c86
4 changed files with 32 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2016-08-11 Richard Sandiford <richard.sandiford@arm.com>
* config/tc-aarch64.c (parse_aarch64_imm_float): Reject -0.0.
* testsuite/gas/aarch64/illegal.s, testsuite/gas/aarch64/illegal.l:
Add tests for -0.0. Add an end-of-file comment.
2016-08-05 Nick Clifton <nickc@redhat.com>
PR gas/20429

View File

@ -2240,7 +2240,7 @@ parse_aarch64_imm_float (char **ccp, int *immed, bfd_boolean dp_p)
}
}
if (aarch64_imm_float_p (fpword) || (fpword & 0x7fffffff) == 0)
if (aarch64_imm_float_p (fpword) || fpword == 0)
{
*immed = fpword;
*ccp = str;

View File

@ -567,4 +567,10 @@
[^:]*:567: Error: .*`mrs x7,S1_1_C16_C6_6'
[^:]*:568: Error: .*`mrs x8,S2_2_C15_C16_7'
[^:]*:569: Error: .*`mrs x9,S3_3_C14_C15_8'
[^:]*:569: Error: .*
[^:]*:571: Error: .*`fmov s0,#-0\.0'
[^:]*:573: Error: .*`fmov s0,#0x80000000'
[^:]*:575: Error: .*`fmov d0,#-0\.0'
[^:]*:577: Error: .*`fmov d0,#0x8000000000000000'
[^:]*:582: Error: .*`fcmgt v0\.4s,v0\.4s,#-0\.0'
[^:]*:585: Error: .*`fcmgt v0\.2d,v0\.2d,#-0\.0'
[^:]*:587: Error: .*

View File

@ -567,3 +567,21 @@ one_label:
mrs x7, S1_1_C16_C6_6
mrs x8, S2_2_C15_C16_7
mrs x9, S3_3_C14_C15_8
fmov s0, #-0.0
fmov s0, #0x40000000 // OK
fmov s0, #0x80000000
fmov s0, #0xc0000000 // OK
fmov d0, #-0.0
fmov d0, #0x4000000000000000 // OK
fmov d0, #0x8000000000000000
fmov d0, #0xc000000000000000 // OK
fcmgt v0.4s, v0.4s, #0.0 // OK
fcmgt v0.4s, v0.4s, #0 // OK
fcmgt v0.4s, v0.4s, #-0.0
fcmgt v0.2d, v0.2d, #0.0 // OK
fcmgt v0.2d, v0.2d, #0 // OK
fcmgt v0.2d, v0.2d, #-0.0
// End (for errors during literal pool generation)