These should be returning a uint32_t, whereas they were erroneously returning a u64 before. As the register sizes are 32-bits, this doesn't really make a lot of sense. Reported-by: Katsuya MATSUBARA <matsu@igel.co.jp> Signed-off-by: Paul Mundt <lethal@linux-sh.org>
		
			
				
	
	
		
			46 lines
		
	
	
	
		
			547 B
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			46 lines
		
	
	
	
		
			547 B
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
/*	
 | 
						|
 * unsigned long __xdiv64_32(unsigned long long n, unsigned long d); 
 | 
						|
 */
 | 
						|
 | 
						|
#include <linux/linkage.h>
 | 
						|
 | 
						|
.text
 | 
						|
ENTRY(__xdiv64_32)
 | 
						|
#ifdef CONFIG_CPU_LITTLE_ENDIAN
 | 
						|
	mov	r4, r0
 | 
						|
	mov	r5, r1
 | 
						|
#else
 | 
						|
	mov	r4, r1
 | 
						|
	mov	r5, r0
 | 
						|
#endif
 | 
						|
	cmp/hs	r6, r1
 | 
						|
	bf.s	1f
 | 
						|
	 mov	#0, r2
 | 
						|
 | 
						|
	mov	r1, r2
 | 
						|
	mov	#0, r3
 | 
						|
	div0u
 | 
						|
	.rept	32
 | 
						|
	rotcl	r2
 | 
						|
	div1	r6, r3
 | 
						|
	.endr
 | 
						|
	rotcl	r2
 | 
						|
	mul.l	r6, r2
 | 
						|
	sts	macl, r3
 | 
						|
	sub	r3, r1
 | 
						|
1:
 | 
						|
	div0u
 | 
						|
	.rept	32
 | 
						|
	rotcl	r0
 | 
						|
	div1	r6, r1
 | 
						|
	.endr
 | 
						|
#ifdef CONFIG_CPU_LITTLE_ENDIAN
 | 
						|
	mov	r2, r1
 | 
						|
	rts
 | 
						|
	 rotcl	r0
 | 
						|
#else
 | 
						|
	rotcl	r0
 | 
						|
	mov	r0, r1
 | 
						|
	rts
 | 
						|
	 mov	r2, r0
 | 
						|
#endif
 |