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.3 KiB
198 lines
4.3 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
|
|
|