- //speicheradresse des parameters zurueckgeben (wird noch modifziert)
- mov %rdi, %rax
-
- /*===============
- * ab hier uebler hax um nach \0 trotzdem die gleichen bytes wie
- * input zu haben, also um selbiges verhalten wie asmb_ref zu erzwingen */
-
- //\0 byte stelle durch rausfinden des MSB des %ecx
- bsf %ecx, %r11d
-
- //das ergebnis zweimal abspeichern
- mov %r11d, %ecx
-
- //hint: in %xmm9 ist differenz gespeichert (vgl .differenz)
-
- //leider shiften nur mit immediate! :(
- btr $3, %r11d
- jnc .rechtsshift1
- psrldq $8, %xmm9
-
-.rechtsshift1:
- btr $2, %r11d
- jnc .rechtsshift2
- psrldq $4, %xmm9
-
-.rechtsshift2:
- btr $1, %r11d
- jnc .rechtsshift3
- psrldq $2, %xmm9
-
-.rechtsshift3:
- btr $0, %r11d
- jnc .linksshift
- psrldq $1, %xmm9
-#==================
-.linksshift:
- btr $3, %ecx
- jnc .linksshift1
- pslldq $8, %xmm9
-
-.linksshift1:
- btr $2, %ecx
- jnc .linksshift2
- pslldq $4, %xmm9
-
-.linksshift2:
- btr $1, %ecx
- jnc .linksshift3
- pslldq $2, %xmm9
-
-.linksshift3:
- btr $0, %ecx
- jnc .endshift
- pslldq $1, %xmm9
-
-.endshift:
- //betreffende speicherstelle in %xmm11 laden
- movdqu -16(%rax, %rdx, 8), %xmm11
- //und overhead wieder subtrahieren
- psubb %xmm9, %xmm11
-
- //ergebnis zurueckspielen und fertig \o/
- movapd %xmm11, -16(%rax, %rdx, 8)
-