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
							 |