Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
emscripten-core
GitHub Repository: emscripten-core/emscripten
Path: blob/main/src/lib/liblittle_endian_heap.js
4150 views
1
var LibraryLittleEndianHeap = {
2
$LE_HEAP_STORE_U16: (byteOffset, value) =>
3
HEAP_DATA_VIEW.setUint16(byteOffset, value, true),
4
5
$LE_HEAP_STORE_I16: (byteOffset, value) =>
6
HEAP_DATA_VIEW.setInt16(byteOffset, value, true),
7
8
$LE_HEAP_STORE_U32: (byteOffset, value) =>
9
HEAP_DATA_VIEW.setUint32(byteOffset, value, true),
10
11
$LE_HEAP_STORE_I32: (byteOffset, value) =>
12
HEAP_DATA_VIEW.setInt32(byteOffset, value, true),
13
14
$LE_HEAP_STORE_U64: (byteOffset, value) =>
15
HEAP_DATA_VIEW.setBigUint64(byteOffset, value, true),
16
17
$LE_HEAP_STORE_I64: (byteOffset, value) =>
18
HEAP_DATA_VIEW.setBigInt64(byteOffset, value, true),
19
20
$LE_HEAP_STORE_F32: (byteOffset, value) =>
21
HEAP_DATA_VIEW.setFloat32(byteOffset, value, true),
22
23
$LE_HEAP_STORE_F64: (byteOffset, value) =>
24
HEAP_DATA_VIEW.setFloat64(byteOffset, value, true),
25
26
$LE_HEAP_LOAD_U16: (byteOffset) =>
27
HEAP_DATA_VIEW.getUint16(byteOffset, true),
28
29
$LE_HEAP_LOAD_I16: (byteOffset) =>
30
HEAP_DATA_VIEW.getInt16(byteOffset, true),
31
32
$LE_HEAP_LOAD_U32: (byteOffset) =>
33
HEAP_DATA_VIEW.getUint32(byteOffset, true),
34
35
$LE_HEAP_LOAD_I32: (byteOffset) =>
36
HEAP_DATA_VIEW.getInt32(byteOffset, true),
37
38
$LE_HEAP_LOAD_U64: (byteOffset) =>
39
HEAP_DATA_VIEW.getBigUint64(byteOffset, true),
40
41
$LE_HEAP_LOAD_I64: (byteOffset) =>
42
HEAP_DATA_VIEW.getBigInt64(byteOffset, true),
43
44
$LE_HEAP_LOAD_F32: (byteOffset) =>
45
HEAP_DATA_VIEW.getFloat32(byteOffset, true),
46
47
$LE_HEAP_LOAD_F64: (byteOffset) =>
48
HEAP_DATA_VIEW.getFloat64(byteOffset, true),
49
50
$LE_ATOMICS_NATIVE_BYTE_ORDER__postset: `
51
LE_ATOMICS_NATIVE_BYTE_ORDER = (new Int8Array(new Int16Array([1]).buffer)[0] === 1)
52
? [ /* little endian */
53
(x => x),
54
(x => x),
55
undefined,
56
(x => x),
57
]
58
: [ /* big endian */
59
(x => x),
60
(x => (((x & 0xff00) << 8) | ((x & 0xff) << 24)) >> 16),
61
undefined,
62
(x => ((x >> 24) & 0xff) | ((x >> 8) & 0xff00) | ((x & 0xff00) << 8) | ((x & 0xff) << 24)),
63
];
64
function LE_HEAP_UPDATE() {
65
HEAPU16.unsigned = (x => x & 0xffff);
66
HEAPU32.unsigned = (x => x >>> 0);
67
}
68
`,
69
$LE_ATOMICS_NATIVE_BYTE_ORDER: [],
70
71
$LE_ATOMICS_ADD: (heap, offset, value) => {
72
const order = LE_ATOMICS_NATIVE_BYTE_ORDER[heap.BYTES_PER_ELEMENT - 1];
73
const res = order(Atomics.add(heap, offset, order(value)));
74
return heap.unsigned ? heap.unsigned(res) : res;
75
},
76
$LE_ATOMICS_AND: (heap, offset, value) => {
77
const order = LE_ATOMICS_NATIVE_BYTE_ORDER[heap.BYTES_PER_ELEMENT - 1];
78
const res = order(Atomics.and(heap, offset, order(value)));
79
return heap.unsigned ? heap.unsigned(res) : res;
80
},
81
$LE_ATOMICS_COMPAREEXCHANGE: (heap, offset, expected, replacement) => {
82
const order = LE_ATOMICS_NATIVE_BYTE_ORDER[heap.BYTES_PER_ELEMENT - 1];
83
const res = order(Atomics.compareExchange(heap, offset, order(expected), order(replacement)));
84
return heap.unsigned ? heap.unsigned(res) : res;
85
},
86
$LE_ATOMICS_EXCHANGE: (heap, offset, value) => {
87
const order = LE_ATOMICS_NATIVE_BYTE_ORDER[heap.BYTES_PER_ELEMENT - 1];
88
const res = order(Atomics.exchange(heap, offset, order(value)));
89
return heap.unsigned ? heap.unsigned(res) : res;
90
},
91
$LE_ATOMICS_ISLOCKFREE: (size) => Atomics.isLockFree(size),
92
$LE_ATOMICS_LOAD: (heap, offset) => {
93
const order = LE_ATOMICS_NATIVE_BYTE_ORDER[heap.BYTES_PER_ELEMENT - 1];
94
const res = order(Atomics.load(heap, offset));
95
return heap.unsigned ? heap.unsigned(res) : res;
96
},
97
$LE_ATOMICS_NOTIFY: (heap, offset, count) => Atomics.notify(heap, offset, count),
98
$LE_ATOMICS_OR: (heap, offset, value) => {
99
const order = LE_ATOMICS_NATIVE_BYTE_ORDER[heap.BYTES_PER_ELEMENT - 1];
100
const res = order(Atomics.or(heap, offset, order(value)));
101
return heap.unsigned ? heap.unsigned(res) : res;
102
},
103
$LE_ATOMICS_STORE: (heap, offset, value) => {
104
const order = LE_ATOMICS_NATIVE_BYTE_ORDER[heap.BYTES_PER_ELEMENT - 1];
105
Atomics.store(heap, offset, order(value));
106
},
107
$LE_ATOMICS_SUB: (heap, offset, value) => {
108
const order = LE_ATOMICS_NATIVE_BYTE_ORDER[heap.BYTES_PER_ELEMENT - 1];
109
const res = order(Atomics.sub(heap, offset, order(value)));
110
return heap.unsigned ? heap.unsigned(res) : res;
111
},
112
$LE_ATOMICS_WAIT: (heap, offset, value, timeout) => {
113
const order = LE_ATOMICS_NATIVE_BYTE_ORDER[heap.BYTES_PER_ELEMENT - 1];
114
return Atomics.wait(heap, offset, order(value), timeout);
115
},
116
$LE_ATOMICS_WAITASYNC: (heap, offset, value, timeout) => {
117
const order = LE_ATOMICS_NATIVE_BYTE_ORDER[heap.BYTES_PER_ELEMENT - 1];
118
return Atomics.waitAsync(heap, offset, order(value), timeout);
119
},
120
$LE_ATOMICS_XOR: (heap, offset, value) => {
121
const order = LE_ATOMICS_NATIVE_BYTE_ORDER[heap.BYTES_PER_ELEMENT - 1];
122
const res = order(Atomics.xor(heap, offset, order(value)));
123
return heap.unsigned ? heap.unsigned(res) : res;
124
},
125
}
126
127
addToLibrary(LibraryLittleEndianHeap);
128
129