[Assembly] Sign extension vanaf eerste bit

Pagina: 1
Acties:

Onderwerpen


  • Kun
  • Registratie: December 2008
  • Laatst online: 28-08 22:40
Ik probeer om een register te vullen met 1en of 0en obv de waarde in de least-significant-bit zonder gebruik te maken van conditional jumps of conditional moves. De manier waarop ik het nu voor elkaar heb gekregen vind ik niet erg fraai en was benieuwd of iemand tips heeft om het beter op te lossen.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
; compare values
test [rdx], rax

; if values are equal set cl to 00000001
sete cl

; rotate cl to flip value to 10000000
ror cl, 1

; sign-extend cl to 11111111....10000000
movsx rcx, cl

; set lower 8 bits to higer 8 bits 11111111....11111111
mov cl, ch


Na het uitvoeren van deze code bevat rcx of allemaal 0en of 1en, precies wat ik wil, maar volgens mij moet dit makkelijker (en sneller) kunnen.

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11-09 12:01
Geen oplossing maar wel een vraag, waarom wil je geen conditional move gebruiken? Performance dingetje?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • +1 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 10-09 14:31
code:
1
2
SHL RCX, 63
SAR RCX,63

LSB naar MSB, en sign-extend terug.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

  • Kun
  • Registratie: December 2008
  • Laatst online: 28-08 22:40
MSalters schreef op vrijdag 18 september 2015 @ 09:56:
code:
1
2
SHL RCX, 63
SAR RCX,63

LSB naar MSB, en sign-extend terug.
Thanks, dat is idd fraaier en sneller dan mijn oplossing.
farlane schreef op vrijdag 18 september 2015 @ 09:19:
Geen oplossing maar wel een vraag, waarom wil je geen conditional move gebruiken? Performance dingetje?
Ja, zit een beetje te experimenteren in assembly om in inner loop te optimalizeren en de grootste vertraging zit in de CMOVcc instructie, dus probeer een snellere oplossing te vinden :)

  • Elijan9
  • Registratie: Februari 2004
  • Laatst online: 10-09 21:08
De suggestie van MSalters is beter, maar anders was het ook mogelijk om een AND met 1 te doen, gevolgd door een DEC (1 wordt 0, 0 wordt -1) en een XOR met -1.

War is when the young and stupid are tricked by the old and bitter into killing each other. - Niko Bellic


Acties:
  • 0 Henk 'm!

  • Kun
  • Registratie: December 2008
  • Laatst online: 28-08 22:40
Elijan9 schreef op zaterdag 19 september 2015 @ 23:00:
De suggestie van MSalters is beter, maar anders was het ook mogelijk om een AND met 1 te doen, gevolgd door een DEC (1 wordt 0, 0 wordt -1) en een XOR met -1.
Ik ga het eens testen, performance is het belangrijkste in dit geval, en AND/DEC is waarschijnlijk sneller dan SHL/SAR... Ben ook nog aan het kijken naar de nieuwe Bit Manipulation Instruction Set 2 van Intel, daar zitten een aantal bitshifting instructies (SHLX en SARX) tussen die geen flags bijwerken en dus sneller zijn.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 02:32
Elijan9 schreef op zaterdag 19 september 2015 @ 23:00:
De suggestie van MSalters is beter, maar anders was het ook mogelijk om een AND met 1 te doen, gevolgd door een DEC (1 wordt 0, 0 wordt -1) en een XOR met -1.
Als variatie hierop:
  • Zet RCX van te voren op 0. Dat is sneller dan AND omdat het parallel met de test uitgevoerd kan worden.
  • Gebruik SETNE om de inverse van de zero-flag in CL te krijgen, dan hoef je die laatste inversie ook niet uit te voeren.
  • Gebruik SUB in plaats van DEC om dependency op het resultaat van de test-instructie te doorbreken.
Het wordt dan dus:
GAS:
1
2
3
4
test [rdx], rax
xor rcx, rcx
setne cl
sub rcx, 1

edit: SUB vs DEC maakt in deze situatie waarschijnlijk niets uit, maar toch.

[ Voor 7% gewijzigd door Soultaker op 21-09-2015 11:03 ]

Pagina: 1