From dbd8770c866ae978feb5ce9e71f64b9f7204d802 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Thu, 11 Aug 2016 09:14:45 +0100 Subject: [PATCH] [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. --- gas/ChangeLog | 6 ++++++ gas/config/tc-aarch64.c | 2 +- gas/testsuite/gas/aarch64/illegal.l | 8 +++++++- gas/testsuite/gas/aarch64/illegal.s | 18 ++++++++++++++++++ 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 792ba877c6a..403f122cb3a 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,9 @@ +2016-08-11 Richard Sandiford + + * 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 PR gas/20429 diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c index e221ef47377..34fdc53e121 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 61190655c4d..a0985cea501 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 a315a6de859..df31895491b 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) -- 2.30.2