core: Add a short multiplier
authorPaul Mackerras <paulus@ozlabs.org>
Sat, 11 Sep 2021 07:10:20 +0000 (17:10 +1000)
committerPaul Mackerras <paulus@ozlabs.org>
Wed, 15 Sep 2021 00:41:30 +0000 (10:41 +1000)
commit734e4c4a529152bfd6d8a1f2e93c520e34755191
treeab478ddb8cdf525307028b0735924acf87a91aca
parent2224b28c2cccb95179a6624dedcad791ab68807f
core: Add a short multiplier

This adds an optional 16 bit x 16 bit signed multiplier and uses it
for multiply instructions that return the low 64 bits of the product
(mull[dw][o] and mulli, but not maddld) when the operands are both in
the range -2^15 .. 2^15 - 1.   The "short" 16-bit multiplier produces
its result combinatorially, so a multiply that uses it executes in one
cycle.  This improves the coremark result by about 4%, since coremark
does quite a lot of multiplies and they almost all have operands that
fit into 16 bits.

The presence of the short multiplier is controlled by a generic at the
execute1, SOC, core and top levels.  For now, it defaults to off for
all platforms, and can be enabled using the --has_short_mult flag to
fusesoc.

Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
core.vhdl
execute1.vhdl
fpga/top-arty.vhdl
fpga/top-generic.vhdl
fpga/top-nexys-video.vhdl
microwatt.core
multiply.vhdl
soc.vhdl
xilinx-mult.vhdl