Annotation of pgp/src/mpw32asm.h, revision 1.1.1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.