diff options
author | alc <alc@FreeBSD.org> | 2005-04-10 18:12:07 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2005-04-10 18:12:07 +0000 |
commit | 420be8df92533bfbd56861dada670045720ba633 (patch) | |
tree | 42943daf777a27a748439ed3aa93f02cca498624 | |
parent | 91d6fda379eabbbbfdb059bb61f80193ae316749 (diff) | |
download | FreeBSD-src-420be8df92533bfbd56861dada670045720ba633.zip FreeBSD-src-420be8df92533bfbd56861dada670045720ba633.tar.gz |
Eliminate a conditional branch and as a side-effect eliminate a branch to
a return instruction. (The latter is discouraged by the Opteron
optimization manual because it disables branch prediction for the return
instruction.)
Reviewed by: bde
-rw-r--r-- | lib/libc/amd64/string/bcmp.S | 9 | ||||
-rw-r--r-- | sys/amd64/amd64/support.S | 7 |
2 files changed, 6 insertions, 10 deletions
diff --git a/lib/libc/amd64/string/bcmp.S b/lib/libc/amd64/string/bcmp.S index bb72035..36a0c7e 100644 --- a/lib/libc/amd64/string/bcmp.S +++ b/lib/libc/amd64/string/bcmp.S @@ -6,7 +6,6 @@ __FBSDID("$FreeBSD$"); #endif ENTRY(bcmp) - xorl %eax,%eax /* clear return value */ cld /* set compare direction forward */ movq %rdx,%rcx /* compare by words */ @@ -19,7 +18,7 @@ ENTRY(bcmp) andq $7,%rcx repe cmpsb - je L2 - -L1: incl %eax -L2: ret +L1: + setne %al + movsbl %al,%eax + ret diff --git a/sys/amd64/amd64/support.S b/sys/amd64/amd64/support.S index ba6f3c2..3d4098e 100644 --- a/sys/amd64/amd64/support.S +++ b/sys/amd64/amd64/support.S @@ -86,8 +86,6 @@ ENTRY(pagezero) ret ENTRY(bcmp) - xorq %rax,%rax - movq %rdx,%rcx shrq $3,%rcx cld /* compare forwards */ @@ -99,10 +97,9 @@ ENTRY(bcmp) andq $7,%rcx repe cmpsb - je 2f 1: - incq %rax -2: + setne %al + movsbl %al,%eax ret /* |