This commit is contained in:
Karoly Balogh 2021-12-26 20:39:38 +01:00
commit f8de5fece2
3 changed files with 35 additions and 27 deletions

View File

@ -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;

View File

@ -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$',

View File

@ -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);