85 lines
		
	
	
	
		
			1.1 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
		
		
			
		
	
	
			85 lines
		
	
	
	
		
			1.1 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| 
								 | 
							
								;;; memcpy.S
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <asm/linkage.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if defined(__H8300H__) 
							 | 
						||
| 
								 | 
							
									.h8300h
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#if defined(__H8300S__) 
							 | 
						||
| 
								 | 
							
									.h8300s
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.text
							 | 
						||
| 
								 | 
							
								.global SYMBOL_NAME(memcpy)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;;; void *memcpy(void *to, void *from, size_t n)
							 | 
						||
| 
								 | 
							
								SYMBOL_NAME_LABEL(memcpy)
							 | 
						||
| 
								 | 
							
									mov.l	er2,er2
							 | 
						||
| 
								 | 
							
									bne	1f
							 | 
						||
| 
								 | 
							
									rts	
							 | 
						||
| 
								 | 
							
								1:	
							 | 
						||
| 
								 | 
							
									;; address check
							 | 
						||
| 
								 | 
							
									bld	#0,r0l
							 | 
						||
| 
								 | 
							
									bxor	#0,r1l
							 | 
						||
| 
								 | 
							
									bcs	4f
							 | 
						||
| 
								 | 
							
									mov.l	er4,@-sp
							 | 
						||
| 
								 | 
							
									mov.l	er0,@-sp
							 | 
						||
| 
								 | 
							
									btst	#0,r0l
							 | 
						||
| 
								 | 
							
									beq	1f
							 | 
						||
| 
								 | 
							
									;; (aligned even) odd address
							 | 
						||
| 
								 | 
							
									mov.b	@er1,r3l
							 | 
						||
| 
								 | 
							
									mov.b	r3l,@er0
							 | 
						||
| 
								 | 
							
									adds	#1,er1
							 | 
						||
| 
								 | 
							
									adds	#1,er0
							 | 
						||
| 
								 | 
							
									dec.l	#1,er2
							 | 
						||
| 
								 | 
							
									beq	3f
							 | 
						||
| 
								 | 
							
								1:	
							 | 
						||
| 
								 | 
							
									;; n < sizeof(unsigned long) check
							 | 
						||
| 
								 | 
							
									sub.l	er4,er4
							 | 
						||
| 
								 | 
							
									adds	#4,er4		; loop count check value
							 | 
						||
| 
								 | 
							
									cmp.l	er4,er2
							 | 
						||
| 
								 | 
							
									blo	2f
							 | 
						||
| 
								 | 
							
									;; unsigned long copy
							 | 
						||
| 
								 | 
							
								1:	
							 | 
						||
| 
								 | 
							
									mov.l	@er1,er3
							 | 
						||
| 
								 | 
							
									mov.l	er3,@er0
							 | 
						||
| 
								 | 
							
									adds	#4,er0
							 | 
						||
| 
								 | 
							
									adds	#4,er1
							 | 
						||
| 
								 | 
							
									subs	#4,er2
							 | 
						||
| 
								 | 
							
									cmp.l	er4,er2
							 | 
						||
| 
								 | 
							
									bcc	1b	
							 | 
						||
| 
								 | 
							
									;; rest
							 | 
						||
| 
								 | 
							
								2:	
							 | 
						||
| 
								 | 
							
									mov.l	er2,er2
							 | 
						||
| 
								 | 
							
									beq	3f
							 | 
						||
| 
								 | 
							
								1:	
							 | 
						||
| 
								 | 
							
									mov.b	@er1,r3l
							 | 
						||
| 
								 | 
							
									mov.b	r3l,@er0
							 | 
						||
| 
								 | 
							
									adds	#1,er1
							 | 
						||
| 
								 | 
							
									adds	#1,er0
							 | 
						||
| 
								 | 
							
									dec.l	#1,er2
							 | 
						||
| 
								 | 
							
									bne	1b
							 | 
						||
| 
								 | 
							
								3:
							 | 
						||
| 
								 | 
							
									mov.l	@sp+,er0
							 | 
						||
| 
								 | 
							
									mov.l	@sp+,er4
							 | 
						||
| 
								 | 
							
									rts
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									;; odd <- even / even <- odd
							 | 
						||
| 
								 | 
							
								4:	
							 | 
						||
| 
								 | 
							
									mov.l	er4,er3
							 | 
						||
| 
								 | 
							
									mov.l	er2,er4
							 | 
						||
| 
								 | 
							
									mov.l	er5,er2
							 | 
						||
| 
								 | 
							
									mov.l	er1,er5
							 | 
						||
| 
								 | 
							
									mov.l	er6,er1
							 | 
						||
| 
								 | 
							
									mov.l	er0,er6
							 | 
						||
| 
								 | 
							
								1:
							 | 
						||
| 
								 | 
							
									eepmov.w
							 | 
						||
| 
								 | 
							
									mov.w	r4,r4
							 | 
						||
| 
								 | 
							
									bne	1b
							 | 
						||
| 
								 | 
							
									dec.w	#1,e4
							 | 
						||
| 
								 | 
							
									bpl	1b
							 | 
						||
| 
								 | 
							
									mov.l	er1,er6
							 | 
						||
| 
								 | 
							
									mov.l	er2,er5
							 | 
						||
| 
								 | 
							
									mov.l	er3,er4
							 | 
						||
| 
								 | 
							
									rts
							 |