Message ID | 20181002161915.18843-10-richard.henderson@linaro.org |
---|---|
State | New |
Headers | show |
Series | LSE atomics out-of-line | expand |
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 >
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;