;--------------- Standard MATHMAC.INC ; ; Standard Math Macro Definition File ; ; Gregory F. Whitten ; 07/28/83 ; ; Copyright (c) 1983-2001, Microsoft Corporation. All rights reserved. ; ; ; Revision History ; ; 10/18/83 Greg Whitten ; changed LCL FLT option to have 2 values for IEEE ; ; 05/02/84 Greg Whitten ; added CSconst switch support ; ; 07/23/84 Greg Whitten ; changed public/extrn to lower case ; ; 09/03/84 Greg Whitten ; added movcnp macro for constant pointers (with CSconst) ; fixed CSconst bug in f_movcs (only used 1 place) ; ; 10/29/84 Greg Whitten ; added debugger switch for fout changes ; ; 06/17/87 Jamie Bariteau ; changed outif macro for MASM 5.0 compatibility ; ; 02/22/88 Bill johnston ; outif now checks to see if QUIET was defined. ; ;--------------- if1 ; Pass 1 only ; Helper macros for undefined symbols ;*** OUTIF name,msg ; ; Function: ; Output msg if name is non-zero. If name is undefined, set name = 0. ; outif MACRO name,msg ifndef Name Name= 0 else if Name if1 ifndef QUIET %out ! msg endif endif endif Name=Name endif ENDM ;*** ERROR msg ; ; Function: ; Output msg and generate an assembly time error ; error MACRO msg bug %OUT E r r o r ----- msg ENDM endif ; Pass 1 ; Define standard math package switches ifdef DEBUG %out <+++++++++++++++++++++++> %out <+++ DEBUG version +++> %out <+++++++++++++++++++++++> endif ;DEBUG outif XENIX3, <+++ XENIX 3.0 and later version +++> outif BASIC, outif BASCOM, outif CC, outif FORTRAN, outif PASCAL, outif Frontends, < compiler front-end version> outif LOGO, outif IBMASM, outif ASSEMBLER, outif debugger, outif DecFmt, <- Decimal Microsoft Format> outif MBinFmt, <- Binary Microsoft Format> outif IEEEFmt, <- IEEE Format> if IEEEFmt and (Frontends or debugger) Denormal= 1 ; front-ends need denormals endif outif Denormal, <- denormal number support> outif Use8087, <- 8087 instructions> outif Single, <- Single precision> outif Double, <- Double precision> outif CSconst, <- Constants in CS> if DecFmt+IEEEFmt+MBinFmt ne 1 error endif if Single+Double ne 1 error endif poly1 = 8000h ; flag for leading 1 in poly if Single ; Defined on both passes DefTyp= 4 DefWrd= 2 else ;Double DefTyp= 8 DefWrd= 4 endif ; offsets to sign and exponent fields if IEEEFmt if single expmask= 07F80h expbias= 03F80h expshft= 7 manbits= 24 of_exp= 2 of_sgn= 3 else ;double expmask= 07FF0h expbias= 03FF0h expshft= 4 manbits= 53 of_exp= 6 of_sgn= 7 endif endif ;IEEEFmt if MBinFmt if single manbits= 24 of_exp= 3 of_sgn= 2 else ;double manbits= 56 of_exp= 7 of_sgn= 6 endif endif ;MBinFmt if DecFmt of_exp= 0 of_sgn= 0 endif ;DecFmt if1 ; Pass 1 only ; Helper macros for elementary functions ;*** LCL name,type,value ; ; Function: ; LCL declares data with the specified name, type, and value. ; If the type is FLT for IEEE numbers, then either DD or DQ is ; substituted depending on the size of the variable. ; lcl MACRO name,type,value,value2 ifidn , if IEEEFmt if Single name DD value else ;;Double name DQ value2 endif else error endif else name type value endif ENDM ;*** GENHELP typ,siz ; ; Function: ; GENHELP generates the following macros with the typ and siz ; information embedded in the macro. ; ; PUB name ; PUB4 name ; PUB8 name ; GBL name,type,value ; GBL4 name,type,value ; GBL8 name,type,value ; EXT name,type ; EXT4 name,type ; EXT8 name,type ; F_DW rout ; F4_DW rout ; F8_DW rout ; F_JMP rout ; F4_JMP rout ; F8_JMP rout ; F_CALL rout ; F4_CALL rout ; F8_CALL rout ; ; Global names are considered to be names with the type and size prefix. ; Local names have no prefix. I.e., $I8_ONE and ONE, respectively. ; ; Macros with a size in the name create local names with the size at the ; end. I.e., RESULT4 ; genhelp MACRO typ,siz ;*** PUB name ; ; Function: ; PUB declares both the global and local names as labels. ; pub &MACRO name public $&typ&&siz&_&&name $&typ&&siz&_&&name: name: &ENDM pub4 &MACRO name public $&typ&4_&&name $&typ&4_&&name: name&&4: &ENDM pub8 &MACRO name public $&typ&8_&&name $&typ&8_&&name: name&&8: &ENDM ;*** PUBX name ; ; Function: ; PUBX declares both the global and local names as labels. ; Added for MASM 5.0 compatibility. Adds leading underscore ; to local names to avoid conflict with MASM 5.0 reserved words. ; pubx &MACRO name public $&typ&&siz&_&&name $&typ&&siz&_&&name: _&&name: &ENDM pub4x &MACRO name public $&typ&4_&&name $&typ&4_&&name: _name&&4: &ENDM pub8x &MACRO name public $&typ&8_&&name $&typ&8_&&name: _name&&8: &ENDM ;*** GLB name,type,value ; ; Function: ; GLB declares the global name for the data value and aliases the local ; name to it. ; glb &MACRO name,type,value public $&typ&&siz&_&&name lcl $&typ&&siz&_&&name,type, name equ $&typ&&siz&_&&name &ENDM glb4 &MACRO name,type,value public $&typ&4_&&name lcl $&typ&4_&&name,type, name&&4 equ $&typ&4_&&name &ENDM glb8 &MACRO name,type,value public $&typ&8_&&name lcl $&typ&8_&&name,type, name&&8 equ $&typ&8_&&name &ENDM ;*** EXT name,type ; ; Function: ; EXT declares the global name to be external with the specified type. ; It also aliases the local name to the global name. ; ext &MACRO name,type extrn $&typ&&siz&_&&name:type name equ $&typ&&siz&_&&name &ENDM ext4 &MACRO name,type extrn $&typ&4_&&name:type name&&4 equ $&typ&8_&&name &ENDM ext8 &MACRO name,type extrn $&typ&8_&&name:type name&&8 equ $&typ&8_&&name &ENDM ;*** F_DW name ; ; Function: ; F_DW declares the code address of the global name ; f_dw &MACRO name dwcp $&typ&&siz&_&&name &ENDM f4_dw &MACRO name dwcp $&typ&4_&&name &ENDM f8_dw &MACRO name dwcp $&typ&8_&&name &ENDM ;*** F_CALL name ; ; Function: ; F_CALL declares the global name to be external and issues a call. ; f_call &MACRO name extrn $&typ&&siz&_&&name:near call $&typ&&siz&_&&name &ENDM f4_call &MACRO name extrn $&typ&4_&&name:near call $&typ&4_&&name &ENDM f8_call &MACRO name extrn $&typ&8_&&name:near call $&typ&8_&&name &ENDM ;*** F_JMP name ; ; Function: ; F_JMP declares the global name to be external and issues a jmp. ; f_jmp &MACRO name extrn $&typ&&siz&_&&name:near jmp $&typ&&siz&_&&name &ENDM f4_jmp &MACRO name extrn $&typ&4_&&name:near jmp $&typ&4_&&name &ENDM f8_jmp &MACRO name extrn $&typ&8_&&name:near jmp $&typ&8_&&name &ENDM ENDM ;; End of genhelp ; Invoke GENHELP with the appropriate type and size information. if DecFmt if Single genhelp d,4 else ;;Double genhelp d,8 endif endif if IEEEFmt if Single genhelp i,4 else ;;Double genhelp i,8 endif endif if MBinFmt if Single genhelp m,4 else ;;Double genhelp m,8 endif endif purge genhelp ; toss genhelp macro ; cs mover macros - generate code iff CSconst nonzero movcssi macro if CSconst f_call mvcssi endif endm movcsdi macro if CSconst f_call mvcsdi endif endm movcnp macro dest,name,off if CSconst movcp dest,name,off else movp dest,name,off endif endm ; f_movcs macro ; f_mov macro ; f4_mov macro ; f8_mov macro ; ; Special forms f_mov ; ; op1/DI op2/SI Routine Res SI Use ; ; ARG AC movarg_ac AC DI ; ARG <> movarg SI DI ; AC ARG movac_arg AC DI ; AC <> movac AC DI ; TEMP <> movtemp SI DI ; any any gen code used SI.DI ; ; Special forms f_movcs ; ; op1/DI op2/SI Routine Res SI Use ; ; AC any gencode AC DI ; any any gen code used SI.DI f_movcs macro op1,op2 if CSconst movp di,op1 movcp si,op2 ;; op2 is source &rept DefWrd movs word ptr es:[di],word ptr cs:[si] &endm ifidn , movp si,AC endif else f_mov op1,op2 endif endm f_mov MACRO op1,op2 ifidn , ifidn , f_call movarg_ac else ifnb movp si,op2 ;; op2 is source endif f_call movarg endif else ifidn , ifidn , f_call movac_arg else ifnb movp si,op2 ;; op2 is source endif f_call movac endif else ifidn , ifnb movp si,op2 ;; op2 is source endif f_call movtemp else ifnb movp di,op1 ;; op1 is dest endif ifnb movp si,op2 ;; op2 is source endif &rept DefWrd movsw &endm endif endif endif ENDM f4_mov MACRO op1,op2 ifidn , ifidn , f4_call movarg_ac else ifnb movp si,op2 ;; op2 is source endif f4_call movarg endif else ifidn , ifidn , f4_call movac_arg else ifnb movp si,op2 ;; op2 is source endif f4_call movac endif else ifidn , ifnb movp si,op2 ;; op2 is source endif f4_call movtemp else ifnb movp di,op1 ;; op1 is dest endif ifnb movp si,op2 ;; op2 is source endif movsw movsw endif endif endif ENDM f8_mov MACRO op1,op2 ifidn , ifidn , f8_call movarg_ac else ifnb movp si,op2 ;; op2 is source endif f8_call movarg endif else ifidn , ifidn , f8_call movac_arg else ifnb movp si,op2 ;; op2 is source endif f8_call movac endif else ifidn , ifnb movp si,op2 ;; op2 is source endif f8_call movtemp else ifnb movp di,op1 ;; op1 is dest endif ifnb movp si,op2 ;; op2 is source endif movsw movsw movsw movsw endif endif endif ENDM ; f_push macro ; ; Special forms ; ; op1 Routine Res SI Use ; ; AC pushac AC AX ; ARG pusharg ARG AX ; SI pushsi SI AX ; any gen code SI --- f_push MACRO op1 ifidn , f_call pshac else ifidn , f_call psharg else ifidn , f_call pshsi else if Double push [op1+6] push [op1+4] endif push [op1+2] push [op1] endif endif endif ENDM ; f_pop macro ; ; Special forms ; ; op1 Routine Res SI Use ; ; AC popac AC AX ; ARG poparg ARG AX ; SI popsi SI AX ; any gen code SI --- f_pop MACRO op1 ifidn , f_call popac else ifidn , f_call poparg else ifidn , f_call popsi else pop [op1] pop [op1+2] if Double pop [op1+4] pop [op1+6] endif endif endif endif ENDM ; f_opr macro ; ; Special forms ; ; op1/SI op2/DI routine operations ; ; AC ARG xxxf add,sub,mul,div,cmp ; <> ARG xxxfsi add,sub,mul,div,cmp ; ARG AC xxxr sub,div,cmp ; ARG <> xxxrdi sub,div,cmp ; any any gen moves and call genoper MACRO op f_&op &MACRO op1,op2 ifidn , ifidn , f_call op&f else ifb f_call op&fsi else movp si,op1 movp di,ARG f_call op endif endif else ifidn , ifidn , f_call op&r else ifb f_call op&rdi else movp si,ARG movp di,op2 f_call op endif endif else ifnb movp si,op1 endif ifnb movp di,op2 endif f_call op endif endif &ENDM ENDM genoper add genoper sub genoper mul genoper div genoper cmp purge genoper endif ; Pass 1 ;--------------- End of Standard MATHMAC.INC