Home | History | Annotate | Download | only in lib
      1 ;;; memcpy.S
      2 
      3 #include <asm/linkage.h>
      4 
      5 #if defined(__H8300H__)
      6 	.h8300h
      7 #endif
      8 #if defined(__H8300S__)
      9 	.h8300s
     10 #endif
     11 
     12 	.text
     13 .global _memcpy
     14 
     15 ;;; void *memcpy(void *to, void *from, size_t n)
     16 _memcpy:
     17 	mov.l	er2,er2
     18 	bne	1f
     19 	rts
     20 1:
     21 	;; address check
     22 	bld	#0,r0l
     23 	bxor	#0,r1l
     24 	bcs	4f
     25 	mov.l	er4,@-sp
     26 	mov.l	er0,@-sp
     27 	btst	#0,r0l
     28 	beq	1f
     29 	;; (aligned even) odd address
     30 	mov.b	@er1,r3l
     31 	mov.b	r3l,@er0
     32 	adds	#1,er1
     33 	adds	#1,er0
     34 	dec.l	#1,er2
     35 	beq	3f
     36 1:
     37 	;; n < sizeof(unsigned long) check
     38 	sub.l	er4,er4
     39 	adds	#4,er4		; loop count check value
     40 	cmp.l	er4,er2
     41 	blo	2f
     42 	;; unsigned long copy
     43 1:
     44 	mov.l	@er1,er3
     45 	mov.l	er3,@er0
     46 	adds	#4,er0
     47 	adds	#4,er1
     48 	subs	#4,er2
     49 	cmp.l	er4,er2
     50 	bcc	1b
     51 	;; rest
     52 2:
     53 	mov.l	er2,er2
     54 	beq	3f
     55 1:
     56 	mov.b	@er1,r3l
     57 	mov.b	r3l,@er0
     58 	adds	#1,er1
     59 	adds	#1,er0
     60 	dec.l	#1,er2
     61 	bne	1b
     62 3:
     63 	mov.l	@sp+,er0
     64 	mov.l	@sp+,er4
     65 	rts
     66 
     67 	;; odd <- even / even <- odd
     68 4:
     69 	mov.l	er4,er3
     70 	mov.l	er2,er4
     71 	mov.l	er5,er2
     72 	mov.l	er1,er5
     73 	mov.l	er6,er1
     74 	mov.l	er0,er6
     75 1:
     76 	eepmov.w
     77 	mov.w	r4,r4
     78 	bne	1b
     79 	dec.w	#1,e4
     80 	bpl	1b
     81 	mov.l	er1,er6
     82 	mov.l	er2,er5
     83 	mov.l	er3,er4
     84 	rts
     85