Annotation of pgp/src/80386.s, revision 1.1

1.1     ! root        1: /*
        !             2: **
        !             3: **      80386 assembly primitives for RSA library
        !             4: **      GNU gas syntax, tested with gcc v1.39
        !             5: **
        !             6: **      Compile with UNIT32 defined, MULTUNIT must be unsigned long
        !             7: **      assemble this file with gcc -c (file should have .S suffix)
        !             8: **
        !             9: **      Written by Branko Lankester ([email protected])       11/18/91
        !            10: **      Last revised: 03/04/91
        !            11: **
        !            12:  */
        !            13: 
        !            14: #if defined(__GNUC__) || defined(__ASSEMBLER__)
        !            15: #ifdef __STDC__
        !            16: #define        ENTRY(name)     .align 4 ; .globl _##name ; _##name:
        !            17: #else
        !            18: #define        ENTRY(name)     .align 4 ; .globl _/**/name ; _/**/name:
        !            19: #endif
        !            20: #else /* !__GNUC__ */
        !            21: #define        ENTRY(name)     .align 4 ; .globl name ; name:
        !            22: #endif
        !            23: 
        !            24: .text
        !            25: 
        !            26: /*
        !            27: ********************* set precision ********************
        !            28: */
        !            29: ENTRY (P_SETP)
        !            30:         pushl %ebp
        !            31:         movl %esp,%ebp
        !            32:         pushl %ebx
        !            33:                pushl %ecx
        !            34:                pushl %edx
        !            35:         movl 8(%ebp),%eax
        !            36:         addl $0x1f,%eax
        !            37:         shrl $5,%eax
        !            38:         movl %eax,%ebx
        !            39:         shrl $3,%eax
        !            40:         movl %eax,prec8
        !            41:         andl $7,%ebx
        !            42: 
        !            43:         movl $add_ref,%eax
        !            44:         movl %eax,%ecx
        !            45:         subl $add_1ref,%eax
        !            46:         mul %ebx
        !            47:         subl %eax,%ecx
        !            48:         movl %ecx,addp
        !            49:         movl $sub_ref,%ecx
        !            50:         subl %eax,%ecx
        !            51:         movl %ecx,subp
        !            52: 
        !            53:         movl $rot_ref,%eax
        !            54:         movl %eax,%ecx
        !            55:         subl $rot_1ref,%eax
        !            56:         mul %ebx
        !            57:         subl %eax,%ecx
        !            58:         movl %ecx,rotp
        !            59: 
        !            60:         movl $mul_ref,%eax
        !            61:         movl %eax,%ecx
        !            62:         subl $mul_1ref,%eax
        !            63:         mul %ebx
        !            64:         subl %eax,%ecx
        !            65:         movl %ecx,mulp
        !            66: 
        !            67:                popl %edx
        !            68:                popl %ecx
        !            69:         popl %ebx
        !            70:         leave
        !            71:         ret
        !            72: 
        !            73: 
        !            74: 
        !            75: /*
        !            76: ********************* mpi add with carry ********************
        !            77: */
        !            78: 
        !            79: #define ADDU    lodsl ; adcl %eax,(%ebx,%esi)
        !            80: 
        !            81: ENTRY (P_ADDC)
        !            82:         pushl %ebp
        !            83:         movl %esp,%ebp
        !            84:         pushl %ebx
        !            85:                pushl %ecx
        !            86:         pushl %esi
        !            87:         pushl %edi
        !            88:         movl 12(%ebp),%esi
        !            89:         movl 8(%ebp),%ebx
        !            90:         subl %esi,%ebx
        !            91:         subl $4,%ebx
        !            92:         cld
        !            93:         movl 16(%ebp),%eax
        !            94:         movl prec8,%ecx
        !            95:         orl %ecx,%ecx
        !            96:         rcrl $1,%eax   /* set the carry flag */
        !            97:                jz add_units    /* z-flag set by orl %ecx,%ecx */
        !            98: add_8u:
        !            99:         ADDU ; ADDU ; ADDU ; ADDU ; ADDU ; ADDU ; ADDU ; ADDU
        !           100:         loop add_8u
        !           101: add_units:
        !           102:         jmp *addp
        !           103:         ADDU ; ADDU ; ADDU ; ADDU ; ADDU ; ADDU
        !           104: add_1ref:                       /* label to compute size of codes */
        !           105:         ADDU
        !           106: add_ref:
        !           107:         rcll $1,%eax
        !           108:         andl $1,%eax
        !           109: 
        !           110:         popl %edi
        !           111:         popl %esi
        !           112:                popl %ecx
        !           113:         popl %ebx
        !           114:         leave
        !           115:         ret
        !           116: 
        !           117: 
        !           118: /*
        !           119: ********************* mpi subtract with borrow ********************
        !           120: */
        !           121: 
        !           122: #define SUBU    lodsl ; sbbl %eax,(%ebx,%esi)
        !           123: 
        !           124: ENTRY (P_SUBB)
        !           125:         pushl %ebp
        !           126:         movl %esp,%ebp
        !           127:         pushl %ebx
        !           128:                pushl %ecx
        !           129:         pushl %esi
        !           130:         pushl %edi
        !           131:         movl 12(%ebp),%esi
        !           132:         movl 8(%ebp),%ebx
        !           133:         subl %esi,%ebx
        !           134:         subl $4,%ebx
        !           135:         cld
        !           136:         movl 16(%ebp),%eax
        !           137:         movl prec8,%ecx
        !           138:         orl %ecx,%ecx
        !           139:         rcrl $1,%eax
        !           140:                jz sub_units
        !           141: sub_8u:
        !           142:         SUBU ; SUBU ; SUBU ; SUBU ; SUBU ; SUBU ; SUBU ; SUBU
        !           143:         loop sub_8u
        !           144: sub_units:
        !           145:         jmp *subp
        !           146:         SUBU ; SUBU ; SUBU ; SUBU ; SUBU ; SUBU ; SUBU
        !           147: sub_ref:
        !           148:         rcll $1,%eax
        !           149:         andl $1,%eax
        !           150: 
        !           151:         popl %edi
        !           152:         popl %esi
        !           153:                popl %ecx
        !           154:         popl %ebx
        !           155:         leave
        !           156:         ret
        !           157: 
        !           158: 
        !           159: 
        !           160: /*
        !           161: ********************* mpi rotate left ********************
        !           162: */
        !           163: 
        !           164: #define ROTU    rcll $1,(%ebx,%esi,4) ; incl %esi
        !           165: 
        !           166: ENTRY (P_ROTL)
        !           167:         pushl %ebp
        !           168:         movl %esp,%ebp
        !           169:         pushl %ebx
        !           170:                pushl %ecx
        !           171:         pushl %esi
        !           172:         movl 8(%ebp),%ebx
        !           173:         movl 12(%ebp),%eax
        !           174:         xorl %esi,%esi
        !           175:         movl prec8,%ecx
        !           176:         orl %ecx,%ecx
        !           177:         rcrl $1,%eax   /* set the carry flag */
        !           178:                jz rot_units    /* z-flag set by orl %ecx,%ecx */
        !           179: rot_8u:
        !           180:         rcll $1,(%ebx)
        !           181:         rcll $1,4(%ebx)
        !           182:         rcll $1,8(%ebx)
        !           183:         rcll $1,12(%ebx)
        !           184:         rcll $1,16(%ebx)
        !           185:         rcll $1,20(%ebx)
        !           186:         rcll $1,24(%ebx)
        !           187:         rcll $1,28(%ebx)
        !           188:         leal 32(%ebx),%ebx
        !           189:         loop rot_8u
        !           190: rot_units:
        !           191:         jmp *rotp
        !           192:         ROTU ; ROTU ; ROTU ; ROTU ; ROTU ; ROTU ; ROTU
        !           193: rot_1ref:
        !           194:         ROTU
        !           195: rot_ref:
        !           196:         rcll $1,%eax
        !           197:         andl $1,%eax
        !           198: 
        !           199:         popl %esi
        !           200:                popl %ecx
        !           201:         popl %ebx
        !           202:         leave
        !           203:         ret
        !           204: 
        !           205: /*
        !           206: ********************* mpi multiply ********************
        !           207: */
        !           208: #define MULU    \
        !           209:         lodsl ; \
        !           210:         mull %ebp ; \
        !           211:         addl %ebx,%eax ; \
        !           212:         adcl $0,%edx ; \
        !           213:         addl (%edi),%eax ; \
        !           214:         adcl $0,%edx ; \
        !           215:         movl %edx,%ebx ; \
        !           216:         stosl
        !           217: 
        !           218: ENTRY (P_SMUL)
        !           219:         pushl %ebp
        !           220:         movl %esp,%ebp
        !           221:         pushl %ebx
        !           222:                pushl %ecx
        !           223:                pushl %edx
        !           224:         pushl %esi
        !           225:         pushl %edi
        !           226: 
        !           227:         xorl %ebx,%ebx
        !           228:         movl prec8,%ecx
        !           229:         movl 8(%ebp),%edi
        !           230:         movl 12(%ebp),%esi
        !           231:         movl 16(%ebp),%ebp
        !           232:         cld
        !           233:         orl %ecx,%ecx
        !           234:         jz mul_units
        !           235: mul_8u:
        !           236:         MULU ; MULU ; MULU ; MULU ; MULU ; MULU ; MULU ; MULU
        !           237:         decl %ecx
        !           238:         jnz mul_8u      /* offset too big for loop */
        !           239: mul_units:
        !           240:         jmp *mulp
        !           241:         MULU ; MULU ; MULU ; MULU ; MULU ; MULU
        !           242: mul_1ref:
        !           243:         MULU
        !           244: mul_ref:
        !           245:         movl %ebx,(%edi)
        !           246: 
        !           247:         popl %edi
        !           248:         popl %esi
        !           249:                popl %edx
        !           250:                popl %ecx
        !           251:         popl %ebx
        !           252:         popl %ebp
        !           253:         ret
        !           254: 
        !           255: .lcomm  prec8,4
        !           256: .lcomm  addp,4
        !           257: .lcomm  subp,4
        !           258: .lcomm  rotp,4
        !           259: .lcomm  mulp,4
        !           260: 

unix.superglobalmegacorp.com

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