Browse Source

* emit_??? used

pierre 26 years ago
parent
commit
63608b6dbb
8 changed files with 848 additions and 812 deletions
  1. 144 143
      compiler/cg386add.pas
  2. 111 81
      compiler/cg386cal.pas
  3. 153 162
      compiler/cg386cnv.pas
  4. 75 72
      compiler/cg386inl.pas
  5. 88 87
      compiler/cg386ld.pas
  6. 127 124
      compiler/cg386mat.pas
  7. 49 46
      compiler/cg386mem.pas
  8. 101 97
      compiler/cg386set.pas

+ 144 - 143
compiler/cg386add.pas

@@ -199,13 +199,13 @@ implementation
                           LOC_REFERENCE,LOC_MEM:
                           LOC_REFERENCE,LOC_MEM:
                             emit_push_mem(p^.right^.location.reference);
                             emit_push_mem(p^.right^.location.reference);
                           LOC_REGISTER,LOC_CREGISTER:
                           LOC_REGISTER,LOC_CREGISTER:
-                            exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,p^.right^.location.register)));
+                            emit_reg(A_PUSH,S_L,p^.right^.location.register);
                         end;
                         end;
                         case p^.left^.location.loc of
                         case p^.left^.location.loc of
                           LOC_REFERENCE,LOC_MEM:
                           LOC_REFERENCE,LOC_MEM:
                             emit_push_mem(p^.left^.location.reference);
                             emit_push_mem(p^.left^.location.reference);
                           LOC_REGISTER,LOC_CREGISTER:
                           LOC_REGISTER,LOC_CREGISTER:
-                            exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,p^.left^.location.register)));
+                            emit_reg(A_PUSH,S_L,p^.left^.location.register);
                         end;
                         end;
                         emitcall('FPC_ANSISTR_COMPARE');
                         emitcall('FPC_ANSISTR_COMPARE');
                         emit_reg_reg(A_OR,S_L,R_EAX,R_EAX);
                         emit_reg_reg(A_OR,S_L,R_EAX,R_EAX);
@@ -288,11 +288,11 @@ implementation
                              { else pass 1 would have evaluted   }
                              { else pass 1 would have evaluted   }
                              { this node                         }
                              { this node                         }
                              if p^.left^.treetype=stringconstn then
                              if p^.left^.treetype=stringconstn then
-                               exprasmlist^.concat(new(pai386,op_const_ref(
-                                 A_CMP,S_B,0,newreference(p^.right^.location.reference))))
+                               emit_const_ref(
+                                 A_CMP,S_B,0,newreference(p^.right^.location.reference))
                              else
                              else
-                               exprasmlist^.concat(new(pai386,op_const_ref(
-                                 A_CMP,S_B,0,newreference(p^.left^.location.reference))));
+                               emit_const_ref(
+                                 A_CMP,S_B,0,newreference(p^.left^.location.reference));
                              del_reference(p^.right^.location.reference);
                              del_reference(p^.right^.location.reference);
                              del_reference(p^.left^.location.reference);
                              del_reference(p^.left^.location.reference);
                           end
                           end
@@ -729,14 +729,13 @@ implementation
                                p^.left^.location.register:=hregister;
                                p^.left^.location.register:=hregister;
                                emitlab(truelabel);
                                emitlab(truelabel);
                                truelabel:=otl;
                                truelabel:=otl;
-                               exprasmlist^.concat(new(pai386,op_const_reg(A_MOV,opsize,1,
-                                 hregister)));
+                               emit_const_reg(A_MOV,opsize,1,hregister);
                                getlabel(hl);
                                getlabel(hl);
                                emitjmp(C_None,hl);
                                emitjmp(C_None,hl);
                                emitlab(falselabel);
                                emitlab(falselabel);
                                falselabel:=ofl;
                                falselabel:=ofl;
-                               exprasmlist^.concat(new(pai386,op_reg_reg(A_XOR,S_L,makereg32(hregister),
-                                 makereg32(hregister))));
+                               emit_reg_reg(A_XOR,S_L,makereg32(hregister),
+                                 makereg32(hregister));
                                emitlab(hl);
                                emitlab(hl);
                             end;
                             end;
                        end;
                        end;
@@ -765,14 +764,13 @@ implementation
                                p^.right^.location.register:=hregister;
                                p^.right^.location.register:=hregister;
                                emitlab(truelabel);
                                emitlab(truelabel);
                                truelabel:=otl;
                                truelabel:=otl;
-                               exprasmlist^.concat(new(pai386,op_const_reg(A_MOV,opsize,1,
-                                 hregister)));
+                               emit_const_reg(A_MOV,opsize,1,hregister);
                                getlabel(hl);
                                getlabel(hl);
                                emitjmp(C_None,hl);
                                emitjmp(C_None,hl);
                                emitlab(falselabel);
                                emitlab(falselabel);
                                falselabel:=ofl;
                                falselabel:=ofl;
-                               exprasmlist^.concat(new(pai386,op_reg_reg(A_XOR,S_L,makereg32(hregister),
-                                 makereg32(hregister))));
+                               emit_reg_reg(A_XOR,S_L,makereg32(hregister),
+                                 makereg32(hregister));
                                emitlab(hl);
                                emitlab(hl);
                             end;
                             end;
                        end;
                        end;
@@ -870,8 +868,8 @@ implementation
                                         del_location(p^.left^.location);
                                         del_location(p^.left^.location);
 {!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!}
 {!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!}
                                         hregister:=getregister32;
                                         hregister:=getregister32;
-                                        exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,opsize,
-                                          newreference(p^.left^.location.reference),hregister)));
+                                        emit_ref_reg(A_MOV,opsize,
+                                          newreference(p^.left^.location.reference),hregister);
                                         clear_location(p^.left^.location);
                                         clear_location(p^.left^.location);
                                         p^.left^.location.loc:=LOC_REGISTER;
                                         p^.left^.location.loc:=LOC_REGISTER;
                                         p^.left^.location.register:=hregister;
                                         p^.left^.location.register:=hregister;
@@ -882,8 +880,8 @@ implementation
                                         ungetiftemp(p^.right^.location.reference);
                                         ungetiftemp(p^.right^.location.reference);
                                         del_location(p^.right^.location);
                                         del_location(p^.right^.location);
                                         hregister:=getregister32;
                                         hregister:=getregister32;
-                                        exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,opsize,
-                                          newreference(p^.right^.location.reference),hregister)));
+                                        emit_ref_reg(A_MOV,opsize,
+                                          newreference(p^.right^.location.reference),hregister);
                                         clear_location(p^.right^.location);
                                         clear_location(p^.right^.location);
                                         p^.right^.location.loc:=LOC_REGISTER;
                                         p^.right^.location.loc:=LOC_REGISTER;
                                         p^.right^.location.register:=hregister;
                                         p^.right^.location.register:=hregister;
@@ -963,8 +961,8 @@ implementation
                                          ungetiftemp(p^.left^.location.reference);
                                          ungetiftemp(p^.left^.location.reference);
                                          del_reference(p^.left^.location.reference);
                                          del_reference(p^.left^.location.reference);
                                          hregister:=getregister32;
                                          hregister:=getregister32;
-                                         exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,opsize,
-                                         newreference(p^.left^.location.reference),hregister)));
+                                         emit_ref_reg(A_MOV,opsize,
+                                           newreference(p^.left^.location.reference),hregister);
                                          clear_location(p^.left^.location);
                                          clear_location(p^.left^.location);
                                          p^.left^.location.loc:=LOC_REGISTER;
                                          p^.left^.location.loc:=LOC_REGISTER;
                                          p^.left^.location.register:=hregister;
                                          p^.left^.location.register:=hregister;
@@ -976,8 +974,8 @@ implementation
                                           its value is going to be modified}
                                           its value is going to be modified}
                                           begin
                                           begin
                                             hregister := getregister32;
                                             hregister := getregister32;
-                                            exprasmlist^.concat(new(pai386,op_reg_reg(A_MOV,opsize,
-                                              p^.left^.location.register,hregister)));
+                                            emit_reg_reg(A_MOV,opsize,
+                                              p^.left^.location.register,hregister);
                                              clear_location(p^.left^.location);
                                              clear_location(p^.left^.location);
                                              p^.left^.location.loc:=LOC_REGISTER;
                                              p^.left^.location.loc:=LOC_REGISTER;
                                              p^.left^.location.register:=hregister;
                                              p^.left^.location.register:=hregister;
@@ -985,11 +983,11 @@ implementation
                                            end;
                                            end;
                                      {here, p^.left^.location should be LOC_REGISTER}
                                      {here, p^.left^.location should be LOC_REGISTER}
                                       If p^.right^.location.loc in [LOC_MEM,LOC_REFERENCE] Then
                                       If p^.right^.location.loc in [LOC_MEM,LOC_REFERENCE] Then
-                                         exprasmlist^.concat(new(pai386,op_ref_reg(A_AND,opsize,
-                                           newreference(p^.right^.location.reference),p^.left^.location.register)))
+                                         emit_ref_reg(A_AND,opsize,
+                                           newreference(p^.right^.location.reference),p^.left^.location.register)
                                       Else
                                       Else
-                                        exprasmlist^.concat(new(pai386,op_reg_reg(A_AND,opsize,
-                                          p^.right^.location.register,p^.left^.location.register)));
+                                        emit_reg_reg(A_AND,opsize,
+                                          p^.right^.location.register,p^.left^.location.register);
                 {warning: ugly hack ahead: we need a "jne" after the cmp, so
                 {warning: ugly hack ahead: we need a "jne" after the cmp, so
                  change the treetype from lten/gten to equaln}
                  change the treetype from lten/gten to equaln}
                                       p^.treetype := equaln
                                       p^.treetype := equaln
@@ -1027,30 +1025,30 @@ implementation
                           not(cs_check_overflow in aktlocalswitches) then
                           not(cs_check_overflow in aktlocalswitches) then
                          Begin
                          Begin
                            emitloadord2reg(p^.right^.location,u32bitdef,p^.location.register,true);
                            emitloadord2reg(p^.right^.location,u32bitdef,p^.location.register,true);
-                           exprasmlist^.concat(new(pai386,op_const_reg(A_SHL,S_L,power,p^.location.register)))
+                           emit_const_reg(A_SHL,S_L,power,p^.location.register)
                          End
                          End
                        Else
                        Else
                         Begin
                         Begin
 {$EndIf NoShlMul}
 {$EndIf NoShlMul}
                          if not(R_EAX in unused) and (p^.location.register<>R_EAX) then
                          if not(R_EAX in unused) and (p^.location.register<>R_EAX) then
                           begin
                           begin
-                           exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,R_EAX)));
+                           emit_reg(A_PUSH,S_L,R_EAX);
                            popeax:=true;
                            popeax:=true;
                           end;
                           end;
                          if not(R_EDX in unused) and (p^.location.register<>R_EDX)  then
                          if not(R_EDX in unused) and (p^.location.register<>R_EDX)  then
                           begin
                           begin
-                           exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,R_EDX)));
+                           emit_reg(A_PUSH,S_L,R_EDX);
                            popedx:=true;
                            popedx:=true;
                           end;
                           end;
                          { p^.left^.location can be R_EAX !!! }
                          { p^.left^.location can be R_EAX !!! }
                          emitloadord2reg(p^.left^.location,u32bitdef,R_EDI,true);
                          emitloadord2reg(p^.left^.location,u32bitdef,R_EDI,true);
                          emitloadord2reg(p^.right^.location,u32bitdef,R_EAX,true);
                          emitloadord2reg(p^.right^.location,u32bitdef,R_EAX,true);
-                         exprasmlist^.concat(new(pai386,op_reg(A_MUL,S_L,R_EDI)));
+                         emit_reg(A_MUL,S_L,R_EDI);
                          emit_reg_reg(A_MOV,S_L,R_EAX,p^.location.register);
                          emit_reg_reg(A_MOV,S_L,R_EAX,p^.location.register);
                          if popedx then
                          if popedx then
-                          exprasmlist^.concat(new(pai386,op_reg(A_POP,S_L,R_EDX)));
+                          emit_reg(A_POP,S_L,R_EDX);
                          if popeax then
                          if popeax then
-                          exprasmlist^.concat(new(pai386,op_reg(A_POP,S_L,R_EAX)));
+                          emit_reg(A_POP,S_L,R_EAX);
 {$IfNDef NoShlMul}
 {$IfNDef NoShlMul}
                         End;
                         End;
 {$endif NoShlMul}
 {$endif NoShlMul}
@@ -1102,8 +1100,8 @@ implementation
                              if is_in_dest then
                              if is_in_dest then
                                begin
                                begin
                                   hregister:=p^.location.register;
                                   hregister:=p^.location.register;
-                                  exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,opsize,
-                                  newreference(p^.left^.location.reference),hregister)));
+                                  emit_ref_reg(A_MOV,opsize,
+                                    newreference(p^.left^.location.reference),hregister);
                                end
                                end
                              else
                              else
                                begin
                                begin
@@ -1113,8 +1111,8 @@ implementation
                                      S_W : hregister:=reg32toreg16(getregister32);
                                      S_W : hregister:=reg32toreg16(getregister32);
                                      S_B : hregister:=reg32toreg8(getregister32);
                                      S_B : hregister:=reg32toreg8(getregister32);
                                   end;
                                   end;
-                                  exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,opsize,
-                                    newreference(p^.left^.location.reference),hregister)));
+                                  emit_ref_reg(A_MOV,opsize,
+                                    newreference(p^.left^.location.reference),hregister);
                                end;
                                end;
                           end;
                           end;
                         clear_location(p^.location);
                         clear_location(p^.location);
@@ -1141,7 +1139,7 @@ implementation
                              if p^.right^.location.loc=LOC_CREGISTER then
                              if p^.right^.location.loc=LOC_CREGISTER then
                                begin
                                begin
                                   if extra_not then
                                   if extra_not then
-                                    exprasmlist^.concat(new(pai386,op_reg(A_NOT,opsize,p^.location.register)));
+                                    emit_reg(A_NOT,opsize,p^.location.register);
 
 
                                   emit_reg_reg(A_MOV,opsize,p^.right^.location.register,R_EDI);
                                   emit_reg_reg(A_MOV,opsize,p^.right^.location.register,R_EDI);
                                   emit_reg_reg(op,opsize,p^.location.register,R_EDI);
                                   emit_reg_reg(op,opsize,p^.location.register,R_EDI);
@@ -1150,12 +1148,12 @@ implementation
                              else
                              else
                                begin
                                begin
                                   if extra_not then
                                   if extra_not then
-                                    exprasmlist^.concat(new(pai386,op_reg(A_NOT,opsize,p^.location.register)));
+                                    emit_reg(A_NOT,opsize,p^.location.register);
 
 
-                                  exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,opsize,
-                                    newreference(p^.right^.location.reference),R_EDI)));
-                                  exprasmlist^.concat(new(pai386,op_reg_reg(op,opsize,p^.location.register,R_EDI)));
-                                  exprasmlist^.concat(new(pai386,op_reg_reg(A_MOV,opsize,R_EDI,p^.location.register)));
+                                  emit_ref_reg(A_MOV,opsize,
+                                    newreference(p^.right^.location.reference),R_EDI);
+                                  emit_reg_reg(op,opsize,p^.location.register,R_EDI);
+                                  emit_reg_reg(A_MOV,opsize,R_EDI,p^.location.register);
                                   ungetiftemp(p^.right^.location.reference);
                                   ungetiftemp(p^.right^.location.reference);
                                   del_reference(p^.right^.location.reference);
                                   del_reference(p^.right^.location.reference);
                                end;
                                end;
@@ -1166,32 +1164,32 @@ implementation
                                 (op=A_CMP) and
                                 (op=A_CMP) and
                                 (p^.right^.value=0) then
                                 (p^.right^.value=0) then
                                begin
                                begin
-                                  exprasmlist^.concat(new(pai386,op_reg_reg(A_TEST,opsize,p^.location.register,
-                                    p^.location.register)));
+                                  emit_reg_reg(A_TEST,opsize,p^.location.register,
+                                    p^.location.register);
                                end
                                end
                              else if (p^.right^.treetype=ordconstn) and
                              else if (p^.right^.treetype=ordconstn) and
                                 (op=A_ADD) and
                                 (op=A_ADD) and
                                 (p^.right^.value=1) and
                                 (p^.right^.value=1) and
                                 not(cs_check_overflow in aktlocalswitches) then
                                 not(cs_check_overflow in aktlocalswitches) then
                                begin
                                begin
-                                  exprasmlist^.concat(new(pai386,op_reg(A_INC,opsize,
-                                    p^.location.register)));
+                                  emit_reg(A_INC,opsize,
+                                    p^.location.register);
                                end
                                end
                              else if (p^.right^.treetype=ordconstn) and
                              else if (p^.right^.treetype=ordconstn) and
                                 (op=A_SUB) and
                                 (op=A_SUB) and
                                 (p^.right^.value=1) and
                                 (p^.right^.value=1) and
                                 not(cs_check_overflow in aktlocalswitches) then
                                 not(cs_check_overflow in aktlocalswitches) then
                                begin
                                begin
-                                  exprasmlist^.concat(new(pai386,op_reg(A_DEC,opsize,
-                                    p^.location.register)));
+                                  emit_reg(A_DEC,opsize,
+                                    p^.location.register);
                                end
                                end
                              else if (p^.right^.treetype=ordconstn) and
                              else if (p^.right^.treetype=ordconstn) and
                                 (op=A_IMUL) and
                                 (op=A_IMUL) and
                                 (ispowerof2(p^.right^.value,power)) and
                                 (ispowerof2(p^.right^.value,power)) and
                                 not(cs_check_overflow in aktlocalswitches) then
                                 not(cs_check_overflow in aktlocalswitches) then
                                begin
                                begin
-                                  exprasmlist^.concat(new(pai386,op_const_reg(A_SHL,opsize,power,
-                                    p^.location.register)));
+                                  emit_const_reg(A_SHL,opsize,power,
+                                    p^.location.register);
                                end
                                end
                              else
                              else
                                begin
                                begin
@@ -1200,7 +1198,7 @@ implementation
                                        if extra_not then
                                        if extra_not then
                                          begin
                                          begin
                                             emit_reg_reg(A_MOV,S_L,p^.right^.location.register,R_EDI);
                                             emit_reg_reg(A_MOV,S_L,p^.right^.location.register,R_EDI);
-                                            exprasmlist^.concat(new(pai386,op_reg(A_NOT,S_L,R_EDI)));
+                                            emit_reg(A_NOT,S_L,R_EDI);
                                             emit_reg_reg(A_AND,S_L,R_EDI,
                                             emit_reg_reg(A_AND,S_L,R_EDI,
                                               p^.location.register);
                                               p^.location.register);
                                          end
                                          end
@@ -1214,16 +1212,16 @@ implementation
                                     begin
                                     begin
                                        if extra_not then
                                        if extra_not then
                                          begin
                                          begin
-                                            exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,newreference(
-                                              p^.right^.location.reference),R_EDI)));
-                                            exprasmlist^.concat(new(pai386,op_reg(A_NOT,S_L,R_EDI)));
+                                            emit_ref_reg(A_MOV,S_L,newreference(
+                                              p^.right^.location.reference),R_EDI);
+                                            emit_reg(A_NOT,S_L,R_EDI);
                                             emit_reg_reg(A_AND,S_L,R_EDI,
                                             emit_reg_reg(A_AND,S_L,R_EDI,
                                               p^.location.register);
                                               p^.location.register);
                                          end
                                          end
                                        else
                                        else
                                          begin
                                          begin
-                                            exprasmlist^.concat(new(pai386,op_ref_reg(op,opsize,newreference(
-                                              p^.right^.location.reference),p^.location.register)));
+                                            emit_ref_reg(op,opsize,newreference(
+                                              p^.right^.location.reference),p^.location.register);
                                          end;
                                          end;
                                        ungetiftemp(p^.right^.location.reference);
                                        ungetiftemp(p^.right^.location.reference);
                                        del_reference(p^.right^.location.reference);
                                        del_reference(p^.right^.location.reference);
@@ -1237,10 +1235,10 @@ implementation
                         if (p^.treetype=subn) and p^.swaped then
                         if (p^.treetype=subn) and p^.swaped then
                           begin
                           begin
                              if extra_not then
                              if extra_not then
-                               exprasmlist^.concat(new(pai386,op_reg(A_NOT,S_L,p^.location.register)));
+                               emit_reg(A_NOT,S_L,p^.location.register);
 
 
-                             exprasmlist^.concat(new(pai386,op_reg_reg(op,opsize,
-                               p^.location.register,p^.right^.location.register)));
+                             emit_reg_reg(op,opsize,
+                               p^.location.register,p^.right^.location.register);
                                swap_location(p^.location,p^.right^.location);
                                swap_location(p^.location,p^.right^.location);
                                { newly swapped also set swapped flag }
                                { newly swapped also set swapped flag }
                                { just to maintain ordering         }
                                { just to maintain ordering         }
@@ -1249,10 +1247,10 @@ implementation
                         else
                         else
                           begin
                           begin
                              if extra_not then
                              if extra_not then
-                               exprasmlist^.concat(new(pai386,op_reg(A_NOT,S_L,p^.right^.location.register)));
-                             exprasmlist^.concat(new(pai386,op_reg_reg(op,opsize,
+                               emit_reg(A_NOT,S_L,p^.right^.location.register);
+                             emit_reg_reg(op,opsize,
                                p^.right^.location.register,
                                p^.right^.location.register,
-                               p^.location.register)));
+                               p^.location.register);
                           end;
                           end;
                         case opsize of
                         case opsize of
                            S_L : ungetregister32(p^.right^.location.register);
                            S_L : ungetregister32(p^.right^.location.register);
@@ -1323,8 +1321,8 @@ implementation
 
 
                              { first give free then demand new register }
                              { first give free then demand new register }
                              hregister:=reg32toreg8(getregister32);
                              hregister:=reg32toreg8(getregister32);
-                             exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_B,newreference(p^.location.reference),
-                               hregister)));
+                             emit_ref_reg(A_MOV,S_B,newreference(p^.location.reference),
+                               hregister);
                           end;
                           end;
                         clear_location(p^.location);
                         clear_location(p^.location);
                         p^.location.loc:=LOC_REGISTER;
                         p^.location.loc:=LOC_REGISTER;
@@ -1350,8 +1348,8 @@ implementation
                           end
                           end
                         else
                         else
                           begin
                           begin
-                             exprasmlist^.concat(new(pai386,op_ref_reg(A_CMP,S_B,newreference(
-                                p^.right^.location.reference),p^.location.register)));
+                             emit_ref_reg(A_CMP,S_B,newreference(
+                                p^.right^.location.reference),p^.location.register);
                              del_reference(p^.right^.location.reference);
                              del_reference(p^.right^.location.reference);
                           end;
                           end;
                      end
                      end
@@ -1398,8 +1396,8 @@ implementation
 
 
                              { first give free then demand new register }
                              { first give free then demand new register }
                              hregister:=reg32toreg16(getregister32);
                              hregister:=reg32toreg16(getregister32);
-                             exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_W,newreference(p^.location.reference),
-                               hregister)));
+                             emit_ref_reg(A_MOV,S_W,newreference(p^.location.reference),
+                               hregister);
                           end;
                           end;
                         clear_location(p^.location);
                         clear_location(p^.location);
                         p^.location.loc:=LOC_REGISTER;
                         p^.location.loc:=LOC_REGISTER;
@@ -1425,8 +1423,8 @@ implementation
                           end
                           end
                         else
                         else
                           begin
                           begin
-                             exprasmlist^.concat(new(pai386,op_ref_reg(A_CMP,S_W,newreference(
-                                p^.right^.location.reference),p^.location.register)));
+                             emit_ref_reg(A_CMP,S_W,newreference(
+                                p^.right^.location.reference),p^.location.register);
                              del_reference(p^.right^.location.reference);
                              del_reference(p^.right^.location.reference);
                           end;
                           end;
                      end
                      end
@@ -1569,23 +1567,23 @@ implementation
                                     begin
                                     begin
                                        hregister:=p^.location.registerlow;
                                        hregister:=p^.location.registerlow;
                                        hregister2:=p^.location.registerhigh;
                                        hregister2:=p^.location.registerhigh;
-                                       exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
-                                         newreference(p^.left^.location.reference),hregister)));
+                                       emit_ref_reg(A_MOV,S_L,
+                                         newreference(p^.left^.location.reference),hregister);
                                        hr:=newreference(p^.left^.location.reference);
                                        hr:=newreference(p^.left^.location.reference);
                                        inc(hr^.offset,4);
                                        inc(hr^.offset,4);
-                                       exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
-                                         hr,hregister2)));
+                                       emit_ref_reg(A_MOV,S_L,
+                                         hr,hregister2);
                                     end
                                     end
                                   else
                                   else
                                     begin
                                     begin
                                        hregister:=getregister32;
                                        hregister:=getregister32;
                                        hregister2:=getregister32;
                                        hregister2:=getregister32;
-                                       exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
-                                         newreference(p^.left^.location.reference),hregister)));
+                                       emit_ref_reg(A_MOV,S_L,
+                                         newreference(p^.left^.location.reference),hregister);
                                        hr:=newreference(p^.left^.location.reference);
                                        hr:=newreference(p^.left^.location.reference);
                                        inc(hr^.offset,4);
                                        inc(hr^.offset,4);
-                                       exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
-                                         hr,hregister2)));
+                                       emit_ref_reg(A_MOV,S_L,
+                                         hr,hregister2);
                                     end;
                                     end;
                                end;
                                end;
                              clear_location(p^.location);
                              clear_location(p^.location);
@@ -1622,18 +1620,18 @@ implementation
                                     end
                                     end
                                   else
                                   else
                                     begin
                                     begin
-                                       exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,opsize,
-                                         newreference(p^.right^.location.reference),R_EDI)));
-                                       exprasmlist^.concat(new(pai386,op_reg_reg(op,opsize,p^.location.registerlow,R_EDI)));
-                                       exprasmlist^.concat(new(pai386,op_reg_reg(A_MOV,opsize,R_EDI,p^.location.registerlow)));
+                                       emit_ref_reg(A_MOV,opsize,
+                                         newreference(p^.right^.location.reference),R_EDI);
+                                       emit_reg_reg(op,opsize,p^.location.registerlow,R_EDI);
+                                       emit_reg_reg(A_MOV,opsize,R_EDI,p^.location.registerlow);
                                        hr:=newreference(p^.right^.location.reference);
                                        hr:=newreference(p^.right^.location.reference);
                                        inc(hr^.offset,4);
                                        inc(hr^.offset,4);
-                                       exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,opsize,
-                                         hr,R_EDI)));
+                                       emit_ref_reg(A_MOV,opsize,
+                                         hr,R_EDI);
                                        { here the carry flag is still preserved }
                                        { here the carry flag is still preserved }
-                                       exprasmlist^.concat(new(pai386,op_reg_reg(op2,opsize,p^.location.registerhigh,R_EDI)));
-                                       exprasmlist^.concat(new(pai386,op_reg_reg(A_MOV,opsize,R_EDI,
-                                         p^.location.registerhigh)));
+                                       emit_reg_reg(op2,opsize,p^.location.registerhigh,R_EDI);
+                                       emit_reg_reg(A_MOV,opsize,R_EDI,
+                                         p^.location.registerhigh);
                                        ungetiftemp(p^.right^.location.reference);
                                        ungetiftemp(p^.right^.location.reference);
                                        del_reference(p^.right^.location.reference);
                                        del_reference(p^.right^.location.reference);
                                     end;
                                     end;
@@ -1654,12 +1652,12 @@ implementation
                                        hr:=newreference(p^.right^.location.reference);
                                        hr:=newreference(p^.right^.location.reference);
                                        inc(hr^.offset,4);
                                        inc(hr^.offset,4);
 
 
-                                       exprasmlist^.concat(new(pai386,op_ref_reg(A_CMP,S_L,
-                                         hr,p^.location.registerhigh)));
+                                       emit_ref_reg(A_CMP,S_L,
+                                         hr,p^.location.registerhigh);
                                        firstjmp64bitcmp;
                                        firstjmp64bitcmp;
 
 
-                                       exprasmlist^.concat(new(pai386,op_ref_reg(A_CMP,S_L,newreference(
-                                         p^.right^.location.reference),p^.location.registerlow)));
+                                       emit_ref_reg(A_CMP,S_L,newreference(
+                                         p^.right^.location.reference),p^.location.registerlow);
                                        secondjmp64bitcmp;
                                        secondjmp64bitcmp;
 
 
                                        emitjmp(C_None,falselabel);
                                        emitjmp(C_None,falselabel);
@@ -1675,15 +1673,15 @@ implementation
                                      (op=A_CMP) and
                                      (op=A_CMP) and
                                      (p^.right^.value=0) then
                                      (p^.right^.value=0) then
                                     begin
                                     begin
-                                       exprasmlist^.concat(new(pai386,op_reg_reg(A_TEST,opsize,p^.location.register,
-                                         p^.location.register)));
+                                       emit_reg_reg(A_TEST,opsize,p^.location.register,
+                                         p^.location.register);
                                     end
                                     end
                                   else if (p^.right^.treetype=ordconstn) and
                                   else if (p^.right^.treetype=ordconstn) and
                                      (op=A_IMUL) and
                                      (op=A_IMUL) and
                                      (ispowerof2(p^.right^.value,power)) then
                                      (ispowerof2(p^.right^.value,power)) then
                                     begin
                                     begin
-                                       exprasmlist^.concat(new(pai386,op_const_reg(A_SHL,opsize,power,
-                                         p^.location.register)));
+                                       emit_const_reg(A_SHL,opsize,power,
+                                         p^.location.register);
                                     end
                                     end
                                   else
                                   else
                                   }
                                   }
@@ -1697,12 +1695,12 @@ implementation
                                          end
                                          end
                                        else
                                        else
                                          begin
                                          begin
-                                            exprasmlist^.concat(new(pai386,op_ref_reg(op,S_L,newreference(
-                                              p^.right^.location.reference),p^.location.registerlow)));
+                                            emit_ref_reg(op,S_L,newreference(
+                                              p^.right^.location.reference),p^.location.registerlow);
                                             hr:=newreference(p^.right^.location.reference);
                                             hr:=newreference(p^.right^.location.reference);
                                             inc(hr^.offset,4);
                                             inc(hr^.offset,4);
-                                            exprasmlist^.concat(new(pai386,op_ref_reg(op2,S_L,
-                                              hr,p^.location.registerhigh)));
+                                            emit_ref_reg(op2,S_L,
+                                              hr,p^.location.registerhigh);
                                             ungetiftemp(p^.right^.location.reference);
                                             ungetiftemp(p^.right^.location.reference);
                                             del_reference(p^.right^.location.reference);
                                             del_reference(p^.right^.location.reference);
                                          end;
                                          end;
@@ -1714,12 +1712,12 @@ implementation
                              { when swapped another result register }
                              { when swapped another result register }
                              if (p^.treetype=subn) and p^.swaped then
                              if (p^.treetype=subn) and p^.swaped then
                                begin
                                begin
-                                 exprasmlist^.concat(new(pai386,op_reg_reg(op,S_L,
+                                 emit_reg_reg(op,S_L,
                                     p^.location.registerlow,
                                     p^.location.registerlow,
-                                    p^.right^.location.registerlow)));
-                                 exprasmlist^.concat(new(pai386,op_reg_reg(op2,S_L,
+                                    p^.right^.location.registerlow);
+                                 emit_reg_reg(op2,S_L,
                                     p^.location.registerhigh,
                                     p^.location.registerhigh,
-                                    p^.right^.location.registerhigh)));
+                                    p^.right^.location.registerhigh);
                                   swap_location(p^.location,p^.right^.location);
                                   swap_location(p^.location,p^.right^.location);
                                   { newly swapped also set swapped flag }
                                   { newly swapped also set swapped flag }
                                   { just to maintain ordering           }
                                   { just to maintain ordering           }
@@ -1727,23 +1725,23 @@ implementation
                                end
                                end
                              else if cmpop then
                              else if cmpop then
                                begin
                                begin
-                                  exprasmlist^.concat(new(pai386,op_reg_reg(A_CMP,S_L,
+                                  emit_reg_reg(A_CMP,S_L,
                                     p^.right^.location.registerhigh,
                                     p^.right^.location.registerhigh,
-                                    p^.location.registerhigh)));
+                                    p^.location.registerhigh);
                                   firstjmp64bitcmp;
                                   firstjmp64bitcmp;
-                                  exprasmlist^.concat(new(pai386,op_reg_reg(A_CMP,S_L,
+                                  emit_reg_reg(A_CMP,S_L,
                                     p^.right^.location.registerlow,
                                     p^.right^.location.registerlow,
-                                    p^.location.registerlow)));
+                                    p^.location.registerlow);
                                   secondjmp64bitcmp;
                                   secondjmp64bitcmp;
                                end
                                end
                              else
                              else
                                begin
                                begin
-                                  exprasmlist^.concat(new(pai386,op_reg_reg(op,S_L,
+                                  emit_reg_reg(op,S_L,
                                     p^.right^.location.registerlow,
                                     p^.right^.location.registerlow,
-                                    p^.location.registerlow)));
-                                  exprasmlist^.concat(new(pai386,op_reg_reg(op2,S_L,
+                                    p^.location.registerlow);
+                                  emit_reg_reg(op2,S_L,
                                     p^.right^.location.registerhigh,
                                     p^.right^.location.registerhigh,
-                                    p^.location.registerhigh)));
+                                    p^.location.registerhigh);
                                end;
                                end;
                              ungetregister32(p^.right^.location.registerlow);
                              ungetregister32(p^.right^.location.registerlow);
                              ungetregister32(p^.right^.location.registerhigh);
                              ungetregister32(p^.right^.location.registerhigh);
@@ -1807,8 +1805,8 @@ implementation
                       begin
                       begin
                          if p^.right^.location.loc=LOC_CFPUREGISTER then
                          if p^.right^.location.loc=LOC_CFPUREGISTER then
                            begin
                            begin
-                              exprasmlist^.concat(new(pai386,op_reg(A_FLD,S_NO,
-                                correct_fpuregister(p^.right^.location.register,fpuvaroffset))));
+                              emit_reg( A_FLD,S_NO,
+                                correct_fpuregister(p^.right^.location.register,fpuvaroffset));
                               inc(fpuvaroffset);
                               inc(fpuvaroffset);
                             end
                             end
                          else
                          else
@@ -1817,8 +1815,8 @@ implementation
                            begin
                            begin
                               if p^.left^.location.loc=LOC_CFPUREGISTER then
                               if p^.left^.location.loc=LOC_CFPUREGISTER then
                                 begin
                                 begin
-                                   exprasmlist^.concat(new(pai386,op_reg(A_FLD,S_NO,
-                                     correct_fpuregister(p^.left^.location.register,fpuvaroffset))));
+                                   emit_reg( A_FLD,S_NO,
+                                     correct_fpuregister(p^.left^.location.register,fpuvaroffset));
                                    inc(fpuvaroffset);
                                    inc(fpuvaroffset);
                                 end
                                 end
                               else
                               else
@@ -1836,8 +1834,8 @@ implementation
                       begin
                       begin
                          if p^.left^.location.loc=LOC_CFPUREGISTER then
                          if p^.left^.location.loc=LOC_CFPUREGISTER then
                            begin
                            begin
-                              exprasmlist^.concat(new(pai386,op_reg(A_FLD,S_NO,
-                                correct_fpuregister(p^.left^.location.register,fpuvaroffset))));
+                              emit_reg( A_FLD,S_NO,
+                                correct_fpuregister(p^.left^.location.register,fpuvaroffset));
                               inc(fpuvaroffset);
                               inc(fpuvaroffset);
                            end
                            end
                          else
                          else
@@ -1861,18 +1859,18 @@ implementation
                       end;
                       end;
                     { to avoid the pentium bug
                     { to avoid the pentium bug
                     if (op=FDIVP) and (opt_processors=pentium) then
                     if (op=FDIVP) and (opt_processors=pentium) then
-                      exprasmlist^.concat(new(pai386,op_CALL,S_NO,'EMUL_FDIVP')
+                      emitcall('EMUL_FDIVP')
                     else
                     else
                     }
                     }
                     { the Intel assemblers want operands }
                     { the Intel assemblers want operands }
                     if op<>A_FCOMPP then
                     if op<>A_FCOMPP then
                       begin
                       begin
-                         exprasmlist^.concat(new(pai386,op_reg_reg(op,S_NO,R_ST,R_ST1)));
+                         emit_reg_reg(op,S_NO,R_ST,R_ST1);
                          dec(fpuvaroffset);
                          dec(fpuvaroffset);
                       end
                       end
                     else
                     else
                       begin
                       begin
-                         exprasmlist^.concat(new(pai386,op_none(op,S_NO)));
+                         emit_none(op,S_NO);
                          dec(fpuvaroffset,2);
                          dec(fpuvaroffset,2);
                       end;
                       end;
 
 
@@ -1881,8 +1879,8 @@ implementation
                      begin
                      begin
                        if not(R_EAX in unused) then
                        if not(R_EAX in unused) then
                          emit_reg_reg(A_MOV,S_L,R_EAX,R_EDI);
                          emit_reg_reg(A_MOV,S_L,R_EAX,R_EDI);
-                       exprasmlist^.concat(new(pai386,op_reg(A_FNSTSW,S_NO,R_AX)));
-                       exprasmlist^.concat(new(pai386,op_none(A_SAHF,S_NO)));
+                       emit_reg(A_FNSTSW,S_NO,R_AX);
+                       emit_none(A_SAHF,S_NO);
                        if not(R_EAX in unused) then
                        if not(R_EAX in unused) then
                          emit_reg_reg(A_MOV,S_L,R_EDI,R_EAX);
                          emit_reg_reg(A_MOV,S_L,R_EDI,R_EAX);
                        if p^.swaped then
                        if p^.swaped then
@@ -2032,14 +2030,14 @@ implementation
                              if is_in_dest then
                              if is_in_dest then
                                begin
                                begin
                                   hregister:=p^.location.register;
                                   hregister:=p^.location.register;
-                                  exprasmlist^.concat(new(pai386,op_ref_reg(A_MOVQ,S_NO,
-                                  newreference(p^.left^.location.reference),hregister)));
+                                  emit_ref_reg(A_MOVQ,S_NO,
+                                    newreference(p^.left^.location.reference),hregister);
                                end
                                end
                              else
                              else
                                begin
                                begin
                                   hregister:=getregistermmx;
                                   hregister:=getregistermmx;
-                                  exprasmlist^.concat(new(pai386,op_ref_reg(A_MOVQ,S_NO,
-                                    newreference(p^.left^.location.reference),hregister)));
+                                  emit_ref_reg(A_MOVQ,S_NO,
+                                    newreference(p^.left^.location.reference),hregister);
                                end;
                                end;
                           end;
                           end;
                         clear_location(p^.location);
                         clear_location(p^.location);
@@ -2069,12 +2067,12 @@ implementation
                                end
                                end
                              else
                              else
                                begin
                                begin
-                                  exprasmlist^.concat(new(pai386,op_ref_reg(A_MOVQ,S_NO,
-                                    newreference(p^.right^.location.reference),R_MM7)));
-                                  exprasmlist^.concat(new(pai386,op_reg_reg(op,S_NO,p^.location.register,
-                                    R_MM7)));
-                                  exprasmlist^.concat(new(pai386,op_reg_reg(A_MOVQ,S_NO,
-                                    R_MM7,p^.location.register)));
+                                  emit_ref_reg(A_MOVQ,S_NO,
+                                    newreference(p^.right^.location.reference),R_MM7);
+                                  emit_reg_reg(op,S_NO,p^.location.register,
+                                    R_MM7);
+                                  emit_reg_reg(A_MOVQ,S_NO,
+                                    R_MM7,p^.location.register);
                                   del_reference(p^.right^.location.reference);
                                   del_reference(p^.right^.location.reference);
                                end;
                                end;
                           end
                           end
@@ -2087,8 +2085,8 @@ implementation
                                end
                                end
                              else
                              else
                                begin
                                begin
-                                  exprasmlist^.concat(new(pai386,op_ref_reg(op,S_NO,newreference(
-                                    p^.right^.location.reference),p^.location.register)));
+                                  emit_ref_reg(op,S_NO,newreference(
+                                    p^.right^.location.reference),p^.location.register);
                                   del_reference(p^.right^.location.reference);
                                   del_reference(p^.right^.location.reference);
                                end;
                                end;
                           end;
                           end;
@@ -2098,18 +2096,18 @@ implementation
                         { when swapped another result register }
                         { when swapped another result register }
                         if (p^.treetype=subn) and p^.swaped then
                         if (p^.treetype=subn) and p^.swaped then
                           begin
                           begin
-                             exprasmlist^.concat(new(pai386,op_reg_reg(op,S_NO,
-                               p^.location.register,p^.right^.location.register)));
-                               swap_location(p^.location,p^.right^.location);
-                               { newly swapped also set swapped flag }
-                               { just to maintain ordering         }
-                               p^.swaped:=not(p^.swaped);
+                             emit_reg_reg(op,S_NO,
+                               p^.location.register,p^.right^.location.register);
+                             swap_location(p^.location,p^.right^.location);
+                             { newly swapped also set swapped flag }
+                             { just to maintain ordering         }
+                             p^.swaped:=not(p^.swaped);
                           end
                           end
                         else
                         else
                           begin
                           begin
-                             exprasmlist^.concat(new(pai386,op_reg_reg(op,S_NO,
+                             emit_reg_reg(op,S_NO,
                                p^.right^.location.register,
                                p^.right^.location.register,
-                               p^.location.register)));
+                               p^.location.register);
                           end;
                           end;
                         ungetregistermmx(p^.right^.location.register);
                         ungetregistermmx(p^.right^.location.register);
                      end;
                      end;
@@ -2124,7 +2122,10 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.73  1999-08-07 11:29:26  peter
+  Revision 1.74  1999-08-19 13:08:43  pierre
+   * emit_??? used
+
+  Revision 1.73  1999/08/07 11:29:26  peter
     * better fix for muln register allocation
     * better fix for muln register allocation
 
 
   Revision 1.72  1999/08/04 13:45:17  florian
   Revision 1.72  1999/08/04 13:45:17  florian

+ 111 - 81
compiler/cg386cal.pas

@@ -105,11 +105,11 @@ implementation
                   if inlined then
                   if inlined then
                     begin
                     begin
                        r:=new_reference(procinfo.framepointer,para_offset-pushedparasize);
                        r:=new_reference(procinfo.framepointer,para_offset-pushedparasize);
-                       exprasmlist^.concat(new(pai386,op_reg_ref(A_MOV,S_L,
-                         p^.left^.location.register,r)));
+                       emit_reg_ref(A_MOV,S_L,
+                         p^.left^.location.register,r);
                     end
                     end
                   else
                   else
-                    exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,p^.left^.location.register)));
+                    emit_reg(A_PUSH,S_L,p^.left^.location.register);
                   ungetregister32(p^.left^.location.register);
                   ungetregister32(p^.left^.location.register);
                 end
                 end
               else
               else
@@ -120,10 +120,10 @@ implementation
                      begin
                      begin
                        if inlined then
                        if inlined then
                          begin
                          begin
-                           exprasmlist^.concat(new(pai386,op_ref_reg(A_LEA,S_L,
-                             newreference(p^.left^.location.reference),R_EDI)));
+                           emit_ref_reg(A_LEA,S_L,
+                             newreference(p^.left^.location.reference),R_EDI);
                            r:=new_reference(procinfo.framepointer,para_offset-pushedparasize);
                            r:=new_reference(procinfo.framepointer,para_offset-pushedparasize);
-                           exprasmlist^.concat(new(pai386,op_reg_ref(A_MOV,S_L,R_EDI,r)));
+                           emit_reg_ref(A_MOV,S_L,R_EDI,r);
                          end
                          end
                       else
                       else
                         emitpushreferenceaddr(p^.left^.location.reference);
                         emitpushreferenceaddr(p^.left^.location.reference);
@@ -140,10 +140,10 @@ implementation
               inc(pushedparasize,4);
               inc(pushedparasize,4);
               if inlined then
               if inlined then
                 begin
                 begin
-                   exprasmlist^.concat(new(pai386,op_ref_reg(A_LEA,S_L,
-                     newreference(p^.left^.location.reference),R_EDI)));
+                   emit_ref_reg(A_LEA,S_L,
+                     newreference(p^.left^.location.reference),R_EDI);
                    r:=new_reference(procinfo.framepointer,para_offset-pushedparasize);
                    r:=new_reference(procinfo.framepointer,para_offset-pushedparasize);
-                   exprasmlist^.concat(new(pai386,op_reg_ref(A_MOV,S_L,R_EDI,r)));
+                   emit_reg_ref(A_MOV,S_L,R_EDI,r);
                 end
                 end
               else
               else
                 emitpushreferenceaddr(p^.left^.location.reference);
                 emitpushreferenceaddr(p^.left^.location.reference);
@@ -160,11 +160,11 @@ implementation
                    inc(pushedparasize,4);
                    inc(pushedparasize,4);
                    if inlined then
                    if inlined then
                      begin
                      begin
-                        exprasmlist^.concat(new(pai386,op_ref_reg(A_LEA,S_L,
-                          newreference(p^.left^.location.reference),R_EDI)));
+                        emit_ref_reg(A_LEA,S_L,
+                          newreference(p^.left^.location.reference),R_EDI);
                         r:=new_reference(procinfo.framepointer,para_offset-pushedparasize);
                         r:=new_reference(procinfo.framepointer,para_offset-pushedparasize);
-                        exprasmlist^.concat(new(pai386,op_reg_ref(A_MOV,S_L,
-                          R_EDI,r)));
+                        emit_reg_ref(A_MOV,S_L,
+                          R_EDI,r);
                      end
                      end
                    else
                    else
                      emitpushreferenceaddr(p^.left^.location.reference);
                      emitpushreferenceaddr(p^.left^.location.reference);
@@ -224,6 +224,7 @@ implementation
          { we must pop this size also after !! }
          { we must pop this size also after !! }
 {        must_pop : boolean; }
 {        must_pop : boolean; }
          pop_size : longint;
          pop_size : longint;
+         pop_allowed : boolean;
 
 
       label
       label
          dont_call;
          dont_call;
@@ -303,7 +304,17 @@ implementation
          oldpushedparasize:=pushedparasize;
          oldpushedparasize:=pushedparasize;
          pushedparasize:=0;
          pushedparasize:=0;
          pop_size:=0;
          pop_size:=0;
-         if (not inlined) then
+         { no inc esp for inlined procedure
+           and for objects constructors PM }
+         if inlined or
+            ((p^.right=nil) and
+            (p^.procdefinition^.proctypeoption=potype_constructor) and
+            { quick'n'dirty check if it is a class or an object }
+            (p^.resulttype^.deftype=orddef)) then
+           pop_allowed:=false
+         else
+           pop_allowed:=true;
+         if pop_allowed then
           begin
           begin
           { Old pushedsize aligned on 4 ? }
           { Old pushedsize aligned on 4 ? }
             i:=oldpushedparasize and 3;
             i:=oldpushedparasize and 3;
@@ -314,10 +325,12 @@ implementation
             if i>0 then
             if i>0 then
              inc(pop_size,4-i);
              inc(pop_size,4-i);
           { insert the opcode and update pushedparasize }
           { insert the opcode and update pushedparasize }
+          { never push 4 or more !! }
+            pop_size:=pop_size mod 4;
             if pop_size>0 then
             if pop_size>0 then
              begin
              begin
                inc(pushedparasize,pop_size);
                inc(pushedparasize,pop_size);
-               exprasmlist^.concat(new(pai386,op_const_reg(A_SUB,S_L,pop_size,R_ESP)));
+               emit_const_reg(A_SUB,S_L,pop_size,R_ESP);
 {$ifdef GDB}
 {$ifdef GDB}
                if (cs_debuginfo in aktmoduleswitches) and
                if (cs_debuginfo in aktmoduleswitches) and
                   (exprasmlist^.first=exprasmlist^.last) then
                   (exprasmlist^.first=exprasmlist^.last) then
@@ -382,11 +395,11 @@ implementation
               inc(pushedparasize,4);
               inc(pushedparasize,4);
               if inlined then
               if inlined then
                 begin
                 begin
-                   exprasmlist^.concat(new(pai386,op_ref_reg(A_LEA,S_L,
-                     newreference(funcretref),R_EDI)));
+                   emit_ref_reg(A_LEA,S_L,
+                     newreference(funcretref),R_EDI);
                    r:=new_reference(procinfo.framepointer,inlinecode^.retoffset);
                    r:=new_reference(procinfo.framepointer,inlinecode^.retoffset);
-                   exprasmlist^.concat(new(pai386,op_reg_ref(A_MOV,S_L,
-                     R_EDI,r)));
+                   emit_reg_ref(A_MOV,S_L,
+                     R_EDI,r);
                 end
                 end
               else
               else
                 emitpushreferenceaddr(funcretref);
                 emitpushreferenceaddr(funcretref);
@@ -426,9 +439,9 @@ implementation
                    r^:=ptree(pwithsymtable(p^.symtable)^.withnode)^.withreference^;
                    r^:=ptree(pwithsymtable(p^.symtable)^.withnode)^.withreference^;
                    if (not pwithsymtable(p^.symtable)^.direct_with) or
                    if (not pwithsymtable(p^.symtable)^.direct_with) or
                       pobjectdef(p^.methodpointer^.resulttype)^.is_class then
                       pobjectdef(p^.methodpointer^.resulttype)^.is_class then
-                     exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,r,R_ESI)))
+                     emit_ref_reg(A_MOV,S_L,r,R_ESI)
                    else
                    else
-                     exprasmlist^.concat(new(pai386,op_ref_reg(A_LEA,S_L,r,R_ESI)));
+                     emit_ref_reg(A_LEA,S_L,r,R_ESI);
                 end;
                 end;
 
 
               { push self }
               { push self }
@@ -468,14 +481,14 @@ implementation
                                          loadesi:=true;
                                          loadesi:=true;
                                          { if no VMT just use $0 bug0214 PM }
                                          { if no VMT just use $0 bug0214 PM }
                                          if not(oo_has_vmt in pobjectdef(p^.methodpointer^.resulttype)^.objectoptions) then
                                          if not(oo_has_vmt in pobjectdef(p^.methodpointer^.resulttype)^.objectoptions) then
-                                           exprasmlist^.concat(new(pai386,op_const_reg(A_MOV,S_L,0,R_ESI)))
+                                           emit_const_reg(A_MOV,S_L,0,R_ESI)
                                          else
                                          else
                                            begin
                                            begin
-                                             exprasmlist^.concat(new(pai386,op_sym_ofs_reg(A_MOV,S_L,
+                                             emit_sym_ofs_reg(A_MOV,S_L,
                                                newasmsymbol(pobjectdef(p^.methodpointer^.resulttype)^.vmt_mangledname),
                                                newasmsymbol(pobjectdef(p^.methodpointer^.resulttype)^.vmt_mangledname),
-                                               0,R_ESI)));
+                                               0,R_ESI);
                                            end;
                                            end;
-                                         { exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,R_ESI)));
+                                         { emit_reg(A_PUSH,S_L,R_ESI);
                                            this is done below !! }
                                            this is done below !! }
                                       end
                                       end
                                     else
                                     else
@@ -488,7 +501,7 @@ implementation
                                        (aktprocsym^.definition^.proctypeoption=potype_destructor) then
                                        (aktprocsym^.definition^.proctypeoption=potype_destructor) then
                                       begin
                                       begin
                                         push_int(0);
                                         push_int(0);
-                                        exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,R_ESI)));
+                                        emit_reg(A_PUSH,S_L,R_ESI);
                                       end;
                                       end;
 
 
                                     if not(is_con_or_destructor and
                                     if not(is_con_or_destructor and
@@ -496,7 +509,7 @@ implementation
                                            assigned(aktprocsym) and
                                            assigned(aktprocsym) and
                                            (aktprocsym^.definition^.proctypeoption in [potype_constructor,potype_destructor])
                                            (aktprocsym^.definition^.proctypeoption in [potype_constructor,potype_destructor])
                                           ) then
                                           ) then
-                                      exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,R_ESI)));
+                                      emit_reg(A_PUSH,S_L,R_ESI);
                                     { if an inherited con- or destructor should be  }
                                     { if an inherited con- or destructor should be  }
                                     { called in a con- or destructor then a warning }
                                     { called in a con- or destructor then a warning }
                                     { will be made                                }
                                     { will be made                                }
@@ -514,17 +527,17 @@ implementation
                                         not(pobjectdef(p^.methodpointer^.resulttype)^.is_class and
                                         not(pobjectdef(p^.methodpointer^.resulttype)^.is_class and
                                         assigned(aktprocsym) and
                                         assigned(aktprocsym) and
                                         (aktprocsym^.definition^.proctypeoption=potype_destructor)) then
                                         (aktprocsym^.definition^.proctypeoption=potype_destructor)) then
-                                      push_int(0);
+                                       push_int(0);
                                  end;
                                  end;
                                hnewn:
                                hnewn:
                                  begin
                                  begin
                                     { extended syntax of new }
                                     { extended syntax of new }
                                     { ESI must be zero }
                                     { ESI must be zero }
-                                    exprasmlist^.concat(new(pai386,op_reg_reg(A_XOR,S_L,R_ESI,R_ESI)));
-                                    exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,R_ESI)));
+                                    emit_reg_reg(A_XOR,S_L,R_ESI,R_ESI);
+                                    emit_reg(A_PUSH,S_L,R_ESI);
                                     { insert the vmt }
                                     { insert the vmt }
-                                    exprasmlist^.concat(new(pai386,op_sym(A_PUSH,S_L,
-                                      newasmsymbol(pobjectdef(p^.methodpointer^.resulttype)^.vmt_mangledname))));
+                                    emit_sym(A_PUSH,S_L,
+                                      newasmsymbol(pobjectdef(p^.methodpointer^.resulttype)^.vmt_mangledname));
                                     extended_new:=true;
                                     extended_new:=true;
                                  end;
                                  end;
                                hdisposen:
                                hdisposen:
@@ -533,12 +546,12 @@ implementation
 
 
                                     { destructor with extended syntax called from dispose }
                                     { destructor with extended syntax called from dispose }
                                     { hdisposen always deliver LOC_REFERENCE          }
                                     { hdisposen always deliver LOC_REFERENCE          }
-                                    exprasmlist^.concat(new(pai386,op_ref_reg(A_LEA,S_L,
-                                      newreference(p^.methodpointer^.location.reference),R_ESI)));
+                                    emit_ref_reg(A_LEA,S_L,
+                                      newreference(p^.methodpointer^.location.reference),R_ESI);
                                     del_reference(p^.methodpointer^.location.reference);
                                     del_reference(p^.methodpointer^.location.reference);
-                                    exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,R_ESI)));
-                                    exprasmlist^.concat(new(pai386,op_sym(A_PUSH,S_L,
-                                      newasmsymbol(pobjectdef(p^.methodpointer^.resulttype)^.vmt_mangledname))));
+                                    emit_reg(A_PUSH,S_L,R_ESI);
+                                    emit_sym(A_PUSH,S_L,
+                                      newasmsymbol(pobjectdef(p^.methodpointer^.resulttype)^.vmt_mangledname));
                                  end;
                                  end;
                                else
                                else
                                  begin
                                  begin
@@ -558,11 +571,11 @@ implementation
                                                  if (p^.methodpointer^.resulttype^.deftype=classrefdef) or
                                                  if (p^.methodpointer^.resulttype^.deftype=classrefdef) or
                                                     ((p^.methodpointer^.resulttype^.deftype=objectdef) and
                                                     ((p^.methodpointer^.resulttype^.deftype=objectdef) and
                                                    pobjectdef(p^.methodpointer^.resulttype)^.is_class) then
                                                    pobjectdef(p^.methodpointer^.resulttype)^.is_class) then
-                                                   exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
-                                                     newreference(p^.methodpointer^.location.reference),R_ESI)))
+                                                   emit_ref_reg(A_MOV,S_L,
+                                                     newreference(p^.methodpointer^.location.reference),R_ESI)
                                                  else
                                                  else
-                                                   exprasmlist^.concat(new(pai386,op_ref_reg(A_LEA,S_L,
-                                                     newreference(p^.methodpointer^.location.reference),R_ESI)));
+                                                   emit_ref_reg(A_LEA,S_L,
+                                                     newreference(p^.methodpointer^.location.reference),R_ESI);
                                                  del_reference(p^.methodpointer^.location.reference);
                                                  del_reference(p^.methodpointer^.location.reference);
                                               end;
                                               end;
                                          end;
                                          end;
@@ -579,22 +592,22 @@ implementation
                                              reset_reference(r^);
                                              reset_reference(r^);
                                              r^.base:=R_ESI;
                                              r^.base:=R_ESI;
                                              r^.offset:= pprocdef(p^.procdefinition)^._class^.vmt_offset;
                                              r^.offset:= pprocdef(p^.procdefinition)^._class^.vmt_offset;
-                                             exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,r,R_ESI)));
+                                             emit_ref_reg(A_MOV,S_L,r,R_ESI);
                                           end;
                                           end;
 
 
                                         { direct call to destructor: don't remove data! }
                                         { direct call to destructor: don't remove data! }
                                         if (p^.procdefinition^.proctypeoption=potype_destructor) and
                                         if (p^.procdefinition^.proctypeoption=potype_destructor) and
                                            (p^.methodpointer^.resulttype^.deftype=objectdef) and
                                            (p^.methodpointer^.resulttype^.deftype=objectdef) and
                                            (pobjectdef(p^.methodpointer^.resulttype)^.is_class) then
                                            (pobjectdef(p^.methodpointer^.resulttype)^.is_class) then
-                                          exprasmlist^.concat(new(pai386,op_const(A_PUSH,S_L,1)));
+                                          emit_const(A_PUSH,S_L,1);
 
 
                                         { direct call to class constructor, don't allocate memory }
                                         { direct call to class constructor, don't allocate memory }
                                         if (p^.procdefinition^.proctypeoption=potype_constructor) and
                                         if (p^.procdefinition^.proctypeoption=potype_constructor) and
                                            (p^.methodpointer^.resulttype^.deftype=objectdef) and
                                            (p^.methodpointer^.resulttype^.deftype=objectdef) and
                                            (pobjectdef(p^.methodpointer^.resulttype)^.is_class) then
                                            (pobjectdef(p^.methodpointer^.resulttype)^.is_class) then
-                                          exprasmlist^.concat(new(pai386,op_const(A_PUSH,S_L,0)))
+                                          emit_const(A_PUSH,S_L,0)
                                         else
                                         else
-                                          exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,R_ESI)));
+                                          emit_reg(A_PUSH,S_L,R_ESI);
                                       end;
                                       end;
 
 
                                     if is_con_or_destructor then
                                     if is_con_or_destructor then
@@ -606,8 +619,8 @@ implementation
                                               if (p^.procdefinition^.proctypeoption=potype_constructor) then
                                               if (p^.procdefinition^.proctypeoption=potype_constructor) then
                                                 begin
                                                 begin
                                                    { it's no bad idea, to insert the VMT }
                                                    { it's no bad idea, to insert the VMT }
-                                                   exprasmlist^.concat(new(pai386,op_sym(A_PUSH,S_L,newasmsymbol(
-                                                     pobjectdef(p^.methodpointer^.resulttype)^.vmt_mangledname))));
+                                                   emit_sym(A_PUSH,S_L,newasmsymbol(
+                                                     pobjectdef(p^.methodpointer^.resulttype)^.vmt_mangledname));
                                                 end
                                                 end
                                               { destructors haven't to dispose the instance, if this is }
                                               { destructors haven't to dispose the instance, if this is }
                                               { a direct call                                      }
                                               { a direct call                                      }
@@ -632,14 +645,14 @@ implementation
                              reset_reference(r^);
                              reset_reference(r^);
                              r^.base:=R_ESI;
                              r^.base:=R_ESI;
                              r^.offset:= pprocdef(p^.procdefinition)^._class^.vmt_offset;
                              r^.offset:= pprocdef(p^.procdefinition)^._class^.vmt_offset;
-                             exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,r,R_ESI)));
+                             emit_ref_reg(A_MOV,S_L,r,R_ESI);
                           end
                           end
                         else
                         else
                           begin
                           begin
                              { member call, ESI isn't modified }
                              { member call, ESI isn't modified }
                              loadesi:=false;
                              loadesi:=false;
                           end;
                           end;
-                        exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,R_ESI)));
+                        emit_reg(A_PUSH,S_L,R_ESI);
                         { but a con- or destructor here would probably almost }
                         { but a con- or destructor here would probably almost }
                         { always be placed wrong }
                         { always be placed wrong }
                         if is_con_or_destructor then
                         if is_con_or_destructor then
@@ -661,7 +674,7 @@ implementation
                    {
                    {
                      begin
                      begin
                         loadesi:=false;
                         loadesi:=false;
-                        exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,R_ESI)));
+                        emit_reg(A_PUSH,S_L,R_ESI);
                      end;
                      end;
                    }
                    }
                    if lexlevel=(pprocdef(p^.procdefinition)^.parast^.symtablelevel) then
                    if lexlevel=(pprocdef(p^.procdefinition)^.parast^.symtablelevel) then
@@ -670,13 +683,13 @@ implementation
                         reset_reference(r^);
                         reset_reference(r^);
                         r^.offset:=procinfo.framepointer_offset;
                         r^.offset:=procinfo.framepointer_offset;
                         r^.base:=procinfo.framepointer;
                         r^.base:=procinfo.framepointer;
-                        exprasmlist^.concat(new(pai386,op_ref(A_PUSH,S_L,r)))
+                        emit_ref(A_PUSH,S_L,r)
                      end
                      end
                      { this is only true if the difference is one !!
                      { this is only true if the difference is one !!
                        but it cannot be more !! }
                        but it cannot be more !! }
                    else if (lexlevel=pprocdef(p^.procdefinition)^.parast^.symtablelevel-1) then
                    else if (lexlevel=pprocdef(p^.procdefinition)^.parast^.symtablelevel-1) then
                      begin
                      begin
-                        exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,procinfo.framepointer)))
+                        emit_reg(A_PUSH,S_L,procinfo.framepointer)
                      end
                      end
                    else if (lexlevel>pprocdef(p^.procdefinition)^.parast^.symtablelevel) then
                    else if (lexlevel>pprocdef(p^.procdefinition)^.parast^.symtablelevel) then
                      begin
                      begin
@@ -685,7 +698,7 @@ implementation
                         reset_reference(r^);
                         reset_reference(r^);
                         r^.offset:=procinfo.framepointer_offset;
                         r^.offset:=procinfo.framepointer_offset;
                         r^.base:=procinfo.framepointer;
                         r^.base:=procinfo.framepointer;
-                        exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,r,hregister)));
+                        emit_ref_reg(A_MOV,S_L,r,hregister);
                         for i:=(pprocdef(p^.procdefinition)^.parast^.symtablelevel) to lexlevel-1 do
                         for i:=(pprocdef(p^.procdefinition)^.parast^.symtablelevel) to lexlevel-1 do
                           begin
                           begin
                              new(r);
                              new(r);
@@ -694,9 +707,9 @@ implementation
                              how can we do this !!! }
                              how can we do this !!! }
                              r^.offset:=procinfo.framepointer_offset;
                              r^.offset:=procinfo.framepointer_offset;
                              r^.base:=hregister;
                              r^.base:=hregister;
-                             exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,r,hregister)));
+                             emit_ref_reg(A_MOV,S_L,r,hregister);
                           end;
                           end;
-                        exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,hregister)));
+                        emit_reg(A_PUSH,S_L,hregister);
                         ungetregister32(hregister);
                         ungetregister32(hregister);
                      end
                      end
                    else
                    else
@@ -732,7 +745,7 @@ implementation
                             r^.base:=R_ESI;
                             r^.base:=R_ESI;
                             { this is one point where we need vmt_offset (PM) }
                             { this is one point where we need vmt_offset (PM) }
                             r^.offset:= pprocdef(p^.procdefinition)^._class^.vmt_offset;
                             r^.offset:= pprocdef(p^.procdefinition)^._class^.vmt_offset;
-                            exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,r,R_EDI)));
+                            emit_ref_reg(A_MOV,S_L,r,R_EDI);
                             new(r);
                             new(r);
                             reset_reference(r^);
                             reset_reference(r^);
                             r^.base:=R_EDI;
                             r^.base:=R_EDI;
@@ -746,7 +759,7 @@ implementation
                        new(r);
                        new(r);
                        reset_reference(r^);
                        reset_reference(r^);
                        r^.base:=R_ESI;
                        r^.base:=R_ESI;
-                       exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,r,R_EDI)));
+                       emit_ref_reg(A_MOV,S_L,r,R_EDI);
                        new(r);
                        new(r);
                        reset_reference(r^);
                        reset_reference(r^);
                        r^.base:=R_EDI;
                        r^.base:=R_EDI;
@@ -758,19 +771,19 @@ implementation
 {$ifndef TESTOBJEXT}
 {$ifndef TESTOBJEXT}
                    if (cs_check_range in aktlocalswitches) then
                    if (cs_check_range in aktlocalswitches) then
                      begin
                      begin
-                        exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,r^.base)));
+                        emit_reg(A_PUSH,S_L,r^.base);
                         emitcall('FPC_CHECK_OBJECT');
                         emitcall('FPC_CHECK_OBJECT');
                      end;
                      end;
 {$else TESTOBJEXT}
 {$else TESTOBJEXT}
                    if (cs_check_range in aktlocalswitches) then
                    if (cs_check_range in aktlocalswitches) then
                      begin
                      begin
-                        exprasmlist^.concat(new(pai386,op_sym(A_PUSH,S_L,
-                          newasmsymbol(pprocdef(p^.procdefinition)^._class^.vmt_mangledname))));
-                        exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,r^.base)));
+                        emit_sym(A_PUSH,S_L,
+                          newasmsymbol(pprocdef(p^.procdefinition)^._class^.vmt_mangledname));
+                        emit_reg(A_PUSH,S_L,r^.base);
                         emitcall('FPC_CHECK_OBJECT_EXT');
                         emitcall('FPC_CHECK_OBJECT_EXT');
                      end;
                      end;
 {$endif TESTOBJEXT}
 {$endif TESTOBJEXT}
-                   exprasmlist^.concat(new(pai386,op_ref(A_CALL,S_NO,r)));
+                   emit_ref(A_CALL,S_NO,r);
                 end
                 end
               else if not inlined then
               else if not inlined then
                 emitcall(pprocdef(p^.procdefinition)^.mangledname)
                 emitcall(pprocdef(p^.procdefinition)^.mangledname)
@@ -806,8 +819,8 @@ implementation
                       (p^.right^.location.reference.index=R_ESI) then
                       (p^.right^.location.reference.index=R_ESI) then
                      begin
                      begin
                         del_reference(p^.right^.location.reference);
                         del_reference(p^.right^.location.reference);
-                        exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
-                          newreference(p^.right^.location.reference),R_EDI)));
+                        emit_ref_reg(A_MOV,S_L,
+                          newreference(p^.right^.location.reference),R_EDI);
                         hregister:=R_EDI;
                         hregister:=R_EDI;
                      end;
                      end;
 
 
@@ -816,17 +829,17 @@ implementation
                      begin
                      begin
                        { load ESI }
                        { load ESI }
                        inc(p^.right^.location.reference.offset,4);
                        inc(p^.right^.location.reference.offset,4);
-                       exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
-                         newreference(p^.right^.location.reference),R_ESI)));
+                       emit_ref_reg(A_MOV,S_L,
+                         newreference(p^.right^.location.reference),R_ESI);
                        dec(p^.right^.location.reference.offset,4);
                        dec(p^.right^.location.reference.offset,4);
                        { push self pointer }
                        { push self pointer }
-                       exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,R_ESI)));
+                       emit_reg(A_PUSH,S_L,R_ESI);
                      end;
                      end;
 
 
                    if hregister=R_NO then
                    if hregister=R_NO then
-                     exprasmlist^.concat(new(pai386,op_ref(A_CALL,S_NO,newreference(p^.right^.location.reference))))
+                     emit_ref(A_CALL,S_NO,newreference(p^.right^.location.reference))
                    else
                    else
-                     exprasmlist^.concat(new(pai386,op_reg(A_CALL,S_NO,hregister)));
+                     emit_reg(A_CALL,S_NO,hregister);
 
 
                    del_reference(p^.right^.location.reference);
                    del_reference(p^.right^.location.reference);
                 end
                 end
@@ -835,11 +848,11 @@ implementation
                    case p^.right^.location.loc of
                    case p^.right^.location.loc of
                       LOC_REGISTER,LOC_CREGISTER:
                       LOC_REGISTER,LOC_CREGISTER:
                          begin
                          begin
-                             exprasmlist^.concat(new(pai386,op_reg(A_CALL,S_NO,p^.right^.location.register)));
+                             emit_reg(A_CALL,S_NO,p^.right^.location.register);
                              ungetregister32(p^.right^.location.register);
                              ungetregister32(p^.right^.location.register);
                          end
                          end
                       else
                       else
-                         exprasmlist^.concat(new(pai386,op_ref(A_CALL,S_NO,newreference(p^.right^.location.reference))));
+                         emit_ref(A_CALL,S_NO,newreference(p^.right^.location.reference));
                          del_reference(p^.right^.location.reference);
                          del_reference(p^.right^.location.reference);
                    end;
                    end;
                 end;
                 end;
@@ -855,7 +868,7 @@ implementation
                 pop_size:=0;
                 pop_size:=0;
                 { better than an add on all processors }
                 { better than an add on all processors }
                 if pushedparasize=4 then
                 if pushedparasize=4 then
-                  exprasmlist^.concat(new(pai386,op_reg(A_POP,S_L,R_EDI)))
+                  emit_reg(A_POP,S_L,R_EDI)
                 { the pentium has two pipes and pop reg is pairable }
                 { the pentium has two pipes and pop reg is pairable }
                 { but the registers must be different!        }
                 { but the registers must be different!        }
                 else if (pushedparasize=8) and
                 else if (pushedparasize=8) and
@@ -863,16 +876,28 @@ implementation
                   (aktoptprocessor=ClassP5) and
                   (aktoptprocessor=ClassP5) and
                   (procinfo._class=nil) then
                   (procinfo._class=nil) then
                     begin
                     begin
-                       exprasmlist^.concat(new(pai386,op_reg(A_POP,S_L,R_EDI)));
-                       exprasmlist^.concat(new(pai386,op_reg(A_POP,S_L,R_ESI)));
+                       emit_reg(A_POP,S_L,R_EDI);
+                       emit_reg(A_POP,S_L,R_ESI);
                     end
                     end
                 else if pushedparasize<>0 then
                 else if pushedparasize<>0 then
-                  exprasmlist^.concat(new(pai386,op_const_reg(A_ADD,S_L,pushedparasize,R_ESP)));
+                  emit_const_reg(A_ADD,S_L,pushedparasize,R_ESP);
              end;
              end;
       dont_call:
       dont_call:
          pushedparasize:=oldpushedparasize;
          pushedparasize:=oldpushedparasize;
          unused:=unusedregisters;
          unused:=unusedregisters;
 
 
+         { a constructor could be a function with boolean result }
+         { if calling constructor called fail we
+           must jump directly to quickexitlabel  PM
+           but only if it is a call of an inherited constructor }
+         if (p^.right=nil) and
+            (p^.procdefinition^.proctypeoption=potype_constructor) and
+            assigned(p^.methodpointer) and
+            (p^.methodpointer^.treetype=typen) and
+            (aktprocsym^.definition^.proctypeoption=potype_constructor) then
+           begin
+             emitjmp(C_Z,faillabel);
+           end;
          { handle function results }
          { handle function results }
          { structured results are easy to handle.... }
          { structured results are easy to handle.... }
          { needed also when result_no_used !! }
          { needed also when result_no_used !! }
@@ -893,8 +918,10 @@ implementation
                  { quick'n'dirty check if it is a class or an object }
                  { quick'n'dirty check if it is a class or an object }
                  (p^.resulttype^.deftype=orddef) then
                  (p^.resulttype^.deftype=orddef) then
                 begin
                 begin
+                   { this fails if popsize > 0 PM }
                    p^.location.loc:=LOC_FLAGS;
                    p^.location.loc:=LOC_FLAGS;
                    p^.location.resflags:=F_NE;
                    p^.location.resflags:=F_NE;
+                   
                    if extended_new then
                    if extended_new then
                      begin
                      begin
 {$ifdef test_dest_loc}
 {$ifdef test_dest_loc}
@@ -1007,8 +1034,8 @@ implementation
                    emit_reg_reg(A_MOV,S_L,R_EAX,hregister);
                    emit_reg_reg(A_MOV,S_L,R_EAX,hregister);
                    if gettempansistringreference(hr) then
                    if gettempansistringreference(hr) then
                      decrstringref(p^.resulttype,hr);
                      decrstringref(p^.resulttype,hr);
-                   exprasmlist^.concat(new(pai386,op_reg_ref(A_MOV,S_L,hregister,
-                     newreference(hr))));
+                   emit_reg_ref(A_MOV,S_L,hregister,
+                     newreference(hr));
                    ungetregister32(hregister);
                    ungetregister32(hregister);
                    p^.location.loc:=LOC_MEM;
                    p^.location.loc:=LOC_MEM;
                    p^.location.reference:=hr;
                    p^.location.reference:=hr;
@@ -1033,11 +1060,11 @@ implementation
          { perhaps i/o check ? }
          { perhaps i/o check ? }
          if iolabel<>nil then
          if iolabel<>nil then
            begin
            begin
-              exprasmlist^.concat(new(pai386,op_sym(A_PUSH,S_L,iolabel)));
+              emit_sym(A_PUSH,S_L,iolabel);
               emitcall('FPC_IOCHECK');
               emitcall('FPC_IOCHECK');
            end;
            end;
          if pop_size>0 then
          if pop_size>0 then
-           exprasmlist^.concat(new(pai386,op_const_reg(A_ADD,S_L,pop_size,R_ESP)));
+           emit_const_reg(A_ADD,S_L,pop_size,R_ESP);
 
 
          { restore registers }
          { restore registers }
          popusedregisters(pushed);
          popusedregisters(pushed);
@@ -1094,7 +1121,7 @@ implementation
               else if p^.location.loc=LOC_FPU then
               else if p^.location.loc=LOC_FPU then
                 begin
                 begin
                   { release FPU stack }
                   { release FPU stack }
-                  exprasmlist^.concat(new(pai386,op_reg(A_FSTP,S_NO,R_ST0)));
+                  emit_reg(A_FSTP,S_NO,R_ST0);
                   dec(fpuvaroffset);
                   dec(fpuvaroffset);
                 end;
                 end;
            end;
            end;
@@ -1178,7 +1205,10 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.99  1999-08-09 22:19:47  peter
+  Revision 1.100  1999-08-19 13:08:45  pierre
+   * emit_??? used
+
+  Revision 1.99  1999/08/09 22:19:47  peter
     * classes vmt changed to only positive addresses
     * classes vmt changed to only positive addresses
     * sharedlib creation is working
     * sharedlib creation is working
 
 

+ 153 - 162
compiler/cg386cnv.pas

@@ -79,8 +79,8 @@ implementation
               begin
               begin
                  if (p^.right^.treetype=stringconstn) and
                  if (p^.right^.treetype=stringconstn) and
                    (str_length(p^.right)=0) then
                    (str_length(p^.right)=0) then
-                   exprasmlist^.concat(new(pai386,op_const_ref(
-                      A_MOV,S_B,0,newreference(p^.left^.location.reference))))
+                   emit_const_ref(
+                      A_MOV,S_B,0,newreference(p^.left^.location.reference))
                  else
                  else
                    begin
                    begin
                      emitpushreferenceaddr(p^.left^.location.reference);
                      emitpushreferenceaddr(p^.left^.location.reference);
@@ -93,27 +93,24 @@ implementation
             orddef:
             orddef:
               begin
               begin
                  if p^.right^.treetype=ordconstn then
                  if p^.right^.treetype=ordconstn then
-                   exprasmlist^.concat(new(pai386,op_const_ref(
-                      A_MOV,S_W,p^.right^.value*256+1,newreference(p^.left^.location.reference))))
+                   emit_const_ref(
+                      A_MOV,S_W,p^.right^.value*256+1,newreference(p^.left^.location.reference))
                  else
                  else
                    begin
                    begin
                       { not so elegant (goes better with extra register }
                       { not so elegant (goes better with extra register }
                       if (p^.right^.location.loc in [LOC_REGISTER,LOC_CREGISTER]) then
                       if (p^.right^.location.loc in [LOC_REGISTER,LOC_CREGISTER]) then
                         begin
                         begin
-                           exprasmlist^.concat(new(pai386,op_reg_reg(
-                              A_MOV,S_L,makereg32(p^.right^.location.register),R_EDI)));
+                           emit_reg_reg(A_MOV,S_L,makereg32(p^.right^.location.register),R_EDI);
                            ungetregister(p^.right^.location.register);
                            ungetregister(p^.right^.location.register);
                         end
                         end
                       else
                       else
                         begin
                         begin
-                           exprasmlist^.concat(new(pai386,op_ref_reg(
-                              A_MOV,S_L,newreference(p^.right^.location.reference),R_EDI)));
+                           emit_ref_reg(A_MOV,S_L,newreference(p^.right^.location.reference),R_EDI);
                            del_reference(p^.right^.location.reference);
                            del_reference(p^.right^.location.reference);
                         end;
                         end;
-                      exprasmlist^.concat(new(pai386,op_const_reg(A_SHL,S_L,8,R_EDI)));
-                      exprasmlist^.concat(new(pai386,op_const_reg(A_OR,S_L,1,R_EDI)));
-                      exprasmlist^.concat(new(pai386,op_reg_ref(
-                         A_MOV,S_W,R_DI,newreference(p^.left^.location.reference))));
+                      emit_const_reg(A_SHL,S_L,8,R_EDI);
+                      emit_const_reg(A_OR,S_L,1,R_EDI);
+                      emit_reg_ref(A_MOV,S_W,R_DI,newreference(p^.left^.location.reference));
                    end;
                    end;
               end;
               end;
          else
          else
@@ -134,8 +131,7 @@ implementation
               begin
               begin
                  if (p^.right^.treetype=stringconstn) and
                  if (p^.right^.treetype=stringconstn) and
                    (str_length(p^.right)=0) then
                    (str_length(p^.right)=0) then
-                   exprasmlist^.concat(new(pai386,op_const_ref(
-                      A_MOV,S_L,0,newreference(p^.left^.location.reference))))
+                   emit_const_ref(A_MOV,S_L,0,newreference(p^.left^.location.reference))
                  else
                  else
                    begin
                    begin
                      emitpushreferenceaddr(p^.left^.location.reference);
                      emitpushreferenceaddr(p^.left^.location.reference);
@@ -147,37 +143,30 @@ implementation
               end;
               end;
             orddef:
             orddef:
               begin
               begin
-                 exprasmlist^.concat(new(pai386,op_const_ref(
-                    A_MOV,S_L,1,newreference(p^.left^.location.reference))));
+                 emit_const_ref(A_MOV,S_L,1,newreference(p^.left^.location.reference));
 
 
                  r:=newreference(p^.left^.location.reference);
                  r:=newreference(p^.left^.location.reference);
                  inc(r^.offset,4);
                  inc(r^.offset,4);
 
 
                  if p^.right^.treetype=ordconstn then
                  if p^.right^.treetype=ordconstn then
-                   exprasmlist^.concat(new(pai386,op_const_ref(
-                      A_MOV,S_B,p^.right^.value,r)))
+                   emit_const_ref(A_MOV,S_B,p^.right^.value,r)
                  else
                  else
                    begin
                    begin
                       case p^.right^.location.loc of
                       case p^.right^.location.loc of
                          LOC_REGISTER,LOC_CREGISTER:
                          LOC_REGISTER,LOC_CREGISTER:
                            begin
                            begin
-                              exprasmlist^.concat(new(pai386,op_reg_ref(
-                                 A_MOV,S_B,p^.right^.location.register,r)));
+                              emit_reg_ref(A_MOV,S_B,p^.right^.location.register,r);
                               ungetregister(p^.right^.location.register);
                               ungetregister(p^.right^.location.register);
                            end;
                            end;
                          LOC_MEM,LOC_REFERENCE:
                          LOC_MEM,LOC_REFERENCE:
                            begin
                            begin
                               if not(R_EAX in unused) then
                               if not(R_EAX in unused) then
-                                exprasmlist^.concat(new(pai386,op_reg(
-                                  A_PUSH,S_L,R_EAX)));
-                              exprasmlist^.concat(new(pai386,op_ref_reg(
-                                A_MOV,S_B,newreference(p^.right^.location.reference),R_AL)));
-                              exprasmlist^.concat(new(pai386,op_reg_ref(
-                                A_MOV,S_B,R_AL,r)));
+                                emit_reg(A_PUSH,S_L,R_EAX);
+                              emit_ref_reg(A_MOV,S_B,newreference(p^.right^.location.reference),R_AL);
+                              emit_reg_ref(A_MOV,S_B,R_AL,r);
 
 
                               if not(R_EAX in unused) then
                               if not(R_EAX in unused) then
-                                exprasmlist^.concat(new(pai386,op_reg(
-                                   A_POP,S_L,R_EAX)));
+                                emit_reg(A_POP,S_L,R_EAX);
                               del_reference(p^.right^.location.reference);
                               del_reference(p^.right^.location.reference);
                            end
                            end
                          else
                          else
@@ -217,10 +206,10 @@ implementation
 {$IfNDef regallocfix}
 {$IfNDef regallocfix}
                 ungetregister32(source^.location.register);
                 ungetregister32(source^.location.register);
                 pushusedregisters(pushed,$ff);
                 pushusedregisters(pushed,$ff);
-                exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,source^.location.register)));
+                emit_reg(A_PUSH,S_L,source^.location.register);
 {$Else regallocfix}
 {$Else regallocfix}
                  pushusedregisters(pushed, $ff xor ($80 shr byte(source^.location.register)));
                  pushusedregisters(pushed, $ff xor ($80 shr byte(source^.location.register)));
-                 exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,source^.location.register)));
+                 emit_reg(A_PUSH,S_L,source^.location.register);
                  ungetregister32(source^.location.register);
                  ungetregister32(source^.location.register);
 {$EndIf regallocfix}
 {$EndIf regallocfix}
              end;
              end;
@@ -331,23 +320,22 @@ implementation
             if pfrom^.location.loc in [LOC_CREGISTER,LOC_REGISTER] then
             if pfrom^.location.loc in [LOC_CREGISTER,LOC_REGISTER] then
               emit_reg_reg(op,opsize,pfrom^.location.register,pto^.location.register)
               emit_reg_reg(op,opsize,pfrom^.location.register,pto^.location.register)
             else
             else
-              exprasmlist^.concat(new(pai386,op_ref_reg(op,opsize,
-                newreference(pfrom^.location.reference),pto^.location.register)));
+              emit_ref_reg(op,opsize,
+                newreference(pfrom^.location.reference),pto^.location.register);
 
 
             { do we need a sign extension for int64? }
             { do we need a sign extension for int64? }
             if is_64bitint(pto^.resulttype) then
             if is_64bitint(pto^.resulttype) then
               begin
               begin
-                 exprasmlist^.concat(new(pai386,op_reg_reg(A_XOR,S_L,
-                   hregister2,hregister2)));
+                 emit_reg_reg(A_XOR,S_L,
+                   hregister2,hregister2);
                  if (porddef(pto^.resulttype)^.typ=s64bit) and
                  if (porddef(pto^.resulttype)^.typ=s64bit) and
                    is_signed(pfrom^.resulttype) then
                    is_signed(pfrom^.resulttype) then
                    begin
                    begin
                       getlabel(l);
                       getlabel(l);
-                      exprasmlist^.concat(new(pai386,op_const_reg(A_TEST,S_L,
-                        $80000000,makereg32(hregister))));
+                      emit_const_reg(A_TEST,S_L,$80000000,makereg32(hregister));
                       emitjmp(C_Z,l);
                       emitjmp(C_Z,l);
-                      exprasmlist^.concat(new(pai386,op_reg(A_NOT,S_L,
-                        hregister2)));
+                      emit_reg(A_NOT,S_L,
+                        hregister2);
                       emitlab(l);
                       emitlab(l);
                    end;
                    end;
               end;
               end;
@@ -479,13 +467,13 @@ implementation
            st_shortstring :
            st_shortstring :
              begin
              begin
                inc(pfrom^.location.reference.offset);
                inc(pfrom^.location.reference.offset);
-               exprasmlist^.concat(new(pai386,op_ref_reg(A_LEA,S_L,newreference(pfrom^.location.reference),
-                 pto^.location.register)));
+               emit_ref_reg(A_LEA,S_L,newreference(pfrom^.location.reference),
+                 pto^.location.register);
              end;
              end;
            st_ansistring :
            st_ansistring :
              begin
              begin
-               exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,newreference(pfrom^.location.reference),
-                 pto^.location.register)));
+               emit_ref_reg(A_MOV,S_L,newreference(pfrom^.location.reference),
+                 pto^.location.register);
              end;
              end;
            st_longstring:
            st_longstring:
              begin
              begin
@@ -533,8 +521,8 @@ implementation
          clear_location(pto^.location);
          clear_location(pto^.location);
          pto^.location.loc:=LOC_REGISTER;
          pto^.location.loc:=LOC_REGISTER;
          pto^.location.register:=getregister32;
          pto^.location.register:=getregister32;
-         exprasmlist^.concat(new(pai386,op_ref_reg(A_LEA,S_L,newreference(pfrom^.location.reference),
-           pto^.location.register)));
+         emit_ref_reg(A_LEA,S_L,newreference(pfrom^.location.reference),
+           pto^.location.register);
       end;
       end;
 
 
 
 
@@ -555,8 +543,8 @@ implementation
             begin
             begin
               del_reference(pfrom^.location.reference);
               del_reference(pfrom^.location.reference);
               pto^.location.reference.base:=getregister32;
               pto^.location.reference.base:=getregister32;
-              exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,newreference(pfrom^.location.reference),
-                pto^.location.reference.base)));
+              emit_ref_reg(A_MOV,S_L,newreference(pfrom^.location.reference),
+                pto^.location.reference.base);
             end;
             end;
         end;
         end;
       end;
       end;
@@ -586,8 +574,8 @@ implementation
                { first get the memory for the string }
                { first get the memory for the string }
                gettempofsizereference(256,pto^.location.reference);
                gettempofsizereference(256,pto^.location.reference);
                { write the length }
                { write the length }
-               exprasmlist^.concat(new(pai386,op_const_ref(A_MOV,S_B,l,
-                 newreference(pto^.location.reference))));
+               emit_const_ref(A_MOV,S_B,l,
+                 newreference(pto^.location.reference));
                { copy to first char of string }
                { copy to first char of string }
                inc(pto^.location.reference.offset);
                inc(pto^.location.reference.offset);
                { generates the copy code      }
                { generates the copy code      }
@@ -677,15 +665,15 @@ implementation
             (pfrom^.location.loc=LOC_CREGISTER) then
             (pfrom^.location.loc=LOC_CREGISTER) then
            begin
            begin
               case porddef(pfrom^.resulttype)^.typ of
               case porddef(pfrom^.resulttype)^.typ of
-                 s8bit : exprasmlist^.concat(new(pai386,op_reg_reg(A_MOVSX,S_BL,pfrom^.location.register,R_EDI)));
-                 u8bit : exprasmlist^.concat(new(pai386,op_reg_reg(A_MOVZX,S_BL,pfrom^.location.register,R_EDI)));
-                 s16bit : exprasmlist^.concat(new(pai386,op_reg_reg(A_MOVSX,S_WL,pfrom^.location.register,R_EDI)));
-                 u16bit : exprasmlist^.concat(new(pai386,op_reg_reg(A_MOVZX,S_WL,pfrom^.location.register,R_EDI)));
+                 s8bit : emit_reg_reg(A_MOVSX,S_BL,pfrom^.location.register,R_EDI);
+                 u8bit : emit_reg_reg(A_MOVZX,S_BL,pfrom^.location.register,R_EDI);
+                 s16bit : emit_reg_reg(A_MOVSX,S_WL,pfrom^.location.register,R_EDI);
+                 u16bit : emit_reg_reg(A_MOVZX,S_WL,pfrom^.location.register,R_EDI);
                  u32bit,s32bit:
                  u32bit,s32bit:
                    hregister:=pfrom^.location.register;
                    hregister:=pfrom^.location.register;
                  u64bit,s64bit:
                  u64bit,s64bit:
                    begin
                    begin
-                      exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,pfrom^.location.registerhigh)));
+                      emit_reg(A_PUSH,S_L,pfrom^.location.registerhigh);
                       hregister:=pfrom^.location.registerlow;
                       hregister:=pfrom^.location.registerlow;
                    end;
                    end;
               end;
               end;
@@ -696,40 +684,40 @@ implementation
               r:=newreference(pfrom^.location.reference);
               r:=newreference(pfrom^.location.reference);
               case porddef(pfrom^.resulttype)^.typ of
               case porddef(pfrom^.resulttype)^.typ of
                  s8bit:
                  s8bit:
-                   exprasmlist^.concat(new(pai386,op_ref_reg(A_MOVSX,S_BL,r,R_EDI)));
+                   emit_ref_reg(A_MOVSX,S_BL,r,R_EDI);
                  u8bit:
                  u8bit:
-                   exprasmlist^.concat(new(pai386,op_ref_reg(A_MOVZX,S_BL,r,R_EDI)));
+                   emit_ref_reg(A_MOVZX,S_BL,r,R_EDI);
                  s16bit:
                  s16bit:
-                   exprasmlist^.concat(new(pai386,op_ref_reg(A_MOVSX,S_WL,r,R_EDI)));
+                   emit_ref_reg(A_MOVSX,S_WL,r,R_EDI);
                  u16bit:
                  u16bit:
-                   exprasmlist^.concat(new(pai386,op_ref_reg(A_MOVZX,S_WL,r,R_EDI)));
+                   emit_ref_reg(A_MOVZX,S_WL,r,R_EDI);
                  u32bit,s32bit:
                  u32bit,s32bit:
-                   exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,r,R_EDI)));
+                   emit_ref_reg(A_MOV,S_L,r,R_EDI);
                  u64bit,s64bit:
                  u64bit,s64bit:
                    begin
                    begin
                       inc(r^.offset,4);
                       inc(r^.offset,4);
-                      exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,r,R_EDI)));
-                      exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,R_EDI)));
+                      emit_ref_reg(A_MOV,S_L,r,R_EDI);
+                      emit_reg(A_PUSH,S_L,R_EDI);
                       r:=newreference(pfrom^.location.reference);
                       r:=newreference(pfrom^.location.reference);
-                      exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,r,R_EDI)));
+                      emit_ref_reg(A_MOV,S_L,r,R_EDI);
                    end;
                    end;
               end;
               end;
               del_reference(pfrom^.location.reference);
               del_reference(pfrom^.location.reference);
               ungetiftemp(pfrom^.location.reference);
               ungetiftemp(pfrom^.location.reference);
            end;
            end;
          { for 64 bit integers, the high dword is already pushed }
          { for 64 bit integers, the high dword is already pushed }
-         exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,hregister)));
+         emit_reg(A_PUSH,S_L,hregister);
          r:=new_reference(R_ESP,0);
          r:=new_reference(R_ESP,0);
          case porddef(pfrom^.resulttype)^.typ of
          case porddef(pfrom^.resulttype)^.typ of
            u32bit:
            u32bit:
              begin
              begin
-                exprasmlist^.concat(new(pai386,op_ref(A_FILD,S_IQ,r)));
-                exprasmlist^.concat(new(pai386,op_const_reg(A_ADD,S_L,8,R_ESP)));
+                emit_ref(A_FILD,S_IQ,r);
+                emit_const_reg(A_ADD,S_L,8,R_ESP);
              end;
              end;
            s64bit:
            s64bit:
              begin
              begin
-                exprasmlist^.concat(new(pai386,op_ref(A_FILD,S_IQ,r)));
-                exprasmlist^.concat(new(pai386,op_const_reg(A_ADD,S_L,8,R_ESP)));
+                emit_ref(A_FILD,S_IQ,r);
+                emit_const_reg(A_ADD,S_L,8,R_ESP);
              end;
              end;
            u64bit:
            u64bit:
              begin
              begin
@@ -738,12 +726,12 @@ implementation
                 { if it is 1 then we add $80000000 000000000 }
                 { if it is 1 then we add $80000000 000000000 }
                 { as double                                  }
                 { as double                                  }
                 inc(r^.offset,4);
                 inc(r^.offset,4);
-                exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,r,R_EDI)));
+                emit_ref_reg(A_MOV,S_L,r,R_EDI);
                 r:=new_reference(R_ESP,4);
                 r:=new_reference(R_ESP,4);
-                exprasmlist^.concat(new(pai386,op_const_ref(A_AND,S_L,$7fffffff,r)));
-                exprasmlist^.concat(new(pai386,op_const_reg(A_AND,S_L,$80000000,R_EDI)));
+                emit_const_ref(A_AND,S_L,$7fffffff,r);
+                emit_const_reg(A_AND,S_L,$80000000,R_EDI);
                 r:=new_reference(R_ESP,0);
                 r:=new_reference(R_ESP,0);
-                exprasmlist^.concat(new(pai386,op_ref(A_FILD,S_IQ,r)));
+                emit_ref(A_FILD,S_IQ,r);
                 getdatalabel(l1);
                 getdatalabel(l1);
                 getlabel(l2);
                 getlabel(l2);
                 emitjmp(C_Z,l2);
                 emitjmp(C_Z,l2);
@@ -753,14 +741,14 @@ implementation
                 consts^.concat(new(pai_const,init_32bit(1138753536)));
                 consts^.concat(new(pai_const,init_32bit(1138753536)));
                 r:=new_reference(R_NO,0);
                 r:=new_reference(R_NO,0);
                 r^.symbol:=l1;
                 r^.symbol:=l1;
-                exprasmlist^.concat(new(pai386,op_ref(A_FADD,S_FL,r)));
+                emit_ref(A_FADD,S_FL,r);
                 emitlab(l2);
                 emitlab(l2);
-                exprasmlist^.concat(new(pai386,op_const_reg(A_ADD,S_L,8,R_ESP)));
+                emit_const_reg(A_ADD,S_L,8,R_ESP);
              end
              end
            else
            else
              begin
              begin
-                exprasmlist^.concat(new(pai386,op_ref(A_FILD,S_IL,r)));
-                exprasmlist^.concat(new(pai386,op_reg(A_POP,S_L,R_EDI)));
+                emit_ref(A_FILD,S_IL,r);
+                emit_reg(A_POP,S_L,R_EDI);
              end;
              end;
          end;
          end;
          inc(fpuvaroffset);
          inc(fpuvaroffset);
@@ -776,30 +764,30 @@ implementation
       begin
       begin
          { real must be on fpu stack }
          { real must be on fpu stack }
          if (pfrom^.location.loc<>LOC_FPU) then
          if (pfrom^.location.loc<>LOC_FPU) then
-           exprasmlist^.concat(new(pai386,op_ref(A_FLD,S_FL,newreference(pfrom^.location.reference))));
+           emit_ref(A_FLD,S_FL,newreference(pfrom^.location.reference));
          push_int($1f3f);
          push_int($1f3f);
          push_int(65536);
          push_int(65536);
          reset_reference(ref);
          reset_reference(ref);
          ref.base:=R_ESP;
          ref.base:=R_ESP;
 
 
-         exprasmlist^.concat(new(pai386,op_ref(A_FIMUL,S_IL,newreference(ref))));
+         emit_ref(A_FIMUL,S_IL,newreference(ref));
 
 
          ref.offset:=4;
          ref.offset:=4;
-         exprasmlist^.concat(new(pai386,op_ref(A_FSTCW,S_NO,newreference(ref))));
+         emit_ref(A_FSTCW,S_NO,newreference(ref));
 
 
          ref.offset:=6;
          ref.offset:=6;
-         exprasmlist^.concat(new(pai386,op_ref(A_FLDCW,S_NO,newreference(ref))));
+         emit_ref(A_FLDCW,S_NO,newreference(ref));
 
 
          ref.offset:=0;
          ref.offset:=0;
-         exprasmlist^.concat(new(pai386,op_ref(A_FISTP,S_IL,newreference(ref))));
+         emit_ref(A_FISTP,S_IL,newreference(ref));
 
 
          ref.offset:=4;
          ref.offset:=4;
-         exprasmlist^.concat(new(pai386,op_ref(A_FLDCW,S_NO,newreference(ref))));
+         emit_ref(A_FLDCW,S_NO,newreference(ref));
 
 
          rreg:=getregister32;
          rreg:=getregister32;
-         exprasmlist^.concat(new(pai386,op_reg(A_POP,S_L,rreg)));
+         emit_reg(A_POP,S_L,rreg);
          { better than an add on all processors }
          { better than an add on all processors }
-         exprasmlist^.concat(new(pai386,op_reg(A_POP,S_L,R_EDI)));
+         emit_reg(A_POP,S_L,R_EDI);
 
 
          clear_location(pto^.location);
          clear_location(pto^.location);
          pto^.location.loc:=LOC_REGISTER;
          pto^.location.loc:=LOC_REGISTER;
@@ -845,64 +833,64 @@ implementation
               ungetregister(startreg);
               ungetregister(startreg);
               popeax:=(startreg<>R_EAX) and not (R_EAX in unused);
               popeax:=(startreg<>R_EAX) and not (R_EAX in unused);
               if popeax then
               if popeax then
-                exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,R_EAX)));
+                emit_reg(A_PUSH,S_L,R_EAX);
               { mov eax,eax is removed by emit_reg_reg }
               { mov eax,eax is removed by emit_reg_reg }
               emit_reg_reg(A_MOV,S_L,startreg,R_EAX);
               emit_reg_reg(A_MOV,S_L,startreg,R_EAX);
            end
            end
          else
          else
            begin
            begin
-              exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,newreference(
-                pfrom^.location.reference),R_EAX)));
+              emit_ref_reg(A_MOV,S_L,newreference(
+                pfrom^.location.reference),R_EAX);
               del_reference(pfrom^.location.reference);
               del_reference(pfrom^.location.reference);
               startreg:=R_NO;
               startreg:=R_NO;
            end;
            end;
 
 
          popebx:=(startreg<>R_EBX) and not (R_EBX in unused);
          popebx:=(startreg<>R_EBX) and not (R_EBX in unused);
          if popebx then
          if popebx then
-           exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,R_EBX)));
+           emit_reg(A_PUSH,S_L,R_EBX);
 
 
          popecx:=(startreg<>R_ECX) and not (R_ECX in unused);
          popecx:=(startreg<>R_ECX) and not (R_ECX in unused);
          if popecx then
          if popecx then
-           exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,R_ECX)));
+           emit_reg(A_PUSH,S_L,R_ECX);
 
 
          popedx:=(startreg<>R_EDX) and not (R_EDX in unused);
          popedx:=(startreg<>R_EDX) and not (R_EDX in unused);
          if popedx then
          if popedx then
-           exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,R_EDX)));
+           emit_reg(A_PUSH,S_L,R_EDX);
 
 
-         exprasmlist^.concat(new(pai386,op_none(A_CDQ,S_NO)));
+         emit_none(A_CDQ,S_NO);
          emit_reg_reg(A_XOR,S_L,R_EDX,R_EAX);
          emit_reg_reg(A_XOR,S_L,R_EDX,R_EAX);
          emit_reg_reg(A_MOV,S_L,R_EAX,R_EBX);
          emit_reg_reg(A_MOV,S_L,R_EAX,R_EBX);
          emit_reg_reg(A_SUB,S_L,R_EDX,R_EAX);
          emit_reg_reg(A_SUB,S_L,R_EDX,R_EAX);
          getlabel(hl);
          getlabel(hl);
          emitjmp(C_Z,hl);
          emitjmp(C_Z,hl);
-         exprasmlist^.concat(new(pai386,op_const_reg(A_RCL,S_L,1,R_EBX)));
+         emit_const_reg(A_RCL,S_L,1,R_EBX);
          emit_reg_reg(A_BSR,S_L,R_EAX,R_EDX);
          emit_reg_reg(A_BSR,S_L,R_EAX,R_EDX);
-         exprasmlist^.concat(new(pai386,op_const_reg(A_MOV,S_B,32,R_CL)));
+         emit_const_reg(A_MOV,S_B,32,R_CL);
          emit_reg_reg(A_SUB,S_B,R_DL,R_CL);
          emit_reg_reg(A_SUB,S_B,R_DL,R_CL);
          emit_reg_reg(A_SHL,S_L,R_CL,R_EAX);
          emit_reg_reg(A_SHL,S_L,R_CL,R_EAX);
-         exprasmlist^.concat(new(pai386,op_const_reg(A_ADD,S_W,1007,R_DX)));
-         exprasmlist^.concat(new(pai386,op_const_reg(A_SHL,S_W,5,R_DX)));
-         exprasmlist^.concat(new(pai386,op_const_reg_reg(A_SHLD,S_W,11,R_DX,R_BX)));
-         exprasmlist^.concat(new(pai386,op_const_reg_reg(A_SHLD,S_L,20,R_EAX,R_EBX)));
+         emit_const_reg(A_ADD,S_W,1007,R_DX);
+         emit_const_reg(A_SHL,S_W,5,R_DX);
+         emit_const_reg_reg(A_SHLD,S_W,11,R_DX,R_BX);
+         emit_const_reg_reg(A_SHLD,S_L,20,R_EAX,R_EBX);
 
 
-         exprasmlist^.concat(new(pai386,op_const_reg(A_SHL,S_L,20,R_EAX)));
+         emit_const_reg(A_SHL,S_L,20,R_EAX);
          emitlab(hl);
          emitlab(hl);
          { better than an add on all processors }
          { better than an add on all processors }
-         exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,R_EBX)));
-         exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,R_EAX)));
+         emit_reg(A_PUSH,S_L,R_EBX);
+         emit_reg(A_PUSH,S_L,R_EAX);
 
 
          reset_reference(r);
          reset_reference(r);
          r.base:=R_ESP;
          r.base:=R_ESP;
-         exprasmlist^.concat(new(pai386,op_ref(A_FLD,S_FL,newreference(r))));
-         exprasmlist^.concat(new(pai386,op_const_reg(A_ADD,S_L,8,R_ESP)));
+         emit_ref(A_FLD,S_FL,newreference(r));
+         emit_const_reg(A_ADD,S_L,8,R_ESP);
          if popedx then
          if popedx then
-           exprasmlist^.concat(new(pai386,op_reg(A_POP,S_L,R_EDX)));
+           emit_reg(A_POP,S_L,R_EDX);
          if popecx then
          if popecx then
-           exprasmlist^.concat(new(pai386,op_reg(A_POP,S_L,R_ECX)));
+           emit_reg(A_POP,S_L,R_ECX);
          if popebx then
          if popebx then
-           exprasmlist^.concat(new(pai386,op_reg(A_POP,S_L,R_EBX)));
+           emit_reg(A_POP,S_L,R_EBX);
          if popeax then
          if popeax then
-           exprasmlist^.concat(new(pai386,op_reg(A_POP,S_L,R_EAX)));
+           emit_reg(A_POP,S_L,R_EAX);
 
 
          clear_location(pto^.location);
          clear_location(pto^.location);
          pto^.location.loc:=LOC_FPU;
          pto^.location.loc:=LOC_FPU;
@@ -922,20 +910,20 @@ implementation
               del_reference(pfrom^.location.reference);
               del_reference(pfrom^.location.reference);
               hregister:=getregister32;
               hregister:=getregister32;
               case porddef(pfrom^.resulttype)^.typ of
               case porddef(pfrom^.resulttype)^.typ of
-                s8bit : exprasmlist^.concat(new(pai386,op_ref_reg(A_MOVSX,S_BL,newreference(pfrom^.location.reference),
-                  hregister)));
-                u8bit : exprasmlist^.concat(new(pai386,op_ref_reg(A_MOVZX,S_BL,newreference(pfrom^.location.reference),
-                  hregister)));
-                s16bit : exprasmlist^.concat(new(pai386,op_ref_reg(A_MOVSX,S_WL,newreference(pfrom^.location.reference),
-                  hregister)));
-                u16bit : exprasmlist^.concat(new(pai386,op_ref_reg(A_MOVZX,S_WL,newreference(pfrom^.location.reference),
-                  hregister)));
-                u32bit,s32bit : exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,newreference(pfrom^.location.reference),
-                  hregister)));
+                s8bit : emit_ref_reg(A_MOVSX,S_BL,newreference(pfrom^.location.reference),
+                  hregister);
+                u8bit : emit_ref_reg(A_MOVZX,S_BL,newreference(pfrom^.location.reference),
+                  hregister);
+                s16bit : emit_ref_reg(A_MOVSX,S_WL,newreference(pfrom^.location.reference),
+                  hregister);
+                u16bit : emit_ref_reg(A_MOVZX,S_WL,newreference(pfrom^.location.reference),
+                  hregister);
+                u32bit,s32bit : emit_ref_reg(A_MOV,S_L,newreference(pfrom^.location.reference),
+                  hregister);
                 {!!!! u32bit }
                 {!!!! u32bit }
               end;
               end;
            end;
            end;
-         exprasmlist^.concat(new(pai386,op_const_reg(A_SHL,S_L,16,hregister)));
+         emit_const_reg(A_SHL,S_L,16,hregister);
 
 
          clear_location(pto^.location);
          clear_location(pto^.location);
          pto^.location.loc:=LOC_REGISTER;
          pto^.location.loc:=LOC_REGISTER;
@@ -956,8 +944,8 @@ implementation
              pto^.location.loc:=LOC_REGISTER;
              pto^.location.loc:=LOC_REGISTER;
              pto^.location.register:=getregister32;
              pto^.location.register:=getregister32;
              del_reference(pfrom^.location.reference);
              del_reference(pfrom^.location.reference);
-             exprasmlist^.concat(new(pai386,op_ref_reg(A_LEA,S_L,
-               newreference(pfrom^.location.reference),pto^.location.register)));
+             emit_ref_reg(A_LEA,S_L,
+               newreference(pfrom^.location.reference),pto^.location.register);
           end;
           end;
       end;
       end;
 
 
@@ -1053,14 +1041,14 @@ implementation
 
 
          case pfrom^.location.loc of
          case pfrom^.location.loc of
             LOC_MEM,
             LOC_MEM,
-      LOC_REFERENCE : exprasmlist^.concat(new(pai386,op_ref_reg(op,opsize,
-                        newreference(pfrom^.location.reference),pto^.location.register)));
+      LOC_REFERENCE : emit_ref_reg(op,opsize,
+                        newreference(pfrom^.location.reference),pto^.location.register);
        LOC_REGISTER,
        LOC_REGISTER,
       LOC_CREGISTER : begin
       LOC_CREGISTER : begin
                       { remove things like movb %al,%al }
                       { remove things like movb %al,%al }
                         if pfrom^.location.register<>pto^.location.register then
                         if pfrom^.location.register<>pto^.location.register then
-                          exprasmlist^.concat(new(pai386,op_reg_reg(op,opsize,
-                            pfrom^.location.register,pto^.location.register)));
+                          emit_reg_reg(op,opsize,
+                            pfrom^.location.register,pto^.location.register);
                       end;
                       end;
           LOC_FLAGS : begin
           LOC_FLAGS : begin
                         emit_flag2reg(pfrom^.location.resflags,pto^.location.register);
                         emit_flag2reg(pfrom^.location.resflags,pto^.location.register);
@@ -1068,11 +1056,11 @@ implementation
            LOC_JUMP : begin
            LOC_JUMP : begin
                         getlabel(hlabel);
                         getlabel(hlabel);
                         emitlab(truelabel);
                         emitlab(truelabel);
-                        exprasmlist^.concat(new(pai386,op_const_reg(A_MOV,newsize,1,pto^.location.register)));
+                        emit_const_reg(A_MOV,newsize,1,pto^.location.register);
                         emitjmp(C_None,hlabel);
                         emitjmp(C_None,hlabel);
                         emitlab(falselabel);
                         emitlab(falselabel);
-                        exprasmlist^.concat(new(pai386,op_reg_reg(A_XOR,newsize,pto^.location.register,
-                          pto^.location.register)));
+                        emit_reg_reg(A_XOR,newsize,pto^.location.register,
+                          pto^.location.register);
                         emitlab(hlabel);
                         emitlab(hlabel);
                       end;
                       end;
          else
          else
@@ -1108,9 +1096,9 @@ implementation
             LOC_MEM,LOC_REFERENCE :
             LOC_MEM,LOC_REFERENCE :
               begin
               begin
                 hregister:=def_getreg(pfrom^.resulttype);
                 hregister:=def_getreg(pfrom^.resulttype);
-                exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,opsize,
-                  newreference(pfrom^.location.reference),hregister)));
-                exprasmlist^.concat(new(pai386,op_reg_reg(A_OR,opsize,hregister,hregister)));
+                emit_ref_reg(A_MOV,opsize,
+                  newreference(pfrom^.location.reference),hregister);
+                emit_reg_reg(A_OR,opsize,hregister,hregister);
                 flags:=F_NE;
                 flags:=F_NE;
               end;
               end;
             LOC_FLAGS :
             LOC_FLAGS :
@@ -1121,7 +1109,7 @@ implementation
             LOC_REGISTER,LOC_CREGISTER :
             LOC_REGISTER,LOC_CREGISTER :
               begin
               begin
                 hregister:=pfrom^.location.register;
                 hregister:=pfrom^.location.register;
-                exprasmlist^.concat(new(pai386,op_reg_reg(A_OR,opsize,hregister,hregister)));
+                emit_reg_reg(A_OR,opsize,hregister,hregister);
                 flags:=F_NE;
                 flags:=F_NE;
               end;
               end;
             else
             else
@@ -1168,28 +1156,28 @@ implementation
          getlabel(l2);
          getlabel(l2);
          case pfrom^.location.loc of
          case pfrom^.location.loc of
             LOC_CREGISTER,LOC_REGISTER:
             LOC_CREGISTER,LOC_REGISTER:
-              exprasmlist^.concat(new(pai386,op_const_reg(A_CMP,S_L,0,
-                pfrom^.location.register)));
+              emit_const_reg(A_CMP,S_L,0,
+                pfrom^.location.register);
             LOC_MEM,LOC_REFERENCE:
             LOC_MEM,LOC_REFERENCE:
               begin
               begin
-                 exprasmlist^.concat(new(pai386,op_const_ref(A_CMP,S_L,0,
-                   newreference(pfrom^.location.reference))));
+                 emit_const_ref(A_CMP,S_L,0,
+                   newreference(pfrom^.location.reference));
                   del_reference(pfrom^.location.reference);
                   del_reference(pfrom^.location.reference);
                   pto^.location.register:=getregister32;
                   pto^.location.register:=getregister32;
                end;
                end;
          end;
          end;
          emitjmp(C_Z,l1);
          emitjmp(C_Z,l1);
          if pfrom^.location.loc in [LOC_MEM,LOC_REFERENCE] then
          if pfrom^.location.loc in [LOC_MEM,LOC_REFERENCE] then
-           exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,newreference(
+           emit_ref_reg(A_MOV,S_L,newreference(
              pfrom^.location.reference),
              pfrom^.location.reference),
-             pto^.location.register)));
+             pto^.location.register);
          emitjmp(C_None,l2);
          emitjmp(C_None,l2);
          emitlab(l1);
          emitlab(l1);
          new(hr);
          new(hr);
          reset_reference(hr^);
          reset_reference(hr^);
          hr^.symbol:=newasmsymbol('FPC_EMPTYCHAR');
          hr^.symbol:=newasmsymbol('FPC_EMPTYCHAR');
-         exprasmlist^.concat(new(pai386,op_ref_reg(A_LEA,S_L,hr,
-           pto^.location.register)));
+         emit_ref_reg(A_LEA,S_L,hr,
+           pto^.location.register);
          emitlab(l2);
          emitlab(l2);
       end;
       end;
 
 
@@ -1207,7 +1195,7 @@ implementation
                 case pfrom^.location.loc of
                 case pfrom^.location.loc of
                    LOC_REGISTER,LOC_CREGISTER:
                    LOC_REGISTER,LOC_CREGISTER:
                      begin
                      begin
-                        exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,pfrom^.location.register)));
+                        emit_reg(A_PUSH,S_L,pfrom^.location.register);
                         ungetregister32(pfrom^.location.register);
                         ungetregister32(pfrom^.location.register);
                      end;
                      end;
                    LOC_REFERENCE,LOC_MEM:
                    LOC_REFERENCE,LOC_MEM:
@@ -1246,10 +1234,10 @@ implementation
 {$IfNDef regallocfix}
 {$IfNDef regallocfix}
                       ungetregister32(pfrom^.location.register);
                       ungetregister32(pfrom^.location.register);
                       pushusedregisters(pushed,$ff);
                       pushusedregisters(pushed,$ff);
-                      exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,pfrom^.location.register)));
+                      emit_reg(A_PUSH,S_L,pfrom^.location.register);
 {$Else regallocfix}
 {$Else regallocfix}
                       pushusedregisters(pushed, $ff xor ($80 shr byte(pfrom^.location.register)));
                       pushusedregisters(pushed, $ff xor ($80 shr byte(pfrom^.location.register)));
-                      exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,pfrom^.location.register)));
+                      emit_reg(A_PUSH,S_L,pfrom^.location.register);
                       ungetregister32(pfrom^.location.register);
                       ungetregister32(pfrom^.location.register);
 {$EndIf regallocfix}
 {$EndIf regallocfix}
                    end;
                    end;
@@ -1343,15 +1331,15 @@ implementation
                                r^.base:=R_EDI;
                                r^.base:=R_EDI;
                             end;
                             end;
                           { NIL must be accepted !! }
                           { NIL must be accepted !! }
-                          exprasmlist^.concat(new(pai386,op_reg_reg(A_OR,S_L,r^.base,r^.base)));
+                          emit_reg_reg(A_OR,S_L,r^.base,r^.base);
                           getlabel(nillabel);
                           getlabel(nillabel);
                           emitjmp(C_E,nillabel);
                           emitjmp(C_E,nillabel);
                           { this is one point where we need vmt_offset (PM) }
                           { this is one point where we need vmt_offset (PM) }
                           r^.offset:= pobjectdef(ppointerdef(p^.resulttype)^.definition)^.vmt_offset;
                           r^.offset:= pobjectdef(ppointerdef(p^.resulttype)^.definition)^.vmt_offset;
-                          exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,r,R_EDI)));
-                          exprasmlist^.concat(new(pai386,op_sym(A_PUSH,S_L,
-                            newasmsymbol(pobjectdef(ppointerdef(p^.resulttype)^.definition)^.vmt_mangledname))));
-                          exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,R_EDI)));
+                          emit_ref_reg(A_MOV,S_L,r,R_EDI);
+                          emit_sym(A_PUSH,S_L,
+                            newasmsymbol(pobjectdef(ppointerdef(p^.resulttype)^.definition)^.vmt_mangledname));
+                          emit_reg(A_PUSH,S_L,R_EDI);
                           emitcall('FPC_CHECK_OBJECT_EXT');
                           emitcall('FPC_CHECK_OBJECT_EXT');
                           emitlab(nillabel);
                           emitlab(nillabel);
                        end;
                        end;
@@ -1379,14 +1367,14 @@ implementation
          case p^.left^.location.loc of
          case p^.left^.location.loc of
             LOC_REGISTER,LOC_CREGISTER:
             LOC_REGISTER,LOC_CREGISTER:
               begin
               begin
-                 exprasmlist^.concat(new(pai386,op_reg(A_PUSH,
-                   S_L,p^.left^.location.register)));
+                 emit_reg(A_PUSH,
+                   S_L,p^.left^.location.register);
                  ungetregister32(p^.left^.location.register);
                  ungetregister32(p^.left^.location.register);
               end;
               end;
             LOC_MEM,LOC_REFERENCE:
             LOC_MEM,LOC_REFERENCE:
               begin
               begin
-                 exprasmlist^.concat(new(pai386,op_ref(A_PUSH,
-                   S_L,newreference(p^.left^.location.reference))));
+                 emit_ref(A_PUSH,
+                   S_L,newreference(p^.left^.location.reference));
                  del_reference(p^.left^.location.reference);
                  del_reference(p^.left^.location.reference);
               end;
               end;
             else internalerror(100);
             else internalerror(100);
@@ -1397,20 +1385,20 @@ implementation
          case p^.right^.location.loc of
          case p^.right^.location.loc of
             LOC_REGISTER,LOC_CREGISTER:
             LOC_REGISTER,LOC_CREGISTER:
               begin
               begin
-                 exprasmlist^.concat(new(pai386,op_reg(A_PUSH,
-                   S_L,p^.right^.location.register)));
+                 emit_reg(A_PUSH,
+                   S_L,p^.right^.location.register);
                  ungetregister32(p^.right^.location.register);
                  ungetregister32(p^.right^.location.register);
               end;
               end;
             LOC_MEM,LOC_REFERENCE:
             LOC_MEM,LOC_REFERENCE:
               begin
               begin
-                 exprasmlist^.concat(new(pai386,op_ref(A_PUSH,
-                   S_L,newreference(p^.right^.location.reference))));
+                 emit_ref(A_PUSH,
+                   S_L,newreference(p^.right^.location.reference));
                  del_reference(p^.right^.location.reference);
                  del_reference(p^.right^.location.reference);
               end;
               end;
             else internalerror(100);
             else internalerror(100);
          end;
          end;
          emitcall('FPC_DO_IS');
          emitcall('FPC_DO_IS');
-         exprasmlist^.concat(new(pai386,op_reg_reg(A_OR,S_B,R_AL,R_AL)));
+         emit_reg_reg(A_OR,S_B,R_AL,R_AL);
          popusedregisters(pushed);
          popusedregisters(pushed);
          maybe_loadesi;
          maybe_loadesi;
       end;
       end;
@@ -1431,11 +1419,11 @@ implementation
          { push instance to check: }
          { push instance to check: }
          case p^.left^.location.loc of
          case p^.left^.location.loc of
             LOC_REGISTER,LOC_CREGISTER:
             LOC_REGISTER,LOC_CREGISTER:
-              exprasmlist^.concat(new(pai386,op_reg(A_PUSH,
-                S_L,p^.left^.location.register)));
+              emit_reg(A_PUSH,
+                S_L,p^.left^.location.register);
             LOC_MEM,LOC_REFERENCE:
             LOC_MEM,LOC_REFERENCE:
-              exprasmlist^.concat(new(pai386,op_ref(A_PUSH,
-                S_L,newreference(p^.left^.location.reference))));
+              emit_ref(A_PUSH,
+                S_L,newreference(p^.left^.location.reference));
             else internalerror(100);
             else internalerror(100);
          end;
          end;
 
 
@@ -1447,14 +1435,14 @@ implementation
          case p^.right^.location.loc of
          case p^.right^.location.loc of
             LOC_REGISTER,LOC_CREGISTER:
             LOC_REGISTER,LOC_CREGISTER:
               begin
               begin
-                 exprasmlist^.concat(new(pai386,op_reg(A_PUSH,
-                   S_L,p^.right^.location.register)));
+                 emit_reg(A_PUSH,
+                   S_L,p^.right^.location.register);
                  ungetregister32(p^.right^.location.register);
                  ungetregister32(p^.right^.location.register);
               end;
               end;
             LOC_MEM,LOC_REFERENCE:
             LOC_MEM,LOC_REFERENCE:
               begin
               begin
-                 exprasmlist^.concat(new(pai386,op_ref(A_PUSH,
-                   S_L,newreference(p^.right^.location.reference))));
+                 emit_ref(A_PUSH,
+                   S_L,newreference(p^.right^.location.reference));
                  del_reference(p^.right^.location.reference);
                  del_reference(p^.right^.location.reference);
               end;
               end;
             else internalerror(100);
             else internalerror(100);
@@ -1469,7 +1457,10 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.84  1999-08-05 14:58:03  florian
+  Revision 1.85  1999-08-19 13:08:46  pierre
+   * emit_??? used
+
+  Revision 1.84  1999/08/05 14:58:03  florian
     * some fixes for the floating point registers
     * some fixes for the floating point registers
     * more things for the new code generator
     * more things for the new code generator
 
 

+ 75 - 72
compiler/cg386inl.pas

@@ -188,7 +188,7 @@ implementation
             new(r);
             new(r);
             reset_reference(r^);
             reset_reference(r^);
             r^.symbol:=newasmsymbol('U_'+upper(target_info.system_unit)+io[doread]);
             r^.symbol:=newasmsymbol('U_'+upper(target_info.system_unit)+io[doread]);
-            exprasmlist^.concat(new(pai386,op_ref_reg(A_LEA,S_L,r,R_EDI)))
+            emit_ref_reg(A_LEA,S_L,r,R_EDI)
           end;
           end;
 
 
         const
         const
@@ -228,7 +228,7 @@ implementation
                 { the following instructions are for "writeln;" }
                 { the following instructions are for "writeln;" }
                 loadstream;
                 loadstream;
                 { save @aktfile in temporary variable }
                 { save @aktfile in temporary variable }
-                exprasmlist^.concat(new(pai386,op_reg_ref(A_MOV,S_L,R_EDI,newreference(aktfile))));
+                emit_reg_ref(A_MOV,S_L,R_EDI,newreference(aktfile));
              end
              end
            else
            else
              begin
              begin
@@ -255,7 +255,7 @@ implementation
                           exit;
                           exit;
                        end;
                        end;
 
 
-                     exprasmlist^.concat(new(pai386,op_ref_reg(A_LEA,S_L,newreference(node^.left^.location.reference),R_EDI)));
+                     emit_ref_reg(A_LEA,S_L,newreference(node^.left^.location.reference),R_EDI);
 
 
                      { skip to the next parameter }
                      { skip to the next parameter }
                      node:=node^.right;
                      node:=node^.right;
@@ -267,7 +267,7 @@ implementation
                   end;
                   end;
 
 
                 { save @aktfile in temporary variable }
                 { save @aktfile in temporary variable }
-                exprasmlist^.concat(new(pai386,op_reg_ref(A_MOV,S_L,R_EDI,newreference(aktfile))));
+                emit_reg_ref(A_MOV,S_L,R_EDI,newreference(aktfile));
                 if doread then
                 if doread then
                 { parameter by READ gives call by reference }
                 { parameter by READ gives call by reference }
                   dummycoll.paratyp:=vs_var
                   dummycoll.paratyp:=vs_var
@@ -473,7 +473,7 @@ implementation
            if assigned(iolabel) then
            if assigned(iolabel) then
              begin
              begin
                 { registers are saved in the procedure }
                 { registers are saved in the procedure }
-                exprasmlist^.concat(new(pai386,op_sym(A_PUSH,S_L,iolabel)));
+                emit_sym(A_PUSH,S_L,iolabel);
                 emitcall('FPC_IOCHECK');
                 emitcall('FPC_IOCHECK');
              end;
              end;
          { Freeup all used temps }
          { Freeup all used temps }
@@ -721,7 +721,7 @@ implementation
                         {if we are converting to a signed number, we have to include the
                         {if we are converting to a signed number, we have to include the
                          size of the destination, so the Val function can extend the sign
                          size of the destination, so the Val function can extend the sign
                          of the result to allow proper range checking}
                          of the result to allow proper range checking}
-                        exprasmlist^.concat(new(pai386,op_const(A_PUSH,S_L,dest_para^.resulttype^.size)));
+                        emit_const(A_PUSH,S_L,dest_para^.resulttype^.size);
                         procedureprefix := 'FPC_VAL_SINT_'
                         procedureprefix := 'FPC_VAL_SINT_'
                       end
                       end
                     else
                     else
@@ -763,13 +763,13 @@ implementation
               {load the address of the code parameter}
               {load the address of the code parameter}
                secondpass(code_para^.left);
                secondpass(code_para^.left);
               {move the code to its destination}
               {move the code to its destination}
-               exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,NewReference(hr),R_EDI)));
+               emit_ref_reg(A_MOV,S_L,NewReference(hr),R_EDI);
                emit_mov_reg_loc(R_DI,code_para^.left^.location);
                emit_mov_reg_loc(R_DI,code_para^.left^.location);
                Disposetree(code_para);
                Disposetree(code_para);
              End;
              End;
 
 
           {restore the address of the result}
           {restore the address of the result}
-           exprasmlist^.concat(new(pai386,op_reg(A_POP,S_L,R_EDI)));
+           emit_reg(A_POP,S_L,R_EDI);
 
 
           {set up hr2 to a refernce with EDI as base register}
           {set up hr2 to a refernce with EDI as base register}
            reset_reference(hr2);
            reset_reference(hr2);
@@ -782,22 +782,22 @@ implementation
              orddef:
              orddef:
                Case PordDef(dest_para^.left^.resulttype)^.typ of
                Case PordDef(dest_para^.left^.resulttype)^.typ of
                  u8bit,s8bit:
                  u8bit,s8bit:
-                   exprasmlist^.concat(new(pai386,op_reg_ref(A_MOV, S_B,
-                     RegToReg8(hreg),newreference(hr2))));
+                   emit_reg_ref(A_MOV, S_B,
+                     RegToReg8(hreg),newreference(hr2));
                  u16bit,s16bit:
                  u16bit,s16bit:
-                   exprasmlist^.concat(new(pai386,op_reg_ref(A_MOV, S_W,
-                     RegToReg16(hreg),newreference(hr2))));
+                   emit_reg_ref(A_MOV, S_W,
+                     RegToReg16(hreg),newreference(hr2));
                  u32bit,s32bit:
                  u32bit,s32bit:
-                   exprasmlist^.concat(new(pai386,op_reg_ref(A_MOV, S_L,
-                     hreg,newreference(hr2))));
+                   emit_reg_ref(A_MOV, S_L,
+                     hreg,newreference(hr2));
                  u64bit,s64bit:
                  u64bit,s64bit:
                    begin
                    begin
-                      exprasmlist^.concat(new(pai386,op_reg_ref(A_MOV, S_L,
-                        hreg,newreference(hr2))));
+                      emit_reg_ref(A_MOV, S_L,
+                        hreg,newreference(hr2));
                       r:=newreference(hr2);
                       r:=newreference(hr2);
                       inc(r^.offset,4);
                       inc(r^.offset,4);
-                      exprasmlist^.concat(new(pai386,op_reg_ref(A_MOV, S_L,
-                        hreg2,r)));
+                      emit_reg_ref(A_MOV, S_L,
+                        hreg2,r);
                    end;
                    end;
                End;
                End;
            End;
            End;
@@ -863,9 +863,9 @@ implementation
                       maketojumpbool(p^.left^.left);
                       maketojumpbool(p^.left^.left);
                       emitlab(falselabel);
                       emitlab(falselabel);
                       { erroraddr }
                       { erroraddr }
-                      exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,R_EBP)));
+                      emit_reg(A_PUSH,S_L,R_EBP);
                       { lineno }
                       { lineno }
-                      exprasmlist^.concat(new(pai386,op_const(A_PUSH,S_L,aktfilepos.line)));
+                      emit_const(A_PUSH,S_L,aktfilepos.line);
                       { filename string }
                       { filename string }
                       hp:=genstringconstnode(current_module^.sourcefiles^.get_file_name(aktfilepos.fileindex));
                       hp:=genstringconstnode(current_module^.sourcefiles^.get_file_name(aktfilepos.fileindex));
                       secondpass(hp);
                       secondpass(hp);
@@ -902,13 +902,13 @@ implementation
                        begin
                        begin
                           del_reference(p^.left^.location.reference);
                           del_reference(p^.left^.location.reference);
                           p^.location.register:=reg32toreg16(getregister32);
                           p^.location.register:=reg32toreg16(getregister32);
-                          exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_W,newreference(p^.left^.location.reference),
-                            p^.location.register)));
+                          emit_ref_reg(A_MOV,S_W,newreference(p^.left^.location.reference),
+                            p^.location.register);
                        end;
                        end;
                    end
                    end
                  else p^.location.register:=p^.left^.location.register;
                  else p^.location.register:=p^.left^.location.register;
                  if p^.inlinenumber=in_hi_word then
                  if p^.inlinenumber=in_hi_word then
-                   exprasmlist^.concat(new(pai386,op_const_reg(A_SHR,S_W,8,p^.location.register)));
+                   emit_const_reg(A_SHR,S_W,8,p^.location.register);
                  p^.location.register:=reg16toreg8(p^.location.register);
                  p^.location.register:=reg16toreg8(p^.location.register);
               end;
               end;
             in_sizeof_x,
             in_sizeof_x,
@@ -918,9 +918,9 @@ implementation
                  if p^.left^.treetype=typen then
                  if p^.left^.treetype=typen then
                    begin
                    begin
                       p^.location.register:=getregister32;
                       p^.location.register:=getregister32;
-                      exprasmlist^.concat(new(pai386,op_sym_ofs_reg(A_MOV,
+                      emit_sym_ofs_reg(A_MOV,
                         S_L,newasmsymbol(pobjectdef(p^.left^.resulttype)^.vmt_mangledname),0,
                         S_L,newasmsymbol(pobjectdef(p^.left^.resulttype)^.vmt_mangledname),0,
-                        p^.location.register)));
+                        p^.location.register);
                    end
                    end
                  else
                  else
                    begin
                    begin
@@ -931,9 +931,9 @@ implementation
                       { load VMT pointer }
                       { load VMT pointer }
                       inc(p^.left^.location.reference.offset,
                       inc(p^.left^.location.reference.offset,
                         pobjectdef(p^.left^.resulttype)^.vmt_offset);
                         pobjectdef(p^.left^.resulttype)^.vmt_offset);
-                      exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
+                      emit_ref_reg(A_MOV,S_L,
                       newreference(p^.left^.location.reference),
                       newreference(p^.left^.location.reference),
-                        p^.location.register)));
+                        p^.location.register);
                    end;
                    end;
                  { in sizeof load size }
                  { in sizeof load size }
                  if p^.inlinenumber=in_sizeof_x then
                  if p^.inlinenumber=in_sizeof_x then
@@ -941,8 +941,8 @@ implementation
                       new(r);
                       new(r);
                       reset_reference(r^);
                       reset_reference(r^);
                       r^.base:=p^.location.register;
                       r^.base:=p^.location.register;
-                      exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,r,
-                        p^.location.register)));
+                      emit_ref_reg(A_MOV,S_L,r,
+                        p^.location.register);
                    end;
                    end;
               end;
               end;
             in_lo_long,
             in_lo_long,
@@ -962,13 +962,13 @@ implementation
                         begin
                         begin
                            del_reference(p^.left^.location.reference);
                            del_reference(p^.left^.location.reference);
                            p^.location.register:=getregister32;
                            p^.location.register:=getregister32;
-                           exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,newreference(p^.left^.location.reference),
-                             p^.location.register)));
+                           emit_ref_reg(A_MOV,S_L,newreference(p^.left^.location.reference),
+                             p^.location.register);
                         end;
                         end;
                    end
                    end
                  else p^.location.register:=p^.left^.location.register;
                  else p^.location.register:=p^.left^.location.register;
                  if p^.inlinenumber=in_hi_long then
                  if p^.inlinenumber=in_hi_long then
-                   exprasmlist^.concat(new(pai386,op_const_reg(A_SHR,S_L,16,p^.location.register)));
+                   emit_const_reg(A_SHR,S_L,16,p^.location.register);
                  p^.location.register:=reg32toreg16(p^.location.register);
                  p^.location.register:=reg32toreg16(p^.location.register);
               end;
               end;
             in_lo_qword,
             in_lo_qword,
@@ -994,8 +994,8 @@ implementation
                          r:=newreference(p^.left^.location.reference);
                          r:=newreference(p^.left^.location.reference);
                          if p^.inlinenumber=in_hi_qword then
                          if p^.inlinenumber=in_hi_qword then
                            inc(r^.offset,4);
                            inc(r^.offset,4);
-                         exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
-                           r,p^.location.register)));
+                         emit_ref_reg(A_MOV,S_L,
+                           r,p^.location.register);
                       end;
                       end;
                     LOC_REGISTER:
                     LOC_REGISTER:
                       begin
                       begin
@@ -1066,18 +1066,18 @@ implementation
                       else
                       else
                         begin
                         begin
                            del_reference(p^.left^.location.reference);
                            del_reference(p^.left^.location.reference);
-                           exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,opsize,newreference(p^.left^.location.reference),
-                             p^.location.register)));
+                           emit_ref_reg(A_MOV,opsize,newreference(p^.left^.location.reference),
+                             p^.location.register);
                         end;
                         end;
                    end
                    end
                  else p^.location.register:=p^.left^.location.register;
                  else p^.location.register:=p^.left^.location.register;
 
 
                  if not (cs_check_overflow in aktlocalswitches) then
                  if not (cs_check_overflow in aktlocalswitches) then
-                   exprasmlist^.concat(new(pai386,op_reg(asmop,opsize,
-                     p^.location.register)))
+                   emit_reg(asmop,opsize,
+                     p^.location.register)
                  else
                  else
-                   exprasmlist^.concat(new(pai386,op_const_reg(asmop,opsize,1,
-                     p^.location.register)));
+                   emit_const_reg(asmop,opsize,1,
+                     p^.location.register);
                  emitoverflowcheck(p);
                  emitoverflowcheck(p);
                  emitrangecheck(p,p^.resulttype);
                  emitrangecheck(p,p^.resulttype);
               end;
               end;
@@ -1124,16 +1124,16 @@ implementation
                   LOC_REFERENCE : begin
                   LOC_REFERENCE : begin
                                     del_reference(p^.left^.right^.left^.location.reference);
                                     del_reference(p^.left^.right^.left^.location.reference);
                                     hregister:=getregister32;
                                     hregister:=getregister32;
-                                    exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
-                                      newreference(p^.left^.right^.left^.location.reference),hregister)));
+                                    emit_ref_reg(A_MOV,S_L,
+                                      newreference(p^.left^.right^.left^.location.reference),hregister);
                                   end;
                                   end;
                        else
                        else
                         internalerror(10082);
                         internalerror(10082);
                        end;
                        end;
                     { insert multiply with addvalue if its >1 }
                     { insert multiply with addvalue if its >1 }
                       if addvalue>1 then
                       if addvalue>1 then
-                       exprasmlist^.concat(new(pai386,op_const_reg(A_IMUL,opsize,
-                         addvalue,hregister)));
+                       emit_const_reg(A_IMUL,opsize,
+                         addvalue,hregister);
                       addconstant:=false;
                       addconstant:=false;
                     end;
                     end;
                  end;
                  end;
@@ -1143,20 +1143,20 @@ implementation
                    if (addvalue=1) and not(cs_check_overflow in aktlocalswitches) then
                    if (addvalue=1) and not(cs_check_overflow in aktlocalswitches) then
                      begin
                      begin
                         if p^.left^.left^.location.loc=LOC_CREGISTER then
                         if p^.left^.left^.location.loc=LOC_CREGISTER then
-                          exprasmlist^.concat(new(pai386,op_reg(incdecop[p^.inlinenumber],opsize,
-                            p^.left^.left^.location.register)))
+                          emit_reg(incdecop[p^.inlinenumber],opsize,
+                            p^.left^.left^.location.register)
                         else
                         else
-                          exprasmlist^.concat(new(pai386,op_ref(incdecop[p^.inlinenumber],opsize,
-                            newreference(p^.left^.left^.location.reference))))
+                          emit_ref(incdecop[p^.inlinenumber],opsize,
+                            newreference(p^.left^.left^.location.reference))
                      end
                      end
                    else
                    else
                      begin
                      begin
                         if p^.left^.left^.location.loc=LOC_CREGISTER then
                         if p^.left^.left^.location.loc=LOC_CREGISTER then
-                          exprasmlist^.concat(new(pai386,op_const_reg(addsubop[p^.inlinenumber],opsize,
-                            addvalue,p^.left^.left^.location.register)))
+                          emit_const_reg(addsubop[p^.inlinenumber],opsize,
+                            addvalue,p^.left^.left^.location.register)
                         else
                         else
-                          exprasmlist^.concat(new(pai386,op_const_ref(addsubop[p^.inlinenumber],opsize,
-                            addvalue,newreference(p^.left^.left^.location.reference))));
+                          emit_const_ref(addsubop[p^.inlinenumber],opsize,
+                            addvalue,newreference(p^.left^.left^.location.reference));
                      end
                      end
                  end
                  end
                 else
                 else
@@ -1172,11 +1172,11 @@ implementation
                       S_W : hregister:=makereg16(hregister);
                       S_W : hregister:=makereg16(hregister);
                     end;
                     end;
                     if p^.left^.left^.location.loc=LOC_CREGISTER then
                     if p^.left^.left^.location.loc=LOC_CREGISTER then
-                      exprasmlist^.concat(new(pai386,op_reg_reg(addsubop[p^.inlinenumber],opsize,
-                        hregister,p^.left^.left^.location.register)))
+                      emit_reg_reg(addsubop[p^.inlinenumber],opsize,
+                        hregister,p^.left^.left^.location.register)
                     else
                     else
-                      exprasmlist^.concat(new(pai386,op_reg_ref(addsubop[p^.inlinenumber],opsize,
-                        hregister,newreference(p^.left^.left^.location.reference))));
+                      emit_reg_ref(addsubop[p^.inlinenumber],opsize,
+                        hregister,newreference(p^.left^.left^.location.reference));
                     case opsize of
                     case opsize of
                       S_B : hregister:=reg8toreg32(hregister);
                       S_B : hregister:=reg8toreg32(hregister);
                       S_W : hregister:=reg16toreg32(hregister);
                       S_W : hregister:=reg16toreg32(hregister);
@@ -1192,15 +1192,15 @@ implementation
                  p^.location.loc:=LOC_FLAGS;
                  p^.location.loc:=LOC_FLAGS;
                  if (p^.left^.left^.location.loc in [LOC_REGISTER,LOC_CREGISTER]) then
                  if (p^.left^.left^.location.loc in [LOC_REGISTER,LOC_CREGISTER]) then
                    begin
                    begin
-                      exprasmlist^.concat(new(pai386,op_reg_reg(A_OR,S_L,
+                      emit_reg_reg(A_OR,S_L,
                         p^.left^.left^.location.register,
                         p^.left^.left^.location.register,
-                        p^.left^.left^.location.register)));
+                        p^.left^.left^.location.register);
                       ungetregister32(p^.left^.left^.location.register);
                       ungetregister32(p^.left^.left^.location.register);
                    end
                    end
                  else
                  else
                    begin
                    begin
-                      exprasmlist^.concat(new(pai386,op_const_ref(A_CMP,S_L,0,
-                        newreference(p^.left^.left^.location.reference))));
+                      emit_const_ref(A_CMP,S_L,0,
+                        newreference(p^.left^.left^.location.reference));
                       del_reference(p^.left^.left^.location.reference);
                       del_reference(p^.left^.left^.location.reference);
                    end;
                    end;
                  p^.location.resflags:=F_NE;
                  p^.location.resflags:=F_NE;
@@ -1208,7 +1208,7 @@ implementation
              in_reset_typedfile,in_rewrite_typedfile :
              in_reset_typedfile,in_rewrite_typedfile :
                begin
                begin
                   pushusedregisters(pushed,$ff);
                   pushusedregisters(pushed,$ff);
-                  exprasmlist^.concat(new(pai386,op_const(A_PUSH,S_L,pfiledef(p^.left^.resulttype)^.typed_as^.size)));
+                  emit_const(A_PUSH,S_L,pfiledef(p^.left^.resulttype)^.typed_as^.size);
                   secondpass(p^.left);
                   secondpass(p^.left);
                   emitpushreferenceaddr(p^.left^.location.reference);
                   emitpushreferenceaddr(p^.left^.location.reference);
                   if p^.inlinenumber=in_reset_typedfile then
                   if p^.inlinenumber=in_reset_typedfile then
@@ -1254,14 +1254,14 @@ implementation
                       if (p^.left^.left^.location.loc=LOC_REFERENCE) then
                       if (p^.left^.left^.location.loc=LOC_REFERENCE) then
                         begin
                         begin
                            inc(p^.left^.left^.location.reference.offset,(p^.left^.right^.left^.value div 32)*4);
                            inc(p^.left^.left^.location.reference.offset,(p^.left^.right^.left^.value div 32)*4);
-                           exprasmlist^.concat(new(pai386,op_const_ref(asmop,S_L,
-                             l,newreference(p^.left^.left^.location.reference))));
+                           emit_const_ref(asmop,S_L,
+                             l,newreference(p^.left^.left^.location.reference));
                            del_reference(p^.left^.left^.location.reference);
                            del_reference(p^.left^.left^.location.reference);
                         end
                         end
                       else
                       else
                         { LOC_CREGISTER }
                         { LOC_CREGISTER }
-                        exprasmlist^.concat(new(pai386,op_const_reg(asmop,S_L,
-                          l,p^.left^.left^.location.register)));
+                        emit_const_reg(asmop,S_L,
+                          l,p^.left^.left^.location.register);
                    end
                    end
                  else
                  else
                    begin
                    begin
@@ -1287,15 +1287,15 @@ implementation
                                  op:=A_MOV
                                  op:=A_MOV
                                 else
                                 else
                                  op:=A_MOVZX;
                                  op:=A_MOVZX;
-                                exprasmlist^.concat(new(pai386,op_ref_reg(op,opsize,
-                                  newreference(p^.left^.right^.left^.location.reference),R_EDI)));
+                                emit_ref_reg(op,opsize,
+                                  newreference(p^.left^.right^.left^.location.reference),R_EDI);
                              end;
                              end;
                           if (p^.left^.left^.location.loc=LOC_REFERENCE) then
                           if (p^.left^.left^.location.loc=LOC_REFERENCE) then
-                            exprasmlist^.concat(new(pai386,op_reg_ref(asmop,S_L,hregister,
-                              newreference(p^.left^.left^.location.reference))))
+                            emit_reg_ref(asmop,S_L,hregister,
+                              newreference(p^.left^.left^.location.reference))
                           else
                           else
-                            exprasmlist^.concat(new(pai386,op_reg_reg(asmop,S_L,hregister,
-                              p^.left^.left^.location.register)));
+                            emit_reg_reg(asmop,S_L,hregister,
+                              p^.left^.left^.location.register);
                         end
                         end
                       else
                       else
                         begin
                         begin
@@ -1319,7 +1319,10 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.67  1999-08-10 13:21:08  pierre
+  Revision 1.68  1999-08-19 13:08:47  pierre
+   * emit_??? used
+
+  Revision 1.67  1999/08/10 13:21:08  pierre
    * fpuvaroffset not increased for f32bit float type
    * fpuvaroffset not increased for f32bit float type
 
 
   Revision 1.66  1999/08/10 12:47:53  pierre
   Revision 1.66  1999/08/10 12:47:53  pierre

+ 88 - 87
compiler/cg386ld.pas

@@ -79,16 +79,16 @@ implementation
                    if pconstsym(p^.symtableentry)^.consttype=constresourcestring then
                    if pconstsym(p^.symtableentry)^.consttype=constresourcestring then
                      begin
                      begin
                          pushusedregisters(pushed,$ff);
                          pushusedregisters(pushed,$ff);
-                         exprasmlist^.concat(new(pai386,op_const(A_PUSH,S_L,
-                         pconstsym(p^.symtableentry)^.reshash)));
+                         emit_const(A_PUSH,S_L,
+                           pconstsym(p^.symtableentry)^.reshash);
                          emitcall('FPC_GETRESOURCESTRING');
                          emitcall('FPC_GETRESOURCESTRING');
 
 
                          hregister:=getexplicitregister32(R_EAX);
                          hregister:=getexplicitregister32(R_EAX);
                          emit_reg_reg(A_MOV,S_L,R_EAX,hregister);
                          emit_reg_reg(A_MOV,S_L,R_EAX,hregister);
                          if gettempansistringreference(hr) then
                          if gettempansistringreference(hr) then
                            decrstringref(p^.resulttype,hr);
                            decrstringref(p^.resulttype,hr);
-                         exprasmlist^.concat(new(pai386,op_reg_ref(A_MOV,S_L,hregister,
-                           newreference(hr))));
+                         emit_reg_ref(A_MOV,S_L,hregister,
+                           newreference(hr));
                         ungetregister32(hregister);
                         ungetregister32(hregister);
                         popusedregisters(pushed);
                         popusedregisters(pushed);
 
 
@@ -111,7 +111,7 @@ implementation
                       begin
                       begin
                          hregister:=getregister32;
                          hregister:=getregister32;
                          p^.location.reference.symbol:=newasmsymbol(p^.symtableentry^.mangledname);
                          p^.location.reference.symbol:=newasmsymbol(p^.symtableentry^.mangledname);
-                         exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,newreference(p^.location.reference),hregister)));
+                         emit_ref_reg(A_MOV,S_L,newreference(p^.location.reference),hregister);
                          p^.location.reference.symbol:=nil;
                          p^.location.reference.symbol:=nil;
                          p^.location.reference.base:=hregister;
                          p^.location.reference.base:=hregister;
                       end
                       end
@@ -125,9 +125,9 @@ implementation
                       begin
                       begin
                          popeax:=not(R_EAX in unused);
                          popeax:=not(R_EAX in unused);
                          if popeax then
                          if popeax then
-                           exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,R_EAX)));
+                           emit_reg(A_PUSH,S_L,R_EAX);
                          p^.location.reference.symbol:=newasmsymbol(p^.symtableentry^.mangledname);
                          p^.location.reference.symbol:=newasmsymbol(p^.symtableentry^.mangledname);
-                         exprasmlist^.concat(new(pai386,op_ref(A_PUSH,S_L,newreference(p^.location.reference))));
+                         emit_ref(A_PUSH,S_L,newreference(p^.location.reference));
                          { the called procedure isn't allowed to change }
                          { the called procedure isn't allowed to change }
                          { any register except EAX                    }
                          { any register except EAX                    }
                          emitcall('FPC_RELOCATE_THREADVAR');
                          emitcall('FPC_RELOCATE_THREADVAR');
@@ -136,7 +136,7 @@ implementation
                          p^.location.reference.base:=getregister32;
                          p^.location.reference.base:=getregister32;
                          emit_reg_reg(A_MOV,S_L,R_EAX,p^.location.reference.base);
                          emit_reg_reg(A_MOV,S_L,R_EAX,p^.location.reference.base);
                          if popeax then
                          if popeax then
-                           exprasmlist^.concat(new(pai386,op_reg(A_POP,S_L,R_EAX)));
+                           emit_reg(A_POP,S_L,R_EAX);
 
 
                       end
                       end
                     { normal variable }
                     { normal variable }
@@ -183,7 +183,7 @@ implementation
                                         hp:=new_reference(procinfo.framepointer,
                                         hp:=new_reference(procinfo.framepointer,
                                           procinfo.framepointer_offset);
                                           procinfo.framepointer_offset);
 
 
-                                        exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,hp,hregister)));
+                                        emit_ref_reg(A_MOV,S_L,hp,hregister);
 
 
                                         simple_loadn:=false;
                                         simple_loadn:=false;
                                         i:=lexlevel-1;
                                         i:=lexlevel-1;
@@ -191,7 +191,7 @@ implementation
                                           begin
                                           begin
                                              { make a reference }
                                              { make a reference }
                                              hp:=new_reference(hregister,8);
                                              hp:=new_reference(hregister,8);
-                                             exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,hp,hregister)));
+                                             emit_ref_reg(A_MOV,S_L,hp,hregister);
                                              dec(i);
                                              dec(i);
                                           end;
                                           end;
                                         p^.location.reference.base:=hregister;
                                         p^.location.reference.base:=hregister;
@@ -230,7 +230,7 @@ implementation
 {                                       hp:=new_reference(procinfo.framepointer,
 {                                       hp:=new_reference(procinfo.framepointer,
                                           p^.symtable^.datasize);
                                           p^.symtable^.datasize);
 
 
-                                        exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,hp,hregister)));}
+                                        emit_ref_reg(A_MOV,S_L,hp,hregister);}
 
 
                                         if ptree(pwithsymtable(p^.symtable)^.withnode)^.islocal then
                                         if ptree(pwithsymtable(p^.symtable)^.withnode)^.islocal then
                                          begin
                                          begin
@@ -240,9 +240,9 @@ implementation
                                          begin
                                          begin
                                            hregister:=getregister32;
                                            hregister:=getregister32;
                                            p^.location.reference.base:=hregister;
                                            p^.location.reference.base:=hregister;
-                                           exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
+                                           emit_ref_reg(A_MOV,S_L,
                                              newreference(ptree(pwithsymtable(p^.symtable)^.withnode)^.withreference^),
                                              newreference(ptree(pwithsymtable(p^.symtable)^.withnode)^.withreference^),
-                                             hregister)));
+                                             hregister);
                                          end;
                                          end;
                                         inc(p^.location.reference.offset,pvarsym(p^.symtableentry)^.address);
                                         inc(p^.location.reference.offset,pvarsym(p^.symtableentry)^.address);
                                      end;
                                      end;
@@ -261,15 +261,15 @@ implementation
                                 hregister:=getregister32;
                                 hregister:=getregister32;
                               if p^.location.loc=LOC_CREGISTER then
                               if p^.location.loc=LOC_CREGISTER then
                                 begin
                                 begin
-                                   exprasmlist^.concat(new(pai386,op_reg_reg(A_MOV,S_L,
-                                     p^.location.register,hregister)));
+                                   emit_reg_reg(A_MOV,S_L,
+                                     p^.location.register,hregister);
                                    p^.location.loc:=LOC_REFERENCE;
                                    p^.location.loc:=LOC_REFERENCE;
                                 end
                                 end
                               else
                               else
                                 begin
                                 begin
-                                   exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
+                                   emit_ref_reg(A_MOV,S_L,
                                      newreference(p^.location.reference),
                                      newreference(p^.location.reference),
-                                     hregister)));
+                                     hregister);
                                 end;
                                 end;
                               reset_reference(p^.location.reference);
                               reset_reference(p^.location.reference);
                               p^.location.reference.base:=hregister;
                               p^.location.reference.base:=hregister;
@@ -300,8 +300,8 @@ implementation
                             LOC_REFERENCE:
                             LOC_REFERENCE:
                               begin
                               begin
                                  hregister:=R_EDI;
                                  hregister:=R_EDI;
-                                 exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
-                                   newreference(p^.left^.location.reference),R_EDI)));
+                                 emit_ref_reg(A_MOV,S_L,
+                                   newreference(p^.left^.location.reference),R_EDI);
                                  del_reference(p^.left^.location.reference);
                                  del_reference(p^.left^.location.reference);
                                  ungetiftemp(p^.left^.location.reference);
                                  ungetiftemp(p^.left^.location.reference);
                               end;
                               end;
@@ -312,8 +312,8 @@ implementation
                          new(hp);
                          new(hp);
                          hp^:=p^.location.reference;
                          hp^:=p^.location.reference;
                          inc(hp^.offset,4);
                          inc(hp^.offset,4);
-                         exprasmlist^.concat(new(pai386,op_reg_ref(A_MOV,S_L,
-                           hregister,hp)));
+                         emit_reg_ref(A_MOV,S_L,
+                           hregister,hp);
 
 
                          { virtual method ? }
                          { virtual method ? }
                          if (po_virtualmethod in pprocsym(p^.symtableentry)^.definition^.procoptions) then
                          if (po_virtualmethod in pprocsym(p^.symtableentry)^.definition^.procoptions) then
@@ -322,8 +322,8 @@ implementation
                               reset_reference(hp^);
                               reset_reference(hp^);
                               hp^.base:=hregister;
                               hp^.base:=hregister;
                               { load vmt pointer }
                               { load vmt pointer }
-                              exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
-                                hp,R_EDI)));
+                              emit_ref_reg(A_MOV,S_L,
+                                hp,R_EDI);
 {$IfDef regallocfix}
 {$IfDef regallocfix}
                               del_reference(hp^);
                               del_reference(hp^);
 {$EndIf regallocfix}
 {$EndIf regallocfix}
@@ -333,17 +333,17 @@ implementation
                               hp^.base:=R_EDI;
                               hp^.base:=R_EDI;
                               hp^.offset:=pprocsym(p^.symtableentry)^.definition^._class^.vmtmethodoffset(
                               hp^.offset:=pprocsym(p^.symtableentry)^.definition^._class^.vmtmethodoffset(
                                 pprocsym(p^.symtableentry)^.definition^.extnumber);
                                 pprocsym(p^.symtableentry)^.definition^.extnumber);
-                              exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
-                                hp,R_EDI)));
+                              emit_ref_reg(A_MOV,S_L,
+                                hp,R_EDI);
                               { ... and store it }
                               { ... and store it }
-                              exprasmlist^.concat(new(pai386,op_reg_ref(A_MOV,S_L,
-                                R_EDI,newreference(p^.location.reference))));
+                              emit_reg_ref(A_MOV,S_L,
+                                R_EDI,newreference(p^.location.reference));
                            end
                            end
                          else
                          else
                            begin
                            begin
                               s:=newasmsymbol(pprocsym(p^.symtableentry)^.definition^.mangledname);
                               s:=newasmsymbol(pprocsym(p^.symtableentry)^.definition^.mangledname);
-                              exprasmlist^.concat(new(pai386,op_sym_ofs_ref(A_MOV,S_L,s,0,
-                                newreference(p^.location.reference))));
+                              emit_sym_ofs_ref(A_MOV,S_L,s,0,
+                                newreference(p^.location.reference));
                            end;
                            end;
                       end
                       end
                     else
                     else
@@ -397,9 +397,9 @@ implementation
                                 begin
                                 begin
                                    del_reference(p^.left^.location.reference);
                                    del_reference(p^.left^.location.reference);
                                    hregister:=getregister32;
                                    hregister:=getregister32;
-                                   exprasmlist^.concat(new(pai386,op_ref_reg(A_LEA,S_L,newreference(
+                                   emit_ref_reg(A_LEA,S_L,newreference(
                                      p^.left^.location.reference),
                                      p^.left^.location.reference),
-                                     hregister)));
+                                     hregister);
                                    reset_reference(p^.left^.location.reference);
                                    reset_reference(p^.left^.location.reference);
                                    p^.left^.location.reference.base:=hregister;
                                    p^.left^.location.reference.base:=hregister;
                                    p^.left^.location.reference.index:=R_NO;
                                    p^.left^.location.reference.index:=R_NO;
@@ -466,8 +466,8 @@ implementation
                       if (p^.right^.treetype=stringconstn) and
                       if (p^.right^.treetype=stringconstn) and
                          (p^.right^.length=0) then
                          (p^.right^.length=0) then
                         begin
                         begin
-                          exprasmlist^.concat(new(pai386,op_const_ref(A_MOV,S_B,
-                            0,newreference(p^.left^.location.reference))));
+                          emit_const_ref(A_MOV,S_B,
+                            0,newreference(p^.left^.location.reference));
 {$IfDef regallocfix}
 {$IfDef regallocfix}
                           del_reference(p^.left^.location.reference);
                           del_reference(p^.left^.location.reference);
 {$EndIf regallocfix}
 {$EndIf regallocfix}
@@ -510,15 +510,15 @@ implementation
                               end;
                               end;
                               if loc=LOC_CREGISTER then
                               if loc=LOC_CREGISTER then
                                 begin
                                 begin
-                                  exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,opsize,
+                                  emit_ref_reg(A_MOV,opsize,
                                     newreference(p^.right^.location.reference),
                                     newreference(p^.right^.location.reference),
-                                    p^.left^.location.register)));
+                                    p^.left^.location.register);
                                   if is_64bitint(p^.right^.resulttype) then
                                   if is_64bitint(p^.right^.resulttype) then
                                     begin
                                     begin
                                        r:=newreference(p^.right^.location.reference);
                                        r:=newreference(p^.right^.location.reference);
                                        inc(r^.offset,4);
                                        inc(r^.offset,4);
-                                       exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,opsize,r,
-                                         p^.left^.location.registerhigh)));
+                                       emit_ref_reg(A_MOV,opsize,r,
+                                         p^.left^.location.registerhigh);
                                     end;
                                     end;
 {$IfDef regallocfix}
 {$IfDef regallocfix}
                                   del_reference(p^.right^.location.reference);
                                   del_reference(p^.right^.location.reference);
@@ -526,32 +526,32 @@ implementation
                                 end
                                 end
                               else
                               else
                                 begin
                                 begin
-                                  exprasmlist^.concat(new(pai386,op_const_ref(A_MOV,opsize,
+                                  emit_const_ref(A_MOV,opsize,
                                     p^.right^.location.reference.offset,
                                     p^.right^.location.reference.offset,
-                                    newreference(p^.left^.location.reference))));
+                                    newreference(p^.left^.location.reference));
                                   if is_64bitint(p^.right^.resulttype) then
                                   if is_64bitint(p^.right^.resulttype) then
                                     begin
                                     begin
                                        r:=newreference(p^.left^.location.reference);
                                        r:=newreference(p^.left^.location.reference);
                                        inc(r^.offset,4);
                                        inc(r^.offset,4);
-                                       exprasmlist^.concat(new(pai386,op_const_ref(A_MOV,opsize,
-                                         0,r)));
+                                       emit_const_ref(A_MOV,opsize,
+                                         0,r);
                                     end;
                                     end;
 {$IfDef regallocfix}
 {$IfDef regallocfix}
                                   del_reference(p^.left^.location.reference);
                                   del_reference(p^.left^.location.reference);
 {$EndIf regallocfix}
 {$EndIf regallocfix}
-                                {exprasmlist^.concat(new(pai386,op_const_loc(A_MOV,opsize,
+                                {emit_const_loc(A_MOV,opsize,
                                     p^.right^.location.reference.offset,
                                     p^.right^.location.reference.offset,
-                                    p^.left^.location)));}
+                                    p^.left^.location);}
                                 end;
                                 end;
 
 
                            end
                            end
                          else if loc=LOC_CFPUREGISTER then
                          else if loc=LOC_CFPUREGISTER then
                            begin
                            begin
                               floatloadops(pfloatdef(p^.right^.resulttype)^.typ,op,opsize);
                               floatloadops(pfloatdef(p^.right^.resulttype)^.typ,op,opsize);
-                              exprasmlist^.concat(new(pai386,op_ref(op,opsize,
-                                newreference(p^.right^.location.reference))));
-                              exprasmlist^.concat(new(pai386,op_reg(A_FSTP,S_NO,
-                                correct_fpuregister(p^.left^.location.register,fpuvaroffset+1))));
+                              emit_ref(op,opsize,
+                                newreference(p^.right^.location.reference));
+                              emit_reg(A_FSTP,S_NO,
+                                correct_fpuregister(p^.left^.location.register,fpuvaroffset+1));
                            end
                            end
                          else
                          else
                            begin
                            begin
@@ -570,16 +570,14 @@ implementation
                                    emitpushreferenceaddr(r^);
                                    emitpushreferenceaddr(r^);
 
 
                                    emitpushreferenceaddr(p^.right^.location.reference);
                                    emitpushreferenceaddr(p^.right^.location.reference);
-                                   exprasmlist^.concat(new(pai386,
-                                     op_sym(A_CALL,S_NO,newasmsymbol('FPC_ADDREF'))));
+                                   emitcall('FPC_ADDREF');
                                    { decrement destination reference counter }
                                    { decrement destination reference counter }
                                    new(r);
                                    new(r);
                                    reset_reference(r^);
                                    reset_reference(r^);
                                    r^.symbol:=p^.left^.resulttype^.get_inittable_label;
                                    r^.symbol:=p^.left^.resulttype^.get_inittable_label;
                                    emitpushreferenceaddr(r^);
                                    emitpushreferenceaddr(r^);
                                    emitpushreferenceaddr(p^.left^.location.reference);
                                    emitpushreferenceaddr(p^.left^.location.reference);
-                                   exprasmlist^.concat(new(pai386,
-                                     op_sym(A_CALL,S_NO,newasmsymbol('FPC_DECREF'))));
+                                   emitcall('FPC_DECREF');
                                 end;
                                 end;
 
 
 {$ifdef regallocfix}
 {$ifdef regallocfix}
@@ -598,11 +596,11 @@ implementation
             LOC_MMXREGISTER:
             LOC_MMXREGISTER:
               begin
               begin
                  if loc=LOC_CMMXREGISTER then
                  if loc=LOC_CMMXREGISTER then
-                   exprasmlist^.concat(new(pai386,op_reg_reg(A_MOVQ,S_NO,
-                   p^.right^.location.register,p^.left^.location.register)))
+                   emit_reg_reg(A_MOVQ,S_NO,
+                   p^.right^.location.register,p^.left^.location.register)
                  else
                  else
-                   exprasmlist^.concat(new(pai386,op_reg_ref(A_MOVQ,S_NO,
-                     p^.right^.location.register,newreference(p^.left^.location.reference))));
+                   emit_reg_ref(A_MOVQ,S_NO,
+                     p^.right^.location.register,newreference(p^.left^.location.reference));
               end;
               end;
 {$endif SUPPORT_MMX}
 {$endif SUPPORT_MMX}
             LOC_REGISTER,
             LOC_REGISTER,
@@ -616,18 +614,18 @@ implementation
                               { simplified with op_reg_loc       }
                               { simplified with op_reg_loc       }
                               if loc=LOC_CREGISTER then
                               if loc=LOC_CREGISTER then
                                 begin
                                 begin
-                                  exprasmlist^.concat(new(pai386,op_reg_reg(A_MOV,opsize,
+                                  emit_reg_reg(A_MOV,opsize,
                                     p^.right^.location.register,
                                     p^.right^.location.register,
-                                    p^.left^.location.register)));
+                                    p^.left^.location.register);
 {$IfDef regallocfix}
 {$IfDef regallocfix}
                                  ungetregister(p^.right^.location.register);
                                  ungetregister(p^.right^.location.register);
 {$EndIf regallocfix}
 {$EndIf regallocfix}
                                 end
                                 end
                               else
                               else
                                 Begin
                                 Begin
-                                  exprasmlist^.concat(new(pai386,op_reg_ref(A_MOV,opsize,
+                                  emit_reg_ref(A_MOV,opsize,
                                     p^.right^.location.register,
                                     p^.right^.location.register,
-                                    newreference(p^.left^.location.reference))));
+                                    newreference(p^.left^.location.reference));
 {$IfDef regallocfix}
 {$IfDef regallocfix}
                                   ungetregister(p^.right^.location.register);
                                   ungetregister(p^.right^.location.register);
                                   del_reference(p^.left^.location.reference);
                                   del_reference(p^.left^.location.reference);
@@ -637,20 +635,20 @@ implementation
                                 begin
                                 begin
                                    { simplified with op_reg_loc  }
                                    { simplified with op_reg_loc  }
                                    if loc=LOC_CREGISTER then
                                    if loc=LOC_CREGISTER then
-                                     exprasmlist^.concat(new(pai386,op_reg_reg(A_MOV,opsize,
+                                     emit_reg_reg(A_MOV,opsize,
                                        p^.right^.location.registerhigh,
                                        p^.right^.location.registerhigh,
-                                       p^.left^.location.registerhigh)))
+                                       p^.left^.location.registerhigh)
                                    else
                                    else
                                      begin
                                      begin
                                         r:=newreference(p^.left^.location.reference);
                                         r:=newreference(p^.left^.location.reference);
                                         inc(r^.offset,4);
                                         inc(r^.offset,4);
-                                        exprasmlist^.concat(new(pai386,op_reg_ref(A_MOV,opsize,
-                                          p^.right^.location.registerhigh,r)));
+                                        emit_reg_ref(A_MOV,opsize,
+                                          p^.right^.location.registerhigh,r);
                                      end;
                                      end;
                                 end;
                                 end;
-                              {exprasmlist^.concat(new(pai386,op_reg_loc(A_MOV,opsize,
+                              {emit_reg_loc(A_MOV,opsize,
                                   p^.right^.location.register,
                                   p^.right^.location.register,
-                                  p^.left^.location)));      }
+                                  p^.left^.location);      }
 
 
                            end;
                            end;
             LOC_FPU : begin
             LOC_FPU : begin
@@ -668,8 +666,8 @@ implementation
                               case loc of
                               case loc of
                                  LOC_CFPUREGISTER:
                                  LOC_CFPUREGISTER:
                                    begin
                                    begin
-                                      exprasmlist^.concat(new(pai386,op_reg(A_FSTP,S_NO,
-                                        correct_fpuregister(p^.left^.location.register,fpuvaroffset))));
+                                      emit_reg(A_FSTP,S_NO,
+                                        correct_fpuregister(p^.left^.location.register,fpuvaroffset));
                                       dec(fpuvaroffset);
                                       dec(fpuvaroffset);
                                    end;
                                    end;
                                  LOC_REFERENCE:
                                  LOC_REFERENCE:
@@ -690,14 +688,14 @@ implementation
                                 fputyp:=pfloatdef(p^.right^.left^.resulttype)^.typ
                                 fputyp:=pfloatdef(p^.right^.left^.resulttype)^.typ
                               else
                               else
                                 fputyp:=s32real;
                                 fputyp:=s32real;
-                              exprasmlist^.concat(new(pai386,op_reg(A_FLD,S_NO,
-                                correct_fpuregister(p^.right^.location.register,fpuvaroffset))));
+                              emit_reg(A_FLD,S_NO,
+                                correct_fpuregister(p^.right^.location.register,fpuvaroffset));
                               inc(fpuvaroffset);
                               inc(fpuvaroffset);
                               case loc of
                               case loc of
                                  LOC_CFPUREGISTER:
                                  LOC_CFPUREGISTER:
                                    begin
                                    begin
-                                      exprasmlist^.concat(new(pai386,op_reg(A_FSTP,S_NO,
-                                        correct_fpuregister(p^.right^.location.register,fpuvaroffset))));
+                                      emit_reg(A_FSTP,S_NO,
+                                        correct_fpuregister(p^.right^.location.register,fpuvaroffset));
                                       dec(fpuvaroffset);
                                       dec(fpuvaroffset);
                                    end;
                                    end;
                                  LOC_REFERENCE:
                                  LOC_REFERENCE:
@@ -710,23 +708,23 @@ implementation
                               getlabel(hlabel);
                               getlabel(hlabel);
                               emitlab(truelabel);
                               emitlab(truelabel);
                               if loc=LOC_CREGISTER then
                               if loc=LOC_CREGISTER then
-                                exprasmlist^.concat(new(pai386,op_const_reg(A_MOV,S_B,
-                                  1,p^.left^.location.register)))
+                                emit_const_reg(A_MOV,S_B,
+                                  1,p^.left^.location.register)
                               else
                               else
-                                exprasmlist^.concat(new(pai386,op_const_ref(A_MOV,S_B,
-                                  1,newreference(p^.left^.location.reference))));
-                              {exprasmlist^.concat(new(pai386,op_const_loc(A_MOV,S_B,
-                                  1,p^.left^.location)));}
+                                emit_const_ref(A_MOV,S_B,
+                                  1,newreference(p^.left^.location.reference));
+                              {emit_const_loc(A_MOV,S_B,
+                                  1,p^.left^.location);}
                               emitjmp(C_None,hlabel);
                               emitjmp(C_None,hlabel);
                               emitlab(falselabel);
                               emitlab(falselabel);
                               if loc=LOC_CREGISTER then
                               if loc=LOC_CREGISTER then
-                                exprasmlist^.concat(new(pai386,op_reg_reg(A_XOR,S_B,
+                                emit_reg_reg(A_XOR,S_B,
                                   p^.left^.location.register,
                                   p^.left^.location.register,
-                                  p^.left^.location.register)))
+                                  p^.left^.location.register)
                               else
                               else
                                 begin
                                 begin
-                                  exprasmlist^.concat(new(pai386,op_const_ref(A_MOV,S_B,
-                                    0,newreference(p^.left^.location.reference))));
+                                  emit_const_ref(A_MOV,S_B,
+                                    0,newreference(p^.left^.location.reference));
 {$IfDef regallocfix}
 {$IfDef regallocfix}
                                   del_reference(p^.left^.location.reference);
                                   del_reference(p^.left^.location.reference);
 {$EndIf regallocfix}
 {$EndIf regallocfix}
@@ -773,14 +771,14 @@ implementation
               hr_valid:=true;
               hr_valid:=true;
               hp:=new_reference(procinfo.framepointer,
               hp:=new_reference(procinfo.framepointer,
                 procinfo.framepointer_offset);
                 procinfo.framepointer_offset);
-              exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,hp,hr)));
+              emit_ref_reg(A_MOV,S_L,hp,hr);
               pp:=procinfo.parent;
               pp:=procinfo.parent;
               { walk up the stack frame }
               { walk up the stack frame }
               while pp<>pprocinfo(p^.funcretprocinfo) do
               while pp<>pprocinfo(p^.funcretprocinfo) do
                 begin
                 begin
                    hp:=new_reference(hr,
                    hp:=new_reference(hr,
                      pp^.framepointer_offset);
                      pp^.framepointer_offset);
-                   exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,hp,hr)));
+                   emit_ref_reg(A_MOV,S_L,hp,hr);
                    pp:=pp^.parent;
                    pp:=pp^.parent;
                 end;
                 end;
               p^.location.reference.base:=hr;
               p^.location.reference.base:=hr;
@@ -792,7 +790,7 @@ implementation
            begin
            begin
               if not hr_valid then
               if not hr_valid then
                 hr:=getregister32;
                 hr:=getregister32;
-              exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,newreference(p^.location.reference),hr)));
+              emit_ref_reg(A_MOV,S_L,newreference(p^.location.reference),hr);
               p^.location.reference.base:=hr;
               p^.location.reference.base:=hr;
               p^.location.reference.offset:=0;
               p^.location.reference.offset:=0;
            end;
            end;
@@ -927,8 +925,8 @@ implementation
                  else
                  else
                   begin
                   begin
                     { update href to the vtype field and write it }
                     { update href to the vtype field and write it }
-                    exprasmlist^.concat(new(pai386,op_const_ref(A_MOV,S_L,
-                      vtype,newreference(href))));
+                    emit_const_ref(A_MOV,S_L,
+                      vtype,newreference(href));
                     inc(href.offset,4);
                     inc(href.offset,4);
                     { write changing field update href to the next element }
                     { write changing field update href to the next element }
                     if vaddr then
                     if vaddr then
@@ -966,7 +964,10 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.74  1999-08-17 13:26:06  peter
+  Revision 1.75  1999-08-19 13:08:49  pierre
+   * emit_??? used
+
+  Revision 1.74  1999/08/17 13:26:06  peter
     * arrayconstructor -> arrayofconst fixed when arraycosntructor was not
     * arrayconstructor -> arrayofconst fixed when arraycosntructor was not
       variant.
       variant.
 
 

+ 127 - 124
compiler/cg386mat.pas

@@ -118,8 +118,8 @@ implementation
                      begin
                      begin
                        del_reference(p^.left^.location.reference);
                        del_reference(p^.left^.location.reference);
                        hreg1:=getregister32;
                        hreg1:=getregister32;
-                       exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,newreference(p^.left^.location.reference),
-                         hreg1)));
+                       emit_ref_reg(A_MOV,S_L,newreference(p^.left^.location.reference),
+                         hreg1);
                      end;
                      end;
                    clear_location(p^.left^.location);
                    clear_location(p^.left^.location);
                    p^.left^.location.loc:=LOC_REGISTER;
                    p^.left^.location.loc:=LOC_REGISTER;
@@ -136,25 +136,25 @@ implementation
                      "Cardinal($ffffffff) div 16" overflows! (JM)}
                      "Cardinal($ffffffff) div 16" overflows! (JM)}
                     If is_signed(p^.left^.resulttype) Then
                     If is_signed(p^.left^.resulttype) Then
                       Begin
                       Begin
-                        exprasmlist^.concat(new(pai386,op_reg_reg(A_OR,S_L,hreg1,hreg1)));
+                        emit_reg_reg(A_OR,S_L,hreg1,hreg1);
                         getlabel(hl);
                         getlabel(hl);
                         emitjmp(C_NS,hl);
                         emitjmp(C_NS,hl);
                         if power=1 then
                         if power=1 then
-                          exprasmlist^.concat(new(pai386,op_reg(A_INC,S_L,hreg1)))
+                          emit_reg(A_INC,S_L,hreg1)
                         else
                         else
-                          exprasmlist^.concat(new(pai386,op_const_reg(A_ADD,S_L,p^.right^.value-1,hreg1)));
+                          emit_const_reg(A_ADD,S_L,p^.right^.value-1,hreg1);
                         emitlab(hl);
                         emitlab(hl);
-                        exprasmlist^.concat(new(pai386,op_const_reg(A_SAR,S_L,power,hreg1)));
+                        emit_const_reg(A_SAR,S_L,power,hreg1);
                       End
                       End
                     Else
                     Else
-                      exprasmlist^.concat(new(pai386,op_const_reg(A_SHR,S_L,power,hreg1)));
+                      emit_const_reg(A_SHR,S_L,power,hreg1);
                   End
                   End
                 else
                 else
                   if (p^.treetype=modn) and (p^.right^.treetype=ordconstn) and
                   if (p^.treetype=modn) and (p^.right^.treetype=ordconstn) and
                     ispowerof2(p^.right^.value,power) and Not(is_signed(p^.left^.resulttype)) Then
                     ispowerof2(p^.right^.value,power) and Not(is_signed(p^.left^.resulttype)) Then
                    {is there a similar trick for MOD'ing signed numbers? (JM)}
                    {is there a similar trick for MOD'ing signed numbers? (JM)}
                    Begin
                    Begin
-                     exprasmlist^.concat(new(pai386,op_const_reg(A_AND,S_L,p^.right^.value-1,hreg1)));
+                     emit_const_reg(A_AND,S_L,p^.right^.value-1,hreg1);
                      andmod := true;
                      andmod := true;
                    End
                    End
                 else
                 else
@@ -168,7 +168,7 @@ implementation
                      begin
                      begin
                        del_reference(p^.right^.location.reference);
                        del_reference(p^.right^.location.reference);
                        p^.left^.location.loc:=LOC_REGISTER;
                        p^.left^.location.loc:=LOC_REGISTER;
-                       exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,newreference(p^.right^.location.reference),R_EDI)));
+                       emit_ref_reg(A_MOV,S_L,newreference(p^.right^.location.reference),R_EDI);
                      end
                      end
                    else
                    else
                      begin
                      begin
@@ -181,7 +181,7 @@ implementation
                      begin
                      begin
                        if not(R_EAX in unused) then
                        if not(R_EAX in unused) then
                           begin
                           begin
-                             exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,R_EAX)));
+                             emit_reg(A_PUSH,S_L,R_EAX);
                              popeax:=true;
                              popeax:=true;
                           end;
                           end;
                        emit_reg_reg(A_MOV,S_L,R_EDX,R_EAX);
                        emit_reg_reg(A_MOV,S_L,R_EDX,R_EAX);
@@ -190,14 +190,14 @@ implementation
                      begin
                      begin
                         if not(R_EDX in unused) then
                         if not(R_EDX in unused) then
                           begin
                           begin
-                             exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,R_EDX)));
+                             emit_reg(A_PUSH,S_L,R_EDX);
                              popedx:=true;
                              popedx:=true;
                           end;
                           end;
                         if hreg1<>R_EAX then
                         if hreg1<>R_EAX then
                           begin
                           begin
                              if not(R_EAX in unused) then
                              if not(R_EAX in unused) then
                                begin
                                begin
-                                  exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,R_EAX)));
+                                  emit_reg(A_PUSH,S_L,R_EAX);
                                   popeax:=true;
                                   popeax:=true;
                                end;
                                end;
                              emit_reg_reg(A_MOV,S_L,hreg1,R_EAX);
                              emit_reg_reg(A_MOV,S_L,hreg1,R_EAX);
@@ -205,15 +205,15 @@ implementation
                      end;
                      end;
                    { sign extension depends on the left type }
                    { sign extension depends on the left type }
                    if porddef(p^.left^.resulttype)^.typ=u32bit then
                    if porddef(p^.left^.resulttype)^.typ=u32bit then
-                      exprasmlist^.concat(new(pai386,op_reg_reg(A_XOR,S_L,R_EDX,R_EDX)))
+                      emit_reg_reg(A_XOR,S_L,R_EDX,R_EDX)
                    else
                    else
-                      exprasmlist^.concat(new(pai386,op_none(A_CDQ,S_NO)));
+                      emit_none(A_CDQ,S_NO);
 
 
                    { division depends on the right type }
                    { division depends on the right type }
                    if porddef(p^.right^.resulttype)^.typ=u32bit then
                    if porddef(p^.right^.resulttype)^.typ=u32bit then
-                     exprasmlist^.concat(new(pai386,op_reg(A_DIV,S_L,R_EDI)))
+                     emit_reg(A_DIV,S_L,R_EDI)
                    else
                    else
-                     exprasmlist^.concat(new(pai386,op_reg(A_IDIV,S_L,R_EDI)));
+                     emit_reg(A_IDIV,S_L,R_EDI);
                    if p^.treetype=divn then
                    if p^.treetype=divn then
                      begin
                      begin
                         { if result register is busy then copy }
                         { if result register is busy then copy }
@@ -254,9 +254,9 @@ implementation
                              emit_reg_reg(A_MOV,S_L,R_EDX,hreg1);;
                              emit_reg_reg(A_MOV,S_L,R_EDX,hreg1);;
                          End;
                          End;
                    if popeax then
                    if popeax then
-                     exprasmlist^.concat(new(pai386,op_reg(A_POP,S_L,R_EAX)));
+                     emit_reg(A_POP,S_L,R_EAX);
                    if popedx then
                    if popedx then
-                     exprasmlist^.concat(new(pai386,op_reg(A_POP,S_L,R_EDX)));
+                     emit_reg(A_POP,S_L,R_EDX);
                   end;
                   end;
               If not(andmod or shrdiv) then
               If not(andmod or shrdiv) then
                {andmod and shrdiv only use hreg1 (which is already in usedinproc,
                {andmod and shrdiv only use hreg1 (which is already in usedinproc,
@@ -314,12 +314,12 @@ implementation
                         del_reference(p^.left^.location.reference);
                         del_reference(p^.left^.location.reference);
                         hregisterlow:=getregister32;
                         hregisterlow:=getregister32;
                         hregisterhigh:=getregister32;
                         hregisterhigh:=getregister32;
-                        exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,newreference(p^.left^.location.reference),
-                          hregisterlow)));
+                        emit_ref_reg(A_MOV,S_L,newreference(p^.left^.location.reference),
+                          hregisterlow);
                         hr:=newreference(p^.left^.location.reference);
                         hr:=newreference(p^.left^.location.reference);
                         inc(hr^.offset,4);
                         inc(hr^.offset,4);
-                        exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,hr,
-                          hregisterhigh)));
+                        emit_ref_reg(A_MOV,S_L,hr,
+                          hregisterhigh);
                      end;
                      end;
                 end
                 end
               else
               else
@@ -336,17 +336,17 @@ implementation
                      begin
                      begin
                         if p^.treetype=shln then
                         if p^.treetype=shln then
                           begin
                           begin
-                             exprasmlist^.concat(new(pai386,op_reg_reg(A_XOR,S_L,hregisterhigh,
-                               hregisterhigh)));
-                             exprasmlist^.concat(new(pai386,op_const_reg(A_SHL,S_L,p^.right^.value and 31,
-                               hregisterlow)));
+                             emit_reg_reg(A_XOR,S_L,hregisterhigh,
+                               hregisterhigh);
+                             emit_const_reg(A_SHL,S_L,p^.right^.value and 31,
+                               hregisterlow);
                           end
                           end
                         else
                         else
                           begin
                           begin
-                             exprasmlist^.concat(new(pai386,op_reg_reg(A_XOR,S_L,hregisterlow,
-                               hregisterlow)));
-                             exprasmlist^.concat(new(pai386,op_const_reg(A_SHR,S_L,p^.right^.value and 31,
-                               hregisterhigh)));
+                             emit_reg_reg(A_XOR,S_L,hregisterlow,
+                               hregisterlow);
+                             emit_const_reg(A_SHR,S_L,p^.right^.value and 31,
+                               hregisterhigh);
                           end;
                           end;
                         p^.location.registerhigh:=hregisterlow;
                         p^.location.registerhigh:=hregisterlow;
                         p^.location.registerlow:=hregisterhigh;
                         p^.location.registerlow:=hregisterhigh;
@@ -355,17 +355,17 @@ implementation
                      begin
                      begin
                         if p^.treetype=shln then
                         if p^.treetype=shln then
                           begin
                           begin
-                             exprasmlist^.concat(new(pai386,op_const_reg_reg(A_SHLD,S_L,p^.right^.value and 31,
-                               hregisterlow,hregisterhigh)));
-                             exprasmlist^.concat(new(pai386,op_const_reg(A_SHL,S_L,p^.right^.value and 31,
-                               hregisterlow)));
+                             emit_const_reg_reg(A_SHLD,S_L,p^.right^.value and 31,
+                               hregisterlow,hregisterhigh);
+                             emit_const_reg(A_SHL,S_L,p^.right^.value and 31,
+                               hregisterlow);
                           end
                           end
                         else
                         else
                           begin
                           begin
-                             exprasmlist^.concat(new(pai386,op_const_reg_reg(A_SHRD,S_L,p^.right^.value and 31,
-                               hregisterhigh,hregisterlow)));
-                             exprasmlist^.concat(new(pai386,op_const_reg(A_SHR,S_L,p^.right^.value and 31,
-                               hregisterhigh)));
+                             emit_const_reg_reg(A_SHRD,S_L,p^.right^.value and 31,
+                               hregisterhigh,hregisterlow);
+                             emit_const_reg(A_SHR,S_L,p^.right^.value and 31,
+                               hregisterhigh);
                           end;
                           end;
                         p^.location.registerlow:=hregisterlow;
                         p^.location.registerlow:=hregisterlow;
                         p^.location.registerhigh:=hregisterhigh;
                         p^.location.registerhigh:=hregisterhigh;
@@ -387,8 +387,8 @@ implementation
                           begin
                           begin
                              del_reference(p^.right^.location.reference);
                              del_reference(p^.right^.location.reference);
                              hregister2:=getexplicitregister32(R_ECX);
                              hregister2:=getexplicitregister32(R_ECX);
-                             exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,newreference(p^.right^.location.reference),
-                               hregister2)));
+                             emit_ref_reg(A_MOV,S_L,newreference(p^.right^.location.reference),
+                               hregister2);
                           end;
                           end;
                      end
                      end
                    else
                    else
@@ -421,7 +421,7 @@ implementation
                         if not (R_ECX in unused) then
                         if not (R_ECX in unused) then
                          begin
                          begin
                            popecx:=true;
                            popecx:=true;
-                           exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,R_ECX)));
+                           emit_reg(A_PUSH,S_L,R_ECX);
                          end;
                          end;
                         emit_reg_reg(A_MOV,S_L,hregister2,R_ECX);
                         emit_reg_reg(A_MOV,S_L,hregister2,R_ECX);
                      end;
                      end;
@@ -435,25 +435,25 @@ implementation
                         getlabel(l1);
                         getlabel(l1);
                         getlabel(l2);
                         getlabel(l2);
                         getlabel(l3);
                         getlabel(l3);
-                        exprasmlist^.concat(new(pai386,op_const_reg(A_CMP,S_L,64,R_ECX)));
+                        emit_const_reg(A_CMP,S_L,64,R_ECX);
                         emitjmp(C_L,l1);
                         emitjmp(C_L,l1);
-                        exprasmlist^.concat(new(pai386,op_reg_reg(A_XOR,S_L,hregisterlow,hregisterlow)));
-                        exprasmlist^.concat(new(pai386,op_reg_reg(A_XOR,S_L,hregisterhigh,hregisterhigh)));
+                        emit_reg_reg(A_XOR,S_L,hregisterlow,hregisterlow);
+                        emit_reg_reg(A_XOR,S_L,hregisterhigh,hregisterhigh);
                         emitjmp(C_None,l3);
                         emitjmp(C_None,l3);
                         emitlab(l1);
                         emitlab(l1);
-                        exprasmlist^.concat(new(pai386,op_const_reg(A_CMP,S_L,32,R_ECX)));
+                        emit_const_reg(A_CMP,S_L,32,R_ECX);
                         emitjmp(C_L,l2);
                         emitjmp(C_L,l2);
-                        exprasmlist^.concat(new(pai386,op_const_reg(A_SUB,S_L,32,R_ECX)));
-                        exprasmlist^.concat(new(pai386,op_reg_reg(A_SHL,S_L,R_CL,
-                          hregisterlow)));
-                        exprasmlist^.concat(new(pai386,op_reg_reg(A_MOV,S_L,hregisterlow,hregisterhigh)));
-                        exprasmlist^.concat(new(pai386,op_reg_reg(A_XOR,S_L,hregisterlow,hregisterlow)));
+                        emit_const_reg(A_SUB,S_L,32,R_ECX);
+                        emit_reg_reg(A_SHL,S_L,R_CL,
+                          hregisterlow);
+                        emit_reg_reg(A_MOV,S_L,hregisterlow,hregisterhigh);
+                        emit_reg_reg(A_XOR,S_L,hregisterlow,hregisterlow);
                         emitjmp(C_None,l3);
                         emitjmp(C_None,l3);
                         emitlab(l2);
                         emitlab(l2);
-                        exprasmlist^.concat(new(pai386,op_reg_reg_reg(A_SHLD,S_L,R_CL,
-                          hregisterlow,hregisterhigh)));
-                        exprasmlist^.concat(new(pai386,op_reg_reg(A_SHL,S_L,R_CL,
-                          hregisterlow)));
+                        emit_reg_reg_reg(A_SHLD,S_L,R_CL,
+                          hregisterlow,hregisterhigh);
+                        emit_reg_reg(A_SHL,S_L,R_CL,
+                          hregisterlow);
                         emitlab(l3);
                         emitlab(l3);
                      end
                      end
                    else
                    else
@@ -461,32 +461,32 @@ implementation
                         getlabel(l1);
                         getlabel(l1);
                         getlabel(l2);
                         getlabel(l2);
                         getlabel(l3);
                         getlabel(l3);
-                        exprasmlist^.concat(new(pai386,op_const_reg(A_CMP,S_L,64,R_ECX)));
+                        emit_const_reg(A_CMP,S_L,64,R_ECX);
                         emitjmp(C_L,l1);
                         emitjmp(C_L,l1);
-                        exprasmlist^.concat(new(pai386,op_reg_reg(A_XOR,S_L,hregisterlow,hregisterlow)));
-                        exprasmlist^.concat(new(pai386,op_reg_reg(A_XOR,S_L,hregisterhigh,hregisterhigh)));
+                        emit_reg_reg(A_XOR,S_L,hregisterlow,hregisterlow);
+                        emit_reg_reg(A_XOR,S_L,hregisterhigh,hregisterhigh);
                         emitjmp(C_None,l3);
                         emitjmp(C_None,l3);
                         emitlab(l1);
                         emitlab(l1);
-                        exprasmlist^.concat(new(pai386,op_const_reg(A_CMP,S_L,32,R_ECX)));
+                        emit_const_reg(A_CMP,S_L,32,R_ECX);
                         emitjmp(C_L,l2);
                         emitjmp(C_L,l2);
-                        exprasmlist^.concat(new(pai386,op_const_reg(A_SUB,S_L,32,R_ECX)));
-                        exprasmlist^.concat(new(pai386,op_reg_reg(A_SHR,S_L,R_CL,
-                          hregisterhigh)));
-                        exprasmlist^.concat(new(pai386,op_reg_reg(A_MOV,S_L,hregisterhigh,hregisterlow)));
-                        exprasmlist^.concat(new(pai386,op_reg_reg(A_XOR,S_L,hregisterhigh,hregisterhigh)));
+                        emit_const_reg(A_SUB,S_L,32,R_ECX);
+                        emit_reg_reg(A_SHR,S_L,R_CL,
+                          hregisterhigh);
+                        emit_reg_reg(A_MOV,S_L,hregisterhigh,hregisterlow);
+                        emit_reg_reg(A_XOR,S_L,hregisterhigh,hregisterhigh);
                         emitjmp(C_None,l3);
                         emitjmp(C_None,l3);
                         emitlab(l2);
                         emitlab(l2);
-                        exprasmlist^.concat(new(pai386,op_reg_reg_reg(A_SHRD,S_L,R_CL,
-                          hregisterhigh,hregisterlow)));
-                        exprasmlist^.concat(new(pai386,op_reg_reg(A_SHR,S_L,R_CL,
-                          hregisterhigh)));
+                        emit_reg_reg_reg(A_SHRD,S_L,R_CL,
+                          hregisterhigh,hregisterlow);
+                        emit_reg_reg(A_SHR,S_L,R_CL,
+                          hregisterhigh);
                         emitlab(l3);
                         emitlab(l3);
 
 
                      end;
                      end;
 
 
                    { maybe put ECX back }
                    { maybe put ECX back }
                    if popecx then
                    if popecx then
-                     exprasmlist^.concat(new(pai386,op_reg(A_POP,S_L,R_ECX)));
+                     emit_reg(A_POP,S_L,R_ECX);
 
 
                    p^.location.registerlow:=hregisterlow;
                    p^.location.registerlow:=hregisterlow;
                    p^.location.registerhigh:=hregisterhigh;
                    p^.location.registerhigh:=hregisterhigh;
@@ -507,8 +507,8 @@ implementation
                      begin
                      begin
                         del_reference(p^.left^.location.reference);
                         del_reference(p^.left^.location.reference);
                         hregister1:=getregister32;
                         hregister1:=getregister32;
-                        exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,newreference(p^.left^.location.reference),
-                          hregister1)));
+                        emit_ref_reg(A_MOV,S_L,newreference(p^.left^.location.reference),
+                          hregister1);
                      end;
                      end;
                 end
                 end
               else
               else
@@ -526,12 +526,12 @@ implementation
                    { l shl 32 should 0 imho, but neither TP nor Delphi do it in this way (FK)
                    { l shl 32 should 0 imho, but neither TP nor Delphi do it in this way (FK)
                    if p^.right^.value<=31 then
                    if p^.right^.value<=31 then
                    }
                    }
-                     exprasmlist^.concat(new(pai386,op_const_reg(op,S_L,p^.right^.value and 31,
-                       hregister1)));
+                     emit_const_reg(op,S_L,p^.right^.value and 31,
+                       hregister1);
                    {
                    {
                    else
                    else
-                     exprasmlist^.concat(new(pai386,op_reg_reg(A_XOR,S_L,hregister1,
-                       hregister1)));
+                     emit_reg_reg(A_XOR,S_L,hregister1,
+                       hregister1);
                    }
                    }
                    p^.location.loc:=LOC_REGISTER;
                    p^.location.loc:=LOC_REGISTER;
                    p^.location.register:=hregister1;
                    p^.location.register:=hregister1;
@@ -551,8 +551,8 @@ implementation
                           begin
                           begin
                              del_reference(p^.right^.location.reference);
                              del_reference(p^.right^.location.reference);
                              hregister2:=getexplicitregister32(R_ECX);
                              hregister2:=getexplicitregister32(R_ECX);
-                             exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,newreference(p^.right^.location.reference),
-                               hregister2)));
+                             emit_ref_reg(A_MOV,S_L,newreference(p^.right^.location.reference),
+                               hregister2);
                           end;
                           end;
                      end
                      end
                    else
                    else
@@ -576,7 +576,7 @@ implementation
                         if not (R_ECX in unused) then
                         if not (R_ECX in unused) then
                          begin
                          begin
                            popecx:=true;
                            popecx:=true;
-                           exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,R_ECX)));
+                           emit_reg(A_PUSH,S_L,R_ECX);
                          end;
                          end;
                         emit_reg_reg(A_MOV,S_L,hregister2,R_ECX);
                         emit_reg_reg(A_MOV,S_L,hregister2,R_ECX);
                      end;
                      end;
@@ -585,7 +585,7 @@ implementation
                    emit_reg_reg(op,S_L,R_CL,hregister1);
                    emit_reg_reg(op,S_L,R_CL,hregister1);
                    { maybe ECX back }
                    { maybe ECX back }
                    if popecx then
                    if popecx then
-                     exprasmlist^.concat(new(pai386,op_reg(A_POP,S_L,R_ECX)));
+                     emit_reg(A_POP,S_L,R_ECX);
                    p^.location.register:=hregister1;
                    p^.location.register:=hregister1;
                 end;
                 end;
            end;
            end;
@@ -655,17 +655,17 @@ implementation
                      del_reference(p^.left^.location.reference);
                      del_reference(p^.left^.location.reference);
                      p^.location.registerlow:=getregister32;
                      p^.location.registerlow:=getregister32;
                      p^.location.registerhigh:=getregister32;
                      p^.location.registerhigh:=getregister32;
-                     exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
-                       newreference(p^.left^.location.reference),p^.location.registerlow)));
+                     emit_ref_reg(A_MOV,S_L,
+                       newreference(p^.left^.location.reference),p^.location.registerlow);
                      hr:=newreference(p^.left^.location.reference);
                      hr:=newreference(p^.left^.location.reference);
                      inc(hr^.offset,4);
                      inc(hr^.offset,4);
-                     exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
-                       hr,p^.location.registerhigh)));
+                     emit_ref_reg(A_MOV,S_L,
+                       hr,p^.location.registerhigh);
                   end;
                   end;
               end;
               end;
-            exprasmlist^.concat(new(pai386,op_reg(A_NEG,S_L,p^.location.registerlow)));
-            exprasmlist^.concat(new(pai386,op_const_reg(A_ADC,S_L,0,p^.location.registerhigh)));
-            exprasmlist^.concat(new(pai386,op_reg(A_NEG,S_L,p^.location.registerhigh)));
+            emit_reg(A_NEG,S_L,p^.location.registerlow);
+            emit_const_reg(A_ADC,S_L,0,p^.location.registerhigh);
+            emit_reg(A_NEG,S_L,p^.location.registerhigh);
            end
            end
          else
          else
            begin
            begin
@@ -675,14 +675,14 @@ implementation
                  LOC_REGISTER:
                  LOC_REGISTER:
                    begin
                    begin
                       p^.location.register:=p^.left^.location.register;
                       p^.location.register:=p^.left^.location.register;
-                      exprasmlist^.concat(new(pai386,op_reg(A_NEG,S_L,p^.location.register)));
+                      emit_reg(A_NEG,S_L,p^.location.register);
                    end;
                    end;
                  LOC_CREGISTER:
                  LOC_CREGISTER:
                    begin
                    begin
                       p^.location.register:=getregister32;
                       p^.location.register:=getregister32;
                       emit_reg_reg(A_MOV,S_L,p^.location.register,
                       emit_reg_reg(A_MOV,S_L,p^.location.register,
                         p^.location.register);
                         p^.location.register);
-                      exprasmlist^.concat(new(pai386,op_reg(A_NEG,S_L,p^.location.register)));
+                      emit_reg(A_NEG,S_L,p^.location.register);
                    end;
                    end;
 {$ifdef SUPPORT_MMX}
 {$ifdef SUPPORT_MMX}
                  LOC_MMXREGISTER:
                  LOC_MMXREGISTER:
@@ -709,40 +709,40 @@ implementation
                                         p^.location.loc:=LOC_FPU;
                                         p^.location.loc:=LOC_FPU;
                                         floatload(pfloatdef(p^.left^.resulttype)^.typ,
                                         floatload(pfloatdef(p^.left^.resulttype)^.typ,
                                           p^.left^.location.reference);
                                           p^.left^.location.reference);
-                                        exprasmlist^.concat(new(pai386,op_none(A_FCHS,S_NO)));
+                                        emit_none(A_FCHS,S_NO);
                                      end
                                      end
 {$ifdef SUPPORT_MMX}
 {$ifdef SUPPORT_MMX}
                                    else if (cs_mmx in aktlocalswitches) and is_mmx_able_array(p^.left^.resulttype) then
                                    else if (cs_mmx in aktlocalswitches) and is_mmx_able_array(p^.left^.resulttype) then
                                      begin
                                      begin
                                         p^.location.register:=getregistermmx;
                                         p^.location.register:=getregistermmx;
                                         emit_reg_reg(A_PXOR,S_NO,R_MM7,R_MM7);
                                         emit_reg_reg(A_PXOR,S_NO,R_MM7,R_MM7);
-                                        exprasmlist^.concat(new(pai386,op_ref_reg(A_MOVQ,S_NO,
+                                        emit_ref_reg(A_MOVQ,S_NO,
                                           newreference(p^.left^.location.reference),
                                           newreference(p^.left^.location.reference),
-                                          p^.location.register)));
+                                          p^.location.register);
                                         do_mmx_neg;
                                         do_mmx_neg;
                                      end
                                      end
 {$endif SUPPORT_MMX}
 {$endif SUPPORT_MMX}
                                    else
                                    else
                                      begin
                                      begin
                                         p^.location.register:=getregister32;
                                         p^.location.register:=getregister32;
-                                        exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
+                                        emit_ref_reg(A_MOV,S_L,
                                           newreference(p^.left^.location.reference),
                                           newreference(p^.left^.location.reference),
-                                          p^.location.register)));
-                                        exprasmlist^.concat(new(pai386,op_reg(A_NEG,S_L,p^.location.register)));
+                                          p^.location.register);
+                                        emit_reg(A_NEG,S_L,p^.location.register);
                                      end;
                                      end;
                                 end;
                                 end;
                  LOC_FPU:
                  LOC_FPU:
                    begin
                    begin
                       p^.location.loc:=LOC_FPU;
                       p^.location.loc:=LOC_FPU;
-                      exprasmlist^.concat(new(pai386,op_none(A_FCHS,S_NO)));
+                      emit_none(A_FCHS,S_NO);
                    end;
                    end;
                  LOC_CFPUREGISTER:
                  LOC_CFPUREGISTER:
                    begin
                    begin
-                      exprasmlist^.concat(new(pai386,op_reg(A_FLD,S_NO,
-                        correct_fpuregister(p^.right^.location.register,fpuvaroffset))));
+                      emit_reg(A_FLD,S_NO,
+                        correct_fpuregister(p^.right^.location.register,fpuvaroffset));
                       inc(fpuvaroffset);
                       inc(fpuvaroffset);
                       p^.location.loc:=LOC_FPU;
                       p^.location.loc:=LOC_FPU;
-                      exprasmlist^.concat(new(pai386,op_none(A_FCHS,S_NO)));
+                      emit_none(A_FCHS,S_NO);
                    end;
                    end;
               end;
               end;
            end;
            end;
@@ -795,11 +795,11 @@ implementation
                 begin
                 begin
                   secondpass(p^.left);
                   secondpass(p^.left);
                   {p^.location.register:=p^.left^.location.register;
                   {p^.location.register:=p^.left^.location.register;
-                  exprasmlist^.concat(new(pai386,op_const_reg(A_XOR,opsize,1,p^.location.register)));}
+                  emit_const_reg(A_XOR,opsize,1,p^.location.register);}
                   p^.location.loc:=LOC_FLAGS;
                   p^.location.loc:=LOC_FLAGS;
                   p^.location.resflags:=F_E;
                   p^.location.resflags:=F_E;
-                  exprasmlist^.concat(new(pai386,op_reg_reg(A_TEST,opsize,
-                    p^.left^.location.register,p^.left^.location.register)));
+                  emit_reg_reg(A_TEST,opsize,
+                    p^.left^.location.register,p^.left^.location.register);
                   ungetregister(p^.left^.location.register);
                   ungetregister(p^.left^.location.register);
                 end;
                 end;
               LOC_CREGISTER :
               LOC_CREGISTER :
@@ -809,7 +809,7 @@ implementation
                   p^.location.loc:=LOC_REGISTER;
                   p^.location.loc:=LOC_REGISTER;
                   p^.location.register:=def_getreg(p^.resulttype);
                   p^.location.register:=def_getreg(p^.resulttype);
                   emit_reg_reg(A_MOV,opsize,p^.left^.location.register,p^.location.register);
                   emit_reg_reg(A_MOV,opsize,p^.left^.location.register,p^.location.register);
-                  exprasmlist^.concat(new(pai386,op_reg_reg(A_TEST,opsize,p^.location.register,p^.location.register)));
+                  emit_reg_reg(A_TEST,opsize,p^.location.register,p^.location.register);
                   ungetregister(p^.location.register);
                   ungetregister(p^.location.register);
                   p^.location.loc:=LOC_FLAGS;
                   p^.location.loc:=LOC_FLAGS;
                   p^.location.resflags:=F_E;
                   p^.location.resflags:=F_E;
@@ -823,9 +823,9 @@ implementation
                   del_reference(p^.left^.location.reference);
                   del_reference(p^.left^.location.reference);
                   { this was placed before del_ref => internaalerror(10) }
                   { this was placed before del_ref => internaalerror(10) }
                   p^.location.register:=def_getreg(p^.resulttype);
                   p^.location.register:=def_getreg(p^.resulttype);
-                  exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,opsize,
-                    newreference(p^.left^.location.reference),p^.location.register)));
-                  exprasmlist^.concat(new(pai386,op_reg_reg(A_TEST,opsize,p^.location.register,p^.location.register)));
+                  emit_ref_reg(A_MOV,opsize,
+                    newreference(p^.left^.location.reference),p^.location.register);
+                  emit_reg_reg(A_TEST,opsize,p^.location.register,p^.location.register);
                   ungetregister(p^.location.register);
                   ungetregister(p^.location.register);
                   p^.location.loc:=LOC_FLAGS;
                   p^.location.loc:=LOC_FLAGS;
                   p^.location.resflags:=F_E;
                   p^.location.resflags:=F_E;
@@ -839,7 +839,7 @@ implementation
              secondpass(p^.left);
              secondpass(p^.left);
              p^.location.loc:=LOC_MMXREGISTER;
              p^.location.loc:=LOC_MMXREGISTER;
              { prepare EDI }
              { prepare EDI }
-             exprasmlist^.concat(new(pai386,op_const_reg(A_MOV,S_L,$ffffffff,R_EDI)));
+             emit_const_reg(A_MOV,S_L,$ffffffff,R_EDI);
              { load operand }
              { load operand }
              case p^.left^.location.loc of
              case p^.left^.location.loc of
                LOC_MMXREGISTER:
                LOC_MMXREGISTER:
@@ -853,8 +853,8 @@ implementation
                  begin
                  begin
                    del_reference(p^.left^.location.reference);
                    del_reference(p^.left^.location.reference);
                    p^.location.register:=getregistermmx;
                    p^.location.register:=getregistermmx;
-                   exprasmlist^.concat(new(pai386,op_ref_reg(A_MOVQ,S_NO,
-                     newreference(p^.left^.location.reference),p^.location.register)));
+                   emit_ref_reg(A_MOVQ,S_NO,
+                     newreference(p^.left^.location.reference),p^.location.register);
                  end;
                  end;
              end;
              end;
              { load mask }
              { load mask }
@@ -862,7 +862,7 @@ implementation
              { lower 32 bit }
              { lower 32 bit }
              emit_reg_reg(A_PXOR,S_D,R_MM7,p^.location.register);
              emit_reg_reg(A_PXOR,S_D,R_MM7,p^.location.register);
              { shift mask }
              { shift mask }
-             exprasmlist^.concat(new(pai386,op_const_reg(A_PSLLQ,S_NO,32,R_MM7)));
+             emit_const_reg(A_PSLLQ,S_NO,32,R_MM7);
              { higher 32 bit }
              { higher 32 bit }
              emit_reg_reg(A_PXOR,S_D,R_MM7,p^.location.register);
              emit_reg_reg(A_PXOR,S_D,R_MM7,p^.location.register);
            end
            end
@@ -877,8 +877,8 @@ implementation
                   begin
                   begin
                      p^.location.registerlow:=p^.left^.location.registerlow;
                      p^.location.registerlow:=p^.left^.location.registerlow;
                      p^.location.registerhigh:=p^.left^.location.registerhigh;
                      p^.location.registerhigh:=p^.left^.location.registerhigh;
-                     exprasmlist^.concat(new(pai386,op_reg(A_NOT,S_L,p^.location.registerlow)));
-                     exprasmlist^.concat(new(pai386,op_reg(A_NOT,S_L,p^.location.registerhigh)));
+                     emit_reg(A_NOT,S_L,p^.location.registerlow);
+                     emit_reg(A_NOT,S_L,p^.location.registerhigh);
                   end;
                   end;
                 LOC_CREGISTER :
                 LOC_CREGISTER :
                   begin
                   begin
@@ -886,22 +886,22 @@ implementation
                      p^.location.registerhigh:=getregister32;
                      p^.location.registerhigh:=getregister32;
                      emit_reg_reg(A_MOV,S_L,p^.left^.location.registerlow,p^.location.registerlow);
                      emit_reg_reg(A_MOV,S_L,p^.left^.location.registerlow,p^.location.registerlow);
                      emit_reg_reg(A_MOV,S_L,p^.left^.location.registerhigh,p^.location.registerhigh);
                      emit_reg_reg(A_MOV,S_L,p^.left^.location.registerhigh,p^.location.registerhigh);
-                     exprasmlist^.concat(new(pai386,op_reg(A_NOT,S_L,p^.location.registerlow)));
-                     exprasmlist^.concat(new(pai386,op_reg(A_NOT,S_L,p^.location.registerhigh)));
+                     emit_reg(A_NOT,S_L,p^.location.registerlow);
+                     emit_reg(A_NOT,S_L,p^.location.registerhigh);
                   end;
                   end;
                 LOC_REFERENCE,LOC_MEM :
                 LOC_REFERENCE,LOC_MEM :
                   begin
                   begin
                      del_reference(p^.left^.location.reference);
                      del_reference(p^.left^.location.reference);
                      p^.location.registerlow:=getregister32;
                      p^.location.registerlow:=getregister32;
                      p^.location.registerhigh:=getregister32;
                      p^.location.registerhigh:=getregister32;
-                     exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
-                       newreference(p^.left^.location.reference),p^.location.registerlow)));
+                     emit_ref_reg(A_MOV,S_L,
+                       newreference(p^.left^.location.reference),p^.location.registerlow);
                      hr:=newreference(p^.left^.location.reference);
                      hr:=newreference(p^.left^.location.reference);
                      inc(hr^.offset,4);
                      inc(hr^.offset,4);
-                     exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
-                       hr,p^.location.registerhigh)));
-                     exprasmlist^.concat(new(pai386,op_reg(A_NOT,S_L,p^.location.registerlow)));
-                     exprasmlist^.concat(new(pai386,op_reg(A_NOT,S_L,p^.location.registerhigh)));
+                     emit_ref_reg(A_MOV,S_L,
+                       hr,p^.location.registerhigh);
+                     emit_reg(A_NOT,S_L,p^.location.registerlow);
+                     emit_reg(A_NOT,S_L,p^.location.registerhigh);
                   end;
                   end;
               end;
               end;
            end
            end
@@ -914,21 +914,21 @@ implementation
               LOC_REGISTER :
               LOC_REGISTER :
                 begin
                 begin
                   p^.location.register:=p^.left^.location.register;
                   p^.location.register:=p^.left^.location.register;
-                  exprasmlist^.concat(new(pai386,op_reg(A_NOT,S_L,p^.location.register)));
+                  emit_reg(A_NOT,S_L,p^.location.register);
                 end;
                 end;
               LOC_CREGISTER :
               LOC_CREGISTER :
                 begin
                 begin
                   p^.location.register:=getregister32;
                   p^.location.register:=getregister32;
                   emit_reg_reg(A_MOV,S_L,p^.left^.location.register,p^.location.register);
                   emit_reg_reg(A_MOV,S_L,p^.left^.location.register,p^.location.register);
-                  exprasmlist^.concat(new(pai386,op_reg(A_NOT,S_L,p^.location.register)));
+                  emit_reg(A_NOT,S_L,p^.location.register);
                 end;
                 end;
               LOC_REFERENCE,LOC_MEM :
               LOC_REFERENCE,LOC_MEM :
                 begin
                 begin
                   del_reference(p^.left^.location.reference);
                   del_reference(p^.left^.location.reference);
                   p^.location.register:=getregister32;
                   p^.location.register:=getregister32;
-                  exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
-                    newreference(p^.left^.location.reference),p^.location.register)));
-                  exprasmlist^.concat(new(pai386,op_reg(A_NOT,S_L,p^.location.register)));
+                  emit_ref_reg(A_MOV,S_L,
+                    newreference(p^.left^.location.reference),p^.location.register);
+                  emit_reg(A_NOT,S_L,p^.location.register);
                 end;
                 end;
             end;
             end;
           end;
           end;
@@ -939,7 +939,10 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.30  1999-08-04 13:45:23  florian
+  Revision 1.31  1999-08-19 13:08:50  pierre
+   * emit_??? used
+
+  Revision 1.30  1999/08/04 13:45:23  florian
     + floating point register variables !!
     + floating point register variables !!
     * pairegalloc is now generated for register variables
     * pairegalloc is now generated for register variables
 
 

+ 49 - 46
compiler/cg386mem.pas

@@ -57,9 +57,9 @@ implementation
     procedure secondloadvmt(var p : ptree);
     procedure secondloadvmt(var p : ptree);
       begin
       begin
          p^.location.register:=getregister32;
          p^.location.register:=getregister32;
-         exprasmlist^.concat(new(pai386,op_sym_ofs_reg(A_MOV,
+         emit_sym_ofs_reg(A_MOV,
             S_L,newasmsymbol(pobjectdef(pclassrefdef(p^.resulttype)^.definition)^.vmt_mangledname),0,
             S_L,newasmsymbol(pobjectdef(pclassrefdef(p^.resulttype)^.definition)^.vmt_mangledname),0,
-            p^.location.register)));
+            p^.location.register);
       end;
       end;
 
 
 
 
@@ -133,16 +133,16 @@ implementation
             LOC_CREGISTER:
             LOC_CREGISTER:
               begin
               begin
                  p^.location.reference.index:=getregister32;
                  p^.location.reference.index:=getregister32;
-                 exprasmlist^.concat(new(pai386,op_reg_reg(A_MOV,S_L,
+                 emit_reg_reg(A_MOV,S_L,
                    p^.left^.location.register,
                    p^.left^.location.register,
-                   p^.location.reference.index)));
+                   p^.location.reference.index);
               end;
               end;
             LOC_MEM,LOC_REFERENCE :
             LOC_MEM,LOC_REFERENCE :
               begin
               begin
                  del_reference(p^.left^.location.reference);
                  del_reference(p^.left^.location.reference);
                  p^.location.reference.index:=getregister32;
                  p^.location.reference.index:=getregister32;
-                 exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,newreference(p^.left^.location.reference),
-                   p^.location.reference.index)));
+                 emit_ref_reg(A_MOV,S_L,newreference(p^.left^.location.reference),
+                   p^.location.reference.index);
               end;
               end;
          end;
          end;
       end;
       end;
@@ -169,8 +169,8 @@ implementation
 
 
          { push pointer adress }
          { push pointer adress }
          case p^.left^.location.loc of
          case p^.left^.location.loc of
-            LOC_CREGISTER : exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,
-              p^.left^.location.register)));
+            LOC_CREGISTER : emit_reg(A_PUSH,S_L,
+              p^.left^.location.register);
             LOC_REFERENCE:
             LOC_REFERENCE:
               emitpushreferenceaddr(p^.left^.location.reference);
               emitpushreferenceaddr(p^.left^.location.reference);
          end;
          end;
@@ -187,8 +187,8 @@ implementation
                      emitpushreferenceaddr(r^);
                      emitpushreferenceaddr(r^);
                      { push pointer adress }
                      { push pointer adress }
                      case p^.left^.location.loc of
                      case p^.left^.location.loc of
-                        LOC_CREGISTER : exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,
-                          p^.left^.location.register)));
+                        LOC_CREGISTER : emit_reg(A_PUSH,S_L,
+                          p^.left^.location.register);
                         LOC_REFERENCE:
                         LOC_REFERENCE:
                           emitpushreferenceaddr(p^.left^.location.reference);
                           emitpushreferenceaddr(p^.left^.location.reference);
                      end;
                      end;
@@ -208,8 +208,8 @@ implementation
                      emitpushreferenceaddr(r^);
                      emitpushreferenceaddr(r^);
                      { push pointer adress }
                      { push pointer adress }
                      case p^.left^.location.loc of
                      case p^.left^.location.loc of
-                        LOC_CREGISTER : exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,
-                          p^.left^.location.register)));
+                        LOC_CREGISTER : emit_reg(A_PUSH,S_L,
+                          p^.left^.location.register);
                         LOC_REFERENCE:
                         LOC_REFERENCE:
                           emitpushreferenceaddr(p^.left^.location.reference);
                           emitpushreferenceaddr(p^.left^.location.reference);
                      end;
                      end;
@@ -244,13 +244,13 @@ implementation
            assigned(p^.left^.symtableentry) and
            assigned(p^.left^.symtableentry) and
            (p^.left^.symtableentry^.typ=varsym) and
            (p^.left^.symtableentry^.typ=varsym) and
            (pvarsym(p^.left^.symtableentry)^.definition^.deftype=procvardef) then
            (pvarsym(p^.left^.symtableentry)^.definition^.deftype=procvardef) then
-           exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
+           emit_ref_reg(A_MOV,S_L,
              newreference(p^.left^.location.reference),
              newreference(p^.left^.location.reference),
-             p^.location.register)))
+             p^.location.register)
          else
          else
-           exprasmlist^.concat(new(pai386,op_ref_reg(A_LEA,S_L,
+           emit_ref_reg(A_LEA,S_L,
              newreference(p^.left^.location.reference),
              newreference(p^.left^.location.reference),
-             p^.location.register)));
+             p^.location.register);
            { for use of other segments }
            { for use of other segments }
            if p^.left^.location.reference.segment<>R_NO then
            if p^.left^.location.reference.segment<>R_NO then
              p^.location.segment:=p^.left^.location.reference.segment;
              p^.location.segment:=p^.left^.location.reference.segment;
@@ -267,9 +267,9 @@ implementation
          p^.location.loc:=LOC_REGISTER;
          p^.location.loc:=LOC_REGISTER;
          del_reference(p^.left^.location.reference);
          del_reference(p^.left^.location.reference);
          p^.location.register:=getregister32;
          p^.location.register:=getregister32;
-         exprasmlist^.concat(new(pai386,op_ref_reg(A_LEA,S_L,
+         emit_ref_reg(A_LEA,S_L,
          newreference(p^.left^.location.reference),
          newreference(p^.left^.location.reference),
-           p^.location.register)));
+           p^.location.register);
       end;
       end;
 
 
 
 
@@ -300,9 +300,9 @@ implementation
 
 
                  { ...and reserve one for the pointer }
                  { ...and reserve one for the pointer }
                  hr:=getregister32;
                  hr:=getregister32;
-                 exprasmlist^.concat(new(pai386,op_ref_reg(
+                 emit_ref_reg(
                    A_MOV,S_L,newreference(p^.left^.location.reference),
                    A_MOV,S_L,newreference(p^.left^.location.reference),
-                   hr)));
+                   hr);
                  p^.location.reference.base:=hr;
                  p^.location.reference.base:=hr;
               end;
               end;
          end;
          end;
@@ -312,8 +312,8 @@ implementation
             (cs_gdb_heaptrc in aktglobalswitches) and
             (cs_gdb_heaptrc in aktglobalswitches) and
             (cs_checkpointer in aktglobalswitches) then
             (cs_checkpointer in aktglobalswitches) then
               begin
               begin
-                 exprasmlist^.concat(new(pai386,op_reg(
-                   A_PUSH,S_L,p^.location.reference.base)));
+                 emit_reg(
+                   A_PUSH,S_L,p^.location.reference.base);
                  emitcall('FPC_CHECKPOINTER');
                  emitcall('FPC_CHECKPOINTER');
               end;
               end;
       end;
       end;
@@ -352,9 +352,9 @@ implementation
 
 
                      { ... and reserve one for the pointer }
                      { ... and reserve one for the pointer }
                      hr:=getregister32;
                      hr:=getregister32;
-                     exprasmlist^.concat(new(pai386,op_ref_reg(
+                     emit_ref_reg(
                        A_MOV,S_L,newreference(p^.left^.location.reference),
                        A_MOV,S_L,newreference(p^.left^.location.reference),
-                       hr)));
+                       hr);
                      p^.location.reference.base:=hr;
                      p^.location.reference.base:=hr;
                   end;
                   end;
              end;
              end;
@@ -394,9 +394,9 @@ implementation
             else
             else
               begin
               begin
                  if ispowerof2(l1,l2) then
                  if ispowerof2(l1,l2) then
-                   exprasmlist^.concat(new(pai386,op_const_reg(A_SHL,S_L,l2,ind)))
+                   emit_const_reg(A_SHL,S_L,l2,ind)
                  else
                  else
-                   exprasmlist^.concat(new(pai386,op_const_reg(A_IMUL,S_L,l1,ind)));
+                   emit_const_reg(A_IMUL,S_L,l1,ind);
               end;
               end;
             end;
             end;
           end;
           end;
@@ -450,9 +450,9 @@ implementation
                 begin
                 begin
                    del_reference(p^.left^.location.reference);
                    del_reference(p^.left^.location.reference);
                    p^.location.reference.base:=getregister32;
                    p^.location.reference.base:=getregister32;
-                   exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
+                   emit_ref_reg(A_MOV,S_L,
                      newreference(p^.left^.location.reference),
                      newreference(p^.left^.location.reference),
-                     p^.location.reference.base)));
+                     p^.location.reference.base);
                 end;
                 end;
 
 
               { check for a zero length string,
               { check for a zero length string,
@@ -460,7 +460,7 @@ implementation
               if (cs_check_range in aktlocalswitches) then
               if (cs_check_range in aktlocalswitches) then
                 begin
                 begin
                    pushusedregisters(pushed,$ff);
                    pushusedregisters(pushed,$ff);
-                   exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,p^.location.reference.base)));
+                   emit_reg(A_PUSH,S_L,p^.location.reference.base);
                    emitcall('FPC_ANSISTR_CHECKZERO');
                    emitcall('FPC_ANSISTR_CHECKZERO');
                    maybe_loadesi;
                    maybe_loadesi;
                    popusedregisters(pushed);
                    popusedregisters(pushed);
@@ -473,8 +473,8 @@ implementation
                 begin
                 begin
                    { in widestrings S[1] is pwchar(S)[0] !! }
                    { in widestrings S[1] is pwchar(S)[0] !! }
                    dec(p^.location.reference.offset,2);
                    dec(p^.location.reference.offset,2);
-                   exprasmlist^.concat(new(pai386,op_const_reg(A_SHL,S_L,
-                     1,p^.location.reference.base)));
+                   emit_const_reg(A_SHL,S_L,
+                     1,p^.location.reference.base);
                 end;
                 end;
 
 
               { we've also to keep left up-to-date, because it is used   }
               { we've also to keep left up-to-date, because it is used   }
@@ -528,7 +528,7 @@ implementation
                              push_int(p^.right^.value);
                              push_int(p^.right^.value);
                              hp:=newreference(p^.location.reference);
                              hp:=newreference(p^.location.reference);
                              dec(hp^.offset,7);
                              dec(hp^.offset,7);
-                             exprasmlist^.concat(new(pai386,op_ref(A_PUSH,S_L,hp)));
+                             emit_ref(A_PUSH,S_L,hp);
                              emitcall('FPC_ANSISTR_RANGECHECK');
                              emitcall('FPC_ANSISTR_RANGECHECK');
                              popusedregisters(pushed);
                              popusedregisters(pushed);
                              maybe_loadesi;
                              maybe_loadesi;
@@ -707,10 +707,10 @@ implementation
                          st_ansistring:
                          st_ansistring:
                            begin
                            begin
                               pushusedregisters(pushed,$ff);
                               pushusedregisters(pushed,$ff);
-                              exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,ind)));
+                              emit_reg(A_PUSH,S_L,ind);
                               hp:=newreference(p^.location.reference);
                               hp:=newreference(p^.location.reference);
                               dec(hp^.offset,7);
                               dec(hp^.offset,7);
-                              exprasmlist^.concat(new(pai386,op_ref(A_PUSH,S_L,hp)));
+                              emit_ref(A_PUSH,S_L,hp);
                               emitcall('FPC_ANSISTR_RANGECHECK');
                               emitcall('FPC_ANSISTR_RANGECHECK');
                               popusedregisters(pushed);
                               popusedregisters(pushed);
                               maybe_loadesi;
                               maybe_loadesi;
@@ -737,9 +737,9 @@ implementation
                  if p^.location.reference.base=R_NO then
                  if p^.location.reference.base=R_NO then
                   begin
                   begin
                     case p^.location.reference.scalefactor of
                     case p^.location.reference.scalefactor of
-                     2 : exprasmlist^.concat(new(pai386,op_const_reg(A_SHL,S_L,1,p^.location.reference.index)));
-                     4 : exprasmlist^.concat(new(pai386,op_const_reg(A_SHL,S_L,2,p^.location.reference.index)));
-                     8 : exprasmlist^.concat(new(pai386,op_const_reg(A_SHL,S_L,3,p^.location.reference.index)));
+                     2 : emit_const_reg(A_SHL,S_L,1,p^.location.reference.index);
+                     4 : emit_const_reg(A_SHL,S_L,2,p^.location.reference.index);
+                     8 : emit_const_reg(A_SHL,S_L,3,p^.location.reference.index);
                     end;
                     end;
                     calc_emit_mul;
                     calc_emit_mul;
                     p^.location.reference.base:=p^.location.reference.index;
                     p^.location.reference.base:=p^.location.reference.index;
@@ -747,9 +747,9 @@ implementation
                   end
                   end
                  else
                  else
                   begin
                   begin
-                    exprasmlist^.concat(new(pai386,op_ref_reg(
+                    emit_ref_reg(
                       A_LEA,S_L,newreference(p^.location.reference),
                       A_LEA,S_L,newreference(p^.location.reference),
-                      p^.location.reference.index)));
+                      p^.location.reference.index);
                     ungetregister32(p^.location.reference.base);
                     ungetregister32(p^.location.reference.base);
                     { the symbol offset is loaded,             }
                     { the symbol offset is loaded,             }
                     { so release the symbol name and set symbol  }
                     { so release the symbol name and set symbol  }
@@ -812,14 +812,14 @@ implementation
                 if (p^.left^.resulttype^.deftype=objectdef) and
                 if (p^.left^.resulttype^.deftype=objectdef) and
                    pobjectdef(p^.left^.resulttype)^.is_class then
                    pobjectdef(p^.left^.resulttype)^.is_class then
                  begin
                  begin
-                    exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
-                      newreference(p^.left^.location.reference),R_EDI)));
+                    emit_ref_reg(A_MOV,S_L,
+                      newreference(p^.left^.location.reference),R_EDI);
                     usetemp:=true;
                     usetemp:=true;
                  end
                  end
                else
                else
                  begin
                  begin
-                   exprasmlist^.concat(new(pai386,op_ref_reg(A_LEA,S_L,
-                     newreference(p^.left^.location.reference),R_EDI)));
+                   emit_ref_reg(A_LEA,S_L,
+                     newreference(p^.left^.location.reference),R_EDI);
                    usetemp:=true;
                    usetemp:=true;
                  end;
                  end;
 
 
@@ -829,8 +829,8 @@ implementation
                   gettempofsizereference(4,p^.withreference^);
                   gettempofsizereference(4,p^.withreference^);
                   normaltemptopersistant(p^.withreference^.offset);
                   normaltemptopersistant(p^.withreference^.offset);
                   { move to temp reference }
                   { move to temp reference }
-                  exprasmlist^.concat(new(pai386,op_reg_ref(A_MOV,S_L,
-                    R_EDI,newreference(p^.withreference^))));
+                  emit_reg_ref(A_MOV,S_L,
+                    R_EDI,newreference(p^.withreference^));
                   del_reference(p^.left^.location.reference);
                   del_reference(p^.left^.location.reference);
                 end;
                 end;
 
 
@@ -850,7 +850,10 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.51  1999-08-16 23:20:28  peter
+  Revision 1.52  1999-08-19 13:08:52  pierre
+   * emit_??? used
+
+  Revision 1.51  1999/08/16 23:20:28  peter
     * range check for array of const
     * range check for array of const
 
 
   Revision 1.50  1999/08/14 00:36:05  peter
   Revision 1.50  1999/08/14 00:36:05  peter

+ 101 - 97
compiler/cg386set.pas

@@ -199,13 +199,13 @@ implementation
                pleftreg:=p^.left^.location.register;
                pleftreg:=p^.left^.location.register;
                if pleftreg in [R_AX..R_DX] then
                if pleftreg in [R_AX..R_DX] then
                 begin
                 begin
-                  exprasmlist^.concat(new(pai386,op_const_reg(A_AND,S_W,255,pleftreg)));
+                  emit_const_reg(A_AND,S_W,255,pleftreg);
                   opsize:=S_W;
                   opsize:=S_W;
                 end
                 end
                else
                else
                 if pleftreg in [R_EAX..R_EDI] then
                 if pleftreg in [R_EAX..R_EDI] then
                  begin
                  begin
-                   exprasmlist^.concat(new(pai386,op_const_reg(A_AND,S_L,255,pleftreg)));
+                   emit_const_reg(A_AND,S_L,255,pleftreg);
                    opsize:=S_L;
                    opsize:=S_L;
                  end
                  end
                else
                else
@@ -234,28 +234,28 @@ implementation
                  begin
                  begin
                    case p^.left^.location.loc of
                    case p^.left^.location.loc of
                   LOC_REGISTER,
                   LOC_REGISTER,
-                 LOC_CREGISTER : exprasmlist^.concat(new(pai386,op_const_reg(A_CMP,opsize,
-                                   setparts[i].start,pleftreg)));
+                 LOC_CREGISTER : emit_const_reg(A_CMP,opsize,
+                                   setparts[i].start,pleftreg);
                    else
                    else
-                     exprasmlist^.concat(new(pai386,op_const_ref(A_CMP,S_B,
-                       setparts[i].start,newreference(p^.left^.location.reference))));
+                     emit_const_ref(A_CMP,S_B,
+                       setparts[i].start,newreference(p^.left^.location.reference));
                    end;
                    end;
                    { Result should be in carry flag when ranges are used }
                    { Result should be in carry flag when ranges are used }
                    if ranges then
                    if ranges then
-                     exprasmlist^.concat(new(pai386,op_none(A_STC,S_NO)));
+                     emit_none(A_STC,S_NO);
                    { If found, jump to end }
                    { If found, jump to end }
                    emitjmp(C_E,l);
                    emitjmp(C_E,l);
                    case p^.left^.location.loc of
                    case p^.left^.location.loc of
                   LOC_REGISTER,
                   LOC_REGISTER,
-                 LOC_CREGISTER : exprasmlist^.concat(new(pai386,op_const_reg(A_CMP,opsize,
-                                   setparts[i].stop,pleftreg)));
+                 LOC_CREGISTER : emit_const_reg(A_CMP,opsize,
+                                   setparts[i].stop,pleftreg);
                    else
                    else
-                     exprasmlist^.concat(new(pai386,op_const_ref(A_CMP,S_B,
-                       setparts[i].stop,newreference(p^.left^.location.reference))));
+                     emit_const_ref(A_CMP,S_B,
+                       setparts[i].stop,newreference(p^.left^.location.reference));
                    end;
                    end;
                    { Result should be in carry flag when ranges are used }
                    { Result should be in carry flag when ranges are used }
                    if ranges then
                    if ranges then
-                     exprasmlist^.concat(new(pai386,op_none(A_STC,S_NO)));
+                     emit_none(A_STC,S_NO);
                    { If found, jump to end }
                    { If found, jump to end }
                    emitjmp(C_E,l);
                    emitjmp(C_E,l);
                  end
                  end
@@ -267,11 +267,12 @@ implementation
                         set elements lower than 0 dont exist }
                         set elements lower than 0 dont exist }
                       case p^.left^.location.loc of
                       case p^.left^.location.loc of
                      LOC_REGISTER,
                      LOC_REGISTER,
-                    LOC_CREGISTER : exprasmlist^.concat(new(pai386,op_const_reg(A_CMP,opsize,
-                                      setparts[i].start,pleftreg)));
+                    LOC_CREGISTER :
+                    emit_const_reg(A_CMP,opsize,
+                                      setparts[i].start,pleftreg);
                       else
                       else
-                        exprasmlist^.concat(new(pai386,op_const_ref(A_CMP,S_B,
-                          setparts[i].start,newreference(p^.left^.location.reference))));
+                        emit_const_ref(A_CMP,S_B,
+                          setparts[i].start,newreference(p^.left^.location.reference));
                       end;
                       end;
                       { If lower, jump to next check }
                       { If lower, jump to next check }
                       emitjmp(C_B,l2);
                       emitjmp(C_B,l2);
@@ -283,18 +284,18 @@ implementation
                     begin
                     begin
                       case p^.left^.location.loc of
                       case p^.left^.location.loc of
                      LOC_REGISTER,
                      LOC_REGISTER,
-                    LOC_CREGISTER : exprasmlist^.concat(new(pai386,op_const_reg(A_CMP,opsize,
-                                      setparts[i].stop+1,pleftreg)));
+                    LOC_CREGISTER : emit_const_reg(A_CMP,opsize,
+                                      setparts[i].stop+1,pleftreg);
                       else
                       else
-                        exprasmlist^.concat(new(pai386,op_const_ref(A_CMP,S_B,
-                          setparts[i].stop+1,newreference(p^.left^.location.reference))));
+                        emit_const_ref(A_CMP,S_B,
+                          setparts[i].stop+1,newreference(p^.left^.location.reference));
                       end;
                       end;
                       { If higher, element is in set }
                       { If higher, element is in set }
                       emitjmp(C_B,l);
                       emitjmp(C_B,l);
                     end
                     end
                    else
                    else
                     begin
                     begin
-                      exprasmlist^.concat(new(pai386,op_none(A_STC,S_NO)));
+                      emit_none(A_STC,S_NO);
                       emitjmp(C_None,l);
                       emitjmp(C_None,l);
                     end;
                     end;
                  end;
                  end;
@@ -306,20 +307,20 @@ implementation
                 { Emit code to check if left is an element }
                 { Emit code to check if left is an element }
                 case p^.left^.location.loc of
                 case p^.left^.location.loc of
                LOC_REGISTER,
                LOC_REGISTER,
-              LOC_CREGISTER : exprasmlist^.concat(new(pai386,op_const_reg(A_CMP,opsize,
-                                setparts[i].stop,pleftreg)));
+              LOC_CREGISTER : emit_const_reg(A_CMP,opsize,
+                                setparts[i].stop,pleftreg);
                 else
                 else
-                  exprasmlist^.concat(new(pai386,op_const_ref(A_CMP,S_B,
-                    setparts[i].stop,newreference(p^.left^.location.reference))));
+                  emit_const_ref(A_CMP,S_B,
+                    setparts[i].stop,newreference(p^.left^.location.reference));
                 end;
                 end;
                 { Result should be in carry flag when ranges are used }
                 { Result should be in carry flag when ranges are used }
                 if ranges then
                 if ranges then
-                 exprasmlist^.concat(new(pai386,op_none(A_STC,S_NO)));
+                 emit_none(A_STC,S_NO);
                 { If found, jump to end }
                 { If found, jump to end }
                 emitjmp(C_E,l);
                 emitjmp(C_E,l);
               end;
               end;
              if ranges then
              if ranges then
-              exprasmlist^.concat(new(pai386,op_none(A_CLC,S_NO)));
+              emit_none(A_CLC,S_NO);
              { To compensate for not doing a second pass }
              { To compensate for not doing a second pass }
              p^.right^.location.reference.symbol:=nil;
              p^.right^.location.reference.symbol:=nil;
              { Now place the end label }
              { Now place the end label }
@@ -344,14 +345,14 @@ implementation
                      LOC_REGISTER,
                      LOC_REGISTER,
                      LOC_CREGISTER:
                      LOC_CREGISTER:
                       begin
                       begin
-                         exprasmlist^.concat(new(pai386,op_const_reg(A_TEST,S_L,
-                           1 shl (p^.left^.value and 31),p^.right^.location.register)));
+                         emit_const_reg(A_TEST,S_L,
+                           1 shl (p^.left^.value and 31),p^.right^.location.register);
                          ungetregister32(p^.right^.location.register);
                          ungetregister32(p^.right^.location.register);
                        end
                        end
                   else
                   else
                    begin
                    begin
-                     exprasmlist^.concat(new(pai386,op_const_ref(A_TEST,S_L,1 shl (p^.left^.value and 31),
-                       newreference(p^.right^.location.reference))));
+                     emit_const_ref(A_TEST,S_L,1 shl (p^.left^.value and 31),
+                       newreference(p^.right^.location.reference));
                      del_reference(p^.right^.location.reference);
                      del_reference(p^.right^.location.reference);
                    end;
                    end;
                   end;
                   end;
@@ -370,8 +371,8 @@ implementation
                       { the set element isn't never samller than a byte  }
                       { the set element isn't never samller than a byte  }
                       { and because it's a small set we need only 5 bits }
                       { and because it's a small set we need only 5 bits }
                       { but 8 bits are easier to load               }
                       { but 8 bits are easier to load               }
-                      exprasmlist^.concat(new(pai386,op_ref_reg(A_MOVZX,S_BL,
-                        newreference(p^.left^.location.reference),R_EDI)));
+                      emit_ref_reg(A_MOVZX,S_BL,
+                        newreference(p^.left^.location.reference),R_EDI);
                       hr:=R_EDI;
                       hr:=R_EDI;
                       del_reference(p^.left^.location.reference);
                       del_reference(p^.left^.location.reference);
                     end;
                     end;
@@ -379,8 +380,8 @@ implementation
 
 
                   case p^.right^.location.loc of
                   case p^.right^.location.loc of
                  LOC_REGISTER,
                  LOC_REGISTER,
-                LOC_CREGISTER : exprasmlist^.concat(new(pai386,op_reg_reg(A_BT,S_L,hr,
-                                  p^.right^.location.register)));
+                LOC_CREGISTER : emit_reg_reg(A_BT,S_L,hr,
+                                  p^.right^.location.register);
                   else
                   else
                     begin
                     begin
                       del_reference(p^.right^.location.reference);
                       del_reference(p^.right^.location.reference);
@@ -389,14 +390,14 @@ implementation
                        { We have to load the value into a register because
                        { We have to load the value into a register because
                          btl does not accept values only refs or regs (PFV) }
                          btl does not accept values only refs or regs (PFV) }
                          hr2:=getregister32;
                          hr2:=getregister32;
-                         exprasmlist^.concat(new(pai386,op_const_reg(A_MOV,S_L,
-                           p^.right^.location.reference.offset,hr2)));
-                         exprasmlist^.concat(new(pai386,op_reg_reg(A_BT,S_L,hr,hr2)));
+                         emit_const_reg(A_MOV,S_L,
+                           p^.right^.location.reference.offset,hr2);
+                         emit_reg_reg(A_BT,S_L,hr,hr2);
                          ungetregister32(hr2);
                          ungetregister32(hr2);
                        end
                        end
                       else
                       else
-                        exprasmlist^.concat(new(pai386,op_reg_ref(A_BT,S_L,hr,
-                          newreference(p^.right^.location.reference))));
+                        emit_reg_ref(A_BT,S_L,hr,
+                          newreference(p^.right^.location.reference));
                     end;
                     end;
                   end;
                   end;
                   ungetregister32(hr);
                   ungetregister32(hr);
@@ -418,8 +419,8 @@ implementation
                       hr:=getregister32;
                       hr:=getregister32;
                       p^.left^.location.loc:=LOC_REGISTER;
                       p^.left^.location.loc:=LOC_REGISTER;
                       p^.left^.location.register:=hr;
                       p^.left^.location.register:=hr;
-                      exprasmlist^.concat(new(pai386,op_const_reg(A_MOV,S_L,
-                            p^.left^.value,hr)));
+                      emit_const_reg(A_MOV,S_L,
+                            p^.left^.value,hr);
                     end;
                     end;
                   case p^.left^.location.loc of
                   case p^.left^.location.loc of
                      LOC_REGISTER,
                      LOC_REGISTER,
@@ -434,31 +435,31 @@ implementation
                                else
                                else
                                  AM:=A_MOVZX;
                                  AM:=A_MOVZX;
                                if p^.left^.location.register in [R_AX,R_DI] then
                                if p^.left^.location.register in [R_AX,R_DI] then
-                                 exprasmlist^.concat(new(pai386,op_reg_reg(AM,S_WL,
-                                   p^.left^.location.register,hr)))
+                                 emit_reg_reg(AM,S_WL,
+                                   p^.left^.location.register,hr)
                                else if p^.left^.location.register in [R_AL,R_DH] then
                                else if p^.left^.location.register in [R_AL,R_DH] then
-                               exprasmlist^.concat(new(pai386,op_reg_reg(AM,S_BL,
-                                 p^.left^.location.register,hr)));
+                               emit_reg_reg(AM,S_BL,
+                                 p^.left^.location.register,hr);
                             end
                             end
                           else
                           else
 {$endif CORRECT_SET_IN_FPC}
 {$endif CORRECT_SET_IN_FPC}
                             begin
                             begin
-                               exprasmlist^.concat(new(pai386,op_const_reg(A_AND,S_L,
-                                 255,hr)));
+                               emit_const_reg(A_AND,S_L,
+                                 255,hr);
                             end;
                             end;
-                          exprasmlist^.concat(new(pai386,op_const_reg(A_CMP,S_L,
-                            31,hr)));
+                          emit_const_reg(A_CMP,S_L,
+                            31,hr);
                           emitjmp(C_NA,l);
                           emitjmp(C_NA,l);
                         { reset carry flag }
                         { reset carry flag }
-                          exprasmlist^.concat(new(pai386,op_none(A_CLC,S_NO)));
+                          emit_none(A_CLC,S_NO);
                           emitjmp(C_NONE,l2);
                           emitjmp(C_NONE,l2);
                           emitlab(l);
                           emitlab(l);
                         { We have to load the value into a register because
                         { We have to load the value into a register because
                           btl does not accept values only refs or regs (PFV) }
                           btl does not accept values only refs or regs (PFV) }
                           hr2:=getregister32;
                           hr2:=getregister32;
-                          exprasmlist^.concat(new(pai386,op_const_reg(A_MOV,S_L,
-                            p^.right^.location.reference.offset,hr2)));
-                          exprasmlist^.concat(new(pai386,op_reg_reg(A_BT,S_L,hr,hr2)));
+                          emit_const_reg(A_MOV,S_L,
+                            p^.right^.location.reference.offset,hr2);
+                          emit_reg_reg(A_BT,S_L,hr,hr2);
                           ungetregister32(hr2);
                           ungetregister32(hr2);
                        end;
                        end;
                   else
                   else
@@ -468,29 +469,29 @@ implementation
                             begin
                             begin
                             {***WARNING only correct if
                             {***WARNING only correct if
                               reference is 32 bits (PM) *****}
                               reference is 32 bits (PM) *****}
-                               exprasmlist^.concat(new(pai386,op_const_ref(A_CMP,S_L,
-                                 31,newreference(p^.left^.location.reference))));
+                               emit_const_ref(A_CMP,S_L,
+                                 31,newreference(p^.left^.location.reference));
                             end
                             end
                           else
                           else
 {$endif CORRECT_SET_IN_FPC}
 {$endif CORRECT_SET_IN_FPC}
                             begin
                             begin
-                               exprasmlist^.concat(new(pai386,op_const_ref(A_CMP,S_B,
-                                 31,newreference(p^.left^.location.reference))));
+                               emit_const_ref(A_CMP,S_B,
+                                 31,newreference(p^.left^.location.reference));
                             end;
                             end;
                        emitjmp(C_NA,l);
                        emitjmp(C_NA,l);
                      { reset carry flag }
                      { reset carry flag }
-                       exprasmlist^.concat(new(pai386,op_none(A_CLC,S_NO)));
+                       emit_none(A_CLC,S_NO);
                        emitjmp(C_NONE,l2);
                        emitjmp(C_NONE,l2);
                        emitlab(l);
                        emitlab(l);
                        hr:=getregister32;
                        hr:=getregister32;
-                       exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
-                         newreference(p^.left^.location.reference),hr)));
+                       emit_ref_reg(A_MOV,S_L,
+                         newreference(p^.left^.location.reference),hr);
                      { We have to load the value into a register because
                      { We have to load the value into a register because
                        btl does not accept values only refs or regs (PFV) }
                        btl does not accept values only refs or regs (PFV) }
                        hr2:=getregister32;
                        hr2:=getregister32;
-                       exprasmlist^.concat(new(pai386,op_const_reg(A_MOV,S_L,
-                         p^.right^.location.reference.offset,hr2)));
-                       exprasmlist^.concat(new(pai386,op_reg_reg(A_BT,S_L,hr,hr2)));
+                       emit_const_reg(A_MOV,S_L,
+                         p^.right^.location.reference.offset,hr2);
+                       emit_reg_reg(A_BT,S_L,hr,hr2);
                        ungetregister32(hr2);
                        ungetregister32(hr2);
                       del_reference(p^.left^.location.reference);
                       del_reference(p^.left^.location.reference);
                     end;
                     end;
@@ -503,8 +504,8 @@ implementation
                 begin
                 begin
                   p^.location.resflags:=F_NE;
                   p^.location.resflags:=F_NE;
                   inc(p^.right^.location.reference.offset,p^.left^.value shr 3);
                   inc(p^.right^.location.reference.offset,p^.left^.value shr 3);
-                  exprasmlist^.concat(new(pai386,op_const_ref(A_TEST,S_B,1 shl (p^.left^.value and 7),
-                    newreference(p^.right^.location.reference))));
+                  emit_const_ref(A_TEST,S_B,1 shl (p^.left^.value and 7),
+                    newreference(p^.right^.location.reference));
                   del_reference(p^.right^.location.reference);
                   del_reference(p^.right^.location.reference);
                 end
                 end
                else
                else
@@ -565,7 +566,7 @@ implementation
          { no range label: }
          { no range label: }
          if p^._low=p^._high then
          if p^._low=p^._high then
            begin
            begin
-              exprasmlist^.concat(new(pai386,op_const_reg(A_CMP,opsize,p^._low,hregister)));
+              emit_const_reg(A_CMP,opsize,p^._low,hregister);
               if greaterlabel=lesslabel then
               if greaterlabel=lesslabel then
                 emitjmp(C_NE,lesslabel)
                 emitjmp(C_NE,lesslabel)
               else
               else
@@ -577,9 +578,9 @@ implementation
            end
            end
          else
          else
            begin
            begin
-              exprasmlist^.concat(new(pai386,op_const_reg(A_CMP,opsize,p^._low,hregister)));
+              emit_const_reg(A_CMP,opsize,p^._low,hregister);
               emitjmp(jmp_le,lesslabel);
               emitjmp(jmp_le,lesslabel);
-                exprasmlist^.concat(new(pai386,op_const_reg(A_CMP,opsize,p^._high,hregister)));
+              emit_const_reg(A_CMP,opsize,p^._high,hregister);
               emitjmp(jmp_gt,greaterlabel);
               emitjmp(jmp_gt,greaterlabel);
               emitjmp(C_None,p^.statement);
               emitjmp(C_None,p^.statement);
            end;
            end;
@@ -604,17 +605,17 @@ implementation
              { need we to test the first value }
              { need we to test the first value }
              if first and (t^._low>get_min_value(p^.left^.resulttype)) then
              if first and (t^._low>get_min_value(p^.left^.resulttype)) then
                begin
                begin
-                  exprasmlist^.concat(new(pai386,op_const_reg(A_CMP,opsize,t^._low,hregister)));
+                  emit_const_reg(A_CMP,opsize,t^._low,hregister);
                   emitjmp(jmp_le,elselabel);
                   emitjmp(jmp_le,elselabel);
                end;
                end;
              if t^._low=t^._high then
              if t^._low=t^._high then
                begin
                begin
                   if t^._low-last=1 then
                   if t^._low-last=1 then
-                    exprasmlist^.concat(new(pai386,op_reg(A_DEC,opsize,hregister)))
+                    emit_reg(A_DEC,opsize,hregister)
                   else if t^._low-last=0 then
                   else if t^._low-last=0 then
-                    exprasmlist^.concat(new(pai386,op_reg_reg(A_OR,opsize,hregister,hregister)))
+                    emit_reg_reg(A_OR,opsize,hregister,hregister)
                   else
                   else
-                    exprasmlist^.concat(new(pai386,op_const_reg(A_SUB,opsize,t^._low-last,hregister)));
+                    emit_const_reg(A_SUB,opsize,t^._low-last,hregister);
                   last:=t^._low;
                   last:=t^._low;
                   emitjmp(C_Z,t^.statement);
                   emitjmp(C_Z,t^.statement);
                end
                end
@@ -629,11 +630,11 @@ implementation
                        if t^._low>get_min_value(p^.left^.resulttype) then
                        if t^._low>get_min_value(p^.left^.resulttype) then
                          begin
                          begin
                             if t^._low=1 then
                             if t^._low=1 then
-                              exprasmlist^.concat(new(pai386,op_reg(A_DEC,opsize,
-                                hregister)))
+                              emit_reg(A_DEC,opsize,
+                                hregister)
                             else
                             else
-                              exprasmlist^.concat(new(pai386,op_const_reg(A_SUB,opsize,
-                                t^._low,hregister)));
+                              emit_const_reg(A_SUB,opsize,
+                                t^._low,hregister);
                          end;
                          end;
                     end
                     end
                   else
                   else
@@ -642,12 +643,12 @@ implementation
                   { immediately. else check the range in between:       }
                   { immediately. else check the range in between:       }
                   if (t^._low-last>1) then
                   if (t^._low-last>1) then
                     begin
                     begin
-                       exprasmlist^.concat(new(pai386,op_const_reg(A_SUB,opsize,t^._low-last,hregister)));
+                       emit_const_reg(A_SUB,opsize,t^._low-last,hregister);
                        emitjmp(jmp_le,elselabel);
                        emitjmp(jmp_le,elselabel);
                     end
                     end
                   else
                   else
-                    exprasmlist^.concat(new(pai386,op_reg(A_DEC,opsize,hregister)));
-                  exprasmlist^.concat(new(pai386,op_const_reg(A_SUB,opsize,t^._high-t^._low,hregister)));
+                    emit_reg(A_DEC,opsize,hregister);
+                  emit_const_reg(A_SUB,opsize,t^._high-t^._low,hregister);
                   emitjmp(jmp_lee,t^.statement);
                   emitjmp(jmp_lee,t^.statement);
 
 
                   last:=t^._high;
                   last:=t^._high;
@@ -692,10 +693,10 @@ implementation
           begin
           begin
            if not(jumptable_no_range) then
            if not(jumptable_no_range) then
              begin
              begin
-                exprasmlist^.concat(new(pai386,op_const_reg(A_CMP,opsize,min_,hregister)));
+                emit_const_reg(A_CMP,opsize,min_,hregister);
                 { case expr less than min_ => goto elselabel }
                 { case expr less than min_ => goto elselabel }
                 emitjmp(jmp_le,elselabel);
                 emitjmp(jmp_le,elselabel);
-                exprasmlist^.concat(new(pai386,op_const_reg(A_CMP,opsize,max_,hregister)));
+                emit_const_reg(A_CMP,opsize,max_,hregister);
                 emitjmp(jmp_gt,elselabel);
                 emitjmp(jmp_gt,elselabel);
              end;
              end;
            getlabel(table);
            getlabel(table);
@@ -703,21 +704,21 @@ implementation
            if opsize=S_W then
            if opsize=S_W then
              begin
              begin
                 if with_sign then
                 if with_sign then
-                  exprasmlist^.concat(new(pai386,op_reg_reg(A_MOVSX,S_WL,hregister,
-                    reg16toreg32(hregister))))
+                  emit_reg_reg(A_MOVSX,S_WL,hregister,
+                    reg16toreg32(hregister))
                 else
                 else
-                  exprasmlist^.concat(new(pai386,op_reg_reg(A_MOVZX,S_WL,hregister,
-                    reg16toreg32(hregister))));
+                  emit_reg_reg(A_MOVZX,S_WL,hregister,
+                    reg16toreg32(hregister));
                 hregister:=reg16toreg32(hregister);
                 hregister:=reg16toreg32(hregister);
              end
              end
            else if opsize=S_B then
            else if opsize=S_B then
              begin
              begin
                 if with_sign then
                 if with_sign then
-                  exprasmlist^.concat(new(pai386,op_reg_reg(A_MOVSX,S_BL,hregister,
-                    reg8toreg32(hregister))))
+                  emit_reg_reg(A_MOVSX,S_BL,hregister,
+                    reg8toreg32(hregister))
                 else
                 else
-                  exprasmlist^.concat(new(pai386,op_reg_reg(A_MOVZX,S_BL,hregister,
-                    reg8toreg32(hregister))));
+                  emit_reg_reg(A_MOVZX,S_BL,hregister,
+                    reg8toreg32(hregister));
                 hregister:=reg8toreg32(hregister);
                 hregister:=reg8toreg32(hregister);
              end;
              end;
            new(hr);
            new(hr);
@@ -726,7 +727,7 @@ implementation
            hr^.offset:=(-min_)*4;
            hr^.offset:=(-min_)*4;
            hr^.index:=hregister;
            hr^.index:=hregister;
            hr^.scalefactor:=4;
            hr^.scalefactor:=4;
-           exprasmlist^.concat(new(pai386,op_ref(A_JMP,S_NO,hr)));
+           emit_ref(A_JMP,S_NO,hr);
            { !!!!! generate tables
            { !!!!! generate tables
              if not(cs_littlesize in aktlocalswitches) then
              if not(cs_littlesize in aktlocalswitches) then
              jumpsegment^.concat(new(pai386,op_const(A_ALIGN,S_NO,4)));
              jumpsegment^.concat(new(pai386,op_const(A_ALIGN,S_NO,4)));
@@ -736,7 +737,7 @@ implementation
            genitem(hp);
            genitem(hp);
              { !!!!!!!
              { !!!!!!!
            if not(cs_littlesize in aktlocalswitches) then
            if not(cs_littlesize in aktlocalswitches) then
-             exprasmlist^.concat(new(pai386,op_const(A_ALIGN,S_NO,4)));
+             emit_const(A_ALIGN,S_NO,4);
            }
            }
         end;
         end;
 
 
@@ -792,8 +793,8 @@ implementation
                     S_B : hregister:=reg32toreg8(hregister);
                     S_B : hregister:=reg32toreg8(hregister);
                     S_W : hregister:=reg32toreg16(hregister);
                     S_W : hregister:=reg32toreg16(hregister);
                  end;
                  end;
-                 exprasmlist^.concat(new(pai386,op_reg_reg(A_MOV,opsize,
-                   p^.left^.location.register,hregister)));
+                 emit_reg_reg(A_MOV,opsize,
+                   p^.left^.location.register,hregister);
               end;
               end;
             LOC_MEM,LOC_REFERENCE : begin
             LOC_MEM,LOC_REFERENCE : begin
                                        del_reference(p^.left^.location.reference);
                                        del_reference(p^.left^.location.reference);
@@ -802,8 +803,8 @@ implementation
                                           S_B : hregister:=reg32toreg8(hregister);
                                           S_B : hregister:=reg32toreg8(hregister);
                                           S_W : hregister:=reg32toreg16(hregister);
                                           S_W : hregister:=reg32toreg16(hregister);
                                        end;
                                        end;
-                                       exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,opsize,newreference(
-                                         p^.left^.location.reference),hregister)));
+                                       emit_ref_reg(A_MOV,opsize,newreference(
+                                         p^.left^.location.reference),hregister);
                                     end;
                                     end;
             else internalerror(2002);
             else internalerror(2002);
          end;
          end;
@@ -918,7 +919,10 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.37  1999-08-04 00:22:54  florian
+  Revision 1.38  1999-08-19 13:08:53  pierre
+   * emit_??? used
+
+  Revision 1.37  1999/08/04 00:22:54  florian
     * renamed i386asm and i386base to cpuasm and cpubase
     * renamed i386asm and i386base to cpuasm and cpubase
 
 
   Revision 1.36  1999/08/03 22:02:48  peter
   Revision 1.36  1999/08/03 22:02:48  peter