On 11/11/26 3:15 PM, Matt Turner wrote:
The ev6 has two clusters, {U0,L0} and {U1,L1}, whose register files are
resynchronized once a cycle, so a value produced in one cluster and
consumed in the other arrives a cycle late.  ev6.md carried a note
suggesting that this be modeled by duplicating every EBOX reservation,
raising all latencies by one and adding bypasses within each cluster.

On an EV68AL that would be wrong.  Cluster assignment happens
dynamically at issue, and the hardware puts a dependent consumer in its
producer's cluster whenever it can: a dependent add chain costs 1.008
cycles per link, not the 2 that duplicated reservations would give.

The delay is only forced between units that exist in a single cluster.
The count/MVI unit is U0 only and the multiplier is U1 only, so a
dependence between them has to cross.  A ctpop chain costs 3 cycles per
link and a mulq chain 7, and a chain alternating between them costs
24.2 cycles per four links, against 20 with no penalty and 24 with a
one-cycle penalty on each crossing.

Add a bypass in each direction and replace the note.

gcc/ChangeLog:

        * config/alpha/ev6.md: Add bypasses between ev6_mvi and ev6_imul
        for the cross-cluster delay.  Replace the note about modeling it
        by duplicating the EBOX reservations.
OK
jeff

Reply via email to