From 532fe59cadecbc6fb3f2df2be6f568f93d434b06 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Mon, 1 Mar 2010 15:18:15 +0100 Subject: [PATCH] asma: hmm.. passt nu ned ganz? --- asma/asma.s | 40 ++++++++++++++++++++++------------------ asma/main.c | 16 ++++++++-------- 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/asma/asma.s b/asma/asma.s index ecd4309..c2d663c 100644 --- a/asma/asma.s +++ b/asma/asma.s @@ -29,43 +29,47 @@ wobei min_t der minimale Wert des Datentyps ist, den der Vergleich behandelt (be pxor %xmm2, %xmm4 pxor %xmm2, %xmm5 - #init %xmm2 mit "'Z' + 1 + min_t - 'A'" fuer jedes byte + #init %xmm1 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, %rbx + movq %rbx, %xmm1 + pslldq $8, %xmm1 + movq %rbx, %xmm1 + + #init %xmm2 mit "'a'-'A'= 97-65 = 32 = 0x20 + mov $0x2020202020202020, %rbx movq %rbx, %xmm2 pslldq $8, %xmm2 movq %rbx, %xmm2 - #init %xmm4 mit "'a'-'A'= 97-65 = 32 = 0x20 - mov $0x2020202020202020, %rbx - movq %rbx, %xmm4 - pslldq $8, %xmm4 - movq %rbx, %xmm4 - #speicheradresse des pointers zeigt auf 16*8 feld = 128bit - movdqu (%rdi), %xmm1 - movdqu (%rdi), %xmm3 + movdqu (%rdi), %xmm4 + movdqu (%rdi), %xmm5 - #addiere in %xmm1 "min_t-'A'" + #addiere in %xmm4 "min_t-'A'" # = -128 - 65 = 63 = 0x3f mov $0x3f3f3f3f3f3f3f3f, %rbx - movq %rbx, %xmm5 - pslldq $8, %xmm5 - movq %rbx, %xmm5 + movq %rbx, %xmm3 + pslldq $8, %xmm3 + movq %rbx, %xmm3 - paddb %xmm5, %xmm1 + #c+min_t-'A' + paddb %xmm3, %xmm4 #"Packed COMpare Greater Than (Byte)" - pcmpgtb %xmm2, %xmm1 + #bla = 'Z' + 1 + min_t - 'A' > c + min_t - 'A' ? 0xff : 0 + #TODO: vllt vertauschen? + pcmpgtb %xmm4, %xmm1 - pminub %xmm4, %xmm1 + #min(bla, 'a' - 'A') + pminub %xmm1, %xmm2 - paddb %xmm1, %xmm3 + paddb %xmm2, %xmm5 - movq %xmm3, (%rax) + movq %xmm5, (%rax) ret .LFE2: .size asma, .-asma diff --git a/asma/main.c b/asma/main.c index 04b020f..6fb6852 100644 --- a/asma/main.c +++ b/asma/main.c @@ -21,31 +21,31 @@ int main(int argc, char **argv) { char *output2; char *input2; char *input3; - int i; + int i, j; for(i = 0; i < 3; i++) { input2 = strdup(input1[i]); input3 = strdup(input1[i]); - printf("input2: %p\n", input2); output1 = (char *)asma_ref((unsigned char *)(input2)); output2 = (char *)asma((unsigned char *)(input3)); - printf("asma-output2: %p\n", output2); - fflush(stdout); - output1[16]='\0'; output2[16]='\0'; + + printf("\n"); if(memcmp(output1,output2, 16)) { - int j; - printf("Testfall falsch; erwartet:\n\t\"%s\"\ntatsaechliches Ergebnis:\n\t\"%s\"\n", output1, output2); + j = 0; + printf("Testfall falsch; Input war: \"%s\"\n", input1[i]); + printf("erwartet:\n\t\"%s\"\ntatsaechliches Ergebnis:\n\t\"%s\"\n", output1, output2); +#if 0 printf("0x"); for(j = 0; j < 16; j++) printf("%02X", output2[j]); printf("\n"); +#endif } else { printf("Testfall \"%s\" passt.\n", output1); } - printf("\n"); free(input2); free(input3); -- 2.25.1