public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [AArch64] Reject -0.0 as an 8-bit FP immediate
@ 2016-08-01 15:02 Richard Sandiford
  2016-08-02 10:53 ` Richard Earnshaw (lists)
  0 siblings, 1 reply; 2+ messages in thread
From: Richard Sandiford @ 2016-08-01 15:02 UTC (permalink / raw)
  To: binutils

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 try 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.

Tested on aarch64-linux-gnu.  OK to install?

Thanks,
Richard


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.

diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c
index 2d491f6..18539dc 100644
--- a/gas/config/tc-aarch64.c
+++ b/gas/config/tc-aarch64.c
@@ -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;
diff --git a/gas/testsuite/gas/aarch64/illegal.l b/gas/testsuite/gas/aarch64/illegal.l
index 6119065..a0985ce 100644
--- a/gas/testsuite/gas/aarch64/illegal.l
+++ b/gas/testsuite/gas/aarch64/illegal.l
@@ -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: .*
diff --git a/gas/testsuite/gas/aarch64/illegal.s b/gas/testsuite/gas/aarch64/illegal.s
index a315a6d..df31895 100644
--- a/gas/testsuite/gas/aarch64/illegal.s
+++ b/gas/testsuite/gas/aarch64/illegal.s
@@ -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)

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2016-08-02 10:53 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-08-01 15:02 [AArch64] Reject -0.0 as an 8-bit FP immediate Richard Sandiford
2016-08-02 10:53 ` Richard Earnshaw (lists)

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 read-only IMAP folder(s) and NNTP newsgroup(s).