123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- /*
- * Author: Anton Blanchard <anton@au.ibm.com>
- * Copyright 2015 IBM Corporation.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- */
- #include <asm/ppc_asm.h>
- #include <asm/export.h>
- #define off8 r6
- #define off16 r7
- #define off24 r8
- #define rA r9
- #define rB r10
- #define rC r11
- #define rD r27
- #define rE r28
- #define rF r29
- #define rG r30
- #define rH r31
- #ifdef __LITTLE_ENDIAN__
- #define LD ldbrx
- #else
- #define LD ldx
- #endif
- _GLOBAL(memcmp)
- cmpdi cr1,r5,0
- /* Use the short loop if both strings are not 8B aligned */
- or r6,r3,r4
- andi. r6,r6,7
- /* Use the short loop if length is less than 32B */
- cmpdi cr6,r5,31
- beq cr1,.Lzero
- bne .Lshort
- bgt cr6,.Llong
- .Lshort:
- mtctr r5
- 1: lbz rA,0(r3)
- lbz rB,0(r4)
- subf. rC,rB,rA
- bne .Lnon_zero
- bdz .Lzero
- lbz rA,1(r3)
- lbz rB,1(r4)
- subf. rC,rB,rA
- bne .Lnon_zero
- bdz .Lzero
- lbz rA,2(r3)
- lbz rB,2(r4)
- subf. rC,rB,rA
- bne .Lnon_zero
- bdz .Lzero
- lbz rA,3(r3)
- lbz rB,3(r4)
- subf. rC,rB,rA
- bne .Lnon_zero
- addi r3,r3,4
- addi r4,r4,4
- bdnz 1b
- .Lzero:
- li r3,0
- blr
- .Lnon_zero:
- mr r3,rC
- blr
- .Llong:
- li off8,8
- li off16,16
- li off24,24
- std r31,-8(r1)
- std r30,-16(r1)
- std r29,-24(r1)
- std r28,-32(r1)
- std r27,-40(r1)
- srdi r0,r5,5
- mtctr r0
- andi. r5,r5,31
- LD rA,0,r3
- LD rB,0,r4
- LD rC,off8,r3
- LD rD,off8,r4
- LD rE,off16,r3
- LD rF,off16,r4
- LD rG,off24,r3
- LD rH,off24,r4
- cmpld cr0,rA,rB
- addi r3,r3,32
- addi r4,r4,32
- bdz .Lfirst32
- LD rA,0,r3
- LD rB,0,r4
- cmpld cr1,rC,rD
- LD rC,off8,r3
- LD rD,off8,r4
- cmpld cr6,rE,rF
- LD rE,off16,r3
- LD rF,off16,r4
- cmpld cr7,rG,rH
- bne cr0,.LcmpAB
- LD rG,off24,r3
- LD rH,off24,r4
- cmpld cr0,rA,rB
- bne cr1,.LcmpCD
- addi r3,r3,32
- addi r4,r4,32
- bdz .Lsecond32
- .balign 16
- 1: LD rA,0,r3
- LD rB,0,r4
- cmpld cr1,rC,rD
- bne cr6,.LcmpEF
- LD rC,off8,r3
- LD rD,off8,r4
- cmpld cr6,rE,rF
- bne cr7,.LcmpGH
- LD rE,off16,r3
- LD rF,off16,r4
- cmpld cr7,rG,rH
- bne cr0,.LcmpAB
- LD rG,off24,r3
- LD rH,off24,r4
- cmpld cr0,rA,rB
- bne cr1,.LcmpCD
- addi r3,r3,32
- addi r4,r4,32
- bdnz 1b
- .Lsecond32:
- cmpld cr1,rC,rD
- bne cr6,.LcmpEF
- cmpld cr6,rE,rF
- bne cr7,.LcmpGH
- cmpld cr7,rG,rH
- bne cr0,.LcmpAB
- bne cr1,.LcmpCD
- bne cr6,.LcmpEF
- bne cr7,.LcmpGH
- .Ltail:
- ld r31,-8(r1)
- ld r30,-16(r1)
- ld r29,-24(r1)
- ld r28,-32(r1)
- ld r27,-40(r1)
- cmpdi r5,0
- beq .Lzero
- b .Lshort
- .Lfirst32:
- cmpld cr1,rC,rD
- cmpld cr6,rE,rF
- cmpld cr7,rG,rH
- bne cr0,.LcmpAB
- bne cr1,.LcmpCD
- bne cr6,.LcmpEF
- bne cr7,.LcmpGH
- b .Ltail
- .LcmpAB:
- li r3,1
- bgt cr0,.Lout
- li r3,-1
- b .Lout
- .LcmpCD:
- li r3,1
- bgt cr1,.Lout
- li r3,-1
- b .Lout
- .LcmpEF:
- li r3,1
- bgt cr6,.Lout
- li r3,-1
- b .Lout
- .LcmpGH:
- li r3,1
- bgt cr7,.Lout
- li r3,-1
- .Lout:
- ld r31,-8(r1)
- ld r30,-16(r1)
- ld r29,-24(r1)
- ld r28,-32(r1)
- ld r27,-40(r1)
- blr
- EXPORT_SYMBOL(memcmp)
|