Skip to content

Commit 12f01a5

Browse files
committed
unify LOAD/LOAD_OFFSET etc. into one
1 parent dcb90a4 commit 12f01a5

16 files changed

+1859
-1161
lines changed

std/assembly/internal/array.ts

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {
2-
LOAD_OFFSET,
3-
STORE_OFFSET
2+
LOAD,
3+
STORE
44
} from "./arraybuffer";
55

66
import {
@@ -52,15 +52,15 @@ export function insertionSort<T>(
5252
comparator: (a: T, b: T) => i32
5353
): void {
5454
for (let i = 0; i < length; i++) {
55-
let a = LOAD_OFFSET<T>(buffer, i, byteOffset); // a = arr[i]
55+
let a = LOAD<T>(buffer, i, byteOffset); // a = arr[i]
5656
let j = i - 1;
5757
while (j >= 0) {
58-
let b = LOAD_OFFSET<T>(buffer, j, byteOffset); // b = arr[j]
58+
let b = LOAD<T>(buffer, j, byteOffset); // b = arr[j]
5959
if (comparator(a, b) < 0) {
60-
STORE_OFFSET<T>(buffer, j-- + 1, b, byteOffset); // arr[j + 1] = b
60+
STORE<T>(buffer, j-- + 1, b, byteOffset); // arr[j + 1] = b
6161
} else break;
6262
}
63-
STORE_OFFSET<T>(buffer, j + 1, a, byteOffset); // arr[j + 1] = a
63+
STORE<T>(buffer, j + 1, a, byteOffset); // arr[j + 1] = a
6464
}
6565
}
6666

@@ -84,45 +84,45 @@ export function weakHeapSort<T>(
8484
while ((j & 1) == (load<u32>(bitset + (j >> 6 << shift32)) >> (j >> 1 & 31) & 1)) j >>= 1;
8585

8686
let p = j >> 1;
87-
let a = LOAD_OFFSET<T>(buffer, p, byteOffset); // a = arr[p]
88-
let b = LOAD_OFFSET<T>(buffer, i, byteOffset); // b = arr[i]
87+
let a = LOAD<T>(buffer, p, byteOffset); // a = arr[p]
88+
let b = LOAD<T>(buffer, i, byteOffset); // b = arr[i]
8989
if (comparator(a, b) < 0) {
9090
store<u32>(
9191
bitset + (i >> 5 << shift32),
9292
load<u32>(bitset + (i >> 5 << shift32)) ^ (1 << (i & 31))
9393
);
94-
STORE_OFFSET<T>(buffer, i, a, byteOffset); // arr[i] = a
95-
STORE_OFFSET<T>(buffer, p, b, byteOffset); // arr[p] = b
94+
STORE<T>(buffer, i, a, byteOffset); // arr[i] = a
95+
STORE<T>(buffer, p, b, byteOffset); // arr[p] = b
9696
}
9797
}
9898

9999
for (let i = length - 1; i >= 2; i--) {
100-
let a = LOAD_OFFSET<T>(buffer, 0, byteOffset);
101-
STORE_OFFSET<T>(buffer, 0, LOAD_OFFSET<T>(buffer, i, byteOffset), byteOffset);
102-
STORE_OFFSET<T>(buffer, i, a, byteOffset);
100+
let a = LOAD<T>(buffer, 0, byteOffset);
101+
STORE<T>(buffer, 0, LOAD<T>(buffer, i, byteOffset), byteOffset);
102+
STORE<T>(buffer, i, a, byteOffset);
103103

104104
let x = 1, y: i32;
105105
while ((y = (x << 1) + ((load<u32>(bitset + (x >> 5 << shift32)) >> (x & 31)) & 1)) < i) x = y;
106106

107107
while (x > 0) {
108-
a = LOAD_OFFSET<T>(buffer, 0, byteOffset); // a = arr[0]
109-
let b = LOAD_OFFSET<T>(buffer, x, byteOffset); // b = arr[x]
108+
a = LOAD<T>(buffer, 0, byteOffset); // a = arr[0]
109+
let b = LOAD<T>(buffer, x, byteOffset); // b = arr[x]
110110

111111
if (comparator(a, b) < 0) {
112112
store<u32>(
113113
bitset + (x >> 5 << shift32),
114114
load<u32>(bitset + (x >> 5 << shift32)) ^ (1 << (x & 31))
115115
);
116-
STORE_OFFSET<T>(buffer, x, a, byteOffset); // arr[x] = a
117-
STORE_OFFSET<T>(buffer, 0, b, byteOffset); // arr[0] = b
116+
STORE<T>(buffer, x, a, byteOffset); // arr[x] = a
117+
STORE<T>(buffer, 0, b, byteOffset); // arr[0] = b
118118
}
119119
x >>= 1;
120120
}
121121
}
122122

123123
memory.free(bitset);
124124

125-
var t = LOAD_OFFSET<T>(buffer, 1, byteOffset); // t = arr[1]
126-
STORE_OFFSET<T>(buffer, 1, LOAD_OFFSET<T>(buffer, 0, byteOffset), byteOffset);
127-
STORE_OFFSET<T>(buffer, 0, t, byteOffset); // arr[0] = t
125+
var t = LOAD<T>(buffer, 1, byteOffset); // t = arr[1]
126+
STORE<T>(buffer, 1, LOAD<T>(buffer, 0, byteOffset), byteOffset);
127+
STORE<T>(buffer, 0, t, byteOffset); // arr[0] = t
128128
}

std/assembly/internal/arraybuffer.ts

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -74,27 +74,10 @@ export function reallocateUnsafe(buffer: ArrayBuffer, newByteLength: i32): Array
7474
// without having to emit an additional instruction for conversion purposes. The second parameter
7575
// can be omitted for references and other loads and stores that simply return the exact type.
7676

77-
@inline export function LOAD<T,TOut = T>(buffer: ArrayBuffer, index: i32): TOut {
78-
return <TOut>load<T>(changetype<usize>(buffer) + (<usize>index << alignof<T>()), HEADER_SIZE);
77+
@inline export function LOAD<T,TOut = T>(buffer: ArrayBuffer, index: i32, byteOffset: i32 = 0): TOut {
78+
return <TOut>load<T>(changetype<usize>(buffer) + (<usize>index << alignof<T>()) + <usize>byteOffset, HEADER_SIZE);
7979
}
8080

81-
@inline export function STORE<T,TIn = T>(buffer: ArrayBuffer, index: i32, value: TIn): void {
82-
store<T>(changetype<usize>(buffer) + (<usize>index << alignof<T>()), value, HEADER_SIZE);
83-
}
84-
85-
@inline export function LOAD_OFFSET<T,TOut = T>(
86-
buffer: ArrayBuffer,
87-
index: i32,
88-
byteOffset: i32
89-
): TOut {
90-
return <TOut>load<T>(changetype<usize>(buffer) + <usize>byteOffset + (<usize>index << alignof<T>()), HEADER_SIZE);
91-
}
92-
93-
@inline export function STORE_OFFSET<T,TIn = T>(
94-
buffer: ArrayBuffer,
95-
index: i32,
96-
value: TIn,
97-
byteOffset: i32
98-
): void {
99-
store<T>(changetype<usize>(buffer) + <usize>byteOffset + (<usize>index << alignof<T>()), value, HEADER_SIZE);
81+
@inline export function STORE<T,TIn = T>(buffer: ArrayBuffer, index: i32, value: TIn, byteOffset: i32 = 0): void {
82+
store<T>(changetype<usize>(buffer) + (<usize>index << alignof<T>()) + <usize>byteOffset, value, HEADER_SIZE);
10083
}

std/assembly/internal/typedarray.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import {
22
HEADER_SIZE as AB_HEADER_SIZE,
33
MAX_BLENGTH as AB_MAX_BLENGTH,
44
allocateUnsafe,
5-
LOAD_OFFSET,
6-
STORE_OFFSET
5+
LOAD,
6+
STORE
77
} from "./arraybuffer";
88

99
import {
@@ -38,23 +38,23 @@ export abstract class TypedArray<T> {
3838
@operator("[]")
3939
protected __get(index: i32): T {
4040
if (<u32>index >= <u32>(this.byteLength >>> alignof<T>())) throw new Error("Index out of bounds");
41-
return LOAD_OFFSET<T>(this.buffer, index, this.byteOffset);
41+
return LOAD<T>(this.buffer, index, this.byteOffset);
4242
}
4343

4444
@inline @operator("{}")
4545
protected __unchecked_get(index: i32): T {
46-
return LOAD_OFFSET<T>(this.buffer, index, this.byteOffset);
46+
return LOAD<T>(this.buffer, index, this.byteOffset);
4747
}
4848

4949
@operator("[]=")
5050
protected __set(index: i32, value: NATIVE<T>): void {
5151
if (<u32>index >= <u32>(this.byteLength >>> alignof<T>())) throw new Error("Index out of bounds");
52-
STORE_OFFSET<T,NATIVE<T>>(this.buffer, index, value, this.byteOffset);
52+
STORE<T,NATIVE<T>>(this.buffer, index, value, this.byteOffset);
5353
}
5454

5555
@inline @operator("{}=")
5656
protected __unchecked_set(index: i32, value: NATIVE<T>): void {
57-
STORE_OFFSET<T,NATIVE<T>>(this.buffer, index, value, this.byteOffset);
57+
STORE<T,NATIVE<T>>(this.buffer, index, value, this.byteOffset);
5858
}
5959

6060
// copyWithin(target: i32, start: i32, end: i32 = this.length): this
@@ -82,7 +82,7 @@ export function FILL<TArray extends TypedArray<T>, T>(
8282
}
8383
} else {
8484
for (; start < end; ++start) {
85-
STORE_OFFSET<T,NATIVE<T>>(buffer, start, value, byteOffset);
85+
STORE<T,NATIVE<T>>(buffer, start, value, byteOffset);
8686
}
8787
}
8888
return array;
@@ -98,11 +98,11 @@ export function SORT<TArray extends TypedArray<T>, T>(
9898
if (length <= 1) return array;
9999
var buffer = array.buffer;
100100
if (length == 2) {
101-
let a = LOAD_OFFSET<T>(buffer, 1, byteOffset);
102-
let b = LOAD_OFFSET<T>(buffer, 0, byteOffset);
101+
let a = LOAD<T>(buffer, 1, byteOffset);
102+
let b = LOAD<T>(buffer, 0, byteOffset);
103103
if (comparator(a, b) < 0) {
104-
STORE_OFFSET<T>(buffer, 1, b, byteOffset);
105-
STORE_OFFSET<T>(buffer, 0, a, byteOffset);
104+
STORE<T>(buffer, 1, b, byteOffset);
105+
STORE<T>(buffer, 0, a, byteOffset);
106106
}
107107
return array;
108108
}

tests/compiler/std/array-access.untouched.wat

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
(export "stringArrayArrayMethodCall" (func $std/array-access/stringArrayArrayMethodCall))
2828
(func $~lib/array/Array<Array<i32>>#__get (; 1 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
2929
(local $2 i32)
30+
(local $3 i32)
3031
get_local $0
3132
i32.load
3233
set_local $2
@@ -37,18 +38,23 @@
3738
i32.shr_u
3839
i32.lt_u
3940
if (result i32)
41+
i32.const 0
42+
set_local $3
4043
get_local $2
4144
get_local $1
4245
i32.const 2
4346
i32.shl
4447
i32.add
48+
get_local $3
49+
i32.add
4550
i32.load offset=8
4651
else
4752
unreachable
4853
end
4954
)
5055
(func $~lib/array/Array<i32>#__get (; 2 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
5156
(local $2 i32)
57+
(local $3 i32)
5258
get_local $0
5359
i32.load
5460
set_local $2
@@ -59,11 +65,15 @@
5965
i32.shr_u
6066
i32.lt_u
6167
if (result i32)
68+
i32.const 0
69+
set_local $3
6270
get_local $2
6371
get_local $1
6472
i32.const 2
6573
i32.shl
6674
i32.add
75+
get_local $3
76+
i32.add
6777
i32.load offset=8
6878
else
6979
unreachable
@@ -78,6 +88,7 @@
7888
)
7989
(func $~lib/array/Array<String>#__get (; 4 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
8090
(local $2 i32)
91+
(local $3 i32)
8192
get_local $0
8293
i32.load
8394
set_local $2
@@ -88,11 +99,15 @@
8899
i32.shr_u
89100
i32.lt_u
90101
if (result i32)
102+
i32.const 0
103+
set_local $3
91104
get_local $2
92105
get_local $1
93106
i32.const 2
94107
i32.shl
95108
i32.add
109+
get_local $3
110+
i32.add
96111
i32.load offset=8
97112
else
98113
unreachable
@@ -234,6 +249,7 @@
234249
)
235250
(func $~lib/array/Array<Array<String>>#__get (; 9 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
236251
(local $2 i32)
252+
(local $3 i32)
237253
get_local $0
238254
i32.load
239255
set_local $2
@@ -244,11 +260,15 @@
244260
i32.shr_u
245261
i32.lt_u
246262
if (result i32)
263+
i32.const 0
264+
set_local $3
247265
get_local $2
248266
get_local $1
249267
i32.const 2
250268
i32.shl
251269
i32.add
270+
get_local $3
271+
i32.add
252272
i32.load offset=8
253273
else
254274
unreachable

0 commit comments

Comments
 (0)