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
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);