@@ -71,46 +71,48 @@ def get(settings, minified):
71
71
var atomics_or = /var\s+([^=]+?)\s*=\s*global\.Atomics\.or;/.exec(code)[1];
72
72
var atomics_xor = /var\s+([^=]+?)\s*=\s*global\.Atomics\.xor;/.exec(code)[1];
73
73
74
- // "Atomics_load(HEAP32, index)" -> "HEAP32[index]|0" and same for other heap types.
75
- code = code.replace(new RegExp('\\ \\ b' + atomics_load + '\\ \\ ((' + heap8 + ')\w*,(.*?)\\ \\ \)', 'g'), "($1[$2]|0)");
76
- code = code.replace(new RegExp('\\ \\ b' + atomics_load + '\\ \\ ((' + heap16 + ')\w*,(.*?)\\ \\ \)', 'g'), "($1[$2]|0)");
77
- code = code.replace(new RegExp('\\ \\ b' + atomics_load + '\\ \\ ((' + heap32 + ')\w*,(.*?)\\ \\ \)', 'g'), "($1[$2]|0)");
78
- code = code.replace(new RegExp('\\ \\ b' + atomics_load + '\\ \\ ((' + heapf32 + ')\w*,(.*?)\\ \\ \)', 'g'), math_fround + "$1[$2]"+cp);
79
- code = code.replace(new RegExp('\\ \\ b' + atomics_load + '\\ \\ ((' + heapf64 + ')\w*,(.*?)\\ \\ \)', 'g'), "(+$1[$2])");
80
-
81
- // "Atomics_store(HEAP32, index, value)" -> "HEAP32[index] = value" and same for other heap types.
82
- code = code.replace(new RegExp('\\ \\ b' + atomics_store + '\\ \\ ((.*?),(.*?),(.*?)\\ \\ \)', 'g'), "($1[$2] = $3)");
83
-
84
74
// The Atomics built-ins take as first parameter the heap object, however when replacing those with
85
75
// polyfill versions, it is not possible to pass a heap object as the first parameter. Therefore
86
76
// route each call to Atomics to a polyfill function for each type, e.g. "Atomics_add(HEAP32, index, val)" -> "Atomics_add_32(index, val)"
87
- code = code.replace(new RegExp('\\ \\ b' + atomics_add + '\\ \\ ('+heap8+',(.*?),(.*?)\\ \\ \)', 'g'), '((' + atomics_add + "_8($1,$2)|0)|0)");
88
- code = code.replace(new RegExp('\\ \\ b' + atomics_add + '\\ \\ ('+heap16+',(.*?),(.*?)\\ \\ \)', 'g'), '((' + atomics_add + "_16($1,$2)|0)|0)");
89
- code = code.replace(new RegExp('\\ \\ b' + atomics_add + '\\ \\ ('+heap32+',(.*?),(.*?)\\ \\ \)', 'g'), '((' + atomics_add + "_32($1,$2)|0)|0)");
90
-
91
- code = code.replace(new RegExp('\\ \\ b' + atomics_sub + '\\ \\ ('+heap8+',(.*?),(.*?)\\ \\ \)', 'g'), '((' + atomics_sub + "_8($1,$2)|0)|0)");
92
- code = code.replace(new RegExp('\\ \\ b' + atomics_sub + '\\ \\ ('+heap16+',(.*?),(.*?)\\ \\ \)', 'g'), '((' + atomics_sub + "_16($1,$2)|0)|0)");
93
- code = code.replace(new RegExp('\\ \\ b' + atomics_sub + '\\ \\ ('+heap32+',(.*?),(.*?)\\ \\ \)', 'g'), '((' + atomics_sub + "_32($1,$2)|0)|0)");
94
-
95
- code = code.replace(new RegExp('\\ \\ b' + atomics_and + '\\ \\ ('+heap8+',(.*?),(.*?)\\ \\ \)', 'g'), '((' + atomics_and + "_8($1,$2)|0)|0)");
96
- code = code.replace(new RegExp('\\ \\ b' + atomics_and + '\\ \\ ('+heap16+',(.*?),(.*?)\\ \\ \)', 'g'), '((' + atomics_and + "_16($1,$2)|0)|0)");
97
- code = code.replace(new RegExp('\\ \\ b' + atomics_and + '\\ \\ ('+heap32+',(.*?),(.*?)\\ \\ \)', 'g'), '((' + atomics_and + "_32($1,$2)|0)|0)");
98
-
99
- code = code.replace(new RegExp('\\ \\ b' + atomics_or + '\\ \\ ('+heap8+',(.*?),(.*?)\\ \\ \)', 'g'), '((' + atomics_or + "_8($1,$2)|0)|0)");
100
- code = code.replace(new RegExp('\\ \\ b' + atomics_or + '\\ \\ ('+heap16+',(.*?),(.*?)\\ \\ \)', 'g'), '((' + atomics_or + "_16($1,$2)|0)|0)");
101
- code = code.replace(new RegExp('\\ \\ b' + atomics_or + '\\ \\ ('+heap32+',(.*?),(.*?)\\ \\ \)', 'g'), '((' + atomics_or + "_32($1,$2)|0)|0)");
102
-
103
- code = code.replace(new RegExp('\\ \\ b' + atomics_xor + '\\ \\ ('+heap8+',(.*?),(.*?)\\ \\ \)', 'g'), '((' + atomics_xor + "_8($1,$2)|0)|0)");
104
- code = code.replace(new RegExp('\\ \\ b' + atomics_xor + '\\ \\ ('+heap16+',(.*?),(.*?)\\ \\ \)', 'g'), '((' + atomics_xor + "_16($1,$2)|0)|0)");
105
- code = code.replace(new RegExp('\\ \\ b' + atomics_xor + '\\ \\ ('+heap32+',(.*?),(.*?)\\ \\ \)', 'g'), '((' + atomics_xor + "_32($1,$2)|0)|0)");
106
-
107
- code = code.replace(new RegExp('\\ \\ b' + atomics_exchange + '\\ \\ ('+heap8+',(.*?),(.*?)\\ \\ \)', 'g'), '(' + atomics_exchange + "_8($1,$2)|0)");
108
- code = code.replace(new RegExp('\\ \\ b' + atomics_exchange + '\\ \\ ('+heap16+',(.*?),(.*?)\\ \\ \)', 'g'), '(' + atomics_exchange + "_16($1,$2)|0)");
109
- code = code.replace(new RegExp('\\ \\ b' + atomics_exchange + '\\ \\ ('+heap32+',(.*?),(.*?)\\ \\ \)', 'g'), '(' + atomics_exchange + "_32($1,$2)|0)");
110
-
111
- code = code.replace(new RegExp('\\ \\ b' + atomics_compareExchange + '\\ \\ ('+heap8+',(.*?),(.*?),(.*?)\\ \\ \)', 'g'), '(' + atomics_compareExchange + "_8($1,$2,$3)|0)");
112
- code = code.replace(new RegExp('\\ \\ b' + atomics_compareExchange + '\\ \\ ('+heap16+',(.*?),(.*?),(.*?)\\ \\ \)', 'g'), '(' + atomics_compareExchange + "_16($1,$2,$3)|0)");
113
- code = code.replace(new RegExp('\\ \\ b' + atomics_compareExchange + '\\ \\ ('+heap32+',(.*?),(.*?),(.*?)\\ \\ \)', 'g'), '(' + atomics_compareExchange + "_32($1,$2,$3)|0)");
77
+ code = code.replace(new RegExp('\\ \\ b' + atomics_load + '\\ \\ ('+heap8+',', 'g'), atomics_load + "_8(");
78
+ code = code.replace(new RegExp('\\ \\ b' + atomics_load + '\\ \\ ('+heap16+',', 'g'), atomics_load + "_16(");
79
+ code = code.replace(new RegExp('\\ \\ b' + atomics_load + '\\ \\ ('+heap32+',', 'g'), atomics_load + "_32(");
80
+ code = code.replace(new RegExp('\\ \\ b' + atomics_load + '\\ \\ ('+heapf32+',', 'g'), atomics_load + "_f32(");
81
+ code = code.replace(new RegExp('\\ \\ b' + atomics_load + '\\ \\ ('+heapf64+',', 'g'), atomics_load + "_f64(");
82
+
83
+ code = code.replace(new RegExp('\\ \\ b' + atomics_store + '\\ \\ ('+heap8+',', 'g'), atomics_store + "_8(");
84
+ code = code.replace(new RegExp('\\ \\ b' + atomics_store + '\\ \\ ('+heap16+',', 'g'), atomics_store + "_16(");
85
+ code = code.replace(new RegExp('\\ \\ b' + atomics_store + '\\ \\ ('+heap32+',', 'g'), atomics_store + "_32(");
86
+ code = code.replace(new RegExp('\\ \\ b' + atomics_store + '\\ \\ ('+heapf32+',', 'g'), atomics_store + "_f32(");
87
+ code = code.replace(new RegExp('\\ \\ b' + atomics_store + '\\ \\ ('+heapf64+',', 'g'), atomics_store + "_f64(");
88
+
89
+ code = code.replace(new RegExp('\\ \\ b' + atomics_add + '\\ \\ ('+heap8+',', 'g'), atomics_add + "_8(");
90
+ code = code.replace(new RegExp('\\ \\ b' + atomics_add + '\\ \\ ('+heap16+',', 'g'), atomics_add + "_16(");
91
+ code = code.replace(new RegExp('\\ \\ b' + atomics_add + '\\ \\ ('+heap32+',', 'g'), atomics_add + "_32(");
92
+
93
+ code = code.replace(new RegExp('\\ \\ b' + atomics_sub + '\\ \\ ('+heap8+',', 'g'), atomics_sub + "_8(");
94
+ code = code.replace(new RegExp('\\ \\ b' + atomics_sub + '\\ \\ ('+heap16+',', 'g'), atomics_sub + "_16(");
95
+ code = code.replace(new RegExp('\\ \\ b' + atomics_sub + '\\ \\ ('+heap32+',', 'g'), atomics_sub + "_32(");
96
+
97
+ code = code.replace(new RegExp('\\ \\ b' + atomics_and + '\\ \\ ('+heap8+',', 'g'), atomics_and + "_8(");
98
+ code = code.replace(new RegExp('\\ \\ b' + atomics_and + '\\ \\ ('+heap16+',', 'g'), atomics_and + "_16(");
99
+ code = code.replace(new RegExp('\\ \\ b' + atomics_and + '\\ \\ ('+heap32+',', 'g'), atomics_and + "_32(");
100
+
101
+ code = code.replace(new RegExp('\\ \\ b' + atomics_or + '\\ \\ ('+heap8+',', 'g'), atomics_or + "_8(");
102
+ code = code.replace(new RegExp('\\ \\ b' + atomics_or + '\\ \\ ('+heap16+',', 'g'), atomics_or + "_16(");
103
+ code = code.replace(new RegExp('\\ \\ b' + atomics_or + '\\ \\ ('+heap32+',', 'g'), atomics_or + "_32(");
104
+
105
+ code = code.replace(new RegExp('\\ \\ b' + atomics_xor + '\\ \\ ('+heap8+',', 'g'), atomics_xor + "_8(");
106
+ code = code.replace(new RegExp('\\ \\ b' + atomics_xor + '\\ \\ ('+heap16+',', 'g'), atomics_xor + "_16(");
107
+ code = code.replace(new RegExp('\\ \\ b' + atomics_xor + '\\ \\ ('+heap32+',', 'g'), atomics_xor + "_32(");
108
+
109
+ code = code.replace(new RegExp('\\ \\ b' + atomics_exchange + '\\ \\ ('+heap8+',', 'g'), atomics_exchange + "_8(");
110
+ code = code.replace(new RegExp('\\ \\ b' + atomics_exchange + '\\ \\ ('+heap16+',', 'g'), atomics_exchange + "_16(");
111
+ code = code.replace(new RegExp('\\ \\ b' + atomics_exchange + '\\ \\ ('+heap32+',', 'g'), atomics_exchange + "_32(");
112
+
113
+ code = code.replace(new RegExp('\\ \\ b' + atomics_compareExchange + '\\ \\ ('+heap8+',', 'g'), atomics_compareExchange + "_8(");
114
+ code = code.replace(new RegExp('\\ \\ b' + atomics_compareExchange + '\\ \\ ('+heap16+',', 'g'), atomics_compareExchange + "_16(");
115
+ code = code.replace(new RegExp('\\ \\ b' + atomics_compareExchange + '\\ \\ ('+heap32+',', 'g'), atomics_compareExchange + "_32(");
114
116
115
117
// Remove the import statements of Atomics built-ins.
116
118
code = code.replace(new RegExp("var " + atomics_load + "\\ \\ s*=\\ \\ s*global\\ .Atomics\\ .load;"), "");
@@ -125,6 +127,18 @@ def get(settings, minified):
125
127
126
128
// Implement polyfill versions of Atomics intrinsics inside the asm.js scope.
127
129
code = code.replace("// EMSCRIPTEN_START_FUNCS", "// EMSCRIPTEN_START_FUNCS\\ n"
130
+ + "function " + atomics_load + "_8(i) { i=i|0; return "+heap8+"[i>>0]|0; }\\ n"
131
+ + "function " + atomics_load + "_16(i) { i=i|0; return "+heap16+"[i<<1>>1]|0; }\\ n"
132
+ + "function " + atomics_load + "_32(i) { i=i|0; return "+heap32+"[i<<2>>2]|0; }\\ n"
133
+ + "function " + atomics_load + "_f32(i) { i=i|0; return "+math_fround+heapf32+"[i<<2>>2]"+cp+"; }\\ n"
134
+ + "function " + atomics_load + "_f64(i) { i=i|0; return +"+heapf64+"[i<<3>>3]; }\\ n"
135
+
136
+ + "function " + atomics_store + "_8(i,v) { i=i|0; v=v|0; "+heap8+"[i>>0]=v; return v|0; }\\ n"
137
+ + "function " + atomics_store + "_16(i,v) { i=i|0; v=v|0; "+heap16+"[i<<1>>1]=v; return v|0; }\\ n"
138
+ + "function " + atomics_store + "_32(i,v) { i=i|0; v=v|0; "+heap32+"[i<<2>>2]=v; return v|0; }\\ n"
139
+ + "function " + atomics_store + "_f32(i,v) { i=i|0; v="+math_fround+"v"+cp+"; "+heapf32+"[i<<2>>2]=v; return "+math_fround+"v"+cp+"; }\\ n"
140
+ + "function " + atomics_store + "_f64(i,v) { i=i|0; v=+v;" +heapf64+"[i<<3>>3]=v; return +v; }\\ n"
141
+
128
142
+ "function " + atomics_add + "_8(i,v) { i=i|0; v=v|0; var w=0; w="+heap8+"[i>>0]|0; "+heap8+"[i>>0]=("+heap8+"[i>>0]|0)+(v|0); return w|0; }\\ n"
129
143
+ "function " + atomics_add + "_16(i,v) { i=i|0; v=v|0; var w=0; w="+heap16+"[i<<1>>1]|0; "+heap16+"[i<<1>>1]=("+heap16+"[i<<1>>1]|0)+(v|0); return w|0; }\\ n"
130
144
+ "function " + atomics_add + "_32(i,v) { i=i|0; v=v|0; var w=0; w="+heap32+"[i<<2>>2]|0; "+heap32+"[i<<2>>2]=("+heap32+"[i<<2>>2]|0)+(v|0); return w|0; }\\ n"
0 commit comments