mirror of
				https://github.com/SEPPDROID/Digital-Research-Source-Code.git
				synced 2025-10-26 01:44:21 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			123 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
|        ttl     ieee format equivalent add/subtract (iefadd/iefsub)
 | |
| ***************************************
 | |
| * (c) copyright 1981 by motorola inc. *
 | |
| ***************************************
 | |
|  
 | |
| *************************************************************
 | |
| *                     iefadd/iefsub                         *
 | |
| *  fast floating point ieee format equivalent add/subtract  *
 | |
| *                                                           *
 | |
| *  iefadd - ieee format equivalent floating point addition  *
 | |
| *                                                           *
 | |
| *  input:  d6 - ieee format number addend (source)          *
 | |
| *          d7 - ieee format number adder  (destination)     *
 | |
| *                                                           *
 | |
| *  iefsub - ieee format equivalent floating point subtract  *
 | |
| *                                                           *
 | |
| *  input:  d6 - ieee format number subtrahend (source)      *
 | |
| *          d7 - ieee format number minuend (destination)    *
 | |
| *                                                           *
 | |
| *  output: d7 - ieee format floating result of register d6  *
 | |
| *               added or subtracted from register d7        *
 | |
| *                                                           *
 | |
| *  condition codes:                                         *
 | |
| *          n - result is negative                           *
 | |
| *          z - result is zero                               *
 | |
| *          v - result is nan (not-a-number)                 *
 | |
| *          c - undefined                                    *
 | |
| *          x - undefined                                    *
 | |
| *                                                           *
 | |
| *           all registers transparent                       *
 | |
| *                                                           *
 | |
| *        maximum used stack:    28 bytes                    *
 | |
| *                                                           *
 | |
| *  result matrix:            arg 2                          *
 | |
| *                  others    +inf      -inf        nan      *
 | |
| *     arg 1      ****************************************   *
 | |
| *   others       *   a    *    b    *    c     *    f   *   *
 | |
| *   +infinity    *   b    *    b    *    d     *    f   *   *
 | |
| *   -infinity    *   c    *    d    *    c     *    f   *   *
 | |
| *   nan          *   e    *    e    *    e     *    f   *   *
 | |
| *                ****************************************   *
 | |
| *       a = return addition or subtraction result,          *
 | |
| *           overflowing to infinity, underflowing to zero   *
 | |
| *       b = return plus infinity                            *
 | |
| *       c = return minus infinity                           *
 | |
| *       d = return newly created nan (not-a-number)         *
 | |
| *       e = return arg1 (nan) unchanged                     *
 | |
| *       f = return arg2 (nan) unchanged                     *
 | |
| *                                                           *
 | |
| *  notes:                                                   *
 | |
| *    1) for subtraction, the sign of the source is          *
 | |
| *       inverted and then the operation is treated as       *
 | |
| *       an addition using the decision matrix above.        *
 | |
| *    2) see the mc68344 user's guide for a description of   *
 | |
| *       the possible differences between the results        *
 | |
| *       returned here versus those required by the          *
 | |
| *       ieee standard.                                      *
 | |
| *                                                           *
 | |
| *************************************************************
 | |
|          page
 | |
| iefadd idnt    1,1  ieee format equivalent add/subtract
 | |
|  
 | |
|          opt       pcs
 | |
|  
 | |
|          xdef      iefadd    ieee format addition
 | |
|          xdef      iefsub    ieee format subtraction
 | |
|  
 | |
|          xref      iefdop   double argument conversion routine
 | |
|          xref      iefrtnan create and return nan result routine
 | |
|          xref      iefrtd7  return contents of d7 as the result
 | |
|          xref      iefrtsz  return signed zero with sign of d7
 | |
|          xref      ieftieee return and convert back to ieee format
 | |
|          xref      ffpadd   reference fast floating point add routine
 | |
|          xref      ffpcpyrt copyright notice
 | |
|  
 | |
|          section  9
 | |
|  
 | |
| ************************
 | |
| * subtract entry point *
 | |
| ************************
 | |
| iefsub   bchg.l    #31,d6    invert sign of second argument for subtract
 | |
|          jsr       iefadd    and call add routine
 | |
|          move.w    sr,-(sp) save ccr of result on the stack [vlh] was sr
 | |
|          bchg.l    #31,d6    revert sign back to original condition
 | |
|          rtr                 return with result and condition codes
 | |
|  
 | |
| *******************
 | |
| * add entry point *
 | |
| *******************
 | |
| iefadd   jsr       iefdop    decode both operands
 | |
|          jmp       iefnrm    +0 branch normalized
 | |
|          jmp       iefinf2   +2 branch arg2 infinity
 | |
|          jmp       iefinf1   +4 branch arg1 infinity
 | |
| * test for opposite signs               +6 both are infinity
 | |
|          eor.l     d6,d7     exclusive or signs
 | |
| *        bmi       iefrtnan  opposite signs - go return a nan
 | |
| 		 bmi	   GOTHERE
 | |
| 		 jmp       iefinf1
 | |
| GOTHERE  jmp       iefrtnan   * loader problem
 | |
| 
 | |
| *                                      otherwise both same and return same
 | |
|  
 | |
| * arg1 infinity - return it
 | |
| iefinf1  move.l    d6,d7     return arg1
 | |
| * arg2 infinity - return it (already in d7)
 | |
| iefinf2  jmp       iefrtd7   return d7 as our result
 | |
|  
 | |
| * normalized numbers - do the addition
 | |
| iefnrm   jsr       ffpadd    do fast floating point add
 | |
| *        bne       ieftieee  convert result back to ieee format
 | |
| 		 bne       DOIT
 | |
| 		 jmp	   NOPE
 | |
| DOIT	 jmp       ieftieee
 | |
| * the above few lines had to be changed because of the loader problem
 | |
| 
 | |
| * result is zero - return with proper sign for rn (round-to-nearest)
 | |
| NOPE
 | |
|          movem.l   (sp),d3-d7  reload arguments (and rest of registers)
 | |
|          and.l     d6,d7     return minus only if both minus
 | |
|          jmp       iefrtsz   return signed zero with sign of d7
 | |
|  
 | |
|          end
 |