Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

198 lines
4.1 KiB

page ,132
subttl emfcom.asm - Comparison instructions
;***
;emfcom.asm - Comparison instructions
;
; Copyright (c) 1986-89, Microsoft Corporation
;
;Purpose:
; Comparison instructions
;
; This Module contains Proprietary Information of Microsoft
; Corporation and should be treated as Confidential.
;
;Revision History:
; See emulator.hst
;
;*******************************************************************************
;*********************************************************************;
; ;
; Comparison instructions: FCOM,FCOMP,FCOMPP,FTST,FXAM ;
; ;
;*********************************************************************;
ProfBegin FCOM
pub eFCOMP
MOV DX,1 ; Counts number of POPs needed (0 or 1)
JMP short CommonCOM
pub eFCOM
XOR DX,DX ; No extra POP needed at end
pub CommonCOM ; SI points to ST, DI points to source
TEST WORD PTR [CURerr],MemoryOperand
JZ short ComSIandDIset
XCHG esi,edi ; Switch SI, DI for memory operands
pub ComSIandDIset
MOV AL,Flag[esi] ; All comparisons are ST ? source
MOV AH,Flag[edi] ; Fetch signs
XOR ebx,ebx
MOV BL,Tag[esi]
SHL BL,1
SHL BL,1
OR BL,Tag[edi]
ifdef i386
JMP COMtab[4*ebx]
else
SHL BL,1
JMP COMtab[ebx]
endif
pub COMvalidvalid
if fastSP
MOV BX,AX ; Keep copy of the Single Flags
endif
XOR AH,AL ; Are signs different?
JS short COMsignSI ; if so then sign of SI will determine
OR AL,AL ; else signs are same. See if negative
JNS short CompareExponents ; If negative then reverse sense of compare
XCHG esi,edi ; by swapping the arguments
XCHG BL,BH ; Swap single flags
pub CompareExponents
MOV AX,Expon[esi]
CMP AX,Expon[edi]
JL short COMless
JG short COMgreater
pub CompareMantissas
if fastSP
XOR BH,BL
TEST BH,Single ; Were both args the same length?
JNZ DifferentTypes
TEST BL,Single ; Args same type - Single?
JZ BothDouble
MOV ecx,3 ; Compare 3 bytes of mantissa
DoCompare:
ADD esi,MB7 ; point to most significant byte
ADD edi,MB7
STD
REP CMPS word ptr es:[edi],word ptr ds:[esi]
CLD
else
mov ecx,4 ; compare 4 words of mantissa
ADD esi,MB6 ; point to most significant word
ADD edi,MB6
STD
REP CMPS word ptr [edi],word ptr [esi]
CLD
endif
JB short COMless
JA short COMgreater
pub COMequal
MOV [SWcc],CCequal
JMP short COMexit
if fastSP
DifferentTypes:
TEST BL,Single
JNZ CoerceSI
MOV word ptr MB0[edi],0
MOV word ptr MB2[edi],0
MOV byte ptr MB4[edi],0
MOV ecx,8 ; Compare 8 bytes of mantissa
JMP DoCompare
CoerceSI:
MOV word ptr MB0[esi],0
MOV word ptr MB2[esi],0
MOV byte ptr MB4[esi],0
BothDouble:
MOV ecx,8 ; Compare 8 bytes of mantissa
JMP DoCompare
endif
pub COMless
MOV [SWcc],CCless
JMP short COMexit
pub COMgreater
MOV [SWcc],CCgreater
JMP short COMexit
pub COMincomprable
OR [CURerr],Invalid
pub COMincompr0
MOV [SWcc],CCincomprable
JMP short COMexit
pub COMsignSIinf ; if projective inf numbers are incomprable
TEST [CWcntl],InfinityControl
JZ COMincompr0
pub COMsignSI ; sign of SI tells all (DI = 0)
AND AL,Sign
JS COMless
JMP COMgreater
pub COMsignDIinf ; if projective inf numbers are incomprable
TEST [CWcntl],InfinityControl
JZ COMincompr0
pub COMsignDI ; sign of DI tells all (SI = 0)
AND AH,Sign
JS COMgreater
JMP COMless
pub COMinfinf
TEST [CWcntl],InfinityControl
JZ COMincompr0
XOR AH,AL ; Are signs the same?
AND AH,Sign
JZ COMequal ; yes - infinities are equal
JMP COMsignSI ; else SI negative implies it is less
pub COMexit
OR DX,DX ; do we need to pop the stack?
JZ short COMreturn
POPST
pub COMreturn
RET
pub eFXAM
MOV esi,[CURstk]
mov al, 41h ; see if stack was empty
cmp esi,[BASstk]
je RetFXAM
MOV AX,Flag[esi] ; Sign in AH, Tag in AL
XCHG AL,AH
ROL AX,1
AND AL,7 ; Mask to Tag-Sign
MOV ebx,offset XAMTAB
XLAT byte ptr cs:[ebx] ; Convert to condition code
pub RetFXAM
MOV [SWcc],AL ; Stuff into hi-byte of status word
RET
pub eFTST
MOV esi,[CURstk]
MOV AL,Flag[esi]
AND AL,Sign ; Mask to sign only
XOR ebx,ebx
MOV edx,ebx ; DX 0 to indicate no POP in COMP
MOV BL,Tag[esi]
ifdef i386
jmp TSTtab[4*ebx]
else
SHL ebx,1
JMP TSTtab[ebx]
endif
ProfEnd FCOM