summaryrefslogtreecommitdiffstats
path: root/src/arch/e1/core/memcpy.S
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/e1/core/memcpy.S')
-rw-r--r--src/arch/e1/core/memcpy.S79
1 files changed, 79 insertions, 0 deletions
diff --git a/src/arch/e1/core/memcpy.S b/src/arch/e1/core/memcpy.S
new file mode 100644
index 000000000..0581c9d14
--- /dev/null
+++ b/src/arch/e1/core/memcpy.S
@@ -0,0 +1,79 @@
+/*
+ * 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 _memcpy
+;ENTRY(_memcpy)
+_memcpy:
+ FRAME L8, L3
+ MOV L7, L2 # Save for return
+
+#*****************************
+# Perform byte copy if both
+# not on a word alignment
+#*****************************
+ CMPBI L2, 3 # check word alignment
+ BNZ mem_except
+ CMPBI L1, 3 # check word alignment
+ BNZ mem_except
+
+#*****************************
+# Copy Double,Word,Halfword,
+# then byte
+#*****************************
+DBL_LOOP:
+ CMPI L0, 8 # Copy Doubles
+ BLT DO_WORD
+ LDD.P L1, L5
+ ADDI L0, -8
+ DBR DBL_LOOP
+ STD.P L2, L5
+
+DO_WORD:
+ CMPI L0, 4 # Copy leftover word
+ BLT DO_HALF
+ LDW.P L1, L5
+ ADDI L0, -4
+ DBZ DONE # Done if L0 is 0
+ STW.P L2, L5
+
+DO_HALF:
+ CMPI L0, 2 # Copy leftover byte
+ BLT DO_BYTE
+ LDHU.N L1, L5, 2
+ ADDI L0, -2
+ DBZ DONE # Done if L0 is 0
+ STHU.N L2, L5, 2
+
+DO_BYTE:
+ CMPI L0, 1 # Copy leftover byte
+ BLT DONE
+ LDBU.D L1, L5, 0
+ STBU.D L2, L5, 0
+
+DONE: # Copy done
+ MOV L2, L7 # Return pointer
+ RET PC, L3
+
+#****************************
+# Byte memcpy
+#****************************
+mem_except:
+ DBR L_5
+ MOVI L6,0
+L_3:
+ LDBS.D L1, L5, 0 # Transfer the byte
+ ADDI L6, 1
+ STBS.D L2, L5, 0
+ ADDI L2, 1
+ ADDI L1, 1
+L_5: # Loop test
+ CMP L6, L0
+ BST L_3
+ MOV L2, L7 # Return pointer
+ RET PC, L3
+ .END