| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 SYMBOL_NAME(memcpy) | 
|  | 14 |  | 
|  | 15 | ;;; void *memcpy(void *to, void *from, size_t n) | 
|  | 16 | SYMBOL_NAME_LABEL(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 |