Skip to content

Commit 707570b

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 4c8cb35 commit 707570b

File tree

9 files changed

+33
-34
lines changed

9 files changed

+33
-34
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

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/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.

tools/system_libs.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1315,7 +1315,7 @@ class libbulkmemory(MuslInternalLibrary, AsanInstrumentedLibrary):
13151315
name = 'libbulkmemory'
13161316
src_dir = 'system/lib/libc'
13171317
src_files = ['emscripten_memcpy.c', 'emscripten_memset.c',
1318-
'emscripten_memcpy_big.S', 'emscripten_memset_big.S']
1318+
'emscripten_memcpy_bulkmem.S', 'emscripten_memset_bulkmem.S']
13191319
cflags = ['-mbulk-memory']
13201320

13211321
def can_use(self):

0 commit comments

Comments
 (0)