asmb: hint von martin perner (btr statt cmp/sub) und gistupdate von ihm
authorBernhard Urban <lewurm@gmail.com>
Sun, 7 Mar 2010 12:55:25 +0000 (13:55 +0100)
committerBernhard Urban <lewurm@gmail.com>
Sun, 7 Mar 2010 12:55:25 +0000 (13:55 +0100)
asmb/asmb.s
asmb/asmbtest.c

index e94d189c7f0b9bf56cbe620177e8b9760d984400..540a28fbccad1658866753fc016b6727ecacf860 100644 (file)
@@ -81,52 +81,44 @@ asmb:
        //hint: in %xmm15 ist differenz gespeichert (vgl .differenz)
 
        //leider shiften nur mit immediate! :(
-       cmp $8, %r11d
-       jc .rechtsshift1
+       btr $3, %r11d
+       jnc .rechtsshift1
        psrldq $8, %xmm15
-       sub $8, %r11d
 
 .rechtsshift1:
-       cmp $4, %r11d
-       jc .rechtsshift2
+       btr $2, %r11d
+       jnc .rechtsshift2
        psrldq $4, %xmm15
-       sub $4, %r11d
 
 .rechtsshift2:
-       cmp $2, %r11d
-       jc .rechtsshift3
+       btr $1, %r11d
+       jnc .rechtsshift3
        psrldq $2, %xmm15
-       sub $2, %r11d
 
 .rechtsshift3:
-       cmp $1, %r11d
-       jc .linksshift
+       btr $0, %r11d
+       jnc .linksshift
        psrldq $1, %xmm15
-       sub $1, %r11d
 #==================
 .linksshift:
-       cmp $8, %ecx
-       jc .linksshift1
+       btr $3, %ecx
+       jnc .linksshift1
        pslldq $8, %xmm15
-       sub $8, %ecx
 
 .linksshift1:
-       cmp $4, %ecx
-       jc .linksshift2
+       btr $2, %ecx
+       jnc .linksshift2
        pslldq $4, %xmm15
-       sub $4, %ecx
 
 .linksshift2:
-       cmp $2, %ecx
-       jc .linksshift3
+       btr $1, %ecx
+       jnc .linksshift3
        pslldq $2, %xmm15
-       sub $2, %ecx
 
 .linksshift3:
-       cmp $1, %ecx
-       jc .endshift
+       btr $0, %ecx
+       jnc .endshift
        pslldq $1, %xmm15
-       sub $1, %ecx
 
 .endshift:
        //betreffende speicherstelle in %xmm11 laden
index bea72ba703a03c8ba70ee44607bc426bf08f929f..45c13956309edf77cae0f52e589227433a1434f3 100644 (file)
@@ -39,7 +39,7 @@ static void hexdump(void *d, int len) {
        }
 }
 
-#define NUM_TESTCASES 17
+#define NUM_TESTCASES 18
 int main()
 {
        char *input[NUM_TESTCASES]={
@@ -60,6 +60,7 @@ int main()
                "ASDFASDFasdfasdfaBC0AAAABBBBCCCCmuhKA\0asASDFasdf",
                "ASas\0ASas",
                "asdfABCDEFGHKL54",
+               "asdffvdfgerrggre\0",
        };
        int len[NUM_TESTCASES] = {
                16,
@@ -78,7 +79,8 @@ int main()
                32,
                48,
                9,
-               16
+               16,
+               17,
        };
        char *output_our, *output_ref;
        char *input_our,  *input_ref;