https://gcc.gnu.org/g:819056304acea25b44313f402a5d9d51bf49d4cf
commit 819056304acea25b44313f402a5d9d51bf49d4cf Author: Michael Meissner <meiss...@linux.ibm.com> Date: Fri May 24 13:20:47 2024 -0400 Add -mintspr. 2024-05-24 Michael Meissner <meiss...@linux.ibm.com> * config/rs6000/rs6000.cc (rs6000_hard_regno_mode_ok_uncached): Add support for -mintspr. * config/rs6000/rs6000.md (mov<mode>_internal): Add support for moving QI/HImode to/from SPRs back. * config/rs6000/rs6000.opt (-mintspr): New switch. Diff: --- gcc/config/rs6000/rs6000.cc | 6 +++++- gcc/config/rs6000/rs6000.md | 17 ++++++++++------- gcc/config/rs6000/rs6000.opt | 4 ++++ 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc index f72c62f4e5f..fa330c2a4b1 100644 --- a/gcc/config/rs6000/rs6000.cc +++ b/gcc/config/rs6000/rs6000.cc @@ -1952,7 +1952,11 @@ rs6000_hard_regno_mode_ok_uncached (int regno, machine_mode mode) case LR_REGNO: case CTR_REGNO: case TAR_REGNO: - return (!orig_complex_p && mode == Pmode); + return (!orig_complex_p + && (mode == Pmode + || (TARGET_INTSPR + && SCALAR_INT_MODE_P (mode) + && GET_MODE_SIZE (mode) <= UNITS_PER_WORD))); default: break; diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index d1ab06998c7..b5dc0719a88 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -8064,16 +8064,16 @@ ;; MR LHZ/LBZ LXSI*ZX STH/STB STXSI*X LI ;; XXLOR load 0 load -1 VSPLTI* # MFVSRWZ -;; MTVSRWZ +;; MTVSRWZ MF%1 MT%1 NOP (define_insn "*mov<mode>_internal" [(set (match_operand:QHI 0 "nonimmediate_operand" "=r, r, wa, m, ?Z, r, wa, wa, wa, v, ?v, r, - wa") + wa, r, *c*l, *h") (match_operand:QHI 1 "input_operand" "r, m, ?Z, r, wa, i, wa, O, wM, wB, wS, wa, - r"))] + r, *h, r, 0"))] "gpc_reg_operand (operands[0], <MODE>mode) || gpc_reg_operand (operands[1], <MODE>mode)" "@ @@ -8089,19 +8089,22 @@ vspltis<wd> %0,%1 # mfvsrwz %0,%x1 - mtvsrwz %x0,%1" + mtvsrwz %x0,%1 + mf%1 %0 + mt%0 %1 + nop" [(set_attr "type" "*, load, fpload, store, fpstore, *, vecsimple, vecperm, vecperm, vecperm, vecperm, mfvsr, - mtvsr") + mtvsr, mfjmpr, mtjmpr, *") (set_attr "length" "*, *, *, *, *, *, *, *, *, *, 8, *, - *") + *, *, *, *") (set_attr "isa" "*, *, p9v, *, p9v, *, p9v, p9v, p9v, p9v, p9v, p9v, - p9v")]) + p9v, *, *, *")]) ;; Here is how to move condition codes around. When we store CC data in diff --git a/gcc/config/rs6000/rs6000.opt b/gcc/config/rs6000/rs6000.opt index 7f7a283bc99..bac74695f64 100644 --- a/gcc/config/rs6000/rs6000.opt +++ b/gcc/config/rs6000/rs6000.opt @@ -634,6 +634,10 @@ mtar Target Undocumented Mask(TAR) Var(rs6000_isa_flags) Allow (do not allow) use the TAR register. +mintspr +Target Undocumented Var(TARGET_INTSPR) Init(0) Save +Allow (do not allow) small integers in SPR registers. + ; Documented parameters -param=rs6000-vect-unroll-limit=