Assembly Gems
dflund.se
Assembly Gems
1–10 of 14 posts
Re: Assembly Gems
#2Re: Assembly Gems
#3Re: Assembly Gems
#4http://dflund.se/~john_e/gems/gem003a.html
It would be a little adventure to try to figure out how it was conceived, as although it looks like something a superoptimiser would produce, it was around before superoptimisation, and I think it was generated by a human likely related to the demoscene.
Re: Assembly Gems
#5I think this is one of the more interesting ones for its extreme terseness and opaqueness: http://dflund.se/~john_e/gems/gem003a.html It would be a little adventure to try to figure out how it was conceived, as although it looks like something a superoptimiser would produce, it was around before superoptimisation, and I think it was generated by a human likely related to the demoscene.
Re: Assembly Gems
#6The neg (two's complement) of 0x80000000 is 0x80000000. Thus his trick results in an infinite loop for the most negative value.
Re: Assembly Gems
#7How many of these are still relevant? x86 has an instruction for crc , bswap , as well as nop now.
Re: Assembly Gems
#8I think this is one of the more interesting ones for its extreme terseness and opaqueness: http://dflund.se/~john_e/gems/gem003a.html It would be a little adventure to try to figure out how it was conceived, as although it looks like something a superoptimiser would produce, it was around before superoptimisation, and I think it was generated by a human likely related to the demoscene.
This was a well known trick for 8080s and Z80s as far back as the 1970s. Back then there were a lot of assembly programmers, tricks like this were stock in trade.
Microinstructione are like a CPU's firmware which implements the external-facing macroinstruction set into a simpler set of microinstructions which coordinate various internal state.
Re: Assembly Gems
#9How many of these are still relevant? x86 has an instruction for crc , bswap , as well as nop now.
Now almost every code to be run is cache-bound for performance, not cycle-bound. So this gems, while may still work, may not be the best means to achieve optimal performance. Optimizing cache access is what brings the biggest speedups today -- see for example NumExpr[1]. [1] https://github.com/pydata/numexpr
A lot of these are crucial enough that they've been codified in transistors now, and generally can execute in a cycle without consuming extra registers. There are still some very valid bit tricks though.
Re: Assembly Gems
#10For bit unpacking in C, the natural inclination is to shift out the least significant bit with something like this:
u1 getbit() { u1 lsb = x & 1; x >>= 1; return lsb; }
However, most assembly languages have a better alternative if you instead shift out the most significant bit. Suppose that the bit buffer is in ECX. Then you would do ADD ECX, ECX to left shift ECX and (this is the important part) put the shifted-out bit into the carry flag. From there the carry flag can be shifted into the least significant bit of another register, say EAX, with ADC EAX, EAX, or you can branch based on the carry with JC/JNCAs a full example, here is the gamma decoder from apack/aplib, which despite its simplicity rewards careful study:
getbit:
add dl, dl
jnz .stillbitsleft
mov dl, [esi]
inc esi
adc dl, dl
.stillbitsleft:
ret
getgamma:
xor ecx, ecx
getgamma_no_ecx:
inc ecx
.getgammaloop:
call getbit
adc ecx, ecx
call getbit
jc .getgammaloop
ret