Hi! On Tue, Dec 21, 2021 at 04:08:06PM +0800, HAO CHEN GUI wrote: > This patch defines a pattern for mffscrni. If the RN is a constant, it can > call > gen_rs6000_mffscrni directly.
And that isn't more work than just falling through to the general case. Okay. > The "rs6000-builtin-new.def" defines prototype for builtin arguments. > The pattern "rs6000_set_fpscr_rn" is then broken as the mode of its argument > is DI while its > corresponding builtin has a const int argument. I don't understand that bit. Do you mean it is a const_int, or do you mean it is an "int" as in C source code, i.e. a 32-bit integer? > * config/rs6000/rs6000-call.c > (rs6000_expand_set_fpscr_rn_builtin): Not copy argument to a reg if > it's a constant. The pattern for constant can be recognized now. "Do not copy" > * config/rs6000/rs6000.md (rs6000_mffscrni): Defined. "Define". > (rs6000_set_fpscr_rn): Change the type of operand[0] form DI to SI. "from" > Call gen_rs6000_mffscrni when operand[0] is a const int[0,3]. "if operands[0] is a const_0_to_3_operand" > * gcc.target/powerpc/mffscrni_p9.c: New testcase for mffscrni. > * gcc.target/powerpc/test_fpscr_rn_builtin.c: Modify the test cases to > test mffscrn and mffscrni separately. "Test for mffscrn and mffscrni separately." Everything you say in a changelog is "modify this" or "modify that", and (almost) all things in gcc/testsuite/ are testcases :-) > @@ -6357,7 +6370,8 @@ (define_expand "rs6000_set_fpscr_rn" > rtx tmp_di = gen_reg_rtx (DImode); > > /* Extract new RN mode from operand. */ > - emit_insn (gen_anddi3 (tmp_rn, operands[0], GEN_INT (0x3))); > + rtx op0 = convert_to_mode (DImode, operands[0], false); > + emit_insn (gen_anddi3 (tmp_rn, op0, GEN_INT (3))); > > /* Insert new RN mode into FSCPR. */ > emit_insn (gen_rs6000_mffs (tmp_df)); It doesn't seem correct to use DImode with -m32, hrm. Not new of course, but I wonder how this worked. Okay for trunk with such changelog fixes. Thanks! Segher