diff options
Diffstat (limited to 'src/arch/e1/core/memcmp.S')
| -rw-r--r-- | src/arch/e1/core/memcmp.S | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/arch/e1/core/memcmp.S b/src/arch/e1/core/memcmp.S new file mode 100644 index 000000000..2347317a0 --- /dev/null +++ b/src/arch/e1/core/memcmp.S @@ -0,0 +1,54 @@ +/* + * Derived from the Hyperstone's library source code. + * Modefied src in order to apply the -mgnu-param compiler option. + * Copyright (C) 2002-2003 GDT, Yannis Mitsos <gmitsos@telecom.ntua.gr> + * George Thanos <gthanos@telecom.ntua.gr> + */ + .text + .align 2 + .global _memcmp + +;ENTRY (_memcmp) +_memcmp: + FRAME L9, L3 # get incoming parameters + CMPBI L2,3 # check word alignment + BNZ byte_compare + CMPBI L1,3 # check word alignment + BNZ byte_compare + +double_compare: + ADDI L0, -8 + BLT is_equal + LDD.P L1, L5 + LDD.P L2, L7 + SUB L5, L7 + DBNZ corr_8 + SUB L6, L8 + BZ double_compare + ADDI L0, 4 + ADDI L2, -4 + ADDI L1, -4 + BR byte_compare + +corr_8: ADDI L0, 8 + ADDI L2, -8 + ADDI L1, -8 +byte_compare: + ADDI L0, -1 + BLT equal + LDBU.N L2, L5, 1 # Load and compare bytes + LDBU.N L1, L6, 1 + SUB L5, L6 + BZ byte_compare + MOV L2, L5 + RET PC, L3 + +is_equal: CMPI L0, -8 + DBNE byte_compare + ADDI L0, 8 +equal: + MOVI L2, 0 + RET PC, L3 + + .END + |
