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)
64 //ab hier uebler hax um nach \0 trotzdem die gleichen bytes wie
65 //input zu haben, also um selbiges verhalten wie asmb_ref zu erzwingen
67 //\0 byte stelle durch rausfinden des MSB des %ecx
70 //das ergebnis zweimal abspeichern
73 //hint: in %xmm9 ist differenz gespeichert (vgl .differenz)
75 //leider shiften nur mit immediate! :(
116 //betreffende speicherstelle in %xmm11 laden
117 movdqu -16(%rax, %rdx, 8), %xmm11
118 //und overhead wieder subtrahieren
121 //ergebnis zurueckspielen und fertig \o/
122 movdqu %xmm11, -16(%rax, %rdx, 8)
128 .section .eh_frame,"a",@progbits
130 .long .LECIE1-.LSCIE1
148 .long .LEFDE1-.LASFDE1
150 .long .LASFDE1-.Lframe1
156 .ident "GCC: (Debian 4.3.2-1.1) 4.3.2"
157 .section .note.GNU-stack,"",@progbits