(num_pages, use_atomic_ops)
| 13 | const max_num_pages = 16 * GB / kPageSize; |
| 14 | |
| 15 | function BasicMemory64Tests(num_pages, use_atomic_ops) { |
| 16 | const num_bytes = num_pages * kPageSize; |
| 17 | print(`Testing ${num_bytes} bytes (${num_pages} pages) on ${ |
| 18 | use_atomic_ops ? '' : 'non-'}atomic memory`); |
| 19 | |
| 20 | let builder = new WasmModuleBuilder(); |
| 21 | builder.addMemory64(num_pages, num_pages); |
| 22 | builder.exportMemoryAs('memory'); |
| 23 | |
| 24 | // A memory operation with alignment (2) and offset (0). |
| 25 | let op = (non_atomic, atomic) => use_atomic_ops ? |
| 26 | [kAtomicPrefix, atomic, 2, 0] : |
| 27 | [non_atomic, 2, 0]; |
| 28 | builder.addFunction('load', makeSig([kWasmF64], [kWasmI32])) |
| 29 | .addBody([ |
| 30 | kExprLocalGet, 0, // local.get 0 |
| 31 | kExprI64UConvertF64, // i64.uconvert_sat.f64 |
| 32 | ...op(kExprI32LoadMem, kExprI32AtomicLoad) // load |
| 33 | ]) |
| 34 | .exportFunc(); |
| 35 | builder.addFunction('store', makeSig([kWasmF64, kWasmI32], [])) |
| 36 | .addBody([ |
| 37 | kExprLocalGet, 0, // local.get 0 |
| 38 | kExprI64UConvertF64, // i64.uconvert_sat.f64 |
| 39 | kExprLocalGet, 1, // local.get 1 |
| 40 | ...op(kExprI32StoreMem, kExprI32AtomicStore) // store |
| 41 | ]) |
| 42 | .exportFunc(); |
| 43 | |
| 44 | let module = builder.instantiate(); |
| 45 | let memory = module.exports.memory; |
| 46 | let load = module.exports.load; |
| 47 | let store = module.exports.store; |
| 48 | |
| 49 | assertEquals(num_bytes, memory.buffer.byteLength); |
| 50 | // Test that we can create a TypedArray from that large buffer. |
| 51 | let array = new Int8Array(memory.buffer); |
| 52 | assertEquals(num_bytes, array.length); |
| 53 | |
| 54 | const GB = Math.pow(2, 30); |
| 55 | let unalignedAndOobTrap = |
| 56 | use_atomic_ops ? kTrapUnalignedAccess : kTrapMemOutOfBounds; |
| 57 | assertEquals(0, load(num_bytes - 4)); |
| 58 | assertTraps(kTrapMemOutOfBounds, () => load(num_bytes)); |
| 59 | assertTraps(unalignedAndOobTrap, () => load(num_bytes - 3)); |
| 60 | assertTraps(kTrapMemOutOfBounds, () => load(num_bytes - 4 + 4 * GB)); |
| 61 | assertTraps(kTrapMemOutOfBounds, () => store(num_bytes)); |
| 62 | assertTraps(unalignedAndOobTrap, () => store(num_bytes - 3)); |
| 63 | assertTraps(kTrapMemOutOfBounds, () => store(num_bytes - 4 + 4 * GB)); |
| 64 | if (use_atomic_ops) { |
| 65 | assertTraps(kTrapUnalignedAccess, () => load(num_bytes - 7)); |
| 66 | assertTraps(kTrapUnalignedAccess, () => store(num_bytes - 7)); |
| 67 | } |
| 68 | |
| 69 | store(num_bytes - 4, 0x12345678); |
| 70 | assertEquals(0x12345678, load(num_bytes - 4)); |
| 71 | |
| 72 | let kStoreOffset = use_atomic_ops ? 40 : 27; |
no test coverage detected