24 //soll einfach null sein
27 /*init %xmm8 mit "'Z' + 1 + min_t - 'A'" fuer jedes byte
28 * 'Z' + 1 + min_t - 'A' = 90 + 1 - 128 - 65 = -102
31 * (~102)+1 = 10011010 = 0x9A */
34 //init %xmm9 mit "'a'-'A'= 97-65 = 32 = 0x20
37 /*addiere in %xmm11 "min_t-'A'"
38 * = -128 - 65 = 63 = 0x3f */
39 movdqa const3f, %xmm10
42 //speicheradresse des pointers zeigt auf 16*8 feld = 128bit
43 movdqu (%rdi, %rdx, 8), %xmm11
44 movdqu (%rdi, %rdx, 8), %xmm12
49 //0x9a9a... zwischenspeichern
52 /*"Packed COMpare Greater Than (Byte)"
53 * X = 'Z' + 1 + min_t - 'A' > c + min_t - 'A' ? 0xff : 0
54 * achtung beim intuitiven lesen des befehles. 'kleiner'
55 * ist mit 'groesser' vertauscht und vice versa */
56 pcmpgtb %xmm11, %xmm15
59 //Y = min(X, 'a' - 'A')
65 //retuniere an die richtige speicheradresse
66 movapd %xmm12, (%rdi, %rdx, 8)
68 //entspricht ein byte dem nullbyte dann steht an jener stelle 0xff sonst 0x00
69 pcmpeqb %xmm14, %xmm12
70 //hol die MSBs aller bytes raus
74 //ist %ecx gleich null? dann die naechsten 16byte bitte
77 //speicheradresse des parameters zurueckgeben (wird noch modifziert)
81 * ab hier uebler hax um nach \0 trotzdem die gleichen bytes wie
82 * input zu haben, also um selbiges verhalten wie asmb_ref zu erzwingen */
84 //\0 byte stelle durch rausfinden des MSB des %ecx
87 //das ergebnis zweimal abspeichern
90 //hint: in %xmm15 ist differenz gespeichert (vgl .differenz)
92 //leider shiften nur mit immediate! :(
133 //betreffende speicherstelle in %xmm11 laden
134 movdqu -16(%rax, %rdx, 8), %xmm11
135 //und overhead wieder subtrahieren
138 //ergebnis zurueckspielen und fertig \o/
139 movapd %xmm11, -16(%rax, %rdx, 8)
144 .section .eh_frame,"a",@progbits
146 .long .LECIE1-.LSCIE1
164 .long .LEFDE1-.LASFDE1
166 .long .LASFDE1-.Lframe1
172 .ident "GCC: (Debian 4.3.2-1.1) 4.3.2"
173 .section .note.GNU-stack,"",@progbits