From 5237a4d5e2bbd69f511020c977370036c20b8dbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A1roly=20Balogh?= Date: Sat, 5 Nov 2016 17:07:18 +0000 Subject: [PATCH] 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 - --- compiler/aasmtai.pas | 2 ++ compiler/m68k/aasmcpu.pas | 14 ++++++++++++++ compiler/m68k/ag68kgas.pas | 2 ++ compiler/rautils.pas | 9 +++++++-- 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/compiler/aasmtai.pas b/compiler/aasmtai.pas index eeefceca00..67173563e3 100644 --- a/compiler/aasmtai.pas +++ b/compiler/aasmtai.pas @@ -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} diff --git a/compiler/m68k/aasmcpu.pas b/compiler/m68k/aasmcpu.pas index f7c0ee7a53..43a834017f 100644 --- a/compiler/m68k/aasmcpu.pas +++ b/compiler/m68k/aasmcpu.pas @@ -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); diff --git a/compiler/m68k/ag68kgas.pas b/compiler/m68k/ag68kgas.pas index 5a5d18f6f9..022dd212c9 100644 --- a/compiler/m68k/ag68kgas.pas +++ b/compiler/m68k/ag68kgas.pas @@ -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: diff --git a/compiler/rautils.pas b/compiler/rautils.pas index aa4c76cd8f..9f48dfc185 100644 --- a/compiler/rautils.pas +++ b/compiler/rautils.pas @@ -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: