[AArch64,v2,09/11] aarch64: Force TImode values into even registers

Message ID 20181002161915.18843-10-richard.henderson@linaro.org
State New
Headers show
Series
  • LSE atomics out-of-line
Related show

Commit Message

Richard Henderson Oct. 2, 2018, 4:19 p.m.
The LSE CASP instruction requires values to be placed in even
register pairs.  A solution involving two additional register
classes was rejected in favor of the much simpler solution of
simply requiring all TImode values to be aligned.

	* config/aarch64/aarch64.c (aarch64_hard_regno_mode_ok): Force
	16-byte modes held in GP registers to use an even regno.
---
 gcc/config/aarch64/aarch64.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

-- 
2.17.1

Comments

James Greenhalgh Oct. 30, 2018, 8:50 p.m. | #1
On Tue, Oct 02, 2018 at 11:19:13AM -0500, Richard Henderson wrote:
> The LSE CASP instruction requires values to be placed in even

> register pairs.  A solution involving two additional register

> classes was rejected in favor of the much simpler solution of

> simply requiring all TImode values to be aligned.


OK.

Thanks,
James

> 

> 	* config/aarch64/aarch64.c (aarch64_hard_regno_mode_ok): Force

> 	16-byte modes held in GP registers to use an even regno.

> ---

>  gcc/config/aarch64/aarch64.c | 12 ++++++++----

>  1 file changed, 8 insertions(+), 4 deletions(-)

> 

> diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c

> index 49b47382b5d..ce4d7e51d00 100644

> --- a/gcc/config/aarch64/aarch64.c

> +++ b/gcc/config/aarch64/aarch64.c

> @@ -1451,10 +1451,14 @@ aarch64_hard_regno_mode_ok (unsigned regno, machine_mode mode)

>    if (regno == FRAME_POINTER_REGNUM || regno == ARG_POINTER_REGNUM)

>      return mode == Pmode;

>  

> -  if (GP_REGNUM_P (regno) && known_le (GET_MODE_SIZE (mode), 16))

> -    return true;

> -

> -  if (FP_REGNUM_P (regno))

> +  if (GP_REGNUM_P (regno))

> +    {

> +      if (known_le (GET_MODE_SIZE (mode), 8))

> +	return true;

> +      else if (known_le (GET_MODE_SIZE (mode), 16))

> +	return (regno & 1) == 0;

> +    }

> +  else if (FP_REGNUM_P (regno))

>      {

>        if (vec_flags & VEC_STRUCT)

>  	return end_hard_regno (mode, regno) - 1 <= V31_REGNUM;

> -- 

> 2.17.1

>

Patch

diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index 49b47382b5d..ce4d7e51d00 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -1451,10 +1451,14 @@  aarch64_hard_regno_mode_ok (unsigned regno, machine_mode mode)
   if (regno == FRAME_POINTER_REGNUM || regno == ARG_POINTER_REGNUM)
     return mode == Pmode;
 
-  if (GP_REGNUM_P (regno) && known_le (GET_MODE_SIZE (mode), 16))
-    return true;
-
-  if (FP_REGNUM_P (regno))
+  if (GP_REGNUM_P (regno))
+    {
+      if (known_le (GET_MODE_SIZE (mode), 8))
+	return true;
+      else if (known_le (GET_MODE_SIZE (mode), 16))
+	return (regno & 1) == 0;
+    }
+  else if (FP_REGNUM_P (regno))
     {
       if (vec_flags & VEC_STRUCT)
 	return end_hard_regno (mode, regno) - 1 <= V31_REGNUM;