summaryrefslogtreecommitdiffstats
path: root/src/arch/e1/core/strcmp.S
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/e1/core/strcmp.S')
-rw-r--r--src/arch/e1/core/strcmp.S76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/arch/e1/core/strcmp.S b/src/arch/e1/core/strcmp.S
new file mode 100644
index 000000000..5f09daa70
--- /dev/null
+++ b/src/arch/e1/core/strcmp.S
@@ -0,0 +1,76 @@
+/*
+ * 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 _strcmp
+;ENTRY(_strcmp)
+_strcmp:
+ FRAME L8,L2
+ CMPBI L1, 3 # check for word alignment
+ BNZ str_except
+ CMPBI L0, 3 # check for word alignment
+ BNZ str_except
+
+start:
+ LDD.P L1, L4 # post inc mode
+ LDD.P L0, L6 # post inc mode
+ CMPBI L4, ANYBZ
+ BE correct1
+ CMP L4, L6
+ BNE correct1
+ CMP L5, L7
+ BNE correct
+ CMPBI L5, ANYBZ
+ BE correct
+ CMPBI L6, ANYBZ
+ BE correct1
+ CMPBI L7, ANYBZ
+ BNE start
+
+correct: MASK L4, L5, 0xff000000
+ MASK L6, L7, 0xff000000
+ CMP L4, L6
+ BNE Exit
+ SHLI L5, 8
+ CMPI L4, 0
+ DBNE correct
+ SHLI L7, 8
+ MOV L1, L4
+ RET PC, L2
+
+Exit: SUB L4, L6 # Subtract chars
+ SARI L4, 24
+ MOV L1, L4
+ RET PC, L2
+
+correct1: MASK L5, L4, 0xff000000
+ MASK L7, L6, 0xff000000
+ CMP L5, L7
+ BNE Exit1
+ SHLI L4, 8
+ CMPI L5, 0
+ DBNE correct1
+ SHLI L6, 8
+ MOV L1, L5
+ RET PC, L2
+Exit1: SUB L5, L7 # Subtract chars
+ SARI L5, 24
+ MOV L1, L5
+ RET PC, L2
+
+testzero: CMPI L4, 0
+ BE L_5
+str_except:
+ LDBU.N L1, L4, 1 # Load *s1, compare bytes
+ LDBU.N L0, L5, 1 # Load *s2, compare bytes
+ CMP L4, L5
+ BE testzero
+ SUB L4, L5 # Subtract chars
+L_5: MOV L1, L4
+ RET PC, L2
+ .END
+