|
|
1.1 ! root 1: ! 2: ! 3: #if !defined(USE_WIN32_ASSEMBLER) ! 4: ! 5: #error "You shouldn't be including this file because you're not using assembler routines" ! 6: ! 7: #endif ! 8: ! 9: ! 10: ! 11: #define mp_addc P_ADDC ! 12: ! 13: #define mp_add P_ADD ! 14: ! 15: #define mp_rotate_left P_ROTATE_LEFT ! 16: ! 17: #define mp_subb P_SUBB ! 18: ! 19: #define mp_smula P_SMULA ! 20: ! 21: ! 22: ! 23: #if !defined(_MSC_VER) ! 24: ! 25: #error "This code needs a Microsoft compiler" ! 26: ! 27: #endif ! 28: ! 29: ! 30: ! 31: #if defined(_M_IX86) ! 32: ! 33: ! 34: ! 35: ! 36: ! 37: #pragma warning(disable:4035) // this stops the compiler complaining about no return values from the routines ! 38: ! 39: ! 40: ! 41: extern unsigned int global_precision; ! 42: ! 43: ! 44: ! 45: ! 46: ! 47: __inline boolean P_ROTATE_LEFT(unitptr r1, boolean carry) ! 48: ! 49: { ! 50: ! 51: __asm{ ! 52: ! 53: mov edi,DWORD PTR [global_precision] ! 54: ! 55: mov ecx,DWORD PTR [r1] ! 56: ! 57: xor esi,esi // clear esi, which is the offset into the digit arrays ! 58: ! 59: // cetup carry ! 60: ! 61: // note that the instruction above clears the carry ! 62: ! 63: mov eax,DWORD PTR [carry] ! 64: ! 65: rcr eax,1 ! 66: ! 67: loop_t3: ! 68: ! 69: mov eax,DWORD PTR [ecx + esi * 4] ! 70: ! 71: rcl eax,1 ! 72: ! 73: mov DWORD PTR [ecx + esi * 4],eax ! 74: ! 75: inc esi ! 76: ! 77: dec edi ! 78: ! 79: jnz loop_t3 ! 80: ! 81: // compute carry ! 82: ! 83: rcl eax,1 ! 84: ! 85: and eax,1 ! 86: ! 87: } ! 88: ! 89: } ! 90: ! 91: ! 92: ! 93: __inline boolean P_SUBB(unitptr r1, unitptr r2, boolean borrow) ! 94: ! 95: { ! 96: ! 97: __asm{ ! 98: ! 99: mov edi,DWORD PTR [global_precision] ! 100: ! 101: mov ecx,DWORD PTR [r1] ! 102: ! 103: mov edx,DWORD PTR [r2] ! 104: ! 105: xor esi,esi // clear esi, which is the offset into the digit arrays ! 106: ! 107: // cetup carry ! 108: ! 109: // note that the instruction above clears the carry ! 110: ! 111: mov eax,DWORD PTR [borrow] ! 112: ! 113: rcr eax,1 ! 114: ! 115: loop_t3: ! 116: ! 117: mov eax,DWORD PTR [ecx + esi * 4] ! 118: ! 119: mov ebx,DWORD PTR [edx + esi * 4] ! 120: ! 121: sbb eax,ebx ! 122: ! 123: mov DWORD PTR [ecx + esi * 4],eax ! 124: ! 125: inc esi ! 126: ! 127: dec edi ! 128: ! 129: jnz loop_t3 ! 130: ! 131: // compute carry ! 132: ! 133: rcl eax,1 ! 134: ! 135: and eax,1 ! 136: ! 137: } ! 138: ! 139: } ! 140: ! 141: ! 142: ! 143: __inline void P_SMULA(unitptr prod,unitptr multiplicand, unit multiplier) ! 144: ! 145: { ! 146: ! 147: __asm{ ! 148: ! 149: mov ecx,DWORD PTR [global_precision] ! 150: ! 151: mov edi,DWORD PTR [prod] ! 152: ! 153: mov esi,DWORD PTR [multiplicand] ! 154: ! 155: push ebp ! 156: ! 157: mov ebp,DWORD PTR [multiplier] ! 158: ! 159: ! 160: ! 161: xor ebx,ebx ! 162: ! 163: loop_t3: ! 164: ! 165: mov eax,DWORD PTR [esi] ! 166: ! 167: mul ebp ! 168: ! 169: add eax,ebx ! 170: ! 171: adc edx,0 ! 172: ! 173: add eax,DWORD PTR [edi] ! 174: ! 175: adc edx,0 ! 176: ! 177: mov DWORD PTR [edi],eax ! 178: ! 179: mov ebx,edx ! 180: ! 181: add esi,4 ! 182: ! 183: add edi,4 ! 184: ! 185: dec ecx ! 186: ! 187: jnz loop_t3 ! 188: ! 189: add DWORD PTR [edi],ebx ! 190: ! 191: pop ebp ! 192: ! 193: } ! 194: ! 195: } ! 196: ! 197: ! 198: ! 199: __inline boolean P_ADDC(unitptr r1, unitptr r2, boolean carry) ! 200: ! 201: { ! 202: ! 203: __asm{ ! 204: ! 205: mov edi,DWORD PTR [global_precision] ! 206: ! 207: mov ecx,DWORD PTR [r1] ! 208: ! 209: mov edx,DWORD PTR [r2] ! 210: ! 211: xor esi,esi // clear esi, which is the offset into the digit arrays ! 212: ! 213: // cetup carry ! 214: ! 215: // note that the instruction above clears the carry ! 216: ! 217: mov eax,DWORD PTR [carry] ! 218: ! 219: rcr eax,1 ! 220: ! 221: loop_t3: ! 222: ! 223: mov eax,DWORD PTR [ecx + esi * 4] ! 224: ! 225: mov ebx,DWORD PTR [edx + esi * 4] ! 226: ! 227: adc eax,ebx ! 228: ! 229: mov DWORD PTR [ecx + esi * 4],eax ! 230: ! 231: inc esi ! 232: ! 233: dec edi ! 234: ! 235: jnz loop_t3 ! 236: ! 237: // compute carry ! 238: ! 239: rcl eax,1 ! 240: ! 241: and eax,1 ! 242: ! 243: } ! 244: ! 245: } ! 246: ! 247: ! 248: ! 249: ! 250: ! 251: // special version which doesn't read or write a carry. ! 252: ! 253: // we actually call this more often than the full version ! ! 254: ! 255: __inline P_ADD(unitptr r1, unitptr r2) ! 256: ! 257: { ! 258: ! 259: __asm{ ! 260: ! 261: mov edi,DWORD PTR [global_precision] ! 262: ! 263: mov ecx,DWORD PTR [r1] ! 264: ! 265: mov edx,DWORD PTR [r2] ! 266: ! 267: xor esi,esi // clear esi, which is the offset into the digit arrays ! 268: ! 269: loop_t3: ! 270: ! 271: mov eax,DWORD PTR [ecx + esi * 4] ! 272: ! 273: mov ebx,DWORD PTR [edx + esi * 4] ! 274: ! 275: adc eax,ebx ! 276: ! 277: mov DWORD PTR [ecx + esi * 4],eax ! 278: ! 279: inc esi ! 280: ! 281: dec edi ! 282: ! 283: jnz loop_t3 ! 284: ! 285: } ! 286: ! 287: } ! 288: ! 289: ! 290: ! 291: #if defined(SMITH) ! 292: ! 293: ! 294: ! 295: #define mp_quo_digit P_QUO_DIGIT ! 296: ! 297: ! 298: ! 299: extern unit reciph,recipl; ! 300: ! 301: extern int mshift; ! 302: ! 303: ! 304: ! 305: #endif /*#defined(SMITH) */ ! 306: ! 307: ! 308: ! 309: #endif /* X86 */ ! 310: ! 311: ! 312: ! 313: #if defined(_M_PPC) ! 314: ! 315: #error "We've not written the PowerPC Code Yet!" ! 316: ! 317: #endif /* _M_PPC */ ! 318: ! 319: ! 320: ! 321: #if defined(_M_ALPHA) ! 322: ! 323: #error "We've not written the Alpha Code Yet!" ! 324: ! 325: #endif /* _M_ALPHA */ ! 326: ! 327: ! 328: ! 329: #if defined(_M_MRX000) ! 330: ! 331: #error "We've not written the MIPS Code Yet!" ! 332: ! 333: #endif /* _M_MRX000 */ ! 334: ! 335: ! 336: ! 337: ! 338: ! 339: #pragma warning(default:4035) ! 340:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.