Re: Custom Float Instructions

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

 



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