在 2024/9/10 17:30, Xi Ruoyao 写道: > On Tue, 2024-09-10 at 16:50 +0800, 梅杰 wrote: >> As for the function `__builtin_rint`, although it exists, however, after >> defining the instruction in `mips.md`, GCC still won't generate `RINT.fmt` >> instruction for MIPS, it generates following code instead: >> >>> lui $28,%hi(__gnu_local_gp) >>> addiu $28,$28,%lo(__gnu_local_gp) >>> lw $25,%call16(rint)($28) >>> .reloc 1f,R_MIPS_JALR,rint > > Why? > > Whis this: > > diff --git a/gcc/config/mips/mips.md b/gcc/config/mips/mips.md > index f147667d63a..0c1ef77a816 100644 > --- a/gcc/config/mips/mips.md > +++ b/gcc/config/mips/mips.md > @@ -100,6 +100,7 @@ (define_c_enum "unspec" [ > ;; Floating-point unspecs. > UNSPEC_FMIN > UNSPEC_FMAX > + UNSPEC_RINT > > ;; HI/LO moves. > UNSPEC_MFHI > @@ -8025,6 +8026,14 @@ (define_peephole2 > (any_extend:SI (match_dup 3)))])] > "") > > +(define_insn "rint<mode>2" > + [(set (match_operand:SCALARF 0 "register_operand" "=f") > + (unspec:SCALARF [(match_operand:SCALARF 1 "register_operand" " f")] > + UNSPEC_RINT))] > + "mips_isa_rev >= 6" > + "rint.<fmt>\t%0,%1") > + > + > > > ;; Synchronization instructions. > > it works for me:
Yes, you are right! I have applied this patch into my current code and I can confirm that by changing `frint_<mode>` to `rint<mode>2` works. GCC will generate `RINT.fmt` instruction correctly with built-in funtion `__builtin_rint` after applying the patch. Maybe you can write a patch for `RINT.fmt`? I will update this patch and remove code related to `RINT.fmt`, if you could do that. At the same time, could anyone review the rest of this patch? Thanks!