Browse Source

* minor fixes regarding the reading of operands

Jonas Maebe 26 years ago
parent
commit
8dc154ce24
1 changed files with 53 additions and 37 deletions
  1. 53 37
      compiler/daopt386.pas

+ 53 - 37
compiler/daopt386.pas

@@ -243,11 +243,14 @@ Uses
 Const AsmInstr: Array[tasmop] Of TAsmInstrucProp = (
   {A_<NONE>} (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