summaryrefslogtreecommitdiffstats
path: root/src/arch/e1/core/memcmp.S
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/e1/core/memcmp.S')
-rw-r--r--src/arch/e1/core/memcmp.S54
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
+