Article View: pl.comp.lang.asm
Article #2032Re: nie widzi stanu flag po “sub”?
From: Bogdan (bogdro)
Date: Wed, 23 Sep 2009 15:56
Date: Wed, 23 Sep 2009 15:56
86 lines
3634 bytes
3634 bytes
gupi manʼaʼgo pisze:
> mamy strukturę, której istotny fragment jak niżej:
> ❝
> struct s_t
> { // …
> unsigned n;
> // …
> };
> ❞
> mamy dwie równoważne w efekcie procedury jak niżej:
> ❝
> void
> proc_1( struct s_t *s,
> unsigned count
> )
> { if( s->n >= count )
> s->n -= count;
> else
> s->n = 0;
> }
> void
> proc_2( struct s_t *s,
> unsigned count
> )
> { if(( s->n -= count ) > count )
> s->n = 0;
> }
> ❞
> ⁂
> co zrobić, by kompilator ‟gcc 4.3.2” zauważył, że po odejmowaniu instru-
> kcją “sub” ma flagi, które może wykorzystać zamiast umieszczać instruk-
> cje “cmp”?
> a może ja się mylę?
> ❝
> <proc_1>:
> 8b 47 10 mov 0x10(%rdi),%eax
> 39 f0 cmp %esi,%eax
> 73 08 jae 0f
> c7 47 10 00 00 00 00 movl $0x0,0x10(%rdi)
> c3 retq
> 29 f0 0: sub %esi,%eax
> 89 47 10 mov %eax,0x10(%rdi)
> c3 retq
> <proc_2>:
> 8b 57 10 mov 0x10(%rdi),%edx
> 29 f2 sub %esi,%edx
> 39 d6 cmp %edx,%esi # nadmiarowa?
> b8 00 00 00 00 mov $0x0,%eax
> 0f 43 c2 cmovae %edx,%eax
> 89 47 10 mov %eax,0x10(%rdi)
> c3 retq
> ❞
> ⁂
> może w takiej kolejności, jeśli można :-) :
> 1. czy się mylę?
Wygląda na to, że nie.
> 2. czy kompilator robi to specjalnie ze względu na wewnętrzne działa-
> nie ‘cpu’, któremu pomaga w czymś ta instrukcja “cmp”.
Raczej nie. Co prawda wtykanie instrukcji czasem może poprawić
wydajność kodu, ale w tym przypadku CMP faktycznie chyba jest
niepotrzebna.
> 3. co zrobić, by zapis w ‟C” był ładny, a mimo to nie było nadmiarowej
> “cmp”?
Po pierwsze, włącz optymalizacje, jeśli jeszcze tego nie zrobiłeś. Po
drugie, wypróbuj może wyrażenia warunkowe, np.
s->n = (s->n >= count)? s->n - count : 0;
s->n -= (s->n >= count)? count : s->n;
> 4. a jeśli nic nie da się zrobić łatwo :-) , to jak składniowo pytać
> w ‟C” o odpowiednią flagę bez użycia wstawek “asm”?
Nie jest mi znany żaden sposób na wykonanie tego. Jak kompilator
miałby przenieść taki operator czy funkcję na architekturę, która nie
ma podobnych flag co x86?
--
Pozdrawiam/Regards - Bogdan (GNU/Linux & FreeDOS)
Kurs asemblera x86 (DOS, GNU/Linux):http://rudy.mif.pg.gda.pl/~bogdro
Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
www.JabberPL.org www.TorProject.org Soft (EN): miniurl.pl/bogdro-soft
Technical Details
Message-ID:
<h9dgf8$le2$1@inews.gazeta.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mailReferences:
<h9c3fs$bi4$1@adenine.netfront.net>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail From: "Bogdan (bogdro)" <bogdan@poczta.gazeta.pl> Newsgroups: pl.comp.lang.c,pl.comp.lang.asm Subject: Re: nie widzi stanu flag po “sub”? Date: Wed, 23 Sep 2009 17:56:22 +0200 Organization: "Portal Gazeta.pl -> http://www.gazeta.pl" Lines: 86 Message-ID: <h9dgf8$le2$1@inews.gazeta.pl> References: <h9c3fs$bi4$1@adenine.netfront.net> NNTP-Posting-Host: foi.americanprogress.org Mime-Version: 1.0 X-Trace: inews.gazeta.pl 1253721385 21954 206.205.112.34 (23 Sep 2009 15:56:25 GMT) X-Complaints-To: usenet@agora.pl NNTP-Posting-Date: Wed, 23 Sep 2009 15:56:25 +0000 (UTC) X-User: bog.d In-Reply-To: <h9c3fs$bi4$1@adenine.netfront.net> User-Agent: Thunderbird 2.0.0.23 (X11/20090812) Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit