Fix to avoid excessive compiler optimization of MicroVAX II ROM access spinwait. Found by Cory Smelosky and Jordi Guillaumes Pons.

Used same solution as the MicroVAX 3900 ROM access logic suggested by Sergy Oboguev in April 2012.
This commit is contained in:
Mark Pizzolato 2014-08-02 15:43:39 -07:00
parent 04b3548920
commit 89ca7bda3b

View file

@ -319,10 +319,11 @@ return ((val << 24) & 0xff000000) | (( val << 8) & 0xff0000) |
((val >> 8) & 0xff00) | ((val >> 24) & 0xff); ((val >> 8) & 0xff00) | ((val >> 24) & 0xff);
} }
volatile int32 rom_loopval = 0;
int32 rom_read_delay (int32 val) int32 rom_read_delay (int32 val)
{ {
uint32 i, l = rom_delay; uint32 i, l = rom_delay;
int32 loopval = 0;
if (rom_unit.flags & UNIT_NODELAY) if (rom_unit.flags & UNIT_NODELAY)
return val; return val;
@ -344,12 +345,12 @@ if (rom_delay == 0) {
by subsequent code or to avoid the whole computation being eliminated. */ by subsequent code or to avoid the whole computation being eliminated. */
for (i = 0; i < c; i++) for (i = 0; i < c; i++)
loopval |= (loopval + ts) ^ rom_swapb (rom_swapb (loopval + ts)); rom_loopval |= (rom_loopval + ts) ^ rom_swapb (rom_swapb (rom_loopval + ts));
te = sim_os_msec (); te = sim_os_msec ();
if ((te - ts) < 50) /* sample big enough? */ if ((te - ts) < 50) /* sample big enough? */
continue; continue;
if (rom_delay < (loopval + (c / (te - ts) / 1000) + 1)) if (rom_delay < (rom_loopval + (c / (te - ts) / 1000) + 1))
rom_delay = loopval + (c / (te - ts) / 1000) + 1; rom_delay = rom_loopval + (c / (te - ts) / 1000) + 1;
if (++samples >= 4) if (++samples >= 4)
break; break;
c = c / 2; c = c / 2;
@ -359,8 +360,8 @@ if (rom_delay == 0) {
} }
for (i = 0; i < l; i++) for (i = 0; i < l; i++)
loopval |= (loopval + val) ^ rom_swapb (rom_swapb (loopval + val)); rom_loopval |= (rom_loopval + val) ^ rom_swapb (rom_swapb (rom_loopval + val));
return val + loopval; return val + rom_loopval;
} }
int32 rom_rd (int32 pa) int32 rom_rd (int32 pa)