X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=asmb%2Fasmb.s;h=027a99931de03b05994c876963455d8e1fa7c3b4;hb=c57a701d3ab00b20f86fb2f1f6fb59e8e7fa52bb;hp=91cc957ade766afecd42b5983dfcd6a256d203e5;hpb=9f650d38019b6efc69e0baca7d4c0d40f3f0f75b;p=uebersetzerbau-ss10.git diff --git a/asmb/asmb.s b/asmb/asmb.s index 91cc957..027a999 100644 --- a/asmb/asmb.s +++ b/asmb/asmb.s @@ -1,4 +1,23 @@ .file "asmb.c" + .data + .align 16 +const65: + .rept 16 + .byte 0x65 + .endr +const20: + .rept 16 + .byte 0x20 + .endr +constc0: + .rept 16 + .byte 0xc0 + .endr +const00: + .rept 16 + .byte 0x00 + .endr + .text .globl asmb .type asmb, @function @@ -6,69 +25,104 @@ asmb: .LFB2: xor %rdx, %rdx - //soll einfach null sein - pxor %xmm14, %xmm14 - - /*init %xmm8 mit "'Z' + 1 + min_t - 'A'" fuer jedes byte - * 'Z' + 1 + min_t - 'A' = 90 + 1 - 128 - 65 = -102 - * 102 = 01100110 - * ~102 = 10011001 - * (~102)+1 = 10011010 = 0x9A */ - mov $0x9a9a9a9a9a9a9a9a, %rax - movq %rax, %xmm15 - movddup %xmm15, %xmm8 - - //init %xmm9 mit "'a'-'A'= 97-65 = 32 = 0x20 - mov $0x2020202020202020, %rax - movq %rax, %xmm15 - movddup %xmm15, %xmm9 - - //speicheradresse des pointers zeigt auf 16*8 feld = 128bit - movdqu (%rdi, %rdx, 8), %xmm11 - movdqu (%rdi, %rdx, 8), %xmm12 - - /*addiere in %xmm11 "min_t-'A'" - * = -128 - 65 = 63 = 0x3f */ - mov $0x3f3f3f3f3f3f3f3f, %rax - movq %rax, %xmm15 - movddup %xmm15, %xmm10 - .nextround: //speicheradresse des pointers zeigt auf 16*8 feld = 128bit movdqu (%rdi, %rdx, 8), %xmm11 - movdqu (%rdi, %rdx, 8), %xmm12 - - //c+min_t-'A' - paddb %xmm10, %xmm11 - //0x9a9a... zwischenspeichern - movdqa %xmm8, %xmm15 + // -64 - c + movdqa constc0, %xmm9 + psubb %xmm11, %xmm9 - /*"Packed COMpare Greater Than (Byte)" - * X = 'Z' + 1 + min_t - 'A' > c + min_t - 'A' ? 0xff : 0 - * achtung beim intuitiven lesen des befehles. 'kleiner' - * ist mit 'groesser' vertauscht und vice versa */ - pcmpgtb %xmm11, %xmm15 + // Packed COMpare Greater Than (Byte)" + // achtung beim intuitiven lesen des befehles. 'kleiner' + // ist mit 'groesser' vertauscht und vice versa + pcmpgtb const65, %xmm9 - //Y = min(X, 'a' - 'A') - pminub %xmm9, %xmm15 +.differenz: + // Y = min(X, 'a' - 'A') + pand const20, %xmm9 - //c += Y - paddb %xmm15, %xmm12 + // c += Y + paddb %xmm9, %xmm11 - //retuniere an die richtige speicheradresse - movapd %xmm12, (%rdi, %rdx, 8) + // retuniere an die richtige speicheradresse + movdqu %xmm11, (%rdi, %rdx, 8) - //ist ein byte groesser als 0? dann steht 0xff drin - pcmpeqb %xmm14, %xmm12 + //entspricht ein byte dem nullbyte dann steht an jener stelle 0xff sonst 0x00 + pcmpeqb const00, %xmm11 //hol die MSBs aller bytes raus - pmovmskb %xmm12, %ecx + pmovmskb %xmm11, %ecx add $2, %rdx //ist %ecx gleich null? dann die naechsten 16byte bitte jecxz .nextround + //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/ + movdqu %xmm11, -16(%rax, %rdx, 8) +*/ + ret .LFE2: .size asmb, .-asmb