diff options
Diffstat (limited to 'private/crt32/string/mips/strcmpm.s')
-rw-r--r-- | private/crt32/string/mips/strcmpm.s | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/private/crt32/string/mips/strcmpm.s b/private/crt32/string/mips/strcmpm.s new file mode 100644 index 000000000..dfaaa9c39 --- /dev/null +++ b/private/crt32/string/mips/strcmpm.s @@ -0,0 +1,50 @@ +/* ------------------------------------------------------------------ */ +/* | Copyright Unpublished, MIPS Computer Systems, Inc. All Rights | */ +/* | Reserved. This software contains proprietary and confidential | */ +/* | information of MIPS and its suppliers. Use, disclosure or | */ +/* | reproduction is prohibited without the prior express written | */ +/* | consent of MIPS. | */ +/* ------------------------------------------------------------------ */ +/* strcmp.s 1.1 */ + +/* This function is an assembly-code replacement for + the libc function "strcmp." */ +/* Libc currently has a mips-specific C version that uses 7 instructions/byte. + (It claims to use 6 cycles/byte, but is wrong!) + This function uses an unrolled loop, which uses 5 instructions per byte. + + Under some circumstances more characters are read than are + required for determining the collating order, but it + never reads beyond the end of either string. + + There are one caveat to consider: this function is written + in assembler code, and as such, cannot be merged + using the U-code loader. */ + +/* Craig Hansen - 6-June-86 */ + +#include <kxmips.h> + + .text + +LEAF_ENTRY(strcmp) + + .set noreorder + lbu t0,0(a0) +1: lbu t1,0(a1) + beq t0,0,2f + addi a0,2 + bne t0,t1,3f + lbu t2,-1(a0) # ok to load since -2(a0)!=0 + lbu t1,1(a1) + beq t2,0,2f + addi a1,2 + beq t2,t1,1b + lbu t0,0(a0) # ok to load since -1(a0) != 0 + j ra + subu v0,t2,t1 +2: j ra + subu v0,zero,t1 +3: j ra + subu v0,t0,t1 + .end strcmp |