From 8dc154ce240e635d36ffb7174b5e10c41fec2f0e Mon Sep 17 00:00:00 2001 From: Jonas Maebe Date: Wed, 18 Aug 1999 13:25:54 +0000 Subject: [PATCH] * minor fixes regarding the reading of operands --- compiler/daopt386.pas | 90 +++++++++++++++++++++++++------------------ 1 file changed, 53 insertions(+), 37 deletions(-) diff --git a/compiler/daopt386.pas b/compiler/daopt386.pas index c4dc41676d..64eda1decf 100644 --- a/compiler/daopt386.pas +++ b/compiler/daopt386.pas @@ -243,11 +243,14 @@ Uses Const AsmInstr: Array[tasmop] Of TAsmInstrucProp = ( {A_} (Ch: (C_All, C_None, C_None)), { new } {A_LOCK} (Ch: (C_None, C_None, C_None)), - {A_REP} (Ch: (C_RWECX, C_RFlags, C_None)), - {A_REPE} (Ch: (C_RWECX, C_RFlags, C_None)), - {A_REPNE} (Ch: (C_RWECX, C_RFlags, C_None)), - {A_REPNZ} (Ch: (C_WECX, C_RWFLAGS, C_None)), { new } - {A_REPZ} (Ch: (C_WECX, C_RWFLAGS, C_None)), { new } + { the repCC instructions don't write to the flags themselves, but since } + { they loop as long as CC is not fulfilled, it's possible that after the } + { repCC instructions the flags have changed } + {A_REP} (Ch: (C_RWECX, C_RWFlags, C_None)), + {A_REPE} (Ch: (C_RWECX, C_RWFlags, C_None)), + {A_REPNE} (Ch: (C_RWECX, C_RWFlags, C_None)), + {A_REPNZ} (Ch: (C_RWECX, C_RWFLAGS, C_None)), { new } + {A_REPZ} (Ch: (C_RWECX, C_RWFLAGS, C_None)), { new } {A_SEGCS} (Ch: (C_None, C_None, C_None)), { new } {A_SEGES} (Ch: (C_None, C_None, C_None)), { new } {A_SEGDS} (Ch: (C_None, C_None, C_None)), { new } @@ -291,10 +294,10 @@ Const AsmInstr: Array[tasmop] Of TAsmInstrucProp = ( {A_DAA} (Ch: (C_MEAX, C_None, C_None)), {A_DAS} (Ch: (C_MEAX, C_None, C_None)), {A_DEC} (Ch: (C_Mop1, C_WFlags, C_None)), - {A_DIV} (Ch: (C_RWEAX, C_WEDX, C_WFlags)), + {A_DIV} (Ch: (C_RWEAX, C_WEDX, C_WFlags)), {handled separately, because modifies more than three things} {A_EMMS} (Ch: (C_FPU, C_None, C_None)), { new } {A_ENTER} (Ch: (C_RWESP, C_None, C_None)), - {A_EQU} (Ch: (C_None, C_None, C_None)), { new } + {A_EQU} (Ch: (C_ALL, C_None, C_None)), { new } {A_F2XM1} (Ch: (C_FPU, C_None, C_None)), {A_FABS} (Ch: (C_FPU, C_None, C_None)), {A_FADD} (Ch: (C_FPU, C_None, C_None)), @@ -349,8 +352,8 @@ Const AsmInstr: Array[tasmop] Of TAsmInstrucProp = ( {A_FLDLN2} (Ch: (C_FPU, C_None, C_None)), {A_FLDPI} (Ch: (C_FPU, C_None, C_None)), {A_FLDZ} (Ch: (C_FPU, C_None, C_None)), - {A_FMUL} (Ch: (C_FPU, C_None, C_None)), - {A_FMULP} (Ch: (C_FPU, C_None, C_None)), + {A_FMUL} (Ch: (C_ROp1, C_FPU, C_None)), + {A_FMULP} (Ch: (C_ROp1, C_FPU, C_None)), {A_FNCLEX} (Ch: (C_FPU, C_None, C_None)), {A_FNDISI} (Ch: (C_FPU, C_None, C_None)), {A_FNENI} (Ch: (C_FPU, C_None, C_None)), @@ -377,10 +380,10 @@ Const AsmInstr: Array[tasmop] Of TAsmInstrucProp = ( {A_FSTENV} (Ch: (C_Wop1, C_None, C_None)), {A_FSTP} (Ch: (C_Wop1, C_FPU, C_None)), {A_FSTSW} (Ch: (C_Wop1, C_None, C_None)), - {A_FSUB} (Ch: (C_FPU, C_None, C_None)), - {A_FSUBP} (Ch: (C_FPU, C_None, C_None)), - {A_FSUBR} (Ch: (C_FPU, C_None, C_None)), - {A_FSUBRP} (Ch: (C_FPU, C_None, C_None)), + {A_FSUB} (Ch: (C_ROp1, C_FPU, C_None)), + {A_FSUBP} (Ch: (C_ROp1, C_FPU, C_None)), + {A_FSUBR} (Ch: (C_ROp1, C_FPU, C_None)), + {A_FSUBRP} (Ch: (C_ROp1, C_FPU, C_None)), {A_FTST} (Ch: (C_FPU, C_None, C_None)), {A_FUCOM} (Ch: (C_None, C_None, C_None)), {changes fpu status word} {A_FUCOMI} (Ch: (C_WFLAGS, C_None, C_None)), { new } @@ -396,13 +399,13 @@ Const AsmInstr: Array[tasmop] Of TAsmInstrucProp = ( {A_HLT} (Ch: (C_None, C_None, C_None)), {A_IBTS} (Ch: (C_All, C_None, C_None)), { new } {A_ICEBP} (Ch: (C_All, C_None, C_None)), { new } - {A_IDIV} (Ch: (C_RWEAX, C_WEDX, C_WFlags)), + {A_IDIV} (Ch: (C_RWEAX, C_WEDX, C_WFlags)), {handled separately, because modifies more than three things} {A_IMUL} (Ch: (C_RWEAX, C_WEDX, C_WFlags)), {handled separately, because several forms exist} {A_IN} (Ch: (C_Wop2, C_Rop1, C_None)), {A_INC} (Ch: (C_Mop1, C_WFlags, C_None)), - {A_INSB} (Ch: (C_WMemEDI, C_RWEDI, C_None)), { new } - {A_INSD} (Ch: (C_WMemEDI, C_RWEDI, C_None)), { new } - {A_INSW} (Ch: (C_WMemEDI, C_RWEDI, C_None)), { new } + {A_INSB} (Ch: (C_WMemEDI, C_RWEDI, C_REDX)), { new } + {A_INSD} (Ch: (C_WMemEDI, C_RWEDI, C_REDX)), { new } + {A_INSW} (Ch: (C_WMemEDI, C_RWEDI, C_REDX)), { new } {A_INT} (Ch: (C_All, C_None, C_None)), {don't know value of any register} {A_INT01} (Ch: (C_All, C_None, C_None)), { new } {A_INT1} (Ch: (C_All, C_None, C_None)), { new } @@ -450,7 +453,7 @@ Const AsmInstr: Array[tasmop] Of TAsmInstrucProp = ( {A_MOVSW} (Ch: (C_All, C_None, C_None)), { new } {A_MOVSX} (Ch: (C_Wop2, C_Rop1, C_None)), {A_MOVZX} (Ch: (C_Wop2, C_Rop1, C_None)), - {A_MUL} (Ch: (C_RWEAX, C_WEDX, C_WFlags)), + {A_MUL} (Ch: (C_RWEAX, C_WEDX, C_WFlags)), {handled separately, because modifies more than three things} {A_NEG} (Ch: (C_Mop1, C_None, C_None)), {A_NOP} (Ch: (C_None, C_None, C_None)), {A_NOT} (Ch: (C_Mop1, C_WFlags, C_None)), @@ -2113,30 +2116,40 @@ Begin End; End; End; + End; + End; + A_DIV, A_IDIV, A_MUL: + Begin + ReadOp(Curprop, Pai386(p)^.oper[0]); + ReadReg(CurProp,R_EAX); + If (Pai386(p)^.OpCode = A_IDIV) or + (Pai386(p)^.OpCode = A_DIV) Then + ReadReg(CurProp,R_EDX); + DestroyReg(CurProp, R_EAX) End; - End; A_IMUL: Begin - ReadOp(CurProp, Pai386(p)^.oper[0]); - ReadOp(CurProp, Pai386(p)^.oper[1]); + ReadOp(CurProp,Pai386(p)^.oper[0]); + ReadOp(CurProp,Pai386(p)^.oper[1]); If (Pai386(p)^.oper[2].typ = top_none) Then - If (Pai386(p)^.oper[1].typ = top_none) Then - Begin - DestroyReg(CurProp, R_EAX); - DestroyReg(CurProp, R_EDX) - End - Else -{$ifdef arithopt} - AddInstr2OpContents(Pai386(p), Pai386(p)^.oper[1]) -{$else arithopt} - DestroyOp(p, Pai386(p)^.oper[1]) -{$endif arithopt} + If (Pai386(p)^.oper[1].typ = top_none) Then + Begin + ReadReg(CurProp,R_EAX); + DestroyReg(CurProp, R_EAX); + DestroyReg(CurProp, R_EDX) + End + Else + {$ifdef arithopt} + AddOp2RegContents(Pai386(p), Pai386(p)^.oper[1]) + {$else arithopt} + DestroyOp(p, Pai386(p)^.oper[1]) + {$endif arithopt} Else -{$ifdef arithopt} - AddInstr2OpContents(Pai386(p), Pai386(p)^.oper[2]); -{$else arithopt} + {$ifdef arithopt} + AddOp2RegContents(Pai386(p), Pai386(p)^.oper[2]); + {$else arithopt} DestroyOp(p, Pai386(p)^.oper[2]); -{$endif arithopt} + {$endif arithopt} End; A_XOR: Begin @@ -2337,7 +2350,10 @@ End. { $Log$ - Revision 1.55 1999-08-12 14:36:03 peter + Revision 1.56 1999-08-18 13:25:54 jonas + * minor fixes regarding the reading of operands + + Revision 1.55 1999/08/12 14:36:03 peter + KNI instructions Revision 1.54 1999/08/05 15:01:52 jonas