home *** CD-ROM | disk | FTP | other *** search
- /* platform.h - computer platform customization for PGP
- multiprecision math package. #Included in mpilib.h.
- */
- #ifndef PLATFORM_H
- #define PLATFORM_H
-
- /* Platform customization:
- * A version which runs on almost any computer can be implemented by
- * defining PORTABLE and MPORTABLE, preferably as a command line
- * parameter. Faster versions can be generated by specifying specific
- * parameters, such as size of unit and MULTUNIT, and by supplying some
- * of the critical in assembly.
- *
- * This file holds customizations for different environments.
- * This is done in one of two ways:
- * 1. A symbol is defined on the command line which designates a
- * particular environment, such as MSDOS. This file detects the
- * environment symbol and sets the appropriate low-level defines.
- *
- * 2. If no environment is named, the low-level defines are set in
- * the same manner as for PGP 2.0, thereby providing an easy upgrade.
- *
- * Following are a description of the low-level definition symbols:
- *
- * The following preprocessor symbols should be conditionally set to
- * optimize for a particular environment.
- *
- * Define one of the following:
- * UNIT8, UNIT16, or UNIT32 - specifies size of operands for
- * multiprecision add, subtract, shift, and initialization operations.
- * Define one of the following:
- * MUNIT8, MUNIT16, MUNIT32 - specified size of operands for
- * multiprecision multiply and mod_mult. This must be less than or
- * equal to unit size. It should be the word size for the native
- * atomic multiply instruction. For a 16x16 bit multiply yielding a
- * 32-bit product, MUNIT16 should be set.
- * Define one (or more) of the following:
- * PEASANT, MERRITT, UPTON, SMITH -algorithm used for modmult.All defined
- * algorithms are compiled, but the first defined name listed will be
- * assigned to the generic entry point symbols. Multiple algorithms are
- * used primarily for testing.
- * HIGHFIRST - specified if longs are stored with the most significant
- * bit at the lowest address (Motorola), undefined otherwise. This should
- * be defined on the command line, normally in the makefile.
- *
- * The following symbol, if initialized, is set to specific values:
- * ALIGN - variable declaration attribute which forces optimum alignment
- * of words, e.g. for VAX C: ALIGN=_align(quadword)
- *
- * The following symbols correspond to individual multiprecision routines
- * that may be implemented with assembly language. If they are implemented
- * in assembly, the symbols should be defined with the name of the
- * corresponding external entry points, e.g., mp_addc=P_ADDC
- * mp_setp - set precision for external routines
- * mp_addc - add with carry
- * mp_subb - subtract with borrow
- * mp_rotate_left - rotate left
- * mp_compare - compare
- * mp_move - move
- * unitfill0 - zero fill
- * mp_smul - multiply vector by single word *
- * mp_smula - multiply vector by single word and accumulate *
- * mp_dmul - full multiply
- * mp_set_recip - setup for mp_quo_digit
- * mp_quo_digit - quotient digit for modulus reduction
- *
- * Either mp_smul or mp_smula should be defined. mp_smula provides
- * for accumulation to an existing value, while mp_smul is for use of the
- * older definition of mp_smul, used in PGP 2.0, which assumed that the high
- * order accumulator word is zero. Use of mp_smula causes one less word of
- * precision to be used, thereby slightly increasing speed.
- */
-
- /********************************************************************
- * Environment customization. Please send any additions or corrections
- * to Philip Zimmermann.
- */
- #ifndef PORTABLE
-
- #ifdef MSDOS
- #ifndef i386 /* gcc */
- #define UNIT16
- #define MUNIT16
- #define mp_setp P_SETP
- #define mp_addc P_ADDC
- #define mp_subb P_SUBB
- #define mp_rotate_left P_ROTL
- #define mp_smula P_SMULA
- #define mp_quo_digit P_QUO_DIGIT
- #define mp_set_recip P_SETRECIP
- #define SMITH
- #define PLATFORM_SPECIFIED
- #endif /* i386 */
- #endif /* MSDOS */
-
- #ifdef VMS
-
- #ifdef __DECC
- #define _VMS_DECC /* Compiler is DECC */
- #ifdef __alpha
- #define _VMS_ALPHA /* Platform alpha */
- #define _VMS_T_PLATFORM "DECC/Alpha"
- #endif
- #ifdef __vax
- #define _VMS_VAX /* Platform VAX */
- #define _VMS_T_PLATFORM "DECC/VAX"
- #endif
- #else /* #ifdef __DECC */
- #ifdef VAXC
- #define _VMS_VAX /* Platform _must_ be VAX for VAXC w/o __DECC */
- #define _VMS_VAXC /* Compiler _is_ VAXC */
- #define _VMS_T_PLATFORM "VAXC/VAX"
- #endif /* #ifdef VAXC */
- #endif /* #else (#ifdef __DECC) */
-
- #define UNIT32 /* use 32-bit units */
- #define MUNIT16 /* not used in C code, only in assembler */
- #define UPTON
- #ifndef __ALPHA
- #define mp_setp p_setp
- #define mp_addc p_addc
- #define mp_subb p_subb
- #define mp_rotate_left p_rotl
- #define mp_smul p_smul
- #define mp_dmul p_dmul
- #define mp_compare p_cmp
- #endif
- #define ALIGN _align(quadword)
-
- #pragma builtins
- #ifdef __DECC
- #define mp_move( dst, src) memcpy((char *) dst,(char *) src, global_precision*4)
- #define unitfill0( r, unitcount) memset( (char *) r, 0, unitcount*4)
- #define mp_burn(r) memset( (char *) r, 0, global_precision*4)
- #define mp_init0(r) mp_burn(r) /* Just for documentation purposes */
- #else
- #define mp_move( dst, src) _MOVC3( global_precision*4, (char *) src, (char *) dst)
- #define unitfill0( r, unitcount) _MOVC5( 0, (char *) 0, 0, unitcount*4, (char *) r)
- #define mp_burn(r) _MOVC5(0, (char *) 0, 0, global_precision*4, (char *) r)
- #define mp_init0(r) mp_burn(r) /* Just for documentation purposes */
- #endif /* __DECC */
-
- #define PLATFORM_SPECIFIED
- #endif /* #ifdef VMS */
-
- #if defined(mips) || defined(__mips)
- /*
- * Needs r3kd.s and r3000.s (or r3000.c)
- */
- #define UNIT32
- #define MUNIT32
- #define SMITH
- #define mp_dmul p_dmul
- #define mp_setp p_setp
- #define mp_addc p_addc
- #define mp_subb p_subb
- #define mp_rotate_left p_rotl
- #define mp_smula p_smula
- #define mp_quo_digit p_quo_digit
- #define mp_set_recip p_setrecip
- #define PLATFORM_SPECIFIED
- #endif /* mips */
-
- #ifdef i386
- /*
- * Needs 80386.S
- */
- #define UNIT32
- #define MUNIT32
- #define SMITH
- #define mp_setp P_SETP
- #define mp_addc P_ADDC
- #define mp_subb P_SUBB
- #define mp_rotate_left P_ROTL
- #define unitfill0(r,ct) memset((void*)r, 0, (ct)*sizeof(unit))
- #define mp_smula P_SMULA
- #define mp_quo_digit p_quo_digit
- #define mp_set_recip p_setrecip
- #define PLATFORM_SPECIFIED
- #endif /* i386 */
-
- #ifdef sparc
- /*
- * Needs sparc.s
- */
- #define UNIT32
- #define MERRITT
- #define mp_setp P_SETP
- #define mp_addc P_ADDC
- #define mp_subb P_SUBB
- #define mp_rotate_left P_ROTL
- #define unitfill0(r,ct) memset((void*)r, 0, (ct)*sizeof(unit))
- #define PLATFORM_SPECIFIED
- #endif /* sparc */
-
- #if defined(mc68000) || defined(mc68020)
- /*
- * Needs mc68020.S
- */
- #define UNIT32
- #define mp_setp P_SETP
- #define mp_addc P_ADDC
- #define mp_subb P_SUBB
- #define mp_rotate_left P_ROTL
- #define unitfill0(r,ct) memset((void*)r, 0, (ct)*sizeof(unit))
- #if defined(sun3) || defined(mc68020)
- # define UPTON
- # define MUNIT32
- # define mp_smul P_SMUL
- /* # define mp_dmul P_DMUL */ /* mc68020.s has a bug in P_DMUL */
- #else
- # define SMITH
- # define MUNIT16
- #endif
- #define PLATFORM_SPECIFIED
- #endif /* mc68000 */
-
- #ifdef AMIGA
- #define UNIT32
- #define mp_addc P_ADDC
- #define mp_subb P_SUBB
- #define mp_rotate_left P_ROTL
- #define mp_setp P_SETP
- #ifdef _M68020
- #define mp_smul P_SMUL
- #define UPTON
- #define MUNIT32 /* 32-bit multiplies for >=68020 */
- #else /* _M68020 */
- #define SMITH
- #define MUNIT16
- #endif /* _M68020 */
- #define PLATFORM_SPECIFIED
- #endif /* AMIGA */
-
- /* RISC OS added. -- GJM */
- #ifdef RISC_OS
- #define UNIT32
- #define MUNIT32 /* can't use Smith's algorithm */
- #define UPTON
- #define mp_addc _p_addc
- #define mp_subb _p_subb
- #define mp_rotate_left _p_rol
- #define mp_smul _p_smul
- #define mp_dmul _p_dmul
- #define unitfill0(r,ct) memset((void*)r,0,(ct)*sizeof(unit))
- #define PLATFORM_SPECIFIED
- #endif
-
- /* Add additional platforms here ... */
-
- /**************** End of system specification ************************/
-
- #ifndef PLATFORM_SPECIFIED
- /* No platform explicitly selected. Customization is controlled by
- * PORTABLE and MPORTABLE.
- */
- #define mp_setp P_SETP
- #define mp_addc P_ADDC
- #define mp_subb P_SUBB
- #define mp_rotate_left P_ROTL
- #define UPTON
- #define unitfill0(r,ct) memset((void*)r, 0, (ct)*sizeof(unit))
- #ifndef MPORTABLE
- #define mp_smul P_SMUL
- #endif /* MPORTABLE */
- #endif /* PLATFORM_SPECIFIED */
- #endif /* PORTABLE */
- #endif /* PLATFORM_H */
-
-