Skip to content

Commit 9b21306

Browse files
authored
fix: Fix invalid store offsets in memset polyfill (AssemblyScript#1787)
1 parent be3dfaf commit 9b21306

File tree

120 files changed

+3506
-1471
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

120 files changed

+3506
-1471
lines changed

std/assembly/util/memory.ts

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -201,17 +201,17 @@ export function memset(dest: usize, c: u8, n: usize): void { // see: musl/src/st
201201
} else {
202202
// fill head and tail with minimal branching
203203
if (!n) return;
204-
let dend = dest + n - 4;
204+
let dend = dest + n;
205205
store<u8>(dest, c);
206-
store<u8>(dend, c, 3);
206+
store<u8>(dend - 1, c);
207207
if (n <= 2) return;
208208
store<u8>(dest, c, 1);
209209
store<u8>(dest, c, 2);
210-
store<u8>(dend, c, 2);
211-
store<u8>(dend, c, 1);
210+
store<u8>(dend - 2, c);
211+
store<u8>(dend - 3, c);
212212
if (n <= 6) return;
213213
store<u8>(dest, c, 3);
214-
store<u8>(dend, c);
214+
store<u8>(dend - 4, c);
215215
if (n <= 8) return;
216216

217217
// advance pointer to align it at 4-byte boundary
@@ -223,23 +223,23 @@ export function memset(dest: usize, c: u8, n: usize): void { // see: musl/src/st
223223
let c32: u32 = <u32>-1 / 255 * c;
224224

225225
// fill head/tail up to 28 bytes each in preparation
226-
dend = dest + n - 28;
226+
dend = dest + n;
227227
store<u32>(dest, c32);
228-
store<u32>(dend, c32, 24);
228+
store<u32>(dend - 4, c32);
229229
if (n <= 8) return;
230230
store<u32>(dest, c32, 4);
231231
store<u32>(dest, c32, 8);
232-
store<u32>(dend, c32, 16);
233-
store<u32>(dend, c32, 20);
232+
store<u32>(dend - 12, c32);
233+
store<u32>(dend - 8, c32);
234234
if (n <= 24) return;
235235
store<u32>(dest, c32, 12);
236236
store<u32>(dest, c32, 16);
237237
store<u32>(dest, c32, 20);
238238
store<u32>(dest, c32, 24);
239-
store<u32>(dend, c32);
240-
store<u32>(dend, c32, 4);
241-
store<u32>(dend, c32, 8);
242-
store<u32>(dend, c32, 12);
239+
store<u32>(dend - 28, c32);
240+
store<u32>(dend - 24, c32);
241+
store<u32>(dend - 20, c32);
242+
store<u32>(dend - 16, c32);
243243

244244
// align to a multiple of 8
245245
k = 24 + (dest & 4);

tests/compiler/call-super.optimized.wat

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1449,11 +1449,11 @@
14491449
local.get $0
14501450
local.get $1
14511451
i32.add
1452-
i32.const 4
1453-
i32.sub
14541452
local.tee $2
1453+
i32.const 1
1454+
i32.sub
14551455
i32.const 0
1456-
i32.store8 offset=3
1456+
i32.store8
14571457
local.get $1
14581458
i32.const 2
14591459
i32.le_u
@@ -1465,11 +1465,15 @@
14651465
i32.const 0
14661466
i32.store8 offset=2
14671467
local.get $2
1468+
i32.const 2
1469+
i32.sub
14681470
i32.const 0
1469-
i32.store8 offset=2
1471+
i32.store8
14701472
local.get $2
1473+
i32.const 3
1474+
i32.sub
14711475
i32.const 0
1472-
i32.store8 offset=1
1476+
i32.store8
14731477
local.get $1
14741478
i32.const 6
14751479
i32.le_u
@@ -1478,6 +1482,8 @@
14781482
i32.const 0
14791483
i32.store8 offset=3
14801484
local.get $2
1485+
i32.const 4
1486+
i32.sub
14811487
i32.const 0
14821488
i32.store8
14831489
local.get $1
@@ -1503,11 +1509,11 @@
15031509
i32.and
15041510
local.tee $2
15051511
i32.add
1506-
i32.const 28
1507-
i32.sub
15081512
local.tee $1
1513+
i32.const 4
1514+
i32.sub
15091515
i32.const 0
1510-
i32.store offset=24
1516+
i32.store
15111517
local.get $2
15121518
i32.const 8
15131519
i32.le_u
@@ -1519,11 +1525,15 @@
15191525
i32.const 0
15201526
i32.store offset=8
15211527
local.get $1
1528+
i32.const 12
1529+
i32.sub
15221530
i32.const 0
1523-
i32.store offset=16
1531+
i32.store
15241532
local.get $1
1533+
i32.const 8
1534+
i32.sub
15251535
i32.const 0
1526-
i32.store offset=20
1536+
i32.store
15271537
local.get $2
15281538
i32.const 24
15291539
i32.le_u
@@ -1541,17 +1551,25 @@
15411551
i32.const 0
15421552
i32.store offset=24
15431553
local.get $1
1554+
i32.const 28
1555+
i32.sub
15441556
i32.const 0
15451557
i32.store
15461558
local.get $1
1559+
i32.const 24
1560+
i32.sub
15471561
i32.const 0
1548-
i32.store offset=4
1562+
i32.store
15491563
local.get $1
1564+
i32.const 20
1565+
i32.sub
15501566
i32.const 0
1551-
i32.store offset=8
1567+
i32.store
15521568
local.get $1
1569+
i32.const 16
1570+
i32.sub
15531571
i32.const 0
1554-
i32.store offset=12
1572+
i32.store
15551573
local.get $0
15561574
local.get $0
15571575
i32.const 4

tests/compiler/call-super.untouched.wat

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2089,15 +2089,15 @@
20892089
local.get $5
20902090
local.get $3
20912091
i32.add
2092-
i32.const 4
2093-
i32.sub
20942092
local.set $6
20952093
local.get $5
20962094
local.get $4
20972095
i32.store8
20982096
local.get $6
2097+
i32.const 1
2098+
i32.sub
20992099
local.get $4
2100-
i32.store8 offset=3
2100+
i32.store8
21012101
local.get $3
21022102
i32.const 2
21032103
i32.le_u
@@ -2111,11 +2111,15 @@
21112111
local.get $4
21122112
i32.store8 offset=2
21132113
local.get $6
2114+
i32.const 2
2115+
i32.sub
21142116
local.get $4
2115-
i32.store8 offset=2
2117+
i32.store8
21162118
local.get $6
2119+
i32.const 3
2120+
i32.sub
21172121
local.get $4
2118-
i32.store8 offset=1
2122+
i32.store8
21192123
local.get $3
21202124
i32.const 6
21212125
i32.le_u
@@ -2126,6 +2130,8 @@
21262130
local.get $4
21272131
i32.store8 offset=3
21282132
local.get $6
2133+
i32.const 4
2134+
i32.sub
21292135
local.get $4
21302136
i32.store8
21312137
local.get $3
@@ -2163,15 +2169,15 @@
21632169
local.get $5
21642170
local.get $3
21652171
i32.add
2166-
i32.const 28
2167-
i32.sub
21682172
local.set $6
21692173
local.get $5
21702174
local.get $8
21712175
i32.store
21722176
local.get $6
2177+
i32.const 4
2178+
i32.sub
21732179
local.get $8
2174-
i32.store offset=24
2180+
i32.store
21752181
local.get $3
21762182
i32.const 8
21772183
i32.le_u
@@ -2185,11 +2191,15 @@
21852191
local.get $8
21862192
i32.store offset=8
21872193
local.get $6
2194+
i32.const 12
2195+
i32.sub
21882196
local.get $8
2189-
i32.store offset=16
2197+
i32.store
21902198
local.get $6
2199+
i32.const 8
2200+
i32.sub
21912201
local.get $8
2192-
i32.store offset=20
2202+
i32.store
21932203
local.get $3
21942204
i32.const 24
21952205
i32.le_u
@@ -2209,17 +2219,25 @@
22092219
local.get $8
22102220
i32.store offset=24
22112221
local.get $6
2222+
i32.const 28
2223+
i32.sub
22122224
local.get $8
22132225
i32.store
22142226
local.get $6
2227+
i32.const 24
2228+
i32.sub
22152229
local.get $8
2216-
i32.store offset=4
2230+
i32.store
22172231
local.get $6
2232+
i32.const 20
2233+
i32.sub
22182234
local.get $8
2219-
i32.store offset=8
2235+
i32.store
22202236
local.get $6
2237+
i32.const 16
2238+
i32.sub
22212239
local.get $8
2222-
i32.store offset=12
2240+
i32.store
22232241
i32.const 24
22242242
local.get $5
22252243
i32.const 4

tests/compiler/class-implements.untouched.wat

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2099,15 +2099,15 @@
20992099
local.get $5
21002100
local.get $3
21012101
i32.add
2102-
i32.const 4
2103-
i32.sub
21042102
local.set $6
21052103
local.get $5
21062104
local.get $4
21072105
i32.store8
21082106
local.get $6
2107+
i32.const 1
2108+
i32.sub
21092109
local.get $4
2110-
i32.store8 offset=3
2110+
i32.store8
21112111
local.get $3
21122112
i32.const 2
21132113
i32.le_u
@@ -2121,11 +2121,15 @@
21212121
local.get $4
21222122
i32.store8 offset=2
21232123
local.get $6
2124+
i32.const 2
2125+
i32.sub
21242126
local.get $4
2125-
i32.store8 offset=2
2127+
i32.store8
21262128
local.get $6
2129+
i32.const 3
2130+
i32.sub
21272131
local.get $4
2128-
i32.store8 offset=1
2132+
i32.store8
21292133
local.get $3
21302134
i32.const 6
21312135
i32.le_u
@@ -2136,6 +2140,8 @@
21362140
local.get $4
21372141
i32.store8 offset=3
21382142
local.get $6
2143+
i32.const 4
2144+
i32.sub
21392145
local.get $4
21402146
i32.store8
21412147
local.get $3
@@ -2173,15 +2179,15 @@
21732179
local.get $5
21742180
local.get $3
21752181
i32.add
2176-
i32.const 28
2177-
i32.sub
21782182
local.set $6
21792183
local.get $5
21802184
local.get $8
21812185
i32.store
21822186
local.get $6
2187+
i32.const 4
2188+
i32.sub
21832189
local.get $8
2184-
i32.store offset=24
2190+
i32.store
21852191
local.get $3
21862192
i32.const 8
21872193
i32.le_u
@@ -2195,11 +2201,15 @@
21952201
local.get $8
21962202
i32.store offset=8
21972203
local.get $6
2204+
i32.const 12
2205+
i32.sub
21982206
local.get $8
2199-
i32.store offset=16
2207+
i32.store
22002208
local.get $6
2209+
i32.const 8
2210+
i32.sub
22012211
local.get $8
2202-
i32.store offset=20
2212+
i32.store
22032213
local.get $3
22042214
i32.const 24
22052215
i32.le_u
@@ -2219,17 +2229,25 @@
22192229
local.get $8
22202230
i32.store offset=24
22212231
local.get $6
2232+
i32.const 28
2233+
i32.sub
22222234
local.get $8
22232235
i32.store
22242236
local.get $6
2237+
i32.const 24
2238+
i32.sub
22252239
local.get $8
2226-
i32.store offset=4
2240+
i32.store
22272241
local.get $6
2242+
i32.const 20
2243+
i32.sub
22282244
local.get $8
2229-
i32.store offset=8
2245+
i32.store
22302246
local.get $6
2247+
i32.const 16
2248+
i32.sub
22312249
local.get $8
2232-
i32.store offset=12
2250+
i32.store
22332251
i32.const 24
22342252
local.get $5
22352253
i32.const 4

0 commit comments

Comments
 (0)