在 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!

Reply via email to