122723828SAlexey Brodkin/* 222723828SAlexey Brodkin * Copyright (C) 2004, 2007-2010, 2011-2014 Synopsys, Inc. All rights reserved. 322723828SAlexey Brodkin * 422723828SAlexey Brodkin * SPDX-License-Identifier: GPL-2.0+ 522723828SAlexey Brodkin */ 622723828SAlexey Brodkin 722723828SAlexey Brodkin#ifdef __LITTLE_ENDIAN__ 822723828SAlexey Brodkin#define WORD2 r2 922723828SAlexey Brodkin#define SHIFT r3 1022723828SAlexey Brodkin#else /* __BIG_ENDIAN__ */ 1122723828SAlexey Brodkin#define WORD2 r3 1222723828SAlexey Brodkin#define SHIFT r2 1322723828SAlexey Brodkin#endif /* _ENDIAN__ */ 1422723828SAlexey Brodkin 1522723828SAlexey Brodkin.global memcmp 1622723828SAlexey Brodkin.align 4 1722723828SAlexey Brodkinmemcmp: 1822723828SAlexey Brodkin or %r12, %r0, %r1 1922723828SAlexey Brodkin asl_s %r12, %r12, 30 2022723828SAlexey Brodkin sub %r3, %r2, 1 2122723828SAlexey Brodkin brls %r2, %r12, .Lbytewise 2222723828SAlexey Brodkin ld %r4, [%r0, 0] 2322723828SAlexey Brodkin ld %r5, [%r1, 0] 2422723828SAlexey Brodkin lsr.f %lp_count, %r3, 3 2522723828SAlexey Brodkin lpne .Loop_end 2622723828SAlexey Brodkin ld_s WORD2, [%r0, 4] 2722723828SAlexey Brodkin ld_s %r12, [%r1, 4] 2822723828SAlexey Brodkin brne %r4, %r5, .Leven 2922723828SAlexey Brodkin ld.a %r4, [%r0, 8] 3022723828SAlexey Brodkin ld.a %r5, [%r1, 8] 3122723828SAlexey Brodkin brne WORD2, %r12, .Lodd 32*f958a91fSIgor Guryanov nop 3322723828SAlexey Brodkin.Loop_end: 3422723828SAlexey Brodkin asl_s SHIFT, SHIFT, 3 3522723828SAlexey Brodkin bhs_s .Last_cmp 3622723828SAlexey Brodkin brne %r4, %r5, .Leven 3722723828SAlexey Brodkin ld %r4, [%r0, 4] 3822723828SAlexey Brodkin ld %r5, [%r1, 4] 3922723828SAlexey Brodkin#ifdef __LITTLE_ENDIAN__ 4022723828SAlexey Brodkin nop_s 4122723828SAlexey Brodkin /* one more load latency cycle */ 4222723828SAlexey Brodkin.Last_cmp: 4322723828SAlexey Brodkin xor %r0, %r4, %r5 4422723828SAlexey Brodkin bset %r0, %r0, SHIFT 4522723828SAlexey Brodkin sub_s %r1, %r0, 1 4622723828SAlexey Brodkin bic_s %r1, %r1, %r0 4722723828SAlexey Brodkin norm %r1, %r1 4822723828SAlexey Brodkin b.d .Leven_cmp 4922723828SAlexey Brodkin and %r1, %r1, 24 5022723828SAlexey Brodkin.Leven: 5122723828SAlexey Brodkin xor %r0, %r4, %r5 5222723828SAlexey Brodkin sub_s %r1, %r0, 1 5322723828SAlexey Brodkin bic_s %r1, %r1, %r0 5422723828SAlexey Brodkin norm %r1, %r1 5522723828SAlexey Brodkin /* slow track insn */ 5622723828SAlexey Brodkin and %r1, %r1, 24 5722723828SAlexey Brodkin.Leven_cmp: 5822723828SAlexey Brodkin asl %r2, %r4, %r1 5922723828SAlexey Brodkin asl %r12, %r5, %r1 6022723828SAlexey Brodkin lsr_s %r2, %r2, 1 6122723828SAlexey Brodkin lsr_s %r12, %r12, 1 6222723828SAlexey Brodkin j_s.d [%blink] 6322723828SAlexey Brodkin sub %r0, %r2, %r12 6422723828SAlexey Brodkin .balign 4 6522723828SAlexey Brodkin.Lodd: 6622723828SAlexey Brodkin xor %r0, WORD2, %r12 6722723828SAlexey Brodkin sub_s %r1, %r0, 1 6822723828SAlexey Brodkin bic_s %r1, %r1, %r0 6922723828SAlexey Brodkin norm %r1, %r1 7022723828SAlexey Brodkin /* slow track insn */ 7122723828SAlexey Brodkin and %r1, %r1, 24 7222723828SAlexey Brodkin asl_s %r2, %r2, %r1 7322723828SAlexey Brodkin asl_s %r12, %r12, %r1 7422723828SAlexey Brodkin lsr_s %r2, %r2, 1 7522723828SAlexey Brodkin lsr_s %r12, %r12, 1 7622723828SAlexey Brodkin j_s.d [%blink] 7722723828SAlexey Brodkin sub %r0, %r2, %r12 7822723828SAlexey Brodkin#else /* __BIG_ENDIAN__ */ 7922723828SAlexey Brodkin.Last_cmp: 8022723828SAlexey Brodkin neg_s SHIFT, SHIFT 8122723828SAlexey Brodkin lsr %r4, %r4, SHIFT 8222723828SAlexey Brodkin lsr %r5, %r5, SHIFT 8322723828SAlexey Brodkin /* slow track insn */ 8422723828SAlexey Brodkin.Leven: 8522723828SAlexey Brodkin sub.f %r0, %r4, %r5 8622723828SAlexey Brodkin mov.ne %r0, 1 8722723828SAlexey Brodkin j_s.d [%blink] 8822723828SAlexey Brodkin bset.cs %r0, %r0, 31 8922723828SAlexey Brodkin.Lodd: 9022723828SAlexey Brodkin cmp_s WORD2, %r12 9122723828SAlexey Brodkin 9222723828SAlexey Brodkin mov_s %r0, 1 9322723828SAlexey Brodkin j_s.d [%blink] 9422723828SAlexey Brodkin bset.cs %r0, %r0, 31 9522723828SAlexey Brodkin#endif /* _ENDIAN__ */ 9622723828SAlexey Brodkin .balign 4 9722723828SAlexey Brodkin.Lbytewise: 9822723828SAlexey Brodkin breq %r2, 0, .Lnil 9922723828SAlexey Brodkin ldb %r4, [%r0, 0] 10022723828SAlexey Brodkin ldb %r5, [%r1, 0] 10122723828SAlexey Brodkin lsr.f %lp_count, %r3 10222723828SAlexey Brodkin lpne .Lbyte_end 10322723828SAlexey Brodkin ldb_s %r3, [%r0, 1] 10422723828SAlexey Brodkin ldb %r12, [%r1, 1] 10522723828SAlexey Brodkin brne %r4, %r5, .Lbyte_even 10622723828SAlexey Brodkin ldb.a %r4, [%r0, 2] 10722723828SAlexey Brodkin ldb.a %r5, [%r1, 2] 10822723828SAlexey Brodkin brne %r3, %r12, .Lbyte_odd 109*f958a91fSIgor Guryanov nop 11022723828SAlexey Brodkin.Lbyte_end: 11122723828SAlexey Brodkin bcc .Lbyte_even 11222723828SAlexey Brodkin brne %r4, %r5, .Lbyte_even 11322723828SAlexey Brodkin ldb_s %r3, [%r0, 1] 11422723828SAlexey Brodkin ldb_s %r12, [%r1, 1] 11522723828SAlexey Brodkin.Lbyte_odd: 11622723828SAlexey Brodkin j_s.d [%blink] 11722723828SAlexey Brodkin sub %r0, %r3, %r12 11822723828SAlexey Brodkin.Lbyte_even: 11922723828SAlexey Brodkin j_s.d [%blink] 12022723828SAlexey Brodkin sub %r0, %r4, %r5 12122723828SAlexey Brodkin.Lnil: 12222723828SAlexey Brodkin j_s.d [%blink] 12322723828SAlexey Brodkin mov %r0, 0 124