Re: Custom Float Instructions

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I hope my question is clear to you?

On Wed, Aug 7, 2024 at 4:34 PM Amit Hiremath <amit.hmath@xxxxxxxxxxxxxx>
wrote:

> This section I am not clear:
>
> There is no need for asm volatile, asm is enough because there are
> no side effects other than the computation.  And for compile-time
> constants, there is no need for asm, like in:
>
> if (__builtin_constant_p (sinf (x))
>     y = sinf (x);
> else
>     __asm ("..." : "=r" (y), ...);
>
> It seems to me that one still needs to use __asm macro after adding new
> instruction.  But what  I am asking is, if I write sample c code like this:
>
> #include <math.h>
> #include <stdio.h>
>
> int main()
> {
>     float angle1 = 3.1415926;
>     printf("sin(3.14) = %.2lf\n", sin(angle1));
>     return 0;
> }
>
> I am expecting the compiler should emit 'sin instruction'   to RISC-V
> processor without __asm micro, is it possible the above sample code way?
>
> On Wed, Aug 7, 2024 at 4:24 PM Georg-Johann Lay <avr@xxxxxxxx> wrote:
>
>>
>>
>> Am 07.08.24 um 12:04 schrieb Amit Hiremath:
>> > Hello Georg-Johann,
>> >
>> > Thanks for the clarification. Actually, I do not want to use asm. If I
>> > write sample c code like this:
>>
>> So what part of my answer about GCC insns is unclear to you?
>>
>> Johann
>>
>>
>> > #include <math.h>
>> > #include <stdio.h>
>> >
>> > int main()
>> > {
>> >      float angle1 = 3.1415926;
>> >      printf("sin(3.14) = %.2lf\n", sin(angle1));
>> >      return 0;
>> > }
>> >
>> > The compiler should emit this instruction to the concerned FPU part in
>> > RISC-V.  Is it possible this way? Since RISC-V does not have
>> > instructions for sine, cosine, exp, etc.  they are taken care of by
>> > soft fp libraries.  I guess I do not need to rename instructions?
>> >
>> > Thanks,
>> > -Amit
>> >
>> > On Wed, Aug 7, 2024 at 3:11 PM Georg-Johann Lay <avr@xxxxxxxx
>> > <mailto:avr@xxxxxxxx>> wrote:
>> >
>> >     Am 07.08.24 um 08:24 schrieb Amit Hiremath:
>> >      > Hello,
>> >      >
>> >      > I want to add custom single precision floating point sine,
>> >     cosine, exp
>> >      > instructions to risc-v gnu tool chain, and I have designed
>> >     hardware for
>> >      > this. I was going through tutorials on how to add custom
>> >     instructions at:
>> >      > https://pcotret.gitlab.io/riscv-custom/sw_toolchain.html
>> >     <https://pcotret.gitlab.io/riscv-custom/sw_toolchain.html> after
>> adding
>> >      > custom instructions, I think one has to use asm volatile macro
>> to use
>> >      > custom instructions in C. Is there anyway where one do not need
>> >     to use this
>> >
>> >     Hi, There is no need for asm volatile, asm is enough because there
>> are
>> >     no side effects other than the computation.  And for compile-time
>> >     constants, there is no need for asm, like in:
>> >
>> >     if (__builtin_constant_p (sinf (x))
>> >          y = sinf (x);
>> >     else
>> >          __asm ("..." : "=r" (y), ...);
>> >
>> >      > macro? I would like the compiler to automatically map to custom
>> >      > instructions in the risc-v processor, like how it will map to
>> fadd.s,
>> >      > fmul.s instructions, where one does not need to use asm volatile
>> >     macro.
>> >
>> >     This would be a new insn named "sinsf2" for sinf.  The "sf" stands
>> for
>> >     SFmode (single float, e.g. IEEE single).
>> >
>> >     https://gcc.gnu.org/onlinedocs/gccint/Standard-Names.html
>> >     <https://gcc.gnu.org/onlinedocs/gccint/Standard-Names.html>
>> >
>> >     You can have a look at how other backends are doing it, for example
>> >     grep the GCC sources:
>> >
>> >     $ grep -rn '"sin' gcc/config | grep -v single
>> >
>> >     which yields a dozen or so hits, for example nvptx:
>> >
>> >     (define_insn "sinsf2"
>> >         [(set (match_operand:SF 0 "nvptx_register_operand" "=R")
>> >              (unspec:SF [(match_operand:SF 1 "nvptx_register_operand"
>> "R")]
>> >                         UNSPEC_SIN))]
>> >         "flag_unsafe_math_optimizations"
>> >         "%.\\tsin.approx%t0\\t%0, %1;")
>> >
>> >     (I don't know whether unspec is still required today. rtl.def
>> >     doesn't seen to have sin, so yes, you need an unspec.)
>> >
>> >     The insn condition is presumably because the nvptx sinf is not
>> >     fully IEEE compliant.  When sinf is available on some devices
>> >     but not on others, the insn condition would express that, too.
>> >
>> >     The constraints would be the same like in an asm. When there
>> >     are no appropriate constraints and the asm is using local
>> >     register variables, then you'll have to add new register
>> >     constraints and register classes that describe which
>> >     hard registers are appropriate for the new instruction.
>> >     (But notice that there is an upcoming feature that allows
>> >     single hard register as a constraint like "{r42}".)
>> >
>> >     Finally, as you also have cosf, you would also add insns
>> >     for cossf2 and sincossf3.
>> >
>> >     HTH
>> >
>> >     Johann
>> >
>> >      > I asked in riscv gnu tool chain forum about this issue:
>> >      > https://github.com/riscv-collab/riscv-gnu-toolchain/issues/1526
>> >     <https://github.com/riscv-collab/riscv-gnu-toolchain/issues/1526>
>> they
>> >      > suggested that I ask this query in the gcc forum.
>> >      >
>> >      > Can you please guide me?
>> >      >
>> >      > Many Thanks,
>> >      > -Amith
>> >
>>
>




[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux