This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


On 01/08/16 16:02, Richard Sandiford wrote:
> 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?
> 

OK.

R.

> 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)
> 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]