From 42de9675764fd67e13d30bd6a974e56c214e6684 Mon Sep 17 00:00:00 2001 From: Chris Duncan Date: Thu, 2 Jan 2025 13:39:18 -0800 Subject: [PATCH] Dereference array args instead of creating copies. --- src/lib/workers/powgpu.ts | 60 +++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 31 deletions(-) diff --git a/src/lib/workers/powgpu.ts b/src/lib/workers/powgpu.ts index 6aff313..4616d69 100644 --- a/src/lib/workers/powgpu.ts +++ b/src/lib/workers/powgpu.ts @@ -85,55 +85,53 @@ export class PowGpu extends WorkerInterface { * Sets v[a,a+1] += b * b0 is the low 32 bits of b, b1 represents the high 32 bits */ - fn add_uint64 (ptr_v: ptr>, a: u32, b0: u32, b1: u32) { - var o0: u32 = (*ptr_v)[a] + b0; - var o1: u32 = (*ptr_v)[a+1u] + b1; - if ((*ptr_v)[a] > 0xFFFFFFFFu - b0) { // did low 32 bits overflow? + fn add_uint64 (v: ptr>, a: u32, b0: u32, b1: u32) { + var o0: u32 = (*v)[a] + b0; + var o1: u32 = (*v)[a+1u] + b1; + if ((*v)[a] > 0xFFFFFFFFu - b0) { // did low 32 bits overflow? o1 = o1 + 1u; } - (*ptr_v)[a] = o0; - (*ptr_v)[a+1u] = o1; + (*v)[a] = o0; + (*v)[a+1u] = o1; } /** * G Mixing function */ - fn B2B_G (ptr_v: ptr>, ptr_m: ptr>, a: u32, b: u32, c: u32, d: u32, ix: u32, iy: u32) { - var v: array = (*ptr_v); - var m: array = (*ptr_m); - add_uint64(ptr_v, a, v[b], v[b+1u]); - add_uint64(ptr_v, a, m[ix], m[ix+1u]); + fn B2B_G (v: ptr>, m: ptr>, a: u32, b: u32, c: u32, d: u32, ix: u32, iy: u32) { + add_uint64(v, a, (*v)[b], (*v)[b+1u]); + add_uint64(v, a, (*m)[ix], (*m)[ix+1u]); // v[d,d+1] = (v[d,d+1] xor v[a,a+1]) rotated to the right by 32 bits - var xor0: u32 = v[d] ^ v[a]; - var xor1: u32 = v[d+1u] ^ v[a+1u]; - v[d] = xor1; - v[d+1u] = xor0; + var xor0: u32 = (*v)[d] ^ (*v)[a]; + var xor1: u32 = (*v)[d+1u] ^ (*v)[a+1u]; + (*v)[d] = xor1; + (*v)[d+1u] = xor0; - add_uint64(ptr_v, c, v[d], v[d+1u]); + add_uint64(v, c, (*v)[d], (*v)[d+1u]); // v[b,b+1] = (v[b,b+1] xor v[c,c+1]) rotated right by 24 bits - xor0 = v[b] ^ v[c]; - xor1 = v[b+1u] ^ v[c+1u]; - v[b] = (xor0 >> 24u) ^ (xor1 << 8u); - v[b+1u] = (xor1 >> 24u) ^ (xor0 << 8u); + xor0 = (*v)[b] ^ (*v)[c]; + xor1 = (*v)[b+1u] ^ (*v)[c+1u]; + (*v)[b] = (xor0 >> 24u) ^ (xor1 << 8u); + (*v)[b+1u] = (xor1 >> 24u) ^ (xor0 << 8u); - add_uint64(ptr_v, a, v[b], v[b+1u]); - add_uint64(ptr_v, a, m[iy], m[iy+1u]); + add_uint64(v, a, (*v)[b], (*v)[b+1u]); + add_uint64(v, a, (*m)[iy], (*m)[iy+1u]); // v[d,d+1] = (v[d,d+1] xor v[a,a+1]) rotated right by 16 bits - xor0 = v[d] ^ v[a]; - xor1 = v[d+1u] ^ v[a+1u]; - v[d] = (xor0 >> 16u) ^ (xor1 << 16u); - v[d+1u] = (xor1 >> 16u) ^ (xor0 << 16u); + xor0 = (*v)[d] ^ (*v)[a]; + xor1 = (*v)[d+1u] ^ (*v)[a+1u]; + (*v)[d] = (xor0 >> 16u) ^ (xor1 << 16u); + (*v)[d+1u] = (xor1 >> 16u) ^ (xor0 << 16u); - add_uint64(ptr_v, c, v[d], v[d+1u]); + add_uint64(v, c, (*v)[d], (*v)[d+1u]); // v[b,b+1] = (v[b,b+1] xor v[c,c+1]) rotated right by 63 bits - xor0 = v[b] ^ v[c]; - xor1 = v[b+1u] ^ v[c+1u]; - v[b] = (xor1 >> 31u) ^ (xor0 << 1u); - v[b+1u] = (xor0 >> 31u) ^ (xor1 << 1u); + xor0 = (*v)[b] ^ (*v)[c]; + xor1 = (*v)[b+1u] ^ (*v)[c+1u]; + (*v)[b] = (xor1 >> 31u) ^ (xor0 << 1u); + (*v)[b+1u] = (xor0 >> 31u) ^ (xor1 << 1u); } /** -- 2.34.1