62 lines
		
	
	
		
			747 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			747 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
/* memset.S */
 | 
						|
 | 
						|
#include <asm/linkage.h>
 | 
						|
 | 
						|
#if defined(__H8300H__) 
 | 
						|
	.h8300h
 | 
						|
#endif
 | 
						|
#if defined(__H8300S__) 
 | 
						|
	.h8300s
 | 
						|
#endif
 | 
						|
	.text
 | 
						|
 | 
						|
.global	SYMBOL_NAME(memset)
 | 
						|
 | 
						|
;;void *memset(*ptr, int c, size_t count)
 | 
						|
;; ptr = er0
 | 
						|
;; c   = er1(r1l)
 | 
						|
;; count = er2
 | 
						|
SYMBOL_NAME_LABEL(memset)
 | 
						|
	btst	#0,r0l
 | 
						|
	beq	2f
 | 
						|
 | 
						|
	;; odd address
 | 
						|
1:
 | 
						|
	mov.b	r1l,@er0
 | 
						|
	adds	#1,er0
 | 
						|
	dec.l	#1,er2
 | 
						|
	beq	6f
 | 
						|
 | 
						|
	;; even address
 | 
						|
2:
 | 
						|
	mov.l	er2,er3
 | 
						|
	cmp.l	#4,er2
 | 
						|
	blo	4f
 | 
						|
	;; count>=4 -> count/4
 | 
						|
#if defined(__H8300H__)
 | 
						|
	shlr.l	er2
 | 
						|
	shlr.l	er2
 | 
						|
#endif
 | 
						|
#if defined(__H8300S__)
 | 
						|
	shlr.l	#2,er2
 | 
						|
#endif
 | 
						|
	;; byte -> long
 | 
						|
	mov.b	r1l,r1h
 | 
						|
	mov.w	r1,e1
 | 
						|
3:
 | 
						|
	mov.l	er1,@er0
 | 
						|
	adds	#4,er0
 | 
						|
	dec.l	#1,er2
 | 
						|
	bne	3b
 | 
						|
4:
 | 
						|
	;; count % 4
 | 
						|
	and.b	#3,r3l
 | 
						|
	beq	6f
 | 
						|
5:
 | 
						|
	mov.b	r1l,@er0
 | 
						|
	adds	#1,er0
 | 
						|
	dec.b	r3l
 | 
						|
	bne	5b
 | 
						|
6:
 | 
						|
	rts
 |