m68k: support register pair operands in assembler reader and writer, as used by some instructions (mainly DIVS/DIVU and friends) so we don't have to hack them as three operand instructions

git-svn-id: trunk@34782 -
This commit is contained in:
Károly Balogh 2016-11-05 17:07:18 +00:00
parent 8833a6fbba
commit 5237a4d5e2
4 changed files with 25 additions and 2 deletions

View File

@ -236,6 +236,7 @@ interface
{$ifdef m68k}
{ m68k only }
,top_regset
,top_regpair
,top_realconst
{$endif m68k}
{$ifdef jvm}
@ -427,6 +428,7 @@ interface
{$endif defined(arm) or defined(aarch64)}
{$ifdef m68k}
top_regset : (dataregset,addrregset,fpuregset: tcpuregisterset);
top_regpair : (reghi,reglo: tregister);
top_realconst : (val_real:bestreal);
{$endif m68k}
{$ifdef jvm}

View File

@ -42,6 +42,7 @@ type
opsize : topsize;
procedure loadregset(opidx:longint; const dataregs,addrregs,fpuregs:tcpuregisterset);
procedure loadregpair(opidx:longint; const _reghi,_reglo: tregister);
procedure loadrealconst(opidx:longint; const value_real: bestreal);
constructor op_none(op : tasmop);
@ -149,6 +150,19 @@ type
end;
end;
procedure taicpu.loadregpair(opidx:longint; const _reghi,_reglo: tregister);
begin
allocate_oper(opidx+1);
with oper[opidx]^ do
begin
if typ<>top_regpair then
clearop(opidx);
typ:=top_regpair;
reghi:=_reghi;
reglo:=_reglo;
end;
end;
procedure taicpu.loadrealconst(opidx:longint; const value_real: bestreal);
begin
allocate_oper(opidx+1);

View File

@ -178,6 +178,8 @@ interface
end;
delete(getopstr,length(getopstr),1);
end;
top_regpair:
getopstr:=gas_regname(o.reghi)+':'+gas_regname(o.reglo);
top_const:
getopstr:='#'+tostr(longint(o.val));
top_realconst:

View File

@ -43,7 +43,9 @@ Function SearchLabel(const s: string; var hl: tasmlabel;emit:boolean): boolean;
type
TOprType=(OPR_NONE,OPR_CONSTANT,OPR_SYMBOL,OPR_LOCAL,
OPR_REFERENCE,OPR_REGISTER,OPR_COND,OPR_REGSET,OPR_SHIFTEROP,OPR_MODEFLAGS,OPR_SPECIALREG);
OPR_REFERENCE,OPR_REGISTER,OPR_COND,OPR_REGSET,
OPR_SHIFTEROP,OPR_MODEFLAGS,OPR_SPECIALREG,
OPR_REGPAIR);
TOprRec = record
case typ:TOprType of
@ -54,7 +56,8 @@ type
OPR_LOCAL : (localvarsize, localconstoffset: asizeint;localsym:tabstractnormalvarsym;localsymofs:aint;localindexreg:tregister;localscale:byte;localgetoffset,localforceref:boolean);
OPR_REGISTER : (reg:tregister);
{$ifdef m68k}
OPR_REGSET : (regsetdata,regsetaddr,regsetfpu : tcpuregisterset);
OPR_REGSET : (regsetdata,regsetaddr,regsetfpu : tcpuregisterset);
OPR_REGPAIR : (reghi,reglo: tregister);
{$endif m68k}
{$ifdef powerpc}
OPR_COND : (cond : tasmcond);
@ -1108,6 +1111,8 @@ end;
{$ifdef m68k}
OPR_REGSET:
ai.loadregset(i-1,regsetdata,regsetaddr,regsetfpu);
OPR_REGPAIR:
ai.loadregpair(i-1,reghi,reglo);
{$endif}
{$ifdef ARM}
OPR_REGSET: