Skip to content

Commit acb1258

Browse files
authored
[wasm2js] Run LLVM nontrapping fptoint lowering when running for emscripten (#7116)
Lower away saturating fptoint operations when we know we are using emscripten.
1 parent cc97853 commit acb1258

5 files changed

Lines changed: 428 additions & 4 deletions

File tree

scripts/test/wasm2js.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -162,10 +162,11 @@ def update_wasm2js_tests():
162162
if not wasm.endswith('.wast'):
163163
continue
164164

165-
if os.path.basename(wasm) in wasm2js_skipped_tests:
165+
basename = os.path.basename(wasm)
166+
if basename in wasm2js_skipped_tests:
166167
continue
167168

168-
asm = os.path.basename(wasm).replace('.wast', '.2asm.js')
169+
asm = basename.replace('.wast', '.2asm.js')
169170
expected_file = os.path.join(shared.get_test_dir('wasm2js'), asm)
170171
if opt:
171172
expected_file += '.opt'
@@ -192,9 +193,9 @@ def update_wasm2js_tests():
192193
'--disable-exception-handling']
193194
if opt:
194195
cmd += ['-O']
195-
if 'emscripten' in wasm:
196+
if 'emscripten' in basename:
196197
cmd += ['--emscripten']
197-
if 'deterministic' in t:
198+
if 'deterministic' in basename:
198199
cmd += ['--deterministic']
199200
out = support.run_command(cmd)
200201
all_out.append(out)

src/wasm2js.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,9 @@ Ref Wasm2JSBuilder::processWasm(Module* wasm, Name funcName) {
361361
// First, do the lowering to a JS-friendly subset.
362362
{
363363
PassRunner runner(wasm, options);
364+
if (flags.emscripten) {
365+
runner.add("llvm-nontrapping-fptoint-lowering");
366+
}
364367
// TODO: only legalize if necessary - emscripten would already do so, and
365368
// likely other toolchains. but spec test suite needs that.
366369
runner.add("legalize-js-interface");
Lines changed: 289 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,289 @@
1+
function instantiate(info) {
2+
function asmFunc(imports) {
3+
var Math_imul = Math.imul;
4+
var Math_fround = Math.fround;
5+
var Math_abs = Math.abs;
6+
var Math_clz32 = Math.clz32;
7+
var Math_min = Math.min;
8+
var Math_max = Math.max;
9+
var Math_floor = Math.floor;
10+
var Math_ceil = Math.ceil;
11+
var Math_trunc = Math.trunc;
12+
var Math_sqrt = Math.sqrt;
13+
var env = imports.env;
14+
var setTempRet0 = env.setTempRet0;
15+
var i64toi32_i32$HIGH_BITS = 0;
16+
// EMSCRIPTEN_START_FUNCS
17+
;
18+
function $0(x) {
19+
x = Math_fround(x);
20+
var $1_1 = Math_fround(0), $8 = 0;
21+
$1_1 = x;
22+
if (Math_fround(Math_abs($1_1)) < Math_fround(2147483648.0)) {
23+
$8 = ~~$1_1
24+
} else {
25+
$8 = -2147483648
26+
}
27+
return $8 | 0;
28+
}
29+
30+
function $1(x) {
31+
x = Math_fround(x);
32+
var $1_1 = Math_fround(0), $10 = 0;
33+
$1_1 = x;
34+
if ($1_1 < Math_fround(4294967296.0) & $1_1 >= Math_fround(0.0) | 0) {
35+
$10 = ~~$1_1 >>> 0
36+
} else {
37+
$10 = 0
38+
}
39+
return $10 | 0;
40+
}
41+
42+
function $2(x) {
43+
x = +x;
44+
var $1_1 = 0.0, $8 = 0;
45+
$1_1 = x;
46+
if (Math_abs($1_1) < 2147483647.0) {
47+
$8 = ~~$1_1
48+
} else {
49+
$8 = -2147483648
50+
}
51+
return $8 | 0;
52+
}
53+
54+
function $3(x) {
55+
x = +x;
56+
var $1_1 = 0.0, $10 = 0;
57+
$1_1 = x;
58+
if ($1_1 < 4294967295.0 & $1_1 >= 0.0 | 0) {
59+
$10 = ~~$1_1 >>> 0
60+
} else {
61+
$10 = 0
62+
}
63+
return $10 | 0;
64+
}
65+
66+
function $4(x) {
67+
x = Math_fround(x);
68+
var i64toi32_i32$0 = Math_fround(0), i64toi32_i32$1 = 0, $1_1 = Math_fround(0), $6_1 = 0, $7_1 = 0, $8 = 0, $8$hi = 0;
69+
$1_1 = x;
70+
if (Math_fround(Math_abs($1_1)) < Math_fround(9223372036854775808.0)) {
71+
i64toi32_i32$0 = $1_1;
72+
if (Math_fround(Math_abs(i64toi32_i32$0)) >= Math_fround(1.0)) {
73+
if (i64toi32_i32$0 > Math_fround(0.0)) {
74+
$6_1 = ~~Math_fround(Math_min(Math_fround(Math_floor(Math_fround(i64toi32_i32$0 / Math_fround(4294967296.0)))), Math_fround(Math_fround(4294967296.0) - Math_fround(1.0)))) >>> 0
75+
} else {
76+
$6_1 = ~~Math_fround(Math_ceil(Math_fround(Math_fround(i64toi32_i32$0 - Math_fround(~~i64toi32_i32$0 >>> 0 >>> 0)) / Math_fround(4294967296.0)))) >>> 0
77+
}
78+
$7_1 = $6_1;
79+
} else {
80+
$7_1 = 0
81+
}
82+
i64toi32_i32$1 = $7_1;
83+
$8 = ~~i64toi32_i32$0 >>> 0;
84+
$8$hi = i64toi32_i32$1;
85+
} else {
86+
i64toi32_i32$1 = -2147483648;
87+
$8 = 0;
88+
$8$hi = i64toi32_i32$1;
89+
}
90+
i64toi32_i32$1 = $8$hi;
91+
i64toi32_i32$HIGH_BITS = i64toi32_i32$1;
92+
return $8 | 0;
93+
}
94+
95+
function $5(x) {
96+
x = Math_fround(x);
97+
var i64toi32_i32$0 = Math_fround(0), i64toi32_i32$1 = 0, $1_1 = Math_fround(0), $6_1 = 0, $7_1 = 0, $10 = 0, $10$hi = 0;
98+
$1_1 = x;
99+
if ($1_1 < Math_fround(18446744073709551615.0) & $1_1 >= Math_fround(0.0) | 0) {
100+
i64toi32_i32$0 = $1_1;
101+
if (Math_fround(Math_abs(i64toi32_i32$0)) >= Math_fround(1.0)) {
102+
if (i64toi32_i32$0 > Math_fround(0.0)) {
103+
$6_1 = ~~Math_fround(Math_min(Math_fround(Math_floor(Math_fround(i64toi32_i32$0 / Math_fround(4294967296.0)))), Math_fround(Math_fround(4294967296.0) - Math_fround(1.0)))) >>> 0
104+
} else {
105+
$6_1 = ~~Math_fround(Math_ceil(Math_fround(Math_fround(i64toi32_i32$0 - Math_fround(~~i64toi32_i32$0 >>> 0 >>> 0)) / Math_fround(4294967296.0)))) >>> 0
106+
}
107+
$7_1 = $6_1;
108+
} else {
109+
$7_1 = 0
110+
}
111+
i64toi32_i32$1 = $7_1;
112+
$10 = ~~i64toi32_i32$0 >>> 0;
113+
$10$hi = i64toi32_i32$1;
114+
} else {
115+
i64toi32_i32$1 = 0;
116+
$10 = 0;
117+
$10$hi = i64toi32_i32$1;
118+
}
119+
i64toi32_i32$1 = $10$hi;
120+
i64toi32_i32$HIGH_BITS = i64toi32_i32$1;
121+
return $10 | 0;
122+
}
123+
124+
function $6(x) {
125+
x = +x;
126+
var i64toi32_i32$0 = 0.0, i64toi32_i32$1 = 0, $1_1 = 0.0, $6_1 = 0, $7_1 = 0, $8 = 0, $8$hi = 0;
127+
$1_1 = x;
128+
if (Math_abs($1_1) < 9223372036854775808.0) {
129+
i64toi32_i32$0 = $1_1;
130+
if (Math_abs(i64toi32_i32$0) >= 1.0) {
131+
if (i64toi32_i32$0 > 0.0) {
132+
$6_1 = ~~Math_min(Math_floor(i64toi32_i32$0 / 4294967296.0), 4294967296.0 - 1.0) >>> 0
133+
} else {
134+
$6_1 = ~~Math_ceil((i64toi32_i32$0 - +(~~i64toi32_i32$0 >>> 0 >>> 0)) / 4294967296.0) >>> 0
135+
}
136+
$7_1 = $6_1;
137+
} else {
138+
$7_1 = 0
139+
}
140+
i64toi32_i32$1 = $7_1;
141+
$8 = ~~i64toi32_i32$0 >>> 0;
142+
$8$hi = i64toi32_i32$1;
143+
} else {
144+
i64toi32_i32$1 = -2147483648;
145+
$8 = 0;
146+
$8$hi = i64toi32_i32$1;
147+
}
148+
i64toi32_i32$1 = $8$hi;
149+
i64toi32_i32$HIGH_BITS = i64toi32_i32$1;
150+
return $8 | 0;
151+
}
152+
153+
function $7(x) {
154+
x = +x;
155+
var i64toi32_i32$0 = 0.0, i64toi32_i32$1 = 0, $1_1 = 0.0, $6_1 = 0, $7_1 = 0, $10 = 0, $10$hi = 0;
156+
$1_1 = x;
157+
if ($1_1 < 18446744073709551615.0 & $1_1 >= 0.0 | 0) {
158+
i64toi32_i32$0 = $1_1;
159+
if (Math_abs(i64toi32_i32$0) >= 1.0) {
160+
if (i64toi32_i32$0 > 0.0) {
161+
$6_1 = ~~Math_min(Math_floor(i64toi32_i32$0 / 4294967296.0), 4294967296.0 - 1.0) >>> 0
162+
} else {
163+
$6_1 = ~~Math_ceil((i64toi32_i32$0 - +(~~i64toi32_i32$0 >>> 0 >>> 0)) / 4294967296.0) >>> 0
164+
}
165+
$7_1 = $6_1;
166+
} else {
167+
$7_1 = 0
168+
}
169+
i64toi32_i32$1 = $7_1;
170+
$10 = ~~i64toi32_i32$0 >>> 0;
171+
$10$hi = i64toi32_i32$1;
172+
} else {
173+
i64toi32_i32$1 = 0;
174+
$10 = 0;
175+
$10$hi = i64toi32_i32$1;
176+
}
177+
i64toi32_i32$1 = $10$hi;
178+
i64toi32_i32$HIGH_BITS = i64toi32_i32$1;
179+
return $10 | 0;
180+
}
181+
182+
function legalstub$4($0_1) {
183+
$0_1 = Math_fround($0_1);
184+
var i64toi32_i32$0 = 0, i64toi32_i32$4 = 0, i64toi32_i32$1 = 0, i64toi32_i32$3 = 0, $8 = 0, $1_1 = 0, $1$hi = 0, i64toi32_i32$2 = 0;
185+
i64toi32_i32$0 = $4(Math_fround($0_1)) | 0;
186+
i64toi32_i32$1 = i64toi32_i32$HIGH_BITS;
187+
$1_1 = i64toi32_i32$0;
188+
$1$hi = i64toi32_i32$1;
189+
i64toi32_i32$2 = i64toi32_i32$0;
190+
i64toi32_i32$0 = 0;
191+
i64toi32_i32$3 = 32;
192+
i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0;
193+
if (32 >>> 0 <= (i64toi32_i32$3 & 63 | 0) >>> 0) {
194+
i64toi32_i32$0 = 0;
195+
$8 = i64toi32_i32$1 >>> i64toi32_i32$4 | 0;
196+
} else {
197+
i64toi32_i32$0 = i64toi32_i32$1 >>> i64toi32_i32$4 | 0;
198+
$8 = (((1 << i64toi32_i32$4 | 0) - 1 | 0) & i64toi32_i32$1 | 0) << (32 - i64toi32_i32$4 | 0) | 0 | (i64toi32_i32$2 >>> i64toi32_i32$4 | 0) | 0;
199+
}
200+
setTempRet0($8 | 0);
201+
i64toi32_i32$0 = $1$hi;
202+
return $1_1 | 0;
203+
}
204+
205+
function legalstub$5($0_1) {
206+
$0_1 = Math_fround($0_1);
207+
var i64toi32_i32$0 = 0, i64toi32_i32$4 = 0, i64toi32_i32$1 = 0, i64toi32_i32$3 = 0, $8 = 0, $1_1 = 0, $1$hi = 0, i64toi32_i32$2 = 0;
208+
i64toi32_i32$0 = $5(Math_fround($0_1)) | 0;
209+
i64toi32_i32$1 = i64toi32_i32$HIGH_BITS;
210+
$1_1 = i64toi32_i32$0;
211+
$1$hi = i64toi32_i32$1;
212+
i64toi32_i32$2 = i64toi32_i32$0;
213+
i64toi32_i32$0 = 0;
214+
i64toi32_i32$3 = 32;
215+
i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0;
216+
if (32 >>> 0 <= (i64toi32_i32$3 & 63 | 0) >>> 0) {
217+
i64toi32_i32$0 = 0;
218+
$8 = i64toi32_i32$1 >>> i64toi32_i32$4 | 0;
219+
} else {
220+
i64toi32_i32$0 = i64toi32_i32$1 >>> i64toi32_i32$4 | 0;
221+
$8 = (((1 << i64toi32_i32$4 | 0) - 1 | 0) & i64toi32_i32$1 | 0) << (32 - i64toi32_i32$4 | 0) | 0 | (i64toi32_i32$2 >>> i64toi32_i32$4 | 0) | 0;
222+
}
223+
setTempRet0($8 | 0);
224+
i64toi32_i32$0 = $1$hi;
225+
return $1_1 | 0;
226+
}
227+
228+
function legalstub$6($0_1) {
229+
$0_1 = +$0_1;
230+
var i64toi32_i32$0 = 0, i64toi32_i32$4 = 0, i64toi32_i32$1 = 0, i64toi32_i32$3 = 0, $8 = 0, $1_1 = 0, $1$hi = 0, i64toi32_i32$2 = 0;
231+
i64toi32_i32$0 = $6(+$0_1) | 0;
232+
i64toi32_i32$1 = i64toi32_i32$HIGH_BITS;
233+
$1_1 = i64toi32_i32$0;
234+
$1$hi = i64toi32_i32$1;
235+
i64toi32_i32$2 = i64toi32_i32$0;
236+
i64toi32_i32$0 = 0;
237+
i64toi32_i32$3 = 32;
238+
i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0;
239+
if (32 >>> 0 <= (i64toi32_i32$3 & 63 | 0) >>> 0) {
240+
i64toi32_i32$0 = 0;
241+
$8 = i64toi32_i32$1 >>> i64toi32_i32$4 | 0;
242+
} else {
243+
i64toi32_i32$0 = i64toi32_i32$1 >>> i64toi32_i32$4 | 0;
244+
$8 = (((1 << i64toi32_i32$4 | 0) - 1 | 0) & i64toi32_i32$1 | 0) << (32 - i64toi32_i32$4 | 0) | 0 | (i64toi32_i32$2 >>> i64toi32_i32$4 | 0) | 0;
245+
}
246+
setTempRet0($8 | 0);
247+
i64toi32_i32$0 = $1$hi;
248+
return $1_1 | 0;
249+
}
250+
251+
function legalstub$7($0_1) {
252+
$0_1 = +$0_1;
253+
var i64toi32_i32$0 = 0, i64toi32_i32$4 = 0, i64toi32_i32$1 = 0, i64toi32_i32$3 = 0, $8 = 0, $1_1 = 0, $1$hi = 0, i64toi32_i32$2 = 0;
254+
i64toi32_i32$0 = $7(+$0_1) | 0;
255+
i64toi32_i32$1 = i64toi32_i32$HIGH_BITS;
256+
$1_1 = i64toi32_i32$0;
257+
$1$hi = i64toi32_i32$1;
258+
i64toi32_i32$2 = i64toi32_i32$0;
259+
i64toi32_i32$0 = 0;
260+
i64toi32_i32$3 = 32;
261+
i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0;
262+
if (32 >>> 0 <= (i64toi32_i32$3 & 63 | 0) >>> 0) {
263+
i64toi32_i32$0 = 0;
264+
$8 = i64toi32_i32$1 >>> i64toi32_i32$4 | 0;
265+
} else {
266+
i64toi32_i32$0 = i64toi32_i32$1 >>> i64toi32_i32$4 | 0;
267+
$8 = (((1 << i64toi32_i32$4 | 0) - 1 | 0) & i64toi32_i32$1 | 0) << (32 - i64toi32_i32$4 | 0) | 0 | (i64toi32_i32$2 >>> i64toi32_i32$4 | 0) | 0;
268+
}
269+
setTempRet0($8 | 0);
270+
i64toi32_i32$0 = $1$hi;
271+
return $1_1 | 0;
272+
}
273+
274+
// EMSCRIPTEN_END_FUNCS
275+
;
276+
return {
277+
"i32_trunc_sat_f32_s": $0,
278+
"i32_trunc_sat_f32_u": $1,
279+
"i32_trunc_sat_f64_s": $2,
280+
"i32_trunc_sat_f64_u": $3,
281+
"i64_trunc_sat_f32_s": legalstub$4,
282+
"i64_trunc_sat_f32_u": legalstub$5,
283+
"i64_trunc_sat_f64_s": legalstub$6,
284+
"i64_trunc_sat_f64_u": legalstub$7
285+
};
286+
}
287+
288+
return asmFunc(info);
289+
}

0 commit comments

Comments
 (0)