Thread View: pl.comp.lang.asm
19 messages
19 total messages
Started by yesma
Tue, 20 Jul 2010 15:15
ADD SUB kontra INC DEC
Author: yesma
Date: Tue, 20 Jul 2010 15:15
Date: Tue, 20 Jul 2010 15:15
18 lines
1303 bytes
1303 bytes
http://www.agner.org/instruction_tables.pdf 9 List of instruction timings and μop breakdown for P4E Tyle że niema tutaj podane dla ADD, SUB operands r,i Instruction ADD, SUB INC, DEC Operands r,r r µops 1 2 Microcode 0 0 Latency 1 1 Throughput 0.25 0.5 Port 0/1 0/1 Unit alu0/1 alu0/1 Czy nielepiej jest stosować zawsze ADD SUB zamiast INC DEC ? -- Regards - Grzechu Linux x86_64
Re: ADD SUB kontra INC DEC
Author: Bogdan (bogdro)
Date: Tue, 20 Jul 2010 15:42
Date: Tue, 20 Jul 2010 15:42
28 lines
2064 bytes
2064 bytes
W dniu 20.07.2010 17:15, yesma pisze: > http://www.agner.org/instruction_tables.pdf > 9 List of instruction timings and μop breakdown for P4E > > Tyle że niema tutaj podane dla ADD, SUB operands r,i > > Instruction ADD, SUB INC, DEC > Operands r,r r > µops 1 2 > Microcode 0 0 > Latency 1 1 > Throughput 0.25 0.5 > Port 0/1 0/1 > Unit alu0/1 alu0/1 > > Czy nielepiej jest stosować zawsze ADD SUB zamiast INC DEC ? Zależy, jak zwykle, od procesora docelowego. Na starszych INC/DEC było szybsze, nie mówiąc już nawet o tych procesorach, które np. nie miały pamięci podręcznej (INC/DEC są krótsze, a więc krócej się ładowały z pamięci do procesora). Na nowszych procesorach, według mnie, lepsze jest ADD/SUB. -- 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
Re: ADD SUB kontra INC DEC
Author: yesma
Date: Tue, 20 Jul 2010 17:28
Date: Tue, 20 Jul 2010 17:28
19 lines
1602 bytes
1602 bytes
Bogdan (bogdro) pisze: > W dniu 20.07.2010 17:15, yesma pisze: >> Czy nielepiej jest stosować zawsze ADD SUB zamiast INC DEC ? > > Zależy, jak zwykle, od procesora docelowego. Na starszych INC/DEC > było szybsze, nie mówiąc już nawet o tych procesorach, które np. nie > miały pamięci podręcznej (INC/DEC są krótsze, a więc krócej się > ładowały z pamięci do procesora). Na nowszych procesorach, według > mnie, lepsze jest ADD/SUB. > Będę musiał zmienić swoje przyzwyczajenia bo zawsze używałem INC i DEC a czasami nawet dwa razy pod rząd. A jeśli chodzi o XOR r,r to nie lepiej MOV r,0 lub SUB r,r bo jeśli tak to szkoda mi będzie się z tymi trzema instrukcjami rozstać. -- Regards - Grzechu Linux x86_64
Re: ADD SUB kontra INC DEC
Author: Michoo
Date: Tue, 20 Jul 2010 19:42
Date: Tue, 20 Jul 2010 19:42
11 lines
1210 bytes
1210 bytes
yesma pisze: > A jeśli chodzi o XOR r,r to nie lepiej MOV r,0 lub SUB r,r > bo jeśli tak to szkoda mi będzie się z tymi trzema instrukcjami rozstać. > XOR jest oidp szybszy od sub (które w skali mikro to negacja i dodawanie) i krótsze od MOV co oszczędza cache (a nie ma prawie nic gorszego od kodu pętli, który nie mieści się w L1). -- Pozdrawiam Michoo
Re: ADD SUB kontra INC DEC
Author: yesma
Date: Tue, 20 Jul 2010 20:18
Date: Tue, 20 Jul 2010 20:18
15 lines
1382 bytes
1382 bytes
Michoo pisze: > yesma pisze: >> A jeśli chodzi o XOR r,r to nie lepiej MOV r,0 lub SUB r,r >> bo jeśli tak to szkoda mi będzie się z tymi trzema instrukcjami rozstać. >> > XOR jest oidp szybszy od sub (które w skali mikro to negacja i > dodawanie) i krótsze od MOV co oszczędza cache (a nie ma prawie nic > gorszego od kodu pętli, który nie mieści się w L1). > Dzięki, chociaż jedna ulubiona instrukcja uratowana :) -- Regards - Grzechu Linux x86_64
Re: ADD SUB kontra INC DEC
Author: Wojciech Muła
Date: Wed, 21 Jul 2010 08:08
Date: Wed, 21 Jul 2010 08:08
14 lines
1402 bytes
1402 bytes
Michoo <michoo_news@vp.pl> wrote: > yesma pisze: > > A jeśli chodzi o XOR r,r to nie lepiej MOV r,0 lub SUB r,r > > bo jeśli tak to szkoda mi będzie się z tymi trzema instrukcjami rozstać. > > > XOR jest oidp szybszy od sub (które w skali mikro to negacja i > dodawanie) i krótsze od MOV co oszczędza cache (a nie ma prawie nic > gorszego od kodu pętli, który nie mieści się w L1). XOR r, r jest specjalnie traktowany przez CPU, to polecana metoda zerowania rejestrów. w.
Re: ADD SUB kontra INC DEC
Author: Bogdan (bogdro)
Date: Wed, 21 Jul 2010 16:12
Date: Wed, 21 Jul 2010 16:12
21 lines
1822 bytes
1822 bytes
W dniu 20.07.2010 22:18, yesma pisze: > Michoo pisze: >> yesma pisze: >>> A jeśli chodzi o XOR r,r to nie lepiej MOV r,0 lub SUB r,r >>> bo jeśli tak to szkoda mi będzie się z tymi trzema instrukcjami >>> rozstać. >>> >> XOR jest oidp szybszy od sub (które w skali mikro to negacja i >> dodawanie) i krótsze od MOV co oszczędza cache (a nie ma prawie nic >> gorszego od kodu pętli, który nie mieści się w L1). >> > > Dzięki, chociaż jedna ulubiona instrukcja uratowana :) Chyba że chcesz zachować flagi niezmienione :) Wtedy zostaje MOV. -- 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
Re: ADD SUB kontra INC DEC
Author: Bernard
Date: Thu, 22 Jul 2010 09:24
Date: Thu, 22 Jul 2010 09:24
21 lines
1703 bytes
1703 bytes
On 2010-07-20 17:15, yesma wrote: > http://www.agner.org/instruction_tables.pdf > 9 List of instruction timings and μop breakdown for P4E > > Tyle że niema tutaj podane dla ADD, SUB operands r,i > > Instruction ADD, SUB INC, DEC > Operands r,r r > µops 1 2 > Microcode 0 0 > Latency 1 1 > Throughput 0.25 0.5 > Port 0/1 0/1 > Unit alu0/1 alu0/1 > > Czy nielepiej jest stosować zawsze ADD SUB zamiast INC DEC ? Lepiej, ale dotyczy to tylko procesorów rodziny Pentium 4. Na innych INC/DEC będzie na ogół szybsze, z paru powodów. Wolniejsze będzie tylko wtedy, gdy po instrukcji zajdzie konieczność "składania" znaczników (INC/DEC nie aktualizują wszystkich).
Re: ADD SUB kontra INC DEC
Author: yesma
Date: Thu, 22 Jul 2010 17:17
Date: Thu, 22 Jul 2010 17:17
24 lines
1724 bytes
1724 bytes
Bogdan (bogdro) pisze: > W dniu 20.07.2010 22:18, yesma pisze: >> Michoo pisze: >>> yesma pisze: >>>> A jeśli chodzi o XOR r,r to nie lepiej MOV r,0 lub SUB r,r >>>> bo jeśli tak to szkoda mi będzie się z tymi trzema instrukcjami >>>> rozstać. >>>> >>> XOR jest oidp szybszy od sub (które w skali mikro to negacja i >>> dodawanie) i krótsze od MOV co oszczędza cache (a nie ma prawie nic >>> gorszego od kodu pętli, który nie mieści się w L1). >>> >> Dzięki, chociaż jedna ulubiona instrukcja uratowana :) > > Chyba że chcesz zachować flagi niezmienione :) Wtedy zostaje MOV. > Flag nie brałem pod uwagę ale jak będą akurat potrzebne to sobie przypomnę twoje słowa :) Dzięki -- Regards - Grzechu Linux x86_64
Re: ADD SUB kontra INC DEC
Author: yesma
Date: Thu, 22 Jul 2010 17:30
Date: Thu, 22 Jul 2010 17:30
24 lines
1693 bytes
1693 bytes
Bernard pisze: > On 2010-07-20 17:15, yesma wrote: >> http://www.agner.org/instruction_tables.pdf >> 9 List of instruction timings and μop breakdown for P4E [...] >> Czy nielepiej jest stosować zawsze ADD SUB zamiast INC DEC ? > > Lepiej, ale dotyczy to tylko procesorów rodziny Pentium 4. Właśnie chodziło mi o Pentium4EM64T bo taki akurat mam. > Na innych > INC/DEC będzie na ogół szybsze, z paru powodów. Wolniejsze będzie tylko > wtedy, gdy po instrukcji zajdzie konieczność "składania" znaczników > (INC/DEC nie aktualizują wszystkich). Nie za bardzo rozumiem tego "składania", jestem początkujący. Czy to znaczy że jeśli nam będzie potrzebna inna flaga której nie aktualizuje INC DEC to wtedy na wszystkich procesorach ADD SUB okaże się lepsze ? -- Regards - Grzechu Linux x86_64
Re: ADD SUB kontra INC DEC
Author: Michoo
Date: Thu, 22 Jul 2010 20:13
Date: Thu, 22 Jul 2010 20:13
26 lines
1588 bytes
1588 bytes
yesma pisze: >> Na innych INC/DEC będzie na ogół szybsze, z paru powodów. Wolniejsze >> będzie tylko wtedy, gdy po instrukcji zajdzie konieczność "składania" >> znaczników (INC/DEC nie aktualizują wszystkich). > > Nie za bardzo rozumiem tego "składania", jestem początkujący. > Czy to znaczy że jeśli nam będzie potrzebna inna flaga której nie > aktualizuje INC DEC to wtedy na wszystkich procesorach ADD SUB > okaże się lepsze ? > Jeżeli robisz operacje na liczbach złożonych z 2 słów procesora to normalnie inkrementację zrobisz tak (eax,ebx - liczba): add ebx,1 adc eax,0 a przy inc będzie to coś takiego: inc ebx jno skip ;jz chyba też zadziała dla unsigned inc eax skip: ... z dec podobnie -- Pozdrawiam Michoo
Re: ADD SUB kontra INC DEC
Author: yesma
Date: Thu, 22 Jul 2010 21:09
Date: Thu, 22 Jul 2010 21:09
38 lines
2109 bytes
2109 bytes
Michoo pisze: > yesma pisze: >>> Na innych INC/DEC będzie na ogół szybsze, z paru powodów. Wolniejsze >>> będzie tylko wtedy, gdy po instrukcji zajdzie konieczność "składania" >>> znaczników (INC/DEC nie aktualizują wszystkich). >> >> Nie za bardzo rozumiem tego "składania", jestem początkujący. >> Czy to znaczy że jeśli nam będzie potrzebna inna flaga której nie >> aktualizuje INC DEC to wtedy na wszystkich procesorach ADD SUB >> okaże się lepsze ? >> > Jeżeli robisz operacje na liczbach złożonych z 2 słów procesora to > normalnie inkrementację zrobisz tak (eax,ebx - liczba): > add ebx,1 > adc eax,0 > Chyba zaczynam coś rozumieć pierwsze add może ustawić CF a INC akurat tej flagi nie ustawia, adc ją dodaje > a przy inc będzie to coś takiego: > inc ebx > jno skip ;jz chyba też zadziała dla unsigned > inc eax > skip: ... > > z dec podobnie > ale tutaj chyba nie rozumiem , jno skip czy jo skip? szczerze to jeszcze nie używałem ani adc ani overflow flag i nie obliczałem jeszcze na liczbach ujemnych ale napewno kiedyś mi się to rozjaśni dzięki temu przykładowi Dzięki -- Pozdrawiam - Grzechu Linux x86_64
Re: ADD SUB kontra INC DEC
Author: Michoo
Date: Sat, 24 Jul 2010 16:51
Date: Sat, 24 Jul 2010 16:51
59 lines
2590 bytes
2590 bytes
yesma pisze: > Michoo pisze: >> Jeżeli robisz operacje na liczbach złożonych z 2 słów procesora to >> normalnie inkrementację zrobisz tak (eax,ebx - liczba): >> add ebx,1 >> adc eax,0 >> > > Chyba zaczynam coś rozumieć pierwsze add może ustawić CF a INC akurat > tej flagi nie ustawia, adc ją dodaje > Dokładnie. >> a przy inc będzie to coś takiego: >> inc ebx >> jno skip ;jz chyba też zadziała dla unsigned >> inc eax >> skip: ... >> >> z dec podobnie >> > > ale tutaj chyba nie rozumiem , jno skip czy jo skip? Zwiększ jeżeli był overflow, czyli Jeżeli Nie wystąpił Overflow to nie zwiększaj. To jest ogólna metoda tworzenia warunków w assemblerze - mamy w C: [...] --i; if(i==0)//JEŻELI WARUNEK SPEŁNIONY - wykonaj kod foo(); foo_bar(); [...] i kompilujemy to: dec edx jnz skip ;JEŻELI WARUNEK NIESPEŁNIONY - omiń kod call foo skip: call foo_bar zaoszczędzamy w ten sposób jeden skok w przypadku gdy warunek jest spełniony - po zrealizowaniu bloku if przechodzimy od razu do następnej instrukcji. W przypadku if ... else ... na końcu bloku if i tak musimy wykonać skok bezwarunkowy, więc stosuje się inne optymalizacje: if(a) foo(); else bar(); jest tożsame z if(!a) bar(); else foo(); więc możemy zamienić kolejność bloków gdy jeden warunek liczy się prościej niż drugi. jako pierwszy dajemy ten blok który się częściej wykona - na starych x86 (i na risc) często skok to 2 cykle, brak skoku - 1) jeżeli są równie prawdopodobne to jako pierwszy dajemy blok, który jest krótszy - żeby cel skoku przy ominięciu był w L1 -- Pozdrawiam Michoo
Re: ADD SUB kontra INC DEC
Author: yesma
Date: Wed, 11 Aug 2010 19:10
Date: Wed, 11 Aug 2010 19:10
81 lines
3510 bytes
3510 bytes
Michoo pisze: > yesma pisze: >> Michoo pisze: >>> Jeżeli robisz operacje na liczbach złożonych z 2 słów procesora to >>> normalnie inkrementację zrobisz tak (eax,ebx - liczba): >>> add ebx,1 >>> adc eax,0 >>> >> >> Chyba zaczynam coś rozumieć pierwsze add może ustawić CF a INC akurat >> tej flagi nie ustawia, adc ją dodaje >> > Dokładnie. > >>> a przy inc będzie to coś takiego: >>> inc ebx >>> jno skip ;jz chyba też zadziała dla unsigned >>> inc eax >>> skip: ... >>> >>> z dec podobnie >>> >> >> ale tutaj chyba nie rozumiem , jno skip czy jo skip? > Zwiększ jeżeli był overflow, czyli Jeżeli Nie wystąpił Overflow to nie > zwiększaj. To z overflow ciężko mi zrozumieć bo niewiem kiedy ta flaga jest ustawiana, jakoś słabo udokumentowana, pewnie kiedyś gdzieś przeczytałem ale wyleciało mi z pamięci bo nie używałem tej flagi. > > To jest ogólna metoda tworzenia warunków w assemblerze - mamy w C: > [...] > --i; > if(i==0)//JEŻELI WARUNEK SPEŁNIONY - wykonaj kod > foo(); > foo_bar(); > [...] > > i kompilujemy to: > dec edx > jnz skip ;JEŻELI WARUNEK NIESPEŁNIONY - omiń kod > call foo > skip: > call foo_bar > > zaoszczędzamy w ten sposób jeden skok w przypadku gdy warunek jest > spełniony - po zrealizowaniu bloku if przechodzimy od razu do następnej > instrukcji. a to rozumiem i też tak robię ale na P4 sub,1 jest szybsze niż dec i też ustawi ZF, ale jeżeli chodzi o kod niekoniacznie najszybki to będę nadal używał dec inc :) > > W przypadku if ... else ... na końcu bloku if i tak musimy wykonać skok > bezwarunkowy, więc stosuje się inne optymalizacje: > if(a) foo(); else bar(); jest tożsame z if(!a) bar(); else foo(); > więc możemy zamienić kolejność bloków gdy jeden warunek liczy się > prościej niż drugi. > jako pierwszy dajemy ten blok który się częściej wykona - na starych x86 > (i na risc) często skok to 2 cykle, brak skoku - 1) też przeważnie to biorę pod uwagę (możliwość która jest bardziej prawdopodobna pierwsza :) > jeżeli są równie prawdopodobne to jako pierwszy dajemy blok, który jest > krótszy - żeby cel skoku przy ominięciu był w L1 > a o tym to jeszcze nie myślałem. Tylko jak wyliczyć czy się zmieści w L1 czy nie ?, kod przed też chyba może się znajdować w L1 ?. krótszy napewno prędzej się tam zmieści więc trzeba się tego trzymać :) Dzięki -- Pozdrawiam - Grzechu Linux x86_64
Re: ADD SUB kontra INC DEC
Author: prorok
Date: Wed, 25 Aug 2010 12:35
Date: Wed, 25 Aug 2010 12:35
5 lines
1063 bytes
1063 bytes
Użytkownik "yesma" <yesma@false.pl> napisał w wiadomości news:i24eks$ec7$1@inews.gazeta.pl... > Czy nielepiej jest stosować zawsze ADD SUB zamiast INC DEC ? W trybie 64-bitowym instrukcje INC i DEC zostały zastąpione innymi
Re: ADD SUB kontra INC DEC
Author: Bernard
Date: Thu, 26 Aug 2010 07:04
Date: Thu, 26 Aug 2010 07:04
9 lines
1353 bytes
1353 bytes
On 2010-08-25 14:35, prorok wrote: > Użytkownik "yesma" <yesma@false.pl> napisał w wiadomości > news:i24eks$ec7$1@inews.gazeta.pl... >> Czy nielepiej jest stosować zawsze ADD SUB zamiast INC DEC ? > > W trybie 64-bitowym instrukcje INC i DEC zostały zastąpione innymi Nie, usunięto tylko krótkie kody operacyjne dla INC i DEC na rejestrach.
Re: ADD SUB kontra INC DEC
Author: Andrzej Grażyński
Date: Mon, 20 Sep 2010 21:40
Date: Mon, 20 Sep 2010 21:40
18 lines
1413 bytes
1413 bytes
yesma pisze: > http://www.agner.org/instruction_tables.pdf > 9 List of instruction timings and μop breakdown for P4E > > Tyle że niema tutaj podane dla ADD, SUB operands r,i > > Instruction ADD, SUB INC, DEC > Operands r,r r > µops 1 2 > Microcode 0 0 > Latency 1 1 > Throughput 0.25 0.5 > Port 0/1 0/1 > Unit alu0/1 alu0/1 > > Czy nielepiej jest stosować zawsze ADD SUB zamiast INC DEC ? INC/DEC nie ruszają flagi C.
Re: ADD SUB kontra INC DEC
Author: 0xF
Date: Fri, 22 Oct 2010 12:09
Date: Fri, 22 Oct 2010 12:09
12 lines
1952 bytes
1952 bytes
Zbrakło w tym wątku wyjaśnienia, dlaczego w nowych procesorach ADD/SUB jest szybsze od INC/DEC. Chodzi o to, że INC/DEC nie zmieniają CF. Znaczniki "arytmetyczne" OF,SF,ZF,CF są traktowane jako "jeden rejestr". W związku z tym normalne operacje arytmetyczne, jak ADD i SUB, tylko "zapisują rejestr znaczników arytmetycznych". Natomiast INC/DEC muszą pozostawić CF niezmienione, co jest implementowane przez "odczyt rejestru znaczników arytmetycznych", zmianę znaczników oprócz CF i "zapis rejestru znaczników arytmetycznych". Dlatego INC i DEC muszą "znać wartość CF", więc gorzej sprawują się w przypadku zrównoleglania i wykonywania instrukcji poza kolejnością.
Re: ADD SUB kontra INC DEC
Author: Andrzej Grażyński
Date: Sun, 08 May 2011 16:28
Date: Sun, 08 May 2011 16:28
17 lines
1356 bytes
1356 bytes
W dniu 2010-07-20 17:15, yesma pisze: > http://www.agner.org/instruction_tables.pdf > 9 List of instruction timings and μop breakdown for P4E > > Tyle że niema tutaj podane dla ADD, SUB operands r,i > > Instruction ADD, SUB INC, DEC > Operands r,r r > µops 1 2 > Microcode 0 0 > Latency 1 1 > Throughput 0.25 0.5 > Port 0/1 0/1 > Unit alu0/1 alu0/1 > > Czy nielepiej jest stosować zawsze ADD SUB zamiast INC DEC ? INC/DEC nie ruszają flagi CF, co czasem jest wygodne.
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads