[fpc-devel] max_operands for AVR after rev 40170

Pierre Muller pierre at freepascal.org
Fri Nov 2 11:51:18 CET 2018



Le 02/11/2018 à 11:06, Christo Crause a écrit :
> I've noted that r.40170 defines MAX_OPTS_2 for AVR in aoptutils.pas. Should the constant  max_operands in avr/cpubase.pas not also be changed to 2 to be internally consistent?  If so then I can adapt avr/raavr.pas to be consistent with a maximum number of operands of 2.

  Hi Christo,

I simply checked the value of maxops constant for the different CPUs:

$ grep -iw maxops */*pas
aarch64/aoptcpub.pas:  MaxOps = 4;
arm/aoptcpub.pas:  MaxOps = 4;
avr/aoptcpub.pas:  MaxOps = 2;
i386/aoptcpub.pas:  MaxOps = 3;
i8086/aoptcpub.pas:  MaxOps = 3;
jvm/aoptcpub.pas:  MaxOps = 2;
m68k/aoptcpub.pas:  MaxOps = 3;
mips/aoptcpub.pas:  MaxOps = 3;
powerpc/aoptcpub.pas:  MaxOps = 5;
powerpc64/aoptcpub.pas:  MaxOps = 5;
riscv32/aoptcpub.pas:  MaxOps = 5;
riscv64/aoptcpub.pas:  MaxOps = 5;
sparcgen/aoptcpub.pas:  MaxOps = 3;
x86_64/aoptcpub.pas:  MaxOps = 3;

As I found only avr and jvm having a value of 2,
I defined the macro MAX_OPTS_2 (which by the way should rather be renamed MAX_OPS_2...)

max_operands seems to be ddeclared in cpubase units:
$ grep -i "max_operands *=" */*pas
aarch64/cpubase.pas:      max_operands = 6;
arm/cpubase.pas:      max_operands = 6;
avr/cpubase.pas:      max_operands = 4;
jvm/cpubase.pas:      max_operands = 2;
llvm/llvmbase.pas:    max_operands = ((-ord(cpubase.max_operands<=7)) and 7) or ((-ord(cpubase.max_operands>7)) and cpubase.max_operands);
m68k/cpubase.pas:      max_operands = 4;
mips/cpubase.pas:      max_operands = 4;
powerpc/cpubase.pas:      max_operands = 5;
powerpc64/cpubase.pas:  max_operands = 5;
riscv32/cpubase.pas:      max_operands = 5;
riscv64/cpubase.pas:  max_operands = 5;
sparcgen/cpubase.pas:      max_operands = 3;
x86/cpubase.pas:      max_operands = 4;

But you can see that the numbers are quite different...
aarch64:	6/4!
arm:		6/4!
i386		4/3 (the 4 is common to i386,x86_64 and i8086 from x86/cpubase unit)
i8086		4/3, as for i386
jvm		2/2, OK!!
m68k		4/3
mips		4/3
powerpc		5/5, OK!!
powerpc64	5/5, OK!!
riscv32		5/5, OK!!
riscv64		5/5, OK!!
sparcgen	3/3, OK!!
x86_64		4/3, as for i386

Hopefully someone else can explain that discrepancy,
I have no idea why this exists,
it might be simply related to the CPU instructions
with most parameters that are considered for optimization!

Pierre





More information about the fpc-devel mailing list