1*4882a593Smuzhiyun/* 2*4882a593Smuzhiyun * Copyright (C) 2004, 2007-2010, 2011-2014 Synopsys, Inc. All rights reserved. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun#ifdef __LITTLE_ENDIAN__ 8*4882a593Smuzhiyun#define WORD2 r2 9*4882a593Smuzhiyun#define SHIFT r3 10*4882a593Smuzhiyun#else /* __BIG_ENDIAN__ */ 11*4882a593Smuzhiyun#define WORD2 r3 12*4882a593Smuzhiyun#define SHIFT r2 13*4882a593Smuzhiyun#endif /* _ENDIAN__ */ 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun.global memcmp 16*4882a593Smuzhiyun.align 4 17*4882a593Smuzhiyunmemcmp: 18*4882a593Smuzhiyun or %r12, %r0, %r1 19*4882a593Smuzhiyun asl_s %r12, %r12, 30 20*4882a593Smuzhiyun sub %r3, %r2, 1 21*4882a593Smuzhiyun brls %r2, %r12, .Lbytewise 22*4882a593Smuzhiyun ld %r4, [%r0, 0] 23*4882a593Smuzhiyun ld %r5, [%r1, 0] 24*4882a593Smuzhiyun lsr.f %lp_count, %r3, 3 25*4882a593Smuzhiyun lpne .Loop_end 26*4882a593Smuzhiyun ld_s WORD2, [%r0, 4] 27*4882a593Smuzhiyun ld_s %r12, [%r1, 4] 28*4882a593Smuzhiyun brne %r4, %r5, .Leven 29*4882a593Smuzhiyun ld.a %r4, [%r0, 8] 30*4882a593Smuzhiyun ld.a %r5, [%r1, 8] 31*4882a593Smuzhiyun brne WORD2, %r12, .Lodd 32*4882a593Smuzhiyun nop 33*4882a593Smuzhiyun.Loop_end: 34*4882a593Smuzhiyun asl_s SHIFT, SHIFT, 3 35*4882a593Smuzhiyun bhs_s .Last_cmp 36*4882a593Smuzhiyun brne %r4, %r5, .Leven 37*4882a593Smuzhiyun ld %r4, [%r0, 4] 38*4882a593Smuzhiyun ld %r5, [%r1, 4] 39*4882a593Smuzhiyun#ifdef __LITTLE_ENDIAN__ 40*4882a593Smuzhiyun nop_s 41*4882a593Smuzhiyun /* one more load latency cycle */ 42*4882a593Smuzhiyun.Last_cmp: 43*4882a593Smuzhiyun xor %r0, %r4, %r5 44*4882a593Smuzhiyun bset %r0, %r0, SHIFT 45*4882a593Smuzhiyun sub_s %r1, %r0, 1 46*4882a593Smuzhiyun bic_s %r1, %r1, %r0 47*4882a593Smuzhiyun norm %r1, %r1 48*4882a593Smuzhiyun b.d .Leven_cmp 49*4882a593Smuzhiyun and %r1, %r1, 24 50*4882a593Smuzhiyun.Leven: 51*4882a593Smuzhiyun xor %r0, %r4, %r5 52*4882a593Smuzhiyun sub_s %r1, %r0, 1 53*4882a593Smuzhiyun bic_s %r1, %r1, %r0 54*4882a593Smuzhiyun norm %r1, %r1 55*4882a593Smuzhiyun /* slow track insn */ 56*4882a593Smuzhiyun and %r1, %r1, 24 57*4882a593Smuzhiyun.Leven_cmp: 58*4882a593Smuzhiyun asl %r2, %r4, %r1 59*4882a593Smuzhiyun asl %r12, %r5, %r1 60*4882a593Smuzhiyun lsr_s %r2, %r2, 1 61*4882a593Smuzhiyun lsr_s %r12, %r12, 1 62*4882a593Smuzhiyun j_s.d [%blink] 63*4882a593Smuzhiyun sub %r0, %r2, %r12 64*4882a593Smuzhiyun .balign 4 65*4882a593Smuzhiyun.Lodd: 66*4882a593Smuzhiyun xor %r0, WORD2, %r12 67*4882a593Smuzhiyun sub_s %r1, %r0, 1 68*4882a593Smuzhiyun bic_s %r1, %r1, %r0 69*4882a593Smuzhiyun norm %r1, %r1 70*4882a593Smuzhiyun /* slow track insn */ 71*4882a593Smuzhiyun and %r1, %r1, 24 72*4882a593Smuzhiyun asl_s %r2, %r2, %r1 73*4882a593Smuzhiyun asl_s %r12, %r12, %r1 74*4882a593Smuzhiyun lsr_s %r2, %r2, 1 75*4882a593Smuzhiyun lsr_s %r12, %r12, 1 76*4882a593Smuzhiyun j_s.d [%blink] 77*4882a593Smuzhiyun sub %r0, %r2, %r12 78*4882a593Smuzhiyun#else /* __BIG_ENDIAN__ */ 79*4882a593Smuzhiyun.Last_cmp: 80*4882a593Smuzhiyun neg_s SHIFT, SHIFT 81*4882a593Smuzhiyun lsr %r4, %r4, SHIFT 82*4882a593Smuzhiyun lsr %r5, %r5, SHIFT 83*4882a593Smuzhiyun /* slow track insn */ 84*4882a593Smuzhiyun.Leven: 85*4882a593Smuzhiyun sub.f %r0, %r4, %r5 86*4882a593Smuzhiyun mov.ne %r0, 1 87*4882a593Smuzhiyun j_s.d [%blink] 88*4882a593Smuzhiyun bset.cs %r0, %r0, 31 89*4882a593Smuzhiyun.Lodd: 90*4882a593Smuzhiyun cmp_s WORD2, %r12 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun mov_s %r0, 1 93*4882a593Smuzhiyun j_s.d [%blink] 94*4882a593Smuzhiyun bset.cs %r0, %r0, 31 95*4882a593Smuzhiyun#endif /* _ENDIAN__ */ 96*4882a593Smuzhiyun .balign 4 97*4882a593Smuzhiyun.Lbytewise: 98*4882a593Smuzhiyun breq %r2, 0, .Lnil 99*4882a593Smuzhiyun ldb %r4, [%r0, 0] 100*4882a593Smuzhiyun ldb %r5, [%r1, 0] 101*4882a593Smuzhiyun lsr.f %lp_count, %r3 102*4882a593Smuzhiyun lpne .Lbyte_end 103*4882a593Smuzhiyun ldb_s %r3, [%r0, 1] 104*4882a593Smuzhiyun ldb %r12, [%r1, 1] 105*4882a593Smuzhiyun brne %r4, %r5, .Lbyte_even 106*4882a593Smuzhiyun ldb.a %r4, [%r0, 2] 107*4882a593Smuzhiyun ldb.a %r5, [%r1, 2] 108*4882a593Smuzhiyun brne %r3, %r12, .Lbyte_odd 109*4882a593Smuzhiyun nop 110*4882a593Smuzhiyun.Lbyte_end: 111*4882a593Smuzhiyun bcc .Lbyte_even 112*4882a593Smuzhiyun brne %r4, %r5, .Lbyte_even 113*4882a593Smuzhiyun ldb_s %r3, [%r0, 1] 114*4882a593Smuzhiyun ldb_s %r12, [%r1, 1] 115*4882a593Smuzhiyun.Lbyte_odd: 116*4882a593Smuzhiyun j_s.d [%blink] 117*4882a593Smuzhiyun sub %r0, %r3, %r12 118*4882a593Smuzhiyun.Lbyte_even: 119*4882a593Smuzhiyun j_s.d [%blink] 120*4882a593Smuzhiyun sub %r0, %r4, %r5 121*4882a593Smuzhiyun.Lnil: 122*4882a593Smuzhiyun j_s.d [%blink] 123*4882a593Smuzhiyun mov %r0, 0 124