Browse Source

Merge branch 'main' of https://gitlab.com/freepascal.org/fpc/source

Karoly Balogh 3 years ago
parent
commit
f8de5fece2
3 changed files with 35 additions and 27 deletions
  1. 12 10
      compiler/ncgrtti.pas
  2. 0 2
      compiler/symconst.pas
  3. 23 15
      compiler/x86/aoptx86.pas

+ 12 - 10
compiler/ncgrtti.pas

@@ -1357,21 +1357,17 @@ implementation
 
         procedure recorddef_rtti(def:trecorddef);
 
-          procedure write_record_operators;
+          procedure write_record_operators(rttilab:tasmlabel);
           var
-            rttilab: Tasmsymbol;
             rttidef: tdef;
             tcb: ttai_typedconstbuilder;
             mop: tmanagementoperator;
             procdef: tprocdef;
           begin
-            rttilab := current_asmdata.DefineAsmSymbol(
-                internaltypeprefixName[itp_init_record_operators]+def.rtti_mangledname(rt),
-                AB_GLOBAL,AT_DATA,def);
             tcb:=ctai_typedconstbuilder.create([tcalo_make_dead_strippable]);
 
             tcb.begin_anonymous_record(
-              rttilab.Name,
+              '',
               defaultpacking,min(reqalign,SizeOf(PInt)),
               targetinfos[target_info.system]^.alignment.recordalignmin
             );
@@ -1400,6 +1396,8 @@ implementation
             tcb.free;
           end;
 
+        var
+          oplab : tasmlabel;
         begin
            write_header(tcb,def,tkRecord);
            { need extra reqalign record, because otherwise the u32 int will
@@ -1426,6 +1424,7 @@ implementation
 
            tcb.emit_ord_const(def.size,u32inttype);
 
+           oplab:=nil;
            { store rtti management operators only for init table }
            if rt=initrtti then
              begin
@@ -1434,9 +1433,12 @@ implementation
                if (trecordsymtable(def.symtable).managementoperators=[]) then
                  tcb.emit_tai(Tai_const.Create_nil_dataptr,voidpointertype)
                else
-                 tcb.emit_tai(Tai_const.Createname(
-                   internaltypeprefixName[itp_init_record_operators]+def.rtti_mangledname(rt),
-                   AT_DATA_FORCEINDIRECT,0),voidpointertype);
+                 begin
+                   current_asmdata.getlocaldatalabel(oplab);
+                   tcb.emit_tai(Tai_const.Createname(
+                     oplab.name,
+                     AT_DATA_FORCEINDIRECT,0),voidpointertype);
+                 end;
              end;
 
            fields_write_rtti_data(tcb,def,rt);
@@ -1445,7 +1447,7 @@ implementation
 
            { write pointers to operators if needed }
            if (rt=initrtti) and (trecordsymtable(def.symtable).managementoperators<>[]) then
-             write_record_operators;
+             write_record_operators(oplab);
         end;
 
 

+ 0 - 2
compiler/symconst.pas

@@ -794,7 +794,6 @@ type
     itp_rtti_set_inner,
     itp_rtti_record,
     itp_rtti_record_inner,
-    itp_init_record_operators,
     itp_init_mop_offset_entry,
     itp_threadvar_record,
     itp_objc_method_list,
@@ -949,7 +948,6 @@ inherited_objectoptions : tobjectoptions = [oo_has_virtual,oo_has_private,oo_has
        '$rtti_set_inner$',
        '$rtti_record$',
        '$rtti_record_inner$',
-       '$init_record_operators$',
        '$init_mop_offset_entry$',
        '$threadvar_record$',
        '$objc_method_list$',

+ 23 - 15
compiler/x86/aoptx86.pas

@@ -10527,13 +10527,33 @@ unit aoptx86;
                     ((taicpu(hp1).oper[0]^.val and Limit) = taicpu(hp1).oper[0]^.val)
                   ) then
                   begin
-                    DebugMsg(SPeepholeOptimization + 'MovxOp2Op 2',p);
+{$if defined(i386) or defined(i8086)}
+                    { If the target size is 8-bit, make sure we can actually encode it }
+                    if (NewRegSize = R_SUBL) and (taicpu(hp1).oper[0]^.typ = top_reg) and not (GetSupReg(taicpu(hp1).oper[0]^.reg) in [RS_EAX,RS_EBX,RS_ECX,RS_EDX]) then
+                      Exit;
+{$endif i386 or i8086}
 
-                    if AndTest and not RegUsed then
-                      taicpu(hp1).opcode := A_TEST;
+                    DebugMsg(SPeepholeOptimization + 'MovxOp2Op 2',p);
 
                     taicpu(hp1).opsize := NewSize;
 
+                    taicpu(hp1).loadoper(1, taicpu(p).oper[0]^);
+                    if AndTest then
+                      begin
+                        RemoveInstruction(hp2);
+                        if not RegUsed then
+                          begin
+                            taicpu(hp1).opcode := A_TEST;
+                            if (taicpu(hp1).oper[0]^.typ = top_ref) then
+                              begin
+                                { Make sure the reference is the second operand }
+                                SwapOper := taicpu(hp1).oper[0];
+                                taicpu(hp1).oper[0] := taicpu(hp1).oper[1];
+                                taicpu(hp1).oper[1] := SwapOper;
+                              end;
+                          end;
+                      end;
+
                     case taicpu(hp1).oper[0]^.typ of
                       top_reg:
                         setsubreg(taicpu(hp1).oper[0]^.reg, NewRegSize);
@@ -10544,18 +10564,6 @@ unit aoptx86;
                         ;
                     end;
 
-                    taicpu(hp1).loadoper(1, taicpu(p).oper[0]^);
-                    if (taicpu(hp1).opcode = A_TEST) and (taicpu(hp1).oper[0]^.typ = top_ref) then
-                      begin
-                        { For TEST, make sure the reference is the second operand }
-                        SwapOper := taicpu(hp1).oper[0];
-                        taicpu(hp1).oper[0] := taicpu(hp1).oper[1];
-                        taicpu(hp1).oper[1] := SwapOper;
-                      end;
-
-                    if AndTest then
-                      RemoveInstruction(hp2);
-
                     if RegUsed then
                       begin
                         AsmL.Remove(p);