On неделя, 9 юни 2019 г. 17:38:58 EEST Segher Boessenkool wrote: > Hi Dimitar, > > Just some comments, do with it what you want :-) > > On Sun, Jun 09, 2019 at 11:01:38PM +0300, Dimitar Dimitrov wrote: > > +; An unfortunate side effect is that quite a few invalid RTL patterns are > > +; generated. For example: > > +; ... (zero_extend:SI (match_operand:SI ...)) ... > > You could perhaps use a mode iterator like rs6000's EXTHI and friends. The machine description already extensively uses mode iterators.
The example in that comment is written with SI mode for brevity. > > > +; These patterns are harmless since no pass should generate such RTL. > > This +; shortcut allows us to keep small and concise machine description > > patterns. > But the generated code (of GCC itself) will be larger. It's also not > harmless in that it can complicate your debugging, problems take longer > to spot. I'm afraid that's the best I can do without tooling upgrades. Reference: https://gcc.gnu.org/ml/gcc-patches/2018-09/msg00688.html > > > +(define_insn > > "add_impl<EQD:mode><EQS0:mode><EQS1:mode>_<alu3_zext><alu3_zext_op1><alu3 > > _zext_op2>" > Many lines are too long. Not that it is clear how to fix that in this > particular case ;-) Those ones I'm not sure how to break. The C code should conform to GNU standards, though. > > > + [(set_attr "type" "alu,alu,alu")]) > > You can just say > > [(set_attr "type" "alu")]) > > if all alternatives are the same value for an attribute. I'll fix it. Thanks. > > > +(define_insn "one_impl<EQD:mode><EQS0:mode>_<alu2_zext>" > > The standard pattern is called one_cmpl, so maybe you want one_cmpl_impl > here? one_impl looks like a typo. I'll update to one_cmpl_impl. Thanks. > > > +(define_subst "alu2_zext_subst" > > + [(set (match_operand:EQD 0 "" "") > > + (ALUOP2:EQD (zero_extend:EQD (match_operand:EQD 1 "" ""))))] > > I don't know if this actually works for define_subst, but at least in many > other cases you can write this like > > (define_subst "alu2_zext_subst" > [(set (match_operand:EQD 0) > (ALUOP2:EQD (zero_extend:EQD (match_operand:EQD 1))))] > > (you can omit trailing empty string arguments). Indeed, genmddump generates the same output with or without the empty strings. I was not sure which is the preferred form, though. I see lots of MD definitions in the GCC tree with empty strings. > > > +(define_predicate "pru_muldst_operand" > > + (match_code "subreg,reg") > > +{ > > + if (register_operand (op, mode)) > > + { > > + int regno; > > + > > + if (REG_P (op)) > > + regno = REGNO (op); > > + else if (GET_CODE (op) == SUBREG && REG_P (SUBREG_REG (op))) > > + regno = REGNO (SUBREG_REG (op)); > > + else > > + return 0; > > + > > + return REGNO_REG_CLASS (regno) == MULDST_REGS > > + || regno >= FIRST_PSEUDO_REGISTER; > > + } > > + return 0; > > +}) > > > > > > +static bool > > +pru_hard_regno_scratch_ok (unsigned int regno) > > +{ > > + /* Don't allow hard registers that might be part of the frame pointer. > > + Some places in the compiler just test for > > [HARD_]FRAME_POINTER_REGNUM > > + and don't handle a frame pointer that spans more than one register. > > + TODO: Fix those faulty places. */ > > + > > + if ((!reload_completed || frame_pointer_needed) > > + && ((regno >= HARD_FRAME_POINTER_REGNUM > > + && regno <= HARD_FRAME_POINTER_REGNUM + 3) > > + || (regno >= FRAME_POINTER_REGNUM > > + && regno <= FRAME_POINTER_REGNUM + 3))) > > + return false; > > Use IN_RANGE? Sounds good. Will rewrite it. > > > + /* QBxx conditional branching cannot cope with block reordering. */ > > + if (flag_reorder_blocks_and_partition) > > + { > > + inform (input_location, "%<-freorder-blocks-and-partition%> " > > + "not supported on this architecture"); > > + flag_reorder_blocks_and_partition = 0; > > + flag_reorder_blocks = 1; > > + } > > What you cannot cope with is the hot/cold partitioning, I guess -- > otherwise you'd have to disable reorder_blocks itself, and that would > result in pretty terrible code. Yes. > > > +; There is no pipeline, so our scheduling description is simple. > > +(define_automaton "pru") > > +(define_cpu_unit "cpu" "pru") > > + > > +(define_insn_reservation "everything" 1 (match_test "true") "cpu") > > Because you have a scheduling description, INSN_SCHEDULING is defined, > and that makes combine not create SUBREGs of MEM. Which is pretty > important :-) Would lack of INSN_SCHEDULING result in a more efficient target code? Is it recommended? I added dummy scheduling as a precaution to avoid issues like PR78883 for AVR. BTW, today I tested with and without scheduling description for PRU. I didn't get any new testsuite failures. > > > It looks like a quite complete port, congratulations :-) > > > Segher Thank you, Dimitar