Skip to content

Commit 652f9ad

Browse files
committed
Always use bulkmemory memcpy and memset when available
Unlike the JS versions of these function there is no need to only use these for small inputs. Results of running the test_memcpy_128b test before and after this change: ``` v8-bulk: mean: 1.536 (+-0.071) secs median: 1.495 range: 1.471-1.650 (noise: 4.630%) (5 runs) size: 149291, compressed: 54249 ``` -> ``` v8-bulk: mean: 1.489 (+-0.117) secs median: 1.535 range: 1.268-1.606 (noise: 7.871%) (5 runs)- size: 148387, compressed: 53813- ``` See comments in #19128
1 parent e2ad780 commit 652f9ad

File tree

60 files changed

+84
-85
lines changed

Some content is hidden

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

60 files changed

+84
-85
lines changed

src/library.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -385,8 +385,8 @@ addToLibrary({
385385
$ENV: {},
386386

387387
// In -Oz builds, we replace memcpy() altogether with a non-unrolled wasm
388-
// variant, so we should never emit emscripten_memcpy_big() in the build.
389-
// In STANDALONE_WASM we avoid the emscripten_memcpy_big dependency so keep
388+
// variant, so we should never emit emscripten_memcpy_js() in the build.
389+
// In STANDALONE_WASM we avoid the emscripten_memcpy_js dependency so keep
390390
// the wasm file standalone.
391391
// In BULK_MEMORY mode we include native versions of these functions based
392392
// on memory.fill and memory.copy.
@@ -407,11 +407,11 @@ addToLibrary({
407407
// AppleWebKit/605.1.15 Safari/604.1 Version/13.0.4 iPhone OS 13_3 on iPhone 6s with iOS 13.3
408408
// AppleWebKit/605.1.15 Version/13.0.3 Intel Mac OS X 10_15_1 on Safari 13.0.3 (15608.3.10.1.4) on macOS Catalina 10.15.1
409409
// Hence the support status of .copyWithin() for Safari version range [10.0.0, 10.1.0] is unknown.
410-
emscripten_memcpy_big: `= Uint8Array.prototype.copyWithin
410+
emscripten_memcpy_js: `= Uint8Array.prototype.copyWithin
411411
? (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num)
412412
: (dest, src, num) => HEAPU8.set(HEAPU8.subarray(src, src+num), dest)`,
413413
#else
414-
emscripten_memcpy_big: (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num),
414+
emscripten_memcpy_js: (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num),
415415
#endif
416416

417417
#endif

src/library_sigs.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -690,7 +690,7 @@ sigs = {
690690
emscripten_math_sqrt__sig: 'dd',
691691
emscripten_math_tan__sig: 'dd',
692692
emscripten_math_tanh__sig: 'dd',
693-
emscripten_memcpy_big__sig: 'vppp',
693+
emscripten_memcpy_js__sig: 'vppp',
694694
emscripten_navigator_hardware_concurrency__sig: 'i',
695695
emscripten_notify_memory_growth__sig: 'vp',
696696
emscripten_num_logical_cores__sig: 'i',

system/lib/libc/emscripten_internal.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,14 @@ extern "C" {
2828

2929
// An external JS implementation that is efficient for very large copies, using
3030
// HEAPU8.set()
31-
void emscripten_memcpy_big(void* __restrict__ dest,
31+
void emscripten_memcpy_js(void* __restrict__ dest,
3232
const void* __restrict__ src,
33-
size_t n) EM_IMPORT(emscripten_memcpy_big);
34-
void emscripten_memset_big(void* ptr, char value, size_t n);
33+
size_t n) EM_IMPORT(emscripten_memcpy_js);
34+
35+
void* emscripten_memcpy_bulkmem(void* __restrict__ dest,
36+
const void* __restrict__ src,
37+
size_t n);
38+
void* emscripten_memset_bulkmem(void* ptr, char value, size_t n);
3539

3640
void emscripten_notify_memory_growth(size_t memory_index);
3741

system/lib/libc/emscripten_memcpy.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ static void *__memcpy(void *dest, const void *src, size_t n) {
1919
return dest;
2020
}
2121

22+
#elif defined(__wasm_bulk_memory__)
23+
24+
static void *__memcpy(void *restrict dest, const void *restrict src, size_t n) {
25+
return emscripten_memcpy_bulkmem(dest, src, n);
26+
}
27+
2228
#else
2329

2430
static void *__memcpy(void *restrict dest, const void *restrict src, size_t n) {
@@ -29,9 +35,9 @@ static void *__memcpy(void *restrict dest, const void *restrict src, size_t n) {
2935
unsigned char *block_aligned_d_end;
3036
unsigned char *d_end;
3137

32-
#if !defined(EMSCRIPTEN_STANDALONE_WASM) || defined(__wasm_bulk_memory__)
38+
#if !defined(EMSCRIPTEN_STANDALONE_WASM)
3339
if (n >= 512) {
34-
emscripten_memcpy_big(dest, src, n);
40+
emscripten_memcpy_js(dest, src, n);
3541
return dest;
3642
}
3743
#endif

system/lib/libc/emscripten_memcpy_big.S renamed to system/lib/libc/emscripten_memcpy_bulkmem.S

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@
44
#define PTR i32
55
#endif
66

7-
.globl emscripten_memcpy_big
8-
emscripten_memcpy_big:
9-
.functype emscripten_memcpy_big (PTR, PTR, PTR) -> ()
7+
.globl emscripten_memcpy_bulkmem
8+
emscripten_memcpy_bulkmem:
9+
.functype emscripten_memcpy_bulkmem (PTR, PTR, PTR) -> (PTR)
1010
local.get 0
1111
local.get 1
1212
local.get 2
1313
memory.copy 0, 0
14+
local.get 0
1415
end_function

system/lib/libc/emscripten_memset.c

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,8 @@ void *__memset(void *str, int c, size_t n) {
2020

2121
#elif defined(__wasm_bulk_memory__)
2222

23-
#define memset __musl_memset
24-
#include "musl/src/string/memset.c"
25-
#undef memset
26-
2723
void *__memset(void *str, int c, size_t n) {
28-
if (n >= 512) {
29-
emscripten_memset_big(str, c, n);
30-
return str;
31-
}
32-
return __musl_memset(str, c, n);
24+
return emscripten_memset_bulkmem(str, c, n);
3325
}
3426

3527
#else

system/lib/libc/emscripten_memset_big.S renamed to system/lib/libc/emscripten_memset_bulkmem.S

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@
44
#define PTR i32
55
#endif
66

7-
.globl emscripten_memset_big
8-
emscripten_memset_big:
9-
.functype emscripten_memset_big (PTR, i32, PTR) -> ()
7+
.globl emscripten_memset_bulkmem
8+
emscripten_memset_bulkmem:
9+
.functype emscripten_memset_bulkmem (PTR, i32, PTR) -> (PTR)
1010
local.get 0
1111
local.get 1
1212
local.get 2
1313
memory.fill 0
14+
local.get 0
1415
end_function

system/lib/standalone/standalone.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -142,11 +142,6 @@ weak int getentropy(void* buffer, size_t length) {
142142

143143
// Emscripten additions
144144

145-
// Should never be called in standalone mode
146-
weak void emscripten_memcpy_big(void *restrict dest, const void *restrict src, size_t n) {
147-
__builtin_unreachable();
148-
}
149-
150145
size_t emscripten_get_heap_max() {
151146
// In standalone mode we don't have any wasm instructions to access the max
152147
// memory size so the best we can do (without calling an import) is return

test/other/metadce/test_metadce_cxx_ctors1.imports

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
env.__cxa_throw
22
env.abort
3-
env.emscripten_memcpy_big
3+
env.emscripten_memcpy_js
44
env.emscripten_resize_heap
55
env.strftime_l
66
wasi_snapshot_preview1.environ_get
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
25060
1+
25059

test/other/metadce/test_metadce_cxx_ctors1.sent

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
__cxa_throw
22
abort
3-
emscripten_memcpy_big
3+
emscripten_memcpy_js
44
emscripten_resize_heap
55
environ_get
66
environ_sizes_get
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
123498
1+
123497

test/other/metadce/test_metadce_cxx_ctors2.imports

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
env.__cxa_throw
22
env.abort
3-
env.emscripten_memcpy_big
3+
env.emscripten_memcpy_js
44
env.emscripten_resize_heap
55
env.strftime_l
66
wasi_snapshot_preview1.fd_close
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
25028
1+
25027

test/other/metadce/test_metadce_cxx_ctors2.sent

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
__cxa_throw
22
abort
3-
emscripten_memcpy_big
3+
emscripten_memcpy_js
44
emscripten_resize_heap
55
environ_get
66
environ_sizes_get
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
123403
1+
123402

test/other/metadce/test_metadce_cxx_except.imports

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ env.__cxa_throw
77
env.__cxa_uncaught_exceptions
88
env.__resumeException
99
env.abort
10-
env.emscripten_memcpy_big
10+
env.emscripten_memcpy_js
1111
env.emscripten_resize_heap
1212
env.invoke_diii
1313
env.invoke_fiii
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
29193
1+
29192

test/other/metadce/test_metadce_cxx_except.sent

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ __cxa_throw
77
__cxa_uncaught_exceptions
88
__resumeException
99
abort
10-
emscripten_memcpy_big
10+
emscripten_memcpy_js
1111
emscripten_resize_heap
1212
environ_get
1313
environ_sizes_get
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
166328
1+
166327

test/other/metadce/test_metadce_cxx_except_wasm.imports

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
env.abort
2-
env.emscripten_memcpy_big
2+
env.emscripten_memcpy_js
33
env.emscripten_resize_heap
44
env.strftime_l
55
wasi_snapshot_preview1.environ_get
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
24834
1+
24833

test/other/metadce/test_metadce_cxx_except_wasm.sent

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
abort
2-
emscripten_memcpy_big
2+
emscripten_memcpy_js
33
emscripten_resize_heap
44
environ_get
55
environ_sizes_get
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
137117
1+
137116

test/other/metadce/test_metadce_cxx_mangle.imports

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ env.__cxa_throw
77
env.__cxa_uncaught_exceptions
88
env.__resumeException
99
env.abort
10-
env.emscripten_memcpy_big
10+
env.emscripten_memcpy_js
1111
env.emscripten_resize_heap
1212
env.invoke_diii
1313
env.invoke_fiii
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
29192
1+
29191

test/other/metadce/test_metadce_cxx_mangle.sent

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ __cxa_throw
77
__cxa_uncaught_exceptions
88
__resumeException
99
abort
10-
emscripten_memcpy_big
10+
emscripten_memcpy_js
1111
emscripten_resize_heap
1212
environ_get
1313
environ_sizes_get
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
221419
1+
221418

test/other/metadce/test_metadce_cxx_noexcept.imports

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
env.__cxa_throw
22
env.abort
3-
env.emscripten_memcpy_big
3+
env.emscripten_memcpy_js
44
env.emscripten_resize_heap
55
env.strftime_l
66
wasi_snapshot_preview1.environ_get
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
25060
1+
25059

test/other/metadce/test_metadce_cxx_noexcept.sent

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
__cxa_throw
22
abort
3-
emscripten_memcpy_big
3+
emscripten_memcpy_js
44
emscripten_resize_heap
55
environ_get
66
environ_sizes_get
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
126300
1+
126299

test/other/metadce/test_metadce_cxx_wasmfs.imports

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ env._wasmfs_stdin_get_char
1111
env.abort
1212
env.emscripten_date_now
1313
env.emscripten_err
14-
env.emscripten_memcpy_big
14+
env.emscripten_memcpy_js
1515
env.emscripten_out
1616
env.emscripten_resize_heap
1717
env.getentropy
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
12469
1+
12468

test/other/metadce/test_metadce_cxx_wasmfs.sent

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ _wasmfs_stdin_get_char
1111
abort
1212
emscripten_date_now
1313
emscripten_err
14-
emscripten_memcpy_big
14+
emscripten_memcpy_js
1515
emscripten_out
1616
emscripten_resize_heap
1717
environ_get
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
163625
1+
163624
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
env.emscripten_memcpy_big
1+
env.emscripten_memcpy_js
22
wasi_snapshot_preview1.fd_write
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
23682
1+
23681
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
emscripten_memcpy_big
1+
emscripten_memcpy_js
22
fd_write
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
12156
1+
12155
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
env.emscripten_memcpy_big
1+
env.emscripten_memcpy_js
22
wasi_snapshot_preview1.fd_write
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8094
1+
8093
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
emscripten_memcpy_big
1+
emscripten_memcpy_js
22
fd_write
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2413
1+
2412
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
env.emscripten_memcpy_big
1+
env.emscripten_memcpy_js
22
wasi_snapshot_preview1.fd_write
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5753
1+
5752
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
emscripten_memcpy_big
1+
emscripten_memcpy_js
22
fd_write
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2054
1+
2053

test/other/metadce/test_metadce_hello_dylink.imports

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ env.__indirect_function_table
33
env.__memory_base
44
env.__stack_pointer
55
env.__table_base
6-
env.emscripten_memcpy_big
6+
env.emscripten_memcpy_js
77
env.emscripten_resize_heap
88
env.memory
99
wasi_snapshot_preview1.fd_write
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
14820
1+
14819

test/other/metadce/test_metadce_hello_dylink.sent

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ __indirect_function_table
33
__memory_base
44
__stack_pointer
55
__table_base
6-
emscripten_memcpy_big
6+
emscripten_memcpy_js
77
emscripten_resize_heap
88
fd_write
99
memory
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
9377
1+
9376
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
58712
1+
58709
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
12153
1+
12152
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
32008
1+
32005
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
11600
1+
11599
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
57399
1+
57396
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
12153
1+
12152

test/test_other.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13486,11 +13486,11 @@ def run(args, expect_bulk_mem):
1348613486
funcs = self.parse_wasm('test_memops_bulk_memory.wasm')[2]
1348713487
js = read_file('test_memops_bulk_memory.js')
1348813488
if expect_bulk_mem:
13489-
self.assertNotContained('_emscripten_memcpy_big', js)
13490-
self.assertIn('$emscripten_memcpy_big', funcs)
13489+
self.assertNotContained('_emscripten_memcpy_js', js)
13490+
self.assertIn('$emscripten_memcpy_bulkmem', funcs)
1349113491
else:
13492-
self.assertContained('_emscripten_memcpy_big', js)
13493-
self.assertNotIn('$emscripten_memcpy_big', funcs)
13492+
self.assertContained('_emscripten_memcpy_js', js)
13493+
self.assertNotIn('$emscripten_memcpy_bulkmem', funcs)
1349413494

1349513495
# By default we expect to find _emscripten_memcpy_big in the generaed JS and not in the
1349613496
# native code.

0 commit comments

Comments
 (0)