123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 |
- #include <linux/linkage.h>
- #include <asm/assembler.h>
- #define REP8_01 0x0101010101010101
- #define REP8_7f 0x7f7f7f7f7f7f7f7f
- #define REP8_80 0x8080808080808080
- src1 .req x0
- src2 .req x1
- result .req x0
- data1 .req x2
- data1w .req w2
- data2 .req x3
- data2w .req w3
- has_nul .req x4
- diff .req x5
- syndrome .req x6
- tmp1 .req x7
- tmp2 .req x8
- tmp3 .req x9
- zeroones .req x10
- pos .req x11
- WEAK(strcmp)
- eor tmp1, src1, src2
- mov zeroones, #REP8_01
- tst tmp1, #7
- b.ne .Lmisaligned8
- ands tmp1, src1, #7
- b.ne .Lmutual_align
-
- .Lloop_aligned:
- ldr data1, [src1], #8
- ldr data2, [src2], #8
- .Lstart_realigned:
- sub tmp1, data1, zeroones
- orr tmp2, data1, #REP8_7f
- eor diff, data1, data2
- bic has_nul, tmp1, tmp2
- orr syndrome, diff, has_nul
- cbz syndrome, .Lloop_aligned
- b .Lcal_cmpresult
- .Lmutual_align:
-
- bic src1, src1, #7
- bic src2, src2, #7
- lsl tmp1, tmp1, #3
- ldr data1, [src1], #8
- neg tmp1, tmp1
- ldr data2, [src2], #8
- mov tmp2, #~0
-
- CPU_BE( lsl tmp2, tmp2, tmp1 )
-
- CPU_LE( lsr tmp2, tmp2, tmp1 )
- orr data1, data1, tmp2
- orr data2, data2, tmp2
- b .Lstart_realigned
- .Lmisaligned8:
-
- and tmp1, src1, #7
- neg tmp1, tmp1
- add tmp1, tmp1, #8
- and tmp2, src2, #7
- neg tmp2, tmp2
- add tmp2, tmp2, #8
- subs tmp3, tmp1, tmp2
- csel pos, tmp1, tmp2, hi
- .Ltinycmp:
- ldrb data1w, [src1], #1
- ldrb data2w, [src2], #1
- subs pos, pos, #1
- ccmp data1w, #1, #0, ne
- ccmp data1w, data2w, #0, cs
- b.eq .Ltinycmp
- cbnz pos, 1f
- cmp data1w, #1
- ccmp data1w, data2w, #0, cs
- b.eq .Lstart_align
- 1:
- sub result, data1, data2
- ret
- .Lstart_align:
- ands xzr, src1, #7
- b.eq .Lrecal_offset
-
- add src1, src1, tmp3
- add src2, src2, tmp3
-
- ldr data1, [src1], #8
- ldr data2, [src2], #8
- sub tmp1, data1, zeroones
- orr tmp2, data1, #REP8_7f
- bic has_nul, tmp1, tmp2
- eor diff, data1, data2
- orr syndrome, diff, has_nul
- cbnz syndrome, .Lcal_cmpresult
-
- and tmp3, tmp3, #7
- .Lrecal_offset:
- neg pos, tmp3
- .Lloopcmp_proc:
-
- ldr data1, [src1,pos]
- ldr data2, [src2,pos]
- sub tmp1, data1, zeroones
- orr tmp2, data1, #REP8_7f
- bic has_nul, tmp1, tmp2
- eor diff, data1, data2
- orr syndrome, diff, has_nul
- cbnz syndrome, .Lcal_cmpresult
-
- ldr data1, [src1], #8
- ldr data2, [src2], #8
- sub tmp1, data1, zeroones
- orr tmp2, data1, #REP8_7f
- bic has_nul, tmp1, tmp2
- eor diff, data1, data2
- orr syndrome, diff, has_nul
- cbz syndrome, .Lloopcmp_proc
- .Lcal_cmpresult:
-
- CPU_LE( rev syndrome, syndrome )
- CPU_LE( rev data1, data1 )
- CPU_LE( rev data2, data2 )
-
- CPU_BE( cbnz has_nul, 1f )
- CPU_BE( cmp data1, data2 )
- CPU_BE( cset result, ne )
- CPU_BE( cneg result, result, lo )
- CPU_BE( ret )
- CPU_BE( 1: )
-
- CPU_BE( rev tmp3, data1 )
- CPU_BE( sub tmp1, tmp3, zeroones )
- CPU_BE( orr tmp2, tmp3, #REP8_7f )
- CPU_BE( bic has_nul, tmp1, tmp2 )
- CPU_BE( rev has_nul, has_nul )
- CPU_BE( orr syndrome, diff, has_nul )
- clz pos, syndrome
-
- lsl data1, data1, pos
- lsl data2, data2, pos
-
- lsr data1, data1, #56
- sub result, data1, data2, lsr #56
- ret
- ENDPIPROC(strcmp)
|