24 //soll einfach null sein
28 //speicheradresse des pointers zeigt auf 16*8 feld = 128bit
29 movdqu (%rdi, %rdx, 8), %xmm11
35 // Packed COMpare Greater Than (Byte)"
36 // achtung beim intuitiven lesen des befehles. 'kleiner'
37 // ist mit 'groesser' vertauscht und vice versa
38 pcmpgtb const65, %xmm9
41 // Y = min(X, 'a' - 'A')
47 // retuniere an die richtige speicheradresse
48 movdqu %xmm11, (%rdi, %rdx, 8)
50 //entspricht ein byte dem nullbyte dann steht an jener stelle 0xff sonst 0x00
51 pcmpeqb %xmm14, %xmm11
52 //hol die MSBs aller bytes raus
56 //ist %ecx gleich null? dann die naechsten 16byte bitte
59 //speicheradresse des parameters zurueckgeben (wird noch modifziert)
63 * ab hier uebler hax um nach \0 trotzdem die gleichen bytes wie
64 * input zu haben, also um selbiges verhalten wie asmb_ref zu erzwingen */
66 //\0 byte stelle durch rausfinden des MSB des %ecx
69 //das ergebnis zweimal abspeichern
72 //hint: in %xmm9 ist differenz gespeichert (vgl .differenz)
74 //leider shiften nur mit immediate! :(
115 //betreffende speicherstelle in %xmm11 laden
116 movdqu -16(%rax, %rdx, 8), %xmm11
117 //und overhead wieder subtrahieren
120 //ergebnis zurueckspielen und fertig \o/
121 movapd %xmm11, -16(%rax, %rdx, 8)
126 .section .eh_frame,"a",@progbits
128 .long .LECIE1-.LSCIE1
146 .long .LEFDE1-.LASFDE1
148 .long .LASFDE1-.Lframe1
154 .ident "GCC: (Debian 4.3.2-1.1) 4.3.2"
155 .section .note.GNU-stack,"",@progbits