[wasm] Speed up some tests in grow-memory

Rework testMemoryGrowPreservesDataMemOp tests so that they only test the
first and last 5 offsets within the page, instead of every offset.

Slight logic change: instead of storing the value C - offset (where C is
a constant that is different for 32 and 16 memops), we store just the
value offset. This allows us to combine the logic for all 3 memops (32,
16, and 8). But we need to add a modulo so that in the 8 bit case, we
don't store a value that exceeds the maximum (the other cases will never
hit a case that exceeds the max).

Bug: v8:7783
Change-Id: Ibfdc77555ba2ca26391eba303050a03538f6012d
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2117633
Reviewed-by: Deepti Gandluri <gdeepti@chromium.org>
Commit-Queue: Zhi An Ng <zhin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#66879}
This commit is contained in:
Ng Zhi An 2020-03-24 10:56:20 -07:00 committed by Commit Bot
parent 820a3bdadf
commit efb1b5e430

View File

@ -245,78 +245,55 @@ function testMemoryGrowCurrentMemory() {
testMemoryGrowCurrentMemory();
function testMemoryGrowPreservesDataMemOp32() {
function testMemoryGrowPreservesDataMemOpBase(size, load_fn, store_fn) {
var builder = genMemoryGrowBuilder();
builder.addMemory(1, undefined, false);
var module = builder.instantiate();
var offset, val;
function peek() { return module.exports.load(offset); }
function poke(value) { return module.exports.store(offset, value); }
var offset;
var load = module.exports[load_fn];
var store = module.exports[store_fn];
function peek() { return load(offset); }
function poke(value) { return store(offset, value); }
function growMem(pages) { return module.exports.grow_memory(pages); }
// Maximum unsigned integer of size bits.
const max = Math.pow(2, (size * 8)) - 1;
for(offset = 0; offset <= (kPageSize - 4); offset+=4) {
poke(100000 - offset);
assertEquals(100000 - offset, peek());
// Check the first 5 offsets.
for(offset = 0; offset <= (4*size); offset+=size) {
poke(offset % max);
assertEquals(offset % max, peek());
}
// Check the last 5 valid offsets.
for(offset = kPageSize - 5*size; offset <= (kPageSize - size); offset+=size) {
poke(offset % max);
assertEquals(offset % max, peek());
}
assertEquals(1, growMem(3));
for(offset = 0; offset <= (kPageSize - 4); offset+=4) {
assertEquals(100000 - offset, peek());
// Check the first 5 offsets are preserved by growMem.
for(offset = 0; offset <= (4*size); offset+=size) {
assertEquals(offset % max, peek());
}
// Check the last 5 valid offsets are preserved by growMem.
for(offset = kPageSize - 5*size; offset <= (kPageSize - size); offset+=size) {
assertEquals(offset % max, peek());
}
}
testMemoryGrowPreservesDataMemOp32();
(function testMemoryGrowPreservesDataMemOp32() {
testMemoryGrowPreservesDataMemOpBase(4, "load", "store");
})();
function testMemoryGrowPreservesDataMemOp16() {
var builder = genMemoryGrowBuilder();
builder.addMemory(1, undefined, false);
var module = builder.instantiate();
var offset, val;
function peek() { return module.exports.load16(offset); }
function poke(value) { return module.exports.store16(offset, value); }
function growMem(pages) { return module.exports.grow_memory(pages); }
(function testMemoryGrowPreservesDataMemOp16() {
testMemoryGrowPreservesDataMemOpBase(2, "load16", "store16");
})();
for(offset = 0; offset <= (kPageSize - 2); offset+=2) {
poke(65535 - offset);
assertEquals(65535 - offset, peek());
}
assertEquals(1, growMem(3));
for(offset = 0; offset <= (kPageSize - 2); offset+=2) {
assertEquals(65535 - offset, peek());
}
}
testMemoryGrowPreservesDataMemOp16();
function testMemoryGrowPreservesDataMemOp8() {
var builder = genMemoryGrowBuilder();
builder.addMemory(1, undefined, false);
var module = builder.instantiate();
var offset, val = 0;
function peek() { return module.exports.load8(offset); }
function poke(value) { return module.exports.store8(offset, value); }
function growMem(pages) { return module.exports.grow_memory(pages); }
for(offset = 0; offset <= (kPageSize - 1); offset++, val++) {
poke(val);
assertEquals(val, peek());
if (val == 255) val = 0;
}
assertEquals(1, growMem(3));
val = 0;
for(offset = 0; offset <= (kPageSize - 1); offset++, val++) {
assertEquals(val, peek());
if (val == 255) val = 0;
}
}
testMemoryGrowPreservesDataMemOp8();
(function testMemoryGrowPreservesDataMemOp8() {
testMemoryGrowPreservesDataMemOpBase(1, "load8", "store8");
})();
function testMemoryGrowOutOfBoundsOffset() {
var builder = genMemoryGrowBuilder();