50 lines
		
	
	
	
		
			1.3 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			50 lines
		
	
	
	
		
			1.3 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								#ifndef __S390_DIV64
							 | 
						||
| 
								 | 
							
								#define __S390_DIV64
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef __s390x__
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* for do_div "base" needs to be smaller than 2^31-1 */
							 | 
						||
| 
								 | 
							
								#define do_div(n, base) ({                                      \
							 | 
						||
| 
								 | 
							
									unsigned long long __n = (n);				\
							 | 
						||
| 
								 | 
							
									unsigned long __r;					\
							 | 
						||
| 
								 | 
							
																\
							 | 
						||
| 
								 | 
							
									asm ("   slr  0,0\n"					\
							 | 
						||
| 
								 | 
							
									     "   l    1,%1\n"					\
							 | 
						||
| 
								 | 
							
									     "   srdl 0,1\n"					\
							 | 
						||
| 
								 | 
							
									     "   dr   0,%2\n"					\
							 | 
						||
| 
								 | 
							
									     "   alr  1,1\n"					\
							 | 
						||
| 
								 | 
							
									     "   alr  0,0\n"					\
							 | 
						||
| 
								 | 
							
									     "   lhi  2,1\n"					\
							 | 
						||
| 
								 | 
							
									     "   n    2,%1\n"					\
							 | 
						||
| 
								 | 
							
									     "   alr  0,2\n"					\
							 | 
						||
| 
								 | 
							
									     "   clr  0,%2\n"					\
							 | 
						||
| 
								 | 
							
									     "   jl   0f\n"					\
							 | 
						||
| 
								 | 
							
									     "   slr  0,%2\n"					\
							 | 
						||
| 
								 | 
							
								             "   ahi  1,1\n"					\
							 | 
						||
| 
								 | 
							
									     "0: st   1,%1\n"					\
							 | 
						||
| 
								 | 
							
									     "   l    1,4+%1\n"					\
							 | 
						||
| 
								 | 
							
									     "   srdl 0,1\n"					\
							 | 
						||
| 
								 | 
							
								             "   dr   0,%2\n"					\
							 | 
						||
| 
								 | 
							
									     "   alr  1,1\n"					\
							 | 
						||
| 
								 | 
							
									     "   alr  0,0\n"					\
							 | 
						||
| 
								 | 
							
									     "   lhi  2,1\n"					\
							 | 
						||
| 
								 | 
							
									     "   n    2,4+%1\n"					\
							 | 
						||
| 
								 | 
							
									     "   alr  0,2\n"					\
							 | 
						||
| 
								 | 
							
									     "   clr  0,%2\n"					\
							 | 
						||
| 
								 | 
							
								             "   jl   1f\n"					\
							 | 
						||
| 
								 | 
							
									     "   slr  0,%2\n"					\
							 | 
						||
| 
								 | 
							
									     "   ahi  1,1\n"					\
							 | 
						||
| 
								 | 
							
									     "1: st   1,4+%1\n"					\
							 | 
						||
| 
								 | 
							
								             "   lr   %0,0"					\
							 | 
						||
| 
								 | 
							
									     : "=d" (__r), "=m" (__n)				\
							 | 
						||
| 
								 | 
							
									     : "d" (base), "m" (__n) : "0", "1", "2", "cc" );	\
							 | 
						||
| 
								 | 
							
									(n) = (__n);						\
							 | 
						||
| 
								 | 
							
								        __r;                                                    \
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#else /* __s390x__ */
							 | 
						||
| 
								 | 
							
								#include <asm-generic/div64.h>
							 | 
						||
| 
								 | 
							
								#endif /* __s390x__ */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 |