Hi Juzhe,
in principle this LGTM. It could use some function comments, though ;)
> +imm_avl_p (machine_mode mode)
> {
> poly_uint64 nuints = GET_MODE_NUNITS (mode);
>
> return nuints.is_constant ()
> - /* The vsetivli can only hold register 0~31. */
> - ? (IN_RANGE (nuints.to_constant (), 0, 31))
> - /* Only allowed in VLS-VLMAX mode. */
> - : false;
> + /* The vsetivli can only hold register 0~31. */
> + ? (IN_RANGE (nuints.to_constant (), 0, 31))
> + /* Only allowed in VLS-VLMAX mode. */
> + : false;
> }
Please replace nuints (or untis) with nunits here everywhere.
> +;; The index of operand[] represents the machine mode of the instruction.
> +(define_attr "mode_idx" ""
> + (cond [(eq_attr "type"
> "vlde,vste,vldm,vstm,vlds,vsts,vldux,vldox,vldff,vldr,vstr,\
> +
> vlsegde,vlsegds,vlsegdux,vlsegdox,vlsegdff,vialu,vext,vicalu,\
> +
> vshift,vicmp,viminmax,vimul,vidiv,vimuladd,vimerge,vimov,\
> +
> vsalu,vaalu,vsmul,vsshift,vfalu,vfmul,vfdiv,vfmuladd,vfsqrt,vfrecp,\
> + vfcmp,vfminmax,vfsgnj,vfclass,vfmerge,vfmov,\
> +
> vfcvtitof,vfncvtitof,vfncvtftoi,vfncvtftof,vmalu,vmiota,vmidx,\
> +
> vimovxv,vfmovfv,vslideup,vslidedown,vislide1up,vislide1down,vfslide1up,vfslide1down,\
> + vgather,vcompress,vmov")
> + (const_int 0)
> +
> + (eq_attr "type" "vimovvx,vfmovvf")
> + (const_int 1)
> +
> + (eq_attr "type" "vssegte,vnshift,vmpop,vmffs")
> + (const_int 2)
I'm not that fond of the growing number of necessary indices even though I
realize that it's the most painless way for now. Why is vnshift "2" and
not "0", though?
"4" for vnclip also looks dubious. I didn't go through all of them.
Regards
Robin