🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #309965

Re: Mnożenie i dodawanie 64 bitowych liczb

#309965
From: Wojciech Muła
Date: Tue, 05 Nov 2019 12:02
44 lines
3073 bytes
On Tuesday, November 5, 2019 at 12:31:33 PM UTC+1, Borneq wrote:
> Mam x*y+a+b
> Mnożenie używa intrin.h lub GCC 128 bitów według 
> https://stackoverflow.com/questions/28868367/getting-the-high-part-of-64-bit-integer-multiplication
> 
> Teraz mam jeszcze dodanie dwóch liczb 64 bitowych do 128 bitowego 
> rezultatu złożonego z dwóch zmiennych
> przy dodawaniu albo nie nastąpi przepełnienie albo gdy nastąpi to 
> starszy wyraz zwiększamy o 1,
> można zrobić jakąś detekcję, gdy po dodaniu wynik jest mniejszy niż 
> każdy ze składników, wystarczy chyba porównać z jednym dowolnym, to 
> zwiększamy o 1, nie trzeba by nawet działać na 128 bitach, ale...
> musiałbym użyć if, które chyba od Pentium jest wolne, bo niszczy 
> potokowość instrukcji.
> I czy lepiej
> 128+64
> 128+64
> 
> czy najpierw zsumować dwa mniejsze:
> 64+64 = 64 + carry
> 128+64+carry
> 
> Wolałbym nie robić wstawek w assemblerze, przy mnożeniu się udało, gdy 
> korzystam z intrin.h , ale została jeszcze drobnostka dwóch dodawań.

Zamiast gdybać o przedpotopowych Pentiumach warto sprawdzić, co robi
kompilator.

#include <cstdint>

void add(uint64_t a, uint64_t b, uint64_t& lo, uint64_t& hi)
{
    hi += uint64_t(__builtin_uaddl_overflow(a, b, &lo));
}

Powyższy kod jest kompilowany przez GCC i clanga do:

  add rdi, rsi
  mov QWORD PTR [rdx], rdi
  adc QWORD PTR [rcx], 0

Kompilator intela generuje dłuższy kod, ale też bez skoków.

w.
Technical Details
Message-ID: <e5372521-e12e-4b7d-ad7d-f622d65962d9@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!3.eu.feeder.erje.net!feeder.erje.net!news.unit0.net!newsreader4.netcologne.de!news.netcologne.de!peer03.ams1!peer.ams1.xlned.com!news.xlned.com!peer03.am4!peer.am4.highwinds-media.com!peer01.iad!feed-me.highwinds-media.com!news.highwinds-media.com!j16no2075171qtl.0!news-out.google.com!g53ni731qtg.0!nntp.google.com!j16no2075168qtl.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
References: <5dc15d6b$0$551$65785112@news.neostrada.pl>

Show Full Headers
Complete Article Headers
X-Received: by 2002:ac8:66ca:: with SMTP id m10mr17267345qtp.298.1572955362141;        Tue, 05 Nov 2019 04:02:42 -0800 (PST)
X-Received: by 2002:a81:298e:: with SMTP id p136mr23462776ywp.288.1572955361658; Tue, 05 Nov 2019 04:02:41 -0800 (PST)
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!2.eu.feeder.erje.net!3.eu.feeder.erje.net!feeder.erje.net!news.unit0.net!newsreader4.netcologne.de!news.netcologne.de!peer03.ams1!peer.ams1.xlned.com!news.xlned.com!peer03.am4!peer.am4.highwinds-media.com!peer01.iad!feed-me.highwinds-media.com!news.highwinds-media.com!j16no2075171qtl.0!news-out.google.com!g53ni731qtg.0!nntp.google.com!j16no2075168qtl.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
Newsgroups: pl.comp.lang.c
Date: Tue, 5 Nov 2019 04:02:41 -0800 (PST)
In-Reply-To: <5dc15d6b$0$551$65785112@news.neostrada.pl>
Complaints-To: groups-abuse@google.com
Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=131.228.32.166; posting-account=VFwkXwoAAADdT4-lLKRZrMYkTjizGoyn
NNTP-Posting-Host: 131.228.32.166
References: <5dc15d6b$0$551$65785112@news.neostrada.pl>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <e5372521-e12e-4b7d-ad7d-f622d65962d9@googlegroups.com>
Subject: Re: Mnożenie i dodawanie 64 bitowych liczb
From: Wojciech Muła <wojciech_mula@poczta.onet.pl>
Injection-Date: Tue, 05 Nov 2019 12:02:42 +0000
X-Received-Bytes: 3115
X-Received-Body-CRC: 2415754659
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit