diff --git a/compiler/ncgrtti.pas b/compiler/ncgrtti.pas index 6551b9585e..58c8a6b09c 100644 --- a/compiler/ncgrtti.pas +++ b/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; diff --git a/compiler/symconst.pas b/compiler/symconst.pas index aa97d73dc8..d0cd60fd1c 100644 --- a/compiler/symconst.pas +++ b/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$', diff --git a/compiler/x86/aoptx86.pas b/compiler/x86/aoptx86.pas index f4b3c0c950..39967d8103 100644 --- a/compiler/x86/aoptx86.pas +++ b/compiler/x86/aoptx86.pas @@ -10527,13 +10527,33 @@ unit aoptx86; ((taicpu(hp1).oper[0]^.val and Limit) = taicpu(hp1).oper[0]^.val) ) then begin +{$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} + DebugMsg(SPeepholeOptimization + 'MovxOp2Op 2',p); - if AndTest and not RegUsed then - taicpu(hp1).opcode := A_TEST; - 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);