🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.asm
Article #2606

Re: [1/3 NTG] C - Optymalizacje wstawkami

#2606
From: DMR
Date: Thu, 06 Jun 2019 09:27
91 lines
3919 bytes
W wolnej chwili zmajstrowałem sobie prostą "biblioteczkę" z podstawowymi funkcjami matematycznymi. Posłużyłem się przy tym "gotowcami" zamieszczonymi na stronie: https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html

Sqrt liczy się tylko symbolicznie szybciej niż sqrt z biblioteki math.h, pozostałe funkcje są szybsze od 2x wzwyż.

Za Chiny nie mogę rozkminić tych literek między dwukropkami, ale wprowadziłem pewne korekty, per analogiam - i (chyba) działa... ;-)

W przypadku "jednoargumentowych" wyrażeń sugerowana jest składnia:

asm ("foo" : "=&t" (a) : "f" (b));

Przy okazji testów szybkości zauważyłem jednak, że jeśli w ten sposób zakoduję funkcje Sin() i Cos(), to w przypadku wywołania w kodzie programu:

sin = Sin(a);
cos = Cos(a);

poprawnie liczy się kosinus, ale w przypadku sinusa wychodzą jakieś głupoty.
Wywołanie typu:

tan = Sin(a) / Cos(a)

w ogóle się wywala, a przecież mam tego używać...

Poprzez analogię do przykładu z fsincos i fyl2xp1 do zmieniłem "f" na "0" i wywaliłem ampersanda sprzed t:

asm ("foo" : "=t" (a) : "0" (b));


No i teraz wszystko gra!

A dlaczego? Nie mam pojęcia... ;-)





//------------------------------------------------------------------------------
inline double Sqrt(double x)
{
double s;

   asm ("fsqrt" : "=t" (s) : "0" (x));

   return s;
}
//------------------------------------------------------------------------------
inline double Sin(double a)
{
double s;

   asm ("fsin" : "=t" (s) : "0" (a));

   return s;
}
//------------------------------------------------------------------------------
inline double Cos(double a)
{
double c;

   asm ("fcos" : "=t" (c) : "0" (a));

   return c;
}
//------------------------------------------------------------------------------
inline void SinCos(double a, double *sin, double *cos)
{
double s, c;

   asm ("fsincos" : "=t" (c), "=u" (s) : "0" (a));

   *sin = s;
   *cos = c;
}
//------------------------------------------------------------------------------
inline double Tan(double a)
{
double t, o;

   asm ("fptan" : "=t" (o), "=u" (t) : "0" (a));

   return t;
}
//------------------------------------------------------------------------------
inline double ATan(double y, double x)
{
double a;

   asm ("fpatan" : "=t" (a) : "0" (x), "u" (y) : "st(1)");

   return a;
}
//------------------------------------------------------------------------------
Technical Details
Message-ID: <55cb70ec-3acf-43dd-ae35-5821e4c2d51d@googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!2.eu.feeder.erje.net!4.us.feeder.erje.net!feeder.erje.net!weretis.net!feeder6.news.weretis.net!feeder.usenetexpress.com!feeder-in1.iad1.usenetexpress.com!border1.nntp.dca1.giganews.com!nntp.giganews.com!s188no3150itb.0!news-out.google.com!l126ni131itl.0!nntp.google.com!i64no162181iti.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
References: <30292520-12bd-49f0-b5ce-39c9af378a4c@googlegroups.com>

Show Full Headers
Complete Article Headers
X-Received: by 2002:a02:298b:: with SMTP id p133mr32068279jap.37.1559813266342;        Thu, 06 Jun 2019 02:27:46 -0700 (PDT)
X-Received: by 2002:a05:6830:20c6:: with SMTP id z6mr14330641otq.58.1559813266117; Thu, 06 Jun 2019 02:27:46 -0700 (PDT)
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!2.eu.feeder.erje.net!4.us.feeder.erje.net!feeder.erje.net!weretis.net!feeder6.news.weretis.net!feeder.usenetexpress.com!feeder-in1.iad1.usenetexpress.com!border1.nntp.dca1.giganews.com!nntp.giganews.com!s188no3150itb.0!news-out.google.com!l126ni131itl.0!nntp.google.com!i64no162181iti.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
Newsgroups: pl.comp.lang.asm
Date: Thu, 6 Jun 2019 02:27:45 -0700 (PDT)
In-Reply-To: <30292520-12bd-49f0-b5ce-39c9af378a4c@googlegroups.com>
Complaints-To: groups-abuse@google.com
Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=185.93.94.233; posting-account=FE4hoAoAAADKg8EtnA4bEyQiJf7iqAgV
NNTP-Posting-Host: 185.93.94.233
References: <30292520-12bd-49f0-b5ce-39c9af378a4c@googlegroups.com>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <55cb70ec-3acf-43dd-ae35-5821e4c2d51d@googlegroups.com>
Subject: Re: [1/3 NTG] C - Optymalizacje wstawkami
From: DMR <mezzogm@gmail.com>
Injection-Date: Thu, 06 Jun 2019 09:27:46 +0000
Lines: 108
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit