O3PCU: Split loads and stores that cross cache line boundaries.
authorTimothy M. Jones <tjones1@inf.ed.ac.uk>
Fri, 12 Feb 2010 19:53:20 +0000 (19:53 +0000)
committerTimothy M. Jones <tjones1@inf.ed.ac.uk>
Fri, 12 Feb 2010 19:53:20 +0000 (19:53 +0000)
commit29e8bcead5700f638c4848d9b5710d0ebf18d64b
treee85dac6557f13146ae2cb119d3ea5b515f3f9e29
parent7fe9f92cfc73147a1a024c1632c9a7619c1779d1
O3PCU: Split loads and stores that cross cache line boundaries.

When each load or store is sent to the LSQ, we check whether it will cross a
cache line boundary and, if so, split it in two. This creates two TLB
translations and two memory requests. Care has to be taken if the first
packet of a split load is sent but the second blocks the cache. Similarly,
for a store, if the first packet cannot be sent, we must store the second
one somewhere to retry later.

This modifies the LSQSenderState class to record both packets in a split
load or store.

Finally, a new const variable, HasUnalignedMemAcc, is added to each ISA
to indicate whether unaligned memory accesses are allowed. This is used
throughout the changed code so that compiler can optimise away code dealing
with split requests for ISAs that don't need them.
src/arch/alpha/isa_traits.hh
src/arch/arm/isa_traits.hh
src/arch/mips/isa_traits.hh
src/arch/power/isa_traits.hh
src/arch/sparc/isa_traits.hh
src/arch/x86/isa_traits.hh
src/cpu/base_dyn_inst.hh
src/cpu/o3/cpu.hh
src/cpu/o3/lsq.hh
src/cpu/o3/lsq_unit.hh
src/cpu/o3/lsq_unit_impl.hh