From 8e0558e3df46436fe398abe89e80b1c38c837fc1 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Sun, 7 Mar 2010 13:55:25 +0100 Subject: [PATCH] asmb: hint von martin perner (btr statt cmp/sub) und gistupdate von ihm --- asmb/asmb.s | 40 ++++++++++++++++------------------------ asmb/asmbtest.c | 6 ++++-- 2 files changed, 20 insertions(+), 26 deletions(-) diff --git a/asmb/asmb.s b/asmb/asmb.s index e94d189..540a28f 100644 --- a/asmb/asmb.s +++ b/asmb/asmb.s @@ -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 diff --git a/asmb/asmbtest.c b/asmb/asmbtest.c index bea72ba..45c1395 100644 --- a/asmb/asmbtest.c +++ b/asmb/asmbtest.c @@ -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; -- 2.25.1