Autor |
Beitrag |
Spaceguide
Beiträge: 552
(D3/D7/D8) Prof.
|
Verfasst: Do 13.01.05 18:25
Hey, bewundert mal diese Eleganz
|
|
IngoD7
Beiträge: 629
D7
|
Verfasst: Do 13.01.05 19:26
Spaceguide hat folgendes geschrieben: | Hey, bewundert mal diese Eleganz |
Hast du gerade im Baströckchen "Schwanensee" getanzt? Sorry, habe ich verpasst ....
Oder meinst du deinen Code? Doch, ist ganz nett und leichter zu merken und schwerer zu durchschauen, als mein Vorschlag.
|
|
Spaceguide
Beiträge: 552
(D3/D7/D8) Prof.
|
Verfasst: Do 13.01.05 19:33
... und um einiges performanter
zudem darf man = nicht mit fliesskommazahlen verwenden.
|
|
BenBE
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Do 13.01.05 23:19
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
I.MacLeod
Beiträge: 109
|
Verfasst: Sa 15.01.05 15:30
Wirklich nicht schlecht
Spaceguide hat folgendes geschrieben: | zudem darf man = nicht mit fliesskommazahlen verwenden. |
Darf man glaub ich nur nicht mit Fließkommazahlen verschiedener Typen machen. Solange man Extended mit Extended und Real mit Single (*g*) vergleicht ist alles ok.
@BenBE:
Das or al, al würde ich einfach durch ein ret ersetzen, dann sparst du dir das or und noch ein setCC, und letzteres wird IIRC auf P4s ziemlich langsam ausgeführt.
Hier ist meine Variante:
mir ist noch aufgefallen dass AL ja sowieso schon 0 ist wenn der Sprung genommen wird.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| function IsPowerOfTwo(const Value: DWORD) : Boolean; asm TEST EAX, EAX JZ @@done
MOV EDX, EAX DEC EDX TEST EAX, EDX
SETZ AL @@done: end; |
Ich nehme an die LEA-Variante ist langsamer, aber überprüft hab ichs jetzt nicht.
|
|
BenBE
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 15.01.05 18:11
I.MacLeod hat folgendes geschrieben: | @BenBE:
Das or al, al würde ich einfach durch ein ret ersetzen, dann sparst du dir das or und noch ein setCC, und letzteres wird IIRC auf P4s ziemlich langsam ausgeführt. |
I.MacLeod hat folgendes geschrieben: | Hier ist meine Variante:
mir ist noch aufgefallen dass AL ja sowieso schon 0 ist wenn der Sprung genommen wird. |
Das ist richtig. Hab ich glatt übersehen . Hab nur erstmal das übersetzt, wie's der Compiler generieren würde
I.MacLeod hat folgendes geschrieben: | Ich nehme an die LEA-Variante ist langsamer, aber überprüft hab ichs jetzt nicht. |
Ne, ganz im Gegenteil, die LEA ist sogar schneller, da du eine Anweisung sparst ... Wenn man ASM-Anweisungen sparen kann, soll mans machen
Wäre also die schnellste (bisher gefundene) Variante folgende:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| {$W-} function IsPowerOfTwo(const Value: DWORD) : Boolean; register; assembler; asm TEST EAX, EAX RETZ
LEA EDX, [EAX-1] TEST EAX, EDX SETZ AL end; |
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
uall@ogc
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Sa 15.01.05 18:28
RETZ kennt der delphi compiler net ;> und gibbet auch net
=>
jnz @blub
xor eax, eax
ret
@blub
|
|
BenBE
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 15.01.05 19:14
Da sind ja Z80-Prozessoren fortschrittlicher Die können das nämlich
Hieße dann korrigiert:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| function IsPowerOfTwo(const Value: DWORD) : Boolean; register; assembler; asm TEST EAX, EAX JZ @@Done
LEA EDX, [EAX-1] TEST EAX, EDX SETZ AL @@Done: end; |
Naja, kann passieren, wenn man I386 und Z80 mischt
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Zuletzt bearbeitet von BenBE am Sa 15.01.05 22:55, insgesamt 1-mal bearbeitet
|
|
AXMD
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: Sa 15.01.05 19:15
@Ben: du solltest den Delphi-Tag beim Öffnen nicht schließen
AXMD
|
|
I.MacLeod
Beiträge: 109
|
Verfasst: Sa 15.01.05 20:34
BenBE hat folgendes geschrieben: | Ne, ganz im Gegenteil, die LEA ist sogar schneller, da du eine Anweisung sparst ... Wenn man ASM-Anweisungen sparen kann, soll mans machen |
Nja, nicht unbedingt. Wenn ich zwei "einfache" durch eine "exotische" Anweisung ersetze würde ich mich lieber nicht darauf verlassen, dass es danach schneller ist (Womit ich nicht sagen will dass LEA exotisch ist).
Zitat: | Hieße dann korrigiert: |
Kann es sein dass du einfach meine Version nochmal kopiert hast?
|
|
BenBE
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 15.01.05 23:10
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
grayfox
Beiträge: 800
win98, winXP
D4 Standard; D6 Personal
|
Verfasst: Sa 15.01.05 23:24
Zitat: | RETZ kennt der delphi compiler net ;> und gibbet auch net |
na, dann werd ich dem compiler mal auf die sprünge helfen
--> retz
|
|
BenBE
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 15.01.05 23:49
I.MacLeod hat folgendes geschrieben: | BenBE hat folgendes geschrieben: | Ne, ganz im Gegenteil, die LEA ist sogar schneller, da du eine Anweisung sparst ... Wenn man ASM-Anweisungen sparen kann, soll mans machen |
Nja, nicht unbedingt. Wenn ich zwei "einfache" durch eine "exotische" Anweisung ersetze würde ich mich lieber nicht darauf verlassen, dass es danach schneller ist (Womit ich nicht sagen will dass LEA exotisch ist).
Zitat: | Hieße dann korrigiert: |
Kann es sein dass du einfach meine Version nochmal kopiert hast? |
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
uall@ogc
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Mo 24.01.05 19:15
glaub das problem ist gelöst, da kann unser Benny ja auch mal den thread als bearbeitet/gelöst markieren
|
|
BenBE
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 24.01.05 21:10
Hab darauf gewartet, dass ein Programmierer mit viel zu viel Freizeit vielleicht noch ne kürzere findet Aber gut, hab's mal als gelöst markiert
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
|