summaryrefslogtreecommitdiffstats
path: root/contrib/syslinux-4.02/dos/memmove.S
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/syslinux-4.02/dos/memmove.S')
-rw-r--r--contrib/syslinux-4.02/dos/memmove.S36
1 files changed, 36 insertions, 0 deletions
diff --git a/contrib/syslinux-4.02/dos/memmove.S b/contrib/syslinux-4.02/dos/memmove.S
new file mode 100644
index 0000000..1ab2cb2
--- /dev/null
+++ b/contrib/syslinux-4.02/dos/memmove.S
@@ -0,0 +1,36 @@
+#
+# memmove.S
+#
+# Simple 16-bit memmove() implementation
+#
+
+ .text
+ .code16gcc
+ .globl memmove
+ .type memmove, @function
+memmove:
+ pushw %di
+ pushw %si
+ movw %ax,%di
+ movw %dx,%si
+ cmpw %si,%di
+ ja 1f
+ # The third argument is already in cx
+ cld
+ rep ; movsb
+2:
+ popw %si
+ popw %di
+ ret
+
+1: /* si <= di, need reverse copy */
+ add %cx,%di
+ add %cx,%si
+ dec %di
+ dec %si
+ std
+ rep ; movsb
+ cld
+ jmp 2b
+
+ .size memmove,.-memmove