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

0 commit comments

Comments
 (0)