mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-15 08:39:30 +02:00
+ 8-bit ALU support in tcgcasenode.genlinearcmplist
git-svn-id: trunk@27660 -
This commit is contained in:
parent
87f7cf715e
commit
1d4de72aa7
@ -630,7 +630,7 @@ implementation
|
||||
genitem(t^.less);
|
||||
if t^._low=t^._high then
|
||||
begin
|
||||
{$ifdef cpu32bitalu}
|
||||
{$if defined(cpu32bitalu)}
|
||||
if def_cgsize(opsize) in [OS_S64,OS_64] then
|
||||
begin
|
||||
current_asmdata.getjumplabel(l1);
|
||||
@ -639,8 +639,7 @@ implementation
|
||||
cg.a_label(current_asmdata.CurrAsmList,l1);
|
||||
end
|
||||
else
|
||||
{$endif cpu32bitalu}
|
||||
{$ifdef cpu16bitalu)}
|
||||
{$elseif defined(cpu16bitalu)}
|
||||
if def_cgsize(opsize) in [OS_S64,OS_64] then
|
||||
begin
|
||||
current_asmdata.getjumplabel(l1);
|
||||
@ -658,7 +657,38 @@ implementation
|
||||
cg.a_label(current_asmdata.CurrAsmList,l1);
|
||||
end
|
||||
else
|
||||
{$endif cpu16bitalu}
|
||||
{$elseif defined(cpu8bitalu)}
|
||||
if def_cgsize(opsize) in [OS_S64,OS_64] then
|
||||
begin
|
||||
current_asmdata.getjumplabel(l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList, OS_8, OC_NE, aint(hi(hi(hi(int64(t^._low.svalue))))),GetNextReg(GetNextReg(GetNextReg(hregister2))),l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList, OS_8, OC_NE, aint(lo(hi(hi(int64(t^._low.svalue))))),GetNextReg(GetNextReg(hregister2)),l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList, OS_8, OC_NE, aint(hi(lo(hi(int64(t^._low.svalue))))),GetNextReg(hregister2),l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList, OS_8, OC_NE, aint(lo(lo(hi(int64(t^._low.svalue))))),hregister2,l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList, OS_8, OC_NE, aint(hi(hi(lo(int64(t^._low.svalue))))),GetNextReg(GetNextReg(GetNextReg(hregister))),l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList, OS_8, OC_NE, aint(lo(hi(lo(int64(t^._low.svalue))))),GetNextReg(GetNextReg(hregister)),l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList, OS_8, OC_NE, aint(hi(lo(lo(int64(t^._low.svalue))))),GetNextReg(hregister),l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList, OS_8, OC_EQ, aint(lo(lo(lo(int64(t^._low.svalue))))),hregister,blocklabel(t^.blockid));
|
||||
cg.a_label(current_asmdata.CurrAsmList,l1);
|
||||
end
|
||||
else if def_cgsize(opsize) in [OS_S32,OS_32] then
|
||||
begin
|
||||
current_asmdata.getjumplabel(l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList, OS_8, OC_NE, aint(hi(hi(int32(t^._low.svalue)))),GetNextReg(GetNextReg(GetNextReg(hregister))),l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList, OS_8, OC_NE, aint(lo(hi(int32(t^._low.svalue)))),GetNextReg(GetNextReg(hregister)),l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList, OS_8, OC_NE, aint(hi(lo(int32(t^._low.svalue)))),GetNextReg(hregister),l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList, OS_8, OC_EQ, aint(lo(lo(int32(t^._low.svalue)))),hregister, blocklabel(t^.blockid));
|
||||
cg.a_label(current_asmdata.CurrAsmList,l1);
|
||||
end
|
||||
else if def_cgsize(opsize) in [OS_S16,OS_16] then
|
||||
begin
|
||||
current_asmdata.getjumplabel(l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList, OS_8, OC_NE, aint(hi(int16(t^._low.svalue))),GetNextReg(hregister),l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList, OS_8, OC_EQ, aint(lo(int16(t^._low.svalue))),hregister, blocklabel(t^.blockid));
|
||||
cg.a_label(current_asmdata.CurrAsmList,l1);
|
||||
end
|
||||
else
|
||||
{$endif}
|
||||
begin
|
||||
hlcg.a_cmp_const_reg_label(current_asmdata.CurrAsmList, opsize, OC_EQ, aint(t^._low.svalue),hregister, blocklabel(t^.blockid));
|
||||
end;
|
||||
@ -673,7 +703,7 @@ implementation
|
||||
{ ELSE-label }
|
||||
if not lastwasrange or (t^._low-last>1) then
|
||||
begin
|
||||
{$ifdef cpu32bitalu}
|
||||
{$if defined(cpu32bitalu)}
|
||||
if def_cgsize(opsize) in [OS_64,OS_S64] then
|
||||
begin
|
||||
current_asmdata.getjumplabel(l1);
|
||||
@ -686,8 +716,7 @@ implementation
|
||||
cg.a_label(current_asmdata.CurrAsmList,l1);
|
||||
end
|
||||
else
|
||||
{$endif cpu32bitalu}
|
||||
{$ifdef cpu16bitalu}
|
||||
{$elseif defined(cpu16bitalu)}
|
||||
if def_cgsize(opsize) in [OS_64,OS_S64] then
|
||||
begin
|
||||
current_asmdata.getjumplabel(l1);
|
||||
@ -719,13 +748,58 @@ implementation
|
||||
cg.a_label(current_asmdata.CurrAsmList,l1);
|
||||
end
|
||||
else
|
||||
{$endif cpu16bitalu}
|
||||
{$elseif defined(cpu8bitalu)}
|
||||
if def_cgsize(opsize) in [OS_64,OS_S64] then
|
||||
begin
|
||||
current_asmdata.getjumplabel(l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,jmp_lt,aint(hi(hi(hi(int64(t^._low.svalue))))),GetNextReg(GetNextReg(GetNextReg(hregister2))),elselabel);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,jmp_gt,aint(hi(hi(hi(int64(t^._low.svalue))))),GetNextReg(GetNextReg(GetNextReg(hregister2))),l1);
|
||||
{ the comparison of the low words must be always unsigned! }
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_B,aint(lo(hi(hi(int64(t^._low.svalue))))),GetNextReg(GetNextReg(hregister2)),elselabel);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_A,aint(lo(hi(hi(int64(t^._low.svalue))))),GetNextReg(GetNextReg(hregister2)),l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_B,aint(hi(lo(hi(int64(t^._low.svalue))))),GetNextReg(hregister2),elselabel);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_A,aint(hi(lo(hi(int64(t^._low.svalue))))),GetNextReg(hregister2),l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_B,aint(lo(lo(hi(int64(t^._low.svalue))))),hregister2,elselabel);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_A,aint(lo(lo(hi(int64(t^._low.svalue))))),hregister2,l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_B,aint(hi(hi(lo(int64(t^._low.svalue))))),GetNextReg(GetNextReg(GetNextReg(hregister))),elselabel);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_A,aint(hi(hi(lo(int64(t^._low.svalue))))),GetNextReg(GetNextReg(GetNextReg(hregister))),l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_B,aint(lo(hi(lo(int64(t^._low.svalue))))),GetNextReg(GetNextReg(hregister)),elselabel);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_A,aint(lo(hi(lo(int64(t^._low.svalue))))),GetNextReg(GetNextReg(hregister)),l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_B,aint(hi(lo(lo(int64(t^._low.svalue))))),GetNextReg(hregister),elselabel);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_A,aint(hi(lo(lo(int64(t^._low.svalue))))),GetNextReg(hregister),l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_B,aint(lo(lo(lo(int64(t^._low.svalue))))),hregister,elselabel);
|
||||
cg.a_label(current_asmdata.CurrAsmList,l1);
|
||||
end
|
||||
else if def_cgsize(opsize) in [OS_32,OS_S32] then
|
||||
begin
|
||||
current_asmdata.getjumplabel(l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,jmp_lt,aint(hi(hi(int32(t^._low.svalue)))),GetNextReg(GetNextReg(GetNextReg(hregister))),elselabel);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList, OS_8,jmp_gt,aint(hi(hi(int32(t^._low.svalue)))),GetNextReg(GetNextReg(GetNextReg(hregister))),l1);
|
||||
{ the comparison of the low words must be always unsigned! }
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_B,aint(lo(hi(int32(t^._low.svalue)))),GetNextReg(GetNextReg(hregister)),elselabel);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_A,aint(lo(hi(int32(t^._low.svalue)))),GetNextReg(GetNextReg(hregister)),l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_B,aint(hi(lo(int32(t^._low.svalue)))),GetNextReg(hregister),elselabel);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_A,aint(hi(lo(int32(t^._low.svalue)))),GetNextReg(hregister),l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_B,aint(lo(lo(int32(t^._low.svalue)))),hregister,elselabel);
|
||||
cg.a_label(current_asmdata.CurrAsmList,l1);
|
||||
end
|
||||
else if def_cgsize(opsize) in [OS_16,OS_S16] then
|
||||
begin
|
||||
current_asmdata.getjumplabel(l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,jmp_lt,aint(hi(int16(t^._low.svalue))),GetNextReg(hregister),elselabel);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,jmp_gt,aint(hi(int16(t^._low.svalue))),GetNextReg(hregister),l1);
|
||||
{ the comparisation of the low dword must be always unsigned! }
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_B,aint(lo(int16(t^._low.svalue))),hregister,elselabel);
|
||||
cg.a_label(current_asmdata.CurrAsmList,l1);
|
||||
end
|
||||
else
|
||||
{$endif}
|
||||
begin
|
||||
hlcg.a_cmp_const_reg_label(current_asmdata.CurrAsmList, opsize, jmp_lt, aint(t^._low.svalue), hregister,
|
||||
elselabel);
|
||||
end;
|
||||
end;
|
||||
{$ifdef cpu32bitalu}
|
||||
{$if defined(cpu32bitalu)}
|
||||
if def_cgsize(opsize) in [OS_S64,OS_64] then
|
||||
begin
|
||||
current_asmdata.getjumplabel(l1);
|
||||
@ -737,8 +811,7 @@ implementation
|
||||
cg.a_label(current_asmdata.CurrAsmList,l1);
|
||||
end
|
||||
else
|
||||
{$endif cpu32bitalu}
|
||||
{$ifdef cpu16bitalu}
|
||||
{$elseif defined(cpu16bitalu)}
|
||||
if def_cgsize(opsize) in [OS_S64,OS_64] then
|
||||
begin
|
||||
current_asmdata.getjumplabel(l1);
|
||||
@ -768,7 +841,49 @@ implementation
|
||||
cg.a_label(current_asmdata.CurrAsmList,l1);
|
||||
end
|
||||
else
|
||||
{$endif cpu16bitalu}
|
||||
{$elseif defined(cpu8bitalu)}
|
||||
if def_cgsize(opsize) in [OS_S64,OS_64] then
|
||||
begin
|
||||
current_asmdata.getjumplabel(l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,jmp_lt,aint(hi(hi(hi(int64(t^._high.svalue))))),GetNextReg(GetNextReg(GetNextReg(hregister2))),blocklabel(t^.blockid));
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,jmp_gt,aint(hi(hi(hi(int64(t^._high.svalue))))),GetNextReg(GetNextReg(GetNextReg(hregister2))),l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_B,aint(lo(hi(hi(int64(t^._high.svalue))))),GetNextReg(GetNextReg(hregister2)),blocklabel(t^.blockid));
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_A,aint(lo(hi(hi(int64(t^._high.svalue))))),GetNextReg(GetNextReg(hregister2)),l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_B,aint(hi(lo(hi(int64(t^._high.svalue))))),GetNextReg(hregister2),blocklabel(t^.blockid));
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_A,aint(hi(lo(hi(int64(t^._high.svalue))))),GetNextReg(hregister2),l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_B,aint(lo(lo(hi(int64(t^._high.svalue))))),hregister2,blocklabel(t^.blockid));
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_A,aint(lo(lo(hi(int64(t^._high.svalue))))),hregister2,l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_B,aint(hi(hi(lo(int64(t^._high.svalue))))),GetNextReg(GetNextReg(GetNextReg(hregister))),blocklabel(t^.blockid));
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_A,aint(hi(hi(lo(int64(t^._high.svalue))))),GetNextReg(GetNextReg(GetNextReg(hregister))),l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_B,aint(lo(hi(lo(int64(t^._high.svalue))))),GetNextReg(GetNextReg(hregister)),blocklabel(t^.blockid));
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_A,aint(lo(hi(lo(int64(t^._high.svalue))))),GetNextReg(GetNextReg(hregister)),l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_B,aint(hi(lo(lo(int64(t^._high.svalue))))),GetNextReg(hregister),blocklabel(t^.blockid));
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_A,aint(hi(lo(lo(int64(t^._high.svalue))))),GetNextReg(hregister),l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_BE,aint(lo(lo(lo(int64(t^._high.svalue))))),hregister,blocklabel(t^.blockid));
|
||||
cg.a_label(current_asmdata.CurrAsmList,l1);
|
||||
end
|
||||
else if def_cgsize(opsize) in [OS_S32,OS_32] then
|
||||
begin
|
||||
current_asmdata.getjumplabel(l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,jmp_lt,aint(hi(hi(int32(t^._high.svalue)))),GetNextReg(GetNextReg(GetNextReg(hregister))),blocklabel(t^.blockid));
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,jmp_gt,aint(hi(hi(int32(t^._high.svalue)))),GetNextReg(GetNextReg(GetNextReg(hregister))),l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_B,aint(lo(hi(int32(t^._high.svalue)))),GetNextReg(GetNextReg(hregister)),blocklabel(t^.blockid));
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_A,aint(lo(hi(int32(t^._high.svalue)))),GetNextReg(GetNextReg(hregister)),l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_B,aint(hi(lo(int32(t^._high.svalue)))),GetNextReg(hregister),blocklabel(t^.blockid));
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_A,aint(hi(lo(int32(t^._high.svalue)))),GetNextReg(hregister),l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_BE,aint(lo(lo(int32(t^._high.svalue)))),hregister,blocklabel(t^.blockid));
|
||||
cg.a_label(current_asmdata.CurrAsmList,l1);
|
||||
end
|
||||
else if def_cgsize(opsize) in [OS_S16,OS_16] then
|
||||
begin
|
||||
current_asmdata.getjumplabel(l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,jmp_lt,aint(hi(int16(t^._high.svalue))),GetNextReg(hregister),blocklabel(t^.blockid));
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,jmp_gt,aint(hi(int16(t^._high.svalue))),GetNextReg(hregister),l1);
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_8,OC_BE,aint(lo(int16(t^._high.svalue))),hregister,blocklabel(t^.blockid));
|
||||
cg.a_label(current_asmdata.CurrAsmList,l1);
|
||||
end
|
||||
else
|
||||
{$endif}
|
||||
begin
|
||||
hlcg.a_cmp_const_reg_label(current_asmdata.CurrAsmList, opsize, jmp_le, aint(t^._high.svalue), hregister, blocklabel(t^.blockid));
|
||||
end;
|
||||
|
Loading…
Reference in New Issue
Block a user