home *** CD-ROM | disk | FTP | other *** search
/ PC-Online 1998 February / PCOnline_02_1998.iso / filesbbs / os2 / pgp263.arj / PGP263I.SRC / PGP263II.ZIP / src / mpw32asm.h < prev    next >
C/C++ Source or Header  |  1995-08-05  |  4KB  |  171 lines

  1.  
  2. #if !defined(USE_WIN32_ASSEMBLER)
  3. #error "You shouldn't be including this file because you're not using assembler routines"
  4. #endif
  5.  
  6. #define mp_addc    P_ADDC
  7. #define mp_add    P_ADD
  8. #define mp_rotate_left P_ROTATE_LEFT
  9. #define mp_subb P_SUBB
  10. #define mp_smula P_SMULA
  11.  
  12. #if !defined(_MSC_VER)
  13. #error "This code needs a Microsoft compiler"
  14. #endif
  15.  
  16. #if defined(_M_IX86)
  17.  
  18.  
  19. #pragma warning(disable:4035)  // this stops the compiler complaining about no return values from the routines
  20.  
  21. extern unsigned int global_precision;
  22.  
  23.  
  24. __inline boolean P_ROTATE_LEFT(unitptr r1, boolean carry)
  25. {
  26.     __asm{
  27.         mov edi,DWORD PTR [global_precision]
  28.         mov    ecx,DWORD PTR [r1]
  29.         xor    esi,esi                                // clear esi, which is the offset into the digit arrays
  30.         // cetup carry
  31.         // note that the instruction above clears the carry
  32.         mov    eax,DWORD PTR [carry]
  33.         rcr    eax,1
  34. loop_t3:
  35.         mov    eax,DWORD PTR [ecx + esi * 4]
  36.         rcl    eax,1
  37.         mov DWORD PTR [ecx + esi * 4],eax
  38.         inc    esi
  39.         dec    edi
  40.         jnz    loop_t3
  41.         // compute carry
  42.         rcl    eax,1
  43.         and    eax,1
  44.     }
  45. }
  46.  
  47. __inline boolean P_SUBB(unitptr r1, unitptr r2, boolean borrow)
  48. {
  49.     __asm{
  50.         mov edi,DWORD PTR [global_precision]
  51.         mov    ecx,DWORD PTR [r1]
  52.         mov edx,DWORD PTR [r2]
  53.         xor    esi,esi                                // clear esi, which is the offset into the digit arrays
  54.         // cetup carry
  55.         // note that the instruction above clears the carry
  56.         mov    eax,DWORD PTR [borrow]
  57.         rcr    eax,1
  58. loop_t3:
  59.         mov    eax,DWORD PTR [ecx + esi * 4]
  60.         mov    ebx,DWORD PTR [edx + esi * 4]
  61.         sbb    eax,ebx
  62.         mov DWORD PTR [ecx + esi * 4],eax
  63.         inc    esi
  64.         dec    edi
  65.         jnz    loop_t3
  66.         // compute carry
  67.         rcl    eax,1
  68.         and    eax,1
  69.     }
  70. }
  71.  
  72. __inline void P_SMULA(unitptr prod,unitptr multiplicand, unit multiplier)
  73. {
  74.     __asm{
  75.         mov ecx,DWORD PTR [global_precision]
  76.         mov    edi,DWORD PTR [prod]
  77.         mov esi,DWORD PTR [multiplicand]
  78.         push    ebp
  79.         mov ebp,DWORD PTR [multiplier]
  80.  
  81.         xor ebx,ebx
  82. loop_t3:
  83.         mov    eax,DWORD PTR [esi]
  84.         mul    ebp
  85.         add eax,ebx
  86.         adc    edx,0
  87.         add eax,DWORD PTR [edi]
  88.         adc    edx,0
  89.         mov DWORD PTR [edi],eax
  90.         mov    ebx,edx
  91.         add    esi,4
  92.         add    edi,4
  93.         dec    ecx
  94.         jnz    loop_t3
  95.         add    DWORD PTR [edi],ebx
  96.         pop    ebp
  97.     }
  98. }
  99.  
  100. __inline boolean P_ADDC(unitptr r1, unitptr r2, boolean carry)
  101. {
  102.     __asm{
  103.         mov edi,DWORD PTR [global_precision]
  104.         mov    ecx,DWORD PTR [r1]
  105.         mov edx,DWORD PTR [r2]
  106.         xor    esi,esi                                // clear esi, which is the offset into the digit arrays
  107.         // cetup carry
  108.         // note that the instruction above clears the carry
  109.         mov    eax,DWORD PTR [carry]
  110.         rcr    eax,1
  111. loop_t3:
  112.         mov    eax,DWORD PTR [ecx + esi * 4]
  113.         mov    ebx,DWORD PTR [edx + esi * 4]
  114.         adc    eax,ebx
  115.         mov DWORD PTR [ecx + esi * 4],eax
  116.         inc    esi
  117.         dec    edi
  118.         jnz    loop_t3
  119.         // compute carry
  120.         rcl    eax,1
  121.         and    eax,1
  122.     }
  123. }
  124.  
  125.  
  126. // special version which doesn't read or write a carry.
  127. // we actually call this more often than the full version !
  128. __inline P_ADD(unitptr r1, unitptr r2)
  129. {
  130.     __asm{
  131.         mov edi,DWORD PTR [global_precision]
  132.         mov    ecx,DWORD PTR [r1]
  133.         mov edx,DWORD PTR [r2]
  134.         xor    esi,esi                                // clear esi, which is the offset into the digit arrays
  135. loop_t3:
  136.         mov    eax,DWORD PTR [ecx + esi * 4]
  137.         mov    ebx,DWORD PTR [edx + esi * 4]
  138.         adc    eax,ebx
  139.         mov DWORD PTR [ecx + esi * 4],eax
  140.         inc    esi
  141.         dec    edi
  142.         jnz    loop_t3
  143.     }
  144. }
  145.  
  146. #if defined(SMITH)
  147.  
  148. #define  mp_quo_digit  P_QUO_DIGIT
  149.  
  150. extern unit reciph,recipl;
  151. extern int  mshift;
  152.  
  153. #endif /*#defined(SMITH) */
  154.  
  155. #endif /* X86 */
  156.  
  157. #if defined(_M_PPC)
  158. #error "We've not written the PowerPC Code Yet!"
  159. #endif /* _M_PPC */
  160.  
  161. #if defined(_M_ALPHA)
  162. #error "We've not written the Alpha Code Yet!"
  163. #endif /* _M_ALPHA */
  164.  
  165. #if defined(_M_MRX000)
  166. #error "We've not written the MIPS Code Yet!"
  167. #endif /* _M_MRX000 */
  168.  
  169.  
  170. #pragma warning(default:4035)
  171.