| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -2,12 +2,23 @@ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					// Prozessor: MIPS
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					// Endianness: irrelevant
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					// Compiler: GNU-C oder ...
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					// Parameter-Übergabe: in Registern $4,$5,$6,$7, und auf dem Stack 16($sp),...
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					// Parameter-Übergabe:
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//   o32: in Registern $4,$5,$6,$7, und auf dem Stack 16($sp),...
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//   n32: in Registern $4,$5,$6,$7,$8,$9,$10,$11, und auf dem Stack 4($sp),...
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					// Rückgabewert: in Register $2
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					// Einstellungen: intCsize=32, intDsize=32.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					// Besonderheiten: Nach jedem Ladebefehl ein Wartetakt nötig, bevor der
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//   geholte Wert benutzt werden darf.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					// Strictly speaking, the MIPS ABI (-32 or -n32) is independent from the CPU
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					// identification (-mips[12] or -mips[34]). But -n32 is commonly used together
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					// with -mips3, and it's easier to test the CPU identification.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#if __mips >= 3
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  #define ABI_N32 1
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#else
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  #define ABI_O32 1
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#endif
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					// When this file is compiled into a shared library, ELF linkers need to
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					// know which symbols are functions.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#if defined(__GNU__) || defined(__NetBSD__)
 | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -531,9 +542,13 @@ sld4:     subu $12,$13          // dest = source1 - source2 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					// extern uintD subx_loop_down (uintD* sourceptr1, uintD* sourceptr2, uintD* destptr, uintC count, uintD carry);
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        .align 2 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        DECLARE_FUNCTION(subx_loop_down) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        .ent subx_loop_down // Input in $4,$5,$6,$7, Output in $2
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        .ent subx_loop_down // Input in $4,$5,$6,$7,$8 Output in $2
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					subx_loop_down: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#if ABI_N32
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        move $12,$8             // carry
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#else
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        lw $12,16($sp)          // carry
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#endif
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        bnez $12,sxld5          // !(carry==0) ?
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        b sxld2 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					sxld1:    // kein Carry
 | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -995,9 +1010,13 @@ slu4:     subu $12,$13          // dest = source1 - source2 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					// extern uintD subx_loop_up (uintD* sourceptr1, uintD* sourceptr2, uintD* destptr, uintC count, uintD carry);
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        .align 2 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        DECLARE_FUNCTION(subx_loop_up) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        .ent subx_loop_up // Input in $4,$5,$6,$7, Output in $2
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        .ent subx_loop_up // Input in $4,$5,$6,$7,$8, Output in $2
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					subx_loop_up: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#if ABI_N32
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        move $12,$8             // carry
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#else
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        lw $12,16($sp)          // carry
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#endif
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        bnez $12,sxlu5          // !(carry==0) ?
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        b sxlu2 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					sxlu1:    // kein Carry
 | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |