Ping. On Tue, Jan 12, 2021 at 02:02:18PM +1030, Alan Modra wrote: > Ping > https://gcc.gnu.org/pipermail/gcc-patches/2020-October/555756.html > > On Thu, Oct 08, 2020 at 09:27:57AM +1030, Alan Modra wrote: > > * config/rs6000/rs6000.c (rotate_insert_cost): New function. > > (rs6000_rtx_costs): Cost IOR. > > > > diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c > > index 383d2901c9f..15a806fe307 100644 > > --- a/gcc/config/rs6000/rs6000.c > > +++ b/gcc/config/rs6000/rs6000.c > > @@ -21206,6 +21206,91 @@ rs6000_cannot_copy_insn_p (rtx_insn *insn) > > && get_attr_cannot_copy (insn); > > } > > > > +/* Handle rtx_costs for scalar integer rotate and insert insns. */ > > + > > +static bool > > +rotate_insert_cost (rtx left, rtx right, machine_mode mode, bool speed, > > + int *total) > > +{ > > + if (GET_CODE (right) == AND > > + && CONST_INT_P (XEXP (right, 1)) > > + && UINTVAL (XEXP (left, 1)) + UINTVAL (XEXP (right, 1)) + 1 == 0) > > + { > > + rtx leftop = XEXP (left, 0); > > + rtx rightop = XEXP (right, 0); > > + > > + /* rotlsi3_insert_5. */ > > + if (REG_P (leftop) > > + && REG_P (rightop) > > + && mode == SImode > > + && UINTVAL (XEXP (left, 1)) != 0 > > + && UINTVAL (XEXP (right, 1)) != 0 > > + && rs6000_is_valid_mask (XEXP (left, 1), NULL, NULL, mode)) > > + return true; > > + /* rotldi3_insert_6. */ > > + if (REG_P (leftop) > > + && REG_P (rightop) > > + && mode == DImode > > + && exact_log2 (-UINTVAL (XEXP (left, 1))) > 0) > > + return true; > > + /* rotldi3_insert_7. */ > > + if (REG_P (leftop) > > + && REG_P (rightop) > > + && mode == DImode > > + && exact_log2 (-UINTVAL (XEXP (right, 1))) > 0) > > + return true; > > + > > + rtx mask = 0; > > + rtx shift = leftop; > > + rtx_code shift_code = GET_CODE (shift); > > + /* rotl<mode>3_insert. */ > > + if (shift_code == ROTATE > > + || shift_code == ASHIFT > > + || shift_code == LSHIFTRT) > > + mask = right; > > + else > > + { > > + shift = rightop; > > + shift_code = GET_CODE (shift); > > + /* rotl<mode>3_insert_2. */ > > + if (shift_code == ROTATE > > + || shift_code == ASHIFT > > + || shift_code == LSHIFTRT) > > + mask = left; > > + } > > + if (mask > > + && CONST_INT_P (XEXP (shift, 1)) > > + && rs6000_is_valid_insert_mask (XEXP (mask, 1), shift, mode)) > > + { > > + *total += rtx_cost (XEXP (shift, 0), mode, shift_code, 0, speed); > > + *total += rtx_cost (XEXP (mask, 0), mode, AND, 0, speed); > > + return true; > > + } > > + } > > + /* rotl<mode>3_insert_3. */ > > + if (GET_CODE (right) == ASHIFT > > + && CONST_INT_P (XEXP (right, 1)) > > + && (INTVAL (XEXP (right, 1)) > > + == exact_log2 (UINTVAL (XEXP (left, 1)) + 1))) > > + { > > + *total += rtx_cost (XEXP (left, 0), mode, AND, 0, speed); > > + *total += rtx_cost (XEXP (right, 0), mode, ASHIFT, 0, speed); > > + return true; > > + } > > + /* rotl<mode>3_insert_4. */ > > + if (GET_CODE (right) == LSHIFTRT > > + && CONST_INT_P (XEXP (right, 1)) > > + && mode == SImode > > + && (INTVAL (XEXP (right, 1)) > > + + exact_log2 (-UINTVAL (XEXP (left, 1)))) == 32) > > + { > > + *total += rtx_cost (XEXP (left, 0), mode, AND, 0, speed); > > + *total += rtx_cost (XEXP (right, 0), mode, LSHIFTRT, 0, speed); > > + return true; > > + } > > + return false; > > +} > > + > > /* Compute a (partial) cost for rtx X. Return true if the complete > > cost has been computed, and false if subexpressions should be > > scanned. In either case, *TOTAL contains the cost result. > > @@ -21253,7 +21338,7 @@ static bool > > rs6000_rtx_costs (rtx x, machine_mode mode, int outer_code, > > int opno ATTRIBUTE_UNUSED, int *total, bool speed) > > { > > - rtx right; > > + rtx left, right; > > int code = GET_CODE (x); > > > > switch (code) > > @@ -21435,7 +21520,7 @@ rs6000_rtx_costs (rtx x, machine_mode mode, int > > outer_code, > > right = XEXP (x, 1); > > if (CONST_INT_P (right)) > > { > > - rtx left = XEXP (x, 0); > > + left = XEXP (x, 0); > > rtx_code left_code = GET_CODE (left); > > > > /* rotate-and-mask: 1 insn. */ > > @@ -21452,9 +21537,16 @@ rs6000_rtx_costs (rtx x, machine_mode mode, int > > outer_code, > > return false; > > > > case IOR: > > - /* FIXME */ > > *total = COSTS_N_INSNS (1); > > - return true; > > + left = XEXP (x, 0); > > + if (GET_CODE (left) == AND > > + && CONST_INT_P (XEXP (left, 1))) > > + { > > + right = XEXP (x, 1); > > + if (rotate_insert_cost (left, right, mode, speed, total)) > > + return true; > > + } > > + return false; > > > > case CLZ: > > case XOR:
-- Alan Modra Australia Development Lab, IBM