Skip to content

Commit 60b3d4e

Browse files
authored
Always use bulkmemory memcpy and memset when available (#20144)
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 7cd6360 commit 60b3d4e

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)