mirror of
https://github.com/i-net-software/JWebAssembly.git
synced 2025-03-25 07:27:52 +01:00
implements java bytecode frem and drem
This commit is contained in:
parent
3d5a98627f
commit
c2be64a525
@ -342,9 +342,13 @@ class JavaMethodWasmCodeBuilder extends WasmCodeBuilder {
|
|||||||
addNumericInstruction( NumericOperator.rem, ValueType.i64, codePos );
|
addNumericInstruction( NumericOperator.rem, ValueType.i64, codePos );
|
||||||
break;
|
break;
|
||||||
case 114: // frem
|
case 114: // frem
|
||||||
|
//helper function like: (a - (int)(a / b) * (float)b)
|
||||||
|
addCallInstruction( new SyntheticFunctionName( "frem", "local.get 0 local.get 0 local.get 1 f32.div i32.trunc_sat_f32_s f32.convert_i32_s local.get 1 f32.mul f32.sub return", ValueType.f32, ValueType.f32, null, ValueType.f32 ), codePos );
|
||||||
|
break;
|
||||||
case 115: // drem
|
case 115: // drem
|
||||||
//TODO can be implemented with a helper function like: (a - (long)(a / b) * (double)b)
|
//helper function like: (a - (long)(a / b) * (double)b)
|
||||||
throw new WasmException( "Modulo/Remainder for floating numbers is not supported in WASM. Use int or long data types." + op, byteCode.getLineNumber() );
|
addCallInstruction( new SyntheticFunctionName( "drem", "local.get 0 local.get 0 local.get 1 f64.div i64.trunc_sat_f64_s f64.convert_i64_s local.get 1 f64.mul f64.sub return", ValueType.f64, ValueType.f64, null, ValueType.f64 ), codePos );
|
||||||
|
break;
|
||||||
case 116: // ineg
|
case 116: // ineg
|
||||||
addConstInstruction( -1, ValueType.i32, codePos );
|
addConstInstruction( -1, ValueType.i32, codePos );
|
||||||
addNumericInstruction( NumericOperator.mul, ValueType.i32, codePos );
|
addNumericInstruction( NumericOperator.mul, ValueType.i32, codePos );
|
||||||
|
@ -40,7 +40,7 @@ public class SyntheticFunctionName extends FunctionName {
|
|||||||
* @param code
|
* @param code
|
||||||
* the WAT code (WASM in text form)
|
* the WAT code (WASM in text form)
|
||||||
* @param signature
|
* @param signature
|
||||||
* the method signature
|
* the method signature, first the parameters, then null and the the return types
|
||||||
*/
|
*/
|
||||||
public SyntheticFunctionName( String name, String code, AnyType... signature ) {
|
public SyntheticFunctionName( String name, String code, AnyType... signature ) {
|
||||||
super( "", name, "()V" ); //TODO better signature name
|
super( "", name, "()V" ); //TODO better signature name
|
||||||
|
@ -181,6 +181,7 @@ public class MathOperations extends AbstractBaseTest {
|
|||||||
float a = -54321F;
|
float a = -54321F;
|
||||||
a *= 3F;
|
a *= 3F;
|
||||||
a /= -8F;
|
a /= -8F;
|
||||||
|
a %= 37.5F;
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -189,6 +190,7 @@ public class MathOperations extends AbstractBaseTest {
|
|||||||
double a = -54321.0;
|
double a = -54321.0;
|
||||||
a *= 3F;
|
a *= 3F;
|
||||||
a /= -5F;
|
a /= -5F;
|
||||||
|
a %= 37.5;
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,18 +85,6 @@ public class RuntimeErrors {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@Test
|
|
||||||
public void floatRem() throws IOException {
|
|
||||||
compileErrorTest( "Modulo/Remainder", TestModulo.class );
|
|
||||||
}
|
|
||||||
|
|
||||||
static class TestModulo {
|
|
||||||
@Export
|
|
||||||
static float longReturn() {
|
|
||||||
float a = 3.4F;
|
|
||||||
return a % 2F;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void nonStaticExport() throws IOException {
|
public void nonStaticExport() throws IOException {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user