the shift parameter for i64 data must also be of type i64.

This commit is contained in:
Volker Berlin 2017-04-16 23:24:37 +02:00
parent cfac54ec40
commit 4b2089b88d
6 changed files with 37 additions and 0 deletions

View File

@ -442,6 +442,9 @@ public class BinaryModuleWriter extends ModuleWriter implements InstructionOpcod
case l2i: case l2i:
op = I32_WRAP_I64; op = I32_WRAP_I64;
break; break;
case i2l:
op = I64_EXTEND_S_I32;
break;
default: default:
throw new Error( "Unknown cast: " + cast ); throw new Error( "Unknown cast: " + cast );
} }

View File

@ -117,4 +117,5 @@ interface InstructionOpcodes {
static final int I32_WRAP_I64 = 0xA7; static final int I32_WRAP_I64 = 0xA7;
static final int I64_EXTEND_S_I32 = 0xAC;
} }

View File

@ -399,18 +399,21 @@ public abstract class ModuleWriter implements Closeable {
writeNumericOperator( NumericOperator.shl, ValueType.i32 ); writeNumericOperator( NumericOperator.shl, ValueType.i32 );
break; break;
case 121: // lshl case 121: // lshl
writeCast( ValueTypeConvertion.i2l ); // the shift parameter must be of type long!!!
writeNumericOperator( NumericOperator.shl, ValueType.i64 ); writeNumericOperator( NumericOperator.shl, ValueType.i64 );
break; break;
case 122: // ishr case 122: // ishr
writeNumericOperator( NumericOperator.shr_s, ValueType.i32 ); writeNumericOperator( NumericOperator.shr_s, ValueType.i32 );
break; break;
case 123: // lshr case 123: // lshr
writeCast( ValueTypeConvertion.i2l ); // the shift parameter must be of type long!!!
writeNumericOperator( NumericOperator.shr_s, ValueType.i64 ); writeNumericOperator( NumericOperator.shr_s, ValueType.i64 );
break; break;
case 124: // iushr case 124: // iushr
writeNumericOperator( NumericOperator.shr_u, ValueType.i32 ); writeNumericOperator( NumericOperator.shr_u, ValueType.i32 );
break; break;
case 125: // lushr case 125: // lushr
writeCast( ValueTypeConvertion.i2l ); // the shift parameter must be of type long!!!
writeNumericOperator( NumericOperator.shr_u, ValueType.i64 ); writeNumericOperator( NumericOperator.shr_u, ValueType.i64 );
break; break;
case 126: // iand case 126: // iand

View File

@ -23,4 +23,5 @@ package de.inetsoftware.jwebassembly.module;
*/ */
public enum ValueTypeConvertion { public enum ValueTypeConvertion {
l2i, l2i,
i2l,
} }

View File

@ -179,6 +179,9 @@ public class TextModuleWriter extends ModuleWriter {
case l2i: case l2i:
op = "i32.wrap/i64"; op = "i32.wrap/i64";
break; break;
case i2l:
op = "i64.extend_s/i32";
break;
default: default:
throw new Error( "Unknown cast: " + cast ); throw new Error( "Unknown cast: " + cast );
} }

View File

@ -67,6 +67,8 @@ public class MathOperations {
addParam( list, script, "mulDivLong" ); addParam( list, script, "mulDivLong" );
addParam( list, script, "mulDivFloat" ); addParam( list, script, "mulDivFloat" );
addParam( list, script, "mulDivDouble" ); addParam( list, script, "mulDivDouble" );
addParam( list, script, "intBits" );
addParam( list, script, "longBits" );
} }
return list; return list;
} }
@ -177,5 +179,29 @@ public class MathOperations {
return a; return a;
} }
@Export
static int intBits() {
int a = 1;
a = a << 1;
a = a | 15;
a = a & 4;
int b = Integer.MIN_VALUE;
b = b >>> 1;
b = b >> 2;
return a ^ b;
}
@Export
static int longBits() {
long a = 1;
a = a << 1;
a = a | 15;
a = a & 4;
long b = Long.MIN_VALUE;
b = b >>> 1;
b = b >> 2;
return (int)(a ^ (b >> 32));
}
} }
} }