| 
| 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.
 |  |  |  |