Skip to content

Commit d7c13c0

Browse files
VolkerVolker
authored andcommitted
Use the new Non-trapping float-to-int conversions for Java like behavior.
1 parent 0822d9a commit d7c13c0

File tree

5 files changed

+76
-9
lines changed

5 files changed

+76
-9
lines changed

src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -628,19 +628,19 @@ protected void writeCast( ValueTypeConvertion cast ) throws IOException {
628628
op = F64_CONVERT_S_I64;
629629
break;
630630
case f2i:
631-
op = I32_TRUNC_S_F32;
631+
op = I32_TRUNC_S_SAT_F32;
632632
break;
633633
case f2l:
634-
op = I64_TRUNC_S_F32;
634+
op = I64_TRUNC_S_SAT_F32;
635635
break;
636636
case f2d:
637637
op = F64_PROMOTE_F32;
638638
break;
639639
case d2i:
640-
op = I32_TRUNC_S_F64;
640+
op = I32_TRUNC_S_SAT_F64;
641641
break;
642642
case d2l:
643-
op = I64_TRUNC_S_F64;
643+
op = I64_TRUNC_S_SAT_F64;
644644
break;
645645
case d2f:
646646
op = F32_DEMOTE_F64;
@@ -654,6 +654,9 @@ protected void writeCast( ValueTypeConvertion cast ) throws IOException {
654654
default:
655655
throw new Error( "Unknown cast: " + cast );
656656
}
657+
if( op > 255 ) {
658+
codeStream.write( op >> 8 );
659+
}
657660
codeStream.write( op );
658661
}
659662

src/de/inetsoftware/jwebassembly/binary/InstructionOpcodes.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,4 +352,22 @@ interface InstructionOpcodes {
352352
static final int REF_NULL = 0xD0;
353353

354354
static final int REF_ISNULL = 0xD1;
355+
356+
// === Non-trapping float-to-int conversions ====== https://github.com/WebAssembly/design/issues/1143
357+
358+
static final int I32_TRUNC_S_SAT_F32 = 0xFC00;
359+
360+
static final int I32_TRUNC_U_SAT_F32 = 0xFC01;
361+
362+
static final int I32_TRUNC_S_SAT_F64 = 0xFC02;
363+
364+
static final int I32_TRUNC_U_SAT_F64 = 0xFC03;
365+
366+
static final int I64_TRUNC_S_SAT_F32 = 0xFC04;
367+
368+
static final int I64_TRUNC_U_SAT_F32 = 0xFC05;
369+
370+
static final int I64_TRUNC_S_SAT_F64 = 0xFC06;
371+
372+
static final int I64_TRUNC_U_SAT_F64 = 0xFC07;
355373
}

src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -188,19 +188,19 @@ protected void writeCast( ValueTypeConvertion cast ) throws IOException {
188188
op = "f64.convert_s/i64";
189189
break;
190190
case f2i:
191-
op = "i32.trunc_s/f32";
191+
op = "i32.trunc_s:sat/f32";
192192
break;
193193
case f2l:
194-
op = "i64.trunc_s/f32";
194+
op = "i64.trunc_s:sat/f32";
195195
break;
196196
case f2d:
197197
op = "f64.promote/f32";
198198
break;
199199
case d2i:
200-
op = "i32.trunc_s/f64";
200+
op = "i32.trunc_s:sat/f64";
201201
break;
202202
case d2l:
203-
op = "i64.trunc_s/f64";
203+
op = "i64.trunc_s:sat/f64";
204204
break;
205205
case d2f:
206206
op = "f32.demote/f64";

test/de/inetsoftware/jwebassembly/WasmRule.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ private ProcessBuilder nodeJsCommand() {
279279
command += "/bin/node";
280280
}
281281
}
282-
return new ProcessBuilder( command, "--experimental-wasm-se", nodeScript.getAbsolutePath() );
282+
return new ProcessBuilder( command, "--experimental-wasm-se", "--experimental-wasm-sat-f2i-conversions", nodeScript.getAbsolutePath() );
283283
}
284284

285285
/**

test/de/inetsoftware/jwebassembly/runtime/MathOperations.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ public static Collection<Object[]> data() {
6363
addParam( list, script, "byteDec", (byte)-128 );
6464
addParam( list, script, "shortInc", (short)-32768 );
6565
addParam( list, script, "charOp", (char)0xFFFF );
66+
addParam( list, script, "castNumberOverflow" );
6667
}
6768
return list;
6869
}
@@ -242,5 +243,50 @@ static char charOp( char a ) {
242243
a += 60;
243244
return a;
244245
}
246+
247+
@Export
248+
static int castNumberOverflow() {
249+
int result = 0;
250+
float f = 2E30F;
251+
double d = f;
252+
253+
int i = (int)f;
254+
if( i == Integer.MAX_VALUE) {
255+
result |= 0x1;
256+
}
257+
i = (int)-f;
258+
if( i == Integer.MIN_VALUE) {
259+
result |= 0x2;
260+
}
261+
262+
long l = (long)f;
263+
if( l == Long.MAX_VALUE) {
264+
result |= 0x4;
265+
}
266+
l = (long)-f;
267+
if( l == Long.MIN_VALUE) {
268+
result |= 0x8;
269+
}
270+
271+
i = (int)d;
272+
if( i == Integer.MAX_VALUE) {
273+
result |= 0x10;
274+
}
275+
i = (int)-d;
276+
if( i == Integer.MIN_VALUE) {
277+
result |= 0x20;
278+
}
279+
280+
l = (long)d;
281+
if( l == Long.MAX_VALUE) {
282+
result |= 0x40;
283+
}
284+
l = (long)-d;
285+
if( l == Long.MIN_VALUE) {
286+
result |= 0x80;
287+
}
288+
289+
return result;
290+
}
245291
}
246292
}

0 commit comments

Comments
 (0)